added --deployment
diff --git a/.bundle/config b/.bundle/config
new file mode 100644
index 0000000..00a0edb
--- /dev/null
+++ b/.bundle/config
@@ -0,0 +1,4 @@
+---
+BUNDLE_FROZEN: "1"
+BUNDLE_PATH: "vendor/bundle"
+BUNDLE_DISABLE_SHARED_GEMS: "true"
diff --git a/.sass-cache/04e51afdd0eccf2e67a7f62dd81887460e4beeac/_base.scssc b/.sass-cache/04e51afdd0eccf2e67a7f62dd81887460e4beeac/_base.scssc
new file mode 100644
index 0000000..4ac4b31
--- /dev/null
+++ b/.sass-cache/04e51afdd0eccf2e67a7f62dd81887460e4beeac/_base.scssc
Binary files differ
diff --git a/.sass-cache/04e51afdd0eccf2e67a7f62dd81887460e4beeac/_mixins.scssc b/.sass-cache/04e51afdd0eccf2e67a7f62dd81887460e4beeac/_mixins.scssc
new file mode 100644
index 0000000..786b6aa
--- /dev/null
+++ b/.sass-cache/04e51afdd0eccf2e67a7f62dd81887460e4beeac/_mixins.scssc
Binary files differ
diff --git a/_includes/head.html b/_includes/head.html
index c96626d..e97f3ce 100755
--- a/_includes/head.html
+++ b/_includes/head.html
@@ -22,6 +22,16 @@
     <!-- Custom CSS -->
     <link rel="stylesheet" href="css/main.css" type="text/css">
 
+    <!-- Global Site Tag (gtag.js) - Google Analytics -->
+<script async src="https://www.googletagmanager.com/gtag/js?id=UA-84742341-2"></script>
+<script>
+  window.dataLayer = window.dataLayer || [];
+  function gtag(){dataLayer.push(arguments)};
+  gtag('js', new Date());
+
+  gtag('config', 'UA-84742341-2');
+</script>
+
     <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
     <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
     <!--[if lt IE 9]>
diff --git a/_site/feed.xml b/_site/feed.xml
index 3ef0dda..97c6f44 100644
--- a/_site/feed.xml
+++ b/_site/feed.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.5.2">Jekyll</generator><link href="http://localhost:4000/feed.xml" rel="self" type="application/atom+xml" /><link href="http://localhost:4000/" rel="alternate" type="text/html" /><updated>2017-09-21T21:44:50+10:00</updated><id>http://localhost:4000/</id><subtitle></subtitle></feed>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.5.2">Jekyll</generator><link href="http://localhost:4000/feed.xml" rel="self" type="application/atom+xml" /><link href="http://localhost:4000/" rel="alternate" type="text/html" /><updated>2017-09-21T22:20:00+10:00</updated><id>http://localhost:4000/</id><subtitle></subtitle></feed>
\ No newline at end of file
diff --git a/_site/index.html b/_site/index.html
index 08a83b1..1a86606 100644
--- a/_site/index.html
+++ b/_site/index.html
@@ -25,6 +25,16 @@
     <!-- Custom CSS -->
     <link rel="stylesheet" href="css/main.css" type="text/css">
 
+    <!-- Global Site Tag (gtag.js) - Google Analytics -->
+<script async src="https://www.googletagmanager.com/gtag/js?id=UA-84742341-2"></script>
+<script>
+  window.dataLayer = window.dataLayer || [];
+  function gtag(){dataLayer.push(arguments)};
+  gtag('js', new Date());
+
+  gtag('config', 'UA-84742341-2');
+</script>
+
     <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
     <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
     <!--[if lt IE 9]>
diff --git a/vendor/bundle/ruby/2.4.0/bin/jekyll b/vendor/bundle/ruby/2.4.0/bin/jekyll
new file mode 100755
index 0000000..9f70103
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/bin/jekyll
@@ -0,0 +1,22 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'jekyll' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0.a"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
+
+load Gem.activate_bin_path('jekyll', 'jekyll', version)
diff --git a/vendor/bundle/ruby/2.4.0/bin/kramdown b/vendor/bundle/ruby/2.4.0/bin/kramdown
new file mode 100755
index 0000000..a094d04
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/bin/kramdown
@@ -0,0 +1,22 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'kramdown' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0.a"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
+
+load Gem.activate_bin_path('kramdown', 'kramdown', version)
diff --git a/vendor/bundle/ruby/2.4.0/bin/listen b/vendor/bundle/ruby/2.4.0/bin/listen
new file mode 100755
index 0000000..ce18a7e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/bin/listen
@@ -0,0 +1,22 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'listen' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0.a"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
+
+load Gem.activate_bin_path('listen', 'listen', version)
diff --git a/vendor/bundle/ruby/2.4.0/bin/rougify b/vendor/bundle/ruby/2.4.0/bin/rougify
new file mode 100755
index 0000000..8953914
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/bin/rougify
@@ -0,0 +1,22 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'rouge' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0.a"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
+
+load Gem.activate_bin_path('rouge', 'rougify', version)
diff --git a/vendor/bundle/ruby/2.4.0/bin/safe_yaml b/vendor/bundle/ruby/2.4.0/bin/safe_yaml
new file mode 100755
index 0000000..2b056ad
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/bin/safe_yaml
@@ -0,0 +1,22 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'safe_yaml' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0.a"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
+
+load Gem.activate_bin_path('safe_yaml', 'safe_yaml', version)
diff --git a/vendor/bundle/ruby/2.4.0/bin/sass b/vendor/bundle/ruby/2.4.0/bin/sass
new file mode 100755
index 0000000..1357256
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/bin/sass
@@ -0,0 +1,22 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'sass' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0.a"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
+
+load Gem.activate_bin_path('sass', 'sass', version)
diff --git a/vendor/bundle/ruby/2.4.0/bin/sass-convert b/vendor/bundle/ruby/2.4.0/bin/sass-convert
new file mode 100755
index 0000000..67f9f7d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/bin/sass-convert
@@ -0,0 +1,22 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'sass' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0.a"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
+
+load Gem.activate_bin_path('sass', 'sass-convert', version)
diff --git a/vendor/bundle/ruby/2.4.0/bin/scss b/vendor/bundle/ruby/2.4.0/bin/scss
new file mode 100755
index 0000000..8d938c0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/bin/scss
@@ -0,0 +1,22 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'sass' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0.a"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
+    version = $1
+    ARGV.shift
+  end
+end
+
+load Gem.activate_bin_path('sass', 'scss', version)
diff --git a/vendor/bundle/ruby/2.4.0/cache/addressable-2.5.2.gem b/vendor/bundle/ruby/2.4.0/cache/addressable-2.5.2.gem
new file mode 100644
index 0000000..3e53ea0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/addressable-2.5.2.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/colorator-1.1.0.gem b/vendor/bundle/ruby/2.4.0/cache/colorator-1.1.0.gem
new file mode 100644
index 0000000..d5616ad
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/colorator-1.1.0.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/ffi-1.9.18.gem b/vendor/bundle/ruby/2.4.0/cache/ffi-1.9.18.gem
new file mode 100644
index 0000000..06613e5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/ffi-1.9.18.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/forwardable-extended-2.6.0.gem b/vendor/bundle/ruby/2.4.0/cache/forwardable-extended-2.6.0.gem
new file mode 100644
index 0000000..370222f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/forwardable-extended-2.6.0.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/jekyll-3.5.2.gem b/vendor/bundle/ruby/2.4.0/cache/jekyll-3.5.2.gem
new file mode 100644
index 0000000..bb1e63f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/jekyll-3.5.2.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/jekyll-feed-0.9.2.gem b/vendor/bundle/ruby/2.4.0/cache/jekyll-feed-0.9.2.gem
new file mode 100644
index 0000000..0d221a9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/jekyll-feed-0.9.2.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/jekyll-sass-converter-1.5.0.gem b/vendor/bundle/ruby/2.4.0/cache/jekyll-sass-converter-1.5.0.gem
new file mode 100644
index 0000000..0af8369
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/jekyll-sass-converter-1.5.0.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/jekyll-watch-1.5.0.gem b/vendor/bundle/ruby/2.4.0/cache/jekyll-watch-1.5.0.gem
new file mode 100644
index 0000000..b613891
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/jekyll-watch-1.5.0.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/kramdown-1.14.0.gem b/vendor/bundle/ruby/2.4.0/cache/kramdown-1.14.0.gem
new file mode 100644
index 0000000..f311219
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/kramdown-1.14.0.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/liquid-4.0.0.gem b/vendor/bundle/ruby/2.4.0/cache/liquid-4.0.0.gem
new file mode 100644
index 0000000..8bb56d4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/liquid-4.0.0.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/listen-3.0.8.gem b/vendor/bundle/ruby/2.4.0/cache/listen-3.0.8.gem
new file mode 100644
index 0000000..34fb00a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/listen-3.0.8.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/mercenary-0.3.6.gem b/vendor/bundle/ruby/2.4.0/cache/mercenary-0.3.6.gem
new file mode 100644
index 0000000..e5333e0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/mercenary-0.3.6.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/minima-2.1.1.gem b/vendor/bundle/ruby/2.4.0/cache/minima-2.1.1.gem
new file mode 100644
index 0000000..6e8aa61
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/minima-2.1.1.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/pathutil-0.14.0.gem b/vendor/bundle/ruby/2.4.0/cache/pathutil-0.14.0.gem
new file mode 100644
index 0000000..1da45ac
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/pathutil-0.14.0.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/public_suffix-3.0.0.gem b/vendor/bundle/ruby/2.4.0/cache/public_suffix-3.0.0.gem
new file mode 100644
index 0000000..4d3c4d8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/public_suffix-3.0.0.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/rb-fsevent-0.10.2.gem b/vendor/bundle/ruby/2.4.0/cache/rb-fsevent-0.10.2.gem
new file mode 100644
index 0000000..cea2115
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/rb-fsevent-0.10.2.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/rb-inotify-0.9.10.gem b/vendor/bundle/ruby/2.4.0/cache/rb-inotify-0.9.10.gem
new file mode 100644
index 0000000..cd3d585
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/rb-inotify-0.9.10.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/rouge-1.11.1.gem b/vendor/bundle/ruby/2.4.0/cache/rouge-1.11.1.gem
new file mode 100644
index 0000000..bd0effe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/rouge-1.11.1.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/safe_yaml-1.0.4.gem b/vendor/bundle/ruby/2.4.0/cache/safe_yaml-1.0.4.gem
new file mode 100644
index 0000000..7da49f5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/safe_yaml-1.0.4.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/sass-3.5.1.gem b/vendor/bundle/ruby/2.4.0/cache/sass-3.5.1.gem
new file mode 100644
index 0000000..34f3e60
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/sass-3.5.1.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/cache/sass-listen-4.0.0.gem b/vendor/bundle/ruby/2.4.0/cache/sass-listen-4.0.0.gem
new file mode 100644
index 0000000..9464653
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/cache/sass-listen-4.0.0.gem
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/ffi_c.bundle b/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/ffi_c.bundle
new file mode 100755
index 0000000..70cea7e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/ffi_c.bundle
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/gem.build_complete b/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/gem.build_complete
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/gem.build_complete
diff --git a/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/gem_make.out b/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/gem_make.out
new file mode 100644
index 0000000..e107fe4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/gem_make.out
@@ -0,0 +1,61 @@
+current directory: /Users/roadan/Work/apache/incubator-amaterasu-site/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c
+/usr/local/opt/ruby/bin/ruby -r ./siteconf20170921-22476-1wjs3v0.rb extconf.rb
+checking for ffi.h... no
+checking for ffi.h in /usr/local/include,/usr/include/ffi... yes
+checking for ffi_call() in -lffi... yes
+checking for ffi_prep_closure()... yes
+checking for ffi_raw_call()... no
+checking for shlwapi.h... no
+checking for rb_thread_blocking_region()... no
+checking for rb_thread_call_with_gvl()... yes
+checking for rb_thread_call_without_gvl()... yes
+checking for ffi_prep_cif_var()... no
+creating extconf.h
+creating Makefile
+
+current directory: /Users/roadan/Work/apache/incubator-amaterasu-site/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c
+make "DESTDIR=" clean
+
+current directory: /Users/roadan/Work/apache/incubator-amaterasu-site/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c
+make "DESTDIR="
+compiling AbstractMemory.c
+compiling ArrayType.c
+compiling Buffer.c
+compiling Call.c
+Call.c:355:5: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration]
+    rbffi_thread_blocking_region(call_blocking_function, data, (void *) -1, NULL);
+    ^
+./Thread.h:78:39: note: expanded from macro 'rbffi_thread_blocking_region'
+# define rbffi_thread_blocking_region rb_thread_call_without_gvl
+                                      ^
+1 warning generated.
+compiling ClosurePool.c
+compiling DataConverter.c
+compiling DynamicLibrary.c
+compiling Function.c
+Function.c:563:9: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration]
+        rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w);
+        ^
+1 warning generated.
+compiling FunctionInfo.c
+compiling LastError.c
+compiling LongDouble.c
+compiling MappedType.c
+compiling MemoryPointer.c
+compiling MethodHandle.c
+compiling Platform.c
+compiling Pointer.c
+compiling Struct.c
+compiling StructByReference.c
+compiling StructByValue.c
+compiling StructLayout.c
+compiling Thread.c
+compiling Type.c
+compiling Types.c
+compiling Variadic.c
+compiling ffi.c
+linking shared-object ffi_c.bundle
+
+current directory: /Users/roadan/Work/apache/incubator-amaterasu-site/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c
+make "DESTDIR=" install
+/usr/bin/install -c -m 0755 ffi_c.bundle ./.gem.20170921-22476-vyiwyr
diff --git a/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/mkmf.log b/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/mkmf.log
new file mode 100644
index 0000000..7915e0f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/extensions/x86_64-darwin-16/2.4.0/ffi-1.9.18/mkmf.log
@@ -0,0 +1,400 @@
+package configuration for libffi is not found
+have_header: checking for ffi.h... -------------------- no
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I.  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib     -lruby.2.4.1  -lpthread -ldl -lobjc "
+checked program was:
+/* begin */
+1: #include "ruby.h"
+2: 
+3: int main(int argc, char **argv)
+4: {
+5:   return 0;
+6: }
+/* end */
+
+"clang -E -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I.  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe  conftest.c -o conftest.i"
+conftest.c:3:10: fatal error: 'ffi.h' file not found
+#include <ffi.h>
+         ^
+1 error generated.
+checked program was:
+/* begin */
+1: #include "ruby.h"
+2: 
+3: #include <ffi.h>
+/* end */
+
+--------------------
+
+find_header: checking for ffi.h in /usr/local/include,/usr/include/ffi... -------------------- yes
+
+"clang -E -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I.  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe  conftest.c -o conftest.i"
+conftest.c:3:10: fatal error: 'ffi.h' file not found
+#include <ffi.h>
+         ^
+1 error generated.
+checked program was:
+/* begin */
+1: #include "ruby.h"
+2: 
+3: #include <ffi.h>
+/* end */
+
+"clang -E -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I.  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe -I/usr/local/include conftest.c -o conftest.i"
+conftest.c:3:10: fatal error: 'ffi.h' file not found
+#include <ffi.h>
+         ^
+1 error generated.
+checked program was:
+/* begin */
+1: #include "ruby.h"
+2: 
+3: #include <ffi.h>
+/* end */
+
+"clang -E -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I.  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe -I/usr/include/ffi conftest.c -o conftest.i"
+checked program was:
+/* begin */
+1: #include "ruby.h"
+2: 
+3: #include <ffi.h>
+/* end */
+
+--------------------
+
+have_library: checking for ffi_call() in -lffi... -------------------- yes
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib     -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: #include <ffi.h>
+ 4: 
+ 5: /*top*/
+ 6: extern int t(void);
+ 7: int main(int argc, char **argv)
+ 8: {
+ 9:   if (argc > 1000000) {
+10:     printf("%p", &t);
+11:   }
+12: 
+13:   return 0;
+14: }
+15: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_call; return !p; }
+/* end */
+
+--------------------
+
+have_func: checking for ffi_prep_closure()... -------------------- yes
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+conftest.c:13:57: error: use of undeclared identifier 'ffi_prep_closure'
+int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_closure; return !p; }
+                                                        ^
+1 error generated.
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_closure; return !p; }
+/* end */
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: extern void ffi_prep_closure();
+14: int t(void) { ffi_prep_closure(); return 0; }
+/* end */
+
+--------------------
+
+have_func: checking for ffi_raw_call()... -------------------- no
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+conftest.c:13:57: error: use of undeclared identifier 'ffi_raw_call'
+int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_raw_call; return !p; }
+                                                        ^
+1 error generated.
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_raw_call; return !p; }
+/* end */
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+Undefined symbols for architecture x86_64:
+  "_ffi_raw_call", referenced from:
+      _t in conftest-a584aa.o
+ld: symbol(s) not found for architecture x86_64
+clang: error: linker command failed with exit code 1 (use -v to see invocation)
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: extern void ffi_raw_call();
+14: int t(void) { ffi_raw_call(); return 0; }
+/* end */
+
+--------------------
+
+have_header: checking for shlwapi.h... -------------------- no
+
+"clang -E -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe  conftest.c -o conftest.i"
+conftest.c:3:10: fatal error: 'shlwapi.h' file not found
+#include <shlwapi.h>
+         ^
+1 error generated.
+checked program was:
+/* begin */
+1: #include "ruby.h"
+2: 
+3: #include <shlwapi.h>
+/* end */
+
+--------------------
+
+have_func: checking for rb_thread_blocking_region()... -------------------- no
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+conftest.c:13:57: error: use of undeclared identifier 'rb_thread_blocking_region'
+int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_blocking_region; return !p; }
+                                                        ^
+1 error generated.
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_blocking_region; return !p; }
+/* end */
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+Undefined symbols for architecture x86_64:
+  "_rb_thread_blocking_region", referenced from:
+      _t in conftest-4f6bb6.o
+ld: symbol(s) not found for architecture x86_64
+clang: error: linker command failed with exit code 1 (use -v to see invocation)
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: extern void rb_thread_blocking_region();
+14: int t(void) { rb_thread_blocking_region(); return 0; }
+/* end */
+
+--------------------
+
+have_func: checking for rb_thread_call_with_gvl()... -------------------- yes
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+conftest.c:13:57: error: use of undeclared identifier 'rb_thread_call_with_gvl'
+int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_with_gvl; return !p; }
+                                                        ^
+1 error generated.
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_with_gvl; return !p; }
+/* end */
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: extern void rb_thread_call_with_gvl();
+14: int t(void) { rb_thread_call_with_gvl(); return 0; }
+/* end */
+
+--------------------
+
+have_func: checking for rb_thread_call_without_gvl()... -------------------- yes
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+conftest.c:13:57: error: use of undeclared identifier 'rb_thread_call_without_gvl'
+int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_without_gvl; return !p; }
+                                                        ^
+1 error generated.
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_thread_call_without_gvl; return !p; }
+/* end */
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: extern void rb_thread_call_without_gvl();
+14: int t(void) { rb_thread_call_without_gvl(); return 0; }
+/* end */
+
+--------------------
+
+have_func: checking for ffi_prep_cif_var()... -------------------- no
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+conftest.c:13:57: error: use of undeclared identifier 'ffi_prep_cif_var'
+int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_cif_var; return !p; }
+                                                        ^
+1 error generated.
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_cif_var; return !p; }
+/* end */
+
+"clang -o conftest -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16 -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/ruby/backward -I/usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0 -I. -I/usr/include/ffi  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wdeprecated-declarations -Wextra-tokens  -fno-common -pipe conftest.c  -L. -L/usr/local/Cellar/ruby/2.4.1_1/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib    -lffi  -lruby.2.4.1 -lffi  -lpthread -ldl -lobjc "
+Undefined symbols for architecture x86_64:
+  "_ffi_prep_cif_var", referenced from:
+      _t in conftest-e40aa2.o
+ld: symbol(s) not found for architecture x86_64
+clang: error: linker command failed with exit code 1 (use -v to see invocation)
+checked program was:
+/* begin */
+ 1: #include "ruby.h"
+ 2: 
+ 3: /*top*/
+ 4: extern int t(void);
+ 5: int main(int argc, char **argv)
+ 6: {
+ 7:   if (argc > 1000000) {
+ 8:     printf("%p", &t);
+ 9:   }
+10: 
+11:   return 0;
+12: }
+13: extern void ffi_prep_cif_var();
+14: int t(void) { ffi_prep_cif_var(); return 0; }
+/* end */
+
+--------------------
+
+extconf.h is:
+/* begin */
+1: #ifndef EXTCONF_H
+2: #define EXTCONF_H
+3: #define HAVE_FFI_PREP_CLOSURE 1
+4: #define HAVE_RB_THREAD_CALL_WITH_GVL 1
+5: #define HAVE_RB_THREAD_CALL_WITHOUT_GVL 1
+6: #define RUBY_1_9 1
+7: #endif
+/* end */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/CHANGELOG.md b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/CHANGELOG.md
new file mode 100644
index 0000000..12cacd2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/CHANGELOG.md
@@ -0,0 +1,216 @@
+# Addressable 2.5.2
+- better support for frozen string literals
+- fixed bug w/ uppercase characters in scheme
+- IDNA errors w/ emoji URLs
+- compatibility w/ public_suffix 3.x
+
+# Addressable 2.5.1
+- allow unicode normalization to be disabled for URI Template expansion
+- removed duplicate test
+
+# Addressable 2.5.0
+- dropping support for Ruby 1.9
+- adding support for Ruby 2.4 preview
+- add support for public suffixes and tld; first runtime dependency
+- hostname escaping should match RFC; underscores in hostnames no longer escaped
+- paths beginning with // and missing an authority are now considered invalid
+- validation now also takes place after setting a path
+- handle backslashes in authority more like a browser for `heuristic_parse`
+- unescaped backslashes in host now raise an `InvalidURIError`
+- `merge!`, `join!`, `omit!` and `normalize!` don't disable deferred validation
+- `heuristic_parse` now trims whitespace before parsing
+- host parts longer than 63 bytes will be ignored and not passed to libidn
+- normalized values always encoded as UTF-8
+
+# Addressable 2.4.0
+- support for 1.8.x dropped
+- double quotes in a host now raises an error
+- newlines in host will no longer get unescaped during normalization
+- stricter handling of bogus scheme values
+- stricter handling of encoded port values
+- calling `require 'addressable'` will now load both the URI and Template files
+- assigning to the `hostname` component with an `IPAddr` object is now supported
+- assigning to the `origin` component is now supported
+- fixed minor bug where an exception would be thrown for a missing ACE suffix
+- better partial expansion of URI templates
+
+# Addressable 2.3.8
+- fix warnings
+- update dependency gems
+- support for 1.8.x officially deprecated
+
+# Addressable 2.3.7
+- fix scenario in which invalid URIs don't get an exception until inspected
+- handle hostnames with two adjacent periods correctly
+- upgrade of RSpec
+
+# Addressable 2.3.6
+- normalization drops empty query string
+- better handling in template extract for missing values
+- template modifier for `'?'` now treated as optional
+- fixed issue where character class parameters were modified
+- templates can now be tested for equality
+- added `:sorted` option to normalization of query strings
+- fixed issue with normalization of hosts given in `'example.com.'` form
+
+# Addressable 2.3.5
+- added Addressable::URI#empty? method
+- Addressable::URI#hostname methods now strip square brackets from IPv6 hosts
+- compatibility with Net::HTTP in Ruby 2.0.0
+- Addressable::URI#route_from should always give relative URIs
+
+# Addressable 2.3.4
+- fixed issue with encoding altering its inputs
+- query string normalization now leaves ';' characters alone
+- FakeFS is detected before attempting to load unicode tables
+- additional testing to ensure frozen objects don't cause problems
+
+# Addressable 2.3.3
+- fixed issue with converting common primitives during template expansion
+- fixed port encoding issue
+- removed a few warnings
+- normalize should now ignore %2B in query strings
+- the IDNA logic should now be handled by libidn in Ruby 1.9
+- no template match should now result in nil instead of an empty MatchData
+- added license information to gemspec
+
+# Addressable 2.3.2
+- added Addressable::URI#default_port method
+- fixed issue with Marshalling Unicode data on Windows
+- improved heuristic parsing to better handle IPv4 addresses
+
+# Addressable 2.3.1
+- fixed missing unicode data file
+
+# Addressable 2.3.0
+- updated Addressable::Template to use RFC 6570, level 4
+- fixed compatibility problems with some versions of Ruby
+- moved unicode tables into a data file for performance reasons
+- removing support for multiple query value notations
+
+# Addressable 2.2.8
+- fixed issues with dot segment removal code
+- form encoding can now handle multiple values per key
+- updated development environment
+
+# Addressable 2.2.7
+- fixed issues related to Addressable::URI#query_values=
+- the Addressable::URI.parse method is now polymorphic
+
+# Addressable 2.2.6
+- changed the way ambiguous paths are handled
+- fixed bug with frozen URIs
+- https supported in heuristic parsing
+
+# Addressable 2.2.5
+- 'parsing' a pre-parsed URI object is now a dup operation
+- introduced conditional support for libidn
+- fixed normalization issue on ampersands in query strings
+- added additional tests around handling of query strings
+
+# Addressable 2.2.4
+- added origin support from draft-ietf-websec-origin-00
+- resolved issue with attempting to navigate below root
+- fixed bug with string splitting in query strings
+
+# Addressable 2.2.3
+- added :flat_array notation for query strings
+
+# Addressable 2.2.2
+- fixed issue with percent escaping of '+' character in query strings
+
+# Addressable 2.2.1
+- added support for application/x-www-form-urlencoded.
+
+# Addressable 2.2.0
+- added site methods
+- improved documentation
+
+# Addressable 2.1.2
+- added HTTP request URI methods
+- better handling of Windows file paths
+- validation_deferred boolean replaced with defer_validation block
+- normalization of percent-encoded paths should now be correct
+- fixed issue with constructing URIs with relative paths
+- fixed warnings
+
+# Addressable 2.1.1
+- more type checking changes
+- fixed issue with unicode normalization
+- added method to find template defaults
+- symbolic keys are now allowed in template mappings
+- numeric values and symbolic values are now allowed in template mappings
+
+# Addressable 2.1.0
+- refactored URI template support out into its own class
+- removed extract method due to being useless and unreliable
+- removed Addressable::URI.expand_template
+- removed Addressable::URI#extract_mapping
+- added partial template expansion
+- fixed minor bugs in the parse and heuristic_parse methods
+- fixed incompatibility with Ruby 1.9.1
+- fixed bottleneck in Addressable::URI#hash and Addressable::URI#to_s
+- fixed unicode normalization exception
+- updated query_values methods to better handle subscript notation
+- worked around issue with freezing URIs
+- improved specs
+
+# Addressable 2.0.2
+- fixed issue with URI template expansion
+- fixed issue with percent escaping characters 0-15
+
+# Addressable 2.0.1
+- fixed issue with query string assignment
+- fixed issue with improperly encoded components
+
+# Addressable 2.0.0
+- the initialize method now takes an options hash as its only parameter
+- added query_values method to URI class
+- completely replaced IDNA implementation with pure Ruby
+- renamed Addressable::ADDRESSABLE_VERSION to Addressable::VERSION
+- completely reworked the Rakefile
+- changed the behavior of the port method significantly
+- Addressable::URI.encode_segment, Addressable::URI.unencode_segment renamed
+- documentation is now in YARD format
+- more rigorous type checking
+- to_str method implemented, implicit conversion to Strings now allowed
+- Addressable::URI#omit method added, Addressable::URI#merge method replaced
+- updated URI Template code to match v 03 of the draft spec
+- added a bunch of new specifications
+
+# Addressable 1.0.4
+- switched to using RSpec's pending system for specs that rely on IDN
+- fixed issue with creating URIs with paths that are not prefixed with '/'
+
+# Addressable 1.0.3
+- implemented a hash method
+
+# Addressable 1.0.2
+- fixed minor bug with the extract_mapping method
+
+# Addressable 1.0.1
+- fixed minor bug with the extract_mapping method
+
+# Addressable 1.0.0
+- heuristic parse method added
+- parsing is slightly more strict
+- replaced to_h with to_hash
+- fixed routing methods
+- improved specifications
+- improved heckle rake task
+- no surviving heckle mutations
+
+# Addressable 0.1.2
+- improved normalization
+- fixed bug in joining algorithm
+- updated specifications
+
+# Addressable 0.1.1
+- updated documentation
+- added URI Template variable extraction
+
+# Addressable 0.1.0
+- initial release
+- implementation based on RFC 3986, 3987
+- support for IRIs via libidn
+- support for the URI Template draft spec
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/Gemfile b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/Gemfile
new file mode 100644
index 0000000..c2344b6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/Gemfile
@@ -0,0 +1,32 @@
+source 'https://rubygems.org'
+
+gemspec
+
+group :test do
+  gem 'rspec', '~> 3.0'
+  gem 'rspec-its', '~> 1.1'
+end
+
+group :development do
+  gem 'launchy', '~> 2.4', '>= 2.4.3'
+  gem 'redcarpet', :platform => :mri_19
+  gem 'yard'
+end
+
+group :test, :development do
+  gem 'rake', '> 10.0', '< 12'
+  gem 'simplecov', :require => false
+  gem 'coveralls', :require => false, :platforms => [
+    :ruby_20, :ruby_21, :ruby_22, :ruby_23
+  ]
+  # Used to test compatibility.
+  gem 'rack-mount', git: 'https://github.com/sporkmonger/rack-mount.git', require: 'rack/mount'
+
+  if RUBY_VERSION.start_with?('2.0', '2.1')
+    gem 'rack', '< 2', :require => false
+  else
+    gem 'rack', :require => false
+  end
+end
+
+gem 'idn-ruby', :platform => [:mri_20, :mri_21, :mri_22, :mri_23, :mri_24]
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/LICENSE.txt b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/LICENSE.txt
new file mode 100644
index 0000000..ef51da2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/LICENSE.txt
@@ -0,0 +1,202 @@
+
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+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.
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/README.md b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/README.md
new file mode 100644
index 0000000..e01fd0e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/README.md
@@ -0,0 +1,121 @@
+# Addressable
+
+<dl>
+  <dt>Homepage</dt><dd><a href="https://github.com/sporkmonger/addressable">github.com/sporkmonger/addressable</a></dd>
+  <dt>Author</dt><dd><a href="mailto:bob@sporkmonger.com">Bob Aman</a></dd>
+  <dt>Copyright</dt><dd>Copyright © Bob Aman</dd>
+  <dt>License</dt><dd>Apache 2.0</dd>
+</dl>
+
+[![Gem Version](http://img.shields.io/gem/dt/addressable.svg)][gem]
+[![Build Status](https://secure.travis-ci.org/sporkmonger/addressable.svg?branch=master)][travis]
+[![Dependency Status](https://gemnasium.com/sporkmonger/addressable.svg?travis)][gemnasium]
+[![Test Coverage Status](https://img.shields.io/coveralls/sporkmonger/addressable.svg)][coveralls]
+[![Documentation Coverage Status](http://inch-ci.org/github/sporkmonger/addressable.svg?branch=master)][inch]
+
+[gem]: https://rubygems.org/gems/addressable
+[travis]: http://travis-ci.org/sporkmonger/addressable
+[gemnasium]: https://gemnasium.com/sporkmonger/addressable
+[coveralls]: https://coveralls.io/r/sporkmonger/addressable
+[inch]: http://inch-ci.org/github/sporkmonger/addressable
+
+# Description
+
+Addressable is a replacement for the URI implementation that is part of
+Ruby's standard library. It more closely conforms to RFC 3986, RFC 3987, and
+RFC 6570 (level 4), providing support for IRIs and URI templates.
+
+# Reference
+
+- {Addressable::URI}
+- {Addressable::Template}
+
+# Example usage
+
+```ruby
+require "addressable/uri"
+
+uri = Addressable::URI.parse("http://example.com/path/to/resource/")
+uri.scheme
+#=> "http"
+uri.host
+#=> "example.com"
+uri.path
+#=> "/path/to/resource/"
+
+uri = Addressable::URI.parse("http://www.詹姆斯.com/")
+uri.normalize
+#=> #<Addressable::URI:0xc9a4c8 URI:http://www.xn--8ws00zhy3a.com/>
+```
+
+
+# URI Templates
+
+For more details, see [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.txt).
+
+
+```ruby
+
+require "addressable/template"
+
+template = Addressable::Template.new("http://example.com/{?query*}/")
+template.expand({
+  "query" => {
+    'foo' => 'bar',
+    'color' => 'red'
+  }
+})
+#=> #<Addressable::URI:0xc9d95c URI:http://example.com/?foo=bar&color=red>
+
+template = Addressable::Template.new("http://example.com/{?one,two,three}")
+template.partial_expand({"one" => "1", "three" => 3}).pattern
+#=> "http://example.com/?one=1{&two}&three=3"
+
+template = Addressable::Template.new(
+  "http://{host}{/segments*}/{?one,two,bogus}{#fragment}"
+)
+uri = Addressable::URI.parse(
+  "http://example.com/a/b/c/?one=1&two=2#foo"
+)
+template.extract(uri)
+#=>
+# {
+#   "host" => "example.com",
+#   "segments" => ["a", "b", "c"],
+#   "one" => "1",
+#   "two" => "2",
+#   "fragment" => "foo"
+# }
+```
+
+# Install
+
+```console
+$ gem install addressable
+```
+
+You may optionally turn on native IDN support by installing libidn and the
+idn gem:
+
+```console
+$ sudo apt-get install idn # Debian/Ubuntu
+$ brew install libidn # OS X
+$ gem install idn-ruby
+```
+
+# Semantic Versioning
+
+This project uses sementic versioning. You can (and should) specify your
+dependency using a pessimistic version constraint covering the major and minor
+values:
+
+```ruby
+spec.add_dependency 'addressable', '~> 2.5'
+```
+
+If you need a specific bug fix, you can also specify minimum tiny versions
+without preventing updates to the latest minor release:
+
+```ruby
+spec.add_dependency 'addressable', '~> 2.3', '>= 2.3.7'
+```
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/Rakefile b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/Rakefile
new file mode 100644
index 0000000..ffdcb8c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/Rakefile
@@ -0,0 +1,32 @@
+require 'rubygems'
+require 'rake'
+
+require File.join(File.dirname(__FILE__), 'lib', 'addressable', 'version')
+
+PKG_DISPLAY_NAME   = 'Addressable'
+PKG_NAME           = PKG_DISPLAY_NAME.downcase
+PKG_VERSION        = Addressable::VERSION::STRING
+PKG_FILE_NAME      = "#{PKG_NAME}-#{PKG_VERSION}"
+
+RELEASE_NAME       = "REL #{PKG_VERSION}"
+
+PKG_SUMMARY        = "URI Implementation"
+PKG_DESCRIPTION    = <<-TEXT
+Addressable is a replacement for the URI implementation that is part of
+Ruby's standard library. It more closely conforms to the relevant RFCs and
+adds support for IRIs and URI templates.
+TEXT
+
+PKG_FILES = FileList[
+    "lib/**/*", "spec/**/*", "vendor/**/*", "data/**/*",
+    "tasks/**/*",
+    "[A-Z]*", "Rakefile"
+].exclude(/pkg/).exclude(/database\.yml/).
+  exclude(/Gemfile\.lock/).exclude(/[_\.]git$/)
+
+task :default => "spec"
+
+WINDOWS = (RUBY_PLATFORM =~ /mswin|win32|mingw|bccwin|cygwin/) rescue false
+SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS'])
+
+Dir['tasks/**/*.rake'].each { |rake| load rake }
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/data/unicode.data b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/data/unicode.data
new file mode 100644
index 0000000..cdfc224
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/data/unicode.data
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable.rb
new file mode 100644
index 0000000..f09a05e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable.rb
@@ -0,0 +1,2 @@
+require 'addressable/uri'
+require 'addressable/template'
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/idna.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/idna.rb
new file mode 100644
index 0000000..c6da1b0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/idna.rb
@@ -0,0 +1,25 @@
+# encoding:utf-8
+#--
+# Copyright (C) Bob Aman
+#
+#    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.
+#++
+
+
+begin
+  require "addressable/idna/native"
+rescue LoadError
+  # libidn or the idn gem was not available, fall back on a pure-Ruby
+  # implementation...
+  require "addressable/idna/pure"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/idna/native.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/idna/native.rb
new file mode 100644
index 0000000..e7c2254
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/idna/native.rb
@@ -0,0 +1,59 @@
+# encoding:utf-8
+#--
+# Copyright (C) Bob Aman
+#
+#    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.
+#++
+
+
+require "idn"
+
+module Addressable
+  module IDNA
+    def self.punycode_encode(value)
+      IDN::Punycode.encode(value.to_s)
+    end
+
+     def self.punycode_decode(value)
+       IDN::Punycode.decode(value.to_s)
+     end
+
+    def self.unicode_normalize_kc(value)
+      IDN::Stringprep.nfkc_normalize(value.to_s)
+    end
+
+    def self.to_ascii(value)
+      value.to_s.split('.', -1).map do |segment|
+        if segment.size > 0 && segment.size < 64
+          IDN::Idna.toASCII(segment, IDN::Idna::ALLOW_UNASSIGNED)
+        elsif segment.size >= 64
+          segment
+        else
+          ''
+        end
+      end.join('.')
+    end
+
+    def self.to_unicode(value)
+      value.to_s.split('.', -1).map do |segment|
+        if segment.size > 0 && segment.size < 64
+          IDN::Idna.toUnicode(segment, IDN::Idna::ALLOW_UNASSIGNED)
+        elsif segment.size >= 64
+          segment
+        else
+          ''
+        end
+      end.join('.')
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb
new file mode 100644
index 0000000..33f026a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb
@@ -0,0 +1,677 @@
+# encoding:utf-8
+#--
+# Copyright (C) Bob Aman
+#
+#    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.
+#++
+
+
+module Addressable
+  module IDNA
+    # This module is loosely based on idn_actionmailer by Mick Staugaard,
+    # the unicode library by Yoshida Masato, and the punycode implementation
+    # by Kazuhiro Nishiyama.  Most of the code was copied verbatim, but
+    # some reformatting was done, and some translation from C was done.
+    #
+    # Without their code to work from as a base, we'd all still be relying
+    # on the presence of libidn.  Which nobody ever seems to have installed.
+    #
+    # Original sources:
+    # http://github.com/staugaard/idn_actionmailer
+    # http://www.yoshidam.net/Ruby.html#unicode
+    # http://rubyforge.org/frs/?group_id=2550
+
+
+    UNICODE_TABLE = File.expand_path(
+      File.join(File.dirname(__FILE__), '../../..', 'data/unicode.data')
+    )
+
+    ACE_PREFIX = "xn--"
+
+    UTF8_REGEX = /\A(?:
+      [\x09\x0A\x0D\x20-\x7E]               # ASCII
+      | [\xC2-\xDF][\x80-\xBF]              # non-overlong 2-byte
+      | \xE0[\xA0-\xBF][\x80-\xBF]          # excluding overlongs
+      | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}   # straight 3-byte
+      | \xED[\x80-\x9F][\x80-\xBF]          # excluding surrogates
+      | \xF0[\x90-\xBF][\x80-\xBF]{2}       # planes 1-3
+      | [\xF1-\xF3][\x80-\xBF]{3}           # planes 4nil5
+      | \xF4[\x80-\x8F][\x80-\xBF]{2}       # plane 16
+      )*\z/mnx
+
+    UTF8_REGEX_MULTIBYTE = /(?:
+      [\xC2-\xDF][\x80-\xBF]                # non-overlong 2-byte
+      | \xE0[\xA0-\xBF][\x80-\xBF]          # excluding overlongs
+      | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}   # straight 3-byte
+      | \xED[\x80-\x9F][\x80-\xBF]          # excluding surrogates
+      | \xF0[\x90-\xBF][\x80-\xBF]{2}       # planes 1-3
+      | [\xF1-\xF3][\x80-\xBF]{3}           # planes 4nil5
+      | \xF4[\x80-\x8F][\x80-\xBF]{2}       # plane 16
+      )/mnx
+
+    # :startdoc:
+
+    # Converts from a Unicode internationalized domain name to an ASCII
+    # domain name as described in RFC 3490.
+    def self.to_ascii(input)
+      input = input.to_s unless input.is_a?(String)
+      input = input.dup
+      if input.respond_to?(:force_encoding)
+        input.force_encoding(Encoding::ASCII_8BIT)
+      end
+      if input =~ UTF8_REGEX && input =~ UTF8_REGEX_MULTIBYTE
+        parts = unicode_downcase(input).split('.')
+        parts.map! do |part|
+          if part.respond_to?(:force_encoding)
+            part.force_encoding(Encoding::ASCII_8BIT)
+          end
+          if part =~ UTF8_REGEX && part =~ UTF8_REGEX_MULTIBYTE
+            ACE_PREFIX + punycode_encode(unicode_normalize_kc(part))
+          else
+            part
+          end
+        end
+        parts.join('.')
+      else
+        input
+      end
+    end
+
+    # Converts from an ASCII domain name to a Unicode internationalized
+    # domain name as described in RFC 3490.
+    def self.to_unicode(input)
+      input = input.to_s unless input.is_a?(String)
+      parts = input.split('.')
+      parts.map! do |part|
+        if part =~ /^#{ACE_PREFIX}(.+)/
+          begin
+            punycode_decode(part[/^#{ACE_PREFIX}(.+)/, 1])
+          rescue Addressable::IDNA::PunycodeBadInput
+            # toUnicode is explicitly defined as never-fails by the spec
+            part
+          end
+        else
+          part
+        end
+      end
+      output = parts.join('.')
+      if output.respond_to?(:force_encoding)
+        output.force_encoding(Encoding::UTF_8)
+      end
+      output
+    end
+
+    # Unicode normalization form KC.
+    def self.unicode_normalize_kc(input)
+      input = input.to_s unless input.is_a?(String)
+      unpacked = input.unpack("U*")
+      unpacked =
+        unicode_compose(unicode_sort_canonical(unicode_decompose(unpacked)))
+      return unpacked.pack("U*")
+    end
+
+    ##
+    # Unicode aware downcase method.
+    #
+    # @api private
+    # @param [String] input
+    #   The input string.
+    # @return [String] The downcased result.
+    def self.unicode_downcase(input)
+      input = input.to_s unless input.is_a?(String)
+      unpacked = input.unpack("U*")
+      unpacked.map! { |codepoint| lookup_unicode_lowercase(codepoint) }
+      return unpacked.pack("U*")
+    end
+    (class <<self; private :unicode_downcase; end)
+
+    def self.unicode_compose(unpacked)
+      unpacked_result = []
+      length = unpacked.length
+
+      return unpacked if length == 0
+
+      starter = unpacked[0]
+      starter_cc = lookup_unicode_combining_class(starter)
+      starter_cc = 256 if starter_cc != 0
+      for i in 1...length
+        ch = unpacked[i]
+        cc = lookup_unicode_combining_class(ch)
+
+        if (starter_cc == 0 &&
+            (composite = unicode_compose_pair(starter, ch)) != nil)
+          starter = composite
+          startercc = lookup_unicode_combining_class(composite)
+        else
+          unpacked_result << starter
+          starter = ch
+          startercc = cc
+        end
+      end
+      unpacked_result << starter
+      return unpacked_result
+    end
+    (class <<self; private :unicode_compose; end)
+
+    def self.unicode_compose_pair(ch_one, ch_two)
+      if ch_one >= HANGUL_LBASE && ch_one < HANGUL_LBASE + HANGUL_LCOUNT &&
+          ch_two >= HANGUL_VBASE && ch_two < HANGUL_VBASE + HANGUL_VCOUNT
+        # Hangul L + V
+        return HANGUL_SBASE + (
+          (ch_one - HANGUL_LBASE) * HANGUL_VCOUNT + (ch_two - HANGUL_VBASE)
+        ) * HANGUL_TCOUNT
+      elsif ch_one >= HANGUL_SBASE &&
+          ch_one < HANGUL_SBASE + HANGUL_SCOUNT &&
+          (ch_one - HANGUL_SBASE) % HANGUL_TCOUNT == 0 &&
+          ch_two >= HANGUL_TBASE && ch_two < HANGUL_TBASE + HANGUL_TCOUNT
+           # Hangul LV + T
+        return ch_one + (ch_two - HANGUL_TBASE)
+      end
+
+      p = []
+      ucs4_to_utf8 = lambda do |ch|
+        if ch < 128
+          p << ch
+        elsif ch < 2048
+          p << (ch >> 6 | 192)
+          p << (ch & 63 | 128)
+        elsif ch < 0x10000
+          p << (ch >> 12 | 224)
+          p << (ch >> 6 & 63 | 128)
+          p << (ch & 63 | 128)
+        elsif ch < 0x200000
+          p << (ch >> 18 | 240)
+          p << (ch >> 12 & 63 | 128)
+          p << (ch >> 6 & 63 | 128)
+          p << (ch & 63 | 128)
+        elsif ch < 0x4000000
+          p << (ch >> 24 | 248)
+          p << (ch >> 18 & 63 | 128)
+          p << (ch >> 12 & 63 | 128)
+          p << (ch >> 6 & 63 | 128)
+          p << (ch & 63 | 128)
+        elsif ch < 0x80000000
+          p << (ch >> 30 | 252)
+          p << (ch >> 24 & 63 | 128)
+          p << (ch >> 18 & 63 | 128)
+          p << (ch >> 12 & 63 | 128)
+          p << (ch >> 6 & 63 | 128)
+          p << (ch & 63 | 128)
+        end
+      end
+
+      ucs4_to_utf8.call(ch_one)
+      ucs4_to_utf8.call(ch_two)
+
+      return lookup_unicode_composition(p)
+    end
+    (class <<self; private :unicode_compose_pair; end)
+
+    def self.unicode_sort_canonical(unpacked)
+      unpacked = unpacked.dup
+      i = 1
+      length = unpacked.length
+
+      return unpacked if length < 2
+
+      while i < length
+        last = unpacked[i-1]
+        ch = unpacked[i]
+        last_cc = lookup_unicode_combining_class(last)
+        cc = lookup_unicode_combining_class(ch)
+        if cc != 0 && last_cc != 0 && last_cc > cc
+          unpacked[i] = last
+          unpacked[i-1] = ch
+          i -= 1 if i > 1
+        else
+          i += 1
+        end
+      end
+      return unpacked
+    end
+    (class <<self; private :unicode_sort_canonical; end)
+
+    def self.unicode_decompose(unpacked)
+      unpacked_result = []
+      for cp in unpacked
+        if cp >= HANGUL_SBASE && cp < HANGUL_SBASE + HANGUL_SCOUNT
+          l, v, t = unicode_decompose_hangul(cp)
+          unpacked_result << l
+          unpacked_result << v if v
+          unpacked_result << t if t
+        else
+          dc = lookup_unicode_compatibility(cp)
+          unless dc
+            unpacked_result << cp
+          else
+            unpacked_result.concat(unicode_decompose(dc.unpack("U*")))
+          end
+        end
+      end
+      return unpacked_result
+    end
+    (class <<self; private :unicode_decompose; end)
+
+    def self.unicode_decompose_hangul(codepoint)
+      sindex = codepoint - HANGUL_SBASE;
+      if sindex < 0 || sindex >= HANGUL_SCOUNT
+        l = codepoint
+        v = t = nil
+        return l, v, t
+      end
+      l = HANGUL_LBASE + sindex / HANGUL_NCOUNT
+      v = HANGUL_VBASE + (sindex % HANGUL_NCOUNT) / HANGUL_TCOUNT
+      t = HANGUL_TBASE + sindex % HANGUL_TCOUNT
+      if t == HANGUL_TBASE
+        t = nil
+      end
+      return l, v, t
+    end
+    (class <<self; private :unicode_decompose_hangul; end)
+
+    def self.lookup_unicode_combining_class(codepoint)
+      codepoint_data = UNICODE_DATA[codepoint]
+      (codepoint_data ?
+        (codepoint_data[UNICODE_DATA_COMBINING_CLASS] || 0) :
+        0)
+    end
+    (class <<self; private :lookup_unicode_combining_class; end)
+
+    def self.lookup_unicode_compatibility(codepoint)
+      codepoint_data = UNICODE_DATA[codepoint]
+      (codepoint_data ?
+        codepoint_data[UNICODE_DATA_COMPATIBILITY] : nil)
+    end
+    (class <<self; private :lookup_unicode_compatibility; end)
+
+    def self.lookup_unicode_lowercase(codepoint)
+      codepoint_data = UNICODE_DATA[codepoint]
+      (codepoint_data ?
+        (codepoint_data[UNICODE_DATA_LOWERCASE] || codepoint) :
+        codepoint)
+    end
+    (class <<self; private :lookup_unicode_lowercase; end)
+
+    def self.lookup_unicode_composition(unpacked)
+      return COMPOSITION_TABLE[unpacked]
+    end
+    (class <<self; private :lookup_unicode_composition; end)
+
+    HANGUL_SBASE =  0xac00
+    HANGUL_LBASE =  0x1100
+    HANGUL_LCOUNT = 19
+    HANGUL_VBASE =  0x1161
+    HANGUL_VCOUNT = 21
+    HANGUL_TBASE =  0x11a7
+    HANGUL_TCOUNT = 28
+    HANGUL_NCOUNT = HANGUL_VCOUNT * HANGUL_TCOUNT # 588
+    HANGUL_SCOUNT = HANGUL_LCOUNT * HANGUL_NCOUNT # 11172
+
+    UNICODE_DATA_COMBINING_CLASS = 0
+    UNICODE_DATA_EXCLUSION = 1
+    UNICODE_DATA_CANONICAL = 2
+    UNICODE_DATA_COMPATIBILITY = 3
+    UNICODE_DATA_UPPERCASE = 4
+    UNICODE_DATA_LOWERCASE = 5
+    UNICODE_DATA_TITLECASE = 6
+
+    begin
+      if defined?(FakeFS)
+        fakefs_state = FakeFS.activated?
+        FakeFS.deactivate!
+      end
+      # This is a sparse Unicode table.  Codepoints without entries are
+      # assumed to have the value: [0, 0, nil, nil, nil, nil, nil]
+      UNICODE_DATA = File.open(UNICODE_TABLE, "rb") do |file|
+        Marshal.load(file.read)
+      end
+    ensure
+      if defined?(FakeFS)
+        FakeFS.activate! if fakefs_state
+      end
+    end
+
+    COMPOSITION_TABLE = {}
+    for codepoint, data in UNICODE_DATA
+      canonical = data[UNICODE_DATA_CANONICAL]
+      exclusion = data[UNICODE_DATA_EXCLUSION]
+
+      if canonical && exclusion == 0
+        COMPOSITION_TABLE[canonical.unpack("C*")] = codepoint
+      end
+    end
+
+    UNICODE_MAX_LENGTH = 256
+    ACE_MAX_LENGTH = 256
+
+    PUNYCODE_BASE = 36
+    PUNYCODE_TMIN = 1
+    PUNYCODE_TMAX = 26
+    PUNYCODE_SKEW = 38
+    PUNYCODE_DAMP = 700
+    PUNYCODE_INITIAL_BIAS = 72
+    PUNYCODE_INITIAL_N = 0x80
+    PUNYCODE_DELIMITER = 0x2D
+
+    PUNYCODE_MAXINT = 1 << 64
+
+    PUNYCODE_PRINT_ASCII =
+      "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" +
+      "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" +
+      " !\"\#$%&'()*+,-./" +
+      "0123456789:;<=>?" +
+      "@ABCDEFGHIJKLMNO" +
+      "PQRSTUVWXYZ[\\]^_" +
+      "`abcdefghijklmno" +
+      "pqrstuvwxyz{|}~\n"
+
+    # Input is invalid.
+    class PunycodeBadInput < StandardError; end
+    # Output would exceed the space provided.
+    class PunycodeBigOutput < StandardError; end
+    # Input needs wider integers to process.
+    class PunycodeOverflow < StandardError; end
+
+    def self.punycode_encode(unicode)
+      unicode = unicode.to_s unless unicode.is_a?(String)
+      input = unicode.unpack("U*")
+      output = [0] * (ACE_MAX_LENGTH + 1)
+      input_length = input.size
+      output_length = [ACE_MAX_LENGTH]
+
+      # Initialize the state
+      n = PUNYCODE_INITIAL_N
+      delta = out = 0
+      max_out = output_length[0]
+      bias = PUNYCODE_INITIAL_BIAS
+
+      # Handle the basic code points:
+      input_length.times do |j|
+        if punycode_basic?(input[j])
+          if max_out - out < 2
+            raise PunycodeBigOutput,
+              "Output would exceed the space provided."
+          end
+          output[out] = input[j]
+          out += 1
+        end
+      end
+
+      h = b = out
+
+      # h is the number of code points that have been handled, b is the
+      # number of basic code points, and out is the number of characters
+      # that have been output.
+
+      if b > 0
+        output[out] = PUNYCODE_DELIMITER
+        out += 1
+      end
+
+      # Main encoding loop:
+
+      while h < input_length
+        # All non-basic code points < n have been
+        # handled already.  Find the next larger one:
+
+        m = PUNYCODE_MAXINT
+        input_length.times do |j|
+          m = input[j] if (n...m) === input[j]
+        end
+
+        # Increase delta enough to advance the decoder's
+        # <n,i> state to <m,0>, but guard against overflow:
+
+        if m - n > (PUNYCODE_MAXINT - delta) / (h + 1)
+          raise PunycodeOverflow, "Input needs wider integers to process."
+        end
+        delta += (m - n) * (h + 1)
+        n = m
+
+        input_length.times do |j|
+          # Punycode does not need to check whether input[j] is basic:
+          if input[j] < n
+            delta += 1
+            if delta == 0
+              raise PunycodeOverflow,
+                "Input needs wider integers to process."
+            end
+          end
+
+          if input[j] == n
+            # Represent delta as a generalized variable-length integer:
+
+            q = delta; k = PUNYCODE_BASE
+            while true
+              if out >= max_out
+                raise PunycodeBigOutput,
+                  "Output would exceed the space provided."
+              end
+              t = (
+                if k <= bias
+                  PUNYCODE_TMIN
+                elsif k >= bias + PUNYCODE_TMAX
+                  PUNYCODE_TMAX
+                else
+                  k - bias
+                end
+              )
+              break if q < t
+              output[out] =
+                punycode_encode_digit(t + (q - t) % (PUNYCODE_BASE - t))
+              out += 1
+              q = (q - t) / (PUNYCODE_BASE - t)
+              k += PUNYCODE_BASE
+            end
+
+            output[out] = punycode_encode_digit(q)
+            out += 1
+            bias = punycode_adapt(delta, h + 1, h == b)
+            delta = 0
+            h += 1
+          end
+        end
+
+        delta += 1
+        n += 1
+      end
+
+      output_length[0] = out
+
+      outlen = out
+      outlen.times do |j|
+        c = output[j]
+        unless c >= 0 && c <= 127
+          raise StandardError, "Invalid output char."
+        end
+        unless PUNYCODE_PRINT_ASCII[c]
+          raise PunycodeBadInput, "Input is invalid."
+        end
+      end
+
+      output[0..outlen].map { |x| x.chr }.join("").sub(/\0+\z/, "")
+    end
+    (class <<self; private :punycode_encode; end)
+
+    def self.punycode_decode(punycode)
+      input = []
+      output = []
+
+      if ACE_MAX_LENGTH * 2 < punycode.size
+        raise PunycodeBigOutput, "Output would exceed the space provided."
+      end
+      punycode.each_byte do |c|
+        unless c >= 0 && c <= 127
+          raise PunycodeBadInput, "Input is invalid."
+        end
+        input.push(c)
+      end
+
+      input_length = input.length
+      output_length = [UNICODE_MAX_LENGTH]
+
+      # Initialize the state
+      n = PUNYCODE_INITIAL_N
+
+      out = i = 0
+      max_out = output_length[0]
+      bias = PUNYCODE_INITIAL_BIAS
+
+      # Handle the basic code points:  Let b be the number of input code
+      # points before the last delimiter, or 0 if there is none, then
+      # copy the first b code points to the output.
+
+      b = 0
+      input_length.times do |j|
+        b = j if punycode_delimiter?(input[j])
+      end
+      if b > max_out
+        raise PunycodeBigOutput, "Output would exceed the space provided."
+      end
+
+      b.times do |j|
+        unless punycode_basic?(input[j])
+          raise PunycodeBadInput, "Input is invalid."
+        end
+        output[out] = input[j]
+        out+=1
+      end
+
+      # Main decoding loop:  Start just after the last delimiter if any
+      # basic code points were copied; start at the beginning otherwise.
+
+      in_ = b > 0 ? b + 1 : 0
+      while in_ < input_length
+
+        # in_ is the index of the next character to be consumed, and
+        # out is the number of code points in the output array.
+
+        # Decode a generalized variable-length integer into delta,
+        # which gets added to i.  The overflow checking is easier
+        # if we increase i as we go, then subtract off its starting
+        # value at the end to obtain delta.
+
+        oldi = i; w = 1; k = PUNYCODE_BASE
+        while true
+          if in_ >= input_length
+            raise PunycodeBadInput, "Input is invalid."
+          end
+          digit = punycode_decode_digit(input[in_])
+          in_+=1
+          if digit >= PUNYCODE_BASE
+            raise PunycodeBadInput, "Input is invalid."
+          end
+          if digit > (PUNYCODE_MAXINT - i) / w
+            raise PunycodeOverflow, "Input needs wider integers to process."
+          end
+          i += digit * w
+          t = (
+            if k <= bias
+              PUNYCODE_TMIN
+            elsif k >= bias + PUNYCODE_TMAX
+              PUNYCODE_TMAX
+            else
+              k - bias
+            end
+          )
+          break if digit < t
+          if w > PUNYCODE_MAXINT / (PUNYCODE_BASE - t)
+            raise PunycodeOverflow, "Input needs wider integers to process."
+          end
+          w *= PUNYCODE_BASE - t
+          k += PUNYCODE_BASE
+        end
+
+        bias = punycode_adapt(i - oldi, out + 1, oldi == 0)
+
+        # I was supposed to wrap around from out + 1 to 0,
+        # incrementing n each time, so we'll fix that now:
+
+        if i / (out + 1) > PUNYCODE_MAXINT - n
+          raise PunycodeOverflow, "Input needs wider integers to process."
+        end
+        n += i / (out + 1)
+        i %= out + 1
+
+        # Insert n at position i of the output:
+
+        # not needed for Punycode:
+        # raise PUNYCODE_INVALID_INPUT if decode_digit(n) <= base
+        if out >= max_out
+          raise PunycodeBigOutput, "Output would exceed the space provided."
+        end
+
+        #memmove(output + i + 1, output + i, (out - i) * sizeof *output)
+        output[i + 1, out - i] = output[i, out - i]
+        output[i] = n
+        i += 1
+
+        out += 1
+      end
+
+      output_length[0] = out
+
+      output.pack("U*")
+    end
+    (class <<self; private :punycode_decode; end)
+
+    def self.punycode_basic?(codepoint)
+      codepoint < 0x80
+    end
+    (class <<self; private :punycode_basic?; end)
+
+    def self.punycode_delimiter?(codepoint)
+      codepoint == PUNYCODE_DELIMITER
+    end
+    (class <<self; private :punycode_delimiter?; end)
+
+    def self.punycode_encode_digit(d)
+      d + 22 + 75 * ((d < 26) ? 1 : 0)
+    end
+    (class <<self; private :punycode_encode_digit; end)
+
+    # Returns the numeric value of a basic codepoint
+    # (for use in representing integers) in the range 0 to
+    # base - 1, or PUNYCODE_BASE if codepoint does not represent a value.
+    def self.punycode_decode_digit(codepoint)
+      if codepoint - 48 < 10
+        codepoint - 22
+      elsif codepoint - 65 < 26
+        codepoint - 65
+      elsif codepoint - 97 < 26
+        codepoint - 97
+      else
+        PUNYCODE_BASE
+      end
+    end
+    (class <<self; private :punycode_decode_digit; end)
+
+    # Bias adaptation method
+    def self.punycode_adapt(delta, numpoints, firsttime)
+      delta = firsttime ? delta / PUNYCODE_DAMP : delta >> 1
+      # delta >> 1 is a faster way of doing delta / 2
+      delta += delta / numpoints
+      difference = PUNYCODE_BASE - PUNYCODE_TMIN
+
+      k = 0
+      while delta > (difference * PUNYCODE_TMAX) / 2
+        delta /= difference
+        k += PUNYCODE_BASE
+      end
+
+      k + (difference + 1) * delta / (delta + PUNYCODE_SKEW)
+    end
+    (class <<self; private :punycode_adapt; end)
+  end
+  # :startdoc:
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/template.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/template.rb
new file mode 100644
index 0000000..feee3f1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/template.rb
@@ -0,0 +1,1065 @@
+# encoding:utf-8
+#--
+# Copyright (C) Bob Aman
+#
+#    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.
+#++
+
+
+require "addressable/version"
+require "addressable/uri"
+
+module Addressable
+  ##
+  # This is an implementation of a URI template based on
+  # RFC 6570 (http://tools.ietf.org/html/rfc6570).
+  class Template
+    # Constants used throughout the template code.
+    anything =
+      Addressable::URI::CharacterClasses::RESERVED +
+      Addressable::URI::CharacterClasses::UNRESERVED
+
+
+    variable_char_class =
+      Addressable::URI::CharacterClasses::ALPHA +
+      Addressable::URI::CharacterClasses::DIGIT + '_'
+
+    var_char =
+      "(?:(?:[#{variable_char_class}]|%[a-fA-F0-9][a-fA-F0-9])+)"
+    RESERVED =
+      "(?:[#{anything}]|%[a-fA-F0-9][a-fA-F0-9])"
+    UNRESERVED =
+      "(?:[#{
+        Addressable::URI::CharacterClasses::UNRESERVED
+      }]|%[a-fA-F0-9][a-fA-F0-9])"
+    variable =
+      "(?:#{var_char}(?:\\.?#{var_char})*)"
+    varspec =
+      "(?:(#{variable})(\\*|:\\d+)?)"
+    VARNAME =
+      /^#{variable}$/
+    VARSPEC =
+      /^#{varspec}$/
+    VARIABLE_LIST =
+      /^#{varspec}(?:,#{varspec})*$/
+    operator =
+      "+#./;?&=,!@|"
+    EXPRESSION =
+      /\{([#{operator}])?(#{varspec}(?:,#{varspec})*)\}/
+
+
+    LEADERS = {
+      '?' => '?',
+      '/' => '/',
+      '#' => '#',
+      '.' => '.',
+      ';' => ';',
+      '&' => '&'
+    }
+    JOINERS = {
+      '?' => '&',
+      '.' => '.',
+      ';' => ';',
+      '&' => '&',
+      '/' => '/'
+    }
+
+    ##
+    # Raised if an invalid template value is supplied.
+    class InvalidTemplateValueError < StandardError
+    end
+
+    ##
+    # Raised if an invalid template operator is used in a pattern.
+    class InvalidTemplateOperatorError < StandardError
+    end
+
+    ##
+    # Raised if an invalid template operator is used in a pattern.
+    class TemplateOperatorAbortedError < StandardError
+    end
+
+    ##
+    # This class represents the data that is extracted when a Template
+    # is matched against a URI.
+    class MatchData
+      ##
+      # Creates a new MatchData object.
+      # MatchData objects should never be instantiated directly.
+      #
+      # @param [Addressable::URI] uri
+      #   The URI that the template was matched against.
+      def initialize(uri, template, mapping)
+        @uri = uri.dup.freeze
+        @template = template
+        @mapping = mapping.dup.freeze
+      end
+
+      ##
+      # @return [Addressable::URI]
+      #   The URI that the Template was matched against.
+      attr_reader :uri
+
+      ##
+      # @return [Addressable::Template]
+      #   The Template used for the match.
+      attr_reader :template
+
+      ##
+      # @return [Hash]
+      #   The mapping that resulted from the match.
+      #   Note that this mapping does not include keys or values for
+      #   variables that appear in the Template, but are not present
+      #   in the URI.
+      attr_reader :mapping
+
+      ##
+      # @return [Array]
+      #   The list of variables that were present in the Template.
+      #   Note that this list will include variables which do not appear
+      #   in the mapping because they were not present in URI.
+      def variables
+        self.template.variables
+      end
+      alias_method :keys, :variables
+      alias_method :names, :variables
+
+      ##
+      # @return [Array]
+      #   The list of values that were captured by the Template.
+      #   Note that this list will include nils for any variables which
+      #   were in the Template, but did not appear in the URI.
+      def values
+        @values ||= self.variables.inject([]) do |accu, key|
+          accu << self.mapping[key]
+          accu
+        end
+      end
+      alias_method :captures, :values
+
+      ##
+      # Accesses captured values by name or by index.
+      #
+      # @param [String, Symbol, Fixnum] key
+      #   Capture index or name. Note that when accessing by with index
+      #   of 0, the full URI will be returned. The intention is to mimic
+      #   the ::MatchData#[] behavior.
+      #
+      # @param [#to_int, nil] len
+      #   If provided, an array of values will be returend with the given
+      #   parameter used as length.
+      #
+      # @return [Array, String, nil]
+      #   The captured value corresponding to the index or name. If the
+      #   value was not provided or the key is unknown, nil will be
+      #   returned.
+      #
+      #   If the second parameter is provided, an array of that length will
+      #   be returned instead.
+      def [](key, len = nil)
+        if len
+          to_a[key, len]
+        elsif String === key or Symbol === key
+          mapping[key.to_s]
+        else
+          to_a[key]
+        end
+      end
+
+      ##
+      # @return [Array]
+      #   Array with the matched URI as first element followed by the captured
+      #   values.
+      def to_a
+        [to_s, *values]
+      end
+
+      ##
+      # @return [String]
+      #   The matched URI as String.
+      def to_s
+        uri.to_s
+      end
+      alias_method :string, :to_s
+
+      # Returns multiple captured values at once.
+      #
+      # @param [String, Symbol, Fixnum] *indexes
+      #   Indices of the captures to be returned
+      #
+      # @return [Array]
+      #   Values corresponding to given indices.
+      #
+      # @see Addressable::Template::MatchData#[]
+      def values_at(*indexes)
+        indexes.map { |i| self[i] }
+      end
+
+      ##
+      # Returns a <tt>String</tt> representation of the MatchData's state.
+      #
+      # @return [String] The MatchData's state, as a <tt>String</tt>.
+      def inspect
+        sprintf("#<%s:%#0x RESULT:%s>",
+          self.class.to_s, self.object_id, self.mapping.inspect)
+      end
+
+      ##
+      # Dummy method for code expecting a ::MatchData instance
+      #
+      # @return [String] An empty string.
+      def pre_match
+        ""
+      end
+      alias_method :post_match, :pre_match
+    end
+
+    ##
+    # Creates a new <tt>Addressable::Template</tt> object.
+    #
+    # @param [#to_str] pattern The URI Template pattern.
+    #
+    # @return [Addressable::Template] The initialized Template object.
+    def initialize(pattern)
+      if !pattern.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{pattern.class} into String."
+      end
+      @pattern = pattern.to_str.dup.freeze
+    end
+
+    ##
+    # Freeze URI, initializing instance variables.
+    #
+    # @return [Addressable::URI] The frozen URI object.
+    def freeze
+      self.variables
+      self.variable_defaults
+      self.named_captures
+      super
+    end
+
+    ##
+    # @return [String] The Template object's pattern.
+    attr_reader :pattern
+
+    ##
+    # Returns a <tt>String</tt> representation of the Template object's state.
+    #
+    # @return [String] The Template object's state, as a <tt>String</tt>.
+    def inspect
+      sprintf("#<%s:%#0x PATTERN:%s>",
+        self.class.to_s, self.object_id, self.pattern)
+    end
+
+    ##
+    # Returns <code>true</code> if the Template objects are equal. This method
+    # does NOT normalize either Template before doing the comparison.
+    #
+    # @param [Object] template The Template to compare.
+    #
+    # @return [TrueClass, FalseClass]
+    #   <code>true</code> if the Templates are equivalent, <code>false</code>
+    #   otherwise.
+    def ==(template)
+      return false unless template.kind_of?(Template)
+      return self.pattern == template.pattern
+    end
+
+    ##
+    # Addressable::Template makes no distinction between `==` and `eql?`.
+    #
+    # @see #==
+    alias_method :eql?, :==
+
+    ##
+    # Extracts a mapping from the URI using a URI Template pattern.
+    #
+    # @param [Addressable::URI, #to_str] uri
+    #   The URI to extract from.
+    #
+    # @param [#restore, #match] processor
+    #   A template processor object may optionally be supplied.
+    #
+    #   The object should respond to either the <tt>restore</tt> or
+    #   <tt>match</tt> messages or both. The <tt>restore</tt> method should
+    #   take two parameters: `[String] name` and `[String] value`.
+    #   The <tt>restore</tt> method should reverse any transformations that
+    #   have been performed on the value to ensure a valid URI.
+    #   The <tt>match</tt> method should take a single
+    #   parameter: `[String] name`.  The <tt>match</tt> method should return
+    #   a <tt>String</tt> containing a regular expression capture group for
+    #   matching on that particular variable. The default value is `".*?"`.
+    #   The <tt>match</tt> method has no effect on multivariate operator
+    #   expansions.
+    #
+    # @return [Hash, NilClass]
+    #   The <tt>Hash</tt> mapping that was extracted from the URI, or
+    #   <tt>nil</tt> if the URI didn't match the template.
+    #
+    # @example
+    #   class ExampleProcessor
+    #     def self.restore(name, value)
+    #       return value.gsub(/\+/, " ") if name == "query"
+    #       return value
+    #     end
+    #
+    #     def self.match(name)
+    #       return ".*?" if name == "first"
+    #       return ".*"
+    #     end
+    #   end
+    #
+    #   uri = Addressable::URI.parse(
+    #     "http://example.com/search/an+example+search+query/"
+    #   )
+    #   Addressable::Template.new(
+    #     "http://example.com/search/{query}/"
+    #   ).extract(uri, ExampleProcessor)
+    #   #=> {"query" => "an example search query"}
+    #
+    #   uri = Addressable::URI.parse("http://example.com/a/b/c/")
+    #   Addressable::Template.new(
+    #     "http://example.com/{first}/{second}/"
+    #   ).extract(uri, ExampleProcessor)
+    #   #=> {"first" => "a", "second" => "b/c"}
+    #
+    #   uri = Addressable::URI.parse("http://example.com/a/b/c/")
+    #   Addressable::Template.new(
+    #     "http://example.com/{first}/{-list|/|second}/"
+    #   ).extract(uri)
+    #   #=> {"first" => "a", "second" => ["b", "c"]}
+    def extract(uri, processor=nil)
+      match_data = self.match(uri, processor)
+      return (match_data ? match_data.mapping : nil)
+    end
+
+    ##
+    # Extracts match data from the URI using a URI Template pattern.
+    #
+    # @param [Addressable::URI, #to_str] uri
+    #   The URI to extract from.
+    #
+    # @param [#restore, #match] processor
+    #   A template processor object may optionally be supplied.
+    #
+    #   The object should respond to either the <tt>restore</tt> or
+    #   <tt>match</tt> messages or both. The <tt>restore</tt> method should
+    #   take two parameters: `[String] name` and `[String] value`.
+    #   The <tt>restore</tt> method should reverse any transformations that
+    #   have been performed on the value to ensure a valid URI.
+    #   The <tt>match</tt> method should take a single
+    #   parameter: `[String] name`. The <tt>match</tt> method should return
+    #   a <tt>String</tt> containing a regular expression capture group for
+    #   matching on that particular variable. The default value is `".*?"`.
+    #   The <tt>match</tt> method has no effect on multivariate operator
+    #   expansions.
+    #
+    # @return [Hash, NilClass]
+    #   The <tt>Hash</tt> mapping that was extracted from the URI, or
+    #   <tt>nil</tt> if the URI didn't match the template.
+    #
+    # @example
+    #   class ExampleProcessor
+    #     def self.restore(name, value)
+    #       return value.gsub(/\+/, " ") if name == "query"
+    #       return value
+    #     end
+    #
+    #     def self.match(name)
+    #       return ".*?" if name == "first"
+    #       return ".*"
+    #     end
+    #   end
+    #
+    #   uri = Addressable::URI.parse(
+    #     "http://example.com/search/an+example+search+query/"
+    #   )
+    #   match = Addressable::Template.new(
+    #     "http://example.com/search/{query}/"
+    #   ).match(uri, ExampleProcessor)
+    #   match.variables
+    #   #=> ["query"]
+    #   match.captures
+    #   #=> ["an example search query"]
+    #
+    #   uri = Addressable::URI.parse("http://example.com/a/b/c/")
+    #   match = Addressable::Template.new(
+    #     "http://example.com/{first}/{+second}/"
+    #   ).match(uri, ExampleProcessor)
+    #   match.variables
+    #   #=> ["first", "second"]
+    #   match.captures
+    #   #=> ["a", "b/c"]
+    #
+    #   uri = Addressable::URI.parse("http://example.com/a/b/c/")
+    #   match = Addressable::Template.new(
+    #     "http://example.com/{first}{/second*}/"
+    #   ).match(uri)
+    #   match.variables
+    #   #=> ["first", "second"]
+    #   match.captures
+    #   #=> ["a", ["b", "c"]]
+    def match(uri, processor=nil)
+      uri = Addressable::URI.parse(uri)
+      mapping = {}
+
+      # First, we need to process the pattern, and extract the values.
+      expansions, expansion_regexp =
+        parse_template_pattern(pattern, processor)
+
+      return nil unless uri.to_str.match(expansion_regexp)
+      unparsed_values = uri.to_str.scan(expansion_regexp).flatten
+
+      if uri.to_str == pattern
+        return Addressable::Template::MatchData.new(uri, self, mapping)
+      elsif expansions.size > 0
+        index = 0
+        expansions.each do |expansion|
+          _, operator, varlist = *expansion.match(EXPRESSION)
+          varlist.split(',').each do |varspec|
+            _, name, modifier = *varspec.match(VARSPEC)
+            mapping[name] ||= nil
+            case operator
+            when nil, '+', '#', '/', '.'
+              unparsed_value = unparsed_values[index]
+              name = varspec[VARSPEC, 1]
+              value = unparsed_value
+              value = value.split(JOINERS[operator]) if value && modifier == '*'
+            when ';', '?', '&'
+              if modifier == '*'
+                if unparsed_values[index]
+                  value = unparsed_values[index].split(JOINERS[operator])
+                  value = value.inject({}) do |acc, v|
+                    key, val = v.split('=')
+                    val = "" if val.nil?
+                    acc[key] = val
+                    acc
+                  end
+                end
+              else
+                if (unparsed_values[index])
+                  name, value = unparsed_values[index].split('=')
+                  value = "" if value.nil?
+                end
+              end
+            end
+            if processor != nil && processor.respond_to?(:restore)
+              value = processor.restore(name, value)
+            end
+            if processor == nil
+              if value.is_a?(Hash)
+                value = value.inject({}){|acc, (k, v)|
+                  acc[Addressable::URI.unencode_component(k)] =
+                    Addressable::URI.unencode_component(v)
+                  acc
+                }
+              elsif value.is_a?(Array)
+                value = value.map{|v| Addressable::URI.unencode_component(v) }
+              else
+                value = Addressable::URI.unencode_component(value)
+              end
+            end
+            if !mapping.has_key?(name) || mapping[name].nil?
+              # Doesn't exist, set to value (even if value is nil)
+              mapping[name] = value
+            end
+            index = index + 1
+          end
+        end
+        return Addressable::Template::MatchData.new(uri, self, mapping)
+      else
+        return nil
+      end
+    end
+
+    ##
+    # Expands a URI template into another URI template.
+    #
+    # @param [Hash] mapping The mapping that corresponds to the pattern.
+    # @param [#validate, #transform] processor
+    #   An optional processor object may be supplied.
+    # @param [Boolean] normalize_values
+    #   Optional flag to enable/disable unicode normalization. Default: true
+    #
+    # The object should respond to either the <tt>validate</tt> or
+    # <tt>transform</tt> messages or both. Both the <tt>validate</tt> and
+    # <tt>transform</tt> methods should take two parameters: <tt>name</tt> and
+    # <tt>value</tt>. The <tt>validate</tt> method should return <tt>true</tt>
+    # or <tt>false</tt>; <tt>true</tt> if the value of the variable is valid,
+    # <tt>false</tt> otherwise. An <tt>InvalidTemplateValueError</tt>
+    # exception will be raised if the value is invalid. The <tt>transform</tt>
+    # method should return the transformed variable value as a <tt>String</tt>.
+    # If a <tt>transform</tt> method is used, the value will not be percent
+    # encoded automatically. Unicode normalization will be performed both
+    # before and after sending the value to the transform method.
+    #
+    # @return [Addressable::Template] The partially expanded URI template.
+    #
+    # @example
+    #   Addressable::Template.new(
+    #     "http://example.com/{one}/{two}/"
+    #   ).partial_expand({"one" => "1"}).pattern
+    #   #=> "http://example.com/1/{two}/"
+    #
+    #   Addressable::Template.new(
+    #     "http://example.com/{?one,two}/"
+    #   ).partial_expand({"one" => "1"}).pattern
+    #   #=> "http://example.com/?one=1{&two}/"
+    #
+    #   Addressable::Template.new(
+    #     "http://example.com/{?one,two,three}/"
+    #   ).partial_expand({"one" => "1", "three" => 3}).pattern
+    #   #=> "http://example.com/?one=1{&two}&three=3"
+    def partial_expand(mapping, processor=nil, normalize_values=true)
+      result = self.pattern.dup
+      mapping = normalize_keys(mapping)
+      result.gsub!( EXPRESSION ) do |capture|
+        transform_partial_capture(mapping, capture, processor, normalize_values)
+      end
+      return Addressable::Template.new(result)
+    end
+
+    ##
+    # Expands a URI template into a full URI.
+    #
+    # @param [Hash] mapping The mapping that corresponds to the pattern.
+    # @param [#validate, #transform] processor
+    #   An optional processor object may be supplied.
+    # @param [Boolean] normalize_values
+    #   Optional flag to enable/disable unicode normalization. Default: true
+    #
+    # The object should respond to either the <tt>validate</tt> or
+    # <tt>transform</tt> messages or both. Both the <tt>validate</tt> and
+    # <tt>transform</tt> methods should take two parameters: <tt>name</tt> and
+    # <tt>value</tt>. The <tt>validate</tt> method should return <tt>true</tt>
+    # or <tt>false</tt>; <tt>true</tt> if the value of the variable is valid,
+    # <tt>false</tt> otherwise. An <tt>InvalidTemplateValueError</tt>
+    # exception will be raised if the value is invalid. The <tt>transform</tt>
+    # method should return the transformed variable value as a <tt>String</tt>.
+    # If a <tt>transform</tt> method is used, the value will not be percent
+    # encoded automatically. Unicode normalization will be performed both
+    # before and after sending the value to the transform method.
+    #
+    # @return [Addressable::URI] The expanded URI template.
+    #
+    # @example
+    #   class ExampleProcessor
+    #     def self.validate(name, value)
+    #       return !!(value =~ /^[\w ]+$/) if name == "query"
+    #       return true
+    #     end
+    #
+    #     def self.transform(name, value)
+    #       return value.gsub(/ /, "+") if name == "query"
+    #       return value
+    #     end
+    #   end
+    #
+    #   Addressable::Template.new(
+    #     "http://example.com/search/{query}/"
+    #   ).expand(
+    #     {"query" => "an example search query"},
+    #     ExampleProcessor
+    #   ).to_str
+    #   #=> "http://example.com/search/an+example+search+query/"
+    #
+    #   Addressable::Template.new(
+    #     "http://example.com/search/{query}/"
+    #   ).expand(
+    #     {"query" => "an example search query"}
+    #   ).to_str
+    #   #=> "http://example.com/search/an%20example%20search%20query/"
+    #
+    #   Addressable::Template.new(
+    #     "http://example.com/search/{query}/"
+    #   ).expand(
+    #     {"query" => "bogus!"},
+    #     ExampleProcessor
+    #   ).to_str
+    #   #=> Addressable::Template::InvalidTemplateValueError
+    def expand(mapping, processor=nil, normalize_values=true)
+      result = self.pattern.dup
+      mapping = normalize_keys(mapping)
+      result.gsub!( EXPRESSION ) do |capture|
+        transform_capture(mapping, capture, processor, normalize_values)
+      end
+      return Addressable::URI.parse(result)
+    end
+
+    ##
+    # Returns an Array of variables used within the template pattern.
+    # The variables are listed in the Array in the order they appear within
+    # the pattern.  Multiple occurrences of a variable within a pattern are
+    # not represented in this Array.
+    #
+    # @return [Array] The variables present in the template's pattern.
+    def variables
+      @variables ||= ordered_variable_defaults.map { |var, val| var }.uniq
+    end
+    alias_method :keys, :variables
+    alias_method :names, :variables
+
+    ##
+    # Returns a mapping of variables to their default values specified
+    # in the template. Variables without defaults are not returned.
+    #
+    # @return [Hash] Mapping of template variables to their defaults
+    def variable_defaults
+      @variable_defaults ||=
+        Hash[*ordered_variable_defaults.reject { |k, v| v.nil? }.flatten]
+    end
+
+    ##
+    # Coerces a template into a `Regexp` object. This regular expression will
+    # behave very similarly to the actual template, and should match the same
+    # URI values, but it cannot fully handle, for example, values that would
+    # extract to an `Array`.
+    #
+    # @return [Regexp] A regular expression which should match the template.
+    def to_regexp
+      _, source = parse_template_pattern(pattern)
+      Regexp.new(source)
+    end
+
+    ##
+    # Returns the source of the coerced `Regexp`.
+    #
+    # @return [String] The source of the `Regexp` given by {#to_regexp}.
+    #
+    # @api private
+    def source
+      self.to_regexp.source
+    end
+
+    ##
+    # Returns the named captures of the coerced `Regexp`.
+    #
+    # @return [Hash] The named captures of the `Regexp` given by {#to_regexp}.
+    #
+    # @api private
+    def named_captures
+      self.to_regexp.named_captures
+    end
+
+    ##
+    # Generates a route result for a given set of parameters.
+    # Should only be used by rack-mount.
+    #
+    # @param params [Hash] The set of parameters used to expand the template.
+    # @param recall [Hash] Default parameters used to expand the template.
+    # @param options [Hash] Either a `:processor` or a `:parameterize` block.
+    #
+    # @api private
+    def generate(params={}, recall={}, options={})
+      merged = recall.merge(params)
+      if options[:processor]
+        processor = options[:processor]
+      elsif options[:parameterize]
+        # TODO: This is sending me into fits trying to shoe-horn this into
+        # the existing API. I think I've got this backwards and processors
+        # should be a set of 4 optional blocks named :validate, :transform,
+        # :match, and :restore. Having to use a singleton here is a huge
+        # code smell.
+        processor = Object.new
+        class <<processor
+          attr_accessor :block
+          def transform(name, value)
+            block.call(name, value)
+          end
+        end
+        processor.block = options[:parameterize]
+      else
+        processor = nil
+      end
+      result = self.expand(merged, processor)
+      result.to_s if result
+    end
+
+  private
+    def ordered_variable_defaults
+      @ordered_variable_defaults ||= begin
+        expansions, _ = parse_template_pattern(pattern)
+        expansions.map do |capture|
+          _, _, varlist = *capture.match(EXPRESSION)
+          varlist.split(',').map do |varspec|
+            varspec[VARSPEC, 1]
+          end
+        end.flatten
+      end
+    end
+
+
+    ##
+    # Loops through each capture and expands any values available in mapping
+    #
+    # @param [Hash] mapping
+    #   Set of keys to expand
+    # @param [String] capture
+    #   The expression to expand
+    # @param [#validate, #transform] processor
+    #   An optional processor object may be supplied.
+    # @param [Boolean] normalize_values
+    #   Optional flag to enable/disable unicode normalization. Default: true
+    #
+    # The object should respond to either the <tt>validate</tt> or
+    # <tt>transform</tt> messages or both. Both the <tt>validate</tt> and
+    # <tt>transform</tt> methods should take two parameters: <tt>name</tt> and
+    # <tt>value</tt>. The <tt>validate</tt> method should return <tt>true</tt>
+    # or <tt>false</tt>; <tt>true</tt> if the value of the variable is valid,
+    # <tt>false</tt> otherwise. An <tt>InvalidTemplateValueError</tt> exception
+    # will be raised if the value is invalid. The <tt>transform</tt> method
+    # should return the transformed variable value as a <tt>String</tt>. If a
+    # <tt>transform</tt> method is used, the value will not be percent encoded
+    # automatically. Unicode normalization will be performed both before and
+    # after sending the value to the transform method.
+    #
+    # @return [String] The expanded expression
+    def transform_partial_capture(mapping, capture, processor = nil,
+                                  normalize_values = true)
+      _, operator, varlist = *capture.match(EXPRESSION)
+
+      vars = varlist.split(',')
+
+      if '?' == operator
+        # partial expansion of form style query variables sometimes requires a
+        # slight reordering of the variables to produce a valid url.
+        first_to_expand = vars.find { |varspec|
+          _, name, _ =  *varspec.match(VARSPEC)
+          mapping.key? name
+        }
+
+        vars = [first_to_expand] + vars.reject {|varspec| varspec == first_to_expand}  if first_to_expand
+      end
+
+      vars
+        .zip(operator_sequence(operator).take(vars.length))
+        .reduce("".dup) do |acc, (varspec, op)|
+          _, name, _ =  *varspec.match(VARSPEC)
+
+          acc << if mapping.key? name
+                   transform_capture(mapping, "{#{op}#{varspec}}",
+                                     processor, normalize_values)
+                 else
+                   "{#{op}#{varspec}}"
+                 end
+      end
+    end
+
+    ##
+    # Creates a lazy Enumerator of the operators that should be used to expand
+    # variables in a varlist starting with `operator`. For example, an operator
+    # `"?"` results in the sequence `"?","&","&"...`
+    #
+    # @param [String] operator from which to generate a sequence
+    #
+    # @return [Enumerator] sequence of operators
+    def operator_sequence(operator)
+      rest_operator = if "?" == operator
+                        "&"
+                      else
+                        operator
+                      end
+      head_operator = operator
+
+      Enumerator.new do |y|
+        y << head_operator.to_s
+        while true
+          y << rest_operator.to_s
+        end
+      end
+    end
+
+    ##
+    # Transforms a mapped value so that values can be substituted into the
+    # template.
+    #
+    # @param [Hash] mapping The mapping to replace captures
+    # @param [String] capture
+    #   The expression to replace
+    # @param [#validate, #transform] processor
+    #   An optional processor object may be supplied.
+    # @param [Boolean] normalize_values
+    #   Optional flag to enable/disable unicode normalization. Default: true
+    #
+    #
+    # The object should respond to either the <tt>validate</tt> or
+    # <tt>transform</tt> messages or both. Both the <tt>validate</tt> and
+    # <tt>transform</tt> methods should take two parameters: <tt>name</tt> and
+    # <tt>value</tt>. The <tt>validate</tt> method should return <tt>true</tt>
+    # or <tt>false</tt>; <tt>true</tt> if the value of the variable is valid,
+    # <tt>false</tt> otherwise. An <tt>InvalidTemplateValueError</tt> exception
+    # will be raised if the value is invalid. The <tt>transform</tt> method
+    # should return the transformed variable value as a <tt>String</tt>. If a
+    # <tt>transform</tt> method is used, the value will not be percent encoded
+    # automatically. Unicode normalization will be performed both before and
+    # after sending the value to the transform method.
+    #
+    # @return [String] The expanded expression
+    def transform_capture(mapping, capture, processor=nil,
+                          normalize_values=true)
+      _, operator, varlist = *capture.match(EXPRESSION)
+      return_value = varlist.split(',').inject([]) do |acc, varspec|
+        _, name, modifier = *varspec.match(VARSPEC)
+        value = mapping[name]
+        unless value == nil || value == {}
+          allow_reserved = %w(+ #).include?(operator)
+          # Common primitives where the .to_s output is well-defined
+          if Numeric === value || Symbol === value ||
+              value == true || value == false
+            value = value.to_s
+          end
+          length = modifier.gsub(':', '').to_i if modifier =~ /^:\d+/
+
+          unless (Hash === value) ||
+            value.respond_to?(:to_ary) || value.respond_to?(:to_str)
+            raise TypeError,
+              "Can't convert #{value.class} into String or Array."
+          end
+
+          value = normalize_value(value) if normalize_values
+
+          if processor == nil || !processor.respond_to?(:transform)
+            # Handle percent escaping
+            if allow_reserved
+              encode_map =
+                Addressable::URI::CharacterClasses::RESERVED +
+                Addressable::URI::CharacterClasses::UNRESERVED
+            else
+              encode_map = Addressable::URI::CharacterClasses::UNRESERVED
+            end
+            if value.kind_of?(Array)
+              transformed_value = value.map do |val|
+                if length
+                  Addressable::URI.encode_component(val[0...length], encode_map)
+                else
+                  Addressable::URI.encode_component(val, encode_map)
+                end
+              end
+              unless modifier == "*"
+                transformed_value = transformed_value.join(',')
+              end
+            elsif value.kind_of?(Hash)
+              transformed_value = value.map do |key, val|
+                if modifier == "*"
+                  "#{
+                    Addressable::URI.encode_component( key, encode_map)
+                  }=#{
+                    Addressable::URI.encode_component( val, encode_map)
+                  }"
+                else
+                  "#{
+                    Addressable::URI.encode_component( key, encode_map)
+                  },#{
+                    Addressable::URI.encode_component( val, encode_map)
+                  }"
+                end
+              end
+              unless modifier == "*"
+                transformed_value = transformed_value.join(',')
+              end
+            else
+              if length
+                transformed_value = Addressable::URI.encode_component(
+                  value[0...length], encode_map)
+              else
+                transformed_value = Addressable::URI.encode_component(
+                  value, encode_map)
+              end
+            end
+          end
+
+          # Process, if we've got a processor
+          if processor != nil
+            if processor.respond_to?(:validate)
+              if !processor.validate(name, value)
+                display_value = value.kind_of?(Array) ? value.inspect : value
+                raise InvalidTemplateValueError,
+                  "#{name}=#{display_value} is an invalid template value."
+              end
+            end
+            if processor.respond_to?(:transform)
+              transformed_value = processor.transform(name, value)
+              if normalize_values
+                transformed_value = normalize_value(transformed_value)
+              end
+            end
+          end
+          acc << [name, transformed_value]
+        end
+        acc
+      end
+      return "" if return_value.empty?
+      join_values(operator, return_value)
+    end
+
+    ##
+    # Takes a set of values, and joins them together based on the
+    # operator.
+    #
+    # @param [String, Nil] operator One of the operators from the set
+    #   (?,&,+,#,;,/,.), or nil if there wasn't one.
+    # @param [Array] return_value
+    #   The set of return values (as [variable_name, value] tuples) that will
+    #   be joined together.
+    #
+    # @return [String] The transformed mapped value
+    def join_values(operator, return_value)
+      leader = LEADERS.fetch(operator, '')
+      joiner = JOINERS.fetch(operator, ',')
+      case operator
+      when '&', '?'
+        leader + return_value.map{|k,v|
+          if v.is_a?(Array) && v.first =~ /=/
+            v.join(joiner)
+          elsif v.is_a?(Array)
+            v.map{|inner_value| "#{k}=#{inner_value}"}.join(joiner)
+          else
+            "#{k}=#{v}"
+          end
+        }.join(joiner)
+      when ';'
+        return_value.map{|k,v|
+          if v.is_a?(Array) && v.first =~ /=/
+            ';' + v.join(";")
+          elsif v.is_a?(Array)
+            ';' + v.map{|inner_value| "#{k}=#{inner_value}"}.join(";")
+          else
+            v && v != '' ?  ";#{k}=#{v}" : ";#{k}"
+          end
+        }.join
+      else
+        leader + return_value.map{|k,v| v}.join(joiner)
+      end
+    end
+
+    ##
+    # Takes a set of values, and joins them together based on the
+    # operator.
+    #
+    # @param [Hash, Array, String] value
+    #   Normalizes keys and values with IDNA#unicode_normalize_kc
+    #
+    # @return [Hash, Array, String] The normalized values
+    def normalize_value(value)
+      unless value.is_a?(Hash)
+        value = value.respond_to?(:to_ary) ? value.to_ary : value.to_str
+      end
+
+      # Handle unicode normalization
+      if value.kind_of?(Array)
+        value.map! { |val| Addressable::IDNA.unicode_normalize_kc(val) }
+      elsif value.kind_of?(Hash)
+        value = value.inject({}) { |acc, (k, v)|
+          acc[Addressable::IDNA.unicode_normalize_kc(k)] =
+            Addressable::IDNA.unicode_normalize_kc(v)
+          acc
+        }
+      else
+        value = Addressable::IDNA.unicode_normalize_kc(value)
+      end
+      value
+    end
+
+    ##
+    # Generates a hash with string keys
+    #
+    # @param [Hash] mapping A mapping hash to normalize
+    #
+    # @return [Hash]
+    #   A hash with stringified keys
+    def normalize_keys(mapping)
+      return mapping.inject({}) do |accu, pair|
+        name, value = pair
+        if Symbol === name
+          name = name.to_s
+        elsif name.respond_to?(:to_str)
+          name = name.to_str
+        else
+          raise TypeError,
+            "Can't convert #{name.class} into String."
+        end
+        accu[name] = value
+        accu
+      end
+    end
+
+    ##
+    # Generates the <tt>Regexp</tt> that parses a template pattern.
+    #
+    # @param [String] pattern The URI template pattern.
+    # @param [#match] processor The template processor to use.
+    #
+    # @return [Regexp]
+    #   A regular expression which may be used to parse a template pattern.
+    def parse_template_pattern(pattern, processor=nil)
+      # Escape the pattern. The two gsubs restore the escaped curly braces
+      # back to their original form. Basically, escape everything that isn't
+      # within an expansion.
+      escaped_pattern = Regexp.escape(
+        pattern
+      ).gsub(/\\\{(.*?)\\\}/) do |escaped|
+        escaped.gsub(/\\(.)/, "\\1")
+      end
+
+      expansions = []
+
+      # Create a regular expression that captures the values of the
+      # variables in the URI.
+      regexp_string = escaped_pattern.gsub( EXPRESSION ) do |expansion|
+
+        expansions << expansion
+        _, operator, varlist = *expansion.match(EXPRESSION)
+        leader = Regexp.escape(LEADERS.fetch(operator, ''))
+        joiner = Regexp.escape(JOINERS.fetch(operator, ','))
+        combined = varlist.split(',').map do |varspec|
+          _, name, modifier = *varspec.match(VARSPEC)
+
+          result = processor && processor.respond_to?(:match) ? processor.match(name) : nil
+          if result
+            "(?<#{name}>#{ result })"
+          else
+            group = case operator
+            when '+'
+              "#{ RESERVED }*?"
+            when '#'
+              "#{ RESERVED }*?"
+            when '/'
+              "#{ UNRESERVED }*?"
+            when '.'
+              "#{ UNRESERVED.gsub('\.', '') }*?"
+            when ';'
+              "#{ UNRESERVED }*=?#{ UNRESERVED }*?"
+            when '?'
+              "#{ UNRESERVED }*=#{ UNRESERVED }*?"
+            when '&'
+              "#{ UNRESERVED }*=#{ UNRESERVED }*?"
+            else
+              "#{ UNRESERVED }*?"
+            end
+            if modifier == '*'
+              "(?<#{name}>#{group}(?:#{joiner}?#{group})*)?"
+            else
+              "(?<#{name}>#{group})?"
+            end
+          end
+        end.join("#{joiner}?")
+        "(?:|#{leader}#{combined})"
+      end
+
+      # Ensure that the regular expression matches the whole URI.
+      regexp_string = "^#{regexp_string}$"
+      return expansions, Regexp.new(regexp_string)
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/uri.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/uri.rb
new file mode 100644
index 0000000..a4fa1a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/uri.rb
@@ -0,0 +1,2492 @@
+# encoding:utf-8
+#--
+# Copyright (C) Bob Aman
+#
+#    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.
+#++
+
+
+require "addressable/version"
+require "addressable/idna"
+require "public_suffix"
+
+##
+# Addressable is a library for processing links and URIs.
+module Addressable
+  ##
+  # This is an implementation of a URI parser based on
+  # <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>,
+  # <a href="http://www.ietf.org/rfc/rfc3987.txt">RFC 3987</a>.
+  class URI
+    ##
+    # Raised if something other than a uri is supplied.
+    class InvalidURIError < StandardError
+    end
+
+    ##
+    # Container for the character classes specified in
+    # <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>.
+    module CharacterClasses
+      ALPHA = "a-zA-Z"
+      DIGIT = "0-9"
+      GEN_DELIMS = "\\:\\/\\?\\#\\[\\]\\@"
+      SUB_DELIMS = "\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\="
+      RESERVED = GEN_DELIMS + SUB_DELIMS
+      UNRESERVED = ALPHA + DIGIT + "\\-\\.\\_\\~"
+      PCHAR = UNRESERVED + SUB_DELIMS + "\\:\\@"
+      SCHEME = ALPHA + DIGIT + "\\-\\+\\."
+      HOST = UNRESERVED + SUB_DELIMS + "\\[\\:\\]"
+      AUTHORITY = PCHAR
+      PATH = PCHAR + "\\/"
+      QUERY = PCHAR + "\\/\\?"
+      FRAGMENT = PCHAR + "\\/\\?"
+    end
+
+    SLASH = '/'
+    EMPTY_STR = ''
+
+    URIREGEX = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/
+
+    PORT_MAPPING = {
+      "http" => 80,
+      "https" => 443,
+      "ftp" => 21,
+      "tftp" => 69,
+      "sftp" => 22,
+      "ssh" => 22,
+      "svn+ssh" => 22,
+      "telnet" => 23,
+      "nntp" => 119,
+      "gopher" => 70,
+      "wais" => 210,
+      "ldap" => 389,
+      "prospero" => 1525
+    }
+
+    ##
+    # Returns a URI object based on the parsed string.
+    #
+    # @param [String, Addressable::URI, #to_str] uri
+    #   The URI string to parse.
+    #   No parsing is performed if the object is already an
+    #   <code>Addressable::URI</code>.
+    #
+    # @return [Addressable::URI] The parsed URI.
+    def self.parse(uri)
+      # If we were given nil, return nil.
+      return nil unless uri
+      # If a URI object is passed, just return itself.
+      return uri.dup if uri.kind_of?(self)
+
+      # If a URI object of the Ruby standard library variety is passed,
+      # convert it to a string, then parse the string.
+      # We do the check this way because we don't want to accidentally
+      # cause a missing constant exception to be thrown.
+      if uri.class.name =~ /^URI\b/
+        uri = uri.to_s
+      end
+
+      # Otherwise, convert to a String
+      begin
+        uri = uri.to_str
+      rescue TypeError, NoMethodError
+        raise TypeError, "Can't convert #{uri.class} into String."
+      end if not uri.is_a? String
+
+      # This Regexp supplied as an example in RFC 3986, and it works great.
+      scan = uri.scan(URIREGEX)
+      fragments = scan[0]
+      scheme = fragments[1]
+      authority = fragments[3]
+      path = fragments[4]
+      query = fragments[6]
+      fragment = fragments[8]
+      user = nil
+      password = nil
+      host = nil
+      port = nil
+      if authority != nil
+        # The Regexp above doesn't split apart the authority.
+        userinfo = authority[/^([^\[\]]*)@/, 1]
+        if userinfo != nil
+          user = userinfo.strip[/^([^:]*):?/, 1]
+          password = userinfo.strip[/:(.*)$/, 1]
+        end
+        host = authority.gsub(
+          /^([^\[\]]*)@/, EMPTY_STR
+        ).gsub(
+          /:([^:@\[\]]*?)$/, EMPTY_STR
+        )
+        port = authority[/:([^:@\[\]]*?)$/, 1]
+      end
+      if port == EMPTY_STR
+        port = nil
+      end
+
+      return new(
+        :scheme => scheme,
+        :user => user,
+        :password => password,
+        :host => host,
+        :port => port,
+        :path => path,
+        :query => query,
+        :fragment => fragment
+      )
+    end
+
+    ##
+    # Converts an input to a URI. The input does not have to be a valid
+    # URI — the method will use heuristics to guess what URI was intended.
+    # This is not standards-compliant, merely user-friendly.
+    #
+    # @param [String, Addressable::URI, #to_str] uri
+    #   The URI string to parse.
+    #   No parsing is performed if the object is already an
+    #   <code>Addressable::URI</code>.
+    # @param [Hash] hints
+    #   A <code>Hash</code> of hints to the heuristic parser.
+    #   Defaults to <code>{:scheme => "http"}</code>.
+    #
+    # @return [Addressable::URI] The parsed URI.
+    def self.heuristic_parse(uri, hints={})
+      # If we were given nil, return nil.
+      return nil unless uri
+      # If a URI object is passed, just return itself.
+      return uri.dup if uri.kind_of?(self)
+
+      # If a URI object of the Ruby standard library variety is passed,
+      # convert it to a string, then parse the string.
+      # We do the check this way because we don't want to accidentally
+      # cause a missing constant exception to be thrown.
+      if uri.class.name =~ /^URI\b/
+        uri = uri.to_s
+      end
+
+      if !uri.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{uri.class} into String."
+      end
+      # Otherwise, convert to a String
+      uri = uri.to_str.dup.strip
+      hints = {
+        :scheme => "http"
+      }.merge(hints)
+      case uri
+      when /^http:\/+/
+        uri.gsub!(/^http:\/+/, "http://")
+      when /^https:\/+/
+        uri.gsub!(/^https:\/+/, "https://")
+      when /^feed:\/+http:\/+/
+        uri.gsub!(/^feed:\/+http:\/+/, "feed:http://")
+      when /^feed:\/+/
+        uri.gsub!(/^feed:\/+/, "feed://")
+      when /^file:\/+/
+        uri.gsub!(/^file:\/+/, "file:///")
+      when /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
+        uri.gsub!(/^/, hints[:scheme] + "://")
+      end
+      match = uri.match(URIREGEX)
+      fragments = match.captures
+      authority = fragments[3]
+      if authority && authority.length > 0
+        new_authority = authority.gsub(/\\/, '/').gsub(/ /, '%20')
+        # NOTE: We want offset 4, not 3!
+        offset = match.offset(4)
+        uri[offset[0]...offset[1]] = new_authority
+      end
+      parsed = self.parse(uri)
+      if parsed.scheme =~ /^[^\/?#\.]+\.[^\/?#]+$/
+        parsed = self.parse(hints[:scheme] + "://" + uri)
+      end
+      if parsed.path.include?(".")
+        new_host = parsed.path[/^([^\/]+\.[^\/]*)/, 1]
+        if new_host
+          parsed.defer_validation do
+            new_path = parsed.path.gsub(
+              Regexp.new("^" + Regexp.escape(new_host)), EMPTY_STR)
+            parsed.host = new_host
+            parsed.path = new_path
+            parsed.scheme = hints[:scheme] unless parsed.scheme
+          end
+        end
+      end
+      return parsed
+    end
+
+    ##
+    # Converts a path to a file scheme URI. If the path supplied is
+    # relative, it will be returned as a relative URI. If the path supplied
+    # is actually a non-file URI, it will parse the URI as if it had been
+    # parsed with <code>Addressable::URI.parse</code>. Handles all of the
+    # various Microsoft-specific formats for specifying paths.
+    #
+    # @param [String, Addressable::URI, #to_str] path
+    #   Typically a <code>String</code> path to a file or directory, but
+    #   will return a sensible return value if an absolute URI is supplied
+    #   instead.
+    #
+    # @return [Addressable::URI]
+    #   The parsed file scheme URI or the original URI if some other URI
+    #   scheme was provided.
+    #
+    # @example
+    #   base = Addressable::URI.convert_path("/absolute/path/")
+    #   uri = Addressable::URI.convert_path("relative/path")
+    #   (base + uri).to_s
+    #   #=> "file:///absolute/path/relative/path"
+    #
+    #   Addressable::URI.convert_path(
+    #     "c:\\windows\\My Documents 100%20\\foo.txt"
+    #   ).to_s
+    #   #=> "file:///c:/windows/My%20Documents%20100%20/foo.txt"
+    #
+    #   Addressable::URI.convert_path("http://example.com/").to_s
+    #   #=> "http://example.com/"
+    def self.convert_path(path)
+      # If we were given nil, return nil.
+      return nil unless path
+      # If a URI object is passed, just return itself.
+      return path if path.kind_of?(self)
+      if !path.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{path.class} into String."
+      end
+      # Otherwise, convert to a String
+      path = path.to_str.strip
+
+      path.gsub!(/^file:\/?\/?/, EMPTY_STR) if path =~ /^file:\/?\/?/
+      path = SLASH + path if path =~ /^([a-zA-Z])[\|:]/
+      uri = self.parse(path)
+
+      if uri.scheme == nil
+        # Adjust windows-style uris
+        uri.path.gsub!(/^\/?([a-zA-Z])[\|:][\\\/]/) do
+          "/#{$1.downcase}:/"
+        end
+        uri.path.gsub!(/\\/, SLASH)
+        if File.exist?(uri.path) &&
+            File.stat(uri.path).directory?
+          uri.path.gsub!(/\/$/, EMPTY_STR)
+          uri.path = uri.path + '/'
+        end
+
+        # If the path is absolute, set the scheme and host.
+        if uri.path =~ /^\//
+          uri.scheme = "file"
+          uri.host = EMPTY_STR
+        end
+        uri.normalize!
+      end
+
+      return uri
+    end
+
+    ##
+    # Joins several URIs together.
+    #
+    # @param [String, Addressable::URI, #to_str] *uris
+    #   The URIs to join.
+    #
+    # @return [Addressable::URI] The joined URI.
+    #
+    # @example
+    #   base = "http://example.com/"
+    #   uri = Addressable::URI.parse("relative/path")
+    #   Addressable::URI.join(base, uri)
+    #   #=> #<Addressable::URI:0xcab390 URI:http://example.com/relative/path>
+    def self.join(*uris)
+      uri_objects = uris.collect do |uri|
+        if !uri.respond_to?(:to_str)
+          raise TypeError, "Can't convert #{uri.class} into String."
+        end
+        uri.kind_of?(self) ? uri : self.parse(uri.to_str)
+      end
+      result = uri_objects.shift.dup
+      for uri in uri_objects
+        result.join!(uri)
+      end
+      return result
+    end
+
+    ##
+    # Percent encodes a URI component.
+    #
+    # @param [String, #to_str] component The URI component to encode.
+    #
+    # @param [String, Regexp] character_class
+    #   The characters which are not percent encoded. If a <code>String</code>
+    #   is passed, the <code>String</code> must be formatted as a regular
+    #   expression character class. (Do not include the surrounding square
+    #   brackets.)  For example, <code>"b-zB-Z0-9"</code> would cause
+    #   everything but the letters 'b' through 'z' and the numbers '0' through
+    #  '9' to be percent encoded. If a <code>Regexp</code> is passed, the
+    #   value <code>/[^b-zB-Z0-9]/</code> would have the same effect. A set of
+    #   useful <code>String</code> values may be found in the
+    #   <code>Addressable::URI::CharacterClasses</code> module. The default
+    #   value is the reserved plus unreserved character classes specified in
+    #   <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>.
+    #
+    # @param [Regexp] upcase_encoded
+    #   A string of characters that may already be percent encoded, and whose
+    #   encodings should be upcased. This allows normalization of percent
+    #   encodings for characters not included in the
+    #   <code>character_class</code>.
+    #
+    # @return [String] The encoded component.
+    #
+    # @example
+    #   Addressable::URI.encode_component("simple/example", "b-zB-Z0-9")
+    #   => "simple%2Fex%61mple"
+    #   Addressable::URI.encode_component("simple/example", /[^b-zB-Z0-9]/)
+    #   => "simple%2Fex%61mple"
+    #   Addressable::URI.encode_component(
+    #     "simple/example", Addressable::URI::CharacterClasses::UNRESERVED
+    #   )
+    #   => "simple%2Fexample"
+    def self.encode_component(component, character_class=
+        CharacterClasses::RESERVED + CharacterClasses::UNRESERVED,
+        upcase_encoded='')
+      return nil if component.nil?
+
+      begin
+        if component.kind_of?(Symbol) ||
+            component.kind_of?(Numeric) ||
+            component.kind_of?(TrueClass) ||
+            component.kind_of?(FalseClass)
+          component = component.to_s
+        else
+          component = component.to_str
+        end
+      rescue TypeError, NoMethodError
+        raise TypeError, "Can't convert #{component.class} into String."
+      end if !component.is_a? String
+
+      if ![String, Regexp].include?(character_class.class)
+        raise TypeError,
+          "Expected String or Regexp, got #{character_class.inspect}"
+      end
+      if character_class.kind_of?(String)
+        character_class = /[^#{character_class}]/
+      end
+      # We can't perform regexps on invalid UTF sequences, but
+      # here we need to, so switch to ASCII.
+      component = component.dup
+      component.force_encoding(Encoding::ASCII_8BIT)
+      # Avoiding gsub! because there are edge cases with frozen strings
+      component = component.gsub(character_class) do |sequence|
+        (sequence.unpack('C*').map { |c| "%" + ("%02x" % c).upcase }).join
+      end
+      if upcase_encoded.length > 0
+        component = component.gsub(/%(#{upcase_encoded.chars.map do |char|
+          char.unpack('C*').map { |c| '%02x' % c }.join
+        end.join('|')})/i) { |s| s.upcase }
+      end
+      return component
+    end
+
+    class << self
+      alias_method :encode_component, :encode_component
+    end
+
+    ##
+    # Unencodes any percent encoded characters within a URI component.
+    # This method may be used for unencoding either components or full URIs,
+    # however, it is recommended to use the <code>unencode_component</code>
+    # alias when unencoding components.
+    #
+    # @param [String, Addressable::URI, #to_str] uri
+    #   The URI or component to unencode.
+    #
+    # @param [Class] return_type
+    #   The type of object to return.
+    #   This value may only be set to <code>String</code> or
+    #   <code>Addressable::URI</code>. All other values are invalid. Defaults
+    #   to <code>String</code>.
+    #
+    # @param [String] leave_encoded
+    #   A string of characters to leave encoded. If a percent encoded character
+    #   in this list is encountered then it will remain percent encoded.
+    #
+    # @return [String, Addressable::URI]
+    #   The unencoded component or URI.
+    #   The return type is determined by the <code>return_type</code>
+    #   parameter.
+    def self.unencode(uri, return_type=String, leave_encoded='')
+      return nil if uri.nil?
+
+      begin
+        uri = uri.to_str
+      rescue NoMethodError, TypeError
+        raise TypeError, "Can't convert #{uri.class} into String."
+      end if !uri.is_a? String
+      if ![String, ::Addressable::URI].include?(return_type)
+        raise TypeError,
+          "Expected Class (String or Addressable::URI), " +
+          "got #{return_type.inspect}"
+      end
+      uri = uri.dup
+      # Seriously, only use UTF-8. I'm really not kidding!
+      uri.force_encoding("utf-8")
+      leave_encoded = leave_encoded.dup.force_encoding("utf-8")
+      result = uri.gsub(/%[0-9a-f]{2}/iu) do |sequence|
+        c = sequence[1..3].to_i(16).chr
+        c.force_encoding("utf-8")
+        leave_encoded.include?(c) ? sequence : c
+      end
+      result.force_encoding("utf-8")
+      if return_type == String
+        return result
+      elsif return_type == ::Addressable::URI
+        return ::Addressable::URI.parse(result)
+      end
+    end
+
+    class << self
+      alias_method :unescape, :unencode
+      alias_method :unencode_component, :unencode
+      alias_method :unescape_component, :unencode
+    end
+
+
+    ##
+    # Normalizes the encoding of a URI component.
+    #
+    # @param [String, #to_str] component The URI component to encode.
+    #
+    # @param [String, Regexp] character_class
+    #   The characters which are not percent encoded. If a <code>String</code>
+    #   is passed, the <code>String</code> must be formatted as a regular
+    #   expression character class. (Do not include the surrounding square
+    #   brackets.)  For example, <code>"b-zB-Z0-9"</code> would cause
+    #   everything but the letters 'b' through 'z' and the numbers '0'
+    #   through '9' to be percent encoded. If a <code>Regexp</code> is passed,
+    #   the value <code>/[^b-zB-Z0-9]/</code> would have the same effect. A
+    #   set of useful <code>String</code> values may be found in the
+    #   <code>Addressable::URI::CharacterClasses</code> module. The default
+    #   value is the reserved plus unreserved character classes specified in
+    #   <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>.
+    #
+    # @param [String] leave_encoded
+    #   When <code>character_class</code> is a <code>String</code> then
+    #   <code>leave_encoded</code> is a string of characters that should remain
+    #   percent encoded while normalizing the component; if they appear percent
+    #   encoded in the original component, then they will be upcased ("%2f"
+    #   normalized to "%2F") but otherwise left alone.
+    #
+    # @return [String] The normalized component.
+    #
+    # @example
+    #   Addressable::URI.normalize_component("simpl%65/%65xampl%65", "b-zB-Z")
+    #   => "simple%2Fex%61mple"
+    #   Addressable::URI.normalize_component(
+    #     "simpl%65/%65xampl%65", /[^b-zB-Z]/
+    #   )
+    #   => "simple%2Fex%61mple"
+    #   Addressable::URI.normalize_component(
+    #     "simpl%65/%65xampl%65",
+    #     Addressable::URI::CharacterClasses::UNRESERVED
+    #   )
+    #   => "simple%2Fexample"
+    #   Addressable::URI.normalize_component(
+    #     "one%20two%2fthree%26four",
+    #     "0-9a-zA-Z &/",
+    #     "/"
+    #   )
+    #   => "one two%2Fthree&four"
+    def self.normalize_component(component, character_class=
+        CharacterClasses::RESERVED + CharacterClasses::UNRESERVED,
+        leave_encoded='')
+      return nil if component.nil?
+
+      begin
+        component = component.to_str
+      rescue NoMethodError, TypeError
+        raise TypeError, "Can't convert #{component.class} into String."
+      end if !component.is_a? String
+
+      if ![String, Regexp].include?(character_class.class)
+        raise TypeError,
+          "Expected String or Regexp, got #{character_class.inspect}"
+      end
+      if character_class.kind_of?(String)
+        leave_re = if leave_encoded.length > 0
+          character_class = "#{character_class}%" unless character_class.include?('%')
+
+          "|%(?!#{leave_encoded.chars.map do |char|
+            seq = char.unpack('C*').map { |c| '%02x' % c }.join
+            [seq.upcase, seq.downcase]
+          end.flatten.join('|')})"
+        end
+
+        character_class = /[^#{character_class}]#{leave_re}/
+      end
+      # We can't perform regexps on invalid UTF sequences, but
+      # here we need to, so switch to ASCII.
+      component = component.dup
+      component.force_encoding(Encoding::ASCII_8BIT)
+      unencoded = self.unencode_component(component, String, leave_encoded)
+      begin
+        encoded = self.encode_component(
+          Addressable::IDNA.unicode_normalize_kc(unencoded),
+          character_class,
+          leave_encoded
+        )
+      rescue ArgumentError
+        encoded = self.encode_component(unencoded)
+      end
+      encoded.force_encoding(Encoding::UTF_8)
+      return encoded
+    end
+
+    ##
+    # Percent encodes any special characters in the URI.
+    #
+    # @param [String, Addressable::URI, #to_str] uri
+    #   The URI to encode.
+    #
+    # @param [Class] return_type
+    #   The type of object to return.
+    #   This value may only be set to <code>String</code> or
+    #   <code>Addressable::URI</code>. All other values are invalid. Defaults
+    #   to <code>String</code>.
+    #
+    # @return [String, Addressable::URI]
+    #   The encoded URI.
+    #   The return type is determined by the <code>return_type</code>
+    #   parameter.
+    def self.encode(uri, return_type=String)
+      return nil if uri.nil?
+
+      begin
+        uri = uri.to_str
+      rescue NoMethodError, TypeError
+        raise TypeError, "Can't convert #{uri.class} into String."
+      end if !uri.is_a? String
+
+      if ![String, ::Addressable::URI].include?(return_type)
+        raise TypeError,
+          "Expected Class (String or Addressable::URI), " +
+          "got #{return_type.inspect}"
+      end
+      uri_object = uri.kind_of?(self) ? uri : self.parse(uri)
+      encoded_uri = Addressable::URI.new(
+        :scheme => self.encode_component(uri_object.scheme,
+          Addressable::URI::CharacterClasses::SCHEME),
+        :authority => self.encode_component(uri_object.authority,
+          Addressable::URI::CharacterClasses::AUTHORITY),
+        :path => self.encode_component(uri_object.path,
+          Addressable::URI::CharacterClasses::PATH),
+        :query => self.encode_component(uri_object.query,
+          Addressable::URI::CharacterClasses::QUERY),
+        :fragment => self.encode_component(uri_object.fragment,
+          Addressable::URI::CharacterClasses::FRAGMENT)
+      )
+      if return_type == String
+        return encoded_uri.to_s
+      elsif return_type == ::Addressable::URI
+        return encoded_uri
+      end
+    end
+
+    class << self
+      alias_method :escape, :encode
+    end
+
+    ##
+    # Normalizes the encoding of a URI. Characters within a hostname are
+    # not percent encoded to allow for internationalized domain names.
+    #
+    # @param [String, Addressable::URI, #to_str] uri
+    #   The URI to encode.
+    #
+    # @param [Class] return_type
+    #   The type of object to return.
+    #   This value may only be set to <code>String</code> or
+    #   <code>Addressable::URI</code>. All other values are invalid. Defaults
+    #   to <code>String</code>.
+    #
+    # @return [String, Addressable::URI]
+    #   The encoded URI.
+    #   The return type is determined by the <code>return_type</code>
+    #   parameter.
+    def self.normalized_encode(uri, return_type=String)
+      begin
+        uri = uri.to_str
+      rescue NoMethodError, TypeError
+        raise TypeError, "Can't convert #{uri.class} into String."
+      end if !uri.is_a? String
+
+      if ![String, ::Addressable::URI].include?(return_type)
+        raise TypeError,
+          "Expected Class (String or Addressable::URI), " +
+          "got #{return_type.inspect}"
+      end
+      uri_object = uri.kind_of?(self) ? uri : self.parse(uri)
+      components = {
+        :scheme => self.unencode_component(uri_object.scheme),
+        :user => self.unencode_component(uri_object.user),
+        :password => self.unencode_component(uri_object.password),
+        :host => self.unencode_component(uri_object.host),
+        :port => (uri_object.port.nil? ? nil : uri_object.port.to_s),
+        :path => self.unencode_component(uri_object.path),
+        :query => self.unencode_component(uri_object.query),
+        :fragment => self.unencode_component(uri_object.fragment)
+      }
+      components.each do |key, value|
+        if value != nil
+          begin
+            components[key] =
+              Addressable::IDNA.unicode_normalize_kc(value.to_str)
+          rescue ArgumentError
+            # Likely a malformed UTF-8 character, skip unicode normalization
+            components[key] = value.to_str
+          end
+        end
+      end
+      encoded_uri = Addressable::URI.new(
+        :scheme => self.encode_component(components[:scheme],
+          Addressable::URI::CharacterClasses::SCHEME),
+        :user => self.encode_component(components[:user],
+          Addressable::URI::CharacterClasses::UNRESERVED),
+        :password => self.encode_component(components[:password],
+          Addressable::URI::CharacterClasses::UNRESERVED),
+        :host => components[:host],
+        :port => components[:port],
+        :path => self.encode_component(components[:path],
+          Addressable::URI::CharacterClasses::PATH),
+        :query => self.encode_component(components[:query],
+          Addressable::URI::CharacterClasses::QUERY),
+        :fragment => self.encode_component(components[:fragment],
+          Addressable::URI::CharacterClasses::FRAGMENT)
+      )
+      if return_type == String
+        return encoded_uri.to_s
+      elsif return_type == ::Addressable::URI
+        return encoded_uri
+      end
+    end
+
+    ##
+    # Encodes a set of key/value pairs according to the rules for the
+    # <code>application/x-www-form-urlencoded</code> MIME type.
+    #
+    # @param [#to_hash, #to_ary] form_values
+    #   The form values to encode.
+    #
+    # @param [TrueClass, FalseClass] sort
+    #   Sort the key/value pairs prior to encoding.
+    #   Defaults to <code>false</code>.
+    #
+    # @return [String]
+    #   The encoded value.
+    def self.form_encode(form_values, sort=false)
+      if form_values.respond_to?(:to_hash)
+        form_values = form_values.to_hash.to_a
+      elsif form_values.respond_to?(:to_ary)
+        form_values = form_values.to_ary
+      else
+        raise TypeError, "Can't convert #{form_values.class} into Array."
+      end
+
+      form_values = form_values.inject([]) do |accu, (key, value)|
+        if value.kind_of?(Array)
+          value.each do |v|
+            accu << [key.to_s, v.to_s]
+          end
+        else
+          accu << [key.to_s, value.to_s]
+        end
+        accu
+      end
+
+      if sort
+        # Useful for OAuth and optimizing caching systems
+        form_values = form_values.sort
+      end
+      escaped_form_values = form_values.map do |(key, value)|
+        # Line breaks are CRLF pairs
+        [
+          self.encode_component(
+            key.gsub(/(\r\n|\n|\r)/, "\r\n"),
+            CharacterClasses::UNRESERVED
+          ).gsub("%20", "+"),
+          self.encode_component(
+            value.gsub(/(\r\n|\n|\r)/, "\r\n"),
+            CharacterClasses::UNRESERVED
+          ).gsub("%20", "+")
+        ]
+      end
+      return escaped_form_values.map do |(key, value)|
+        "#{key}=#{value}"
+      end.join("&")
+    end
+
+    ##
+    # Decodes a <code>String</code> according to the rules for the
+    # <code>application/x-www-form-urlencoded</code> MIME type.
+    #
+    # @param [String, #to_str] encoded_value
+    #   The form values to decode.
+    #
+    # @return [Array]
+    #   The decoded values.
+    #   This is not a <code>Hash</code> because of the possibility for
+    #   duplicate keys.
+    def self.form_unencode(encoded_value)
+      if !encoded_value.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{encoded_value.class} into String."
+      end
+      encoded_value = encoded_value.to_str
+      split_values = encoded_value.split("&").map do |pair|
+        pair.split("=", 2)
+      end
+      return split_values.map do |(key, value)|
+        [
+          key ? self.unencode_component(
+            key.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n") : nil,
+          value ? (self.unencode_component(
+            value.gsub("+", "%20")).gsub(/(\r\n|\n|\r)/, "\n")) : nil
+        ]
+      end
+    end
+
+    ##
+    # Creates a new uri object from component parts.
+    #
+    # @option [String, #to_str] scheme The scheme component.
+    # @option [String, #to_str] user The user component.
+    # @option [String, #to_str] password The password component.
+    # @option [String, #to_str] userinfo
+    #   The userinfo component. If this is supplied, the user and password
+    #   components must be omitted.
+    # @option [String, #to_str] host The host component.
+    # @option [String, #to_str] port The port component.
+    # @option [String, #to_str] authority
+    #   The authority component. If this is supplied, the user, password,
+    #   userinfo, host, and port components must be omitted.
+    # @option [String, #to_str] path The path component.
+    # @option [String, #to_str] query The query component.
+    # @option [String, #to_str] fragment The fragment component.
+    #
+    # @return [Addressable::URI] The constructed URI object.
+    def initialize(options={})
+      if options.has_key?(:authority)
+        if (options.keys & [:userinfo, :user, :password, :host, :port]).any?
+          raise ArgumentError,
+            "Cannot specify both an authority and any of the components " +
+            "within the authority."
+        end
+      end
+      if options.has_key?(:userinfo)
+        if (options.keys & [:user, :password]).any?
+          raise ArgumentError,
+            "Cannot specify both a userinfo and either the user or password."
+        end
+      end
+
+      self.defer_validation do
+        # Bunch of crazy logic required because of the composite components
+        # like userinfo and authority.
+        self.scheme = options[:scheme] if options[:scheme]
+        self.user = options[:user] if options[:user]
+        self.password = options[:password] if options[:password]
+        self.userinfo = options[:userinfo] if options[:userinfo]
+        self.host = options[:host] if options[:host]
+        self.port = options[:port] if options[:port]
+        self.authority = options[:authority] if options[:authority]
+        self.path = options[:path] if options[:path]
+        self.query = options[:query] if options[:query]
+        self.query_values = options[:query_values] if options[:query_values]
+        self.fragment = options[:fragment] if options[:fragment]
+      end
+      self.to_s
+    end
+
+    ##
+    # Freeze URI, initializing instance variables.
+    #
+    # @return [Addressable::URI] The frozen URI object.
+    def freeze
+      self.normalized_scheme
+      self.normalized_user
+      self.normalized_password
+      self.normalized_userinfo
+      self.normalized_host
+      self.normalized_port
+      self.normalized_authority
+      self.normalized_site
+      self.normalized_path
+      self.normalized_query
+      self.normalized_fragment
+      self.hash
+      super
+    end
+
+    ##
+    # The scheme component for this URI.
+    #
+    # @return [String] The scheme component.
+    def scheme
+      return defined?(@scheme) ? @scheme : nil
+    end
+
+    ##
+    # The scheme component for this URI, normalized.
+    #
+    # @return [String] The scheme component, normalized.
+    def normalized_scheme
+      return nil unless self.scheme
+      @normalized_scheme ||= begin
+        if self.scheme =~ /^\s*ssh\+svn\s*$/i
+          "svn+ssh".dup
+        else
+          Addressable::URI.normalize_component(
+            self.scheme.strip.downcase,
+            Addressable::URI::CharacterClasses::SCHEME
+          )
+        end
+      end
+      # All normalized values should be UTF-8
+      @normalized_scheme.force_encoding(Encoding::UTF_8) if @normalized_scheme
+      @normalized_scheme
+    end
+
+    ##
+    # Sets the scheme component for this URI.
+    #
+    # @param [String, #to_str] new_scheme The new scheme component.
+    def scheme=(new_scheme)
+      if new_scheme && !new_scheme.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{new_scheme.class} into String."
+      elsif new_scheme
+        new_scheme = new_scheme.to_str
+      end
+      if new_scheme && new_scheme !~ /\A[a-z][a-z0-9\.\+\-]*\z/i
+        raise InvalidURIError, "Invalid scheme format: #{new_scheme}"
+      end
+      @scheme = new_scheme
+      @scheme = nil if @scheme.to_s.strip.empty?
+
+      # Reset dependent values
+      remove_instance_variable(:@normalized_scheme) if defined?(@normalized_scheme)
+      remove_composite_values
+
+      # Ensure we haven't created an invalid URI
+      validate()
+    end
+
+    ##
+    # The user component for this URI.
+    #
+    # @return [String] The user component.
+    def user
+      return defined?(@user) ? @user : nil
+    end
+
+    ##
+    # The user component for this URI, normalized.
+    #
+    # @return [String] The user component, normalized.
+    def normalized_user
+      return nil unless self.user
+      return @normalized_user if defined?(@normalized_user)
+      @normalized_user ||= begin
+        if normalized_scheme =~ /https?/ && self.user.strip.empty? &&
+            (!self.password || self.password.strip.empty?)
+          nil
+        else
+          Addressable::URI.normalize_component(
+            self.user.strip,
+            Addressable::URI::CharacterClasses::UNRESERVED
+          )
+        end
+      end
+      # All normalized values should be UTF-8
+      @normalized_user.force_encoding(Encoding::UTF_8) if @normalized_user
+      @normalized_user
+    end
+
+    ##
+    # Sets the user component for this URI.
+    #
+    # @param [String, #to_str] new_user The new user component.
+    def user=(new_user)
+      if new_user && !new_user.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{new_user.class} into String."
+      end
+      @user = new_user ? new_user.to_str : nil
+
+      # You can't have a nil user with a non-nil password
+      if password != nil
+        @user = EMPTY_STR if @user.nil?
+      end
+
+      # Reset dependent values
+      remove_instance_variable(:@userinfo) if defined?(@userinfo)
+      remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo)
+      remove_instance_variable(:@authority) if defined?(@authority)
+      remove_instance_variable(:@normalized_user) if defined?(@normalized_user)
+      remove_composite_values
+
+      # Ensure we haven't created an invalid URI
+      validate()
+    end
+
+    ##
+    # The password component for this URI.
+    #
+    # @return [String] The password component.
+    def password
+      return defined?(@password) ? @password : nil
+    end
+
+    ##
+    # The password component for this URI, normalized.
+    #
+    # @return [String] The password component, normalized.
+    def normalized_password
+      return nil unless self.password
+      return @normalized_password if defined?(@normalized_password)
+      @normalized_password ||= begin
+        if self.normalized_scheme =~ /https?/ && self.password.strip.empty? &&
+            (!self.user || self.user.strip.empty?)
+          nil
+        else
+          Addressable::URI.normalize_component(
+            self.password.strip,
+            Addressable::URI::CharacterClasses::UNRESERVED
+          )
+        end
+      end
+      # All normalized values should be UTF-8
+      if @normalized_password
+        @normalized_password.force_encoding(Encoding::UTF_8)
+      end
+      @normalized_password
+    end
+
+    ##
+    # Sets the password component for this URI.
+    #
+    # @param [String, #to_str] new_password The new password component.
+    def password=(new_password)
+      if new_password && !new_password.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{new_password.class} into String."
+      end
+      @password = new_password ? new_password.to_str : nil
+
+      # You can't have a nil user with a non-nil password
+      @password ||= nil
+      @user ||= nil
+      if @password != nil
+        @user = EMPTY_STR if @user.nil?
+      end
+
+      # Reset dependent values
+      remove_instance_variable(:@userinfo) if defined?(@userinfo)
+      remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo)
+      remove_instance_variable(:@authority) if defined?(@authority)
+      remove_instance_variable(:@normalized_password) if defined?(@normalized_password)
+      remove_composite_values
+
+      # Ensure we haven't created an invalid URI
+      validate()
+    end
+
+    ##
+    # The userinfo component for this URI.
+    # Combines the user and password components.
+    #
+    # @return [String] The userinfo component.
+    def userinfo
+      current_user = self.user
+      current_password = self.password
+      (current_user || current_password) && @userinfo ||= begin
+        if current_user && current_password
+          "#{current_user}:#{current_password}"
+        elsif current_user && !current_password
+          "#{current_user}"
+        end
+      end
+    end
+
+    ##
+    # The userinfo component for this URI, normalized.
+    #
+    # @return [String] The userinfo component, normalized.
+    def normalized_userinfo
+      return nil unless self.userinfo
+      return @normalized_userinfo if defined?(@normalized_userinfo)
+      @normalized_userinfo ||= begin
+        current_user = self.normalized_user
+        current_password = self.normalized_password
+        if !current_user && !current_password
+          nil
+        elsif current_user && current_password
+          "#{current_user}:#{current_password}".dup
+        elsif current_user && !current_password
+          "#{current_user}".dup
+        end
+      end
+      # All normalized values should be UTF-8
+      if @normalized_userinfo
+        @normalized_userinfo.force_encoding(Encoding::UTF_8)
+      end
+      @normalized_userinfo
+    end
+
+    ##
+    # Sets the userinfo component for this URI.
+    #
+    # @param [String, #to_str] new_userinfo The new userinfo component.
+    def userinfo=(new_userinfo)
+      if new_userinfo && !new_userinfo.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{new_userinfo.class} into String."
+      end
+      new_user, new_password = if new_userinfo
+        [
+          new_userinfo.to_str.strip[/^(.*):/, 1],
+          new_userinfo.to_str.strip[/:(.*)$/, 1]
+        ]
+      else
+        [nil, nil]
+      end
+
+      # Password assigned first to ensure validity in case of nil
+      self.password = new_password
+      self.user = new_user
+
+      # Reset dependent values
+      remove_instance_variable(:@authority) if defined?(@authority)
+      remove_composite_values
+
+      # Ensure we haven't created an invalid URI
+      validate()
+    end
+
+    ##
+    # The host component for this URI.
+    #
+    # @return [String] The host component.
+    def host
+      return defined?(@host) ? @host : nil
+    end
+
+    ##
+    # The host component for this URI, normalized.
+    #
+    # @return [String] The host component, normalized.
+    def normalized_host
+      return nil unless self.host
+      @normalized_host ||= begin
+        if !self.host.strip.empty?
+          result = ::Addressable::IDNA.to_ascii(
+            URI.unencode_component(self.host.strip.downcase)
+          )
+          if result =~ /[^\.]\.$/
+            # Single trailing dots are unnecessary.
+            result = result[0...-1]
+          end
+          result = Addressable::URI.normalize_component(
+            result,
+            CharacterClasses::HOST)
+          result
+        else
+          EMPTY_STR.dup
+        end
+      end
+      # All normalized values should be UTF-8
+      @normalized_host.force_encoding(Encoding::UTF_8) if @normalized_host
+      @normalized_host
+    end
+
+    ##
+    # Sets the host component for this URI.
+    #
+    # @param [String, #to_str] new_host The new host component.
+    def host=(new_host)
+      if new_host && !new_host.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{new_host.class} into String."
+      end
+      @host = new_host ? new_host.to_str : nil
+
+      # Reset dependent values
+      remove_instance_variable(:@authority) if defined?(@authority)
+      remove_instance_variable(:@normalized_host) if defined?(@normalized_host)
+      remove_composite_values
+
+      # Ensure we haven't created an invalid URI
+      validate()
+    end
+
+    ##
+    # This method is same as URI::Generic#host except
+    # brackets for IPv6 (and 'IPvFuture') addresses are removed.
+    #
+    # @see Addressable::URI#host
+    #
+    # @return [String] The hostname for this URI.
+    def hostname
+      v = self.host
+      /\A\[(.*)\]\z/ =~ v ? $1 : v
+    end
+
+    ##
+    # This method is same as URI::Generic#host= except
+    # the argument can be a bare IPv6 address (or 'IPvFuture').
+    #
+    # @see Addressable::URI#host=
+    #
+    # @param [String, #to_str] new_hostname The new hostname for this URI.
+    def hostname=(new_hostname)
+      if new_hostname &&
+          (new_hostname.respond_to?(:ipv4?) || new_hostname.respond_to?(:ipv6?))
+        new_hostname = new_hostname.to_s
+      elsif new_hostname && !new_hostname.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{new_hostname.class} into String."
+      end
+      v = new_hostname ? new_hostname.to_str : nil
+      v = "[#{v}]" if /\A\[.*\]\z/ !~ v && /:/ =~ v
+      self.host = v
+    end
+
+    ##
+    # Returns the top-level domain for this host.
+    #
+    # @example
+    #   Addressable::URI.parse("www.example.co.uk").tld # => "co.uk"
+    def tld
+      PublicSuffix.parse(self.host, ignore_private: true).tld
+    end
+
+    ##
+    # Returns the public suffix domain for this host.
+    #
+    # @example
+    #   Addressable::URI.parse("www.example.co.uk").domain # => "example.co.uk"
+    def domain
+      PublicSuffix.domain(self.host, ignore_private: true)
+    end
+
+    ##
+    # The authority component for this URI.
+    # Combines the user, password, host, and port components.
+    #
+    # @return [String] The authority component.
+    def authority
+      self.host && @authority ||= begin
+        authority = String.new
+        if self.userinfo != nil
+          authority << "#{self.userinfo}@"
+        end
+        authority << self.host
+        if self.port != nil
+          authority << ":#{self.port}"
+        end
+        authority
+      end
+    end
+
+    ##
+    # The authority component for this URI, normalized.
+    #
+    # @return [String] The authority component, normalized.
+    def normalized_authority
+      return nil unless self.authority
+      @normalized_authority ||= begin
+        authority = String.new
+        if self.normalized_userinfo != nil
+          authority << "#{self.normalized_userinfo}@"
+        end
+        authority << self.normalized_host
+        if self.normalized_port != nil
+          authority << ":#{self.normalized_port}"
+        end
+        authority
+      end
+      # All normalized values should be UTF-8
+      if @normalized_authority
+        @normalized_authority.force_encoding(Encoding::UTF_8)
+      end
+      @normalized_authority
+    end
+
+    ##
+    # Sets the authority component for this URI.
+    #
+    # @param [String, #to_str] new_authority The new authority component.
+    def authority=(new_authority)
+      if new_authority
+        if !new_authority.respond_to?(:to_str)
+          raise TypeError, "Can't convert #{new_authority.class} into String."
+        end
+        new_authority = new_authority.to_str
+        new_userinfo = new_authority[/^([^\[\]]*)@/, 1]
+        if new_userinfo
+          new_user = new_userinfo.strip[/^([^:]*):?/, 1]
+          new_password = new_userinfo.strip[/:(.*)$/, 1]
+        end
+        new_host = new_authority.gsub(
+          /^([^\[\]]*)@/, EMPTY_STR
+        ).gsub(
+          /:([^:@\[\]]*?)$/, EMPTY_STR
+        )
+        new_port =
+          new_authority[/:([^:@\[\]]*?)$/, 1]
+      end
+
+      # Password assigned first to ensure validity in case of nil
+      self.password = defined?(new_password) ? new_password : nil
+      self.user = defined?(new_user) ? new_user : nil
+      self.host = defined?(new_host) ? new_host : nil
+      self.port = defined?(new_port) ? new_port : nil
+
+      # Reset dependent values
+      remove_instance_variable(:@userinfo) if defined?(@userinfo)
+      remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo)
+      remove_composite_values
+
+      # Ensure we haven't created an invalid URI
+      validate()
+    end
+
+    ##
+    # The origin for this URI, serialized to ASCII, as per
+    # RFC 6454, section 6.2.
+    #
+    # @return [String] The serialized origin.
+    def origin
+      if self.scheme && self.authority
+        if self.normalized_port
+          "#{self.normalized_scheme}://#{self.normalized_host}" +
+          ":#{self.normalized_port}"
+        else
+          "#{self.normalized_scheme}://#{self.normalized_host}"
+        end
+      else
+        "null"
+      end
+    end
+
+    ##
+    # Sets the origin for this URI, serialized to ASCII, as per
+    # RFC 6454, section 6.2. This assignment will reset the `userinfo`
+    # component.
+    #
+    # @param [String, #to_str] new_origin The new origin component.
+    def origin=(new_origin)
+      if new_origin
+        if !new_origin.respond_to?(:to_str)
+          raise TypeError, "Can't convert #{new_origin.class} into String."
+        end
+        new_origin = new_origin.to_str
+        new_scheme = new_origin[/^([^:\/?#]+):\/\//, 1]
+        unless new_scheme
+          raise InvalidURIError, 'An origin cannot omit the scheme.'
+        end
+        new_host = new_origin[/:\/\/([^\/?#:]+)/, 1]
+        unless new_host
+          raise InvalidURIError, 'An origin cannot omit the host.'
+        end
+        new_port = new_origin[/:([^:@\[\]\/]*?)$/, 1]
+      end
+
+      self.scheme = defined?(new_scheme) ? new_scheme : nil
+      self.host = defined?(new_host) ? new_host : nil
+      self.port = defined?(new_port) ? new_port : nil
+      self.userinfo = nil
+
+      # Reset dependent values
+      remove_instance_variable(:@userinfo) if defined?(@userinfo)
+      remove_instance_variable(:@normalized_userinfo) if defined?(@normalized_userinfo)
+      remove_instance_variable(:@authority) if defined?(@authority)
+      remove_instance_variable(:@normalized_authority) if defined?(@normalized_authority)
+      remove_composite_values
+
+      # Ensure we haven't created an invalid URI
+      validate()
+    end
+
+    # Returns an array of known ip-based schemes. These schemes typically
+    # use a similar URI form:
+    # <code>//<user>:<password>@<host>:<port>/<url-path></code>
+    def self.ip_based_schemes
+      return self.port_mapping.keys
+    end
+
+    # Returns a hash of common IP-based schemes and their default port
+    # numbers. Adding new schemes to this hash, as necessary, will allow
+    # for better URI normalization.
+    def self.port_mapping
+      PORT_MAPPING
+    end
+
+    ##
+    # The port component for this URI.
+    # This is the port number actually given in the URI. This does not
+    # infer port numbers from default values.
+    #
+    # @return [Integer] The port component.
+    def port
+      return defined?(@port) ? @port : nil
+    end
+
+    ##
+    # The port component for this URI, normalized.
+    #
+    # @return [Integer] The port component, normalized.
+    def normalized_port
+      return nil unless self.port
+      return @normalized_port if defined?(@normalized_port)
+      @normalized_port ||= begin
+        if URI.port_mapping[self.normalized_scheme] == self.port
+          nil
+        else
+          self.port
+        end
+      end
+    end
+
+    ##
+    # Sets the port component for this URI.
+    #
+    # @param [String, Integer, #to_s] new_port The new port component.
+    def port=(new_port)
+      if new_port != nil && new_port.respond_to?(:to_str)
+        new_port = Addressable::URI.unencode_component(new_port.to_str)
+      end
+
+      if new_port.respond_to?(:valid_encoding?) && !new_port.valid_encoding?
+        raise InvalidURIError, "Invalid encoding in port"
+      end
+
+      if new_port != nil && !(new_port.to_s =~ /^\d+$/)
+        raise InvalidURIError,
+          "Invalid port number: #{new_port.inspect}"
+      end
+
+      @port = new_port.to_s.to_i
+      @port = nil if @port == 0
+
+      # Reset dependent values
+      remove_instance_variable(:@authority) if defined?(@authority)
+      remove_instance_variable(:@normalized_port) if defined?(@normalized_port)
+      remove_composite_values
+
+      # Ensure we haven't created an invalid URI
+      validate()
+    end
+
+    ##
+    # The inferred port component for this URI.
+    # This method will normalize to the default port for the URI's scheme if
+    # the port isn't explicitly specified in the URI.
+    #
+    # @return [Integer] The inferred port component.
+    def inferred_port
+      if self.port.to_i == 0
+        self.default_port
+      else
+        self.port.to_i
+      end
+    end
+
+    ##
+    # The default port for this URI's scheme.
+    # This method will always returns the default port for the URI's scheme
+    # regardless of the presence of an explicit port in the URI.
+    #
+    # @return [Integer] The default port.
+    def default_port
+      URI.port_mapping[self.scheme.strip.downcase] if self.scheme
+    end
+
+    ##
+    # The combination of components that represent a site.
+    # Combines the scheme, user, password, host, and port components.
+    # Primarily useful for HTTP and HTTPS.
+    #
+    # For example, <code>"http://example.com/path?query"</code> would have a
+    # <code>site</code> value of <code>"http://example.com"</code>.
+    #
+    # @return [String] The components that identify a site.
+    def site
+      (self.scheme || self.authority) && @site ||= begin
+        site_string = "".dup
+        site_string << "#{self.scheme}:" if self.scheme != nil
+        site_string << "//#{self.authority}" if self.authority != nil
+        site_string
+      end
+    end
+
+    ##
+    # The normalized combination of components that represent a site.
+    # Combines the scheme, user, password, host, and port components.
+    # Primarily useful for HTTP and HTTPS.
+    #
+    # For example, <code>"http://example.com/path?query"</code> would have a
+    # <code>site</code> value of <code>"http://example.com"</code>.
+    #
+    # @return [String] The normalized components that identify a site.
+    def normalized_site
+      return nil unless self.site
+      @normalized_site ||= begin
+        site_string = "".dup
+        if self.normalized_scheme != nil
+          site_string << "#{self.normalized_scheme}:"
+        end
+        if self.normalized_authority != nil
+          site_string << "//#{self.normalized_authority}"
+        end
+        site_string
+      end
+      # All normalized values should be UTF-8
+      @normalized_site.force_encoding(Encoding::UTF_8) if @normalized_site
+      @normalized_site
+    end
+
+    ##
+    # Sets the site value for this URI.
+    #
+    # @param [String, #to_str] new_site The new site value.
+    def site=(new_site)
+      if new_site
+        if !new_site.respond_to?(:to_str)
+          raise TypeError, "Can't convert #{new_site.class} into String."
+        end
+        new_site = new_site.to_str
+        # These two regular expressions derived from the primary parsing
+        # expression
+        self.scheme = new_site[/^(?:([^:\/?#]+):)?(?:\/\/(?:[^\/?#]*))?$/, 1]
+        self.authority = new_site[
+          /^(?:(?:[^:\/?#]+):)?(?:\/\/([^\/?#]*))?$/, 1
+        ]
+      else
+        self.scheme = nil
+        self.authority = nil
+      end
+    end
+
+    ##
+    # The path component for this URI.
+    #
+    # @return [String] The path component.
+    def path
+      return defined?(@path) ? @path : EMPTY_STR
+    end
+
+    NORMPATH = /^(?!\/)[^\/:]*:.*$/
+    ##
+    # The path component for this URI, normalized.
+    #
+    # @return [String] The path component, normalized.
+    def normalized_path
+      @normalized_path ||= begin
+        path = self.path.to_s
+        if self.scheme == nil && path =~ NORMPATH
+          # Relative paths with colons in the first segment are ambiguous.
+          path = path.sub(":", "%2F")
+        end
+        # String#split(delimeter, -1) uses the more strict splitting behavior
+        # found by default in Python.
+        result = path.strip.split(SLASH, -1).map do |segment|
+          Addressable::URI.normalize_component(
+            segment,
+            Addressable::URI::CharacterClasses::PCHAR
+          )
+        end.join(SLASH)
+
+        result = URI.normalize_path(result)
+        if result.empty? &&
+            ["http", "https", "ftp", "tftp"].include?(self.normalized_scheme)
+          result = SLASH.dup
+        end
+        result
+      end
+      # All normalized values should be UTF-8
+      @normalized_path.force_encoding(Encoding::UTF_8) if @normalized_path
+      @normalized_path
+    end
+
+    ##
+    # Sets the path component for this URI.
+    #
+    # @param [String, #to_str] new_path The new path component.
+    def path=(new_path)
+      if new_path && !new_path.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{new_path.class} into String."
+      end
+      @path = (new_path || EMPTY_STR).to_str
+      if !@path.empty? && @path[0..0] != SLASH && host != nil
+        @path = "/#{@path}"
+      end
+
+      # Reset dependent values
+      remove_instance_variable(:@normalized_path) if defined?(@normalized_path)
+      remove_composite_values
+
+      # Ensure we haven't created an invalid URI
+      validate()
+    end
+
+    ##
+    # The basename, if any, of the file in the path component.
+    #
+    # @return [String] The path's basename.
+    def basename
+      # Path cannot be nil
+      return File.basename(self.path).gsub(/;[^\/]*$/, EMPTY_STR)
+    end
+
+    ##
+    # The extname, if any, of the file in the path component.
+    # Empty string if there is no extension.
+    #
+    # @return [String] The path's extname.
+    def extname
+      return nil unless self.path
+      return File.extname(self.basename)
+    end
+
+    ##
+    # The query component for this URI.
+    #
+    # @return [String] The query component.
+    def query
+      return defined?(@query) ? @query : nil
+    end
+
+    ##
+    # The query component for this URI, normalized.
+    #
+    # @return [String] The query component, normalized.
+    def normalized_query(*flags)
+      return nil unless self.query
+      return @normalized_query if defined?(@normalized_query)
+      @normalized_query ||= begin
+        modified_query_class = Addressable::URI::CharacterClasses::QUERY.dup
+        # Make sure possible key-value pair delimiters are escaped.
+        modified_query_class.sub!("\\&", "").sub!("\\;", "")
+        pairs = (self.query || "").split("&", -1)
+        pairs.sort! if flags.include?(:sorted)
+        component = pairs.map do |pair|
+          Addressable::URI.normalize_component(pair, modified_query_class, "+")
+        end.join("&")
+        component == "" ? nil : component
+      end
+      # All normalized values should be UTF-8
+      @normalized_query.force_encoding(Encoding::UTF_8) if @normalized_query
+      @normalized_query
+    end
+
+    ##
+    # Sets the query component for this URI.
+    #
+    # @param [String, #to_str] new_query The new query component.
+    def query=(new_query)
+      if new_query && !new_query.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{new_query.class} into String."
+      end
+      @query = new_query ? new_query.to_str : nil
+
+      # Reset dependent values
+      remove_instance_variable(:@normalized_query) if defined?(@normalized_query)
+      remove_composite_values
+    end
+
+    ##
+    # Converts the query component to a Hash value.
+    #
+    # @param [Class] return_type The return type desired. Value must be either
+    #   `Hash` or `Array`.
+    #
+    # @return [Hash, Array, nil] The query string parsed as a Hash or Array
+    #   or nil if the query string is blank.
+    #
+    # @example
+    #   Addressable::URI.parse("?one=1&two=2&three=3").query_values
+    #   #=> {"one" => "1", "two" => "2", "three" => "3"}
+    #   Addressable::URI.parse("?one=two&one=three").query_values(Array)
+    #   #=> [["one", "two"], ["one", "three"]]
+    #   Addressable::URI.parse("?one=two&one=three").query_values(Hash)
+    #   #=> {"one" => "three"}
+    #   Addressable::URI.parse("?").query_values
+    #   #=> {}
+    #   Addressable::URI.parse("").query_values
+    #   #=> nil
+    def query_values(return_type=Hash)
+      empty_accumulator = Array == return_type ? [] : {}
+      if return_type != Hash && return_type != Array
+        raise ArgumentError, "Invalid return type. Must be Hash or Array."
+      end
+      return nil if self.query == nil
+      split_query = self.query.split("&").map do |pair|
+        pair.split("=", 2) if pair && !pair.empty?
+      end.compact
+      return split_query.inject(empty_accumulator.dup) do |accu, pair|
+        # I'd rather use key/value identifiers instead of array lookups,
+        # but in this case I really want to maintain the exact pair structure,
+        # so it's best to make all changes in-place.
+        pair[0] = URI.unencode_component(pair[0])
+        if pair[1].respond_to?(:to_str)
+          # I loathe the fact that I have to do this. Stupid HTML 4.01.
+          # Treating '+' as a space was just an unbelievably bad idea.
+          # There was nothing wrong with '%20'!
+          # If it ain't broke, don't fix it!
+          pair[1] = URI.unencode_component(pair[1].to_str.gsub(/\+/, " "))
+        end
+        if return_type == Hash
+          accu[pair[0]] = pair[1]
+        else
+          accu << pair
+        end
+        accu
+      end
+    end
+
+    ##
+    # Sets the query component for this URI from a Hash object.
+    # An empty Hash or Array will result in an empty query string.
+    #
+    # @param [Hash, #to_hash, Array] new_query_values The new query values.
+    #
+    # @example
+    #   uri.query_values = {:a => "a", :b => ["c", "d", "e"]}
+    #   uri.query
+    #   # => "a=a&b=c&b=d&b=e"
+    #   uri.query_values = [['a', 'a'], ['b', 'c'], ['b', 'd'], ['b', 'e']]
+    #   uri.query
+    #   # => "a=a&b=c&b=d&b=e"
+    #   uri.query_values = [['a', 'a'], ['b', ['c', 'd', 'e']]]
+    #   uri.query
+    #   # => "a=a&b=c&b=d&b=e"
+    #   uri.query_values = [['flag'], ['key', 'value']]
+    #   uri.query
+    #   # => "flag&key=value"
+    def query_values=(new_query_values)
+      if new_query_values == nil
+        self.query = nil
+        return nil
+      end
+
+      if !new_query_values.is_a?(Array)
+        if !new_query_values.respond_to?(:to_hash)
+          raise TypeError,
+            "Can't convert #{new_query_values.class} into Hash."
+        end
+        new_query_values = new_query_values.to_hash
+        new_query_values = new_query_values.map do |key, value|
+          key = key.to_s if key.kind_of?(Symbol)
+          [key, value]
+        end
+        # Useful default for OAuth and caching.
+        # Only to be used for non-Array inputs. Arrays should preserve order.
+        new_query_values.sort!
+      end
+
+      # new_query_values have form [['key1', 'value1'], ['key2', 'value2']]
+      buffer = "".dup
+      new_query_values.each do |key, value|
+        encoded_key = URI.encode_component(
+          key, CharacterClasses::UNRESERVED
+        )
+        if value == nil
+          buffer << "#{encoded_key}&"
+        elsif value.kind_of?(Array)
+          value.each do |sub_value|
+            encoded_value = URI.encode_component(
+              sub_value, CharacterClasses::UNRESERVED
+            )
+            buffer << "#{encoded_key}=#{encoded_value}&"
+          end
+        else
+          encoded_value = URI.encode_component(
+            value, CharacterClasses::UNRESERVED
+          )
+          buffer << "#{encoded_key}=#{encoded_value}&"
+        end
+      end
+      self.query = buffer.chop
+    end
+
+    ##
+    # The HTTP request URI for this URI.  This is the path and the
+    # query string.
+    #
+    # @return [String] The request URI required for an HTTP request.
+    def request_uri
+      return nil if self.absolute? && self.scheme !~ /^https?$/i
+      return (
+        (!self.path.empty? ? self.path : SLASH) +
+        (self.query ? "?#{self.query}" : EMPTY_STR)
+      )
+    end
+
+    ##
+    # Sets the HTTP request URI for this URI.
+    #
+    # @param [String, #to_str] new_request_uri The new HTTP request URI.
+    def request_uri=(new_request_uri)
+      if !new_request_uri.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{new_request_uri.class} into String."
+      end
+      if self.absolute? && self.scheme !~ /^https?$/i
+        raise InvalidURIError,
+          "Cannot set an HTTP request URI for a non-HTTP URI."
+      end
+      new_request_uri = new_request_uri.to_str
+      path_component = new_request_uri[/^([^\?]*)\?(?:.*)$/, 1]
+      query_component = new_request_uri[/^(?:[^\?]*)\?(.*)$/, 1]
+      path_component = path_component.to_s
+      path_component = (!path_component.empty? ? path_component : SLASH)
+      self.path = path_component
+      self.query = query_component
+
+      # Reset dependent values
+      remove_composite_values
+    end
+
+    ##
+    # The fragment component for this URI.
+    #
+    # @return [String] The fragment component.
+    def fragment
+      return defined?(@fragment) ? @fragment : nil
+    end
+
+    ##
+    # The fragment component for this URI, normalized.
+    #
+    # @return [String] The fragment component, normalized.
+    def normalized_fragment
+      return nil unless self.fragment
+      return @normalized_fragment if defined?(@normalized_fragment)
+      @normalized_fragment ||= begin
+        component = Addressable::URI.normalize_component(
+          self.fragment,
+          Addressable::URI::CharacterClasses::FRAGMENT
+        )
+        component == "" ? nil : component
+      end
+      # All normalized values should be UTF-8
+      if @normalized_fragment
+        @normalized_fragment.force_encoding(Encoding::UTF_8)
+      end
+      @normalized_fragment
+    end
+
+    ##
+    # Sets the fragment component for this URI.
+    #
+    # @param [String, #to_str] new_fragment The new fragment component.
+    def fragment=(new_fragment)
+      if new_fragment && !new_fragment.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{new_fragment.class} into String."
+      end
+      @fragment = new_fragment ? new_fragment.to_str : nil
+
+      # Reset dependent values
+      remove_instance_variable(:@normalized_fragment) if defined?(@normalized_fragment)
+      remove_composite_values
+
+      # Ensure we haven't created an invalid URI
+      validate()
+    end
+
+    ##
+    # Determines if the scheme indicates an IP-based protocol.
+    #
+    # @return [TrueClass, FalseClass]
+    #   <code>true</code> if the scheme indicates an IP-based protocol.
+    #   <code>false</code> otherwise.
+    def ip_based?
+      if self.scheme
+        return URI.ip_based_schemes.include?(
+          self.scheme.strip.downcase)
+      end
+      return false
+    end
+
+    ##
+    # Determines if the URI is relative.
+    #
+    # @return [TrueClass, FalseClass]
+    #   <code>true</code> if the URI is relative. <code>false</code>
+    #   otherwise.
+    def relative?
+      return self.scheme.nil?
+    end
+
+    ##
+    # Determines if the URI is absolute.
+    #
+    # @return [TrueClass, FalseClass]
+    #   <code>true</code> if the URI is absolute. <code>false</code>
+    #   otherwise.
+    def absolute?
+      return !relative?
+    end
+
+    ##
+    # Joins two URIs together.
+    #
+    # @param [String, Addressable::URI, #to_str] The URI to join with.
+    #
+    # @return [Addressable::URI] The joined URI.
+    def join(uri)
+      if !uri.respond_to?(:to_str)
+        raise TypeError, "Can't convert #{uri.class} into String."
+      end
+      if !uri.kind_of?(URI)
+        # Otherwise, convert to a String, then parse.
+        uri = URI.parse(uri.to_str)
+      end
+      if uri.to_s.empty?
+        return self.dup
+      end
+
+      joined_scheme = nil
+      joined_user = nil
+      joined_password = nil
+      joined_host = nil
+      joined_port = nil
+      joined_path = nil
+      joined_query = nil
+      joined_fragment = nil
+
+      # Section 5.2.2 of RFC 3986
+      if uri.scheme != nil
+        joined_scheme = uri.scheme
+        joined_user = uri.user
+        joined_password = uri.password
+        joined_host = uri.host
+        joined_port = uri.port
+        joined_path = URI.normalize_path(uri.path)
+        joined_query = uri.query
+      else
+        if uri.authority != nil
+          joined_user = uri.user
+          joined_password = uri.password
+          joined_host = uri.host
+          joined_port = uri.port
+          joined_path = URI.normalize_path(uri.path)
+          joined_query = uri.query
+        else
+          if uri.path == nil || uri.path.empty?
+            joined_path = self.path
+            if uri.query != nil
+              joined_query = uri.query
+            else
+              joined_query = self.query
+            end
+          else
+            if uri.path[0..0] == SLASH
+              joined_path = URI.normalize_path(uri.path)
+            else
+              base_path = self.path.dup
+              base_path = EMPTY_STR if base_path == nil
+              base_path = URI.normalize_path(base_path)
+
+              # Section 5.2.3 of RFC 3986
+              #
+              # Removes the right-most path segment from the base path.
+              if base_path =~ /\//
+                base_path.gsub!(/\/[^\/]+$/, SLASH)
+              else
+                base_path = EMPTY_STR
+              end
+
+              # If the base path is empty and an authority segment has been
+              # defined, use a base path of SLASH
+              if base_path.empty? && self.authority != nil
+                base_path = SLASH
+              end
+
+              joined_path = URI.normalize_path(base_path + uri.path)
+            end
+            joined_query = uri.query
+          end
+          joined_user = self.user
+          joined_password = self.password
+          joined_host = self.host
+          joined_port = self.port
+        end
+        joined_scheme = self.scheme
+      end
+      joined_fragment = uri.fragment
+
+      return self.class.new(
+        :scheme => joined_scheme,
+        :user => joined_user,
+        :password => joined_password,
+        :host => joined_host,
+        :port => joined_port,
+        :path => joined_path,
+        :query => joined_query,
+        :fragment => joined_fragment
+      )
+    end
+    alias_method :+, :join
+
+    ##
+    # Destructive form of <code>join</code>.
+    #
+    # @param [String, Addressable::URI, #to_str] The URI to join with.
+    #
+    # @return [Addressable::URI] The joined URI.
+    #
+    # @see Addressable::URI#join
+    def join!(uri)
+      replace_self(self.join(uri))
+    end
+
+    ##
+    # Merges a URI with a <code>Hash</code> of components.
+    # This method has different behavior from <code>join</code>. Any
+    # components present in the <code>hash</code> parameter will override the
+    # original components. The path component is not treated specially.
+    #
+    # @param [Hash, Addressable::URI, #to_hash] The components to merge with.
+    #
+    # @return [Addressable::URI] The merged URI.
+    #
+    # @see Hash#merge
+    def merge(hash)
+      if !hash.respond_to?(:to_hash)
+        raise TypeError, "Can't convert #{hash.class} into Hash."
+      end
+      hash = hash.to_hash
+
+      if hash.has_key?(:authority)
+        if (hash.keys & [:userinfo, :user, :password, :host, :port]).any?
+          raise ArgumentError,
+            "Cannot specify both an authority and any of the components " +
+            "within the authority."
+        end
+      end
+      if hash.has_key?(:userinfo)
+        if (hash.keys & [:user, :password]).any?
+          raise ArgumentError,
+            "Cannot specify both a userinfo and either the user or password."
+        end
+      end
+
+      uri = self.class.new
+      uri.defer_validation do
+        # Bunch of crazy logic required because of the composite components
+        # like userinfo and authority.
+        uri.scheme =
+          hash.has_key?(:scheme) ? hash[:scheme] : self.scheme
+        if hash.has_key?(:authority)
+          uri.authority =
+            hash.has_key?(:authority) ? hash[:authority] : self.authority
+        end
+        if hash.has_key?(:userinfo)
+          uri.userinfo =
+            hash.has_key?(:userinfo) ? hash[:userinfo] : self.userinfo
+        end
+        if !hash.has_key?(:userinfo) && !hash.has_key?(:authority)
+          uri.user =
+            hash.has_key?(:user) ? hash[:user] : self.user
+          uri.password =
+            hash.has_key?(:password) ? hash[:password] : self.password
+        end
+        if !hash.has_key?(:authority)
+          uri.host =
+            hash.has_key?(:host) ? hash[:host] : self.host
+          uri.port =
+            hash.has_key?(:port) ? hash[:port] : self.port
+        end
+        uri.path =
+          hash.has_key?(:path) ? hash[:path] : self.path
+        uri.query =
+          hash.has_key?(:query) ? hash[:query] : self.query
+        uri.fragment =
+          hash.has_key?(:fragment) ? hash[:fragment] : self.fragment
+      end
+
+      return uri
+    end
+
+    ##
+    # Destructive form of <code>merge</code>.
+    #
+    # @param [Hash, Addressable::URI, #to_hash] The components to merge with.
+    #
+    # @return [Addressable::URI] The merged URI.
+    #
+    # @see Addressable::URI#merge
+    def merge!(uri)
+      replace_self(self.merge(uri))
+    end
+
+    ##
+    # Returns the shortest normalized relative form of this URI that uses the
+    # supplied URI as a base for resolution. Returns an absolute URI if
+    # necessary. This is effectively the opposite of <code>route_to</code>.
+    #
+    # @param [String, Addressable::URI, #to_str] uri The URI to route from.
+    #
+    # @return [Addressable::URI]
+    #   The normalized relative URI that is equivalent to the original URI.
+    def route_from(uri)
+      uri = URI.parse(uri).normalize
+      normalized_self = self.normalize
+      if normalized_self.relative?
+        raise ArgumentError, "Expected absolute URI, got: #{self.to_s}"
+      end
+      if uri.relative?
+        raise ArgumentError, "Expected absolute URI, got: #{uri.to_s}"
+      end
+      if normalized_self == uri
+        return Addressable::URI.parse("##{normalized_self.fragment}")
+      end
+      components = normalized_self.to_hash
+      if normalized_self.scheme == uri.scheme
+        components[:scheme] = nil
+        if normalized_self.authority == uri.authority
+          components[:user] = nil
+          components[:password] = nil
+          components[:host] = nil
+          components[:port] = nil
+          if normalized_self.path == uri.path
+            components[:path] = nil
+            if normalized_self.query == uri.query
+              components[:query] = nil
+            end
+          else
+            if uri.path != SLASH and components[:path]
+              self_splitted_path = split_path(components[:path])
+              uri_splitted_path = split_path(uri.path)
+              self_dir = self_splitted_path.shift
+              uri_dir = uri_splitted_path.shift
+              while !self_splitted_path.empty? && !uri_splitted_path.empty? and self_dir == uri_dir
+                self_dir = self_splitted_path.shift
+                uri_dir = uri_splitted_path.shift
+              end
+              components[:path] = (uri_splitted_path.fill('..') + [self_dir] + self_splitted_path).join(SLASH)
+            end
+          end
+        end
+      end
+      # Avoid network-path references.
+      if components[:host] != nil
+        components[:scheme] = normalized_self.scheme
+      end
+      return Addressable::URI.new(
+        :scheme => components[:scheme],
+        :user => components[:user],
+        :password => components[:password],
+        :host => components[:host],
+        :port => components[:port],
+        :path => components[:path],
+        :query => components[:query],
+        :fragment => components[:fragment]
+      )
+    end
+
+    ##
+    # Returns the shortest normalized relative form of the supplied URI that
+    # uses this URI as a base for resolution. Returns an absolute URI if
+    # necessary. This is effectively the opposite of <code>route_from</code>.
+    #
+    # @param [String, Addressable::URI, #to_str] uri The URI to route to.
+    #
+    # @return [Addressable::URI]
+    #   The normalized relative URI that is equivalent to the supplied URI.
+    def route_to(uri)
+      return URI.parse(uri).route_from(self)
+    end
+
+    ##
+    # Returns a normalized URI object.
+    #
+    # NOTE: This method does not attempt to fully conform to specifications.
+    # It exists largely to correct other people's failures to read the
+    # specifications, and also to deal with caching issues since several
+    # different URIs may represent the same resource and should not be
+    # cached multiple times.
+    #
+    # @return [Addressable::URI] The normalized URI.
+    def normalize
+      # This is a special exception for the frequently misused feed
+      # URI scheme.
+      if normalized_scheme == "feed"
+        if self.to_s =~ /^feed:\/*http:\/*/
+          return URI.parse(
+            self.to_s[/^feed:\/*(http:\/*.*)/, 1]
+          ).normalize
+        end
+      end
+
+      return self.class.new(
+        :scheme => normalized_scheme,
+        :authority => normalized_authority,
+        :path => normalized_path,
+        :query => normalized_query,
+        :fragment => normalized_fragment
+      )
+    end
+
+    ##
+    # Destructively normalizes this URI object.
+    #
+    # @return [Addressable::URI] The normalized URI.
+    #
+    # @see Addressable::URI#normalize
+    def normalize!
+      replace_self(self.normalize)
+    end
+
+    ##
+    # Creates a URI suitable for display to users. If semantic attacks are
+    # likely, the application should try to detect these and warn the user.
+    # See <a href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a>,
+    # section 7.6 for more information.
+    #
+    # @return [Addressable::URI] A URI suitable for display purposes.
+    def display_uri
+      display_uri = self.normalize
+      display_uri.host = ::Addressable::IDNA.to_unicode(display_uri.host)
+      return display_uri
+    end
+
+    ##
+    # Returns <code>true</code> if the URI objects are equal. This method
+    # normalizes both URIs before doing the comparison, and allows comparison
+    # against <code>Strings</code>.
+    #
+    # @param [Object] uri The URI to compare.
+    #
+    # @return [TrueClass, FalseClass]
+    #   <code>true</code> if the URIs are equivalent, <code>false</code>
+    #   otherwise.
+    def ===(uri)
+      if uri.respond_to?(:normalize)
+        uri_string = uri.normalize.to_s
+      else
+        begin
+          uri_string = ::Addressable::URI.parse(uri).normalize.to_s
+        rescue InvalidURIError, TypeError
+          return false
+        end
+      end
+      return self.normalize.to_s == uri_string
+    end
+
+    ##
+    # Returns <code>true</code> if the URI objects are equal. This method
+    # normalizes both URIs before doing the comparison.
+    #
+    # @param [Object] uri The URI to compare.
+    #
+    # @return [TrueClass, FalseClass]
+    #   <code>true</code> if the URIs are equivalent, <code>false</code>
+    #   otherwise.
+    def ==(uri)
+      return false unless uri.kind_of?(URI)
+      return self.normalize.to_s == uri.normalize.to_s
+    end
+
+    ##
+    # Returns <code>true</code> if the URI objects are equal. This method
+    # does NOT normalize either URI before doing the comparison.
+    #
+    # @param [Object] uri The URI to compare.
+    #
+    # @return [TrueClass, FalseClass]
+    #   <code>true</code> if the URIs are equivalent, <code>false</code>
+    #   otherwise.
+    def eql?(uri)
+      return false unless uri.kind_of?(URI)
+      return self.to_s == uri.to_s
+    end
+
+    ##
+    # A hash value that will make a URI equivalent to its normalized
+    # form.
+    #
+    # @return [Integer] A hash of the URI.
+    def hash
+      @hash ||= self.to_s.hash * -1
+    end
+
+    ##
+    # Clones the URI object.
+    #
+    # @return [Addressable::URI] The cloned URI.
+    def dup
+      duplicated_uri = self.class.new(
+        :scheme => self.scheme ? self.scheme.dup : nil,
+        :user => self.user ? self.user.dup : nil,
+        :password => self.password ? self.password.dup : nil,
+        :host => self.host ? self.host.dup : nil,
+        :port => self.port,
+        :path => self.path ? self.path.dup : nil,
+        :query => self.query ? self.query.dup : nil,
+        :fragment => self.fragment ? self.fragment.dup : nil
+      )
+      return duplicated_uri
+    end
+
+    ##
+    # Omits components from a URI.
+    #
+    # @param [Symbol] *components The components to be omitted.
+    #
+    # @return [Addressable::URI] The URI with components omitted.
+    #
+    # @example
+    #   uri = Addressable::URI.parse("http://example.com/path?query")
+    #   #=> #<Addressable::URI:0xcc5e7a URI:http://example.com/path?query>
+    #   uri.omit(:scheme, :authority)
+    #   #=> #<Addressable::URI:0xcc4d86 URI:/path?query>
+    def omit(*components)
+      invalid_components = components - [
+        :scheme, :user, :password, :userinfo, :host, :port, :authority,
+        :path, :query, :fragment
+      ]
+      unless invalid_components.empty?
+        raise ArgumentError,
+          "Invalid component names: #{invalid_components.inspect}."
+      end
+      duplicated_uri = self.dup
+      duplicated_uri.defer_validation do
+        components.each do |component|
+          duplicated_uri.send((component.to_s + "=").to_sym, nil)
+        end
+        duplicated_uri.user = duplicated_uri.normalized_user
+      end
+      duplicated_uri
+    end
+
+    ##
+    # Destructive form of omit.
+    #
+    # @param [Symbol] *components The components to be omitted.
+    #
+    # @return [Addressable::URI] The URI with components omitted.
+    #
+    # @see Addressable::URI#omit
+    def omit!(*components)
+      replace_self(self.omit(*components))
+    end
+
+    ##
+    # Determines if the URI is an empty string.
+    #
+    # @return [TrueClass, FalseClass]
+    #   Returns <code>true</code> if empty, <code>false</code> otherwise.
+    def empty?
+      return self.to_s.empty?
+    end
+
+    ##
+    # Converts the URI to a <code>String</code>.
+    #
+    # @return [String] The URI's <code>String</code> representation.
+    def to_s
+      if self.scheme == nil && self.path != nil && !self.path.empty? &&
+          self.path =~ NORMPATH
+        raise InvalidURIError,
+          "Cannot assemble URI string with ambiguous path: '#{self.path}'"
+      end
+      @uri_string ||= begin
+        uri_string = String.new
+        uri_string << "#{self.scheme}:" if self.scheme != nil
+        uri_string << "//#{self.authority}" if self.authority != nil
+        uri_string << self.path.to_s
+        uri_string << "?#{self.query}" if self.query != nil
+        uri_string << "##{self.fragment}" if self.fragment != nil
+        uri_string.force_encoding(Encoding::UTF_8)
+        uri_string
+      end
+    end
+
+    ##
+    # URI's are glorified <code>Strings</code>. Allow implicit conversion.
+    alias_method :to_str, :to_s
+
+    ##
+    # Returns a Hash of the URI components.
+    #
+    # @return [Hash] The URI as a <code>Hash</code> of components.
+    def to_hash
+      return {
+        :scheme => self.scheme,
+        :user => self.user,
+        :password => self.password,
+        :host => self.host,
+        :port => self.port,
+        :path => self.path,
+        :query => self.query,
+        :fragment => self.fragment
+      }
+    end
+
+    ##
+    # Returns a <code>String</code> representation of the URI object's state.
+    #
+    # @return [String] The URI object's state, as a <code>String</code>.
+    def inspect
+      sprintf("#<%s:%#0x URI:%s>", URI.to_s, self.object_id, self.to_s)
+    end
+
+    ##
+    # This method allows you to make several changes to a URI simultaneously,
+    # which separately would cause validation errors, but in conjunction,
+    # are valid.  The URI will be revalidated as soon as the entire block has
+    # been executed.
+    #
+    # @param [Proc] block
+    #   A set of operations to perform on a given URI.
+    def defer_validation(&block)
+      raise LocalJumpError, "No block given." unless block
+      @validation_deferred = true
+      block.call()
+      @validation_deferred = false
+      validate
+      return nil
+    end
+
+  protected
+    SELF_REF = '.'
+    PARENT = '..'
+
+    RULE_2A = /\/\.\/|\/\.$/
+    RULE_2B_2C = /\/([^\/]*)\/\.\.\/|\/([^\/]*)\/\.\.$/
+    RULE_2D = /^\.\.?\/?/
+    RULE_PREFIXED_PARENT = /^\/\.\.?\/|^(\/\.\.?)+\/?$/
+
+    ##
+    # Resolves paths to their simplest form.
+    #
+    # @param [String] path The path to normalize.
+    #
+    # @return [String] The normalized path.
+    def self.normalize_path(path)
+      # Section 5.2.4 of RFC 3986
+
+      return nil if path.nil?
+      normalized_path = path.dup
+      begin
+        mod = nil
+        mod ||= normalized_path.gsub!(RULE_2A, SLASH)
+
+        pair = normalized_path.match(RULE_2B_2C)
+        parent, current = pair[1], pair[2] if pair
+        if pair && ((parent != SELF_REF && parent != PARENT) ||
+            (current != SELF_REF && current != PARENT))
+          mod ||= normalized_path.gsub!(
+            Regexp.new(
+              "/#{Regexp.escape(parent.to_s)}/\\.\\./|" +
+              "(/#{Regexp.escape(current.to_s)}/\\.\\.$)"
+            ), SLASH
+          )
+        end
+
+        mod ||= normalized_path.gsub!(RULE_2D, EMPTY_STR)
+        # Non-standard, removes prefixed dotted segments from path.
+        mod ||= normalized_path.gsub!(RULE_PREFIXED_PARENT, SLASH)
+      end until mod.nil?
+
+      return normalized_path
+    end
+
+    ##
+    # Ensures that the URI is valid.
+    def validate
+      return if !!@validation_deferred
+      if self.scheme != nil && self.ip_based? &&
+          (self.host == nil || self.host.empty?) &&
+          (self.path == nil || self.path.empty?)
+        raise InvalidURIError,
+          "Absolute URI missing hierarchical segment: '#{self.to_s}'"
+      end
+      if self.host == nil
+        if self.port != nil ||
+            self.user != nil ||
+            self.password != nil
+          raise InvalidURIError, "Hostname not supplied: '#{self.to_s}'"
+        end
+      end
+      if self.path != nil && !self.path.empty? && self.path[0..0] != SLASH &&
+          self.authority != nil
+        raise InvalidURIError,
+          "Cannot have a relative path with an authority set: '#{self.to_s}'"
+      end
+      if self.path != nil && !self.path.empty? &&
+          self.path[0..1] == SLASH + SLASH && self.authority == nil
+        raise InvalidURIError,
+          "Cannot have a path with two leading slashes " +
+          "without an authority set: '#{self.to_s}'"
+      end
+      unreserved = CharacterClasses::UNRESERVED
+      sub_delims = CharacterClasses::SUB_DELIMS
+      if !self.host.nil? && (self.host =~ /[<>{}\/\\\?\#\@"[[:space:]]]/ ||
+          (self.host[/^\[(.*)\]$/, 1] != nil && self.host[/^\[(.*)\]$/, 1] !~
+          Regexp.new("^[#{unreserved}#{sub_delims}:]*$")))
+        raise InvalidURIError, "Invalid character in host: '#{self.host.to_s}'"
+      end
+      return nil
+    end
+
+    ##
+    # Replaces the internal state of self with the specified URI's state.
+    # Used in destructive operations to avoid massive code repetition.
+    #
+    # @param [Addressable::URI] uri The URI to replace <code>self</code> with.
+    #
+    # @return [Addressable::URI] <code>self</code>.
+    def replace_self(uri)
+      # Reset dependent values
+      instance_variables.each do |var|
+        if instance_variable_defined?(var) && var != :@validation_deferred
+          remove_instance_variable(var)
+        end
+      end
+
+      @scheme = uri.scheme
+      @user = uri.user
+      @password = uri.password
+      @host = uri.host
+      @port = uri.port
+      @path = uri.path
+      @query = uri.query
+      @fragment = uri.fragment
+      return self
+    end
+
+    ##
+    # Splits path string with "/" (slash).
+    # It is considered that there is empty string after last slash when
+    # path ends with slash.
+    #
+    # @param [String] path The path to split.
+    #
+    # @return [Array<String>] An array of parts of path.
+    def split_path(path)
+      splitted = path.split(SLASH)
+      splitted << EMPTY_STR if path.end_with? SLASH
+      splitted
+    end
+
+    ##
+    # Resets composite values for the entire URI
+    #
+    # @api private
+    def remove_composite_values
+      remove_instance_variable(:@uri_string) if defined?(@uri_string)
+      remove_instance_variable(:@hash) if defined?(@hash)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/version.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/version.rb
new file mode 100644
index 0000000..4d28465
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/lib/addressable/version.rb
@@ -0,0 +1,30 @@
+# encoding:utf-8
+#--
+# Copyright (C) Bob Aman
+#
+#    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.
+#++
+
+
+# Used to prevent the class/module from being loaded more than once
+if !defined?(Addressable::VERSION)
+  module Addressable
+    module VERSION
+      MAJOR = 2
+      MINOR = 5
+      TINY  = 2
+
+      STRING = [MAJOR, MINOR, TINY].join('.')
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb
new file mode 100644
index 0000000..2f47ec3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb
@@ -0,0 +1,298 @@
+# coding: utf-8
+# Copyright (C) Bob Aman
+#
+#    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.
+
+
+require "spec_helper"
+
+# Have to use RubyGems to load the idn gem.
+require "rubygems"
+
+require "addressable/idna"
+
+shared_examples_for "converting from unicode to ASCII" do
+  it "should convert 'www.google.com' correctly" do
+    expect(Addressable::IDNA.to_ascii("www.google.com")).to eq("www.google.com")
+  end
+
+  LONG = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com'
+  it "should convert '#{LONG}' correctly" do
+    expect(Addressable::IDNA.to_ascii(LONG)).to eq(LONG)
+  end
+
+  it "should convert 'www.詹姆斯.com' correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "www.詹姆斯.com"
+    )).to eq("www.xn--8ws00zhy3a.com")
+  end
+
+  it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do
+    "www.Iñtërnâtiônàlizætiøn.com"
+    expect(Addressable::IDNA.to_ascii(
+      "www.I\xC3\xB1t\xC3\xABrn\xC3\xA2ti\xC3\xB4" +
+      "n\xC3\xA0liz\xC3\xA6ti\xC3\xB8n.com"
+    )).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com")
+  end
+
+  it "should convert 'www.Iñtërnâtiônàlizætiøn.com' correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "www.In\xCC\x83te\xCC\x88rna\xCC\x82tio\xCC\x82n" +
+      "a\xCC\x80liz\xC3\xA6ti\xC3\xB8n.com"
+    )).to eq("www.xn--itrntinliztin-vdb0a5exd8ewcye.com")
+  end
+
+  it "should convert " +
+      "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " +
+      "correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" +
+      "\201\252\343\201\214\343\201\204\343\202\217\343\201\221\343\201\256" +
+      "\343\202\217\343\201\213\343\202\211\343\201\252\343\201\204\343\201" +
+      "\251\343\202\201\343\201\204\343\202\223\343\202\201\343\201\204\343" +
+      "\201\256\343\202\211\343\201\271\343\202\213\343\201\276\343\201\240" +
+      "\343\201\252\343\201\214\343\201\217\343\201\227\343\201\252\343\201" +
+      "\204\343\201\250\343\201\237\343\202\212\343\201\252\343\201\204." +
+      "w3.mag.keio.ac.jp"
+    )).to eq(
+      "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" +
+      "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp"
+    )
+  end
+
+  it "should convert " +
+      "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " +
+      "correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "www.\343\201\273\343\202\223\343\201\250\343\201\206\343\201\253\343" +
+      "\201\252\343\201\213\343\202\231\343\201\204\343\202\217\343\201\221" +
+      "\343\201\256\343\202\217\343\201\213\343\202\211\343\201\252\343\201" +
+      "\204\343\201\250\343\202\231\343\202\201\343\201\204\343\202\223\343" +
+      "\202\201\343\201\204\343\201\256\343\202\211\343\201\270\343\202\231" +
+      "\343\202\213\343\201\276\343\201\237\343\202\231\343\201\252\343\201" +
+      "\213\343\202\231\343\201\217\343\201\227\343\201\252\343\201\204\343" +
+      "\201\250\343\201\237\343\202\212\343\201\252\343\201\204." +
+      "w3.mag.keio.ac.jp"
+    )).to eq(
+      "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" +
+      "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp"
+    )
+  end
+
+  it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "点心和烤鸭.w3.mag.keio.ac.jp"
+    )).to eq("xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp")
+  end
+
+  it "should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "가각갂갃간갅갆갇갈갉힢힣.com"
+    )).to eq("xn--o39acdefghijk5883jma.com")
+  end
+
+  it "should convert " +
+      "'\347\242\274\346\250\231\346\272\226\350" +
+      "\220\254\345\234\213\347\242\274.com' correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "\347\242\274\346\250\231\346\272\226\350" +
+      "\220\254\345\234\213\347\242\274.com"
+    )).to eq("xn--9cs565brid46mda086o.com")
+  end
+
+  it "should convert 'リ宠퐱〹.com' correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "\357\276\230\345\256\240\355\220\261\343\200\271.com"
+    )).to eq("xn--eek174hoxfpr4k.com")
+  end
+
+  it "should convert 'リ宠퐱卄.com' correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "\343\203\252\345\256\240\355\220\261\345\215\204.com"
+    )).to eq("xn--eek174hoxfpr4k.com")
+  end
+
+  it "should convert 'ᆵ' correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "\341\206\265"
+    )).to eq("xn--4ud")
+  end
+
+  it "should convert 'ᆵ' correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "\357\276\257"
+    )).to eq("xn--4ud")
+  end
+
+  it "should convert '🌹🌹🌹.ws' correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "\360\237\214\271\360\237\214\271\360\237\214\271.ws"
+    )).to eq("xn--2h8haa.ws")
+  end
+
+  it "should handle two adjacent '.'s correctly" do
+    expect(Addressable::IDNA.to_ascii(
+      "example..host"
+    )).to eq("example..host")
+  end
+end
+
+shared_examples_for "converting from ASCII to unicode" do
+  LONG = 'AcinusFallumTrompetumNullunCreditumVisumEstAtCuadLongumEtCefallum.com'
+  it "should convert '#{LONG}' correctly" do
+    expect(Addressable::IDNA.to_unicode(LONG)).to eq(LONG)
+  end
+
+  it "should return the identity conversion when punycode decode fails" do
+    expect(Addressable::IDNA.to_unicode("xn--zckp1cyg1.sblo.jp")).to eq(
+      "xn--zckp1cyg1.sblo.jp")
+  end
+
+  it "should return the identity conversion when the ACE prefix has no suffix" do
+    expect(Addressable::IDNA.to_unicode("xn--...-")).to eq("xn--...-")
+  end
+
+  it "should convert 'www.google.com' correctly" do
+    expect(Addressable::IDNA.to_unicode("www.google.com")).to eq(
+      "www.google.com")
+  end
+
+  it "should convert 'www.詹姆斯.com' correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "www.xn--8ws00zhy3a.com"
+    )).to eq("www.詹姆斯.com")
+  end
+
+  it "should convert '詹姆斯.com' correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "xn--8ws00zhy3a.com"
+    )).to eq("詹姆斯.com")
+  end
+
+  it "should convert 'www.iñtërnâtiônàlizætiøn.com' correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "www.xn--itrntinliztin-vdb0a5exd8ewcye.com"
+    )).to eq("www.iñtërnâtiônàlizætiøn.com")
+  end
+
+  it "should convert 'iñtërnâtiônàlizætiøn.com' correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "xn--itrntinliztin-vdb0a5exd8ewcye.com"
+    )).to eq("iñtërnâtiônàlizætiøn.com")
+  end
+
+  it "should convert " +
+      "'www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp' " +
+      "correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3" +
+      "fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp"
+    )).to eq(
+      "www.ほんとうにながいわけのわからないどめいんめいのらべるまだながくしないとたりない.w3.mag.keio.ac.jp"
+    )
+  end
+
+  it "should convert '点心和烤鸭.w3.mag.keio.ac.jp' correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "xn--0trv4xfvn8el34t.w3.mag.keio.ac.jp"
+    )).to eq("点心和烤鸭.w3.mag.keio.ac.jp")
+  end
+
+  it "should convert '가각갂갃간갅갆갇갈갉힢힣.com' correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "xn--o39acdefghijk5883jma.com"
+    )).to eq("가각갂갃간갅갆갇갈갉힢힣.com")
+  end
+
+  it "should convert " +
+      "'\347\242\274\346\250\231\346\272\226\350" +
+      "\220\254\345\234\213\347\242\274.com' correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "xn--9cs565brid46mda086o.com"
+    )).to eq(
+      "\347\242\274\346\250\231\346\272\226\350" +
+      "\220\254\345\234\213\347\242\274.com"
+    )
+  end
+
+  it "should convert 'リ宠퐱卄.com' correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "xn--eek174hoxfpr4k.com"
+    )).to eq("\343\203\252\345\256\240\355\220\261\345\215\204.com")
+  end
+
+  it "should convert 'ᆵ' correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "xn--4ud"
+    )).to eq("\341\206\265")
+  end
+
+  it "should convert '🌹🌹🌹.ws' correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "xn--2h8haa.ws"
+    )).to eq("\360\237\214\271\360\237\214\271\360\237\214\271.ws")
+  end
+
+  it "should handle two adjacent '.'s correctly" do
+    expect(Addressable::IDNA.to_unicode(
+      "example..host"
+    )).to eq("example..host")
+  end
+
+  it "should normalize 'string' correctly" do
+    expect(Addressable::IDNA.unicode_normalize_kc(:'string')).to eq("string")
+    expect(Addressable::IDNA.unicode_normalize_kc("string")).to eq("string")
+  end
+end
+
+describe Addressable::IDNA, "when using the pure-Ruby implementation" do
+  before do
+    Addressable.send(:remove_const, :IDNA)
+    load "addressable/idna/pure.rb"
+  end
+
+  it_should_behave_like "converting from unicode to ASCII"
+  it_should_behave_like "converting from ASCII to unicode"
+
+  begin
+    require "fiber"
+
+    it "should not blow up inside fibers" do
+      f = Fiber.new do
+        Addressable.send(:remove_const, :IDNA)
+        load "addressable/idna/pure.rb"
+      end
+      f.resume
+    end
+  rescue LoadError
+    # Fibers aren't supported in this version of Ruby, skip this test.
+    warn('Fibers unsupported.')
+  end
+end
+
+begin
+  require "idn"
+
+  describe Addressable::IDNA, "when using the native-code implementation" do
+    before do
+      Addressable.send(:remove_const, :IDNA)
+      load "addressable/idna/native.rb"
+    end
+
+    it_should_behave_like "converting from unicode to ASCII"
+    it_should_behave_like "converting from ASCII to unicode"
+  end
+rescue LoadError
+  # Cannot test the native implementation without libidn support.
+  warn('Could not load native IDN implementation.')
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb
new file mode 100644
index 0000000..eee3f86
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb
@@ -0,0 +1,28 @@
+# coding: utf-8
+# Copyright (C) Bob Aman
+#
+#    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.
+
+
+require "spec_helper"
+
+require "addressable/uri"
+require "net/http"
+
+describe Net::HTTP do
+  it "should be compatible with Addressable" do
+    response_body =
+      Net::HTTP.get(Addressable::URI.parse('http://www.google.com/'))
+    expect(response_body).not_to be_nil
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb
new file mode 100644
index 0000000..622a4ab
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb
@@ -0,0 +1,104 @@
+# coding: utf-8
+# Copyright (C) Bob Aman
+#
+#    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.
+
+
+require "spec_helper"
+
+require "addressable/uri"
+require "addressable/template"
+require "rack/mount"
+
+describe Rack::Mount do
+  let(:app_one) do
+    proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 1'] }
+  end
+  let(:app_two) do
+    proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 2'] }
+  end
+  let(:app_three) do
+    proc { |env| [200, {'Content-Type' => 'text/plain'}, 'Route 3'] }
+  end
+  let(:routes) do
+    s = Rack::Mount::RouteSet.new do |set|
+      set.add_route(app_one, {
+        :request_method => 'GET',
+        :path_info => Addressable::Template.new('/one/{id}/')
+      }, {:id => 'unidentified'}, :one)
+      set.add_route(app_two, {
+        :request_method => 'GET',
+        :path_info => Addressable::Template.new('/two/')
+      }, {:id => 'unidentified'}, :two)
+      set.add_route(app_three, {
+        :request_method => 'GET',
+        :path_info => Addressable::Template.new('/three/{id}/').to_regexp
+      }, {:id => 'unidentified'}, :three)
+    end
+    s.rehash
+    s
+  end
+
+  it "should generate from routes with Addressable::Template" do
+    path, _ = routes.generate(:path_info, :one, {:id => '123'})
+    expect(path).to eq '/one/123/'
+  end
+
+  it "should generate from routes with Addressable::Template using defaults" do
+    path, _ = routes.generate(:path_info, :one, {})
+    expect(path).to eq '/one/unidentified/'
+  end
+
+  it "should recognize routes with Addressable::Template" do
+    request = Rack::Request.new(
+      'REQUEST_METHOD' => 'GET',
+      'PATH_INFO' => '/one/123/'
+    )
+    route, _, params = routes.recognize(request)
+    expect(route).not_to be_nil
+    expect(route.app).to eq app_one
+    expect(params).to eq({id: '123'})
+  end
+
+  it "should generate from routes with Addressable::Template" do
+    path, _ = routes.generate(:path_info, :two, {:id => '654'})
+    expect(path).to eq '/two/'
+  end
+
+  it "should generate from routes with Addressable::Template using defaults" do
+    path, _ = routes.generate(:path_info, :two, {})
+    expect(path).to eq '/two/'
+  end
+
+  it "should recognize routes with Addressable::Template" do
+    request = Rack::Request.new(
+      'REQUEST_METHOD' => 'GET',
+      'PATH_INFO' => '/two/'
+    )
+    route, _, params = routes.recognize(request)
+    expect(route).not_to be_nil
+    expect(route.app).to eq app_two
+    expect(params).to eq({id: 'unidentified'})
+  end
+
+  it "should recognize routes with derived Regexp" do
+    request = Rack::Request.new(
+      'REQUEST_METHOD' => 'GET',
+      'PATH_INFO' => '/three/789/'
+    )
+    route, _, params = routes.recognize(request)
+    expect(route).not_to be_nil
+    expect(route.app).to eq app_three
+    expect(params).to eq({id: '789'})
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb
new file mode 100644
index 0000000..3275494
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb
@@ -0,0 +1,57 @@
+# coding: utf-8
+# Copyright (C) Bob Aman
+#
+#    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.
+
+
+require "spec_helper"
+
+require "addressable/uri"
+
+describe Addressable::URI, "when created with a URI known to cause crashes " +
+    "in certain browsers" do
+  it "should parse correctly" do
+    uri = Addressable::URI.parse('%%30%30')
+    expect(uri.path).to eq('%%30%30')
+    expect(uri.normalize.path).to eq('%2500')
+  end
+
+  it "should parse correctly as a full URI" do
+    uri = Addressable::URI.parse('http://www.example.com/%%30%30')
+    expect(uri.path).to eq('/%%30%30')
+    expect(uri.normalize.path).to eq('/%2500')
+  end
+end
+
+describe Addressable::URI, "when created with a URI known to cause crashes " +
+    "in certain browsers" do
+  it "should parse correctly" do
+    uri = Addressable::URI.parse('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗')
+    expect(uri.path).to eq('لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗')
+    expect(uri.normalize.path).to eq(
+      '%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' +
+      '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' +
+      '%A3%20%E0%A5%A3%20%E5%86%97'
+    )
+  end
+
+  it "should parse correctly as a full URI" do
+    uri = Addressable::URI.parse('http://www.example.com/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗')
+    expect(uri.path).to eq('/لُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ 冗')
+    expect(uri.normalize.path).to eq(
+      '/%D9%84%D9%8F%D8%B5%D9%91%D8%A8%D9%8F%D9%84%D9%8F%D9%84%D8%B5%D9%91' +
+      '%D8%A8%D9%8F%D8%B1%D8%B1%D9%8B%20%E0%A5%A3%20%E0%A5%A3h%20%E0%A5' +
+      '%A3%20%E0%A5%A3%20%E5%86%97'
+    )
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb
new file mode 100644
index 0000000..bd8ab12
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb
@@ -0,0 +1,1419 @@
+# coding: utf-8
+# Copyright (C) Bob Aman
+#
+#    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.
+
+
+require "spec_helper"
+
+require "bigdecimal"
+require "addressable/template"
+
+shared_examples_for 'expands' do |tests|
+  tests.each do |template, expansion|
+    exp = expansion.is_a?(Array) ? expansion.first : expansion
+    it "#{template} to #{exp}" do
+      tmpl = Addressable::Template.new(template).expand(subject)
+      if expansion.is_a?(Array)
+        expect(expansion.any?{|i| i == tmpl.to_str}).to be true
+      else
+        expect(tmpl.to_str).to eq(expansion)
+      end
+    end
+  end
+end
+
+describe "eql?" do
+  let(:template) { Addressable::Template.new('https://www.example.com/{foo}') }
+  it 'is equal when the pattern matches' do
+    other_template = Addressable::Template.new('https://www.example.com/{foo}')
+    expect(template).to be_eql(other_template)
+    expect(other_template).to be_eql(template)
+  end
+  it 'is not equal when the pattern differs' do
+    other_template = Addressable::Template.new('https://www.example.com/{bar}')
+    expect(template).to_not be_eql(other_template)
+    expect(other_template).to_not be_eql(template)
+  end
+  it 'is not equal to non-templates' do
+    uri = 'https://www.example.com/foo/bar'
+    addressable_template = Addressable::Template.new uri
+    addressable_uri = Addressable::URI.parse uri
+    expect(addressable_template).to_not be_eql(addressable_uri)
+    expect(addressable_uri).to_not be_eql(addressable_template)
+  end
+end
+
+describe "==" do
+  let(:template) { Addressable::Template.new('https://www.example.com/{foo}') }
+  it 'is equal when the pattern matches' do
+    other_template = Addressable::Template.new('https://www.example.com/{foo}')
+    expect(template).to eq other_template
+    expect(other_template).to eq template
+  end
+  it 'is not equal when the pattern differs' do
+    other_template = Addressable::Template.new('https://www.example.com/{bar}')
+    expect(template).not_to eq other_template
+    expect(other_template).not_to eq template
+  end
+  it 'is not equal to non-templates' do
+    uri = 'https://www.example.com/foo/bar'
+    addressable_template = Addressable::Template.new uri
+    addressable_uri = Addressable::URI.parse uri
+    expect(addressable_template).not_to eq addressable_uri
+    expect(addressable_uri).not_to eq addressable_template
+  end
+end
+
+describe "Type conversion" do
+  subject {
+    {
+      :var => true,
+      :hello => 1234,
+      :nothing => nil,
+      :sym => :symbolic,
+      :decimal => BigDecimal.new('1')
+    }
+  }
+
+  it_behaves_like 'expands', {
+    '{var}' => 'true',
+    '{hello}' => '1234',
+    '{nothing}' => '',
+    '{sym}' => 'symbolic',
+    '{decimal}' => RUBY_VERSION < '2.4.0' ? '0.1E1' : '0.1e1'
+  }
+end
+
+describe "Level 1:" do
+  subject {
+    {:var => "value", :hello => "Hello World!"}
+  }
+  it_behaves_like 'expands', {
+    '{var}' => 'value',
+    '{hello}' => 'Hello%20World%21'
+  }
+end
+
+describe "Level 2" do
+  subject {
+    {
+      :var => "value",
+      :hello => "Hello World!",
+      :path => "/foo/bar"
+    }
+  }
+  context "Operator +:" do
+    it_behaves_like 'expands', {
+      '{+var}' => 'value',
+      '{+hello}' => 'Hello%20World!',
+      '{+path}/here' => '/foo/bar/here',
+      'here?ref={+path}' => 'here?ref=/foo/bar'
+    }
+  end
+  context "Operator #:" do
+    it_behaves_like 'expands', {
+      'X{#var}' => 'X#value',
+      'X{#hello}' => 'X#Hello%20World!'
+    }
+  end
+end
+
+describe "Level 3" do
+  subject {
+    {
+      :var => "value",
+      :hello => "Hello World!",
+      :empty => "",
+      :path => "/foo/bar",
+      :x => "1024",
+      :y => "768"
+    }
+  }
+  context "Operator nil (multiple vars):" do
+    it_behaves_like 'expands', {
+      'map?{x,y}' => 'map?1024,768',
+      '{x,hello,y}' => '1024,Hello%20World%21,768'
+    }
+  end
+  context "Operator + (multiple vars):" do
+    it_behaves_like 'expands', {
+      '{+x,hello,y}' => '1024,Hello%20World!,768',
+      '{+path,x}/here' => '/foo/bar,1024/here'
+    }
+  end
+  context "Operator # (multiple vars):" do
+    it_behaves_like 'expands', {
+      '{#x,hello,y}' => '#1024,Hello%20World!,768',
+      '{#path,x}/here' => '#/foo/bar,1024/here'
+    }
+  end
+  context "Operator ." do
+    it_behaves_like 'expands', {
+      'X{.var}' => 'X.value',
+      'X{.x,y}' => 'X.1024.768'
+    }
+  end
+  context "Operator /" do
+    it_behaves_like 'expands', {
+      '{/var}' => '/value',
+      '{/var,x}/here' => '/value/1024/here'
+    }
+  end
+  context "Operator ;" do
+    it_behaves_like 'expands', {
+      '{;x,y}' => ';x=1024;y=768',
+      '{;x,y,empty}' => ';x=1024;y=768;empty'
+    }
+  end
+  context "Operator ?" do
+    it_behaves_like 'expands', {
+      '{?x,y}' => '?x=1024&y=768',
+      '{?x,y,empty}' => '?x=1024&y=768&empty='
+    }
+  end
+  context "Operator &" do
+    it_behaves_like 'expands', {
+      '?fixed=yes{&x}' => '?fixed=yes&x=1024',
+      '{&x,y,empty}' => '&x=1024&y=768&empty='
+    }
+  end
+end
+
+describe "Level 4" do
+  subject {
+    {
+      :var => "value",
+      :hello => "Hello World!",
+      :path => "/foo/bar",
+      :semi => ";",
+      :list => %w(red green blue),
+      :keys => {"semi" => ';', "dot" => '.', "comma" => ','}
+    }
+  }
+  context "Expansion with value modifiers" do
+    it_behaves_like 'expands', {
+      '{var:3}' => 'val',
+      '{var:30}' => 'value',
+      '{list}' => 'red,green,blue',
+      '{list*}' => 'red,green,blue',
+      '{keys}' => [
+        'semi,%3B,dot,.,comma,%2C',
+        'dot,.,semi,%3B,comma,%2C',
+        'comma,%2C,semi,%3B,dot,.',
+        'semi,%3B,comma,%2C,dot,.',
+        'dot,.,comma,%2C,semi,%3B',
+        'comma,%2C,dot,.,semi,%3B'
+      ],
+      '{keys*}' => [
+        'semi=%3B,dot=.,comma=%2C',
+        'dot=.,semi=%3B,comma=%2C',
+        'comma=%2C,semi=%3B,dot=.',
+        'semi=%3B,comma=%2C,dot=.',
+        'dot=.,comma=%2C,semi=%3B',
+        'comma=%2C,dot=.,semi=%3B'
+      ]
+    }
+  end
+  context "Operator + with value modifiers" do
+    it_behaves_like 'expands', {
+      '{+path:6}/here' => '/foo/b/here',
+      '{+list}' => 'red,green,blue',
+      '{+list*}' => 'red,green,blue',
+      '{+keys}' => [
+        'semi,;,dot,.,comma,,',
+        'dot,.,semi,;,comma,,',
+        'comma,,,semi,;,dot,.',
+        'semi,;,comma,,,dot,.',
+        'dot,.,comma,,,semi,;',
+        'comma,,,dot,.,semi,;'
+      ],
+      '{+keys*}' => [
+        'semi=;,dot=.,comma=,',
+        'dot=.,semi=;,comma=,',
+        'comma=,,semi=;,dot=.',
+        'semi=;,comma=,,dot=.',
+        'dot=.,comma=,,semi=;',
+        'comma=,,dot=.,semi=;'
+      ]
+    }
+  end
+  context "Operator # with value modifiers" do
+    it_behaves_like 'expands', {
+      '{#path:6}/here' => '#/foo/b/here',
+      '{#list}' => '#red,green,blue',
+      '{#list*}' => '#red,green,blue',
+      '{#keys}' => [
+        '#semi,;,dot,.,comma,,',
+        '#dot,.,semi,;,comma,,',
+        '#comma,,,semi,;,dot,.',
+        '#semi,;,comma,,,dot,.',
+        '#dot,.,comma,,,semi,;',
+        '#comma,,,dot,.,semi,;'
+      ],
+      '{#keys*}' => [
+        '#semi=;,dot=.,comma=,',
+        '#dot=.,semi=;,comma=,',
+        '#comma=,,semi=;,dot=.',
+        '#semi=;,comma=,,dot=.',
+        '#dot=.,comma=,,semi=;',
+        '#comma=,,dot=.,semi=;'
+      ]
+    }
+  end
+  context "Operator . with value modifiers" do
+    it_behaves_like 'expands', {
+      'X{.var:3}' => 'X.val',
+      'X{.list}' => 'X.red,green,blue',
+      'X{.list*}' => 'X.red.green.blue',
+      'X{.keys}' => [
+        'X.semi,%3B,dot,.,comma,%2C',
+        'X.dot,.,semi,%3B,comma,%2C',
+        'X.comma,%2C,semi,%3B,dot,.',
+        'X.semi,%3B,comma,%2C,dot,.',
+        'X.dot,.,comma,%2C,semi,%3B',
+        'X.comma,%2C,dot,.,semi,%3B'
+      ],
+      'X{.keys*}' => [
+        'X.semi=%3B.dot=..comma=%2C',
+        'X.dot=..semi=%3B.comma=%2C',
+        'X.comma=%2C.semi=%3B.dot=.',
+        'X.semi=%3B.comma=%2C.dot=.',
+        'X.dot=..comma=%2C.semi=%3B',
+        'X.comma=%2C.dot=..semi=%3B'
+      ]
+    }
+  end
+  context "Operator / with value modifiers" do
+    it_behaves_like 'expands', {
+      '{/var:1,var}' => '/v/value',
+      '{/list}' => '/red,green,blue',
+      '{/list*}' => '/red/green/blue',
+      '{/list*,path:4}' => '/red/green/blue/%2Ffoo',
+      '{/keys}' => [
+        '/semi,%3B,dot,.,comma,%2C',
+        '/dot,.,semi,%3B,comma,%2C',
+        '/comma,%2C,semi,%3B,dot,.',
+        '/semi,%3B,comma,%2C,dot,.',
+        '/dot,.,comma,%2C,semi,%3B',
+        '/comma,%2C,dot,.,semi,%3B'
+      ],
+      '{/keys*}' => [
+        '/semi=%3B/dot=./comma=%2C',
+        '/dot=./semi=%3B/comma=%2C',
+        '/comma=%2C/semi=%3B/dot=.',
+        '/semi=%3B/comma=%2C/dot=.',
+        '/dot=./comma=%2C/semi=%3B',
+        '/comma=%2C/dot=./semi=%3B'
+      ]
+    }
+  end
+  context "Operator ; with value modifiers" do
+    it_behaves_like 'expands', {
+      '{;hello:5}' => ';hello=Hello',
+      '{;list}' => ';list=red,green,blue',
+      '{;list*}' => ';list=red;list=green;list=blue',
+      '{;keys}' => [
+        ';keys=semi,%3B,dot,.,comma,%2C',
+        ';keys=dot,.,semi,%3B,comma,%2C',
+        ';keys=comma,%2C,semi,%3B,dot,.',
+        ';keys=semi,%3B,comma,%2C,dot,.',
+        ';keys=dot,.,comma,%2C,semi,%3B',
+        ';keys=comma,%2C,dot,.,semi,%3B'
+      ],
+      '{;keys*}' => [
+        ';semi=%3B;dot=.;comma=%2C',
+        ';dot=.;semi=%3B;comma=%2C',
+        ';comma=%2C;semi=%3B;dot=.',
+        ';semi=%3B;comma=%2C;dot=.',
+        ';dot=.;comma=%2C;semi=%3B',
+        ';comma=%2C;dot=.;semi=%3B'
+      ]
+    }
+  end
+  context "Operator ? with value modifiers" do
+    it_behaves_like 'expands', {
+      '{?var:3}' => '?var=val',
+      '{?list}' => '?list=red,green,blue',
+      '{?list*}' => '?list=red&list=green&list=blue',
+      '{?keys}' => [
+        '?keys=semi,%3B,dot,.,comma,%2C',
+        '?keys=dot,.,semi,%3B,comma,%2C',
+        '?keys=comma,%2C,semi,%3B,dot,.',
+        '?keys=semi,%3B,comma,%2C,dot,.',
+        '?keys=dot,.,comma,%2C,semi,%3B',
+        '?keys=comma,%2C,dot,.,semi,%3B'
+      ],
+      '{?keys*}' => [
+        '?semi=%3B&dot=.&comma=%2C',
+        '?dot=.&semi=%3B&comma=%2C',
+        '?comma=%2C&semi=%3B&dot=.',
+        '?semi=%3B&comma=%2C&dot=.',
+        '?dot=.&comma=%2C&semi=%3B',
+        '?comma=%2C&dot=.&semi=%3B'
+      ]
+    }
+  end
+  context "Operator & with value modifiers" do
+    it_behaves_like 'expands', {
+      '{&var:3}' => '&var=val',
+      '{&list}' => '&list=red,green,blue',
+      '{&list*}' => '&list=red&list=green&list=blue',
+      '{&keys}' => [
+        '&keys=semi,%3B,dot,.,comma,%2C',
+        '&keys=dot,.,semi,%3B,comma,%2C',
+        '&keys=comma,%2C,semi,%3B,dot,.',
+        '&keys=semi,%3B,comma,%2C,dot,.',
+        '&keys=dot,.,comma,%2C,semi,%3B',
+        '&keys=comma,%2C,dot,.,semi,%3B'
+      ],
+      '{&keys*}' => [
+        '&semi=%3B&dot=.&comma=%2C',
+        '&dot=.&semi=%3B&comma=%2C',
+        '&comma=%2C&semi=%3B&dot=.',
+        '&semi=%3B&comma=%2C&dot=.',
+        '&dot=.&comma=%2C&semi=%3B',
+        '&comma=%2C&dot=.&semi=%3B'
+      ]
+    }
+  end
+end
+describe "Modifiers" do
+  subject {
+    {
+      :var => "value",
+      :semi => ";",
+      :year => %w(1965 2000 2012),
+      :dom => %w(example com)
+    }
+  }
+  context "length" do
+    it_behaves_like 'expands', {
+      '{var:3}' => 'val',
+      '{var:30}' => 'value',
+      '{var}' => 'value',
+      '{semi}' => '%3B',
+      '{semi:2}' => '%3B'
+    }
+  end
+  context "explode" do
+    it_behaves_like 'expands', {
+      'find{?year*}' => 'find?year=1965&year=2000&year=2012',
+      'www{.dom*}' => 'www.example.com',
+    }
+  end
+end
+describe "Expansion" do
+  subject {
+    {
+      :count => ["one", "two", "three"],
+      :dom => ["example", "com"],
+      :dub   => "me/too",
+      :hello => "Hello World!",
+      :half  => "50%",
+      :var   => "value",
+      :who   => "fred",
+      :base  => "http://example.com/home/",
+      :path  => "/foo/bar",
+      :list  => ["red", "green", "blue"],
+      :keys  => {"semi" => ";","dot" => ".","comma" => ","},
+      :v     => "6",
+      :x     => "1024",
+      :y     => "768",
+      :empty => "",
+      :empty_keys  => {},
+      :undef => nil
+    }
+  }
+  context "concatenation" do
+    it_behaves_like 'expands', {
+      '{count}' => 'one,two,three',
+      '{count*}' => 'one,two,three',
+      '{/count}' => '/one,two,three',
+      '{/count*}' => '/one/two/three',
+      '{;count}' => ';count=one,two,three',
+      '{;count*}' => ';count=one;count=two;count=three',
+      '{?count}' => '?count=one,two,three',
+      '{?count*}' => '?count=one&count=two&count=three',
+      '{&count*}' => '&count=one&count=two&count=three'
+    }
+  end
+  context "simple expansion" do
+    it_behaves_like 'expands', {
+      '{var}' => 'value',
+      '{hello}' => 'Hello%20World%21',
+      '{half}' => '50%25',
+      'O{empty}X' => 'OX',
+      'O{undef}X' => 'OX',
+      '{x,y}' => '1024,768',
+      '{x,hello,y}' => '1024,Hello%20World%21,768',
+      '?{x,empty}' => '?1024,',
+      '?{x,undef}' => '?1024',
+      '?{undef,y}' => '?768',
+      '{var:3}' => 'val',
+      '{var:30}' => 'value',
+      '{list}' => 'red,green,blue',
+      '{list*}' => 'red,green,blue',
+      '{keys}' => [
+        'semi,%3B,dot,.,comma,%2C',
+        'dot,.,semi,%3B,comma,%2C',
+        'comma,%2C,semi,%3B,dot,.',
+        'semi,%3B,comma,%2C,dot,.',
+        'dot,.,comma,%2C,semi,%3B',
+        'comma,%2C,dot,.,semi,%3B'
+      ],
+      '{keys*}' => [
+        'semi=%3B,dot=.,comma=%2C',
+        'dot=.,semi=%3B,comma=%2C',
+        'comma=%2C,semi=%3B,dot=.',
+        'semi=%3B,comma=%2C,dot=.',
+        'dot=.,comma=%2C,semi=%3B',
+        'comma=%2C,dot=.,semi=%3B'
+      ]
+    }
+  end
+  context "reserved expansion (+)" do
+    it_behaves_like 'expands', {
+      '{+var}' => 'value',
+      '{+hello}' => 'Hello%20World!',
+      '{+half}' => '50%25',
+      '{base}index' => 'http%3A%2F%2Fexample.com%2Fhome%2Findex',
+      '{+base}index' => 'http://example.com/home/index',
+      'O{+empty}X' => 'OX',
+      'O{+undef}X' => 'OX',
+      '{+path}/here' => '/foo/bar/here',
+      'here?ref={+path}' => 'here?ref=/foo/bar',
+      'up{+path}{var}/here' => 'up/foo/barvalue/here',
+      '{+x,hello,y}' => '1024,Hello%20World!,768',
+      '{+path,x}/here' => '/foo/bar,1024/here',
+      '{+path:6}/here' => '/foo/b/here',
+      '{+list}' => 'red,green,blue',
+      '{+list*}' => 'red,green,blue',
+      '{+keys}' => [
+        'semi,;,dot,.,comma,,',
+        'dot,.,semi,;,comma,,',
+        'comma,,,semi,;,dot,.',
+        'semi,;,comma,,,dot,.',
+        'dot,.,comma,,,semi,;',
+        'comma,,,dot,.,semi,;'
+      ],
+      '{+keys*}' => [
+        'semi=;,dot=.,comma=,',
+        'dot=.,semi=;,comma=,',
+        'comma=,,semi=;,dot=.',
+        'semi=;,comma=,,dot=.',
+        'dot=.,comma=,,semi=;',
+        'comma=,,dot=.,semi=;'
+      ]
+    }
+  end
+  context "fragment expansion (#)" do
+    it_behaves_like 'expands', {
+      '{#var}' => '#value',
+      '{#hello}' => '#Hello%20World!',
+      '{#half}' => '#50%25',
+      'foo{#empty}' => 'foo#',
+      'foo{#undef}' => 'foo',
+      '{#x,hello,y}' => '#1024,Hello%20World!,768',
+      '{#path,x}/here' => '#/foo/bar,1024/here',
+      '{#path:6}/here' => '#/foo/b/here',
+      '{#list}' => '#red,green,blue',
+      '{#list*}' => '#red,green,blue',
+      '{#keys}' => [
+        '#semi,;,dot,.,comma,,',
+        '#dot,.,semi,;,comma,,',
+        '#comma,,,semi,;,dot,.',
+        '#semi,;,comma,,,dot,.',
+        '#dot,.,comma,,,semi,;',
+        '#comma,,,dot,.,semi,;'
+      ],
+      '{#keys*}' => [
+        '#semi=;,dot=.,comma=,',
+        '#dot=.,semi=;,comma=,',
+        '#comma=,,semi=;,dot=.',
+        '#semi=;,comma=,,dot=.',
+        '#dot=.,comma=,,semi=;',
+        '#comma=,,dot=.,semi=;'
+      ]
+    }
+  end
+  context "label expansion (.)" do
+    it_behaves_like 'expands', {
+      '{.who}' => '.fred',
+      '{.who,who}' => '.fred.fred',
+      '{.half,who}' => '.50%25.fred',
+      'www{.dom*}' => 'www.example.com',
+      'X{.var}' => 'X.value',
+      'X{.empty}' => 'X.',
+      'X{.undef}' => 'X',
+      'X{.var:3}' => 'X.val',
+      'X{.list}' => 'X.red,green,blue',
+      'X{.list*}' => 'X.red.green.blue',
+      'X{.keys}' => [
+        'X.semi,%3B,dot,.,comma,%2C',
+        'X.dot,.,semi,%3B,comma,%2C',
+        'X.comma,%2C,semi,%3B,dot,.',
+        'X.semi,%3B,comma,%2C,dot,.',
+        'X.dot,.,comma,%2C,semi,%3B',
+        'X.comma,%2C,dot,.,semi,%3B'
+      ],
+      'X{.keys*}' => [
+        'X.semi=%3B.dot=..comma=%2C',
+        'X.dot=..semi=%3B.comma=%2C',
+        'X.comma=%2C.semi=%3B.dot=.',
+        'X.semi=%3B.comma=%2C.dot=.',
+        'X.dot=..comma=%2C.semi=%3B',
+        'X.comma=%2C.dot=..semi=%3B'
+      ],
+      'X{.empty_keys}' => 'X',
+      'X{.empty_keys*}' => 'X'
+    }
+  end
+  context "path expansion (/)" do
+    it_behaves_like 'expands', {
+      '{/who}' => '/fred',
+      '{/who,who}' => '/fred/fred',
+      '{/half,who}' => '/50%25/fred',
+      '{/who,dub}' => '/fred/me%2Ftoo',
+      '{/var}' => '/value',
+      '{/var,empty}' => '/value/',
+      '{/var,undef}' => '/value',
+      '{/var,x}/here' => '/value/1024/here',
+      '{/var:1,var}' => '/v/value',
+      '{/list}' => '/red,green,blue',
+      '{/list*}' => '/red/green/blue',
+      '{/list*,path:4}' => '/red/green/blue/%2Ffoo',
+      '{/keys}' => [
+        '/semi,%3B,dot,.,comma,%2C',
+        '/dot,.,semi,%3B,comma,%2C',
+        '/comma,%2C,semi,%3B,dot,.',
+        '/semi,%3B,comma,%2C,dot,.',
+        '/dot,.,comma,%2C,semi,%3B',
+        '/comma,%2C,dot,.,semi,%3B'
+      ],
+      '{/keys*}' => [
+        '/semi=%3B/dot=./comma=%2C',
+        '/dot=./semi=%3B/comma=%2C',
+        '/comma=%2C/semi=%3B/dot=.',
+        '/semi=%3B/comma=%2C/dot=.',
+        '/dot=./comma=%2C/semi=%3B',
+        '/comma=%2C/dot=./semi=%3B'
+      ]
+    }
+  end
+  context "path-style expansion (;)" do
+    it_behaves_like 'expands', {
+      '{;who}' => ';who=fred',
+      '{;half}' => ';half=50%25',
+      '{;empty}' => ';empty',
+      '{;v,empty,who}' => ';v=6;empty;who=fred',
+      '{;v,bar,who}' => ';v=6;who=fred',
+      '{;x,y}' => ';x=1024;y=768',
+      '{;x,y,empty}' => ';x=1024;y=768;empty',
+      '{;x,y,undef}' => ';x=1024;y=768',
+      '{;hello:5}' => ';hello=Hello',
+      '{;list}' => ';list=red,green,blue',
+      '{;list*}' => ';list=red;list=green;list=blue',
+      '{;keys}' => [
+        ';keys=semi,%3B,dot,.,comma,%2C',
+        ';keys=dot,.,semi,%3B,comma,%2C',
+        ';keys=comma,%2C,semi,%3B,dot,.',
+        ';keys=semi,%3B,comma,%2C,dot,.',
+        ';keys=dot,.,comma,%2C,semi,%3B',
+        ';keys=comma,%2C,dot,.,semi,%3B'
+      ],
+      '{;keys*}' => [
+        ';semi=%3B;dot=.;comma=%2C',
+        ';dot=.;semi=%3B;comma=%2C',
+        ';comma=%2C;semi=%3B;dot=.',
+        ';semi=%3B;comma=%2C;dot=.',
+        ';dot=.;comma=%2C;semi=%3B',
+        ';comma=%2C;dot=.;semi=%3B'
+      ]
+    }
+  end
+  context "form query expansion (?)" do
+    it_behaves_like 'expands', {
+      '{?who}' => '?who=fred',
+      '{?half}' => '?half=50%25',
+      '{?x,y}' => '?x=1024&y=768',
+      '{?x,y,empty}' => '?x=1024&y=768&empty=',
+      '{?x,y,undef}' => '?x=1024&y=768',
+      '{?var:3}' => '?var=val',
+      '{?list}' => '?list=red,green,blue',
+      '{?list*}' => '?list=red&list=green&list=blue',
+      '{?keys}' => [
+        '?keys=semi,%3B,dot,.,comma,%2C',
+        '?keys=dot,.,semi,%3B,comma,%2C',
+        '?keys=comma,%2C,semi,%3B,dot,.',
+        '?keys=semi,%3B,comma,%2C,dot,.',
+        '?keys=dot,.,comma,%2C,semi,%3B',
+        '?keys=comma,%2C,dot,.,semi,%3B'
+      ],
+      '{?keys*}' => [
+        '?semi=%3B&dot=.&comma=%2C',
+        '?dot=.&semi=%3B&comma=%2C',
+        '?comma=%2C&semi=%3B&dot=.',
+        '?semi=%3B&comma=%2C&dot=.',
+        '?dot=.&comma=%2C&semi=%3B',
+        '?comma=%2C&dot=.&semi=%3B'
+      ]
+    }
+  end
+  context "form query expansion (&)" do
+    it_behaves_like 'expands', {
+      '{&who}' => '&who=fred',
+      '{&half}' => '&half=50%25',
+      '?fixed=yes{&x}' => '?fixed=yes&x=1024',
+      '{&x,y,empty}' => '&x=1024&y=768&empty=',
+      '{&x,y,undef}' => '&x=1024&y=768',
+      '{&var:3}' => '&var=val',
+      '{&list}' => '&list=red,green,blue',
+      '{&list*}' => '&list=red&list=green&list=blue',
+      '{&keys}' => [
+        '&keys=semi,%3B,dot,.,comma,%2C',
+        '&keys=dot,.,semi,%3B,comma,%2C',
+        '&keys=comma,%2C,semi,%3B,dot,.',
+        '&keys=semi,%3B,comma,%2C,dot,.',
+        '&keys=dot,.,comma,%2C,semi,%3B',
+        '&keys=comma,%2C,dot,.,semi,%3B'
+      ],
+      '{&keys*}' => [
+        '&semi=%3B&dot=.&comma=%2C',
+        '&dot=.&semi=%3B&comma=%2C',
+        '&comma=%2C&semi=%3B&dot=.',
+        '&semi=%3B&comma=%2C&dot=.',
+        '&dot=.&comma=%2C&semi=%3B',
+        '&comma=%2C&dot=.&semi=%3B'
+      ]
+    }
+  end
+  context "non-string key in match data" do
+    subject {Addressable::Template.new("http://example.com/{one}")}
+
+    it "raises TypeError" do
+      expect { subject.expand(Object.new => "1") }.to raise_error TypeError
+    end
+  end
+end
+
+class ExampleTwoProcessor
+  def self.restore(name, value)
+    return value.gsub(/-/, " ") if name == "query"
+    return value
+  end
+
+  def self.match(name)
+    return ".*?" if name == "first"
+    return ".*"
+  end
+  def self.validate(name, value)
+    return !!(value =~ /^[\w ]+$/) if name == "query"
+    return true
+  end
+
+  def self.transform(name, value)
+    return value.gsub(/ /, "+") if name == "query"
+    return value
+  end
+end
+
+class DumbProcessor
+  def self.match(name)
+    return ".*?" if name == "first"
+  end
+end
+
+describe Addressable::Template do
+  describe 'initialize' do
+    context 'with a non-string' do
+      it 'raises a TypeError' do
+        expect { Addressable::Template.new(nil) }.to raise_error(TypeError)
+      end
+    end
+  end
+
+  describe 'freeze' do
+    subject { Addressable::Template.new("http://example.com/{first}/{+second}/") }
+    it 'freezes the template' do
+      expect(subject.freeze).to be_frozen
+    end
+  end
+
+  describe "Matching" do
+    let(:uri){
+      Addressable::URI.parse(
+        "http://example.com/search/an-example-search-query/"
+      )
+    }
+    let(:uri2){
+      Addressable::URI.parse("http://example.com/a/b/c/")
+    }
+    let(:uri3){
+      Addressable::URI.parse("http://example.com/;a=1;b=2;c=3;first=foo")
+    }
+    let(:uri4){
+      Addressable::URI.parse("http://example.com/?a=1&b=2&c=3&first=foo")
+    }
+    let(:uri5){
+      "http://example.com/foo"
+    }
+    context "first uri with ExampleTwoProcessor" do
+      subject {
+        Addressable::Template.new(
+          "http://example.com/search/{query}/"
+        ).match(uri, ExampleTwoProcessor)
+      }
+      its(:variables){ should == ["query"] }
+      its(:captures){ should == ["an example search query"] }
+    end
+
+    context "second uri with ExampleTwoProcessor" do
+      subject {
+        Addressable::Template.new(
+          "http://example.com/{first}/{+second}/"
+        ).match(uri2, ExampleTwoProcessor)
+      }
+      its(:variables){ should == ["first", "second"] }
+      its(:captures){ should == ["a", "b/c"] }
+    end
+
+    context "second uri with DumbProcessor" do
+      subject {
+        Addressable::Template.new(
+          "http://example.com/{first}/{+second}/"
+        ).match(uri2, DumbProcessor)
+      }
+      its(:variables){ should == ["first", "second"] }
+      its(:captures){ should == ["a", "b/c"] }
+    end
+
+    context "second uri" do
+      subject {
+        Addressable::Template.new(
+          "http://example.com/{first}{/second*}/"
+        ).match(uri2)
+      }
+      its(:variables){ should == ["first", "second"] }
+      its(:captures){ should == ["a", ["b","c"]] }
+    end
+    context "third uri" do
+      subject {
+        Addressable::Template.new(
+          "http://example.com/{;hash*,first}"
+        ).match(uri3)
+      }
+      its(:variables){ should == ["hash", "first"] }
+      its(:captures){ should == [
+        {"a" => "1", "b" => "2", "c" => "3", "first" => "foo"}, nil] }
+    end
+    # Note that this expansion is impossible to revert deterministically - the
+    # * operator means first could have been a key of hash or a separate key.
+    # Semantically, a separate key is more likely, but both are possible.
+    context "fourth uri" do
+      subject {
+        Addressable::Template.new(
+          "http://example.com/{?hash*,first}"
+        ).match(uri4)
+      }
+      its(:variables){ should == ["hash", "first"] }
+      its(:captures){ should == [
+        {"a" => "1", "b" => "2", "c" => "3", "first"=> "foo"}, nil] }
+    end
+    context "fifth uri" do
+      subject {
+        Addressable::Template.new(
+          "http://example.com/{path}{?hash*,first}"
+        ).match(uri5)
+      }
+      its(:variables){ should == ["path", "hash", "first"] }
+      its(:captures){ should == ["foo", nil, nil] }
+    end
+  end
+
+  describe 'match' do
+    subject { Addressable::Template.new('http://example.com/first/second/') }
+    context 'when the URI is the same as the template' do
+      it 'returns the match data itself with an empty mapping' do
+        uri = Addressable::URI.parse('http://example.com/first/second/')
+        match_data = subject.match(uri)
+        expect(match_data).to be_an Addressable::Template::MatchData
+        expect(match_data.uri).to eq(uri)
+        expect(match_data.template).to eq(subject)
+        expect(match_data.mapping).to be_empty
+        expect(match_data.inspect).to be_an String
+      end
+    end
+  end
+
+  describe "extract" do
+    let(:template) {
+      Addressable::Template.new(
+        "http://{host}{/segments*}/{?one,two,bogus}{#fragment}"
+      )
+    }
+    let(:uri){ "http://example.com/a/b/c/?one=1&two=2#foo" }
+    let(:uri2){ "http://example.com/a/b/c/#foo" }
+    it "should be able to extract with queries" do
+      expect(template.extract(uri)).to eq({
+        "host" => "example.com",
+        "segments" => %w(a b c),
+        "one" => "1",
+        "bogus" => nil,
+        "two" => "2",
+        "fragment" => "foo"
+      })
+    end
+    it "should be able to extract without queries" do
+      expect(template.extract(uri2)).to eq({
+        "host" => "example.com",
+        "segments" => %w(a b c),
+        "one" => nil,
+        "bogus" => nil,
+        "two" => nil,
+        "fragment" => "foo"
+      })
+    end
+
+    context "issue #137" do
+      subject { Addressable::Template.new('/path{?page,per_page}') }
+
+      it "can match empty" do
+        data = subject.extract("/path")
+        expect(data["page"]).to eq(nil)
+        expect(data["per_page"]).to eq(nil)
+        expect(data.keys.sort).to eq(['page', 'per_page'])
+      end
+
+      it "can match first var" do
+        data = subject.extract("/path?page=1")
+        expect(data["page"]).to eq("1")
+        expect(data["per_page"]).to eq(nil)
+        expect(data.keys.sort).to eq(['page', 'per_page'])
+      end
+
+      it "can match second var" do
+        data = subject.extract("/path?per_page=1")
+        expect(data["page"]).to eq(nil)
+        expect(data["per_page"]).to eq("1")
+        expect(data.keys.sort).to eq(['page', 'per_page'])
+      end
+
+      it "can match both vars" do
+        data = subject.extract("/path?page=2&per_page=1")
+        expect(data["page"]).to eq("2")
+        expect(data["per_page"]).to eq("1")
+        expect(data.keys.sort).to eq(['page', 'per_page'])
+      end
+    end
+  end
+
+  describe "Partial expand with symbols" do
+    context "partial_expand with two simple values" do
+      subject {
+        Addressable::Template.new("http://example.com/{one}/{two}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand(:one => "1").pattern).to eq(
+          "http://example.com/1/{two}/"
+        )
+      end
+    end
+    context "partial_expand query with missing param in middle" do
+      subject {
+        Addressable::Template.new("http://example.com/{?one,two,three}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand(:one => "1", :three => "3").pattern).to eq(
+          "http://example.com/?one=1{&two}&three=3/"
+        )
+      end
+    end
+    context "partial_expand form style query with missing param at beginning" do
+      subject {
+        Addressable::Template.new("http://example.com/{?one,two}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand(:two => "2").pattern).to eq(
+          "http://example.com/?two=2{&one}/"
+        )
+      end
+    end
+    context "partial_expand with query string" do
+      subject {
+        Addressable::Template.new("http://example.com/{?two,one}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand(:one => "1").pattern).to eq(
+          "http://example.com/?one=1{&two}/"
+        )
+      end
+    end
+    context "partial_expand with path operator" do
+      subject {
+        Addressable::Template.new("http://example.com{/one,two}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand(:one => "1").pattern).to eq(
+          "http://example.com/1{/two}/"
+        )
+      end
+    end
+    context "partial expand with unicode values" do
+      subject do
+        Addressable::Template.new("http://example.com/{resource}/{query}/")
+      end
+      it "normalizes unicode by default" do
+        template = subject.partial_expand("query" => "Cafe\u0301")
+        expect(template.pattern).to eq(
+          "http://example.com/{resource}/Caf%C3%A9/"
+        )
+      end
+
+      it "does not normalize unicode when byte semantics requested" do
+        template = subject.partial_expand({"query" => "Cafe\u0301"}, nil, false)
+        expect(template.pattern).to eq(
+          "http://example.com/{resource}/Cafe%CC%81/"
+        )
+      end
+    end
+  end
+  describe "Partial expand with strings" do
+    context "partial_expand with two simple values" do
+      subject {
+        Addressable::Template.new("http://example.com/{one}/{two}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand("one" => "1").pattern).to eq(
+          "http://example.com/1/{two}/"
+        )
+      end
+    end
+    context "partial_expand query with missing param in middle" do
+      subject {
+        Addressable::Template.new("http://example.com/{?one,two,three}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq(
+          "http://example.com/?one=1{&two}&three=3/"
+        )
+      end
+    end
+    context "partial_expand with query string" do
+      subject {
+        Addressable::Template.new("http://example.com/{?two,one}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand("one" => "1").pattern).to eq(
+          "http://example.com/?one=1{&two}/"
+        )
+      end
+    end
+    context "partial_expand with path operator" do
+      subject {
+        Addressable::Template.new("http://example.com{/one,two}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand("one" => "1").pattern).to eq(
+          "http://example.com/1{/two}/"
+        )
+      end
+    end
+  end
+  describe "Expand" do
+    context "expand with unicode values" do
+      subject do
+        Addressable::Template.new("http://example.com/search/{query}/")
+      end
+      it "normalizes unicode by default" do
+        uri = subject.expand("query" => "Cafe\u0301").to_str
+        expect(uri).to eq("http://example.com/search/Caf%C3%A9/")
+      end
+
+      it "does not normalize unicode when byte semantics requested" do
+        uri = subject.expand({ "query" => "Cafe\u0301" }, nil, false).to_str
+        expect(uri).to eq("http://example.com/search/Cafe%CC%81/")
+      end
+    end
+    context "expand with a processor" do
+      subject {
+        Addressable::Template.new("http://example.com/search/{query}/")
+      }
+      it "processes spaces" do
+        expect(subject.expand({"query" => "an example search query"},
+                      ExampleTwoProcessor).to_str).to eq(
+          "http://example.com/search/an+example+search+query/"
+        )
+      end
+      it "validates" do
+        expect{
+          subject.expand({"query" => "Bogus!"},
+                      ExampleTwoProcessor).to_str
+        }.to raise_error(Addressable::Template::InvalidTemplateValueError)
+      end
+    end
+    context "partial_expand query with missing param in middle" do
+      subject {
+        Addressable::Template.new("http://example.com/{?one,two,three}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand("one" => "1", "three" => "3").pattern).to eq(
+          "http://example.com/?one=1{&two}&three=3/"
+        )
+      end
+    end
+    context "partial_expand with query string" do
+      subject {
+        Addressable::Template.new("http://example.com/{?two,one}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand("one" => "1").pattern).to eq(
+          "http://example.com/?one=1{&two}/"
+        )
+      end
+    end
+    context "partial_expand with path operator" do
+      subject {
+        Addressable::Template.new("http://example.com{/one,two}/")
+      }
+      it "builds a new pattern" do
+        expect(subject.partial_expand("one" => "1").pattern).to eq(
+          "http://example.com/1{/two}/"
+        )
+      end
+    end
+  end
+  context "Matching with operators" do
+    describe "Level 1:" do
+      subject { Addressable::Template.new("foo{foo}/{bar}baz") }
+      it "can match" do
+        data = subject.match("foofoo/bananabaz")
+        expect(data.mapping["foo"]).to eq("foo")
+        expect(data.mapping["bar"]).to eq("banana")
+      end
+      it "can fail" do
+        expect(subject.match("bar/foo")).to be_nil
+        expect(subject.match("foobaz")).to be_nil
+      end
+      it "can match empty" do
+        data = subject.match("foo/baz")
+        expect(data.mapping["foo"]).to eq(nil)
+        expect(data.mapping["bar"]).to eq(nil)
+      end
+      it "lists vars" do
+        expect(subject.variables).to eq(["foo", "bar"])
+      end
+    end
+
+    describe "Level 2:" do
+      subject { Addressable::Template.new("foo{+foo}{#bar}baz") }
+      it "can match" do
+        data = subject.match("foo/test/banana#bazbaz")
+        expect(data.mapping["foo"]).to eq("/test/banana")
+        expect(data.mapping["bar"]).to eq("baz")
+      end
+      it "can match empty level 2 #" do
+        data = subject.match("foo/test/bananabaz")
+        expect(data.mapping["foo"]).to eq("/test/banana")
+        expect(data.mapping["bar"]).to eq(nil)
+        data = subject.match("foo/test/banana#baz")
+        expect(data.mapping["foo"]).to eq("/test/banana")
+        expect(data.mapping["bar"]).to eq("")
+      end
+      it "can match empty level 2 +" do
+        data = subject.match("foobaz")
+        expect(data.mapping["foo"]).to eq(nil)
+        expect(data.mapping["bar"]).to eq(nil)
+        data = subject.match("foo#barbaz")
+        expect(data.mapping["foo"]).to eq(nil)
+        expect(data.mapping["bar"]).to eq("bar")
+      end
+      it "lists vars" do
+        expect(subject.variables).to eq(["foo", "bar"])
+      end
+    end
+
+    describe "Level 3:" do
+      context "no operator" do
+        subject { Addressable::Template.new("foo{foo,bar}baz") }
+        it "can match" do
+          data = subject.match("foofoo,barbaz")
+          expect(data.mapping["foo"]).to eq("foo")
+          expect(data.mapping["bar"]).to eq("bar")
+        end
+        it "lists vars" do
+          expect(subject.variables).to eq(["foo", "bar"])
+        end
+      end
+      context "+ operator" do
+        subject { Addressable::Template.new("foo{+foo,bar}baz") }
+        it "can match" do
+          data = subject.match("foofoo/bar,barbaz")
+          expect(data.mapping["bar"]).to eq("foo/bar,bar")
+          expect(data.mapping["foo"]).to eq("")
+        end
+        it "lists vars" do
+          expect(subject.variables).to eq(["foo", "bar"])
+        end
+      end
+      context ". operator" do
+        subject { Addressable::Template.new("foo{.foo,bar}baz") }
+        it "can match" do
+          data = subject.match("foo.foo.barbaz")
+          expect(data.mapping["foo"]).to eq("foo")
+          expect(data.mapping["bar"]).to eq("bar")
+        end
+        it "lists vars" do
+          expect(subject.variables).to eq(["foo", "bar"])
+        end
+      end
+      context "/ operator" do
+        subject { Addressable::Template.new("foo{/foo,bar}baz") }
+        it "can match" do
+          data = subject.match("foo/foo/barbaz")
+          expect(data.mapping["foo"]).to eq("foo")
+          expect(data.mapping["bar"]).to eq("bar")
+        end
+        it "lists vars" do
+          expect(subject.variables).to eq(["foo", "bar"])
+        end
+      end
+      context "; operator" do
+        subject { Addressable::Template.new("foo{;foo,bar,baz}baz") }
+        it "can match" do
+          data = subject.match("foo;foo=bar%20baz;bar=foo;bazbaz")
+          expect(data.mapping["foo"]).to eq("bar baz")
+          expect(data.mapping["bar"]).to eq("foo")
+          expect(data.mapping["baz"]).to eq("")
+        end
+        it "lists vars" do
+          expect(subject.variables).to eq(%w(foo bar baz))
+        end
+      end
+      context "? operator" do
+        context "test" do
+          subject { Addressable::Template.new("foo{?foo,bar}baz") }
+          it "can match" do
+            data = subject.match("foo?foo=bar%20baz&bar=foobaz")
+            expect(data.mapping["foo"]).to eq("bar baz")
+            expect(data.mapping["bar"]).to eq("foo")
+          end
+          it "lists vars" do
+            expect(subject.variables).to eq(%w(foo bar))
+          end
+        end
+
+        context "issue #137" do
+          subject { Addressable::Template.new('/path{?page,per_page}') }
+
+          it "can match empty" do
+            data = subject.match("/path")
+            expect(data.mapping["page"]).to eq(nil)
+            expect(data.mapping["per_page"]).to eq(nil)
+            expect(data.mapping.keys.sort).to eq(['page', 'per_page'])
+          end
+
+          it "can match first var" do
+            data = subject.match("/path?page=1")
+            expect(data.mapping["page"]).to eq("1")
+            expect(data.mapping["per_page"]).to eq(nil)
+            expect(data.mapping.keys.sort).to eq(['page', 'per_page'])
+          end
+
+          it "can match second var" do
+            data = subject.match("/path?per_page=1")
+            expect(data.mapping["page"]).to eq(nil)
+            expect(data.mapping["per_page"]).to eq("1")
+            expect(data.mapping.keys.sort).to eq(['page', 'per_page'])
+          end
+
+          it "can match both vars" do
+            data = subject.match("/path?page=2&per_page=1")
+            expect(data.mapping["page"]).to eq("2")
+            expect(data.mapping["per_page"]).to eq("1")
+            expect(data.mapping.keys.sort).to eq(['page', 'per_page'])
+          end
+        end
+
+        context "issue #71" do
+          subject { Addressable::Template.new("http://cyberscore.dev/api/users{?username}") }
+          it "can match" do
+            data = subject.match("http://cyberscore.dev/api/users?username=foobaz")
+            expect(data.mapping["username"]).to eq("foobaz")
+          end
+          it "lists vars" do
+            expect(subject.variables).to eq(%w(username))
+            expect(subject.keys).to eq(%w(username))
+          end
+        end
+      end
+      context "& operator" do
+        subject { Addressable::Template.new("foo{&foo,bar}baz") }
+        it "can match" do
+          data = subject.match("foo&foo=bar%20baz&bar=foobaz")
+          expect(data.mapping["foo"]).to eq("bar baz")
+          expect(data.mapping["bar"]).to eq("foo")
+        end
+        it "lists vars" do
+          expect(subject.variables).to eq(%w(foo bar))
+        end
+      end
+    end
+  end
+
+  context "support regexes:" do
+    context "EXPRESSION" do
+      subject { Addressable::Template::EXPRESSION }
+      it "should be able to match an expression" do
+        expect(subject).to match("{foo}")
+        expect(subject).to match("{foo,9}")
+        expect(subject).to match("{foo.bar,baz}")
+        expect(subject).to match("{+foo.bar,baz}")
+        expect(subject).to match("{foo,foo%20bar}")
+        expect(subject).to match("{#foo:20,baz*}")
+        expect(subject).to match("stuff{#foo:20,baz*}things")
+      end
+      it "should fail on non vars" do
+        expect(subject).not_to match("!{foo")
+        expect(subject).not_to match("{foo.bar.}")
+        expect(subject).not_to match("!{}")
+      end
+    end
+    context "VARNAME" do
+      subject { Addressable::Template::VARNAME }
+      it "should be able to match a variable" do
+        expect(subject).to match("foo")
+        expect(subject).to match("9")
+        expect(subject).to match("foo.bar")
+        expect(subject).to match("foo_bar")
+        expect(subject).to match("foo_bar.baz")
+        expect(subject).to match("foo%20bar")
+        expect(subject).to match("foo%20bar.baz")
+      end
+      it "should fail on non vars" do
+        expect(subject).not_to match("!foo")
+        expect(subject).not_to match("foo.bar.")
+        expect(subject).not_to match("foo%2%00bar")
+        expect(subject).not_to match("foo_ba%r")
+        expect(subject).not_to match("foo_bar*")
+        expect(subject).not_to match("foo_bar:20")
+      end
+    end
+    context "VARIABLE_LIST" do
+      subject { Addressable::Template::VARIABLE_LIST }
+      it "should be able to match a variable list" do
+        expect(subject).to match("foo,bar")
+        expect(subject).to match("foo")
+        expect(subject).to match("foo,bar*,baz")
+        expect(subject).to match("foo.bar,bar_baz*,baz:12")
+      end
+      it "should fail on non vars" do
+        expect(subject).not_to match(",foo,bar*,baz")
+        expect(subject).not_to match("foo,*bar,baz")
+        expect(subject).not_to match("foo,,bar*,baz")
+      end
+    end
+    context "VARSPEC" do
+      subject { Addressable::Template::VARSPEC }
+      it "should be able to match a variable with modifier" do
+        expect(subject).to match("9:8")
+        expect(subject).to match("foo.bar*")
+        expect(subject).to match("foo_bar:12")
+        expect(subject).to match("foo_bar.baz*")
+        expect(subject).to match("foo%20bar:12")
+        expect(subject).to match("foo%20bar.baz*")
+      end
+      it "should fail on non vars" do
+        expect(subject).not_to match("!foo")
+        expect(subject).not_to match("*foo")
+        expect(subject).not_to match("fo*o")
+        expect(subject).not_to match("fo:o")
+        expect(subject).not_to match("foo:")
+      end
+    end
+  end
+end
+
+describe Addressable::Template::MatchData do
+  let(:template) { Addressable::Template.new('{foo}/{bar}') }
+  subject(:its) { template.match('ab/cd') }
+  its(:uri) { should == Addressable::URI.parse('ab/cd') }
+  its(:template) { should == template }
+  its(:mapping) { should == { 'foo' => 'ab', 'bar' => 'cd' } }
+  its(:variables) { should == ['foo', 'bar'] }
+  its(:keys) { should == ['foo', 'bar'] }
+  its(:names) { should == ['foo', 'bar'] }
+  its(:values) { should == ['ab', 'cd'] }
+  its(:captures) { should == ['ab', 'cd'] }
+  its(:to_a) { should == ['ab/cd', 'ab', 'cd'] }
+  its(:to_s) { should == 'ab/cd' }
+  its(:string) { should == its.to_s }
+  its(:pre_match) { should == "" }
+  its(:post_match) { should == "" }
+
+  describe 'values_at' do
+    it 'returns an array with the values' do
+      expect(its.values_at(0, 2)).to eq(['ab/cd', 'cd'])
+    end
+    it 'allows mixing integer an string keys' do
+      expect(its.values_at('foo', 1)).to eq(['ab', 'ab'])
+    end
+    it 'accepts unknown keys' do
+      expect(its.values_at('baz', 'foo')).to eq([nil, 'ab'])
+    end
+  end
+
+  describe '[]' do
+    context 'string key' do
+      it 'returns the corresponding capture' do
+        expect(its['foo']).to eq('ab')
+        expect(its['bar']).to eq('cd')
+      end
+      it 'returns nil for unknown keys' do
+        expect(its['baz']).to be_nil
+      end
+    end
+    context 'symbol key' do
+      it 'returns the corresponding capture' do
+        expect(its[:foo]).to eq('ab')
+        expect(its[:bar]).to eq('cd')
+      end
+      it 'returns nil for unknown keys' do
+        expect(its[:baz]).to be_nil
+      end
+    end
+    context 'integer key' do
+      it 'returns the full URI for index 0' do
+        expect(its[0]).to eq('ab/cd')
+      end
+      it 'returns the corresponding capture' do
+        expect(its[1]).to eq('ab')
+        expect(its[2]).to eq('cd')
+      end
+      it 'returns nil for unknown keys' do
+        expect(its[3]).to be_nil
+      end
+    end
+    context 'other key' do
+      it 'raises an exception' do
+        expect { its[Object.new] }.to raise_error(TypeError)
+      end
+    end
+    context 'with length' do
+      it 'returns an array starting at index with given length' do
+        expect(its[0, 2]).to eq(['ab/cd', 'ab'])
+        expect(its[2, 1]).to eq(['cd'])
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb
new file mode 100644
index 0000000..9a15c28
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb
@@ -0,0 +1,6468 @@
+# coding: utf-8
+# Copyright (C) Bob Aman
+#
+#    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.
+
+
+require "spec_helper"
+
+require "addressable/uri"
+require "uri"
+require "ipaddr"
+
+if !"".respond_to?("force_encoding")
+  class String
+    def force_encoding(encoding)
+      @encoding = encoding
+    end
+
+    def encoding
+      @encoding ||= Encoding::ASCII_8BIT
+    end
+  end
+
+  class Encoding
+    def initialize(name)
+      @name = name
+    end
+
+    def to_s
+      return @name
+    end
+
+    UTF_8 = Encoding.new("UTF-8")
+    ASCII_8BIT = Encoding.new("US-ASCII")
+  end
+end
+
+module Fake
+  module URI
+    class HTTP
+      def initialize(uri)
+        @uri = uri
+      end
+
+      def to_s
+        return @uri.to_s
+      end
+
+      alias :to_str :to_s
+    end
+  end
+end
+
+describe Addressable::URI, "when created with a non-numeric port number" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:port => "bogus")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when created with a invalid encoded port number" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:port => "%eb")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when created with a non-string scheme" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:scheme => :bogus)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when created with a non-string user" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:user => :bogus)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when created with a non-string password" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:password => :bogus)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when created with a non-string userinfo" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:userinfo => :bogus)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when created with a non-string host" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:host => :bogus)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when created with a non-string authority" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:authority => :bogus)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when created with a non-string path" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:path => :bogus)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when created with a non-string query" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:query => :bogus)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when created with a non-string fragment" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:fragment => :bogus)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when created with a scheme but no hierarchical " +
+    "segment" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.parse("http:")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "quote handling" do
+  describe 'in host name' do
+    it "should raise an error for single quote" do
+      expect(lambda do
+        Addressable::URI.parse("http://local\"host/")
+      end).to raise_error(Addressable::URI::InvalidURIError)
+    end
+  end
+end
+
+describe Addressable::URI, "newline normalization" do
+  it "should not accept newlines in scheme" do
+    expect(lambda do
+      Addressable::URI.parse("ht%0atp://localhost/")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should not unescape newline in path" do
+    uri = Addressable::URI.parse("http://localhost/%0a").normalize
+    expect(uri.to_s).to eq("http://localhost/%0A")
+  end
+
+  it "should not unescape newline in hostname" do
+    uri = Addressable::URI.parse("http://local%0ahost/").normalize
+    expect(uri.to_s).to eq("http://local%0Ahost/")
+  end
+
+  it "should not unescape newline in username" do
+    uri = Addressable::URI.parse("http://foo%0abar@localhost/").normalize
+    expect(uri.to_s).to eq("http://foo%0Abar@localhost/")
+  end
+
+  it "should not unescape newline in username" do
+    uri = Addressable::URI.parse("http://example:foo%0abar@example/").normalize
+    expect(uri.to_s).to eq("http://example:foo%0Abar@example/")
+  end
+
+  it "should not accept newline in hostname" do
+    uri = Addressable::URI.parse("http://localhost/")
+    expect(lambda do
+      uri.host = "local\nhost"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when created with ambiguous path" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.parse("::http")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when created with an invalid host" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:host => "<invalid>")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when created with a host consisting of " +
+    "sub-delims characters" do
+  it "should not raise an error" do
+    expect(lambda do
+      Addressable::URI.new(
+        :host => Addressable::URI::CharacterClasses::SUB_DELIMS.gsub(/\\/, '')
+      )
+    end).not_to raise_error
+  end
+end
+
+describe Addressable::URI, "when created with a host consisting of " +
+    "unreserved characters" do
+  it "should not raise an error" do
+    expect(lambda do
+      Addressable::URI.new(
+        :host => Addressable::URI::CharacterClasses::UNRESERVED.gsub(/\\/, '')
+      )
+    end).not_to raise_error
+  end
+end
+
+describe Addressable::URI, "when created from nil components" do
+  before do
+    @uri = Addressable::URI.new
+  end
+
+  it "should have a nil site value" do
+    expect(@uri.site).to eq(nil)
+  end
+
+  it "should have an empty path" do
+    expect(@uri.path).to eq("")
+  end
+
+  it "should be an empty uri" do
+    expect(@uri.to_s).to eq("")
+  end
+
+  it "should have a nil default port" do
+    expect(@uri.default_port).to eq(nil)
+  end
+
+  it "should be empty" do
+    expect(@uri).to be_empty
+  end
+
+  it "should raise an error if the scheme is set to whitespace" do
+    expect(lambda do
+      @uri.scheme = "\t \n"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if the scheme is set to all digits" do
+    expect(lambda do
+      @uri.scheme = "123"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if the scheme begins with a digit" do
+    expect(lambda do
+      @uri.scheme = "1scheme"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if the scheme begins with a plus" do
+    expect(lambda do
+      @uri.scheme = "+scheme"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if the scheme begins with a dot" do
+    expect(lambda do
+      @uri.scheme = ".scheme"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if the scheme begins with a dash" do
+    expect(lambda do
+      @uri.scheme = "-scheme"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if the scheme contains an illegal character" do
+    expect(lambda do
+      @uri.scheme = "scheme!"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if the scheme contains whitespace" do
+    expect(lambda do
+      @uri.scheme = "sch eme"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if the scheme contains a newline" do
+    expect(lambda do
+      @uri.scheme = "sch\neme"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if set into an invalid state" do
+    expect(lambda do
+      @uri.user = "user"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if set into an invalid state" do
+    expect(lambda do
+      @uri.password = "pass"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if set into an invalid state" do
+    expect(lambda do
+      @uri.scheme = "http"
+      @uri.fragment = "fragment"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should raise an error if set into an invalid state" do
+    expect(lambda do
+      @uri.fragment = "fragment"
+      @uri.scheme = "http"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when initialized from individual components" do
+  before do
+    @uri = Addressable::URI.new(
+      :scheme => "http",
+      :user => "user",
+      :password => "password",
+      :host => "example.com",
+      :port => 8080,
+      :path => "/path",
+      :query => "query=value",
+      :fragment => "fragment"
+    )
+  end
+
+  it "returns 'http' for #scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "returns 'http' for #normalized_scheme" do
+    expect(@uri.normalized_scheme).to eq("http")
+  end
+
+  it "returns 'user' for #user" do
+    expect(@uri.user).to eq("user")
+  end
+
+  it "returns 'user' for #normalized_user" do
+    expect(@uri.normalized_user).to eq("user")
+  end
+
+  it "returns 'password' for #password" do
+    expect(@uri.password).to eq("password")
+  end
+
+  it "returns 'password' for #normalized_password" do
+    expect(@uri.normalized_password).to eq("password")
+  end
+
+  it "returns 'user:password' for #userinfo" do
+    expect(@uri.userinfo).to eq("user:password")
+  end
+
+  it "returns 'user:password' for #normalized_userinfo" do
+    expect(@uri.normalized_userinfo).to eq("user:password")
+  end
+
+  it "returns 'example.com' for #host" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "returns 'example.com' for #normalized_host" do
+    expect(@uri.normalized_host).to eq("example.com")
+  end
+
+  it "returns 'com' for #tld" do
+    expect(@uri.tld).to eq("com")
+  end
+
+  it "returns 'user:password@example.com:8080' for #authority" do
+    expect(@uri.authority).to eq("user:password@example.com:8080")
+  end
+
+  it "returns 'user:password@example.com:8080' for #normalized_authority" do
+    expect(@uri.normalized_authority).to eq("user:password@example.com:8080")
+  end
+
+  it "returns 8080 for #port" do
+    expect(@uri.port).to eq(8080)
+  end
+
+  it "returns 8080 for #normalized_port" do
+    expect(@uri.normalized_port).to eq(8080)
+  end
+
+  it "returns 80 for #default_port" do
+    expect(@uri.default_port).to eq(80)
+  end
+
+  it "returns 'http://user:password@example.com:8080' for #site" do
+    expect(@uri.site).to eq("http://user:password@example.com:8080")
+  end
+
+  it "returns 'http://user:password@example.com:8080' for #normalized_site" do
+    expect(@uri.normalized_site).to eq("http://user:password@example.com:8080")
+  end
+
+  it "returns '/path' for #path" do
+    expect(@uri.path).to eq("/path")
+  end
+
+  it "returns '/path' for #normalized_path" do
+    expect(@uri.normalized_path).to eq("/path")
+  end
+
+  it "returns 'query=value' for #query" do
+    expect(@uri.query).to eq("query=value")
+  end
+
+  it "returns 'query=value' for #normalized_query" do
+    expect(@uri.normalized_query).to eq("query=value")
+  end
+
+  it "returns 'fragment' for #fragment" do
+    expect(@uri.fragment).to eq("fragment")
+  end
+
+  it "returns 'fragment' for #normalized_fragment" do
+    expect(@uri.normalized_fragment).to eq("fragment")
+  end
+
+  it "returns #hash" do
+    expect(@uri.hash).not_to be nil
+  end
+
+  it "returns #to_s" do
+    expect(@uri.to_s).to eq(
+      "http://user:password@example.com:8080/path?query=value#fragment"
+    )
+  end
+
+  it "should not be empty" do
+    expect(@uri).not_to be_empty
+  end
+
+  it "should not be frozen" do
+    expect(@uri).not_to be_frozen
+  end
+
+  it "should allow destructive operations" do
+    expect { @uri.normalize! }.not_to raise_error
+  end
+end
+
+describe Addressable::URI, "when initialized from " +
+    "frozen individual components" do
+  before do
+    @uri = Addressable::URI.new(
+      :scheme => "http".freeze,
+      :user => "user".freeze,
+      :password => "password".freeze,
+      :host => "example.com".freeze,
+      :port => "8080".freeze,
+      :path => "/path".freeze,
+      :query => "query=value".freeze,
+      :fragment => "fragment".freeze
+    )
+  end
+
+  it "returns 'http' for #scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "returns 'http' for #normalized_scheme" do
+    expect(@uri.normalized_scheme).to eq("http")
+  end
+
+  it "returns 'user' for #user" do
+    expect(@uri.user).to eq("user")
+  end
+
+  it "returns 'user' for #normalized_user" do
+    expect(@uri.normalized_user).to eq("user")
+  end
+
+  it "returns 'password' for #password" do
+    expect(@uri.password).to eq("password")
+  end
+
+  it "returns 'password' for #normalized_password" do
+    expect(@uri.normalized_password).to eq("password")
+  end
+
+  it "returns 'user:password' for #userinfo" do
+    expect(@uri.userinfo).to eq("user:password")
+  end
+
+  it "returns 'user:password' for #normalized_userinfo" do
+    expect(@uri.normalized_userinfo).to eq("user:password")
+  end
+
+  it "returns 'example.com' for #host" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "returns 'example.com' for #normalized_host" do
+    expect(@uri.normalized_host).to eq("example.com")
+  end
+
+  it "returns 'user:password@example.com:8080' for #authority" do
+    expect(@uri.authority).to eq("user:password@example.com:8080")
+  end
+
+  it "returns 'user:password@example.com:8080' for #normalized_authority" do
+    expect(@uri.normalized_authority).to eq("user:password@example.com:8080")
+  end
+
+  it "returns 8080 for #port" do
+    expect(@uri.port).to eq(8080)
+  end
+
+  it "returns 8080 for #normalized_port" do
+    expect(@uri.normalized_port).to eq(8080)
+  end
+
+  it "returns 80 for #default_port" do
+    expect(@uri.default_port).to eq(80)
+  end
+
+  it "returns 'http://user:password@example.com:8080' for #site" do
+    expect(@uri.site).to eq("http://user:password@example.com:8080")
+  end
+
+  it "returns 'http://user:password@example.com:8080' for #normalized_site" do
+    expect(@uri.normalized_site).to eq("http://user:password@example.com:8080")
+  end
+
+  it "returns '/path' for #path" do
+    expect(@uri.path).to eq("/path")
+  end
+
+  it "returns '/path' for #normalized_path" do
+    expect(@uri.normalized_path).to eq("/path")
+  end
+
+  it "returns 'query=value' for #query" do
+    expect(@uri.query).to eq("query=value")
+  end
+
+  it "returns 'query=value' for #normalized_query" do
+    expect(@uri.normalized_query).to eq("query=value")
+  end
+
+  it "returns 'fragment' for #fragment" do
+    expect(@uri.fragment).to eq("fragment")
+  end
+
+  it "returns 'fragment' for #normalized_fragment" do
+    expect(@uri.normalized_fragment).to eq("fragment")
+  end
+
+  it "returns #hash" do
+    expect(@uri.hash).not_to be nil
+  end
+
+  it "returns #to_s" do
+    expect(@uri.to_s).to eq(
+      "http://user:password@example.com:8080/path?query=value#fragment"
+    )
+  end
+
+  it "should not be empty" do
+    expect(@uri).not_to be_empty
+  end
+
+  it "should not be frozen" do
+    expect(@uri).not_to be_frozen
+  end
+
+  it "should allow destructive operations" do
+    expect { @uri.normalize! }.not_to raise_error
+  end
+end
+
+describe Addressable::URI, "when parsed from a frozen string" do
+  before do
+    @uri = Addressable::URI.parse(
+      "http://user:password@example.com:8080/path?query=value#fragment".freeze
+    )
+  end
+
+  it "returns 'http' for #scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "returns 'http' for #normalized_scheme" do
+    expect(@uri.normalized_scheme).to eq("http")
+  end
+
+  it "returns 'user' for #user" do
+    expect(@uri.user).to eq("user")
+  end
+
+  it "returns 'user' for #normalized_user" do
+    expect(@uri.normalized_user).to eq("user")
+  end
+
+  it "returns 'password' for #password" do
+    expect(@uri.password).to eq("password")
+  end
+
+  it "returns 'password' for #normalized_password" do
+    expect(@uri.normalized_password).to eq("password")
+  end
+
+  it "returns 'user:password' for #userinfo" do
+    expect(@uri.userinfo).to eq("user:password")
+  end
+
+  it "returns 'user:password' for #normalized_userinfo" do
+    expect(@uri.normalized_userinfo).to eq("user:password")
+  end
+
+  it "returns 'example.com' for #host" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "returns 'example.com' for #normalized_host" do
+    expect(@uri.normalized_host).to eq("example.com")
+  end
+
+  it "returns 'user:password@example.com:8080' for #authority" do
+    expect(@uri.authority).to eq("user:password@example.com:8080")
+  end
+
+  it "returns 'user:password@example.com:8080' for #normalized_authority" do
+    expect(@uri.normalized_authority).to eq("user:password@example.com:8080")
+  end
+
+  it "returns 8080 for #port" do
+    expect(@uri.port).to eq(8080)
+  end
+
+  it "returns 8080 for #normalized_port" do
+    expect(@uri.normalized_port).to eq(8080)
+  end
+
+  it "returns 80 for #default_port" do
+    expect(@uri.default_port).to eq(80)
+  end
+
+  it "returns 'http://user:password@example.com:8080' for #site" do
+    expect(@uri.site).to eq("http://user:password@example.com:8080")
+  end
+
+  it "returns 'http://user:password@example.com:8080' for #normalized_site" do
+    expect(@uri.normalized_site).to eq("http://user:password@example.com:8080")
+  end
+
+  it "returns '/path' for #path" do
+    expect(@uri.path).to eq("/path")
+  end
+
+  it "returns '/path' for #normalized_path" do
+    expect(@uri.normalized_path).to eq("/path")
+  end
+
+  it "returns 'query=value' for #query" do
+    expect(@uri.query).to eq("query=value")
+  end
+
+  it "returns 'query=value' for #normalized_query" do
+    expect(@uri.normalized_query).to eq("query=value")
+  end
+
+  it "returns 'fragment' for #fragment" do
+    expect(@uri.fragment).to eq("fragment")
+  end
+
+  it "returns 'fragment' for #normalized_fragment" do
+    expect(@uri.normalized_fragment).to eq("fragment")
+  end
+
+  it "returns #hash" do
+    expect(@uri.hash).not_to be nil
+  end
+
+  it "returns #to_s" do
+    expect(@uri.to_s).to eq(
+      "http://user:password@example.com:8080/path?query=value#fragment"
+    )
+  end
+
+  it "should not be empty" do
+    expect(@uri).not_to be_empty
+  end
+
+  it "should not be frozen" do
+    expect(@uri).not_to be_frozen
+  end
+
+  it "should allow destructive operations" do
+    expect { @uri.normalize! }.not_to raise_error
+  end
+end
+
+describe Addressable::URI, "when frozen" do
+  before do
+    @uri = Addressable::URI.new.freeze
+  end
+
+  it "returns nil for #scheme" do
+    expect(@uri.scheme).to eq(nil)
+  end
+
+  it "returns nil for #normalized_scheme" do
+    expect(@uri.normalized_scheme).to eq(nil)
+  end
+
+  it "returns nil for #user" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "returns nil for #normalized_user" do
+    expect(@uri.normalized_user).to eq(nil)
+  end
+
+  it "returns nil for #password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "returns nil for #normalized_password" do
+    expect(@uri.normalized_password).to eq(nil)
+  end
+
+  it "returns nil for #userinfo" do
+    expect(@uri.userinfo).to eq(nil)
+  end
+
+  it "returns nil for #normalized_userinfo" do
+    expect(@uri.normalized_userinfo).to eq(nil)
+  end
+
+  it "returns nil for #host" do
+    expect(@uri.host).to eq(nil)
+  end
+
+  it "returns nil for #normalized_host" do
+    expect(@uri.normalized_host).to eq(nil)
+  end
+
+  it "returns nil for #authority" do
+    expect(@uri.authority).to eq(nil)
+  end
+
+  it "returns nil for #normalized_authority" do
+    expect(@uri.normalized_authority).to eq(nil)
+  end
+
+  it "returns nil for #port" do
+    expect(@uri.port).to eq(nil)
+  end
+
+  it "returns nil for #normalized_port" do
+    expect(@uri.normalized_port).to eq(nil)
+  end
+
+  it "returns nil for #default_port" do
+    expect(@uri.default_port).to eq(nil)
+  end
+
+  it "returns nil for #site" do
+    expect(@uri.site).to eq(nil)
+  end
+
+  it "returns nil for #normalized_site" do
+    expect(@uri.normalized_site).to eq(nil)
+  end
+
+  it "returns '' for #path" do
+    expect(@uri.path).to eq('')
+  end
+
+  it "returns '' for #normalized_path" do
+    expect(@uri.normalized_path).to eq('')
+  end
+
+  it "returns nil for #query" do
+    expect(@uri.query).to eq(nil)
+  end
+
+  it "returns nil for #normalized_query" do
+    expect(@uri.normalized_query).to eq(nil)
+  end
+
+  it "returns nil for #fragment" do
+    expect(@uri.fragment).to eq(nil)
+  end
+
+  it "returns nil for #normalized_fragment" do
+    expect(@uri.normalized_fragment).to eq(nil)
+  end
+
+  it "returns #hash" do
+    expect(@uri.hash).not_to be nil
+  end
+
+  it "returns #to_s" do
+    expect(@uri.to_s).to eq('')
+  end
+
+  it "should be empty" do
+    expect(@uri).to be_empty
+  end
+
+  it "should be frozen" do
+    expect(@uri).to be_frozen
+  end
+
+  it "should not be frozen after duping" do
+    expect(@uri.dup).not_to be_frozen
+  end
+
+  it "should not allow destructive operations" do
+    expect { @uri.normalize! }.to raise_error { |error|
+      expect(error.message).to match(/can't modify frozen/)
+      expect(error).to satisfy { |e| RuntimeError === e || TypeError === e }
+    }
+  end
+end
+
+describe Addressable::URI, "when frozen" do
+  before do
+    @uri = Addressable::URI.parse(
+      "HTTP://example.com.:%38%30/%70a%74%68?a=%31#1%323"
+    ).freeze
+  end
+
+  it "returns 'HTTP' for #scheme" do
+    expect(@uri.scheme).to eq("HTTP")
+  end
+
+  it "returns 'http' for #normalized_scheme" do
+    expect(@uri.normalized_scheme).to eq("http")
+    expect(@uri.normalize.scheme).to eq("http")
+  end
+
+  it "returns nil for #user" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "returns nil for #normalized_user" do
+    expect(@uri.normalized_user).to eq(nil)
+  end
+
+  it "returns nil for #password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "returns nil for #normalized_password" do
+    expect(@uri.normalized_password).to eq(nil)
+  end
+
+  it "returns nil for #userinfo" do
+    expect(@uri.userinfo).to eq(nil)
+  end
+
+  it "returns nil for #normalized_userinfo" do
+    expect(@uri.normalized_userinfo).to eq(nil)
+  end
+
+  it "returns 'example.com.' for #host" do
+    expect(@uri.host).to eq("example.com.")
+  end
+
+  it "returns nil for #normalized_host" do
+    expect(@uri.normalized_host).to eq("example.com")
+    expect(@uri.normalize.host).to eq("example.com")
+  end
+
+  it "returns 'example.com.:80' for #authority" do
+    expect(@uri.authority).to eq("example.com.:80")
+  end
+
+  it "returns 'example.com:80' for #normalized_authority" do
+    expect(@uri.normalized_authority).to eq("example.com")
+    expect(@uri.normalize.authority).to eq("example.com")
+  end
+
+  it "returns 80 for #port" do
+    expect(@uri.port).to eq(80)
+  end
+
+  it "returns nil for #normalized_port" do
+    expect(@uri.normalized_port).to eq(nil)
+    expect(@uri.normalize.port).to eq(nil)
+  end
+
+  it "returns 80 for #default_port" do
+    expect(@uri.default_port).to eq(80)
+  end
+
+  it "returns 'HTTP://example.com.:80' for #site" do
+    expect(@uri.site).to eq("HTTP://example.com.:80")
+  end
+
+  it "returns 'http://example.com' for #normalized_site" do
+    expect(@uri.normalized_site).to eq("http://example.com")
+    expect(@uri.normalize.site).to eq("http://example.com")
+  end
+
+  it "returns '/%70a%74%68' for #path" do
+    expect(@uri.path).to eq("/%70a%74%68")
+  end
+
+  it "returns '/path' for #normalized_path" do
+    expect(@uri.normalized_path).to eq("/path")
+    expect(@uri.normalize.path).to eq("/path")
+  end
+
+  it "returns 'a=%31' for #query" do
+    expect(@uri.query).to eq("a=%31")
+  end
+
+  it "returns 'a=1' for #normalized_query" do
+    expect(@uri.normalized_query).to eq("a=1")
+    expect(@uri.normalize.query).to eq("a=1")
+  end
+
+  it "returns '/%70a%74%68?a=%31' for #request_uri" do
+    expect(@uri.request_uri).to eq("/%70a%74%68?a=%31")
+  end
+
+  it "returns '1%323' for #fragment" do
+    expect(@uri.fragment).to eq("1%323")
+  end
+
+  it "returns '123' for #normalized_fragment" do
+    expect(@uri.normalized_fragment).to eq("123")
+    expect(@uri.normalize.fragment).to eq("123")
+  end
+
+  it "returns #hash" do
+    expect(@uri.hash).not_to be nil
+  end
+
+  it "returns #to_s" do
+    expect(@uri.to_s).to eq('HTTP://example.com.:80/%70a%74%68?a=%31#1%323')
+    expect(@uri.normalize.to_s).to eq('http://example.com/path?a=1#123')
+  end
+
+  it "should not be empty" do
+    expect(@uri).not_to be_empty
+  end
+
+  it "should be frozen" do
+    expect(@uri).to be_frozen
+  end
+
+  it "should not be frozen after duping" do
+    expect(@uri.dup).not_to be_frozen
+  end
+
+  it "should not allow destructive operations" do
+    expect { @uri.normalize! }.to raise_error { |error|
+      expect(error.message).to match(/can't modify frozen/)
+      expect(error).to satisfy { |e| RuntimeError === e || TypeError === e }
+    }
+  end
+end
+
+describe Addressable::URI, "when created from string components" do
+  before do
+    @uri = Addressable::URI.new(
+      :scheme => "http", :host => "example.com"
+    )
+  end
+
+  it "should have a site value of 'http://example.com'" do
+    expect(@uri.site).to eq("http://example.com")
+  end
+
+  it "should be equal to the equivalent parsed URI" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com"))
+  end
+
+  it "should raise an error if invalid components omitted" do
+    expect(lambda do
+      @uri.omit(:bogus)
+    end).to raise_error(ArgumentError)
+    expect(lambda do
+      @uri.omit(:scheme, :bogus, :path)
+    end).to raise_error(ArgumentError)
+  end
+end
+
+describe Addressable::URI, "when created with a nil host but " +
+    "non-nil authority components" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:user => "user", :password => "pass", :port => 80)
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when created with both an authority and a user" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(
+        :user => "user", :authority => "user@example.com:80"
+      )
+    end).to raise_error(ArgumentError)
+  end
+end
+
+describe Addressable::URI, "when created with an authority and no port" do
+  before do
+    @uri = Addressable::URI.new(:authority => "user@example.com")
+  end
+
+  it "should not infer a port" do
+    expect(@uri.port).to eq(nil)
+    expect(@uri.default_port).to eq(nil)
+    expect(@uri.inferred_port).to eq(nil)
+  end
+
+  it "should have a site value of '//user@example.com'" do
+    expect(@uri.site).to eq("//user@example.com")
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+describe Addressable::URI, "when created with a host with trailing dots" do
+  before do
+    @uri = Addressable::URI.new(:authority => "example...")
+  end
+
+  it "should have a stable normalized form" do
+    expect(@uri.normalize.normalize.normalize.host).to eq(
+      @uri.normalize.host
+    )
+  end
+end
+
+describe Addressable::URI, "when created with a host with a backslash" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:authority => "example\\example")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when created with a host with a slash" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:authority => "example/example")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when created with a host with a space" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:authority => "example example")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when created with both a userinfo and a user" do
+  it "should raise an error" do
+    expect(lambda do
+      Addressable::URI.new(:user => "user", :userinfo => "user:pass")
+    end).to raise_error(ArgumentError)
+  end
+end
+
+describe Addressable::URI, "when created with a path that hasn't been " +
+    "prefixed with a '/' but a host specified" do
+  before do
+    @uri = Addressable::URI.new(
+      :scheme => "http", :host => "example.com", :path => "path"
+    )
+  end
+
+  it "should prefix a '/' to the path" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com/path"))
+  end
+
+  it "should have a site value of 'http://example.com'" do
+    expect(@uri.site).to eq("http://example.com")
+  end
+
+  it "should have an origin of 'http://example.com" do
+    expect(@uri.origin).to eq('http://example.com')
+  end
+end
+
+describe Addressable::URI, "when created with a path that hasn't been " +
+    "prefixed with a '/' but no host specified" do
+  before do
+    @uri = Addressable::URI.new(
+      :scheme => "http", :path => "path"
+    )
+  end
+
+  it "should not prefix a '/' to the path" do
+    expect(@uri).to eq(Addressable::URI.parse("http:path"))
+  end
+
+  it "should have a site value of 'http:'" do
+    expect(@uri.site).to eq("http:")
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+describe Addressable::URI, "when parsed from an Addressable::URI object" do
+  it "should not have unexpected side-effects" do
+    original_uri = Addressable::URI.parse("http://example.com/")
+    new_uri = Addressable::URI.parse(original_uri)
+    new_uri.host = 'www.example.com'
+    expect(new_uri.host).to eq('www.example.com')
+    expect(new_uri.to_s).to eq('http://www.example.com/')
+    expect(original_uri.host).to eq('example.com')
+    expect(original_uri.to_s).to eq('http://example.com/')
+  end
+
+  it "should not have unexpected side-effects" do
+    original_uri = Addressable::URI.parse("http://example.com/")
+    new_uri = Addressable::URI.heuristic_parse(original_uri)
+    new_uri.host = 'www.example.com'
+    expect(new_uri.host).to eq('www.example.com')
+    expect(new_uri.to_s).to eq('http://www.example.com/')
+    expect(original_uri.host).to eq('example.com')
+    expect(original_uri.to_s).to eq('http://example.com/')
+  end
+
+  it "should not have unexpected side-effects" do
+    original_uri = Addressable::URI.parse("http://example.com/")
+    new_uri = Addressable::URI.parse(original_uri)
+    new_uri.origin = 'https://www.example.com:8080'
+    expect(new_uri.host).to eq('www.example.com')
+    expect(new_uri.to_s).to eq('https://www.example.com:8080/')
+    expect(original_uri.host).to eq('example.com')
+    expect(original_uri.to_s).to eq('http://example.com/')
+  end
+
+  it "should not have unexpected side-effects" do
+    original_uri = Addressable::URI.parse("http://example.com/")
+    new_uri = Addressable::URI.heuristic_parse(original_uri)
+    new_uri.origin = 'https://www.example.com:8080'
+    expect(new_uri.host).to eq('www.example.com')
+    expect(new_uri.to_s).to eq('https://www.example.com:8080/')
+    expect(original_uri.host).to eq('example.com')
+    expect(original_uri.to_s).to eq('http://example.com/')
+  end
+end
+
+describe Addressable::URI, "when parsed from something that looks " +
+    "like a URI object" do
+  it "should parse without error" do
+    uri = Addressable::URI.parse(Fake::URI::HTTP.new("http://example.com/"))
+    expect(lambda do
+      Addressable::URI.parse(uri)
+    end).not_to raise_error
+  end
+end
+
+describe Addressable::URI, "when parsed from a standard library URI object" do
+  it "should parse without error" do
+    uri = Addressable::URI.parse(URI.parse("http://example.com/"))
+    expect(lambda do
+      Addressable::URI.parse(uri)
+    end).not_to raise_error
+  end
+end
+
+describe Addressable::URI, "when parsed from ''" do
+  before do
+    @uri = Addressable::URI.parse("")
+  end
+
+  it "should have no scheme" do
+    expect(@uri.scheme).to eq(nil)
+  end
+
+  it "should not be considered to be ip-based" do
+    expect(@uri).not_to be_ip_based
+  end
+
+  it "should have a path of ''" do
+    expect(@uri.path).to eq("")
+  end
+
+  it "should have a request URI of '/'" do
+    expect(@uri.request_uri).to eq("/")
+  end
+
+  it "should be considered relative" do
+    expect(@uri).to be_relative
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+# Section 1.1.2 of RFC 3986
+describe Addressable::URI, "when parsed from " +
+    "'ftp://ftp.is.co.za/rfc/rfc1808.txt'" do
+  before do
+    @uri = Addressable::URI.parse("ftp://ftp.is.co.za/rfc/rfc1808.txt")
+  end
+
+  it "should use the 'ftp' scheme" do
+    expect(@uri.scheme).to eq("ftp")
+  end
+
+  it "should be considered to be ip-based" do
+    expect(@uri).to be_ip_based
+  end
+
+  it "should have a host of 'ftp.is.co.za'" do
+    expect(@uri.host).to eq("ftp.is.co.za")
+  end
+
+  it "should have inferred_port of 21" do
+    expect(@uri.inferred_port).to eq(21)
+  end
+
+  it "should have a path of '/rfc/rfc1808.txt'" do
+    expect(@uri.path).to eq("/rfc/rfc1808.txt")
+  end
+
+  it "should not have a request URI" do
+    expect(@uri.request_uri).to eq(nil)
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have an origin of 'ftp://ftp.is.co.za'" do
+    expect(@uri.origin).to eq('ftp://ftp.is.co.za')
+  end
+end
+
+# Section 1.1.2 of RFC 3986
+describe Addressable::URI, "when parsed from " +
+    "'http://www.ietf.org/rfc/rfc2396.txt'" do
+  before do
+    @uri = Addressable::URI.parse("http://www.ietf.org/rfc/rfc2396.txt")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should be considered to be ip-based" do
+    expect(@uri).to be_ip_based
+  end
+
+  it "should have a host of 'www.ietf.org'" do
+    expect(@uri.host).to eq("www.ietf.org")
+  end
+
+  it "should have inferred_port of 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have a path of '/rfc/rfc2396.txt'" do
+    expect(@uri.path).to eq("/rfc/rfc2396.txt")
+  end
+
+  it "should have a request URI of '/rfc/rfc2396.txt'" do
+    expect(@uri.request_uri).to eq("/rfc/rfc2396.txt")
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should correctly omit components" do
+    expect(@uri.omit(:scheme).to_s).to eq("//www.ietf.org/rfc/rfc2396.txt")
+    expect(@uri.omit(:path).to_s).to eq("http://www.ietf.org")
+  end
+
+  it "should correctly omit components destructively" do
+    @uri.omit!(:scheme)
+    expect(@uri.to_s).to eq("//www.ietf.org/rfc/rfc2396.txt")
+  end
+
+  it "should have an origin of 'http://www.ietf.org'" do
+    expect(@uri.origin).to eq('http://www.ietf.org')
+  end
+end
+
+# Section 1.1.2 of RFC 3986
+describe Addressable::URI, "when parsed from " +
+    "'ldap://[2001:db8::7]/c=GB?objectClass?one'" do
+  before do
+    @uri = Addressable::URI.parse("ldap://[2001:db8::7]/c=GB?objectClass?one")
+  end
+
+  it "should use the 'ldap' scheme" do
+    expect(@uri.scheme).to eq("ldap")
+  end
+
+  it "should be considered to be ip-based" do
+    expect(@uri).to be_ip_based
+  end
+
+  it "should have a host of '[2001:db8::7]'" do
+    expect(@uri.host).to eq("[2001:db8::7]")
+  end
+
+  it "should have inferred_port of 389" do
+    expect(@uri.inferred_port).to eq(389)
+  end
+
+  it "should have a path of '/c=GB'" do
+    expect(@uri.path).to eq("/c=GB")
+  end
+
+  it "should not have a request URI" do
+    expect(@uri.request_uri).to eq(nil)
+  end
+
+  it "should not allow request URI assignment" do
+    expect(lambda do
+      @uri.request_uri = "/"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should have a query of 'objectClass?one'" do
+    expect(@uri.query).to eq("objectClass?one")
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should correctly omit components" do
+    expect(@uri.omit(:scheme, :authority).to_s).to eq("/c=GB?objectClass?one")
+    expect(@uri.omit(:path).to_s).to eq("ldap://[2001:db8::7]?objectClass?one")
+  end
+
+  it "should correctly omit components destructively" do
+    @uri.omit!(:scheme, :authority)
+    expect(@uri.to_s).to eq("/c=GB?objectClass?one")
+  end
+
+  it "should raise an error if omission would create an invalid URI" do
+    expect(lambda do
+      @uri.omit(:authority, :path)
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should have an origin of 'ldap://[2001:db8::7]'" do
+    expect(@uri.origin).to eq('ldap://[2001:db8::7]')
+  end
+end
+
+# Section 1.1.2 of RFC 3986
+describe Addressable::URI, "when parsed from " +
+    "'mailto:John.Doe@example.com'" do
+  before do
+    @uri = Addressable::URI.parse("mailto:John.Doe@example.com")
+  end
+
+  it "should use the 'mailto' scheme" do
+    expect(@uri.scheme).to eq("mailto")
+  end
+
+  it "should not be considered to be ip-based" do
+    expect(@uri).not_to be_ip_based
+  end
+
+  it "should not have an inferred_port" do
+    expect(@uri.inferred_port).to eq(nil)
+  end
+
+  it "should have a path of 'John.Doe@example.com'" do
+    expect(@uri.path).to eq("John.Doe@example.com")
+  end
+
+  it "should not have a request URI" do
+    expect(@uri.request_uri).to eq(nil)
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+# Section 2 of RFC 6068
+describe Addressable::URI, "when parsed from " +
+    "'mailto:?to=addr1@an.example,addr2@an.example'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "mailto:?to=addr1@an.example,addr2@an.example"
+    )
+  end
+
+  it "should use the 'mailto' scheme" do
+    expect(@uri.scheme).to eq("mailto")
+  end
+
+  it "should not be considered to be ip-based" do
+    expect(@uri).not_to be_ip_based
+  end
+
+  it "should not have an inferred_port" do
+    expect(@uri.inferred_port).to eq(nil)
+  end
+
+  it "should have a path of ''" do
+    expect(@uri.path).to eq("")
+  end
+
+  it "should not have a request URI" do
+    expect(@uri.request_uri).to eq(nil)
+  end
+
+  it "should have the To: field value parameterized" do
+    expect(@uri.query_values(Hash)["to"]).to eq(
+      "addr1@an.example,addr2@an.example"
+    )
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+# Section 1.1.2 of RFC 3986
+describe Addressable::URI, "when parsed from " +
+    "'news:comp.infosystems.www.servers.unix'" do
+  before do
+    @uri = Addressable::URI.parse("news:comp.infosystems.www.servers.unix")
+  end
+
+  it "should use the 'news' scheme" do
+    expect(@uri.scheme).to eq("news")
+  end
+
+  it "should not have an inferred_port" do
+    expect(@uri.inferred_port).to eq(nil)
+  end
+
+  it "should not be considered to be ip-based" do
+    expect(@uri).not_to be_ip_based
+  end
+
+  it "should have a path of 'comp.infosystems.www.servers.unix'" do
+    expect(@uri.path).to eq("comp.infosystems.www.servers.unix")
+  end
+
+  it "should not have a request URI" do
+    expect(@uri.request_uri).to eq(nil)
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+# Section 1.1.2 of RFC 3986
+describe Addressable::URI, "when parsed from " +
+    "'tel:+1-816-555-1212'" do
+  before do
+    @uri = Addressable::URI.parse("tel:+1-816-555-1212")
+  end
+
+  it "should use the 'tel' scheme" do
+    expect(@uri.scheme).to eq("tel")
+  end
+
+  it "should not be considered to be ip-based" do
+    expect(@uri).not_to be_ip_based
+  end
+
+  it "should not have an inferred_port" do
+    expect(@uri.inferred_port).to eq(nil)
+  end
+
+  it "should have a path of '+1-816-555-1212'" do
+    expect(@uri.path).to eq("+1-816-555-1212")
+  end
+
+  it "should not have a request URI" do
+    expect(@uri.request_uri).to eq(nil)
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+# Section 1.1.2 of RFC 3986
+describe Addressable::URI, "when parsed from " +
+    "'telnet://192.0.2.16:80/'" do
+  before do
+    @uri = Addressable::URI.parse("telnet://192.0.2.16:80/")
+  end
+
+  it "should use the 'telnet' scheme" do
+    expect(@uri.scheme).to eq("telnet")
+  end
+
+  it "should have a host of '192.0.2.16'" do
+    expect(@uri.host).to eq("192.0.2.16")
+  end
+
+  it "should have a port of 80" do
+    expect(@uri.port).to eq(80)
+  end
+
+  it "should have a inferred_port of 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have a default_port of 23" do
+    expect(@uri.default_port).to eq(23)
+  end
+
+  it "should be considered to be ip-based" do
+    expect(@uri).to be_ip_based
+  end
+
+  it "should have a path of '/'" do
+    expect(@uri.path).to eq("/")
+  end
+
+  it "should not have a request URI" do
+    expect(@uri.request_uri).to eq(nil)
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have an origin of 'telnet://192.0.2.16:80'" do
+    expect(@uri.origin).to eq('telnet://192.0.2.16:80')
+  end
+end
+
+# Section 1.1.2 of RFC 3986
+describe Addressable::URI, "when parsed from " +
+    "'urn:oasis:names:specification:docbook:dtd:xml:4.1.2'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "urn:oasis:names:specification:docbook:dtd:xml:4.1.2")
+  end
+
+  it "should use the 'urn' scheme" do
+    expect(@uri.scheme).to eq("urn")
+  end
+
+  it "should not have an inferred_port" do
+    expect(@uri.inferred_port).to eq(nil)
+  end
+
+  it "should not be considered to be ip-based" do
+    expect(@uri).not_to be_ip_based
+  end
+
+  it "should have a path of " +
+      "'oasis:names:specification:docbook:dtd:xml:4.1.2'" do
+    expect(@uri.path).to eq("oasis:names:specification:docbook:dtd:xml:4.1.2")
+  end
+
+  it "should not have a request URI" do
+    expect(@uri.request_uri).to eq(nil)
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+describe Addressable::URI, "when heuristically parsed from " +
+    "'192.0.2.16:8000/path'" do
+  before do
+    @uri = Addressable::URI.heuristic_parse("192.0.2.16:8000/path")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have a host of '192.0.2.16'" do
+    expect(@uri.host).to eq("192.0.2.16")
+  end
+
+  it "should have a port of '8000'" do
+    expect(@uri.port).to eq(8000)
+  end
+
+  it "should be considered to be ip-based" do
+    expect(@uri).to be_ip_based
+  end
+
+  it "should have a path of '/path'" do
+    expect(@uri.path).to eq("/path")
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have an origin of 'http://192.0.2.16:8000'" do
+    expect(@uri.origin).to eq('http://192.0.2.16:8000')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com")
+  end
+
+  it "when inspected, should have the correct URI" do
+    expect(@uri.inspect).to include("http://example.com")
+  end
+
+  it "when inspected, should have the correct class name" do
+    expect(@uri.inspect).to include("Addressable::URI")
+  end
+
+  it "when inspected, should have the correct object id" do
+    expect(@uri.inspect).to include("%#0x" % @uri.object_id)
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should be considered to be ip-based" do
+    expect(@uri).to be_ip_based
+  end
+
+  it "should have an authority segment of 'example.com'" do
+    expect(@uri.authority).to eq("example.com")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should be considered ip-based" do
+    expect(@uri).to be_ip_based
+  end
+
+  it "should have no username" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should not have a specified port" do
+    expect(@uri.port).to eq(nil)
+  end
+
+  it "should have an empty path" do
+    expect(@uri.path).to eq("")
+  end
+
+  it "should have no query string" do
+    expect(@uri.query).to eq(nil)
+    expect(@uri.query_values).to eq(nil)
+  end
+
+  it "should have a request URI of '/'" do
+    expect(@uri.request_uri).to eq("/")
+  end
+
+  it "should have no fragment" do
+    expect(@uri.fragment).to eq(nil)
+  end
+
+  it "should be considered absolute" do
+    expect(@uri).to be_absolute
+  end
+
+  it "should not be considered relative" do
+    expect(@uri).not_to be_relative
+  end
+
+  it "should not be exactly equal to 42" do
+    expect(@uri.eql?(42)).to eq(false)
+  end
+
+  it "should not be equal to 42" do
+    expect(@uri == 42).to eq(false)
+  end
+
+  it "should not be roughly equal to 42" do
+    expect(@uri === 42).to eq(false)
+  end
+
+  it "should be exactly equal to http://example.com" do
+    expect(@uri.eql?(Addressable::URI.parse("http://example.com"))).to eq(true)
+  end
+
+  it "should be roughly equal to http://example.com/" do
+    expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true)
+  end
+
+  it "should be roughly equal to the string 'http://example.com/'" do
+    expect(@uri === "http://example.com/").to eq(true)
+  end
+
+  it "should not be roughly equal to the string " +
+      "'http://example.com:bogus/'" do
+    expect(lambda do
+      expect(@uri === "http://example.com:bogus/").to eq(false)
+    end).not_to raise_error
+  end
+
+  it "should result in itself when joined with itself" do
+    expect(@uri.join(@uri).to_s).to eq("http://example.com")
+    expect(@uri.join!(@uri).to_s).to eq("http://example.com")
+  end
+
+  it "should be equivalent to http://EXAMPLE.com" do
+    expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com"))
+  end
+
+  it "should be equivalent to http://EXAMPLE.com:80/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/"))
+  end
+
+  it "should have the same hash as http://example.com" do
+    expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash)
+  end
+
+  it "should have the same hash as http://EXAMPLE.com after assignment" do
+    @uri.origin = "http://EXAMPLE.com"
+    expect(@uri.hash).to eq(Addressable::URI.parse("http://EXAMPLE.com").hash)
+  end
+
+  it "should have a different hash from http://EXAMPLE.com" do
+    expect(@uri.hash).not_to eq(Addressable::URI.parse("http://EXAMPLE.com").hash)
+  end
+
+  it "should not allow origin assignment without scheme" do
+    expect(lambda do
+      @uri.origin = "example.com"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should not allow origin assignment without host" do
+    expect(lambda do
+      @uri.origin = "http://"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should not allow origin assignment with bogus type" do
+    expect(lambda do
+      @uri.origin = :bogus
+    end).to raise_error(TypeError)
+  end
+
+  # Section 6.2.3 of RFC 3986
+  it "should be equivalent to http://example.com/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com/"))
+  end
+
+  # Section 6.2.3 of RFC 3986
+  it "should be equivalent to http://example.com:/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com:/"))
+  end
+
+  # Section 6.2.3 of RFC 3986
+  it "should be equivalent to http://example.com:80/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/"))
+  end
+
+  # Section 6.2.2.1 of RFC 3986
+  it "should be equivalent to http://EXAMPLE.COM/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/"))
+  end
+
+  it "should have a route of '/path/' to 'http://example.com/path/'" do
+    expect(@uri.route_to("http://example.com/path/")).to eq(
+      Addressable::URI.parse("/path/")
+    )
+  end
+
+  it "should have a route of '..' from 'http://example.com/path/'" do
+    expect(@uri.route_from("http://example.com/path/")).to eq(
+      Addressable::URI.parse("..")
+    )
+  end
+
+  it "should have a route of '#' to 'http://example.com/'" do
+    expect(@uri.route_to("http://example.com/")).to eq(
+      Addressable::URI.parse("#")
+    )
+  end
+
+  it "should have a route of 'http://elsewhere.com/' to " +
+      "'http://elsewhere.com/'" do
+    expect(@uri.route_to("http://elsewhere.com/")).to eq(
+      Addressable::URI.parse("http://elsewhere.com/")
+    )
+  end
+
+  it "when joined with 'relative/path' should be " +
+      "'http://example.com/relative/path'" do
+    expect(@uri.join('relative/path')).to eq(
+      Addressable::URI.parse("http://example.com/relative/path")
+    )
+  end
+
+  it "when joined with a bogus object a TypeError should be raised" do
+    expect(lambda do
+      @uri.join(42)
+    end).to raise_error(TypeError)
+  end
+
+  it "should have the correct username after assignment" do
+    @uri.user = "newuser"
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.password).to eq(nil)
+    expect(@uri.to_s).to eq("http://newuser@example.com")
+  end
+
+  it "should have the correct username after assignment" do
+    @uri.user = "user@123!"
+    expect(@uri.user).to eq("user@123!")
+    expect(@uri.normalized_user).to eq("user%40123%21")
+    expect(@uri.password).to eq(nil)
+    expect(@uri.normalize.to_s).to eq("http://user%40123%21@example.com/")
+  end
+
+  it "should have the correct password after assignment" do
+    @uri.password = "newpass"
+    expect(@uri.password).to eq("newpass")
+    expect(@uri.user).to eq("")
+    expect(@uri.to_s).to eq("http://:newpass@example.com")
+  end
+
+  it "should have the correct password after assignment" do
+    @uri.password = "#secret@123!"
+    expect(@uri.password).to eq("#secret@123!")
+    expect(@uri.normalized_password).to eq("%23secret%40123%21")
+    expect(@uri.user).to eq("")
+    expect(@uri.normalize.to_s).to eq("http://:%23secret%40123%21@example.com/")
+    expect(@uri.omit(:password).to_s).to eq("http://example.com")
+  end
+
+  it "should have the correct user/pass after repeated assignment" do
+    @uri.user = nil
+    expect(@uri.user).to eq(nil)
+    @uri.password = "newpass"
+    expect(@uri.password).to eq("newpass")
+    # Username cannot be nil if the password is set
+    expect(@uri.user).to eq("")
+    expect(@uri.to_s).to eq("http://:newpass@example.com")
+    @uri.user = "newuser"
+    expect(@uri.user).to eq("newuser")
+    @uri.password = nil
+    expect(@uri.password).to eq(nil)
+    expect(@uri.to_s).to eq("http://newuser@example.com")
+    @uri.user = "newuser"
+    expect(@uri.user).to eq("newuser")
+    @uri.password = ""
+    expect(@uri.password).to eq("")
+    expect(@uri.to_s).to eq("http://newuser:@example.com")
+    @uri.password = "newpass"
+    expect(@uri.password).to eq("newpass")
+    @uri.user = nil
+    # Username cannot be nil if the password is set
+    expect(@uri.user).to eq("")
+    expect(@uri.to_s).to eq("http://:newpass@example.com")
+  end
+
+  it "should have the correct user/pass after userinfo assignment" do
+    @uri.user = "newuser"
+    expect(@uri.user).to eq("newuser")
+    @uri.password = "newpass"
+    expect(@uri.password).to eq("newpass")
+    @uri.userinfo = nil
+    expect(@uri.userinfo).to eq(nil)
+    expect(@uri.user).to eq(nil)
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should correctly convert to a hash" do
+    expect(@uri.to_hash).to eq({
+      :scheme => "http",
+      :user => nil,
+      :password => nil,
+      :host => "example.com",
+      :port => nil,
+      :path => "",
+      :query => nil,
+      :fragment => nil
+    })
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+
+  it "should have an origin of 'http://example.com'" do
+    expect(@uri.origin).to eq('http://example.com')
+  end
+end
+
+# Section 5.1.2 of RFC 2616
+describe Addressable::URI, "when parsed from " +
+    "'HTTP://www.w3.org/pub/WWW/TheProject.html'" do
+  before do
+    @uri = Addressable::URI.parse("HTTP://www.w3.org/pub/WWW/TheProject.html")
+  end
+
+  it "should have the correct request URI" do
+    expect(@uri.request_uri).to eq("/pub/WWW/TheProject.html")
+  end
+
+  it "should have the correct request URI after assignment" do
+    @uri.request_uri = "/some/where/else.html?query?string"
+    expect(@uri.request_uri).to eq("/some/where/else.html?query?string")
+    expect(@uri.path).to eq("/some/where/else.html")
+    expect(@uri.query).to eq("query?string")
+  end
+
+  it "should have the correct request URI after assignment" do
+    @uri.request_uri = "?x=y"
+    expect(@uri.request_uri).to eq("/?x=y")
+    expect(@uri.path).to eq("/")
+    expect(@uri.query).to eq("x=y")
+  end
+
+  it "should raise an error if the site value is set to something bogus" do
+    expect(lambda do
+      @uri.site = 42
+    end).to raise_error(TypeError)
+  end
+
+  it "should raise an error if the request URI is set to something bogus" do
+    expect(lambda do
+      @uri.request_uri = 42
+    end).to raise_error(TypeError)
+  end
+
+  it "should correctly convert to a hash" do
+    expect(@uri.to_hash).to eq({
+      :scheme => "HTTP",
+      :user => nil,
+      :password => nil,
+      :host => "www.w3.org",
+      :port => nil,
+      :path => "/pub/WWW/TheProject.html",
+      :query => nil,
+      :fragment => nil
+    })
+  end
+
+  it "should have an origin of 'http://www.w3.org'" do
+    expect(@uri.origin).to eq('http://www.w3.org')
+  end
+end
+
+describe Addressable::URI, "when parsing IPv6 addresses" do
+  it "should not raise an error for " +
+      "'http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do
+    Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/")
+  end
+
+  it "should not raise an error for " +
+      "'http://[fe80:0:0:0:200:f8ff:fe21:67cf]/'" do
+    Addressable::URI.parse("http://[fe80:0:0:0:200:f8ff:fe21:67cf]/")
+  end
+
+  it "should not raise an error for " +
+      "'http://[fe80::200:f8ff:fe21:67cf]/'" do
+    Addressable::URI.parse("http://[fe80::200:f8ff:fe21:67cf]/")
+  end
+
+  it "should not raise an error for " +
+      "'http://[::1]/'" do
+    Addressable::URI.parse("http://[::1]/")
+  end
+
+  it "should not raise an error for " +
+      "'http://[fe80::1]/'" do
+    Addressable::URI.parse("http://[fe80::1]/")
+  end
+
+  it "should raise an error for " +
+      "'http://[<invalid>]/'" do
+    expect(lambda do
+      Addressable::URI.parse("http://[<invalid>]/")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when parsing IPv6 address" do
+  subject { Addressable::URI.parse("http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/") }
+  its(:host) { should == '[3ffe:1900:4545:3:200:f8ff:fe21:67cf]' }
+  its(:hostname) { should == '3ffe:1900:4545:3:200:f8ff:fe21:67cf' }
+end
+
+describe Addressable::URI, "when assigning IPv6 address" do
+  it "should allow to set bare IPv6 address as hostname" do
+    uri = Addressable::URI.parse("http://[::1]/")
+    uri.hostname = '3ffe:1900:4545:3:200:f8ff:fe21:67cf'
+    expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/')
+  end
+
+  it "should allow to set bare IPv6 address as hostname with IPAddr object" do
+    uri = Addressable::URI.parse("http://[::1]/")
+    uri.hostname = IPAddr.new('3ffe:1900:4545:3:200:f8ff:fe21:67cf')
+    expect(uri.to_s).to eq('http://[3ffe:1900:4545:3:200:f8ff:fe21:67cf]/')
+  end
+
+  it "should not allow to set bare IPv6 address as host" do
+    uri = Addressable::URI.parse("http://[::1]/")
+    skip "not checked"
+    expect(lambda do
+      uri.host = '3ffe:1900:4545:3:200:f8ff:fe21:67cf'
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when parsing IPvFuture addresses" do
+  it "should not raise an error for " +
+      "'http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/'" do
+    Addressable::URI.parse("http://[v9.3ffe:1900:4545:3:200:f8ff:fe21:67cf]/")
+  end
+
+  it "should not raise an error for " +
+      "'http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/'" do
+    Addressable::URI.parse("http://[vff.fe80:0:0:0:200:f8ff:fe21:67cf]/")
+  end
+
+  it "should not raise an error for " +
+      "'http://[v12.fe80::200:f8ff:fe21:67cf]/'" do
+    Addressable::URI.parse("http://[v12.fe80::200:f8ff:fe21:67cf]/")
+  end
+
+  it "should not raise an error for " +
+      "'http://[va0.::1]/'" do
+    Addressable::URI.parse("http://[va0.::1]/")
+  end
+
+  it "should not raise an error for " +
+      "'http://[v255.fe80::1]/'" do
+    Addressable::URI.parse("http://[v255.fe80::1]/")
+  end
+
+  it "should raise an error for " +
+      "'http://[v0.<invalid>]/'" do
+    expect(lambda do
+      Addressable::URI.parse("http://[v0.<invalid>]/")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/")
+  end
+
+  # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
+  it "should be equivalent to http://example.com" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com"))
+  end
+
+  # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
+  it "should be equivalent to HTTP://example.com/" do
+    expect(@uri).to eq(Addressable::URI.parse("HTTP://example.com/"))
+  end
+
+  # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
+  it "should be equivalent to http://example.com:/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com:/"))
+  end
+
+  # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
+  it "should be equivalent to http://example.com:80/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/"))
+  end
+
+  # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
+  it "should be equivalent to http://Example.com/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://Example.com/"))
+  end
+
+  it "should have the correct username after assignment" do
+    @uri.user = nil
+    expect(@uri.user).to eq(nil)
+    expect(@uri.password).to eq(nil)
+    expect(@uri.to_s).to eq("http://example.com/")
+  end
+
+  it "should have the correct password after assignment" do
+    @uri.password = nil
+    expect(@uri.password).to eq(nil)
+    expect(@uri.user).to eq(nil)
+    expect(@uri.to_s).to eq("http://example.com/")
+  end
+
+  it "should have a request URI of '/'" do
+    expect(@uri.request_uri).to eq("/")
+  end
+
+  it "should correctly convert to a hash" do
+    expect(@uri.to_hash).to eq({
+      :scheme => "http",
+      :user => nil,
+      :password => nil,
+      :host => "example.com",
+      :port => nil,
+      :path => "/",
+      :query => nil,
+      :fragment => nil
+    })
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+
+  it "should have the same hash as its duplicate" do
+    expect(@uri.hash).to eq(@uri.dup.hash)
+  end
+
+  it "should have a different hash from its equivalent String value" do
+    expect(@uri.hash).not_to eq(@uri.to_s.hash)
+  end
+
+  it "should have the same hash as an equal URI" do
+    expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash)
+  end
+
+  it "should be equivalent to http://EXAMPLE.com" do
+    expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com"))
+  end
+
+  it "should be equivalent to http://EXAMPLE.com:80/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.com:80/"))
+  end
+
+  it "should have the same hash as http://example.com/" do
+    expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/").hash)
+  end
+
+  it "should have the same hash as http://example.com after assignment" do
+    @uri.path = ""
+    expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com").hash)
+  end
+
+  it "should have the same hash as http://example.com/? after assignment" do
+    @uri.query = ""
+    expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash)
+  end
+
+  it "should have the same hash as http://example.com/? after assignment" do
+    @uri.query_values = {}
+    expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/?").hash)
+  end
+
+  it "should have the same hash as http://example.com/# after assignment" do
+    @uri.fragment = ""
+    expect(@uri.hash).to eq(Addressable::URI.parse("http://example.com/#").hash)
+  end
+
+  it "should have a different hash from http://example.com" do
+    expect(@uri.hash).not_to eq(Addressable::URI.parse("http://example.com").hash)
+  end
+
+  it "should have an origin of 'http://example.com'" do
+    expect(@uri.origin).to eq('http://example.com')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com?#'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com?#")
+  end
+
+  it "should correctly convert to a hash" do
+    expect(@uri.to_hash).to eq({
+      :scheme => "http",
+      :user => nil,
+      :password => nil,
+      :host => "example.com",
+      :port => nil,
+      :path => "",
+      :query => "",
+      :fragment => ""
+    })
+  end
+
+  it "should have a request URI of '/?'" do
+    expect(@uri.request_uri).to eq("/?")
+  end
+
+  it "should normalize to 'http://example.com/'" do
+    expect(@uri.normalize.to_s).to eq("http://example.com/")
+  end
+
+  it "should have an origin of 'http://example.com'" do
+    expect(@uri.origin).to eq("http://example.com")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://@example.com/'" do
+  before do
+    @uri = Addressable::URI.parse("http://@example.com/")
+  end
+
+  it "should be equivalent to http://example.com" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com"))
+  end
+
+  it "should correctly convert to a hash" do
+    expect(@uri.to_hash).to eq({
+      :scheme => "http",
+      :user => "",
+      :password => nil,
+      :host => "example.com",
+      :port => nil,
+      :path => "/",
+      :query => nil,
+      :fragment => nil
+    })
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+
+  it "should have an origin of 'http://example.com'" do
+    expect(@uri.origin).to eq('http://example.com')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com./'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com./")
+  end
+
+  it "should be equivalent to http://example.com" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com"))
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+
+  it "should have an origin of 'http://example.com'" do
+    expect(@uri.origin).to eq('http://example.com')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://:@example.com/'" do
+  before do
+    @uri = Addressable::URI.parse("http://:@example.com/")
+  end
+
+  it "should be equivalent to http://example.com" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com"))
+  end
+
+  it "should correctly convert to a hash" do
+    expect(@uri.to_hash).to eq({
+      :scheme => "http",
+      :user => "",
+      :password => "",
+      :host => "example.com",
+      :port => nil,
+      :path => "/",
+      :query => nil,
+      :fragment => nil
+    })
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+
+  it "should have an origin of 'http://example.com'" do
+    expect(@uri.origin).to eq('http://example.com')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'HTTP://EXAMPLE.COM/'" do
+  before do
+    @uri = Addressable::URI.parse("HTTP://EXAMPLE.COM/")
+  end
+
+  it "should be equivalent to http://example.com" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com"))
+  end
+
+  it "should correctly convert to a hash" do
+    expect(@uri.to_hash).to eq({
+      :scheme => "HTTP",
+      :user => nil,
+      :password => nil,
+      :host => "EXAMPLE.COM",
+      :port => nil,
+      :path => "/",
+      :query => nil,
+      :fragment => nil
+    })
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+
+  it "should have an origin of 'http://example.com'" do
+    expect(@uri.origin).to eq('http://example.com')
+  end
+
+  it "should have a tld of 'com'" do
+    expect(@uri.tld).to eq('com')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://www.example.co.uk/'" do
+  before do
+    @uri = Addressable::URI.parse("http://www.example.co.uk/")
+  end
+
+  it "should have an origin of 'http://www.example.co.uk'" do
+    expect(@uri.origin).to eq('http://www.example.co.uk')
+  end
+
+  it "should have a tld of 'co.uk'" do
+    expect(@uri.tld).to eq('co.uk')
+  end
+
+  it "should have a domain of 'example.co.uk'" do
+    expect(@uri.domain).to eq('example.co.uk')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://sub_domain.blogspot.com/'" do
+  before do
+    @uri = Addressable::URI.parse("http://sub_domain.blogspot.com/")
+  end
+
+  it "should have an origin of 'http://sub_domain.blogspot.com'" do
+    expect(@uri.origin).to eq('http://sub_domain.blogspot.com')
+  end
+
+  it "should have a tld of 'com'" do
+    expect(@uri.tld).to eq('com')
+  end
+
+  it "should have a domain of 'blogspot.com'" do
+    expect(@uri.domain).to eq('blogspot.com')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/~smith/'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/~smith/")
+  end
+
+  # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
+  it "should be equivalent to http://example.com/%7Esmith/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7Esmith/"))
+  end
+
+  # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
+  it "should be equivalent to http://example.com/%7esmith/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com/%7esmith/"))
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/%E8'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/%E8")
+  end
+
+  it "should not raise an exception when normalized" do
+    expect(lambda do
+      @uri.normalize
+    end).not_to raise_error
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should not change if encoded with the normalizing algorithm" do
+    expect(Addressable::URI.normalized_encode(@uri).to_s).to eq(
+      "http://example.com/%E8"
+    )
+    expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be ===
+      "http://example.com/%E8"
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/path%2Fsegment/'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/path%2Fsegment/")
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should be equal to 'http://example.com/path%2Fsegment/'" do
+    expect(@uri.normalize).to be_eql(
+      Addressable::URI.parse("http://example.com/path%2Fsegment/")
+    )
+  end
+
+  it "should not be equal to 'http://example.com/path/segment/'" do
+    expect(@uri).not_to eq(
+      Addressable::URI.parse("http://example.com/path/segment/")
+    )
+  end
+
+  it "should not be equal to 'http://example.com/path/segment/'" do
+    expect(@uri.normalize).not_to be_eql(
+      Addressable::URI.parse("http://example.com/path/segment/")
+    )
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?%F6'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?%F6")
+  end
+
+  it "should not raise an exception when normalized" do
+    expect(lambda do
+      @uri.normalize
+    end).not_to raise_error
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should not change if encoded with the normalizing algorithm" do
+    expect(Addressable::URI.normalized_encode(@uri).to_s).to eq(
+      "http://example.com/?%F6"
+    )
+    expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be ===
+      "http://example.com/?%F6"
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/#%F6'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/#%F6")
+  end
+
+  it "should not raise an exception when normalized" do
+    expect(lambda do
+      @uri.normalize
+    end).not_to raise_error
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should not change if encoded with the normalizing algorithm" do
+    expect(Addressable::URI.normalized_encode(@uri).to_s).to eq(
+      "http://example.com/#%F6"
+    )
+    expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be ===
+      "http://example.com/#%F6"
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/%C3%87'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/%C3%87")
+  end
+
+  # Based on http://intertwingly.net/blog/2004/07/31/URI-Equivalence
+  it "should be equivalent to 'http://example.com/C%CC%A7'" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com/C%CC%A7"))
+  end
+
+  it "should not change if encoded with the normalizing algorithm" do
+    expect(Addressable::URI.normalized_encode(@uri).to_s).to eq(
+      "http://example.com/%C3%87"
+    )
+    expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be ===
+      "http://example.com/%C3%87"
+  end
+
+  it "should raise an error if encoding with an unexpected return type" do
+    expect(lambda do
+      Addressable::URI.normalized_encode(@uri, Integer)
+    end).to raise_error(TypeError)
+  end
+
+  it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do
+    expect(Addressable::URI.encode(@uri).to_s).to eq(
+      "http://example.com/%25C3%2587"
+    )
+  end
+
+  it "if percent encoded should be 'http://example.com/C%25CC%25A7'" do
+    expect(Addressable::URI.encode(@uri, Addressable::URI)).to eq(
+      Addressable::URI.parse("http://example.com/%25C3%2587")
+    )
+  end
+
+  it "should raise an error if encoding with an unexpected return type" do
+    expect(lambda do
+      Addressable::URI.encode(@uri, Integer)
+    end).to raise_error(TypeError)
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?q=string'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?q=string")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have an authority segment of 'example.com'" do
+    expect(@uri.authority).to eq("example.com")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should have no username" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have a path of '/'" do
+    expect(@uri.path).to eq("/")
+  end
+
+  it "should have a query string of 'q=string'" do
+    expect(@uri.query).to eq("q=string")
+  end
+
+  it "should have no fragment" do
+    expect(@uri.fragment).to eq(nil)
+  end
+
+  it "should be considered absolute" do
+    expect(@uri).to be_absolute
+  end
+
+  it "should not be considered relative" do
+    expect(@uri).not_to be_relative
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com:80/'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com:80/")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have an authority segment of 'example.com:80'" do
+    expect(@uri.authority).to eq("example.com:80")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should have no username" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have explicit port 80" do
+    expect(@uri.port).to eq(80)
+  end
+
+  it "should have a path of '/'" do
+    expect(@uri.path).to eq("/")
+  end
+
+  it "should have no query string" do
+    expect(@uri.query).to eq(nil)
+  end
+
+  it "should have no fragment" do
+    expect(@uri.fragment).to eq(nil)
+  end
+
+  it "should be considered absolute" do
+    expect(@uri).to be_absolute
+  end
+
+  it "should not be considered relative" do
+    expect(@uri).not_to be_relative
+  end
+
+  it "should be exactly equal to http://example.com:80/" do
+    expect(@uri.eql?(Addressable::URI.parse("http://example.com:80/"))).to eq(true)
+  end
+
+  it "should be roughly equal to http://example.com/" do
+    expect(@uri === Addressable::URI.parse("http://example.com/")).to eq(true)
+  end
+
+  it "should be roughly equal to the string 'http://example.com/'" do
+    expect(@uri === "http://example.com/").to eq(true)
+  end
+
+  it "should not be roughly equal to the string " +
+      "'http://example.com:bogus/'" do
+    expect(lambda do
+      expect(@uri === "http://example.com:bogus/").to eq(false)
+    end).not_to raise_error
+  end
+
+  it "should result in itself when joined with itself" do
+    expect(@uri.join(@uri).to_s).to eq("http://example.com:80/")
+    expect(@uri.join!(@uri).to_s).to eq("http://example.com:80/")
+  end
+
+  # Section 6.2.3 of RFC 3986
+  it "should be equal to http://example.com/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com/"))
+  end
+
+  # Section 6.2.3 of RFC 3986
+  it "should be equal to http://example.com:/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com:/"))
+  end
+
+  # Section 6.2.3 of RFC 3986
+  it "should be equal to http://example.com:80/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://example.com:80/"))
+  end
+
+  # Section 6.2.2.1 of RFC 3986
+  it "should be equal to http://EXAMPLE.COM/" do
+    expect(@uri).to eq(Addressable::URI.parse("http://EXAMPLE.COM/"))
+  end
+
+  it "should correctly convert to a hash" do
+    expect(@uri.to_hash).to eq({
+      :scheme => "http",
+      :user => nil,
+      :password => nil,
+      :host => "example.com",
+      :port => 80,
+      :path => "/",
+      :query => nil,
+      :fragment => nil
+    })
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+
+  it "should have an origin of 'http://example.com'" do
+    expect(@uri.origin).to eq('http://example.com')
+  end
+
+  it "should not change if encoded with the normalizing algorithm" do
+    expect(Addressable::URI.normalized_encode(@uri).to_s).to eq(
+      "http://example.com:80/"
+    )
+    expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be ===
+      "http://example.com:80/"
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com:8080/'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com:8080/")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have an authority segment of 'example.com:8080'" do
+    expect(@uri.authority).to eq("example.com:8080")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should have no username" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should use port 8080" do
+    expect(@uri.inferred_port).to eq(8080)
+  end
+
+  it "should have explicit port 8080" do
+    expect(@uri.port).to eq(8080)
+  end
+
+  it "should have default port 80" do
+    expect(@uri.default_port).to eq(80)
+  end
+
+  it "should have a path of '/'" do
+    expect(@uri.path).to eq("/")
+  end
+
+  it "should have no query string" do
+    expect(@uri.query).to eq(nil)
+  end
+
+  it "should have no fragment" do
+    expect(@uri.fragment).to eq(nil)
+  end
+
+  it "should be considered absolute" do
+    expect(@uri).to be_absolute
+  end
+
+  it "should not be considered relative" do
+    expect(@uri).not_to be_relative
+  end
+
+  it "should be exactly equal to http://example.com:8080/" do
+    expect(@uri.eql?(Addressable::URI.parse(
+      "http://example.com:8080/"))).to eq(true)
+  end
+
+  it "should have a route of 'http://example.com:8080/' from " +
+      "'http://example.com/path/to/'" do
+    expect(@uri.route_from("http://example.com/path/to/")).to eq(
+      Addressable::URI.parse("http://example.com:8080/")
+    )
+  end
+
+  it "should have a route of 'http://example.com:8080/' from " +
+      "'http://example.com:80/path/to/'" do
+    expect(@uri.route_from("http://example.com:80/path/to/")).to eq(
+      Addressable::URI.parse("http://example.com:8080/")
+    )
+  end
+
+  it "should have a route of '../../' from " +
+      "'http://example.com:8080/path/to/'" do
+    expect(@uri.route_from("http://example.com:8080/path/to/")).to eq(
+      Addressable::URI.parse("../../")
+    )
+  end
+
+  it "should have a route of 'http://example.com:8080/' from " +
+      "'http://user:pass@example.com/path/to/'" do
+    expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq(
+      Addressable::URI.parse("http://example.com:8080/")
+    )
+  end
+
+  it "should correctly convert to a hash" do
+    expect(@uri.to_hash).to eq({
+      :scheme => "http",
+      :user => nil,
+      :password => nil,
+      :host => "example.com",
+      :port => 8080,
+      :path => "/",
+      :query => nil,
+      :fragment => nil
+    })
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+
+  it "should have an origin of 'http://example.com:8080'" do
+    expect(@uri.origin).to eq('http://example.com:8080')
+  end
+
+  it "should not change if encoded with the normalizing algorithm" do
+    expect(Addressable::URI.normalized_encode(@uri).to_s).to eq(
+      "http://example.com:8080/"
+    )
+    expect(Addressable::URI.normalized_encode(@uri, Addressable::URI).to_s).to be ===
+      "http://example.com:8080/"
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com:%38%30/'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com:%38%30/")
+  end
+
+  it "should have the correct port" do
+    expect(@uri.port).to eq(80)
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+
+  it "should normalize to 'http://example.com/'" do
+    expect(@uri.normalize.to_s).to eq("http://example.com/")
+  end
+
+  it "should have an origin of 'http://example.com'" do
+    expect(@uri.origin).to eq('http://example.com')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/%2E/'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/%2E/")
+  end
+
+  it "should be considered to be in normal form" do
+    skip(
+      'path segment normalization should happen before ' +
+      'percent escaping normalization'
+    )
+    @uri.normalize.should be_eql(@uri)
+  end
+
+  it "should normalize to 'http://example.com/%2E/'" do
+    skip(
+      'path segment normalization should happen before ' +
+      'percent escaping normalization'
+    )
+    expect(@uri.normalize).to eq("http://example.com/%2E/")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/..'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/..")
+  end
+
+  it "should have the correct port" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+
+  it "should normalize to 'http://example.com/'" do
+    expect(@uri.normalize.to_s).to eq("http://example.com/")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/../..'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/../..")
+  end
+
+  it "should have the correct port" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+
+  it "should normalize to 'http://example.com/'" do
+    expect(@uri.normalize.to_s).to eq("http://example.com/")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/path(/..'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/path(/..")
+  end
+
+  it "should have the correct port" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+
+  it "should normalize to 'http://example.com/'" do
+    expect(@uri.normalize.to_s).to eq("http://example.com/")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/(path)/..'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/(path)/..")
+  end
+
+  it "should have the correct port" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+
+  it "should normalize to 'http://example.com/'" do
+    expect(@uri.normalize.to_s).to eq("http://example.com/")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/path(/../'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/path(/../")
+  end
+
+  it "should have the correct port" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+
+  it "should normalize to 'http://example.com/'" do
+    expect(@uri.normalize.to_s).to eq("http://example.com/")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/(path)/../'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/(path)/../")
+  end
+
+  it "should have the correct port" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+
+  it "should normalize to 'http://example.com/'" do
+    expect(@uri.normalize.to_s).to eq("http://example.com/")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'/..//example.com'" do
+  before do
+    @uri = Addressable::URI.parse("/..//example.com")
+  end
+
+  it "should become invalid when normalized" do
+    expect(lambda do
+      @uri.normalize
+    end).to raise_error(Addressable::URI::InvalidURIError, /authority/)
+  end
+
+  it "should have a path of '/..//example.com'" do
+    expect(@uri.path).to eq("/..//example.com")
+  end
+end
+
+describe Addressable::URI, "when parsed from '/a/b/c/./../../g'" do
+  before do
+    @uri = Addressable::URI.parse("/a/b/c/./../../g")
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+
+  # Section 5.2.4 of RFC 3986
+  it "should normalize to '/a/g'" do
+    expect(@uri.normalize.to_s).to eq("/a/g")
+  end
+end
+
+describe Addressable::URI, "when parsed from 'mid/content=5/../6'" do
+  before do
+    @uri = Addressable::URI.parse("mid/content=5/../6")
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+
+  # Section 5.2.4 of RFC 3986
+  it "should normalize to 'mid/6'" do
+    expect(@uri.normalize.to_s).to eq("mid/6")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://www.example.com///../'" do
+  before do
+    @uri = Addressable::URI.parse('http://www.example.com///../')
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+
+  it "should normalize to 'http://www.example.com//'" do
+    expect(@uri.normalize.to_s).to eq("http://www.example.com//")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/path/to/resource/'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/path/to/resource/")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have an authority segment of 'example.com'" do
+    expect(@uri.authority).to eq("example.com")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should have no username" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have a path of '/path/to/resource/'" do
+    expect(@uri.path).to eq("/path/to/resource/")
+  end
+
+  it "should have no query string" do
+    expect(@uri.query).to eq(nil)
+  end
+
+  it "should have no fragment" do
+    expect(@uri.fragment).to eq(nil)
+  end
+
+  it "should be considered absolute" do
+    expect(@uri).to be_absolute
+  end
+
+  it "should not be considered relative" do
+    expect(@uri).not_to be_relative
+  end
+
+  it "should be exactly equal to http://example.com:8080/" do
+    expect(@uri.eql?(Addressable::URI.parse(
+      "http://example.com/path/to/resource/"))).to eq(true)
+  end
+
+  it "should have a route of 'resource/' from " +
+      "'http://example.com/path/to/'" do
+    expect(@uri.route_from("http://example.com/path/to/")).to eq(
+      Addressable::URI.parse("resource/")
+    )
+  end
+
+  it "should have a route of '../' from " +
+    "'http://example.com/path/to/resource/sub'" do
+    expect(@uri.route_from("http://example.com/path/to/resource/sub")).to eq(
+      Addressable::URI.parse("../")
+    )
+  end
+
+
+  it "should have a route of 'resource/' from " +
+    "'http://example.com/path/to/another'" do
+    expect(@uri.route_from("http://example.com/path/to/another")).to eq(
+      Addressable::URI.parse("resource/")
+    )
+  end
+
+  it "should have a route of 'resource/' from " +
+      "'http://example.com/path/to/res'" do
+    expect(@uri.route_from("http://example.com/path/to/res")).to eq(
+      Addressable::URI.parse("resource/")
+    )
+  end
+
+  it "should have a route of 'resource/' from " +
+      "'http://example.com:80/path/to/'" do
+    expect(@uri.route_from("http://example.com:80/path/to/")).to eq(
+      Addressable::URI.parse("resource/")
+    )
+  end
+
+  it "should have a route of 'http://example.com/path/to/' from " +
+      "'http://example.com:8080/path/to/'" do
+    expect(@uri.route_from("http://example.com:8080/path/to/")).to eq(
+      Addressable::URI.parse("http://example.com/path/to/resource/")
+    )
+  end
+
+  it "should have a route of 'http://example.com/path/to/' from " +
+      "'http://user:pass@example.com/path/to/'" do
+    expect(@uri.route_from("http://user:pass@example.com/path/to/")).to eq(
+      Addressable::URI.parse("http://example.com/path/to/resource/")
+    )
+  end
+
+  it "should have a route of '../../path/to/resource/' from " +
+      "'http://example.com/to/resource/'" do
+    expect(@uri.route_from("http://example.com/to/resource/")).to eq(
+      Addressable::URI.parse("../../path/to/resource/")
+    )
+  end
+
+  it "should correctly convert to a hash" do
+    expect(@uri.to_hash).to eq({
+      :scheme => "http",
+      :user => nil,
+      :password => nil,
+      :host => "example.com",
+      :port => nil,
+      :path => "/path/to/resource/",
+      :query => nil,
+      :fragment => nil
+    })
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'relative/path/to/resource'" do
+  before do
+    @uri = Addressable::URI.parse("relative/path/to/resource")
+  end
+
+  it "should not have a scheme" do
+    expect(@uri.scheme).to eq(nil)
+  end
+
+  it "should not be considered ip-based" do
+    expect(@uri).not_to be_ip_based
+  end
+
+  it "should not have an authority segment" do
+    expect(@uri.authority).to eq(nil)
+  end
+
+  it "should not have a host" do
+    expect(@uri.host).to eq(nil)
+  end
+
+  it "should have no username" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should not have a port" do
+    expect(@uri.port).to eq(nil)
+  end
+
+  it "should have a path of 'relative/path/to/resource'" do
+    expect(@uri.path).to eq("relative/path/to/resource")
+  end
+
+  it "should have no query string" do
+    expect(@uri.query).to eq(nil)
+  end
+
+  it "should have no fragment" do
+    expect(@uri.fragment).to eq(nil)
+  end
+
+  it "should not be considered absolute" do
+    expect(@uri).not_to be_absolute
+  end
+
+  it "should be considered relative" do
+    expect(@uri).to be_relative
+  end
+
+  it "should raise an error if routing is attempted" do
+    expect(lambda do
+      @uri.route_to("http://example.com/")
+    end).to raise_error(ArgumentError, /relative\/path\/to\/resource/)
+    expect(lambda do
+      @uri.route_from("http://example.com/")
+    end).to raise_error(ArgumentError, /relative\/path\/to\/resource/)
+  end
+
+  it "when joined with 'another/relative/path' should be " +
+      "'relative/path/to/another/relative/path'" do
+    expect(@uri.join('another/relative/path')).to eq(
+      Addressable::URI.parse("relative/path/to/another/relative/path")
+    )
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'relative_path_with_no_slashes'" do
+  before do
+    @uri = Addressable::URI.parse("relative_path_with_no_slashes")
+  end
+
+  it "should not have a scheme" do
+    expect(@uri.scheme).to eq(nil)
+  end
+
+  it "should not be considered ip-based" do
+    expect(@uri).not_to be_ip_based
+  end
+
+  it "should not have an authority segment" do
+    expect(@uri.authority).to eq(nil)
+  end
+
+  it "should not have a host" do
+    expect(@uri.host).to eq(nil)
+  end
+
+  it "should have no username" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should not have a port" do
+    expect(@uri.port).to eq(nil)
+  end
+
+  it "should have a path of 'relative_path_with_no_slashes'" do
+    expect(@uri.path).to eq("relative_path_with_no_slashes")
+  end
+
+  it "should have no query string" do
+    expect(@uri.query).to eq(nil)
+  end
+
+  it "should have no fragment" do
+    expect(@uri.fragment).to eq(nil)
+  end
+
+  it "should not be considered absolute" do
+    expect(@uri).not_to be_absolute
+  end
+
+  it "should be considered relative" do
+    expect(@uri).to be_relative
+  end
+
+  it "when joined with 'another_relative_path' should be " +
+      "'another_relative_path'" do
+    expect(@uri.join('another_relative_path')).to eq(
+      Addressable::URI.parse("another_relative_path")
+    )
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/file.txt'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/file.txt")
+  end
+
+  it "should have a scheme of 'http'" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have an authority segment of 'example.com'" do
+    expect(@uri.authority).to eq("example.com")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should have no username" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have a path of '/file.txt'" do
+    expect(@uri.path).to eq("/file.txt")
+  end
+
+  it "should have a basename of 'file.txt'" do
+    expect(@uri.basename).to eq("file.txt")
+  end
+
+  it "should have an extname of '.txt'" do
+    expect(@uri.extname).to eq(".txt")
+  end
+
+  it "should have no query string" do
+    expect(@uri.query).to eq(nil)
+  end
+
+  it "should have no fragment" do
+    expect(@uri.fragment).to eq(nil)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/file.txt;parameter'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/file.txt;parameter")
+  end
+
+  it "should have a scheme of 'http'" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have an authority segment of 'example.com'" do
+    expect(@uri.authority).to eq("example.com")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should have no username" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have a path of '/file.txt;parameter'" do
+    expect(@uri.path).to eq("/file.txt;parameter")
+  end
+
+  it "should have a basename of 'file.txt'" do
+    expect(@uri.basename).to eq("file.txt")
+  end
+
+  it "should have an extname of '.txt'" do
+    expect(@uri.extname).to eq(".txt")
+  end
+
+  it "should have no query string" do
+    expect(@uri.query).to eq(nil)
+  end
+
+  it "should have no fragment" do
+    expect(@uri.fragment).to eq(nil)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/file.txt;x=y'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/file.txt;x=y")
+  end
+
+  it "should have a scheme of 'http'" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have a scheme of 'http'" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have an authority segment of 'example.com'" do
+    expect(@uri.authority).to eq("example.com")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should have no username" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have a path of '/file.txt;x=y'" do
+    expect(@uri.path).to eq("/file.txt;x=y")
+  end
+
+  it "should have an extname of '.txt'" do
+    expect(@uri.extname).to eq(".txt")
+  end
+
+  it "should have no query string" do
+    expect(@uri.query).to eq(nil)
+  end
+
+  it "should have no fragment" do
+    expect(@uri.fragment).to eq(nil)
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'svn+ssh://developername@rubyforge.org/var/svn/project'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "svn+ssh://developername@rubyforge.org/var/svn/project"
+    )
+  end
+
+  it "should have a scheme of 'svn+ssh'" do
+    expect(@uri.scheme).to eq("svn+ssh")
+  end
+
+  it "should be considered to be ip-based" do
+    expect(@uri).to be_ip_based
+  end
+
+  it "should have a path of '/var/svn/project'" do
+    expect(@uri.path).to eq("/var/svn/project")
+  end
+
+  it "should have a username of 'developername'" do
+    expect(@uri.user).to eq("developername")
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'ssh+svn://developername@RUBYFORGE.ORG/var/svn/project'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "ssh+svn://developername@RUBYFORGE.ORG/var/svn/project"
+    )
+  end
+
+  it "should have a scheme of 'ssh+svn'" do
+    expect(@uri.scheme).to eq("ssh+svn")
+  end
+
+  it "should have a normalized scheme of 'svn+ssh'" do
+    expect(@uri.normalized_scheme).to eq("svn+ssh")
+  end
+
+  it "should have a normalized site of 'svn+ssh'" do
+    expect(@uri.normalized_site).to eq("svn+ssh://developername@rubyforge.org")
+  end
+
+  it "should not be considered to be ip-based" do
+    expect(@uri).not_to be_ip_based
+  end
+
+  it "should have a path of '/var/svn/project'" do
+    expect(@uri.path).to eq("/var/svn/project")
+  end
+
+  it "should have a username of 'developername'" do
+    expect(@uri.user).to eq("developername")
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should not be considered to be in normal form" do
+    expect(@uri.normalize).not_to be_eql(@uri)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'mailto:user@example.com'" do
+  before do
+    @uri = Addressable::URI.parse("mailto:user@example.com")
+  end
+
+  it "should have a scheme of 'mailto'" do
+    expect(@uri.scheme).to eq("mailto")
+  end
+
+  it "should not be considered to be ip-based" do
+    expect(@uri).not_to be_ip_based
+  end
+
+  it "should have a path of 'user@example.com'" do
+    expect(@uri.path).to eq("user@example.com")
+  end
+
+  it "should have no user" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'tag:example.com,2006-08-18:/path/to/something'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "tag:example.com,2006-08-18:/path/to/something")
+  end
+
+  it "should have a scheme of 'tag'" do
+    expect(@uri.scheme).to eq("tag")
+  end
+
+  it "should be considered to be ip-based" do
+    expect(@uri).not_to be_ip_based
+  end
+
+  it "should have a path of " +
+      "'example.com,2006-08-18:/path/to/something'" do
+    expect(@uri.path).to eq("example.com,2006-08-18:/path/to/something")
+  end
+
+  it "should have no user" do
+    expect(@uri.user).to eq(nil)
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/x;y/'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/x;y/")
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?x=1&y=2'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?x=1&y=2")
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'view-source:http://example.com/'" do
+  before do
+    @uri = Addressable::URI.parse("view-source:http://example.com/")
+  end
+
+  it "should have a scheme of 'view-source'" do
+    expect(@uri.scheme).to eq("view-source")
+  end
+
+  it "should have a path of 'http://example.com/'" do
+    expect(@uri.path).to eq("http://example.com/")
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "http://user:pass@example.com/path/to/resource?query=x#fragment")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have an authority segment of 'user:pass@example.com'" do
+    expect(@uri.authority).to eq("user:pass@example.com")
+  end
+
+  it "should have a username of 'user'" do
+    expect(@uri.user).to eq("user")
+  end
+
+  it "should have a password of 'pass'" do
+    expect(@uri.password).to eq("pass")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have a path of '/path/to/resource'" do
+    expect(@uri.path).to eq("/path/to/resource")
+  end
+
+  it "should have a query string of 'query=x'" do
+    expect(@uri.query).to eq("query=x")
+  end
+
+  it "should have a fragment of 'fragment'" do
+    expect(@uri.fragment).to eq("fragment")
+  end
+
+  it "should be considered to be in normal form" do
+    expect(@uri.normalize).to be_eql(@uri)
+  end
+
+  it "should have a route of '../../' to " +
+      "'http://user:pass@example.com/path/'" do
+    expect(@uri.route_to("http://user:pass@example.com/path/")).to eq(
+      Addressable::URI.parse("../../")
+    )
+  end
+
+  it "should have a route of 'to/resource?query=x#fragment' " +
+      "from 'http://user:pass@example.com/path/'" do
+    expect(@uri.route_from("http://user:pass@example.com/path/")).to eq(
+      Addressable::URI.parse("to/resource?query=x#fragment")
+    )
+  end
+
+  it "should have a route of '?query=x#fragment' " +
+      "from 'http://user:pass@example.com/path/to/resource'" do
+    expect(@uri.route_from("http://user:pass@example.com/path/to/resource")).to eq(
+      Addressable::URI.parse("?query=x#fragment")
+    )
+  end
+
+  it "should have a route of '#fragment' " +
+      "from 'http://user:pass@example.com/path/to/resource?query=x'" do
+    expect(@uri.route_from(
+      "http://user:pass@example.com/path/to/resource?query=x")).to eq(
+        Addressable::URI.parse("#fragment")
+    )
+  end
+
+  it "should have a route of '#fragment' from " +
+      "'http://user:pass@example.com/path/to/resource?query=x#fragment'" do
+    expect(@uri.route_from(
+      "http://user:pass@example.com/path/to/resource?query=x#fragment"
+    )).to eq(Addressable::URI.parse("#fragment"))
+  end
+
+  it "should have a route of 'http://elsewhere.com/' to " +
+      "'http://elsewhere.com/'" do
+    expect(@uri.route_to("http://elsewhere.com/")).to eq(
+      Addressable::URI.parse("http://elsewhere.com/")
+    )
+  end
+
+  it "should have a route of " +
+      "'http://user:pass@example.com/path/to/resource?query=x#fragment' " +
+      "from 'http://example.com/path/to/'" do
+    expect(@uri.route_from("http://elsewhere.com/path/to/")).to eq(
+      Addressable::URI.parse(
+        "http://user:pass@example.com/path/to/resource?query=x#fragment")
+    )
+  end
+
+  it "should have the correct scheme after assignment" do
+    @uri.scheme = "ftp"
+    expect(@uri.scheme).to eq("ftp")
+    expect(@uri.to_s).to eq(
+      "ftp://user:pass@example.com/path/to/resource?query=x#fragment"
+    )
+    expect(@uri.to_str).to eq(
+      "ftp://user:pass@example.com/path/to/resource?query=x#fragment"
+    )
+  end
+
+  it "should have the correct site segment after assignment" do
+    @uri.site = "https://newuser:newpass@example.com:443"
+    expect(@uri.scheme).to eq("https")
+    expect(@uri.authority).to eq("newuser:newpass@example.com:443")
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.password).to eq("newpass")
+    expect(@uri.userinfo).to eq("newuser:newpass")
+    expect(@uri.normalized_userinfo).to eq("newuser:newpass")
+    expect(@uri.host).to eq("example.com")
+    expect(@uri.port).to eq(443)
+    expect(@uri.inferred_port).to eq(443)
+    expect(@uri.to_s).to eq(
+      "https://newuser:newpass@example.com:443" +
+      "/path/to/resource?query=x#fragment"
+    )
+  end
+
+  it "should have the correct authority segment after assignment" do
+    @uri.authority = "newuser:newpass@example.com:80"
+    expect(@uri.authority).to eq("newuser:newpass@example.com:80")
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.password).to eq("newpass")
+    expect(@uri.userinfo).to eq("newuser:newpass")
+    expect(@uri.normalized_userinfo).to eq("newuser:newpass")
+    expect(@uri.host).to eq("example.com")
+    expect(@uri.port).to eq(80)
+    expect(@uri.inferred_port).to eq(80)
+    expect(@uri.to_s).to eq(
+      "http://newuser:newpass@example.com:80" +
+      "/path/to/resource?query=x#fragment"
+    )
+  end
+
+  it "should have the correct userinfo segment after assignment" do
+    @uri.userinfo = "newuser:newpass"
+    expect(@uri.userinfo).to eq("newuser:newpass")
+    expect(@uri.authority).to eq("newuser:newpass@example.com")
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.password).to eq("newpass")
+    expect(@uri.host).to eq("example.com")
+    expect(@uri.port).to eq(nil)
+    expect(@uri.inferred_port).to eq(80)
+    expect(@uri.to_s).to eq(
+      "http://newuser:newpass@example.com" +
+      "/path/to/resource?query=x#fragment"
+    )
+  end
+
+  it "should have the correct username after assignment" do
+    @uri.user = "newuser"
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.authority).to eq("newuser:pass@example.com")
+  end
+
+  it "should have the correct password after assignment" do
+    @uri.password = "newpass"
+    expect(@uri.password).to eq("newpass")
+    expect(@uri.authority).to eq("user:newpass@example.com")
+  end
+
+  it "should have the correct host after assignment" do
+    @uri.host = "newexample.com"
+    expect(@uri.host).to eq("newexample.com")
+    expect(@uri.authority).to eq("user:pass@newexample.com")
+  end
+
+  it "should have the correct host after assignment" do
+    @uri.hostname = "newexample.com"
+    expect(@uri.host).to eq("newexample.com")
+    expect(@uri.hostname).to eq("newexample.com")
+    expect(@uri.authority).to eq("user:pass@newexample.com")
+  end
+
+  it "should raise an error if assigning a bogus object to the hostname" do
+    expect(lambda do
+      @uri.hostname = Object.new
+    end).to raise_error
+  end
+
+  it "should have the correct port after assignment" do
+    @uri.port = 8080
+    expect(@uri.port).to eq(8080)
+    expect(@uri.authority).to eq("user:pass@example.com:8080")
+  end
+
+  it "should have the correct origin after assignment" do
+    @uri.origin = "http://newexample.com"
+    expect(@uri.host).to eq("newexample.com")
+    expect(@uri.authority).to eq("newexample.com")
+  end
+
+  it "should have the correct path after assignment" do
+    @uri.path = "/newpath/to/resource"
+    expect(@uri.path).to eq("/newpath/to/resource")
+    expect(@uri.to_s).to eq(
+      "http://user:pass@example.com/newpath/to/resource?query=x#fragment"
+    )
+  end
+
+  it "should have the correct scheme and authority after nil assignment" do
+    @uri.site = nil
+    expect(@uri.scheme).to eq(nil)
+    expect(@uri.authority).to eq(nil)
+    expect(@uri.to_s).to eq("/path/to/resource?query=x#fragment")
+  end
+
+  it "should have the correct scheme and authority after assignment" do
+    @uri.site = "file://"
+    expect(@uri.scheme).to eq("file")
+    expect(@uri.authority).to eq("")
+    expect(@uri.to_s).to eq("file:///path/to/resource?query=x#fragment")
+  end
+
+  it "should have the correct path after nil assignment" do
+    @uri.path = nil
+    expect(@uri.path).to eq("")
+    expect(@uri.to_s).to eq(
+      "http://user:pass@example.com?query=x#fragment"
+    )
+  end
+
+  it "should have the correct query string after assignment" do
+    @uri.query = "newquery=x"
+    expect(@uri.query).to eq("newquery=x")
+    expect(@uri.to_s).to eq(
+      "http://user:pass@example.com/path/to/resource?newquery=x#fragment"
+    )
+    @uri.query = nil
+    expect(@uri.query).to eq(nil)
+    expect(@uri.to_s).to eq(
+      "http://user:pass@example.com/path/to/resource#fragment"
+    )
+  end
+
+  it "should have the correct query string after hash assignment" do
+    @uri.query_values = {"?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther"}
+    expect(@uri.query.split("&")).to include("%3Fuestion%20mark=%3Dsign")
+    expect(@uri.query.split("&")).to include("hello=g%C3%BCnther")
+    expect(@uri.query_values).to eq({
+      "?uestion mark" => "=sign", "hello" => "g\xC3\xBCnther"
+    })
+  end
+
+  it "should have the correct query string after flag hash assignment" do
+    @uri.query_values = {'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil}
+    expect(@uri.query.split("&")).to include("flag%3F1")
+    expect(@uri.query.split("&")).to include("fl%3Dag2")
+    expect(@uri.query.split("&")).to include("flag3")
+    expect(@uri.query_values(Array).sort).to eq([["fl=ag2"], ["flag3"], ["flag?1"]])
+    expect(@uri.query_values(Hash)).to eq({
+      'flag?1' => nil, 'fl=ag2' => nil, 'flag3' => nil
+    })
+  end
+
+  it "should raise an error if query values are set to a bogus type" do
+    expect(lambda do
+      @uri.query_values = "bogus"
+    end).to raise_error(TypeError)
+  end
+
+  it "should have the correct fragment after assignment" do
+    @uri.fragment = "newfragment"
+    expect(@uri.fragment).to eq("newfragment")
+    expect(@uri.to_s).to eq(
+      "http://user:pass@example.com/path/to/resource?query=x#newfragment"
+    )
+
+    @uri.fragment = nil
+    expect(@uri.fragment).to eq(nil)
+    expect(@uri.to_s).to eq(
+      "http://user:pass@example.com/path/to/resource?query=x"
+    )
+  end
+
+  it "should have the correct values after a merge" do
+    expect(@uri.merge(:fragment => "newfragment").to_s).to eq(
+      "http://user:pass@example.com/path/to/resource?query=x#newfragment"
+    )
+  end
+
+  it "should have the correct values after a merge" do
+    expect(@uri.merge(:fragment => nil).to_s).to eq(
+      "http://user:pass@example.com/path/to/resource?query=x"
+    )
+  end
+
+  it "should have the correct values after a merge" do
+    expect(@uri.merge(:userinfo => "newuser:newpass").to_s).to eq(
+      "http://newuser:newpass@example.com/path/to/resource?query=x#fragment"
+    )
+  end
+
+  it "should have the correct values after a merge" do
+    expect(@uri.merge(:userinfo => nil).to_s).to eq(
+      "http://example.com/path/to/resource?query=x#fragment"
+    )
+  end
+
+  it "should have the correct values after a merge" do
+    expect(@uri.merge(:path => "newpath").to_s).to eq(
+      "http://user:pass@example.com/newpath?query=x#fragment"
+    )
+  end
+
+  it "should have the correct values after a merge" do
+    expect(@uri.merge(:port => "42", :path => "newpath", :query => "").to_s).to eq(
+      "http://user:pass@example.com:42/newpath?#fragment"
+    )
+  end
+
+  it "should have the correct values after a merge" do
+    expect(@uri.merge(:authority => "foo:bar@baz:42").to_s).to eq(
+      "http://foo:bar@baz:42/path/to/resource?query=x#fragment"
+    )
+    # Ensure the operation was not destructive
+    expect(@uri.to_s).to eq(
+      "http://user:pass@example.com/path/to/resource?query=x#fragment"
+    )
+  end
+
+  it "should have the correct values after a destructive merge" do
+    @uri.merge!(:authority => "foo:bar@baz:42")
+    # Ensure the operation was destructive
+    expect(@uri.to_s).to eq(
+      "http://foo:bar@baz:42/path/to/resource?query=x#fragment"
+    )
+  end
+
+  it "should fail to merge with bogus values" do
+    expect(lambda do
+      @uri.merge(:port => "bogus")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should fail to merge with bogus values" do
+    expect(lambda do
+      @uri.merge(:authority => "bar@baz:bogus")
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should fail to merge with bogus parameters" do
+    expect(lambda do
+      @uri.merge(42)
+    end).to raise_error(TypeError)
+  end
+
+  it "should fail to merge with bogus parameters" do
+    expect(lambda do
+      @uri.merge("http://example.com/")
+    end).to raise_error(TypeError)
+  end
+
+  it "should fail to merge with both authority and subcomponents" do
+    expect(lambda do
+      @uri.merge(:authority => "foo:bar@baz:42", :port => "42")
+    end).to raise_error(ArgumentError)
+  end
+
+  it "should fail to merge with both userinfo and subcomponents" do
+    expect(lambda do
+      @uri.merge(:userinfo => "foo:bar", :user => "foo")
+    end).to raise_error(ArgumentError)
+  end
+
+  it "should be identical to its duplicate" do
+    expect(@uri).to eq(@uri.dup)
+  end
+
+  it "should have an origin of 'http://example.com'" do
+    expect(@uri.origin).to eq('http://example.com')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+  "'http://example.com/search?q=Q%26A'" do
+
+  before do
+    @uri = Addressable::URI.parse("http://example.com/search?q=Q%26A")
+  end
+
+  it "should have a query of 'q=Q%26A'" do
+    expect(@uri.query).to eq("q=Q%26A")
+  end
+
+  it "should have query_values of {'q' => 'Q&A'}" do
+    expect(@uri.query_values).to eq({ 'q' => 'Q&A' })
+  end
+
+  it "should normalize to the original uri " +
+      "(with the ampersand properly percent-encoded)" do
+    expect(@uri.normalize.to_s).to eq("http://example.com/search?q=Q%26A")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?&x=b'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?&x=b")
+  end
+
+  it "should have a query of '&x=b'" do
+    expect(@uri.query).to eq("&x=b")
+  end
+
+  it "should have query_values of {'x' => 'b'}" do
+    expect(@uri.query_values).to eq({'x' => 'b'})
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?q='one;two'&x=1'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?q='one;two'&x=1")
+  end
+
+  it "should have a query of 'q='one;two'&x=1'" do
+    expect(@uri.query).to eq("q='one;two'&x=1")
+  end
+
+  it "should have query_values of {\"q\" => \"'one;two'\", \"x\" => \"1\"}" do
+    expect(@uri.query_values).to eq({"q" => "'one;two'", "x" => "1"})
+  end
+
+  it "should escape the ';' character when normalizing to avoid ambiguity " +
+      "with the W3C HTML 4.01 specification" do
+    # HTML 4.01 Section B.2.2
+    expect(@uri.normalize.query).to eq("q='one%3Btwo'&x=1")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?&&x=b'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?&&x=b")
+  end
+
+  it "should have a query of '&&x=b'" do
+    expect(@uri.query).to eq("&&x=b")
+  end
+
+  it "should have query_values of {'x' => 'b'}" do
+    expect(@uri.query_values).to eq({'x' => 'b'})
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?q=a&&x=b'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?q=a&&x=b")
+  end
+
+  it "should have a query of 'q=a&&x=b'" do
+    expect(@uri.query).to eq("q=a&&x=b")
+  end
+
+  it "should have query_values of {'q' => 'a, 'x' => 'b'}" do
+    expect(@uri.query_values).to eq({'q' => 'a', 'x' => 'b'})
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?q&&x=b'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?q&&x=b")
+  end
+
+  it "should have a query of 'q&&x=b'" do
+    expect(@uri.query).to eq("q&&x=b")
+  end
+
+  it "should have query_values of {'q' => true, 'x' => 'b'}" do
+    expect(@uri.query_values).to eq({'q' => nil, 'x' => 'b'})
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?q=a+b'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?q=a+b")
+  end
+
+  it "should have a query of 'q=a+b'" do
+    expect(@uri.query).to eq("q=a+b")
+  end
+
+  it "should have query_values of {'q' => 'a b'}" do
+    expect(@uri.query_values).to eq({'q' => 'a b'})
+  end
+
+  it "should have a normalized query of 'q=a+b'" do
+    expect(@uri.normalized_query).to eq("q=a+b")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?q=a%2bb'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?q=a%2bb")
+  end
+
+  it "should have a query of 'q=a+b'" do
+    expect(@uri.query).to eq("q=a%2bb")
+  end
+
+  it "should have query_values of {'q' => 'a+b'}" do
+    expect(@uri.query_values).to eq({'q' => 'a+b'})
+  end
+
+  it "should have a normalized query of 'q=a%2Bb'" do
+    expect(@uri.normalized_query).to eq("q=a%2Bb")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=%2B&z=C%CC%A7")
+  end
+
+  it "should have a normalized query of 'v=~&w=%25&x=%25&y=%2B&z=%C3%87'" do
+    expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=%2B&z=%C3%87")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?v=%7E&w=%&x=%25&y=+&z=C%CC%A7")
+  end
+
+  it "should have a normalized query of 'v=~&w=%25&x=%25&y=+&z=%C3%87'" do
+    expect(@uri.normalized_query).to eq("v=~&w=%25&x=%25&y=+&z=%C3%87")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/sound%2bvision'" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/sound%2bvision")
+  end
+
+  it "should have a normalized path of '/sound+vision'" do
+    expect(@uri.normalized_path).to eq('/sound+vision')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/?q='" do
+  before do
+    @uri = Addressable::URI.parse("http://example.com/?q=")
+  end
+
+  it "should have a query of 'q='" do
+    expect(@uri.query).to eq("q=")
+  end
+
+  it "should have query_values of {'q' => ''}" do
+    expect(@uri.query_values).to eq({'q' => ''})
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://user@example.com'" do
+  before do
+    @uri = Addressable::URI.parse("http://user@example.com")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have a username of 'user'" do
+    expect(@uri.user).to eq("user")
+  end
+
+  it "should have no password" do
+    expect(@uri.password).to eq(nil)
+  end
+
+  it "should have a userinfo of 'user'" do
+    expect(@uri.userinfo).to eq("user")
+  end
+
+  it "should have a normalized userinfo of 'user'" do
+    expect(@uri.normalized_userinfo).to eq("user")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should have default_port 80" do
+    expect(@uri.default_port).to eq(80)
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have the correct username after assignment" do
+    @uri.user = "newuser"
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.password).to eq(nil)
+    expect(@uri.to_s).to eq("http://newuser@example.com")
+  end
+
+  it "should have the correct password after assignment" do
+    @uri.password = "newpass"
+    expect(@uri.password).to eq("newpass")
+    expect(@uri.to_s).to eq("http://user:newpass@example.com")
+  end
+
+  it "should have the correct userinfo segment after assignment" do
+    @uri.userinfo = "newuser:newpass"
+    expect(@uri.userinfo).to eq("newuser:newpass")
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.password).to eq("newpass")
+    expect(@uri.host).to eq("example.com")
+    expect(@uri.port).to eq(nil)
+    expect(@uri.inferred_port).to eq(80)
+    expect(@uri.to_s).to eq("http://newuser:newpass@example.com")
+  end
+
+  it "should have the correct userinfo segment after nil assignment" do
+    @uri.userinfo = nil
+    expect(@uri.userinfo).to eq(nil)
+    expect(@uri.user).to eq(nil)
+    expect(@uri.password).to eq(nil)
+    expect(@uri.host).to eq("example.com")
+    expect(@uri.port).to eq(nil)
+    expect(@uri.inferred_port).to eq(80)
+    expect(@uri.to_s).to eq("http://example.com")
+  end
+
+  it "should have the correct authority segment after assignment" do
+    @uri.authority = "newuser@example.com"
+    expect(@uri.authority).to eq("newuser@example.com")
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.password).to eq(nil)
+    expect(@uri.host).to eq("example.com")
+    expect(@uri.port).to eq(nil)
+    expect(@uri.inferred_port).to eq(80)
+    expect(@uri.to_s).to eq("http://newuser@example.com")
+  end
+
+  it "should raise an error after nil assignment of authority segment" do
+    expect(lambda do
+      # This would create an invalid URI
+      @uri.authority = nil
+    end).to raise_error
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://user:@example.com'" do
+  before do
+    @uri = Addressable::URI.parse("http://user:@example.com")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have a username of 'user'" do
+    expect(@uri.user).to eq("user")
+  end
+
+  it "should have a password of ''" do
+    expect(@uri.password).to eq("")
+  end
+
+  it "should have a normalized userinfo of 'user:'" do
+    expect(@uri.normalized_userinfo).to eq("user:")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have the correct username after assignment" do
+    @uri.user = "newuser"
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.password).to eq("")
+    expect(@uri.to_s).to eq("http://newuser:@example.com")
+  end
+
+  it "should have the correct password after assignment" do
+    @uri.password = "newpass"
+    expect(@uri.password).to eq("newpass")
+    expect(@uri.to_s).to eq("http://user:newpass@example.com")
+  end
+
+  it "should have the correct authority segment after assignment" do
+    @uri.authority = "newuser:@example.com"
+    expect(@uri.authority).to eq("newuser:@example.com")
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.password).to eq("")
+    expect(@uri.host).to eq("example.com")
+    expect(@uri.port).to eq(nil)
+    expect(@uri.inferred_port).to eq(80)
+    expect(@uri.to_s).to eq("http://newuser:@example.com")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://:pass@example.com'" do
+  before do
+    @uri = Addressable::URI.parse("http://:pass@example.com")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have a username of ''" do
+    expect(@uri.user).to eq("")
+  end
+
+  it "should have a password of 'pass'" do
+    expect(@uri.password).to eq("pass")
+  end
+
+  it "should have a userinfo of ':pass'" do
+    expect(@uri.userinfo).to eq(":pass")
+  end
+
+  it "should have a normalized userinfo of ':pass'" do
+    expect(@uri.normalized_userinfo).to eq(":pass")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have the correct username after assignment" do
+    @uri.user = "newuser"
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.password).to eq("pass")
+    expect(@uri.to_s).to eq("http://newuser:pass@example.com")
+  end
+
+  it "should have the correct password after assignment" do
+    @uri.password = "newpass"
+    expect(@uri.password).to eq("newpass")
+    expect(@uri.user).to eq("")
+    expect(@uri.to_s).to eq("http://:newpass@example.com")
+  end
+
+  it "should have the correct authority segment after assignment" do
+    @uri.authority = ":newpass@example.com"
+    expect(@uri.authority).to eq(":newpass@example.com")
+    expect(@uri.user).to eq("")
+    expect(@uri.password).to eq("newpass")
+    expect(@uri.host).to eq("example.com")
+    expect(@uri.port).to eq(nil)
+    expect(@uri.inferred_port).to eq(80)
+    expect(@uri.to_s).to eq("http://:newpass@example.com")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://:@example.com'" do
+  before do
+    @uri = Addressable::URI.parse("http://:@example.com")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have a username of ''" do
+    expect(@uri.user).to eq("")
+  end
+
+  it "should have a password of ''" do
+    expect(@uri.password).to eq("")
+  end
+
+  it "should have a normalized userinfo of nil" do
+    expect(@uri.normalized_userinfo).to eq(nil)
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have the correct username after assignment" do
+    @uri.user = "newuser"
+    expect(@uri.user).to eq("newuser")
+    expect(@uri.password).to eq("")
+    expect(@uri.to_s).to eq("http://newuser:@example.com")
+  end
+
+  it "should have the correct password after assignment" do
+    @uri.password = "newpass"
+    expect(@uri.password).to eq("newpass")
+    expect(@uri.user).to eq("")
+    expect(@uri.to_s).to eq("http://:newpass@example.com")
+  end
+
+  it "should have the correct authority segment after assignment" do
+    @uri.authority = ":@newexample.com"
+    expect(@uri.authority).to eq(":@newexample.com")
+    expect(@uri.user).to eq("")
+    expect(@uri.password).to eq("")
+    expect(@uri.host).to eq("newexample.com")
+    expect(@uri.port).to eq(nil)
+    expect(@uri.inferred_port).to eq(80)
+    expect(@uri.to_s).to eq("http://:@newexample.com")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'#example'" do
+  before do
+    @uri = Addressable::URI.parse("#example")
+  end
+
+  it "should be considered relative" do
+    expect(@uri).to be_relative
+  end
+
+  it "should have a host of nil" do
+    expect(@uri.host).to eq(nil)
+  end
+
+  it "should have a site of nil" do
+    expect(@uri.site).to eq(nil)
+  end
+
+  it "should have a normalized_site of nil" do
+    expect(@uri.normalized_site).to eq(nil)
+  end
+
+  it "should have a path of ''" do
+    expect(@uri.path).to eq("")
+  end
+
+  it "should have a query string of nil" do
+    expect(@uri.query).to eq(nil)
+  end
+
+  it "should have a fragment of 'example'" do
+    expect(@uri.fragment).to eq("example")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "the network-path reference '//example.com/'" do
+  before do
+    @uri = Addressable::URI.parse("//example.com/")
+  end
+
+  it "should be considered relative" do
+    expect(@uri).to be_relative
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should have a path of '/'" do
+    expect(@uri.path).to eq("/")
+  end
+
+  it "should raise an error if routing is attempted" do
+    expect(lambda do
+      @uri.route_to("http://example.com/")
+    end).to raise_error(ArgumentError, /\/\/example.com\//)
+    expect(lambda do
+      @uri.route_from("http://example.com/")
+    end).to raise_error(ArgumentError, /\/\/example.com\//)
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'feed://http://example.com/'" do
+  before do
+    @uri = Addressable::URI.parse("feed://http://example.com/")
+  end
+
+  it "should have a host of 'http'" do
+    expect(@uri.host).to eq("http")
+  end
+
+  it "should have a path of '//example.com/'" do
+    expect(@uri.path).to eq("//example.com/")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'feed:http://example.com/'" do
+  before do
+    @uri = Addressable::URI.parse("feed:http://example.com/")
+  end
+
+  it "should have a path of 'http://example.com/'" do
+    expect(@uri.path).to eq("http://example.com/")
+  end
+
+  it "should normalize to 'http://example.com/'" do
+    expect(@uri.normalize.to_s).to eq("http://example.com/")
+    expect(@uri.normalize!.to_s).to eq("http://example.com/")
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'example://a/b/c/%7Bfoo%7D'" do
+  before do
+    @uri = Addressable::URI.parse("example://a/b/c/%7Bfoo%7D")
+  end
+
+  # Section 6.2.2 of RFC 3986
+  it "should be equivalent to eXAMPLE://a/./b/../b/%63/%7bfoo%7d" do
+    expect(@uri).to eq(
+      Addressable::URI.parse("eXAMPLE://a/./b/../b/%63/%7bfoo%7d")
+    )
+  end
+
+  it "should have an origin of 'example://a'" do
+    expect(@uri.origin).to eq('example://a')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://example.com/indirect/path/./to/../resource/'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "http://example.com/indirect/path/./to/../resource/")
+  end
+
+  it "should use the 'http' scheme" do
+    expect(@uri.scheme).to eq("http")
+  end
+
+  it "should have a host of 'example.com'" do
+    expect(@uri.host).to eq("example.com")
+  end
+
+  it "should use port 80" do
+    expect(@uri.inferred_port).to eq(80)
+  end
+
+  it "should have a path of '/indirect/path/./to/../resource/'" do
+    expect(@uri.path).to eq("/indirect/path/./to/../resource/")
+  end
+
+  # Section 6.2.2.3 of RFC 3986
+  it "should have a normalized path of '/indirect/path/resource/'" do
+    expect(@uri.normalize.path).to eq("/indirect/path/resource/")
+    expect(@uri.normalize!.path).to eq("/indirect/path/resource/")
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://under_score.example.com/'" do
+  it "should not cause an error" do
+    expect(lambda do
+      Addressable::URI.parse("http://under_score.example.com/")
+    end).not_to raise_error
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'./this:that'" do
+  before do
+    @uri = Addressable::URI.parse("./this:that")
+  end
+
+  it "should be considered relative" do
+    expect(@uri).to be_relative
+  end
+
+  it "should have no scheme" do
+    expect(@uri.scheme).to eq(nil)
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'this:that'" do
+  before do
+    @uri = Addressable::URI.parse("this:that")
+  end
+
+  it "should be considered absolute" do
+    expect(@uri).to be_absolute
+  end
+
+  it "should have a scheme of 'this'" do
+    expect(@uri.scheme).to eq("this")
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+describe Addressable::URI, "when parsed from '?'" do
+  before do
+    @uri = Addressable::URI.parse("?")
+  end
+
+  it "should normalize to ''" do
+    expect(@uri.normalize.to_s).to eq("")
+  end
+
+  it "should have the correct return type" do
+    expect(@uri.query_values).to eq({})
+    expect(@uri.query_values(Hash)).to eq({})
+    expect(@uri.query_values(Array)).to eq([])
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+describe Addressable::URI, "when parsed from '?one=1&two=2&three=3'" do
+  before do
+    @uri = Addressable::URI.parse("?one=1&two=2&three=3")
+  end
+
+  it "should have the correct query values" do
+    expect(@uri.query_values).to eq({"one" => "1", "two" => "2", "three" => "3"})
+  end
+
+  it "should raise an error for invalid return type values" do
+    expect(lambda do
+      @uri.query_values(Fixnum)
+    end).to raise_error(ArgumentError)
+  end
+
+  it "should have the correct array query values" do
+    expect(@uri.query_values(Array)).to eq([
+      ["one", "1"], ["two", "2"], ["three", "3"]
+    ])
+  end
+
+  it "should have a 'null' origin" do
+    expect(@uri.origin).to eq('null')
+  end
+end
+
+describe Addressable::URI, "when parsed from '?one=1=uno&two=2=dos'" do
+  before do
+    @uri = Addressable::URI.parse("?one=1=uno&two=2=dos")
+  end
+
+  it "should have the correct query values" do
+    expect(@uri.query_values).to eq({"one" => "1=uno", "two" => "2=dos"})
+  end
+
+  it "should have the correct array query values" do
+    expect(@uri.query_values(Array)).to eq([
+      ["one", "1=uno"], ["two", "2=dos"]
+    ])
+  end
+end
+
+describe Addressable::URI, "when parsed from '?one[two][three]=four'" do
+  before do
+    @uri = Addressable::URI.parse("?one[two][three]=four")
+  end
+
+  it "should have the correct query values" do
+    expect(@uri.query_values).to eq({"one[two][three]" => "four"})
+  end
+
+  it "should have the correct array query values" do
+    expect(@uri.query_values(Array)).to eq([
+      ["one[two][three]", "four"]
+    ])
+  end
+end
+
+describe Addressable::URI, "when parsed from '?one.two.three=four'" do
+  before do
+    @uri = Addressable::URI.parse("?one.two.three=four")
+  end
+
+  it "should have the correct query values" do
+    expect(@uri.query_values).to eq({
+      "one.two.three" => "four"
+    })
+  end
+
+  it "should have the correct array query values" do
+    expect(@uri.query_values(Array)).to eq([
+      ["one.two.three", "four"]
+    ])
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'?one[two][three]=four&one[two][five]=six'" do
+  before do
+    @uri = Addressable::URI.parse("?one[two][three]=four&one[two][five]=six")
+  end
+
+  it "should have the correct query values" do
+    expect(@uri.query_values).to eq({
+      "one[two][three]" => "four", "one[two][five]" => "six"
+    })
+  end
+
+  it "should have the correct array query values" do
+    expect(@uri.query_values(Array)).to eq([
+      ["one[two][three]", "four"], ["one[two][five]", "six"]
+    ])
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'?one.two.three=four&one.two.five=six'" do
+  before do
+    @uri = Addressable::URI.parse("?one.two.three=four&one.two.five=six")
+  end
+
+  it "should have the correct query values" do
+    expect(@uri.query_values).to eq({
+      "one.two.three" => "four", "one.two.five" => "six"
+    })
+  end
+
+  it "should have the correct array query values" do
+    expect(@uri.query_values(Array)).to eq([
+      ["one.two.three", "four"], ["one.two.five", "six"]
+    ])
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'?one=two&one=three'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "?one=two&one=three&one=four"
+    )
+  end
+
+  it "should have correct array query values" do
+    expect(@uri.query_values(Array)).to eq(
+      [['one', 'two'], ['one', 'three'], ['one', 'four']]
+    )
+  end
+
+  it "should have correct hash query values" do
+    skip("This is probably more desirable behavior.")
+    expect(@uri.query_values(Hash)).to eq(
+      {'one' => ['two', 'three', 'four']}
+      )
+  end
+
+  it "should handle assignment with keys of mixed type" do
+    @uri.query_values = @uri.query_values(Hash).merge({:one => 'three'})
+    expect(@uri.query_values(Hash)).to eq({'one' => 'three'})
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'?one[two][three][]=four&one[two][three][]=five'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "?one[two][three][]=four&one[two][three][]=five"
+    )
+  end
+
+  it "should have correct query values" do
+    expect(@uri.query_values(Hash)).to eq({"one[two][three][]" => "five"})
+  end
+
+  it "should have correct array query values" do
+    expect(@uri.query_values(Array)).to eq([
+      ["one[two][three][]", "four"], ["one[two][three][]", "five"]
+    ])
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'?one[two][three][0]=four&one[two][three][1]=five'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "?one[two][three][0]=four&one[two][three][1]=five"
+    )
+  end
+
+  it "should have the correct query values" do
+    expect(@uri.query_values).to eq({
+      "one[two][three][0]" => "four", "one[two][three][1]" => "five"
+    })
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'?one[two][three][1]=four&one[two][three][0]=five'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "?one[two][three][1]=four&one[two][three][0]=five"
+    )
+  end
+
+  it "should have the correct query values" do
+    expect(@uri.query_values).to eq({
+      "one[two][three][1]" => "four", "one[two][three][0]" => "five"
+    })
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'?one[two][three][2]=four&one[two][three][1]=five'" do
+  before do
+    @uri = Addressable::URI.parse(
+      "?one[two][three][2]=four&one[two][three][1]=five"
+    )
+  end
+
+  it "should have the correct query values" do
+    expect(@uri.query_values).to eq({
+      "one[two][three][2]" => "four", "one[two][three][1]" => "five"
+    })
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://www.詹姆斯.com/'" do
+  before do
+    @uri = Addressable::URI.parse("http://www.詹姆斯.com/")
+  end
+
+  it "should be equivalent to 'http://www.xn--8ws00zhy3a.com/'" do
+    expect(@uri).to eq(
+      Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/")
+    )
+  end
+
+  it "should not have domain name encoded during normalization" do
+    expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq(
+      "http://www.詹姆斯.com/"
+    )
+  end
+
+  it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do
+    expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://www.詹姆斯.com/ some spaces /'" do
+  before do
+    @uri = Addressable::URI.parse("http://www.詹姆斯.com/ some spaces /")
+  end
+
+  it "should be equivalent to " +
+      "'http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/'" do
+    expect(@uri).to eq(
+      Addressable::URI.parse(
+        "http://www.xn--8ws00zhy3a.com/%20some%20spaces%20/")
+    )
+  end
+
+  it "should not have domain name encoded during normalization" do
+    expect(Addressable::URI.normalized_encode(@uri.to_s)).to eq(
+      "http://www.詹姆斯.com/%20some%20spaces%20/"
+    )
+  end
+
+  it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do
+    expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://www.xn--8ws00zhy3a.com/'" do
+  before do
+    @uri = Addressable::URI.parse("http://www.xn--8ws00zhy3a.com/")
+  end
+
+  it "should be displayed as http://www.詹姆斯.com/" do
+    expect(@uri.display_uri.to_s).to eq("http://www.詹姆斯.com/")
+  end
+
+  it "should properly force the encoding" do
+    display_string = @uri.display_uri.to_str
+    expect(display_string).to eq("http://www.詹姆斯.com/")
+    if display_string.respond_to?(:encoding)
+      expect(display_string.encoding.to_s).to eq(Encoding::UTF_8.to_s)
+    end
+  end
+
+  it "should have an origin of 'http://www.xn--8ws00zhy3a.com'" do
+    expect(@uri.origin).to eq('http://www.xn--8ws00zhy3a.com')
+  end
+end
+
+describe Addressable::URI, "when parsed from " +
+    "'http://www.詹姆斯.com/atomtests/iri/詹.html'" do
+  before do
+    @uri = Addressable::URI.parse("http://www.詹姆斯.com/atomtests/iri/詹.html")
+  end
+
+  it "should normalize to " +
+      "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html" do
+    expect(@uri.normalize.to_s).to eq(
+      "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html"
+    )
+    expect(@uri.normalize!.to_s).to eq(
+      "http://www.xn--8ws00zhy3a.com/atomtests/iri/%E8%A9%B9.html"
+    )
+  end
+end
+
+describe Addressable::URI, "when parsed from a percent-encoded IRI" do
+  before do
+    @uri = Addressable::URI.parse(
+      "http://www.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA" +
+      "%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3" +
+      "%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82" +
+      "%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0" +
+      "%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3" +
+      "%81%9F%E3%82%8A%E3%81%AA%E3%81%84.w3.mag.keio.ac.jp"
+    )
+  end
+
+  it "should normalize to something sane" do
+    expect(@uri.normalize.to_s).to eq(
+      "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" +
+      "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/"
+    )
+    expect(@uri.normalize!.to_s).to eq(
+      "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" +
+      "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/"
+    )
+  end
+
+  it "should have the correct origin" do
+    expect(@uri.origin).to eq(
+      "http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3f" +
+      "g11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp"
+    )
+  end
+end
+
+describe Addressable::URI, "with a base uri of 'http://a/b/c/d;p?q'" do
+  before do
+    @uri = Addressable::URI.parse("http://a/b/c/d;p?q")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with 'g:h' should resolve to g:h" do
+    expect((@uri + "g:h").to_s).to eq("g:h")
+    expect(Addressable::URI.join(@uri, "g:h").to_s).to eq("g:h")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with 'g' should resolve to http://a/b/c/g" do
+    expect((@uri + "g").to_s).to eq("http://a/b/c/g")
+    expect(Addressable::URI.join(@uri.to_s, "g").to_s).to eq("http://a/b/c/g")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with './g' should resolve to http://a/b/c/g" do
+    expect((@uri + "./g").to_s).to eq("http://a/b/c/g")
+    expect(Addressable::URI.join(@uri.to_s, "./g").to_s).to eq("http://a/b/c/g")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with 'g/' should resolve to http://a/b/c/g/" do
+    expect((@uri + "g/").to_s).to eq("http://a/b/c/g/")
+    expect(Addressable::URI.join(@uri.to_s, "g/").to_s).to eq("http://a/b/c/g/")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '/g' should resolve to http://a/g" do
+    expect((@uri + "/g").to_s).to eq("http://a/g")
+    expect(Addressable::URI.join(@uri.to_s, "/g").to_s).to eq("http://a/g")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '//g' should resolve to http://g" do
+    expect((@uri + "//g").to_s).to eq("http://g")
+    expect(Addressable::URI.join(@uri.to_s, "//g").to_s).to eq("http://g")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '?y' should resolve to http://a/b/c/d;p?y" do
+    expect((@uri + "?y").to_s).to eq("http://a/b/c/d;p?y")
+    expect(Addressable::URI.join(@uri.to_s, "?y").to_s).to eq("http://a/b/c/d;p?y")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with 'g?y' should resolve to http://a/b/c/g?y" do
+    expect((@uri + "g?y").to_s).to eq("http://a/b/c/g?y")
+    expect(Addressable::URI.join(@uri.to_s, "g?y").to_s).to eq("http://a/b/c/g?y")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '#s' should resolve to http://a/b/c/d;p?q#s" do
+    expect((@uri + "#s").to_s).to eq("http://a/b/c/d;p?q#s")
+    expect(Addressable::URI.join(@uri.to_s, "#s").to_s).to eq(
+      "http://a/b/c/d;p?q#s"
+    )
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with 'g#s' should resolve to http://a/b/c/g#s" do
+    expect((@uri + "g#s").to_s).to eq("http://a/b/c/g#s")
+    expect(Addressable::URI.join(@uri.to_s, "g#s").to_s).to eq("http://a/b/c/g#s")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with 'g?y#s' should resolve to http://a/b/c/g?y#s" do
+    expect((@uri + "g?y#s").to_s).to eq("http://a/b/c/g?y#s")
+    expect(Addressable::URI.join(
+      @uri.to_s, "g?y#s").to_s).to eq("http://a/b/c/g?y#s")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with ';x' should resolve to http://a/b/c/;x" do
+    expect((@uri + ";x").to_s).to eq("http://a/b/c/;x")
+    expect(Addressable::URI.join(@uri.to_s, ";x").to_s).to eq("http://a/b/c/;x")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with 'g;x' should resolve to http://a/b/c/g;x" do
+    expect((@uri + "g;x").to_s).to eq("http://a/b/c/g;x")
+    expect(Addressable::URI.join(@uri.to_s, "g;x").to_s).to eq("http://a/b/c/g;x")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with 'g;x?y#s' should resolve to http://a/b/c/g;x?y#s" do
+    expect((@uri + "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s")
+    expect(Addressable::URI.join(
+      @uri.to_s, "g;x?y#s").to_s).to eq("http://a/b/c/g;x?y#s")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '' should resolve to http://a/b/c/d;p?q" do
+    expect((@uri + "").to_s).to eq("http://a/b/c/d;p?q")
+    expect(Addressable::URI.join(@uri.to_s, "").to_s).to eq("http://a/b/c/d;p?q")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '.' should resolve to http://a/b/c/" do
+    expect((@uri + ".").to_s).to eq("http://a/b/c/")
+    expect(Addressable::URI.join(@uri.to_s, ".").to_s).to eq("http://a/b/c/")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with './' should resolve to http://a/b/c/" do
+    expect((@uri + "./").to_s).to eq("http://a/b/c/")
+    expect(Addressable::URI.join(@uri.to_s, "./").to_s).to eq("http://a/b/c/")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '..' should resolve to http://a/b/" do
+    expect((@uri + "..").to_s).to eq("http://a/b/")
+    expect(Addressable::URI.join(@uri.to_s, "..").to_s).to eq("http://a/b/")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '../' should resolve to http://a/b/" do
+    expect((@uri + "../").to_s).to eq("http://a/b/")
+    expect(Addressable::URI.join(@uri.to_s, "../").to_s).to eq("http://a/b/")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '../g' should resolve to http://a/b/g" do
+    expect((@uri + "../g").to_s).to eq("http://a/b/g")
+    expect(Addressable::URI.join(@uri.to_s, "../g").to_s).to eq("http://a/b/g")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '../..' should resolve to http://a/" do
+    expect((@uri + "../..").to_s).to eq("http://a/")
+    expect(Addressable::URI.join(@uri.to_s, "../..").to_s).to eq("http://a/")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '../../' should resolve to http://a/" do
+    expect((@uri + "../../").to_s).to eq("http://a/")
+    expect(Addressable::URI.join(@uri.to_s, "../../").to_s).to eq("http://a/")
+  end
+
+  # Section 5.4.1 of RFC 3986
+  it "when joined with '../../g' should resolve to http://a/g" do
+    expect((@uri + "../../g").to_s).to eq("http://a/g")
+    expect(Addressable::URI.join(@uri.to_s, "../../g").to_s).to eq("http://a/g")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with '../../../g' should resolve to http://a/g" do
+    expect((@uri + "../../../g").to_s).to eq("http://a/g")
+    expect(Addressable::URI.join(@uri.to_s, "../../../g").to_s).to eq("http://a/g")
+  end
+
+  it "when joined with '../.././../g' should resolve to http://a/g" do
+    expect((@uri + "../.././../g").to_s).to eq("http://a/g")
+    expect(Addressable::URI.join(@uri.to_s, "../.././../g").to_s).to eq(
+      "http://a/g"
+    )
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with '../../../../g' should resolve to http://a/g" do
+    expect((@uri + "../../../../g").to_s).to eq("http://a/g")
+    expect(Addressable::URI.join(
+      @uri.to_s, "../../../../g").to_s).to eq("http://a/g")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with '/./g' should resolve to http://a/g" do
+    expect((@uri + "/./g").to_s).to eq("http://a/g")
+    expect(Addressable::URI.join(@uri.to_s, "/./g").to_s).to eq("http://a/g")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with '/../g' should resolve to http://a/g" do
+    expect((@uri + "/../g").to_s).to eq("http://a/g")
+    expect(Addressable::URI.join(@uri.to_s, "/../g").to_s).to eq("http://a/g")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with 'g.' should resolve to http://a/b/c/g." do
+    expect((@uri + "g.").to_s).to eq("http://a/b/c/g.")
+    expect(Addressable::URI.join(@uri.to_s, "g.").to_s).to eq("http://a/b/c/g.")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with '.g' should resolve to http://a/b/c/.g" do
+    expect((@uri + ".g").to_s).to eq("http://a/b/c/.g")
+    expect(Addressable::URI.join(@uri.to_s, ".g").to_s).to eq("http://a/b/c/.g")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with 'g..' should resolve to http://a/b/c/g.." do
+    expect((@uri + "g..").to_s).to eq("http://a/b/c/g..")
+    expect(Addressable::URI.join(@uri.to_s, "g..").to_s).to eq("http://a/b/c/g..")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with '..g' should resolve to http://a/b/c/..g" do
+    expect((@uri + "..g").to_s).to eq("http://a/b/c/..g")
+    expect(Addressable::URI.join(@uri.to_s, "..g").to_s).to eq("http://a/b/c/..g")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with './../g' should resolve to http://a/b/g" do
+    expect((@uri + "./../g").to_s).to eq("http://a/b/g")
+    expect(Addressable::URI.join(@uri.to_s, "./../g").to_s).to eq("http://a/b/g")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with './g/.' should resolve to http://a/b/c/g/" do
+    expect((@uri + "./g/.").to_s).to eq("http://a/b/c/g/")
+    expect(Addressable::URI.join(@uri.to_s, "./g/.").to_s).to eq("http://a/b/c/g/")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with 'g/./h' should resolve to http://a/b/c/g/h" do
+    expect((@uri + "g/./h").to_s).to eq("http://a/b/c/g/h")
+    expect(Addressable::URI.join(@uri.to_s, "g/./h").to_s).to eq("http://a/b/c/g/h")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with 'g/../h' should resolve to http://a/b/c/h" do
+    expect((@uri + "g/../h").to_s).to eq("http://a/b/c/h")
+    expect(Addressable::URI.join(@uri.to_s, "g/../h").to_s).to eq("http://a/b/c/h")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with 'g;x=1/./y' " +
+      "should resolve to http://a/b/c/g;x=1/y" do
+    expect((@uri + "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y")
+    expect(Addressable::URI.join(
+      @uri.to_s, "g;x=1/./y").to_s).to eq("http://a/b/c/g;x=1/y")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with 'g;x=1/../y' should resolve to http://a/b/c/y" do
+    expect((@uri + "g;x=1/../y").to_s).to eq("http://a/b/c/y")
+    expect(Addressable::URI.join(
+      @uri.to_s, "g;x=1/../y").to_s).to eq("http://a/b/c/y")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with 'g?y/./x' " +
+      "should resolve to http://a/b/c/g?y/./x" do
+    expect((@uri + "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x")
+    expect(Addressable::URI.join(
+      @uri.to_s, "g?y/./x").to_s).to eq("http://a/b/c/g?y/./x")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with 'g?y/../x' " +
+      "should resolve to http://a/b/c/g?y/../x" do
+    expect((@uri + "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x")
+    expect(Addressable::URI.join(
+      @uri.to_s, "g?y/../x").to_s).to eq("http://a/b/c/g?y/../x")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with 'g#s/./x' " +
+      "should resolve to http://a/b/c/g#s/./x" do
+    expect((@uri + "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x")
+    expect(Addressable::URI.join(
+      @uri.to_s, "g#s/./x").to_s).to eq("http://a/b/c/g#s/./x")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with 'g#s/../x' " +
+      "should resolve to http://a/b/c/g#s/../x" do
+    expect((@uri + "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x")
+    expect(Addressable::URI.join(
+      @uri.to_s, "g#s/../x").to_s).to eq("http://a/b/c/g#s/../x")
+  end
+
+  # Section 5.4.2 of RFC 3986
+  it "when joined with 'http:g' should resolve to http:g" do
+    expect((@uri + "http:g").to_s).to eq("http:g")
+    expect(Addressable::URI.join(@uri.to_s, "http:g").to_s).to eq("http:g")
+  end
+
+  # Edge case to be sure
+  it "when joined with '//example.com/' should " +
+      "resolve to http://example.com/" do
+    expect((@uri + "//example.com/").to_s).to eq("http://example.com/")
+    expect(Addressable::URI.join(
+      @uri.to_s, "//example.com/").to_s).to eq("http://example.com/")
+  end
+
+  it "when joined with a bogus object a TypeError should be raised" do
+    expect(lambda do
+      Addressable::URI.join(@uri, 42)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when converting the path " +
+    "'relative/path/to/something'" do
+  before do
+    @path = 'relative/path/to/something'
+  end
+
+  it "should convert to " +
+      "\'relative/path/to/something\'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.to_str).to eq("relative/path/to/something")
+  end
+
+  it "should join with an absolute file path correctly" do
+    @base = Addressable::URI.convert_path("/absolute/path/")
+    @uri = Addressable::URI.convert_path(@path)
+    expect((@base + @uri).to_str).to eq(
+      "file:///absolute/path/relative/path/to/something"
+    )
+  end
+end
+
+describe Addressable::URI, "when converting a bogus path" do
+  it "should raise a TypeError" do
+    expect(lambda do
+      Addressable::URI.convert_path(42)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when given a UNIX root directory" do
+  before do
+    @path = "/"
+  end
+
+  it "should convert to \'file:///\'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.to_str).to eq("file:///")
+  end
+
+  it "should have an origin of 'file://'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.origin).to eq('file://')
+  end
+end
+
+describe Addressable::URI, "when given a Windows root directory" do
+  before do
+    @path = "C:\\"
+  end
+
+  it "should convert to \'file:///c:/\'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.to_str).to eq("file:///c:/")
+  end
+
+  it "should have an origin of 'file://'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.origin).to eq('file://')
+  end
+end
+
+describe Addressable::URI, "when given the path '/one/two/'" do
+  before do
+    @path = '/one/two/'
+  end
+
+  it "should convert to " +
+      "\'file:///one/two/\'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.to_str).to eq("file:///one/two/")
+  end
+
+  it "should have an origin of 'file://'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.origin).to eq('file://')
+  end
+end
+
+describe Addressable::URI, "when given the path " +
+    "'c:\\windows\\My Documents 100%20\\foo.txt'" do
+  before do
+    @path = "c:\\windows\\My Documents 100%20\\foo.txt"
+  end
+
+  it "should convert to " +
+      "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt")
+  end
+
+  it "should have an origin of 'file://'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.origin).to eq('file://')
+  end
+end
+
+describe Addressable::URI, "when given the path " +
+    "'file://c:\\windows\\My Documents 100%20\\foo.txt'" do
+  before do
+    @path = "file://c:\\windows\\My Documents 100%20\\foo.txt"
+  end
+
+  it "should convert to " +
+      "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt")
+  end
+
+  it "should have an origin of 'file://'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.origin).to eq('file://')
+  end
+end
+
+describe Addressable::URI, "when given the path " +
+    "'file:c:\\windows\\My Documents 100%20\\foo.txt'" do
+  before do
+    @path = "file:c:\\windows\\My Documents 100%20\\foo.txt"
+  end
+
+  it "should convert to " +
+      "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt")
+  end
+
+  it "should have an origin of 'file://'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.origin).to eq('file://')
+  end
+end
+
+describe Addressable::URI, "when given the path " +
+    "'file:/c:\\windows\\My Documents 100%20\\foo.txt'" do
+  before do
+    @path = "file:/c:\\windows\\My Documents 100%20\\foo.txt"
+  end
+
+  it "should convert to " +
+      "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt")
+  end
+
+  it "should have an origin of 'file://'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.origin).to eq('file://')
+  end
+end
+
+describe Addressable::URI, "when given the path " +
+    "'file:///c|/windows/My%20Documents%20100%20/foo.txt'" do
+  before do
+    @path = "file:///c|/windows/My%20Documents%20100%20/foo.txt"
+  end
+
+  it "should convert to " +
+      "\'file:///c:/windows/My%20Documents%20100%20/foo.txt\'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.to_str).to eq("file:///c:/windows/My%20Documents%20100%20/foo.txt")
+  end
+
+  it "should have an origin of 'file://'" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.origin).to eq('file://')
+  end
+end
+
+describe Addressable::URI, "when given an http protocol URI" do
+  before do
+    @path = "http://example.com/"
+  end
+
+  it "should not do any conversion at all" do
+    @uri = Addressable::URI.convert_path(@path)
+    expect(@uri.to_str).to eq("http://example.com/")
+  end
+end
+
+class SuperString
+  def initialize(string)
+    @string = string.to_s
+  end
+
+  def to_str
+    return @string
+  end
+end
+
+describe Addressable::URI, "when parsing a non-String object" do
+  it "should correctly parse anything with a 'to_str' method" do
+    Addressable::URI.parse(SuperString.new(42))
+  end
+
+  it "should raise a TypeError for objects than cannot be converted" do
+    expect(lambda do
+      Addressable::URI.parse(42)
+    end).to raise_error(TypeError)
+  end
+
+  it "should correctly parse heuristically anything with a 'to_str' method" do
+    Addressable::URI.heuristic_parse(SuperString.new(42))
+  end
+
+  it "should raise a TypeError for objects than cannot be converted" do
+    expect(lambda do
+      Addressable::URI.heuristic_parse(42)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when form encoding a hash" do
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.form_encode(
+      [["&one", "/1"], ["=two", "?2"], [":three", "#3"]]
+    )).to eq("%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233")
+  end
+
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.form_encode(
+      {"q" => "one two three"}
+    )).to eq("q=one+two+three")
+  end
+
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.form_encode(
+      {"key" => nil}
+    )).to eq("key=")
+  end
+
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.form_encode(
+      {"q" => ["one", "two", "three"]}
+    )).to eq("q=one&q=two&q=three")
+  end
+
+  it "should result in correctly encoded newlines" do
+    expect(Addressable::URI.form_encode(
+      {"text" => "one\ntwo\rthree\r\nfour\n\r"}
+    )).to eq("text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A")
+  end
+
+  it "should result in a sorted percent encoded sequence" do
+    expect(Addressable::URI.form_encode(
+      [["a", "1"], ["dup", "3"], ["dup", "2"]], true
+    )).to eq("a=1&dup=2&dup=3")
+  end
+end
+
+describe Addressable::URI, "when form encoding a non-Array object" do
+  it "should raise a TypeError for objects than cannot be converted" do
+    expect(lambda do
+      Addressable::URI.form_encode(42)
+    end).to raise_error(TypeError)
+  end
+end
+
+# See https://tools.ietf.org/html/rfc6749#appendix-B
+describe Addressable::URI, "when form encoding the example value from OAuth 2" do
+  it "should result in correct values" do
+    expect(Addressable::URI.form_encode(
+      {"value" => " %&+£€"}
+    )).to eq("value=+%25%26%2B%C2%A3%E2%82%AC")
+  end
+end
+
+# See https://tools.ietf.org/html/rfc6749#appendix-B
+describe Addressable::URI, "when form unencoding the example value from OAuth 2" do
+  it "should result in correct values" do
+    expect(Addressable::URI.form_unencode(
+      "value=+%25%26%2B%C2%A3%E2%82%AC"
+    )).to eq([["value", " %&+£€"]])
+  end
+end
+
+describe Addressable::URI, "when form unencoding a string" do
+  it "should result in correct values" do
+    expect(Addressable::URI.form_unencode(
+      "%26one=%2F1&%3Dtwo=%3F2&%3Athree=%233"
+    )).to eq([["&one", "/1"], ["=two", "?2"], [":three", "#3"]])
+  end
+
+  it "should result in correct values" do
+    expect(Addressable::URI.form_unencode(
+      "q=one+two+three"
+    )).to eq([["q", "one two three"]])
+  end
+
+  it "should result in correct values" do
+    expect(Addressable::URI.form_unencode(
+      "text=one%0D%0Atwo%0D%0Athree%0D%0Afour%0D%0A%0D%0A"
+    )).to eq([["text", "one\ntwo\nthree\nfour\n\n"]])
+  end
+
+  it "should result in correct values" do
+    expect(Addressable::URI.form_unencode(
+      "a=1&dup=2&dup=3"
+    )).to eq([["a", "1"], ["dup", "2"], ["dup", "3"]])
+  end
+
+  it "should result in correct values" do
+    expect(Addressable::URI.form_unencode(
+      "key"
+    )).to eq([["key", nil]])
+  end
+
+  it "should result in correct values" do
+    expect(Addressable::URI.form_unencode("GivenName=Ren%C3%A9")).to eq(
+      [["GivenName", "René"]]
+    )
+  end
+end
+
+describe Addressable::URI, "when form unencoding a non-String object" do
+  it "should correctly parse anything with a 'to_str' method" do
+    Addressable::URI.form_unencode(SuperString.new(42))
+  end
+
+  it "should raise a TypeError for objects than cannot be converted" do
+    expect(lambda do
+      Addressable::URI.form_unencode(42)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when normalizing a non-String object" do
+  it "should correctly parse anything with a 'to_str' method" do
+    Addressable::URI.normalize_component(SuperString.new(42))
+  end
+
+  it "should raise a TypeError for objects than cannot be converted" do
+    expect(lambda do
+      Addressable::URI.normalize_component(42)
+    end).to raise_error(TypeError)
+  end
+
+  it "should raise a TypeError for objects than cannot be converted" do
+    expect(lambda do
+      Addressable::URI.normalize_component("component", 42)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when normalizing a path with an encoded slash" do
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.parse("/path%2Fsegment/").normalize.path).to eq(
+      "/path%2Fsegment/"
+    )
+  end
+end
+
+describe Addressable::URI, "when normalizing a partially encoded string" do
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.normalize_component(
+      "partially % encoded%21"
+    )).to eq("partially%20%25%20encoded!")
+  end
+
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.normalize_component(
+      "partially %25 encoded!"
+    )).to eq("partially%20%25%20encoded!")
+  end
+end
+
+describe Addressable::URI, "when normalizing a unicode sequence" do
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.normalize_component(
+      "/C%CC%A7"
+    )).to eq("/%C3%87")
+  end
+
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.normalize_component(
+      "/%C3%87"
+    )).to eq("/%C3%87")
+  end
+end
+
+describe Addressable::URI, "when normalizing a multibyte string" do
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.normalize_component("günther")).to eq(
+      "g%C3%BCnther"
+    )
+  end
+
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.normalize_component("g%C3%BCnther")).to eq(
+      "g%C3%BCnther"
+    )
+  end
+end
+
+describe Addressable::URI, "when normalizing a string but leaving some characters encoded" do
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.normalize_component("%58X%59Y%5AZ", "0-9a-zXY", "Y")).to eq(
+      "XX%59Y%5A%5A"
+    )
+  end
+
+  it "should not modify the character class" do
+    character_class = "0-9a-zXY"
+
+    character_class_copy = character_class.dup
+
+    Addressable::URI.normalize_component("%58X%59Y%5AZ", character_class, "Y")
+
+    expect(character_class).to eq(character_class_copy)
+  end
+end
+
+describe Addressable::URI, "when encoding a string with existing encodings to upcase" do
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.encode_component("JK%4c", "0-9A-IKM-Za-z%", "L")).to eq("%4AK%4C")
+  end
+end
+
+describe Addressable::URI, "when encoding a multibyte string" do
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.encode_component("günther")).to eq("g%C3%BCnther")
+  end
+
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.encode_component(
+      "günther", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/
+    )).to eq("g%C3%BCnther")
+  end
+end
+
+describe Addressable::URI, "when form encoding a multibyte string" do
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.form_encode({"GivenName" => "René"})).to eq(
+      "GivenName=Ren%C3%A9"
+    )
+  end
+end
+
+describe Addressable::URI, "when encoding a string with ASCII chars 0-15" do
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.encode_component("one\ntwo")).to eq("one%0Atwo")
+  end
+
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.encode_component(
+      "one\ntwo", /[^a-zA-Z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\-\.\_\~]/
+    )).to eq("one%0Atwo")
+  end
+end
+
+describe Addressable::URI, "when unencoding a multibyte string" do
+  it "should result in correct percent encoded sequence" do
+    expect(Addressable::URI.unencode_component("g%C3%BCnther")).to eq("günther")
+  end
+
+  it "should consistently use UTF-8 internally" do
+    expect(Addressable::URI.unencode_component("ski=%BA%DAɫ")).to eq("ski=\xBA\xDAɫ")
+  end
+
+  it "should result in correct percent encoded sequence as a URI" do
+    expect(Addressable::URI.unencode(
+      "/path?g%C3%BCnther", ::Addressable::URI
+    )).to eq(Addressable::URI.new(
+      :path => "/path", :query => "günther"
+    ))
+  end
+end
+
+describe Addressable::URI, "when partially unencoding a string" do
+  it "should unencode all characters by default" do
+    expect(Addressable::URI.unencode('%%25~%7e+%2b', String)).to eq('%%~~++')
+  end
+
+  it "should unencode characters not in leave_encoded" do
+    expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '~')).to eq('%%~%7e++')
+  end
+
+  it "should leave characters in leave_encoded alone" do
+    expect(Addressable::URI.unencode('%%25~%7e+%2b', String, '%~+')).to eq('%%25~%7e+%2b')
+  end
+end
+
+describe Addressable::URI, "when unencoding a bogus object" do
+  it "should raise a TypeError" do
+    expect(lambda do
+      Addressable::URI.unencode_component(42)
+    end).to raise_error(TypeError)
+  end
+
+  it "should raise a TypeError" do
+    expect(lambda do
+      Addressable::URI.unencode("/path?g%C3%BCnther", Integer)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when encoding a bogus object" do
+  it "should raise a TypeError" do
+    expect(lambda do
+      Addressable::URI.encode(Object.new)
+    end).to raise_error(TypeError)
+  end
+
+  it "should raise a TypeError" do
+    expect(lambda do
+      Addressable::URI.normalized_encode(Object.new)
+    end).to raise_error(TypeError)
+  end
+
+  it "should raise a TypeError" do
+    expect(lambda do
+      Addressable::URI.encode_component("günther", Object.new)
+    end).to raise_error(TypeError)
+  end
+
+  it "should raise a TypeError" do
+    expect(lambda do
+      Addressable::URI.encode_component(Object.new)
+    end).to raise_error(TypeError)
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'http://example.com/'" do
+  before do
+    @input = "http://example.com/"
+  end
+
+  it "should heuristically parse to 'http://example.com/'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("http://example.com/")
+  end
+
+  it "should not raise error when frozen" do
+    expect(lambda do
+      Addressable::URI.heuristic_parse(@input).freeze.to_s
+    end).not_to raise_error
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'https://example.com/'" do
+  before do
+    @input = "https://example.com/"
+  end
+
+  it "should heuristically parse to 'https://example.com/'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("https://example.com/")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'http:example.com/'" do
+  before do
+    @input = "http:example.com/"
+  end
+
+  it "should heuristically parse to 'http://example.com/'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("http://example.com/")
+  end
+
+  it "should heuristically parse to 'http://example.com/' " +
+      "even with a scheme hint of 'ftp'" do
+    @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'})
+    expect(@uri.to_s).to eq("http://example.com/")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'https:example.com/'" do
+  before do
+    @input = "https:example.com/"
+  end
+
+  it "should heuristically parse to 'https://example.com/'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("https://example.com/")
+  end
+
+  it "should heuristically parse to 'https://example.com/' " +
+      "even with a scheme hint of 'ftp'" do
+    @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'})
+    expect(@uri.to_s).to eq("https://example.com/")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'http://example.com/example.com/'" do
+  before do
+    @input = "http://example.com/example.com/"
+  end
+
+  it "should heuristically parse to 'http://example.com/example.com/'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("http://example.com/example.com/")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'http://prefix\\.example.com/'" do
+  before do
+    @input = "http://prefix\\.example.com/"
+  end
+
+  it "should heuristically parse to 'http://prefix/.example.com/'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.authority).to eq("prefix")
+    expect(@uri.to_s).to eq("http://prefix/.example.com/")
+  end
+
+  it "should heuristically parse to 'http://prefix/.example.com/' " +
+      "even with a scheme hint of 'ftp'" do
+    @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'})
+    expect(@uri.to_s).to eq("http://prefix/.example.com/")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'http://p:\\/'" do
+  before do
+    @input = "http://p:\\/"
+  end
+
+  it "should heuristically parse to 'http://p//'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.authority).to eq("p")
+    expect(@uri.to_s).to eq("http://p//")
+  end
+
+  it "should heuristically parse to 'http://p//' " +
+      "even with a scheme hint of 'ftp'" do
+    @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'})
+    expect(@uri.to_s).to eq("http://p//")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'http://p://'" do
+  before do
+    @input = "http://p://"
+  end
+
+  it "should heuristically parse to 'http://p//'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.authority).to eq("p")
+    expect(@uri.to_s).to eq("http://p//")
+  end
+
+  it "should heuristically parse to 'http://p//' " +
+      "even with a scheme hint of 'ftp'" do
+    @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'})
+    expect(@uri.to_s).to eq("http://p//")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'http://p://p'" do
+  before do
+    @input = "http://p://p"
+  end
+
+  it "should heuristically parse to 'http://p//p'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.authority).to eq("p")
+    expect(@uri.to_s).to eq("http://p//p")
+  end
+
+  it "should heuristically parse to 'http://p//p' " +
+      "even with a scheme hint of 'ftp'" do
+    @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'})
+    expect(@uri.to_s).to eq("http://p//p")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'http://prefix .example.com/'" do
+  before do
+    @input = "http://prefix .example.com/"
+  end
+
+  # Justification here being that no browser actually tries to resolve this.
+  # They all treat this as a web search.
+  it "should heuristically parse to 'http://prefix%20.example.com/'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.authority).to eq("prefix%20.example.com")
+    expect(@uri.to_s).to eq("http://prefix%20.example.com/")
+  end
+
+  it "should heuristically parse to 'http://prefix%20.example.com/' " +
+      "even with a scheme hint of 'ftp'" do
+    @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'})
+    expect(@uri.to_s).to eq("http://prefix%20.example.com/")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'  http://www.example.com/  '" do
+  before do
+    @input = "  http://www.example.com/  "
+  end
+
+  it "should heuristically parse to 'http://prefix%20.example.com/'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.scheme).to eq("http")
+    expect(@uri.path).to eq("/")
+    expect(@uri.to_s).to eq("http://www.example.com/")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'http://prefix%2F.example.com/'" do
+  before do
+    @input = "http://prefix%2F.example.com/"
+  end
+
+  it "should heuristically parse to 'http://prefix%2F.example.com/'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.authority).to eq("prefix%2F.example.com")
+    expect(@uri.to_s).to eq("http://prefix%2F.example.com/")
+  end
+
+  it "should heuristically parse to 'http://prefix%2F.example.com/' " +
+      "even with a scheme hint of 'ftp'" do
+    @uri = Addressable::URI.heuristic_parse(@input, {:scheme => 'ftp'})
+    expect(@uri.to_s).to eq("http://prefix%2F.example.com/")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'/path/to/resource'" do
+  before do
+    @input = "/path/to/resource"
+  end
+
+  it "should heuristically parse to '/path/to/resource'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("/path/to/resource")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'relative/path/to/resource'" do
+  before do
+    @input = "relative/path/to/resource"
+  end
+
+  it "should heuristically parse to 'relative/path/to/resource'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("relative/path/to/resource")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'example.com'" do
+  before do
+    @input = "example.com"
+  end
+
+  it "should heuristically parse to 'http://example.com'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("http://example.com")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'example.com' and a scheme hint of 'ftp'" do
+  before do
+    @input = "example.com"
+    @hints = {:scheme => 'ftp'}
+  end
+
+  it "should heuristically parse to 'http://example.com'" do
+    @uri = Addressable::URI.heuristic_parse(@input, @hints)
+    expect(@uri.to_s).to eq("ftp://example.com")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'example.com:21' and a scheme hint of 'ftp'" do
+  before do
+    @input = "example.com:21"
+    @hints = {:scheme => 'ftp'}
+  end
+
+  it "should heuristically parse to 'http://example.com:21'" do
+    @uri = Addressable::URI.heuristic_parse(@input, @hints)
+    expect(@uri.to_s).to eq("ftp://example.com:21")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'example.com/path/to/resource'" do
+  before do
+    @input = "example.com/path/to/resource"
+  end
+
+  it "should heuristically parse to 'http://example.com/path/to/resource'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("http://example.com/path/to/resource")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'http:///example.com'" do
+  before do
+    @input = "http:///example.com"
+  end
+
+  it "should heuristically parse to 'http://example.com'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("http://example.com")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'feed:///example.com'" do
+  before do
+    @input = "feed:///example.com"
+  end
+
+  it "should heuristically parse to 'feed://example.com'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("feed://example.com")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'file://path/to/resource/'" do
+  before do
+    @input = "file://path/to/resource/"
+  end
+
+  it "should heuristically parse to 'file:///path/to/resource/'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("file:///path/to/resource/")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "'feed://http://example.com'" do
+  before do
+    @input = "feed://http://example.com"
+  end
+
+  it "should heuristically parse to 'feed:http://example.com'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("feed:http://example.com")
+  end
+end
+
+describe Addressable::URI, "when given the input " +
+    "::URI.parse('http://example.com')" do
+  before do
+    @input = ::URI.parse('http://example.com')
+  end
+
+  it "should heuristically parse to 'http://example.com'" do
+    @uri = Addressable::URI.heuristic_parse(@input)
+    expect(@uri.to_s).to eq("http://example.com")
+  end
+end
+
+describe Addressable::URI, "when assigning query values" do
+  before do
+    @uri = Addressable::URI.new
+  end
+
+  it "should correctly assign {:a => 'a', :b => ['c', 'd', 'e']}" do
+    @uri.query_values = {:a => "a", :b => ["c", "d", "e"]}
+    expect(@uri.query).to eq("a=a&b=c&b=d&b=e")
+  end
+
+  it "should raise an error attempting to assign {'a' => {'b' => ['c']}}" do
+    expect(lambda do
+      @uri.query_values = { 'a' => {'b' => ['c'] } }
+    end).to raise_error(TypeError)
+  end
+
+  it "should raise an error attempting to assign " +
+      "{:b => '2', :a => {:c => '1'}}" do
+    expect(lambda do
+      @uri.query_values = {:b => '2', :a => {:c => '1'}}
+    end).to raise_error(TypeError)
+  end
+
+  it "should raise an error attempting to assign " +
+      "{:a => 'a', :b => [{:c => 'c', :d => 'd'}, " +
+      "{:e => 'e', :f => 'f'}]}" do
+    expect(lambda do
+      @uri.query_values = {
+        :a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]
+      }
+    end).to raise_error(TypeError)
+  end
+
+  it "should raise an error attempting to assign " +
+      "{:a => 'a', :b => [{:c => true, :d => 'd'}, " +
+      "{:e => 'e', :f => 'f'}]}" do
+    expect(lambda do
+      @uri.query_values = {
+        :a => 'a', :b => [{:c => true, :d => 'd'}, {:e => 'e', :f => 'f'}]
+      }
+    end).to raise_error(TypeError)
+  end
+
+  it "should raise an error attempting to assign " +
+      "{:a => 'a', :b => {:c => true, :d => 'd'}}" do
+    expect(lambda do
+      @uri.query_values = {
+        :a => 'a', :b => {:c => true, :d => 'd'}
+      }
+    end).to raise_error(TypeError)
+  end
+
+  it "should raise an error attempting to assign " +
+      "{:a => 'a', :b => {:c => true, :d => 'd'}}" do
+    expect(lambda do
+      @uri.query_values = {
+        :a => 'a', :b => {:c => true, :d => 'd'}
+      }
+    end).to raise_error(TypeError)
+  end
+
+  it "should correctly assign {:a => 1, :b => 1.5}" do
+    @uri.query_values = { :a => 1, :b => 1.5 }
+    expect(@uri.query).to eq("a=1&b=1.5")
+  end
+
+  it "should raise an error attempting to assign " +
+      "{:z => 1, :f => [2, {999.1 => [3,'4']}, ['h', 'i']], " +
+      ":a => {:b => ['c', 'd'], :e => true, :y => 0.5}}" do
+    expect(lambda do
+      @uri.query_values = {
+        :z => 1,
+        :f => [ 2, {999.1 => [3,'4']}, ['h', 'i'] ],
+        :a => { :b => ['c', 'd'], :e => true, :y => 0.5 }
+      }
+    end).to raise_error(TypeError)
+  end
+
+  it "should correctly assign {}" do
+    @uri.query_values = {}
+    expect(@uri.query).to eq('')
+  end
+
+  it "should correctly assign nil" do
+    @uri.query_values = nil
+    expect(@uri.query).to eq(nil)
+  end
+
+  it "should correctly sort {'ab' => 'c', :ab => 'a', :a => 'x'}" do
+    @uri.query_values = {'ab' => 'c', :ab => 'a', :a => 'x'}
+    expect(@uri.query).to eq("a=x&ab=a&ab=c")
+  end
+
+  it "should correctly assign " +
+      "[['b', 'c'], ['b', 'a'], ['a', 'a']]" do
+    # Order can be guaranteed in this format, so preserve it.
+    @uri.query_values = [['b', 'c'], ['b', 'a'], ['a', 'a']]
+    expect(@uri.query).to eq("b=c&b=a&a=a")
+  end
+
+  it "should preserve query string order" do
+    query_string = (('a'..'z').to_a.reverse.map { |e| "#{e}=#{e}" }).join("&")
+    @uri.query = query_string
+    original_uri = @uri.to_s
+    @uri.query_values = @uri.query_values(Array)
+    expect(@uri.to_s).to eq(original_uri)
+  end
+
+  describe 'when a hash with mixed types is assigned to query_values' do
+    it 'should not raise an error' do
+      skip 'Issue #94'
+      expect { subject.query_values = { "page" => "1", :page => 2 } }.to_not raise_error
+    end
+  end
+end
+
+describe Addressable::URI, "when assigning path values" do
+  before do
+    @uri = Addressable::URI.new
+  end
+
+  it "should correctly assign paths containing colons" do
+    @uri.path = "acct:bob@sporkmonger.com"
+    expect(@uri.path).to eq("acct:bob@sporkmonger.com")
+    expect(@uri.normalize.to_str).to eq("acct%2Fbob@sporkmonger.com")
+    expect(lambda { @uri.to_s }).to raise_error(
+      Addressable::URI::InvalidURIError
+    )
+  end
+
+  it "should correctly assign paths containing colons" do
+    @uri.path = "/acct:bob@sporkmonger.com"
+    @uri.authority = "example.com"
+    expect(@uri.normalize.to_str).to eq("//example.com/acct:bob@sporkmonger.com")
+  end
+
+  it "should correctly assign paths containing colons" do
+    @uri.path = "acct:bob@sporkmonger.com"
+    @uri.scheme = "something"
+    expect(@uri.normalize.to_str).to eq("something:acct:bob@sporkmonger.com")
+  end
+
+  it "should not allow relative paths to be assigned on absolute URIs" do
+    expect(lambda do
+      @uri.scheme = "http"
+      @uri.host = "example.com"
+      @uri.path = "acct:bob@sporkmonger.com"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should not allow relative paths to be assigned on absolute URIs" do
+    expect(lambda do
+      @uri.path = "acct:bob@sporkmonger.com"
+      @uri.scheme = "http"
+      @uri.host = "example.com"
+    end).to raise_error(Addressable::URI::InvalidURIError)
+  end
+
+  it "should not allow relative paths to be assigned on absolute URIs" do
+    expect(lambda do
+      @uri.path = "uuid:0b3ecf60-3f93-11df-a9c3-001f5bfffe12"
+      @uri.scheme = "urn"
+    end).not_to raise_error
+  end
+end
+
+describe Addressable::URI, "when initializing a subclass of Addressable::URI" do
+  before do
+    @uri = Class.new(Addressable::URI).new
+  end
+
+  it "should have the same class after being parsed" do
+    expect(@uri.class).to eq(Addressable::URI.parse(@uri).class)
+  end
+
+  it "should have the same class as its duplicate" do
+    expect(@uri.class).to eq(@uri.dup.class)
+  end
+
+  it "should have the same class after being normalized" do
+    expect(@uri.class).to eq(@uri.normalize.class)
+  end
+
+  it "should have the same class after being merged" do
+    expect(@uri.class).to eq(@uri.merge(:path => 'path').class)
+  end
+
+  it "should have the same class after being joined" do
+    expect(@uri.class).to eq(@uri.join('path').class)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/spec_helper.rb b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/spec_helper.rb
new file mode 100644
index 0000000..0b53829
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/spec/spec_helper.rb
@@ -0,0 +1,21 @@
+require 'bundler/setup'
+require 'rspec/its'
+
+begin
+  require 'coveralls'
+  Coveralls.wear! do
+    add_filter "spec/"
+    add_filter "vendor/"
+  end
+rescue LoadError
+  warn "warning: coveralls gem not found; skipping Coveralls"
+  require 'simplecov'
+  SimpleCov.start do
+    add_filter "spec/"
+    add_filter "vendor/"
+  end
+end
+
+RSpec.configure do |config|
+  config.warnings = true
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/clobber.rake b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/clobber.rake
new file mode 100644
index 0000000..093ce81
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/clobber.rake
@@ -0,0 +1,2 @@
+desc "Remove all build products"
+task "clobber"
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/gem.rake b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/gem.rake
new file mode 100644
index 0000000..b4052c0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/gem.rake
@@ -0,0 +1,91 @@
+require "rubygems/package_task"
+
+namespace :gem do
+  GEM_SPEC = Gem::Specification.new do |s|
+    s.name = PKG_NAME
+    s.version = PKG_VERSION
+    s.summary = PKG_SUMMARY
+    s.description = PKG_DESCRIPTION
+
+    s.files = PKG_FILES.to_a
+
+    s.has_rdoc = true
+    s.extra_rdoc_files = %w( README.md )
+    s.rdoc_options.concat ["--main",  "README.md"]
+
+    if !s.respond_to?(:add_development_dependency)
+      puts "Cannot build Gem with this version of RubyGems."
+      exit(1)
+    end
+
+    s.required_ruby_version = '>= 2.0'
+
+    s.add_runtime_dependency 'public_suffix', '>= 2.0.2', '< 4.0'
+    s.add_development_dependency 'bundler', '~> 1.0'
+
+    s.require_path = "lib"
+
+    s.author = "Bob Aman"
+    s.email = "bob@sporkmonger.com"
+    s.homepage = "https://github.com/sporkmonger/addressable"
+    s.license = "Apache-2.0"
+  end
+
+  Gem::PackageTask.new(GEM_SPEC) do |p|
+    p.gem_spec = GEM_SPEC
+    p.need_tar = true
+    p.need_zip = true
+  end
+
+  desc "Generates .gemspec file"
+  task :gemspec do
+    spec_string = GEM_SPEC.to_ruby
+    File.open("#{GEM_SPEC.name}.gemspec", 'w') do |file|
+      file.write spec_string
+    end
+  end
+
+  desc "Show information about the gem"
+  task :debug do
+    puts GEM_SPEC.to_ruby
+  end
+
+  desc "Install the gem"
+  task :install => ["clobber", "gem:package"] do
+    sh "#{SUDO} gem install --local pkg/#{GEM_SPEC.full_name}"
+  end
+
+  desc "Uninstall the gem"
+  task :uninstall do
+    installed_list = Gem.source_index.find_name(PKG_NAME)
+    if installed_list &&
+        (installed_list.collect { |s| s.version.to_s}.include?(PKG_VERSION))
+      sh(
+        "#{SUDO} gem uninstall --version '#{PKG_VERSION}' " +
+        "--ignore-dependencies --executables #{PKG_NAME}"
+      )
+    end
+  end
+
+  desc "Reinstall the gem"
+  task :reinstall => [:uninstall, :install]
+
+  desc 'Package for release'
+  task :release => ["gem:package", "gem:gemspec"] do |t|
+    v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
+    abort "Versions don't match #{v} vs #{PROJ.version}" if v != PKG_VERSION
+    pkg = "pkg/#{GEM_SPEC.full_name}"
+
+    changelog = File.open("CHANGELOG.md") { |file| file.read }
+
+    puts "Releasing #{PKG_NAME} v. #{PKG_VERSION}"
+    Rake::Task["git:tag:create"].invoke
+  end
+end
+
+desc "Alias to gem:package"
+task "gem" => "gem:package"
+
+task "gem:release" => "gem:gemspec"
+
+task "clobber" => ["gem:clobber_package"]
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/git.rake b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/git.rake
new file mode 100644
index 0000000..74ec2fd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/git.rake
@@ -0,0 +1,45 @@
+namespace :git do
+  namespace :tag do
+    desc "List tags from the Git repository"
+    task :list do
+      tags = `git tag -l`
+      tags.gsub!("\r", "")
+      tags = tags.split("\n").sort {|a, b| b <=> a }
+      puts tags.join("\n")
+    end
+
+    desc "Create a new tag in the Git repository"
+    task :create do
+      changelog = File.open("CHANGELOG.md", "r") { |file| file.read }
+      puts "-" * 80
+      puts changelog
+      puts "-" * 80
+      puts
+
+      v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
+      abort "Versions don't match #{v} vs #{PKG_VERSION}" if v != PKG_VERSION
+
+      git_status = `git status`
+      if git_status !~ /^nothing to commit/
+        abort "Working directory isn't clean."
+      end
+
+      tag = "#{PKG_NAME}-#{PKG_VERSION}"
+      msg = "Release #{PKG_NAME}-#{PKG_VERSION}"
+
+      existing_tags = `git tag -l #{PKG_NAME}-*`.split('\n')
+      if existing_tags.include?(tag)
+        warn("Tag already exists, deleting...")
+        unless system "git tag -d #{tag}"
+          abort "Tag deletion failed."
+        end
+      end
+      puts "Creating git tag '#{tag}'..."
+      unless system "git tag -a -m \"#{msg}\" #{tag}"
+        abort "Tag creation failed."
+      end
+    end
+  end
+end
+
+task "gem:release" => "git:tag:create"
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/metrics.rake b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/metrics.rake
new file mode 100644
index 0000000..41fc5c2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/metrics.rake
@@ -0,0 +1,22 @@
+namespace :metrics do
+  task :lines do
+    lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
+    for file_name in FileList["lib/**/*.rb"]
+      f = File.open(file_name)
+      while line = f.gets
+        lines += 1
+        next if line =~ /^\s*$/
+        next if line =~ /^\s*#/
+        codelines += 1
+      end
+      puts "L: #{sprintf("%4d", lines)}, " +
+        "LOC #{sprintf("%4d", codelines)} | #{file_name}"
+      total_lines     += lines
+      total_codelines += codelines
+
+      lines, codelines = 0, 0
+    end
+
+    puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/rspec.rake b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/rspec.rake
new file mode 100644
index 0000000..e74a6c8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/rspec.rake
@@ -0,0 +1,21 @@
+require "rspec/core/rake_task"
+
+namespace :spec do
+  RSpec::Core::RakeTask.new(:simplecov) do |t|
+    t.pattern = FileList['spec/**/*_spec.rb']
+    t.rspec_opts = ['--color', '--format', 'documentation']
+  end
+
+  namespace :simplecov do
+    desc "Browse the code coverage report."
+    task :browse => "spec:simplecov" do
+      require "launchy"
+      Launchy.open("coverage/index.html")
+    end
+  end
+end
+
+desc "Alias to spec:simplecov"
+task "spec" => "spec:simplecov"
+
+task "clobber" => ["spec:clobber_simplecov"]
diff --git a/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/yard.rake b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/yard.rake
new file mode 100644
index 0000000..68e4491
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/addressable-2.5.2/tasks/yard.rake
@@ -0,0 +1,27 @@
+require "rake"
+
+begin
+  require "yard"
+  require "yard/rake/yardoc_task"
+
+  namespace :doc do
+    desc "Generate Yardoc documentation"
+    YARD::Rake::YardocTask.new do |yardoc|
+      yardoc.name = "yard"
+      yardoc.options = ["--verbose", "--markup", "markdown"]
+      yardoc.files = FileList[
+        "lib/**/*.rb", "ext/**/*.c",
+        "README.md", "CHANGELOG.md", "LICENSE.txt"
+      ].exclude(/idna/)
+    end
+  end
+
+  task "clobber" => ["doc:clobber_yard"]
+
+  desc "Alias to doc:yard"
+  task "doc" => "doc:yard"
+rescue LoadError
+  # If yard isn't available, it's not the end of the world
+  desc "Alias to doc:rdoc"
+  task "doc" => "doc:rdoc"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/Gemfile b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/Gemfile
new file mode 100644
index 0000000..044fba3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/Gemfile
@@ -0,0 +1,11 @@
+source "https://rubygems.org"
+gemspec
+
+gem "rake"
+group :development do
+  gem "rspec-helpers", :require => false
+  gem "luna-rspec-formatters", :require => false
+  gem "pry", :require => false unless ENV[
+    "CI"
+  ]
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/History.markdown b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/History.markdown
new file mode 100644
index 0000000..bac4270
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/History.markdown
@@ -0,0 +1,25 @@
+## 1.1.0 / 2016-06-28
+
+### Minor Enhancements
+
+* Support jruby (#8)
+
+## 1.0.0 / 2016-04-28
+
+### Major enhancements
+
+- Merge Simple::ANSI and Colorator. (#7)
+
+### Minor Enhancements
+
+- Delete unnecessary `Symbol#to_sym` (#2)
+- Change argument name of `Enumerator#each` for better code legibility (#3)
+
+### Development Fixes
+
+- Convert to new RSpec expectation syntax (#1)
+- Fix `String#blue` result in README (#4)
+
+## 0.1 / 2013-04-13
+
+Birthday!
diff --git a/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/LICENSE b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/LICENSE
new file mode 100644
index 0000000..b3b6be9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/LICENSE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) Parker Moore
+
+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.
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/README.markdown b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/README.markdown
new file mode 100644
index 0000000..9cf886d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/README.markdown
@@ -0,0 +1,47 @@
+# colorator
+
+Colorize your text for the terminal
+
+[![Build Status](https://travis-ci.org/octopress/colorator.png?branch=master)](https://travis-ci.org/octopress/colorator)
+
+## Example
+
+```ruby
+"this string".red
+# => \e[31mthis string\e[0m
+"my string".blue
+# => \e[34mmy string\e[0m
+# etc...
+```
+
+## Supported Colors
+
+- `red`
+- `black`
+- `green`
+- `yellow`
+- `magenta`
+- `white`
+- `blue`
+- `cyan`
+- `bold`
+
+## Other supported Ansi methods
+
+- `clear_line`
+- `has_ansi?`, `has_color?`
+- `strip_ansi`, `strip_color`
+- `reset_ansi`, `reset_color`
+- `clear_screen`
+- `ansi_jump`
+
+## Why
+
+There are a bunch of gems that provide functionality like this, but none have
+as simple an API as this. Just call `"string".color` and your text will be
+colorized.
+
+## License
+
+MIT. Written as a single Ruby file by Brandon Mathis, converted into a gem by
+Parker Moore.
diff --git a/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/Rakefile b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/Rakefile
new file mode 100644
index 0000000..b7e9ed5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/Rakefile
@@ -0,0 +1,6 @@
+require "bundler/gem_tasks"
+require "rspec/core/rake_task"
+
+RSpec::Core::RakeTask.new(:spec)
+
+task :default => :spec
diff --git a/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/colorator.gemspec b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/colorator.gemspec
new file mode 100644
index 0000000..a4bd0cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/colorator.gemspec
@@ -0,0 +1,23 @@
+# coding: utf-8
+
+require File.expand_path('lib/colorator.rb', __dir__)
+
+Gem::Specification.new do |spec|
+  spec.name        = "colorator"
+  spec.summary     = "Colorize your text in the terminal."
+  spec.version     = Colorator::VERSION
+  spec.authors     = ["Parker Moore", "Brandon Mathis"]
+  spec.email       = ["parkrmoore@gmail.com", "brandon@imathis.com"]
+  spec.homepage    = "https://github.com/octopress/colorator"
+  spec.licenses    = ["MIT"]
+
+  all                = `git ls-files -z`.split("\x0").reject { |f| f.start_with?(".") }
+  spec.files         = all.select { |f| File.basename(f) == f || f =~ %r{^(bin|lib)/} }
+  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
+  spec.require_paths = ["lib"]
+
+  spec.extra_rdoc_files = ["README.markdown", "LICENSE"]
+  spec.rdoc_options     = ["--charset=UTF-8"]
+
+  spec.add_development_dependency "rspec", "~> 3.1"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/lib/colorator.rb b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/lib/colorator.rb
new file mode 100644
index 0000000..107f6e3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/lib/colorator.rb
@@ -0,0 +1,111 @@
+$:.unshift File.dirname(__FILE__)
+
+module Colorator
+  module_function
+  VERSION = "1.1.0"
+
+  # --------------------------------------------------------------------------
+
+  ANSI_MATCHR = /\x1b.*?[jkmsuABGKH]/
+  ANSI_COLORS = {
+    :black   => 30,
+    :red     => 31,
+    :green   => 32,
+    :yellow  => 33,
+    :blue    => 34,
+    :magenta => 35,
+    :cyan    => 36,
+    :white   => 37,
+    :bold    => 1
+  }
+
+  # --------------------------------------------------------------------------
+  # Allows you to check if a string currently has ansi.
+  # --------------------------------------------------------------------------
+
+  def has_ansi?(str)
+    str.match(ANSI_MATCHR).is_a?(
+      MatchData
+    )
+  end
+
+  # --------------------------------------------------------------------------
+  # Jump the cursor, moving it up and then back down to it's spot, allowing
+  # you to do fancy things like multiple output (downloads) the way that Docker
+  # does them in an async way without breaking term.
+  # --------------------------------------------------------------------------
+
+  def ansi_jump(str, num)
+    "\x1b[#{num}A#{clear_line(str)}\x1b[#{
+      num
+    }B"
+  end
+
+  # --------------------------------------------------------------------------
+
+  def reset_ansi(str = "")
+    "\x1b[0m#{
+      str
+    }"
+  end
+
+  # --------------------------------------------------------------------------
+
+  def clear_line(str = "")
+    "\x1b[2K\r#{
+      str
+    }"
+  end
+
+  # --------------------------------------------------------------------------
+  # Strip ANSI from the current string, making it just a normal string.
+  # --------------------------------------------------------------------------
+
+  def strip_ansi(str)
+    str.gsub(
+      ANSI_MATCHR, ""
+    )
+  end
+
+  # --------------------------------------------------------------------------
+  # Clear the screen's current view, so the user gets a clean output.
+  # --------------------------------------------------------------------------
+
+  def clear_screen(str = "")
+    "\x1b[H\x1b[2J#{
+      str
+    }"
+  end
+
+  # --------------------------------------------------------------------------
+
+  def colorize(str = "", color)
+    "\x1b[#{color}m#{str}\x1b[0m"
+  end
+
+  # --------------------------------------------------------------------------
+
+  Colorator::ANSI_COLORS.each do |color, code|
+    define_singleton_method color do |str|
+      colorize(
+        str, code
+      )
+    end
+  end
+
+  # --------------------------------------------------------------------------
+
+  class << self
+    alias reset_color reset_ansi
+    alias strip_color strip_ansi
+    alias has_color? has_ansi?
+  end
+
+  # --------------------------------------------------------------------------
+
+  CORE_METHODS = (
+    public_methods - Object.methods
+  )
+end
+
+require "colorator/core_ext"
diff --git a/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb
new file mode 100644
index 0000000..f2e0bf0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb
@@ -0,0 +1,9 @@
+class String
+  Colorator::CORE_METHODS.each do |method|
+    define_method method do |*args|
+      Colorator.public_send(method,
+        self, *args
+      )
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/COPYING b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/COPYING
new file mode 100644
index 0000000..7622318
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/COPYING
@@ -0,0 +1,49 @@
+Copyright (c) 2008-2013, Ruby FFI project contributors
+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.
+    * Neither the name of the Ruby FFI project nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+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 <COPYRIGHT HOLDER> 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.
+
+libffi, used by this project, is licensed under the MIT license:
+
+libffi - Copyright (c) 1996-2011  Anthony Green, Red Hat, Inc and others.
+See source files for details.
+
+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/bundle/ruby/2.4.0/gems/ffi-1.9.18/LICENSE b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/LICENSE
new file mode 100644
index 0000000..20185fd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2008-2016, Ruby FFI project contributors
+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.
+    * Neither the name of the Ruby FFI project nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+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 <COPYRIGHT HOLDER> 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.
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/README.md b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/README.md
new file mode 100644
index 0000000..8ab8efa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/README.md
@@ -0,0 +1,111 @@
+# ruby-ffi https://wiki.github.com/ffi/ffi [![Build Status](https://travis-ci.org/ffi/ffi.png?branch=master)](https://travis-ci.org/ffi/ffi)
+
+## Description
+
+Ruby-FFI is a ruby extension for programmatically loading dynamic
+libraries, binding functions within them, and calling those functions
+from Ruby code. Moreover, a Ruby-FFI extension works without changes
+on Ruby and JRuby. [Discover why you should write your next extension
+using Ruby-FFI](https://wiki.github.com/ffi/ffi/why-use-ffi).
+
+## Features/problems
+
+* Intuitive DSL
+* Supports all C native types
+* C structs (also nested), enums and global variables
+* Callbacks from C to ruby
+* Automatic garbage collection of native memory
+
+## Synopsis
+
+```ruby
+require 'ffi'
+
+module MyLib
+  extend FFI::Library
+  ffi_lib 'c'
+  attach_function :puts, [ :string ], :int
+end
+
+MyLib.puts 'Hello, World using libc!'
+```
+
+For less minimalistic and more sane examples you may look at:
+
+* the samples/ folder
+* the examples on the [wiki](https://wiki.github.com/ffi/ffi)
+* the projects using FFI listed on this page (https://wiki.github.com/ffi/ffi/projects-using-ffi)
+
+## Requirements
+
+You need a sane building environment in order to compile the extension.
+At a minimum, you will need:
+* A C compiler (e.g. Xcode on OSX, gcc on everything else)
+* libffi development library - this is commonly in the libffi-dev or libffi-devel
+
+On Linux systems running with [PaX](https://en.wikipedia.org/wiki/PaX) (Gentoo, Alpine, etc.) FFI may trigger `mprotrect` errors. You may need to disable [mprotect](https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Restrict_mprotect.28.29) for ruby (`paxctl -m [/path/to/ruby]`) for the time being until a solution is found.
+
+## Installation
+
+From rubygems:
+
+    [sudo] gem install ffi
+
+or from the git repository on github:
+
+    git clone git://github.com/ffi/ffi.git
+    cd ffi
+    rake gem:install
+
+## License
+
+The ffi library is covered by the BSD license, also see the LICENSE file.
+The specs are shared with Rubyspec and are licensed by the same license
+as Rubyspec, see the LICENSE.SPECS file.
+
+## Credits
+
+The following people have submitted code, bug reports, or otherwise contributed to the success of this project:
+
+* Alban Peignier <alban.peignier@free.fr>
+* Aman Gupta <aman@tmm1.net>
+* Andrea Fazzi <andrea.fazzi@alcacoop.it>
+* Andreas Niederl <rico32@gmx.net>
+* Andrew Cholakian <andrew@andrewvc.com>
+* Antonio Terceiro <terceiro@softwarelivre.org>
+* Brian Candler <B.Candler@pobox.com>
+* Brian D. Burns <burns180@gmail.com>
+* Bryan Kearney <bkearney@redhat.com>
+* Charlie Savage <cfis@zerista.com>
+* Chikanaga Tomoyuki <nagachika00@gmail.com>
+* Hongli Lai <hongli@phusion.nl>
+* Ian MacLeod <ian@nevir.net>
+* Jake Douglas <jake@shiftedlabs.com>
+* Jean-Dominique Morani <jdmorani@mac.com>
+* Jeremy Hinegardner <jeremy@hinegardner.org>
+* Jesús García Sáez <blaxter@gmail.com>
+* Joe Khoobyar <joe@ankhcraft.com>
+* Jurij Smakov <jurij@wooyd.org>
+* KISHIMOTO, Makoto <ksmakoto@dd.iij4u.or.jp>
+* Kim Burgestrand <kim@burgestrand.se>
+* Lars Kanis <kanis@comcard.de>
+* Luc Heinrich <luc@honk-honk.com>
+* Luis Lavena <luislavena@gmail.com>
+* Matijs van Zuijlen <matijs@matijs.net>
+* Matthew King <automatthew@gmail.com>
+* Mike Dalessio <mike.dalessio@gmail.com>
+* NARUSE, Yui <naruse@airemix.jp>
+* Park Heesob <phasis@gmail.com>
+* Shin Yee <shinyee@speedgocomputing.com>
+* Stephen Bannasch <stephen.bannasch@gmail.com>
+* Suraj N. Kurapati <sunaku@gmail.com>
+* Sylvain Daubert <sylvain.daubert@laposte.net>
+* Victor Costan
+* beoran@gmail.com
+* ctide <christide@christide.com>
+* emboss <Martin.Bosslet@googlemail.com>
+* hobophobe <unusualtears@gmail.com>
+* meh <meh@paranoici.org>
+* postmodern <postmodern.mod3@gmail.com>
+* wycats@gmail.com <wycats@gmail.com>
+* Wayne Meissner <wmeissner@gmail.com>
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/Rakefile b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/Rakefile
new file mode 100644
index 0000000..c8e4cf3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/Rakefile
@@ -0,0 +1,232 @@
+require 'rubygems/tasks'
+require 'rbconfig'
+require 'rake/clean'
+require File.expand_path("./lib/ffi/version")
+
+USE_RAKE_COMPILER = (RUBY_PLATFORM =~ /java/) ? false : true
+if USE_RAKE_COMPILER
+  require 'rake/extensiontask'
+end
+
+require 'date'
+require 'fileutils'
+require 'rbconfig'
+require 'rspec/core/rake_task'
+require 'rubygems/package_task'
+
+LIBEXT = case RbConfig::CONFIG['host_os'].downcase
+  when /darwin/
+    "dylib"
+  when /mswin|mingw/
+    "dll"
+  else
+    RbConfig::CONFIG['DLEXT']
+  end
+
+CPU = case RbConfig::CONFIG['host_cpu'].downcase
+  when /i[3456]86/
+    # Darwin always reports i686, even when running in 64bit mode
+    if RbConfig::CONFIG['host_os'] =~ /darwin/ && 0xfee1deadbeef.is_a?(Fixnum)
+      "x86_64"
+    else
+      "i386"
+    end
+
+  when /amd64|x86_64/
+    "x86_64"
+
+  when /ppc64|powerpc64/
+    "powerpc64"
+
+  when /ppc|powerpc/
+    "powerpc"
+
+  when /^arm/
+    "arm"
+
+  else
+    RbConfig::CONFIG['host_cpu']
+  end
+
+OS = case RbConfig::CONFIG['host_os'].downcase
+  when /linux/
+    "linux"
+  when /darwin/
+    "darwin"
+  when /freebsd/
+    "freebsd"
+  when /openbsd/
+    "openbsd"
+  when /sunos|solaris/
+    "solaris"
+  when /mswin|mingw/
+    "win32"
+  else
+    RbConfig::CONFIG['host_os'].downcase
+  end
+
+GMAKE = system('which gmake >/dev/null') && 'gmake' || 'make'
+
+LIBTEST = "build/libtest.#{LIBEXT}"
+BUILD_DIR = "build"
+BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUBY_VERSION)
+
+def gem_spec
+  @gem_spec ||= Gem::Specification.load('ffi.gemspec')
+end
+
+TEST_DEPS = [ LIBTEST ]
+if RUBY_PLATFORM == "java"
+  RSpec::Core::RakeTask.new(:spec) do |config|
+    config.rspec_opts = YAML.load_file 'spec/spec.opts'
+  end
+else
+  RSpec::Core::RakeTask.new(:spec => :compile) do |config|
+    config.rspec_opts = YAML.load_file 'spec/spec.opts'
+  end
+
+  TEST_DEPS.unshift :compile
+end
+
+desc "Build all packages"
+task :package => 'gem:package'
+
+CLOBBER.include 'lib/ffi/types.conf'
+CLOBBER.include 'pkg'
+CLOBBER.include 'log'
+
+CLEAN.include 'build'
+CLEAN.include 'conftest.dSYM'
+CLEAN.include 'spec/ffi/fixtures/libtest.{dylib,so,dll}'
+CLEAN.include 'spec/ffi/fixtures/*.o'
+CLEAN.include "pkg/ffi-*-{mingw32,java}"
+CLEAN.include 'lib/1.*'
+CLEAN.include 'lib/2.*'
+CLEAN.include 'bin'
+
+task :distclean => :clobber
+
+desc "Build the native test lib"
+file "build/libtest.#{LIBEXT}" => FileList['libtest/**/*.[ch]'] do
+  sh %{#{GMAKE} -f libtest/GNUmakefile CPU=#{CPU} OS=#{OS} }
+end
+
+
+desc "Build test helper lib"
+task :libtest => "build/libtest.#{LIBEXT}"
+
+desc "Test the extension"
+task :test => [ :spec ]
+
+
+namespace :bench do
+  ITER = ENV['ITER'] ? ENV['ITER'].to_i : 100000
+  bench_libs = "-Ilib -I#{BUILD_DIR}" unless RUBY_PLATFORM == "java"
+  bench_files = Dir["bench/bench_*.rb"].reject { |f| f == "bench_helper.rb" }
+  bench_files.each do |bench|
+    task File.basename(bench, ".rb")[6..-1] => TEST_DEPS do
+      sh %{#{Gem.ruby} #{bench_libs} #{bench} #{ITER}}
+    end
+  end
+  task :all => TEST_DEPS do
+    bench_files.each do |bench|
+      sh %{#{Gem.ruby} #{bench_libs} #{bench}}
+    end
+  end
+end
+
+task 'spec:run' => TEST_DEPS
+task 'spec:specdoc' => TEST_DEPS
+
+task :default => :spec
+
+namespace 'java' do
+
+  java_gem_spec = Gem::Specification.new do |s|
+    s.name = gem_spec.name
+    s.version = gem_spec.version
+    s.author = gem_spec.author
+    s.email = gem_spec.email
+    s.homepage = gem_spec.homepage
+    s.summary = gem_spec.summary
+    s.description = gem_spec.description
+    s.files = %w(LICENSE COPYING README.md Rakefile)
+    s.has_rdoc = false
+    s.license = gem_spec.license
+    s.platform = 'java'
+  end
+
+  Gem::PackageTask.new(java_gem_spec) do |pkg|
+    pkg.need_zip = true
+    pkg.need_tar = true
+    pkg.package_dir = 'pkg'
+  end
+end
+
+task 'gem:java' => 'java:gem'
+
+
+if USE_RAKE_COMPILER
+  Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext|
+    ext.name = 'ffi_c'                                        # indicate the name of the extension.
+    # ext.lib_dir = BUILD_DIR                                 # put binaries into this folder.
+    ext.tmp_dir = BUILD_DIR                                   # temporary folder used during compilation.
+    ext.cross_compile = true                                  # enable cross compilation (requires cross compile toolchain)
+    ext.cross_platform = %w[i386-mingw32 x64-mingw32]                     # forces the Windows platform instead of the default one
+  end
+
+  ENV['RUBY_CC_VERSION'] ||= '1.8.7:1.9.3:2.0.0:2.1.6:2.2.2:2.3.0'
+
+  # To reduce the gem file size strip mingw32 dlls before packaging
+  ENV['RUBY_CC_VERSION'].to_s.split(':').each do |ruby_version|
+    task "build/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" do |t|
+      sh "i686-w64-mingw32-strip -S build/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so"
+    end
+
+    task "build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so" do |t|
+      sh "x86_64-w64-mingw32-strip -S build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so"
+    end
+  end
+
+  desc "build a windows gem without all the ceremony."
+  task "gem:windows" do
+    require "rake_compiler_dock"
+    RakeCompilerDock.sh "bundle && rake cross native gem MAKE='nice make -j`nproc`'"
+  end
+end
+
+$LOAD_PATH.unshift File.join(File.dirname(__FILE__), 'lib')
+require 'ffi/platform'
+types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf'))
+logfile = File.join(File.dirname(__FILE__), 'types_log')
+
+file types_conf => File.join("lib", "ffi", "version.rb") do |task|
+  require 'fileutils'
+  require 'ffi/tools/types_generator'
+  options = {}
+  FileUtils.mkdir_p(File.dirname(task.name), { :mode => 0755 })
+  File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f|
+    f.puts FFI::TypesGenerator.generate(options)
+  end
+  File.open(logfile, 'w') do |log|
+    log.puts(types_conf)
+  end
+end
+
+task :types_conf => types_conf do
+end
+
+Gem::Tasks.new do |t|
+  t.scm.tag.format = '%s'
+end
+
+begin
+  require 'yard'
+
+  namespace :doc do
+    YARD::Rake::YardocTask.new do |yard|
+    end
+  end
+rescue LoadError
+  warn "[warn] YARD unavailable"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/.sitearchdir.time b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/.sitearchdir.time
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/.sitearchdir.time
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.c
new file mode 100644
index 0000000..b81884a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.c
@@ -0,0 +1,1104 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ * Copyright (C) 2009 Jake Douglas <jake@shiftedlabs.com>
+ * Copyright (C) 2008 Luc Heinrich <luc@honk-honk.com>
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#include <sys/types.h>
+#ifndef _MSC_VER
+# include <sys/param.h>
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+
+#include <limits.h>
+#include <ruby.h>
+
+#include "rbffi.h"
+#include "compat.h"
+#include "AbstractMemory.h"
+#include "Pointer.h"
+#include "Function.h"
+#include "LongDouble.h"
+
+#ifndef PRIsVALUE
+# define PRIsVALUE "s"
+#endif
+
+static inline char* memory_address(VALUE self);
+VALUE rbffi_AbstractMemoryClass = Qnil;
+static VALUE NullPointerErrorClass = Qnil;
+static ID id_to_ptr = 0, id_plus = 0, id_call = 0;
+
+static VALUE
+memory_allocate(VALUE klass)
+{
+    AbstractMemory* memory;
+    VALUE obj;
+    obj = Data_Make_Struct(klass, AbstractMemory, NULL, -1, memory);
+    memory->flags = MEM_RD | MEM_WR;
+
+    return obj;
+}
+#define VAL(x, swap) (unlikely(((memory->flags & MEM_SWAP) != 0)) ? swap((x)) : (x))
+
+#define NUM_OP(name, type, toNative, fromNative, swap) \
+static void memory_op_put_##name(AbstractMemory* memory, long off, VALUE value); \
+static void \
+memory_op_put_##name(AbstractMemory* memory, long off, VALUE value) \
+{ \
+    type tmp = (type) VAL(toNative(value), swap); \
+    checkWrite(memory); \
+    checkBounds(memory, off, sizeof(type)); \
+    memcpy(memory->address + off, &tmp, sizeof(tmp)); \
+} \
+static VALUE memory_put_##name(VALUE self, VALUE offset, VALUE value); \
+static VALUE \
+memory_put_##name(VALUE self, VALUE offset, VALUE value) \
+{ \
+    AbstractMemory* memory; \
+    Data_Get_Struct(self, AbstractMemory, memory); \
+    memory_op_put_##name(memory, NUM2LONG(offset), value); \
+    return self; \
+} \
+static VALUE memory_write_##name(VALUE self, VALUE value); \
+static VALUE \
+memory_write_##name(VALUE self, VALUE value) \
+{ \
+    AbstractMemory* memory; \
+    Data_Get_Struct(self, AbstractMemory, memory); \
+    memory_op_put_##name(memory, 0, value); \
+    return self; \
+} \
+static VALUE memory_op_get_##name(AbstractMemory* memory, long off); \
+static VALUE \
+memory_op_get_##name(AbstractMemory* memory, long off) \
+{ \
+    type tmp; \
+    checkRead(memory); \
+    checkBounds(memory, off, sizeof(type)); \
+    memcpy(&tmp, memory->address + off, sizeof(tmp)); \
+    return fromNative(VAL(tmp, swap)); \
+} \
+static VALUE memory_get_##name(VALUE self, VALUE offset); \
+static VALUE \
+memory_get_##name(VALUE self, VALUE offset) \
+{ \
+    AbstractMemory* memory; \
+    Data_Get_Struct(self, AbstractMemory, memory); \
+    return memory_op_get_##name(memory, NUM2LONG(offset)); \
+} \
+static VALUE memory_read_##name(VALUE self); \
+static VALUE \
+memory_read_##name(VALUE self) \
+{ \
+    AbstractMemory* memory; \
+    Data_Get_Struct(self, AbstractMemory, memory); \
+    return memory_op_get_##name(memory, 0); \
+} \
+static MemoryOp memory_op_##name = { memory_op_get_##name, memory_op_put_##name }; \
+\
+static VALUE memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary); \
+static VALUE \
+memory_put_array_of_##name(VALUE self, VALUE offset, VALUE ary) \
+{ \
+    long count = RARRAY_LEN(ary); \
+    long off = NUM2LONG(offset); \
+    AbstractMemory* memory = MEMORY(self); \
+    long i; \
+    checkWrite(memory); \
+    checkBounds(memory, off, count * sizeof(type)); \
+    for (i = 0; i < count; i++) { \
+        type tmp = (type) VAL(toNative(RARRAY_PTR(ary)[i]), swap); \
+        memcpy(memory->address + off + (i * sizeof(type)), &tmp, sizeof(tmp)); \
+    } \
+    return self; \
+} \
+static VALUE memory_write_array_of_##name(VALUE self, VALUE ary); \
+static VALUE \
+memory_write_array_of_##name(VALUE self, VALUE ary) \
+{ \
+    return memory_put_array_of_##name(self, INT2FIX(0), ary); \
+} \
+static VALUE memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length); \
+static VALUE \
+memory_get_array_of_##name(VALUE self, VALUE offset, VALUE length) \
+{ \
+    long count = NUM2LONG(length); \
+    long off = NUM2LONG(offset); \
+    AbstractMemory* memory = MEMORY(self); \
+    VALUE retVal = rb_ary_new2(count); \
+    long i; \
+    checkRead(memory); \
+    checkBounds(memory, off, count * sizeof(type)); \
+    for (i = 0; i < count; ++i) { \
+        type tmp; \
+        memcpy(&tmp, memory->address + off + (i * sizeof(type)), sizeof(tmp)); \
+        rb_ary_push(retVal, fromNative(VAL(tmp, swap))); \
+    } \
+    return retVal; \
+} \
+static VALUE memory_read_array_of_##name(VALUE self, VALUE length); \
+static VALUE \
+memory_read_array_of_##name(VALUE self, VALUE length) \
+{ \
+    return memory_get_array_of_##name(self, INT2FIX(0), length); \
+}
+
+#define NOSWAP(x) (x)
+#define bswap16(x) (((x) >> 8) & 0xff) | (((x) << 8) & 0xff00);
+static inline int16_t
+SWAPS16(int16_t x)
+{
+    return bswap16(x);
+}
+
+static inline uint16_t
+SWAPU16(uint16_t x)
+{
+    return bswap16(x);
+}
+
+#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
+#define bswap32(x) \
+       (((x << 24) & 0xff000000) | \
+        ((x <<  8) & 0x00ff0000) | \
+        ((x >>  8) & 0x0000ff00) | \
+        ((x >> 24) & 0x000000ff))
+
+#define bswap64(x) \
+       (((x << 56) & 0xff00000000000000ULL) | \
+        ((x << 40) & 0x00ff000000000000ULL) | \
+        ((x << 24) & 0x0000ff0000000000ULL) | \
+        ((x <<  8) & 0x000000ff00000000ULL) | \
+        ((x >>  8) & 0x00000000ff000000ULL) | \
+        ((x >> 24) & 0x0000000000ff0000ULL) | \
+        ((x >> 40) & 0x000000000000ff00ULL) | \
+        ((x >> 56) & 0x00000000000000ffULL))
+
+static inline int32_t 
+SWAPS32(int32_t x)
+{
+    return bswap32(x);
+}
+
+static inline uint32_t 
+SWAPU32(uint32_t x)
+{
+    return bswap32(x);
+}
+
+static inline int64_t
+SWAPS64(int64_t x)
+{
+    return bswap64(x);
+}
+
+static inline uint64_t
+SWAPU64(uint64_t x)
+{
+    return bswap64(x);
+}
+
+#else
+# define SWAPS32(x) ((int32_t) __builtin_bswap32(x))
+# define SWAPU32(x) ((uint32_t) __builtin_bswap32(x))
+# define SWAPS64(x) ((int64_t) __builtin_bswap64(x))
+# define SWAPU64(x) ((uint64_t) __builtin_bswap64(x))
+#endif
+
+#if LONG_MAX > INT_MAX
+# define SWAPSLONG SWAPS64
+# define SWAPULONG SWAPU64
+#else
+# define SWAPSLONG SWAPS32
+# define SWAPULONG SWAPU32
+#endif
+
+NUM_OP(int8, int8_t, NUM2INT, INT2NUM, NOSWAP);
+NUM_OP(uint8, uint8_t, NUM2UINT, UINT2NUM, NOSWAP);
+NUM_OP(int16, int16_t, NUM2INT, INT2NUM, SWAPS16);
+NUM_OP(uint16, uint16_t, NUM2UINT, UINT2NUM, SWAPU16);
+NUM_OP(int32, int32_t, NUM2INT, INT2NUM, SWAPS32);
+NUM_OP(uint32, uint32_t, NUM2UINT, UINT2NUM, SWAPU32);
+NUM_OP(int64, int64_t, NUM2LL, LL2NUM, SWAPS64);
+NUM_OP(uint64, uint64_t, NUM2ULL, ULL2NUM, SWAPU64);
+NUM_OP(long, long, NUM2LONG, LONG2NUM, SWAPSLONG);
+NUM_OP(ulong, unsigned long, NUM2ULONG, ULONG2NUM, SWAPULONG);
+NUM_OP(float32, float, NUM2DBL, rb_float_new, NOSWAP);
+NUM_OP(float64, double, NUM2DBL, rb_float_new, NOSWAP);
+NUM_OP(longdouble, long double, rbffi_num2longdouble, rbffi_longdouble_new, NOSWAP);
+
+static inline void*
+get_pointer_value(VALUE value)
+{
+    const int type = TYPE(value);
+    if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_PointerClass)) {
+        return memory_address(value);
+    } else if (type == T_NIL) {
+        return NULL;
+    } else if (type == T_FIXNUM) {
+        return (void *) (uintptr_t) FIX2ULONG(value);
+    } else if (type == T_BIGNUM) {
+        return (void *) (uintptr_t) NUM2ULL(value);
+    } else if (rb_respond_to(value, id_to_ptr)) {
+        return MEMORY_PTR(rb_funcall2(value, id_to_ptr, 0, NULL));
+    } else {
+        rb_raise(rb_eArgError, "value is not a pointer");
+        return NULL;
+    }
+}
+
+NUM_OP(pointer, void *, get_pointer_value, rbffi_Pointer_NewInstance, NOSWAP);
+
+static inline uint8_t
+rbffi_bool_value(VALUE value)
+{
+    return RTEST(value);
+}
+
+static inline VALUE
+rbffi_bool_new(uint8_t value)
+{
+    return (value & 1) != 0 ? Qtrue : Qfalse;
+}
+
+NUM_OP(bool, unsigned char, rbffi_bool_value, rbffi_bool_new, NOSWAP);
+
+
+/*
+ * call-seq: memory.clear
+ * Set the memory to all-zero.
+ * @return [self]
+ */
+static VALUE
+memory_clear(VALUE self)
+{
+    AbstractMemory* ptr = MEMORY(self);
+    memset(ptr->address, 0, ptr->size);
+    return self;
+}
+
+/*
+ * call-seq: memory.size
+ * Return memory size in bytes (alias: #total)
+ * @return [Numeric]
+ */
+static VALUE
+memory_size(VALUE self)
+{
+    AbstractMemory* ptr;
+
+    Data_Get_Struct(self, AbstractMemory, ptr);
+
+    return LONG2NUM(ptr->size);
+}
+
+/*
+ * call-seq: memory.get(type, offset)
+ * Return data of given type contained in memory.
+ * @param [Symbol, Type] type_name type of data to get
+ * @param [Numeric] offset point in buffer to start from
+ * @return [Object]
+ * @raise {ArgumentError} if type is not supported
+ */
+static VALUE
+memory_get(VALUE self, VALUE type_name, VALUE offset)
+{
+    AbstractMemory* ptr;
+    VALUE nType;
+    Type *type;
+
+    nType = rbffi_Type_Lookup(type_name);
+    if(NIL_P(nType)) goto undefined_type;
+
+    Data_Get_Struct(self, AbstractMemory, ptr);
+    Data_Get_Struct(nType, Type, type);
+
+    MemoryOp *op = get_memory_op(type);
+    if(op == NULL) goto undefined_type;
+
+    return op->get(ptr, NUM2LONG(offset));
+
+undefined_type: {
+    VALUE msg = rb_sprintf("undefined type '%" PRIsVALUE "'", type_name);
+    rb_exc_raise(rb_exc_new3(rb_eArgError, msg));
+    return Qnil;
+  }
+}
+
+/*
+ * call-seq: memory.put(type, offset, value)
+ * @param [Symbol, Type] type_name type of data to put
+ * @param [Numeric] offset point in buffer to start from
+ * @return [nil]
+ * @raise {ArgumentError} if type is not supported
+ */
+static VALUE
+memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value)
+{
+    AbstractMemory* ptr;
+    VALUE nType;
+    Type *type;
+
+    nType = rbffi_Type_Lookup(type_name);
+    if(NIL_P(nType)) goto undefined_type;
+
+    Data_Get_Struct(self, AbstractMemory, ptr);
+    Data_Get_Struct(nType, Type, type);
+
+    MemoryOp *op = get_memory_op(type);
+    if(op == NULL) goto undefined_type;
+
+    op->put(ptr, NUM2LONG(offset), value);
+    return Qnil;
+
+undefined_type: {
+    VALUE msg = rb_sprintf("unsupported type '%" PRIsVALUE "'", type_name);
+    rb_exc_raise(rb_exc_new3(rb_eArgError, msg));
+    return Qnil;
+  }
+}
+
+/*
+ * call-seq: memory.get_string(offset, length=nil)
+ * Return string contained in memory.
+ * @param [Numeric] offset point in buffer to start from
+ * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
+ * @return [String]
+ * @raise {IndexError} if +length+ is too great
+ * @raise {NullPointerError} if memory not initialized
+ */
+static VALUE
+memory_get_string(int argc, VALUE* argv, VALUE self)
+{
+    VALUE length = Qnil, offset = Qnil;
+    AbstractMemory* ptr = MEMORY(self);
+    long off, len;
+    char* end;
+    int nargs = rb_scan_args(argc, argv, "11", &offset, &length);
+
+    off = NUM2LONG(offset);
+    len = nargs > 1 && length != Qnil ? NUM2LONG(length) : (ptr->size - off);
+    checkRead(ptr);
+    checkBounds(ptr, off, len);
+
+    end = memchr(ptr->address + off, 0, len);
+    return rb_tainted_str_new((char *) ptr->address + off,
+            (end != NULL ? end - ptr->address - off : len));
+}
+
+/*
+ * call-seq: memory.get_array_of_string(offset, count=nil)
+ * Return an array of strings contained in memory.
+ * @param [Numeric] offset point in memory to start from
+ * @param [Numeric] count number of strings to get. If nil, return all strings
+ * @return [Array<String>]
+ * @raise {IndexError} if +offset+ is too great
+ * @raise {NullPointerError} if memory not initialized
+ */
+static VALUE
+memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
+{
+    VALUE offset = Qnil, countnum = Qnil, retVal = Qnil;
+    AbstractMemory* ptr;
+    long off;
+    int count;
+
+    rb_scan_args(argc, argv, "11", &offset, &countnum);
+    off = NUM2LONG(offset);
+    count = (countnum == Qnil ? 0 : NUM2INT(countnum));
+    retVal = rb_ary_new2(count);
+
+    Data_Get_Struct(self, AbstractMemory, ptr);
+    checkRead(ptr);
+
+    if (countnum != Qnil) {
+        int i;
+
+        checkBounds(ptr, off, count * sizeof (char*));
+        
+        for (i = 0; i < count; ++i) {
+            const char* strptr = *((const char**) (ptr->address + off) + i);
+            rb_ary_push(retVal, (strptr == NULL ? Qnil : rb_tainted_str_new2(strptr)));
+        }
+
+    } else {
+        checkBounds(ptr, off, sizeof (char*));
+        for ( ; off < ptr->size - (long) sizeof (void *); off += (long) sizeof (void *)) {
+            const char* strptr = *(const char**) (ptr->address + off);
+            if (strptr == NULL) {
+                break;
+            }
+            rb_ary_push(retVal, rb_tainted_str_new2(strptr));
+        }
+    }
+
+    return retVal;
+}
+
+/*
+ * call-seq: memory.read_array_of_string(count=nil)
+ * Return an array of strings contained in memory. Same as:
+ *  memory.get_array_of_string(0, count)
+ * @param [Numeric] count number of strings to get. If nil, return all strings
+ * @return [Array<String>]
+ */
+static VALUE 
+memory_read_array_of_string(int argc, VALUE* argv, VALUE self)
+{
+    VALUE* rargv = ALLOCA_N(VALUE, argc + 1);
+    int i;
+
+    rargv[0] = INT2FIX(0);
+    for (i = 0; i < argc; i++) {
+        rargv[i + 1] = argv[i];
+    }
+
+    return memory_get_array_of_string(argc + 1, rargv, self);
+}
+
+
+/*
+ * call-seq: memory.put_string(offset, str)
+ * @param [Numeric] offset
+ * @param [String] str
+ * @return [self]
+ * @raise {SecurityError} when writing unsafe string to memory
+ * @raise {IndexError} if +offset+ is too great
+ * @raise {NullPointerError} if memory not initialized
+ * Put a string in memory.
+ */
+static VALUE
+memory_put_string(VALUE self, VALUE offset, VALUE str)
+{
+    AbstractMemory* ptr = MEMORY(self);
+    long off, len;
+
+    Check_Type(str, T_STRING);
+    off = NUM2LONG(offset);
+    len = RSTRING_LEN(str);
+
+    checkWrite(ptr);
+    checkBounds(ptr, off, len + 1);
+
+    memcpy(ptr->address + off, RSTRING_PTR(str), len);
+    *((char *) ptr->address + off + len) = '\0';
+
+    return self;
+}
+
+/*
+ * call-seq: memory.get_bytes(offset, length)
+ * Return string contained in memory.
+ * @param [Numeric] offset point in buffer to start from
+ * @param [Numeric] length string's length in bytes.
+ * @return [String]
+ * @raise {IndexError} if +length+ is too great
+ * @raise {NullPointerError} if memory not initialized
+ */
+static VALUE
+memory_get_bytes(VALUE self, VALUE offset, VALUE length)
+{
+    AbstractMemory* ptr = MEMORY(self);
+    long off, len;
+    
+    off = NUM2LONG(offset);
+    len = NUM2LONG(length);
+
+    checkRead(ptr);
+    checkBounds(ptr, off, len);
+    
+    return rb_tainted_str_new((char *) ptr->address + off, len);
+}
+
+/*
+ * call-seq: memory.put_bytes(offset, str, index=0, length=nil)
+ * Put a string in memory.
+ * @param [Numeric] offset point in buffer to start from
+ * @param [String] str string to put to memory
+ * @param [Numeric] index
+ * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
+ * @return [self]
+ * @raise {IndexError} if +length+ is too great
+ * @raise {NullPointerError} if memory not initialized
+ * @raise {RangeError} if +index+ is negative, or if index+length is greater than size of string
+ * @raise {SecurityError} when writing unsafe string to memory
+ */
+static VALUE
+memory_put_bytes(int argc, VALUE* argv, VALUE self)
+{
+    AbstractMemory* ptr = MEMORY(self);
+    VALUE offset = Qnil, str = Qnil, rbIndex = Qnil, rbLength = Qnil;
+    long off, len, idx;
+    int nargs = rb_scan_args(argc, argv, "22", &offset, &str, &rbIndex, &rbLength);
+
+    Check_Type(str, T_STRING);
+
+    off = NUM2LONG(offset);
+    idx = nargs > 2 ? NUM2LONG(rbIndex) : 0;
+    if (idx < 0) {
+        rb_raise(rb_eRangeError, "index cannot be less than zero");
+        return Qnil;
+    }
+    len = nargs > 3 ? NUM2LONG(rbLength) : (RSTRING_LEN(str) - idx);
+    if ((idx + len) > RSTRING_LEN(str)) {
+        rb_raise(rb_eRangeError, "index+length is greater than size of string");
+        return Qnil;
+    }
+
+    checkWrite(ptr);
+    checkBounds(ptr, off, len);
+
+    if (rb_safe_level() >= 1 && OBJ_TAINTED(str)) {
+        rb_raise(rb_eSecurityError, "Writing unsafe string to memory");
+        return Qnil;
+    }
+    memcpy(ptr->address + off, RSTRING_PTR(str) + idx, len);
+
+    return self;
+}
+
+/*
+ * call-seq: memory.read_bytes(length)
+ * @param [Numeric] length of string to return
+ * @return [String]
+ * equivalent to :
+ *  memory.get_bytes(0, length)
+ */
+static VALUE 
+memory_read_bytes(VALUE self, VALUE length)
+{
+    return memory_get_bytes(self, INT2FIX(0), length);
+}
+
+/*
+ * call-seq: memory.write_bytes(str, index=0, length=nil)
+ * @param [String] str string to put to memory
+ * @param [Numeric] index
+ * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
+ * @return [self]
+ * equivalent to :
+ *  memory.put_bytes(0, str, index, length)
+ */
+static VALUE 
+memory_write_bytes(int argc, VALUE* argv, VALUE self)
+{
+    VALUE* wargv = ALLOCA_N(VALUE, argc + 1);
+    int i;
+
+    wargv[0] = INT2FIX(0);
+    for (i = 0; i < argc; i++) {
+        wargv[i + 1] = argv[i];
+    }
+
+    return memory_put_bytes(argc + 1, wargv, self);
+}
+
+/*
+ * call-seq: memory.type_size
+ * @return [Numeric] type size in bytes
+ * Get the memory's type size.
+ */
+static VALUE
+memory_type_size(VALUE self)
+{
+    AbstractMemory* ptr;
+
+    Data_Get_Struct(self, AbstractMemory, ptr);
+
+    return INT2NUM(ptr->typeSize);
+}
+
+/*
+ * Document-method: []
+ * call-seq: memory[idx]
+ * @param [Numeric] idx index to access in memory
+ * @return 
+ * Memory read accessor.
+ */
+static VALUE
+memory_aref(VALUE self, VALUE idx)
+{
+    AbstractMemory* ptr;
+    VALUE rbOffset = Qnil;
+
+    Data_Get_Struct(self, AbstractMemory, ptr);
+
+    rbOffset = ULONG2NUM(NUM2ULONG(idx) * ptr->typeSize);
+
+    return rb_funcall2(self, id_plus, 1, &rbOffset);
+}
+
+static inline char*
+memory_address(VALUE obj)
+{
+    return ((AbstractMemory *) DATA_PTR(obj))->address;
+}
+
+static VALUE
+memory_copy_from(VALUE self, VALUE rbsrc, VALUE rblen)
+{
+    AbstractMemory* dst;
+
+    Data_Get_Struct(self, AbstractMemory, dst);
+
+    memcpy(dst->address, rbffi_AbstractMemory_Cast(rbsrc, rbffi_AbstractMemoryClass)->address, NUM2INT(rblen));
+
+    return self;
+}
+
+AbstractMemory*
+rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass)
+{
+    if (rb_obj_is_kind_of(obj, klass)) {
+        AbstractMemory* memory;
+        Data_Get_Struct(obj, AbstractMemory, memory);
+        return memory;
+    }
+
+    rb_raise(rb_eArgError, "Invalid Memory object");
+    return NULL;
+}
+
+void
+rbffi_AbstractMemory_Error(AbstractMemory *mem, int op)
+{
+    VALUE rbErrorClass = mem->address == NULL ? NullPointerErrorClass : rb_eRuntimeError;
+    if (op == MEM_RD) {
+        rb_raise(rbErrorClass, "invalid memory read at address=%p", mem->address);
+    } else if (op == MEM_WR) {
+        rb_raise(rbErrorClass, "invalid memory write at address=%p", mem->address);
+    } else {
+        rb_raise(rbErrorClass, "invalid memory access at address=%p", mem->address);
+    }
+}
+
+static VALUE
+memory_op_get_strptr(AbstractMemory* ptr, long offset)
+{
+    void* tmp = NULL;
+
+    if (ptr != NULL && ptr->address != NULL) {
+        checkRead(ptr);
+        checkBounds(ptr, offset, sizeof(tmp));
+        memcpy(&tmp, ptr->address + offset, sizeof(tmp));
+    }
+
+    return tmp != NULL ? rb_tainted_str_new2(tmp) : Qnil;
+}
+
+static void
+memory_op_put_strptr(AbstractMemory* ptr, long offset, VALUE value)
+{
+    rb_raise(rb_eArgError, "Cannot set :string fields");
+}
+
+static MemoryOp memory_op_strptr = { memory_op_get_strptr, memory_op_put_strptr };
+
+
+MemoryOps rbffi_AbstractMemoryOps = {
+    &memory_op_int8, /*.int8 */
+    &memory_op_uint8, /* .uint8 */
+    &memory_op_int16, /* .int16 */
+    &memory_op_uint16, /* .uint16 */
+    &memory_op_int32, /* .int32 */
+    &memory_op_uint32, /* .uint32 */
+    &memory_op_int64, /* .int64 */
+    &memory_op_uint64, /* .uint64 */
+    &memory_op_long, /* .slong */
+    &memory_op_ulong, /* .uslong */
+    &memory_op_float32, /* .float32 */
+    &memory_op_float64, /* .float64 */
+    &memory_op_longdouble, /* .longdouble */
+    &memory_op_pointer, /* .pointer */
+    &memory_op_strptr, /* .strptr */
+    &memory_op_bool /* .boolOp */
+};
+
+void
+rbffi_AbstractMemory_Init(VALUE moduleFFI)
+{
+    /* 
+     * Document-class: FFI::AbstractMemory
+     * 
+     * {AbstractMemory} is the base class for many memory management classes such as {Buffer}.
+     *
+     * This class has a lot of methods to work with integers :
+     * * put_int<i>size</i>(offset, value)
+     * * get_int<i>size</i>(offset)
+     * * put_uint<i>size</i>(offset, value)
+     * * get_uint<i>size</i>(offset)
+     * * writeuint<i>size</i>(value)
+     * * read_int<i>size</i>
+     * * write_uint<i>size</i>(value)
+     * * read_uint<i>size</i>
+     * * put_array_of_int<i>size</i>(offset, ary)
+     * * get_array_of_int<i>size</i>(offset, length)
+     * * put_array_of_uint<i>size</i>(offset, ary)
+     * * get_array_of_uint<i>size</i>(offset, length)
+     * * write_array_of_int<i>size</i>(ary)
+     * * read_array_of_int<i>size</i>(length)
+     * * write_array_of_uint<i>size</i>(ary)
+     * * read_array_of_uint<i>size</i>(length)
+     * where _size_ is 8, 16, 32 or 64. Same methods exist for long type.
+     *
+     * Aliases exist : _char_ for _int8_, _short_ for _int16_, _int_ for _int32_ and <i>long_long</i> for _int64_.
+     *
+     * Others methods are listed below.
+     */
+    VALUE classMemory = rb_define_class_under(moduleFFI, "AbstractMemory", rb_cObject);
+    rbffi_AbstractMemoryClass = classMemory;
+    /* 
+     * Document-variable: FFI::AbstractMemory 
+     */
+    rb_global_variable(&rbffi_AbstractMemoryClass);
+    rb_define_alloc_func(classMemory, memory_allocate);
+
+    NullPointerErrorClass = rb_define_class_under(moduleFFI, "NullPointerError", rb_eRuntimeError);
+    /* Document-variable: NullPointerError */
+    rb_global_variable(&NullPointerErrorClass);
+
+
+#undef INT
+#define INT(type) \
+    rb_define_method(classMemory, "put_" #type, memory_put_##type, 2); \
+    rb_define_method(classMemory, "get_" #type, memory_get_##type, 1); \
+    rb_define_method(classMemory, "put_u" #type, memory_put_u##type, 2); \
+    rb_define_method(classMemory, "get_u" #type, memory_get_u##type, 1); \
+    rb_define_method(classMemory, "write_" #type, memory_write_##type, 1); \
+    rb_define_method(classMemory, "read_" #type, memory_read_##type, 0); \
+    rb_define_method(classMemory, "write_u" #type, memory_write_u##type, 1); \
+    rb_define_method(classMemory, "read_u" #type, memory_read_u##type, 0); \
+    rb_define_method(classMemory, "put_array_of_" #type, memory_put_array_of_##type, 2); \
+    rb_define_method(classMemory, "get_array_of_" #type, memory_get_array_of_##type, 2); \
+    rb_define_method(classMemory, "put_array_of_u" #type, memory_put_array_of_u##type, 2); \
+    rb_define_method(classMemory, "get_array_of_u" #type, memory_get_array_of_u##type, 2); \
+    rb_define_method(classMemory, "write_array_of_" #type, memory_write_array_of_##type, 1); \
+    rb_define_method(classMemory, "read_array_of_" #type, memory_read_array_of_##type, 1); \
+    rb_define_method(classMemory, "write_array_of_u" #type, memory_write_array_of_u##type, 1); \
+    rb_define_method(classMemory, "read_array_of_u" #type, memory_read_array_of_u##type, 1);
+    
+    INT(int8);
+    INT(int16);
+    INT(int32);
+    INT(int64);
+    INT(long);
+    
+#define ALIAS(name, old) \
+    rb_define_alias(classMemory, "put_" #name, "put_" #old); \
+    rb_define_alias(classMemory, "get_" #name, "get_" #old); \
+    rb_define_alias(classMemory, "put_u" #name, "put_u" #old); \
+    rb_define_alias(classMemory, "get_u" #name, "get_u" #old); \
+    rb_define_alias(classMemory, "write_" #name, "write_" #old); \
+    rb_define_alias(classMemory, "read_" #name, "read_" #old); \
+    rb_define_alias(classMemory, "write_u" #name, "write_u" #old); \
+    rb_define_alias(classMemory, "read_u" #name, "read_u" #old); \
+    rb_define_alias(classMemory, "put_array_of_" #name, "put_array_of_" #old); \
+    rb_define_alias(classMemory, "get_array_of_" #name, "get_array_of_" #old); \
+    rb_define_alias(classMemory, "put_array_of_u" #name, "put_array_of_u" #old); \
+    rb_define_alias(classMemory, "get_array_of_u" #name, "get_array_of_u" #old); \
+    rb_define_alias(classMemory, "write_array_of_" #name, "write_array_of_" #old); \
+    rb_define_alias(classMemory, "read_array_of_" #name, "read_array_of_" #old); \
+    rb_define_alias(classMemory, "write_array_of_u" #name, "write_array_of_u" #old); \
+    rb_define_alias(classMemory, "read_array_of_u" #name, "read_array_of_u" #old);
+    
+    ALIAS(char, int8);
+    ALIAS(short, int16);
+    ALIAS(int, int32);
+    ALIAS(long_long, int64);
+    
+    /*
+     * Document-method: put_float32
+     * call-seq: memory.put_float32offset, value)
+     * @param [Numeric] offset
+     * @param [Numeric] value
+     * @return [self]
+     * Put +value+ as a 32-bit float in memory at offset +offset+ (alias: #put_float).
+     */
+    rb_define_method(classMemory, "put_float32", memory_put_float32, 2);
+    /*
+     * Document-method: get_float32
+     * call-seq: memory.get_float32(offset)
+     * @param [Numeric] offset
+     * @return [Float]
+     * Get a 32-bit float from memory at offset +offset+ (alias: #get_float).
+     */
+    rb_define_method(classMemory, "get_float32", memory_get_float32, 1);
+    rb_define_alias(classMemory, "put_float", "put_float32");
+    rb_define_alias(classMemory, "get_float", "get_float32");
+    /*
+     * Document-method: write_float
+     * call-seq: memory.write_float(value)
+     * @param [Numeric] value
+     * @return [self]
+     * Write +value+ as a 32-bit float in memory.
+     *
+     * Same as:
+     *  memory.put_float(0, value)
+     */
+    rb_define_method(classMemory, "write_float", memory_write_float32, 1);
+    /*
+     * Document-method: read_float
+     * call-seq: memory.read_float
+     * @return [Float]
+     * Read a 32-bit float from memory.
+     *
+     * Same as:
+     *  memory.get_float(0)
+     */
+    rb_define_method(classMemory, "read_float", memory_read_float32, 0);
+    /*
+     * Document-method: put_array_of_float32
+     * call-seq: memory.put_array_of_float32(offset, ary)
+     * @param [Numeric] offset
+     * @param [Array<Numeric>] ary
+     * @return [self]
+     * Put values from +ary+ as 32-bit floats in memory from offset +offset+ (alias: #put_array_of_float).
+     */
+    rb_define_method(classMemory, "put_array_of_float32", memory_put_array_of_float32, 2);
+    /*
+     * Document-method: get_array_of_float32
+     * call-seq: memory.get_array_of_float32(offset, length)
+     * @param [Numeric] offset
+     * @param [Numeric] length number of Float to get
+     * @return [Array<Float>]
+     * Get 32-bit floats in memory from offset +offset+ (alias: #get_array_of_float).
+     */
+    rb_define_method(classMemory, "get_array_of_float32", memory_get_array_of_float32, 2);
+    /*
+     * Document-method: write_array_of_float
+     * call-seq: memory.write_array_of_float(ary)
+     * @param [Array<Numeric>] ary
+     * @return [self]
+     * Write values from +ary+ as 32-bit floats in memory.
+     *
+     * Same as:
+     *  memory.put_array_of_float(0, ary)
+     */
+    rb_define_method(classMemory, "write_array_of_float", memory_write_array_of_float32, 1);
+    /*
+     * Document-method: read_array_of_float
+     * call-seq: memory.read_array_of_float(length)
+     * @param [Numeric] length number of Float to read
+     * @return [Array<Float>]
+     * Read 32-bit floats from memory.
+     *
+     * Same as:
+     *  memory.get_array_of_float(0, ary)
+     */
+    rb_define_method(classMemory, "read_array_of_float", memory_read_array_of_float32, 1);
+    rb_define_alias(classMemory, "put_array_of_float", "put_array_of_float32");
+    rb_define_alias(classMemory, "get_array_of_float", "get_array_of_float32");
+    /*
+     * Document-method: put_float64
+     * call-seq: memory.put_float64(offset, value)
+     * @param [Numeric] offset
+     * @param [Numeric] value
+     * @return [self]
+     * Put +value+ as a 64-bit float (double) in memory at offset +offset+ (alias: #put_double).
+     */
+    rb_define_method(classMemory, "put_float64", memory_put_float64, 2);
+    /*
+     * Document-method: get_float64
+     * call-seq: memory.get_float64(offset)
+     * @param [Numeric] offset
+     * @return [Float]
+     * Get a 64-bit float (double) from memory at offset +offset+ (alias: #get_double).
+     */
+    rb_define_method(classMemory, "get_float64", memory_get_float64, 1);
+    rb_define_alias(classMemory, "put_double", "put_float64");
+    rb_define_alias(classMemory, "get_double", "get_float64");
+    /*
+     * Document-method: write_double
+     * call-seq: memory.write_double(value)
+     * @param [Numeric] value
+     * @return [self]
+     * Write +value+ as a 64-bit float (double) in memory.
+     *
+     * Same as:
+     *  memory.put_double(0, value)
+     */
+    rb_define_method(classMemory, "write_double", memory_write_float64, 1);
+    /*
+     * Document-method: read_double
+     * call-seq: memory.read_double
+     * @return [Float]
+     * Read a 64-bit float (double) from memory.
+     *
+     * Same as:
+     *  memory.get_double(0)
+     */
+    rb_define_method(classMemory, "read_double", memory_read_float64, 0);
+    /*
+     * Document-method: put_array_of_float64
+     * call-seq: memory.put_array_of_float64(offset, ary)
+     * @param [Numeric] offset
+     * @param [Array<Numeric>] ary
+     * @return [self]
+     * Put values from +ary+ as 64-bit floats (doubles) in memory from offset +offset+ (alias: #put_array_of_double).
+     */
+    rb_define_method(classMemory, "put_array_of_float64", memory_put_array_of_float64, 2);
+    /*
+     * Document-method: get_array_of_float64
+     * call-seq: memory.get_array_of_float64(offset, length)
+     * @param [Numeric] offset
+     * @param [Numeric] length number of Float to get
+     * @return [Array<Float>]
+     * Get 64-bit floats (doubles) in memory from offset +offset+ (alias: #get_array_of_double).
+     */
+    rb_define_method(classMemory, "get_array_of_float64", memory_get_array_of_float64, 2);
+    /*
+     * Document-method: write_array_of_double
+     * call-seq: memory.write_array_of_double(ary)
+     * @param [Array<Numeric>] ary
+     * @return [self]
+     * Write values from +ary+ as 64-bit floats (doubles) in memory.
+     *
+     * Same as:
+     *  memory.put_array_of_double(0, ary)
+     */
+    rb_define_method(classMemory, "write_array_of_double", memory_write_array_of_float64, 1);
+    /*
+     * Document-method: read_array_of_double
+     * call-seq: memory.read_array_of_double(length)
+     * @param [Numeric] length number of Float to read
+     * @return [Array<Float>]
+     * Read 64-bit floats (doubles) from memory.
+     *
+     * Same as:
+     *  memory.get_array_of_double(0, ary)
+     */
+    rb_define_method(classMemory, "read_array_of_double", memory_read_array_of_float64, 1);
+    rb_define_alias(classMemory, "put_array_of_double", "put_array_of_float64");
+    rb_define_alias(classMemory, "get_array_of_double", "get_array_of_float64");
+    /*
+     * Document-method: put_pointer
+     * call-seq: memory.put_pointer(offset, value)
+     * @param [Numeric] offset
+     * @param [nil,Pointer, Integer, #to_ptr] value
+     * @return [self]
+     * Put +value+ in memory from +offset+..
+     */
+    rb_define_method(classMemory, "put_pointer", memory_put_pointer, 2);
+    /*
+     * Document-method: get_pointer
+     * call-seq: memory.get_pointer(offset)
+     * @param [Numeric] offset
+     * @return [Pointer]
+     * Get a {Pointer} to the memory from +offset+.
+     */
+    rb_define_method(classMemory, "get_pointer", memory_get_pointer, 1);
+    /*
+     * Document-method: write_pointer
+     * call-seq: memory.write_pointer(value)
+     * @param [nil,Pointer, Integer, #to_ptr] value
+     * @return [self]
+     * Write +value+ in memory.
+     *
+     * Equivalent to:
+     *  memory.put_pointer(0, value)
+     */
+    rb_define_method(classMemory, "write_pointer", memory_write_pointer, 1);
+    /*
+     * Document-method: read_pointer
+     * call-seq: memory.read_pointer
+     * @return [Pointer]
+     * Get a {Pointer} to the memory from base address.
+     *
+     * Equivalent to:
+     *  memory.get_pointer(0)
+     */
+    rb_define_method(classMemory, "read_pointer", memory_read_pointer, 0);
+    /*
+     * Document-method: put_array_of_pointer
+     * call-seq: memory.put_array_of_pointer(offset, ary)
+     * @param [Numeric] offset
+     * @param [Array<#to_ptr>] ary
+     * @return [self]
+     * Put an array of {Pointer} into memory from +offset+.
+     */
+    rb_define_method(classMemory, "put_array_of_pointer", memory_put_array_of_pointer, 2);
+    /*
+     * Document-method: get_array_of_pointer
+     * call-seq: memory.get_array_of_pointer(offset, length)
+     * @param [Numeric] offset
+     * @param [Numeric] length
+     * @return [Array<Pointer>]
+     * Get an array of {Pointer} of length +length+ from +offset+.
+     */
+    rb_define_method(classMemory, "get_array_of_pointer", memory_get_array_of_pointer, 2);
+    /*
+     * Document-method: write_array_of_pointer
+     * call-seq: memory.write_array_of_pointer(ary)
+     * @param [Array<#to_ptr>] ary
+     * @return [self]
+     * Write an array of {Pointer} into memory from +offset+.
+     *
+     * Same as :
+     *  memory.put_array_of_pointer(0, ary)
+     */
+    rb_define_method(classMemory, "write_array_of_pointer", memory_write_array_of_pointer, 1);
+    /*
+     * Document-method: read_array_of_pointer
+     * call-seq: memory.read_array_of_pointer(length)
+     * @param [Numeric] length
+     * @return [Array<Pointer>]
+     * Read an array of {Pointer} of length +length+.
+     *
+     * Same as:
+     *  memory.get_array_of_pointer(0, length)
+     */
+    rb_define_method(classMemory, "read_array_of_pointer", memory_read_array_of_pointer, 1);
+
+    rb_define_method(classMemory, "get_string", memory_get_string, -1);
+    rb_define_method(classMemory, "put_string", memory_put_string, 2);
+    rb_define_method(classMemory, "get_bytes", memory_get_bytes, 2);
+    rb_define_method(classMemory, "put_bytes", memory_put_bytes, -1);
+    rb_define_method(classMemory, "read_bytes", memory_read_bytes, 1);
+    rb_define_method(classMemory, "write_bytes", memory_write_bytes, -1);
+    rb_define_method(classMemory, "get_array_of_string", memory_get_array_of_string, -1);
+
+    rb_define_method(classMemory, "get", memory_get, 2);
+    rb_define_method(classMemory, "put", memory_put, 3);
+
+    rb_define_method(classMemory, "clear", memory_clear, 0);
+    rb_define_method(classMemory, "total", memory_size, 0);
+    rb_define_alias(classMemory, "size", "total");
+    rb_define_method(classMemory, "type_size", memory_type_size, 0);
+    rb_define_method(classMemory, "[]", memory_aref, 1);
+    rb_define_method(classMemory, "__copy_from__", memory_copy_from, 2);
+
+    id_to_ptr = rb_intern("to_ptr");
+    id_call = rb_intern("call");
+    id_plus = rb_intern("+");
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.h
new file mode 100644
index 0000000..1119288
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.h
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_ABSTRACTMEMORY_H
+#define	RBFFI_ABSTRACTMEMORY_H
+
+#ifndef _MSC_VER
+#include <sys/param.h>
+#endif
+#include <sys/types.h>
+#ifndef _MSC_VER
+#include <stdint.h>
+#endif
+
+#include "compat.h"
+#include "Types.h"
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+
+#define MEM_RD   0x01
+#define MEM_WR   0x02
+#define MEM_CODE 0x04
+#define MEM_SWAP 0x08
+#define MEM_EMBED 0x10
+
+typedef struct AbstractMemory_ AbstractMemory;
+
+typedef struct {
+    VALUE (*get)(AbstractMemory* ptr, long offset);
+    void (*put)(AbstractMemory* ptr, long offset, VALUE value);
+} MemoryOp;
+
+typedef struct {
+    MemoryOp* int8;
+    MemoryOp* uint8;
+    MemoryOp* int16;
+    MemoryOp* uint16;
+    MemoryOp* int32;
+    MemoryOp* uint32;
+    MemoryOp* int64;
+    MemoryOp* uint64;
+    MemoryOp* slong;
+    MemoryOp* uslong;
+    MemoryOp* float32;
+    MemoryOp* float64;
+    MemoryOp* longdouble;
+    MemoryOp* pointer;
+    MemoryOp* strptr;
+    MemoryOp* boolOp;
+} MemoryOps;
+
+struct AbstractMemory_ {
+    char* address; /* Use char* instead of void* to ensure adding to it works correctly */
+    long size;
+    int flags;
+    int typeSize;
+};
+
+
+extern VALUE rbffi_AbstractMemoryClass;
+extern MemoryOps rbffi_AbstractMemoryOps;
+
+extern void rbffi_AbstractMemory_Init(VALUE ffiModule);
+
+extern AbstractMemory* rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass);
+
+extern void rbffi_AbstractMemory_Error(AbstractMemory *, int op);
+
+static inline void
+checkBounds(AbstractMemory* mem, long off, long len)
+{
+    if (unlikely((off | len | (off + len) | (mem->size - (off + len))) < 0)) {
+        rb_raise(rb_eIndexError, "Memory access offset=%ld size=%ld is out of bounds",
+                off, len);
+    }
+}
+
+static inline void
+checkRead(AbstractMemory* mem)
+{
+    if (unlikely((mem->flags & MEM_RD) == 0)) {
+        rbffi_AbstractMemory_Error(mem, MEM_RD);
+    }
+}
+
+static inline void
+checkWrite(AbstractMemory* mem)
+{
+    if (unlikely((mem->flags & MEM_WR) == 0)) {
+        rbffi_AbstractMemory_Error(mem, MEM_WR);
+    }
+}
+
+static inline MemoryOp*
+get_memory_op(Type* type)
+{
+    switch (type->nativeType) {
+        case NATIVE_INT8:
+            return rbffi_AbstractMemoryOps.int8;
+        case NATIVE_UINT8:
+            return rbffi_AbstractMemoryOps.uint8;
+        case NATIVE_INT16:
+            return rbffi_AbstractMemoryOps.int16;
+        case NATIVE_UINT16:
+            return rbffi_AbstractMemoryOps.uint16;
+        case NATIVE_INT32:
+            return rbffi_AbstractMemoryOps.int32;
+        case NATIVE_UINT32:
+            return rbffi_AbstractMemoryOps.uint32;
+        case NATIVE_INT64:
+            return rbffi_AbstractMemoryOps.int64;
+        case NATIVE_UINT64:
+            return rbffi_AbstractMemoryOps.uint64;
+        case NATIVE_LONG:
+            return rbffi_AbstractMemoryOps.slong;
+        case NATIVE_ULONG:
+            return rbffi_AbstractMemoryOps.uslong;
+        case NATIVE_FLOAT32:
+            return rbffi_AbstractMemoryOps.float32;
+        case NATIVE_FLOAT64:
+            return rbffi_AbstractMemoryOps.float64;
+        case NATIVE_LONGDOUBLE:
+            return rbffi_AbstractMemoryOps.longdouble;
+        case NATIVE_POINTER:
+            return rbffi_AbstractMemoryOps.pointer;
+        case NATIVE_STRING:
+            return rbffi_AbstractMemoryOps.strptr;
+        case NATIVE_BOOL:
+            return rbffi_AbstractMemoryOps.boolOp;
+        default:
+            return NULL;
+    }
+}
+
+#define MEMORY(obj) rbffi_AbstractMemory_Cast((obj), rbffi_AbstractMemoryClass)
+#define MEMORY_PTR(obj) MEMORY((obj))->address
+#define MEMORY_LEN(obj) MEMORY((obj))->size
+
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_ABSTRACTMEMORY_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.o
new file mode 100644
index 0000000..767e65b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/AbstractMemory.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.c
new file mode 100644
index 0000000..bfd666a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.c
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#include <ruby.h>
+#include <ffi.h>
+#include "ArrayType.h"
+
+static VALUE array_type_s_allocate(VALUE klass);
+static VALUE array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength);
+static void array_type_mark(ArrayType *);
+static void array_type_free(ArrayType *);
+
+VALUE rbffi_ArrayTypeClass = Qnil;
+
+static VALUE
+array_type_s_allocate(VALUE klass)
+{
+    ArrayType* array;
+    VALUE obj;
+
+    obj = Data_Make_Struct(klass, ArrayType, array_type_mark, array_type_free, array);
+
+    array->base.nativeType = NATIVE_ARRAY;
+    array->base.ffiType = xcalloc(1, sizeof(*array->base.ffiType));
+    array->base.ffiType->type = FFI_TYPE_STRUCT;
+    array->base.ffiType->size = 0;
+    array->base.ffiType->alignment = 0;
+    array->rbComponentType = Qnil;
+
+    return obj;
+}
+
+static void
+array_type_mark(ArrayType *array)
+{
+    rb_gc_mark(array->rbComponentType);
+}
+
+static void
+array_type_free(ArrayType *array)
+{
+    xfree(array->base.ffiType);
+    xfree(array->ffiTypes);
+    xfree(array);
+}
+
+
+/*
+ * call-seq: initialize(component_type, length)
+ * @param [Type] component_type
+ * @param [Numeric] length
+ * @return [self]
+ * A new instance of ArrayType.
+ */
+static VALUE
+array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength)
+{
+    ArrayType* array;
+    int i;
+
+    Data_Get_Struct(self, ArrayType, array);
+
+    array->length = NUM2UINT(rbLength);
+    array->rbComponentType = rbComponentType;
+    Data_Get_Struct(rbComponentType, Type, array->componentType);
+    
+    array->ffiTypes = xcalloc(array->length + 1, sizeof(*array->ffiTypes));
+    array->base.ffiType->elements = array->ffiTypes;
+    array->base.ffiType->size = array->componentType->ffiType->size * array->length;
+    array->base.ffiType->alignment = array->componentType->ffiType->alignment;
+
+    for (i = 0; i < array->length; ++i) {
+        array->ffiTypes[i] = array->componentType->ffiType;
+    }
+
+    return self;
+}
+
+/*
+ * call-seq: length
+ * @return [Numeric]
+ * Get array's length
+ */
+static VALUE
+array_type_length(VALUE self)
+{
+    ArrayType* array;
+
+    Data_Get_Struct(self, ArrayType, array);
+
+    return UINT2NUM(array->length);
+}
+
+/*
+ * call-seq: element_type
+ * @return [Type]
+ * Get element type.
+ */
+static VALUE
+array_type_element_type(VALUE self)
+{
+    ArrayType* array;
+
+    Data_Get_Struct(self, ArrayType, array);
+
+    return array->rbComponentType;
+}
+
+void
+rbffi_ArrayType_Init(VALUE moduleFFI)
+{
+    VALUE ffi_Type;
+
+    ffi_Type = rbffi_TypeClass;
+
+    /*
+     * Document-class: FFI::ArrayType < FFI::Type
+     *
+     * This is a typed array. The type is a {NativeType native type}.
+     */
+    rbffi_ArrayTypeClass = rb_define_class_under(moduleFFI, "ArrayType", ffi_Type);
+    /*
+     * Document-variable: FFI::ArrayType
+     */
+    rb_global_variable(&rbffi_ArrayTypeClass);
+    /*
+     * Document-constant: FFI::Type::Array
+     */
+    rb_define_const(ffi_Type, "Array", rbffi_ArrayTypeClass);
+
+    rb_define_alloc_func(rbffi_ArrayTypeClass, array_type_s_allocate);
+    rb_define_method(rbffi_ArrayTypeClass, "initialize", array_type_initialize, 2);
+    rb_define_method(rbffi_ArrayTypeClass, "length", array_type_length, 0);
+    rb_define_method(rbffi_ArrayTypeClass, "elem_type", array_type_element_type, 0);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.h
new file mode 100644
index 0000000..356ffb1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_ARRAYTYPE_H
+#define	RBFFI_ARRAYTYPE_H
+
+#include <ruby.h>
+#include <ffi.h>
+#include "Type.h"
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+
+typedef struct ArrayType_ {
+    Type base;
+    int length;
+    ffi_type** ffiTypes;
+    Type* componentType;
+    VALUE rbComponentType;
+} ArrayType;
+
+extern void rbffi_ArrayType_Init(VALUE moduleFFI);
+extern VALUE rbffi_ArrayTypeClass;
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_ARRAYTYPE_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.o
new file mode 100644
index 0000000..d65a395
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ArrayType.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.c
new file mode 100644
index 0000000..faf4834
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.c
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 2008-2010 Wayne Meissner
+ * Copyright (C) 2009 Aman Gupta <aman@tmm1.net>
+ * 
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+#include <limits.h>
+#include <ruby.h>
+#include "rbffi.h"
+#include "rbffi_endian.h"
+#include "AbstractMemory.h"
+
+#define BUFFER_EMBED_MAXLEN (8)
+typedef struct Buffer {
+    AbstractMemory memory;
+    
+    union {
+        VALUE rbParent; /* link to parent buffer */
+        char* storage; /* start of malloc area */
+        long embed[BUFFER_EMBED_MAXLEN / sizeof(long)]; /* storage for tiny allocations */
+    } data;
+} Buffer;
+
+static VALUE buffer_allocate(VALUE klass);
+static VALUE buffer_initialize(int argc, VALUE* argv, VALUE self);
+static void buffer_release(Buffer* ptr);
+static void buffer_mark(Buffer* ptr);
+static VALUE buffer_free(VALUE self);
+
+static VALUE BufferClass = Qnil;
+
+static VALUE
+buffer_allocate(VALUE klass)
+{
+    Buffer* buffer;
+    VALUE obj;
+
+    obj = Data_Make_Struct(klass, Buffer, NULL, buffer_release, buffer);
+    buffer->data.rbParent = Qnil;
+    buffer->memory.flags = MEM_RD | MEM_WR;
+
+    return obj;
+}
+
+static void
+buffer_release(Buffer* ptr)
+{
+    if ((ptr->memory.flags & MEM_EMBED) == 0 && ptr->data.storage != NULL) {
+        xfree(ptr->data.storage);
+        ptr->data.storage = NULL;
+    }
+    
+    xfree(ptr);
+}
+
+/*
+ * call-seq: initialize(size, count=1, clear=false)
+ * @param [Integer, Symbol, #size] Type or size in bytes of a buffer cell
+ * @param [Fixnum] count number of cell in the Buffer
+ * @param [Boolean] clear if true, set the buffer to all-zero
+ * @return [self]
+ * @raise {NoMemoryError} if failed to allocate memory for Buffer
+ * A new instance of Buffer.
+ */
+static VALUE
+buffer_initialize(int argc, VALUE* argv, VALUE self)
+{
+    VALUE rbSize = Qnil, rbCount = Qnil, rbClear = Qnil;
+    Buffer* p;
+    int nargs;
+
+    Data_Get_Struct(self, Buffer, p);
+
+    nargs = rb_scan_args(argc, argv, "12", &rbSize, &rbCount, &rbClear);
+    p->memory.typeSize = rbffi_type_size(rbSize);
+    p->memory.size = p->memory.typeSize * (nargs > 1 ? NUM2LONG(rbCount) : 1);
+
+    if (p->memory.size > BUFFER_EMBED_MAXLEN) {
+        p->data.storage = xmalloc(p->memory.size + 7);
+        if (p->data.storage == NULL) {
+            rb_raise(rb_eNoMemError, "Failed to allocate memory size=%lu bytes", p->memory.size);
+            return Qnil;
+        }
+
+        /* ensure the memory is aligned on at least a 8 byte boundary */
+        p->memory.address = (void *) (((uintptr_t) p->data.storage + 0x7) & (uintptr_t) ~0x7UL);
+    
+        if (p->memory.size > 0 && (nargs < 3 || RTEST(rbClear))) {
+            memset(p->memory.address, 0, p->memory.size);
+        }
+    
+    } else {
+        p->memory.flags |= MEM_EMBED;
+        p->memory.address = (void *) &p->data.embed[0];
+    }
+
+    if (rb_block_given_p()) {
+        return rb_ensure(rb_yield, self, buffer_free, self);
+    }
+
+    return self;
+}
+
+/*
+ * call-seq: initialize_copy(other)
+ * @return [self]
+ * DO NOT CALL THIS METHOD.
+ */
+static VALUE
+buffer_initialize_copy(VALUE self, VALUE other)
+{
+    AbstractMemory* src;
+    Buffer* dst;
+    
+    Data_Get_Struct(self, Buffer, dst);
+    src = rbffi_AbstractMemory_Cast(other, BufferClass);
+    if ((dst->memory.flags & MEM_EMBED) == 0 && dst->data.storage != NULL) {
+        xfree(dst->data.storage);
+    }
+    dst->data.storage = xmalloc(src->size + 7);
+    if (dst->data.storage == NULL) {
+        rb_raise(rb_eNoMemError, "failed to allocate memory size=%lu bytes", src->size);
+        return Qnil;
+    }
+    
+    dst->memory.address = (void *) (((uintptr_t) dst->data.storage + 0x7) & (uintptr_t) ~0x7UL);
+    dst->memory.size = src->size;
+    dst->memory.typeSize = src->typeSize;
+    
+    /* finally, copy the actual buffer contents */
+    memcpy(dst->memory.address, src->address, src->size);
+
+    return self;
+}
+
+static VALUE
+buffer_alloc_inout(int argc, VALUE* argv, VALUE klass)
+{
+    return buffer_initialize(argc, argv, buffer_allocate(klass));
+}
+
+static VALUE
+slice(VALUE self, long offset, long len)
+{
+    Buffer* ptr;
+    Buffer* result;
+    VALUE obj = Qnil;
+    
+    Data_Get_Struct(self, Buffer, ptr);
+    checkBounds(&ptr->memory, offset, len);
+
+    obj = Data_Make_Struct(BufferClass, Buffer, buffer_mark, -1, result);
+    result->memory.address = ptr->memory.address + offset;
+    result->memory.size = len;
+    result->memory.flags = ptr->memory.flags;
+    result->memory.typeSize = ptr->memory.typeSize;
+    result->data.rbParent = self;
+
+    return obj;
+}
+
+/*
+ * call-seq: + offset
+ * @param [Numeric] offset
+ * @return [Buffer] a new instance of Buffer pointing from offset until end of previous buffer.
+ * Add a Buffer with an offset
+ */
+static VALUE
+buffer_plus(VALUE self, VALUE rbOffset)
+{
+    Buffer* ptr;
+    long offset = NUM2LONG(rbOffset);
+
+    Data_Get_Struct(self, Buffer, ptr);
+
+    return slice(self, offset, ptr->memory.size - offset);
+}
+
+/*
+ * call-seq: slice(offset, length)
+ * @param [Numeric] offset
+ * @param [Numeric] length
+ * @return [Buffer] a new instance of Buffer
+ * Slice an existing Buffer.
+ */
+static VALUE
+buffer_slice(VALUE self, VALUE rbOffset, VALUE rbLength)
+{
+    return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength));
+}
+
+/*
+ * call-seq: inspect
+ * @return [String]
+ * Inspect a Buffer.
+ */
+static VALUE
+buffer_inspect(VALUE self)
+{
+    char tmp[100];
+    Buffer* ptr;
+
+    Data_Get_Struct(self, Buffer, ptr);
+
+    snprintf(tmp, sizeof(tmp), "#<FFI:Buffer:%p address=%p size=%ld>", ptr, ptr->memory.address, ptr->memory.size);
+    
+    return rb_str_new2(tmp);
+}
+
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+# define SWAPPED_ORDER BIG_ENDIAN
+#else
+# define SWAPPED_ORDER LITTLE_ENDIAN
+#endif
+
+/*
+ * Set or get endianness of Buffer.
+ * @overload order
+ *  @return [:big, :little]
+ *  Get endianness of Buffer.
+ * @overload order(order)
+ *  @param [:big, :little, :network] order
+ *  @return [self]
+ *  Set endianness of Buffer (+:network+ is an alias for +:big+).
+ */
+static VALUE
+buffer_order(int argc, VALUE* argv, VALUE self)
+{
+    Buffer* ptr;
+
+    Data_Get_Struct(self, Buffer, ptr);
+    if (argc == 0) {
+        int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER;
+        return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little"));
+    } else {
+        VALUE rbOrder = Qnil;
+        int order = BYTE_ORDER;
+
+        if (rb_scan_args(argc, argv, "1", &rbOrder) < 1) {
+            rb_raise(rb_eArgError, "need byte order");
+        }
+        if (SYMBOL_P(rbOrder)) {
+            ID id = SYM2ID(rbOrder);
+            if (id == rb_intern("little")) {
+                order = LITTLE_ENDIAN;
+
+            } else if (id == rb_intern("big") || id == rb_intern("network")) {
+                order = BIG_ENDIAN;
+            }
+        }
+        if (order != BYTE_ORDER) {
+            Buffer* p2;
+            VALUE retval = slice(self, 0, ptr->memory.size);
+
+            Data_Get_Struct(retval, Buffer, p2);
+            p2->memory.flags |= MEM_SWAP;
+            return retval;
+        }
+
+        return self;
+    }
+}
+
+/* Only used to free the buffer if the yield in the initializer throws an exception */
+static VALUE
+buffer_free(VALUE self)
+{
+    Buffer* ptr;
+
+    Data_Get_Struct(self, Buffer, ptr);
+    if ((ptr->memory.flags & MEM_EMBED) == 0 && ptr->data.storage != NULL) {
+        xfree(ptr->data.storage);
+        ptr->data.storage = NULL;
+    }
+
+    return self;
+}
+
+static void
+buffer_mark(Buffer* ptr)
+{
+    rb_gc_mark(ptr->data.rbParent);
+}
+
+void
+rbffi_Buffer_Init(VALUE moduleFFI)
+{
+    VALUE ffi_AbstractMemory =  rbffi_AbstractMemoryClass;
+
+    /*
+     * Document-class: FFI::Buffer < FFI::AbstractMemory
+     *
+     * A Buffer is a function argument type. It should be use with functions playing with C arrays.
+     */
+    BufferClass = rb_define_class_under(moduleFFI, "Buffer", ffi_AbstractMemory);
+
+    /*
+     * Document-variable: FFI::Buffer
+     */
+    rb_global_variable(&BufferClass);
+    rb_define_alloc_func(BufferClass, buffer_allocate);
+
+    /*
+     * Document-method: alloc_inout
+     * call-seq: alloc_inout(*args)
+     * Create a new Buffer for in and out arguments (alias : <i>new_inout</i>).
+     */
+    rb_define_singleton_method(BufferClass, "alloc_inout", buffer_alloc_inout, -1);
+    /*
+     * Document-method: alloc_out
+     * call-seq: alloc_out(*args)
+     * Create a new Buffer for out arguments (alias : <i>new_out</i>).
+     */
+    rb_define_singleton_method(BufferClass, "alloc_out", buffer_alloc_inout, -1);
+    /*
+     * Document-method: alloc_in
+     * call-seq: alloc_in(*args)
+     * Create a new Buffer for in arguments (alias : <i>new_in</i>).
+     */
+    rb_define_singleton_method(BufferClass, "alloc_in", buffer_alloc_inout, -1);
+    rb_define_alias(rb_singleton_class(BufferClass), "new_in", "alloc_in");
+    rb_define_alias(rb_singleton_class(BufferClass), "new_out", "alloc_out");
+    rb_define_alias(rb_singleton_class(BufferClass), "new_inout", "alloc_inout");
+    
+    rb_define_method(BufferClass, "initialize", buffer_initialize, -1);
+    rb_define_method(BufferClass, "initialize_copy", buffer_initialize_copy, 1);
+    rb_define_method(BufferClass, "order", buffer_order, -1);
+    rb_define_method(BufferClass, "inspect", buffer_inspect, 0);
+    rb_define_alias(BufferClass, "length", "total");
+    rb_define_method(BufferClass, "+", buffer_plus, 1);
+    rb_define_method(BufferClass, "slice", buffer_slice, 2);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.o
new file mode 100644
index 0000000..b7a0871
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Buffer.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Call.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Call.c
new file mode 100644
index 0000000..a738cb5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Call.c
@@ -0,0 +1,517 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
+ * Copyright (c) 2009, Mike Dalessio <mike.dalessio@gmail.com>
+ * Copyright (c) 2009, Aman Gupta.
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+#include <sys/param.h>
+#endif
+#include <sys/types.h>
+#include <stdio.h>
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+#include <errno.h>
+#include <ruby.h>
+#if defined(HAVE_NATIVETHREAD) && (defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) && !defined(_WIN32)
+#  include <signal.h>
+#  include <pthread.h>
+#endif
+#include <ffi.h>
+#include "extconf.h"
+#include "rbffi.h"
+#include "compat.h"
+#include "AbstractMemory.h"
+#include "Pointer.h"
+#include "Struct.h"
+#include "Function.h"
+#include "Type.h"
+#include "LastError.h"
+#include "Call.h"
+#include "MappedType.h"
+#include "Thread.h"
+#include "LongDouble.h"
+
+#ifdef USE_RAW
+#  ifndef __i386__
+#    error "RAW argument packing only supported on i386"
+#  endif
+
+#define INT8_ADJ (4)
+#define INT16_ADJ (4)
+#define INT32_ADJ (4)
+#define INT64_ADJ (8)
+#define LONG_ADJ (sizeof(long))
+#define FLOAT32_ADJ (4)
+#define FLOAT64_ADJ (8)
+#define ADDRESS_ADJ (sizeof(void *))
+#define LONGDOUBLE_ADJ (ffi_type_longdouble.alignment)
+
+#endif /* USE_RAW */
+
+#ifdef USE_RAW
+#  define ADJ(p, a) ((p) = (FFIStorage*) (((char *) p) + a##_ADJ))
+#else
+#  define ADJ(p, a) (++(p))
+#endif
+
+static void* callback_param(VALUE proc, VALUE cbinfo);
+static inline void* getPointer(VALUE value, int type);
+
+static ID id_to_ptr, id_map_symbol, id_to_native;
+
+void
+rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
+        FFIStorage* paramStorage, void** ffiValues,
+        VALUE* callbackParameters, int callbackCount, VALUE enums)
+{
+    VALUE callbackProc = Qnil;
+    FFIStorage* param = &paramStorage[0];
+    int i, argidx, cbidx, argCount;
+
+    if (unlikely(paramCount != -1 && paramCount != argc)) {
+        if (argc == (paramCount - 1) && callbackCount == 1 && rb_block_given_p()) {
+            callbackProc = rb_block_proc();
+        } else {
+            rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", argc, paramCount);
+        }
+    }
+
+    argCount = paramCount != -1 ? paramCount : argc;
+
+    for (i = 0, argidx = 0, cbidx = 0; i < argCount; ++i) {
+        Type* paramType = paramTypes[i];
+        int type;
+
+        
+        if (unlikely(paramType->nativeType == NATIVE_MAPPED)) {
+            VALUE values[] = { argv[argidx], Qnil };
+            argv[argidx] = rb_funcall2(((MappedType *) paramType)->rbConverter, id_to_native, 2, values);
+            paramType = ((MappedType *) paramType)->type;
+        }
+
+        type = argidx < argc ? TYPE(argv[argidx]) : T_NONE;
+        ffiValues[i] = param;
+
+        switch (paramType->nativeType) {
+
+            case NATIVE_INT8:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    param->s8 = NUM2INT(value);
+                } else {
+                    param->s8 = NUM2INT(argv[argidx]);
+                }
+
+                ++argidx;
+                ADJ(param, INT8);
+                break;
+
+            case NATIVE_INT16:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    param->s16 = NUM2INT(value);
+
+                } else {
+                    param->s16 = NUM2INT(argv[argidx]);
+                }
+
+                ++argidx;
+                ADJ(param, INT16);
+                break;
+
+            case NATIVE_INT32:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    param->s32 = NUM2INT(value);
+
+                } else {
+                    param->s32 = NUM2INT(argv[argidx]);
+                }
+
+                ++argidx;
+                ADJ(param, INT32);
+                break;
+
+            case NATIVE_BOOL:
+                if (type != T_TRUE && type != T_FALSE) {
+                    rb_raise(rb_eTypeError, "wrong argument type  (expected a boolean parameter)");
+                }
+                param->s8 = argv[argidx++] == Qtrue;
+                ADJ(param, INT8);
+                break;
+
+            case NATIVE_UINT8:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    param->u8 = NUM2UINT(value);
+                } else {
+                    param->u8 = NUM2UINT(argv[argidx]);
+                }
+
+                ADJ(param, INT8);
+                ++argidx;
+                break;
+
+            case NATIVE_UINT16:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    param->u16 = NUM2UINT(value);
+                } else {
+                    param->u16 = NUM2UINT(argv[argidx]);
+                }
+
+                ADJ(param, INT16);
+                ++argidx;
+                break;
+
+            case NATIVE_UINT32:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    param->u32 = NUM2UINT(value);
+                } else {
+                    param->u32 = NUM2UINT(argv[argidx]);
+                }
+
+                ADJ(param, INT32);
+                ++argidx;
+                break;
+
+            case NATIVE_INT64:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    param->i64 = NUM2LL(value);
+                } else {
+                    param->i64 = NUM2LL(argv[argidx]);
+                }
+
+                ADJ(param, INT64);
+                ++argidx;
+                break;
+
+            case NATIVE_UINT64:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    param->u64 = NUM2ULL(value);
+                } else {
+                    param->u64 = NUM2ULL(argv[argidx]);
+                }
+
+                ADJ(param, INT64);
+                ++argidx;
+                break;
+
+            case NATIVE_LONG:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    *(ffi_sarg *) param = NUM2LONG(value);
+                } else {
+                    *(ffi_sarg *) param = NUM2LONG(argv[argidx]);
+                }
+
+                ADJ(param, LONG);
+                ++argidx;
+                break;
+
+            case NATIVE_ULONG:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    *(ffi_arg *) param = NUM2ULONG(value);
+                } else {
+                    *(ffi_arg *) param = NUM2ULONG(argv[argidx]);
+                }
+
+                ADJ(param, LONG);
+                ++argidx;
+                break;
+
+            case NATIVE_FLOAT32:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    param->f32 = (float) NUM2DBL(value);
+                } else {
+                    param->f32 = (float) NUM2DBL(argv[argidx]);
+                }
+
+                ADJ(param, FLOAT32);
+                ++argidx;
+                break;
+
+            case NATIVE_FLOAT64:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    param->f64 = NUM2DBL(value);
+                } else {
+                    param->f64 = NUM2DBL(argv[argidx]);
+                }
+
+                ADJ(param, FLOAT64);
+                ++argidx;
+                break;
+
+            case NATIVE_LONGDOUBLE:
+                if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+                    VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+                    param->ld = rbffi_num2longdouble(value);
+                } else {
+                    param->ld = rbffi_num2longdouble(argv[argidx]);
+                }
+
+                ADJ(param, LONGDOUBLE);
+                ++argidx;
+                break;
+
+
+            case NATIVE_STRING:
+                if (type == T_NIL) {
+                    param->ptr = NULL; 
+                
+                } else {
+                    if (rb_safe_level() >= 1 && OBJ_TAINTED(argv[argidx])) {
+                        rb_raise(rb_eSecurityError, "Unsafe string parameter");
+                    }
+
+                    param->ptr = StringValueCStr(argv[argidx]);
+                }
+
+                ADJ(param, ADDRESS);
+                ++argidx;
+                break;
+
+            case NATIVE_POINTER:
+            case NATIVE_BUFFER_IN:
+            case NATIVE_BUFFER_OUT:
+            case NATIVE_BUFFER_INOUT:
+                param->ptr = getPointer(argv[argidx++], type);
+                ADJ(param, ADDRESS);
+                break;
+
+
+            case NATIVE_FUNCTION:
+            case NATIVE_CALLBACK:
+                if (callbackProc != Qnil) {
+                    param->ptr = callback_param(callbackProc, callbackParameters[cbidx++]);
+                } else {
+                    param->ptr = callback_param(argv[argidx], callbackParameters[cbidx++]);
+                    ++argidx;
+                }
+                ADJ(param, ADDRESS);
+                break;
+
+            case NATIVE_STRUCT:
+                ffiValues[i] = getPointer(argv[argidx++], type);
+                break;
+
+            default:
+                rb_raise(rb_eArgError, "Invalid parameter type: %d", paramType->nativeType);
+        }
+    }
+}
+
+static VALUE
+call_blocking_function(void* data)
+{
+    rbffi_blocking_call_t* b = (rbffi_blocking_call_t *) data;
+    b->frame->has_gvl = false;
+    ffi_call(&b->cif, FFI_FN(b->function), b->retval, b->ffiValues);
+    b->frame->has_gvl = true;
+
+    return Qnil;
+}
+
+VALUE
+rbffi_do_blocking_call(void *data)
+{
+    rbffi_thread_blocking_region(call_blocking_function, data, (void *) -1, NULL);
+
+    return Qnil;
+}
+
+VALUE
+rbffi_save_frame_exception(void *data, VALUE exc)
+{
+    rbffi_frame_t* frame = (rbffi_frame_t *) data;
+    frame->exc = exc;
+    return Qnil;
+}
+
+VALUE
+rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo)
+{
+    void* retval;
+    void** ffiValues;
+    FFIStorage* params;
+    VALUE rbReturnValue;
+    rbffi_frame_t frame = { 0 };
+    
+    retval = alloca(MAX(fnInfo->ffi_cif.rtype->size, FFI_SIZEOF_ARG));
+    
+    if (unlikely(fnInfo->blocking)) {
+        rbffi_blocking_call_t* bc;
+
+        /*
+         * due to the way thread switching works on older ruby variants, we
+         * cannot allocate anything passed to the blocking function on the stack
+         */
+#if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
+        ffiValues = ALLOCA_N(void *, fnInfo->parameterCount);
+        params = ALLOCA_N(FFIStorage, fnInfo->parameterCount);
+        bc = ALLOCA_N(rbffi_blocking_call_t, 1);
+        bc->retval = retval;
+#else
+        ffiValues = ALLOC_N(void *, fnInfo->parameterCount);
+        params = ALLOC_N(FFIStorage, fnInfo->parameterCount);
+        bc = ALLOC_N(rbffi_blocking_call_t, 1);
+        bc->retval = xmalloc(MAX(fnInfo->ffi_cif.rtype->size, FFI_SIZEOF_ARG));
+        bc->stkretval = retval;
+#endif
+        bc->cif = fnInfo->ffi_cif;
+        bc->function = function;
+        bc->ffiValues = ffiValues;
+        bc->params = params;
+        bc->frame = &frame;
+
+        rbffi_SetupCallParams(argc, argv,
+            fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues,
+            fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums);
+
+        rbffi_frame_push(&frame); 
+        rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0);
+        rbffi_frame_pop(&frame);
+
+#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL))
+        memcpy(bc->stkretval, bc->retval, MAX(bc->cif.rtype->size, FFI_SIZEOF_ARG));
+        xfree(bc->params);
+        xfree(bc->ffiValues);
+        xfree(bc->retval);
+        xfree(bc);
+#endif
+    
+    } else {
+
+        ffiValues = ALLOCA_N(void *, fnInfo->parameterCount);
+        params = ALLOCA_N(FFIStorage, fnInfo->parameterCount);
+
+        rbffi_SetupCallParams(argc, argv,
+            fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues,
+            fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums);
+
+        rbffi_frame_push(&frame);
+        ffi_call(&fnInfo->ffi_cif, FFI_FN(function), retval, ffiValues);
+        rbffi_frame_pop(&frame);
+    }
+
+    if (unlikely(!fnInfo->ignoreErrno)) {
+        rbffi_save_errno();
+    }    
+
+    if (RTEST(frame.exc) && frame.exc != Qnil) {
+        rb_exc_raise(frame.exc);
+    }
+
+    RB_GC_GUARD(rbReturnValue) = rbffi_NativeValue_ToRuby(fnInfo->returnType, fnInfo->rbReturnType, retval);
+    RB_GC_GUARD(fnInfo->rbReturnType);
+    
+    return rbReturnValue;
+}
+
+static inline void*
+getPointer(VALUE value, int type)
+{
+    if (likely(type == T_DATA && rb_obj_is_kind_of(value, rbffi_AbstractMemoryClass))) {
+
+        return ((AbstractMemory *) DATA_PTR(value))->address;
+
+    } else if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_StructClass)) {
+
+        AbstractMemory* memory = ((Struct *) DATA_PTR(value))->pointer;
+        return memory != NULL ? memory->address : NULL;
+
+    } else if (type == T_STRING) {
+        
+        return StringValuePtr(value);
+
+    } else if (type == T_NIL) {
+
+        return NULL;
+
+    } else if (rb_respond_to(value, id_to_ptr)) {
+
+        VALUE ptr = rb_funcall2(value, id_to_ptr, 0, NULL);
+        if (rb_obj_is_kind_of(ptr, rbffi_AbstractMemoryClass) && TYPE(ptr) == T_DATA) {
+            return ((AbstractMemory *) DATA_PTR(ptr))->address;
+        }
+        rb_raise(rb_eArgError, "to_ptr returned an invalid pointer");
+    }
+
+    rb_raise(rb_eArgError, ":pointer argument is not a valid pointer");
+    return NULL;
+}
+
+Invoker
+rbffi_GetInvoker(FunctionType *fnInfo)
+{
+    return rbffi_CallFunction;
+}
+
+
+static void*
+callback_param(VALUE proc, VALUE cbInfo)
+{
+    VALUE callback ;
+    if (unlikely(proc == Qnil)) {
+        return NULL ;
+    }
+
+    /* Handle Function pointers here */
+    if (rb_obj_is_kind_of(proc, rbffi_FunctionClass)) {
+        AbstractMemory* ptr;
+        Data_Get_Struct(proc, AbstractMemory, ptr);
+        return ptr->address;
+    }
+
+    callback = rbffi_Function_ForProc(cbInfo, proc);
+    RB_GC_GUARD(callback);
+
+    return ((AbstractMemory *) DATA_PTR(callback))->address;
+}
+
+
+void
+rbffi_Call_Init(VALUE moduleFFI)
+{
+    id_to_ptr = rb_intern("to_ptr");
+    id_to_native = rb_intern("to_native");
+    id_map_symbol = rb_intern("__map_symbol");
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Call.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Call.h
new file mode 100644
index 0000000..56bdd61
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Call.h
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
+ * Copyright (c) 2009, Mike Dalessio <mike.dalessio@gmail.com>
+ * Copyright (c) 2009, Aman Gupta.
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_CALL_H
+#define	RBFFI_CALL_H
+
+#include "Thread.h"
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#if defined(__i386__) && \
+  (defined(HAVE_RAW_API) || defined(USE_INTERNAL_LIBFFI)) && \
+  !defined(_WIN32) && !defined(__WIN32__)
+#  define USE_RAW
+#endif
+
+#if (defined(__i386__) || defined(__x86_64__)) && !(defined(_WIN32) || defined(__WIN32__))
+#  define BYPASS_FFI 1
+#endif
+    
+typedef union {
+#ifdef USE_RAW
+    signed int s8, s16, s32;
+    unsigned int u8, u16, u32;
+#else
+    signed char s8;
+    unsigned char u8;
+    signed short s16;
+    unsigned short u16;
+    signed int s32;
+    unsigned int u32;
+#endif
+    signed long long i64;
+    unsigned long long u64;
+    signed long sl;
+    unsigned long ul;
+    void* ptr;
+    float f32;
+    double f64;
+    long double ld;
+} FFIStorage;
+ 
+extern void rbffi_Call_Init(VALUE moduleFFI);
+
+extern void rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
+        FFIStorage* paramStorage, void** ffiValues,
+        VALUE* callbackParameters, int callbackCount, VALUE enums);
+
+struct FunctionType_;
+extern VALUE rbffi_CallFunction(int argc, VALUE* argv, void* function, struct FunctionType_* fnInfo);
+
+typedef VALUE (*Invoker)(int argc, VALUE* argv, void* function, struct FunctionType_* fnInfo);
+
+Invoker rbffi_GetInvoker(struct FunctionType_* fnInfo);
+
+extern VALUE rbffi_GetEnumValue(VALUE enums, VALUE value);
+extern int rbffi_GetSignedIntValue(VALUE value, int type, int minValue, int maxValue, const char* typeName, VALUE enums);
+
+typedef struct rbffi_blocking_call {
+    rbffi_frame_t* frame;
+    void* function;
+    ffi_cif cif;
+    void **ffiValues;
+    void* retval;
+    void* params;
+#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL))
+    void* stkretval;
+#endif
+} rbffi_blocking_call_t;
+
+VALUE rbffi_do_blocking_call(void* data);
+VALUE rbffi_save_frame_exception(void *data, VALUE exc);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_CALL_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Call.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Call.o
new file mode 100644
index 0000000..fb6f9e4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Call.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.c
new file mode 100644
index 0000000..5499b40
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.c
@@ -0,0 +1,283 @@
+/*
+ * Copyright (c) 2009, 2010 Wayne Meissner
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+#include <sys/param.h>
+#endif
+#include <sys/types.h>
+#if defined(__CYGWIN__) || !defined(_WIN32)
+#  include <sys/mman.h>
+#endif
+#include <stdio.h>
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+#if defined(__CYGWIN__) || !defined(_WIN32)
+#  include <unistd.h>
+#else
+#  include <winsock2.h>
+#  define _WINSOCKAPI_
+#  include <windows.h>
+#endif
+#include <errno.h>
+#include <ruby.h>
+
+#if defined(_MSC_VER) && !defined(INT8_MIN)
+#  include "win32/stdint.h"
+#endif
+#include <ffi.h>
+#include "rbffi.h"
+#include "compat.h"
+
+#include "Function.h"
+#include "Types.h"
+#include "Type.h"
+#include "LastError.h"
+#include "Call.h"
+
+#include "ClosurePool.h"
+
+
+#ifndef roundup
+#  define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))
+#endif
+#ifdef _WIN32
+  typedef char* caddr_t;
+#endif
+
+typedef struct Memory {
+    void* code;
+    void* data;
+    struct Memory* next;
+} Memory;
+
+struct ClosurePool_ {
+    void* ctx;
+    int closureSize;
+    bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize);
+    struct Memory* blocks; /* Keeps track of all the allocated memory for this pool */
+    Closure* list;
+    long refcnt;
+};
+
+static long pageSize;
+
+static void* allocatePage(void);
+static bool freePage(void *);
+static bool protectPage(void *);
+
+ClosurePool*
+rbffi_ClosurePool_New(int closureSize, 
+        bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize),
+        void* ctx)
+{
+    ClosurePool* pool;
+
+    pool = xcalloc(1, sizeof(*pool));
+    pool->closureSize = closureSize;
+    pool->ctx = ctx;
+    pool->prep = prep;
+    pool->refcnt = 1;
+    
+    return pool;
+}
+
+void
+cleanup_closure_pool(ClosurePool* pool)
+{
+    Memory* memory;
+    
+    for (memory = pool->blocks; memory != NULL; ) {
+        Memory* next = memory->next;
+        freePage(memory->code);
+        free(memory->data);
+        free(memory);
+        memory = next;
+    }
+    xfree(pool);
+}
+
+void
+rbffi_ClosurePool_Free(ClosurePool* pool)
+{
+    if (pool != NULL) {
+        long refcnt = --(pool->refcnt);
+        if (refcnt == 0) {
+            cleanup_closure_pool(pool);
+        }
+    }
+}
+
+Closure*
+rbffi_Closure_Alloc(ClosurePool* pool)
+{
+    Closure *list = NULL;
+    Memory* block = NULL;
+    caddr_t code = NULL;
+    char errmsg[256];
+    int nclosures;
+    long trampolineSize;
+    int i;
+
+    if (pool->list != NULL) {
+        Closure* closure = pool->list;
+        pool->list = pool->list->next;
+        pool->refcnt++;
+    
+        return closure;
+    }
+
+    trampolineSize = roundup(pool->closureSize, 8);
+    nclosures = (int) (pageSize / trampolineSize);
+    block = calloc(1, sizeof(*block));
+    list = calloc(nclosures, sizeof(*list));
+    code = allocatePage();
+    
+    if (block == NULL || list == NULL || code == NULL) {
+        snprintf(errmsg, sizeof(errmsg), "failed to allocate a page. errno=%d (%s)", errno, strerror(errno));
+        goto error;
+    }
+    
+    for (i = 0; i < nclosures; ++i) {
+        Closure* closure = &list[i];
+        closure->next = &list[i + 1];
+        closure->pool = pool;
+        closure->code = (code + (i * trampolineSize));
+
+        if (!(*pool->prep)(pool->ctx, closure->code, closure, errmsg, sizeof(errmsg))) {
+            goto error;
+        }
+    }
+
+    if (!protectPage(code)) {
+        goto error;
+    }
+
+    /* Track the allocated page + Closure memory area */
+    block->data = list;
+    block->code = code;
+    block->next = pool->blocks;
+    pool->blocks = block;
+
+    /* Thread the new block onto the free list, apart from the first one. */
+    list[nclosures - 1].next = pool->list;
+    pool->list = list->next;
+    pool->refcnt++;
+
+    /* Use the first one as the new handle */
+    return list;
+
+error:
+    free(block);
+    free(list);
+    if (code != NULL) {
+        freePage(code);
+    }
+    
+
+    rb_raise(rb_eRuntimeError, "%s", errmsg);
+    return NULL;
+}
+
+void
+rbffi_Closure_Free(Closure* closure)
+{
+    if (closure != NULL) {
+        ClosurePool* pool = closure->pool;
+        long refcnt;
+        /* Just push it on the front of the free list */
+        closure->next = pool->list;
+        pool->list = closure;
+        refcnt = --(pool->refcnt);
+        if (refcnt == 0) {
+            cleanup_closure_pool(pool);
+        }
+    }
+}
+
+void*
+rbffi_Closure_CodeAddress(Closure* handle)
+{
+    return handle->code;
+}
+
+
+static long
+getPageSize()
+{
+#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__))
+    SYSTEM_INFO si;
+    GetSystemInfo(&si);
+    return si.dwPageSize;
+#else
+    return sysconf(_SC_PAGESIZE);
+#endif
+}
+
+static void*
+allocatePage(void)
+{
+#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__))
+    return VirtualAlloc(NULL, pageSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
+#else
+    caddr_t page = mmap(NULL, pageSize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
+    return (page != (caddr_t) -1) ? page : NULL;
+#endif
+}
+
+static bool
+freePage(void *addr)
+{
+#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__))
+    return VirtualFree(addr, 0, MEM_RELEASE);
+#else
+    return munmap(addr, pageSize) == 0;
+#endif
+}
+
+static bool
+protectPage(void* page)
+{
+#if !defined(__CYGWIN__) && (defined(_WIN32) || defined(__WIN32__))
+    DWORD oldProtect;
+    return VirtualProtect(page, pageSize, PAGE_EXECUTE_READ, &oldProtect);
+#else
+    return mprotect(page, pageSize, PROT_READ | PROT_EXEC) == 0;
+#endif
+}
+
+void
+rbffi_ClosurePool_Init(VALUE module)
+{
+    pageSize = getPageSize();
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.h
new file mode 100644
index 0000000..b842375
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2009, 2010 Wayne Meissner
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RUBYFFI_CLOSUREPOOL_H
+#define RUBYFFI_CLOSUREPOOL_H
+
+typedef struct ClosurePool_ ClosurePool;
+typedef struct Closure_ Closure;
+
+struct Closure_ {
+    void* info;      /* opaque handle for storing closure-instance specific data */
+    void* function;  /* closure-instance specific function, called by custom trampoline */
+    void* code;      /* The native trampoline code location */
+    struct ClosurePool_* pool;
+    Closure* next;
+};
+
+void rbffi_ClosurePool_Init(VALUE module);
+
+ClosurePool* rbffi_ClosurePool_New(int closureSize, 
+        bool (*prep)(void* ctx, void *code, Closure* closure, char* errbuf, size_t errbufsize),
+        void* ctx);
+
+void rbffi_ClosurePool_Free(ClosurePool *);
+
+Closure* rbffi_Closure_Alloc(ClosurePool *);
+void rbffi_Closure_Free(Closure *);
+
+void* rbffi_Closure_GetCodeAddress(Closure *);
+
+#endif /* RUBYFFI_CLOSUREPOOL_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.o
new file mode 100644
index 0000000..60a3ebf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ClosurePool.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DataConverter.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DataConverter.c
new file mode 100644
index 0000000..2d5b827
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DataConverter.c
@@ -0,0 +1,91 @@
+
+#include <ruby.h>
+
+#include <ffi.h>
+#include "rbffi.h"
+
+#include "Type.h"
+#include "MappedType.h"
+
+
+VALUE rbffi_DataConverterClass = Qnil;
+static ID id_native_type_ivar;
+
+/*
+ * Get native type.
+ * @overload native_type(type)
+ *  @param [String, Symbol, Type] type
+ *  @return [Type]
+ *  Get native type from +type+.
+ * @overload native_type
+ *  @raise {NotImplementedError} This method must be overriden.
+ */
+static VALUE
+conv_native_type(int argc, VALUE* argv, VALUE self)
+{
+    if (argc == 0) {
+        if (!rb_ivar_defined(self, id_native_type_ivar)) {
+            rb_raise(rb_eNotImpError, "native_type method not overridden and no native_type set");
+        }
+
+        return rb_ivar_get(self, id_native_type_ivar);
+
+    } else if (argc == 1) {
+        VALUE type = rbffi_Type_Find(argv[0]);
+
+        rb_ivar_set(self, id_native_type_ivar, type);
+
+        return type;
+
+    } else {
+        rb_raise(rb_eArgError, "incorrect arguments");
+    }
+}
+
+/*
+ * call-seq: to_native(value, ctx)
+ * @param value
+ * @param ctx
+ * @return [value]
+ * Convert to a native type.
+ */
+static VALUE
+conv_to_native(VALUE self, VALUE value, VALUE ctx)
+{
+    return value;
+}
+
+/*
+ * call-seq: from_native(value, ctx)
+ * @param value
+ * @param ctx
+ * @return [value]
+ * Convert from a native type.
+ */
+static VALUE
+conv_from_native(VALUE self, VALUE value, VALUE ctx)
+{
+    return value;
+}
+
+
+
+void
+rbffi_DataConverter_Init(VALUE moduleFFI)
+{
+    /*
+     * Document-module: FFI::DataConverter
+     * This module is used to extend somes classes and give then a common API.
+     *
+     * Most of methods defined here must be overriden.
+     */
+    rbffi_DataConverterClass = rb_define_module_under(moduleFFI, "DataConverter");
+
+    rb_define_method(rbffi_DataConverterClass, "native_type", conv_native_type, -1);
+    rb_define_method(rbffi_DataConverterClass, "to_native", conv_to_native, 2);
+    rb_define_method(rbffi_DataConverterClass, "from_native", conv_from_native, 2);
+
+    id_native_type_ivar = rb_intern("@native_type");
+}
+
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DataConverter.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DataConverter.o
new file mode 100644
index 0000000..a07c177
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DataConverter.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.c
new file mode 100644
index 0000000..4a2ea38
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.c
@@ -0,0 +1,339 @@
+/*
+ * Copyright (c) 2008-2010 Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#ifndef _MSC_VER
+#  include <stdint.h>
+#endif
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__)
+# include <winsock2.h>
+# define _WINSOCKAPI_
+# include <windows.h>
+# include <shlwapi.h>
+#else
+# include <dlfcn.h>
+#endif
+#include <ruby.h>
+#if defined(_MSC_VER) && !defined(INT8_MIN)
+#  include "win32/stdint.h"
+#endif
+
+#include <ffi.h>
+
+#include "rbffi.h"
+#include "compat.h"
+#include "AbstractMemory.h"
+#include "Pointer.h"
+#include "DynamicLibrary.h"
+
+typedef struct LibrarySymbol_ {
+    Pointer base;
+    VALUE library;
+    VALUE name;
+} LibrarySymbol;
+
+static VALUE library_initialize(VALUE self, VALUE libname, VALUE libflags);
+static void library_free(Library* lib);
+
+
+static VALUE symbol_allocate(VALUE klass);
+static VALUE symbol_new(VALUE library, void* address, VALUE name);
+static void symbol_mark(LibrarySymbol* sym);
+
+static VALUE LibraryClass = Qnil, SymbolClass = Qnil;
+
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__)
+static void* dl_open(const char* name, int flags);
+static void dl_error(char* buf, int size);
+#define dl_sym(handle, name) GetProcAddress(handle, name)
+#define dl_close(handle) FreeLibrary(handle)
+#else
+# define dl_open(name, flags) dlopen(name, flags != 0 ? flags : RTLD_LAZY)
+# define dl_error(buf, size) do { snprintf(buf, size, "%s", dlerror()); } while(0)
+# define dl_sym(handle, name) dlsym(handle, name)
+# define dl_close(handle) dlclose(handle)
+#endif
+
+static VALUE
+library_allocate(VALUE klass)
+{
+    Library* library;
+    return Data_Make_Struct(klass, Library, NULL, library_free, library);
+}
+
+/*
+ * call-seq: DynamicLibrary.open(libname, libflags)
+ * @param libname (see #initialize)
+ * @param libflags (see #initialize)
+ * @return [FFI::DynamicLibrary]
+ * @raise {LoadError} if +libname+ cannot be opened
+ * Open a library.
+ */
+static VALUE
+library_open(VALUE klass, VALUE libname, VALUE libflags)
+{
+    return library_initialize(library_allocate(klass), libname, libflags);
+}
+
+/*
+ * call-seq: initialize(libname, libflags)
+ * @param [String] libname name of library to open
+ * @param [Fixnum] libflags flags for library to open
+ * @return [FFI::DynamicLibrary]
+ * @raise {LoadError} if +libname+ cannot be opened
+ * A new DynamicLibrary instance.
+ */
+static VALUE
+library_initialize(VALUE self, VALUE libname, VALUE libflags)
+{
+    Library* library;
+    int flags;
+
+    Check_Type(libflags, T_FIXNUM);
+
+    Data_Get_Struct(self, Library, library);
+    flags = libflags != Qnil ? NUM2UINT(libflags) : 0;
+    
+    library->handle = dl_open(libname != Qnil ? StringValueCStr(libname) : NULL, flags);
+    if (library->handle == NULL) {
+        char errmsg[1024];
+        dl_error(errmsg, sizeof(errmsg));
+        rb_raise(rb_eLoadError, "Could not open library '%s': %s",
+                libname != Qnil ? StringValueCStr(libname) : "[current process]",
+                errmsg);
+    }
+#ifdef __CYGWIN__
+    // On Cygwin 1.7.17 "dlsym(dlopen(0,0), 'getpid')" fails. (dlerror: "No such process")
+    // As a workaround we can use "dlsym(RTLD_DEFAULT, 'getpid')" instead.
+    // Since 0 == RTLD_DEFAULT we won't call dl_close later.
+    if (libname == Qnil) {
+        dl_close(library->handle);
+        library->handle = RTLD_DEFAULT;
+    }
+#endif
+    rb_iv_set(self, "@name", libname != Qnil ? libname : rb_str_new2("[current process]"));
+    return self;
+}
+
+static VALUE
+library_dlsym(VALUE self, VALUE name)
+{
+    Library* library;
+    void* address = NULL;
+    Check_Type(name, T_STRING);
+
+    Data_Get_Struct(self, Library, library);
+    address = dl_sym(library->handle, StringValueCStr(name));
+    
+    return address != NULL ? symbol_new(self, address, name) : Qnil;
+}
+
+/*
+ * call-seq: last_error
+ * @return [String] library's last error string
+ */
+static VALUE
+library_dlerror(VALUE self)
+{
+    char errmsg[1024];
+    dl_error(errmsg, sizeof(errmsg));
+    return rb_tainted_str_new2(errmsg);
+}
+
+static void
+library_free(Library* library)
+{
+    /* dlclose() on MacOS tends to segfault - avoid it */
+#ifndef __APPLE__
+    if (library->handle != NULL) {
+        dl_close(library->handle);
+    }
+#endif
+    xfree(library);
+}
+
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(__CYGWIN__)
+static void*
+dl_open(const char* name, int flags)
+{
+    if (name == NULL) {
+        return GetModuleHandle(NULL);
+    } else {
+        DWORD dwFlags = PathIsRelativeA(name) ? 0 : LOAD_WITH_ALTERED_SEARCH_PATH;
+        return LoadLibraryExA(name, NULL, dwFlags);
+    }
+}
+
+static void
+dl_error(char* buf, int size)
+{
+    FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
+            0, buf, size, NULL);
+}
+#endif
+
+static VALUE
+symbol_allocate(VALUE klass)
+{
+    LibrarySymbol* sym;
+    VALUE obj = Data_Make_Struct(klass, LibrarySymbol, NULL, -1, sym);
+    sym->name = Qnil;
+    sym->library = Qnil;
+    sym->base.rbParent = Qnil;
+
+    return obj;
+}
+
+
+/*
+ * call-seq: initialize_copy(other)
+ * @param [Object] other
+ * @return [nil]
+ * DO NOT CALL THIS METHOD
+ */
+static VALUE
+symbol_initialize_copy(VALUE self, VALUE other)
+{
+    rb_raise(rb_eRuntimeError, "cannot duplicate symbol");
+    return Qnil;
+}
+
+static VALUE
+symbol_new(VALUE library, void* address, VALUE name)
+{
+    LibrarySymbol* sym;
+    VALUE obj = Data_Make_Struct(SymbolClass, LibrarySymbol, symbol_mark, -1, sym);
+
+    sym->base.memory.address = address;
+    sym->base.memory.size = LONG_MAX;
+    sym->base.memory.typeSize = 1;
+    sym->base.memory.flags = MEM_RD | MEM_WR;
+    sym->library = library;
+    sym->name = name;
+
+    return obj;
+}
+
+static void
+symbol_mark(LibrarySymbol* sym)
+{
+    rb_gc_mark(sym->library);
+    rb_gc_mark(sym->name);
+}
+
+/*
+ * call-seq: inspect
+ * @return [String]
+ * Inspect.
+ */
+static VALUE
+symbol_inspect(VALUE self)
+{
+    LibrarySymbol* sym;
+    char buf[256];
+
+    Data_Get_Struct(self, LibrarySymbol, sym);
+    snprintf(buf, sizeof(buf), "#<FFI::Library::Symbol name=%s address=%p>",
+             StringValueCStr(sym->name), sym->base.memory.address);
+    return rb_str_new2(buf);
+}
+
+void
+rbffi_DynamicLibrary_Init(VALUE moduleFFI)
+{
+    /*
+     * Document-class: FFI::DynamicLibrary
+     */
+    LibraryClass = rb_define_class_under(moduleFFI, "DynamicLibrary", rb_cObject);
+    rb_global_variable(&LibraryClass);
+    /*
+     * Document-class: FFI::DynamicLibrary::Symbol < FFI::Pointer
+     *
+     * An instance of this class represents a library symbol. It may be a {Pointer pointer} to
+     * a function or to a variable.
+     */
+    SymbolClass = rb_define_class_under(LibraryClass, "Symbol", rbffi_PointerClass);
+    rb_global_variable(&SymbolClass);
+
+    /*
+     * Document-const: FFI::NativeLibrary
+     * Backward compatibility for FFI::DynamicLibrary
+     */
+    rb_define_const(moduleFFI, "NativeLibrary", LibraryClass); /* backwards compat library */
+    rb_define_alloc_func(LibraryClass, library_allocate);
+    rb_define_singleton_method(LibraryClass, "open", library_open, 2);
+    rb_define_singleton_method(LibraryClass, "last_error", library_dlerror, 0);
+    rb_define_method(LibraryClass, "initialize", library_initialize, 2);
+    /*
+     * Document-method: find_symbol
+     * call-seq: find_symbol(name)
+     * @param [String] name library symbol's name
+     * @return [FFI::DynamicLibrary::Symbol] library symbol
+     */
+    rb_define_method(LibraryClass, "find_symbol", library_dlsym, 1);
+    /*
+     * Document-method: find_function
+     * call-seq: find_function(name)
+     * @param [String] name library function's name
+     * @return [FFI::DynamicLibrary::Symbol] library function symbol
+     */
+    rb_define_method(LibraryClass, "find_function", library_dlsym, 1);
+    /*
+     * Document-method: find_variable
+     * call-seq: find_variable(name)
+     * @param [String] name library variable's name
+     * @return [FFI::DynamicLibrary::Symbol] library variable symbol
+     */
+    rb_define_method(LibraryClass, "find_variable", library_dlsym, 1);
+    rb_define_method(LibraryClass, "last_error", library_dlerror, 0);
+    rb_define_attr(LibraryClass, "name", 1, 0);
+
+    rb_define_alloc_func(SymbolClass, symbol_allocate);
+    rb_undef_method(SymbolClass, "new");
+    rb_define_method(SymbolClass, "inspect", symbol_inspect, 0);
+    rb_define_method(SymbolClass, "initialize_copy", symbol_initialize_copy, 1);
+
+#define DEF(x) rb_define_const(LibraryClass, "RTLD_" #x, UINT2NUM(RTLD_##x))
+    DEF(LAZY);
+    DEF(NOW);
+    DEF(GLOBAL);
+    DEF(LOCAL);
+    DEF(NOLOAD);
+    DEF(NODELETE);
+    DEF(FIRST);
+    DEF(DEEPBIND);
+    DEF(MEMBER);
+    DEF(BINDING_MASK);
+    DEF(LOCATION_MASK);
+    DEF(ALL_MASK);
+#undef DEF
+
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.h
new file mode 100644
index 0000000..97bf7bc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2008-2010 Wayne Meissner
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _LIBRARY_H
+#define	_LIBRARY_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+/* if these aren't defined (eg. windows), we need sensible defaults */
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif
+
+#ifndef RTLD_NOW
+#define RTLD_NOW 2
+#endif
+
+#ifndef RTLD_LOCAL
+#define RTLD_LOCAL 4
+#endif
+
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 8
+#endif
+
+/* If these aren't defined, they're not supported so define as 0 */
+#ifndef RTLD_NOLOAD
+#define RTLD_NOLOAD 0
+#endif
+
+#ifndef RTLD_NODELETE
+#define RTLD_NODELETE 0
+#endif
+
+#ifndef RTLD_FIRST
+#define RTLD_FIRST 0
+#endif
+
+#ifndef RTLD_DEEPBIND
+#define RTLD_DEEPBIND 0
+#endif
+
+#ifndef RTLD_MEMBER
+#define RTLD_MEMBER 0
+#endif
+
+/* convenience */
+#ifndef RTLD_BINDING_MASK
+#define RTLD_BINDING_MASK (RTLD_LAZY | RTLD_NOW)
+#endif
+
+#ifndef RTLD_LOCATION_MASK
+#define RTLD_LOCATION_MASK (RTLD_LOCAL | RTLD_GLOBAL)
+#endif
+
+#ifndef RTLD_ALL_MASK
+#define RTLD_ALL_MASK (RTLD_BINDING_MASK | RTLD_LOCATION_MASK | RTLD_NOLOAD | RTLD_NODELETE | RTLD_FIRST | RTLD_DEEPBIND | RTLD_MEMBER)
+#endif
+
+typedef struct Library {
+    void* handle;
+} Library;
+
+extern void rbffi_DynamicLibrary_Init(VALUE ffiModule);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* _LIBRARY_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.o
new file mode 100644
index 0000000..bfc0a7c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/DynamicLibrary.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Function.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Function.c
new file mode 100644
index 0000000..5af9eac
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Function.c
@@ -0,0 +1,998 @@
+/*
+ * Copyright (c) 2009-2011 Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+#include <sys/param.h>
+#endif
+#include <sys/types.h>
+#ifndef _WIN32
+# include <sys/mman.h>
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# if !defined(INT8_MIN)
+#  include "win32/stdint.h"
+# endif
+#endif
+#include <ruby.h>
+
+#include <ffi.h>
+#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32)
+#include <pthread.h>
+#endif
+#include <fcntl.h>
+
+#include "rbffi.h"
+#include "compat.h"
+
+#include "AbstractMemory.h"
+#include "Pointer.h"
+#include "Struct.h"
+#include "Platform.h"
+#include "Type.h"
+#include "LastError.h"
+#include "Call.h"
+#include "ClosurePool.h"
+#include "MappedType.h"
+#include "Thread.h"
+#include "LongDouble.h"
+#include "MethodHandle.h"
+#include "Function.h"
+
+typedef struct Function_ {
+    Pointer base;
+    FunctionType* info;
+    MethodHandle* methodHandle;
+    bool autorelease;
+    Closure* closure;
+    VALUE rbProc;
+    VALUE rbFunctionInfo;
+} Function;
+
+static void function_mark(Function *);
+static void function_free(Function *);
+static VALUE function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc);
+static void callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data);
+static bool callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize);
+static void* callback_with_gvl(void* data);
+static VALUE invoke_callback(void* data);
+static VALUE save_callback_exception(void* data, VALUE exc);
+
+#define DEFER_ASYNC_CALLBACK 1
+
+
+#if defined(DEFER_ASYNC_CALLBACK)
+static VALUE async_cb_event(void *);
+static VALUE async_cb_call(void *);
+#endif
+
+#ifdef HAVE_RB_THREAD_CALL_WITH_GVL
+extern void *rb_thread_call_with_gvl(void *(*func)(void *), void *data1);
+#endif
+
+VALUE rbffi_FunctionClass = Qnil;
+
+#if defined(DEFER_ASYNC_CALLBACK)
+static VALUE async_cb_thread = Qnil;
+#endif
+
+static ID id_call = 0, id_to_native = 0, id_from_native = 0, id_cbtable = 0, id_cb_ref = 0;
+
+struct gvl_callback {
+    Closure* closure;
+    void*    retval;
+    void**   parameters;
+    bool done;
+    rbffi_frame_t *frame;
+#if defined(DEFER_ASYNC_CALLBACK)
+    struct gvl_callback* next;
+# ifndef _WIN32
+    pthread_cond_t async_cond;
+    pthread_mutex_t async_mutex;
+# else
+    HANDLE async_event;
+# endif
+#endif
+};
+
+
+#if defined(DEFER_ASYNC_CALLBACK)
+static struct gvl_callback* async_cb_list = NULL;
+# ifndef _WIN32
+    static pthread_mutex_t async_cb_mutex = PTHREAD_MUTEX_INITIALIZER;
+    static pthread_cond_t async_cb_cond = PTHREAD_COND_INITIALIZER;
+#  if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL))
+    static int async_cb_pipe[2];
+#  endif
+# else
+    static HANDLE async_cb_cond;
+    static CRITICAL_SECTION async_cb_lock;
+#  if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL))
+    static int async_cb_pipe[2];
+#  endif
+# endif
+#endif
+
+
+static VALUE
+function_allocate(VALUE klass)
+{
+    Function *fn;
+    VALUE obj;
+
+    obj = Data_Make_Struct(klass, Function, function_mark, function_free, fn);
+
+    fn->base.memory.flags = MEM_RD;
+    fn->base.rbParent = Qnil;
+    fn->rbProc = Qnil;
+    fn->rbFunctionInfo = Qnil;
+    fn->autorelease = true;
+
+    return obj;
+}
+
+static void
+function_mark(Function *fn)
+{
+    rb_gc_mark(fn->base.rbParent);
+    rb_gc_mark(fn->rbProc);
+    rb_gc_mark(fn->rbFunctionInfo);
+}
+
+static void
+function_free(Function *fn)
+{
+    if (fn->methodHandle != NULL) {
+        rbffi_MethodHandle_Free(fn->methodHandle);
+    }
+
+    if (fn->closure != NULL && fn->autorelease) {
+        rbffi_Closure_Free(fn->closure);
+    }
+
+    xfree(fn);
+}
+
+/*
+ * @param [Type, Symbol] return_type return type for the function
+ * @param [Array<Type, Symbol>] param_types array of parameters types
+ * @param [Hash] options see {FFI::FunctionType} for available options
+ * @return [self]
+ * A new Function instance.
+ *
+ * Define a function from a Proc or a block.
+ *
+ * @overload initialize(return_type, param_types, options = {}) { |i| ... }
+ *  @yieldparam i parameters for the function
+ * @overload initialize(return_type, param_types, proc, options = {})
+ *  @param [Proc] proc
+ */
+static VALUE
+function_initialize(int argc, VALUE* argv, VALUE self)
+{
+
+    VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbProc = Qnil, rbOptions = Qnil;
+    VALUE rbFunctionInfo = Qnil;
+    VALUE infoArgv[3];
+    int nargs;
+
+    nargs = rb_scan_args(argc, argv, "22", &rbReturnType, &rbParamTypes, &rbProc, &rbOptions);
+
+    /*
+     * Callback with block,
+     * e.g. Function.new(:int, [ :int ]) { |i| blah }
+     * or   Function.new(:int, [ :int ], { :convention => :stdcall }) { |i| blah }
+     */
+    if (rb_block_given_p()) {
+        if (nargs > 3) {
+            rb_raise(rb_eArgError, "cannot create function with both proc/address and block");
+        }
+        rbOptions = rbProc;
+        rbProc = rb_block_proc();
+    } else {
+        /* Callback with proc, or Function with address
+         * e.g. Function.new(:int, [ :int ], Proc.new { |i| })
+         *      Function.new(:int, [ :int ], Proc.new { |i| }, { :convention => :stdcall })
+         *      Function.new(:int, [ :int ], addr)
+         *      Function.new(:int, [ :int ], addr, { :convention => :stdcall })
+         */
+    }
+
+    infoArgv[0] = rbReturnType;
+    infoArgv[1] = rbParamTypes;
+    infoArgv[2] = rbOptions;
+    rbFunctionInfo = rb_class_new_instance(rbOptions != Qnil ? 3 : 2, infoArgv, rbffi_FunctionTypeClass);
+
+    function_init(self, rbFunctionInfo, rbProc);
+
+    return self;
+}
+
+/*
+ * call-seq: initialize_copy(other)
+ * @return [nil]
+ * DO NOT CALL THIS METHOD
+ */
+static VALUE
+function_initialize_copy(VALUE self, VALUE other)
+{
+    rb_raise(rb_eRuntimeError, "cannot duplicate function instances");
+    return Qnil;
+}
+
+VALUE
+rbffi_Function_NewInstance(VALUE rbFunctionInfo, VALUE rbProc)
+{
+    return function_init(function_allocate(rbffi_FunctionClass), rbFunctionInfo, rbProc);
+}
+
+VALUE
+rbffi_Function_ForProc(VALUE rbFunctionInfo, VALUE proc)
+{
+    VALUE callback, cbref, cbTable;
+    Function* fp;
+
+    cbref = RTEST(rb_ivar_defined(proc, id_cb_ref)) ? rb_ivar_get(proc, id_cb_ref) : Qnil;
+    /* If the first callback reference has the same function function signature, use it */
+    if (cbref != Qnil && CLASS_OF(cbref) == rbffi_FunctionClass) {
+        Data_Get_Struct(cbref, Function, fp);
+        if (fp->rbFunctionInfo == rbFunctionInfo) {
+            return cbref;
+        }
+    }
+
+    cbTable = RTEST(rb_ivar_defined(proc, id_cbtable)) ? rb_ivar_get(proc, id_cbtable) : Qnil;
+    if (cbTable != Qnil && (callback = rb_hash_aref(cbTable, rbFunctionInfo)) != Qnil) {
+        return callback;
+    }
+
+    /* No existing function for the proc with that signature, create a new one and cache it */
+    callback = rbffi_Function_NewInstance(rbFunctionInfo, proc);
+    if (cbref == Qnil) {
+        /* If there is no other cb already cached for this proc, we can use the ivar slot */
+        rb_ivar_set(proc, id_cb_ref, callback);
+    } else {
+        /* The proc instance has been used as more than one type of callback, store extras in a hash */
+        cbTable = rb_hash_new();
+        rb_ivar_set(proc, id_cbtable, cbTable);
+        rb_hash_aset(cbTable, rbFunctionInfo, callback);
+    }
+
+    return callback;
+}
+
+static VALUE
+function_init(VALUE self, VALUE rbFunctionInfo, VALUE rbProc)
+{
+    Function* fn = NULL;
+
+    Data_Get_Struct(self, Function, fn);
+
+    fn->rbFunctionInfo = rbFunctionInfo;
+
+    Data_Get_Struct(fn->rbFunctionInfo, FunctionType, fn->info);
+
+    if (rb_obj_is_kind_of(rbProc, rbffi_PointerClass)) {
+        Pointer* orig;
+        Data_Get_Struct(rbProc, Pointer, orig);
+        fn->base.memory = orig->memory;
+        fn->base.rbParent = rbProc;
+
+    } else if (rb_obj_is_kind_of(rbProc, rb_cProc) || rb_respond_to(rbProc, id_call)) {
+        if (fn->info->closurePool == NULL) {
+            fn->info->closurePool = rbffi_ClosurePool_New(sizeof(ffi_closure), callback_prep, fn->info);
+            if (fn->info->closurePool == NULL) {
+                rb_raise(rb_eNoMemError, "failed to create closure pool");
+            }
+        }
+
+#if defined(DEFER_ASYNC_CALLBACK)
+        if (async_cb_thread == Qnil) {
+#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) && defined(_WIN32)
+            _pipe(async_cb_pipe, 1024, O_BINARY);
+#elif !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL))
+            pipe(async_cb_pipe);
+            fcntl(async_cb_pipe[0], F_SETFL, fcntl(async_cb_pipe[0], F_GETFL) | O_NONBLOCK);
+            fcntl(async_cb_pipe[1], F_SETFL, fcntl(async_cb_pipe[1], F_GETFL) | O_NONBLOCK);
+#endif
+            async_cb_thread = rb_thread_create(async_cb_event, NULL);
+        }
+
+#endif
+
+        fn->closure = rbffi_Closure_Alloc(fn->info->closurePool);
+        fn->closure->info = fn;
+        fn->base.memory.address = fn->closure->code;
+        fn->base.memory.size = sizeof(*fn->closure);
+        fn->autorelease = true;
+
+    } else {
+        rb_raise(rb_eTypeError, "wrong argument type %s, expected pointer or proc",
+                rb_obj_classname(rbProc));
+    }
+
+    fn->rbProc = rbProc;
+
+    return self;
+}
+
+/*
+ * call-seq: call(*args)
+ * @param [Array] args function arguments
+ * @return [FFI::Type]
+ * Call the function
+ */
+static VALUE
+function_call(int argc, VALUE* argv, VALUE self)
+{
+    Function* fn;
+
+    Data_Get_Struct(self, Function, fn);
+
+    return (*fn->info->invoke)(argc, argv, fn->base.memory.address, fn->info);
+}
+
+/*
+ * call-seq: attach(m, name)
+ * @param [Module] m
+ * @param [String] name
+ * @return [self]
+ * Attach a Function to the Module +m+ as +name+.
+ */
+static VALUE
+function_attach(VALUE self, VALUE module, VALUE name)
+{
+    Function* fn;
+    char var[1024];
+
+    Data_Get_Struct(self, Function, fn);
+
+    if (fn->info->parameterCount == -1) {
+        rb_raise(rb_eRuntimeError, "cannot attach variadic functions");
+        return Qnil;
+    }
+
+    if (!rb_obj_is_kind_of(module, rb_cModule)) {
+        rb_raise(rb_eRuntimeError, "trying to attach function to non-module");
+        return Qnil;
+    }
+
+    if (fn->methodHandle == NULL) {
+        fn->methodHandle = rbffi_MethodHandle_Alloc(fn->info, fn->base.memory.address);
+    }
+
+    /*
+     * Stash the Function in a module variable so it does not get garbage collected
+     */
+    snprintf(var, sizeof(var), "@@%s", StringValueCStr(name));
+    rb_cv_set(module, var, self);
+
+    rb_define_singleton_method(module, StringValueCStr(name),
+            rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1);
+
+
+    rb_define_method(module, StringValueCStr(name),
+            rbffi_MethodHandle_CodeAddress(fn->methodHandle), -1);
+
+    return self;
+}
+
+/*
+ * call-seq: autorelease = autorelease
+ * @param [Boolean] autorelease
+ * @return [self]
+ * Set +autorelease+ attribute (See {Pointer}).
+ */
+static VALUE
+function_set_autorelease(VALUE self, VALUE autorelease)
+{
+    Function* fn;
+
+    Data_Get_Struct(self, Function, fn);
+
+    fn->autorelease = RTEST(autorelease);
+
+    return self;
+}
+
+static VALUE
+function_autorelease_p(VALUE self)
+{
+    Function* fn;
+
+    Data_Get_Struct(self, Function, fn);
+
+    return fn->autorelease ? Qtrue : Qfalse;
+}
+
+/*
+ * call-seq: free
+ * @return [self]
+ * Free memory allocated by Function.
+ */
+static VALUE
+function_release(VALUE self)
+{
+    Function* fn;
+
+    Data_Get_Struct(self, Function, fn);
+
+    if (fn->closure == NULL) {
+        rb_raise(rb_eRuntimeError, "cannot free function which was not allocated");
+    }
+
+    rbffi_Closure_Free(fn->closure);
+    fn->closure = NULL;
+
+    return self;
+}
+
+static void
+callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data)
+{
+    struct gvl_callback cb = { 0 };
+
+    cb.closure = (Closure *) user_data;
+    cb.retval = retval;
+    cb.parameters = parameters;
+    cb.done = false;
+    cb.frame = rbffi_frame_current();
+
+    if (cb.frame != NULL) cb.frame->exc = Qnil;
+    if (cb.frame != NULL && cb.frame->has_gvl) {
+        callback_with_gvl(&cb);
+
+#if defined(HAVE_RB_THREAD_CALL_WITH_GVL)
+    } else if (cb.frame != NULL) {
+        rb_thread_call_with_gvl(callback_with_gvl, &cb);
+#endif
+#if defined(DEFER_ASYNC_CALLBACK) && !defined(_WIN32)
+    } else {
+        bool empty = false;
+
+        pthread_mutex_init(&cb.async_mutex, NULL);
+        pthread_cond_init(&cb.async_cond, NULL);
+
+        /* Now signal the async callback thread */
+        pthread_mutex_lock(&async_cb_mutex);
+        empty = async_cb_list == NULL;
+        cb.next = async_cb_list;
+        async_cb_list = &cb;
+
+#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL))
+        pthread_mutex_unlock(&async_cb_mutex);
+        /* Only signal if the list was empty */
+        if (empty) {
+            char c;
+            write(async_cb_pipe[1], &c, 1);
+        }
+#else
+        pthread_cond_signal(&async_cb_cond);
+        pthread_mutex_unlock(&async_cb_mutex);
+#endif
+
+        /* Wait for the thread executing the ruby callback to signal it is done */
+        pthread_mutex_lock(&cb.async_mutex);
+        while (!cb.done) {
+            pthread_cond_wait(&cb.async_cond, &cb.async_mutex);
+        }
+        pthread_mutex_unlock(&cb.async_mutex);
+        pthread_cond_destroy(&cb.async_cond);
+        pthread_mutex_destroy(&cb.async_mutex);
+
+#elif defined(DEFER_ASYNC_CALLBACK) && defined(_WIN32)
+    } else {
+        bool empty = false;
+
+        cb.async_event = CreateEvent(NULL, FALSE, FALSE, NULL);
+
+        /* Now signal the async callback thread */
+        EnterCriticalSection(&async_cb_lock);
+        empty = async_cb_list == NULL;
+        cb.next = async_cb_list;
+        async_cb_list = &cb;
+        LeaveCriticalSection(&async_cb_lock);
+
+#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL))
+        /* Only signal if the list was empty */
+        if (empty) {
+            char c;
+            write(async_cb_pipe[1], &c, 1);
+        }
+#else
+        SetEvent(async_cb_cond);
+#endif
+
+        /* Wait for the thread executing the ruby callback to signal it is done */
+        WaitForSingleObject(cb.async_event, INFINITE);
+        CloseHandle(cb.async_event);
+#endif
+    }
+}
+
+#if defined(DEFER_ASYNC_CALLBACK)
+struct async_wait {
+    void* cb;
+    bool stop;
+};
+
+static VALUE async_cb_wait(void *);
+static void async_cb_stop(void *);
+
+#if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
+static VALUE
+async_cb_event(void* unused)
+{
+    struct async_wait w = { 0 };
+
+    w.stop = false;
+    while (!w.stop) {
+#if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
+        rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w);
+#else
+        rb_thread_blocking_region(async_cb_wait, &w, async_cb_stop, &w);
+#endif
+        if (w.cb != NULL) {
+            /* Start up a new ruby thread to run the ruby callback */
+            rb_thread_create(async_cb_call, w.cb);
+        }
+    }
+
+    return Qnil;
+}
+
+#elif defined(_WIN32)
+static VALUE
+async_cb_event(void* unused)
+{
+    while (true) {
+        struct gvl_callback* cb;
+        char buf[64];
+        fd_set rfds;
+
+        FD_ZERO(&rfds);
+        FD_SET(async_cb_pipe[0], &rfds);
+        rb_thread_select(async_cb_pipe[0] + 1, &rfds, NULL, NULL, NULL);
+        read(async_cb_pipe[0], buf, sizeof(buf));
+
+        EnterCriticalSection(&async_cb_lock);
+        cb = async_cb_list;
+        async_cb_list = NULL;
+        LeaveCriticalSection(&async_cb_lock);
+
+        while (cb != NULL) {
+            struct gvl_callback* next = cb->next;
+            /* Start up a new ruby thread to run the ruby callback */
+            rb_thread_create(async_cb_call, cb);
+            cb = next;
+        }
+    }
+
+    return Qnil;
+}
+#else
+static VALUE
+async_cb_event(void* unused)
+{
+    while (true) {
+        struct gvl_callback* cb;
+        char buf[64];
+
+        if (read(async_cb_pipe[0], buf, sizeof(buf)) < 0) {
+            rb_thread_wait_fd(async_cb_pipe[0]);
+            while (read(async_cb_pipe[0], buf, sizeof (buf)) < 0) {
+                if (rb_io_wait_readable(async_cb_pipe[0]) != Qtrue) {
+                    return Qfalse;
+                }
+            }
+        }
+
+        pthread_mutex_lock(&async_cb_mutex);
+        cb = async_cb_list;
+        async_cb_list = NULL;
+        pthread_mutex_unlock(&async_cb_mutex);
+
+        while (cb != NULL) {
+            struct gvl_callback* next = cb->next;
+            /* Start up a new ruby thread to run the ruby callback */
+            rb_thread_create(async_cb_call, cb);
+            cb = next;
+        }
+    }
+
+    return Qnil;
+}
+#endif
+
+#ifdef _WIN32
+static VALUE
+async_cb_wait(void *data)
+{
+    struct async_wait* w = (struct async_wait *) data;
+
+    w->cb = NULL;
+
+    EnterCriticalSection(&async_cb_lock);
+
+    while (!w->stop && async_cb_list == NULL) {
+        LeaveCriticalSection(&async_cb_lock);
+        WaitForSingleObject(async_cb_cond, INFINITE);
+        EnterCriticalSection(&async_cb_lock);
+    }
+
+    if (async_cb_list != NULL) {
+        w->cb = async_cb_list;
+        async_cb_list = async_cb_list->next;
+    }
+
+    LeaveCriticalSection(&async_cb_lock);
+
+    return Qnil;
+}
+
+static void
+async_cb_stop(void *data)
+{
+    struct async_wait* w = (struct async_wait *) data;
+
+    EnterCriticalSection(&async_cb_lock);
+    w->stop = true;
+    LeaveCriticalSection(&async_cb_lock);
+    SetEvent(async_cb_cond);
+}
+
+#else
+static VALUE
+async_cb_wait(void *data)
+{
+    struct async_wait* w = (struct async_wait *) data;
+
+    w->cb = NULL;
+
+    pthread_mutex_lock(&async_cb_mutex);
+
+    while (!w->stop && async_cb_list == NULL) {
+        pthread_cond_wait(&async_cb_cond, &async_cb_mutex);
+    }
+
+    if (async_cb_list != NULL) {
+        w->cb = async_cb_list;
+        async_cb_list = async_cb_list->next;
+    }
+
+    pthread_mutex_unlock(&async_cb_mutex);
+
+    return Qnil;
+}
+
+static void
+async_cb_stop(void *data)
+{
+    struct async_wait* w = (struct async_wait *) data;
+
+    pthread_mutex_lock(&async_cb_mutex);
+    w->stop = true;
+    pthread_cond_signal(&async_cb_cond);
+    pthread_mutex_unlock(&async_cb_mutex);
+}
+#endif
+
+static VALUE
+async_cb_call(void *data)
+{
+    struct gvl_callback* cb = (struct gvl_callback *) data;
+
+    callback_with_gvl(data);
+
+    /* Signal the original native thread that the ruby code has completed */
+#ifdef _WIN32
+    SetEvent(cb->async_event);
+#else
+    pthread_mutex_lock(&cb->async_mutex);
+    cb->done = true;
+    pthread_cond_signal(&cb->async_cond);
+    pthread_mutex_unlock(&cb->async_mutex);
+#endif
+
+    return Qnil;
+}
+
+#endif
+
+static void *
+callback_with_gvl(void* data)
+{
+    rb_rescue2(invoke_callback, (VALUE) data, save_callback_exception, (VALUE) data, rb_eException, (VALUE) 0);
+    return NULL;
+}
+
+static VALUE
+invoke_callback(void* data)
+{
+    struct gvl_callback* cb = (struct gvl_callback *) data;
+
+    Function* fn = (Function *) cb->closure->info;
+    FunctionType *cbInfo = fn->info;
+    Type* returnType = cbInfo->returnType;
+    void* retval = cb->retval;
+    void** parameters = cb->parameters;
+    VALUE* rbParams;
+    VALUE rbReturnType = cbInfo->rbReturnType;
+    VALUE rbReturnValue;
+    int i;
+
+    rbParams = ALLOCA_N(VALUE, cbInfo->parameterCount);
+    for (i = 0; i < cbInfo->parameterCount; ++i) {
+        VALUE param;
+        Type* paramType = cbInfo->parameterTypes[i];
+        VALUE rbParamType = rb_ary_entry(cbInfo->rbParameterTypes, i);
+
+        if (unlikely(paramType->nativeType == NATIVE_MAPPED)) {
+            rbParamType = ((MappedType *) paramType)->rbType;
+            paramType = ((MappedType *) paramType)->type;
+        }
+
+        switch (paramType->nativeType) {
+            case NATIVE_INT8:
+                param = INT2NUM(*(int8_t *) parameters[i]);
+                break;
+            case NATIVE_UINT8:
+                param = UINT2NUM(*(uint8_t *) parameters[i]);
+                break;
+            case NATIVE_INT16:
+                param = INT2NUM(*(int16_t *) parameters[i]);
+                break;
+            case NATIVE_UINT16:
+                param = UINT2NUM(*(uint16_t *) parameters[i]);
+                break;
+            case NATIVE_INT32:
+                param = INT2NUM(*(int32_t *) parameters[i]);
+                break;
+            case NATIVE_UINT32:
+                param = UINT2NUM(*(uint32_t *) parameters[i]);
+                break;
+            case NATIVE_INT64:
+                param = LL2NUM(*(int64_t *) parameters[i]);
+                break;
+            case NATIVE_UINT64:
+                param = ULL2NUM(*(uint64_t *) parameters[i]);
+                break;
+            case NATIVE_LONG:
+                param = LONG2NUM(*(long *) parameters[i]);
+                break;
+            case NATIVE_ULONG:
+                param = ULONG2NUM(*(unsigned long *) parameters[i]);
+                break;
+            case NATIVE_FLOAT32:
+                param = rb_float_new(*(float *) parameters[i]);
+                break;
+            case NATIVE_FLOAT64:
+                param = rb_float_new(*(double *) parameters[i]);
+                break;
+            case NATIVE_LONGDOUBLE:
+	      param = rbffi_longdouble_new(*(long double *) parameters[i]);
+                break;
+            case NATIVE_STRING:
+                param = (*(void **) parameters[i] != NULL) ? rb_tainted_str_new2(*(char **) parameters[i]) : Qnil;
+                break;
+            case NATIVE_POINTER:
+                param = rbffi_Pointer_NewInstance(*(void **) parameters[i]);
+                break;
+            case NATIVE_BOOL:
+                param = (*(uint8_t *) parameters[i]) ? Qtrue : Qfalse;
+                break;
+
+            case NATIVE_FUNCTION:
+            case NATIVE_CALLBACK:
+            case NATIVE_STRUCT:
+                param = rbffi_NativeValue_ToRuby(paramType, rbParamType, parameters[i]);
+                break;
+
+            default:
+                param = Qnil;
+                break;
+        }
+
+        /* Convert the native value into a custom ruby value */
+        if (unlikely(cbInfo->parameterTypes[i]->nativeType == NATIVE_MAPPED)) {
+            VALUE values[] = { param, Qnil };
+            param = rb_funcall2(((MappedType *) cbInfo->parameterTypes[i])->rbConverter, id_from_native, 2, values);
+        }
+
+        rbParams[i] = param;
+    }
+
+    rbReturnValue = rb_funcall2(fn->rbProc, id_call, cbInfo->parameterCount, rbParams);
+
+    if (unlikely(returnType->nativeType == NATIVE_MAPPED)) {
+        VALUE values[] = { rbReturnValue, Qnil };
+        rbReturnValue = rb_funcall2(((MappedType *) returnType)->rbConverter, id_to_native, 2, values);
+        rbReturnType = ((MappedType *) returnType)->rbType;
+        returnType = ((MappedType* ) returnType)->type;
+    }
+
+    if (rbReturnValue == Qnil || TYPE(rbReturnValue) == T_NIL) {
+        memset(retval, 0, returnType->ffiType->size);
+    } else switch (returnType->nativeType) {
+        case NATIVE_INT8:
+        case NATIVE_INT16:
+        case NATIVE_INT32:
+            *((ffi_sarg *) retval) = NUM2INT(rbReturnValue);
+            break;
+        case NATIVE_UINT8:
+        case NATIVE_UINT16:
+        case NATIVE_UINT32:
+            *((ffi_arg *) retval) = NUM2UINT(rbReturnValue);
+            break;
+        case NATIVE_INT64:
+            *((int64_t *) retval) = NUM2LL(rbReturnValue);
+            break;
+        case NATIVE_UINT64:
+            *((uint64_t *) retval) = NUM2ULL(rbReturnValue);
+            break;
+        case NATIVE_LONG:
+            *((ffi_sarg *) retval) = NUM2LONG(rbReturnValue);
+            break;
+        case NATIVE_ULONG:
+            *((ffi_arg *) retval) = NUM2ULONG(rbReturnValue);
+            break;
+        case NATIVE_FLOAT32:
+            *((float *) retval) = (float) NUM2DBL(rbReturnValue);
+            break;
+        case NATIVE_FLOAT64:
+            *((double *) retval) = NUM2DBL(rbReturnValue);
+            break;
+        case NATIVE_POINTER:
+            if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) {
+                *((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address;
+            } else {
+                /* Default to returning NULL if not a value pointer object.  handles nil case as well */
+                *((void **) retval) = NULL;
+            }
+            break;
+
+        case NATIVE_BOOL:
+            *((ffi_arg *) retval) = rbReturnValue == Qtrue;
+            break;
+
+        case NATIVE_FUNCTION:
+        case NATIVE_CALLBACK:
+            if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_PointerClass)) {
+
+                *((void **) retval) = ((AbstractMemory *) DATA_PTR(rbReturnValue))->address;
+
+            } else if (rb_obj_is_kind_of(rbReturnValue, rb_cProc) || rb_respond_to(rbReturnValue, id_call)) {
+                VALUE function;
+
+                function = rbffi_Function_ForProc(rbReturnType, rbReturnValue);
+
+                *((void **) retval) = ((AbstractMemory *) DATA_PTR(function))->address;
+            } else {
+                *((void **) retval) = NULL;
+            }
+            break;
+
+        case NATIVE_STRUCT:
+            if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_StructClass)) {
+                AbstractMemory* memory = ((Struct *) DATA_PTR(rbReturnValue))->pointer;
+
+                if (memory->address != NULL) {
+                    memcpy(retval, memory->address, returnType->ffiType->size);
+
+                } else {
+                    memset(retval, 0, returnType->ffiType->size);
+                }
+
+            } else {
+                memset(retval, 0, returnType->ffiType->size);
+            }
+            break;
+
+        default:
+            *((ffi_arg *) retval) = 0;
+            break;
+    }
+
+    return Qnil;
+}
+
+static VALUE
+save_callback_exception(void* data, VALUE exc)
+{
+    struct gvl_callback* cb = (struct gvl_callback *) data;
+
+    memset(cb->retval, 0, ((Function *) cb->closure->info)->info->returnType->ffiType->size);
+    if (cb->frame != NULL) cb->frame->exc = exc;
+
+    return Qnil;
+}
+
+static bool
+callback_prep(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize)
+{
+    FunctionType* fnInfo = (FunctionType *) ctx;
+    ffi_status ffiStatus;
+
+    ffiStatus = ffi_prep_closure(code, &fnInfo->ffi_cif, callback_invoke, closure);
+    if (ffiStatus != FFI_OK) {
+        snprintf(errmsg, errmsgsize, "ffi_prep_closure failed.  status=%#x", ffiStatus);
+        return false;
+    }
+
+    return true;
+}
+
+void
+rbffi_Function_Init(VALUE moduleFFI)
+{
+    rbffi_FunctionInfo_Init(moduleFFI);
+    /*
+     * Document-class: FFI::Function < FFI::Pointer
+     */
+    rbffi_FunctionClass = rb_define_class_under(moduleFFI, "Function", rbffi_PointerClass);
+
+    rb_global_variable(&rbffi_FunctionClass);
+    rb_define_alloc_func(rbffi_FunctionClass, function_allocate);
+
+    rb_define_method(rbffi_FunctionClass, "initialize", function_initialize, -1);
+    rb_define_method(rbffi_FunctionClass, "initialize_copy", function_initialize_copy, 1);
+    rb_define_method(rbffi_FunctionClass, "call", function_call, -1);
+    rb_define_method(rbffi_FunctionClass, "attach", function_attach, 2);
+    rb_define_method(rbffi_FunctionClass, "free", function_release, 0);
+    rb_define_method(rbffi_FunctionClass, "autorelease=", function_set_autorelease, 1);
+    /*
+     * call-seq: autorelease
+     * @return [Boolean]
+     * Get +autorelease+ attribute.
+     * Synonymous for {#autorelease?}.
+     */
+    rb_define_method(rbffi_FunctionClass, "autorelease", function_autorelease_p, 0);
+    /*
+     * call-seq: autorelease?
+     * @return [Boolean] +autorelease+ attribute
+     * Get +autorelease+ attribute.
+     */
+    rb_define_method(rbffi_FunctionClass, "autorelease?", function_autorelease_p, 0);
+
+    id_call = rb_intern("call");
+    id_cbtable = rb_intern("@__ffi_callback_table__");
+    id_cb_ref = rb_intern("@__ffi_callback__");
+    id_to_native = rb_intern("to_native");
+    id_from_native = rb_intern("from_native");
+#if defined(_WIN32)
+    InitializeCriticalSection(&async_cb_lock);
+    async_cb_cond = CreateEvent(NULL, FALSE, FALSE, NULL);
+#endif
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Function.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Function.h
new file mode 100644
index 0000000..052aaf6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Function.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_FUNCTION_H
+#define	RBFFI_FUNCTION_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#ifndef _MSC_VER
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+#endif
+
+#include <ffi.h>
+
+typedef struct FunctionType_ FunctionType;
+
+#include "Type.h"
+#include "Call.h"
+#include "ClosurePool.h"
+
+struct FunctionType_ {
+    Type type; /* The native type of a FunctionInfo object */
+    VALUE rbReturnType;
+    VALUE rbParameterTypes;
+
+    Type* returnType;
+    Type** parameterTypes;
+    NativeType* nativeParameterTypes;
+    ffi_type* ffiReturnType;
+    ffi_type** ffiParameterTypes;
+    ffi_cif ffi_cif;
+    Invoker invoke;
+    ClosurePool* closurePool;
+    int parameterCount;
+    int flags;
+    ffi_abi abi;
+    int callbackCount;
+    VALUE* callbackParameters;
+    VALUE rbEnums;
+    bool ignoreErrno;
+    bool blocking;
+    bool hasStruct;
+};
+
+extern VALUE rbffi_FunctionTypeClass, rbffi_FunctionClass;
+
+void rbffi_Function_Init(VALUE moduleFFI);
+VALUE rbffi_Function_NewInstance(VALUE functionInfo, VALUE proc);
+VALUE rbffi_Function_ForProc(VALUE cbInfo, VALUE proc);
+void rbffi_FunctionInfo_Init(VALUE moduleFFI);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_FUNCTION_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Function.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Function.o
new file mode 100644
index 0000000..0dcae84
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Function.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.c
new file mode 100644
index 0000000..8085c87
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.c
@@ -0,0 +1,271 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ * Copyright (C) 2009 Andrea Fazzi <andrea.fazzi@alcacoop.it>
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+# include <sys/param.h>
+#endif
+#include <sys/types.h>
+#include <stdio.h>
+
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+#endif
+
+#include <errno.h>
+#include <ruby.h>
+
+#include <ffi.h>
+#include "rbffi.h"
+#include "compat.h"
+
+#include "AbstractMemory.h"
+#include "Types.h"
+#include "Type.h"
+#include "StructByValue.h"
+#include "Function.h"
+
+static VALUE fntype_allocate(VALUE klass);
+static VALUE fntype_initialize(int argc, VALUE* argv, VALUE self);
+static void fntype_mark(FunctionType*);
+static void fntype_free(FunctionType *);
+
+VALUE rbffi_FunctionTypeClass = Qnil;
+
+static VALUE
+fntype_allocate(VALUE klass)
+{
+    FunctionType* fnInfo;
+    VALUE obj = Data_Make_Struct(klass, FunctionType, fntype_mark, fntype_free, fnInfo);
+
+    fnInfo->type.ffiType = &ffi_type_pointer;
+    fnInfo->type.nativeType = NATIVE_FUNCTION;
+    fnInfo->rbReturnType = Qnil;
+    fnInfo->rbParameterTypes = Qnil;
+    fnInfo->rbEnums = Qnil;
+    fnInfo->invoke = rbffi_CallFunction;
+    fnInfo->closurePool = NULL;
+
+    return obj;
+}
+
+static void
+fntype_mark(FunctionType* fnInfo)
+{
+    rb_gc_mark(fnInfo->rbReturnType);
+    rb_gc_mark(fnInfo->rbParameterTypes);
+    rb_gc_mark(fnInfo->rbEnums);
+    if (fnInfo->callbackCount > 0 && fnInfo->callbackParameters != NULL) {
+        rb_gc_mark_locations(&fnInfo->callbackParameters[0], &fnInfo->callbackParameters[fnInfo->callbackCount]);
+    }
+}
+
+static void
+fntype_free(FunctionType* fnInfo)
+{
+    xfree(fnInfo->parameterTypes);
+    xfree(fnInfo->ffiParameterTypes);
+    xfree(fnInfo->nativeParameterTypes);
+    xfree(fnInfo->callbackParameters);
+    if (fnInfo->closurePool != NULL) {
+        rbffi_ClosurePool_Free(fnInfo->closurePool);
+    }
+    xfree(fnInfo);
+}
+
+/*
+ * call-seq: initialize(return_type, param_types, options={})
+ * @param [Type, Symbol] return_type return type for the function
+ * @param [Array<Type, Symbol>] param_types array of parameters types
+ * @param [Hash] options
+ * @option options [Boolean] :blocking set to true if the C function is a blocking call
+ * @option options [Symbol] :convention calling convention see {FFI::Library#calling_convention}
+ * @option options [FFI::Enums] :enums
+ * @return [self]
+ * A new FunctionType instance.
+ */
+static VALUE
+fntype_initialize(int argc, VALUE* argv, VALUE self)
+{
+    FunctionType *fnInfo;
+    ffi_status status;
+    VALUE rbReturnType = Qnil, rbParamTypes = Qnil, rbOptions = Qnil;
+    VALUE rbEnums = Qnil, rbConvention = Qnil, rbBlocking = Qnil;
+#if defined(X86_WIN32)
+    VALUE rbConventionStr;
+#endif
+    int i, nargs;
+
+    nargs = rb_scan_args(argc, argv, "21", &rbReturnType, &rbParamTypes, &rbOptions);
+    if (nargs >= 3 && rbOptions != Qnil) {
+        rbConvention = rb_hash_aref(rbOptions, ID2SYM(rb_intern("convention")));
+        rbEnums = rb_hash_aref(rbOptions, ID2SYM(rb_intern("enums")));
+        rbBlocking = rb_hash_aref(rbOptions, ID2SYM(rb_intern("blocking")));
+    }
+
+    Check_Type(rbParamTypes, T_ARRAY);
+
+    Data_Get_Struct(self, FunctionType, fnInfo);
+    fnInfo->parameterCount = (int) RARRAY_LEN(rbParamTypes);
+    fnInfo->parameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->parameterTypes));
+    fnInfo->ffiParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(ffi_type *));
+    fnInfo->nativeParameterTypes = xcalloc(fnInfo->parameterCount, sizeof(*fnInfo->nativeParameterTypes));
+    fnInfo->rbParameterTypes = rb_ary_new2(fnInfo->parameterCount);
+    fnInfo->rbEnums = rbEnums;
+    fnInfo->blocking = RTEST(rbBlocking);
+    fnInfo->hasStruct = false;
+
+    for (i = 0; i < fnInfo->parameterCount; ++i) {
+        VALUE entry = rb_ary_entry(rbParamTypes, i);
+        VALUE type = rbffi_Type_Lookup(entry);
+
+        if (!RTEST(type)) {
+            VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL);
+            rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName));
+        }
+
+        if (rb_obj_is_kind_of(type, rbffi_FunctionTypeClass)) {
+            REALLOC_N(fnInfo->callbackParameters, VALUE, fnInfo->callbackCount + 1);
+            fnInfo->callbackParameters[fnInfo->callbackCount++] = type;
+        }
+
+        if (rb_obj_is_kind_of(type, rbffi_StructByValueClass)) {
+            fnInfo->hasStruct = true;
+        }
+
+        rb_ary_push(fnInfo->rbParameterTypes, type);
+        Data_Get_Struct(type, Type, fnInfo->parameterTypes[i]);
+        fnInfo->ffiParameterTypes[i] = fnInfo->parameterTypes[i]->ffiType;
+        fnInfo->nativeParameterTypes[i] = fnInfo->parameterTypes[i]->nativeType;
+    }
+
+    fnInfo->rbReturnType = rbffi_Type_Lookup(rbReturnType);
+    if (!RTEST(fnInfo->rbReturnType)) {
+        VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL);
+        rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName));
+    }
+    
+    if (rb_obj_is_kind_of(fnInfo->rbReturnType, rbffi_StructByValueClass)) {
+        fnInfo->hasStruct = true;
+    }
+
+    Data_Get_Struct(fnInfo->rbReturnType, Type, fnInfo->returnType);
+    fnInfo->ffiReturnType = fnInfo->returnType->ffiType;
+
+
+#if defined(X86_WIN32)
+    rbConventionStr = (rbConvention != Qnil) ? rb_funcall2(rbConvention, rb_intern("to_s"), 0, NULL) : Qnil;
+    fnInfo->abi = (rbConventionStr != Qnil && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0)
+            ? FFI_STDCALL : FFI_DEFAULT_ABI;
+#else
+    fnInfo->abi = FFI_DEFAULT_ABI;
+#endif
+
+    status = ffi_prep_cif(&fnInfo->ffi_cif, fnInfo->abi, fnInfo->parameterCount,
+            fnInfo->ffiReturnType, fnInfo->ffiParameterTypes);
+    switch (status) {
+        case FFI_BAD_ABI:
+            rb_raise(rb_eArgError, "Invalid ABI specified");
+        case FFI_BAD_TYPEDEF:
+            rb_raise(rb_eArgError, "Invalid argument type specified");
+        case FFI_OK:
+            break;
+        default:
+            rb_raise(rb_eArgError, "Unknown FFI error");
+    }
+
+    fnInfo->invoke = rbffi_GetInvoker(fnInfo);
+
+    return self;
+}
+
+/*
+ * call-seq: result_type
+ * @return [Type]
+ * Get the return type of the function type
+ */
+static VALUE
+fntype_result_type(VALUE self)
+{
+    FunctionType* ft;
+
+    Data_Get_Struct(self, FunctionType, ft);
+
+    return ft->rbReturnType;
+}
+
+/*
+ * call-seq: param_types
+ * @return [Array<Type>]
+ * Get parameters types.
+ */
+static VALUE
+fntype_param_types(VALUE self)
+{
+    FunctionType* ft;
+
+    Data_Get_Struct(self, FunctionType, ft);
+
+    return rb_ary_dup(ft->rbParameterTypes);
+}
+
+void
+rbffi_FunctionInfo_Init(VALUE moduleFFI)
+{
+    VALUE ffi_Type;
+
+    ffi_Type = rbffi_TypeClass;
+
+    /*
+     * Document-class: FFI::FunctionType < FFI::Type
+     */
+    rbffi_FunctionTypeClass = rb_define_class_under(moduleFFI, "FunctionType",ffi_Type);
+    rb_global_variable(&rbffi_FunctionTypeClass);
+    /*
+     * Document-const: FFI::CallbackInfo = FFI::FunctionType
+     */
+    rb_define_const(moduleFFI, "CallbackInfo", rbffi_FunctionTypeClass);
+    /*
+     * Document-const: FFI::FunctionInfo = FFI::FunctionType
+     */
+    rb_define_const(moduleFFI, "FunctionInfo", rbffi_FunctionTypeClass);
+    /*
+     * Document-const: FFI::Type::Function = FFI::FunctionType
+     */
+    rb_define_const(ffi_Type, "Function", rbffi_FunctionTypeClass);
+
+    rb_define_alloc_func(rbffi_FunctionTypeClass, fntype_allocate);
+    rb_define_method(rbffi_FunctionTypeClass, "initialize", fntype_initialize, -1);
+    rb_define_method(rbffi_FunctionTypeClass, "result_type", fntype_result_type, 0);
+    rb_define_method(rbffi_FunctionTypeClass, "param_types", fntype_param_types, 0);
+
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.o
new file mode 100644
index 0000000..a14fc2e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/FunctionInfo.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LastError.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LastError.c
new file mode 100644
index 0000000..795a42e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LastError.c
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ * Copyright (C) 2009 Aman Gupta <aman@tmm1.net>
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+# include <sys/param.h>
+#endif
+#include <sys/types.h>
+#include <stdio.h>
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+#endif
+#include <errno.h>
+#include <ruby.h>
+
+#include "LastError.h"
+
+#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__)
+# include <pthread.h>
+# define USE_PTHREAD_LOCAL
+#endif
+
+typedef struct ThreadData {
+    int td_errno;
+} ThreadData;
+
+#if defined(USE_PTHREAD_LOCAL)
+static pthread_key_t threadDataKey;
+#endif
+
+static inline ThreadData* thread_data_get(void);
+
+#if defined(USE_PTHREAD_LOCAL)
+
+static ThreadData*
+thread_data_init(void)
+{
+    ThreadData* td = xcalloc(1, sizeof(ThreadData));
+
+    pthread_setspecific(threadDataKey, td);
+
+    return td;
+}
+
+
+static inline ThreadData*
+thread_data_get(void)
+{
+    ThreadData* td = pthread_getspecific(threadDataKey);
+    return td != NULL ? td : thread_data_init();
+}
+
+static void
+thread_data_free(void *ptr)
+{
+    xfree(ptr);
+}
+
+#else
+static ID id_thread_data;
+
+static ThreadData*
+thread_data_init(void)
+{
+    ThreadData* td;
+    VALUE obj;
+
+    obj = Data_Make_Struct(rb_cObject, ThreadData, NULL, -1, td);
+    rb_thread_local_aset(rb_thread_current(), id_thread_data, obj);
+
+    return td;
+}
+
+static inline ThreadData*
+thread_data_get()
+{
+    VALUE obj = rb_thread_local_aref(rb_thread_current(), id_thread_data);
+
+    if (obj != Qnil && TYPE(obj) == T_DATA) {
+        return (ThreadData *) DATA_PTR(obj);
+    }
+
+    return thread_data_init();
+}
+
+#endif
+
+
+/*
+ * call-seq: error
+ * @return [Numeric]
+ * Get +errno+ value.
+ */
+static VALUE
+get_last_error(VALUE self)
+{
+    return INT2NUM(thread_data_get()->td_errno);
+}
+
+
+/*
+ * call-seq: error(error)
+ * @param [Numeric] error
+ * @return [nil]
+ * Set +errno+ value.
+ */
+static VALUE
+set_last_error(VALUE self, VALUE error)
+{
+
+#ifdef _WIN32
+    SetLastError(NUM2INT(error));
+#else
+    errno = NUM2INT(error);
+#endif
+
+    return Qnil;
+}
+
+
+void
+rbffi_save_errno(void)
+{
+    int error = 0;
+
+#ifdef _WIN32
+    error = GetLastError();
+#else
+    error = errno;
+#endif
+
+    thread_data_get()->td_errno = error;
+}
+
+
+void
+rbffi_LastError_Init(VALUE moduleFFI)
+{
+    /*
+     * Document-module: FFI::LastError
+     * This module defines a couple of method to set and get +errno+
+     * for current thread.
+     */
+    VALUE moduleError = rb_define_module_under(moduleFFI, "LastError");
+
+    rb_define_module_function(moduleError, "error", get_last_error, 0);
+    rb_define_module_function(moduleError, "error=", set_last_error, 1);
+
+#if defined(USE_PTHREAD_LOCAL)
+    pthread_key_create(&threadDataKey, thread_data_free);
+#else
+    id_thread_data = rb_intern("ffi_thread_local_data");
+#endif /* USE_PTHREAD_LOCAL */
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LastError.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LastError.h
new file mode 100644
index 0000000..ee1dfbb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LastError.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_LASTERROR_H
+#define	RBFFI_LASTERROR_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+
+void rbffi_LastError_Init(VALUE moduleFFI);
+
+void rbffi_save_errno(void);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_LASTERROR_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LastError.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LastError.o
new file mode 100644
index 0000000..0d7c0f7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LastError.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.c
new file mode 100644
index 0000000..a21883a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.c
@@ -0,0 +1,63 @@
+#include "LongDouble.h"
+#include <stdio.h>
+#include <stdarg.h>
+#include <float.h>
+
+#if defined (__CYGWIN__) || defined(__INTERIX)
+# define strtold(str, endptr)    ((long double) strtod((str), (endptr)))
+#endif /* defined (__CYGWIN__) */
+
+static VALUE rb_cBigDecimal = Qnil;
+static VALUE bigdecimal_load(VALUE unused);
+static VALUE bigdecimal_failed(VALUE value);
+
+VALUE 
+rbffi_longdouble_new(long double ld)
+{
+    if (!RTEST(rb_cBigDecimal)) {
+        /* allow fallback if the bigdecimal library is unavailable in future ruby versions */
+        rb_cBigDecimal = rb_rescue(bigdecimal_load, Qnil, bigdecimal_failed, rb_cObject);
+    }
+
+    if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject) {
+        char buf[128];
+        return rb_funcall(rb_cBigDecimal, rb_intern("new"), 1, rb_str_new(buf, sprintf(buf, "%.35Le", ld)));
+    }
+
+    /* Fall through to handling as a float */
+    return rb_float_new(ld);
+}
+
+long double 
+rbffi_num2longdouble(VALUE value)
+{
+    if (TYPE(value) == T_FLOAT) {
+        return rb_num2dbl(value);
+    }
+    
+    if (!RTEST(rb_cBigDecimal) && rb_const_defined(rb_cObject, rb_intern("BigDecimal"))) {
+        rb_cBigDecimal = rb_const_get(rb_cObject, rb_intern("BigDecimal"));
+    }
+
+    if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject && RTEST(rb_obj_is_kind_of(value, rb_cBigDecimal))) {
+        VALUE s = rb_funcall(value, rb_intern("to_s"), 1, rb_str_new2("E"));
+        return strtold(RSTRING_PTR(s), NULL);
+    }
+
+    /* Fall through to handling as a float */
+    return rb_num2dbl(value);
+}
+
+
+static VALUE 
+bigdecimal_load(VALUE unused)
+{
+    rb_require("bigdecimal");
+    return rb_const_get(rb_cObject, rb_intern("BigDecimal"));
+}
+
+static VALUE 
+bigdecimal_failed(VALUE value)
+{
+    return value;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.h
new file mode 100644
index 0000000..2e52ccb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2012, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_LONGDOUBLE_H
+#define	RBFFI_LONGDOUBLE_H
+
+#include <ruby.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#ifdef _MSC_VER
+#define strtold strtod
+#endif
+
+extern VALUE rbffi_longdouble_new(long double ld);
+extern long double rbffi_num2longdouble(VALUE value);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_LONGDOUBLE_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.o
new file mode 100644
index 0000000..76809b0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/LongDouble.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Makefile b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Makefile
new file mode 100644
index 0000000..0d1d386
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Makefile
@@ -0,0 +1,264 @@
+
+SHELL = /bin/sh
+
+# V=0 quiet, V=1 verbose.  other values don't work.
+V = 0
+Q1 = $(V:1=)
+Q = $(Q1:0=@)
+ECHO1 = $(V:1=@ :)
+ECHO = $(ECHO1:0=@ echo)
+NULLCMD = :
+
+#### Start of system configuration section. ####
+
+srcdir = .
+topdir = /usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0
+hdrdir = $(topdir)
+arch_hdrdir = /usr/local/Cellar/ruby/2.4.1_1/include/ruby-2.4.0/x86_64-darwin16
+PATH_SEPARATOR = :
+VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
+prefix = $(DESTDIR)/usr/local/Cellar/ruby/2.4.1_1
+rubysitearchprefix = $(rubylibprefix)/$(sitearch)
+rubyarchprefix = $(rubylibprefix)/$(arch)
+rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
+exec_prefix = $(prefix)
+vendorarchhdrdir = $(vendorhdrdir)/$(sitearch)
+sitearchhdrdir = $(sitehdrdir)/$(sitearch)
+rubyarchhdrdir = $(rubyhdrdir)/$(arch)
+vendorhdrdir = $(rubyhdrdir)/vendor_ruby
+sitehdrdir = $(rubyhdrdir)/site_ruby
+rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME)
+vendorarchdir = $(vendorlibdir)/$(sitearch)
+vendorlibdir = $(vendordir)/$(ruby_version)
+vendordir = $(DESTDIR)/usr/local/lib/ruby/vendor_ruby
+sitearchdir = $(DESTDIR)./.gem.20170921-22476-vyiwyr
+sitelibdir = $(DESTDIR)./.gem.20170921-22476-vyiwyr
+sitedir = $(DESTDIR)/usr/local/lib/ruby/site_ruby
+rubyarchdir = $(rubylibdir)/$(arch)
+rubylibdir = $(rubylibprefix)/$(ruby_version)
+sitearchincludedir = $(includedir)/$(sitearch)
+archincludedir = $(includedir)/$(arch)
+sitearchlibdir = $(libdir)/$(sitearch)
+archlibdir = $(libdir)/$(arch)
+ridir = $(datarootdir)/$(RI_BASE_NAME)
+mandir = $(datarootdir)/man
+localedir = $(datarootdir)/locale
+libdir = $(exec_prefix)/lib
+psdir = $(docdir)
+pdfdir = $(docdir)
+dvidir = $(docdir)
+htmldir = $(docdir)
+infodir = $(datarootdir)/info
+docdir = $(datarootdir)/doc/$(PACKAGE)
+oldincludedir = $(SDKROOT)/usr/include
+includedir = $(prefix)/include
+localstatedir = $(prefix)/var
+sharedstatedir = $(prefix)/com
+sysconfdir = $(prefix)/etc
+datadir = $(datarootdir)
+datarootdir = $(prefix)/share
+libexecdir = $(exec_prefix)/libexec
+sbindir = $(exec_prefix)/sbin
+bindir = $(exec_prefix)/bin
+archdir = $(rubyarchdir)
+
+
+CC = clang
+CXX = clang++
+LIBRUBY = $(LIBRUBY_SO)
+LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
+LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
+LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework CoreFoundation
+empty =
+OUTFLAG = -o $(empty)
+COUTFLAG = -o $(empty)
+CSRCFLAG = $(empty)
+
+RUBY_EXTCONF_H = extconf.h
+cflags   = $(optflags) $(debugflags) $(warnflags)
+cxxflags = $(optflags) $(debugflags) $(warnflags)
+optflags = -O3 -fno-fast-math
+debugflags = -ggdb3
+warnflags = 
+CCDLFLAGS = -fno-common
+CFLAGS   = $(CCDLFLAGS) $(cflags)  -fno-common -pipe $(ARCH_FLAG)
+INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) -I/usr/include/ffi
+DEFS     = 
+CPPFLAGS = -DRUBY_EXTCONF_H=\"$(RUBY_EXTCONF_H)\"  -I/usr/local/opt/libyaml/include -I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags)
+CXXFLAGS = $(CCDLFLAGS) $(cxxflags) $(ARCH_FLAG)
+ldflags  = -L. -fstack-protector -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib
+dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib 
+ARCH_FLAG = 
+DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
+LDSHARED = $(CC) -dynamic -bundle
+LDSHAREDXX = $(CXX) -dynamic -bundle
+AR = ar
+EXEEXT = 
+
+RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)
+RUBY_SO_NAME = ruby.2.4.1
+RUBYW_INSTALL_NAME = 
+RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version)
+RUBYW_BASE_NAME = rubyw
+RUBY_BASE_NAME = ruby
+
+arch = x86_64-darwin16
+sitearch = $(arch)
+ruby_version = 2.4.0
+ruby = $(bindir)/$(RUBY_BASE_NAME)
+RUBY = $(ruby)
+ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h $(RUBY_EXTCONF_H)
+
+RM = rm -f
+RM_RF = $(RUBY) -run -e rm -- -rf
+RMDIRS = rmdir -p
+MAKEDIRS = mkdir -p
+INSTALL = /usr/bin/install -c
+INSTALL_PROG = $(INSTALL) -m 0755
+INSTALL_DATA = $(INSTALL) -m 644
+COPY = cp
+TOUCH = exit >
+
+#### End of system configuration section. ####
+
+preload = 
+libpath = . $(libdir) /usr/local/opt/libyaml/lib /usr/local/opt/openssl/lib /usr/local/opt/readline/lib
+LIBPATH =  -L. -L$(libdir) -L/usr/local/opt/libyaml/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib
+DEFFILE = 
+
+CLEANFILES = mkmf.log
+DISTCLEANFILES = 
+DISTCLEANDIRS = 
+
+extout = 
+extout_prefix = 
+target_prefix = 
+LOCAL_LIBS = 
+LIBS = $(LIBRUBYARG_SHARED) -lffi  -lpthread -ldl -lobjc 
+ORIG_SRCS = AbstractMemory.c ArrayType.c Buffer.c Call.c ClosurePool.c DataConverter.c DynamicLibrary.c Function.c FunctionInfo.c LastError.c LongDouble.c MappedType.c MemoryPointer.c MethodHandle.c Platform.c Pointer.c Struct.c StructByReference.c StructByValue.c StructLayout.c Thread.c Type.c Types.c Variadic.c ffi.c
+SRCS = $(ORIG_SRCS) 
+OBJS = AbstractMemory.o ArrayType.o Buffer.o Call.o ClosurePool.o DataConverter.o DynamicLibrary.o Function.o FunctionInfo.o LastError.o LongDouble.o MappedType.o MemoryPointer.o MethodHandle.o Platform.o Pointer.o Struct.o StructByReference.o StructByValue.o StructLayout.o Thread.o Type.o Types.o Variadic.o ffi.o
+HDRS = $(srcdir)/AbstractMemory.h $(srcdir)/ArrayType.h $(srcdir)/Call.h $(srcdir)/ClosurePool.h $(srcdir)/compat.h $(srcdir)/DynamicLibrary.h $(srcdir)/extconf.h $(srcdir)/Function.h $(srcdir)/LastError.h $(srcdir)/LongDouble.h $(srcdir)/MappedType.h $(srcdir)/MemoryPointer.h $(srcdir)/MethodHandle.h $(srcdir)/Platform.h $(srcdir)/Pointer.h $(srcdir)/rbffi.h $(srcdir)/rbffi_endian.h $(srcdir)/Struct.h $(srcdir)/StructByReference.h $(srcdir)/StructByValue.h $(srcdir)/Thread.h $(srcdir)/Type.h $(srcdir)/Types.h
+LOCAL_HDRS = 
+TARGET = ffi_c
+TARGET_NAME = ffi_c
+TARGET_ENTRY = Init_$(TARGET_NAME)
+DLLIB = $(TARGET).bundle
+EXTSTATIC = 
+STATIC_LIB = 
+
+TIMESTAMP_DIR = .
+BINDIR        = $(bindir)
+RUBYCOMMONDIR = $(sitedir)$(target_prefix)
+RUBYLIBDIR    = $(sitelibdir)$(target_prefix)
+RUBYARCHDIR   = $(sitearchdir)$(target_prefix)
+HDRDIR        = $(rubyhdrdir)/ruby$(target_prefix)
+ARCHHDRDIR    = $(rubyhdrdir)/$(arch)/ruby$(target_prefix)
+TARGET_SO_DIR =
+TARGET_SO     = $(TARGET_SO_DIR)$(DLLIB)
+CLEANLIBS     = $(TARGET_SO) 
+CLEANOBJS     = *.o  *.bak
+
+all:    $(DLLIB)
+static: $(STATIC_LIB) install-rb
+.PHONY: all install static install-so install-rb
+.PHONY: clean clean-so clean-static clean-rb
+
+clean-static::
+clean-rb-default::
+clean-rb::
+clean-so::
+clean: clean-so clean-static clean-rb-default clean-rb
+		-$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time
+
+distclean-rb-default::
+distclean-rb::
+distclean-so::
+distclean-static::
+distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb
+		-$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
+		-$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
+		-$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true
+
+realclean: distclean
+install: install-so install-rb
+
+install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.time
+	$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
+clean-static::
+	-$(Q)$(RM) $(STATIC_LIB)
+install-rb: pre-install-rb do-install-rb install-rb-default
+install-rb-default: pre-install-rb-default do-install-rb-default
+pre-install-rb: Makefile
+pre-install-rb-default: Makefile
+do-install-rb:
+do-install-rb-default:
+pre-install-rb-default:
+	@$(NULLCMD)
+$(TIMESTAMP_DIR)/.sitearchdir.time:
+	$(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR)
+	$(Q) $(TOUCH) $@
+
+site-install: site-install-so site-install-rb
+site-install-so: install-so
+site-install-rb: install-rb
+
+.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S
+
+.cc.o:
+	$(ECHO) compiling $(<)
+	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
+
+.cc.S:
+	$(ECHO) translating $(<)
+	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
+
+.mm.o:
+	$(ECHO) compiling $(<)
+	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
+
+.mm.S:
+	$(ECHO) translating $(<)
+	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
+
+.cxx.o:
+	$(ECHO) compiling $(<)
+	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
+
+.cxx.S:
+	$(ECHO) translating $(<)
+	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
+
+.cpp.o:
+	$(ECHO) compiling $(<)
+	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
+
+.cpp.S:
+	$(ECHO) translating $(<)
+	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
+
+.c.o:
+	$(ECHO) compiling $(<)
+	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
+
+.c.S:
+	$(ECHO) translating $(<)
+	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
+
+.m.o:
+	$(ECHO) compiling $(<)
+	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<
+
+.m.S:
+	$(ECHO) translating $(<)
+	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<
+
+$(TARGET_SO): $(OBJS) Makefile
+	$(ECHO) linking shared-object $(DLLIB)
+	-$(Q)$(RM) $(@)
+	$(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
+	$(Q) $(POSTLINK)
+
+
+
+$(OBJS): $(HDRS) $(ruby_headers)
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.c
new file mode 100644
index 0000000..d1a4189
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.c
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2010, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#include <ruby.h>
+
+#include <ffi.h>
+#include "rbffi.h"
+
+#include "Type.h"
+#include "MappedType.h"
+
+
+static VALUE mapped_allocate(VALUE);
+static VALUE mapped_initialize(VALUE, VALUE);
+static void mapped_mark(MappedType *);
+static ID id_native_type, id_to_native, id_from_native;
+
+VALUE rbffi_MappedTypeClass = Qnil;
+
+static VALUE
+mapped_allocate(VALUE klass)
+{
+    MappedType* m;
+
+    VALUE obj = Data_Make_Struct(klass, MappedType, mapped_mark, -1, m);
+
+    m->rbConverter = Qnil;
+    m->rbType = Qnil;
+    m->type = NULL;
+    m->base.nativeType = NATIVE_MAPPED;
+    m->base.ffiType = &ffi_type_void;
+    
+    return obj;
+}
+
+/*
+ * call-seq: initialize(converter)
+ * @param [#native_type, #to_native, #from_native] converter +converter+ must respond to
+ *  all these methods
+ * @return [self]
+ */
+static VALUE
+mapped_initialize(VALUE self, VALUE rbConverter)
+{
+    MappedType* m = NULL;
+    
+    if (!rb_respond_to(rbConverter, id_native_type)) {
+        rb_raise(rb_eNoMethodError, "native_type method not implemented");
+    }
+
+    if (!rb_respond_to(rbConverter, id_to_native)) {
+        rb_raise(rb_eNoMethodError, "to_native method not implemented");
+    }
+
+    if (!rb_respond_to(rbConverter, id_from_native)) {
+        rb_raise(rb_eNoMethodError, "from_native method not implemented");
+    }
+    
+    Data_Get_Struct(self, MappedType, m);
+    m->rbType = rb_funcall2(rbConverter, id_native_type, 0, NULL);
+    if (!(rb_obj_is_kind_of(m->rbType, rbffi_TypeClass))) {
+        rb_raise(rb_eTypeError, "native_type did not return instance of FFI::Type");
+    }
+
+    m->rbConverter = rbConverter;
+    Data_Get_Struct(m->rbType, Type, m->type);
+    m->base.ffiType = m->type->ffiType;
+    
+    return self;
+}
+
+static void
+mapped_mark(MappedType* m)
+{
+    rb_gc_mark(m->rbType);
+    rb_gc_mark(m->rbConverter);
+}
+
+/*
+ * call-seq: mapped_type.native_type
+ * @return [Type]
+ * Get native type of mapped type.
+ */
+static VALUE
+mapped_native_type(VALUE self)
+{
+    MappedType*m = NULL;
+    Data_Get_Struct(self, MappedType, m);
+
+    return m->rbType;
+}
+
+/*
+ * call-seq: mapped_type.to_native(*args)
+ * @param args depends on {FFI::DataConverter} used to initialize +self+
+ */
+static VALUE
+mapped_to_native(int argc, VALUE* argv, VALUE self)
+{
+    MappedType*m = NULL;
+    
+    Data_Get_Struct(self, MappedType, m);
+    
+    return rb_funcall2(m->rbConverter, id_to_native, argc, argv);
+}
+
+/*
+ * call-seq: mapped_type.from_native(*args)
+ * @param args depends on {FFI::DataConverter} used to initialize +self+
+ */
+static VALUE
+mapped_from_native(int argc, VALUE* argv, VALUE self)
+{
+    MappedType*m = NULL;
+    
+    Data_Get_Struct(self, MappedType, m);
+
+    return rb_funcall2(m->rbConverter, id_from_native, argc, argv);
+}
+
+void
+rbffi_MappedType_Init(VALUE moduleFFI)
+{
+    /* 
+     * Document-class: FFI::Type::Mapped < FFI::Type
+     */
+    rbffi_MappedTypeClass = rb_define_class_under(rbffi_TypeClass, "Mapped", rbffi_TypeClass);
+    
+    rb_global_variable(&rbffi_MappedTypeClass);
+
+    id_native_type = rb_intern("native_type");
+    id_to_native = rb_intern("to_native");
+    id_from_native = rb_intern("from_native");
+
+    rb_define_alloc_func(rbffi_MappedTypeClass, mapped_allocate);
+    rb_define_method(rbffi_MappedTypeClass, "initialize", mapped_initialize, 1);
+    rb_define_method(rbffi_MappedTypeClass, "type", mapped_native_type, 0);
+    rb_define_method(rbffi_MappedTypeClass, "native_type", mapped_native_type, 0);
+    rb_define_method(rbffi_MappedTypeClass, "to_native", mapped_to_native, -1);
+    rb_define_method(rbffi_MappedTypeClass, "from_native", mapped_from_native, -1);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.h
new file mode 100644
index 0000000..4b26cc1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2010, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_MAPPEDTYPE_H
+#define	RBFFI_MAPPEDTYPE_H
+
+
+#include <ruby.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+
+typedef struct MappedType_ {
+    Type base;
+    Type* type;
+    VALUE rbConverter;
+    VALUE rbType;
+    
+} MappedType;
+
+void rbffi_MappedType_Init(VALUE moduleFFI);
+
+extern VALUE rbffi_MappedTypeClass;
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_MAPPEDTYPE_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.o
new file mode 100644
index 0000000..450f39c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MappedType.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.c
new file mode 100644
index 0000000..0d91c35
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.c
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ * Copyright (C) 2009 Luc Heinrich <luc@honk-honk.com>
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+# include <stdbool.h>
+# include <stdint.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+#include <limits.h>
+#include <ruby.h>
+#include "rbffi.h"
+#include "AbstractMemory.h"
+#include "Pointer.h"
+#include "MemoryPointer.h"
+
+
+static VALUE memptr_allocate(VALUE klass);
+static void memptr_release(Pointer* ptr);
+static VALUE memptr_malloc(VALUE self, long size, long count, bool clear);
+static VALUE memptr_free(VALUE self);
+
+VALUE rbffi_MemoryPointerClass;
+
+#define MEMPTR(obj) ((MemoryPointer *) rbffi_AbstractMemory_Cast(obj, rbffi_MemoryPointerClass))
+
+VALUE
+rbffi_MemoryPointer_NewInstance(long size, long count, bool clear)
+{
+    return memptr_malloc(memptr_allocate(rbffi_MemoryPointerClass), size, count, clear);
+}
+
+static VALUE
+memptr_allocate(VALUE klass)
+{
+    Pointer* p;
+    VALUE obj = Data_Make_Struct(klass, Pointer, NULL, memptr_release, p);
+    p->rbParent = Qnil;
+    p->memory.flags = MEM_RD | MEM_WR;
+
+    return obj;
+}
+
+/*
+ * call-seq: initialize(size, count=1, clear=true)
+ * @param [Fixnum, Bignum, Symbol, FFI::Type] size size of a memory cell (in bytes, or type whom size will be used)
+ * @param [Numeric] count number of cells in memory
+ * @param [Boolean] clear set memory to all-zero if +true+
+ * @return [self]
+ * A new instance of FFI::MemoryPointer.
+ */
+static VALUE
+memptr_initialize(int argc, VALUE* argv, VALUE self)
+{
+    VALUE size = Qnil, count = Qnil, clear = Qnil;
+    int nargs = rb_scan_args(argc, argv, "12", &size, &count, &clear);
+
+    memptr_malloc(self, rbffi_type_size(size), nargs > 1 ? NUM2LONG(count) : 1,
+        RTEST(clear) || clear == Qnil);
+
+    if (rb_block_given_p()) {
+        return rb_ensure(rb_yield, self, memptr_free, self);
+    }
+
+    return self;
+}
+
+static VALUE
+memptr_malloc(VALUE self, long size, long count, bool clear)
+{
+    Pointer* p;
+    unsigned long msize;
+
+    Data_Get_Struct(self, Pointer, p);
+
+    msize = size * count;
+
+    p->storage = xmalloc(msize + 7);
+    if (p->storage == NULL) {
+        rb_raise(rb_eNoMemError, "Failed to allocate memory size=%ld bytes", msize);
+        return Qnil;
+    }
+    p->autorelease = true;
+    p->memory.typeSize = (int) size;
+    p->memory.size = msize;
+    /* ensure the memory is aligned on at least a 8 byte boundary */
+    p->memory.address = (char *) (((uintptr_t) p->storage + 0x7) & (uintptr_t) ~0x7UL);;
+    p->allocated = true;
+
+    if (clear && p->memory.size > 0) {
+        memset(p->memory.address, 0, p->memory.size);
+    }
+
+    return self;
+}
+
+static VALUE
+memptr_free(VALUE self)
+{
+    Pointer* ptr;
+
+    Data_Get_Struct(self, Pointer, ptr);
+
+    if (ptr->allocated) {
+        if (ptr->storage != NULL) {
+            xfree(ptr->storage);
+            ptr->storage = NULL;
+        }
+        ptr->allocated = false;
+    }
+
+    return self;
+}
+
+static void
+memptr_release(Pointer* ptr)
+{
+    if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) {
+        xfree(ptr->storage);
+        ptr->storage = NULL;
+    }
+    xfree(ptr);
+}
+
+/*
+ * call-seq: from_string(s)
+ * @param [String] s string
+ * @return [MemoryPointer]
+ * Create a {MemoryPointer} with +s+ inside.
+ */
+static VALUE
+memptr_s_from_string(VALUE klass, VALUE to_str)
+{
+    VALUE s = StringValue(to_str);
+    VALUE args[] = { INT2FIX(1), LONG2NUM(RSTRING_LEN(s) + 1), Qfalse };
+    VALUE obj = rb_class_new_instance(3, args, klass);
+    rb_funcall(obj, rb_intern("put_string"), 2, INT2FIX(0), s);
+
+    return obj;
+}
+
+void
+rbffi_MemoryPointer_Init(VALUE moduleFFI)
+{
+    VALUE ffi_Pointer;
+
+    ffi_Pointer = rbffi_PointerClass;
+
+    /*
+     * Document-class: FFI::MemoryPointer < FFI::Pointer
+     * A MemoryPointer is a specific {Pointer}. It points to a memory composed of cells. All cells have the
+     * same size.
+     *
+     * @example Create a new MemoryPointer
+     *  mp = FFI::MemoryPointer.new(:long, 16)   # Create a pointer on a memory of 16 long ints.
+     * @example Create a new MemoryPointer from a String
+     *  mp1 = FFI::MemoryPointer.from_string("this is a string")
+     *  # same as:
+     *  mp2 = FFI::MemoryPointer.new(:char,16)
+     *  mp2.put_string("this is a string")
+     */
+    rbffi_MemoryPointerClass = rb_define_class_under(moduleFFI, "MemoryPointer", ffi_Pointer);
+    rb_global_variable(&rbffi_MemoryPointerClass);
+
+    rb_define_alloc_func(rbffi_MemoryPointerClass, memptr_allocate);
+    rb_define_method(rbffi_MemoryPointerClass, "initialize", memptr_initialize, -1);
+    rb_define_singleton_method(rbffi_MemoryPointerClass, "from_string", memptr_s_from_string, 1);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.h
new file mode 100644
index 0000000..1257683
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ * Copyright (c) 2008, Luc Heinrich <luc@honk-honk.com>
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_MEMORYPOINTER_H
+#define	RBFFI_MEMORYPOINTER_H
+
+#ifndef _MSC_VER
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+#endif
+#include <ruby.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+    extern void rbffi_MemoryPointer_Init(VALUE moduleFFI);
+    extern VALUE rbffi_MemoryPointerClass;
+    extern VALUE rbffi_MemoryPointer_NewInstance(long size, long count, bool clear);
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_MEMORYPOINTER_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.o
new file mode 100644
index 0000000..671a79b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MemoryPointer.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.c
new file mode 100644
index 0000000..70efb72
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.c
@@ -0,0 +1,358 @@
+/*
+ * Copyright (c) 2009, 2010 Wayne Meissner
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+#include <sys/param.h>
+#endif
+#include <sys/types.h>
+#ifndef _WIN32
+# include <sys/mman.h>
+#endif
+#include <stdio.h>
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdint.h"
+# include "win32/stdbool.h"
+#endif
+#ifndef _WIN32
+# include <unistd.h>
+#endif
+#include <errno.h>
+#include <ruby.h>
+#if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) && !defined(__WIN32__)
+# include <pthread.h>
+#endif
+
+#include <ffi.h>
+#include "rbffi.h"
+#include "compat.h"
+
+#include "Function.h"
+#include "Types.h"
+#include "Type.h"
+#include "LastError.h"
+#include "Call.h"
+#include "ClosurePool.h"
+#include "MethodHandle.h"
+
+
+#define MAX_METHOD_FIXED_ARITY (6)
+
+#ifndef roundup
+#  define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))
+#endif
+#ifdef _WIN32
+  typedef char* caddr_t;
+#endif
+
+#ifdef USE_RAW
+#  define METHOD_CLOSURE ffi_raw_closure
+#  define METHOD_PARAMS ffi_raw*
+#else
+#  define METHOD_CLOSURE ffi_closure
+#  define METHOD_PARAMS void**
+#endif
+
+
+
+static bool prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize);
+static long trampoline_size(void);
+
+#if defined(__x86_64__) && (defined(__linux__) || defined(__APPLE__))
+# define CUSTOM_TRAMPOLINE 1
+#endif
+
+
+struct MethodHandle {
+    Closure* closure;
+};
+
+static ClosurePool* defaultClosurePool;
+
+
+MethodHandle*
+rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function)
+{
+    MethodHandle* handle;
+    Closure* closure = rbffi_Closure_Alloc(defaultClosurePool);
+    if (closure == NULL) {
+        rb_raise(rb_eNoMemError, "failed to allocate closure from pool");
+        return NULL;
+    }
+
+    handle = xcalloc(1, sizeof(*handle));
+    handle->closure = closure;
+    closure->info = fnInfo;
+    closure->function = function;
+
+    return handle;
+}
+
+void
+rbffi_MethodHandle_Free(MethodHandle* handle)
+{
+    if (handle != NULL) {
+        rbffi_Closure_Free(handle->closure);
+    }
+}
+
+void*
+rbffi_MethodHandle_CodeAddress(MethodHandle* handle)
+{
+    return handle->closure->code;
+}
+
+#ifndef CUSTOM_TRAMPOLINE
+static void attached_method_invoke(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data);
+
+static ffi_type* methodHandleParamTypes[] = {
+    &ffi_type_sint,
+    &ffi_type_pointer,
+    &ffi_type_ulong,
+};
+
+static ffi_cif mh_cif;
+
+static bool
+prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize)
+{
+    ffi_status ffiStatus;
+
+#if defined(USE_RAW)
+    ffiStatus = ffi_prep_raw_closure(code, &mh_cif, attached_method_invoke, closure);
+#else
+    ffiStatus = ffi_prep_closure(code, &mh_cif, attached_method_invoke, closure);
+#endif
+    if (ffiStatus != FFI_OK) {
+        snprintf(errmsg, errmsgsize, "ffi_prep_closure failed.  status=%#x", ffiStatus);
+        return false;
+    }
+
+    return true;
+}
+
+
+static long
+trampoline_size(void)
+{
+    return sizeof(METHOD_CLOSURE);
+}
+
+/*
+ * attached_method_invoke is used functions with more than 6 parameters, or
+ * with struct param or return values
+ */
+static void
+attached_method_invoke(ffi_cif* cif, void* mretval, METHOD_PARAMS parameters, void* user_data)
+{
+    Closure* handle =  (Closure *) user_data;
+    FunctionType* fnInfo = (FunctionType *) handle->info;
+
+#ifdef USE_RAW
+    int argc = parameters[0].sint;
+    VALUE* argv = *(VALUE **) &parameters[1];
+#else
+    int argc = *(int *) parameters[0];
+    VALUE* argv = *(VALUE **) parameters[1];
+#endif
+
+    *(VALUE *) mretval = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo);
+}
+
+#endif
+
+
+
+#if defined(CUSTOM_TRAMPOLINE)
+#if defined(__x86_64__)
+
+static VALUE custom_trampoline(int argc, VALUE* argv, VALUE self, Closure*);
+
+#define TRAMPOLINE_CTX_MAGIC (0xfee1deadcafebabe)
+#define TRAMPOLINE_FUN_MAGIC (0xfeedfacebeeff00d)
+
+/*
+ * This is a hand-coded trampoline to speedup entry from ruby to the FFI translation
+ * layer for x86_64 arches.
+ *
+ * Since a ruby function has exactly 3 arguments, and the first 6 arguments are
+ * passed in registers for x86_64, we can tack on a context pointer by simply
+ * putting a value in %rcx, then jumping to the C trampoline code.
+ *
+ * This results in approx a 30% speedup for x86_64 FFI dispatch
+ */
+__asm__(
+    ".text\n\t"
+    ".globl ffi_trampoline\n\t"
+    ".globl _ffi_trampoline\n\t"
+    "ffi_trampoline:\n\t"
+    "_ffi_trampoline:\n\t"
+    "movabsq $0xfee1deadcafebabe, %rcx\n\t"
+    "movabsq $0xfeedfacebeeff00d, %r11\n\t"
+    "jmpq *%r11\n\t"
+    ".globl ffi_trampoline_end\n\t"
+    "ffi_trampoline_end:\n\t"
+    ".globl _ffi_trampoline_end\n\t"
+    "_ffi_trampoline_end:\n\t"
+);
+
+static VALUE
+custom_trampoline(int argc, VALUE* argv, VALUE self, Closure* handle)
+{
+    FunctionType* fnInfo = (FunctionType *) handle->info;
+    VALUE rbReturnValue;
+
+    RB_GC_GUARD(rbReturnValue) = (*fnInfo->invoke)(argc, argv, handle->function, fnInfo);
+    RB_GC_GUARD(self);
+
+    return rbReturnValue;
+}
+
+#elif defined(__i386__) && 0
+
+static VALUE custom_trampoline(caddr_t args, Closure*);
+#define TRAMPOLINE_CTX_MAGIC (0xfee1dead)
+#define TRAMPOLINE_FUN_MAGIC (0xbeefcafe)
+
+/*
+ * This is a hand-coded trampoline to speed-up entry from ruby to the FFI translation
+ * layer for i386 arches.
+ *
+ * This does not make a discernible difference vs a raw closure, so for now,
+ * it is not enabled.
+ */
+__asm__(
+    ".text\n\t"
+    ".globl ffi_trampoline\n\t"
+    ".globl _ffi_trampoline\n\t"
+    "ffi_trampoline:\n\t"
+    "_ffi_trampoline:\n\t"
+    "subl    $12, %esp\n\t"
+    "leal    16(%esp), %eax\n\t"
+    "movl    %eax, (%esp)\n\t"
+    "movl    $0xfee1dead, 4(%esp)\n\t"
+    "movl    $0xbeefcafe, %eax\n\t"
+    "call    *%eax\n\t"
+    "addl    $12, %esp\n\t"
+    "ret\n\t"
+    ".globl ffi_trampoline_end\n\t"
+    "ffi_trampoline_end:\n\t"
+    ".globl _ffi_trampoline_end\n\t"
+    "_ffi_trampoline_end:\n\t"
+);
+
+static VALUE
+custom_trampoline(caddr_t args, Closure* handle)
+{
+    FunctionType* fnInfo = (FunctionType *) handle->info;
+    return (*fnInfo->invoke)(*(int *) args, *(VALUE **) (args + 4), handle->function, fnInfo);
+}
+
+#endif /* __x86_64__ else __i386__ */
+
+extern void ffi_trampoline(int argc, VALUE* argv, VALUE self);
+extern void ffi_trampoline_end(void);
+static int trampoline_offsets(long *, long *);
+
+static long trampoline_ctx_offset, trampoline_func_offset;
+
+static long
+trampoline_offset(int off, const long value)
+{
+    caddr_t ptr;
+    for (ptr = (caddr_t) &ffi_trampoline + off; ptr < (caddr_t) &ffi_trampoline_end; ++ptr) {
+        if (*(long *) ptr == value) {
+            return ptr - (caddr_t) &ffi_trampoline;
+        }
+    }
+
+    return -1;
+}
+
+static int
+trampoline_offsets(long* ctxOffset, long* fnOffset)
+{
+    *ctxOffset = trampoline_offset(0, TRAMPOLINE_CTX_MAGIC);
+    if (*ctxOffset == -1) {
+        return -1;
+    }
+
+    *fnOffset = trampoline_offset(0, TRAMPOLINE_FUN_MAGIC);
+    if (*fnOffset == -1) {
+        return -1;
+    }
+
+    return 0;
+}
+
+static bool
+prep_trampoline(void* ctx, void* code, Closure* closure, char* errmsg, size_t errmsgsize)
+{
+    caddr_t ptr = (caddr_t) code;
+
+    memcpy(ptr, &ffi_trampoline, trampoline_size());
+    /* Patch the context and function addresses into the stub code */
+    *(intptr_t *)(ptr + trampoline_ctx_offset) = (intptr_t) closure;
+    *(intptr_t *)(ptr + trampoline_func_offset) = (intptr_t) custom_trampoline;
+
+    return true;
+}
+
+static long
+trampoline_size(void)
+{
+    return (caddr_t) &ffi_trampoline_end - (caddr_t) &ffi_trampoline;
+}
+
+#endif /* CUSTOM_TRAMPOLINE */
+
+
+void
+rbffi_MethodHandle_Init(VALUE module)
+{
+#ifndef CUSTOM_TRAMPOLINE
+    ffi_status ffiStatus;
+#endif
+
+    defaultClosurePool = rbffi_ClosurePool_New((int) trampoline_size(), prep_trampoline, NULL);
+
+#if defined(CUSTOM_TRAMPOLINE)
+    if (trampoline_offsets(&trampoline_ctx_offset, &trampoline_func_offset) != 0) {
+        rb_raise(rb_eFatal, "Could not locate offsets in trampoline code");
+    }
+#else
+    ffiStatus = ffi_prep_cif(&mh_cif, FFI_DEFAULT_ABI, 3, &ffi_type_ulong,
+            methodHandleParamTypes);
+    if (ffiStatus != FFI_OK) {
+        rb_raise(rb_eFatal, "ffi_prep_cif failed.  status=%#x", ffiStatus);
+    }
+
+#endif
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.h
new file mode 100644
index 0000000..c3341bf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_METHODHANDLE_H
+#define	RBFFI_METHODHANDLE_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#include <ruby.h>
+#include "Function.h"
+
+    
+typedef struct MethodHandlePool MethodHandlePool;
+typedef struct MethodHandle MethodHandle;
+
+
+MethodHandle* rbffi_MethodHandle_Alloc(FunctionType* fnInfo, void* function);
+void rbffi_MethodHandle_Free(MethodHandle* handle);
+void* rbffi_MethodHandle_CodeAddress(MethodHandle* handle);
+void rbffi_MethodHandle_Init(VALUE module);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_METHODHANDLE_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.o
new file mode 100644
index 0000000..3f5d39f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/MethodHandle.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Platform.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Platform.c
new file mode 100644
index 0000000..1305ad2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Platform.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2008-2010 Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+# include <sys/param.h>
+#endif
+# include <sys/types.h>
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdint.h"
+# include "win32/stdbool.h"
+#endif
+#include <ruby.h>
+#include <ctype.h>
+#include "rbffi_endian.h"
+#include "Platform.h"
+
+#if defined(__GNU__) || defined(__GLIBC__)
+# include <gnu/lib-names.h>
+#endif
+
+static VALUE PlatformModule = Qnil;
+
+/*
+ * Determine the cpu type at compile time - useful for MacOSX where the the
+ * system installed ruby incorrectly reports 'host_cpu' as 'powerpc' when running
+ * on intel.
+ */
+#if defined(__x86_64__) || defined(__x86_64) || defined(__amd64) || defined(_M_X64) || defined(_M_AMD64)
+# define CPU "x86_64"
+
+#elif defined(__i386__) || defined(__i386) || defined(_M_IX86)
+# define CPU "i386"
+
+#elif defined(__ppc64__) || defined(__powerpc64__) || defined(_M_PPC)
+# define CPU "ppc64"
+
+#elif defined(__ppc__) || defined(__powerpc__) || defined(__powerpc)
+# define CPU "ppc"
+
+/* Need to check for __sparcv9 first, because __sparc will be defined either way. */
+#elif defined(__sparcv9__) || defined(__sparcv9)
+# define CPU "sparcv9"
+
+#elif defined(__sparc__) || defined(__sparc)
+# define CPU "sparc"
+
+#elif defined(__arm__) || defined(__arm)
+# define CPU "arm"
+
+#elif defined(__mips__) || defined(__mips)
+# define CPU "mips"
+
+#elif defined(__s390__)
+# define CPU "s390"
+
+#else
+# define CPU "unknown"
+#endif
+
+static void
+export_primitive_types(VALUE module)
+{
+#define S(name, T) do { \
+    typedef struct { char c; T v; } s; \
+    rb_define_const(module, #name "_ALIGN", INT2NUM((sizeof(s) - sizeof(T)) * 8)); \
+    rb_define_const(module, #name "_SIZE", INT2NUM(sizeof(T)* 8)); \
+} while(0)
+    S(INT8, char);
+    S(INT16, short);
+    S(INT32, int);
+    S(INT64, long long);
+    S(LONG, long);
+    S(FLOAT, float);
+    S(DOUBLE, double);
+    S(ADDRESS, void*);
+#undef S
+}
+
+void
+rbffi_Platform_Init(VALUE moduleFFI)
+{
+    PlatformModule = rb_define_module_under(moduleFFI, "Platform");
+    rb_define_const(PlatformModule, "BYTE_ORDER", INT2FIX(BYTE_ORDER));
+    rb_define_const(PlatformModule, "LITTLE_ENDIAN", INT2FIX(LITTLE_ENDIAN));
+    rb_define_const(PlatformModule, "BIG_ENDIAN", INT2FIX(BIG_ENDIAN));
+    rb_define_const(PlatformModule, "CPU", rb_str_new2(CPU));
+#if defined(__GNU__) || defined(__GLIBC__)
+    rb_define_const(PlatformModule, "GNU_LIBC", rb_str_new2(LIBC_SO));
+#endif
+    export_primitive_types(PlatformModule);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Platform.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Platform.h
new file mode 100644
index 0000000..5575e34
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Platform.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2008-2010 Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_PLATFORM_H
+#define	RBFFI_PLATFORM_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+    extern void rbffi_Platform_Init(VALUE moduleFFI);
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_PLATFORM_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Platform.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Platform.o
new file mode 100644
index 0000000..cb66e74
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Platform.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.c
new file mode 100644
index 0000000..1eee790
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.c
@@ -0,0 +1,508 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdint.h"
+# include "win32/stdbool.h"
+#endif
+#include <limits.h>
+#include <ruby.h>
+#include "rbffi.h"
+#include "rbffi_endian.h"
+#include "AbstractMemory.h"
+#include "Pointer.h"
+
+#define POINTER(obj) rbffi_AbstractMemory_Cast((obj), rbffi_PointerClass)
+
+VALUE rbffi_PointerClass = Qnil;
+VALUE rbffi_NullPointerSingleton = Qnil;
+
+static void ptr_release(Pointer* ptr);
+static void ptr_mark(Pointer* ptr);
+
+VALUE
+rbffi_Pointer_NewInstance(void* addr)
+{
+    Pointer* p;
+    VALUE obj;
+
+    if (addr == NULL) {
+        return rbffi_NullPointerSingleton;
+    }
+
+    obj = Data_Make_Struct(rbffi_PointerClass, Pointer, NULL, -1, p);
+    p->memory.address = addr;
+    p->memory.size = LONG_MAX;
+    p->memory.flags = (addr == NULL) ? 0 : (MEM_RD | MEM_WR);
+    p->memory.typeSize = 1;
+    p->rbParent = Qnil;
+
+    return obj;
+}
+
+static VALUE
+ptr_allocate(VALUE klass)
+{
+    Pointer* p;
+    VALUE obj;
+
+    obj = Data_Make_Struct(klass, Pointer, ptr_mark, ptr_release, p);
+    p->rbParent = Qnil;
+    p->memory.flags = MEM_RD | MEM_WR;
+
+    return obj;
+}
+
+/*
+ * @overload initialize(pointer)
+ *  @param [Pointer] pointer another pointer to initialize from
+ *  Create a new pointer from another {Pointer}.
+ * @overload initialize(type, address)
+ *  @param [Type] type type for pointer
+ *  @param [Integer] address base address for pointer
+ *  Create a new pointer from a {Type} and a base address
+ * @return [self]
+ * A new instance of Pointer.
+ */
+static VALUE
+ptr_initialize(int argc, VALUE* argv, VALUE self)
+{
+    Pointer* p;
+    VALUE rbType = Qnil, rbAddress = Qnil;
+    int typeSize = 1;
+
+    Data_Get_Struct(self, Pointer, p);
+
+    switch (rb_scan_args(argc, argv, "11", &rbType, &rbAddress)) {
+        case 1:
+            rbAddress = rbType;
+            typeSize = 1;
+            break;
+        case 2:
+            typeSize = rbffi_type_size(rbType);
+            break;
+        default:
+            rb_raise(rb_eArgError, "Invalid arguments");
+    }
+
+    switch (TYPE(rbAddress)) {
+        case T_FIXNUM:
+        case T_BIGNUM:
+            p->memory.address = (void*) (uintptr_t) NUM2LL(rbAddress);
+            p->memory.size = LONG_MAX;
+            if (p->memory.address == NULL) {
+                p->memory.flags = 0;
+            }
+            break;
+
+        default:
+            if (rb_obj_is_kind_of(rbAddress, rbffi_PointerClass)) {
+                Pointer* orig;
+
+                p->rbParent = rbAddress;
+                Data_Get_Struct(rbAddress, Pointer, orig);
+                p->memory = orig->memory;
+            } else {
+                rb_raise(rb_eTypeError, "wrong argument type, expected Integer or FFI::Pointer");
+            }
+            break;
+    }
+
+    p->memory.typeSize = typeSize;
+
+    return self;
+}
+
+/*
+ * call-seq: ptr.initialize_copy(other)
+ * @param [Pointer] other source for cloning or dupping
+ * @return [self]
+ * @raise {RuntimeError} if +other+ is an unbounded memory area, or is unreadable/unwritable
+ * @raise {NoMemError} if failed to allocate memory for new object
+ * DO NOT CALL THIS METHOD.
+ *
+ * This method is internally used by #dup and #clone. Memory content is copied from +other+.
+ */
+static VALUE
+ptr_initialize_copy(VALUE self, VALUE other)
+{
+    AbstractMemory* src;
+    Pointer* dst;
+    
+    Data_Get_Struct(self, Pointer, dst);
+    src = POINTER(other);
+    if (src->size == LONG_MAX) {
+        rb_raise(rb_eRuntimeError, "cannot duplicate unbounded memory area");
+        return Qnil;
+    }
+    
+    if ((dst->memory.flags & (MEM_RD | MEM_WR)) != (MEM_RD | MEM_WR)) {
+        rb_raise(rb_eRuntimeError, "cannot duplicate unreadable/unwritable memory area");
+        return Qnil;
+    }
+
+    if (dst->storage != NULL) {
+        xfree(dst->storage);
+        dst->storage = NULL;
+    }
+
+    dst->storage = xmalloc(src->size + 7);
+    if (dst->storage == NULL) {
+        rb_raise(rb_eNoMemError, "failed to allocate memory size=%lu bytes", src->size);
+        return Qnil;
+    }
+    
+    dst->allocated = true;
+    dst->autorelease = true;
+    dst->memory.address = (void *) (((uintptr_t) dst->storage + 0x7) & (uintptr_t) ~0x7UL);
+    dst->memory.size = src->size;
+    dst->memory.typeSize = src->typeSize;
+    
+    /* finally, copy the actual memory contents */
+    memcpy(dst->memory.address, src->address, src->size);
+
+    return self;
+}
+
+static VALUE
+slice(VALUE self, long offset, long size)
+{
+    AbstractMemory* ptr;
+    Pointer* p;
+    VALUE retval;
+    
+    Data_Get_Struct(self, AbstractMemory, ptr);
+    checkBounds(ptr, offset, size == LONG_MAX ? 1 : size);
+
+    retval = Data_Make_Struct(rbffi_PointerClass, Pointer, ptr_mark, -1, p);
+
+    p->memory.address = ptr->address + offset;
+    p->memory.size = size;
+    p->memory.flags = ptr->flags;
+    p->memory.typeSize = ptr->typeSize;
+    p->rbParent = self;
+
+    return retval;
+}
+
+/* 
+ * Document-method: +
+ * call-seq: ptr + offset
+ * @param [Numeric] offset
+ * @return [Pointer]
+ * Return a new {Pointer} from an existing pointer and an +offset+.
+ */
+static VALUE
+ptr_plus(VALUE self, VALUE offset)
+{
+    AbstractMemory* ptr;
+    long off = NUM2LONG(offset);
+
+    Data_Get_Struct(self, AbstractMemory, ptr);
+
+    return slice(self, off, ptr->size == LONG_MAX ? LONG_MAX : ptr->size - off);
+}
+
+/*
+ * call-seq: ptr.slice(offset, length)
+ * @param [Numeric] offset
+ * @param [Numeric] length
+ * @return [Pointer]
+ * Return a new {Pointer} from an existing one. This pointer points on same contents 
+ * from +offset+ for a length +length+.
+ */
+static VALUE
+ptr_slice(VALUE self, VALUE rbOffset, VALUE rbLength)
+{
+    return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength));
+}
+
+/*
+ * call-seq: ptr.inspect
+ * @return [String]
+ * Inspect pointer object.
+ */
+static VALUE
+ptr_inspect(VALUE self)
+{
+    char buf[100];
+    Pointer* ptr;
+    
+    Data_Get_Struct(self, Pointer, ptr);
+
+    if (ptr->memory.size != LONG_MAX) {
+        snprintf(buf, sizeof(buf), "#<%s address=%p size=%lu>",
+                rb_obj_classname(self), ptr->memory.address, ptr->memory.size);
+    } else {
+        snprintf(buf, sizeof(buf), "#<%s address=%p>", rb_obj_classname(self), ptr->memory.address);
+    }
+
+    return rb_str_new2(buf);
+}
+
+/*
+ * Document-method: null?
+ * call-seq: ptr.null?
+ * @return [Boolean]
+ * Return +true+ if +self+ is a {NULL} pointer.
+ */
+static VALUE
+ptr_null_p(VALUE self)
+{
+    Pointer* ptr;
+
+    Data_Get_Struct(self, Pointer, ptr);
+
+    return ptr->memory.address == NULL ? Qtrue : Qfalse;
+}
+
+/*
+ * Document-method: ==
+ * call-seq: ptr == other
+ * @param [Pointer] other
+ * Check equality between +self+ and +other+. Equality is tested on {#address}.
+ */
+static VALUE
+ptr_equals(VALUE self, VALUE other)
+{
+    Pointer* ptr;
+    
+    Data_Get_Struct(self, Pointer, ptr);
+
+    if (NIL_P(other)) {
+        return ptr->memory.address == NULL ? Qtrue : Qfalse;
+    }
+
+    return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse;
+}
+
+/*
+ * call-seq: ptr.address
+ * @return [Numeric] pointer's base address
+ * Return +self+'s base address (alias: #to_i).
+ */
+static VALUE
+ptr_address(VALUE self)
+{
+    Pointer* ptr;
+    
+    Data_Get_Struct(self, Pointer, ptr);
+
+    return ULL2NUM((uintptr_t) ptr->memory.address);
+}
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+# define SWAPPED_ORDER BIG_ENDIAN
+#else
+# define SWAPPED_ORDER LITTLE_ENDIAN
+#endif
+
+/*
+ * Get or set +self+'s endianness
+ * @overload order
+ *  @return [:big, :little] endianness of +self+
+ * @overload order(order)
+ *  @param  [Symbol] order endianness to set (+:little+, +:big+ or +:network+). +:big+ and +:network+ 
+ *   are synonymous.
+ *  @return [self]
+ */
+static VALUE
+ptr_order(int argc, VALUE* argv, VALUE self)
+{
+    Pointer* ptr;
+
+    Data_Get_Struct(self, Pointer, ptr);
+    if (argc == 0) {
+        int order = (ptr->memory.flags & MEM_SWAP) == 0 ? BYTE_ORDER : SWAPPED_ORDER;
+        return order == BIG_ENDIAN ? ID2SYM(rb_intern("big")) : ID2SYM(rb_intern("little"));
+    } else {
+        VALUE rbOrder = Qnil;
+        int order = BYTE_ORDER;
+
+        if (rb_scan_args(argc, argv, "1", &rbOrder) < 1) {
+            rb_raise(rb_eArgError, "need byte order");
+        }
+        if (SYMBOL_P(rbOrder)) {
+            ID id = SYM2ID(rbOrder);
+            if (id == rb_intern("little")) {
+                order = LITTLE_ENDIAN;
+
+            } else if (id == rb_intern("big") || id == rb_intern("network")) {
+                order = BIG_ENDIAN;
+            }
+        }
+        if (order != BYTE_ORDER) {
+            Pointer* p2;
+            VALUE retval = slice(self, 0, ptr->memory.size);
+
+            Data_Get_Struct(retval, Pointer, p2);
+            p2->memory.flags |= MEM_SWAP;
+            return retval;
+        }
+
+        return self;
+    }
+}
+
+
+/*
+ * call-seq: ptr.free
+ * @return [self]
+ * Free memory pointed by +self+.
+ */
+static VALUE
+ptr_free(VALUE self)
+{
+    Pointer* ptr;
+
+    Data_Get_Struct(self, Pointer, ptr);
+
+    if (ptr->allocated) {
+        if (ptr->storage != NULL) {
+            xfree(ptr->storage);
+            ptr->storage = NULL;
+        }
+        ptr->allocated = false;
+
+    } else {
+        VALUE caller = rb_funcall(rb_funcall(Qnil, rb_intern("caller"), 0), rb_intern("first"), 0);
+        
+        rb_warn("calling free on non allocated pointer %s from %s", RSTRING_PTR(ptr_inspect(self)), RSTRING_PTR(rb_str_to_str(caller)));
+    }
+
+    return self;
+}
+
+static VALUE
+ptr_type_size(VALUE self)
+{
+    Pointer* ptr;
+
+    Data_Get_Struct(self, Pointer, ptr);
+    
+    return INT2NUM(ptr->memory.typeSize);
+}
+
+/*
+ * call-seq: ptr.autorelease = autorelease
+ * @param [Boolean] autorelease
+ * @return [Boolean] +autorelease+
+ * Set +autorelease+ attribute. See also Autorelease section.
+ */
+static VALUE
+ptr_autorelease(VALUE self, VALUE autorelease)
+{
+    Pointer* ptr;
+
+    Data_Get_Struct(self, Pointer, ptr);
+    ptr->autorelease = autorelease == Qtrue;
+
+    return autorelease;
+}
+
+/*
+ * call-seq: ptr.autorelease?
+ * @return [Boolean]
+ * Get +autorelease+ attribute. See also Autorelease section.
+ */
+static VALUE
+ptr_autorelease_p(VALUE self)
+{
+    Pointer* ptr;
+
+    Data_Get_Struct(self, Pointer, ptr);
+    
+    return ptr->autorelease ? Qtrue : Qfalse;
+}
+
+
+static void
+ptr_release(Pointer* ptr)
+{
+    if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) {
+        xfree(ptr->storage);
+        ptr->storage = NULL;
+    }
+    xfree(ptr);
+}
+
+static void
+ptr_mark(Pointer* ptr)
+{
+    rb_gc_mark(ptr->rbParent);
+}
+
+void
+rbffi_Pointer_Init(VALUE moduleFFI)
+{
+    VALUE rbNullAddress = ULL2NUM(0);
+    VALUE ffi_AbstractMemory =  rbffi_AbstractMemoryClass;
+
+    /*
+     * Document-class: FFI::Pointer < FFI::AbstractMemory
+     * Pointer class is used to manage C pointers with ease. A {Pointer} object is defined by his
+     * {#address} (as a C pointer). It permits additions with an integer for pointer arithmetic.
+     *
+     * ==Autorelease
+     * A pointer object may autorelease his contents when freed (by default). This behaviour may be
+     * changed with {#autorelease=} method.
+     */
+    rbffi_PointerClass = rb_define_class_under(moduleFFI, "Pointer", ffi_AbstractMemory);
+    /*
+     * Document-variable: Pointer
+     */
+    rb_global_variable(&rbffi_PointerClass);
+
+    rb_define_alloc_func(rbffi_PointerClass, ptr_allocate);
+    rb_define_method(rbffi_PointerClass, "initialize", ptr_initialize, -1);
+    rb_define_method(rbffi_PointerClass, "initialize_copy", ptr_initialize_copy, 1);
+    rb_define_method(rbffi_PointerClass, "inspect", ptr_inspect, 0);
+    rb_define_method(rbffi_PointerClass, "to_s", ptr_inspect, 0);
+    rb_define_method(rbffi_PointerClass, "+", ptr_plus, 1);
+    rb_define_method(rbffi_PointerClass, "slice", ptr_slice, 2);
+    rb_define_method(rbffi_PointerClass, "null?", ptr_null_p, 0);
+    rb_define_method(rbffi_PointerClass, "address", ptr_address, 0);
+    rb_define_alias(rbffi_PointerClass, "to_i", "address");
+    rb_define_method(rbffi_PointerClass, "==", ptr_equals, 1);
+    rb_define_method(rbffi_PointerClass, "order", ptr_order, -1);
+    rb_define_method(rbffi_PointerClass, "autorelease=", ptr_autorelease, 1);
+    rb_define_method(rbffi_PointerClass, "autorelease?", ptr_autorelease_p, 0);
+    rb_define_method(rbffi_PointerClass, "free", ptr_free, 0);
+    rb_define_method(rbffi_PointerClass, "type_size", ptr_type_size, 0);
+
+    rbffi_NullPointerSingleton = rb_class_new_instance(1, &rbNullAddress, rbffi_PointerClass);
+    /*
+     * NULL pointer
+     */
+    rb_define_const(rbffi_PointerClass, "NULL", rbffi_NullPointerSingleton);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.h
new file mode 100644
index 0000000..2d86851
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_POINTER_H
+#define	RBFFI_POINTER_H
+
+#ifndef _MSC_VER
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+#endif
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#include "AbstractMemory.h"
+
+extern void rbffi_Pointer_Init(VALUE moduleFFI);
+extern VALUE rbffi_Pointer_NewInstance(void* addr);
+extern VALUE rbffi_PointerClass;
+extern VALUE rbffi_NullPointerSingleton;
+
+typedef struct Pointer {
+    AbstractMemory memory;
+    VALUE rbParent;
+    char* storage; /* start of malloc area */
+    bool autorelease;
+    bool allocated;
+} Pointer;
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_POINTER_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.o
new file mode 100644
index 0000000..9e335e0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Pointer.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Struct.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Struct.c
new file mode 100644
index 0000000..c6428a2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Struct.c
@@ -0,0 +1,829 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ * Copyright (C) 2009 Luc Heinrich <luc@honk-honk.com>
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#include <sys/types.h>
+#ifndef _MSC_VER
+# include <sys/param.h>
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+#include <ruby.h>
+#include "rbffi.h"
+#include "compat.h"
+#include "AbstractMemory.h"
+#include "Pointer.h"
+#include "MemoryPointer.h"
+#include "Function.h"
+#include "Types.h"
+#include "Function.h"
+#include "StructByValue.h"
+#include "ArrayType.h"
+#include "MappedType.h"
+#include "Struct.h"
+
+typedef struct InlineArray_ {
+    VALUE rbMemory;
+    VALUE rbField;
+
+    AbstractMemory* memory;
+    StructField* field;
+    MemoryOp *op;
+    Type* componentType;
+    ArrayType* arrayType;
+    int length;
+} InlineArray;
+
+
+static void struct_mark(Struct *);
+static void struct_free(Struct *);
+static VALUE struct_class_layout(VALUE klass);
+static void struct_malloc(Struct* s);
+static void inline_array_mark(InlineArray *);
+static void store_reference_value(StructField* f, Struct* s, VALUE value);
+
+VALUE rbffi_StructClass = Qnil;
+
+VALUE rbffi_StructInlineArrayClass = Qnil;
+VALUE rbffi_StructLayoutCharArrayClass = Qnil;
+
+static ID id_pointer_ivar = 0, id_layout_ivar = 0;
+static ID id_get = 0, id_put = 0, id_to_ptr = 0, id_to_s = 0, id_layout = 0;
+
+static inline char*
+memory_address(VALUE self)
+{
+    return ((AbstractMemory *)DATA_PTR((self)))->address;
+}
+
+static VALUE
+struct_allocate(VALUE klass)
+{
+    Struct* s;
+    VALUE obj = Data_Make_Struct(klass, Struct, struct_mark, struct_free, s);
+    
+    s->rbPointer = Qnil;
+    s->rbLayout = Qnil;
+
+    return obj;
+}
+
+/*
+ * call-seq: initialize
+ * @overload initialize(pointer, *args)
+ *  @param [AbstractMemory] pointer
+ *  @param [Array] args
+ * @return [self]
+ */
+static VALUE
+struct_initialize(int argc, VALUE* argv, VALUE self)
+{
+    Struct* s;
+    VALUE rbPointer = Qnil, rest = Qnil, klass = CLASS_OF(self);
+    int nargs;
+
+    Data_Get_Struct(self, Struct, s);
+    
+    nargs = rb_scan_args(argc, argv, "01*", &rbPointer, &rest);
+
+    /* Call up into ruby code to adjust the layout */
+    if (nargs > 1) {
+        s->rbLayout = rb_funcall2(CLASS_OF(self), id_layout, (int) RARRAY_LEN(rest), RARRAY_PTR(rest));
+    } else {
+        s->rbLayout = struct_class_layout(klass);
+    }
+
+    if (!rb_obj_is_kind_of(s->rbLayout, rbffi_StructLayoutClass)) {
+        rb_raise(rb_eRuntimeError, "Invalid Struct layout");
+    }
+
+    Data_Get_Struct(s->rbLayout, StructLayout, s->layout);
+    
+    if (rbPointer != Qnil) {
+        s->pointer = MEMORY(rbPointer);
+        s->rbPointer = rbPointer;
+    } else {
+        struct_malloc(s);
+    }
+
+    return self;
+}
+
+/*
+ * call-seq: initialize_copy(other)
+ * @return [nil]
+ * DO NOT CALL THIS METHOD
+ */
+static VALUE
+struct_initialize_copy(VALUE self, VALUE other)
+{
+    Struct* src;
+    Struct* dst;
+    
+    Data_Get_Struct(self, Struct, dst);
+    Data_Get_Struct(other, Struct, src);
+    if (dst == src) {
+        return self;
+    }
+    
+    dst->rbLayout = src->rbLayout;
+    dst->layout = src->layout;
+    
+    /*
+     * A new MemoryPointer instance is allocated here instead of just calling
+     * #dup on rbPointer, since the Pointer may not know its length, or may
+     * be longer than just this struct.
+     */
+    if (src->pointer->address != NULL) {
+        dst->rbPointer = rbffi_MemoryPointer_NewInstance(1, src->layout->size, false);
+        dst->pointer = MEMORY(dst->rbPointer);
+        memcpy(dst->pointer->address, src->pointer->address, src->layout->size);
+    } else {
+        dst->rbPointer = src->rbPointer;
+        dst->pointer = src->pointer;
+    }
+
+    if (src->layout->referenceFieldCount > 0) {
+        dst->rbReferences = ALLOC_N(VALUE, dst->layout->referenceFieldCount);
+        memcpy(dst->rbReferences, src->rbReferences, dst->layout->referenceFieldCount * sizeof(VALUE));
+    }
+        
+    return self;
+}
+
+static VALUE
+struct_class_layout(VALUE klass)
+{
+    VALUE layout;
+    if (!rb_ivar_defined(klass, id_layout_ivar)) {
+        rb_raise(rb_eRuntimeError, "no Struct layout configured for %s", rb_class2name(klass));
+    }
+
+    layout = rb_ivar_get(klass, id_layout_ivar);
+    if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) {
+        rb_raise(rb_eRuntimeError, "invalid Struct layout for %s", rb_class2name(klass));
+    }
+
+    return layout;
+}
+
+static StructLayout*
+struct_layout(VALUE self)
+{
+    Struct* s = (Struct *) DATA_PTR(self);
+    if (s->layout != NULL) {
+        return s->layout;
+    }
+
+    if (s->layout == NULL) {
+        s->rbLayout = struct_class_layout(CLASS_OF(self));
+        Data_Get_Struct(s->rbLayout, StructLayout, s->layout);
+    }
+
+    return s->layout;
+}
+
+static Struct*
+struct_validate(VALUE self)
+{
+    Struct* s;
+    Data_Get_Struct(self, Struct, s);
+
+    if (struct_layout(self) == NULL) {
+        rb_raise(rb_eRuntimeError, "struct layout == null");
+    }
+
+    if (s->pointer == NULL) {
+        struct_malloc(s);
+    }
+
+    return s;
+}
+
+static void
+struct_malloc(Struct* s)
+{
+    if (s->rbPointer == Qnil) {
+        s->rbPointer = rbffi_MemoryPointer_NewInstance(s->layout->size, 1, true);
+
+    } else if (!rb_obj_is_kind_of(s->rbPointer, rbffi_AbstractMemoryClass)) {
+        rb_raise(rb_eRuntimeError, "invalid pointer in struct");
+    }
+
+    s->pointer = (AbstractMemory *) DATA_PTR(s->rbPointer);
+}
+
+static void
+struct_mark(Struct *s)
+{
+    rb_gc_mark(s->rbPointer);
+    rb_gc_mark(s->rbLayout);
+    if (s->rbReferences != NULL) {
+        rb_gc_mark_locations(&s->rbReferences[0], &s->rbReferences[s->layout->referenceFieldCount]);
+    }
+}
+
+static void
+struct_free(Struct* s)
+{
+    xfree(s->rbReferences);
+    xfree(s);
+}
+
+
+static void
+store_reference_value(StructField* f, Struct* s, VALUE value)
+{
+    if (unlikely(f->referenceIndex == -1)) {
+        rb_raise(rb_eRuntimeError, "put_reference_value called for non-reference type");
+        return;
+    }
+    if (s->rbReferences == NULL) {
+        int i;
+        s->rbReferences = ALLOC_N(VALUE, s->layout->referenceFieldCount);
+        for (i = 0; i < s->layout->referenceFieldCount; ++i) {
+            s->rbReferences[i] = Qnil;
+        }
+    }
+
+    s->rbReferences[f->referenceIndex] = value;
+}
+
+
+static VALUE
+struct_field(Struct* s, VALUE fieldName)
+{
+    StructLayout* layout = s->layout;
+    VALUE rbField;
+
+    if (likely(SYMBOL_P(fieldName) && st_lookup(layout->fieldSymbolTable, fieldName, (st_data_t *) &rbField))) {
+        return rbField;
+    }
+
+    // TODO does this ever return anything?
+    rbField = rb_hash_aref(layout->rbFieldMap, fieldName);
+    if (rbField == Qnil) {
+        VALUE str = rb_funcall2(fieldName, id_to_s, 0, NULL);
+        rb_raise(rb_eArgError, "No such field '%s'", StringValuePtr(str));
+    }
+
+    return rbField;
+}
+
+/*
+ * call-seq: struct[field_name]
+ * @param field_name field to access
+ * Acces to a Struct field.
+ */
+static VALUE
+struct_aref(VALUE self, VALUE fieldName)
+{
+    Struct* s;
+    VALUE rbField;
+    StructField* f;
+
+    s = struct_validate(self);
+
+    rbField = struct_field(s, fieldName);
+    f = (StructField *) DATA_PTR(rbField);
+
+    if (f->get != NULL) {
+        return (*f->get)(f, s);
+    
+    } else if (f->memoryOp != NULL) {
+        return (*f->memoryOp->get)(s->pointer, f->offset);
+
+    } else {
+    
+        /* call up to the ruby code to fetch the value */
+        return rb_funcall2(rbField, id_get, 1, &s->rbPointer);
+    }
+}
+
+/*
+ * call-seq: []=(field_name, value)
+ * @param field_name field to access
+ * @param value value to set to +field_name+
+ * @return [value]
+ * Set a field in Struct.
+ */
+static VALUE
+struct_aset(VALUE self, VALUE fieldName, VALUE value)
+{
+    Struct* s;
+    VALUE rbField;
+    StructField* f;
+
+
+    s = struct_validate(self);
+
+    rbField = struct_field(s, fieldName);
+    f = (StructField *) DATA_PTR(rbField);
+    if (f->put != NULL) {
+        (*f->put)(f, s, value);
+
+    } else if (f->memoryOp != NULL) {
+
+        (*f->memoryOp->put)(s->pointer, f->offset, value);
+    
+    } else {
+        /* call up to the ruby code to set the value */
+        VALUE argv[2];
+        argv[0] = s->rbPointer;
+        argv[1] = value;
+        rb_funcall2(rbField, id_put, 2, argv);
+    }
+
+    if (f->referenceRequired) {
+        store_reference_value(f, s, value);
+    }
+    
+    return value;
+}
+
+/*
+ * call-seq: pointer= pointer
+ * @param [AbstractMemory] pointer
+ * @return [self]
+ * Make Struct point to +pointer+.
+ */
+static VALUE
+struct_set_pointer(VALUE self, VALUE pointer)
+{
+    Struct* s;
+    StructLayout* layout;
+    AbstractMemory* memory;
+
+    if (!rb_obj_is_kind_of(pointer, rbffi_AbstractMemoryClass)) {
+        rb_raise(rb_eTypeError, "wrong argument type %s (expected Pointer or Buffer)",
+                rb_obj_classname(pointer));
+        return Qnil;
+    }
+
+    
+    Data_Get_Struct(self, Struct, s);
+    Data_Get_Struct(pointer, AbstractMemory, memory);
+    layout = struct_layout(self);
+
+    if ((int) layout->base.ffiType->size > memory->size) {
+        rb_raise(rb_eArgError, "memory of %ld bytes too small for struct %s (expected at least %ld)",
+                memory->size, rb_obj_classname(self), (long) layout->base.ffiType->size);
+    }
+    
+    s->pointer = MEMORY(pointer);
+    s->rbPointer = pointer;
+    rb_ivar_set(self, id_pointer_ivar, pointer);
+
+    return self;
+}
+
+/*
+ * call-seq: pointer
+ * @return [AbstractMemory]
+ * Get pointer to Struct contents.
+ */
+static VALUE
+struct_get_pointer(VALUE self)
+{
+    Struct* s;
+
+    Data_Get_Struct(self, Struct, s);
+
+    return s->rbPointer;
+}
+
+/*
+ * call-seq: layout= layout
+ * @param [StructLayout] layout
+ * @return [self]
+ * Set the Struct's layout.
+ */
+static VALUE
+struct_set_layout(VALUE self, VALUE layout)
+{
+    Struct* s;
+    Data_Get_Struct(self, Struct, s);
+
+    if (!rb_obj_is_kind_of(layout, rbffi_StructLayoutClass)) {
+        rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)",
+                rb_obj_classname(layout), rb_class2name(rbffi_StructLayoutClass));
+        return Qnil;
+    }
+
+    Data_Get_Struct(layout, StructLayout, s->layout);
+    rb_ivar_set(self, id_layout_ivar, layout);
+
+    return self;
+}
+
+/*
+ * call-seq: layout
+ * @return [StructLayout]
+ * Get the Struct's layout.
+ */
+static VALUE
+struct_get_layout(VALUE self)
+{
+    Struct* s;
+
+    Data_Get_Struct(self, Struct, s);
+
+    return s->rbLayout;
+}
+
+/*
+ * call-seq: null?
+ * @return [Boolean]
+ * Test if Struct's pointer is NULL
+ */
+static VALUE
+struct_null_p(VALUE self)
+{
+    Struct* s;
+
+    Data_Get_Struct(self, Struct, s);
+
+    return s->pointer->address == NULL ? Qtrue : Qfalse;
+}
+
+/*
+ * (see Pointer#order)
+ */
+static VALUE
+struct_order(int argc, VALUE* argv, VALUE self)
+{
+    Struct* s;
+
+    Data_Get_Struct(self, Struct, s);
+    if (argc == 0) {
+        return rb_funcall(s->rbPointer, rb_intern("order"), 0);
+
+    } else {
+        VALUE retval = rb_obj_dup(self);
+        VALUE rbPointer = rb_funcall2(s->rbPointer, rb_intern("order"), argc, argv);
+        struct_set_pointer(retval, rbPointer);
+        
+        return retval;
+    }
+}
+
+static VALUE
+inline_array_allocate(VALUE klass)
+{
+    InlineArray* array;
+    VALUE obj;
+
+    obj = Data_Make_Struct(klass, InlineArray, inline_array_mark, -1, array);
+    array->rbField = Qnil;
+    array->rbMemory = Qnil;
+
+    return obj;
+}
+
+static void
+inline_array_mark(InlineArray* array)
+{
+    rb_gc_mark(array->rbField);
+    rb_gc_mark(array->rbMemory);
+}
+
+/*
+ * Document-method: FFI::Struct::InlineArray#initialize
+ * call-seq: initialize(memory, field)
+ * @param [AbstractMemory] memory
+ * @param [StructField] field
+ * @return [self]
+ */
+static VALUE
+inline_array_initialize(VALUE self, VALUE rbMemory, VALUE rbField)
+{
+    InlineArray* array;
+    
+    Data_Get_Struct(self, InlineArray, array);
+    array->rbMemory = rbMemory;
+    array->rbField = rbField;
+
+    Data_Get_Struct(rbMemory, AbstractMemory, array->memory);
+    Data_Get_Struct(rbField, StructField, array->field);
+    Data_Get_Struct(array->field->rbType, ArrayType, array->arrayType);
+    Data_Get_Struct(array->arrayType->rbComponentType, Type, array->componentType);
+    
+    array->op = get_memory_op(array->componentType);
+    if (array->op == NULL && array->componentType->nativeType == NATIVE_MAPPED) {
+        array->op = get_memory_op(((MappedType *) array->componentType)->type);
+    }
+    
+    array->length = array->arrayType->length;
+
+    return self;
+}
+
+/*
+ * call-seq: size
+ * @return [Numeric]
+ * Get size
+ */
+static VALUE
+inline_array_size(VALUE self)
+{
+    InlineArray* array;
+
+    Data_Get_Struct(self, InlineArray, array);
+
+    return UINT2NUM(((ArrayType *) array->field->type)->length);
+}
+
+static int
+inline_array_offset(InlineArray* array, int index)
+{
+    if (index < 0 || (index >= array->length && array->length > 0)) {
+        rb_raise(rb_eIndexError, "index %d out of bounds", index);
+    }
+
+    return (int) array->field->offset + (index * (int) array->componentType->ffiType->size);
+}
+
+/*
+ * call-seq: [](index)
+ * @param [Numeric] index
+ * @return [Type, Struct]
+ */
+static VALUE
+inline_array_aref(VALUE self, VALUE rbIndex)
+{
+    InlineArray* array;
+
+    Data_Get_Struct(self, InlineArray, array);
+
+    if (array->op != NULL) {
+        VALUE rbNativeValue = array->op->get(array->memory, 
+                inline_array_offset(array, NUM2INT(rbIndex)));
+        if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) {
+            return rb_funcall(((MappedType *) array->componentType)->rbConverter, 
+                    rb_intern("from_native"), 2, rbNativeValue, Qnil);
+        } else {
+            return rbNativeValue; 
+        }
+        
+    } else if (array->componentType->nativeType == NATIVE_STRUCT) {
+        VALUE rbOffset = INT2NUM(inline_array_offset(array, NUM2INT(rbIndex)));
+        VALUE rbLength = INT2NUM(array->componentType->ffiType->size);
+        VALUE rbPointer = rb_funcall(array->rbMemory, rb_intern("slice"), 2, rbOffset, rbLength);
+
+        return rb_class_new_instance(1, &rbPointer, ((StructByValue *) array->componentType)->rbStructClass);
+    } else {
+
+        rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(array->arrayType->rbComponentType));
+        return Qnil;
+    }
+}
+
+/*
+ * call-seq: []=(index, value)
+ * @param [Numeric] index
+ * @param [Type, Struct]
+ * @return [value]
+ */
+static VALUE
+inline_array_aset(VALUE self, VALUE rbIndex, VALUE rbValue)
+{
+    InlineArray* array;
+
+    Data_Get_Struct(self, InlineArray, array);
+
+    if (array->op != NULL) {
+        if (unlikely(array->componentType->nativeType == NATIVE_MAPPED)) {
+            rbValue = rb_funcall(((MappedType *) array->componentType)->rbConverter, 
+                    rb_intern("to_native"), 2, rbValue, Qnil);
+        }
+        array->op->put(array->memory, inline_array_offset(array, NUM2INT(rbIndex)),
+            rbValue);
+        
+    } else if (array->componentType->nativeType == NATIVE_STRUCT) {
+        int offset = inline_array_offset(array, NUM2INT(rbIndex));
+        Struct* s;
+
+        if (!rb_obj_is_kind_of(rbValue, rbffi_StructClass)) {
+            rb_raise(rb_eTypeError, "argument not an instance of struct");
+            return Qnil;
+        }
+
+        checkWrite(array->memory);
+        checkBounds(array->memory, offset, array->componentType->ffiType->size);
+
+        Data_Get_Struct(rbValue, Struct, s);
+        checkRead(s->pointer);
+        checkBounds(s->pointer, 0, array->componentType->ffiType->size);
+
+        memcpy(array->memory->address + offset, s->pointer->address, array->componentType->ffiType->size);
+
+    } else {
+        ArrayType* arrayType;
+        Data_Get_Struct(array->field->rbType, ArrayType, arrayType);
+
+        rb_raise(rb_eArgError, "set not supported for %s", rb_obj_classname(arrayType->rbComponentType));
+        return Qnil;
+    }
+
+    return rbValue;
+}
+
+/*
+ * call-seq: each
+ * Yield block for each element of +self+.
+ */
+static VALUE
+inline_array_each(VALUE self)
+{
+    InlineArray* array;
+    
+    int i;
+
+    Data_Get_Struct(self, InlineArray, array);
+    
+    for (i = 0; i < array->length; ++i) {
+        rb_yield(inline_array_aref(self, INT2FIX(i)));
+    }
+
+    return self;
+}
+
+/*
+ * call-seq: to_a
+ * @return [Array]
+ * Convert +self+ to an array.
+ */
+static VALUE
+inline_array_to_a(VALUE self)
+{
+    InlineArray* array;
+    VALUE obj;
+    int i;
+
+    Data_Get_Struct(self, InlineArray, array);
+    obj = rb_ary_new2(array->length);
+
+    
+    for (i = 0; i < array->length; ++i) {
+        rb_ary_push(obj, inline_array_aref(self, INT2FIX(i)));
+    }
+
+    return obj;
+}
+
+/*
+ * Document-method: FFI::StructLayout::CharArray#to_s
+ * call-seq: to_s
+ * @return [String]
+ * Convert +self+ to a string.
+ */
+static VALUE
+inline_array_to_s(VALUE self)
+{
+    InlineArray* array;
+    VALUE argv[2];
+
+    Data_Get_Struct(self, InlineArray, array);
+ 
+    if (array->componentType->nativeType != NATIVE_INT8 && array->componentType->nativeType != NATIVE_UINT8) {
+        VALUE dummy = Qnil;
+        return rb_call_super(0, &dummy);
+    }
+
+    argv[0] = UINT2NUM(array->field->offset);
+    argv[1] = UINT2NUM(array->length);
+
+    return rb_funcall2(array->rbMemory, rb_intern("get_string"), 2, argv);
+}
+
+/*
+ * call-seq: to_ptr
+ * @return [AbstractMemory]
+ * Get pointer to +self+ content.
+ */
+static VALUE
+inline_array_to_ptr(VALUE self)
+{
+    InlineArray* array;
+    
+    Data_Get_Struct(self, InlineArray, array);
+
+    return rb_funcall(array->rbMemory, rb_intern("slice"), 2,
+        UINT2NUM(array->field->offset), UINT2NUM(array->arrayType->base.ffiType->size));
+}
+
+
+void
+rbffi_Struct_Init(VALUE moduleFFI)
+{
+    VALUE StructClass;
+
+    rbffi_StructLayout_Init(moduleFFI);
+
+    /*
+     * Document-class: FFI::Struct
+     *
+     * A FFI::Struct means to mirror a C struct.
+     *
+     * A Struct is defined as:
+     *  class MyStruct < FFI::Struct
+     *    layout :value1, :int,
+     *           :value2, :double
+     *  end
+     * and is used as:
+     *  my_struct = MyStruct.new
+     *  my_struct[:value1] = 12
+     *
+     * For more information, see http://github.com/ffi/ffi/wiki/Structs
+     */
+    rbffi_StructClass = rb_define_class_under(moduleFFI, "Struct", rb_cObject);
+    StructClass = rbffi_StructClass; // put on a line alone to help RDoc
+    rb_global_variable(&rbffi_StructClass);
+
+    /*
+     * Document-class: FFI::Struct::InlineArray
+     */
+    rbffi_StructInlineArrayClass = rb_define_class_under(rbffi_StructClass, "InlineArray", rb_cObject);
+    rb_global_variable(&rbffi_StructInlineArrayClass);
+
+    /*
+     * Document-class: FFI::StructLayout::CharArray < FFI::Struct::InlineArray
+     */
+    rbffi_StructLayoutCharArrayClass = rb_define_class_under(rbffi_StructLayoutClass, "CharArray", 
+                                                             rbffi_StructInlineArrayClass);
+    rb_global_variable(&rbffi_StructLayoutCharArrayClass);
+
+
+    rb_define_alloc_func(StructClass, struct_allocate);
+    rb_define_method(StructClass, "initialize", struct_initialize, -1);
+    rb_define_method(StructClass, "initialize_copy", struct_initialize_copy, 1);
+    rb_define_method(StructClass, "order", struct_order, -1);
+    
+    rb_define_alias(rb_singleton_class(StructClass), "alloc_in", "new");
+    rb_define_alias(rb_singleton_class(StructClass), "alloc_out", "new");
+    rb_define_alias(rb_singleton_class(StructClass), "alloc_inout", "new");
+    rb_define_alias(rb_singleton_class(StructClass), "new_in", "new");
+    rb_define_alias(rb_singleton_class(StructClass), "new_out", "new");
+    rb_define_alias(rb_singleton_class(StructClass), "new_inout", "new");
+
+    rb_define_method(StructClass, "pointer", struct_get_pointer, 0);
+    rb_define_private_method(StructClass, "pointer=", struct_set_pointer, 1);
+
+    rb_define_method(StructClass, "layout", struct_get_layout, 0);
+    rb_define_private_method(StructClass, "layout=", struct_set_layout, 1);
+
+    rb_define_method(StructClass, "[]", struct_aref, 1);
+    rb_define_method(StructClass, "[]=", struct_aset, 2);
+    rb_define_method(StructClass, "null?", struct_null_p, 0);
+
+    rb_include_module(rbffi_StructInlineArrayClass, rb_mEnumerable);
+    rb_define_alloc_func(rbffi_StructInlineArrayClass, inline_array_allocate);
+    rb_define_method(rbffi_StructInlineArrayClass, "initialize", inline_array_initialize, 2);
+    rb_define_method(rbffi_StructInlineArrayClass, "[]", inline_array_aref, 1);
+    rb_define_method(rbffi_StructInlineArrayClass, "[]=", inline_array_aset, 2);
+    rb_define_method(rbffi_StructInlineArrayClass, "each", inline_array_each, 0);
+    rb_define_method(rbffi_StructInlineArrayClass, "size", inline_array_size, 0);
+    rb_define_method(rbffi_StructInlineArrayClass, "to_a", inline_array_to_a, 0);
+    rb_define_method(rbffi_StructInlineArrayClass, "to_ptr", inline_array_to_ptr, 0);
+
+    rb_define_method(rbffi_StructLayoutCharArrayClass, "to_s", inline_array_to_s, 0);
+    rb_define_alias(rbffi_StructLayoutCharArrayClass, "to_str", "to_s");
+
+    id_pointer_ivar = rb_intern("@pointer");
+    id_layout_ivar = rb_intern("@layout");
+    id_layout = rb_intern("layout");
+    id_get = rb_intern("get");
+    id_put = rb_intern("put");
+    id_to_ptr = rb_intern("to_ptr");
+    id_to_s = rb_intern("to_s");
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Struct.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Struct.h
new file mode 100644
index 0000000..85e8263
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Struct.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_STRUCT_H
+#define	RBFFI_STRUCT_H
+
+#include "extconf.h"
+#include "AbstractMemory.h"
+#include "Type.h"
+#ifdef RUBY_1_9
+#include <ruby/st.h>
+#else
+#include <st.h>
+#endif
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+    extern void rbffi_Struct_Init(VALUE ffiModule);
+    extern void rbffi_StructLayout_Init(VALUE ffiModule);
+    typedef struct StructField_ StructField;
+    typedef struct StructLayout_ StructLayout;
+    typedef struct Struct_ Struct;
+
+    struct StructField_ {
+        Type* type;
+        unsigned int offset;
+
+        int referenceIndex;
+
+        bool referenceRequired;
+        VALUE rbType;
+        VALUE rbName;
+
+        VALUE (*get)(StructField* field, Struct* s);
+        void (*put)(StructField* field, Struct* s, VALUE value);
+
+        MemoryOp* memoryOp;
+    };
+
+    struct StructLayout_ {
+        Type base;
+        StructField** fields;
+        int fieldCount;
+        int size;
+        int align;
+        ffi_type** ffiTypes;
+        struct st_table* fieldSymbolTable;
+
+        /** The number of reference tracking fields in this struct */
+        int referenceFieldCount;
+        
+        VALUE rbFieldNames;
+        VALUE rbFieldMap;
+        VALUE rbFields;
+    };
+
+    struct Struct_ {
+        StructLayout* layout;
+        AbstractMemory* pointer;
+        VALUE* rbReferences;
+
+        VALUE rbLayout;
+        VALUE rbPointer;
+    };
+
+    extern VALUE rbffi_StructClass, rbffi_StructLayoutClass;
+    extern VALUE rbffi_StructLayoutFieldClass, rbffi_StructLayoutFunctionFieldClass;
+    extern VALUE rbffi_StructLayoutArrayFieldClass;
+    extern VALUE rbffi_StructInlineArrayClass;
+    extern VALUE rbffi_StructLayoutCharArrayClass;
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_STRUCT_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Struct.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Struct.o
new file mode 100644
index 0000000..274c442
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Struct.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.c
new file mode 100644
index 0000000..73e5111
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.c
@@ -0,0 +1,190 @@
+/*
+ * Copyright (c) 2010, Wayne Meissner
+ * 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.
+ * * The name of the author or authors may not be used to endorse or promote
+ *   products derived from this software without specific prior written permission.
+ *
+ * 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 OWNER 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.
+ */
+
+#ifndef _MSC_VER
+# include <sys/param.h>
+#endif
+#include <sys/types.h>
+#include <stdio.h>
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+#include <errno.h>
+#include <ruby.h>
+
+#include <ffi.h>
+#include "rbffi.h"
+#include "compat.h"
+
+#include "Pointer.h"
+#include "Struct.h"
+#include "StructByReference.h"
+
+
+#define FFI_ALIGN(v, a)  (((((size_t) (v))-1) | ((a)-1))+1)
+
+static VALUE sbr_allocate(VALUE);
+static VALUE sbr_initialize(VALUE, VALUE);
+static void sbr_mark(StructByReference *);
+
+VALUE rbffi_StructByReferenceClass = Qnil;
+
+static VALUE
+sbr_allocate(VALUE klass)
+{
+    StructByReference* sbr;
+
+    VALUE obj = Data_Make_Struct(klass, StructByReference, sbr_mark, -1, sbr);
+
+    sbr->rbStructClass = Qnil;
+
+    return obj;
+}
+
+/*
+ * call-seq: initialize(struc_class)
+ * @param [Struct] struct_calss
+ * @return [self]
+ * A new instance of StructByReference.
+ */
+static VALUE
+sbr_initialize(VALUE self, VALUE rbStructClass)
+{
+    StructByReference* sbr = NULL;
+    
+    if (!rb_class_inherited_p(rbStructClass, rbffi_StructClass)) {
+        rb_raise(rb_eTypeError, "wrong type (expected subclass of FFI::Struct)");
+    }
+
+    Data_Get_Struct(self, StructByReference, sbr);
+    sbr->rbStructClass = rbStructClass;
+    
+    return self;
+}
+
+static void
+sbr_mark(StructByReference *sbr)
+{
+    rb_gc_mark(sbr->rbStructClass);
+}
+
+
+/*
+ * call-seq: struct_class
+ * @return [Struct]
+ * Get +struct_class+.
+ */
+static VALUE
+sbr_struct_class(VALUE self)
+{
+    StructByReference* sbr;
+
+    Data_Get_Struct(self, StructByReference, sbr);
+
+    return sbr->rbStructClass;
+}
+
+/*
+ * call-seq: native_type
+ * @return [Class]
+ * Always get {FFI::Type}::POINTER.
+ */
+static VALUE
+sbr_native_type(VALUE self)
+{
+    return rb_const_get(rbffi_TypeClass, rb_intern("POINTER"));
+}
+
+/*
+ * call-seq: to_native(value, ctx)
+ * @param [nil, Struct] value
+ * @param [nil] ctx
+ * @return [AbstractMemory] Pointer on +value+.
+ */
+static VALUE
+sbr_to_native(VALUE self, VALUE value, VALUE ctx)
+{
+    StructByReference* sbr;
+    Struct* s;
+
+    if (unlikely(value == Qnil)) {
+        return rbffi_NullPointerSingleton;
+    }
+
+    Data_Get_Struct(self, StructByReference, sbr);
+    if (!rb_obj_is_kind_of(value, sbr->rbStructClass)) {
+        rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)",
+                rb_obj_classname(value),
+                RSTRING_PTR(rb_class_name(sbr->rbStructClass)));
+    }
+
+    Data_Get_Struct(value, Struct, s);
+
+    return s->rbPointer;
+}
+
+/*
+ * call-seq: from_native(value, ctx)
+ * @param [AbstractMemory] value
+ * @param [nil] ctx
+ * @return [Struct]
+ * Create a struct from content of memory +value+.
+ */
+static VALUE
+sbr_from_native(VALUE self, VALUE value, VALUE ctx)
+{
+    StructByReference* sbr;
+
+    Data_Get_Struct(self, StructByReference, sbr);
+
+    return rb_class_new_instance(1, &value, sbr->rbStructClass);
+}
+
+
+void
+rbffi_StructByReference_Init(VALUE moduleFFI)
+{
+    /*
+     * Document-class: FFI::StructByReference
+     * This class includes {FFI::DataConverter} module.
+     */
+    rbffi_StructByReferenceClass = rb_define_class_under(moduleFFI, "StructByReference", rb_cObject);
+    rb_global_variable(&rbffi_StructByReferenceClass);
+    rb_include_module(rbffi_StructByReferenceClass, rb_const_get(moduleFFI, rb_intern("DataConverter")));
+    
+    rb_define_alloc_func(rbffi_StructByReferenceClass, sbr_allocate);
+    rb_define_method(rbffi_StructByReferenceClass, "initialize", sbr_initialize, 1);
+    rb_define_method(rbffi_StructByReferenceClass, "struct_class", sbr_struct_class, 0);
+    rb_define_method(rbffi_StructByReferenceClass, "native_type", sbr_native_type, 0);
+    rb_define_method(rbffi_StructByReferenceClass, "to_native", sbr_to_native, 2);
+    rb_define_method(rbffi_StructByReferenceClass, "from_native", sbr_from_native, 2);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.h
new file mode 100644
index 0000000..cf797af
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ * 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.
+ * * The name of the author or authors may not be used to endorse or promote
+ *   products derived from this software without specific prior written permission.
+ *
+ * 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 OWNER 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.
+ */
+
+#ifndef RBFFI_STRUCTBYREFERENCE_H
+#define	RBFFI_STRUCTBYREFERENCE_H
+
+#include <ruby.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+typedef struct StructByReference_ {
+    VALUE rbStructClass;
+} StructByReference;
+
+void rbffi_StructByReference_Init(VALUE moduleFFI);
+
+extern VALUE rbffi_StructByReferenceClass;
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_STRUCTBYREFERENCE_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.o
new file mode 100644
index 0000000..272edf3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByReference.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.c
new file mode 100644
index 0000000..0d9fb9c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+#include <sys/param.h>
+#endif
+#include <sys/types.h>
+#include <stdio.h>
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+#include <errno.h>
+#include <ruby.h>
+
+#include <ffi.h>
+#include "rbffi.h"
+#include "compat.h"
+
+#include "Type.h"
+#include "StructByValue.h"
+#include "Struct.h"
+
+#define FFI_ALIGN(v, a)  (((((size_t) (v))-1) | ((a)-1))+1)
+
+static VALUE sbv_allocate(VALUE);
+static VALUE sbv_initialize(VALUE, VALUE);
+static void sbv_mark(StructByValue *);
+static void sbv_free(StructByValue *);
+
+VALUE rbffi_StructByValueClass = Qnil;
+
+static VALUE
+sbv_allocate(VALUE klass)
+{
+    StructByValue* sbv;
+
+    VALUE obj = Data_Make_Struct(klass, StructByValue, sbv_mark, sbv_free, sbv);
+
+    sbv->rbStructClass = Qnil;
+    sbv->rbStructLayout = Qnil;
+    sbv->base.nativeType = NATIVE_STRUCT;
+
+    sbv->base.ffiType = xcalloc(1, sizeof(*sbv->base.ffiType));
+    sbv->base.ffiType->size = 0;
+    sbv->base.ffiType->alignment = 1;
+    sbv->base.ffiType->type = FFI_TYPE_STRUCT;
+
+    return obj;
+}
+
+static VALUE
+sbv_initialize(VALUE self, VALUE rbStructClass)
+{
+    StructByValue* sbv = NULL;
+    StructLayout* layout = NULL;
+    VALUE rbLayout = Qnil;
+
+    rbLayout = rb_ivar_get(rbStructClass, rb_intern("@layout"));
+    if (!rb_obj_is_instance_of(rbLayout, rbffi_StructLayoutClass)) {
+        rb_raise(rb_eTypeError, "wrong type in @layout ivar (expected FFI::StructLayout)");
+    }
+
+    Data_Get_Struct(rbLayout, StructLayout, layout);
+    Data_Get_Struct(self, StructByValue, sbv);
+    sbv->rbStructClass = rbStructClass;
+    sbv->rbStructLayout = rbLayout;
+
+    /* We can just use everything from the ffi_type directly */
+    *sbv->base.ffiType = *layout->base.ffiType;
+    
+    return self;
+}
+
+static void
+sbv_mark(StructByValue *sbv)
+{
+    rb_gc_mark(sbv->rbStructClass);
+    rb_gc_mark(sbv->rbStructLayout);
+}
+
+static void
+sbv_free(StructByValue *sbv)
+{
+    xfree(sbv->base.ffiType);
+    xfree(sbv);
+}
+
+
+static VALUE
+sbv_layout(VALUE self)
+{
+    StructByValue* sbv;
+
+    Data_Get_Struct(self, StructByValue, sbv);
+    return sbv->rbStructLayout;
+}
+
+static VALUE
+sbv_struct_class(VALUE self)
+{
+    StructByValue* sbv;
+
+    Data_Get_Struct(self, StructByValue, sbv);
+
+    return sbv->rbStructClass;
+}
+
+void
+rbffi_StructByValue_Init(VALUE moduleFFI)
+{
+    rbffi_StructByValueClass = rb_define_class_under(moduleFFI, "StructByValue", rbffi_TypeClass);
+    rb_global_variable(&rbffi_StructByValueClass);
+    rb_define_const(rbffi_TypeClass, "Struct", rbffi_StructByValueClass);
+
+    rb_define_alloc_func(rbffi_StructByValueClass, sbv_allocate);
+    rb_define_method(rbffi_StructByValueClass, "initialize", sbv_initialize, 1);
+    rb_define_method(rbffi_StructByValueClass, "layout", sbv_layout, 0);
+    rb_define_method(rbffi_StructByValueClass, "struct_class", sbv_struct_class, 0);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.h
new file mode 100644
index 0000000..07b2763
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_STRUCTBYVALUE_H
+#define	RBFFI_STRUCTBYVALUE_H
+
+#include <ruby.h>
+#include "Type.h"
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+typedef struct StructByValue_ {
+    Type base;
+    VALUE rbStructClass;
+    VALUE rbStructLayout;
+} StructByValue;
+
+void rbffi_StructByValue_Init(VALUE moduleFFI);
+
+extern VALUE rbffi_StructByValueClass;
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_STRUCTBYVALUE_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.o
new file mode 100644
index 0000000..54f2306
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructByValue.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.c
new file mode 100644
index 0000000..483e532
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.c
@@ -0,0 +1,698 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#include <sys/types.h>
+
+#ifndef _MSC_VER
+# include <sys/param.h>
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+#include <ruby.h>
+#include "rbffi.h"
+#include "compat.h"
+#include "AbstractMemory.h"
+#include "Pointer.h"
+#include "MemoryPointer.h"
+#include "Function.h"
+#include "Types.h"
+#include "StructByValue.h"
+#include "ArrayType.h"
+#include "Function.h"
+#include "MappedType.h"
+#include "Struct.h"
+
+#define FFI_ALIGN(v, a)  (((((size_t) (v))-1) | ((a)-1))+1)
+
+static void struct_layout_mark(StructLayout *);
+static void struct_layout_free(StructLayout *);
+static void struct_field_mark(StructField* );
+
+VALUE rbffi_StructLayoutFieldClass = Qnil;
+VALUE rbffi_StructLayoutNumberFieldClass = Qnil, rbffi_StructLayoutPointerFieldClass = Qnil;
+VALUE rbffi_StructLayoutStringFieldClass = Qnil;
+VALUE rbffi_StructLayoutFunctionFieldClass = Qnil, rbffi_StructLayoutArrayFieldClass = Qnil;
+
+VALUE rbffi_StructLayoutClass = Qnil;
+
+
+static VALUE
+struct_field_allocate(VALUE klass)
+{
+    StructField* field;
+    VALUE obj;
+
+    obj = Data_Make_Struct(klass, StructField, struct_field_mark, -1, field);
+    field->rbType = Qnil;
+    field->rbName = Qnil;
+
+    return obj;
+}
+
+static void
+struct_field_mark(StructField* f)
+{
+    rb_gc_mark(f->rbType);
+    rb_gc_mark(f->rbName);
+}
+
+/*
+ * call-seq: initialize(name, offset, type)
+ * @param [String,Symbol] name
+ * @param [Fixnum] offset
+ * @param [FFI::Type] type
+ * @return [self]
+ * A new FFI::StructLayout::Field instance.
+ */
+static VALUE
+struct_field_initialize(int argc, VALUE* argv, VALUE self)
+{
+    VALUE rbOffset = Qnil, rbName = Qnil, rbType = Qnil;
+    StructField* field;
+    int nargs;
+
+    Data_Get_Struct(self, StructField, field);
+
+    nargs = rb_scan_args(argc, argv, "3", &rbName, &rbOffset, &rbType);
+
+    if (TYPE(rbName) != T_SYMBOL && TYPE(rbName) != T_STRING) {
+        rb_raise(rb_eTypeError, "wrong argument type %s (expected Symbol/String)",
+                rb_obj_classname(rbName));
+    }
+
+    Check_Type(rbOffset, T_FIXNUM);
+
+    if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) {
+        rb_raise(rb_eTypeError, "wrong argument type %s (expected FFI::Type)",
+                rb_obj_classname(rbType));
+    }
+
+    field->offset = NUM2UINT(rbOffset);
+    field->rbName = (TYPE(rbName) == T_SYMBOL) ? rbName : rb_str_intern(rbName);
+    field->rbType = rbType;
+    Data_Get_Struct(field->rbType, Type, field->type);
+    field->memoryOp = get_memory_op(field->type);
+    field->referenceIndex = -1;
+
+    switch (field->type->nativeType == NATIVE_MAPPED ? ((MappedType *) field->type)->type->nativeType : field->type->nativeType) {
+        case NATIVE_FUNCTION:
+        case NATIVE_CALLBACK:
+        case NATIVE_POINTER:
+            field->referenceRequired = true;
+            break;
+
+        default:
+            field->referenceRequired = (rb_respond_to(self, rb_intern("reference_required?"))
+                    && RTEST(rb_funcall2(self, rb_intern("reference_required?"), 0, NULL)))
+                    || (rb_respond_to(rbType, rb_intern("reference_required?"))
+                        && RTEST(rb_funcall2(rbType, rb_intern("reference_required?"), 0, NULL)));
+            break;
+    }
+    
+    return self;
+}
+
+/*
+ * call-seq: offset
+ * @return [Numeric]
+ * Get the field offset.
+ */
+static VALUE
+struct_field_offset(VALUE self)
+{
+    StructField* field;
+    Data_Get_Struct(self, StructField, field);
+    return UINT2NUM(field->offset);
+}
+
+/*
+ * call-seq: size
+ * @return [Numeric]
+ * Get the field size.
+ */
+static VALUE
+struct_field_size(VALUE self)
+{
+    StructField* field;
+    Data_Get_Struct(self, StructField, field);
+    return UINT2NUM(field->type->ffiType->size);
+}
+
+/*
+ * call-seq: alignment
+ * @return [Numeric]
+ * Get the field alignment.
+ */
+static VALUE
+struct_field_alignment(VALUE self)
+{
+    StructField* field;
+    Data_Get_Struct(self, StructField, field);
+    return UINT2NUM(field->type->ffiType->alignment);
+}
+
+/*
+ * call-seq: type
+ * @return [Type]
+ * Get the field type.
+ */
+static VALUE
+struct_field_type(VALUE self)
+{
+    StructField* field;
+    Data_Get_Struct(self, StructField, field);
+
+    return field->rbType;
+}
+
+/*
+ * call-seq: name
+ * @return [Symbol]
+ * Get the field name.
+ */
+static VALUE
+struct_field_name(VALUE self)
+{
+    StructField* field;
+    Data_Get_Struct(self, StructField, field);
+    return field->rbName;
+}
+
+/*
+ * call-seq: get(pointer)
+ * @param [AbstractMemory] pointer pointer on a {Struct}
+ * @return [Object]
+ * Get an object of type {#type} from memory pointed by +pointer+.
+ */
+static VALUE
+struct_field_get(VALUE self, VALUE pointer)
+{
+    StructField* f;
+
+    Data_Get_Struct(self, StructField, f);
+    if (f->memoryOp == NULL) {
+        rb_raise(rb_eArgError, "get not supported for %s", rb_obj_classname(f->rbType));
+        return Qnil;
+    }
+
+    return (*f->memoryOp->get)(MEMORY(pointer), f->offset);
+}
+
+/*
+ * call-seq: put(pointer, value)
+ * @param [AbstractMemory] pointer pointer on a {Struct}
+ * @param [Object] value this object must be a kind of {#type}
+ * @return [self]
+ * Put an object to memory pointed by +pointer+.
+ */
+static VALUE
+struct_field_put(VALUE self, VALUE pointer, VALUE value)
+{
+    StructField* f;
+    
+    Data_Get_Struct(self, StructField, f);
+    if (f->memoryOp == NULL) {
+        rb_raise(rb_eArgError, "put not supported for %s", rb_obj_classname(f->rbType));
+        return self;
+    }
+
+    (*f->memoryOp->put)(MEMORY(pointer), f->offset, value);
+
+    return self;
+}
+
+/*
+ * call-seq: get(pointer)
+ * @param [AbstractMemory] pointer pointer on a {Struct}
+ * @return [Function]
+ * Get a {Function} from memory pointed by +pointer+.
+ */
+static VALUE
+function_field_get(VALUE self, VALUE pointer)
+{
+    StructField* f;
+    
+    Data_Get_Struct(self, StructField, f);
+
+    return rbffi_Function_NewInstance(f->rbType, (*rbffi_AbstractMemoryOps.pointer->get)(MEMORY(pointer), f->offset));
+}
+
+/*
+ * call-seq: put(pointer, proc)
+ * @param [AbstractMemory] pointer pointer to a {Struct}
+ * @param [Function, Proc] proc
+ * @return [Function]
+ * Set a {Function} to memory pointed by +pointer+ as a function. 
+ *
+ * If a Proc is submitted as +proc+, it is automatically transformed to a {Function}.
+ */
+static VALUE
+function_field_put(VALUE self, VALUE pointer, VALUE proc)
+{
+    StructField* f;
+    VALUE value = Qnil;
+
+    Data_Get_Struct(self, StructField, f);
+
+    if (NIL_P(proc) || rb_obj_is_kind_of(proc, rbffi_FunctionClass)) {
+        value = proc;
+    } else if (rb_obj_is_kind_of(proc, rb_cProc) || rb_respond_to(proc, rb_intern("call"))) {
+        value = rbffi_Function_ForProc(f->rbType, proc);
+    } else {
+        rb_raise(rb_eTypeError, "wrong type (expected Proc or Function)");
+    }
+
+    (*rbffi_AbstractMemoryOps.pointer->put)(MEMORY(pointer), f->offset, value);
+
+    return self;
+}
+
+static inline bool
+isCharArray(ArrayType* arrayType)
+{
+    return arrayType->componentType->nativeType == NATIVE_INT8
+            || arrayType->componentType->nativeType == NATIVE_UINT8;
+}
+
+/*
+ * call-seq: get(pointer)
+ * @param [AbstractMemory] pointer pointer on a {Struct}
+ * @return [FFI::StructLayout::CharArray, FFI::Struct::InlineArray]
+ * Get an array from a {Struct}.
+ */
+static VALUE
+array_field_get(VALUE self, VALUE pointer)
+{
+    StructField* f;
+    ArrayType* array;
+    VALUE argv[2];
+
+    Data_Get_Struct(self, StructField, f);
+    Data_Get_Struct(f->rbType, ArrayType, array);
+
+    argv[0] = pointer;
+    argv[1] = self;
+
+    return rb_class_new_instance(2, argv, isCharArray(array)
+            ? rbffi_StructLayoutCharArrayClass : rbffi_StructInlineArrayClass);
+}
+
+/*
+ * call-seq: put(pointer, value)
+ * @param [AbstractMemory] pointer pointer on a {Struct}
+ * @param [String, Array] value +value+ may be a String only if array's type is a kind of +int8+
+ * @return [value]
+ * Set an array in a {Struct}.
+ */
+static VALUE
+array_field_put(VALUE self, VALUE pointer, VALUE value)
+{
+    StructField* f;
+    ArrayType* array;
+    
+
+    Data_Get_Struct(self, StructField, f);
+    Data_Get_Struct(f->rbType, ArrayType, array);
+    
+    if (isCharArray(array) && rb_obj_is_instance_of(value, rb_cString)) {
+        VALUE argv[2];
+
+        argv[0] = INT2FIX(f->offset);
+        argv[1] = value;
+
+        rb_funcall2(pointer, rb_intern("put_string"), 2, argv);
+
+    } else {
+#ifdef notyet
+        MemoryOp* op;
+        int count = RARRAY_LEN(value);
+        int i;
+        AbstractMemory* memory = MEMORY(pointer);
+
+        if (count > array->length) {
+            rb_raise(rb_eIndexError, "array too large");
+        }
+
+        /* clear the contents in case of a short write */
+        checkWrite(memory);
+        checkBounds(memory, f->offset, f->type->ffiType->size);
+        if (count < array->length) {
+            memset(memory->address + f->offset + (count * array->componentType->ffiType->size),
+                    0, (array->length - count) * array->componentType->ffiType->size);
+        }
+
+        /* now copy each element in */
+        if ((op = get_memory_op(array->componentType)) != NULL) {
+
+            for (i = 0; i < count; ++i) {
+                (*op->put)(memory, f->offset + (i * array->componentType->ffiType->size), rb_ary_entry(value, i));
+            }
+
+        } else if (array->componentType->nativeType == NATIVE_STRUCT) {
+
+            for (i = 0; i < count; ++i) {
+                VALUE entry = rb_ary_entry(value, i);
+                Struct* s;
+
+                if (!rb_obj_is_kind_of(entry, rbffi_StructClass)) {
+                    rb_raise(rb_eTypeError, "array element not an instance of FFI::Struct");
+                    break;
+                }
+
+                Data_Get_Struct(entry, Struct, s);
+                checkRead(s->pointer);
+                checkBounds(s->pointer, 0, array->componentType->ffiType->size);
+
+                memcpy(memory->address + f->offset + (i * array->componentType->ffiType->size),
+                        s->pointer->address, array->componentType->ffiType->size);
+            }
+
+        } else {
+            rb_raise(rb_eNotImpError, "put not supported for arrays of type %s", rb_obj_classname(array->rbComponentType));
+        }
+#else
+        rb_raise(rb_eNotImpError, "cannot set array field");
+#endif
+    }
+
+    return value;
+}
+
+
+static VALUE
+struct_layout_allocate(VALUE klass)
+{
+    StructLayout* layout;
+    VALUE obj;
+
+    obj = Data_Make_Struct(klass, StructLayout, struct_layout_mark, struct_layout_free, layout);
+    layout->rbFieldMap = Qnil;
+    layout->rbFieldNames = Qnil;
+    layout->rbFields = Qnil;
+    layout->fieldSymbolTable = st_init_numtable();
+    layout->base.ffiType = xcalloc(1, sizeof(*layout->base.ffiType));
+    layout->base.ffiType->size = 0;
+    layout->base.ffiType->alignment = 0;
+    layout->base.ffiType->type = FFI_TYPE_STRUCT;
+
+    return obj;
+}
+
+/*
+ * call-seq: initialize(fields, size, align)
+ * @param [Array<StructLayout::Field>] fields
+ * @param [Numeric] size
+ * @param [Numeric] align
+ * @return [self]
+ * A new StructLayout instance.
+ */
+static VALUE
+struct_layout_initialize(VALUE self, VALUE fields, VALUE size, VALUE align)
+{
+    StructLayout* layout;
+    ffi_type* ltype;
+    int i;
+
+    Data_Get_Struct(self, StructLayout, layout);
+    layout->fieldCount = (int) RARRAY_LEN(fields);
+    layout->rbFieldMap = rb_hash_new();
+    layout->rbFieldNames = rb_ary_new2(layout->fieldCount);
+    layout->size = (int) FFI_ALIGN(NUM2INT(size),  NUM2INT(align));
+    layout->align = NUM2INT(align);
+    layout->fields = xcalloc(layout->fieldCount, sizeof(StructField *));
+    layout->ffiTypes = xcalloc(layout->fieldCount + 1, sizeof(ffi_type *));
+    layout->rbFields = rb_ary_new2(layout->fieldCount);
+    layout->referenceFieldCount = 0;
+    layout->base.ffiType->elements = layout->ffiTypes;
+    layout->base.ffiType->size = layout->size;
+    layout->base.ffiType->alignment = layout->align;
+
+    ltype = layout->base.ffiType;
+    for (i = 0; i < (int) layout->fieldCount; ++i) {
+        VALUE rbField = rb_ary_entry(fields, i);
+        VALUE rbName;
+        StructField* field;
+        ffi_type* ftype;
+
+
+        if (!rb_obj_is_kind_of(rbField, rbffi_StructLayoutFieldClass)) {
+            rb_raise(rb_eTypeError, "wrong type for field %d.", i);
+        }
+        rbName = rb_funcall2(rbField, rb_intern("name"), 0, NULL);
+
+        Data_Get_Struct(rbField, StructField, field);
+        layout->fields[i] = field;
+
+        if (field->type == NULL || field->type->ffiType == NULL) {
+            rb_raise(rb_eRuntimeError, "type of field %d not supported", i);
+        }
+
+        ftype = field->type->ffiType;
+        if (ftype->size == 0 && i < ((int) layout->fieldCount - 1)) {
+            rb_raise(rb_eTypeError, "type of field %d has zero size", i);
+        }
+
+        if (field->referenceRequired) {
+            field->referenceIndex = layout->referenceFieldCount++;
+        }
+
+
+        layout->ffiTypes[i] = ftype->size > 0 ? ftype : NULL;
+        st_insert(layout->fieldSymbolTable, rbName, rbField);
+        rb_hash_aset(layout->rbFieldMap, rbName, rbField);
+        rb_ary_push(layout->rbFields, rbField);
+        rb_ary_push(layout->rbFieldNames, rbName);
+    }
+
+    if (ltype->size == 0) {
+        rb_raise(rb_eRuntimeError, "Struct size is zero");
+    }
+
+    return self;
+}
+
+/* 
+ * call-seq: [](field)
+ * @param [Symbol] field
+ * @return [StructLayout::Field]
+ * Get a field from the layout.
+ */
+static VALUE
+struct_layout_union_bang(VALUE self) 
+{
+    const ffi_type *alignment_types[] = { &ffi_type_sint8, &ffi_type_sint16, &ffi_type_sint32, &ffi_type_sint64,
+                                          &ffi_type_float, &ffi_type_double, &ffi_type_longdouble, NULL };
+    StructLayout* layout;
+    ffi_type *t = NULL;
+    int count, i;
+
+    Data_Get_Struct(self, StructLayout, layout);
+
+    for (i = 0; alignment_types[i] != NULL; ++i) {
+        if (alignment_types[i]->alignment == layout->align) {
+            t = (ffi_type *) alignment_types[i];
+            break;
+        }
+    }
+    if (t == NULL) {
+        rb_raise(rb_eRuntimeError, "cannot create libffi union representation for alignment %d", layout->align);
+        return Qnil;
+    }
+
+    count = (int) layout->size / (int) t->size;
+    xfree(layout->ffiTypes);
+    layout->ffiTypes = xcalloc(count + 1, sizeof(ffi_type *));
+    layout->base.ffiType->elements = layout->ffiTypes;
+
+    for (i = 0; i < count; ++i) {
+        layout->ffiTypes[i] = t;
+    }
+
+    return self;
+}
+
+static VALUE
+struct_layout_aref(VALUE self, VALUE field)
+{
+    StructLayout* layout;
+
+    Data_Get_Struct(self, StructLayout, layout);
+
+    return rb_hash_aref(layout->rbFieldMap, field);
+}
+
+/*
+ * call-seq: fields
+ * @return [Array<StructLayout::Field>]
+ * Get fields list.
+ */
+static VALUE
+struct_layout_fields(VALUE self)
+{
+    StructLayout* layout;
+
+    Data_Get_Struct(self, StructLayout, layout);
+
+    return rb_ary_dup(layout->rbFields);
+}
+
+/*
+ * call-seq: members
+ * @return [Array<Symbol>]
+ * Get list of field names.
+ */
+static VALUE
+struct_layout_members(VALUE self)
+{
+    StructLayout* layout;
+
+    Data_Get_Struct(self, StructLayout, layout);
+
+    return rb_ary_dup(layout->rbFieldNames);
+}
+
+/*
+ * call-seq: to_a
+ * @return [Array<StructLayout::Field>]
+ * Get an array of fields.
+ */
+static VALUE
+struct_layout_to_a(VALUE self)
+{
+    StructLayout* layout;
+
+    Data_Get_Struct(self, StructLayout, layout);
+
+    return rb_ary_dup(layout->rbFields);
+}
+
+static void
+struct_layout_mark(StructLayout *layout)
+{
+    rb_gc_mark(layout->rbFieldMap);
+    rb_gc_mark(layout->rbFieldNames);
+    rb_gc_mark(layout->rbFields);
+}
+
+static void
+struct_layout_free(StructLayout *layout)
+{
+    xfree(layout->ffiTypes);
+    xfree(layout->base.ffiType);
+    xfree(layout->fields);
+    st_free_table(layout->fieldSymbolTable);
+    xfree(layout);
+}
+
+
+void
+rbffi_StructLayout_Init(VALUE moduleFFI)
+{
+    VALUE ffi_Type = rbffi_TypeClass;
+
+    /*
+     * Document-class: FFI::StructLayout < FFI::Type
+     *
+     * This class aims at defining a struct layout.
+     */
+    rbffi_StructLayoutClass = rb_define_class_under(moduleFFI, "StructLayout", ffi_Type);
+    rb_global_variable(&rbffi_StructLayoutClass);
+    
+    /*
+     * Document-class: FFI::StructLayout::Field
+     * A field in a {StructLayout}.
+     */
+    rbffi_StructLayoutFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Field", rb_cObject);
+    rb_global_variable(&rbffi_StructLayoutFieldClass);
+
+    /*
+     * Document-class: FFI::StructLayout::Number
+     * A numeric {Field} in a {StructLayout}.
+     */
+    rbffi_StructLayoutNumberFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Number", rbffi_StructLayoutFieldClass);
+    rb_global_variable(&rbffi_StructLayoutNumberFieldClass);
+
+    /*
+     * Document-class: FFI::StructLayout::String
+     * A string {Field} in a {StructLayout}.
+     */
+    rbffi_StructLayoutStringFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "String", rbffi_StructLayoutFieldClass);
+    rb_global_variable(&rbffi_StructLayoutStringFieldClass);
+
+    /*
+     * Document-class: FFI::StructLayout::Pointer
+     * A pointer {Field} in a {StructLayout}.
+     */
+    rbffi_StructLayoutPointerFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Pointer", rbffi_StructLayoutFieldClass);
+    rb_global_variable(&rbffi_StructLayoutPointerFieldClass);
+
+    /*
+     * Document-class: FFI::StructLayout::Function
+     * A function pointer {Field} in a {StructLayout}.
+     */
+    rbffi_StructLayoutFunctionFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Function", rbffi_StructLayoutFieldClass);
+    rb_global_variable(&rbffi_StructLayoutFunctionFieldClass);
+
+    /*
+     * Document-class: FFI::StructLayout::Array
+     * An array {Field} in a {StructLayout}.
+     */
+    rbffi_StructLayoutArrayFieldClass = rb_define_class_under(rbffi_StructLayoutClass, "Array", rbffi_StructLayoutFieldClass);
+    rb_global_variable(&rbffi_StructLayoutArrayFieldClass);
+
+    rb_define_alloc_func(rbffi_StructLayoutFieldClass, struct_field_allocate);
+    rb_define_method(rbffi_StructLayoutFieldClass, "initialize", struct_field_initialize, -1);
+    rb_define_method(rbffi_StructLayoutFieldClass, "offset", struct_field_offset, 0);
+    rb_define_method(rbffi_StructLayoutFieldClass, "size", struct_field_size, 0);
+    rb_define_method(rbffi_StructLayoutFieldClass, "alignment", struct_field_alignment, 0);
+    rb_define_method(rbffi_StructLayoutFieldClass, "name", struct_field_name, 0);
+    rb_define_method(rbffi_StructLayoutFieldClass, "type", struct_field_type, 0);
+    rb_define_method(rbffi_StructLayoutFieldClass, "put", struct_field_put, 2);
+    rb_define_method(rbffi_StructLayoutFieldClass, "get", struct_field_get, 1);
+
+    rb_define_method(rbffi_StructLayoutFunctionFieldClass, "put", function_field_put, 2);
+    rb_define_method(rbffi_StructLayoutFunctionFieldClass, "get", function_field_get, 1);
+
+    rb_define_method(rbffi_StructLayoutArrayFieldClass, "get", array_field_get, 1);
+    rb_define_method(rbffi_StructLayoutArrayFieldClass, "put", array_field_put, 2);
+
+    rb_define_alloc_func(rbffi_StructLayoutClass, struct_layout_allocate);
+    rb_define_method(rbffi_StructLayoutClass, "initialize", struct_layout_initialize, 3);
+    rb_define_method(rbffi_StructLayoutClass, "[]", struct_layout_aref, 1);
+    rb_define_method(rbffi_StructLayoutClass, "fields", struct_layout_fields, 0);
+    rb_define_method(rbffi_StructLayoutClass, "members", struct_layout_members, 0);
+    rb_define_method(rbffi_StructLayoutClass, "to_a", struct_layout_to_a, 0);
+    rb_define_method(rbffi_StructLayoutClass, "__union!", struct_layout_union_bang, 0);
+
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.o
new file mode 100644
index 0000000..dc77eb5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/StructLayout.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Thread.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Thread.c
new file mode 100644
index 0000000..32ae05f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Thread.c
@@ -0,0 +1,352 @@
+/*
+ * Copyright (c) 2010 Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+#include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+
+#if defined(__CYGWIN__) || !defined(_WIN32)
+# include <pthread.h>
+# include <errno.h>
+# include <signal.h>
+# include <unistd.h>
+#else
+# include <winsock2.h>
+# define _WINSOCKAPI_
+# include <windows.h>
+#endif
+#include <fcntl.h>
+#include "Thread.h"
+
+#ifdef _WIN32
+static volatile DWORD frame_thread_key = TLS_OUT_OF_INDEXES;
+#else
+static pthread_key_t thread_data_key;
+struct thread_data {
+    rbffi_frame_t* frame;
+};
+static inline struct thread_data* thread_data_get(void);
+
+#endif
+
+rbffi_frame_t*
+rbffi_frame_current(void)
+{
+#ifdef _WIN32
+    return (rbffi_frame_t *) TlsGetValue(frame_thread_key);
+#else
+    struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key);
+    return td != NULL ? td->frame : NULL;
+#endif
+}
+
+void 
+rbffi_frame_push(rbffi_frame_t* frame)
+{
+    memset(frame, 0, sizeof(*frame));
+    frame->has_gvl = true;
+    frame->exc = Qnil;
+    
+#ifdef _WIN32
+    frame->prev = TlsGetValue(frame_thread_key);
+    TlsSetValue(frame_thread_key, frame);
+#else
+    frame->td = thread_data_get();
+    frame->prev = frame->td->frame;
+    frame->td->frame = frame;
+#endif
+}
+
+void 
+rbffi_frame_pop(rbffi_frame_t* frame)
+{
+#ifdef _WIN32
+    TlsSetValue(frame_thread_key, frame->prev);
+#else
+    frame->td->frame = frame->prev;
+#endif
+}
+
+#if !(defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL))
+
+#if !defined(_WIN32)
+
+struct BlockingThread {
+    pthread_t tid;
+    VALUE (*fn)(void *);
+    void *data;
+    void (*ubf)(void *);
+    void *data2;
+    VALUE retval;
+    int wrfd;
+    int rdfd;
+};
+
+static void*
+rbffi_blocking_thread(void* args)
+{
+    struct BlockingThread* thr = (struct BlockingThread *) args;
+    char c = 1;
+    VALUE retval;
+    
+    retval = (*thr->fn)(thr->data);
+    
+    pthread_testcancel();
+
+    thr->retval = retval;
+    
+    write(thr->wrfd, &c, sizeof(c));
+
+    return NULL;
+}
+
+static VALUE
+wait_for_thread(void *data)
+{
+    struct BlockingThread* thr = (struct BlockingThread *) data;
+    char c;
+    
+    if (read(thr->rdfd, &c, 1) < 1) {
+        rb_thread_wait_fd(thr->rdfd);
+        while (read(thr->rdfd, &c, 1) < 1 && rb_io_wait_readable(thr->rdfd) == Qtrue) {
+            ;
+        }
+    }
+
+    return Qnil;
+}
+
+static VALUE
+cleanup_blocking_thread(void *data, VALUE exc)
+{
+    struct BlockingThread* thr = (struct BlockingThread *) data;
+
+    if (thr->ubf != (void (*)(void *)) -1) {
+        (*thr->ubf)(thr->data2);
+    } else {
+        pthread_kill(thr->tid, SIGVTALRM);
+    }
+
+    return exc;
+}
+
+VALUE
+rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2)
+{
+    struct BlockingThread* thr;
+    int fd[2];
+    VALUE exc;
+    
+    if (pipe(fd) < 0) {
+        rb_raise(rb_eSystemCallError, "pipe(2) failed");
+        return Qnil;
+    }
+    fcntl(fd[0], F_SETFL, fcntl(fd[0], F_GETFL) | O_NONBLOCK);
+
+    thr = ALLOC_N(struct BlockingThread, 1);
+    thr->rdfd = fd[0];
+    thr->wrfd = fd[1];
+    thr->fn = func;
+    thr->data = data1;
+    thr->ubf = ubf;
+    thr->data2 = data2;
+    thr->retval = Qnil;
+
+    if (pthread_create(&thr->tid, NULL, rbffi_blocking_thread, thr) != 0) {
+        close(fd[0]);
+        close(fd[1]);
+        xfree(thr);
+        rb_raise(rb_eSystemCallError, "pipe(2) failed");
+        return Qnil;
+    }
+
+    exc = rb_rescue2(wait_for_thread, (VALUE) thr, cleanup_blocking_thread, (VALUE) thr,
+        rb_eException);
+    
+    pthread_join(thr->tid, NULL);
+    close(fd[1]);
+    close(fd[0]);
+    xfree(thr);
+
+    if (exc != Qnil) {
+        rb_exc_raise(exc);
+    }
+
+    return thr->retval;
+}
+
+#else
+/* win32 implementation */
+
+struct BlockingThread {
+    HANDLE tid;
+    VALUE (*fn)(void *);
+    void *data;
+    void (*ubf)(void *);
+    void *data2;
+    VALUE retval;
+    int wrfd;
+    int rdfd;
+};
+
+static DWORD __stdcall
+rbffi_blocking_thread(LPVOID args)
+{
+    struct BlockingThread* thr = (struct BlockingThread *) args;
+    char c = 1;
+    VALUE retval;
+
+    retval = (*thr->fn)(thr->data);
+    thr->retval = retval;
+
+    write(thr->wrfd, &c, sizeof(c));
+
+    return 0;
+}
+
+static VALUE
+wait_for_thread(void *data)
+{
+    struct BlockingThread* thr = (struct BlockingThread *) data;
+    char c, res;
+    fd_set rfds;
+
+    FD_ZERO(&rfds);
+    FD_SET(thr->rdfd, &rfds);
+    rb_thread_select(thr->rdfd + 1, &rfds, NULL, NULL, NULL);
+    read(thr->rdfd, &c, 1);
+    return Qnil;
+}
+
+static VALUE
+cleanup_blocking_thread(void *data, VALUE exc)
+{
+    struct BlockingThread* thr = (struct BlockingThread *) data;
+
+    if (thr->ubf != (void (*)(void *)) -1) {
+        (*thr->ubf)(thr->data2);
+    } else {
+        TerminateThread(thr->tid, 0);
+    }
+
+    return exc;
+}
+
+VALUE
+rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2)
+{
+    struct BlockingThread* thr;
+    int fd[2];
+    VALUE exc;
+    DWORD state;
+    DWORD res;
+
+    if (_pipe(fd, 1024, O_BINARY) == -1) {
+        rb_raise(rb_eSystemCallError, "_pipe() failed");
+        return Qnil;
+    }
+
+    thr = ALLOC_N(struct BlockingThread, 1);
+    thr->rdfd = fd[0];
+    thr->wrfd = fd[1];
+    thr->fn = func;
+    thr->data = data1;
+    thr->ubf = ubf;
+    thr->data2 = data2;
+    thr->retval = Qnil;
+
+    thr->tid = CreateThread(NULL, 0, rbffi_blocking_thread, thr, 0, NULL);
+    if (!thr->tid) {
+        close(fd[0]);
+        close(fd[1]);
+        xfree(thr);
+        rb_raise(rb_eSystemCallError, "CreateThread() failed");
+        return Qnil;
+    }
+
+    exc = rb_rescue2(wait_for_thread, (VALUE) thr, cleanup_blocking_thread, (VALUE) thr,
+        rb_eException);
+
+    /* The thread should be finished, already. */
+    WaitForSingleObject(thr->tid, INFINITE);
+    CloseHandle(thr->tid);
+    close(fd[1]);
+    close(fd[0]);
+    xfree(thr);
+
+    if (exc != Qnil) {
+        rb_exc_raise(exc);
+    }
+
+    return thr->retval;
+}
+
+#endif /* !_WIN32 */
+
+#endif /* HAVE_RB_THREAD_BLOCKING_REGION */
+
+#ifndef _WIN32
+static struct thread_data* thread_data_init(void);
+
+static inline struct thread_data*
+thread_data_get(void)
+{
+    struct thread_data* td = (struct thread_data *) pthread_getspecific(thread_data_key);
+    return td != NULL ? td : thread_data_init();
+}
+
+static struct thread_data*
+thread_data_init(void)
+{
+    struct thread_data* td = calloc(1, sizeof(struct thread_data));
+
+    pthread_setspecific(thread_data_key, td);
+
+    return td;
+}
+
+static void
+thread_data_free(void *ptr)
+{
+    free(ptr);
+}
+#endif
+
+void
+rbffi_Thread_Init(VALUE moduleFFI)
+{
+#ifdef _WIN32
+    frame_thread_key = TlsAlloc();
+#else
+    pthread_key_create(&thread_data_key, thread_data_free);    
+#endif
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Thread.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Thread.h
new file mode 100644
index 0000000..c51a5a9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Thread.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2010 Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_THREAD_H
+#define	RBFFI_THREAD_H
+
+#ifndef _MSC_VER
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+#include <ruby.h>
+#include "extconf.h"
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+
+#ifdef _WIN32
+# include <windows.h>
+#else
+# include <pthread.h>
+#endif
+
+typedef struct {
+#ifdef _WIN32
+    DWORD id;
+#else
+    pthread_t id;
+#endif
+    bool valid;
+    bool has_gvl;
+    VALUE exc;
+} rbffi_thread_t;
+
+typedef struct rbffi_frame {
+#ifndef _WIN32
+    struct thread_data* td;
+#endif
+    struct rbffi_frame* prev;
+    bool has_gvl;
+    VALUE exc;
+} rbffi_frame_t;
+
+rbffi_frame_t* rbffi_frame_current(void);
+void rbffi_frame_push(rbffi_frame_t* frame);
+void rbffi_frame_pop(rbffi_frame_t* frame);
+
+#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL
+# define rbffi_thread_blocking_region rb_thread_call_without_gvl
+
+#elif defined(HAVE_RB_THREAD_BLOCKING_REGION)
+# define rbffi_thread_blocking_region rb_thread_blocking_region
+
+#else
+
+VALUE rbffi_thread_blocking_region(VALUE (*func)(void *), void *data1, void (*ubf)(void *), void *data2);
+
+#endif
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_THREAD_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Thread.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Thread.o
new file mode 100644
index 0000000..8b8b7ef
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Thread.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Type.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Type.c
new file mode 100644
index 0000000..034482f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Type.c
@@ -0,0 +1,397 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ * 
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+#include <sys/param.h>
+#endif
+
+#include <sys/types.h>
+#include <ruby.h>
+#include <ffi.h>
+#include "rbffi.h"
+#include "compat.h"
+#include "Types.h"
+#include "Type.h"
+
+
+typedef struct BuiltinType_ {
+    Type type;
+    char* name;
+} BuiltinType;
+
+static void builtin_type_free(BuiltinType *);
+
+VALUE rbffi_TypeClass = Qnil;
+
+static VALUE classBuiltinType = Qnil;
+static VALUE moduleNativeType = Qnil;
+static VALUE typeMap = Qnil, sizeMap = Qnil;
+static ID id_find_type = 0, id_type_size = 0, id_size = 0;
+
+static VALUE
+type_allocate(VALUE klass)
+{
+    Type* type;
+    VALUE obj = Data_Make_Struct(klass, Type, NULL, -1, type);
+
+    type->nativeType = -1;
+    type->ffiType = &ffi_type_void;
+    
+    return obj;
+}
+
+/*
+ * Document-method: initialize
+ * call-seq: initialize(value)
+ * @param [Fixnum,Type] value
+ * @return [self]
+ */
+static VALUE
+type_initialize(VALUE self, VALUE value)
+{
+    Type* type;
+    Type* other;
+
+    Data_Get_Struct(self, Type, type);
+
+    if (FIXNUM_P(value)) {
+        type->nativeType = FIX2INT(value);
+    } else if (rb_obj_is_kind_of(value, rbffi_TypeClass)) {
+        Data_Get_Struct(value, Type, other);
+        type->nativeType = other->nativeType;
+        type->ffiType = other->ffiType;
+    } else {
+        rb_raise(rb_eArgError, "wrong type");
+    }
+    
+    return self;
+}
+
+/*
+ * call-seq: type.size
+ * @return [Fixnum]
+ * Return type's size, in bytes.
+ */
+static VALUE
+type_size(VALUE self)
+{
+    Type *type;
+
+    Data_Get_Struct(self, Type, type);
+
+    return INT2FIX(type->ffiType->size);
+}
+
+/*
+ * call-seq: type.alignment
+ * @return [Fixnum]
+ * Get Type alignment.
+ */
+static VALUE
+type_alignment(VALUE self)
+{
+    Type *type;
+
+    Data_Get_Struct(self, Type, type);
+
+    return INT2FIX(type->ffiType->alignment);
+}
+
+/*
+ * call-seq: type.inspect
+ * @return [String]
+ * Inspect {Type} object.
+ */
+static VALUE
+type_inspect(VALUE self)
+{
+    char buf[100];
+    Type *type;
+
+    Data_Get_Struct(self, Type, type);
+
+    snprintf(buf, sizeof(buf), "#<%s:%p size=%d alignment=%d>",
+            rb_obj_classname(self), type, (int) type->ffiType->size, (int) type->ffiType->alignment);
+
+    return rb_str_new2(buf);
+}
+
+static VALUE
+builtin_type_new(VALUE klass, int nativeType, ffi_type* ffiType, const char* name)
+{
+    BuiltinType* type;
+    VALUE obj = Qnil;
+
+    obj = Data_Make_Struct(klass, BuiltinType, NULL, builtin_type_free, type);
+    
+    type->name = strdup(name);
+    type->type.nativeType = nativeType;
+    type->type.ffiType = ffiType;
+
+    return obj;
+}
+
+static void
+builtin_type_free(BuiltinType *type)
+{
+    free(type->name);
+    xfree(type);
+}
+
+/*
+ * call-seq: type.inspect
+ * @return [String]
+ * Inspect {Type::Builtin} object.
+ */
+static VALUE
+builtin_type_inspect(VALUE self)
+{
+    char buf[100];
+    BuiltinType *type;
+
+    Data_Get_Struct(self, BuiltinType, type);
+    snprintf(buf, sizeof(buf), "#<%s:%s size=%d alignment=%d>",
+            rb_obj_classname(self), type->name, (int) type->type.ffiType->size, type->type.ffiType->alignment);
+
+    return rb_str_new2(buf);
+}
+
+int
+rbffi_type_size(VALUE type)
+{
+    int t = TYPE(type);
+    
+    if (t == T_FIXNUM || t == T_BIGNUM) {
+        return NUM2INT(type);
+    
+    } else if (t == T_SYMBOL) {
+        /*
+         * Try looking up directly in the type and size maps
+         */
+        VALUE nType;
+        if ((nType = rb_hash_lookup(typeMap, type)) != Qnil) {
+            if (rb_obj_is_kind_of(nType, rbffi_TypeClass)) {
+                Type* type;
+                Data_Get_Struct(nType, Type, type);
+                return (int) type->ffiType->size;
+            
+            } else if (rb_respond_to(nType, id_size)) {
+                return NUM2INT(rb_funcall2(nType, id_size, 0, NULL));
+            }
+        }
+
+        /* Not found - call up to the ruby version to resolve */
+        return NUM2INT(rb_funcall2(rbffi_FFIModule, id_type_size, 1, &type));
+    
+    } else {
+        return NUM2INT(rb_funcall2(type, id_size, 0, NULL));
+    }
+}
+
+VALUE
+rbffi_Type_Lookup(VALUE name)
+{
+    int t = TYPE(name);
+    if (t == T_SYMBOL || t == T_STRING) {
+        /*
+         * Try looking up directly in the type Map
+         */
+        VALUE nType;
+        if ((nType = rb_hash_lookup(typeMap, name)) != Qnil && rb_obj_is_kind_of(nType, rbffi_TypeClass)) {
+            return nType;
+        }
+    } else if (rb_obj_is_kind_of(name, rbffi_TypeClass)) {
+    
+        return name;
+    }
+
+    /* Nothing found - let caller handle raising exceptions */
+    return Qnil;
+}
+
+/**
+ * rbffi_Type_Find() is like rbffi_Type_Lookup, but an error is raised if the
+ * type is not found.
+ */
+VALUE
+rbffi_Type_Find(VALUE name)
+{
+    VALUE rbType = rbffi_Type_Lookup(name);
+
+    if (!RTEST(rbType)) {
+        VALUE s = rb_inspect(name);
+        rb_raise(rb_eTypeError, "invalid type, %s", RSTRING_PTR(s));
+        RB_GC_GUARD(s);
+    }
+
+    return rbType;
+}
+
+void
+rbffi_Type_Init(VALUE moduleFFI)
+{
+    /*
+     * Document-class: FFI::Type
+     * This class manages C types.
+     *
+     * It embbed {FFI::Type::Builtin} objects as constants (for names,
+     * see {FFI::NativeType}).
+     */
+    rbffi_TypeClass = rb_define_class_under(moduleFFI, "Type", rb_cObject);
+
+    /*
+     * Document-constant: FFI::TypeDefs
+     */
+    rb_define_const(moduleFFI, "TypeDefs", typeMap = rb_hash_new());
+    rb_define_const(moduleFFI, "SizeTypes", sizeMap = rb_hash_new());
+    rb_global_variable(&typeMap);
+    rb_global_variable(&sizeMap);
+    id_find_type = rb_intern("find_type");
+    id_type_size = rb_intern("type_size");
+    id_size = rb_intern("size");
+
+    /*
+     * Document-class: FFI::Type::Builtin
+     * Class for Built-in types.
+     */
+    classBuiltinType = rb_define_class_under(rbffi_TypeClass, "Builtin", rbffi_TypeClass);
+    /*
+     * Document-module: FFI::NativeType
+     * This module defines constants for native (C) types.
+     *
+     * ==Native type constants
+     * Native types are defined by constants :
+     * * INT8, SCHAR, CHAR
+     * * UINT8, UCHAR
+     * * INT16, SHORT, SSHORT
+     * * UINT16, USHORT
+     * * INT32,, INT, SINT
+     * * UINT32, UINT
+     * * INT64, LONG_LONG, SLONG_LONG
+     * * UINT64, ULONG_LONG
+     * * LONG, SLONG
+     * * ULONG
+     * * FLOAT32, FLOAT
+     * * FLOAT64, DOUBLE
+     * * POINTER
+     * * CALLBACK
+     * * FUNCTION
+     * * CHAR_ARRAY
+     * * BOOL
+     * * STRING (immutable string, nul terminated)
+     * * STRUCT (struct-b-value param or result)
+     * * ARRAY (array type definition)
+     * * MAPPED (custom native type)
+     * For function return type only :
+     * * VOID
+     * For function argument type only :
+     * * BUFFER_IN
+     * * BUFFER_OUT
+     * * VARARGS (function takes a variable number of arguments)
+     *
+     * All these constants are exported to {FFI} module prefixed with "TYPE_". 
+     * They are objets from {FFI::Type::Builtin} class.
+     */
+    moduleNativeType = rb_define_module_under(moduleFFI, "NativeType");
+
+    /*
+     * Document-global: FFI::Type
+     */
+    rb_global_variable(&rbffi_TypeClass);
+    rb_global_variable(&classBuiltinType);
+    rb_global_variable(&moduleNativeType);
+
+    rb_define_alloc_func(rbffi_TypeClass, type_allocate);
+    rb_define_method(rbffi_TypeClass, "initialize", type_initialize, 1);
+    rb_define_method(rbffi_TypeClass, "size", type_size, 0);
+    rb_define_method(rbffi_TypeClass, "alignment", type_alignment, 0);
+    rb_define_method(rbffi_TypeClass, "inspect", type_inspect, 0);
+
+    /* Make Type::Builtin non-allocatable */
+    rb_undef_method(CLASS_OF(classBuiltinType), "new");
+    rb_define_method(classBuiltinType, "inspect", builtin_type_inspect, 0);
+    
+    rb_global_variable(&rbffi_TypeClass);
+    rb_global_variable(&classBuiltinType);
+
+    /* Define all the builtin types */
+    #define T(x, ffiType) do { \
+        VALUE t = Qnil; \
+        rb_define_const(rbffi_TypeClass, #x, t = builtin_type_new(classBuiltinType, NATIVE_##x, ffiType, #x)); \
+        rb_define_const(moduleNativeType, #x, t); \
+        rb_define_const(moduleFFI, "TYPE_" #x, t); \
+    } while(0)
+
+    #define A(old_type, new_type) do { \
+        VALUE t = rb_const_get(rbffi_TypeClass, rb_intern(#old_type)); \
+        rb_const_set(rbffi_TypeClass, rb_intern(#new_type), t); \
+    } while(0)
+
+    /*
+     * Document-constant: FFI::Type::Builtin::VOID
+     */
+    T(VOID, &ffi_type_void);
+    T(INT8, &ffi_type_sint8);
+    A(INT8, SCHAR);
+    A(INT8, CHAR);
+    T(UINT8, &ffi_type_uint8);
+    A(UINT8, UCHAR);
+
+    T(INT16, &ffi_type_sint16);
+    A(INT16, SHORT);
+    A(INT16, SSHORT);
+    T(UINT16, &ffi_type_uint16);
+    A(UINT16, USHORT);
+    T(INT32, &ffi_type_sint32);
+    A(INT32, INT);
+    A(INT32, SINT);
+    T(UINT32, &ffi_type_uint32);
+    A(UINT32, UINT);
+    T(INT64, &ffi_type_sint64);
+    A(INT64, LONG_LONG);
+    A(INT64, SLONG_LONG);
+    T(UINT64, &ffi_type_uint64);
+    A(UINT64, ULONG_LONG);
+    T(LONG, &ffi_type_slong);
+    A(LONG, SLONG);
+    T(ULONG, &ffi_type_ulong);
+    T(FLOAT32, &ffi_type_float);
+    A(FLOAT32, FLOAT);
+    T(FLOAT64, &ffi_type_double);
+    A(FLOAT64, DOUBLE);
+    T(LONGDOUBLE, &ffi_type_longdouble);
+    T(POINTER, &ffi_type_pointer);
+    T(STRING, &ffi_type_pointer);
+    T(BUFFER_IN, &ffi_type_pointer);
+    T(BUFFER_OUT, &ffi_type_pointer);
+    T(BUFFER_INOUT, &ffi_type_pointer);
+    T(BOOL, &ffi_type_uchar);
+    T(VARARGS, &ffi_type_void);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Type.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Type.h
new file mode 100644
index 0000000..d5522ee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Type.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ * Copyright (C) 2009 Luc Heinrich <luc@honk-honk.com>
+ *
+ * This file is part of ruby-ffi.
+ *
+ * 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.
+ * * Neither the name of the Evan Phoenix nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * 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 OWNER 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.
+ *
+ */
+
+#ifndef RBFFI_TYPE_H
+#define	RBFFI_TYPE_H
+
+#include <ruby.h>
+#include <ffi.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+typedef struct Type_ Type;
+
+#include "Types.h"
+    
+struct Type_ {
+    NativeType nativeType;
+    ffi_type* ffiType;
+};
+
+extern VALUE rbffi_TypeClass;
+extern VALUE rbffi_Type_Lookup(VALUE type);
+extern VALUE rbffi_Type_Find(VALUE type);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_TYPE_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Type.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Type.o
new file mode 100644
index 0000000..17b557f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Type.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Types.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Types.c
new file mode 100644
index 0000000..bccf894
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Types.c
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2009, Wayne Meissner
+ * Copyright (c) 2009, Luc Heinrich
+ * Copyright (c) 2009, Aman Gupta.
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#include <ruby.h>
+#include "Pointer.h"
+#include "rbffi.h"
+#include "Function.h"
+#include "StructByValue.h"
+#include "Types.h"
+#include "Struct.h"
+#include "MappedType.h"
+#include "MemoryPointer.h"
+#include "LongDouble.h"
+
+static ID id_from_native = 0;
+
+
+VALUE
+rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr)
+{
+    switch (type->nativeType) {
+        case NATIVE_VOID:
+            return Qnil;
+        case NATIVE_INT8:
+          return INT2NUM((signed char) *(ffi_sarg *) ptr);
+        case NATIVE_INT16:
+          return INT2NUM((signed short) *(ffi_sarg *) ptr);
+        case NATIVE_INT32:
+          return INT2NUM((signed int) *(ffi_sarg *) ptr);
+        case NATIVE_LONG:
+            return LONG2NUM((signed long) *(ffi_sarg *) ptr);
+        case NATIVE_INT64:
+            return LL2NUM(*(signed long long *) ptr);
+
+        case NATIVE_UINT8:
+          return UINT2NUM((unsigned char) *(ffi_arg *) ptr);
+        case NATIVE_UINT16:
+          return UINT2NUM((unsigned short) *(ffi_arg *) ptr);
+        case NATIVE_UINT32:
+          return UINT2NUM((unsigned int) *(ffi_arg *) ptr);
+        case NATIVE_ULONG:
+            return ULONG2NUM((unsigned long) *(ffi_arg *) ptr);
+        case NATIVE_UINT64:
+            return ULL2NUM(*(unsigned long long *) ptr);
+
+        case NATIVE_FLOAT32:
+            return rb_float_new(*(float *) ptr);
+        case NATIVE_FLOAT64:
+            return rb_float_new(*(double *) ptr);
+
+        case NATIVE_LONGDOUBLE:
+	  return rbffi_longdouble_new(*(long double *) ptr);
+
+        case NATIVE_STRING:
+            return (*(void **) ptr != NULL) ? rb_tainted_str_new2(*(char **) ptr) : Qnil;
+        case NATIVE_POINTER:
+            return rbffi_Pointer_NewInstance(*(void **) ptr);
+        case NATIVE_BOOL:
+            return ((unsigned char) *(ffi_arg *) ptr) ? Qtrue : Qfalse;
+        
+        case NATIVE_FUNCTION:
+        case NATIVE_CALLBACK: {
+            return *(void **) ptr != NULL 
+                    ? rbffi_Function_NewInstance(rbType, rbffi_Pointer_NewInstance(*(void **) ptr))
+                    : Qnil;
+        }
+
+        case NATIVE_STRUCT: {
+            StructByValue* sbv = (StructByValue *)type;
+            AbstractMemory* mem;
+            VALUE rbMemory = rbffi_MemoryPointer_NewInstance(1, sbv->base.ffiType->size, false);
+
+            Data_Get_Struct(rbMemory, AbstractMemory, mem);
+            memcpy(mem->address, ptr, sbv->base.ffiType->size);
+            RB_GC_GUARD(rbMemory);
+            RB_GC_GUARD(rbType);
+
+            return rb_class_new_instance(1, &rbMemory, sbv->rbStructClass);
+        }
+
+        case NATIVE_MAPPED: {
+            /*
+             * For mapped types, first convert to the real native type, then upcall to
+             * ruby to convert to the expected return type
+             */
+            MappedType* m = (MappedType *) type;
+            VALUE values[2], rbReturnValue;
+
+            values[0] = rbffi_NativeValue_ToRuby(m->type, m->rbType, ptr);
+            values[1] = Qnil;
+            
+
+            rbReturnValue = rb_funcall2(m->rbConverter, id_from_native, 2, values);
+            RB_GC_GUARD(values[0]);
+            RB_GC_GUARD(rbType);
+            
+            return rbReturnValue;
+        }
+    
+        default:
+            rb_raise(rb_eRuntimeError, "Unknown type: %d", type->nativeType);
+            return Qnil;
+    }
+}
+
+void
+rbffi_Types_Init(VALUE moduleFFI)
+{
+    id_from_native = rb_intern("from_native");
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Types.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Types.h
new file mode 100644
index 0000000..0d4806f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Types.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_TYPES_H
+#define	RBFFI_TYPES_H
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+    NATIVE_VOID,
+    NATIVE_INT8,
+    NATIVE_UINT8,
+    NATIVE_INT16,
+    NATIVE_UINT16,
+    NATIVE_INT32,
+    NATIVE_UINT32,
+    NATIVE_INT64,
+    NATIVE_UINT64,
+    NATIVE_LONG,
+    NATIVE_ULONG,
+    NATIVE_FLOAT32,
+    NATIVE_FLOAT64,
+    NATIVE_LONGDOUBLE,
+    NATIVE_POINTER,
+    NATIVE_CALLBACK,
+    NATIVE_FUNCTION,
+    NATIVE_BUFFER_IN,
+    NATIVE_BUFFER_OUT,
+    NATIVE_BUFFER_INOUT,
+    NATIVE_CHAR_ARRAY,
+    NATIVE_BOOL,
+    
+    /** An immutable string.  Nul terminated, but only copies in to the native function */
+    NATIVE_STRING,
+    
+    /** The function takes a variable number of arguments */
+    NATIVE_VARARGS,
+    
+    /** Struct-by-value param or result */
+    NATIVE_STRUCT,
+
+    /** An array type definition */
+    NATIVE_ARRAY,
+
+    /** Custom native type */
+    NATIVE_MAPPED,
+} NativeType;
+
+#include <ffi.h>
+#include "Type.h"
+
+VALUE rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr);
+void rbffi_Types_Init(VALUE moduleFFI);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_TYPES_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Types.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Types.o
new file mode 100644
index 0000000..804357f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Types.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Variadic.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Variadic.c
new file mode 100644
index 0000000..877ffab
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Variadic.c
@@ -0,0 +1,304 @@
+/*
+ * Copyright (c) 2008-2010 Wayne Meissner
+ * Copyright (C) 2009 Andrea Fazzi <andrea.fazzi@alcacoop.it>
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef _MSC_VER
+#include <sys/param.h>
+#endif
+#include <sys/types.h>
+
+#include <stdio.h>
+#ifndef _MSC_VER
+# include <stdint.h>
+# include <stdbool.h>
+#else
+# include "win32/stdbool.h"
+# include "win32/stdint.h"
+#endif
+#include <ruby.h>
+
+#include <ffi.h>
+#include "rbffi.h"
+#include "compat.h"
+
+#include "AbstractMemory.h"
+#include "Pointer.h"
+#include "Types.h"
+#include "Type.h"
+#include "LastError.h"
+#include "MethodHandle.h"
+#include "Call.h"
+#include "Thread.h"
+
+typedef struct VariadicInvoker_ {
+    VALUE rbAddress;
+    VALUE rbReturnType;
+    VALUE rbEnums;
+
+    Type* returnType;
+    ffi_abi abi;
+    void* function;
+    int paramCount;
+    bool blocking;
+} VariadicInvoker;
+
+
+static VALUE variadic_allocate(VALUE klass);
+static VALUE variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes,
+        VALUE rbReturnType, VALUE options);
+static void variadic_mark(VariadicInvoker *);
+
+static VALUE classVariadicInvoker = Qnil;
+
+
+static VALUE
+variadic_allocate(VALUE klass)
+{
+    VariadicInvoker *invoker;
+    VALUE obj = Data_Make_Struct(klass, VariadicInvoker, variadic_mark, -1, invoker);
+
+    invoker->rbAddress = Qnil;
+    invoker->rbEnums = Qnil;
+    invoker->rbReturnType = Qnil;
+    invoker->blocking = false;
+
+    return obj;
+}
+
+static void
+variadic_mark(VariadicInvoker *invoker)
+{
+    rb_gc_mark(invoker->rbEnums);
+    rb_gc_mark(invoker->rbAddress);
+    rb_gc_mark(invoker->rbReturnType);
+}
+
+static VALUE
+variadic_initialize(VALUE self, VALUE rbFunction, VALUE rbParameterTypes, VALUE rbReturnType, VALUE options)
+{
+    VariadicInvoker* invoker = NULL;
+    VALUE retval = Qnil;
+    VALUE convention = Qnil;
+    VALUE fixed = Qnil;
+#if defined(X86_WIN32)
+    VALUE rbConventionStr;
+#endif
+    int i;
+
+    Check_Type(options, T_HASH);
+    convention = rb_hash_aref(options, ID2SYM(rb_intern("convention")));
+
+    Data_Get_Struct(self, VariadicInvoker, invoker);
+    invoker->rbEnums = rb_hash_aref(options, ID2SYM(rb_intern("enums")));
+    invoker->rbAddress = rbFunction;
+    invoker->function = rbffi_AbstractMemory_Cast(rbFunction, rbffi_PointerClass)->address;
+    invoker->blocking = RTEST(rb_hash_aref(options, ID2SYM(rb_intern("blocking"))));
+
+#if defined(X86_WIN32)
+    rbConventionStr = rb_funcall2(convention, rb_intern("to_s"), 0, NULL);
+    invoker->abi = (RTEST(convention) && strcmp(StringValueCStr(rbConventionStr), "stdcall") == 0)
+            ? FFI_STDCALL : FFI_DEFAULT_ABI;
+#else
+    invoker->abi = FFI_DEFAULT_ABI;
+#endif
+
+    invoker->rbReturnType = rbffi_Type_Lookup(rbReturnType);
+    if (!RTEST(invoker->rbReturnType)) {
+        VALUE typeName = rb_funcall2(rbReturnType, rb_intern("inspect"), 0, NULL);
+        rb_raise(rb_eTypeError, "Invalid return type (%s)", RSTRING_PTR(typeName));
+    }
+
+    Data_Get_Struct(rbReturnType, Type, invoker->returnType);
+
+    invoker->paramCount = -1;
+
+    fixed = rb_ary_new2(RARRAY_LEN(rbParameterTypes) - 1);
+    for (i = 0; i < RARRAY_LEN(rbParameterTypes); ++i) {
+        VALUE entry = rb_ary_entry(rbParameterTypes, i);
+        VALUE rbType = rbffi_Type_Lookup(entry);
+        Type* type;
+
+        if (!RTEST(rbType)) {
+            VALUE typeName = rb_funcall2(entry, rb_intern("inspect"), 0, NULL);
+            rb_raise(rb_eTypeError, "Invalid parameter type (%s)", RSTRING_PTR(typeName));
+        }
+        Data_Get_Struct(rbType, Type, type);
+        if (type->nativeType != NATIVE_VARARGS) {
+            rb_ary_push(fixed, entry);
+        }
+    }
+    /*
+     * @fixed and @type_map are used by the parameter mangling ruby code
+     */
+    rb_iv_set(self, "@fixed", fixed);
+    rb_iv_set(self, "@type_map", rb_hash_aref(options, ID2SYM(rb_intern("type_map"))));
+
+    return retval;
+}
+
+static VALUE
+variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
+{
+    VariadicInvoker* invoker;
+    FFIStorage* params;
+    void* retval;
+    ffi_cif cif;
+    void** ffiValues;
+    ffi_type** ffiParamTypes;
+    ffi_type* ffiReturnType;
+    Type** paramTypes;
+    VALUE* argv;
+    int paramCount = 0, fixedCount = 0, i;
+    ffi_status ffiStatus;
+    rbffi_frame_t frame = { 0 };
+
+    Check_Type(parameterTypes, T_ARRAY);
+    Check_Type(parameterValues, T_ARRAY);
+
+    Data_Get_Struct(self, VariadicInvoker, invoker);
+    paramCount = (int) RARRAY_LEN(parameterTypes);
+    paramTypes = ALLOCA_N(Type *, paramCount);
+    ffiParamTypes = ALLOCA_N(ffi_type *, paramCount);
+    params = ALLOCA_N(FFIStorage, paramCount);
+    ffiValues = ALLOCA_N(void*, paramCount);
+    argv = ALLOCA_N(VALUE, paramCount);
+    retval = alloca(MAX(invoker->returnType->ffiType->size, FFI_SIZEOF_ARG));
+
+    for (i = 0; i < paramCount; ++i) {
+        VALUE rbType = rb_ary_entry(parameterTypes, i);
+        
+        if (!rb_obj_is_kind_of(rbType, rbffi_TypeClass)) {
+            rb_raise(rb_eTypeError, "wrong type.  Expected (FFI::Type)");
+        }
+        Data_Get_Struct(rbType, Type, paramTypes[i]);
+
+        switch (paramTypes[i]->nativeType) {
+            case NATIVE_INT8:
+            case NATIVE_INT16:
+            case NATIVE_INT32:
+                rbType = rb_const_get(rbffi_TypeClass, rb_intern("INT32"));
+                Data_Get_Struct(rbType, Type, paramTypes[i]);
+                break;
+            case NATIVE_UINT8:
+            case NATIVE_UINT16:
+            case NATIVE_UINT32:
+                rbType = rb_const_get(rbffi_TypeClass, rb_intern("UINT32"));
+                Data_Get_Struct(rbType, Type, paramTypes[i]);
+                break;
+            
+            case NATIVE_FLOAT32:
+                rbType = rb_const_get(rbffi_TypeClass, rb_intern("DOUBLE"));
+                Data_Get_Struct(rbType, Type, paramTypes[i]);
+                break;
+
+            default:
+                break;
+        }
+        
+        
+        ffiParamTypes[i] = paramTypes[i]->ffiType;
+        if (ffiParamTypes[i] == NULL) {
+            rb_raise(rb_eArgError, "Invalid parameter type #%x", paramTypes[i]->nativeType);
+        }
+        argv[i] = rb_ary_entry(parameterValues, i);
+    }
+
+    ffiReturnType = invoker->returnType->ffiType;
+    if (ffiReturnType == NULL) {
+        rb_raise(rb_eArgError, "Invalid return type");
+    }
+
+    /*Get the number of fixed args from @fixed array*/
+    fixedCount = RARRAY_LEN(rb_iv_get(self, "@fixed"));
+
+#ifdef HAVE_FFI_PREP_CIF_VAR
+    ffiStatus = ffi_prep_cif_var(&cif, invoker->abi, fixedCount, paramCount, ffiReturnType, ffiParamTypes);
+#else
+    ffiStatus = ffi_prep_cif(&cif, invoker->abi, paramCount, ffiReturnType, ffiParamTypes);
+#endif
+    switch (ffiStatus) {
+        case FFI_BAD_ABI:
+            rb_raise(rb_eArgError, "Invalid ABI specified");
+        case FFI_BAD_TYPEDEF:
+            rb_raise(rb_eArgError, "Invalid argument type specified");
+        case FFI_OK:
+            break;
+        default:
+            rb_raise(rb_eArgError, "Unknown FFI error");
+    }
+
+    rbffi_SetupCallParams(paramCount, argv, -1, paramTypes, params,
+        ffiValues, NULL, 0, invoker->rbEnums);
+    
+    rbffi_frame_push(&frame);
+#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL
+    /* In Call.c, blocking: true is supported on older ruby variants
+     * without rb_thread_call_without_gvl by allocating on the heap instead
+     * of the stack. Since this functionality is being added later,
+     * we’re skipping support for old rubies here. */
+    if(unlikely(invoker->blocking)) {
+        rbffi_blocking_call_t* bc;
+        bc = ALLOCA_N(rbffi_blocking_call_t, 1);
+        bc->retval = retval;
+        bc->function = invoker->function;
+        bc->ffiValues = ffiValues;
+        bc->params = params;
+        bc->frame = &frame;
+        bc->cif = cif;
+
+        rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0);
+    } else {
+        ffi_call(&cif, FFI_FN(invoker->function), retval, ffiValues);
+    }
+#else
+    ffi_call(&cif, FFI_FN(invoker->function), retval, ffiValues);
+#endif
+    rbffi_frame_pop(&frame);
+    
+    rbffi_save_errno();
+    
+    if (RTEST(frame.exc) && frame.exc != Qnil) {
+        rb_exc_raise(frame.exc);
+    }
+
+    return rbffi_NativeValue_ToRuby(invoker->returnType, invoker->rbReturnType, retval);
+}
+
+
+void
+rbffi_Variadic_Init(VALUE moduleFFI)
+{
+    classVariadicInvoker = rb_define_class_under(moduleFFI, "VariadicInvoker", rb_cObject);
+    rb_global_variable(&classVariadicInvoker);
+
+    rb_define_alloc_func(classVariadicInvoker, variadic_allocate);
+
+    rb_define_method(classVariadicInvoker, "initialize", variadic_initialize, 4);
+    rb_define_method(classVariadicInvoker, "invoke", variadic_invoke, 2);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Variadic.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Variadic.o
new file mode 100644
index 0000000..d69e077
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/Variadic.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/compat.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/compat.h
new file mode 100644
index 0000000..a4dfc08
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/compat.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_COMPAT_H
+#define RBFFI_COMPAT_H
+
+#include <ruby.h>
+
+#ifndef RARRAY_LEN
+#  define RARRAY_LEN(ary) RARRAY(ary)->len
+#endif
+
+#ifndef RARRAY_PTR
+#  define RARRAY_PTR(ary) RARRAY(ary)->ptr
+#endif
+
+#ifndef RSTRING_LEN
+#  define RSTRING_LEN(s) RSTRING(s)->len
+#endif
+
+#ifndef RSTRING_PTR
+#  define RSTRING_PTR(s) RSTRING(s)->ptr
+#endif
+
+#ifndef NUM2ULL
+#  define NUM2ULL(x) rb_num2ull((VALUE)x)
+#endif
+
+#ifndef roundup
+#  define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))
+#endif
+
+#ifdef __GNUC__
+#  define likely(x) __builtin_expect((x), 1)
+#  define unlikely(x) __builtin_expect((x), 0)
+#else
+#  define likely(x) (x)
+#  define unlikely(x) (x)
+#endif
+
+#ifndef MAX
+#  define MAX(a, b) ((a) < (b) ? (b) : (a))
+#endif
+#ifndef MIN
+#  define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+#ifndef RB_GC_GUARD
+#  define RB_GC_GUARD(x) (x)
+#endif
+
+#endif /* RBFFI_COMPAT_H */
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/extconf.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/extconf.h
new file mode 100644
index 0000000..0089a2a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/extconf.h
@@ -0,0 +1,7 @@
+#ifndef EXTCONF_H
+#define EXTCONF_H
+#define HAVE_FFI_PREP_CLOSURE 1
+#define HAVE_RB_THREAD_CALL_WITH_GVL 1
+#define HAVE_RB_THREAD_CALL_WITHOUT_GVL 1
+#define RUBY_1_9 1
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/extconf.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/extconf.rb
new file mode 100644
index 0000000..d444b6b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/extconf.rb
@@ -0,0 +1,66 @@
+#!/usr/bin/env ruby
+
+if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
+  require 'mkmf'
+  require 'rbconfig'
+  dir_config("ffi_c")
+
+  # recent versions of ruby add restrictive ansi and warning flags on a whim - kill them all
+  $warnflags = ''
+  $CFLAGS.gsub!(/[\s+]-ansi/, '')
+  $CFLAGS.gsub!(/[\s+]-std=[^\s]+/, '')
+  # solaris 10 needs -c99 for <stdbool.h>
+  $CFLAGS << " -std=c99" if RbConfig::CONFIG['host_os'] =~ /solaris(!?2\.11)/
+  
+  if ENV['RUBY_CC_VERSION'].nil? && (pkg_config("libffi") ||
+     have_header("ffi.h") ||
+     find_header("ffi.h", "/usr/local/include", "/usr/include/ffi"))
+
+    # We need at least ffi_call and ffi_prep_closure
+    libffi_ok = have_library("ffi", "ffi_call", [ "ffi.h" ]) ||
+                have_library("libffi", "ffi_call", [ "ffi.h" ])
+    libffi_ok &&= have_func("ffi_prep_closure")
+
+    # Check if the raw api is available.
+    $defs << "-DHAVE_RAW_API" if have_func("ffi_raw_call") && have_func("ffi_prep_raw_closure")
+  end
+
+  have_header('shlwapi.h')
+  have_func('rb_thread_blocking_region')
+  have_func('rb_thread_call_with_gvl')
+  have_func('rb_thread_call_without_gvl')
+  have_func('ffi_prep_cif_var')
+  
+  $defs << "-DHAVE_EXTCONF_H" if $defs.empty? # needed so create_header works
+  $defs << "-DUSE_INTERNAL_LIBFFI" unless libffi_ok
+  $defs << "-DRUBY_1_9" if RUBY_VERSION >= "1.9.0"
+  $defs << "-DFFI_BUILDING" if RbConfig::CONFIG['host_os'] =~ /mswin/ # for compatibility with newer libffi
+
+  create_header
+  
+  $LOCAL_LIBS << " ./libffi/.libs/libffi_convenience.lib" if !libffi_ok && RbConfig::CONFIG['host_os'] =~ /mswin/
+
+  create_makefile("ffi_c")
+  unless libffi_ok
+    File.open("Makefile", "a") do |mf|
+      mf.puts "LIBFFI_HOST=--host=#{RbConfig::CONFIG['host_alias']}" if RbConfig::CONFIG.has_key?("host_alias")
+      if RbConfig::CONFIG['host_os'].downcase =~ /darwin/
+        mf.puts "include ${srcdir}/libffi.darwin.mk"
+      elsif RbConfig::CONFIG['host_os'].downcase =~ /bsd/
+        mf.puts '.include "${srcdir}/libffi.bsd.mk"'
+      elsif RbConfig::CONFIG['host_os'].downcase =~ /mswin64/
+        mf.puts '!include $(srcdir)/libffi.vc64.mk'
+      elsif RbConfig::CONFIG['host_os'].downcase =~ /mswin32/
+        mf.puts '!include $(srcdir)/libffi.vc.mk'
+      else
+        mf.puts "include ${srcdir}/libffi.mk"
+      end
+    end
+  end
+  
+else
+  File.open("Makefile", "w") do |mf|
+    mf.puts "# Dummy makefile for non-mri rubies"
+    mf.puts "all install::\n"
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ffi.c
new file mode 100644
index 0000000..ea9a058
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ffi.c
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ * Copyright (C) 2009 Luc Heinrich <luc@honk-honk.com>
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <ruby.h>
+
+#include <ffi.h>
+
+#include "rbffi.h"
+#include "AbstractMemory.h"
+#include "Pointer.h"
+#include "MemoryPointer.h"
+#include "Struct.h"
+#include "StructByValue.h"
+#include "StructByReference.h"
+#include "DynamicLibrary.h"
+#include "Platform.h"
+#include "Types.h"
+#include "LastError.h"
+#include "Function.h"
+#include "ClosurePool.h"
+#include "MethodHandle.h"
+#include "Call.h"
+#include "ArrayType.h"
+#include "MappedType.h"
+
+void Init_ffi_c(void);
+
+VALUE rbffi_FFIModule = Qnil;
+
+static VALUE moduleFFI = Qnil;
+
+void
+Init_ffi_c(void) 
+{
+    /* 
+     * Document-module: FFI
+     *
+     * This module embbed type constants from {FFI::NativeType}.
+     */
+    rbffi_FFIModule = moduleFFI = rb_define_module("FFI");
+    rb_global_variable(&rbffi_FFIModule);
+
+    rbffi_Thread_Init(rbffi_FFIModule);
+    
+    /* FFI::Type needs to be initialized before most other classes */
+    rbffi_Type_Init(moduleFFI);
+
+    rbffi_DataConverter_Init(moduleFFI);
+
+    rbffi_ArrayType_Init(moduleFFI);
+    rbffi_LastError_Init(moduleFFI);
+    rbffi_Call_Init(moduleFFI);
+    rbffi_ClosurePool_Init(moduleFFI);
+    rbffi_MethodHandle_Init(moduleFFI);
+    rbffi_Platform_Init(moduleFFI);
+    rbffi_AbstractMemory_Init(moduleFFI);
+    rbffi_Pointer_Init(moduleFFI);
+    rbffi_Function_Init(moduleFFI);
+    rbffi_MemoryPointer_Init(moduleFFI);
+    rbffi_Buffer_Init(moduleFFI);
+    rbffi_StructByValue_Init(moduleFFI);
+    rbffi_StructByReference_Init(moduleFFI);
+    rbffi_Struct_Init(moduleFFI);
+    rbffi_DynamicLibrary_Init(moduleFFI);
+    rbffi_Variadic_Init(moduleFFI);
+    rbffi_Types_Init(moduleFFI);
+    rbffi_MappedType_Init(moduleFFI);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ffi.o b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ffi.o
new file mode 100644
index 0000000..82d0c40
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ffi.o
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ffi_c.bundle b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ffi_c.bundle
new file mode 100755
index 0000000..70cea7e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/ffi_c.bundle
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.bsd.mk b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.bsd.mk
new file mode 100644
index 0000000..16ec6b5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.bsd.mk
@@ -0,0 +1,34 @@
+# -*- makefile -*-
+#
+# Makefile for BSD systems
+#
+
+INCFLAGS += -I${LIBFFI_BUILD_DIR}/include
+LOCAL_LIBS += ${LIBFFI} -lpthread
+
+LIBFFI_CFLAGS = ${FFI_MMAP_EXEC} -pthread
+LIBFFI_BUILD_DIR = ${.CURDIR}/libffi-${arch}
+
+.if ${srcdir} == "."
+  LIBFFI_SRC_DIR := ${.CURDIR}/libffi
+.else
+  LIBFFI_SRC_DIR := ${srcdir}/libffi
+.endif
+
+
+LIBFFI = ${LIBFFI_BUILD_DIR}/.libs/libffi_convenience.a
+LIBFFI_CONFIGURE = ${LIBFFI_SRC_DIR}/configure --disable-static \
+	--with-pic=yes --disable-dependency-tracking
+
+$(OBJS):	${LIBFFI}
+
+$(LIBFFI):		
+	@mkdir -p ${LIBFFI_BUILD_DIR}
+	@if [ ! -f ${LIBFFI_BUILD_DIR}/Makefile ]; then \
+	    echo "Configuring libffi"; \
+	    cd ${LIBFFI_BUILD_DIR} && \
+		/usr/bin/env CC="${CC}" LD="${LD}" CFLAGS="${LIBFFI_CFLAGS}" GREP_OPTIONS="" \
+		/bin/sh ${LIBFFI_CONFIGURE} ${LIBFFI_HOST} > /dev/null; \
+	fi
+	@cd ${LIBFFI_BUILD_DIR} && ${MAKE}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.darwin.mk b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.darwin.mk
new file mode 100644
index 0000000..f68badd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.darwin.mk
@@ -0,0 +1,95 @@
+# -*- makefile -*-
+
+include ${srcdir}/libffi.gnu.mk
+
+CCACHE := $(shell type -p ccache)
+BUILD_DIR := $(shell pwd)
+
+INCFLAGS += -I"$(BUILD_DIR)"
+
+# Work out which arches we need to compile the lib for
+ARCHES := 
+ARCHFLAGS ?= $(filter -arch %, $(CFLAGS))
+
+ifneq ($(findstring -arch ppc,$(ARCHFLAGS)),)
+  ARCHES += ppc
+endif
+
+ifneq ($(findstring -arch i386,$(ARCHFLAGS)),)
+  ARCHES += i386
+endif
+
+ifneq ($(findstring -arch x86_64,$(ARCHFLAGS)),)
+  ARCHES += x86_64
+endif
+
+ifeq ($(strip $(ARCHES)),)
+LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch)
+# Just build the one (default) architecture
+$(LIBFFI):		
+	@mkdir -p "$(LIBFFI_BUILD_DIR)" "$(@D)"
+	@if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \
+	    echo "Configuring libffi"; \
+	    cd "$(LIBFFI_BUILD_DIR)" && \
+		/usr/bin/env CC="$(CC)" LD="$(LD)" CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \
+		/bin/sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \
+	fi
+	cd "$(LIBFFI_BUILD_DIR)" && $(MAKE)
+
+else
+LIBTARGETS = $(foreach arch,$(ARCHES),"$(BUILD_DIR)"/libffi-$(arch)/.libs/libffi_convenience.a)
+
+# Build a fat binary and assemble
+build_ffi = \
+	mkdir -p "$(BUILD_DIR)"/libffi-$(1); \
+	(if [ ! -f "$(BUILD_DIR)"/libffi-$(1)/Makefile ]; then \
+	    echo "Configuring libffi for $(1)"; \
+	    cd "$(BUILD_DIR)"/libffi-$(1) && \
+	      env CC="$(CCACHE) $(CC)" CFLAGS="-arch $(1) $(LIBFFI_CFLAGS)" LDFLAGS="-arch $(1)" \
+		$(LIBFFI_CONFIGURE) --host=$(1)-apple-darwin > /dev/null; \
+	fi); \
+	env MACOSX_DEPLOYMENT_TARGET=10.4 $(MAKE) -C "$(BUILD_DIR)"/libffi-$(1)
+
+target_ffi = "$(BUILD_DIR)"/libffi-$(1)/.libs/libffi_convenience.a:; $(call build_ffi,$(1))
+
+# Work out which arches we need to compile the lib for
+ifneq ($(findstring ppc,$(ARCHES)),)
+  $(call target_ffi,ppc)
+endif
+
+ifneq ($(findstring i386,$(ARCHES)),)
+  $(call target_ffi,i386)
+endif
+
+ifneq ($(findstring x86_64,$(ARCHES)),)
+  $(call target_ffi,x86_64)
+endif
+
+
+$(LIBFFI):	$(LIBTARGETS)
+	# Assemble into a FAT (x86_64, i386, ppc) library
+	@mkdir -p "$(@D)"
+	/usr/bin/libtool -static -o $@ \
+	    $(foreach arch, $(ARCHES),"$(BUILD_DIR)"/libffi-$(arch)/.libs/libffi_convenience.a)
+	@mkdir -p "$(LIBFFI_BUILD_DIR)"/include
+	$(RM) "$(LIBFFI_BUILD_DIR)"/include/ffi.h
+	@( \
+		printf "#if defined(__i386__)\n"; \
+		printf "#include \"libffi-i386/include/ffi.h\"\n"; \
+		printf "#elif defined(__x86_64__)\n"; \
+		printf "#include \"libffi-x86_64/include/ffi.h\"\n";\
+		printf "#elif defined(__ppc__)\n"; \
+		printf "#include \"libffi-ppc/include/ffi.h\"\n";\
+		printf "#endif\n";\
+	) > "$(LIBFFI_BUILD_DIR)"/include/ffi.h
+	@( \
+		printf "#if defined(__i386__)\n"; \
+		printf "#include \"libffi-i386/include/ffitarget.h\"\n"; \
+		printf "#elif defined(__x86_64__)\n"; \
+		printf "#include \"libffi-x86_64/include/ffitarget.h\"\n";\
+		printf "#elif defined(__ppc__)\n"; \
+		printf "#include \"libffi-ppc/include/ffitarget.h\"\n";\
+		printf "#endif\n";\
+	) > "$(LIBFFI_BUILD_DIR)"/include/ffitarget.h
+
+endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.gnu.mk b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.gnu.mk
new file mode 100644
index 0000000..2af7a75
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.gnu.mk
@@ -0,0 +1,31 @@
+# -*- makefile -*-
+#
+#  Common definitions for all systems that use GNU make
+#
+
+
+# Tack the extra deps onto the autogenerated variables
+INCFLAGS += -I"$(LIBFFI_BUILD_DIR)"/include
+LOCAL_LIBS += $(LIBFFI)
+BUILD_DIR = $(shell pwd)
+LIBFFI_CFLAGS = $(FFI_MMAP_EXEC)
+LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch)
+
+ifeq ($(srcdir),.)
+  LIBFFI_SRC_DIR := $(shell pwd)/libffi
+else ifeq ($(srcdir),..)
+  LIBFFI_SRC_DIR := $(shell pwd)/../libffi
+else
+  LIBFFI_SRC_DIR := $(realpath $(srcdir)/libffi)
+endif
+
+LIBFFI = "$(LIBFFI_BUILD_DIR)"/.libs/libffi_convenience.a
+LIBFFI_CONFIGURE = "$(LIBFFI_SRC_DIR)"/configure --disable-static \
+	--with-pic=yes --disable-dependency-tracking
+
+$(OBJS):	$(LIBFFI)
+
+#
+# libffi.mk or libffi.darwin.mk contains rules for building the actual library
+#
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.mk b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.mk
new file mode 100644
index 0000000..85c15c5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.mk
@@ -0,0 +1,13 @@
+# -*- makefile -*-
+
+include ${srcdir}/libffi.gnu.mk
+
+$(LIBFFI):		
+	@mkdir -p "$(LIBFFI_BUILD_DIR)" "$@(D)"
+	@if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \
+	    echo "Configuring libffi"; \
+	    cd "$(LIBFFI_BUILD_DIR)" && \
+		/usr/bin/env CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \
+		/bin/sh $(LIBFFI_CONFIGURE) $(LIBFFI_HOST) > /dev/null; \
+	fi
+	$(MAKE) -C "$(LIBFFI_BUILD_DIR)"
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc.mk b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc.mk
new file mode 100644
index 0000000..c62e55f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc.mk
@@ -0,0 +1,26 @@
+# -*- makefile -*-
+#
+# Makefile for msvc
+#
+
+# Tack the extra deps onto the autogenerated variables
+INCFLAGS = $(INCFLAGS) -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86
+LOCAL_LIBS = $(LOCAL_LIBS) $(LIBFFI)
+BUILD_DIR = $(MAKEDIR)
+LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi
+
+!IF "$(srcdir)" == "."
+LIBFFI_SRC_DIR = $(MAKEDIR)/libffi
+!ELSE
+LIBFFI_SRC_DIR = $(srcdir)/libffi
+!ENDIF
+
+LIBFFI = $(LIBFFI_BUILD_DIR)/.libs/libffi_convenience.lib
+
+$(OBJS):	$(LIBFFI)
+
+$(LIBFFI):		
+	@$(MAKEDIRS) $(LIBFFI_BUILD_DIR)
+	@cd $(LIBFFI_BUILD_DIR) && $(MAKE) -f Makefile.vc
+	
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc64.mk b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc64.mk
new file mode 100644
index 0000000..9582948
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi.vc64.mk
@@ -0,0 +1,26 @@
+# -*- makefile -*-
+#
+# Makefile for msvc
+#
+
+# Tack the extra deps onto the autogenerated variables
+INCFLAGS = $(INCFLAGS) -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86
+LOCAL_LIBS = $(LOCAL_LIBS) $(LIBFFI)
+BUILD_DIR = $(MAKEDIR)
+LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi
+
+!IF "$(srcdir)" == "."
+LIBFFI_SRC_DIR = $(MAKEDIR)/libffi
+!ELSE
+LIBFFI_SRC_DIR = $(srcdir)/libffi
+!ENDIF
+
+LIBFFI = $(LIBFFI_BUILD_DIR)/.libs/libffi_convenience.lib
+
+$(OBJS):	$(LIBFFI)
+
+$(LIBFFI):		
+	@$(MAKEDIRS) $(LIBFFI_BUILD_DIR)
+	@cd $(LIBFFI_BUILD_DIR) && $(MAKE) -f Makefile.vc64
+	
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog
new file mode 100644
index 0000000..d5d1024
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog
@@ -0,0 +1,4600 @@
+2011-08-22  Jasper Lievisse Adriaanse <jasper@openbsd.org>
+
+	* configure.ac: Add OpenBSD/hppa and OpenBSD/powerpc support.
+	* configure: Rebuilt.
+
+2011-07-11  Andrew Haley  <aph@redhat.com>
+
+        * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Clear icache.
+
+2011-06-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* testsuite/libffi.call/cls_double_va.c: Move PR number to comment.
+	* testsuite/libffi.call/cls_longdouble_va.c: Likewise.
+
+2011-06-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	PR libffi/46660
+	* testsuite/libffi.call/cls_double_va.c: xfail dg-output on
+	mips-sgi-irix6*.
+	* testsuite/libffi.call/cls_longdouble_va.c: Likewise.
+
+2011-06-14  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* testsuite/libffi.call/huge_struct.c (test_large_fn): Use PRIu8,
+	PRId8 instead of %hhu, %hhd.
+	* testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRId8,
+	PRIu8): Define.
+	[__sgi__] (PRId8, PRIu8): Define.
+
+2011-04-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* src/alpha/osf.S (UA_SI, FDE_ENCODING, FDE_ENCODE, FDE_ARANGE):
+	Define.
+	Use them to handle ELF vs. ECOFF differences.
+	[__osf__] (_GLOBAL__F_ffi_call_osf): Define.
+
+2011-03-30  Timothy Wall  <twall@users.sf.net>
+
+	* src/powerpc/darwin.S: Fix unknown FDE encoding.
+	* src/powerpc/darwin_closure.S: ditto.
+
+2011-02-25  Anthony Green  <green@moxielogic.com>
+
+	* src/powerpc/ffi.c (ffi_prep_closure_loc): Allow for more
+	32-bit ABIs.
+
+2011-02-15  Anthony Green  <green@moxielogic.com>
+
+	* m4/ax_cc_maxopt.m4: Don't -malign-double or use -ffast-math.
+	* configure: Rebuilt.
+
+2011-02-13  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* configure: Regenerate.
+
+2011-02-13  Anthony Green  <green@moxielogic.com>
+
+	* include/ffi_common.h (UNLIKELY, LIKELY): Define.
+	* src/x86/ffi64.c (UNLIKELY, LIKELY): Remove definition.
+	* src/prep_cif.c (UNLIKELY, LIKELY): Remove definition.
+
+	* src/prep_cif.c (initialize_aggregate): Convert assertion into
+	FFI_BAD_TYPEDEF return.  Initialize arg size and alignment to 0.
+
+	* src/pa/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test,
+	just return FFI_BAD_ABI when things are wrong.
+	* src/arm/ffi.c (ffi_prep_closure_loc): Ditto.
+	* src/powerpc/ffi.c (ffi_prep_closure_loc): Ditto.
+	* src/mips/ffi.c (ffi_prep_closure_loc): Ditto.
+	* src/ia64/ffi.c (ffi_prep_closure_loc): Ditto.
+	* src/avr32/ffi.c (ffi_prep_closure_loc): Ditto.
+
+2011-02-11  Anthony Green  <green@moxielogic.com>
+
+	* src/sparc/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test,
+	just return FFI_BAD_ABI when things are wrong.
+
+2011-02-09  Stuart Shelton  <srcshelton@gmail.com>
+
+	http://bugs.gentoo.org/show_bug.cgi?id=286911
+	* src/mips/ffitarget.h: Clean up error messages.
+	* src/java_raw_api.c (ffi_java_translate_args): Cast raw arg to
+	ffi_raw*.
+	* include/ffi.h.in: Add pragma for SGI compiler.
+
+2011-02-09  Anthony Green  <green@moxielogic.com>
+
+	* configure.ac: Add powerpc64-*-darwin* support.
+
+2011-02-09  Anthony Green <green@moxielogic.com>
+
+	* README: Mention Interix.
+
+2011-02-09  Jonathan Callen  <abcd@gentoo.org>
+
+	* configure.ac: Add Interix to win32/cygwin/mingw case.
+	* configure: Ditto.
+	* src/closures.c: Treat Interix like Cygwin, instead of as a
+	generic win32.
+
+2011-02-09  Anthony Green <green@moxielogic.com>
+
+	* testsuite/libffi.call/err_bad_typedef.c: Remove xfail.
+	* testsuite/libffi.call/err_bad_abi.c: Remove xfail.
+	* src/x86/ffi64.c (UNLIKELY, LIKELY): Define.
+	(ffi_prep_closure_loc): Check for bad ABI.
+	* src/prep_cif.c (UNLIKELY, LIKELY): Define.
+	(initialize_aggregate): Check for bad types.
+
+2011-02-09  Landon Fuller <landonf@plausible.coop>
+
+	* Makefile.am (EXTRA_DIST): Add build-ios.sh, src/arm/gentramp.sh,
+	src/arm/trampoline.S.
+	(nodist_libffi_la_SOURCES): Add src/arc/trampoline.S.
+	* configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Define.
+	* src/arm/ffi.c (ffi_trampoline_table)
+	(ffi_closure_trampoline_table_page, ffi_trampoline_table_entry)
+	(FFI_TRAMPOLINE_CODELOC_CONFIG, FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET)
+	(FFI_TRAMPOLINE_COUNT, ffi_trampoline_lock, ffi_trampoline_tables)
+	(ffi_trampoline_table_alloc, ffi_closure_alloc, ffi_closure_free):
+	Define for FFI_EXEC_TRAMPOLINE_TABLE case (iOS).
+	(ffi_prep_closure_loc): Handl FFI_EXEC_TRAMPOLINE_TABLE case
+	separately.
+	* src/arm/sysv.S: Handle Apple iOS host.
+	* src/closures.c: Handle FFI_EXEC_TRAMPOLINE_TABLE case.
+	* build-ios.sh: New file.
+	* fficonfig.h.in, configure, Makefile.in: Rebuilt.
+	* README: Mention ARM iOS.
+
+2011-02-08  Oren Held  <orenhe@il.ibm.com>
+
+	* src/dlmalloc.c (_STRUCT_MALLINFO): Define in order to avoid
+	redefinition of mallinfo on HP-UX.
+
+2011-02-08  Ginn Chen  <ginn.chen@oracle.com>
+
+	* src/sparc/ffi.c (ffi_call): Make compatible with Solaris Studio
+	aggregate return ABI.  Flush cache.
+	(ffi_prep_closure_loc): Flush cache.
+
+2011-02-11  Anthony Green  <green@moxielogic.com>
+
+	From Tom Honermann <tom.honermann@oracle.com>:
+	* src/powerpc/aix.S (ffi_call_AIX): Support for xlc toolchain on
+	AIX.  Declare .ffi_prep_args.  Insert nops after branch
+	instructions so that the AIX linker can insert TOC reload
+	instructions.
+	* src/powerpc/aix_closure.S: Declare .ffi_closure_helper_DARWIN.
+
+2011-02-08  Ed  <ed@kdtc.net>
+
+	* src/powerpc/asm.h: Fix grammar nit in comment.
+
+2011-02-08  Uli Link  <ul.mcamafia@linkitup.de>
+
+	* include/ffi.h.in (FFI_64_BIT_MAX): Define and use.
+
+2011-02-09  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	PR libffi/46661
+	* testsuite/libffi.call/cls_pointer.c (main): Cast void * to
+	uintptr_t first.
+	* testsuite/libffi.call/cls_pointer_stack.c (main): Likewise.
+
+2011-02-08  Rafael Avila de Espindola  <respindola@mozilla.com>
+
+	* configure.ac: Fix x86 test for pc related relocs.
+	* configure: Rebuilt.
+
+2011-02-07  Joel Sherrill <joel.sherrill@oarcorp.com>
+
+	* libffi/src/m68k/ffi.c: Add RTEMS support for cache flushing.
+	Handle case when CPU variant does not have long double support.
+	* libffi/src/m68k/sysv.S: Add support for mc68000, Coldfire,
+	and cores with soft floating point.
+
+2011-02-07  Joel Sherrill <joel.sherrill@oarcorp.com>
+
+	* configure.ac: Add mips*-*-rtems* support.
+	* configure: Regenerate.
+	* src/mips/ffitarget.h: Ensure needed constants are available
+	for targets which do not have sgidefs.h.
+
+2011-01-26  Dave Korn  <dave.korn.cygwin@gmail.com>
+
+	PR target/40125
+	* configure.ac (AM_LTLDFLAGS): Add -bindir option for windows DLLs.
+	* configure: Regenerate.
+
+2010-12-18  Iain Sandoe  <iains@gcc.gnu.org>
+
+	PR libffi/29152
+	PR libffi/42378
+	* src/powerpc/darwin_closure.S: Provide Darwin64 implementation,
+	update comments.
+	* src/powerpc/ffitarget.h (POWERPC_DARWIN64): New,
+	(FFI_TRAMPOLINE_SIZE): Update for Darwin64.
+	* src/powerpc/darwin.S: Provide Darwin64 implementation,
+	update comments.
+	* src/powerpc/ffi_darwin.c: Likewise.
+
+2010-12-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* configure.ac (libffi_cv_as_ascii_pseudo_op): Use double
+	backslashes.
+	(libffi_cv_as_string_pseudo_op): Likewise.
+	* configure: Regenerate.
+
+2010-12-03  Chung-Lin Tang  <cltang@codesourcery.com>
+
+	* src/arm/sysv.S (ffi_closure_SYSV): Add UNWIND to .pad directive.
+	(ffi_closure_VFP): Same.
+	(ffi_call_VFP): Move down to before ffi_closure_VFP. Add '.fpu vfp'
+	directive.
+
+2010-12-01  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* testsuite/libffi.call/ffitest.h [__sgi] (PRId64, PRIu64): Define.
+	(PRIuPTR): Define.
+
+2010-11-29  Richard Henderson  <rth@redhat.com>
+	    Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* src/x86/sysv.S (FDE_ENCODING, FDE_ENCODE): Define.
+	(.eh_frame): Use FDE_ENCODING.
+	(.LASFDE1, .LASFDE2, LASFDE3): Simplify with FDE_ENCODE.
+
+2010-11-22  Jacek Caban <jacek@codeweavers.com>
+
+	* configure.ac: Check for symbol underscores on mingw-w64.
+	* configure: Rebuilt.
+	* src/x86/win64.S: Correctly access extern symbols in respect to
+	underscores.
+
+2010-11-15  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* testsuite/lib/libffi-dg.exp: Rename ...
+	* testsuite/lib/libffi.exp: ... to this.
+	* libffi/testsuite/libffi.call/call.exp: Don't load libffi-dg.exp.
+	* libffi/testsuite/libffi.special/special.exp: Likewise.
+
+2010-10-28  Chung-Lin Tang  <cltang@codesourcery.com>
+
+	* src/arm/ffi.c (ffi_prep_args): Add VFP register argument handling
+	code, new parameter, and return value. Update comments.
+	(ffi_prep_cif_machdep): Add case for VFP struct return values. Add
+	call to layout_vfp_args().
+	(ffi_call_SYSV): Update declaration.
+	(ffi_call_VFP): New declaration.
+	(ffi_call): Add VFP struct return conditions. Call ffi_call_VFP()
+	when ABI is FFI_VFP.
+	(ffi_closure_VFP): New declaration.
+	(ffi_closure_SYSV_inner): Add new vfp_args parameter, update call to
+	ffi_prep_incoming_args_SYSV().
+	(ffi_prep_incoming_args_SYSV): Update parameters. Add VFP argument
+	case handling.
+	(ffi_prep_closure_loc): Pass ffi_closure_VFP to trampoline
+	construction under VFP hard-float.
+	(rec_vfp_type_p): New function.
+	(vfp_type_p): Same.
+	(place_vfp_arg): Same.
+	(layout_vfp_args): Same.
+	* src/arm/ffitarget.h (ffi_abi): Add FFI_VFP. Define FFI_DEFAULT_ABI
+	based on __ARM_PCS_VFP.
+	(FFI_EXTRA_CIF_FIELDS): Define for adding VFP hard-float specific
+	fields.
+	(FFI_TYPE_STRUCT_VFP_FLOAT): Define internally used type code.
+	(FFI_TYPE_STRUCT_VFP_DOUBLE): Same.
+	* src/arm/sysv.S (ffi_call_SYSV): Change call of ffi_prep_args() to
+	direct call. Move function pointer load upwards.
+	(ffi_call_VFP): New function.
+	(ffi_closure_VFP): Same.
+
+	* testsuite/lib/libffi-dg.exp (check-flags): New function.
+	(dg-skip-if): New function.
+	* testsuite/libffi.call/cls_double_va.c: Skip if target is arm*-*-*
+	and compiler options include -mfloat-abi=hard.
+	* testsuite/libffi.call/cls_longdouble_va.c: Same.
+
+2010-10-01  Jakub Jelinek  <jakub@redhat.com>
+
+	PR libffi/45677
+	* src/x86/ffi64.c (ffi_prep_cif_machdep): Ensure cif->bytes is
+	a multiple of 8.
+	* testsuite/libffi.call/many2.c: New test.
+
+2010-08-20  Mark Wielaard  <mjw@redhat.com>
+
+	* src/closures.c (open_temp_exec_file_mnt): Check if getmntent_r
+	returns NULL.
+
+2010-08-09  Andreas Tobler  <andreast@fgznet.ch>
+
+	* configure.ac: Add target powerpc64-*-freebsd*.
+	* configure: Regenerate.
+	* testsuite/libffi.call/cls_align_longdouble_split.c: Pass
+	-mlong-double-128 only to linux targets.
+	* testsuite/libffi.call/cls_align_longdouble_split2.c: Likewise.
+	* testsuite/libffi.call/cls_longdouble.c: Likewise.
+	* testsuite/libffi.call/huge_struct.c: Likewise.
+
+2010-08-05  Dan Witte  <dwitte@mozilla.com>
+
+        * Makefile.am: Pass FFI_DEBUG define to msvcc.sh for linking to the
+        debug CRT when --enable-debug is given.
+        * configure.ac: Define it.
+        * msvcc.sh: Translate -g and -DFFI_DEBUG appropriately.
+
+2010-08-04  Dan Witte  <dwitte@mozilla.com>
+
+	* src/x86/ffitarget.h: Add X86_ANY define for all x86/x86_64
+	platforms.
+	* src/x86/ffi.c: Remove redundant ifdef checks.
+	* src/prep_cif.c: Push stack space computation into src/x86/ffi.c
+	for X86_ANY so return value space doesn't get added twice.
+
+2010-08-03  Neil Rashbrooke <neil@parkwaycc.co.uk>
+
+	* msvcc.sh: Don't pass -safeseh to ml64 because behavior is buggy.
+
+2010-07-22  Dan Witte  <dwitte@mozilla.com>
+
+	* src/*/ffitarget.h: Make FFI_LAST_ABI one past the last valid ABI.
+	* src/prep_cif.c: Fix ABI assertion.
+        * src/cris/ffi.c: Ditto.
+
+2010-07-10  Evan Phoenix  <evan@fallingsnow.net>
+
+	* src/closures.c (selinux_enabled_check): Fix strncmp usage bug.
+
+2010-07-07  Dan Horák <dan@danny.cz>
+
+	* include/ffi.h.in: Protect #define with #ifndef.
+	* src/powerpc/ffitarget.h: Ditto.
+	* src/s390/ffitarget.h: Ditto.
+	* src/sparc/ffitarget.h: Ditto.
+
+2010-07-07   Neil Roberts <neil@linux.intel.com>
+
+	* src/x86/sysv.S (ffi_call_SYSV): Align the stack pointer to
+	16-bytes.
+
+2010-07-02  Jakub Jelinek  <jakub@redhat.com>
+
+	* Makefile.am (AM_MAKEFLAGS): Pass also mandir to submakes.
+	* Makefile.in: Regenerated.
+
+2010-05-19  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* configure.ac (libffi_cv_as_x86_pcrel): Check for illegal in as
+	output, too.
+	(libffi_cv_as_ascii_pseudo_op): Check for .ascii.
+	(libffi_cv_as_string_pseudo_op): Check for .string.
+	* configure: Regenerate.
+	* fficonfig.h.in: Regenerate.
+	* src/x86/sysv.S (.eh_frame): Use .ascii, .string or error.
+
+2010-05-11  Dan Witte  <dwitte@mozilla.com>
+
+	* doc/libffi.tex: Document previous change.
+
+2010-05-11  Makoto Kato <m_kato@ga2.so-net.ne.jp>
+
+	* src/x86/ffi.c (ffi_call): Don't copy structs passed by value.
+
+2010-05-05  Michael Kohler <michaelkohler@live.com>
+
+	* src/dlmalloc.c (dlfree): Fix spelling.
+	* src/ia64/ffi.c (ffi_prep_cif_machdep): Ditto.
+	* configure.ac: Ditto.
+	* configure: Rebuilt.
+
+2010-04-13  Dan Witte  <dwitte@mozilla.com>
+
+	* msvcc.sh: Build with -W3 instead of -Wall.
+	* src/powerpc/ffi_darwin.c: Remove build warnings.
+	* src/x86/ffi.c: Ditto.
+	* src/x86/ffitarget.h: Ditto.
+
+2010-04-12  Dan Witte  <dwitte@mozilla.com>
+	    Walter Meinl <wuno@lsvw.de>
+
+	* configure.ac: Add OS/2 support.
+	* configure: Rebuilt.
+	* src/closures.c: Ditto.
+	* src/dlmalloc.c: Ditto.
+	* src/x86/win32.S: Ditto.
+
+2010-04-07  Jakub Jelinek  <jakub@redhat.com>
+
+	* testsuite/libffi.call/err_bad_abi.c: Remove unused args variable.
+
+2010-04-02  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* Makefile.in: Regenerate.
+	* aclocal.m4: Regenerate.
+	* include/Makefile.in: Regenerate.
+	* man/Makefile.in: Regenerate.
+	* testsuite/Makefile.in: Regenerate.
+
+2010-03-30  Dan Witte  <dwitte@mozilla.com>
+
+	* msvcc.sh: Disable build warnings.
+	* README (tested): Clarify windows build procedure.
+
+2010-03-15  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* configure.ac (libffi_cv_as_x86_64_unwind_section_type): New test.
+	* configure: Regenerate.
+	* fficonfig.h.in: Regenerate.
+	* libffi/src/x86/unix64.S (.eh_frame)
+	[HAVE_AS_X86_64_UNWIND_SECTION_TYPE]: Use @unwind section type.
+
+2010-03-14  Matthias Klose  <doko@ubuntu.com>
+
+	* src/x86/ffi64.c: Fix typo in comment.
+	* src/x86/ffi.c: Use /* ... */ comment style.
+
+2010-02-24  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* doc/libffi.texi (The Closure API): Fix typo.
+	* doc/libffi.info: Remove.
+
+2010-02-15  Matthias Klose  <doko@ubuntu.com>
+
+	* src/arm/sysv.S (__ARM_ARCH__): Define for processor
+	__ARM_ARCH_7EM__.
+
+2010-01-15  Anthony Green  <green@redhat.com>
+
+	* README: Add notes on building with Microsoft Visual C++.
+
+2010-01-15  Daniel Witte  <dwitte@mozilla.com>
+
+	* msvcc.sh: New file.
+
+	* src/x86/win32.S: Port assembly routines to MSVC and #ifdef.
+	* src/x86/ffi.c: Tweak function declaration and remove excess
+	parens.
+	* include/ffi.h.in: Add __declspec(align(8)) to typedef struct
+	ffi_closure.
+
+	* src/x86/ffi.c: Merge ffi_call_SYSV and ffi_call_STDCALL into new
+	function ffi_call_win32 on X86_WIN32.
+	* src/x86/win32.S (ffi_call_SYSV): Rename to ffi_call_win32.
+	(ffi_call_STDCALL): Remove.
+
+	* src/prep_cif.c (ffi_prep_cif): Move stack space allocation code
+	to ffi_prep_cif_machdep for x86.
+	* src/x86/ffi.c (ffi_prep_cif_machdep): To here.
+
+2010-01-15  Oliver Kiddle  <okiddle@yahoo.co.uk>
+
+	* src/x86/ffitarget.h (ffi_abi): Check for __i386 and __amd64 for
+	Sun Studio compiler compatibility.
+
+2010-01-12  Conrad Irwin <conrad.irwin@gmail.com>
+
+	* doc/libffi.texi: Add closure example.
+
+2010-01-07  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	PR libffi/40701
+	* testsuite/libffi.call/ffitest.h [__alpha__ && __osf__] (PRIdLL,
+	PRIuLL, PRId64, PRIu64, PRIuPTR): Define.
+	* testsuite/libffi.call/cls_align_sint64.c: Add -Wno-format on
+	alpha*-dec-osf*.
+	* testsuite/libffi.call/cls_align_uint64.c: Likewise.
+	* testsuite/libffi.call/cls_ulonglong.c: Likewise.
+	* testsuite/libffi.call/return_ll1.c: Likewise.
+	* testsuite/libffi.call/stret_medium2.c: Likewise.
+	* testsuite/libffi.special/ffitestcxx.h (allocate_mmap): Cast
+	MAP_FAILED to char *.
+
+2010-01-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	* src/mips/n32.S: Use .abicalls and .eh_frame with __GNUC__.
+
+2009-12-31  Anthony Green  <green@redhat.com>
+
+	* README: Update for libffi 3.0.9.
+
+2009-12-27  Matthias Klose  <doko@ubuntu.com>
+
+	* configure.ac (HAVE_LONG_DOUBLE): Define for mips when
+	appropriate.
+	* configure: Rebuilt.
+
+2009-12-26  Anthony Green  <green@redhat.com>
+
+	* testsuite/libffi.call/cls_longdouble_va.c: Mark as xfail for
+	avr32*-*-*.
+	* testsuite/libffi.call/cls_double_va.c: Ditto.
+
+2009-12-26  Andreas Tobler  <a.tobler@schweiz.org>
+
+	* testsuite/libffi.call/ffitest.h: Conditionally include stdint.h
+	and inttypes.h.
+	* testsuite/libffi.special/unwindtest.cc: Ditto.
+
+2009-12-26  Andreas Tobler  <a.tobler@schweiz.org>
+
+	* configure.ac: Add amd64-*-openbsd*.
+	* configure: Rebuilt.
+	* testsuite/lib/libffi-dg.exp (libffi_target_compile): Link
+	openbsd programs with -lpthread.
+
+2009-12-26  Anthony Green  <green@redhat.com>
+
+	* testsuite/libffi.call/cls_double_va.c,
+	testsuite/libffi.call/cls_longdouble.c,
+	testsuite/libffi.call/cls_longdouble_va.c,
+	testsuite/libffi.call/cls_pointer.c,
+	testsuite/libffi.call/cls_pointer_stack.c: Remove xfail for
+	mips*-*-* and arm*-*-*.
+	* testsuite/libffi.call/cls_align_longdouble_split.c,
+	testsuite/libffi.call/cls_align_longdouble_split2.c,
+	testsuite/libffi.call/stret_medium2.c,
+	testsuite/libffi.call/stret_medium.c,
+	testsuite/libffi.call/stret_large.c,
+	testsuite/libffi.call/stret_large2.c: Remove xfail for arm*-*-*.
+
+2009-12-31  Kay Tietz  <ktietz70@googlemail.com>
+
+	* testsuite/libffi.call/ffitest.h,
+	testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRuLL): Fix
+	definitions.
+
+2009-12-31  Carlo Bramini  <carlo.bramix@libero.it>
+
+	* configure.ac (AM_LTLDFLAGS): Define for windows hosts.
+	* Makefile.am (libffi_la_LDFLAGS): Add AM_LTLDFLAGS.
+	* configure: Rebuilt.
+	* Makefile.in: Rebuilt.
+
+2009-12-31  Anthony Green  <green@redhat.com>
+	    Blake Chaffin.
+
+	* testsuite/libffi.call/huge_struct.c: New test case from Blake
+	Chaffin @ Apple.
+
+2009-12-28  David Edelsohn  <edelsohn@gnu.org>
+
+	* src/powerpc/ffi_darwin.c (ffi_prep_args): Copy abi and nargs to
+	local variables.
+	(aix_adjust_aggregate_sizes): New function.
+	(ffi_prep_cif_machdep): Call it.
+
+2009-12-26  Andreas Tobler  <a.tobler@schweiz.org>
+
+	* configure.ac: Define FFI_MMAP_EXEC_WRIT for the given targets.
+	* configure: Regenerate.
+	* fficonfig.h.in: Likewise.
+	* src/closures.c: Remove the FFI_MMAP_EXEC_WRIT definition for
+	Solaris/x86.
+
+2009-12-26  Andreas Schwab  <schwab@linux-m68k.org>
+
+	* src/powerpc/ffi.c (ffi_prep_args_SYSV): Advance intarg_count
+	when a float arguments is passed in memory.
+	(ffi_closure_helper_SYSV): Mark general registers as used up when
+	a 64bit or soft-float long double argument is passed in memory.
+
+2009-12-25  Matthias Klose  <doko@ubuntu.com>
+
+	* man/ffi_call.3: Fix #include in examples.
+	* doc/libffi.texi: Add dircategory.
+
+2009-12-25  Frank Everdij <f.p.x.everdij@tudelft.nl>
+
+	* include/ffi.h.in: Placed '__GNUC__' ifdef around
+	'__attribute__((aligned(8)))' in ffi_closure, fixes compile for
+	IRIX MIPSPro c99.
+	* include/ffi_common.h: Added '__sgi' define to non
+	'__attribute__((__mode__()))' integer typedefs.
+	* src/mips/ffi.c (ffi_call, ffi_closure_mips_inner_O32,
+	ffi_closure_mips_inner_N32): Added 'defined(_MIPSEB)' to BE check.
+	(ffi_closure_mips_inner_O32, ffi_closure_mips_inner_N32): Added
+	FFI_LONGDOUBLE support and alignment(N32 only).
+	* src/mips/ffitarget.h: Corrected '#include <sgidefs.h>' for IRIX and
+	fixed non '__attribute__((__mode__()))' integer typedefs.
+	* src/mips/n32.S: Put '#ifdef linux' around '.abicalls' and '.eh_frame'
+	since they are Linux/GNU Assembler specific.
+
+2009-12-25  Bradley Smith  <brad@brad-smith.co.uk>
+
+	* configure.ac, Makefile.am, src/avr32/ffi.c,
+	src/avr32/ffitarget.h,
+	src/avr32/sysv.S: Add AVR32 port.
+	* configure, Makefile.in: Rebuilt.
+
+2009-12-21  Andreas Tobler  <a.tobler@schweiz.org>
+
+	* configure.ac: Make i?86 build on FreeBSD and OpenBSD.
+	* configure: Regenerate.
+
+2009-12-15  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+	* testsuite/libffi.call/ffitest.h: Define PRIuPTR on PA HP-UX.
+
+2009-12-13  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+	* src/pa/ffi.c (ffi_closure_inner_pa32): Handle FFI_TYPE_LONGDOUBLE
+	type on HP-UX.
+
+2009-12-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* src/sparc/ffi.c (ffi_closure_sparc_inner_v9): Properly align 'long
+	double' arguments.
+
+2009-12-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* testsuite/libffi.call/ffitest.h: Define PRIuPTR on Solaris < 10.
+
+2009-12-10  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+	PR libffi/40700
+	* src/closures.c [X86_64 && __sun__ && __svr4__]
+	(FFI_MMAP_EXEC_WRIT): Define.
+
+2009-12-08  David Daney  <ddaney@caviumnetworks.com>
+
+	* testsuite/libffi.call/stret_medium.c: Remove xfail for mips*-*-*
+	* testsuite/libffi.call/cls_align_longdouble_split2.c: Same.
+	* testsuite/libffi.call/stret_large.c: Same.
+	* testsuite/libffi.call/cls_align_longdouble_split.c: Same.
+	* testsuite/libffi.call/stret_large2.c: Same.
+	* testsuite/libffi.call/stret_medium2.c: Same.
+
+2009-12-07  David Edelsohn  <edelsohn@gnu.org>
+
+	* src/powerpc/aix_closure.S (libffi_closure_ASM): Fix tablejump
+	typo.
+
+2009-12-05  David Edelsohn  <edelsohn@gnu.org>
+
+	* src/powerpc/aix.S: Update AIX32 code to be consistent with AIX64
+	code.
+	* src/powerpc/aix_closure.S: Same.
+
+2009-12-05  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* Makefile.in: Regenerate.
+	* configure: Regenerate.
+	* include/Makefile.in: Regenerate.
+	* man/Makefile.in: Regenerate.
+	* testsuite/Makefile.in: Regenerate.
+
+2009-12-04  David Edelsohn  <edelsohn@gnu.org>
+
+	* src/powerpc/aix_closure.S: Reorganize 64-bit code to match
+	linux64_closure.S.
+
+2009-12-04  Uros Bizjak  <ubizjak@gmail.com>
+
+	PR libffi/41908
+	* src/x86/ffi64.c (classify_argument): Update from
+	gcc/config/i386/i386.c.
+	(ffi_closure_unix64_inner): Do not use the address of two consecutive
+	SSE registers directly.
+	* testsuite/libffi.call/cls_dbls_struct.c (main): Remove xfail
+	for x86_64 linux targets.
+
+2009-12-04  David Edelsohn  <edelsohn@gnu.org>
+
+	* src/powerpc/ffi_darwin.c (ffi_closure_helper_DARWIN): Increment
+	pfr for long double split between fpr13 and stack.
+
+2009-12-03  David Edelsohn  <edelsohn@gnu.org>
+
+	* src/powerpc/ffi_darwin.c (ffi_prep_args): Increment next_arg and
+	fparg_count twice for long double.
+
+2009-12-03  David Edelsohn  <edelsohn@gnu.org>
+
+	PR libffi/42243
+	* src/powerpc/ffi_darwin.c (ffi_prep_args): Remove extra parentheses.
+
+2009-12-03  Uros Bizjak  <ubizjak@gmail.com>
+
+	* testsuite/libffi.call/cls_longdouble_va.c (main): Fix format string.
+	Remove xfails for x86 linux targets.
+
+2009-12-02  David Edelsohn  <edelsohn@gnu.org>
+
+	* src/powerpc/ffi_darwin.c (ffi_prep_args): Fix typo in INT64
+	case.
+
+2009-12-01  David Edelsohn  <edelsohn@gnu.org>
+
+	* src/powerpc/aix.S (ffi_call_AIX): Convert to more standard
+	register usage.  Call ffi_prep_args directly.  Add long double
+	return value support.
+	* src/powerpc/ffi_darwin.c (ffi_prep_args): Double arg increment
+	applies to FFI_TYPE_DOUBLE.  Correct fpr_base increment typo.
+	Separate FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases.
+	(ffi_prep_cif_machdep): Only 16 byte stack alignment in 64 bit
+	mode.
+	(ffi_closure_helper_DARWIN): Remove nf and ng counters.  Move temp
+	into case.
+	* src/powerpc/aix_closure.S: Maintain 16 byte stack alignment.
+	Allocate result area between params and FPRs.
+
+2009-11-30  David Edelsohn  <edelsohn@gnu.org>
+
+	PR target/35484
+	* src/powerpc/ffitarget.h (POWERPC64): Define for PPC64 Linux and
+	AIX64.
+	* src/powerpc/aix.S: Implement AIX64 version.
+	* src/powerpc/aix_closure.S: Implement AIX64 version.
+	(ffi_closure_ASM): Use extsb, lha and displament addresses.
+	* src/powerpc/ffi_darwin.c (ffi_prep_args): Implement AIX64
+	support.
+	(ffi_prep_cif_machdep): Same.
+	(ffi_call): Same.
+	(ffi_closure_helper_DARWIN): Same.
+
+2009-11-02  Andreas Tobler  <a.tobler@schweiz.org>
+
+	PR libffi/41908
+	* testsuite/libffi.call/testclosure.c: New test.
+
+2009-09-28  Kai Tietz  <kai.tietz@onevision.com>
+
+	* src/x86/win64.S (_ffi_call_win64 stack): Remove for gnu
+	assembly version use of ___chkstk.
+
+2009-09-23  Matthias Klose  <doko@ubuntu.com>
+
+	PR libffi/40242, PR libffi/41443
+	* src/arm/sysv.S (__ARM_ARCH__): Define for processors
+	__ARM_ARCH_6T2__, __ARM_ARCH_6M__, __ARM_ARCH_7__,
+	__ARM_ARCH_7A__, __ARM_ARCH_7R__, __ARM_ARCH_7M__.
+	Change the conditionals to __SOFTFP__ || __ARM_EABI__
+	for -mfloat-abi=softfp to work.
+
+2009-09-17  Loren J. Rittle  <ljrittle@acm.org>
+
+	PR testsuite/32843 (strikes again)
+	* src/x86/ffi.c (ffi_prep_cif_machdep): Add X86_FREEBSD to
+	enable proper extension on char and short.
+
+2009-09-15  David Daney  <ddaney@caviumnetworks.com>
+
+	* src/java_raw_api.c (ffi_java_raw_to_rvalue): Remove special
+	handling for FFI_TYPE_POINTER.
+	* src/mips/ffitarget.h (FFI_TYPE_STRUCT_D_SOFT,
+	FFI_TYPE_STRUCT_F_SOFT, FFI_TYPE_STRUCT_DD_SOFT,
+	FFI_TYPE_STRUCT_FF_SOFT, FFI_TYPE_STRUCT_FD_SOFT,
+	FFI_TYPE_STRUCT_DF_SOFT, FFI_TYPE_STRUCT_SOFT): New defines.
+	(FFI_N32_SOFT_FLOAT, FFI_N64_SOFT_FLOAT): New ffi_abi enumerations.
+	(enum ffi_abi): Set FFI_DEFAULT_ABI for soft-float.
+	* src/mips/n32.S (ffi_call_N32): Add handling for soft-float
+	structure and pointer returns.
+	(ffi_closure_N32): Add handling for pointer returns.
+	* src/mips/ffi.c (ffi_prep_args, calc_n32_struct_flags,
+	calc_n32_return_struct_flags): Handle soft-float.
+	(ffi_prep_cif_machdep):  Handle soft-float, fix pointer handling.
+	(ffi_call_N32): Declare proper argument types.
+	(ffi_call, copy_struct_N32, ffi_closure_mips_inner_N32): Handle
+	soft-float.
+
+2009-08-24  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* configure.ac (AC_PREREQ): Bump to 2.64.
+
+2009-08-22  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* Makefile.am (install-html, install-pdf): Remove.
+	* Makefile.in: Regenerate.
+
+	* Makefile.in: Regenerate.
+	* aclocal.m4: Regenerate.
+	* configure: Regenerate.
+	* fficonfig.h.in: Regenerate.
+	* include/Makefile.in: Regenerate.
+	* man/Makefile.in: Regenerate.
+	* testsuite/Makefile.in: Regenerate.
+
+2009-07-30  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* configure.ac (_AC_ARG_VAR_PRECIOUS): Use m4_rename_force.
+
+2009-07-24  Dave Korn  <dave.korn.cygwin@gmail.com>
+
+	PR libffi/40807
+	* src/x86/ffi.c (ffi_prep_cif_machdep): Also use sign/zero-extending
+	return types for X86_WIN32.
+	* src/x86/win32.S (_ffi_call_SYSV): Handle omitted return types.
+	(_ffi_call_STDCALL, _ffi_closure_SYSV, _ffi_closure_raw_SYSV,
+	_ffi_closure_STDCALL): Likewise.
+
+	* src/closures.c (is_selinux_enabled): Define to const 0 for Cygwin.
+	(dlmmap, dlmunmap): Also use these functions on Cygwin.
+
+2009-07-11  Richard Sandiford  <rdsandiford@googlemail.com>
+
+	PR testsuite/40699
+	PR testsuite/40707
+	PR testsuite/40709
+	* testsuite/lib/libffi-dg.exp: Revert 2009-07-02, 2009-07-01 and
+	2009-06-30 commits.
+
+2009-07-01  Richard Sandiford  <r.sandiford@uk.ibm.com>
+
+	* testsuite/lib/libffi-dg.exp (libffi-init): Set ld_library_path
+	to "" before adding paths.  (This reinstates an assignment that
+	was removed by my 2009-06-30 commit, but changes the initial
+	value from "." to "".)
+
+2009-07-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR testsuite/40601
+	* testsuite/lib/libffi-dg.exp (libffi-init): Properly set
+	gccdir.  Adjust ld_library_path for gcc only if gccdir isn't
+	empty.
+
+2009-06-30  Richard Sandiford  <r.sandiford@uk.ibm.com>
+
+	* testsuite/lib/libffi-dg.exp (libffi-init): Don't add "."
+	to ld_library_path.  Use add_path.  Add just find_libgcc_s
+	to ld_library_path, not every libgcc multilib directory.
+
+2009-06-16  Wim Lewis  <wiml@hhhh.org>
+
+	* src/powerpc/ffi.c: Avoid clobbering cr3 and cr4, which are
+	supposed to be callee-saved.
+	* src/powerpc/sysv.S (small_struct_return_value): Fix overrun of
+	return buffer for odd-size structs.
+
+2009-06-16  Andreas Tobler  <a.tobler@schweiz.org>
+
+	PR libffi/40444
+	* testsuite/lib/libffi-dg.exp (libffi_target_compile): Add
+	allow_stack_execute for Darwin.
+
+2009-06-16  Andrew Haley  <aph@redhat.com>
+
+	* configure.ac (TARGETDIR): Add missing blank lines.
+	* configure: Regenerate.
+
+2009-06-16  Andrew Haley  <aph@redhat.com>
+
+	* testsuite/libffi.call/cls_align_sint64.c,
+	testsuite/libffi.call/cls_align_uint64.c,
+	testsuite/libffi.call/cls_longdouble_va.c,
+	testsuite/libffi.call/cls_ulonglong.c,
+	testsuite/libffi.call/return_ll1.c,
+	testsuite/libffi.call/stret_medium2.c: Fix printf format
+	specifiers.
+	* testsuite/libffi.call/ffitest.h,
+	testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define.
+
+2009-06-15  Andrew Haley  <aph@redhat.com>
+
+	* testsuite/libffi.call/err_bad_typedef.c: xfail everywhere.
+	* testsuite/libffi.call/err_bad_abi.c: Likewise.
+
+2009-06-12  Andrew Haley  <aph@redhat.com>
+
+	* Makefile.am: Remove info_TEXINFOS.
+
+2009-06-12  Andrew Haley  <aph@redhat.com>
+
+	* ChangeLog.libffi: testsuite/libffi.call/cls_align_sint64.c,
+	testsuite/libffi.call/cls_align_uint64.c,
+	testsuite/libffi.call/cls_ulonglong.c,
+	testsuite/libffi.call/return_ll1.c,
+	testsuite/libffi.call/stret_medium2.c: Fix printf format
+	specifiers.
+	testsuite/libffi.special/unwindtest.cc: include stdint.h.
+
+2009-06-11  Timothy Wall  <twall@users.sf.net>
+
+	* Makefile.am,
+	configure.ac,
+	include/ffi.h.in,
+	include/ffi_common.h,
+	src/closures.c,
+	src/dlmalloc.c,
+	src/x86/ffi.c,
+	src/x86/ffitarget.h,
+	src/x86/win64.S (new),
+	README: Added win64 support (mingw or MSVC)
+	* Makefile.in,
+	include/Makefile.in,
+	man/Makefile.in,
+	testsuite/Makefile.in,
+	configure,
+	aclocal.m4: Regenerated
+	* ltcf-c.sh: properly escape cygwin/w32 path
+	* man/ffi_call.3: Clarify size requirements for return value.
+	* src/x86/ffi64.c: Fix filename in comment.
+	* src/x86/win32.S: Remove unused extern.
+
+	* testsuite/libffi.call/closure_fn0.c,
+	testsuite/libffi.call/closure_fn1.c,
+	testsuite/libffi.call/closure_fn2.c,
+	testsuite/libffi.call/closure_fn3.c,
+	testsuite/libffi.call/closure_fn4.c,
+	testsuite/libffi.call/closure_fn5.c,
+	testsuite/libffi.call/closure_fn6.c,
+	testsuite/libffi.call/closure_stdcall.c,
+	testsuite/libffi.call/cls_12byte.c,
+	testsuite/libffi.call/cls_16byte.c,
+	testsuite/libffi.call/cls_18byte.c,
+	testsuite/libffi.call/cls_19byte.c,
+	testsuite/libffi.call/cls_1_1byte.c,
+	testsuite/libffi.call/cls_20byte.c,
+	testsuite/libffi.call/cls_20byte1.c,
+	testsuite/libffi.call/cls_24byte.c,
+	testsuite/libffi.call/cls_2byte.c,
+	testsuite/libffi.call/cls_3_1byte.c,
+	testsuite/libffi.call/cls_3byte1.c,
+ 	testsuite/libffi.call/cls_3byte2.c,
+ 	testsuite/libffi.call/cls_4_1byte.c,
+ 	testsuite/libffi.call/cls_4byte.c,
+ 	testsuite/libffi.call/cls_5_1_byte.c,
+ 	testsuite/libffi.call/cls_5byte.c,
+ 	testsuite/libffi.call/cls_64byte.c,
+ 	testsuite/libffi.call/cls_6_1_byte.c,
+ 	testsuite/libffi.call/cls_6byte.c,
+ 	testsuite/libffi.call/cls_7_1_byte.c,
+ 	testsuite/libffi.call/cls_7byte.c,
+ 	testsuite/libffi.call/cls_8byte.c,
+ 	testsuite/libffi.call/cls_9byte1.c,
+ 	testsuite/libffi.call/cls_9byte2.c,
+ 	testsuite/libffi.call/cls_align_double.c,
+ 	testsuite/libffi.call/cls_align_float.c,
+ 	testsuite/libffi.call/cls_align_longdouble.c,
+ 	testsuite/libffi.call/cls_align_longdouble_split.c,
+ 	testsuite/libffi.call/cls_align_longdouble_split2.c,
+ 	testsuite/libffi.call/cls_align_pointer.c,
+ 	testsuite/libffi.call/cls_align_sint16.c,
+ 	testsuite/libffi.call/cls_align_sint32.c,
+ 	testsuite/libffi.call/cls_align_sint64.c,
+ 	testsuite/libffi.call/cls_align_uint16.c,
+ 	testsuite/libffi.call/cls_align_uint32.c,
+ 	testsuite/libffi.call/cls_align_uint64.c,
+ 	testsuite/libffi.call/cls_dbls_struct.c,
+ 	testsuite/libffi.call/cls_double.c,
+ 	testsuite/libffi.call/cls_double_va.c,
+ 	testsuite/libffi.call/cls_float.c,
+ 	testsuite/libffi.call/cls_longdouble.c,
+ 	testsuite/libffi.call/cls_longdouble_va.c,
+ 	testsuite/libffi.call/cls_multi_schar.c,
+ 	testsuite/libffi.call/cls_multi_sshort.c,
+ 	testsuite/libffi.call/cls_multi_sshortchar.c,
+ 	testsuite/libffi.call/cls_multi_uchar.c,
+ 	testsuite/libffi.call/cls_multi_ushort.c,
+ 	testsuite/libffi.call/cls_multi_ushortchar.c,
+ 	testsuite/libffi.call/cls_pointer.c,
+ 	testsuite/libffi.call/cls_pointer_stack.c,
+ 	testsuite/libffi.call/cls_schar.c,
+ 	testsuite/libffi.call/cls_sint.c,
+ 	testsuite/libffi.call/cls_sshort.c,
+ 	testsuite/libffi.call/cls_uchar.c,
+ 	testsuite/libffi.call/cls_uint.c,
+ 	testsuite/libffi.call/cls_ulonglong.c,
+ 	testsuite/libffi.call/cls_ushort.c,
+ 	testsuite/libffi.call/err_bad_abi.c,
+ 	testsuite/libffi.call/err_bad_typedef.c,
+ 	testsuite/libffi.call/float2.c,
+ 	testsuite/libffi.call/huge_struct.c,
+ 	testsuite/libffi.call/nested_struct.c,
+ 	testsuite/libffi.call/nested_struct1.c,
+ 	testsuite/libffi.call/nested_struct10.c,
+ 	testsuite/libffi.call/nested_struct2.c,
+ 	testsuite/libffi.call/nested_struct3.c,
+ 	testsuite/libffi.call/nested_struct4.c,
+ 	testsuite/libffi.call/nested_struct5.c,
+ 	testsuite/libffi.call/nested_struct6.c,
+ 	testsuite/libffi.call/nested_struct7.c,
+ 	testsuite/libffi.call/nested_struct8.c,
+ 	testsuite/libffi.call/nested_struct9.c,
+ 	testsuite/libffi.call/problem1.c,
+ 	testsuite/libffi.call/return_ldl.c,
+ 	testsuite/libffi.call/return_ll1.c,
+ 	testsuite/libffi.call/stret_large.c,
+ 	testsuite/libffi.call/stret_large2.c,
+ 	testsuite/libffi.call/stret_medium.c,
+ 	testsuite/libffi.call/stret_medium2.c,
+	testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead
+	of checking for MMAP.  Use intptr_t instead of long casts.
+
+2009-06-11  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* testsuite/libffi.call/cls_longdouble_va.c: Add xfail sh*-*-linux-*.
+	* testsuite/libffi.call/err_bad_abi.c: Add xfail sh*-*-*.
+	* testsuite/libffi.call/err_bad_typedef.c: Likewise.
+
+2009-06-09  Andrew Haley  <aph@redhat.com>
+
+	* src/x86/freebsd.S: Add missing file.
+
+2009-06-08  Andrew Haley  <aph@redhat.com>
+
+	Import from libffi 3.0.8:
+
+	* doc/libffi.texi: New file.
+	* doc/libffi.info: Likewise.
+	* doc/stamp-vti: Likewise.
+	* man/Makefile.am: New file.
+	* man/ffi_call.3: New file.
+
+	* Makefile.am (EXTRA_DIST): Add src/x86/darwin64.S,
+	src/dlmalloc.c.
+	(nodist_libffi_la_SOURCES): Add X86_FREEBSD.
+
+	* configure.ac: Bump version to 3.0.8.
+	parisc*-*-linux*: Add.
+	i386-*-freebsd* | i386-*-openbsd*: Add.
+	powerpc-*-beos*: Add.
+	AM_CONDITIONAL X86_FREEBSD: Add.
+	AC_CONFIG_FILES: Add man/Makefile.
+
+	* include/ffi.h.in (FFI_FN): Change void (*)() to void (*)(void).
+
+2009-06-08  Andrew Haley  <aph@redhat.com>
+
+	* README: Import from libffi 3.0.8.
+
+2009-06-08  Andrew Haley  <aph@redhat.com>
+
+	* testsuite/libffi.call/err_bad_abi.c: Add xfails.
+	* testsuite/libffi.call/cls_longdouble_va.c: Add xfails.
+	* testsuite/libffi.call/cls_dbls_struct.c: Add xfail x86_64-*-linux-*.
+	* testsuite/libffi.call/err_bad_typedef.c: Add xfails.
+
+	* testsuite/libffi.call/stret_medium2.c: Add __UNUSED__ to args.
+	* testsuite/libffi.call/stret_medium.c: Likewise.
+	* testsuite/libffi.call/stret_large2.c: Likewise.
+	* testsuite/libffi.call/stret_large.c:  Likewise.
+
+2008-12-26  Timothy Wall  <twall@users.sf.net>
+
+	* testsuite/libffi.call/cls_longdouble.c,
+	testsuite/libffi.call/cls_longdouble_va.c,
+	testsuite/libffi.call/cls_align_longdouble.c,
+	testsuite/libffi.call/cls_align_longdouble_split.c,
+	testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected
+	failures on x86_64 cygwin/mingw.
+
+2008-12-22  Timothy Wall  <twall@users.sf.net>
+
+	* testsuite/libffi.call/closure_fn0.c,
+	testsuite/libffi.call/closure_fn1.c,
+	testsuite/libffi.call/closure_fn2.c,
+	testsuite/libffi.call/closure_fn3.c,
+	testsuite/libffi.call/closure_fn4.c,
+	testsuite/libffi.call/closure_fn5.c,
+	testsuite/libffi.call/closure_fn6.c,
+	testsuite/libffi.call/closure_loc_fn0.c,
+	testsuite/libffi.call/closure_stdcall.c,
+	testsuite/libffi.call/cls_align_pointer.c,
+	testsuite/libffi.call/cls_pointer.c,
+	testsuite/libffi.call/cls_pointer_stack.c: use portable cast from
+	pointer to integer (intptr_t).
+	* testsuite/libffi.call/cls_longdouble.c: disable for win64.
+
+2008-07-24  Anthony Green  <green@redhat.com>
+
+	* testsuite/libffi.call/cls_dbls_struct.c,
+	testsuite/libffi.call/cls_double_va.c,
+	testsuite/libffi.call/cls_longdouble.c,
+	testsuite/libffi.call/cls_longdouble_va.c,
+	testsuite/libffi.call/cls_pointer.c,
+	testsuite/libffi.call/cls_pointer_stack.c,
+	testsuite/libffi.call/err_bad_abi.c: Clean up failures from
+	compiler warnings.
+
+2008-03-04  Anthony Green  <green@redhat.com>
+	    Blake Chaffin
+	    hos@tamanegi.org
+
+	* testsuite/libffi.call/cls_align_longdouble_split2.c
+	  testsuite/libffi.call/cls_align_longdouble_split.c
+	  testsuite/libffi.call/cls_dbls_struct.c
+	  testsuite/libffi.call/cls_double_va.c
+	  testsuite/libffi.call/cls_longdouble.c
+	  testsuite/libffi.call/cls_longdouble_va.c
+	  testsuite/libffi.call/cls_pointer.c
+	  testsuite/libffi.call/cls_pointer_stack.c
+	  testsuite/libffi.call/err_bad_abi.c
+	  testsuite/libffi.call/err_bad_typedef.c
+	  testsuite/libffi.call/stret_large2.c
+	  testsuite/libffi.call/stret_large.c
+	  testsuite/libffi.call/stret_medium2.c
+	  testsuite/libffi.call/stret_medium.c: New tests from Apple.
+
+2009-06-05  Andrew Haley  <aph@redhat.com>
+
+	* src/x86/ffitarget.h, src/x86/ffi.c: Merge stdcall changes from
+	libffi.
+
+2009-06-04  Andrew Haley  <aph@redhat.com>
+
+	* src/x86/ffitarget.h, src/x86/win32.S, src/x86/ffi.c: Back out
+	stdcall changes.
+
+2008-02-26  Anthony Green  <green@redhat.com>
+	    Thomas Heller  <theller@ctypes.org>
+
+	* src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C
+	comment.
+
+2008-02-03  Timothy Wall  <twall@users.sf.net>
+
+	* src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return
+	  offset based on code pointer, not data pointer.
+
+2008-01-31  Timothy Wall <twall@users.sf.net>
+
+	* testsuite/libffi.call/closure_stdcall.c: Add test for stdcall
+	closures.
+	* src/x86/ffitarget.h: Increase size of trampoline for stdcall
+	closures.
+	* src/x86/win32.S: Add assembly for stdcall closure.
+	* src/x86/ffi.c: Initialize stdcall closure trampoline.
+
+2009-06-04  Andrew Haley  <aph@redhat.com>
+
+	* include/ffi.h.in: Change void (*)() to void (*)(void).
+	* src/x86/ffi.c: Likewise.
+
+2009-06-04  Andrew Haley  <aph@redhat.com>
+
+	* src/powerpc/ppc_closure.S: Insert licence header.
+	* src/powerpc/linux64_closure.S: Likewise.
+	* src/m68k/sysv.S: Likewise.
+
+	* src/sh64/ffi.c: Change void (*)() to void (*)(void).
+	* src/powerpc/ffi.c: Likewise.
+	* src/powerpc/ffi_darwin.c: Likewise.
+	* src/m32r/ffi.c: Likewise.
+	* src/sh64/ffi.c: Likewise.
+	* src/x86/ffi64.c: Likewise.
+	* src/alpha/ffi.c: Likewise.
+	* src/alpha/osf.S: Likewise.
+	* src/frv/ffi.c: Likewise.
+	* src/s390/ffi.c: Likewise.
+	* src/pa/ffi.c: Likewise.
+	* src/pa/hpux32.S: Likewise.
+	* src/ia64/unix.S: Likewise.
+	* src/ia64/ffi.c: Likewise.
+	* src/sparc/ffi.c: Likewise.
+	* src/mips/ffi.c: Likewise.
+	* src/sh/ffi.c: Likewise.
+
+2008-02-15  David Daney  <ddaney@avtrex.com>
+
+	* src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE):
+	Define (conditionally), and use it to include cachectl.h.
+	(ffi_prep_closure_loc): Fix cache flushing.
+	* src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define.
+
+2009-06-04  Andrew Haley  <aph@redhat.com>
+
+	include/ffi.h.in,
+	src/arm/ffitarget.h,
+	src/arm/ffi.c,
+	src/arm/sysv.S,
+	src/powerpc/ffitarget.h,
+	src/closures.c,
+	src/sh64/ffitarget.h,
+	src/sh64/ffi.c,
+	src/sh64/sysv.S,
+	src/types.c,
+	src/x86/ffi64.c,
+	src/x86/ffitarget.h,
+	src/x86/win32.S,
+	src/x86/darwin.S,
+	src/x86/ffi.c,
+	src/x86/sysv.S,
+	src/x86/unix64.S,
+	src/alpha/ffitarget.h,
+	src/alpha/ffi.c,
+	src/alpha/osf.S,
+	src/m68k/ffitarget.h,
+	src/frv/ffitarget.h,
+	src/frv/ffi.c,
+	src/s390/ffitarget.h,
+	src/s390/sysv.S,
+	src/cris/ffitarget.h,
+	src/pa/linux.S,
+	src/pa/ffitarget.h,
+	src/pa/ffi.c,
+	src/raw_api.c,
+	src/ia64/ffitarget.h,
+	src/ia64/unix.S,
+	src/ia64/ffi.c,
+	src/ia64/ia64_flags.h,
+	src/java_raw_api.c,
+	src/debug.c,
+	src/sparc/v9.S,
+	src/sparc/ffitarget.h,
+	src/sparc/ffi.c,
+	src/sparc/v8.S,
+	src/mips/ffitarget.h,
+	src/mips/n32.S,
+	src/mips/o32.S,
+	src/mips/ffi.c,
+	src/prep_cif.c,
+	src/sh/ffitarget.h,
+	src/sh/ffi.c,
+	src/sh/sysv.S: Update license text.
+
+2009-05-22  Dave Korn  <dave.korn.cygwin@gmail.com>
+
+	* src/x86/win32.S (_ffi_closure_STDCALL):  New function.
+	(.eh_frame):  Add FDE for it.
+
+2009-05-22  Dave Korn  <dave.korn.cygwin@gmail.com>
+
+	* configure.ac:  Also check if assembler supports pc-relative
+	relocs on X86_WIN32 targets.
+	* configure:  Regenerate.
+	* src/x86/win32.S (ffi_prep_args):  Declare extern, not global.
+	(_ffi_call_SYSV):  Add missing function type symbol .def and
+	add EH markup labels.
+	(_ffi_call_STDCALL):  Likewise.
+	(_ffi_closure_SYSV):  Likewise.
+	(_ffi_closure_raw_SYSV):  Likewise.
+	(.eh_frame):  Add hand-crafted EH data.
+
+2009-04-09  Jakub Jelinek  <jakub@redhat.com>
+
+	* testsuite/lib/libffi-dg.exp: Change copyright header to refer to
+	version 3 of the GNU General Public License and to point readers
+	at the COPYING3 file and the FSF's license web page.
+	* testsuite/libffi.call/call.exp: Likewise.
+	* testsuite/libffi.special/special.exp: Likewise.
+
+2009-03-01  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* configure: Regenerate.
+
+2008-12-18  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	PR libffi/26048
+	* configure.ac (HAVE_AS_X86_PCREL): New test.
+	* configure: Regenerate.
+	* fficonfig.h.in: Regenerate.
+	* src/x86/sysv.S [!FFI_NO_RAW_API]: Precalculate
+	RAW_CLOSURE_CIF_OFFSET, RAW_CLOSURE_FUN_OFFSET,
+	RAW_CLOSURE_USER_DATA_OFFSET for the Solaris 10/x86 assembler.
+	(.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL.
+	* src/x86/unix64.S (.Lstore_table): Move to .text section.
+	(.Lload_table): Likewise.
+	(.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL.
+
+2008-12-18  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* configure: Regenerate.
+
+2008-11-21  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* src/sparc/ffi.c (ffi_prep_cif_machdep): Add support for
+	signed/unsigned int8/16 return values.
+	* src/sparc/v8.S (ffi_call_v8): Likewise.
+	(ffi_closure_v8): Likewise.
+
+2008-09-26  Peter O'Gorman  <pogma@thewrittenword.com>
+	    Steve Ellcey  <sje@cup.hp.com>
+
+	* configure: Regenerate for new libtool.
+	* Makefile.in: Ditto.
+	* include/Makefile.in: Ditto.
+	* aclocal.m4: Ditto.
+
+2008-08-25  Andreas Tobler  <a.tobler@schweiz.org>
+
+	* src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and
+	FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum.
+	Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT.
+	Adjust copyright notice.
+	* src/powerpc/ffi.c: Add two new flags to indicate if we have one
+	register or two register to use for FFI_SYSV structs.
+	(ffi_prep_cif_machdep): Pass the right register flag introduced above.
+	(ffi_closure_helper_SYSV): Fix the return type for
+	FFI_SYSV_TYPE_SMALL_STRUCT. Comment.
+	Adjust copyright notice.
+
+2008-07-16  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned
+	int.
+
+2008-06-17  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* configure: Regenerate.
+	* include/Makefile.in: Regenerate.
+	* testsuite/Makefile.in: Regenerate.
+
+2008-06-07  Joseph Myers  <joseph@codesourcery.com>
+
+	* configure.ac (parisc*-*-linux*, powerpc-*-sysv*,
+	powerpc-*-beos*): Remove.
+	* configure: Regenerate.
+
+2008-05-09  Julian Brown  <julian@codesourcery.com>
+
+	* Makefile.am (LTLDFLAGS): New.
+	(libffi_la_LDFLAGS): Use above.
+	* Makefile.in: Regenerate.
+
+2008-04-18  Paolo Bonzini  <bonzini@gnu.org>
+
+	PR bootstrap/35457
+	* aclocal.m4: Regenerate.
+	* configure: Regenerate.
+
+2008-03-26  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/sysv.S: Add .note.GNU-stack on Linux.
+	* src/sh64/sysv.S: Likewise.
+
+2008-03-26  Daniel Jacobowitz  <dan@debian.org>
+
+	* src/arm/sysv.S: Fix ARM comment marker.
+
+2008-03-26  Jakub Jelinek  <jakub@redhat.com>
+
+	* src/alpha/osf.S: Add .note.GNU-stack on Linux.
+	* src/s390/sysv.S: Likewise.
+	* src/powerpc/ppc_closure.S: Likewise.
+	* src/powerpc/sysv.S: Likewise.
+	* src/x86/unix64.S: Likewise.
+	* src/x86/sysv.S: Likewise.
+	* src/sparc/v8.S: Likewise.
+	* src/sparc/v9.S: Likewise.
+	* src/m68k/sysv.S: Likewise.
+	* src/arm/sysv.S: Likewise.
+
+2008-03-16  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* aclocal.m4: Regenerate.
+	* configure: Likewise.
+	* Makefile.in: Likewise.
+	* include/Makefile.in: Likewise.
+	* testsuite/Makefile.in: Likewise.
+
+2008-02-12  Bjoern Koenig  <bkoenig@alpha-tierchen.de>
+	    Andreas Tobler  <a.tobler@schweiz.org>
+
+	* configure.ac: Add amd64-*-freebsd* target.
+	* configure: Regenerate.
+
+2008-01-30  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR libffi/34612
+	* src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when
+	returning struct.
+
+	* testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer"
+	tests.
+
+2008-01-24  David Edelsohn  <edelsohn@gnu.org>
+
+	* configure: Regenerate.
+
+2008-01-06  Andreas Tobler  <a.tobler@schweiz.org>
+
+	* src/x86/ffi.c (ffi_prep_cif_machdep): Fix thinko.
+
+2008-01-05  Andreas Tobler  <a.tobler@schweiz.org>
+
+	PR testsuite/32843
+	* src/x86/ffi.c (ffi_prep_cif_machdep): Add code for
+	signed/unsigned int8/16 for X86_DARWIN.
+	Updated copyright info.
+	Handle one and two byte structs with special cif->flags.
+	* src/x86/ffitarget.h: Add special types for one and two byte structs.
+	Updated copyright info.
+	* src/x86/darwin.S (ffi_call_SYSV): Rewrite to use a jump table like
+	sysv.S
+	Remove code to pop args from the stack after call.
+	Special-case signed/unsigned for int8/16, one and two byte structs.
+	(ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8,
+	FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32,
+	FFI_TYPE_SINT32.
+	Updated copyright info.
+
+2007-12-08  David Daney  <ddaney@avtrex.com>
+
+	* src/mips/n32.S (ffi_call_N32):  Replace dadd with ADDU, dsub with
+	SUBU, add with ADDU and use smaller code sequences.
+
+2007-12-07  David Daney  <ddaney@avtrex.com>
+
+	* src/mips/ffi.c (ffi_prep_cif_machdep): Handle long double return
+	type.
+
+2007-12-06  David Daney  <ddaney@avtrex.com>
+
+	* include/ffi.h.in (FFI_SIZEOF_JAVA_RAW): Define if not	already
+	defined.
+	(ffi_java_raw): New typedef.
+	(ffi_java_raw_call, ffi_java_ptrarray_to_raw,
+	ffi_java_raw_to_ptrarray): Change parameter types from ffi_raw to
+	ffi_java_raw.
+	(ffi_java_raw_closure) : Same.
+	(ffi_prep_java_raw_closure, ffi_prep_java_raw_closure_loc): Change
+	parameter types.
+	* src/java_raw_api.c (ffi_java_raw_size):  Replace FFI_SIZEOF_ARG with
+	FFI_SIZEOF_JAVA_RAW.
+	(ffi_java_raw_to_ptrarray): Change type of raw to ffi_java_raw.
+	Replace FFI_SIZEOF_ARG with FFI_SIZEOF_JAVA_RAW. Use
+	sizeof(ffi_java_raw) for alignment calculations.
+	(ffi_java_ptrarray_to_raw): Same.
+	(ffi_java_rvalue_to_raw): Add special handling for FFI_TYPE_POINTER
+	if FFI_SIZEOF_JAVA_RAW == 4.
+	(ffi_java_raw_to_rvalue): Same.
+	(ffi_java_raw_call): Change type of raw to ffi_java_raw.
+	(ffi_java_translate_args): Same.
+	(ffi_prep_java_raw_closure_loc, ffi_prep_java_raw_closure): Change
+	parameter types.
+	* src/mips/ffitarget.h (FFI_SIZEOF_JAVA_RAW): Define for N32 ABI.
+
+2007-12-06  David Daney  <ddaney@avtrex.com>
+
+	* src/mips/n32.S (ffi_closure_N32): Use 64-bit add instruction on
+	pointer values.
+
+2007-12-01  Andreas Tobler  <a.tobler@schweiz.org>
+
+	PR libffi/31937
+	* src/powerpc/ffitarget.h: Introduce new ABI FFI_LINUX_SOFT_FLOAT.
+	Add local FFI_TYPE_UINT128 to handle soft-float long-double-128.
+	* src/powerpc/ffi.c: Distinguish between __NO_FPRS__ and not and
+	set the NUM_FPR_ARG_REGISTERS according to.
+	Add support for potential soft-float support under hard-float
+	architecture.
+	(ffi_prep_args_SYSV): Set NUM_FPR_ARG_REGISTERS to 0 in case of
+	FFI_LINUX_SOFT_FLOAT, handle float, doubles and long-doubles according
+	to the FFI_LINUX_SOFT_FLOAT ABI.
+	(ffi_prep_cif_machdep): Likewise.
+	(ffi_closure_helper_SYSV): Likewise.
+	* src/powerpc/ppc_closure.S: Make sure not to store float/double
+	on archs where __NO_FPRS__ is true.
+	Add FFI_TYPE_UINT128 support.
+	* src/powerpc/sysv.S: Add support for soft-float long-double-128.
+	Adjust copyright notice.
+
+2007-11-25  Andreas Tobler  <a.tobler@schweiz.org>
+
+	* src/closures.c: Move defintion of MAYBE_UNUSED from here to ...
+	* include/ffi_common.h: ... here.
+	Update copyright.
+
+2007-11-17  Andreas Tobler  <a.tobler@schweiz.org>
+
+	* src/powerpc/sysv.S: Load correct cr to compare if we have long double.
+	* src/powerpc/linux64.S: Likewise.
+	* src/powerpc/ffi.c: Add a comment to show which part goes into cr6.
+	* testsuite/libffi.call/return_ldl.c: New test.
+
+2007-09-04    <aph@redhat.com>
+
+	* src/arm/sysv.S (UNWIND): New.
+	(Whole file): Conditionally compile unwinder directives.
+	* src/arm/sysv.S: Add unwinder directives.
+
+	* src/arm/ffi.c (ffi_prep_args): Align structs by at least 4 bytes.
+	Only treat r0 as a struct address if we're actually returning a
+	struct by address.
+	Only copy the bytes that are actually within a struct.
+	(ffi_prep_cif_machdep): A Composite Type not larger than 4 bytes
+	is returned in r0, not passed by address.
+	(ffi_call): Allocate a word-sized temporary for the case where
+	a composite is returned in r0.
+	(ffi_prep_incoming_args_SYSV): Align as necessary.
+
+2007-08-05  Steven Newbury  <s_j_newbury@yahoo.co.uk>
+
+	* src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Use __clear_cache instead of
+	directly using the sys_cacheflush syscall.
+
+2007-07-27  Andrew Haley  <aph@redhat.com>
+
+	* src/arm/sysv.S (ffi_closure_SYSV): Add soft-float.
+
+2007-09-03  Maciej W. Rozycki  <macro@linux-mips.org>
+
+	* Makefile.am: Unify MIPS_IRIX and MIPS_LINUX into MIPS.
+	* configure.ac: Likewise.
+	* Makefile.in: Regenerate.
+	* include/Makefile.in: Likewise.
+	* testsuite/Makefile.in: Likewise.
+	* configure: Likewise.
+
+2007-08-24  David Daney  <ddaney@avtrex.com>
+
+	* testsuite/libffi.call/return_sl.c: New test.
+
+2007-08-10  David Daney  <ddaney@avtrex.com>
+
+	* testsuite/libffi.call/cls_multi_ushort.c,
+	testsuite/libffi.call/cls_align_uint16.c,
+	testsuite/libffi.call/nested_struct1.c,
+	testsuite/libffi.call/nested_struct3.c,
+	testsuite/libffi.call/cls_7_1_byte.c,
+	testsuite/libffi.call/nested_struct5.c,
+	testsuite/libffi.call/cls_double.c,
+	testsuite/libffi.call/nested_struct7.c,
+	testsuite/libffi.call/cls_sint.c,
+	testsuite/libffi.call/nested_struct9.c,
+	testsuite/libffi.call/cls_20byte1.c,
+	testsuite/libffi.call/cls_multi_sshortchar.c,
+	testsuite/libffi.call/cls_align_sint64.c,
+	testsuite/libffi.call/cls_3byte2.c,
+	testsuite/libffi.call/cls_multi_schar.c,
+	testsuite/libffi.call/cls_multi_uchar.c,
+	testsuite/libffi.call/cls_19byte.c,
+	testsuite/libffi.call/cls_9byte1.c,
+	testsuite/libffi.call/cls_align_float.c,
+	testsuite/libffi.call/closure_fn1.c,
+	testsuite/libffi.call/problem1.c,
+	testsuite/libffi.call/closure_fn3.c,
+	testsuite/libffi.call/cls_sshort.c,
+	testsuite/libffi.call/closure_fn5.c,
+	testsuite/libffi.call/cls_align_double.c,
+	testsuite/libffi.call/nested_struct.c,
+	testsuite/libffi.call/cls_2byte.c,
+	testsuite/libffi.call/nested_struct10.c,
+	testsuite/libffi.call/cls_4byte.c,
+	testsuite/libffi.call/cls_6byte.c,
+	testsuite/libffi.call/cls_8byte.c,
+	testsuite/libffi.call/cls_multi_sshort.c,
+	testsuite/libffi.call/cls_align_sint16.c,
+	testsuite/libffi.call/cls_align_uint32.c,
+	testsuite/libffi.call/cls_20byte.c,
+	testsuite/libffi.call/cls_float.c,
+	testsuite/libffi.call/nested_struct2.c,
+	testsuite/libffi.call/cls_5_1_byte.c,
+	testsuite/libffi.call/nested_struct4.c,
+	testsuite/libffi.call/cls_24byte.c,
+	testsuite/libffi.call/nested_struct6.c,
+	testsuite/libffi.call/cls_64byte.c,
+	testsuite/libffi.call/nested_struct8.c,
+	testsuite/libffi.call/cls_uint.c,
+	testsuite/libffi.call/cls_multi_ushortchar.c,
+	testsuite/libffi.call/cls_schar.c,
+	testsuite/libffi.call/cls_uchar.c,
+	testsuite/libffi.call/cls_align_uint64.c,
+	testsuite/libffi.call/cls_ulonglong.c,
+	testsuite/libffi.call/cls_align_longdouble.c,
+	testsuite/libffi.call/cls_1_1byte.c,
+	testsuite/libffi.call/cls_12byte.c,
+	testsuite/libffi.call/cls_3_1byte.c,
+	testsuite/libffi.call/cls_3byte1.c,
+	testsuite/libffi.call/cls_4_1byte.c,
+	testsuite/libffi.call/cls_6_1_byte.c,
+	testsuite/libffi.call/cls_16byte.c,
+	testsuite/libffi.call/cls_18byte.c,
+	testsuite/libffi.call/closure_fn0.c,
+	testsuite/libffi.call/cls_9byte2.c,
+	testsuite/libffi.call/closure_fn2.c,
+	testsuite/libffi.call/closure_fn4.c,
+	testsuite/libffi.call/cls_ushort.c,
+	testsuite/libffi.call/closure_fn6.c,
+	testsuite/libffi.call/cls_5byte.c,
+	testsuite/libffi.call/cls_align_pointer.c,
+	testsuite/libffi.call/cls_7byte.c,
+	testsuite/libffi.call/cls_align_sint32.c,
+	testsuite/libffi.special/unwindtest_ffi_call.cc,
+	testsuite/libffi.special/unwindtest.cc: Remove xfail for mips64*-*-*.
+
+2007-08-10  David Daney  <ddaney@avtrex.com>
+
+	PR libffi/28313
+	* configure.ac: Don't treat mips64 as a special case.
+	* Makefile.am (nodist_libffi_la_SOURCES): Add n32.S.
+	* configure: Regenerate
+	* Makefile.in: Ditto.
+	* fficonfig.h.in: Ditto.
+	* src/mips/ffitarget.h (REG_L, REG_S, SUBU, ADDU, SRL, LI): Indent.
+	(LA, EH_FRAME_ALIGN, FDE_ADDR_BYTES): New preprocessor macros.
+	(FFI_DEFAULT_ABI): Set for n64 case.
+	(FFI_CLOSURES, FFI_TRAMPOLINE_SIZE): Define for n32 and n64 cases.
+	* src/mips/n32.S (ffi_call_N32): Add debug macros and labels for FDE.
+	(ffi_closure_N32): New function.
+	(.eh_frame): New section
+	* src/mips/o32.S: Clean up comments.
+	(ffi_closure_O32): Pass ffi_closure parameter in $12.
+	* src/mips/ffi.c: Use FFI_MIPS_N32 instead of
+	_MIPS_SIM == _ABIN32 throughout.
+	(FFI_MIPS_STOP_HERE): New, use in place of
+	ffi_stop_here.
+	(ffi_prep_args): Use unsigned long to hold pointer values.  Rewrite
+	to support n32/n64 ABIs.
+	(calc_n32_struct_flags): Rewrite.
+	(calc_n32_return_struct_flags): Remove unused variable.  Reverse
+	position of flag bits.
+	(ffi_prep_cif_machdep): Rewrite n32 portion.
+	(ffi_call): Enable for n64.  Add special handling for small structure
+	return values.
+	(ffi_prep_closure_loc): Add n32 and n64 support.
+	(ffi_closure_mips_inner_O32): Add cast to silence warning.
+	(copy_struct_N32, ffi_closure_mips_inner_N32): New functions.
+
+2007-08-08  David Daney  <ddaney@avtrex.com>
+
+	* testsuite/libffi.call/ffitest.h (ffi_type_mylong): Remove definition.
+	* testsuite/libffi.call/cls_align_uint16.c (main): Use correct type
+	specifiers.
+	* testsuite/libffi.call/nested_struct1.c (main): Ditto.
+	* testsuite/libffi.call/cls_sint.c (main): Ditto.
+	* testsuite/libffi.call/nested_struct9.c (main): Ditto.
+	* testsuite/libffi.call/cls_20byte1.c (main): Ditto.
+	* testsuite/libffi.call/cls_9byte1.c (main): Ditto.
+	* testsuite/libffi.call/closure_fn1.c (main): Ditto.
+	* testsuite/libffi.call/closure_fn3.c (main): Ditto.
+	* testsuite/libffi.call/return_dbl2.c (main): Ditto.
+	* testsuite/libffi.call/cls_sshort.c (main): Ditto.
+	* testsuite/libffi.call/return_fl3.c (main): Ditto.
+	* testsuite/libffi.call/closure_fn5.c (main): Ditto.
+	* testsuite/libffi.call/nested_struct.c (main): Ditto.
+	* testsuite/libffi.call/nested_struct10.c (main): Ditto.
+	* testsuite/libffi.call/return_ll1.c (main): Ditto.
+	* testsuite/libffi.call/cls_8byte.c (main): Ditto.
+	* testsuite/libffi.call/cls_align_uint32.c (main): Ditto.
+	* testsuite/libffi.call/cls_align_sint16.c (main): Ditto.
+	* testsuite/libffi.call/cls_20byte.c (main): Ditto.
+	* testsuite/libffi.call/nested_struct2.c (main): Ditto.
+	* testsuite/libffi.call/cls_24byte.c (main): Ditto.
+	* testsuite/libffi.call/nested_struct6.c (main): Ditto.
+	* testsuite/libffi.call/cls_uint.c (main): Ditto.
+	* testsuite/libffi.call/cls_12byte.c (main): Ditto.
+	* testsuite/libffi.call/cls_16byte.c (main): Ditto.
+	* testsuite/libffi.call/closure_fn0.c (main): Ditto.
+	* testsuite/libffi.call/cls_9byte2.c (main): Ditto.
+	* testsuite/libffi.call/closure_fn2.c (main): Ditto.
+	* testsuite/libffi.call/return_dbl1.c (main): Ditto.
+	* testsuite/libffi.call/closure_fn4.c (main): Ditto.
+	* testsuite/libffi.call/closure_fn6.c (main): Ditto.
+	* testsuite/libffi.call/cls_align_sint32.c (main): Ditto.
+
+2007-08-07  Andrew Haley  <aph@redhat.com>
+
+	* src/x86/sysv.S (ffi_closure_raw_SYSV): Fix typo in previous
+	checkin.
+
+2007-08-06  Andrew Haley  <aph@redhat.com>
+
+	PR testsuite/32843
+	* src/x86/sysv.S (ffi_closure_raw_SYSV): Handle FFI_TYPE_UINT8,
+	FFI_TYPE_SINT8, FFI_TYPE_UINT16, FFI_TYPE_SINT16, FFI_TYPE_UINT32,
+	FFI_TYPE_SINT32.
+
+2007-08-02  David Daney  <ddaney@avtrex.com>
+
+	* testsuite/libffi.call/return_ul.c (main): Define return type as
+	ffi_arg.  Use proper printf conversion specifier.
+
+2007-07-30  Andrew Haley  <aph@redhat.com>
+
+	PR testsuite/32843
+	* src/x86/ffi.c (ffi_prep_cif_machdep): in x86 case, add code for
+	signed/unsigned int8/16.
+	* src/x86/sysv.S (ffi_call_SYSV): Rewrite to:
+	Use a jump table.
+	Remove code to pop args from the stack after call.
+	Special-case signed/unsigned int8/16.
+	* testsuite/libffi.call/return_sc.c (main): Revert.
+
+2007-07-26  Richard Guenther  <rguenther@suse.de>
+
+	PR testsuite/32843
+	* testsuite/libffi.call/return_sc.c (main): Verify call
+	result as signed char, not ffi_arg.
+
+2007-07-16  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* configure.ac (i?86-*-solaris2.1[0-9]): Set TARGET to X86_64.
+	* configure: Regenerate.
+
+2007-07-11  David Daney  <ddaney@avtrex.com>
+
+	* src/mips/ffi.c: Don't include sys/cachectl.h.
+	(ffi_prep_closure_loc): Use __builtin___clear_cache() instead of
+	cacheflush().
+
+2007-05-18  Aurelien Jarno  <aurelien@aurel32.net>
+
+	* src/arm/ffi.c (ffi_prep_closure_loc): Renamed and ajusted
+	from (ffi_prep_closure): ... this.
+	(FFI_INIT_TRAMPOLINE): Adjust.
+
+2005-12-31  Phil Blundell  <pb@reciva.com>
+
+	* src/arm/ffi.c (ffi_prep_incoming_args_SYSV,
+	ffi_closure_SYSV_inner, ffi_prep_closure): New, add closure support.
+	* src/arm/sysv.S(ffi_closure_SYSV): Likewise.
+	* src/arm/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise.
+	(FFI_CLOSURES): Enable closure support.
+
+2007-07-03  Andrew Haley  <aph@hedges.billgatliff.com>
+
+	* testsuite/libffi.call/cls_multi_ushort.c,
+	testsuite/libffi.call/cls_align_uint16.c,
+	testsuite/libffi.call/nested_struct1.c,
+	testsuite/libffi.call/nested_struct3.c,
+	testsuite/libffi.call/cls_7_1_byte.c,
+	testsuite/libffi.call/cls_double.c,
+	testsuite/libffi.call/nested_struct5.c,
+	testsuite/libffi.call/nested_struct7.c,
+	testsuite/libffi.call/cls_sint.c,
+	testsuite/libffi.call/nested_struct9.c,
+	testsuite/libffi.call/cls_20byte1.c,
+	testsuite/libffi.call/cls_multi_sshortchar.c,
+	testsuite/libffi.call/cls_align_sint64.c,
+	testsuite/libffi.call/cls_3byte2.c,
+	testsuite/libffi.call/cls_multi_schar.c,
+	testsuite/libffi.call/cls_multi_uchar.c,
+	testsuite/libffi.call/cls_19byte.c,
+	testsuite/libffi.call/cls_9byte1.c,
+	testsuite/libffi.call/cls_align_float.c,
+	testsuite/libffi.call/closure_fn1.c,
+	testsuite/libffi.call/problem1.c,
+	testsuite/libffi.call/closure_fn3.c,
+	testsuite/libffi.call/cls_sshort.c,
+	testsuite/libffi.call/closure_fn5.c,
+	testsuite/libffi.call/cls_align_double.c,
+	testsuite/libffi.call/cls_2byte.c,
+	testsuite/libffi.call/nested_struct.c,
+	testsuite/libffi.call/nested_struct10.c,
+	testsuite/libffi.call/cls_4byte.c,
+	testsuite/libffi.call/cls_6byte.c,
+	testsuite/libffi.call/cls_8byte.c,
+	testsuite/libffi.call/cls_multi_sshort.c,
+	testsuite/libffi.call/cls_align_uint32.c,
+	testsuite/libffi.call/cls_align_sint16.c,
+	testsuite/libffi.call/cls_float.c,
+	testsuite/libffi.call/cls_20byte.c,
+	testsuite/libffi.call/cls_5_1_byte.c,
+	testsuite/libffi.call/nested_struct2.c,
+	testsuite/libffi.call/cls_24byte.c,
+	testsuite/libffi.call/nested_struct4.c,
+	testsuite/libffi.call/nested_struct6.c,
+	testsuite/libffi.call/cls_64byte.c,
+	testsuite/libffi.call/nested_struct8.c,
+	testsuite/libffi.call/cls_uint.c,
+	testsuite/libffi.call/cls_multi_ushortchar.c,
+	testsuite/libffi.call/cls_schar.c,
+	testsuite/libffi.call/cls_uchar.c,
+	testsuite/libffi.call/cls_align_uint64.c,
+	testsuite/libffi.call/cls_ulonglong.c,
+	testsuite/libffi.call/cls_align_longdouble.c,
+	testsuite/libffi.call/cls_1_1byte.c,
+	testsuite/libffi.call/cls_12byte.c,
+	testsuite/libffi.call/cls_3_1byte.c,
+	testsuite/libffi.call/cls_3byte1.c,
+	testsuite/libffi.call/cls_4_1byte.c,
+	testsuite/libffi.call/cls_6_1_byte.c,
+	testsuite/libffi.call/cls_16byte.c,
+	testsuite/libffi.call/cls_18byte.c,
+	testsuite/libffi.call/closure_fn0.c,
+	testsuite/libffi.call/cls_9byte2.c,
+	testsuite/libffi.call/closure_fn2.c,
+	testsuite/libffi.call/closure_fn4.c,
+	testsuite/libffi.call/cls_ushort.c,
+	testsuite/libffi.call/closure_fn6.c,
+	testsuite/libffi.call/cls_5byte.c,
+	testsuite/libffi.call/cls_align_pointer.c,
+	testsuite/libffi.call/cls_7byte.c,
+	testsuite/libffi.call/cls_align_sint32.c,
+	testsuite/libffi.special/unwindtest_ffi_call.cc,
+	testsuite/libffi.special/unwindtest.cc: Enable for ARM.
+
+2007-07-05  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* aclocal.m4: Regenerated.
+
+2007-06-02  Paolo Bonzini  <bonzini@gnu.org>
+
+	* configure: Regenerate.
+
+2007-05-23  Steve Ellcey  <sje@cup.hp.com>
+
+	* Makefile.in: Regenerate.
+	* configure: Regenerate.
+	* aclocal.m4: Regenerate.
+	* include/Makefile.in: Regenerate.
+	* testsuite/Makefile.in: Regenerate.
+
+2007-05-10  Roman Zippel <zippel@linux-m68k.org>
+
+	* src/m68k/ffi.c (ffi_prep_incoming_args_SYSV,
+	ffi_closure_SYSV_inner,ffi_prep_closure): New, add closure support.
+	* src/m68k/sysv.S(ffi_closure_SYSV,ffi_closure_struct_SYSV): Likewise.
+	* src/m68k/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise.
+	(FFI_CLOSURES): Enable closure support.
+
+2007-05-10  Roman Zippel <zippel@linux-m68k.org>
+
+	* configure.ac (HAVE_AS_CFI_PSEUDO_OP): New test.
+	* configure: Regenerate.
+	* fficonfig.h.in: Regenerate.
+	* src/m68k/sysv.S (CFI_STARTPROC,CFI_ENDPROC,
+	CFI_OFFSET,CFI_DEF_CFA): New macros.
+	(ffi_call_SYSV): Add callframe annotation.
+
+2007-05-10  Roman Zippel <zippel@linux-m68k.org>
+
+	* src/m68k/ffi.c (ffi_prep_args,ffi_prep_cif_machdep): Fix
+	numerous test suite failures.
+	* src/m68k/sysv.S (ffi_call_SYSV): Likewise.
+
+2007-04-11  Paolo Bonzini  <bonzini@gnu.org>
+
+	* Makefile.am (EXTRA_DIST): Bring up to date.
+	* Makefile.in: Regenerate.
+	* src/frv/eabi.S: Remove RCS keyword.
+
+2007-04-06  Richard Henderson  <rth@redhat.com>
+
+	* configure.ac: Tidy target case.
+	(HAVE_LONG_DOUBLE): Allow the target to override.
+	* configure: Regenerate.
+	* include/ffi.h.in: Don't define ffi_type_foo if
+	LIBFFI_HIDE_BASIC_TYPES is defined.
+	(ffi_type_longdouble): If not HAVE_LONG_DOUBLE, define
+	to ffi_type_double.
+	* types.c (LIBFFI_HIDE_BASIC_TYPES): Define.
+	(FFI_TYPEDEF, ffi_type_void): Mark the data const.
+	(ffi_type_longdouble): Special case for Alpha.  Don't define
+	if long double == double.
+
+	* src/alpha/ffi.c (FFI_TYPE_LONGDOUBLE): Assert unique value.
+	(ffi_prep_cif_machdep): Handle it as the 128-bit type.
+	(ffi_call, ffi_closure_osf_inner): Likewise.
+	(ffi_closure_osf_inner): Likewise.  Mark hidden.
+	(ffi_call_osf, ffi_closure_osf): Mark hidden.
+	* src/alpha/ffitarget.h (FFI_LAST_ABI): Tidy definition.
+	* src/alpha/osf.S (ffi_call_osf, ffi_closure_osf): Mark hidden.
+	(load_table): Handle 128-bit long double.
+
+	* testsuite/libffi.call/float4.c: Add -mieee for alpha.
+
+2007-04-06  Tom Tromey  <tromey@redhat.com>
+
+	PR libffi/31491:
+	* README: Fixed bug in example.
+
+2007-04-03  Jakub Jelinek  <jakub@redhat.com>
+
+	* src/closures.c: Include sys/statfs.h.
+	(_GNU_SOURCE): Define on Linux.
+	(FFI_MMAP_EXEC_SELINUX): Define.
+	(selinux_enabled): New variable.
+	(selinux_enabled_check): New function.
+	(is_selinux_enabled): Define.
+	(dlmmap): Use it.
+
+2007-03-24  Uros Bizjak  <ubizjak@gmail.com>
+
+	* testsuite/libffi.call/return_fl2.c (return_fl): Mark as static.
+	Use 'volatile float sum' to create sum of floats to avoid false
+	negative due to excess precision on ix86 targets.
+	(main): Ditto.
+
+2007-03-08  Alexandre Oliva  <aoliva@redhat.com>
+
+	* src/powerpc/ffi.c (flush_icache): Fix left-over from previous
+	patch.
+	(ffi_prep_closure_loc): Remove unneeded casts.  Add needed ones.
+
+2007-03-07  Alexandre Oliva  <aoliva@redhat.com>
+
+	* include/ffi.h.in (ffi_closure_alloc, ffi_closure_free): New.
+	(ffi_prep_closure_loc): New.
+	(ffi_prep_raw_closure_loc): New.
+	(ffi_prep_java_raw_closure_loc): New.
+	* src/closures.c: New file.
+	* src/dlmalloc.c [FFI_MMAP_EXEC_WRIT] (struct malloc_segment):
+	Replace sflags with exec_offset.
+	[FFI_MMAP_EXEC_WRIT] (mmap_exec_offset, add_segment_exec_offset,
+	sub_segment_exec_offset): New macros.
+	(get_segment_flags, set_segment_flags, check_segment_merge): New
+	macros.
+	(is_mmapped_segment, is_extern_segment): Use get_segment_flags.
+	(add_segment, sys_alloc, create_mspace, create_mspace_with_base,
+	destroy_mspace): Use new macros.
+	(sys_alloc): Silence warning.
+	* Makefile.am (libffi_la_SOURCES): Add src/closures.c.
+	* Makefile.in: Rebuilt.
+	* src/prep_cif [FFI_CLOSURES] (ffi_prep_closure): Implement in
+	terms of ffi_prep_closure_loc.
+	* src/raw_api.c (ffi_prep_raw_closure_loc): Renamed and adjusted
+	from...
+	(ffi_prep_raw_closure): ... this.  Re-implement in terms of the
+	renamed version.
+	* src/java_raw_api (ffi_prep_java_raw_closure_loc): Renamed and
+	adjusted from...
+	(ffi_prep_java_raw_closure): ... this.  Re-implement in terms of
+	the renamed version.
+	* src/alpha/ffi.c (ffi_prep_closure_loc): Renamed from
+	(ffi_prep_closure): ... this.
+	* src/pa/ffi.c: Likewise.
+	* src/cris/ffi.c: Likewise.  Adjust.
+	* src/frv/ffi.c: Likewise.
+	* src/ia64/ffi.c: Likewise.
+	* src/mips/ffi.c: Likewise.
+	* src/powerpc/ffi_darwin.c: Likewise.
+	* src/s390/ffi.c: Likewise.
+	* src/sh/ffi.c: Likewise.
+	* src/sh64/ffi.c: Likewise.
+	* src/sparc/ffi.c: Likewise.
+	* src/x86/ffi64.c: Likewise.
+	* src/x86/ffi.c: Likewise.
+	(FFI_INIT_TRAMPOLINE): Adjust.
+	(ffi_prep_raw_closure_loc): Renamed and adjusted from...
+	(ffi_prep_raw_closure): ... this.
+	* src/powerpc/ffi.c (ffi_prep_closure_loc): Renamed from
+	(ffi_prep_closure): ... this.
+	(flush_icache): Adjust.
+
+2007-03-07  Alexandre Oliva  <aoliva@redhat.com>
+
+	* src/dlmalloc.c: New file, imported version 2.8.3 of Doug
+	Lea's malloc.
+
+2007-03-01  Brooks Moses  <brooks.moses@codesourcery.com>
+
+	* Makefile.am: Add dummy install-pdf target.
+	* Makefile.in: Regenerate
+
+2007-02-13  Andreas Krebbel  <krebbel1@de.ibm.com>
+
+	* src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep,
+	ffi_closure_helper_SYSV): Add long double handling.
+
+2007-02-02  Jakub Jelinek  <jakub@redhat.com>
+
+	* src/powerpc/linux64.S (ffi_call_LINUX64): Move restore of r2
+	immediately after bctrl instruction.
+
+2007-01-18  Alexandre Oliva  <aoliva@redhat.com>
+
+	* Makefile.am (all-recursive, install-recursive,
+	mostlyclean-recursive, clean-recursive, distclean-recursive,
+	maintainer-clean-recursive): Add missing targets.
+	* Makefile.in: Rebuilt.
+
+2006-12-14  Andreas Tobler  <a.tobler@schweiz.org>
+
+	* configure.ac: Add TARGET for x86_64-*-darwin*.
+	* Makefile.am (nodist_libffi_la_SOURCES): Add rules for 64-bit sources
+	for X86_DARWIN.
+	* src/x86/ffitarget.h: Set trampoline size for x86_64-*-darwin*.
+	* src/x86/darwin64.S: New file for x86_64-*-darwin* support.
+	* configure: Regenerate.
+	* Makefile.in: Regenerate.
+	* include/Makefile.in: Regenerate.
+	* testsuite/Makefile.in: Regenerate.
+	* testsuite/libffi.special/unwindtest_ffi_call.cc: New test case for
+	ffi_call only.
+
+2006-12-13  Andreas Tobler <a.tobler@schweiz.org>
+
+	* aclocal.m4: Regenerate with aclocal -I .. as written in the
+	Makefile.am.
+
+2006-10-31  Geoffrey Keating  <geoffk@apple.com>
+
+	* src/powerpc/ffi_darwin.c (darwin_adjust_aggregate_sizes): New.
+	(ffi_prep_cif_machdep): Call darwin_adjust_aggregate_sizes for
+	Darwin.
+	* testsuite/libffi.call/nested_struct4.c: Remove Darwin XFAIL.
+	* testsuite/libffi.call/nested_struct6.c: Remove Darwin XFAIL.
+
+2006-10-10  Paolo Bonzini  <bonzini@gnu.org>
+	    Sandro Tolaini  <tolaini@libero.it>
+
+	* configure.ac [i*86-*-darwin*]: Set X86_DARWIN symbol and
+	conditional.
+	* configure: Regenerated.
+	* Makefile.am (nodist_libffi_la_SOURCES) [X86_DARWIN]: New case.
+	(EXTRA_DIST): Add src/x86/darwin.S.
+	* Makefile.in: Regenerated.
+	* include/Makefile.in: Regenerated.
+	* testsuite/Makefile.in: Regenerated.
+
+	* src/x86/ffi.c (ffi_prep_cif_machdep) [X86_DARWIN]: Treat like
+	X86_WIN32, and additionally align stack to 16 bytes.
+	* src/x86/darwin.S: New, based on sysv.S.
+	* src/prep_cif.c (ffi_prep_cif) [X86_DARWIN]: Align > 8-byte structs.
+
+2006-09-12  David Daney  <ddaney@avtrex.com>
+
+	PR libffi/23935
+	* include/Makefile.am: Install both ffi.h and ffitarget.h in
+	$(libdir)/gcc/$(target_alias)/$(gcc_version)/include.
+	* aclocal.m4: Regenerated for automake 1.9.6.
+	* Makefile.in: Regenerated.
+	* include/Makefile.in: Regenerated.
+	* testsuite/Makefile.in: Regenerated.
+
+2006-08-17  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* include/ffi_common.h (struct): Revert accidental commit.
+
+2006-08-15  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* include/ffi_common.h: Remove lint directives.
+	* include/ffi.h.in: Likewise.
+
+2006-07-25  Torsten Schoenfeld  <kaffeetisch@gmx.de>
+
+	* include/ffi.h.in (ffi_type_ulong, ffi_type_slong): Define correctly
+	for 32-bit architectures.
+	* testsuite/libffi.call/return_ul.c: New test case.
+
+2006-07-19  David Daney  <ddaney@avtrex.com>
+
+	* testsuite/libffi.call/closure_fn6.c: Remove xfail for mips,
+	xfail remains for mips64.
+
+2006-05-23  Carlos O'Donell  <carlos@codesourcery.com>
+
+	* Makefile.am: Add install-html target. Add install-html to .PHONY
+	* Makefile.in: Regenerate.
+	* aclocal.m4: Regenerate.
+	* include/Makefile.in: Regenerate.
+	* testsuite/Makefile.in: Regenerate.
+
+2006-05-18  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+	* pa/ffi.c (ffi_prep_args_pa32): Load floating point arguments from
+	stack slot.
+
+2006-04-22  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* README: Remove notice about 'Crazy Comments'.
+	* src/debug.c: Remove lint directives. Cleanup white spaces.
+	* src/java_raw_api.c: Likewise.
+	* src/prep_cif.c: Likewise.
+	* src/raw_api.c: Likewise.
+	* src/ffitest.c: Delete. No longer needed, all test cases migrated
+	to the testsuite.
+	* src/arm/ffi.c: Remove lint directives.
+	* src/m32r/ffi.c: Likewise.
+	* src/pa/ffi.c: Likewise.
+	* src/powerpc/ffi.c: Likewise.
+	* src/powerpc/ffi_darwin.c: Likewise.
+	* src/sh/ffi.c: Likewise.
+	* src/sh64/ffi.c: Likewise.
+	* src/x86/ffi.c: Likewise.
+	* testsuite/libffi.call/float2.c: Likewise.
+	* testsuite/libffi.call/promotion.c: Likewise.
+	* testsuite/libffi.call/struct1.c: Likewise.
+
+2006-04-13  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/pa/hpux32.S: Correct unwind offset calculation for
+	ffi_closure_pa32.
+	* src/pa/linux.S: Likewise.
+
+2006-04-12  James E Wilson  <wilson@specifix.com>
+
+	PR libgcj/26483
+	* src/ia64/ffi.c (stf_spill, ldf_fill): Rewrite as macros.
+	(hfa_type_load): Call stf_spill.
+	(hfa_type_store): Call ldf_fill.
+	(ffi_call): Adjust calls to above routines.  Add local temps for
+	macro result.
+
+2006-04-10  Matthias Klose  <doko@debian.org>
+
+	* testsuite/lib/libffi-dg.exp (libffi-init): Recognize multilib
+	directory names containing underscores.
+
+2006-04-07  James E Wilson  <wilson@specifix.com>
+
+	* testsuite/libffi.call/float4.c: New testcase.
+
+2006-04-05  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+	    Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* Makefile.am: Add PA_HPUX port.
+	* Makefile.in: Regenerate.
+	* include/Makefile.in: Likewise.
+	* testsuite/Makefile.in: Likewise.
+	* configure.ac: Add PA_HPUX rules.
+	* configure: Regenerate.
+	* src/pa/ffitarget.h: Rename linux target to PA_LINUX.
+	Add PA_HPUX and PA64_HPUX.
+	Rename FFI_LINUX ABI to FFI_PA32 ABI.
+	(FFI_TRAMPOLINE_SIZE): Define for 32-bit HP-UX targets.
+	(FFI_TYPE_SMALL_STRUCT2): Define.
+	(FFI_TYPE_SMALL_STRUCT4): Likewise.
+	(FFI_TYPE_SMALL_STRUCT8): Likewise.
+	(FFI_TYPE_SMALL_STRUCT3): Redefine.
+	(FFI_TYPE_SMALL_STRUCT5): Likewise.
+	(FFI_TYPE_SMALL_STRUCT6): Likewise.
+	(FFI_TYPE_SMALL_STRUCT7): Likewise.
+	* src/pa/ffi.c (ROUND_DOWN): Delete.
+	(fldw, fstw, fldd, fstd): Use '__asm__'.
+	(ffi_struct_type): Add support for FFI_TYPE_SMALL_STRUCT2,
+	FFI_TYPE_SMALL_STRUCT4 and FFI_TYPE_SMALL_STRUCT8.
+	(ffi_prep_args_LINUX): Rename to ffi_prep_args_pa32. Update comment.
+	Simplify incrementing of stack slot variable. Change type of local
+	'n' to unsigned int.
+	(ffi_size_stack_LINUX): Rename to ffi_size_stack_pa32. Handle long
+	double on PA_HPUX.
+	(ffi_prep_cif_machdep): Likewise.
+	(ffi_call): Likewise.
+	(ffi_closure_inner_LINUX): Rename to ffi_closure_inner_pa32. Change
+	return type to ffi_status. Simplify incrementing of stack slot
+	variable. Only copy floating point argument registers when PA_LINUX
+	is true. Reformat debug statement.
+	Add support for FFI_TYPE_SMALL_STRUCT2, FFI_TYPE_SMALL_STRUCT4 and
+	FFI_TYPE_SMALL_STRUCT8.
+	(ffi_closure_LINUX): Rename to ffi_closure_pa32. Add 'extern' to
+	declaration.
+	(ffi_prep_closure): Make linux trampoline conditional on PA_LINUX.
+	Add nops to cache flush.  Add trampoline for PA_HPUX.
+	* src/pa/hpux32.S: New file.
+	* src/pa/linux.S (ffi_call_LINUX): Rename to ffi_call_pa32. Rename
+	ffi_prep_args_LINUX to ffi_prep_args_pa32.
+	Localize labels. Add support for 2, 4 and 8-byte small structs. Handle
+	unaligned destinations in 3, 5, 6 and 7-byte small structs. Order
+	argument type checks so that common argument types appear first.
+	(ffi_closure_LINUX): Rename to ffi_closure_pa32. Rename
+	ffi_closure_inner_LINUX to ffi_closure_inner_pa32.
+
+2006-03-24  Alan Modra  <amodra@bigpond.net.au>
+
+	* src/powerpc/ffitarget.h (enum ffi_abi): Add FFI_LINUX.  Default
+	for 32-bit using IBM extended double format.  Fix FFI_LAST_ABI.
+	* src/powerpc/ffi.c (ffi_prep_args_SYSV): Handle linux variant of
+	FFI_TYPE_LONGDOUBLE.
+	(ffi_prep_args64): Assert using IBM extended double.
+	(ffi_prep_cif_machdep): Don't munge FFI_TYPE_LONGDOUBLE type.
+	Handle FFI_LINUX FFI_TYPE_LONGDOUBLE return and args.
+	(ffi_call): Handle FFI_LINUX.
+	(ffi_closure_helper_SYSV): Non FFI_LINUX long double return needs
+	gpr3 return pointer as for struct return.  Handle FFI_LINUX
+	FFI_TYPE_LONGDOUBLE return and args.  Don't increment "nf"
+	unnecessarily.
+	* src/powerpc/ppc_closure.S (ffi_closure_SYSV): Load both f1 and f2
+	for FFI_TYPE_LONGDOUBLE.  Move epilogue insns into case table.
+	Don't use r6 as pointer to results, instead use sp offset.  Don't
+	make a special call to load lr with case table address, instead
+	use offset from previous call.
+	* src/powerpc/sysv.S (ffi_call_SYSV): Save long double return.
+	* src/powerpc/linux64.S (ffi_call_LINUX64): Simplify long double
+	return.
+
+2006-03-15  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh64/ffi.c (ffi_prep_cif_machdep): Handle float arguments
+	passed with FP registers correctly.
+	(ffi_closure_helper_SYSV): Likewise.
+	* src/sh64/sysv.S: Likewise.
+
+2006-03-01  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.special/unwindtest.cc (closure_test_fn): Mark cif,
+	args and userdata unused.
+	(closure_test_fn1): Mark cif and userdata unused.
+	(main): Remove unused res.
+
+2006-02-28  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/call.exp: Adjust FSF address. Add test runs for
+	-O2, -O3, -Os and the warning flags -W -Wall.
+	* testsuite/libffi.special/special.exp: Likewise.
+	* testsuite/libffi.call/ffitest.h: Add an __UNUSED__ macro to mark
+	unused parameter unused for gcc or else do nothing.
+	* testsuite/libffi.special/ffitestcxx.h: Likewise.
+	* testsuite/libffi.call/cls_12byte.c (cls_struct_12byte_gn): Mark cif
+	and userdata unused.
+	* testsuite/libffi.call/cls_16byte.c (cls_struct_16byte_gn): Likewise.
+	* testsuite/libffi.call/cls_18byte.c (cls_struct_18byte_gn): Likewise.
+	* testsuite/libffi.call/cls_19byte.c (cls_struct_19byte_gn): Likewise.
+	* testsuite/libffi.call/cls_1_1byte.c (cls_struct_1_1byte_gn): Likewise.
+	* testsuite/libffi.call/cls_20byte.c (cls_struct_20byte_gn): Likewise.
+	* testsuite/libffi.call/cls_20byte1.c (cls_struct_20byte_gn): Likewise.
+	* testsuite/libffi.call/cls_24byte.c (cls_struct_24byte_gn): Likewise.
+	* testsuite/libffi.call/cls_2byte.c (cls_struct_2byte_gn): Likewise.
+	* testsuite/libffi.call/cls_3_1byte.c (cls_struct_3_1byte_gn): Likewise.
+	* testsuite/libffi.call/cls_3byte1.c (cls_struct_3byte_gn): Likewise.
+	* testsuite/libffi.call/cls_3byte2.c (cls_struct_3byte_gn1): Likewise.
+	* testsuite/libffi.call/cls_4_1byte.c (cls_struct_4_1byte_gn): Likewise.
+	* testsuite/libffi.call/cls_4byte.c (cls_struct_4byte_gn): Likewise.
+	* testsuite/libffi.call/cls_5_1_byte.c (cls_struct_5byte_gn): Likewise.
+	* testsuite/libffi.call/cls_5byte.c (cls_struct_5byte_gn): Likewise.
+	* testsuite/libffi.call/cls_64byte.c (cls_struct_64byte_gn): Likewise.
+	* testsuite/libffi.call/cls_6_1_byte.c (cls_struct_6byte_gn): Likewise.
+	* testsuite/libffi.call/cls_6byte.c (cls_struct_6byte_gn): Likewise.
+	* testsuite/libffi.call/cls_7_1_byte.c (cls_struct_7byte_gn): Likewise.
+	* testsuite/libffi.call/cls_7byte.c (cls_struct_7byte_gn): Likewise.
+	* testsuite/libffi.call/cls_8byte.c (cls_struct_8byte_gn): Likewise.
+	* testsuite/libffi.call/cls_9byte1.c (cls_struct_9byte_gn): Likewise.
+	* testsuite/libffi.call/cls_9byte2.c (cls_struct_9byte_gn): Likewise.
+	* testsuite/libffi.call/cls_align_double.c (cls_struct_align_gn):
+	Likewise.
+	* testsuite/libffi.call/cls_align_float.c (cls_struct_align_gn):
+	Likewise.
+	* testsuite/libffi.call/cls_align_longdouble.c (cls_struct_align_gn):
+	Likewise.
+	* testsuite/libffi.call/cls_align_pointer.c (cls_struct_align_fn): Cast
+	void* to avoid compiler warning.
+	(main): Likewise.
+	(cls_struct_align_gn): Mark cif and userdata unused.
+	* testsuite/libffi.call/cls_align_sint16.c (cls_struct_align_gn):
+	Likewise.
+	* testsuite/libffi.call/cls_align_sint32.c (cls_struct_align_gn):
+	Likewise.
+	* testsuite/libffi.call/cls_align_sint64.c (cls_struct_align_gn):
+	Likewise.
+	* testsuite/libffi.call/cls_align_uint16.c (cls_struct_align_gn):
+	Likewise.
+	* testsuite/libffi.call/cls_align_uint32.c (cls_struct_align_gn):
+	Likewise.
+	* testsuite/libffi.call/cls_double.c (cls_ret_double_fn): Likewise.
+	* testsuite/libffi.call/cls_float.c (cls_ret_float_fn): Likewise.
+	* testsuite/libffi.call/cls_multi_schar.c (test_func_gn): Mark cif and
+	data unused.
+	(main): Cast res_call to silence gcc.
+	* testsuite/libffi.call/cls_multi_sshort.c (test_func_gn): Mark cif and
+	data unused.
+	(main): Cast res_call to silence gcc.
+	* testsuite/libffi.call/cls_multi_sshortchar.c (test_func_gn): Mark cif
+	and data unused.
+	(main): Cast res_call to silence gcc.
+	* testsuite/libffi.call/cls_multi_uchar.c (test_func_gn): Mark cif and
+	data unused.
+	(main): Cast res_call to silence gcc.
+	* testsuite/libffi.call/cls_multi_ushort.c (test_func_gn): Mark cif and
+	data unused.
+	(main): Cast res_call to silence gcc.
+	* testsuite/libffi.call/cls_multi_ushortchar.c (test_func_gn): Mark cif
+	and data unused.
+	(main): Cast res_call to silence gcc.
+	* testsuite/libffi.call/cls_schar.c (cls_ret_schar_fn): Mark cif and
+	userdata unused.
+	(cls_ret_schar_fn): Cast printf parameter to silence gcc.
+	* testsuite/libffi.call/cls_sint.c (cls_ret_sint_fn): Mark cif and
+	userdata unused.
+	(cls_ret_sint_fn): Cast printf parameter to silence gcc.
+	* testsuite/libffi.call/cls_sshort.c (cls_ret_sshort_fn): Mark cif and
+	userdata unused.
+	(cls_ret_sshort_fn): Cast printf parameter to silence gcc.
+	* testsuite/libffi.call/cls_uchar.c (cls_ret_uchar_fn):  Mark cif and
+	userdata unused.
+	(cls_ret_uchar_fn): Cast printf parameter to silence gcc.
+	* testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Mark cif and
+	userdata unused.
+	(cls_ret_uint_fn): Cast printf parameter to silence gcc.
+	* testsuite/libffi.call/cls_ulonglong.c (cls_ret_ulonglong_fn): Mark cif
+	and userdata unused.
+	* testsuite/libffi.call/cls_ushort.c (cls_ret_ushort_fn): Mark cif and
+	userdata unused.
+	(cls_ret_ushort_fn): Cast printf parameter to silence gcc.
+	* testsuite/libffi.call/float.c (floating): Remove unused parameter e.
+	* testsuite/libffi.call/float1.c (main): Remove unused variable i.
+	Cleanup white spaces.
+	* testsuite/libffi.call/negint.c (checking): Remove unused variable i.
+	* testsuite/libffi.call/nested_struct.c (cls_struct_combined_gn): Mark
+	cif and userdata unused.
+	* testsuite/libffi.call/nested_struct1.c (cls_struct_combined_gn):
+	Likewise.
+	* testsuite/libffi.call/nested_struct10.c (B_gn): Likewise.
+	* testsuite/libffi.call/nested_struct2.c (B_fn): Adjust printf
+	formatters to silence gcc.
+	(B_gn): Mark cif and userdata unused.
+	* testsuite/libffi.call/nested_struct3.c (B_gn): Mark cif and userdata
+	unused.
+	* testsuite/libffi.call/nested_struct4.c: Mention related PR.
+	(B_gn): Mark cif and userdata unused.
+	* testsuite/libffi.call/nested_struct5.c (B_gn): Mark cif and userdata
+	unused.
+	* testsuite/libffi.call/nested_struct6.c: Mention related PR.
+	(B_gn): Mark cif and userdata unused.
+	* testsuite/libffi.call/nested_struct7.c (B_gn): Mark cif and userdata
+	unused.
+	* testsuite/libffi.call/nested_struct8.c (B_gn): Likewise.
+	* testsuite/libffi.call/nested_struct9.c (B_gn): Likewise.
+	* testsuite/libffi.call/problem1.c (stub): Likewise.
+	* testsuite/libffi.call/pyobjc-tc.c (main): Cast the result to silence
+	gcc.
+	* testsuite/libffi.call/return_fl2.c (return_fl): Add the note mentioned
+	in the last commit for this test case in the test case itself.
+	* testsuite/libffi.call/closure_fn0.c (closure_test_fn0): Mark cif as
+	unused.
+	* testsuite/libffi.call/closure_fn1.c (closure_test_fn1): Likewise.
+	* testsuite/libffi.call/closure_fn2.c (closure_test_fn2): Likewise.
+	* testsuite/libffi.call/closure_fn3.c (closure_test_fn3): Likewise.
+	* testsuite/libffi.call/closure_fn4.c (closure_test_fn0): Likewise.
+	* testsuite/libffi.call/closure_fn5.c (closure_test_fn5): Likewise.
+	* testsuite/libffi.call/closure_fn6.c (closure_test_fn0): Likewise.
+
+2006-02-22  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/sysv.S: Fix register numbers in the FDE for
+	ffi_closure_SYSV.
+
+2006-02-20  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/return_fl2.c (return_fl): Remove static
+	declaration to avoid a false negative on ix86. See PR323.
+
+2006-02-18  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/ffi.c (ffi_closure_helper_SYSV): Remove unused variable
+	and cast integer to void * if needed.  Update the pointer to
+	the FP register saved area correctly.
+
+2006-02-17  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/nested_struct6.c: XFAIL this test until PR25630
+	is fixed.
+	* testsuite/libffi.call/nested_struct4.c: Likewise.
+
+2006-02-16  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/return_dbl.c: New test case.
+	* testsuite/libffi.call/return_dbl1.c: Likewise.
+	* testsuite/libffi.call/return_dbl2.c: Likewise.
+	* testsuite/libffi.call/return_fl.c: Likewise.
+	* testsuite/libffi.call/return_fl1.c: Likewise.
+	* testsuite/libffi.call/return_fl2.c: Likewise.
+	* testsuite/libffi.call/return_fl3.c: Likewise.
+	* testsuite/libffi.call/closure_fn6.c: Likewise.
+
+	* testsuite/libffi.call/nested_struct2.c: Remove ffi_type_mylong
+	definition.
+	* testsuite/libffi.call/ffitest.h: Add ffi_type_mylong definition
+	here to be used by other test cases too.
+
+	* testsuite/libffi.call/nested_struct10.c: New test case.
+	* testsuite/libffi.call/nested_struct9.c: Likewise.
+	* testsuite/libffi.call/nested_struct8.c: Likewise.
+	* testsuite/libffi.call/nested_struct7.c: Likewise.
+	* testsuite/libffi.call/nested_struct6.c: Likewise.
+	* testsuite/libffi.call/nested_struct5.c: Likewise.
+	* testsuite/libffi.call/nested_struct4.c: Likewise.
+
+2006-01-21  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* configure.ac: Enable libffi for sparc64-*-freebsd*.
+	* configure: Rebuilt.
+
+2006-01-18  Jakub Jelinek  <jakub@redhat.com>
+
+	* src/powerpc/sysv.S (smst_two_register): Don't call __ashldi3,
+	instead do the shifting inline.
+	* src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't compute %r5
+	shift count unconditionally.  Simplify load sequences for 1, 2, 3, 4
+	and 8 byte structs, for the remaining struct sizes don't call
+	__lshrdi3, instead do the shifting inline.
+
+2005-12-07  Thiemo Seufer  <ths@networkno.de>
+
+	* src/mips/ffitarget.h: Remove obsolete sgidefs.h include. Add
+	missing parentheses.
+	* src/mips/o32.S (ffi_call_O32): Code formatting. Define
+	and use A3_OFF, FP_OFF, RA_OFF. Micro-optimizations.
+	(ffi_closure_O32): Likewise, but with newly defined A3_OFF2,
+	A2_OFF2, A1_OFF2, A0_OFF2, RA_OFF2, FP_OFF2, S0_OFF2, GP_OFF2,
+	V1_OFF2, V0_OFF2, FA_1_1_OFF2, FA_1_0_OFF2, FA_0_1_OFF2,
+	FA_0_0_OFF2.
+	* src/mips/ffi.c (ffi_prep_args): Code formatting. Fix
+	endianness bugs.
+	(ffi_prep_closure): Improve trampoline instruction scheduling.
+	(ffi_closure_mips_inner_O32): Fix endianness bugs.
+
+2005-12-03  Alan Modra  <amodra@bigpond.net.au>
+
+	* src/powerpc/ffi.c: Formatting.
+	(ffi_prep_args_SYSV): Avoid possible aliasing problems by using unions.
+	(ffi_prep_args64): Likewise.
+
+2005-09-30  Geoffrey Keating  <geoffk@apple.com>
+
+	* testsuite/lib/libffi-dg.exp (libffi_target_compile): For
+	darwin, use -shared-libgcc not -lgcc_s, and explain why.
+
+2005-09-26  Tom Tromey  <tromey@redhat.com>
+
+	* testsuite/libffi.call/float1.c (value_type): New typedef.
+	(CANARY): New define.
+	(main): Check for result buffer overflow.
+	* src/powerpc/linux64.S: Handle linux64 long double returns.
+	* src/powerpc/ffi.c (FLAG_RETURNS_128BITS): New constant.
+	(ffi_prep_cif_machdep): Handle linux64 long double returns.
+
+2005-08-25  Alan Modra  <amodra@bigpond.net.au>
+
+	PR target/23404
+	* src/powerpc/ffi.c (ffi_prep_args_SYSV): Correct placement of stack
+	homed fp args.
+	(ffi_status ffi_prep_cif_machdep): Correct stack sizing for same.
+
+2005-08-11  Jakub Jelinek  <jakub@redhat.com>
+
+	* configure.ac (HAVE_HIDDEN_VISIBILITY_ATTRIBUTE): New test.
+	(AH_BOTTOM): Add FFI_HIDDEN definition.
+	* configure: Rebuilt.
+	* fficonfig.h.in: Rebuilt.
+	* src/powerpc/ffi.c (hidden): Remove.
+	(ffi_closure_LINUX64, ffi_prep_args64, ffi_call_LINUX64,
+	ffi_closure_helper_LINUX64): Use FFI_HIDDEN instead of hidden.
+	* src/powerpc/linux64_closure.S (ffi_closure_LINUX64,
+	.ffi_closure_LINUX64): Use FFI_HIDDEN instead of .hidden.
+	* src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV): Remove,
+	add FFI_HIDDEN to its prototype.
+	(ffi_closure_SYSV_inner): New.
+	* src/x86/sysv.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New.
+	* src/x86/win32.S (ffi_closure_SYSV, ffi_closure_raw_SYSV): New.
+
+2005-08-10  Alfred M. Szmidt  <ams@gnu.org>
+
+	PR libffi/21819:
+	* configure: Rebuilt.
+	* configure.ac: Handle i*86-*-gnu*.
+
+2005-08-09  Jakub Jelinek  <jakub@redhat.com>
+
+	* src/powerpc/ppc_closure.S (ffi_closure_SYSV): Use
+	DW_CFA_offset_extended_sf rather than
+	DW_CFA_GNU_negative_offset_extended.
+	* src/powerpc/sysv.S (ffi_call_SYSV): Likewise.
+
+2005-07-22  SUGIOKA Toshinobu  <sugioka@itonet.co.jp>
+
+	* src/sh/sysv.S (ffi_call_SYSV): Stop argument popping correctly
+	on sh3.
+	(ffi_closure_SYSV): Change the stack layout for sh3 struct argument.
+	* src/sh/ffi.c (ffi_prep_args): Fix sh3 argument copy, when it is
+	partially on register.
+	(ffi_closure_helper_SYSV): Likewise.
+	(ffi_prep_cif_machdep): Don't set too many cif->flags.
+
+2005-07-20  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/ffi.c (ffi_call): Handle small structures correctly.
+	Remove empty line.
+	* src/sh64/ffi.c (simple_type): Remove.
+	(return_type): Handle small structures correctly.
+	(ffi_prep_args): Likewise.
+	(ffi_call): Likewise.
+	(ffi_closure_helper_SYSV): Likewise.
+	* src/sh64/sysv.S (ffi_call_SYSV): Handle 1, 2 and 4-byte return.
+	Emit position independent code if PIC and remove wrong datalabel
+	prefixes from EH data.
+
+2005-07-19  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* Makefile.am (nodist_libffi_la_SOURCES): Add POWERPC_FREEBSD.
+	* Makefile.in: Regenerate.
+	* include/Makefile.in: Likewise.
+	* testsuite/Makefile.in: Likewise.
+	* configure.ac: Add POWERPC_FREEBSD rules.
+	* configure: Regenerate.
+	* src/powerpc/ffitarget.h: Add POWERPC_FREEBSD rules.
+	(FFI_SYSV_TYPE_SMALL_STRUCT): Define.
+	* src/powerpc/ffi.c: Add flags to handle small structure returns
+	in ffi_call_SYSV.
+	(ffi_prep_cif_machdep): Handle small structures for SYSV 4 ABI.
+	Aka FFI_SYSV.
+	(ffi_closure_helper_SYSV): Likewise.
+	* src/powerpc/ppc_closure.S: Add return types for small structures.
+	* src/powerpc/sysv.S: Add bits to handle small structures for
+	final SYSV 4 ABI.
+
+2005-07-10  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/cls_5_1_byte.c: New test file.
+	* testsuite/libffi.call/cls_6_1_byte.c: Likewise.
+	* testsuite/libffi.call/cls_7_1_byte.c: Likewise.
+
+2005-07-05  Randolph Chung  <tausq@debian.org>
+
+	* src/pa/ffi.c (ffi_struct_type): Rename FFI_TYPE_SMALL_STRUCT1
+	as FFI_TYPE_SMALL_STRUCT3.  Break out handling for 5-7 byte
+	structures.  Kill compilation warnings.
+	(ffi_closure_inner_LINUX): Print return values as hex in debug
+	message.  Rename FFI_TYPE_SMALL_STRUCT1 as FFI_TYPE_SMALL_STRUCT3.
+	Properly handle 5-7 byte structure returns.
+	* src/pa/ffitarget.h (FFI_TYPE_SMALL_STRUCT1)
+	(FFI_TYPE_SMALL_STRUCT2): Remove.
+	(FFI_TYPE_SMALL_STRUCT3, FFI_TYPE_SMALL_STRUCT5)
+	(FFI_TYPE_SMALL_STRUCT6, FFI_TYPE_SMALL_STRUCT7): Define.
+	* src/pa/linux.S: Mark source file as using PA1.1 assembly.
+	(checksmst1, checksmst2): Remove.
+	(checksmst3): Optimize handling of 3-byte struct returns.
+	(checksmst567): Properly handle 5-7 byte struct returns.
+
+2005-06-15  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	PR libgcj/21943
+	* src/mips/n32.S: Enforce PIC code.
+	* src/mips/o32.S: Likewise.
+
+2005-06-15  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* configure.ac: Treat i*86-*-solaris2.10 and up as X86_64.
+	* configure: Regenerate.
+
+2005-06-01  Alan Modra  <amodra@bigpond.net.au>
+
+	* src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't use JUMPTARGET
+	to call ffi_closure_helper_SYSV.  Append @local instead.
+	* src/powerpc/sysv.S (ffi_call_SYSV): Likewise for ffi_prep_args_SYSV.
+
+2005-05-17  Kelley Cook  <kcook@gcc.gnu.org>
+
+	* configure.ac: Use AC_C_BIGENDIAN instead of AC_C_BIGENDIAN_CROSS.
+	Use AC_CHECK_SIZEOF instead of AC_COMPILE_CHECK_SIZEOF.
+	* Makefile.am (ACLOCAL_AMFLAGS): Remove -I ../config.
+	* aclocal.m4, configure, fficonfig.h.in, Makefile.in,
+	include/Makefile.in, testsuite/Makefile.in: Regenerate.
+
+2005-05-09  Mike Stump  <mrs@apple.com>
+
+	* configure: Regenerate.
+
+2005-05-08  Richard Henderson  <rth@redhat.com>
+
+	PR libffi/21285
+	* src/alpha/osf.S: Update unwind into to match code.
+
+2005-05-04  Andreas Degert <ad@papyrus-gmbh.de>
+	    Richard Henderson  <rth@redhat.com>
+
+	* src/x86/ffi64.c (ffi_prep_cif_machdep): Save sse-used flag in
+	bit 11 of flags.
+	(ffi_call): Mask return type field.  Pass ssecount to ffi_call_unix64.
+	(ffi_prep_closure): Set carry bit if sse-used flag set.
+	* src/x86/unix64.S (ffi_call_unix64): Add ssecount argument.
+	Only load sse registers if ssecount non-zero.
+	(ffi_closure_unix64): Only save sse registers if carry set on entry.
+
+2005-04-29  Ralf Corsepius  <ralf.corsepius@rtems.org>
+
+	* configure.ac: Add i*86-*-rtems*, sparc*-*-rtems*,
+	powerpc-*rtems*, arm*-*-rtems*, sh-*-rtems*.
+	* configure: Regenerate.
+
+2005-04-20  Hans-Peter Nilsson  <hp@axis.com>
+
+	* testsuite/lib/libffi-dg.exp (libffi-dg-test-1): In regsub use,
+	have Tcl8.3-compatible intermediate variable.
+
+2005-04-18  Simon Posnjak <simon.posnjak@siol.net>
+	    Hans-Peter Nilsson  <hp@axis.com>
+
+	* Makefile.am: Add CRIS support.
+	* configure.ac: Likewise.
+	* Makefile.in, configure, testsuite/Makefile.in,
+	include/Makefile.in: Regenerate.
+	* src/cris: New directory.
+	* src/cris/ffi.c, src/cris/sysv.S, src/cris/ffitarget.h: New files.
+	* src/prep_cif.c (ffi_prep_cif): Wrap in #ifndef __CRIS__.
+
+	* testsuite/lib/libffi-dg.exp (libffi-dg-test-1): Replace \n with
+	\r?\n in output tests.
+
+2005-04-12  Mike Stump  <mrs@apple.com>
+
+	* configure: Regenerate.
+
+2005-03-30  Hans Boehm  <Hans.Boehm@hp.com>
+
+	* src/ia64/ffitarget.h (ffi_arg): Use long long instead of DI.
+
+2005-03-30  Steve Ellcey  <sje@cup.hp.com>
+
+	* src/ia64/ffitarget.h (ffi_arg) ADD DI attribute.
+	(ffi_sarg) Ditto.
+	* src/ia64/unix.S (ffi_closure_unix): Extend gp
+	to 64 bits in ILP32 mode.
+	Load 64 bits even for short data.
+
+2005-03-23  Mike Stump  <mrs@apple.com>
+
+	* src/powerpc/darwin.S: Update for -m64 multilib.
+	* src/powerpc/darwin_closure.S: Likewise.
+
+2005-03-21  Zack Weinberg  <zack@codesourcery.com>
+
+	* configure.ac: Do not invoke TL_AC_GCC_VERSION.
+	Do not set tool_include_dir.
+	* aclocal.m4, configure, Makefile.in, testsuite/Makefile.in:
+	Regenerate.
+	* include/Makefile.am: Set gcc_version and toollibffidir.
+	* include/Makefile.in: Regenerate.
+
+2005-02-22  Andrew Haley  <aph@redhat.com>
+
+	* src/powerpc/ffi.c (ffi_prep_cif_machdep): Bump alignment to
+	odd-numbered register pairs for 64-bit integer types.
+
+2005-02-23  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	PR libffi/20104
+	* testsuite/libffi.call/return_ll1.c: New test case.
+
+2005-02-11  Janis Johnson  <janis187@us.ibm.com>
+
+	* testsuite/libffi.call/cls_align_longdouble.c: Remove dg-options.
+	* testsuite/libffi.call/float.c: Ditto.
+	* testsuite/libffi.call/float2.c: Ditto.
+	* testsuite/libffi.call/float3.c: Ditto.
+
+2005-02-08  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/frv/ffitarget.h: Remove PPC stuff which does not belong to frv.
+
+2005-01-12  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+	* testsuite/libffi.special/special.exp (cxx_options): Add
+	-shared-libgcc.
+
+2004-12-31  Richard Henderson  <rth@redhat.com>
+
+	* src/types.c (FFI_AGGREGATE_TYPEDEF): Remove.
+	(FFI_TYPEDEF): Rename from FFI_INTEGRAL_TYPEDEF.  Replace size and
+	offset parameters with a type parameter; deduce size and structure
+	alignment.  Update all users.
+
+2004-12-31  Richard Henderson  <rth@redhat.com>
+
+	* src/types.c (FFI_TYPE_POINTER): Define with sizeof.
+	(FFI_TYPE_LONGDOUBLE): Fix for ia64.
+	* src/ia64/ffitarget.h (struct ffi_ia64_trampoline_struct): Move
+	into ffi_prep_closure.
+	* src/ia64/ia64_flags.h, src/ia64/ffi.c, src/ia64/unix.S: Rewrite
+	from scratch.
+
+2004-12-27  Richard Henderson  <rth@redhat.com>
+
+	* src/x86/unix64.S: Fix typo in unwind info.
+
+2004-12-25  Richard Henderson  <rth@redhat.com>
+
+	* src/x86/ffi64.c (struct register_args): Rename from stackLayout.
+	(enum x86_64_reg_class): Add X86_64_COMPLEX_X87_CLASS.
+	(merge_classes): Check for it.
+	(SSE_CLASS_P): New.
+	(classify_argument): Pass byte_offset by value; perform all updates
+	inside struct case.
+	(examine_argument): Add classes argument; handle
+	X86_64_COMPLEX_X87_CLASS.
+	(ffi_prep_args): Merge into ...
+	(ffi_call): ... here.  Share stack frame with ffi_call_unix64.
+	(ffi_prep_cif_machdep): Setup cif->flags for proper structure return.
+	(ffi_fill_return_value): Remove.
+	(ffi_prep_closure): Remove dead assert.
+	(ffi_closure_unix64_inner): Rename from ffi_closure_UNIX64_inner.
+	Rewrite to use struct register_args instead of va_list.  Create
+	flags for handling structure returns.
+	* src/x86/unix64.S: Remove dead strings.
+	(ffi_call_unix64): Rename from ffi_call_UNIX64.  Rewrite to share
+	stack frame with ffi_call.  Handle structure returns properly.
+	(float2sse, floatfloat2sse, double2sse): Remove.
+	(sse2float, sse2double, sse2floatfloat): Remove.
+	(ffi_closure_unix64): Rename from ffi_closure_UNIX64.  Rewrite
+	to handle structure returns properly.
+
+2004-12-08  David Edelsohn  <edelsohn@gnu.org>
+
+	* Makefile.am (AM_MAKEFLAGS): Remove duplicate LIBCFLAGS and
+	PICFLAG.
+	* Makefile.in: Regenerated.
+
+2004-12-02  Richard Sandiford  <rsandifo@redhat.com>
+
+	* configure.ac: Use TL_AC_GCC_VERSION to set gcc_version.
+	* configure, aclocal.m4, Makefile.in: Regenerate.
+	* include/Makefile.in, testsuite/Makefile.in: Regenerate.
+
+2004-11-29  Kelley Cook  <kcook@gcc.gnu.org>
+
+	* configure: Regenerate for libtool change.
+
+2004-11-25  Kelley Cook  <kcook@gcc.gnu.org>
+
+	* configure: Regenerate for libtool reversion.
+
+2004-11-24  Kelley Cook  <kcook@gcc.gnu.org>
+
+	* configure: Regenerate for libtool change.
+
+2004-11-23  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+	* testsuite/lib/libffi-dg.exp: Use new procs in target-libpath.exp.
+
+2004-11-23  Richard Sandiford  <rsandifo@redhat.com>
+
+	* src/mips/o32.S (ffi_call_O32, ffi_closure_O32): Use jalr instead
+	of jal.  Use an absolute encoding for the frame information.
+
+2004-11-23  Kelley Cook  <kcook@gcc.gnu.org>
+
+	* Makefile.am: Remove no-dependencies.  Add ACLOCAL_AMFLAGS.
+	* acinclude.m4: Delete logic for sincludes.
+	* aclocal.m4, Makefile.in, configure: Regenerate.
+	* include/Makefile: Likewise.
+	* testsuite/Makefile: Likewise.
+
+2004-11-22  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+	* src/sparc/ffi.c (ffi_prep_closure): Align doubles and 64-bit integers
+	on a 8-byte boundary.
+	* src/sparc/v8.S (ffi_closure_v8): Reserve frame space for arguments.
+
+2004-10-27  Richard Earnshaw  <rearnsha@arm.com>
+
+	* src/arm/ffi.c (ffi_prep_cif_machdep): Handle functions that return
+	long long values.  Round stack allocation to a multiple of 8 bytes
+	for ATPCS compatibility.
+	* src/arm/sysv.S (ffi_call_SYSV): Rework to avoid use of APCS register
+	names.  Handle returning long long types.  Add Thumb and interworking
+	support.  Improve soft-float code.
+
+2004-10-27  Richard Earnshaw  <rearnsha@arm.com>
+
+	* testsuite/lib/libffi-db.exp (load_gcc_lib): New function.
+	(libffi_exit): New function.
+	(libffi_init): Build the testglue wrapper if needed.
+
+2004-10-25  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+	PR other/18138
+	* testsuite/lib/libffi-dg.exp: Accept more than one multilib libgcc.
+
+2004-10-25  Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+	* src/m32r/libffitarget.h (FFI_CLOSURES): Set to 0.
+
+2004-10-20  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/sysv.S (ffi_call_SYSV): Don't align for double data.
+	* testsuite/libffi.call/float3.c: New test case.
+
+2004-10-18  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/ffi.c (ffi_prep_closure): Set T bit in trampoline for
+	the function returning a structure pointed with R2.
+	* src/sh/sysv.S (ffi_closure_SYSV): Use R2 as the pointer to
+	the structure return value if T bit set.  Emit position
+	independent code and EH data if PIC.
+
+2004-10-13  Kazuhiro Inaoka  <inaoka.kazuhiro@renesas.com>
+
+	* Makefile.am: Add m32r support.
+	* configure.ac: Likewise.
+	* Makefile.in: Regenerate.
+	* confiugre: Regenerate.
+	* src/types.c: Add m32r port to FFI_INTERNAL_TYPEDEF
+	(uint64, sint64, double, longdouble)
+	* src/m32r: New directory.
+	* src/m32r/ffi.c: New file.
+	* src/m32r/sysv.S: Likewise.
+	* src/m32r/ffitarget.h: Likewise.
+
+2004-10-02  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* testsuite/libffi.call/negint.c: New test case.
+
+2004-09-14  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR libgcj/17465
+	* testsuite/lib/libffi-dg.exp: Don't use global ld_library_path.
+	Set up LD_LIBRARY_PATH, SHLIB_PATH, LD_LIBRARYN32_PATH,
+	LD_LIBRARY64_PATH, LD_LIBRARY_PATH_32, LD_LIBRARY_PATH_64 and
+	DYLD_LIBRARY_PATH.
+
+2004-09-05  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/many_win32.c: Remove whitespaces.
+	* testsuite/libffi.call/promotion.c: Likewise.
+	* testsuite/libffi.call/return_ll.c: Remove unused var. Cleanup
+	whitespaces.
+	* testsuite/libffi.call/return_sc.c: Likewise.
+	* testsuite/libffi.call/return_uc.c: Likewise.
+
+2004-09-05  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/powerpc/darwin.S: Fix comments and identation.
+	* src/powerpc/darwin_closure.S: Likewise.
+
+2004-09-02  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/powerpc/ffi_darwin.c: Add flag for longdouble return values.
+	(ffi_prep_args): Handle longdouble arguments.
+	(ffi_prep_cif_machdep): Set flags for longdouble. Calculate space for
+	longdouble.
+	(ffi_closure_helper_DARWIN): Add closure handling for longdouble.
+	* src/powerpc/darwin.S (_ffi_call_DARWIN): Add handling of longdouble
+	values.
+	* src/powerpc/darwin_closure.S (_ffi_closure_ASM): Likewise.
+	* src/types.c: Defined longdouble size and alignment for darwin.
+
+2004-09-02  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/powerpc/aix.S: Remove whitespaces.
+	* src/powerpc/aix_closure.S: Likewise.
+	* src/powerpc/asm.h: Likewise.
+	* src/powerpc/ffi.c: Likewise.
+	* src/powerpc/ffitarget.h: Likewise.
+	* src/powerpc/linux64.S: Likewise.
+	* src/powerpc/linux64_closure.S: Likewise.
+	* src/powerpc/ppc_closure.S: Likewise.
+	* src/powerpc/sysv.S: Likewise.
+
+2004-08-30  Anthony Green  <green@redhat.com>
+
+	* Makefile.am: Add frv support.
+	* Makefile.in, testsuite/Makefile.in: Rebuilt.
+	* configure.ac: Read configure.host.
+	* configure.in: Read configure.host.
+	* configure.host: New file.  frv-elf needs libgloss.
+	* include/ffi.h.in: Force ffi_closure to have a nice big (8)
+	alignment.  This is needed to frv and shouldn't harm the others.
+	* include/ffi_common.h (ALIGN_DOWN): New macro.
+	* src/frv/ffi.c, src/frv/ffitarget.h, src/frv/eabi.S: New files.
+
+2004-08-24  David Daney  <daney@avtrex.com>
+
+	* testsuite/libffi.call/closure_fn0.c: Xfail mips64* instead of mips*.
+	* testsuite/libffi.call/closure_fn1.c: Likewise.
+	* testsuite/libffi.call/closure_fn2.c  Likewise.
+	* testsuite/libffi.call/closure_fn3.c: Likewise.
+	* testsuite/libffi.call/closure_fn4.c: Likewise.
+	* testsuite/libffi.call/closure_fn5.c: Likewise.
+	* testsuite/libffi.call/cls_18byte.c: Likewise.
+	* testsuite/libffi.call/cls_19byte.c: Likewise.
+	* testsuite/libffi.call/cls_1_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_20byte.c: Likewise.
+	* testsuite/libffi.call/cls_20byte1.c: Likewise.
+	* testsuite/libffi.call/cls_24byte.c: Likewise.
+	* testsuite/libffi.call/cls_2byte.c: Likewise.
+	* testsuite/libffi.call/cls_3_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_3byte1.c: Likewise.
+	* testsuite/libffi.call/cls_3byte2.c: Likewise.
+	* testsuite/libffi.call/cls_4_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_4byte.c: Likewise.
+	* testsuite/libffi.call/cls_64byte.c: Likewise.
+	* testsuite/libffi.call/cls_6byte.c: Likewise.
+	* testsuite/libffi.call/cls_7byte.c: Likewise.
+	* testsuite/libffi.call/cls_8byte.c: Likewise.
+	* testsuite/libffi.call/cls_9byte1.c: Likewise.
+	* testsuite/libffi.call/cls_9byte2.c: Likewise.
+	* testsuite/libffi.call/cls_align_double.c: Likewise.
+	* testsuite/libffi.call/cls_align_float.c: Likewise.
+	* testsuite/libffi.call/cls_align_longdouble.c: Likewise.
+	* testsuite/libffi.call/cls_align_pointer.c: Likewise.
+	* testsuite/libffi.call/cls_align_sint16.c: Likewise.
+	* testsuite/libffi.call/cls_align_sint32.c: Likewise.
+	* testsuite/libffi.call/cls_align_sint64.c: Likewise.
+	* testsuite/libffi.call/cls_align_uint16.c: Likewise.
+	* testsuite/libffi.call/cls_align_uint32.c: Likewise.
+	* testsuite/libffi.call/cls_align_uint64.c: Likewise.
+	* testsuite/libffi.call/cls_double.c: Likewise.
+	* testsuite/libffi.call/cls_float.c: Likewise.
+	* testsuite/libffi.call/cls_multi_schar.c: Likewise.
+	* testsuite/libffi.call/cls_multi_sshort.c: Likewise.
+	* testsuite/libffi.call/cls_multi_sshortchar.c: Likewise.
+	* testsuite/libffi.call/cls_multi_uchar.c: Likewise.
+	* testsuite/libffi.call/cls_multi_ushort.c: Likewise.
+	* testsuite/libffi.call/cls_multi_ushortchar.c: Likewise.
+	* testsuite/libffi.call/cls_schar.c: Likewise.
+	* testsuite/libffi.call/cls_sint.c: Likewise.
+	* testsuite/libffi.call/cls_sshort.c: Likewise.
+	* testsuite/libffi.call/cls_uchar.c: Likewise.
+	* testsuite/libffi.call/cls_uint.c: Likewise.
+	* testsuite/libffi.call/cls_ulonglong.c: Likewise.
+	* testsuite/libffi.call/cls_ushort.c: Likewise.
+	* testsuite/libffi.call/nested_struct.c: Likewise.
+	* testsuite/libffi.call/nested_struct1.c: Likewise.
+	* testsuite/libffi.call/nested_struct2.c: Likewise.
+	* testsuite/libffi.call/nested_struct3.c: Likewise.
+	* testsuite/libffi.call/problem1.c: Likewise.
+	* testsuite/libffi.special/unwindtest.cc: Likewise.
+	* testsuite/libffi.call/cls_12byte.c: Likewise and set return value
+	to zero.
+	* testsuite/libffi.call/cls_16byte.c: Likewise.
+	* testsuite/libffi.call/cls_5byte.c: Likewise.
+
+2004-08-23  David Daney <daney@avtrex.com>
+
+	PR libgcj/13141
+	* src/mips/ffitarget.h (FFI_O32_SOFT_FLOAT): New ABI.
+	* src/mips/ffi.c (ffi_prep_args): Fix alignment calculation.
+	(ffi_prep_cif_machdep): Handle FFI_O32_SOFT_FLOAT floating point
+	parameters and return types.
+	(ffi_call): Handle FFI_O32_SOFT_FLOAT ABI.
+	(ffi_prep_closure): Ditto.
+	(ffi_closure_mips_inner_O32): Handle FFI_O32_SOFT_FLOAT ABI, fix
+	alignment calculations.
+	* src/mips/o32.S (ffi_closure_O32): Don't use floating point
+	instructions if FFI_O32_SOFT_FLOAT, make stack frame ABI compliant.
+
+2004-08-14  Casey Marshall <csm@gnu.org>
+
+	* src/mips/ffi.c (ffi_pref_cif_machdep): set `cif->flags' to
+	contain `FFI_TYPE_UINT64' as return type for any 64-bit
+	integer (O32 ABI only).
+	(ffi_prep_closure): new function.
+	(ffi_closure_mips_inner_O32): new function.
+	* src/mips/ffitarget.h: Define `FFI_CLOSURES' and
+	`FFI_TRAMPOLINE_SIZE' appropriately if the ABI is o32.
+	* src/mips/o32.S (ffi_call_O32): add labels for .eh_frame. Return
+	64 bit integers correctly.
+	(ffi_closure_O32): new function.
+	Added DWARF-2 unwind info for both functions.
+
+2004-08-10  Andrew Haley  <aph@redhat.com>
+
+	* src/x86/ffi64.c (ffi_prep_args ): 8-align all stack arguments.
+
+2004-08-01  Robert Millan  <robertmh@gnu.org>
+
+	* configure.ac: Detect knetbsd-gnu and kfreebsd-gnu.
+	* configure: Regenerate.
+
+2004-07-30  Maciej W. Rozycki  <macro@linux-mips.org>
+
+	* acinclude.m4 (AC_FUNC_MMAP_BLACKLIST): Check for <sys/mman.h>
+	and mmap() explicitly instead of relying on preset autoconf cache
+	variables.
+	* aclocal.m4: Regenerate.
+	* configure: Regenerate.
+
+2004-07-11  Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* src/s390/ffi.c (ffi_prep_args): Fix C aliasing violation.
+	(ffi_check_float_struct): Remove unused prototype.
+
+2004-06-30  Geoffrey Keating  <geoffk@apple.com>
+
+	* src/powerpc/ffi_darwin.c (flush_icache): ';' is a comment
+	character on Darwin, use '\n\t' instead.
+
+2004-06-26  Matthias Klose  <doko@debian.org>
+
+	* libtool-version: Fix typo in revision/age.
+
+2004-06-17  Matthias Klose  <doko@debian.org>
+
+	* libtool-version: New.
+	* Makefile.am (libffi_la_LDFLAGS): Use -version-info for soname.
+	* Makefile.in: Regenerate.
+
+2004-06-15  Paolo Bonzini  <bonzini@gnu.org>
+
+	* Makefile.am: Remove useless multilib rules.
+	* Makefile.in: Regenerate.
+	* aclocal.m4: Regenerate with automake 1.8.5.
+	* configure.ac: Remove useless multilib configury.
+	* configure: Regenerate.
+
+2004-06-15  Paolo Bonzini  <bonzini@gnu.org>
+
+	* .cvsignore: New file.
+
+2004-06-10  Jakub Jelinek  <jakub@redhat.com>
+
+	* src/ia64/unix.S (ffi_call_unix): Insert group barrier break
+	fp_done.
+	(ffi_closure_UNIX): Fix f14/f15 adjustment if FLOAT_SZ is ever
+	changed from 8.
+
+2004-06-06  Sean McNeil  <sean@mcneil.com>
+
+	* configure.ac: Add x86_64-*-freebsd* support.
+	* configure: Regenerate.
+
+2004-04-26  Joe Buck <jbuck@welsh-buck.org>
+
+	Bug 15093
+	* configure.ac: Test for existence of mmap and sys/mman.h before
+	checking blacklist.  Fix suggested by Jim Wilson.
+	* configure: Regenerate.
+
+2004-04-26  Matt Austern  <austern@apple.com>
+
+	* src/powerpc/darwin.S: Go through a non-lazy pointer for initial
+	FDE location.
+	* src/powerpc/darwin_closure.S: Likewise.
+
+2004-04-24  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/cls_multi_schar.c (main): Fix initialization
+	error. Reported by Thomas Heller <theller@python.net>.
+	* testsuite/libffi.call/cls_multi_sshort.c (main): Likewise.
+	* testsuite/libffi.call/cls_multi_ushort.c (main): Likewise.
+
+2004-03-20  Matthias Klose  <doko@debian.org>
+
+	* src/pa/linux.S: Fix typo.
+
+2004-03-19  Matthias Klose  <doko@debian.org>
+
+	* Makefile.am: Update.
+	* Makefile.in: Regenerate.
+	* src/pa/ffi.h.in: Remove.
+	* src/pa/ffitarget.h: New file.
+
+2004-02-10  Randolph Chung  <tausq@debian.org>
+
+	* Makefile.am: Add PA support.
+	* Makefile.in: Regenerate.
+	* include/Makefile.in: Regenerate.
+	* configure.ac: Add PA target.
+	* configure: Regenerate.
+	* src/pa/ffi.c: New file.
+	* src/pa/ffi.h.in: Add PA support.
+	* src/pa/linux.S: New file.
+	* prep_cif.c: Add PA support.
+
+2004-03-16  Hosaka Yuji  <hos@tamanegi.org>
+
+	* src/types.c: Fix alignment size of X86_WIN32 case int64 and
+	double.
+	* src/x86/ffi.c (ffi_prep_args): Replace ecif->cif->rtype->type
+	with ecif->cif->flags.
+	(ffi_call, ffi_prep_incoming_args_SYSV): Replace cif->rtype->type
+	with cif->flags.
+	(ffi_prep_cif_machdep): Add X86_WIN32 struct case.
+	(ffi_closure_SYSV): Add 1 or 2-bytes struct case for X86_WIN32.
+	* src/x86/win32.S (retstruct1b, retstruct2b, sc_retstruct1b,
+	sc_retstruct2b): Add for 1 or 2-bytes struct case.
+
+2004-03-15 Kelley Cook <kcook@gcc.gnu.org>
+
+	* configure.in: Rename file to ...
+	* configure.ac: ... this.
+	* fficonfig.h.in: Regenerate.
+	* Makefile.in: Regenerate.
+	* include/Makefile.in: Regenerate.
+	* testsuite/Makefile.in: Regenerate.
+
+2004-03-12  Matt Austern  <austern@apple.com>
+
+	* src/powerpc/darwin.S: Fix EH information so it corresponds to
+	changes in EH format resulting from addition of linkonce support.
+	* src/powerpc/darwin_closure.S: Likewise.
+
+2004-03-11  Andreas Tobler  <a.tobler@schweiz.ch>
+	    Paolo Bonzini  <bonzini@gnu.org>
+
+	* Makefile.am (AUTOMAKE_OPTIONS): Set them.
+	Remove VPATH. Remove rules for object files. Remove multilib support.
+	(AM_CCASFLAGS): Add.
+	* configure.in (AC_CONFIG_HEADERS): Relace AM_CONFIG_HEADER.
+	(AC_PREREQ): Bump version to 2.59.
+	(AC_INIT): Fill with version info and bug address.
+	(ORIGINAL_LD_FOR_MULTILIBS): Remove.
+	(AM_ENABLE_MULTILIB): Use this instead of AC_ARG_ENABLE.
+	De-precious CC so that the right flags are passed down to multilibs.
+	(AC_MSG_ERROR): Replace obsolete macro AC_ERROR.
+	(AC_CONFIG_FILES): Replace obsolete macro AC_LINK_FILES.
+	(AC_OUTPUT): Reorganize the output with AC_CONFIG_COMMANDS.
+	* configure: Rebuilt.
+	* aclocal.m4: Likewise.
+	* Makefile.in, include/Makefile.in, testsuite/Makefile.in: Likewise.
+	* fficonfig.h.in: Likewise.
+
+2004-03-11  Andreas Schwab  <schwab@suse.de>
+
+	* src/ia64/ffi.c (ffi_prep_incoming_args_UNIX): Get floating point
+	arguments from fp registers only for the first 8 parameter slots.
+	Don't convert a float parameter when passed in memory.
+
+2004-03-09  Hans-Peter Nilsson  <hp@axis.com>
+
+	* configure: Regenerate for config/accross.m4 correction.
+
+2004-02-25  Matt Kraai  <kraai@alumni.cmu.edu>
+
+	* src/powerpc/ffi.c (ffi_prep_args_SYSV): Change
+	ecif->cif->bytes to bytes.
+	(ffi_prep_cif_machdep): Add braces around nested if statement.
+
+2004-02-09  Alan Modra  <amodra@bigpond.net.au>
+
+	* src/types.c (pointer): POWERPC64 has 8 byte pointers.
+
+	* src/powerpc/ffi.c (ffi_prep_args64): Correct long double handling.
+	(ffi_closure_helper_LINUX64): Fix typo.
+	* testsuite/libffi.call/cls_align_longdouble.c: Pass -mlong-double-128
+	for powerpc64-*-*.
+	* testsuite/libffi.call/float.c: Likewise.
+	* testsuite/libffi.call/float2.c: Likewise.
+
+2004-02-08  Alan Modra  <amodra@bigpond.net.au>
+
+	* src/powerpc/ffi.c (ffi_prep_cif_machdep <FFI_LINUX64>): Correct
+	long double function return and long double arg handling.
+	(ffi_closure_helper_LINUX64): Formatting.  Delete unused "ng" var.
+	Use "end_pfr" instead of "nf".  Correct long double handling.
+	Localise "temp".
+	* src/powerpc/linux64.S (ffi_call_LINUX64): Save f2 long double
+	return value.
+	* src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Allocate
+	space for long double return value.  Adjust stack frame and offsets.
+	Load f2 long double return.
+
+2004-02-07  Alan Modra  <amodra@bigpond.net.au>
+
+	* src/types.c: Use 16 byte long double for POWERPC64.
+
+2004-01-25  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+	* src/sparc/ffi.c (ffi_prep_args_v9): Shift the parameter array
+	when the structure return address is passed in %o0.
+	(ffi_V9_return_struct): Rename into ffi_v9_layout_struct.
+	(ffi_v9_layout_struct): Align the field following a nested structure
+	on a word boundary.  Use memmove instead of memcpy.
+	(ffi_call): Update call to ffi_V9_return_struct.
+	(ffi_prep_closure): Define 'ctx' only for V8.
+	(ffi_closure_sparc_inner): Clone into ffi_closure_sparc_inner_v8
+	and ffi_closure_sparc_inner_v9.
+	(ffi_closure_sparc_inner_v8): Return long doubles by reference.
+	Always skip the structure return address.  For structures and long
+	doubles, copy the argument directly.
+	(ffi_closure_sparc_inner_v9): Skip the structure return address only
+	if required.  Shift the maximum floating-point slot accordingly.  For
+	big structures, copy the argument directly; otherwise, left-justify the
+	argument and call ffi_v9_layout_struct to lay out the structure on
+	the stack.
+	* src/sparc/v8.S: Undef STACKFRAME before defining it.
+	(ffi_closure_v8): Pass the structure return address.  Update call to
+	ffi_closure_sparc_inner_v8.  Short-circuit FFI_TYPE_INT handling.
+	Skip the 'unimp' insn when returning long doubles and structures.
+	* src/sparc/v9.S: Undef STACKFRAME before defining it.
+	(ffi_closure_v9): Increase the frame size by 2 words.  Short-circuit
+	FFI_TYPE_INT handling.  Load structures both in integers and
+	floating-point registers on return.
+	* README: Update status of the SPARC port.
+
+2004-01-24  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/pyobjc-tc.c (main): Treat result value
+	as of type ffi_arg.
+	* testsuite/libffi.call/struct3.c (main): Fix CHECK.
+
+2004-01-22  Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* testsuite/libffi.call/cls_uint.c (cls_ret_uint_fn): Treat result
+	value as of type ffi_arg, not unsigned int.
+
+2004-01-21  Michael Ritzert  <ritzert@t-online.de>
+
+	* ffi64.c (ffi_prep_args): Cast the RHS of an assignment instead
+	of the LHS.
+
+2004-01-12  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_32 for
+	Solaris.
+
+2004-01-08  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* testsuite/libffi.call/ffitest.h (allocate_mmap): Cast MAP_FAILED
+	to void *.
+
+2003-12-10  Richard Henderson  <rth@redhat.com>
+
+	* testsuite/libffi.call/cls_align_pointer.c: Cast pointers to
+	size_t instead of int.
+
+2003-12-04  Hosaka Yuji  <hos@tamanegi.org>
+
+	* testsuite/libffi.call/many_win32.c: Include <float.h>.
+	* testsuite/libffi.call/many_win32.c (main): Replace variable
+	int i with unsigned long ul.
+
+	* testsuite/libffi.call/cls_align_uint64.c: New test case.
+	* testsuite/libffi.call/cls_align_sint64.c: Likewise.
+	* testsuite/libffi.call/cls_align_uint32.c: Likewise.
+	* testsuite/libffi.call/cls_align_sint32.c: Likewise.
+	* testsuite/libffi.call/cls_align_uint16.c: Likewise.
+	* testsuite/libffi.call/cls_align_sint16.c: Likewise.
+	* testsuite/libffi.call/cls_align_float.c: Likewise.
+	* testsuite/libffi.call/cls_align_double.c: Likewise.
+	* testsuite/libffi.call/cls_align_longdouble.c: Likewise.
+	* testsuite/libffi.call/cls_align_pointer.c: Likewise.
+
+2003-12-02  Hosaka Yuji  <hos@tamanegi.org>
+
+	PR other/13221
+	* src/x86/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV):
+	Align arguments to 32 bits.
+
+2003-12-01  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	PR other/13221
+	* testsuite/libffi.call/cls_multi_sshort.c: New test case.
+	* testsuite/libffi.call/cls_multi_sshortchar.c: Likewise.
+	* testsuite/libffi.call/cls_multi_uchar.c: Likewise.
+	* testsuite/libffi.call/cls_multi_schar.c: Likewise.
+	* testsuite/libffi.call/cls_multi_ushortchar.c: Likewise.
+	* testsuite/libffi.call/cls_multi_ushort.c: Likewise.
+
+	* testsuite/libffi.special/unwindtest.cc: Cosmetics.
+
+2003-11-26  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+	* testsuite/libffi.call/ffitest.h: Include <fcntl.h>.
+	* testsuite/libffi.special/ffitestcxx.h: Likewise.
+
+2003-11-22  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* Makefile.in: Rebuilt.
+	* configure: Likewise.
+	* testsuite/libffi.special/unwindtest.cc: Convert the mmap to
+	the right type.
+
+2003-11-21  Andreas Jaeger  <aj@suse.de>
+	    Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* acinclude.m4: Add AC_FUNC_MMAP_BLACKLIST.
+	* configure.in: Call AC_FUNC_MMAP_BLACKLIST.
+	* Makefile.in: Rebuilt.
+	* aclocal.m4: Likewise.
+	* configure: Likewise.
+	* fficonfig.h.in: Likewise.
+	* testsuite/lib/libffi-dg.exp: Add include dir.
+	* testsuite/libffi.call/ffitest.h: Add MMAP definitions.
+	* testsuite/libffi.special/ffitestcxx.h: Likewise.
+	* testsuite/libffi.call/closure_fn0.c: Use MMAP functionality
+	for ffi_closure if available.
+	* testsuite/libffi.call/closure_fn1.c: Likewise.
+	* testsuite/libffi.call/closure_fn2.c: Likewise.
+	* testsuite/libffi.call/closure_fn3.c: Likewise.
+	* testsuite/libffi.call/closure_fn4.c: Likewise.
+	* testsuite/libffi.call/closure_fn5.c: Likewise.
+	* testsuite/libffi.call/cls_12byte.c: Likewise.
+	* testsuite/libffi.call/cls_16byte.c: Likewise.
+	* testsuite/libffi.call/cls_18byte.c: Likewise.
+	* testsuite/libffi.call/cls_19byte.c: Likewise.
+	* testsuite/libffi.call/cls_1_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_20byte.c: Likewise.
+	* testsuite/libffi.call/cls_20byte1.c: Likewise.
+	* testsuite/libffi.call/cls_24byte.c: Likewise.
+	* testsuite/libffi.call/cls_2byte.c: Likewise.
+	* testsuite/libffi.call/cls_3_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_3byte1.c: Likewise.
+	* testsuite/libffi.call/cls_3byte2.c: Likewise.
+	* testsuite/libffi.call/cls_4_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_4byte.c: Likewise.
+	* testsuite/libffi.call/cls_5byte.c: Likewise.
+	* testsuite/libffi.call/cls_64byte.c: Likewise.
+	* testsuite/libffi.call/cls_6byte.c: Likewise.
+	* testsuite/libffi.call/cls_7byte.c: Likewise.
+	* testsuite/libffi.call/cls_8byte.c: Likewise.
+	* testsuite/libffi.call/cls_9byte1.c: Likewise.
+	* testsuite/libffi.call/cls_9byte2.c: Likewise.
+	* testsuite/libffi.call/cls_double.c: Likewise.
+	* testsuite/libffi.call/cls_float.c: Likewise.
+	* testsuite/libffi.call/cls_schar.c: Likewise.
+	* testsuite/libffi.call/cls_sint.c: Likewise.
+	* testsuite/libffi.call/cls_sshort.c: Likewise.
+	* testsuite/libffi.call/cls_uchar.c: Likewise.
+	* testsuite/libffi.call/cls_uint.c: Likewise.
+	* testsuite/libffi.call/cls_ulonglong.c: Likewise.
+	* testsuite/libffi.call/cls_ushort.c: Likewise.
+	* testsuite/libffi.call/nested_struct.c: Likewise.
+	* testsuite/libffi.call/nested_struct1.c: Likewise.
+	* testsuite/libffi.call/nested_struct2.c: Likewise.
+	* testsuite/libffi.call/nested_struct3.c: Likewise.
+	* testsuite/libffi.call/problem1.c: Likewise.
+	* testsuite/libffi.special/unwindtest.cc: Likewise.
+
+2003-11-20  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/lib/libffi-dg.exp: Make the -lgcc_s conditional.
+
+2003-11-19  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/lib/libffi-dg.exp: Add DYLD_LIBRARY_PATH for darwin.
+	Add -lgcc_s to additional flags.
+
+2003-11-12  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* configure.in, include/Makefile.am: PR libgcj/11147, install
+	the ffitarget.h header file in a gcc versioned and target
+	dependent place.
+	* configure: Regenerated.
+	* Makefile.in, include/Makefile.in: Likewise.
+	* testsuite/Makefile.in: Likewise.
+
+2003-11-09  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/closure_fn0.c: Print result and check
+	with dg-output to make debugging easier.
+	* testsuite/libffi.call/closure_fn1.c: Likewise.
+	* testsuite/libffi.call/closure_fn2.c: Likewise.
+	* testsuite/libffi.call/closure_fn3.c: Likewise.
+	* testsuite/libffi.call/closure_fn4.c: Likewise.
+	* testsuite/libffi.call/closure_fn5.c: Likewise.
+	* testsuite/libffi.call/cls_12byte.c: Likewise.
+	* testsuite/libffi.call/cls_16byte.c: Likewise.
+	* testsuite/libffi.call/cls_18byte.c: Likewise.
+	* testsuite/libffi.call/cls_19byte.c: Likewise.
+	* testsuite/libffi.call/cls_1_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_20byte.c: Likewise.
+	* testsuite/libffi.call/cls_20byte1.c: Likewise.
+	* testsuite/libffi.call/cls_24byte.c: Likewise.
+	* testsuite/libffi.call/cls_2byte.c: Likewise.
+	* testsuite/libffi.call/cls_3_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_3byte1.c: Likewise.
+	* testsuite/libffi.call/cls_3byte2.c: Likewise.
+	* testsuite/libffi.call/cls_4_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_4byte.c: Likewise.
+	* testsuite/libffi.call/cls_5byte.c: Likewise.
+	* testsuite/libffi.call/cls_64byte.c: Likewise.
+	* testsuite/libffi.call/cls_6byte.c: Likewise.
+	* testsuite/libffi.call/cls_7byte.c: Likewise.
+	* testsuite/libffi.call/cls_8byte.c: Likewise.
+	* testsuite/libffi.call/cls_9byte1.c: Likewise.
+	* testsuite/libffi.call/cls_9byte2.c: Likewise.
+	* testsuite/libffi.call/cls_double.c: Likewise.
+	* testsuite/libffi.call/cls_float.c: Likewise.
+	* testsuite/libffi.call/cls_schar.c: Likewise.
+	* testsuite/libffi.call/cls_sint.c: Likewise.
+	* testsuite/libffi.call/cls_sshort.c: Likewise.
+	* testsuite/libffi.call/cls_uchar.c: Likewise.
+	* testsuite/libffi.call/cls_uint.c: Likewise.
+	* testsuite/libffi.call/cls_ulonglong.c: Likewise.
+	* testsuite/libffi.call/cls_ushort.c: Likewise.
+	* testsuite/libffi.call/problem1.c: Likewise.
+
+	* testsuite/libffi.special/unwindtest.cc: Make ffi_closure
+	static.
+
+2003-11-08  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/cls_9byte2.c: New test case.
+	* testsuite/libffi.call/cls_9byte1.c: Likewise.
+	* testsuite/libffi.call/cls_64byte.c: Likewise.
+	* testsuite/libffi.call/cls_20byte1.c: Likewise.
+	* testsuite/libffi.call/cls_19byte.c: Likewise.
+	* testsuite/libffi.call/cls_18byte.c: Likewise.
+	* testsuite/libffi.call/closure_fn4.c: Likewise.
+	* testsuite/libffi.call/closure_fn5.c: Likewise.
+	* testsuite/libffi.call/cls_schar.c: Likewise.
+	* testsuite/libffi.call/cls_sint.c: Likewise.
+	* testsuite/libffi.call/cls_sshort.c: Likewise.
+	* testsuite/libffi.call/nested_struct2.c: Likewise.
+	* testsuite/libffi.call/nested_struct3.c: Likewise.
+
+2003-11-08  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/cls_double.c: Do a check on the result.
+	* testsuite/libffi.call/cls_uchar.c: Likewise.
+	* testsuite/libffi.call/cls_uint.c: Likewise.
+	* testsuite/libffi.call/cls_ulonglong.c: Likewise.
+	* testsuite/libffi.call/cls_ushort.c: Likewise.
+	* testsuite/libffi.call/return_sc.c: Cleanup whitespaces.
+
+2003-11-06  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/prep_cif.c (ffi_prep_cif): Move the validity check after
+	the initialization.
+
+2003-10-23  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/java_raw_api.c (ffi_java_ptrarray_to_raw): Replace
+	FFI_ASSERT(FALSE) with FFI_ASSERT(0).
+
+2003-10-22  David Daney  <ddaney@avtrex.com>
+
+	* src/mips/ffitarget.h: Replace undefined UINT32 and friends with
+	__attribute__((__mode__(__SI__))) and friends.
+
+2003-10-22  Andreas Schwab  <schwab@suse.de>
+
+	* src/ia64/ffi.c: Replace FALSE/TRUE with false/true.
+
+2003-10-21  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* configure.in: AC_LINK_FILES(ffitarget.h).
+	* configure: Regenerate.
+	* Makefile.in: Likewise.
+	* include/Makefile.in: Likewise.
+	* testsuite/Makefile.in: Likewise.
+	* fficonfig.h.in: Likewise.
+
+2003-10-21  Paolo Bonzini  <bonzini@gnu.org>
+	    Richard Henderson  <rth@redhat.com>
+
+	Avoid that ffi.h includes fficonfig.h.
+
+	* Makefile.am (EXTRA_DIST): Include ffitarget.h files
+	(TARGET_SRC_MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX.
+	(TARGET_SRC_MIPS_SGI): Removed.
+	(MIPS_GCC): Renamed to TARGET_SRC_MIPS_IRIX.
+	(MIPS_SGI): Removed.
+	(CLEANFILES): Removed.
+	(mostlyclean-am, clean-am, mostlyclean-sub, clean-sub): New
+	targets.
+	* acconfig.h: Removed.
+	* configure.in: Compute sizeofs only for double and long double.
+	Use them to define and subst HAVE_LONG_DOUBLE.  Include comments
+	into AC_DEFINE instead of using acconfig.h.  Create
+	include/ffitarget.h instead of include/fficonfig.h.  Rename
+	MIPS_GCC to MIPS_IRIX, drop MIPS_SGI since we are in gcc's tree.
+	AC_DEFINE EH_FRAME_FLAGS.
+	* include/Makefile.am (DISTCLEANFILES): New automake macro.
+	(hack_DATA): Add ffitarget.h.
+	* include/ffi.h.in: Remove all system specific definitions.
+	Declare raw API even if it is not installed, why bother?
+	Use limits.h instead of SIZEOF_* to define ffi_type_*.  Do
+	not define EH_FRAME_FLAGS, it is in fficonfig.h now.  Include
+	ffitarget.h instead of fficonfig.h.  Remove ALIGN macro.
+	(UINT_ARG, INT_ARG): Removed, use ffi_arg and ffi_sarg instead.
+	* include/ffi_common.h (bool): Do not define.
+	(ffi_assert): Accept failed assertion.
+	(ffi_type_test): Return void and accept file/line.
+	(FFI_ASSERT): Pass stringized failed assertion.
+	(FFI_ASSERT_AT): New macro.
+	(FFI_ASSERT_VALID_TYPE): New macro.
+	(UINT8, SINT8, UINT16, SINT16, UINT32, SINT32,
+	UINT64, SINT64): Define here with gcc's __attribute__ macro
+	instead of in ffi.h
+	(FLOAT32, ALIGN): Define here instead of in ffi.h
+	* include/ffi-mips.h: Removed.  Its content moved to
+	src/mips/ffitarget.h after separating assembly and C sections.
+	* src/alpha/ffi.c, src/alpha/ffi.c, src/java_raw_api.c
+	src/prep_cif.c, src/raw_api.c, src/ia64/ffi.c,
+	src/mips/ffi.c, src/mips/n32.S, src/mips/o32.S,
+	src/mips/ffitarget.h, src/sparc/ffi.c, src/x86/ffi64.c:
+	SIZEOF_ARG -> FFI_SIZEOF_ARG.
+	* src/ia64/ffi.c: Include stdbool.h (provided by GCC 2.95+).
+	* src/debug.c (ffi_assert): Accept stringized failed assertion.
+	(ffi_type_test): Rewritten.
+	* src/prep-cif.c (initialize_aggregate, ffi_prep_cif): Call
+	FFI_ASSERT_VALID_TYPE.
+	* src/alpha/ffitarget.h, src/arm/ffitarget.h,
+	src/ia64/ffitarget.h, src/m68k/ffitarget.h,
+	src/mips/ffitarget.h, src/powerpc/ffitarget.h,
+	src/s390/ffitarget.h, src/sh/ffitarget.h,
+	src/sh64/ffitarget.h, src/sparc/ffitarget.h,
+	src/x86/ffitarget.h: New files.
+	* src/alpha/osf.S, src/arm/sysv.S, src/ia64/unix.S,
+	src/m68k/sysv.S, src/mips/n32.S, src/mips/o32.S,
+	src/powerpc/aix.S, src/powerpc/darwin.S,
+	src/powerpc/ffi_darwin.c, src/powerpc/linux64.S,
+	src/powerpc/linux64_closure.S, src/powerpc/ppc_closure.S,
+	src/powerpc/sysv.S, src/s390/sysv.S, src/sh/sysv.S,
+	src/sh64/sysv.S, src/sparc/v8.S, src/sparc/v9.S,
+	src/x86/sysv.S, src/x86/unix64.S, src/x86/win32.S:
+	include fficonfig.h
+
+2003-10-20  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* src/mips/ffi.c: Use _ABIN32, _ABIO32 instead of external
+	_MIPS_SIM_NABI32, _MIPS_SIM_ABI32.
+
+2003-10-19  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/powerpc/ffi_darwin.c (ffi_prep_args): Declare bytes again.
+	Used when FFI_DEBUG = 1.
+
+2003-10-14  Alan Modra  <amodra@bigpond.net.au>
+
+	* src/types.c (double, longdouble): Default POWERPC64 to 8 byte size
+	and align.
+
+2003-10-06  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* include/ffi_mips.h: Define FFI_MIPS_N32 for N32/N64 ABIs,
+	FFI_MIPS_O32 for O32 ABI.
+
+2003-10-01  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/lib/libffi-dg.exp: Set LD_LIBRARY_PATH_64 for
+	SPARC64. Cleanup whitespaces.
+
+2003-09-19  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* testsuite/libffi.call/closure_fn0.c: Xfail mips, arm,
+	strongarm, xscale. Cleanup whitespaces.
+	* testsuite/libffi.call/closure_fn1.c: Likewise.
+	* testsuite/libffi.call/closure_fn2.c: Likewise.
+	* testsuite/libffi.call/closure_fn3.c: Likewise.
+	* testsuite/libffi.call/cls_12byte.c: Likewise.
+	* testsuite/libffi.call/cls_16byte.c: Likewise.
+	* testsuite/libffi.call/cls_1_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_20byte.c: Likewise.
+	* testsuite/libffi.call/cls_24byte.c: Likewise.
+	* testsuite/libffi.call/cls_2byte.c: Likewise.
+	* testsuite/libffi.call/cls_3_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_3byte1.c: Likewise.
+	* testsuite/libffi.call/cls_3byte2.c: Likewise.
+	* testsuite/libffi.call/cls_4_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_4byte.c: Likewise.
+	* testsuite/libffi.call/cls_5byte.c: Likewise.
+	* testsuite/libffi.call/cls_6byte.c: Likewise.
+	* testsuite/libffi.call/cls_7byte.c: Likewise.
+	* testsuite/libffi.call/cls_8byte.c: Likewise.
+	* testsuite/libffi.call/cls_double.c: Likewise.
+	* testsuite/libffi.call/cls_float.c: Likewise.
+	* testsuite/libffi.call/cls_uchar.c: Likewise.
+	* testsuite/libffi.call/cls_uint.c: Likewise.
+	* testsuite/libffi.call/cls_ulonglong.c: Likewise.
+	* testsuite/libffi.call/cls_ushort.c: Likewise.
+	* testsuite/libffi.call/nested_struct.c: Likewise.
+	* testsuite/libffi.call/nested_struct1.c: Likewise.
+	* testsuite/libffi.call/problem1.c: Likewise.
+	* testsuite/libffi.special/unwindtest.cc: Likewise.
+	* testsuite/libffi.call/pyobjc-tc.c: Cleanup whitespaces.
+
+2003-09-18  David Edelsohn  <edelsohn@gnu.org>
+
+	* src/powerpc/aix.S: Cleanup whitespaces.
+	* src/powerpc/aix_closure.S: Likewise.
+
+2003-09-18  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/powerpc/darwin.S: Cleanup whitespaces, comment formatting.
+	* src/powerpc/darwin_closure.S: Likewise.
+	* src/powerpc/ffi_darwin.c: Likewise.
+
+2003-09-18  Andreas Tobler  <a.tobler@schweiz.ch>
+	    David Edelsohn  <edelsohn@gnu.org>
+
+	* src/types.c (double): Add AIX and Darwin to the right TYPEDEF.
+	* src/powerpc/aix_closure.S: Remove the pointer to the outgoing
+	parameter stack.
+	* src/powerpc/darwin_closure.S: Likewise.
+	* src/powerpc/ffi_darwin.c (ffi_prep_args): Handle structures
+	according to the Darwin/AIX ABI.
+	(ffi_prep_cif_machdep): Likewise.
+	(ffi_closure_helper_DARWIN): Likewise.
+	Remove the outgoing parameter stack logic. Simplify the evaluation
+	of the different CASE types.
+	(ffi_prep_clousure): Avoid the casts on lvalues. Change the branch
+	statement in the trampoline code.
+
+2003-09-18  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/ffi.c (ffi_prep_args): Take account into the alignement
+	for the register size.
+	(ffi_closure_helper_SYSV): Handle the structure return value
+	address correctly.
+	(ffi_closure_helper_SYSV): Return the appropriate type when
+	the registers are used for the structure return value.
+	* src/sh/sysv.S (ffi_closure_SYSV): Fix the stack layout for
+	the 64-bit return value.  Update copyright years.
+
+2003-09-17  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* testsuite/lib/libffi-dg.exp (libffi_target_compile): Search in
+	srcdir for ffi_mips.h.
+
+2003-09-12  Alan Modra  <amodra@bigpond.net.au>
+
+	* src/prep_cif.c (initialize_aggregate): Include tail padding in
+	structure size.
+	* src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Correct
+	placement of float result.
+	* testsuite/libffi.special/unwindtest.cc (closure_test_fn1): Correct
+	cast of "resp" for big-endian 64 bit machines.
+
+2003-09-11  Alan Modra  <amodra@bigpond.net.au>
+
+	* src/types.c (double, longdouble): Merge identical SH and ARM
+	typedefs, and add POWERPC64.
+	* src/powerpc/ffi.c (ffi_prep_args64): Correct next_arg calc for
+	struct split over gpr and rest.
+	(ffi_prep_cif_machdep): Correct intarg_count for structures.
+	* src/powerpc/linux64.S (ffi_call_LINUX64): Fix gpr offsets.
+
+2003-09-09  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/powerpc/ffi.c (ffi_closure_helper_SYSV) Handle struct
+	passing correctly.
+
+2003-09-09  Alan Modra  <amodra@bigpond.net.au>
+
+	* configure: Regenerate.
+
+2003-09-04  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* Makefile.am: Remove build rules for ffitest.
+	* Makefile.in: Rebuilt.
+
+2003-09-04  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/java_raw_api.c: Include <stdlib.h> to fix compiler warning
+	about implicit declaration of abort().
+
+2003-09-04  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* Makefile.am: Add dejagnu test framework. Fixes PR other/11411.
+	* Makefile.in: Rebuilt.
+	* configure.in: Add dejagnu test framework.
+	* configure: Rebuilt.
+
+	* testsuite/Makefile.am: New file.
+	* testsuite/Makefile.in: Built
+	* testsuite/lib/libffi-dg.exp: New file.
+	* testsuite/config/default.exp: Likewise.
+	* testsuite/libffi.call/call.exp: Likewise.
+	* testsuite/libffi.call/ffitest.h: Likewise.
+	* testsuite/libffi.call/closure_fn0.c: Likewise.
+	* testsuite/libffi.call/closure_fn1.c: Likewise.
+	* testsuite/libffi.call/closure_fn2.c: Likewise.
+	* testsuite/libffi.call/closure_fn3.c: Likewise.
+	* testsuite/libffi.call/cls_1_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_3_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_4_1byte.c: Likewise.
+	* testsuite/libffi.call/cls_2byte.c: Likewise.
+	* testsuite/libffi.call/cls_3byte1.c: Likewise.
+	* testsuite/libffi.call/cls_3byte2.c: Likewise.
+	* testsuite/libffi.call/cls_4byte.c: Likewise.
+	* testsuite/libffi.call/cls_5byte.c: Likewise.
+	* testsuite/libffi.call/cls_6byte.c: Likewise.
+	* testsuite/libffi.call/cls_7byte.c: Likewise.
+	* testsuite/libffi.call/cls_8byte.c: Likewise.
+	* testsuite/libffi.call/cls_12byte.c: Likewise.
+	* testsuite/libffi.call/cls_16byte.c: Likewise.
+	* testsuite/libffi.call/cls_20byte.c: Likewise.
+	* testsuite/libffi.call/cls_24byte.c: Likewise.
+	* testsuite/libffi.call/cls_double.c: Likewise.
+	* testsuite/libffi.call/cls_float.c: Likewise.
+	* testsuite/libffi.call/cls_uchar.c: Likewise.
+	* testsuite/libffi.call/cls_uint.c: Likewise.
+	* testsuite/libffi.call/cls_ulonglong.c: Likewise.
+	* testsuite/libffi.call/cls_ushort.c: Likewise.
+	* testsuite/libffi.call/float.c: Likewise.
+	* testsuite/libffi.call/float1.c: Likewise.
+	* testsuite/libffi.call/float2.c: Likewise.
+	* testsuite/libffi.call/many.c: Likewise.
+	* testsuite/libffi.call/many_win32.c: Likewise.
+	* testsuite/libffi.call/nested_struct.c: Likewise.
+	* testsuite/libffi.call/nested_struct1.c: Likewise.
+	* testsuite/libffi.call/pyobjc-tc.c: Likewise.
+	* testsuite/libffi.call/problem1.c: Likewise.
+	* testsuite/libffi.call/promotion.c: Likewise.
+	* testsuite/libffi.call/return_ll.c: Likewise.
+	* testsuite/libffi.call/return_sc.c: Likewise.
+	* testsuite/libffi.call/return_uc.c: Likewise.
+	* testsuite/libffi.call/strlen.c: Likewise.
+	* testsuite/libffi.call/strlen_win32.c: Likewise.
+	* testsuite/libffi.call/struct1.c: Likewise.
+	* testsuite/libffi.call/struct2.c: Likewise.
+	* testsuite/libffi.call/struct3.c: Likewise.
+	* testsuite/libffi.call/struct4.c: Likewise.
+	* testsuite/libffi.call/struct5.c: Likewise.
+	* testsuite/libffi.call/struct6.c: Likewise.
+	* testsuite/libffi.call/struct7.c: Likewise.
+	* testsuite/libffi.call/struct8.c: Likewise.
+	* testsuite/libffi.call/struct9.c: Likewise.
+	* testsuite/libffi.special/special.exp: New file.
+	* testsuite/libffi.special/ffitestcxx.h: Likewise.
+	* testsuite/libffi.special/unwindtest.cc: Likewise.
+
+
+2003-08-13  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/ffi.c (OFS_INT16): Set 0 for little endian case.  Update
+	copyright years.
+
+2003-08-02  Alan Modra  <amodra@bigpond.net.au>
+
+	* src/powerpc/ffi.c (ffi_prep_args64): Modify for changed gcc
+	structure passing.
+	(ffi_closure_helper_LINUX64): Likewise.
+	* src/powerpc/linux64.S: Remove code writing to parm save area.
+	* src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Use return
+	address in lr from ffi_closure_helper_LINUX64 call to calculate
+	table address.  Optimize function tail.
+
+2003-07-28  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/sparc/ffi.c: Handle all floating point registers.
+	* src/sparc/v9.S: Likewise. Fixes second part of PR target/11410.
+
+2003-07-11  Gerald Pfeifer  <pfeifer@dbai.tuwien.ac.at>
+
+	* README: Note that libffi is not part of GCC.  Update the project
+	URL and status.
+
+2003-06-19  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>
+
+	* src/powerpc/ppc_closure.S: Include ffi.h.
+
+2003-06-13  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* src/x86/sysv.S: Avoid gas-only .uleb128/.sleb128 directives.
+	Use C style comments.
+
+2003-06-13  Kaz Kojima  <kkojima@rr.iij4u.or.jp>
+
+	* Makefile.am: Add SHmedia support.  Fix a typo of SH support.
+	* Makefile.in: Regenerate.
+	* configure.in (sh64-*-linux*, sh5*-*-linux*): Add target.
+	* configure: Regenerate.
+	* include/ffi.h.in: Add SHmedia support.
+	* src/sh64/ffi.c: New file.
+	* src/sh64/sysv.S: New file.
+
+2003-05-16  Jakub Jelinek  <jakub@redhat.com>
+
+	* configure.in (HAVE_RO_EH_FRAME): Check whether .eh_frame section
+	should be read-only.
+	* configure: Rebuilt.
+	* fficonfig.h.in: Rebuilt.
+	* include/ffi.h.in (EH_FRAME_FLAGS): Define.
+	* src/alpha/osf.S: Use EH_FRAME_FLAGS.
+	* src/powerpc/linux64.S: Likewise.
+	* src/powerpc/linux64_closure.S: Likewise.  Include ffi.h.
+	* src/powerpc/sysv.S: Use EH_FRAME_FLAGS.  Use pcrel encoding
+	if -fpic/-fPIC/-mrelocatable.
+	* src/powerpc/powerpc_closure.S: Likewise.
+	* src/sparc/v8.S: If HAVE_RO_EH_FRAME is defined, don't include
+	#write in .eh_frame flags.
+	* src/sparc/v9.S: Likewise.
+	* src/x86/unix64.S: Use EH_FRAME_FLAGS.
+	* src/x86/sysv.S: Likewise.  Use pcrel encoding if -fpic/-fPIC.
+	* src/s390/sysv.S: Use EH_FRAME_FLAGS.  Include ffi.h.
+
+2003-05-07  Jeff Sturm  <jsturm@one-point.com>
+
+	Fixes PR bootstrap/10656
+	* configure.in (HAVE_AS_REGISTER_PSEUDO_OP): Test assembler
+	support for .register pseudo-op.
+	* src/sparc/v8.S: Use it.
+	* fficonfig.h.in: Rebuilt.
+	* configure: Rebuilt.
+
+2003-04-18  Jakub Jelinek  <jakub@redhat.com>
+
+	* include/ffi.h.in (POWERPC64): Define if 64-bit.
+	(enum ffi_abi): Add FFI_LINUX64 on POWERPC.
+	Make it the default on POWERPC64.
+	(FFI_TRAMPOLINE_SIZE): Define to 24 on POWERPC64.
+	* configure.in: Change powerpc-*-linux* into powerpc*-*-linux*.
+	* configure: Rebuilt.
+	* src/powerpc/ffi.c (hidden): Define.
+	(ffi_prep_args_SYSV): Renamed from
+	ffi_prep_args.  Cast pointers to unsigned long to shut up warnings.
+	(NUM_GPR_ARG_REGISTERS64, NUM_FPR_ARG_REGISTERS64,
+	ASM_NEEDS_REGISTERS64): New.
+	(ffi_prep_args64): New function.
+	(ffi_prep_cif_machdep): Handle FFI_LINUX64 ABI.
+	(ffi_call): Likewise.
+	(ffi_prep_closure): Likewise.
+	(flush_icache): Surround by #ifndef POWERPC64.
+	(ffi_dblfl): New union type.
+	(ffi_closure_helper_SYSV): Use it to avoid aliasing problems.
+	(ffi_closure_helper_LINUX64): New function.
+	* src/powerpc/ppc_closure.S: Surround whole file by #ifndef
+	__powerpc64__.
+	* src/powerpc/sysv.S: Likewise.
+	(ffi_call_SYSV): Rename ffi_prep_args to ffi_prep_args_SYSV.
+	* src/powerpc/linux64.S: New file.
+	* src/powerpc/linux64_closure.S: New file.
+	* Makefile.am (EXTRA_DIST): Add src/powerpc/linux64.S and
+	src/powerpc/linux64_closure.S.
+	(TARGET_SRC_POWERPC): Likewise.
+
+	* src/ffitest.c (closure_test_fn, closure_test_fn1, closure_test_fn2,
+	closure_test_fn3): Fix result printing on big-endian 64-bit
+	machines.
+	(main): Print tst2_arg instead of uninitialized tst2_result.
+
+	* src/ffitest.c (main): Hide what closure pointer really points to
+	from the compiler.
+
+2003-04-16  Richard Earnshaw  <rearnsha@arm.com>
+
+	* configure.in (arm-*-netbsdelf*): Add configuration.
+	(configure): Regenerated.
+
+2003-04-04  Loren J. Rittle  <ljrittle@acm.org>
+
+	* include/Makefile.in: Regenerate.
+
+2003-03-21  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
+
+	* libffi/include/ffi.h.in: Define X86 instead of X86_64 in 32
+	bit mode.
+	* libffi/src/x86/ffi.c (ffi_closure_SYSV, ffi_closure_raw_SYSV):
+	Receive closure pointer through parameter, read args using
+	__builtin_dwarf_cfa.
+	(FFI_INIT_TRAMPOLINE): Send closure reference through eax.
+
+2003-03-12  Andreas Schwab  <schwab@suse.de>
+
+	* configure.in: Avoid trailing /. in toolexeclibdir.
+	* configure: Rebuilt.
+
+2003-03-03  Andreas Tobler <a.tobler@schweiz.ch>
+
+	* src/powerpc/darwin_closure.S: Recode to fit dynamic libraries.
+
+2003-02-06  Andreas Tobler <a.tobler@schweiz.ch>
+
+	* libffi/src/powerpc/darwin_closure.S:
+	Fix alignement bug, allocate 8 bytes for the result.
+	* libffi/src/powerpc/aix_closure.S:
+	Likewise.
+	* libffi/src/powerpc/ffi_darwin.c:
+	Update stackframe description for aix/darwin_closure.S.
+
+2003-02-06  Jakub Jelinek  <jakub@redhat.com>
+
+	* src/s390/ffi.c (ffi_closure_helper_SYSV): Add hidden visibility
+	attribute.
+
+2003-01-31  Christian Cornelssen  <ccorn@cs.tu-berlin.de>,
+	    Andreas Schwab  <schwab@suse.de>
+
+	* configure.in: Adjust command to source config-ml.in to account
+	for changes to the libffi_basedir definition.
+	(libffi_basedir): Remove ${srcdir} from value and include trailing
+	slash if nonempty.
+
+	* configure: Regenerate.
+
+2003-01-29  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>
+
+	* src/powerpc/ppc_closure.S: Recode to fit shared libs.
+
+2003-01-28  Andrew Haley  <aph@redhat.com>
+
+	* include/ffi.h.in: Enable FFI_CLOSURES for x86_64.
+	* src/x86/ffi64.c (ffi_prep_closure): New.
+	(ffi_closure_UNIX64_inner): New.
+	* src/x86/unix64.S (ffi_closure_UNIX64): New.
+
+2003-01-27  Alexandre Oliva  <aoliva@redhat.com>
+
+	* configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST.
+	Remove USE_LIBDIR conditional.
+	* Makefile.am (toolexecdir, toolexeclibdir): Don't override.
+	* Makefile.in, configure: Rebuilt.
+
+2003-01027  David Edelsohn  <edelsohn@gnu.org>
+
+	* Makefile.am (TARGET_SRC_POWERPC_AIX): Fix typo.
+	* Makefile.in: Regenerate.
+
+2003-01-22  Andrew Haley  <aph@redhat.com>
+
+	* src/powerpc/darwin.S (_ffi_call_AIX): Add Augmentation size to
+	unwind info.
+
+2003-01-21  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/powerpc/darwin.S: Add unwind info.
+	* src/powerpc/darwin_closure.S: Likewise.
+
+2003-01-14  Andrew Haley  <aph@redhat.com>
+
+	* src/x86/ffi64.c (ffi_prep_args): Check for void retval.
+	(ffi_prep_cif_machdep): Likewise.
+	* src/x86/unix64.S: Add unwind info.
+
+2003-01-14  Andreas Jaeger  <aj@suse.de>
+
+	* src/ffitest.c (main): Only use ffi_closures if those are
+	supported.
+
+2003-01-13 Andreas Tobler <a.tobler@schweiz.ch>
+
+	* libffi/src/ffitest.c
+	 add closure testcases
+
+2003-01-13 Kevin B. Hendricks <khendricks@ivey.uwo.ca>
+
+	* libffi/src/powerpc/ffi.c
+	 fix alignment bug for float (4 byte aligned iso 8 byte)
+
+2003-01-09  Geoffrey Keating  <geoffk@apple.com>
+
+	* src/powerpc/ffi_darwin.c: Remove RCS version string.
+	* src/powerpc/darwin.S: Remove RCS version string.
+
+2003-01-03  Jeff Sturm  <jsturm@one-point.com>
+
+	* include/ffi.h.in: Add closure defines for SPARC, SPARC64.
+	* src/ffitest.c (main): Use static storage for closure.
+	* src/sparc/ffi.c (ffi_prep_closure, ffi_closure_sparc_inner): New.
+	* src/sparc/v8.S (ffi_closure_v8): New.
+	* src/sparc/v9.S (ffi_closure_v9): New.
+
+2002-11-10  Ranjit Mathew <rmathew@hotmail.com>
+
+	* include/ffi.h.in: Added FFI_STDCALL ffi_type
+	  enumeration for X86_WIN32.
+	* src/x86/win32.S: Added ffi_call_STDCALL function
+	  definition.
+	* src/x86/ffi.c (ffi_call/ffi_raw_call): Added
+	  switch cases for recognising FFI_STDCALL and
+	  calling ffi_call_STDCALL if target is X86_WIN32.
+	* src/ffitest.c (my_stdcall_strlen/stdcall_many):
+	  stdcall versions of the "my_strlen" and "many"
+	  test functions (for X86_WIN32).
+	  Added test cases to test stdcall invocation using
+	  these functions.
+
+2002-12-02  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/sysv.S: Add DWARF2 unwind info.
+
+2002-11-27  Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* src/s390/sysv.S (.eh_frame section): Make section read-only.
+
+2002-11-26  Jim Wilson  <wilson@redhat.com>
+
+	* src/types.c (FFI_TYPE_POINTER): Has size 8 on IA64.
+
+2002-11-23  H.J. Lu <hjl@gnu.org>
+
+	* acinclude.m4: Add dummy AM_PROG_LIBTOOL.
+	Include ../config/accross.m4.
+	* aclocal.m4; Rebuild.
+	* configure: Likewise.
+
+2002-11-15  Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* src/s390/sysv.S (.eh_frame section): Adapt to pcrel FDE encoding.
+
+2002-11-11  DJ Delorie  <dj@redhat.com>
+
+	* configure.in: Look for common files in the right place.
+
+2002-10-08  Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* src/java_raw_api.c (ffi_java_raw_to_ptrarray): Interpret
+	raw data as _Jv_word values, not ffi_raw.
+	(ffi_java_ptrarray_to_raw): Likewise.
+	(ffi_java_rvalue_to_raw): New function.
+	(ffi_java_raw_call): Call it.
+	(ffi_java_raw_to_rvalue): New function.
+	(ffi_java_translate_args): Call it.
+	* src/ffitest.c (closure_test_fn): Interpret return value
+	as ffi_arg, not int.
+	* src/s390/ffi.c (ffi_prep_cif_machdep): Add missing
+	FFI_TYPE_POINTER case.
+	(ffi_closure_helper_SYSV): Likewise.  Also, assume return
+	values extended to word size.
+
+2002-10-02  Andreas Jaeger  <aj@suse.de>
+
+	* src/x86/ffi64.c (ffi_prep_cif_machdep): Remove debug output.
+
+2002-10-01  Bo Thorsen  <bo@smetana.suse.de>
+
+	* include/ffi.h.in: Fix i386 win32 compilation.
+
+2002-09-30  Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* configure.in: Add s390x-*-linux-* target.
+	* configure: Regenerate.
+	* include/ffi.h.in: Define S390X for s390x targets.
+	(FFI_CLOSURES): Define for s390/s390x.
+	(FFI_TRAMPOLINE_SIZE): Likewise.
+	(FFI_NATIVE_RAW_API): Likewise.
+	* src/prep_cif.c (ffi_prep_cif): Do not compute stack space for s390.
+	* src/types.c (FFI_TYPE_POINTER): Use 8-byte pointers on s390x.
+	* src/s390/ffi.c: Major rework of existing code.  Add support for
+	s390x targets.  Add closure support.
+	* src/s390/sysv.S: Likewise.
+
+2002-09-29  Richard Earnshaw  <rearnsha@arm.com>
+
+	* src/arm/sysv.S: Fix typo.
+
+2002-09-28  Richard Earnshaw  <rearnsha@arm.com>
+
+	* src/arm/sysv.S: If we don't have machine/asm.h and the pre-processor
+	has defined __USER_LABEL_PREFIX__, then use it in CNAME.
+	(ffi_call_SYSV): Handle soft-float.
+
+2002-09-27  Bo Thorsen  <bo@suse.de>
+
+	* include/ffi.h.in: Fix multilib x86-64 support.
+
+2002-09-22  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+	* Makefile.am (all-multi): Fix multilib parallel build.
+
+2002-07-19  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* configure.in (sh[34]*-*-linux*): Add brackets.
+	* configure: Regenerate.
+
+2002-07-18  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* Makefile.am: Add SH support.
+	* Makefile.in: Regenerate.
+	* configure.in (sh-*-linux*, sh[34]*-*-linux*): Add target.
+	* configure: Regenerate.
+	* include/ffi.h.in: Add SH support.
+	* src/sh/ffi.c: New file.
+	* src/sh/sysv.S: New file.
+	* src/types.c: Add SH support.
+
+2002-07-16  Bo Thorsen  <bo@suse.de>
+
+	* src/x86/ffi64.c: New file that adds x86-64 support.
+	* src/x86/unix64.S: New file that handles argument setup for
+	x86-64.
+	* src/x86/sysv.S: Don't use this on x86-64.
+	* src/x86/ffi.c: Don't use this on x86-64.
+	Remove unused vars.
+	* src/prep_cif.c (ffi_prep_cif): Don't do stack size calculation
+	for x86-64.
+	* src/ffitest.c (struct6): New test that tests a special case in
+	the x86-64 ABI.
+	(struct7): Likewise.
+	(struct8): Likewise.
+	(struct9): Likewise.
+	(closure_test_fn): Silence warning about this when it's not used.
+	(main): Add the new tests.
+	(main): Fix a couple of wrong casts and silence some compiler warnings.
+	* include/ffi.h.in: Add x86-64 ABI definition.
+	* fficonfig.h.in: Regenerate.
+	* Makefile.am: Add x86-64 support.
+	* configure.in: Likewise.
+	* Makefile.in: Regenerate.
+	* configure: Likewise.
+
+2002-06-24  Bo Thorsen  <bo@suse.de>
+
+	* src/types.c: Merge settings for similar architectures.
+	Add x86-64 sizes and alignments.
+
+2002-06-23  Bo Thorsen  <bo@suse.de>
+
+	* src/arm/ffi.c (ffi_prep_args): Remove unused vars.
+	* src/sparc/ffi.c (ffi_prep_args_v8): Likewise.
+	* src/mips/ffi.c (ffi_prep_args): Likewise.
+	* src/m68k/ffi.c (ffi_prep_args): Likewise.
+
+2002-07-18  H.J. Lu  (hjl@gnu.org)
+
+	* Makefile.am (TARGET_SRC_MIPS_LINUX): New.
+	(libffi_la_SOURCES): Support MIPS_LINUX.
+	(libffi_convenience_la_SOURCES): Likewise.
+	* Makefile.in: Regenerated.
+
+	* configure.in (mips64*-*): Skip.
+	(mips*-*-linux*): New.
+	* configure: Regenerated.
+
+	* src/mips/ffi.c: Include <sgidefs.h>.
+
+2002-06-06  Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* src/s390/sysv.S: Save/restore %r6.  Add DWARF-2 unwind info.
+
+2002-05-27  Roger Sayle  <roger@eyesopen.com>
+
+	* src/x86/ffi.c (ffi_prep_args): Remove reference to avn.
+
+2002-05-27  Bo Thorsen  <bo@suse.de>
+
+	* src/x86/ffi.c (ffi_prep_args): Remove unused variable and
+	fix formatting.
+
+2002-05-13  Andreas Tobler  <a.tobler@schweiz.ch>
+
+	* src/powerpc/ffi_darwin.c (ffi_prep_closure): Declare fd at
+	beginning of function (for older apple cc).
+
+2002-05-08  Alexandre Oliva  <aoliva@redhat.com>
+
+	* configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at
+	script entry, and set LD to it when configuring multilibs.
+	* configure: Rebuilt.
+
+2002-05-05  Jason Thorpe  <thorpej@wasabisystems.com>
+
+	* configure.in (sparc64-*-netbsd*): Add target.
+	(sparc-*-netbsdelf*): Likewise.
+	* configure: Regenerate.
+
+2002-04-28  David S. Miller  <davem@redhat.com>
+
+	* configure.in, configure: Fix SPARC test in previous change.
+
+2002-04-29  Gerhard Tonn  <GerhardTonn@swol.de>
+
+	* Makefile.am: Add Linux for S/390 support.
+	* Makefile.in: Regenerate.
+	* configure.in: Add Linux for S/390 support.
+	* configure: Regenerate.
+	* include/ffi.h.in: Add Linux for S/390 support.
+	* src/s390/ffi.c: New file from libffi CVS tree.
+	* src/s390/sysv.S: New file from libffi CVS tree.
+
+2002-04-28  Jakub Jelinek  <jakub@redhat.com>
+
+	* configure.in (HAVE_AS_SPARC_UA_PCREL): Check for working
+	%r_disp32().
+	* src/sparc/v8.S: Use it.
+	* src/sparc/v9.S: Likewise.
+	* fficonfig.h.in: Rebuilt.
+	* configure: Rebuilt.
+
+2002-04-08  Hans Boehm  <Hans_Boehm@hp.com>
+
+	* src/java_raw_api.c (ffi_java_raw_size): Handle FFI_TYPE_DOUBLE
+	correctly.
+	* src/ia64/unix.S: Add unwind information. Fix comments.
+	Save sp in a way that's compatible with unwind info.
+	(ffi_call_unix): Correctly restore sp in all cases.
+	* src/ia64/ffi.c: Add, fix comments.
+
+2002-04-08  Jakub Jelinek  <jakub@redhat.com>
+
+	* src/sparc/v8.S: Make .eh_frame dependent on target word size.
+
+2002-04-06  Jason Thorpe  <thorpej@wasabisystems.com>
+
+	* configure.in (alpha*-*-netbsd*): Add target.
+	* configure: Regenerate.
+
+2002-04-04  Jeff Sturm  <jsturm@one-point.com>
+
+	* src/sparc/v8.S: Add unwind info.
+	* src/sparc/v9.S: Likewise.
+
+2002-03-30  Krister Walfridsson  <cato@df.lth.se>
+
+	* configure.in: Enable i*86-*-netbsdelf*.
+	* configure: Rebuilt.
+
+2002-03-29  David Billinghurst <David.Billinghurst@riotinto.com>
+
+	PR other/2620
+	* src/mips/n32.s: Delete
+	* src/mips/o32.s: Delete
+
+2002-03-21  Loren J. Rittle  <ljrittle@acm.org>
+
+	* configure.in: Enable alpha*-*-freebsd*.
+	* configure: Rebuilt.
+
+2002-03-17  Bryce McKinlay  <bryce@waitaki.otago.ac.nz>
+
+	* Makefile.am: libfficonvenience -> libffi_convenience.
+	* Makefile.in: Rebuilt.
+
+	* Makefile.am: Define ffitest_OBJECTS.
+	* Makefile.in: Rebuilt.
+
+2002-03-07  Andreas Tobler  <toa@pop.agri.ch>
+	    David Edelsohn  <edelsohn@gnu.org>
+
+	* Makefile.am (EXTRA_DIST): Add Darwin and AIX closure files.
+	(TARGET_SRC_POWERPC_AIX): Add aix_closure.S.
+	(TARGET_SRC_POWERPC_DARWIN): Add darwin_closure.S.
+	* Makefile.in: Regenerate.
+	* include/ffi.h.in: Add AIX and Darwin closure definitions.
+	* src/powerpc/ffi_darwin.c (ffi_prep_closure): New function.
+	(flush_icache, flush_range): New functions.
+	(ffi_closure_helper_DARWIN): New function.
+	* src/powerpc/aix_closure.S: New file.
+	* src/powerpc/darwin_closure.S: New file.
+
+2002-02-24  Jeff Sturm  <jsturm@one-point.com>
+
+	* include/ffi.h.in: Add typedef for ffi_arg.
+	* src/ffitest.c (main): Declare rint with ffi_arg.
+
+2002-02-21  Andreas Tobler  <toa@pop.agri.ch>
+
+	* src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate
+	number of GPRs for floating-point arguments.
+
+2002-01-31  Anthony Green  <green@redhat.com>
+
+	* configure: Rebuilt.
+	* configure.in: Replace CHECK_SIZEOF and endian tests with
+	cross-compiler friendly macros.
+	* aclocal.m4 (AC_COMPILE_CHECK_SIZEOF, AC_C_BIGENDIAN_CROSS): New
+	macros.
+
+2002-01-18  David Edelsohn  <edelsohn@gnu.org>
+
+	* src/powerpc/darwin.S (_ffi_call_AIX): New.
+	* src/powerpc/aix.S (ffi_call_DARWIN): New.
+
+2002-01-17  David Edelsohn  <edelsohn@gnu.org>
+
+	* Makefile.am (EXTRA_DIST): Add Darwin and AIX files.
+	(TARGET_SRC_POWERPC_AIX): New.
+	(POWERPC_AIX): New stanza.
+	* Makefile.in: Regenerate.
+	* configure.in: Add AIX case.
+	* configure: Regenerate.
+	* include/ffi.h.in (ffi_abi): Add FFI_AIX.
+	* src/powerpc/ffi_darwin.c (ffi_status): Use "long" to scale frame
+	size.  Fix "long double" support.
+	(ffi_call): Add FFI_AIX case.
+	* src/powerpc/aix.S: New.
+
+2001-10-09  John Hornkvist  <john@toastedmarshmallow.com>
+
+	Implement Darwin PowerPC ABI.
+	* configure.in: Handle powerpc-*-darwin*.
+	* Makefile.am: Set source files for POWERPC_DARWIN.
+	* configure: Rebuilt.
+	* Makefile.in: Rebuilt.
+	* include/ffi.h.in: Define FFI_DARWIN and FFI_DEFAULT_ABI for
+	POWERPC_DARWIN.
+	* src/powerpc/darwin.S: New file.
+	* src/powerpc/ffi_darwin.c: New file.
+
+2001-10-07  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+	* src/x86/ffi.c: Fix spelling error of "separate" as "seperate".
+
+2001-07-16  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* src/x86/sysv.S: Avoid gas-only .balign directive.
+	Use C style comments.
+
+2001-07-16  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* src/alpha/ffi.c (ffi_prep_closure): Avoid gas-only mnemonic.
+	Fixes PR bootstrap/3563.
+
+2001-06-26  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* src/alpha/osf.S (ffi_closure_osf): Use .rdata for ECOFF.
+
+2001-06-25  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* configure.in: Recognize sparc*-sun-* host.
+	* configure: Regenerate.
+
+2001-06-06  Andrew Haley  <aph@redhat.com>
+
+	* src/alpha/osf.S (__FRAME_BEGIN__): Conditionalize for ELF.
+
+2001-06-03  Andrew Haley  <aph@redhat.com>
+
+	* src/alpha/osf.S: Add unwind info.
+	* src/powerpc/sysv.S: Add unwind info.
+	* src/powerpc/ppc_closure.S: Likewise.
+
+2000-05-31  Jeff Sturm  <jsturm@one-point.com>
+
+	* configure.in: Fix AC_ARG_ENABLE usage.
+	* configure: Rebuilt.
+
+2001-05-06  Bryce McKinlay  <bryce@waitaki.otago.ac.nz>
+
+	* configure.in: Remove warning about beta code.
+	* configure: Rebuilt.
+
+2001-04-25  Hans Boehm <Hans_Boehm@hp.com>
+
+	* src/ia64/unix.S: Restore stack pointer when returning from
+	ffi_closure_UNIX.
+	* src/ia64/ffi.c: Fix typo in comment.
+
+2001-04-18  Jim Wilson  <wilson@redhat.com>
+
+	* src/ia64/unix.S: Delete unnecessary increment and decrement of loc2
+	to eliminate RAW DV.
+
+2001-04-12  Bryce McKinlay  <bryce@albatross.co.nz>
+
+	* Makefile.am: Make a libtool convenience library.
+	* Makefile.in: Rebuilt.
+
+2001-03-29  Bryce McKinlay  <bryce@albatross.co.nz>
+
+	* configure.in: Use different syntax for subdirectory creation.
+	* configure: Rebuilt.
+
+2001-03-27  Jon Beniston  <jon@beniston.com>
+
+	* configure.in: Added X86_WIN32 target (Win32, CygWin, MingW).
+	* configure: Rebuilt.
+	* Makefile.am: Added X86_WIN32 target support.
+	* Makefile.in: Rebuilt.
+
+	* include/ffi.h.in: Added X86_WIN32 target support.
+
+	* src/ffitest.c: Doesn't run structure tests for X86_WIN32 targets.
+	* src/types.c: Added X86_WIN32 target support.
+
+	* src/x86/win32.S: New file. Based on sysv.S, but with EH
+	stuff removed and made to work with CygWin's gas.
+
+2001-03-26  Bryce McKinlay  <bryce@albatross.co.nz>
+
+	* configure.in: Make target subdirectory in build dir.
+	* Makefile.am: Override suffix based rules to specify correct output
+	subdirectory.
+	* Makefile.in: Rebuilt.
+	* configure: Rebuilt.
+
+2001-03-23  Kevin B Hendricks  <khendricks@ivey.uwo.ca>
+
+	* src/powerpc/ppc_closure.S: New file.
+	* src/powerpc/ffi.c (ffi_prep_args): Fixed ABI compatibility bug
+	involving long long and register pairs.
+	(ffi_prep_closure): New function.
+	(flush_icache): Likewise.
+	(ffi_closure_helper_SYSV): Likewise.
+	* include/ffi.h.in (FFI_CLOSURES): Define on PPC.
+	(FFI_TRAMPOLINE_SIZE): Likewise.
+	(FFI_NATIVE_RAW_API): Likewise.
+	* Makefile.in: Rebuilt.
+	* Makefile.am (EXTRA_DIST): Added src/powerpc/ppc_closure.S.
+	(TARGET_SRC_POWERPC): Likewise.
+
+2001-03-19  Tom Tromey  <tromey@redhat.com>
+
+	* Makefile.in: Rebuilt.
+	* Makefile.am (ffitest_LDFLAGS): New macro.
+
+2001-03-02  Nick Clifton  <nickc@redhat.com>
+
+	* include/ffi.h.in: Remove RCS ident string.
+	* include/ffi_mips.h: Remove RCS ident string.
+	* src/debug.c: Remove RCS ident string.
+	* src/ffitest.c: Remove RCS ident string.
+	* src/prep_cif.c: Remove RCS ident string.
+	* src/types.c: Remove RCS ident string.
+	* src/alpha/ffi.c: Remove RCS ident string.
+	* src/alpha/osf.S: Remove RCS ident string.
+	* src/arm/ffi.c: Remove RCS ident string.
+	* src/arm/sysv.S: Remove RCS ident string.
+	* src/mips/ffi.c: Remove RCS ident string.
+	* src/mips/n32.S: Remove RCS ident string.
+	* src/mips/o32.S: Remove RCS ident string.
+	* src/sparc/ffi.c: Remove RCS ident string.
+	* src/sparc/v8.S: Remove RCS ident string.
+	* src/sparc/v9.S: Remove RCS ident string.
+	* src/x86/ffi.c: Remove RCS ident string.
+	* src/x86/sysv.S: Remove RCS ident string.
+
+2001-02-08  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+	* include/ffi.h.in: Change sourceware.cygnus.com references to
+	gcc.gnu.org.
+
+2000-12-09  Richard Henderson  <rth@redhat.com>
+
+	* src/alpha/ffi.c (ffi_call): Simplify struct return test.
+	(ffi_closure_osf_inner): Index rather than increment avalue
+	and arg_types.  Give ffi_closure_osf the raw return value type.
+	* src/alpha/osf.S (ffi_closure_osf): Handle return value type
+	promotion.
+
+2000-12-07  Richard Henderson  <rth@redhat.com>
+
+	* src/raw_api.c (ffi_translate_args): Fix typo.
+	(ffi_prep_closure): Likewise.
+
+	* include/ffi.h.in [ALPHA]: Define FFI_CLOSURES and
+	FFI_TRAMPOLINE_SIZE.
+	* src/alpha/ffi.c (ffi_prep_cif_machdep): Adjust minimal
+	cif->bytes for new ffi_call_osf implementation.
+	(ffi_prep_args): Absorb into ...
+	(ffi_call): ... here.  Do all stack allocation here and
+	avoid a callback function.
+	(ffi_prep_closure, ffi_closure_osf_inner): New.
+	* src/alpha/osf.S (ffi_call_osf): Reimplement with no callback.
+	(ffi_closure_osf): New.
+
+2000-09-10  Alexandre Oliva  <aoliva@redhat.com>
+
+	* config.guess, config.sub, install-sh: Removed.
+	* ltconfig, ltmain.sh, missing, mkinstalldirs: Likewise.
+	* Makefile.in: Rebuilt.
+
+	* acinclude.m4: Include libtool macros from the top level.
+	* aclocal.m4, configure: Rebuilt.
+
+2000-08-22  Alexandre Oliva  <aoliva@redhat.com>
+
+	* configure.in [i*86-*-freebsd*] (TARGET, TARGETDIR): Set.
+	* configure: Rebuilt.
+
+2000-05-11  Scott Bambrough  <scottb@netwinder.org>
+
+	* libffi/src/arm/sysv.S (ffi_call_SYSV): Doubles are not saved to
+	memory correctly.  Use conditional instructions, not branches where
+	possible.
+
+2000-05-04  Tom Tromey  <tromey@cygnus.com>
+
+	* configure: Rebuilt.
+	* configure.in: Match `arm*-*-linux-*'.
+	From Chris Dornan <cdornan@arm.com>.
+
+2000-04-28  Jakub Jelinek  <jakub@redhat.com>
+
+	* Makefile.am (SUBDIRS): Define.
+	(AM_MAKEFLAGS): Likewise.
+	(Multilib support.): Add section.
+	* Makefile.in: Rebuilt.
+	* ltconfig (extra_compiler_flags, extra_compiler_flags_value):
+	New variables. Set for gcc using -print-multi-lib. Export them
+	to libtool.
+	(sparc64-*-linux-gnu*): Use libsuff 64 for search paths.
+	* ltmain.sh (B|b|V): Don't throw away gcc's -B, -b and -V options
+	for -shared links.
+	(extra_compiler_flags_value, extra_compiler_flags): Check these
+	for extra compiler options which need to be passed down in
+	compiler_flags.
+
+2000-04-16  Anthony Green  <green@redhat.com>
+
+	* configure: Rebuilt.
+	* configure.in: Change i*86-pc-linux* to i*86-*-linux*.
+
+2000-04-14  Jakub Jelinek  <jakub@redhat.com>
+
+	* include/ffi.h.in (SPARC64): Define for 64bit SPARC builds.
+	Set SPARC FFI_DEFAULT_ABI based on SPARC64 define.
+	* src/sparc/ffi.c (ffi_prep_args_v8): Renamed from ffi_prep_args.
+	Replace all void * sizeofs with sizeof(int).
+	Only compare type with FFI_TYPE_LONGDOUBLE if LONGDOUBLE is
+	different than DOUBLE.
+	Remove FFI_TYPE_SINT32 and FFI_TYPE_UINT32 cases (handled elsewhere).
+	(ffi_prep_args_v9): New function.
+	(ffi_prep_cif_machdep): Handle V9 ABI and long long on V8.
+	(ffi_V9_return_struct): New function.
+	(ffi_call): Handle FFI_V9 ABI from 64bit code and FFI_V8 ABI from
+	32bit code (not yet cross-arch calls).
+	* src/sparc/v8.S: Add struct return delay nop.
+	Handle long long.
+	* src/sparc/v9.S: New file.
+	* src/prep_cif.c (ffi_prep_cif): Return structure pointer
+	is used on sparc64 only for structures larger than 32 bytes.
+	Pass by reference for structures is done for structure arguments
+	larger than 16 bytes.
+	* src/ffitest.c (main): Use 64bit rint on sparc64.
+	Run long long tests on sparc.
+	* src/types.c (FFI_TYPE_POINTER): Pointer is 64bit on alpha and
+	sparc64.
+	(FFI_TYPE_LONGDOUBLE): long double is 128 bit aligned to 128 bits
+	on sparc64.
+	* configure.in (sparc-*-linux*): New supported target.
+	(sparc64-*-linux*): Likewise.
+	* configure: Rebuilt.
+	* Makefile.am: Add v9.S to SPARC files.
+	* Makefile.in: Likewise.
+	(LINK): Surround $(CCLD) into double quotes, so that multilib
+	compiles work correctly.
+
+2000-04-04  Alexandre Petit-Bianco  <apbianco@cygnus.com>
+
+	* configure: Rebuilt.
+	* configure.in: (i*86-*-solaris*): New libffi target. Patch
+	proposed by Bryce McKinlay.
+
+2000-03-20  Tom Tromey  <tromey@cygnus.com>
+
+	* Makefile.in: Hand edit for java_raw_api.lo.
+
+2000-03-08  Bryce McKinlay  <bryce@albatross.co.nz>
+
+	* config.guess, config.sub: Update from the gcc tree.
+	Fix for PR libgcj/168.
+
+2000-03-03  Tom Tromey  <tromey@cygnus.com>
+
+	* Makefile.in: Fixed ia64 by hand.
+
+	* configure: Rebuilt.
+	* configure.in (--enable-multilib): New option.
+	(libffi_basedir): New subst.
+	(AC_OUTPUT): Added multilib code.
+
+2000-03-02  Tom Tromey  <tromey@cygnus.com>
+
+	* Makefile.in: Rebuilt.
+	* Makefile.am (TARGET_SRC_IA64): Use `ia64', not `alpha', as
+	directory name.
+
+2000-02-25  Hans Boehm <boehm@acm.org>
+
+	* src/ia64/ffi.c, src/ia64/ia64_flags.h, src/ia64/unix.S: New
+	files.
+	* src/raw_api.c (ffi_translate_args): Fixed typo in argument
+	list.
+	(ffi_prep_raw_closure): Use ffi_translate_args, not
+	ffi_closure_translate.
+	* src/java_raw_api.c: New file.
+	* src/ffitest.c (closure_test_fn): New function.
+	(main): Define `rint' as long long on IA64.  Added new test when
+	FFI_CLOSURES is defined.
+	* include/ffi.h.in (ALIGN): Use size_t, not unsigned.
+	(ffi_abi): Recognize IA64.
+	(ffi_raw): Added `flt' field.
+	Added "Java raw API" code.
+	* configure.in: Recognize ia64.
+	* Makefile.am (TARGET_SRC_IA64): New macro.
+	(libffi_la_common_SOURCES): Added java_raw_api.c.
+	(libffi_la_SOURCES): Define in IA64 case.
+
+2000-01-04  Tom Tromey  <tromey@cygnus.com>
+
+	* Makefile.in: Rebuilt with newer automake.
+
+1999-12-31  Tom Tromey  <tromey@cygnus.com>
+
+	* Makefile.am (INCLUDES): Added -I$(top_srcdir)/src.
+
+1999-09-01  Tom Tromey  <tromey@cygnus.com>
+
+	* include/ffi.h.in: Removed PACKAGE and VERSION defines and
+	undefs.
+	* fficonfig.h.in: Rebuilt.
+	* configure: Rebuilt.
+	* configure.in: Pass 3rd argument to AM_INIT_AUTOMAKE.
+	Use AM_PROG_LIBTOOL (automake 1.4 compatibility).
+	* acconfig.h: Don't #undef PACKAGE or VERSION.
+
+1999-08-09  Anthony Green  <green@cygnus.com>
+
+	* include/ffi.h.in: Try to work around messy header problem
+	with PACKAGE and VERSION.
+
+	* configure: Rebuilt.
+	* configure.in: Change version to 2.00-beta.
+
+	* fficonfig.h.in: Rebuilt.
+	* acconfig.h (FFI_NO_STRUCTS, FFI_NO_RAW_API): Define.
+
+	* src/x86/ffi.c (ffi_raw_call): Rename.
+
+1999-08-02  Kresten Krab Thorup  <krab@dominiq.is.s.u-tokyo.ac.jp>
+
+	* src/x86/ffi.c (ffi_closure_SYSV): New function.
+	(ffi_prep_incoming_args_SYSV): Ditto.
+	(ffi_prep_closure): Ditto.
+	(ffi_closure_raw_SYSV): Ditto.
+	(ffi_prep_raw_closure): More ditto.
+	(ffi_call_raw): Final ditto.
+
+	* include/ffi.h.in: Add definitions for closure and raw API.
+
+	* src/x86/ffi.c (ffi_prep_cif_machdep): Added case for
+	FFI_TYPE_UINT64.
+
+	* Makefile.am (libffi_la_common_SOURCES): Added raw_api.c
+
+	* src/raw_api.c: New file.
+
+	* include/ffi.h.in (ffi_raw): New type.
+	(UINT_ARG, SINT_ARG): New defines.
+	(ffi_closure, ffi_raw_closure): New types.
+	(ffi_prep_closure, ffi_prep_raw_closure): New declarations.
+
+	* configure.in: Add check for endianness and sizeof void*.
+
+	* src/x86/sysv.S (ffi_call_SYSV): Call fixup routine via argument,
+	instead of directly.
+
+	* configure: Rebuilt.
+
+Thu Jul  8 14:28:42 1999  Anthony Green  <green@cygnus.com>
+
+	* configure.in: Add x86 and powerpc BeOS configurations.
+	From Makoto Kato <m_kato@ga2.so-net.ne.jp>.
+
+1999-05-09  Anthony Green  <green@cygnus.com>
+
+	* configure.in: Add warning about this being beta code.
+	Remove src/Makefile.am from the picture.
+	* configure: Rebuilt.
+
+	* Makefile.am: Move logic from src/Makefile.am.  Add changes
+	to support libffi as a target library.
+	* Makefile.in: Rebuilt.
+
+	* aclocal.m4, config.guess, config.sub, ltconfig, ltmain.sh:
+	Upgraded to new autoconf, automake, libtool.
+
+	* README: Tweaks.
+
+	* LICENSE: Update copyright date.
+
+	* src/Makefile.am, src/Makefile.in: Removed.
+
+1998-11-29  Anthony Green  <green@cygnus.com>
+
+	* include/ChangeLog: Removed.
+	* src/ChangeLog: Removed.
+	* src/mips/ChangeLog: Removed.
+	* src/sparc/ChangeLog: Remboved.
+	* src/x86/ChangeLog: Removed.
+
+	* ChangeLog.v1: Created.
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libffi b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libffi
new file mode 100644
index 0000000..f3ee8b0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libffi
@@ -0,0 +1,584 @@
+2011-02-08  Andreas Tobler  <andreast@fgznet.ch>
+
+	* testsuite/lib/libffi.exp: Tweak for stand-alone mode.
+
+2009-12-25  Samuli Suominen  <ssuominen@gentoo.org>
+
+	* configure.ac: Undefine _AC_ARG_VAR_PRECIOUS for autoconf 2.64.
+	* configure: Rebuilt.
+	* fficonfig.h.in: Rebuilt.
+
+2009-06-16  Andrew Haley  <aph@redhat.com>
+
+	* testsuite/libffi.call/cls_align_sint64.c,
+	testsuite/libffi.call/cls_align_uint64.c,
+	testsuite/libffi.call/cls_longdouble_va.c,
+	testsuite/libffi.call/cls_ulonglong.c,
+	testsuite/libffi.call/return_ll1.c,
+	testsuite/libffi.call/stret_medium2.c: Fix printf format
+	specifiers.
+	* testsuite/libffi.call/huge_struct.c: Ad x86 XFAILs.
+	* testsuite/libffi.call/float2.c: Fix dg-excess-errors.
+	* testsuite/libffi.call/ffitest.h,
+	testsuite/libffi.special/ffitestcxx.h (PRIdLL, PRIuLL): Define.
+
+2009-06-12  Andrew Haley  <aph@redhat.com>
+
+	* testsuite/libffi.call/cls_align_sint64.c,
+	testsuite/libffi.call/cls_align_uint64.c,
+	testsuite/libffi.call/cls_ulonglong.c,
+	testsuite/libffi.call/return_ll1.c,
+	testsuite/libffi.call/stret_medium2.c: Fix printf format
+	specifiers.
+	testsuite/libffi.special/unwindtest.cc: include stdint.h.
+
+2009-06-11  Timothy Wall  <twall@users.sf.net>
+
+	* Makefile.am,
+        configure.ac,
+        include/ffi.h.in,
+        include/ffi_common.h,
+        src/closures.c,
+        src/dlmalloc.c,
+        src/x86/ffi.c,
+        src/x86/ffitarget.h,
+        src/x86/win64.S (new),
+	README: Added win64 support (mingw or MSVC)
+        * Makefile.in,
+        include/Makefile.in,
+        man/Makefile.in,
+        testsuite/Makefile.in,
+        configure,
+        aclocal.m4: Regenerated
+        * ltcf-c.sh: properly escape cygwin/w32 path
+        * man/ffi_call.3: Clarify size requirements for return value.
+        * src/x86/ffi64.c: Fix filename in comment.
+        * src/x86/win32.S: Remove unused extern.
+
+        * testsuite/libffi.call/closure_fn0.c,
+        testsuite/libffi.call/closure_fn1.c,
+        testsuite/libffi.call/closure_fn2.c,
+        testsuite/libffi.call/closure_fn3.c,
+        testsuite/libffi.call/closure_fn4.c,
+        testsuite/libffi.call/closure_fn5.c,
+        testsuite/libffi.call/closure_fn6.c,
+	testsuite/libffi.call/closure_stdcall.c,
+	testsuite/libffi.call/cls_12byte.c,
+	testsuite/libffi.call/cls_16byte.c,
+	testsuite/libffi.call/cls_18byte.c,
+	testsuite/libffi.call/cls_19byte.c,
+	testsuite/libffi.call/cls_1_1byte.c,
+	testsuite/libffi.call/cls_20byte.c,
+	testsuite/libffi.call/cls_20byte1.c,
+	testsuite/libffi.call/cls_24byte.c,
+	testsuite/libffi.call/cls_2byte.c,
+	testsuite/libffi.call/cls_3_1byte.c,
+	testsuite/libffi.call/cls_3byte1.c,
+ 	testsuite/libffi.call/cls_3byte2.c,
+ 	testsuite/libffi.call/cls_4_1byte.c,
+ 	testsuite/libffi.call/cls_4byte.c,
+ 	testsuite/libffi.call/cls_5_1_byte.c,
+ 	testsuite/libffi.call/cls_5byte.c,
+ 	testsuite/libffi.call/cls_64byte.c,
+ 	testsuite/libffi.call/cls_6_1_byte.c,
+ 	testsuite/libffi.call/cls_6byte.c,
+ 	testsuite/libffi.call/cls_7_1_byte.c,
+ 	testsuite/libffi.call/cls_7byte.c,
+ 	testsuite/libffi.call/cls_8byte.c,
+ 	testsuite/libffi.call/cls_9byte1.c,
+ 	testsuite/libffi.call/cls_9byte2.c,
+ 	testsuite/libffi.call/cls_align_double.c,
+ 	testsuite/libffi.call/cls_align_float.c,
+ 	testsuite/libffi.call/cls_align_longdouble.c,
+ 	testsuite/libffi.call/cls_align_longdouble_split.c,
+ 	testsuite/libffi.call/cls_align_longdouble_split2.c,
+ 	testsuite/libffi.call/cls_align_pointer.c,
+ 	testsuite/libffi.call/cls_align_sint16.c,
+ 	testsuite/libffi.call/cls_align_sint32.c,
+ 	testsuite/libffi.call/cls_align_sint64.c,
+ 	testsuite/libffi.call/cls_align_uint16.c,
+ 	testsuite/libffi.call/cls_align_uint32.c,
+ 	testsuite/libffi.call/cls_align_uint64.c,
+ 	testsuite/libffi.call/cls_dbls_struct.c,
+ 	testsuite/libffi.call/cls_double.c,
+ 	testsuite/libffi.call/cls_double_va.c,
+ 	testsuite/libffi.call/cls_float.c,
+ 	testsuite/libffi.call/cls_longdouble.c,
+ 	testsuite/libffi.call/cls_longdouble_va.c,
+ 	testsuite/libffi.call/cls_multi_schar.c,
+ 	testsuite/libffi.call/cls_multi_sshort.c,
+ 	testsuite/libffi.call/cls_multi_sshortchar.c,
+ 	testsuite/libffi.call/cls_multi_uchar.c,
+ 	testsuite/libffi.call/cls_multi_ushort.c,
+ 	testsuite/libffi.call/cls_multi_ushortchar.c,
+ 	testsuite/libffi.call/cls_pointer.c,
+ 	testsuite/libffi.call/cls_pointer_stack.c,
+ 	testsuite/libffi.call/cls_schar.c,
+ 	testsuite/libffi.call/cls_sint.c,
+ 	testsuite/libffi.call/cls_sshort.c,
+ 	testsuite/libffi.call/cls_uchar.c,
+ 	testsuite/libffi.call/cls_uint.c,
+ 	testsuite/libffi.call/cls_ulonglong.c,
+ 	testsuite/libffi.call/cls_ushort.c,
+ 	testsuite/libffi.call/err_bad_abi.c,
+ 	testsuite/libffi.call/err_bad_typedef.c,
+ 	testsuite/libffi.call/float2.c,
+ 	testsuite/libffi.call/huge_struct.c,
+ 	testsuite/libffi.call/nested_struct.c,
+ 	testsuite/libffi.call/nested_struct1.c,
+ 	testsuite/libffi.call/nested_struct10.c,
+ 	testsuite/libffi.call/nested_struct2.c,
+ 	testsuite/libffi.call/nested_struct3.c,
+ 	testsuite/libffi.call/nested_struct4.c,
+ 	testsuite/libffi.call/nested_struct5.c,
+ 	testsuite/libffi.call/nested_struct6.c,
+ 	testsuite/libffi.call/nested_struct7.c,
+ 	testsuite/libffi.call/nested_struct8.c,
+ 	testsuite/libffi.call/nested_struct9.c,
+ 	testsuite/libffi.call/problem1.c,
+ 	testsuite/libffi.call/return_ldl.c,
+ 	testsuite/libffi.call/return_ll1.c,
+ 	testsuite/libffi.call/stret_large.c,
+ 	testsuite/libffi.call/stret_large2.c,
+ 	testsuite/libffi.call/stret_medium.c,
+ 	testsuite/libffi.call/stret_medium2.c,
+        testsuite/libffi.special/unwindtest.cc: use ffi_closure_alloc instead
+        of checking for MMAP.  Use intptr_t instead of long casts.
+
+2009-06-04  Andrew Haley  <aph@redhat.com>
+
+	* src/powerpc/ffitarget.h: Fix misapplied merge from gcc.
+
+2009-06-04  Andrew Haley  <aph@redhat.com>
+
+	* src/mips/o32.S,
+	src/mips/n32.S: Fix licence formatting.
+
+2009-06-04  Andrew Haley  <aph@redhat.com>
+
+	* src/x86/darwin.S: Fix licence formatting.
+	src/x86/win32.S: Likewise.
+	src/sh64/sysv.S: Likewise.
+	src/sh/sysv.S: Likewise.
+
+2009-06-04  Andrew Haley  <aph@redhat.com>
+
+	* src/sh64/ffi.c: Remove lint directives.  Was missing from merge
+	of Andreas Tobler's patch from 2006-04-22.
+	
+2009-06-04  Andrew Haley  <aph@redhat.com>
+
+	* src/sh/ffi.c: Apply missing hunk from Alexandre Oliva's patch of
+	2007-03-07.
+
+2008-12-26  Timothy Wall  <twall@users.sf.net>
+
+	* testsuite/libffi.call/cls_longdouble.c,
+        testsuite/libffi.call/cls_longdouble_va.c,
+        testsuite/libffi.call/cls_align_longdouble.c,
+        testsuite/libffi.call/cls_align_longdouble_split.c,
+        testsuite/libffi.call/cls_align_longdouble_split2.c: mark expected
+        failures on x86_64 cygwin/mingw.
+
+2008-12-22  Timothy Wall  <twall@users.sf.net>
+
+	* testsuite/libffi.call/closure_fn0.c,
+        testsuite/libffi.call/closure_fn1.c,    
+        testsuite/libffi.call/closure_fn2.c,    
+        testsuite/libffi.call/closure_fn3.c,    
+        testsuite/libffi.call/closure_fn4.c,    
+        testsuite/libffi.call/closure_fn5.c,    
+        testsuite/libffi.call/closure_fn6.c,    
+        testsuite/libffi.call/closure_loc_fn0.c,    
+        testsuite/libffi.call/closure_stdcall.c,    
+        testsuite/libffi.call/cls_align_pointer.c,    
+        testsuite/libffi.call/cls_pointer.c,    
+        testsuite/libffi.call/cls_pointer_stack.c: use portable cast from
+        pointer to integer (intptr_t).
+        * testsuite/libffi.call/cls_longdouble.c: disable for win64.
+	
+2008-12-19  Anthony Green  <green@redhat.com>
+
+	* configure.ac: Bump version to 3.0.8.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+	* libtool-version: Increment revision.
+	* README: Update for new release.
+
+2008-11-11  Anthony Green  <green@redhat.com>
+
+	* configure.ac: Bump version to 3.0.7.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+	* libtool-version: Increment revision.
+	* README: Update for new release.
+
+2008-08-25  Andreas Tobler  <a.tobler@schweiz.org>
+
+	* src/powerpc/ffitarget.h (ffi_abi): Add FFI_LINUX and
+	FFI_LINUX_SOFT_FLOAT to the POWERPC_FREEBSD enum.
+	Add note about flag bits used for FFI_SYSV_TYPE_SMALL_STRUCT.
+	Adjust copyright notice.
+	* src/powerpc/ffi.c: Add two new flags to indicate if we have one
+	register or two register to use for FFI_SYSV structs.
+	(ffi_prep_cif_machdep): Pass the right register flag introduced above.
+	(ffi_closure_helper_SYSV): Fix the return type for
+	FFI_SYSV_TYPE_SMALL_STRUCT. Comment.
+	Adjust copyright notice.
+
+2008-07-24  Anthony Green  <green@redhat.com>
+
+	* testsuite/libffi.call/cls_dbls_struct.c,
+	testsuite/libffi.call/cls_double_va.c,
+	testsuite/libffi.call/cls_longdouble.c,
+	testsuite/libffi.call/cls_longdouble_va.c,
+	testsuite/libffi.call/cls_pointer.c,
+	testsuite/libffi.call/cls_pointer_stack.c,
+	testsuite/libffi.call/err_bad_abi.c: Clean up failures from
+	compiler warnings.
+
+2008-07-17  Anthony Green  <green@redhat.com>
+
+	* configure.ac: Bump version to 3.0.6.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+	* libtool-version: Increment revision.  Add documentation.
+	* README: Update for new release.
+
+2008-07-16  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/ffi.c (ffi_prep_closure_loc): Turn INSN into an unsigned
+	int.
+
+2008-07-16  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+	* src/sh/sysv.S: Add .note.GNU-stack on Linux.
+	* src/sh64/sysv.S: Likewise.
+
+2008-04-03  Anthony Green  <green@redhat.com>
+
+	* libffi.pc.in (Libs): Add -L${libdir}.
+	* configure.ac: Bump version to 3.0.5.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+	* libtool-version: Increment revision.
+	* README: Update for new release.
+
+2008-04-03  Anthony Green  <green@redhat.com>
+	    Xerces Ranby  <xerxes@zafena.se>
+
+	* include/ffi.h.in: Wrap definition of target architecture to
+	protect from double definitions.
+
+2008-03-22  Moriyoshi Koizumi  <moriyoshi@gmail.com>
+
+	* src/x86/ffi.c (ffi_prep_closure_loc): Fix for bug revealed in
+	closure_loc_fn0.c.
+	* testsuite/libffi.call/closure_loc_fn0.c (closure_loc_test_fn0):
+	New test.
+
+2008-03-04  Anthony Green  <green@redhat.com>
+	    Blake Chaffin
+	    hos@tamanegi.org
+
+	* testsuite/libffi.call/cls_align_longdouble_split2.c
+          testsuite/libffi.call/cls_align_longdouble_split.c
+          testsuite/libffi.call/cls_dbls_struct.c
+          testsuite/libffi.call/cls_double_va.c
+          testsuite/libffi.call/cls_longdouble.c
+          testsuite/libffi.call/cls_longdouble_va.c
+          testsuite/libffi.call/cls_pointer.c
+          testsuite/libffi.call/cls_pointer_stack.c
+          testsuite/libffi.call/err_bad_abi.c
+          testsuite/libffi.call/err_bad_typedef.c
+          testsuite/libffi.call/huge_struct.c
+          testsuite/libffi.call/stret_large2.c
+          testsuite/libffi.call/stret_large.c
+          testsuite/libffi.call/stret_medium2.c
+          testsuite/libffi.call/stret_medium.c: New tests from Apple.
+
+2008-02-26  Jakub Jelinek  <jakub@redhat.com>
+            Anthony Green  <green@redhat.com>
+
+	* src/alpha/osf.S: Add .note.GNU-stack on Linux.
+	* src/s390/sysv.S: Likewise.
+	* src/powerpc/linux64.S: Likewise.
+	* src/powerpc/linux64_closure.S: Likewise.
+	* src/powerpc/ppc_closure.S: Likewise.
+	* src/powerpc/sysv.S: Likewise.
+	* src/x86/unix64.S: Likewise.
+	* src/x86/sysv.S: Likewise.
+	* src/sparc/v8.S: Likewise.
+	* src/sparc/v9.S: Likewise.
+	* src/m68k/sysv.S: Likewise.
+	* src/ia64/unix.S: Likewise.
+	* src/arm/sysv.S: Likewise.
+
+2008-02-26  Anthony Green  <green@redhat.com>
+            Thomas Heller  <theller@ctypes.org>
+
+	* src/x86/ffi.c (ffi_closure_SYSV_inner): Change C++ comment to C
+	comment.
+
+2008-02-26  Anthony Green  <green@redhat.org>
+            Thomas Heller  <theller@ctypes.org>
+
+	* include/ffi.h.in: Change void (*)() to void (*)(void).
+
+2008-02-26  Anthony Green  <green@redhat.org>
+            Thomas Heller  <theller@ctypes.org>
+
+	* src/alpha/ffi.c: Change void (*)() to void (*)(void).
+	src/alpha/osf.S, src/arm/ffi.c, src/frv/ffi.c, src/ia64/ffi.c,
+	src/ia64/unix.S, src/java_raw_api.c, src/m32r/ffi.c,
+	src/mips/ffi.c, src/pa/ffi.c, src/pa/hpux32.S, src/pa/linux.S,
+	src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/raw_api.c,
+	src/s390/ffi.c, src/sh/ffi.c, src/sh64/ffi.c, src/sparc/ffi.c,
+	src/x86/ffi.c, src/x86/unix64.S, src/x86/darwin64.S,
+	src/x86/ffi64.c: Ditto.
+
+2008-02-24  Anthony Green  <green@redhat.org>
+
+	* configure.ac: Accept openbsd*, not just openbsd.
+	Bump version to 3.0.4.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+	* libtool-version: Increment revision.
+	* README: Update for new release.
+
+2008-02-22  Anthony Green  <green@redhat.com>
+
+	* README: Clean up list of tested platforms.
+
+2008-02-22  Anthony Green  <green@redhat.com>
+
+	* configure.ac: Bump version to 3.0.3.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+	* libtool-version: Increment revision.
+	* README: Update for new release.  Clean up test docs.
+
+2008-02-22  Bjoern Koenig  <bkoenig@alpha-tierchen.de>
+	    Andreas Tobler  <a.tobler@schweiz.org>
+
+	* configure.ac: Add amd64-*-freebsd* target.
+	* configure: Regenerate.
+
+2008-02-22  Thomas Heller <theller@ctypes.org>
+
+	* configure.ac: Add x86 OpenBSD support.
+	* configure: Rebuilt.
+
+2008-02-21  Thomas Heller <theller@ctypes.org>
+
+	* README: Change "make test" to "make check".
+
+2008-02-21  Anthony Green  <green@redhat.com>
+
+	* configure.ac: Bump version to 3.0.2.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+	* libtool-version: Increment revision.
+	* README: Update for new release.
+
+2008-02-21  Björn König <bkoenig@alpha-tierchen.de>
+
+	* src/x86/freebsd.S: New file.
+	* configure.ac: Add x86 FreeBSD support.
+	* Makefile.am: Ditto.
+
+2008-02-15  Anthony Green  <green@redhat.com>
+
+	* configure.ac: Bump version to 3.0.1.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+	* libtool-version: Increment revision.
+	* README: Update for new release.
+
+2008-02-15  David Daney	 <ddaney@avtrex.com>
+
+	* src/mips/ffi.c: Remove extra '>' from include directive.
+	(ffi_prep_closure_loc): Use clear_location instead of tramp.
+
+2008-02-15  Anthony Green  <green@redhat.com>
+
+	* configure.ac: Bump version to 3.0.0.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+
+2008-02-15  David Daney	 <ddaney@avtrex.com>
+
+	* src/mips/ffi.c (USE__BUILTIN___CLEAR_CACHE):
+	Define (conditionally), and use it to include cachectl.h.
+	(ffi_prep_closure_loc): Fix cache flushing.
+	* src/mips/ffitarget.h (_ABIN32, _ABI64, _ABIO32): Define.
+
+2008-02-15  Anthony Green  <green@redhat.com>
+
+        * man/ffi_call.3, man/ffi_prep_cif.3, man/ffi.3:
+	Update dates and remove all references to ffi_prep_closure.
+	* configure.ac: Bump version to 2.99.9.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+
+2008-02-15  Anthony Green  <green@redhat.com>
+
+	* man/ffi_prep_closure.3: Delete.
+	* man/Makefile.am (EXTRA_DIST): Remove ffi_prep_closure.3.
+	(man_MANS): Ditto.
+	* man/Makefile.in: Rebuilt.
+	* configure.ac: Bump version to 2.99.8.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+
+2008-02-14  Anthony Green  <green@redhat.com>
+
+	* configure.ac: Bump version to 2.99.7.
+	* configure, doc/stamp-vti, doc/version.texi: Rebuilt.
+	* include/ffi.h.in LICENSE src/debug.c src/closures.c
+          src/ffitest.c src/s390/sysv.S src/s390/ffitarget.h
+          src/types.c src/m68k/ffitarget.h src/raw_api.c src/frv/ffi.c
+          src/frv/ffitarget.h src/sh/ffi.c src/sh/sysv.S
+          src/sh/ffitarget.h src/powerpc/ffitarget.h src/pa/ffi.c
+          src/pa/ffitarget.h src/pa/linux.S src/java_raw_api.c
+          src/cris/ffitarget.h src/x86/ffi.c src/x86/sysv.S
+          src/x86/unix64.S src/x86/win32.S src/x86/ffitarget.h
+          src/x86/ffi64.c src/x86/darwin.S src/ia64/ffi.c
+          src/ia64/ffitarget.h src/ia64/ia64_flags.h src/ia64/unix.S
+          src/sparc/ffi.c src/sparc/v9.S src/sparc/ffitarget.h
+          src/sparc/v8.S src/alpha/ffi.c src/alpha/ffitarget.h
+          src/alpha/osf.S src/sh64/ffi.c src/sh64/sysv.S
+          src/sh64/ffitarget.h src/mips/ffi.c src/mips/ffitarget.h
+          src/mips/n32.S src/mips/o32.S src/arm/ffi.c src/arm/sysv.S
+          src/arm/ffitarget.h src/prep_cif.c: Update license text.
+
+2008-02-14  Anthony Green  <green@redhat.com>
+
+	* README: Update tested platforms.
+	* configure.ac: Bump version to 2.99.6.
+	* configure: Rebuilt.
+
+2008-02-14  Anthony Green  <green@redhat.com>
+
+	* configure.ac: Bump version to 2.99.5.
+	* configure: Rebuilt.
+	* Makefile.am (EXTRA_DIST): Add darwin64.S
+	* Makefile.in: Rebuilt.
+	* testsuite/lib/libffi-dg.exp: Remove libstdc++ bits from GCC tree.
+	* LICENSE: Update WARRANTY.
+
+2008-02-14  Anthony Green  <green@redhat.com>
+
+	* libffi.pc.in (libdir): Fix libdir definition.
+	* configure.ac: Bump version to 2.99.4.
+	* configure: Rebuilt.
+
+2008-02-14  Anthony Green  <green@redhat.com>
+
+	* README: Update.
+	* libffi.info: New file.
+	* doc/stamp-vti: New file.
+	* configure.ac: Bump version to 2.99.3.
+	* configure: Rebuilt.
+
+2008-02-14  Anthony Green  <green@redhat.com>
+
+	* Makefile.am (SUBDIRS): Add man dir.
+	* Makefile.in: Rebuilt.
+	* configure.ac: Create Makefile.
+	* configure: Rebuilt.
+        * man/ffi_call.3 man/ffi_prep_cif.3 man/ffi_prep_closure.3
+          man/Makefile.am man/Makefile.in: New files.
+
+2008-02-14  Tom Tromey  <tromey@redhat.com>
+
+	* aclocal.m4, Makefile.in, configure, fficonfig.h.in: Rebuilt.
+	* mdate-sh, texinfo.tex: New files.
+	* Makefile.am (info_TEXINFOS): New variable.
+	* doc/libffi.texi: New file.
+	* doc/version.texi: Likewise.
+
+2008-02-14  Anthony Green  <green@redhat.com>
+
+	* Makefile.am (AM_CFLAGS): Don't compile with -D$(TARGET).
+	(lib_LTLIBRARIES): Define.
+	(toolexeclib_LIBRARIES): Undefine.
+	* Makefile.in: Rebuilt.
+	* configure.ac: Reset version to 2.99.1.
+	* configure.in: Rebuilt.
+
+2008-02-14  Anthony Green  <green@redhat.com>
+
+	* libffi.pc.in: Use @PACKAGE_NAME@ and @PACKAGE_VERSION@.
+	* configure.ac: Reset version to 2.99.1.
+	* configure.in: Rebuilt.
+	* Makefile.am (EXTRA_DIST): Add ChangeLog.libffi.
+	* Makefile.in: Rebuilt.
+	* LICENSE: Update copyright notice.
+
+2008-02-14  Anthony Green  <green@redhat.com>
+
+	* include/Makefile.am (nodist_includes_HEADERS): Define.  Don't
+	distribute ffitarget.h or ffi.h from the build include dir.
+	* Makefile.in: Rebuilt.
+
+2008-02-14  Anthony Green  <green@redhat.com>
+
+	* include/Makefile.am (includesdir): Install headers under libdir.
+	(pkgconfigdir): Define. Install libffi.pc.
+	* include/Makefile.in: Rebuilt.
+	* libffi.pc.in: Create.
+	* libtool-version: Increment CURRENT
+	* configure.ac: Add libffi.pc.in
+	* configure: Rebuilt.
+
+2008-02-03  Anthony Green  <green@redhat.com>
+
+	* include/Makefile.am (includesdir): Fix header install with
+	DESTDIR.
+	* include/Makefile.in: Rebuilt.
+
+2008-02-03  Timothy Wall  <twall@users.sf.net>
+
+	* src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL): Calculate jump return
+          offset based on code pointer, not data pointer.
+
+2008-02-01  Anthony Green  <green@redhat.com>
+
+	* include/Makefile.am: Fix header installs.
+	* Makefile.am: Ditto.
+	* include/Makefile.in: Rebuilt.
+	* Makefile.in: Ditto.
+
+2008-02-01  Anthony Green  <green@redhat.com>
+
+	* src/x86/ffi.c (FFI_INIT_TRAMPOLINE_STDCALL,
+	FFI_INIT_TRAMPOLINE): Revert my broken changes to twall's last
+	patch.
+
+2008-01-31  Anthony Green  <green@redhat.com>
+
+	* Makefile.am (EXTRA_DIST): Add missing files.
+	* testsuite/Makefile.am: Ditto.
+	* Makefile.in, testsuite/Makefile.in: Rebuilt.
+
+2008-01-31  Timothy Wall <twall@users.sf.net>
+
+	* testsuite/libffi.call/closure_stdcall.c: Add test for stdcall
+	closures.
+	* src/x86/ffitarget.h: Increase size of trampoline for stdcall
+	closures.
+	* src/x86/win32.S: Add assembly for stdcall closure.
+	* src/x86/ffi.c: Initialize stdcall closure trampoline.
+
+2008-01-30  H.J. Lu <hongjiu.lu@intel.com>
+
+	PR libffi/34612
+	* src/x86/sysv.S (ffi_closure_SYSV): Pop 4 byte from stack when
+	returning struct.
+
+	* testsuite/libffi.call/call.exp: Add "-O2 -fomit-frame-pointer"
+	tests.
+
+2008-01-30  Anthony Green  <green@redhat.com>
+
+	* Makefile.am, include/Makefile.am: Move headers to
+	libffi_la_SOURCES for new automake.
+	* Makefile.in, include/Makefile.in: Rebuilt.
+	
+	* testsuite/lib/wrapper.exp: Copied from gcc tree to allow for 
+	execution outside of gcc tree.
+	* testsuite/lib/target-libpath.exp: Ditto.
+
+	* testsuite/lib/libffi-dg.exp: Many changes to allow for execution
+	outside of gcc tree.
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libgcj b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libgcj
new file mode 100644
index 0000000..ea5d02f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.libgcj
@@ -0,0 +1,40 @@
+2004-01-14  Kelley Cook  <kcook@gcc.gnu.org>
+
+	* configure.in: Add in AC_PREREQ(2.13)
+
+2003-02-20  Alexandre Oliva  <aoliva@redhat.com>
+
+	* configure.in: Propagate ORIGINAL_LD_FOR_MULTILIBS to
+	config.status.
+	* configure: Rebuilt.
+
+2002-01-27  Alexandre Oliva  <aoliva@redhat.com>
+
+	* configure.in (toolexecdir, toolexeclibdir): Set and AC_SUBST.
+	Remove USE_LIBDIR conditional.
+	* Makefile.am (toolexecdir, toolexeclibdir): Don't override.
+	* Makefile.in, configure: Rebuilt.
+
+Mon Aug  9 18:33:38 1999  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
+
+	* include/Makefile.in: Rebuilt.
+	* Makefile.in: Rebuilt
+	* Makefile.am (toolexeclibdir): Add $(MULTISUBDIR) even for native
+	builds.
+	Use USE_LIBDIR.
+
+	* configure: Rebuilt.
+	* configure.in (USE_LIBDIR): Define for native builds.
+	Use lowercase in configure --help explanations.
+
+1999-08-08  Anthony Green  <green@cygnus.com>
+
+	* include/ffi.h.in (FFI_FN): Remove `...'.
+
+1999-08-08  Anthony Green  <green@cygnus.com>
+
+	* Makefile.in: Rebuilt.
+	* Makefile.am (AM_CFLAGS): Compile with -fexceptions.
+
+	* src/x86/sysv.S: Add exception handling metadata.
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.v1 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.v1
new file mode 100644
index 0000000..369820c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ChangeLog.v1
@@ -0,0 +1,764 @@
+The libffi version 1 ChangeLog archive.
+
+Version 1 of libffi had per-directory ChangeLogs.  Current and future
+versions have a single ChangeLog file in the root directory.  The
+version 1 ChangeLogs have all been concatonated into this file for
+future reference only.
+
+--- libffi ----------------------------------------------------------------
+
+Mon Oct  5 02:17:50 1998  Anthony Green  <green@cygnus.com>
+
+	* configure.in: Boosted rev.
+	* configure, Makefile.in, aclocal.m4: Rebuilt.
+	* README: Boosted rev and updated release notes.
+
+Mon Oct  5 01:03:03 1998  Anthony Green  <green@cygnus.com>
+
+	* configure.in: Boosted rev.
+	* configure, Makefile.in, aclocal.m4: Rebuilt.
+	* README: Boosted rev and updated release notes.
+
+1998-07-25  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* m68k/ffi.c (ffi_prep_cif_machdep): Use bitmask for cif->flags.
+	Correctly handle small structures.
+	(ffi_prep_args): Also handle small structures.
+	(ffi_call): Pass size of return type to ffi_call_SYSV.
+	* m68k/sysv.S: Adjust for above changes.  Correctly align small
+	structures in the return value.
+
+	* types.c (uint64, sint64) [M68K]: Change alignment to 4.
+
+Fri Apr 17 17:26:58 1998  Anthony Green  <green@hoser.cygnus.com>
+
+	* configure.in: Boosted rev.
+	* configure,Makefile.in,aclocal.m4: Rebuilt.
+	* README: Boosted rev and added release notes.
+
+Sun Feb 22 00:50:41 1998  Geoff Keating  <geoffk@ozemail.com.au>
+
+	* configure.in: Add PowerPC config bits.
+
+1998-02-14  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* configure.in: Add m68k config bits.  Change AC_CANONICAL_SYSTEM
+	to AC_CANONICAL_HOST, this is not a compiler.  Use $host instead
+	of $target.  Remove AC_CHECK_SIZEOF(char), we already know the
+	result.  Fix argument of AC_ARG_ENABLE.
+	* configure, fficonfig.h.in: Rebuilt.
+
+Tue Feb 10 20:53:40 1998  Richard Henderson  <rth@cygnus.com>
+
+	* configure.in: Add Alpha config bits.
+
+Tue May 13 13:39:20 1997  Anthony Green  <green@hoser.cygnus.com>
+
+	* README: Updated dates and reworded Irix comments.
+
+	* configure.in: Removed AC_PROG_RANLIB.
+
+	* Makefile.in, aclocal.m4, config.guess, config.sub, configure,
+	ltmain.sh, */Makefile.in: libtoolized again and	rebuilt with 
+	automake and autoconf.
+	
+Sat May 10 18:44:50 1997  Tom Tromey  <tromey@cygnus.com>
+
+	* configure, aclocal.m4: Rebuilt.
+	* configure.in: Don't compute EXTRADIST; now handled in
+	src/Makefile.in.  Removed macros implied by AM_INIT_AUTOMAKE.
+	Don't run AM_MAINTAINER_MODE.
+
+Thu May  8 14:34:05 1997  Anthony Green  <green@hoser.cygnus.com>
+
+	* missing, ltmain.sh, ltconfig.sh: Created. These are new files
+	required by automake and libtool.
+
+	* README: Boosted rev to 1.14. Added notes.
+
+	* acconfig.h: Moved PACKAGE and VERSION for new automake.
+	
+	* configure.in: Changes for libtool.
+	
+	* Makefile.am (check): make test now make check. Uses libtool now.
+
+	* Makefile.in, configure.in, aclocal.h, fficonfig.h.in: Rebuilt.
+
+Thu May  1 16:27:07 1997  Anthony Green  <green@hoser.cygnus.com>
+
+	* missing: Added file required by new automake.
+
+Tue Nov 26 14:10:42 1996  Anthony Green  <green@csk3.cygnus.com>
+
+	* acconfig.h: Added USING_PURIFY flag. This is defined when
+	--enable-purify-safety was used at configure time.
+
+	* configure.in (allsources): Added --enable-purify-safety switch.
+	(VERSION): Boosted rev to 1.13.
+	* configure: Rebuilt.
+
+Fri Nov 22 06:46:12 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* configure.in (VERSION): Boosted rev to 1.12.
+	Removed special CFLAGS hack for gcc.
+	* configure: Rebuilt.
+
+	* README: Boosted rev to 1.12. Added notes.
+
+	* Many files: Cygnus Support changed to Cygnus Solutions.
+
+Wed Oct 30 11:15:25 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* configure.in (VERSION): Boosted rev to 1.11.
+	* configure: Rebuilt.
+
+	* README: Boosted rev to 1.11. Added notes about GNU make.
+
+Tue Oct 29 12:25:12 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* configure.in: Fixed -Wall trick.
+	(VERSION): Boosted rev.
+	* configure: Rebuilt
+
+	* acconfig.h: Needed for --enable-debug configure switch.
+
+	* README: Boosted rev to 1.09. Added more notes on building
+	libffi, and LCLint.
+
+	* configure.in: Added --enable-debug switch. Boosted rev to
+	1.09.
+	* configure: Rebuilt
+
+Tue Oct 15 13:11:28 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* configure.in (VERSION): Boosted rev to 1.08
+	* configure: Rebuilt.
+
+	* README: Added n32 bug fix notes.
+
+	* Makefile.am: Added "make lint" production. 
+	* Makefile.in: Rebuilt.
+
+Mon Oct 14 10:54:46 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* README: Added web page reference.
+
+	* configure.in, README: Boosted rev to 1.05
+	* configure: Rebuilt.
+
+	* README: Fixed n32 sample code.
+
+Fri Oct 11 17:09:28 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* README: Added sparc notes.
+
+	* configure.in, README: Boosted rev to 1.04.
+	* configure: Rebuilt.
+
+Thu Oct 10 10:31:03 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* configure.in, README: Boosted rev to 1.03.
+	* configure: Rebuilt.
+
+	* README: Added struct notes. 
+
+	* Makefile.am (EXTRA_DIST): Added LICENSE to distribution.
+	* Makefile.in: Rebuilt.
+
+	* README: Removed Linux section. No special notes now
+	because aggregates arg/return types work.
+
+Wed Oct  9 16:16:42 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* README, configure.in (VERSION): Boosted rev to 1.02
+	* configure: Rebuilt.
+
+Tue Oct  8 11:56:33 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* README (NOTE): Added n32 notes.
+
+	* Makefile.am: Added test production.
+	* Makefile: Rebuilt
+
+	* README: spell checked!
+
+	* configure.in (VERSION): Boosted rev to 1.01
+	* configure: Rebuilt.
+
+Mon Oct  7 15:50:22 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* configure.in: Added nasty bit to support SGI tools.
+	* configure: Rebuilt.
+	
+	* README: Added SGI notes. Added note about automake bug.
+
+Mon Oct  7 11:00:28 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* README: Rewrote intro, and fixed examples.
+
+Fri Oct  4 10:19:55 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* configure.in: -D$TARGET is no longer used as a compiler switch.
+	It is now inserted into ffi.h at configure time.
+	* configure: Rebuilt.
+
+	* FFI_ABI and FFI_STATUS are now ffi_abi and ffi_status.
+
+Thu Oct  3 13:47:34 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* README, LICENSE: Created. Wrote some docs.
+
+	* configure.in: Don't barf on i586-unknown-linuxaout.
+	Added EXTRADIST code for "make dist".
+	* configure: Rebuilt.
+
+	* */Makefile.in: Rebuilt with patched automake. 
+
+Tue Oct  1 17:12:25 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* Makefile.am, aclocal.m4, config.guess, config.sub,
+	configure.in, fficonfig.h.in, install-sh, mkinstalldirs, 
+	stamp-h.in: Created
+	* Makefile.in, configure: Generated
+
+--- libffi/include --------------------------------------------------------
+
+Tue Feb 24 13:09:36 1998  Anthony Green  <green@gerbil.cygnus.com>
+
+	* ffi_mips.h: Updated FFI_TYPE_STRUCT_* values based on
+	ffi.h.in changes.  This is a work-around for SGI's "simple"
+	assembler.
+
+Sun Feb 22 00:51:55 1998  Geoff Keating  <geoffk@ozemail.com.au>
+
+	* ffi.h.in: PowerPC support.
+
+1998-02-14  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* ffi.h.in: Add m68k support.
+	(FFI_TYPE_LONGDOUBLE): Make it a separate value.
+
+Tue Feb 10 20:55:16 1998  Richard Henderson  <rth@cygnus.com>
+
+	* ffi.h.in (SIZEOF_ARG): Use a pointer type by default.
+
+	* ffi.h.in: Alpha support.
+
+Fri Nov 22 06:48:45 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.h.in, ffi_common.h: Cygnus Support -> Cygnus Solutions.
+
+Wed Nov 20 22:31:01 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.h.in: Added ffi_type_void definition.
+
+Tue Oct 29 12:22:40 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* Makefile.am (hack_DATA): Always install ffi_mips.h.
+
+	* ffi.h.in: Removed FFI_DEBUG. It's now in the correct
+	place (acconfig.h).
+	Added #include <stddef.h> for size_t definition.
+
+Tue Oct 15 17:23:35 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.h.in, ffi_common.h, ffi_mips.h: More clean up.
+	Commented out #define of FFI_DEBUG.
+
+Tue Oct 15 13:01:06 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi_common.h: Added bool definition.
+
+	* ffi.h.in, ffi_common.h: Clean up based on LCLint output.
+	Added funny /*@...@*/ comments to annotate source.
+
+Mon Oct 14 12:29:23 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.h.in: Interface changes based on feedback from Jim
+	Blandy.
+
+Fri Oct 11 16:49:35 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.h.in: Small change for sparc support.
+
+Thu Oct 10 14:53:37 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi_mips.h: Added FFI_TYPE_STRUCT_* definitions for 
+	special structure return types.
+
+Wed Oct  9 13:55:57 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.h.in: Added SIZEOF_ARG definition for X86
+
+Tue Oct  8 11:40:36 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.h.in (FFI_FN): Added macro for eliminating compiler warnings.
+	Use it to case your function pointers to the proper type.
+
+	* ffi_mips.h (SIZEOF_ARG): Added magic to fix type promotion bug.
+
+	* Makefile.am (EXTRA_DIST): Added ffi_mips.h to EXTRA_DIST.
+	* Makefile: Rebuilt.
+
+	* ffi_mips.h: Created. Moved all common mips definitions here.
+
+Mon Oct  7 10:58:12 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.h.in: The SGI assember is very picky about parens. Redefined
+ 	some macros to avoid problems.
+
+	* ffi.h.in: Added FFI_DEFAULT_ABI definitions. Also added
+	externs for pointer, and 64bit integral ffi_types.
+
+Fri Oct  4 09:51:37 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.h.in: Added FFI_ABI member to ffi_cif and changed
+	function prototypes accordingly.
+	Added #define @TARGET@. Now programs including ffi.h don't 
+	have to specify this themselves.
+
+Thu Oct  3 15:36:44 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.h.in: Changed ffi_prep_cif's values from void* to void**
+
+	* Makefile.am (EXTRA_DIST): Added EXTRA_DIST for "make dist"
+	to work.
+	* Makefile.in: Regenerated.
+
+Wed Oct  2 10:16:59 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* Makefile.am: Created
+	* Makefile.in: Generated
+
+	* ffi_common.h: Added rcsid comment
+
+Tue Oct  1 17:13:51 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.h.in, ffi_common.h: Created
+
+--- libffi/src ------------------------------------------------------------
+
+Mon Oct  5 02:17:50 1998  Anthony Green  <green@cygnus.com>
+
+	* arm/ffi.c, arm/sysv.S: Created.
+
+	* Makefile.am: Added arm files.
+	* Makefile.in: Rebuilt.
+
+Mon Oct  5 01:41:38 1998  Anthony Green  <green@rtl.cygnus.com>
+
+	* Makefile.am (libffi_la_LDFLAGS): Incremented revision.
+
+Sun Oct  4 16:27:17 1998  Anthony Green  <green@cygnus.com>
+
+	* alpha/osf.S (ffi_call_osf): Patch for DU assembler.
+
+	* ffitest.c (main): long long and long double return values work
+	for x86.
+
+Fri Apr 17 11:50:58 1998  Anthony Green  <green@hoser.cygnus.com>
+
+	* Makefile.in: Rebuilt.
+
+	* ffitest.c (main): Floating point tests not executed for systems
+ 	with broken lond double (SunOS 4 w/ GCC).
+
+	* types.c: Fixed x86 alignment info for long long types.
+
+Thu Apr 16 07:15:28 1998  Anthony Green  <green@ada.cygnus.com>
+
+	* ffitest.c: Added more notes about GCC bugs under Irix 6.
+
+Wed Apr 15 08:42:22 1998  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffitest.c (struct5): New test function.
+	(main): New test with struct5.
+
+Thu Mar  5 10:48:11 1998  Anthony Green  <green@tootie.to.cygnus.com>
+
+	* prep_cif.c (initialize_aggregate): Fix assertion for
+	nested structures.
+
+Tue Feb 24 16:33:41 1998  Anthony Green  <green@hoser.cygnus.com>
+
+	* prep_cif.c (ffi_prep_cif): Added long double support for sparc.
+
+Sun Feb 22 00:52:18 1998  Geoff Keating  <geoffk@ozemail.com.au>
+
+	* powerpc/asm.h: New file.
+	* powerpc/ffi.c: New file.
+	* powerpc/sysv.S: New file.
+	* Makefile.am: PowerPC port.
+	* ffitest.c (main): Allow all tests to run even in presence of gcc
+ 	bug on PowerPC.
+
+1998-02-17  Anthony Green  <green@hoser.cygnus.com>
+
+	* mips/ffi.c: Fixed comment typo.
+
+	* x86/ffi.c (ffi_prep_cif_machdep), x86/sysv.S (retfloat): 
+	Fixed x86 long double return handling.
+
+	* types.c: Fixed x86 long double alignment info.
+
+1998-02-14  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* types.c: Add m68k support.
+
+	* ffitest.c (floating): Add long double parameter.
+	(return_ll, ldblit): New functions to test long long and long
+	double return value.
+	(main): Fix type error in assignment of ts[1-4]_type.elements.
+	Add tests for long long and long double arguments and return
+	values.
+
+	* prep_cif.c (ffi_prep_cif) [M68K]: Don't allocate argument for
+	struct value pointer.
+
+	* m68k/ffi.c, m68k/sysv.S: New files.
+	* Makefile.am: Add bits for m68k port.  Add kludge to work around
+	automake deficiency.
+	(test): Don't require "." in $PATH.
+	* Makefile.in: Rebuilt.
+
+Wed Feb 11 07:36:50 1998  Anthony Green  <green@hoser.cygnus.com>
+
+	* Makefile.in: Rebuilt.
+
+Tue Feb 10 20:56:00 1998  Richard Henderson  <rth@cygnus.com>
+
+	* alpha/ffi.c, alpha/osf.S: New files.
+	* Makefile.am: Alpha port.
+
+Tue Nov 18 14:12:07 1997  Anthony Green  <green@hoser.cygnus.com>
+
+	* mips/ffi.c (ffi_prep_cif_machdep): Initialize rstruct_flag
+	for n32.
+
+Tue Jun  3 17:18:20 1997  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffitest.c (main): Added hack to get structure tests working
+	correctly.
+
+Sat May 10 19:06:42 1997  Tom Tromey  <tromey@cygnus.com>
+
+	* Makefile.in: Rebuilt.
+	* Makefile.am (EXTRA_DIST): Explicitly list all distributable
+	files in subdirs.
+	(VERSION, CC): Removed.
+
+Thu May  8 17:19:01 1997  Anthony Green  <green@hoser.cygnus.com>
+
+	* Makefile.am: Many changes for new automake and libtool.
+	* Makefile.in: Rebuilt.
+
+Fri Nov 22 06:57:56 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffitest.c (main): Fixed test case for non mips machines.
+
+Wed Nov 20 22:31:59 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* types.c: Added ffi_type_void declaration.
+
+Tue Oct 29 13:07:19 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffitest.c (main): Fixed character constants.
+	(main): Emit warning for structure test 3 failure on Sun.
+
+	* Makefile.am (VPATH): Fixed VPATH def'n so automake won't
+	strip it out. 
+	Moved distdir hack from libffi to automake. 
+	(ffitest): Added missing -c for $(COMPILE) (change in automake).
+	* Makefile.in: Rebuilt.
+	
+Tue Oct 15 13:08:20 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* Makefile.am: Added "make lint" production. 
+	* Makefile.in: Rebuilt.
+
+	* prep_cif.c (STACK_ARG_SIZE): Improved STACK_ARG_SIZE macro.
+  	Clean up based on LCLint output. Added funny /*@...@*/ comments to
+ 	annotate source.
+
+	* ffitest.c, debug.c: Cleaned up code.
+
+Mon Oct 14 12:26:56 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffitest.c: Changes based on interface changes.
+
+	* prep_cif.c (ffi_prep_cif): Cleaned up interface based on
+	feedback from Jim Blandy.
+
+Fri Oct 11 15:53:18 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffitest.c: Reordered tests while porting to sparc.
+	Made changes to handle lame structure passing for sparc.
+	Removed calls to fflush().
+
+	* prep_cif.c (ffi_prep_cif): Added special case for sparc
+	aggregate type arguments.
+
+Thu Oct 10 09:56:51 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffitest.c (main): Added structure passing/returning tests.
+
+	* prep_cif.c (ffi_prep_cif): Perform proper initialization
+	of structure return types if needed.
+	(initialize_aggregate): Bug fix
+
+Wed Oct  9 16:04:20 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* types.c: Added special definitions for x86 (double doesn't
+	need double word alignment).
+
+	* ffitest.c: Added many tests
+
+Tue Oct  8 09:19:22 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* prep_cif.c (ffi_prep_cif): Fixed assertion.
+
+	* debug.c (ffi_assert): Must return a non void now.
+
+	* Makefile.am: Added test production.
+	* Makefile: Rebuilt.
+
+	* ffitest.c (main): Created. 
+
+	* types.c: Created. Stripped common code out of */ffi.c.
+
+	* prep_cif.c: Added missing stdlib.h include.
+
+	* debug.c (ffi_type_test): Used "a" to eliminate compiler
+	warnings in non-debug builds. Included ffi_common.h.
+
+Mon Oct  7 15:36:42 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* Makefile.am: Added a rule for .s -> .o
+	This is required by the SGI compiler.
+	* Makefile: Rebuilt.
+
+Fri Oct  4 09:51:08 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* prep_cif.c (initialize_aggregate): Moved abi specification
+	to ffi_prep_cif().
+
+Thu Oct  3 15:37:37 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* prep_cif.c (ffi_prep_cif): Changed values from void* to void**.
+	(initialize_aggregate): Fixed aggregate type initialization.
+
+	* Makefile.am (EXTRA_DIST): Added support code for "make dist".
+	* Makefile.in: Regenerated.
+
+Wed Oct  2 11:41:57 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* debug.c, prep_cif: Created.
+
+	* Makefile.am: Added debug.o and prep_cif.o to OBJ.
+	* Makefile.in: Regenerated.
+
+	* Makefile.am (INCLUDES): Added missing -I../include
+	* Makefile.in: Regenerated.
+
+Tue Oct  1 17:11:51 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* error.c, Makefile.am: Created.
+	* Makefile.in: Generated.
+
+--- libffi/src/x86 --------------------------------------------------------
+
+Sun Oct  4 16:27:17 1998  Anthony Green  <green@cygnus.com>
+
+	* sysv.S (retlongdouble): Fixed long long return value support.
+	* ffi.c (ffi_prep_cif_machdep): Ditto.
+
+Wed May 13 04:30:33 1998  Anthony Green  <green@raft.ppp.tsoft.net>
+
+	* ffi.c (ffi_prep_cif_machdep): Fixed long double return value
+	support.
+
+Wed Apr 15 08:43:20 1998  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.c (ffi_prep_args): small struct support was missing.
+
+Thu May  8 16:53:58 1997  Anthony Green  <green@hoser.cygnus.com>
+
+	* objects.mak: Removed.
+
+Mon Dec  2 15:12:58 1996  Tom Tromey  <tromey@cygnus.com>
+
+	* sysv.S: Use .balign, for a.out Linux boxes.
+
+Tue Oct 15 13:06:50 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.c: Clean up based on LCLint output.
+	Added funny /*@...@*/ comments to annotate source.
+
+Fri Oct 11 16:43:38 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.c (ffi_call): Added assertion for bad ABIs.
+
+Wed Oct  9 13:57:27 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* sysv.S (retdouble): Fixed double return problems.
+
+	* ffi.c	(ffi_call): Corrected fn arg definition.
+	(ffi_prep_cif_machdep): Fixed double return problems
+
+Tue Oct  8 12:12:49 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.c: Moved ffi_type definitions to types.c.
+	(ffi_prep_args): Fixed type promotion bug.
+
+Mon Oct  7 15:53:06 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.c (FFI_*_TYPEDEF): Removed redundant ';'
+
+Fri Oct  4 09:54:53 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.c (ffi_call): Removed FFI_ABI arg, and swapped
+	remaining args.
+
+Wed Oct  2 10:07:05 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.c, sysv.S, objects.mak: Created.
+	(ffi_prep_cif): cif->rvalue no longer initialized to NULL.
+	(ffi_prep_cif_machdep): Moved machine independent cif processing
+	to src/prep_cif.c. Introduced ffi_prep_cif_machdep().
+
+--- libffi/src/mips -------------------------------------------------------
+
+Tue Feb 17 17:18:07 1998  Anthony Green  <green@hoser.cygnus.com>
+
+	* o32.S: Fixed typo in comment.
+
+	* ffi.c (ffi_prep_cif_machdep): Fixed argument processing.
+
+Thu May  8 16:53:58 1997  Anthony Green  <green@hoser.cygnus.com>
+
+	* o32.s, n32.s: Wrappers for SGI tool support.
+
+	* objects.mak: Removed.
+
+Tue Oct 29 14:37:45 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.c (ffi_prep_args): Changed int z to size_t z.
+
+Tue Oct 15 13:17:25 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* n32.S: Fixed bad stack munging. 
+
+	* ffi.c: Moved prototypes for ffi_call_?32() to here from
+	ffi_mips.h because extended_cif is not defined in ffi_mips.h.
+
+Mon Oct 14 12:42:02 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.c: Interface changes based on feedback from Jim Blandy.
+
+Thu Oct 10 11:22:16 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* n32.S, ffi.c: Lots of changes to support passing and 
+	returning structures with the n32 calling convention.
+
+	* n32.S: Fixed fn pointer bug.
+
+	* ffi.c (ffi_prep_cif_machdep): Fix for o32 structure
+	return values.
+	(ffi_prep_args): Fixed n32 structure passing when structures
+	partially fit in registers.
+
+Wed Oct  9 13:49:25 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* objects.mak: Added n32.o.
+
+	* n32.S: Created.
+
+	* ffi.c (ffi_prep_args): Added magic to support proper
+	n32 processing.
+
+Tue Oct  8 10:37:35 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.c: Moved ffi_type definitions to types.c.
+	(ffi_prep_args): Fixed type promotion bug.
+
+	* o32.S: This code is only built for o32 compiles.
+	A lot of the #define cruft has moved to ffi_mips.h.
+
+	* ffi.c (ffi_prep_cif_machdep): Fixed arg flags. Second arg
+	is only processed if the first is either a float or double.
+
+Mon Oct  7 15:33:59 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* o32.S: Modified to compile under each of o32, n32 and n64.
+
+	* ffi.c (FFI_*_TYPEDEF): Removed redundant ';'
+
+Fri Oct  4 09:53:25 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.c (ffi_call): Removed FFI_ABI arg, and swapped
+	remaining args.
+
+Wed Oct  2 17:41:22 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* o32.S: Removed crufty definitions.
+
+Wed Oct  2 12:53:42 1996  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.c (ffi_prep_cif): cif->rvalue no longer initialized to NULL.
+	(ffi_prep_cif_machdep): Moved all machine independent cif processing
+	to src/prep_cif.c. Introduced ffi_prep_cif_machdep. Return types
+	of FFI_TYPE_STRUCT are no different than FFI_TYPE_INT.
+
+Tue Oct  1 17:11:02 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.c, o32.S, object.mak: Created
+	
+--- libffi/src/sparc ------------------------------------------------------
+
+Tue Feb 24 16:33:18 1998  Anthony Green  <green@hoser.cygnus.com>
+
+	* ffi.c (ffi_prep_args): Added long double support.
+
+Thu May  8 16:53:58 1997  Anthony Green  <green@hoser.cygnus.com>
+
+	* objects.mak: Removed.
+
+Thu May  1 16:07:56 1997  Anthony Green  <green@hoser.cygnus.com>
+
+	* v8.S: Fixed minor portability problem reported by 
+	Russ McManus <mcmanr@eq.gs.com>.
+
+Tue Nov 26 14:12:43 1996  Anthony Green  <green@csk3.cygnus.com>
+
+	* v8.S: Used STACKFRAME define elsewhere. 
+
+	* ffi.c (ffi_prep_args): Zero out space when USING_PURIFY
+	is set.
+	(ffi_prep_cif_machdep): Allocate the correct stack frame 
+	space for functions with < 6 args.
+
+Tue Oct 29 15:08:55 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.c (ffi_prep_args): int z is now size_t z.
+
+Mon Oct 14 13:31:24 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* v8.S (ffi_call_V8): Gordon rewrites this again. It looks
+	great now.
+
+	* ffi.c (ffi_call): The comment about hijacked registers
+	is no longer valid after gordoni hacked v8.S.
+
+        * v8.S (ffi_call_V8): Rewrote with gordoni. Much simpler.
+	
+	* v8.S, ffi.c: ffi_call() had changed to accept more than
+	two args, so v8.S had to change (because it hijacks incoming
+	arg registers).
+
+	* ffi.c: Interface changes based on feedback from Jim Blandy.
+
+Thu Oct 10 17:48:16 1996  Anthony Green  <green@rtl.cygnus.com>
+
+	* ffi.c, v8.S, objects.mak: Created.
+	
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/LICENSE b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/LICENSE
new file mode 100644
index 0000000..7d12666
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/LICENSE
@@ -0,0 +1,21 @@
+libffi - Copyright (c) 1996-2011  Anthony Green, Red Hat, Inc and others.
+See source files for details.
+
+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/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.am b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.am
new file mode 100644
index 0000000..86119d8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.am
@@ -0,0 +1,196 @@
+## Process this with automake to create Makefile.in
+
+AUTOMAKE_OPTIONS = foreign subdir-objects
+
+SUBDIRS = include testsuite man
+
+EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host	\
+	src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h		\
+	src/arm/ffi.c src/arm/sysv.S src/arm/trampoline.S		\
+	src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S		\
+	src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S		\
+	src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h	\
+	src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c		\
+	src/mips/n32.S src/mips/o32.S src/mips/ffitarget.h		\
+	src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h		\
+	src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h		\
+	src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/linux64.S	\
+	src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S		\
+	src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S	\
+	src/powerpc/aix_closure.S src/powerpc/darwin_closure.S		\
+	src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h		\
+	src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h		\
+	src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c	\
+	src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S		\
+	src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c		\
+	src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S			\
+	src/x86/win32.S src/x86/win64.S src/x86/darwin.S		\
+	src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S		\
+	src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c		\
+	src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/frv/eabi.S	\
+	src/frv/ffitarget.h src/dlmalloc.c src/moxie/ffi.c		\
+	src/moxie/eabi.S libtool-version ChangeLog.libffi		\
+	m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4	\
+	m4/ltversion.m4 build-ios.sh src/arm/gentramp.sh src/debug.c    \
+	msvcc.sh
+
+
+info_TEXINFOS = doc/libffi.texi
+
+## ################################################################
+
+##
+## This section is for make and multilib madness.
+##
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+	"AR_FLAGS=$(AR_FLAGS)" \
+	"CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+	"CFLAGS=$(CFLAGS)" \
+	"CXXFLAGS=$(CXXFLAGS)" \
+	"CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+	"CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+	"INSTALL=$(INSTALL)" \
+	"INSTALL_DATA=$(INSTALL_DATA)" \
+	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+	"INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+	"JC1FLAGS=$(JC1FLAGS)" \
+	"LDFLAGS=$(LDFLAGS)" \
+	"LIBCFLAGS=$(LIBCFLAGS)" \
+	"LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+	"MAKE=$(MAKE)" \
+	"MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+	"PICFLAG=$(PICFLAG)" \
+	"PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+	"RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+	"SHELL=$(SHELL)" \
+	"exec_prefix=$(exec_prefix)" \
+	"infodir=$(infodir)" \
+	"libdir=$(libdir)" \
+	"mandir=$(mandir)" \
+	"prefix=$(prefix)" \
+	"AR=$(AR)" \
+	"AS=$(AS)" \
+	"CC=$(CC)" \
+	"CXX=$(CXX)" \
+	"LD=$(LD)" \
+	"NM=$(NM)" \
+	"RANLIB=$(RANLIB)" \
+	"DESTDIR=$(DESTDIR)"
+
+MAKEOVERRIDES=
+
+ACLOCAL_AMFLAGS=$(ACLOCAL_AMFLAGS) -I m4
+
+lib_LTLIBRARIES = libffi.la
+noinst_LTLIBRARIES = libffi_convenience.la
+
+libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \
+		src/raw_api.c src/java_raw_api.c src/closures.c
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = libffi.pc
+
+nodist_libffi_la_SOURCES =
+
+if MIPS
+nodist_libffi_la_SOURCES += src/mips/ffi.c src/mips/o32.S src/mips/n32.S
+endif
+if X86
+nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/sysv.S
+endif
+if X86_FREEBSD
+nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/freebsd.S
+endif
+if X86_WIN32
+nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win32.S
+endif
+if X86_WIN64
+nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/win64.S
+endif
+if X86_DARWIN
+nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S
+endif
+if SPARC
+nodist_libffi_la_SOURCES += src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S
+endif
+if ALPHA
+nodist_libffi_la_SOURCES += src/alpha/ffi.c src/alpha/osf.S
+endif
+if IA64
+nodist_libffi_la_SOURCES += src/ia64/ffi.c src/ia64/unix.S
+endif
+if M32R
+nodist_libffi_la_SOURCES += src/m32r/sysv.S src/m32r/ffi.c
+endif
+if M68K
+nodist_libffi_la_SOURCES += src/m68k/ffi.c src/m68k/sysv.S
+endif
+if POWERPC
+nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S
+endif
+if POWERPC_AIX
+nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
+endif
+if POWERPC_DARWIN
+nodist_libffi_la_SOURCES += src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
+endif
+if POWERPC_FREEBSD
+nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
+endif
+if ARM
+nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c
+if FFI_EXEC_TRAMPOLINE_TABLE
+nodist_libffi_la_SOURCES += src/arm/trampoline.S
+endif
+endif
+if AVR32
+nodist_libffi_la_SOURCES += src/avr32/sysv.S src/avr32/ffi.c
+endif
+if LIBFFI_CRIS
+nodist_libffi_la_SOURCES += src/cris/sysv.S src/cris/ffi.c
+endif
+if FRV
+nodist_libffi_la_SOURCES += src/frv/eabi.S src/frv/ffi.c
+endif
+if S390
+nodist_libffi_la_SOURCES += src/s390/sysv.S src/s390/ffi.c
+endif
+if X86_64
+nodist_libffi_la_SOURCES += src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
+endif
+if SH
+nodist_libffi_la_SOURCES += src/sh/sysv.S src/sh/ffi.c
+endif
+if SH64
+nodist_libffi_la_SOURCES += src/sh64/sysv.S src/sh64/ffi.c
+endif
+if PA_LINUX
+nodist_libffi_la_SOURCES += src/pa/linux.S src/pa/ffi.c
+endif
+if PA_HPUX
+nodist_libffi_la_SOURCES += src/pa/hpux32.S src/pa/ffi.c
+endif
+
+libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
+nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
+
+AM_CFLAGS = -g
+if FFI_DEBUG
+# Build debug. Define FFI_DEBUG on the commandline so that, when building with
+# MSVC, it can link against the debug CRT.
+AM_CFLAGS += -DFFI_DEBUG
+endif
+
+libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
+
+AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
+AM_CCASFLAGS = $(AM_CPPFLAGS)
+
+# No install-html or install-pdf support in automake yet
+.PHONY: install-html install-pdf
+install-html:
+install-pdf:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.in b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.in
new file mode 100644
index 0000000..cbe1589
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.in
@@ -0,0 +1,1820 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+@MIPS_TRUE@am__append_1 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
+@X86_TRUE@am__append_2 = src/x86/ffi.c src/x86/sysv.S
+@X86_FREEBSD_TRUE@am__append_3 = src/x86/ffi.c src/x86/freebsd.S
+@X86_WIN32_TRUE@am__append_4 = src/x86/ffi.c src/x86/win32.S
+@X86_WIN64_TRUE@am__append_5 = src/x86/ffi.c src/x86/win64.S
+@X86_DARWIN_TRUE@am__append_6 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S
+@SPARC_TRUE@am__append_7 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S
+@ALPHA_TRUE@am__append_8 = src/alpha/ffi.c src/alpha/osf.S
+@IA64_TRUE@am__append_9 = src/ia64/ffi.c src/ia64/unix.S
+@M32R_TRUE@am__append_10 = src/m32r/sysv.S src/m32r/ffi.c
+@M68K_TRUE@am__append_11 = src/m68k/ffi.c src/m68k/sysv.S
+@POWERPC_TRUE@am__append_12 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S
+@POWERPC_AIX_TRUE@am__append_13 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
+@POWERPC_DARWIN_TRUE@am__append_14 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
+@POWERPC_FREEBSD_TRUE@am__append_15 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
+@ARM_TRUE@am__append_16 = src/arm/sysv.S src/arm/ffi.c
+@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_17 = src/arm/trampoline.S
+@AVR32_TRUE@am__append_18 = src/avr32/sysv.S src/avr32/ffi.c
+@LIBFFI_CRIS_TRUE@am__append_19 = src/cris/sysv.S src/cris/ffi.c
+@FRV_TRUE@am__append_20 = src/frv/eabi.S src/frv/ffi.c
+@S390_TRUE@am__append_21 = src/s390/sysv.S src/s390/ffi.c
+@X86_64_TRUE@am__append_22 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
+@SH_TRUE@am__append_23 = src/sh/sysv.S src/sh/ffi.c
+@SH64_TRUE@am__append_24 = src/sh64/sysv.S src/sh64/ffi.c
+@PA_LINUX_TRUE@am__append_25 = src/pa/linux.S src/pa/ffi.c
+@PA_HPUX_TRUE@am__append_26 = src/pa/hpux32.S src/pa/ffi.c
+# Build debug. Define FFI_DEBUG on the commandline so that, when building with
+# MSVC, it can link against the debug CRT.
+@FFI_DEBUG_TRUE@am__append_27 = -DFFI_DEBUG
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \
+	$(srcdir)/doc/version.texi $(srcdir)/fficonfig.h.in \
+	$(srcdir)/libffi.pc.in $(top_srcdir)/configure ChangeLog \
+	compile config.guess config.sub depcomp install-sh ltmain.sh \
+	mdate-sh missing texinfo.tex
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \
+	$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
+	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
+	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
+	$(top_srcdir)/m4/ax_configure_args.m4 \
+	$(top_srcdir)/m4/ax_enable_builddir.m4 \
+	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
+	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = fficonfig.h
+CONFIG_CLEAN_FILES = libffi.pc
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(infodir)" \
+	"$(DESTDIR)$(pkgconfigdir)"
+LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
+libffi_la_LIBADD =
+am__dirstamp = $(am__leading_dot)dirstamp
+am_libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
+	src/raw_api.lo src/java_raw_api.lo src/closures.lo
+@MIPS_TRUE@am__objects_1 = src/mips/ffi.lo src/mips/o32.lo \
+@MIPS_TRUE@	src/mips/n32.lo
+@X86_TRUE@am__objects_2 = src/x86/ffi.lo src/x86/sysv.lo
+@X86_FREEBSD_TRUE@am__objects_3 = src/x86/ffi.lo src/x86/freebsd.lo
+@X86_WIN32_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/win32.lo
+@X86_WIN64_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/win64.lo
+@X86_DARWIN_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/darwin.lo \
+@X86_DARWIN_TRUE@	src/x86/ffi64.lo src/x86/darwin64.lo
+@SPARC_TRUE@am__objects_7 = src/sparc/ffi.lo src/sparc/v8.lo \
+@SPARC_TRUE@	src/sparc/v9.lo
+@ALPHA_TRUE@am__objects_8 = src/alpha/ffi.lo src/alpha/osf.lo
+@IA64_TRUE@am__objects_9 = src/ia64/ffi.lo src/ia64/unix.lo
+@M32R_TRUE@am__objects_10 = src/m32r/sysv.lo src/m32r/ffi.lo
+@M68K_TRUE@am__objects_11 = src/m68k/ffi.lo src/m68k/sysv.lo
+@POWERPC_TRUE@am__objects_12 = src/powerpc/ffi.lo src/powerpc/sysv.lo \
+@POWERPC_TRUE@	src/powerpc/ppc_closure.lo \
+@POWERPC_TRUE@	src/powerpc/linux64.lo \
+@POWERPC_TRUE@	src/powerpc/linux64_closure.lo
+@POWERPC_AIX_TRUE@am__objects_13 = src/powerpc/ffi_darwin.lo \
+@POWERPC_AIX_TRUE@	src/powerpc/aix.lo \
+@POWERPC_AIX_TRUE@	src/powerpc/aix_closure.lo
+@POWERPC_DARWIN_TRUE@am__objects_14 = src/powerpc/ffi_darwin.lo \
+@POWERPC_DARWIN_TRUE@	src/powerpc/darwin.lo \
+@POWERPC_DARWIN_TRUE@	src/powerpc/darwin_closure.lo
+@POWERPC_FREEBSD_TRUE@am__objects_15 = src/powerpc/ffi.lo \
+@POWERPC_FREEBSD_TRUE@	src/powerpc/sysv.lo \
+@POWERPC_FREEBSD_TRUE@	src/powerpc/ppc_closure.lo
+@ARM_TRUE@am__objects_16 = src/arm/sysv.lo src/arm/ffi.lo
+@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_17 = src/arm/trampoline.lo
+@AVR32_TRUE@am__objects_18 = src/avr32/sysv.lo src/avr32/ffi.lo
+@LIBFFI_CRIS_TRUE@am__objects_19 = src/cris/sysv.lo src/cris/ffi.lo
+@FRV_TRUE@am__objects_20 = src/frv/eabi.lo src/frv/ffi.lo
+@S390_TRUE@am__objects_21 = src/s390/sysv.lo src/s390/ffi.lo
+@X86_64_TRUE@am__objects_22 = src/x86/ffi64.lo src/x86/unix64.lo \
+@X86_64_TRUE@	src/x86/ffi.lo src/x86/sysv.lo
+@SH_TRUE@am__objects_23 = src/sh/sysv.lo src/sh/ffi.lo
+@SH64_TRUE@am__objects_24 = src/sh64/sysv.lo src/sh64/ffi.lo
+@PA_LINUX_TRUE@am__objects_25 = src/pa/linux.lo src/pa/ffi.lo
+@PA_HPUX_TRUE@am__objects_26 = src/pa/hpux32.lo src/pa/ffi.lo
+nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
+	$(am__objects_3) $(am__objects_4) $(am__objects_5) \
+	$(am__objects_6) $(am__objects_7) $(am__objects_8) \
+	$(am__objects_9) $(am__objects_10) $(am__objects_11) \
+	$(am__objects_12) $(am__objects_13) $(am__objects_14) \
+	$(am__objects_15) $(am__objects_16) $(am__objects_17) \
+	$(am__objects_18) $(am__objects_19) $(am__objects_20) \
+	$(am__objects_21) $(am__objects_22) $(am__objects_23) \
+	$(am__objects_24) $(am__objects_25) $(am__objects_26)
+libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \
+	$(nodist_libffi_la_OBJECTS)
+libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(libffi_la_LDFLAGS) $(LDFLAGS) -o $@
+libffi_convenience_la_LIBADD =
+am__objects_27 = src/debug.lo src/prep_cif.lo src/types.lo \
+	src/raw_api.lo src/java_raw_api.lo src/closures.lo
+am_libffi_convenience_la_OBJECTS = $(am__objects_27)
+am__objects_28 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
+	$(am__objects_4) $(am__objects_5) $(am__objects_6) \
+	$(am__objects_7) $(am__objects_8) $(am__objects_9) \
+	$(am__objects_10) $(am__objects_11) $(am__objects_12) \
+	$(am__objects_13) $(am__objects_14) $(am__objects_15) \
+	$(am__objects_16) $(am__objects_17) $(am__objects_18) \
+	$(am__objects_19) $(am__objects_20) $(am__objects_21) \
+	$(am__objects_22) $(am__objects_23) $(am__objects_24) \
+	$(am__objects_25) $(am__objects_26)
+nodist_libffi_convenience_la_OBJECTS = $(am__objects_28)
+libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \
+	$(nodist_libffi_convenience_la_OBJECTS)
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)
+LTCPPASCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(libffi_la_SOURCES) $(nodist_libffi_la_SOURCES) \
+	$(libffi_convenience_la_SOURCES) \
+	$(nodist_libffi_convenience_la_SOURCES)
+DIST_SOURCES = $(libffi_la_SOURCES) $(libffi_convenience_la_SOURCES)
+INFO_DEPS = $(srcdir)/doc/libffi.info
+am__TEXINFO_TEX_DIR = $(srcdir)
+DVIS = doc/libffi.dvi
+PDFS = doc/libffi.pdf
+PSS = doc/libffi.ps
+HTMLS = doc/libffi.html
+TEXINFOS = doc/libffi.texi
+TEXI2DVI = texi2dvi
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+DATA = $(pkgconfig_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir dist dist-all distcheck
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d "$(distdir)" \
+    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr "$(distdir)"; }; }
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_LTLDFLAGS = @AM_LTLDFLAGS@
+AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PRTDIAG = @PRTDIAG@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TARGET = @TARGET@
+TARGETDIR = @TARGETDIR@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_enable_builddir_sed = @ax_enable_builddir_sed@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+toolexecdir = @toolexecdir@
+toolexeclibdir = @toolexeclibdir@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign subdir-objects
+SUBDIRS = include testsuite man
+EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host	\
+	src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h		\
+	src/arm/ffi.c src/arm/sysv.S src/arm/trampoline.S		\
+	src/arm/ffitarget.h src/avr32/ffi.c src/avr32/sysv.S		\
+	src/avr32/ffitarget.h src/cris/ffi.c src/cris/sysv.S		\
+	src/cris/ffitarget.h src/ia64/ffi.c src/ia64/ffitarget.h	\
+	src/ia64/ia64_flags.h src/ia64/unix.S src/mips/ffi.c		\
+	src/mips/n32.S src/mips/o32.S src/mips/ffitarget.h		\
+	src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h		\
+	src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h		\
+	src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/linux64.S	\
+	src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S		\
+	src/powerpc/asm.h src/powerpc/aix.S src/powerpc/darwin.S	\
+	src/powerpc/aix_closure.S src/powerpc/darwin_closure.S		\
+	src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h		\
+	src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h		\
+	src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h src/sh64/ffi.c	\
+	src/sh64/sysv.S src/sh64/ffitarget.h src/sparc/v8.S		\
+	src/sparc/v9.S src/sparc/ffitarget.h src/sparc/ffi.c		\
+	src/x86/darwin64.S src/x86/ffi.c src/x86/sysv.S			\
+	src/x86/win32.S src/x86/win64.S src/x86/darwin.S		\
+	src/x86/freebsd.S src/x86/ffi64.c src/x86/unix64.S		\
+	src/x86/ffitarget.h src/pa/ffitarget.h src/pa/ffi.c		\
+	src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c src/frv/eabi.S	\
+	src/frv/ffitarget.h src/dlmalloc.c src/moxie/ffi.c		\
+	src/moxie/eabi.S libtool-version ChangeLog.libffi		\
+	m4/libtool.m4 m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4	\
+	m4/ltversion.m4 build-ios.sh src/arm/gentramp.sh src/debug.c    \
+	msvcc.sh
+
+info_TEXINFOS = doc/libffi.texi
+
+# Work around what appears to be a GNU make bug handling MAKEFLAGS
+# values defined in terms of make variables, as is the case for CC and
+# friends when we are called from the top level Makefile.
+AM_MAKEFLAGS = \
+	"AR_FLAGS=$(AR_FLAGS)" \
+	"CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+	"CFLAGS=$(CFLAGS)" \
+	"CXXFLAGS=$(CXXFLAGS)" \
+	"CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+	"CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
+	"INSTALL=$(INSTALL)" \
+	"INSTALL_DATA=$(INSTALL_DATA)" \
+	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
+	"INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
+	"JC1FLAGS=$(JC1FLAGS)" \
+	"LDFLAGS=$(LDFLAGS)" \
+	"LIBCFLAGS=$(LIBCFLAGS)" \
+	"LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
+	"MAKE=$(MAKE)" \
+	"MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
+	"PICFLAG=$(PICFLAG)" \
+	"PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
+	"RUNTESTFLAGS=$(RUNTESTFLAGS)" \
+	"SHELL=$(SHELL)" \
+	"exec_prefix=$(exec_prefix)" \
+	"infodir=$(infodir)" \
+	"libdir=$(libdir)" \
+	"mandir=$(mandir)" \
+	"prefix=$(prefix)" \
+	"AR=$(AR)" \
+	"AS=$(AS)" \
+	"CC=$(CC)" \
+	"CXX=$(CXX)" \
+	"LD=$(LD)" \
+	"NM=$(NM)" \
+	"RANLIB=$(RANLIB)" \
+	"DESTDIR=$(DESTDIR)"
+
+MAKEOVERRIDES = 
+ACLOCAL_AMFLAGS = $(ACLOCAL_AMFLAGS) -I m4
+lib_LTLIBRARIES = libffi.la
+noinst_LTLIBRARIES = libffi_convenience.la
+libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c \
+		src/raw_api.c src/java_raw_api.c src/closures.c
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = libffi.pc
+nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \
+	$(am__append_3) $(am__append_4) $(am__append_5) \
+	$(am__append_6) $(am__append_7) $(am__append_8) \
+	$(am__append_9) $(am__append_10) $(am__append_11) \
+	$(am__append_12) $(am__append_13) $(am__append_14) \
+	$(am__append_15) $(am__append_16) $(am__append_17) \
+	$(am__append_18) $(am__append_19) $(am__append_20) \
+	$(am__append_21) $(am__append_22) $(am__append_23) \
+	$(am__append_24) $(am__append_25) $(am__append_26)
+libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
+nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
+AM_CFLAGS = -g $(am__append_27)
+libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
+AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
+AM_CCASFLAGS = $(AM_CPPFLAGS)
+all: fficonfig.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .S .c .dvi .lo .o .obj .ps
+am--refresh:
+	@:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+fficonfig.h: stamp-h1
+	@if test ! -f $@; then \
+	  rm -f stamp-h1; \
+	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
+	else :; fi
+
+stamp-h1: $(srcdir)/fficonfig.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status fficonfig.h
+$(srcdir)/fficonfig.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f fficonfig.h stamp-h1
+libffi.pc: $(top_builddir)/config.status $(srcdir)/libffi.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+src/$(am__dirstamp):
+	@$(MKDIR_P) src
+	@: > src/$(am__dirstamp)
+src/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/$(DEPDIR)
+	@: > src/$(DEPDIR)/$(am__dirstamp)
+src/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/prep_cif.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/types.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/java_raw_api.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/closures.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/mips/$(am__dirstamp):
+	@$(MKDIR_P) src/mips
+	@: > src/mips/$(am__dirstamp)
+src/mips/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/mips/$(DEPDIR)
+	@: > src/mips/$(DEPDIR)/$(am__dirstamp)
+src/mips/ffi.lo: src/mips/$(am__dirstamp) \
+	src/mips/$(DEPDIR)/$(am__dirstamp)
+src/mips/o32.lo: src/mips/$(am__dirstamp) \
+	src/mips/$(DEPDIR)/$(am__dirstamp)
+src/mips/n32.lo: src/mips/$(am__dirstamp) \
+	src/mips/$(DEPDIR)/$(am__dirstamp)
+src/x86/$(am__dirstamp):
+	@$(MKDIR_P) src/x86
+	@: > src/x86/$(am__dirstamp)
+src/x86/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/x86/$(DEPDIR)
+	@: > src/x86/$(DEPDIR)/$(am__dirstamp)
+src/x86/ffi.lo: src/x86/$(am__dirstamp) \
+	src/x86/$(DEPDIR)/$(am__dirstamp)
+src/x86/sysv.lo: src/x86/$(am__dirstamp) \
+	src/x86/$(DEPDIR)/$(am__dirstamp)
+src/x86/freebsd.lo: src/x86/$(am__dirstamp) \
+	src/x86/$(DEPDIR)/$(am__dirstamp)
+src/x86/win32.lo: src/x86/$(am__dirstamp) \
+	src/x86/$(DEPDIR)/$(am__dirstamp)
+src/x86/win64.lo: src/x86/$(am__dirstamp) \
+	src/x86/$(DEPDIR)/$(am__dirstamp)
+src/x86/darwin.lo: src/x86/$(am__dirstamp) \
+	src/x86/$(DEPDIR)/$(am__dirstamp)
+src/x86/ffi64.lo: src/x86/$(am__dirstamp) \
+	src/x86/$(DEPDIR)/$(am__dirstamp)
+src/x86/darwin64.lo: src/x86/$(am__dirstamp) \
+	src/x86/$(DEPDIR)/$(am__dirstamp)
+src/sparc/$(am__dirstamp):
+	@$(MKDIR_P) src/sparc
+	@: > src/sparc/$(am__dirstamp)
+src/sparc/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/sparc/$(DEPDIR)
+	@: > src/sparc/$(DEPDIR)/$(am__dirstamp)
+src/sparc/ffi.lo: src/sparc/$(am__dirstamp) \
+	src/sparc/$(DEPDIR)/$(am__dirstamp)
+src/sparc/v8.lo: src/sparc/$(am__dirstamp) \
+	src/sparc/$(DEPDIR)/$(am__dirstamp)
+src/sparc/v9.lo: src/sparc/$(am__dirstamp) \
+	src/sparc/$(DEPDIR)/$(am__dirstamp)
+src/alpha/$(am__dirstamp):
+	@$(MKDIR_P) src/alpha
+	@: > src/alpha/$(am__dirstamp)
+src/alpha/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/alpha/$(DEPDIR)
+	@: > src/alpha/$(DEPDIR)/$(am__dirstamp)
+src/alpha/ffi.lo: src/alpha/$(am__dirstamp) \
+	src/alpha/$(DEPDIR)/$(am__dirstamp)
+src/alpha/osf.lo: src/alpha/$(am__dirstamp) \
+	src/alpha/$(DEPDIR)/$(am__dirstamp)
+src/ia64/$(am__dirstamp):
+	@$(MKDIR_P) src/ia64
+	@: > src/ia64/$(am__dirstamp)
+src/ia64/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/ia64/$(DEPDIR)
+	@: > src/ia64/$(DEPDIR)/$(am__dirstamp)
+src/ia64/ffi.lo: src/ia64/$(am__dirstamp) \
+	src/ia64/$(DEPDIR)/$(am__dirstamp)
+src/ia64/unix.lo: src/ia64/$(am__dirstamp) \
+	src/ia64/$(DEPDIR)/$(am__dirstamp)
+src/m32r/$(am__dirstamp):
+	@$(MKDIR_P) src/m32r
+	@: > src/m32r/$(am__dirstamp)
+src/m32r/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/m32r/$(DEPDIR)
+	@: > src/m32r/$(DEPDIR)/$(am__dirstamp)
+src/m32r/sysv.lo: src/m32r/$(am__dirstamp) \
+	src/m32r/$(DEPDIR)/$(am__dirstamp)
+src/m32r/ffi.lo: src/m32r/$(am__dirstamp) \
+	src/m32r/$(DEPDIR)/$(am__dirstamp)
+src/m68k/$(am__dirstamp):
+	@$(MKDIR_P) src/m68k
+	@: > src/m68k/$(am__dirstamp)
+src/m68k/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/m68k/$(DEPDIR)
+	@: > src/m68k/$(DEPDIR)/$(am__dirstamp)
+src/m68k/ffi.lo: src/m68k/$(am__dirstamp) \
+	src/m68k/$(DEPDIR)/$(am__dirstamp)
+src/m68k/sysv.lo: src/m68k/$(am__dirstamp) \
+	src/m68k/$(DEPDIR)/$(am__dirstamp)
+src/powerpc/$(am__dirstamp):
+	@$(MKDIR_P) src/powerpc
+	@: > src/powerpc/$(am__dirstamp)
+src/powerpc/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/powerpc/$(DEPDIR)
+	@: > src/powerpc/$(DEPDIR)/$(am__dirstamp)
+src/powerpc/ffi.lo: src/powerpc/$(am__dirstamp) \
+	src/powerpc/$(DEPDIR)/$(am__dirstamp)
+src/powerpc/sysv.lo: src/powerpc/$(am__dirstamp) \
+	src/powerpc/$(DEPDIR)/$(am__dirstamp)
+src/powerpc/ppc_closure.lo: src/powerpc/$(am__dirstamp) \
+	src/powerpc/$(DEPDIR)/$(am__dirstamp)
+src/powerpc/linux64.lo: src/powerpc/$(am__dirstamp) \
+	src/powerpc/$(DEPDIR)/$(am__dirstamp)
+src/powerpc/linux64_closure.lo: src/powerpc/$(am__dirstamp) \
+	src/powerpc/$(DEPDIR)/$(am__dirstamp)
+src/powerpc/ffi_darwin.lo: src/powerpc/$(am__dirstamp) \
+	src/powerpc/$(DEPDIR)/$(am__dirstamp)
+src/powerpc/aix.lo: src/powerpc/$(am__dirstamp) \
+	src/powerpc/$(DEPDIR)/$(am__dirstamp)
+src/powerpc/aix_closure.lo: src/powerpc/$(am__dirstamp) \
+	src/powerpc/$(DEPDIR)/$(am__dirstamp)
+src/powerpc/darwin.lo: src/powerpc/$(am__dirstamp) \
+	src/powerpc/$(DEPDIR)/$(am__dirstamp)
+src/powerpc/darwin_closure.lo: src/powerpc/$(am__dirstamp) \
+	src/powerpc/$(DEPDIR)/$(am__dirstamp)
+src/arm/$(am__dirstamp):
+	@$(MKDIR_P) src/arm
+	@: > src/arm/$(am__dirstamp)
+src/arm/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/arm/$(DEPDIR)
+	@: > src/arm/$(DEPDIR)/$(am__dirstamp)
+src/arm/sysv.lo: src/arm/$(am__dirstamp) \
+	src/arm/$(DEPDIR)/$(am__dirstamp)
+src/arm/ffi.lo: src/arm/$(am__dirstamp) \
+	src/arm/$(DEPDIR)/$(am__dirstamp)
+src/arm/trampoline.lo: src/arm/$(am__dirstamp) \
+	src/arm/$(DEPDIR)/$(am__dirstamp)
+src/avr32/$(am__dirstamp):
+	@$(MKDIR_P) src/avr32
+	@: > src/avr32/$(am__dirstamp)
+src/avr32/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/avr32/$(DEPDIR)
+	@: > src/avr32/$(DEPDIR)/$(am__dirstamp)
+src/avr32/sysv.lo: src/avr32/$(am__dirstamp) \
+	src/avr32/$(DEPDIR)/$(am__dirstamp)
+src/avr32/ffi.lo: src/avr32/$(am__dirstamp) \
+	src/avr32/$(DEPDIR)/$(am__dirstamp)
+src/cris/$(am__dirstamp):
+	@$(MKDIR_P) src/cris
+	@: > src/cris/$(am__dirstamp)
+src/cris/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/cris/$(DEPDIR)
+	@: > src/cris/$(DEPDIR)/$(am__dirstamp)
+src/cris/sysv.lo: src/cris/$(am__dirstamp) \
+	src/cris/$(DEPDIR)/$(am__dirstamp)
+src/cris/ffi.lo: src/cris/$(am__dirstamp) \
+	src/cris/$(DEPDIR)/$(am__dirstamp)
+src/frv/$(am__dirstamp):
+	@$(MKDIR_P) src/frv
+	@: > src/frv/$(am__dirstamp)
+src/frv/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/frv/$(DEPDIR)
+	@: > src/frv/$(DEPDIR)/$(am__dirstamp)
+src/frv/eabi.lo: src/frv/$(am__dirstamp) \
+	src/frv/$(DEPDIR)/$(am__dirstamp)
+src/frv/ffi.lo: src/frv/$(am__dirstamp) \
+	src/frv/$(DEPDIR)/$(am__dirstamp)
+src/s390/$(am__dirstamp):
+	@$(MKDIR_P) src/s390
+	@: > src/s390/$(am__dirstamp)
+src/s390/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/s390/$(DEPDIR)
+	@: > src/s390/$(DEPDIR)/$(am__dirstamp)
+src/s390/sysv.lo: src/s390/$(am__dirstamp) \
+	src/s390/$(DEPDIR)/$(am__dirstamp)
+src/s390/ffi.lo: src/s390/$(am__dirstamp) \
+	src/s390/$(DEPDIR)/$(am__dirstamp)
+src/x86/unix64.lo: src/x86/$(am__dirstamp) \
+	src/x86/$(DEPDIR)/$(am__dirstamp)
+src/sh/$(am__dirstamp):
+	@$(MKDIR_P) src/sh
+	@: > src/sh/$(am__dirstamp)
+src/sh/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/sh/$(DEPDIR)
+	@: > src/sh/$(DEPDIR)/$(am__dirstamp)
+src/sh/sysv.lo: src/sh/$(am__dirstamp) \
+	src/sh/$(DEPDIR)/$(am__dirstamp)
+src/sh/ffi.lo: src/sh/$(am__dirstamp) src/sh/$(DEPDIR)/$(am__dirstamp)
+src/sh64/$(am__dirstamp):
+	@$(MKDIR_P) src/sh64
+	@: > src/sh64/$(am__dirstamp)
+src/sh64/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/sh64/$(DEPDIR)
+	@: > src/sh64/$(DEPDIR)/$(am__dirstamp)
+src/sh64/sysv.lo: src/sh64/$(am__dirstamp) \
+	src/sh64/$(DEPDIR)/$(am__dirstamp)
+src/sh64/ffi.lo: src/sh64/$(am__dirstamp) \
+	src/sh64/$(DEPDIR)/$(am__dirstamp)
+src/pa/$(am__dirstamp):
+	@$(MKDIR_P) src/pa
+	@: > src/pa/$(am__dirstamp)
+src/pa/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/pa/$(DEPDIR)
+	@: > src/pa/$(DEPDIR)/$(am__dirstamp)
+src/pa/linux.lo: src/pa/$(am__dirstamp) \
+	src/pa/$(DEPDIR)/$(am__dirstamp)
+src/pa/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp)
+src/pa/hpux32.lo: src/pa/$(am__dirstamp) \
+	src/pa/$(DEPDIR)/$(am__dirstamp)
+libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) 
+	$(libffi_la_LINK) -rpath $(libdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS)
+libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) 
+	$(LINK)  $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+	-rm -f src/alpha/ffi.$(OBJEXT)
+	-rm -f src/alpha/ffi.lo
+	-rm -f src/alpha/osf.$(OBJEXT)
+	-rm -f src/alpha/osf.lo
+	-rm -f src/arm/ffi.$(OBJEXT)
+	-rm -f src/arm/ffi.lo
+	-rm -f src/arm/sysv.$(OBJEXT)
+	-rm -f src/arm/sysv.lo
+	-rm -f src/arm/trampoline.$(OBJEXT)
+	-rm -f src/arm/trampoline.lo
+	-rm -f src/avr32/ffi.$(OBJEXT)
+	-rm -f src/avr32/ffi.lo
+	-rm -f src/avr32/sysv.$(OBJEXT)
+	-rm -f src/avr32/sysv.lo
+	-rm -f src/closures.$(OBJEXT)
+	-rm -f src/closures.lo
+	-rm -f src/cris/ffi.$(OBJEXT)
+	-rm -f src/cris/ffi.lo
+	-rm -f src/cris/sysv.$(OBJEXT)
+	-rm -f src/cris/sysv.lo
+	-rm -f src/debug.$(OBJEXT)
+	-rm -f src/debug.lo
+	-rm -f src/frv/eabi.$(OBJEXT)
+	-rm -f src/frv/eabi.lo
+	-rm -f src/frv/ffi.$(OBJEXT)
+	-rm -f src/frv/ffi.lo
+	-rm -f src/ia64/ffi.$(OBJEXT)
+	-rm -f src/ia64/ffi.lo
+	-rm -f src/ia64/unix.$(OBJEXT)
+	-rm -f src/ia64/unix.lo
+	-rm -f src/java_raw_api.$(OBJEXT)
+	-rm -f src/java_raw_api.lo
+	-rm -f src/m32r/ffi.$(OBJEXT)
+	-rm -f src/m32r/ffi.lo
+	-rm -f src/m32r/sysv.$(OBJEXT)
+	-rm -f src/m32r/sysv.lo
+	-rm -f src/m68k/ffi.$(OBJEXT)
+	-rm -f src/m68k/ffi.lo
+	-rm -f src/m68k/sysv.$(OBJEXT)
+	-rm -f src/m68k/sysv.lo
+	-rm -f src/mips/ffi.$(OBJEXT)
+	-rm -f src/mips/ffi.lo
+	-rm -f src/mips/n32.$(OBJEXT)
+	-rm -f src/mips/n32.lo
+	-rm -f src/mips/o32.$(OBJEXT)
+	-rm -f src/mips/o32.lo
+	-rm -f src/pa/ffi.$(OBJEXT)
+	-rm -f src/pa/ffi.lo
+	-rm -f src/pa/hpux32.$(OBJEXT)
+	-rm -f src/pa/hpux32.lo
+	-rm -f src/pa/linux.$(OBJEXT)
+	-rm -f src/pa/linux.lo
+	-rm -f src/powerpc/aix.$(OBJEXT)
+	-rm -f src/powerpc/aix.lo
+	-rm -f src/powerpc/aix_closure.$(OBJEXT)
+	-rm -f src/powerpc/aix_closure.lo
+	-rm -f src/powerpc/darwin.$(OBJEXT)
+	-rm -f src/powerpc/darwin.lo
+	-rm -f src/powerpc/darwin_closure.$(OBJEXT)
+	-rm -f src/powerpc/darwin_closure.lo
+	-rm -f src/powerpc/ffi.$(OBJEXT)
+	-rm -f src/powerpc/ffi.lo
+	-rm -f src/powerpc/ffi_darwin.$(OBJEXT)
+	-rm -f src/powerpc/ffi_darwin.lo
+	-rm -f src/powerpc/linux64.$(OBJEXT)
+	-rm -f src/powerpc/linux64.lo
+	-rm -f src/powerpc/linux64_closure.$(OBJEXT)
+	-rm -f src/powerpc/linux64_closure.lo
+	-rm -f src/powerpc/ppc_closure.$(OBJEXT)
+	-rm -f src/powerpc/ppc_closure.lo
+	-rm -f src/powerpc/sysv.$(OBJEXT)
+	-rm -f src/powerpc/sysv.lo
+	-rm -f src/prep_cif.$(OBJEXT)
+	-rm -f src/prep_cif.lo
+	-rm -f src/raw_api.$(OBJEXT)
+	-rm -f src/raw_api.lo
+	-rm -f src/s390/ffi.$(OBJEXT)
+	-rm -f src/s390/ffi.lo
+	-rm -f src/s390/sysv.$(OBJEXT)
+	-rm -f src/s390/sysv.lo
+	-rm -f src/sh/ffi.$(OBJEXT)
+	-rm -f src/sh/ffi.lo
+	-rm -f src/sh/sysv.$(OBJEXT)
+	-rm -f src/sh/sysv.lo
+	-rm -f src/sh64/ffi.$(OBJEXT)
+	-rm -f src/sh64/ffi.lo
+	-rm -f src/sh64/sysv.$(OBJEXT)
+	-rm -f src/sh64/sysv.lo
+	-rm -f src/sparc/ffi.$(OBJEXT)
+	-rm -f src/sparc/ffi.lo
+	-rm -f src/sparc/v8.$(OBJEXT)
+	-rm -f src/sparc/v8.lo
+	-rm -f src/sparc/v9.$(OBJEXT)
+	-rm -f src/sparc/v9.lo
+	-rm -f src/types.$(OBJEXT)
+	-rm -f src/types.lo
+	-rm -f src/x86/darwin.$(OBJEXT)
+	-rm -f src/x86/darwin.lo
+	-rm -f src/x86/darwin64.$(OBJEXT)
+	-rm -f src/x86/darwin64.lo
+	-rm -f src/x86/ffi.$(OBJEXT)
+	-rm -f src/x86/ffi.lo
+	-rm -f src/x86/ffi64.$(OBJEXT)
+	-rm -f src/x86/ffi64.lo
+	-rm -f src/x86/freebsd.$(OBJEXT)
+	-rm -f src/x86/freebsd.lo
+	-rm -f src/x86/sysv.$(OBJEXT)
+	-rm -f src/x86/sysv.lo
+	-rm -f src/x86/unix64.$(OBJEXT)
+	-rm -f src/x86/unix64.lo
+	-rm -f src/x86/win32.$(OBJEXT)
+	-rm -f src/x86/win32.lo
+	-rm -f src/x86/win64.$(OBJEXT)
+	-rm -f src/x86/win64.lo
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/closures.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/debug.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/java_raw_api.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/prep_cif.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/raw_api.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/types.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/osf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/sysv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/trampoline.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/sysv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/sysv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/eabi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/unix.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/sysv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/m68k/$(DEPDIR)/sysv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/n32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/o32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/hpux32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/linux.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix_closure.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/darwin_closure.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ffi_darwin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/linux64_closure.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/ppc_closure.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/sysv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/s390/$(DEPDIR)/sysv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/sh/$(DEPDIR)/sysv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/sh64/$(DEPDIR)/sysv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v8.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/sparc/$(DEPDIR)/v9.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/darwin64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/freebsd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/sysv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/unix64.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/win64.Plo@am__quote@
+
+.S.o:
+@am__fastdepCCAS_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCCAS_TRUE@	$(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCCAS_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCCAS_FALSE@	$(CPPASCOMPILE) -c -o $@ $<
+
+.S.obj:
+@am__fastdepCCAS_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCCAS_TRUE@	$(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCCAS_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCCAS_FALSE@	$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.S.lo:
+@am__fastdepCCAS_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCCAS_TRUE@	$(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCCAS_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCCAS_FALSE@	DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCCAS_FALSE@	$(LTCPPASCOMPILE) -c -o $@ $<
+
+.c.o:
+@am__fastdepCC_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+	-rm -rf src/.libs src/_libs
+	-rm -rf src/alpha/.libs src/alpha/_libs
+	-rm -rf src/arm/.libs src/arm/_libs
+	-rm -rf src/avr32/.libs src/avr32/_libs
+	-rm -rf src/cris/.libs src/cris/_libs
+	-rm -rf src/frv/.libs src/frv/_libs
+	-rm -rf src/ia64/.libs src/ia64/_libs
+	-rm -rf src/m32r/.libs src/m32r/_libs
+	-rm -rf src/m68k/.libs src/m68k/_libs
+	-rm -rf src/mips/.libs src/mips/_libs
+	-rm -rf src/pa/.libs src/pa/_libs
+	-rm -rf src/powerpc/.libs src/powerpc/_libs
+	-rm -rf src/s390/.libs src/s390/_libs
+	-rm -rf src/sh/.libs src/sh/_libs
+	-rm -rf src/sh64/.libs src/sh64/_libs
+	-rm -rf src/sparc/.libs src/sparc/_libs
+	-rm -rf src/x86/.libs src/x86/_libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+doc/$(am__dirstamp):
+	@$(MKDIR_P) doc
+	@: > doc/$(am__dirstamp)
+
+$(srcdir)/doc/libffi.info: doc/libffi.texi $(srcdir)/doc/version.texi
+	restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+	am__cwd=`pwd` && $(am__cd) $(srcdir) && \
+	rm -rf $$backupdir && mkdir $$backupdir && \
+	if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
+	  for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+	    if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+	  done; \
+	else :; fi && \
+	cd "$$am__cwd"; \
+	if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \
+	 -o $@ $(srcdir)/doc/libffi.texi; \
+	then \
+	  rc=0; \
+	  $(am__cd) $(srcdir); \
+	else \
+	  rc=$$?; \
+	  $(am__cd) $(srcdir) && \
+	  $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+	fi; \
+	rm -rf $$backupdir; exit $$rc
+
+doc/libffi.dvi: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp)
+	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \
+	$(TEXI2DVI) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi
+
+doc/libffi.pdf: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp)
+	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc' \
+	$(TEXI2PDF) -o $@ `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi
+
+doc/libffi.html: doc/libffi.texi $(srcdir)/doc/version.texi doc/$(am__dirstamp)
+	rm -rf $(@:.html=.htp)
+	if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I doc -I $(srcdir)/doc \
+	 -o $(@:.html=.htp) `test -f 'doc/libffi.texi' || echo '$(srcdir)/'`doc/libffi.texi; \
+	then \
+	  rm -rf $@; \
+	  if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+	    mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+	else \
+	  if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+	    rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+	  exit 1; \
+	fi
+$(srcdir)/doc/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/doc/stamp-vti
+$(srcdir)/doc/stamp-vti: doc/libffi.texi $(top_srcdir)/configure
+	test -f doc/$(am__dirstamp) || $(MAKE) $(AM_MAKEFLAGS) doc/$(am__dirstamp)
+	@(dir=.; test -f ./doc/libffi.texi || dir=$(srcdir); \
+	set `$(SHELL) $(srcdir)/mdate-sh $$dir/doc/libffi.texi`; \
+	echo "@set UPDATED $$1 $$2 $$3"; \
+	echo "@set UPDATED-MONTH $$2 $$3"; \
+	echo "@set EDITION $(VERSION)"; \
+	echo "@set VERSION $(VERSION)") > vti.tmp
+	@cmp -s vti.tmp $(srcdir)/doc/version.texi \
+	  || (echo "Updating $(srcdir)/doc/version.texi"; \
+	      cp vti.tmp $(srcdir)/doc/version.texi)
+	-@rm -f vti.tmp
+	@cp $(srcdir)/doc/version.texi $@
+
+mostlyclean-vti:
+	-rm -f vti.tmp
+
+maintainer-clean-vti:
+@MAINTAINER_MODE_TRUE@	-rm -f $(srcdir)/doc/stamp-vti $(srcdir)/doc/version.texi
+.dvi.ps:
+	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+	$(DVIPS) -o $@ $<
+
+uninstall-dvi-am:
+	@$(NORMAL_UNINSTALL)
+	@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(dvidir)/$$f"; \
+	done
+
+uninstall-html-am:
+	@$(NORMAL_UNINSTALL)
+	@list='$(HTMLS)'; test -n "$(htmldir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \
+	  rm -rf "$(DESTDIR)$(htmldir)/$$f"; \
+	done
+
+uninstall-info-am:
+	@$(PRE_UNINSTALL)
+	@if test -d '$(DESTDIR)$(infodir)' && \
+	    (install-info --version && \
+	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+	  list='$(INFO_DEPS)'; \
+	  for file in $$list; do \
+	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
+	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+	    if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+	    then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \
+	  done; \
+	else :; fi
+	@$(NORMAL_UNINSTALL)
+	@list='$(INFO_DEPS)'; \
+	for file in $$list; do \
+	  relfile=`echo "$$file" | sed 's|^.*/||'`; \
+	  relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+	  (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \
+	     echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
+	     rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+	   else :; fi); \
+	done
+
+uninstall-pdf-am:
+	@$(NORMAL_UNINSTALL)
+	@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
+	done
+
+uninstall-ps-am:
+	@$(NORMAL_UNINSTALL)
+	@list='$(PSS)'; test -n "$(psdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(psdir)/$$f"; \
+	done
+
+dist-info: $(INFO_DEPS)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	list='$(INFO_DEPS)'; \
+	for base in $$list; do \
+	  case $$base in \
+	    $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
+	  esac; \
+	  if test -f $$base; then d=.; else d=$(srcdir); fi; \
+	  base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
+	  for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
+	    if test -f $$file; then \
+	      relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+	      test -f "$(distdir)/$$relfile" || \
+		cp -p $$file "$(distdir)/$$relfile"; \
+	    else :; fi; \
+	  done; \
+	done
+
+mostlyclean-aminfo:
+	-rm -rf libffi.aux libffi.cp libffi.cps libffi.fn libffi.ky libffi.log \
+	  libffi.pg libffi.tmp libffi.toc libffi.tp libffi.vr
+
+clean-aminfo:
+	-test -z "doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html" \
+	|| rm -rf doc/libffi.dvi doc/libffi.pdf doc/libffi.ps doc/libffi.html
+
+maintainer-clean-aminfo:
+	@list='$(INFO_DEPS)'; for i in $$list; do \
+	  i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+	  echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+	  rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+	done
+install-pkgconfigDATA: $(pkgconfig_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+	done
+
+uninstall-pkgconfigDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) fficonfig.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS) fficonfig.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(MKDIR_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-info
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@$(am__cd) '$(distuninstallcheck_dir)' \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(INFO_DEPS) $(LTLIBRARIES) $(DATA) fficonfig.h
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(pkgconfigdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f doc/$(am__dirstamp)
+	-rm -f src/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/$(am__dirstamp)
+	-rm -f src/alpha/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/alpha/$(am__dirstamp)
+	-rm -f src/arm/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/arm/$(am__dirstamp)
+	-rm -f src/avr32/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/avr32/$(am__dirstamp)
+	-rm -f src/cris/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/cris/$(am__dirstamp)
+	-rm -f src/frv/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/frv/$(am__dirstamp)
+	-rm -f src/ia64/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/ia64/$(am__dirstamp)
+	-rm -f src/m32r/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/m32r/$(am__dirstamp)
+	-rm -f src/m68k/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/m68k/$(am__dirstamp)
+	-rm -f src/mips/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/mips/$(am__dirstamp)
+	-rm -f src/pa/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/pa/$(am__dirstamp)
+	-rm -f src/powerpc/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/powerpc/$(am__dirstamp)
+	-rm -f src/s390/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/s390/$(am__dirstamp)
+	-rm -f src/sh/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/sh/$(am__dirstamp)
+	-rm -f src/sh64/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/sh64/$(am__dirstamp)
+	-rm -f src/sparc/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/sparc/$(am__dirstamp)
+	-rm -f src/x86/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/x86/$(am__dirstamp)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-aminfo clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am: $(DVIS)
+
+html: html-recursive
+
+html-am: $(HTMLS)
+
+info: info-recursive
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-info-am install-pkgconfigDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am: $(DVIS)
+	@$(NORMAL_INSTALL)
+	test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)"
+	@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \
+	done
+install-exec-am: install-libLTLIBRARIES
+
+install-html-am: $(HTMLS)
+	@$(NORMAL_INSTALL)
+	test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
+	@list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  $(am__strip_dir) \
+	  if test -d "$$d$$p"; then \
+	    echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
+	    $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
+	    echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
+	    $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
+	  else \
+	    list2="$$list2 $$d$$p"; \
+	  fi; \
+	done; \
+	test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
+	done; }
+install-info: install-info-recursive
+
+install-info-am: $(INFO_DEPS)
+	@$(NORMAL_INSTALL)
+	test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+	for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	  esac; \
+	  if test -f $$file; then d=.; else d=$(srcdir); fi; \
+	  file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+	  for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+	               $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+	    if test -f $$ifile; then \
+	      echo "$$ifile"; \
+	    else : ; fi; \
+	  done; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
+	@$(POST_INSTALL)
+	@if (install-info --version && \
+	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+	  list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+	  for file in $$list; do \
+	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
+	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+	    install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+	  done; \
+	else : ; fi
+install-man:
+
+install-pdf-am: $(PDFS)
+	@$(NORMAL_INSTALL)
+	test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)"
+	@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done
+install-ps: install-ps-recursive
+
+install-ps-am: $(PSS)
+	@$(NORMAL_INSTALL)
+	test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)"
+	@list='$(PSS)'; test -n "$(psdir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+	maintainer-clean-generic maintainer-clean-vti
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool mostlyclean-vti
+
+pdf: pdf-recursive
+
+pdf-am: $(PDFS)
+
+ps: ps-recursive
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
+	uninstall-libLTLIBRARIES uninstall-pdf-am \
+	uninstall-pkgconfigDATA uninstall-ps-am
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
+	ctags-recursive install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am am--refresh check check-am clean clean-aminfo \
+	clean-generic clean-libLTLIBRARIES clean-libtool \
+	clean-noinstLTLIBRARIES ctags ctags-recursive dist dist-all \
+	dist-bzip2 dist-gzip dist-info dist-lzma dist-shar dist-tarZ \
+	dist-xz dist-zip distcheck distclean distclean-compile \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-libLTLIBRARIES \
+	install-man install-pdf install-pdf-am install-pkgconfigDATA \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-aminfo maintainer-clean-generic \
+	maintainer-clean-vti mostlyclean mostlyclean-aminfo \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-vti pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-dvi-am uninstall-html-am \
+	uninstall-info-am uninstall-libLTLIBRARIES uninstall-pdf-am \
+	uninstall-pkgconfigDATA uninstall-ps-am
+
+
+# No install-html or install-pdf support in automake yet
+.PHONY: install-html install-pdf
+install-html:
+install-pdf:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc
new file mode 100644
index 0000000..c22c895
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc
@@ -0,0 +1,141 @@
+#
+# ====================================================================
+#
+# libffi Windows Makefile
+#
+#
+# ====================================================================
+#
+
+NAME=ffi-3
+VERSION=3.0.10
+TARGET=X86_WIN32
+CC=cl.exe
+AS=ml.exe
+RC=rc.exe
+MT=mt.exe
+AR="link.exe"
+SO=.dll
+OBJ=.obj
+EXE=.exe
+LA=.lib
+LINK="link.exe"
+PREFIX=
+TOPDIR=.
+CPP=cl.exe -EP
+CFLAGS=-nologo -Zi -D_MD -W3 -DWIN32 -DWINNT -D_WIN32 -D_WINDOWS -D_WINNT -D_WIN32_WINNT=0x0501 -D_WIN32_IE=0x0600 -D_X86_=1 -DNDEBUG -MD -O2 -Ob2 -Oy-
+LDFLAGS=/NOLOGO /MACHINE:X86
+SHFLAGS=/DLL /INCREMENTAL:NO /DEBUG /SUBSYSTEM:WINDOWS /OPT:REF
+ARFLAGS=/LIB
+ASFLAGS=-coff -W3 -Cx -Zm -Di386 -DQUIET -D?QUIET
+RCFLAGS=/l 0x409 -DNDEBUG
+INCLUDES=-I . -I .\include -I .\src\x86 
+LIBS=kernel32.lib advapi32.lib shell32.lib user32.lib gdi32.lib
+
+VERSION_MAJOR=3
+VERSION_MINOR=1
+VERSION_PATCH=10rc
+
+DESTDIR=$(PREFIX)
+DESTBIN=$(PREFIX)\bin
+DESTLIB=$(PREFIX)\lib
+DESTINC=$(PREFIX)\include
+SRCDIR=$(TOPDIR)\src
+
+WORKDIR=$(TOPDIR)\.libs
+SOLIBNAME=lib$(NAME)
+LALIBNAME=libffi_convenience
+STATICLIB=$(WORKDIR)\$(LALIBNAME)$(LA)
+
+BUILDPDB = $(WORKDIR)\$(SOLIBNAME).pdb
+
+HEADERS = \
+	$(TOPDIR)\fficonfig.h
+
+FFI_HEADERS = \
+	$(TOPDIR)\include\ffi.h
+	
+OBJECTS = \
+	$(SRCDIR)\closures.obj \
+	$(SRCDIR)\debug.obj \
+	$(SRCDIR)\java_raw_api.obj \
+	$(SRCDIR)\prep_cif.obj \
+	$(SRCDIR)\raw_api.obj \
+	$(SRCDIR)\types.obj \
+	$(SRCDIR)\x86\ffi.obj
+
+!IF "$(TARGET)" == "X86_WIN32"
+OBJECTS = $(OBJECTS) \
+	$(SRCDIR)\x86\win32.obj
+ASMSRCS = \
+    $(SRCDIR)\x86\win32.asm
+    
+!ENDIF
+!IF "$(TARGET)" == "X86_WIN64"
+OBJECTS = $(OBJECTS) \
+	$(SRCDIR)\x86\win64.obj
+ASMSRCS = \
+    $(SRCDIR)\x86\win64.asm
+
+!ENDIF
+
+.SUFFIXES : .S .asm
+
+all: $(WORKDIR) $(STATICLIB)
+
+.c$(OBJ):
+	$(CC) -c $(CFLAGS) $(INCLUDES) -Fo$@ -Fd$(WORKDIR)\$(NAME)-src $<
+
+.asm$(OBJ):
+	$(AS) -c $(ASFLAGS) /Fo $@ $<
+
+.S.asm:
+	$(CPP) $(CFLAGS) $(INCLUDES) $< >$@
+
+.rc.res:
+	$(RC) $(RCFLAGS) /fo $@ $<
+
+$(WORKDIR) :
+	-@if not exist "$(WORKDIR)\$(NULL)" mkdir $(WORKDIR)
+
+$(HEADERS) :
+	-@if not exist $(HEADERS) copy $(HEADERS)w $(HEADERS)
+
+$(FFI_HEADERS) :
+	-@if not exist $(FFI_HEADERS) copy $(FFI_HEADERS).vc $(FFI_HEADERS)
+	
+$(STATICLIB): $(WORKDIR) $(FFI_HEADERS) $(HEADERS) $(ASMSRCS) $(OBJECTS)
+	$(AR) $(ARFLAGS) $(LDFLAGS) /out:$(STATICLIB) @<<
+	$(OBJECTS)
+<<
+
+
+!IF !DEFINED(PREFIX) || "$(PREFIX)" == ""
+
+install:
+	@echo ERROR: You must define installation PREFIX=destination
+
+!ELSE
+
+install: all
+	-@xcopy "$(TOPDIR)\include\*.h" "$(DESTINC)\" /Y /Q
+	-@xcopy "$(SRCDIR)\x86\ffitarget.h" "$(DESTINC)\" /Y /Q
+	-@xcopy "$(WORKDIR)\$(LALIBNAME)$(LA)" "$(DESTLIB)\" /Y /Q
+	-@xcopy "$(WORKDIR)\$(SOLIBNAME)$(LA)" "$(DESTLIB)\" /Y /Q
+	-@xcopy "$(WORKDIR)\$(SOLIBNAME)$(SO)" "$(DESTBIN)\" /Y /Q
+	-@xcopy "$(WORKDIR)\$(SOLIBNAME).pdb" "$(DESTLIB)\" /Y /Q
+
+!ENDIF
+
+clean:
+	-@del /Q $(OBJECTS) 2>NUL
+	-@del /Q $(RESOURCES) 2>NUL
+	-@del /Q $(ASMSRCS) 2>NUL
+	-@del /Q /S $(WORKDIR) 2>NUL
+
+distclean: clean
+	-@del /Q $(HEADERS) 2>NUL
+	-@del /Q $(TOPDIR)\include\ffi.h 2>NUL
+	-@del /Q $(TOPDIR)\fficonfig.h 2>NUL
+	-@del /Q $(TOPDIR)\Makefile.vc 2>NUL
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc64 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc64
new file mode 100644
index 0000000..3e99baa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/Makefile.vc64
@@ -0,0 +1,141 @@
+#
+# ====================================================================
+#
+# libffi Windows Makefile
+#
+#
+# ====================================================================
+#
+
+NAME=ffi-3
+VERSION=3.0.10
+TARGET=X86_WIN64
+CC=cl.exe
+AS=ml64.exe
+RC=rc.exe
+MT=mt.exe
+AR="link.exe"
+SO=.dll
+OBJ=.obj
+EXE=.exe
+LA=.lib
+LINK="link.exe"
+PREFIX=
+TOPDIR=.
+CPP=cl.exe -EP
+CFLAGS=-nologo -Zi -D_MD -W3 -DWIN64 -DWINNT -D_WIN32 -D_WINDOWS -D_WINNT -D_WIN32_WINNT=0x0501 -D_WIN32_IE=0x0600 -D_AMD64_=1 -DNDEBUG -MD -O2 -Ob2 -Oy-
+LDFLAGS=/NOLOGO /MACHINE:X64
+SHFLAGS=/DLL /INCREMENTAL:NO /DEBUG /SUBSYSTEM:WINDOWS /OPT:REF
+ARFLAGS=/LIB
+ASFLAGS=-coff -W3 -Cx -Zm -Di386 -DQUIET -D?QUIET
+RCFLAGS=/l 0x409 -DNDEBUG
+INCLUDES=-I . -I .\include -I .\src\x86 
+LIBS=kernel32.lib advapi32.lib shell32.lib user32.lib gdi32.lib
+
+VERSION_MAJOR=3
+VERSION_MINOR=1
+VERSION_PATCH=10rc
+
+DESTDIR=$(PREFIX)
+DESTBIN=$(PREFIX)\bin
+DESTLIB=$(PREFIX)\lib
+DESTINC=$(PREFIX)\include
+SRCDIR=$(TOPDIR)\src
+
+WORKDIR=$(TOPDIR)\.libs
+SOLIBNAME=lib$(NAME)
+LALIBNAME=libffi_convenience
+STATICLIB=$(WORKDIR)\$(LALIBNAME)$(LA)
+
+BUILDPDB = $(WORKDIR)\$(SOLIBNAME).pdb
+
+HEADERS = \
+	$(TOPDIR)\fficonfig.h
+
+FFI_HEADERS = \
+	$(TOPDIR)\include\ffi.h
+	
+OBJECTS = \
+	$(SRCDIR)\closures.obj \
+	$(SRCDIR)\debug.obj \
+	$(SRCDIR)\java_raw_api.obj \
+	$(SRCDIR)\prep_cif.obj \
+	$(SRCDIR)\raw_api.obj \
+	$(SRCDIR)\types.obj \
+	$(SRCDIR)\x86\ffi.obj
+
+!IF "$(TARGET)" == "X86_WIN32"
+OBJECTS = $(OBJECTS) \
+	$(SRCDIR)\x86\win32.obj
+ASMSRCS = \
+    $(SRCDIR)\x86\win32.asm
+    
+!ENDIF
+!IF "$(TARGET)" == "X86_WIN64"
+OBJECTS = $(OBJECTS) \
+	$(SRCDIR)\x86\win64.obj
+ASMSRCS = \
+    $(SRCDIR)\x86\win64.asm
+
+!ENDIF
+
+.SUFFIXES : .S .asm
+
+all: $(WORKDIR) $(STATICLIB)
+
+.c$(OBJ):
+	$(CC) -c $(CFLAGS) $(INCLUDES) -Fo$@ -Fd$(WORKDIR)\$(NAME)-src $<
+
+.asm$(OBJ):
+	$(AS) -c $(ASFLAGS) /Fo $@ $<
+
+.S.asm:
+	$(CPP) $(CFLAGS) $(INCLUDES) $< >$@
+
+.rc.res:
+	$(RC) $(RCFLAGS) /fo $@ $<
+
+$(WORKDIR) :
+	-@if not exist "$(WORKDIR)\$(NULL)" mkdir $(WORKDIR)
+
+$(HEADERS) :
+	-@if not exist $(HEADERS) copy $(HEADERS)w $(HEADERS)
+
+$(FFI_HEADERS) :
+	-@if not exist $(FFI_HEADERS) copy $(FFI_HEADERS).vc64 $(FFI_HEADERS)
+	
+$(STATICLIB): $(WORKDIR) $(FFI_HEADERS) $(HEADERS) $(ASMSRCS) $(OBJECTS)
+	$(AR) $(ARFLAGS) $(LDFLAGS) /out:$(STATICLIB) @<<
+	$(OBJECTS)
+<<
+
+
+!IF !DEFINED(PREFIX) || "$(PREFIX)" == ""
+
+install:
+	@echo ERROR: You must define installation PREFIX=destination
+
+!ELSE
+
+install: all
+	-@xcopy "$(TOPDIR)\include\*.h" "$(DESTINC)\" /Y /Q
+	-@xcopy "$(SRCDIR)\x86\ffitarget.h" "$(DESTINC)\" /Y /Q
+	-@xcopy "$(WORKDIR)\$(LALIBNAME)$(LA)" "$(DESTLIB)\" /Y /Q
+	-@xcopy "$(WORKDIR)\$(SOLIBNAME)$(LA)" "$(DESTLIB)\" /Y /Q
+	-@xcopy "$(WORKDIR)\$(SOLIBNAME)$(SO)" "$(DESTBIN)\" /Y /Q
+	-@xcopy "$(WORKDIR)\$(SOLIBNAME).pdb" "$(DESTLIB)\" /Y /Q
+
+!ENDIF
+
+clean:
+	-@del /Q $(OBJECTS) 2>NUL
+	-@del /Q $(RESOURCES) 2>NUL
+	-@del /Q $(ASMSRCS) 2>NUL
+	-@del /Q /S $(WORKDIR) 2>NUL
+
+distclean: clean
+	-@del /Q $(HEADERS) 2>NUL
+	-@del /Q $(TOPDIR)\include\ffi.h 2>NUL
+	-@del /Q $(TOPDIR)\fficonfig.h 2>NUL
+	-@del /Q $(TOPDIR)\Makefile.vc 2>NUL
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/README b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/README
new file mode 100644
index 0000000..297c044
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/README
@@ -0,0 +1,342 @@
+Status
+======
+
+libffi-3.0.10 was released on August 23, 2011. Check the libffi web
+page for updates: <URL:http://sourceware.org/libffi/>.
+
+
+What is libffi?
+===============
+
+Compilers for high level languages generate code that follow certain
+conventions. These conventions are necessary, in part, for separate
+compilation to work. One such convention is the "calling
+convention". The "calling convention" is essentially a set of
+assumptions made by the compiler about where function arguments will
+be found on entry to a function. A "calling convention" also specifies
+where the return value for a function is found.
+
+Some programs may not know at the time of compilation what arguments
+are to be passed to a function. For instance, an interpreter may be
+told at run-time about the number and types of arguments used to call
+a given function. Libffi can be used in such programs to provide a
+bridge from the interpreter program to compiled code.
+
+The libffi library provides a portable, high level programming
+interface to various calling conventions. This allows a programmer to
+call any function specified by a call interface description at run
+time.  
+
+FFI stands for Foreign Function Interface.  A foreign function
+interface is the popular name for the interface that allows code
+written in one language to call code written in another language. The
+libffi library really only provides the lowest, machine dependent
+layer of a fully featured foreign function interface. A layer must
+exist above libffi that handles type conversions for values passed
+between the two languages.
+
+
+Supported Platforms
+===================
+
+Libffi has been ported to many different platforms.
+For specific configuration details and testing status, please
+refer to the wiki page here:
+
+ http://www.moxielogic.org/wiki/index.php?title=Libffi_3.0.10
+
+At the time of release, the following basic configurations have been
+tested:
+
+|--------------+------------------|
+| Architecture | Operating System |
+|--------------+------------------|
+| Alpha        | Linux            |
+| Alpha        | Tru64            |
+| ARM          | Linux            |
+| ARM          | iOS              |
+| AVR32        | Linux            |
+| HPPA         | HPUX             |
+| IA-64        | Linux            |
+| M68K         | RTEMS            |
+| MIPS         | IRIX             |
+| MIPS         | Linux            |
+| MIPS         | RTEMS            |
+| MIPS64       | Linux            |
+| PowerPC      | Linux            |
+| PowerPC      | Mac OSX          |
+| PowerPC      | FreeBSD          |
+| PowerPC64    | Linux            |
+| S390         | Linux            |
+| S390X        | Linux            |
+| SPARC        | Linux            |
+| SPARC        | Solaris          |
+| SPARC64      | Linux            |
+| SPARC64      | FreeBSD          |
+| X86          | FreeBSD          |
+| X86          | Interix          |
+| X86          | kFreeBSD         |
+| X86          | Linux            |
+| X86          | Mac OSX          |
+| X86          | OpenBSD          |
+| X86          | OS/2             |
+| X86          | Solaris          |
+| X86          | Windows/Cygwin   |
+| X86          | Windows/MingW    |
+| X86-64       | FreeBSD          |
+| X86-64       | Linux            |
+| X86-64       | OpenBSD          |
+| X86-64       | Windows/MingW    |
+|--------------+------------------|
+
+Please send additional platform test results to
+libffi-discuss@sourceware.org and feel free to update the wiki page
+above.
+
+Installing libffi
+=================
+
+First you must configure the distribution for your particular
+system. Go to the directory you wish to build libffi in and run the
+"configure" program found in the root directory of the libffi source
+distribution.
+
+You may want to tell configure where to install the libffi library and
+header files. To do that, use the --prefix configure switch.  Libffi
+will install under /usr/local by default. 
+
+If you want to enable extra run-time debugging checks use the the
+--enable-debug configure switch. This is useful when your program dies
+mysteriously while using libffi. 
+
+Another useful configure switch is --enable-purify-safety. Using this
+will add some extra code which will suppress certain warnings when you
+are using Purify with libffi. Only use this switch when using 
+Purify, as it will slow down the library.
+
+It's also possible to build libffi on Windows platforms with
+Microsoft's Visual C++ compiler.  In this case, use the msvcc.sh
+wrapper script during configuration like so:
+
+path/to/configure CC=path/to/msvcc.sh LD=link CPP=\"cl -nologo -EP\"
+
+For 64-bit Windows builds, use CC="path/to/msvcc.sh -m64".
+You may also need to specify --build appropriately. When building with MSVC
+under a MingW environment, you may need to remove the line in configure
+that sets 'fix_srcfile_path' to a 'cygpath' command. ('cygpath' is not
+present in MingW, and is not required when using MingW-style paths.)
+
+For iOS builds, refer to the build-ios.sh script for guidance.
+
+Configure has many other options. Use "configure --help" to see them all.
+
+Once configure has finished, type "make". Note that you must be using
+GNU make.  You can ftp GNU make from prep.ai.mit.edu:/pub/gnu.
+
+To ensure that libffi is working as advertised, type "make check".
+This will require that you have DejaGNU installed.
+
+To install the library and header files, type "make install".
+
+
+History
+=======
+
+See the ChangeLog files for details.
+
+3.0.10 Aug-23-11
+        Add support for Apple's iOS.
+	Add support for ARM VFP ABI.
+        Add RTEMS support for MIPS and M68K.
+	Fix instruction cache clearing problems on
+	  ARM and SPARC.
+	Fix the N64 build on mips-sgi-irix6.5.
+	Enable builds with Microsoft's compiler.
+	Enable x86 builds with Oracle's Solaris compiler.
+	Fix support for calling code compiled with Oracle's Sparc
+	  Solaris compiler.
+	Testsuite fixes for Tru64 Unix.
+	Additional platform support.
+
+3.0.9 Dec-31-09
+        Add AVR32 and win64 ports.  Add ARM softfp support.
+	Many fixes for AIX, Solaris, HP-UX, *BSD.
+	Several PowerPC and x86-64 bug fixes.
+	Build DLL for windows.
+
+3.0.8 Dec-19-08
+        Add *BSD, BeOS, and PA-Linux support.
+
+3.0.7 Nov-11-08
+        Fix for ppc FreeBSD.
+	(thanks to Andreas Tobler)
+
+3.0.6 Jul-17-08
+        Fix for closures on sh.
+	Mark the sh/sh64 stack as non-executable.
+	(both thanks to Kaz Kojima)
+
+3.0.5 Apr-3-08
+        Fix libffi.pc file.
+	Fix #define ARM for IcedTea users.
+	Fix x86 closure bug.
+
+3.0.4 Feb-24-08
+        Fix x86 OpenBSD configury.
+
+3.0.3 Feb-22-08
+        Enable x86 OpenBSD thanks to Thomas Heller, and
+	x86-64 FreeBSD thanks to Björn König and Andreas Tobler.
+	Clean up test instruction in README.
+
+3.0.2 Feb-21-08
+        Improved x86 FreeBSD support.
+	Thanks to Björn König.
+
+3.0.1 Feb-15-08
+        Fix instruction cache flushing bug on MIPS.
+	Thanks to David Daney.
+
+3.0.0 Feb-15-08
+        Many changes, mostly thanks to the GCC project.
+	Cygnus Solutions is now Red Hat.
+
+  [10 years go by...]
+
+1.20 Oct-5-98
+	Raffaele Sena produces ARM port.
+
+1.19 Oct-5-98
+	Fixed x86 long double and long long return support.
+	m68k bug fixes from Andreas Schwab.
+	Patch for DU assembler compatibility for the Alpha from Richard
+	Henderson.
+
+1.18 Apr-17-98
+	Bug fixes and MIPS configuration changes.
+
+1.17 Feb-24-98
+	Bug fixes and m68k port from Andreas Schwab. PowerPC port from
+	Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes.
+
+1.16 Feb-11-98
+	Richard Henderson produces Alpha port.
+
+1.15 Dec-4-97
+	Fixed an n32 ABI bug. New libtool, auto* support.
+
+1.14 May-13-97
+	libtool is now used to generate shared and static libraries.
+	Fixed a minor portability problem reported by Russ McManus
+	<mcmanr@eq.gs.com>.
+
+1.13 Dec-2-96
+	Added --enable-purify-safety to keep Purify from complaining
+	about certain low level code.
+	Sparc fix for calling functions with < 6 args.
+	Linux x86 a.out fix.
+
+1.12 Nov-22-96
+	Added missing ffi_type_void, needed for supporting void return 
+	types. Fixed test case for non MIPS machines. Cygnus Support 
+	is now Cygnus Solutions. 
+
+1.11 Oct-30-96
+	Added notes about GNU make.
+
+1.10 Oct-29-96
+	Added configuration fix for non GNU compilers.
+
+1.09 Oct-29-96
+	Added --enable-debug configure switch. Clean-ups based on LCLint 
+	feedback. ffi_mips.h is always installed. Many configuration 
+	fixes. Fixed ffitest.c for sparc builds.
+
+1.08 Oct-15-96
+	Fixed n32 problem. Many clean-ups.
+
+1.07 Oct-14-96
+	Gordon Irlam rewrites v8.S again. Bug fixes.
+
+1.06 Oct-14-96
+	Gordon Irlam improved the sparc port. 
+
+1.05 Oct-14-96
+	Interface changes based on feedback.
+
+1.04 Oct-11-96
+	Sparc port complete (modulo struct passing bug).
+
+1.03 Oct-10-96
+	Passing struct args, and returning struct values works for
+	all architectures/calling conventions. Expanded tests.
+
+1.02 Oct-9-96
+	Added SGI n32 support. Fixed bugs in both o32 and Linux support.
+	Added "make test".
+
+1.01 Oct-8-96
+	Fixed float passing bug in mips version. Restructured some
+	of the code. Builds cleanly with SGI tools.
+
+1.00 Oct-7-96
+	First release. No public announcement.
+
+
+Authors & Credits
+=================
+
+libffi was originally written by Anthony Green <green@redhat.com>.
+
+The developers of the GNU Compiler Collection project have made
+innumerable valuable contributions.  See the ChangeLog file for
+details.
+
+Some of the ideas behind libffi were inspired by Gianni Mariani's free
+gencall library for Silicon Graphics machines.
+
+The closure mechanism was designed and implemented by Kresten Krab
+Thorup.
+
+Major processor architecture ports were contributed by the following
+developers:
+
+alpha		Richard Henderson
+arm		Raffaele Sena
+cris		Simon Posnjak, Hans-Peter Nilsson
+frv		Anthony Green
+ia64		Hans Boehm
+m32r		Kazuhiro Inaoka
+m68k		Andreas Schwab
+mips		Anthony Green, Casey Marshall
+mips64		David Daney
+pa		Randolph Chung, Dave Anglin, Andreas Tobler
+powerpc		Geoffrey Keating, Andreas Tobler, 
+			 David Edelsohn, John Hornkvist
+powerpc64	Jakub Jelinek
+s390		Gerhard Tonn, Ulrich Weigand
+sh		Kaz Kojima
+sh64		Kaz Kojima
+sparc		Anthony Green, Gordon Irlam
+x86		Anthony Green, Jon Beniston
+x86-64		Bo Thorsen
+
+Jesper Skov and Andrew Haley both did more than their fair share of
+stepping through the code and tracking down bugs.
+
+Thanks also to Tom Tromey for bug fixes, documentation and
+configuration help.
+
+Thanks to Jim Blandy, who provided some useful feedback on the libffi
+interface.
+
+Andreas Tobler has done a tremendous amount of work on the testsuite.
+
+Alex Oliva solved the executable page problem for SElinux.
+
+The list above is almost certainly incomplete and inaccurate.  I'm
+happy to make corrections or additions upon request.
+
+If you have a problem, or have found a bug, please send a note to the
+author at green@moxielogic.com, or the project mailing list at
+libffi-discuss@sourceware.org.
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/acinclude.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/acinclude.m4
new file mode 100644
index 0000000..3e8f8ba
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/acinclude.m4
@@ -0,0 +1,92 @@
+# mmap(2) blacklisting.  Some platforms provide the mmap library routine
+# but don't support all of the features we need from it.
+AC_DEFUN([AC_FUNC_MMAP_BLACKLIST],
+[
+AC_CHECK_HEADER([sys/mman.h],
+		[libffi_header_sys_mman_h=yes], [libffi_header_sys_mman_h=no])
+AC_CHECK_FUNC([mmap], [libffi_func_mmap=yes], [libffi_func_mmap=no])
+if test "$libffi_header_sys_mman_h" != yes \
+ || test "$libffi_func_mmap" != yes; then
+   ac_cv_func_mmap_file=no
+   ac_cv_func_mmap_dev_zero=no
+   ac_cv_func_mmap_anon=no
+else
+   AC_CACHE_CHECK([whether read-only mmap of a plain file works],
+  ac_cv_func_mmap_file,
+  [# Add a system to this blacklist if
+   # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a
+   # memory area containing the same data that you'd get if you applied
+   # read() to the same fd.  The only system known to have a problem here
+   # is VMS, where text files have record structure.
+   case "$host_os" in
+     vms* | ultrix*)
+	ac_cv_func_mmap_file=no ;;
+     *)
+	ac_cv_func_mmap_file=yes;;
+   esac])
+   AC_CACHE_CHECK([whether mmap from /dev/zero works],
+  ac_cv_func_mmap_dev_zero,
+  [# Add a system to this blacklist if it has mmap() but /dev/zero
+   # does not exist, or if mmapping /dev/zero does not give anonymous
+   # zeroed pages with both the following properties:
+   # 1. If you map N consecutive pages in with one call, and then
+   #    unmap any subset of those pages, the pages that were not
+   #    explicitly unmapped remain accessible.
+   # 2. If you map two adjacent blocks of memory and then unmap them
+   #    both at once, they must both go away.
+   # Systems known to be in this category are Windows (all variants),
+   # VMS, and Darwin.
+   case "$host_os" in
+     vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00)
+	ac_cv_func_mmap_dev_zero=no ;;
+     *)
+	ac_cv_func_mmap_dev_zero=yes;;
+   esac])
+
+   # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for.
+   AC_CACHE_CHECK([for MAP_ANON(YMOUS)], ac_cv_decl_map_anon,
+    [AC_TRY_COMPILE(
+[#include <sys/types.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#ifndef MAP_ANONYMOUS
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+],
+[int n = MAP_ANONYMOUS;],
+    ac_cv_decl_map_anon=yes,
+    ac_cv_decl_map_anon=no)])
+
+   if test $ac_cv_decl_map_anon = no; then
+     ac_cv_func_mmap_anon=no
+   else
+     AC_CACHE_CHECK([whether mmap with MAP_ANON(YMOUS) works],
+     ac_cv_func_mmap_anon,
+  [# Add a system to this blacklist if it has mmap() and MAP_ANON or
+   # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
+   # doesn't give anonymous zeroed pages with the same properties listed
+   # above for use of /dev/zero.
+   # Systems known to be in this category are Windows, VMS, and SCO Unix.
+   case "$host_os" in
+     vms* | cygwin* | pe | mingw* | sco* | udk* )
+	ac_cv_func_mmap_anon=no ;;
+     *)
+	ac_cv_func_mmap_anon=yes;;
+   esac])
+   fi
+fi
+
+if test $ac_cv_func_mmap_file = yes; then
+  AC_DEFINE(HAVE_MMAP_FILE, 1,
+	    [Define if read-only mmap of a plain file works.])
+fi
+if test $ac_cv_func_mmap_dev_zero = yes; then
+  AC_DEFINE(HAVE_MMAP_DEV_ZERO, 1,
+	    [Define if mmap of /dev/zero works.])
+fi
+if test $ac_cv_func_mmap_anon = yes; then
+  AC_DEFINE(HAVE_MMAP_ANON, 1,
+	    [Define if mmap with MAP_ANON(YMOUS) works.])
+fi
+])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/aclocal.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/aclocal.m4
new file mode 100644
index 0000000..6132c39
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/aclocal.m4
@@ -0,0 +1,1873 @@
+# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*-
+#
+#   Copyright (C) 1999-2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Thomas Tanner, 1999
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 18 LTDL_INIT
+
+# LT_CONFIG_LTDL_DIR(DIRECTORY, [LTDL-MODE])
+# ------------------------------------------
+# DIRECTORY contains the libltdl sources.  It is okay to call this
+# function multiple times, as long as the same DIRECTORY is always given.
+AC_DEFUN([LT_CONFIG_LTDL_DIR],
+[AC_BEFORE([$0], [LTDL_INIT])
+_$0($*)
+])# LT_CONFIG_LTDL_DIR
+
+# We break this out into a separate macro, so that we can call it safely
+# internally without being caught accidentally by the sed scan in libtoolize.
+m4_defun([_LT_CONFIG_LTDL_DIR],
+[dnl remove trailing slashes
+m4_pushdef([_ARG_DIR], m4_bpatsubst([$1], [/*$]))
+m4_case(_LTDL_DIR,
+	[], [dnl only set lt_ltdl_dir if _ARG_DIR is not simply `.'
+	     m4_if(_ARG_DIR, [.],
+	             [],
+		 [m4_define([_LTDL_DIR], _ARG_DIR)
+	          _LT_SHELL_INIT([lt_ltdl_dir=']_ARG_DIR['])])],
+    [m4_if(_ARG_DIR, _LTDL_DIR,
+	    [],
+	[m4_fatal([multiple libltdl directories: `]_LTDL_DIR[', `]_ARG_DIR['])])])
+m4_popdef([_ARG_DIR])
+])# _LT_CONFIG_LTDL_DIR
+
+# Initialise:
+m4_define([_LTDL_DIR], [])
+
+
+# _LT_BUILD_PREFIX
+# ----------------
+# If Autoconf is new enough, expand to `${top_build_prefix}', otherwise
+# to `${top_builddir}/'.
+m4_define([_LT_BUILD_PREFIX],
+[m4_ifdef([AC_AUTOCONF_VERSION],
+   [m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.62]),
+	  [-1], [m4_ifdef([_AC_HAVE_TOP_BUILD_PREFIX],
+			  [${top_build_prefix}],
+			  [${top_builddir}/])],
+	  [${top_build_prefix}])],
+   [${top_builddir}/])[]dnl
+])
+
+
+# LTDL_CONVENIENCE
+# ----------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments.  Note that
+# AC_CONFIG_SUBDIRS is not called here.  LIBLTDL will be prefixed with
+# '${top_build_prefix}' if available, otherwise with '${top_builddir}/',
+# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single
+# quotes!).  If your package is not flat and you're not using automake,
+# define top_build_prefix, top_builddir, and top_srcdir appropriately
+# in your Makefiles.
+AC_DEFUN([LTDL_CONVENIENCE],
+[AC_BEFORE([$0], [LTDL_INIT])dnl
+dnl Although the argument is deprecated and no longer documented,
+dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one
+dnl here make sure it is the same as any other declaration of libltdl's
+dnl location!  This also ensures lt_ltdl_dir is set when configure.ac is
+dnl not yet using an explicit LT_CONFIG_LTDL_DIR.
+m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl
+_$0()
+])# LTDL_CONVENIENCE
+
+# AC_LIBLTDL_CONVENIENCE accepted a directory argument in older libtools,
+# now we have LT_CONFIG_LTDL_DIR:
+AU_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_CONVENIENCE])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [])
+
+
+# _LTDL_CONVENIENCE
+# -----------------
+# Code shared by LTDL_CONVENIENCE and LTDL_INIT([convenience]).
+m4_defun([_LTDL_CONVENIENCE],
+[case $enable_ltdl_convenience in
+  no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+  "") enable_ltdl_convenience=yes
+      ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+esac
+LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdlc.la"
+LTDLDEPS=$LIBLTDL
+LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}"
+
+AC_SUBST([LIBLTDL])
+AC_SUBST([LTDLDEPS])
+AC_SUBST([LTDLINCL])
+
+# For backwards non-gettext consistent compatibility...
+INCLTDL="$LTDLINCL"
+AC_SUBST([INCLTDL])
+])# _LTDL_CONVENIENCE
+
+
+# LTDL_INSTALLABLE
+# ----------------
+# sets LIBLTDL to the link flags for the libltdl installable library
+# and LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments.  Note that
+# AC_CONFIG_SUBDIRS is not called from here.  If an installed libltdl
+# is not found, LIBLTDL will be prefixed with '${top_build_prefix}' if
+# available, otherwise with '${top_builddir}/', and LTDLINCL will be
+# prefixed with '${top_srcdir}/' (note the single quotes!).  If your
+# package is not flat and you're not using automake, define top_build_prefix,
+# top_builddir, and top_srcdir appropriately in your Makefiles.
+# In the future, this macro may have to be called after LT_INIT.
+AC_DEFUN([LTDL_INSTALLABLE],
+[AC_BEFORE([$0], [LTDL_INIT])dnl
+dnl Although the argument is deprecated and no longer documented,
+dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one
+dnl here make sure it is the same as any other declaration of libltdl's
+dnl location!  This also ensures lt_ltdl_dir is set when configure.ac is
+dnl not yet using an explicit LT_CONFIG_LTDL_DIR.
+m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl
+_$0()
+])# LTDL_INSTALLABLE
+
+# AC_LIBLTDL_INSTALLABLE accepted a directory argument in older libtools,
+# now we have LT_CONFIG_LTDL_DIR:
+AU_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])])
+_LTDL_INSTALLABLE])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [])
+
+
+# _LTDL_INSTALLABLE
+# -----------------
+# Code shared by LTDL_INSTALLABLE and LTDL_INIT([installable]).
+m4_defun([_LTDL_INSTALLABLE],
+[if test -f $prefix/lib/libltdl.la; then
+  lt_save_LDFLAGS="$LDFLAGS"
+  LDFLAGS="-L$prefix/lib $LDFLAGS"
+  AC_CHECK_LIB([ltdl], [lt_dlinit], [lt_lib_ltdl=yes])
+  LDFLAGS="$lt_save_LDFLAGS"
+  if test x"${lt_lib_ltdl-no}" = xyes; then
+    if test x"$enable_ltdl_install" != xyes; then
+      # Don't overwrite $prefix/lib/libltdl.la without --enable-ltdl-install
+      AC_MSG_WARN([not overwriting libltdl at $prefix, force with `--enable-ltdl-install'])
+      enable_ltdl_install=no
+    fi
+  elif test x"$enable_ltdl_install" = xno; then
+    AC_MSG_WARN([libltdl not installed, but installation disabled])
+  fi
+fi
+
+# If configure.ac declared an installable ltdl, and the user didn't override
+# with --disable-ltdl-install, we will install the shipped libltdl.
+case $enable_ltdl_install in
+  no) ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+      LIBLTDL="-lltdl"
+      LTDLDEPS=
+      LTDLINCL=
+      ;;
+  *)  enable_ltdl_install=yes
+      ac_configure_args="$ac_configure_args --enable-ltdl-install"
+      LIBLTDL='_LT_BUILD_PREFIX'"${lt_ltdl_dir+$lt_ltdl_dir/}libltdl.la"
+      LTDLDEPS=$LIBLTDL
+      LTDLINCL='-I${top_srcdir}'"${lt_ltdl_dir+/$lt_ltdl_dir}"
+      ;;
+esac
+
+AC_SUBST([LIBLTDL])
+AC_SUBST([LTDLDEPS])
+AC_SUBST([LTDLINCL])
+
+# For backwards non-gettext consistent compatibility...
+INCLTDL="$LTDLINCL"
+AC_SUBST([INCLTDL])
+])# LTDL_INSTALLABLE
+
+
+# _LTDL_MODE_DISPATCH
+# -------------------
+m4_define([_LTDL_MODE_DISPATCH],
+[dnl If _LTDL_DIR is `.', then we are configuring libltdl itself:
+m4_if(_LTDL_DIR, [],
+	[],
+    dnl if _LTDL_MODE was not set already, the default value is `subproject':
+    [m4_case(m4_default(_LTDL_MODE, [subproject]),
+	  [subproject], [AC_CONFIG_SUBDIRS(_LTDL_DIR)
+			  _LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"])],
+	  [nonrecursive], [_LT_SHELL_INIT([lt_dlopen_dir="$lt_ltdl_dir"; lt_libobj_prefix="$lt_ltdl_dir/"])],
+	  [recursive], [],
+	[m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])dnl
+dnl Be careful not to expand twice:
+m4_define([$0], [])
+])# _LTDL_MODE_DISPATCH
+
+
+# _LT_LIBOBJ(MODULE_NAME)
+# -----------------------
+# Like AC_LIBOBJ, except that MODULE_NAME goes into _LT_LIBOBJS instead
+# of into LIBOBJS.
+AC_DEFUN([_LT_LIBOBJ], [
+  m4_pattern_allow([^_LT_LIBOBJS$])
+  _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext"
+])# _LT_LIBOBJS
+
+
+# LTDL_INIT([OPTIONS])
+# --------------------
+# Clients of libltdl can use this macro to allow the installer to
+# choose between a shipped copy of the ltdl sources or a preinstalled
+# version of the library.  If the shipped ltdl sources are not in a
+# subdirectory named libltdl, the directory name must be given by
+# LT_CONFIG_LTDL_DIR.
+AC_DEFUN([LTDL_INIT],
+[dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+dnl We need to keep our own list of libobjs separate from our parent project,
+dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while
+dnl we look for our own LIBOBJs.
+m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ]))
+m4_pushdef([AC_LIBSOURCES])
+
+dnl If not otherwise defined, default to the 1.5.x compatible subproject mode:
+m4_if(_LTDL_MODE, [],
+        [m4_define([_LTDL_MODE], m4_default([$2], [subproject]))
+        m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])],
+                [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])])
+
+AC_ARG_WITH([included_ltdl],
+    [AS_HELP_STRING([--with-included-ltdl],
+                    [use the GNU ltdl sources included here])])
+
+if test "x$with_included_ltdl" != xyes; then
+  # We are not being forced to use the included libltdl sources, so
+  # decide whether there is a useful installed version we can use.
+  AC_CHECK_HEADER([ltdl.h],
+      [AC_CHECK_DECL([lt_dlinterface_register],
+	   [AC_CHECK_LIB([ltdl], [lt_dladvise_preload],
+	       [with_included_ltdl=no],
+	       [with_included_ltdl=yes])],
+	   [with_included_ltdl=yes],
+	   [AC_INCLUDES_DEFAULT
+	    #include <ltdl.h>])],
+      [with_included_ltdl=yes],
+      [AC_INCLUDES_DEFAULT]
+  )
+fi
+
+dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE
+dnl was called yet, then for old times' sake, we assume libltdl is in an
+dnl eponymous directory:
+AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])])
+
+AC_ARG_WITH([ltdl_include],
+    [AS_HELP_STRING([--with-ltdl-include=DIR],
+                    [use the ltdl headers installed in DIR])])
+
+if test -n "$with_ltdl_include"; then
+  if test -f "$with_ltdl_include/ltdl.h"; then :
+  else
+    AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include'])
+  fi
+else
+  with_ltdl_include=no
+fi
+
+AC_ARG_WITH([ltdl_lib],
+    [AS_HELP_STRING([--with-ltdl-lib=DIR],
+                    [use the libltdl.la installed in DIR])])
+
+if test -n "$with_ltdl_lib"; then
+  if test -f "$with_ltdl_lib/libltdl.la"; then :
+  else
+    AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib'])
+  fi
+else
+  with_ltdl_lib=no
+fi
+
+case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in
+  ,yes,no,no,)
+	m4_case(m4_default(_LTDL_TYPE, [convenience]),
+	    [convenience], [_LTDL_CONVENIENCE],
+	    [installable], [_LTDL_INSTALLABLE],
+	  [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)])
+	;;
+  ,no,no,no,)
+	# If the included ltdl is not to be used, then use the
+	# preinstalled libltdl we found.
+	AC_DEFINE([HAVE_LTDL], [1],
+	  [Define this if a modern libltdl is already installed])
+	LIBLTDL=-lltdl
+	LTDLDEPS=
+	LTDLINCL=
+	;;
+  ,no*,no,*)
+	AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together])
+	;;
+  *)	with_included_ltdl=no
+	LIBLTDL="-L$with_ltdl_lib -lltdl"
+	LTDLDEPS=
+	LTDLINCL="-I$with_ltdl_include"
+	;;
+esac
+INCLTDL="$LTDLINCL"
+
+# Report our decision...
+AC_MSG_CHECKING([where to find libltdl headers])
+AC_MSG_RESULT([$LTDLINCL])
+AC_MSG_CHECKING([where to find libltdl library])
+AC_MSG_RESULT([$LIBLTDL])
+
+_LTDL_SETUP
+
+dnl restore autoconf definition.
+m4_popdef([AC_LIBOBJ])
+m4_popdef([AC_LIBSOURCES])
+
+AC_CONFIG_COMMANDS_PRE([
+    _ltdl_libobjs=
+    _ltdl_ltlibobjs=
+    if test -n "$_LT_LIBOBJS"; then
+      # Remove the extension.
+      _lt_sed_drop_objext='s/\.o$//;s/\.obj$//'
+      for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do
+        _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext"
+        _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo"
+      done
+    fi
+    AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs])
+    AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs])
+])
+
+# Only expand once:
+m4_define([LTDL_INIT])
+])# LTDL_INIT
+
+# Old names:
+AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)])
+AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)])
+AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIB_LTDL], [])
+dnl AC_DEFUN([AC_WITH_LTDL], [])
+dnl AC_DEFUN([LT_WITH_LTDL], [])
+
+
+# _LTDL_SETUP
+# -----------
+# Perform all the checks necessary for compilation of the ltdl objects
+#  -- including compiler checks and header checks.  This is a public
+# interface  mainly for the benefit of libltdl's own configure.ac, most
+# other users should call LTDL_INIT instead.
+AC_DEFUN([_LTDL_SETUP],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_SYS_MODULE_EXT])dnl
+AC_REQUIRE([LT_SYS_MODULE_PATH])dnl
+AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl
+AC_REQUIRE([LT_LIB_DLLOAD])dnl
+AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl
+AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl
+AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl
+AC_REQUIRE([gl_FUNC_ARGZ])dnl
+
+m4_require([_LT_CHECK_OBJDIR])dnl
+m4_require([_LT_HEADER_DLFCN])dnl
+m4_require([_LT_CHECK_DLPREOPEN])dnl
+m4_require([_LT_DECL_SED])dnl
+
+dnl Don't require this, or it will be expanded earlier than the code
+dnl that sets the variables it relies on:
+_LT_ENABLE_INSTALL
+
+dnl _LTDL_MODE specific code must be called at least once:
+_LTDL_MODE_DISPATCH
+
+# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS
+# the user used.  This is so that ltdl.h can pick up the parent projects
+# config.h file, The first file in AC_CONFIG_HEADERS must contain the
+# definitions required by ltdl.c.
+# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility).
+AC_CONFIG_COMMANDS_PRE([dnl
+m4_pattern_allow([^LT_CONFIG_H$])dnl
+m4_ifset([AH_HEADER],
+    [LT_CONFIG_H=AH_HEADER],
+    [m4_ifset([AC_LIST_HEADERS],
+	    [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[      ]]*,,;s,[[ :]].*$,,'`],
+	[])])])
+AC_SUBST([LT_CONFIG_H])
+
+AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h],
+	[], [], [AC_INCLUDES_DEFAULT])
+
+AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])])
+AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])])
+
+m4_pattern_allow([LT_LIBEXT])dnl
+AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension])
+
+name=
+eval "lt_libprefix=\"$libname_spec\""
+m4_pattern_allow([LT_LIBPREFIX])dnl
+AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix])
+
+name=ltdl
+eval "LTDLOPEN=\"$libname_spec\""
+AC_SUBST([LTDLOPEN])
+])# _LTDL_SETUP
+
+
+# _LT_ENABLE_INSTALL
+# ------------------
+m4_define([_LT_ENABLE_INSTALL],
+[AC_ARG_ENABLE([ltdl-install],
+    [AS_HELP_STRING([--enable-ltdl-install], [install libltdl])])
+
+case ,${enable_ltdl_install},${enable_ltdl_convenience} in
+  *yes*) ;;
+  *) enable_ltdl_convenience=yes ;;
+esac
+
+m4_ifdef([AM_CONDITIONAL],
+[AM_CONDITIONAL(INSTALL_LTDL, test x"${enable_ltdl_install-no}" != xno)
+ AM_CONDITIONAL(CONVENIENCE_LTDL, test x"${enable_ltdl_convenience-no}" != xno)])
+])# _LT_ENABLE_INSTALL
+
+
+# LT_SYS_DLOPEN_DEPLIBS
+# ---------------------
+AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_CACHE_CHECK([whether deplibs are loaded by dlopen],
+  [lt_cv_sys_dlopen_deplibs],
+  [# PORTME does your system automatically load deplibs for dlopen?
+  # or its logical equivalent (e.g. shl_load for HP-UX < 11)
+  # For now, we just catch OSes we know something about -- in the
+  # future, we'll try test this programmatically.
+  lt_cv_sys_dlopen_deplibs=unknown
+  case $host_os in
+  aix3*|aix4.1.*|aix4.2.*)
+    # Unknown whether this is true for these versions of AIX, but
+    # we want this `case' here to explicitly catch those versions.
+    lt_cv_sys_dlopen_deplibs=unknown
+    ;;
+  aix[[4-9]]*)
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  amigaos*)
+    case $host_cpu in
+    powerpc)
+      lt_cv_sys_dlopen_deplibs=no
+      ;;
+    esac
+    ;;
+  darwin*)
+    # Assuming the user has installed a libdl from somewhere, this is true
+    # If you are looking for one http://www.opendarwin.org/projects/dlcompat
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  freebsd* | dragonfly*)
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    # GNU and its variants, using gnu ld.so (Glibc)
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  hpux10*|hpux11*)
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  interix*)
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  irix[[12345]]*|irix6.[[01]]*)
+    # Catch all versions of IRIX before 6.2, and indicate that we don't
+    # know how it worked for any of those versions.
+    lt_cv_sys_dlopen_deplibs=unknown
+    ;;
+  irix*)
+    # The case above catches anything before 6.2, and it's known that
+    # at 6.2 and later dlopen does load deplibs.
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  netbsd*)
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  openbsd*)
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  osf[[1234]]*)
+    # dlopen did load deplibs (at least at 4.x), but until the 5.x series,
+    # it did *not* use an RPATH in a shared library to find objects the
+    # library depends on, so we explicitly say `no'.
+    lt_cv_sys_dlopen_deplibs=no
+    ;;
+  osf5.0|osf5.0a|osf5.1)
+    # dlopen *does* load deplibs and with the right loader patch applied
+    # it even uses RPATH in a shared library to search for shared objects
+    # that the library depends on, but there's no easy way to know if that
+    # patch is installed.  Since this is the case, all we can really
+    # say is unknown -- it depends on the patch being installed.  If
+    # it is, this changes to `yes'.  Without it, it would be `no'.
+    lt_cv_sys_dlopen_deplibs=unknown
+    ;;
+  osf*)
+    # the two cases above should catch all versions of osf <= 5.1.  Read
+    # the comments above for what we know about them.
+    # At > 5.1, deplibs are loaded *and* any RPATH in a shared library
+    # is used to find them so we can finally say `yes'.
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  qnx*)
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  solaris*)
+    lt_cv_sys_dlopen_deplibs=yes
+    ;;
+  sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+    libltdl_cv_sys_dlopen_deplibs=yes
+    ;;
+  esac
+  ])
+if test "$lt_cv_sys_dlopen_deplibs" != yes; then
+ AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1],
+    [Define if the OS needs help to load dependent libraries for dlopen().])
+fi
+])# LT_SYS_DLOPEN_DEPLIBS
+
+# Old name:
+AU_ALIAS([AC_LTDL_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [])
+
+
+# LT_SYS_MODULE_EXT
+# -----------------
+AC_DEFUN([LT_SYS_MODULE_EXT],
+[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([which extension is used for runtime loadable modules],
+  [libltdl_cv_shlibext],
+[
+module=yes
+eval libltdl_cv_shlibext=$shrext_cmds
+  ])
+if test -n "$libltdl_cv_shlibext"; then
+  m4_pattern_allow([LT_MODULE_EXT])dnl
+  AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"],
+    [Define to the extension used for runtime loadable modules, say, ".so".])
+fi
+])# LT_SYS_MODULE_EXT
+
+# Old name:
+AU_ALIAS([AC_LTDL_SHLIBEXT], [LT_SYS_MODULE_EXT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_SHLIBEXT], [])
+
+
+# LT_SYS_MODULE_PATH
+# ------------------
+AC_DEFUN([LT_SYS_MODULE_PATH],
+[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([which variable specifies run-time module search path],
+  [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"])
+if test -n "$lt_cv_module_path_var"; then
+  m4_pattern_allow([LT_MODULE_PATH_VAR])dnl
+  AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"],
+    [Define to the name of the environment variable that determines the run-time module search path.])
+fi
+])# LT_SYS_MODULE_PATH
+
+# Old name:
+AU_ALIAS([AC_LTDL_SHLIBPATH], [LT_SYS_MODULE_PATH])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_SHLIBPATH], [])
+
+
+# LT_SYS_DLSEARCH_PATH
+# --------------------
+AC_DEFUN([LT_SYS_DLSEARCH_PATH],
+[m4_require([_LT_SYS_DYNAMIC_LINKER])dnl
+AC_CACHE_CHECK([for the default library search path],
+  [lt_cv_sys_dlsearch_path],
+  [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"])
+if test -n "$lt_cv_sys_dlsearch_path"; then
+  sys_dlsearch_path=
+  for dir in $lt_cv_sys_dlsearch_path; do
+    if test -z "$sys_dlsearch_path"; then
+      sys_dlsearch_path="$dir"
+    else
+      sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir"
+    fi
+  done
+  m4_pattern_allow([LT_DLSEARCH_PATH])dnl
+  AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"],
+    [Define to the system default library search path.])
+fi
+])# LT_SYS_DLSEARCH_PATH
+
+# Old name:
+AU_ALIAS([AC_LTDL_SYSSEARCHPATH], [LT_SYS_DLSEARCH_PATH])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [])
+
+
+# _LT_CHECK_DLPREOPEN
+# -------------------
+m4_defun([_LT_CHECK_DLPREOPEN],
+[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen],
+  [libltdl_cv_preloaded_symbols],
+  [if test -n "$lt_cv_sys_global_symbol_pipe"; then
+    libltdl_cv_preloaded_symbols=yes
+  else
+    libltdl_cv_preloaded_symbols=no
+  fi
+  ])
+if test x"$libltdl_cv_preloaded_symbols" = xyes; then
+  AC_DEFINE([HAVE_PRELOADED_SYMBOLS], [1],
+    [Define if libtool can extract symbol lists from object files.])
+fi
+])# _LT_CHECK_DLPREOPEN
+
+
+# LT_LIB_DLLOAD
+# -------------
+AC_DEFUN([LT_LIB_DLLOAD],
+[m4_pattern_allow([^LT_DLLOADERS$])
+LT_DLLOADERS=
+AC_SUBST([LT_DLLOADERS])
+
+AC_LANG_PUSH([C])
+
+LIBADD_DLOPEN=
+AC_SEARCH_LIBS([dlopen], [dl],
+	[AC_DEFINE([HAVE_LIBDL], [1],
+		   [Define if you have the libdl library or equivalent.])
+	if test "$ac_cv_search_dlopen" != "none required" ; then
+	  LIBADD_DLOPEN="-ldl"
+	fi
+	libltdl_cv_lib_dl_dlopen="yes"
+	LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"],
+    [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H
+#  include <dlfcn.h>
+#endif
+    ]], [[dlopen(0, 0);]])],
+	    [AC_DEFINE([HAVE_LIBDL], [1],
+		       [Define if you have the libdl library or equivalent.])
+	    libltdl_cv_func_dlopen="yes"
+	    LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"],
+	[AC_CHECK_LIB([svld], [dlopen],
+		[AC_DEFINE([HAVE_LIBDL], [1],
+			 [Define if you have the libdl library or equivalent.])
+	        LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes"
+		LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])])
+if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes
+then
+  lt_save_LIBS="$LIBS"
+  LIBS="$LIBS $LIBADD_DLOPEN"
+  AC_CHECK_FUNCS([dlerror])
+  LIBS="$lt_save_LIBS"
+fi
+AC_SUBST([LIBADD_DLOPEN])
+
+LIBADD_SHL_LOAD=
+AC_CHECK_FUNC([shl_load],
+	[AC_DEFINE([HAVE_SHL_LOAD], [1],
+		   [Define if you have the shl_load function.])
+	LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"],
+    [AC_CHECK_LIB([dld], [shl_load],
+	    [AC_DEFINE([HAVE_SHL_LOAD], [1],
+		       [Define if you have the shl_load function.])
+	    LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"
+	    LIBADD_SHL_LOAD="-ldld"])])
+AC_SUBST([LIBADD_SHL_LOAD])
+
+case $host_os in
+darwin[[1567]].*)
+# We only want this for pre-Mac OS X 10.4.
+  AC_CHECK_FUNC([_dyld_func_lookup],
+	[AC_DEFINE([HAVE_DYLD], [1],
+		   [Define if you have the _dyld_func_lookup function.])
+	LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"])
+  ;;
+beos*)
+  LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la"
+  ;;
+cygwin* | mingw* | os2* | pw32*)
+  AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include <sys/cygwin.h>]])
+  LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la"
+  ;;
+esac
+
+AC_CHECK_LIB([dld], [dld_link],
+	[AC_DEFINE([HAVE_DLD], [1],
+		   [Define if you have the GNU dld library.])
+		LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"])
+AC_SUBST([LIBADD_DLD_LINK])
+
+m4_pattern_allow([^LT_DLPREOPEN$])
+LT_DLPREOPEN=
+if test -n "$LT_DLLOADERS"
+then
+  for lt_loader in $LT_DLLOADERS; do
+    LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader "
+  done
+  AC_DEFINE([HAVE_LIBDLLOADER], [1],
+            [Define if libdlloader will be built on this platform])
+fi
+AC_SUBST([LT_DLPREOPEN])
+
+dnl This isn't used anymore, but set it for backwards compatibility
+LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD"
+AC_SUBST([LIBADD_DL])
+
+AC_LANG_POP
+])# LT_LIB_DLLOAD
+
+# Old name:
+AU_ALIAS([AC_LTDL_DLLIB], [LT_LIB_DLLOAD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_DLLIB], [])
+
+
+# LT_SYS_SYMBOL_USCORE
+# --------------------
+# does the compiler prefix global symbols with an underscore?
+AC_DEFUN([LT_SYS_SYMBOL_USCORE],
+[m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+AC_CACHE_CHECK([for _ prefix in compiled symbols],
+  [lt_cv_sys_symbol_underscore],
+  [lt_cv_sys_symbol_underscore=no
+  cat > conftest.$ac_ext <<_LT_EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+_LT_EOF
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    ac_nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+      # See whether the symbols have a leading underscore.
+      if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+        lt_cv_sys_symbol_underscore=yes
+      else
+        if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+	  :
+        else
+	  echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD
+        fi
+      fi
+    else
+      echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.c >&AS_MESSAGE_LOG_FD
+  fi
+  rm -rf conftest*
+  ])
+  sys_symbol_underscore=$lt_cv_sys_symbol_underscore
+  AC_SUBST([sys_symbol_underscore])
+])# LT_SYS_SYMBOL_USCORE
+
+# Old name:
+AU_ALIAS([AC_LTDL_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [])
+
+
+# LT_FUNC_DLSYM_USCORE
+# --------------------
+AC_DEFUN([LT_FUNC_DLSYM_USCORE],
+[AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl
+if test x"$lt_cv_sys_symbol_underscore" = xyes; then
+  if test x"$libltdl_cv_func_dlopen" = xyes ||
+     test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then
+	AC_CACHE_CHECK([whether we have to add an underscore for dlsym],
+	  [libltdl_cv_need_uscore],
+	  [libltdl_cv_need_uscore=unknown
+          save_LIBS="$LIBS"
+          LIBS="$LIBS $LIBADD_DLOPEN"
+	  _LT_TRY_DLOPEN_SELF(
+	    [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes],
+	    [],				 [libltdl_cv_need_uscore=cross])
+	  LIBS="$save_LIBS"
+	])
+  fi
+fi
+
+if test x"$libltdl_cv_need_uscore" = xyes; then
+  AC_DEFINE([NEED_USCORE], [1],
+    [Define if dlsym() requires a leading underscore in symbol names.])
+fi
+])# LT_FUNC_DLSYM_USCORE
+
+# Old name:
+AU_ALIAS([AC_LTDL_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LTDL_DLSYM_USCORE], [])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# Figure out how to run the assembler.                      -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_PROG_AS
+# ----------
+AC_DEFUN([AM_PROG_AS],
+[# By default we simply use the C compiler to build assembly code.
+AC_REQUIRE([AC_PROG_CC])
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+AC_ARG_VAR([CCAS],      [assembler compiler command (defaults to CC)])
+AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)])
+_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
+])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless `enable' is passed literally.
+# For symmetry, `disable' may be passed as well.  Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+       [enable], [m4_define([am_maintainer_other], [disable])],
+       [disable], [m4_define([am_maintainer_other], [enable])],
+       [m4_define([am_maintainer_other], [enable])
+        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles])
+  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+  AC_ARG_ENABLE([maintainer-mode],
+[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer],
+      [USE_MAINTAINER_MODE=$enableval],
+      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST([MAINT])dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_PROG_CC_C_O
+# --------------
+# Like AC_PROG_CC_C_O, but changed for automake.
+AC_DEFUN([AM_PROG_CC_C_O],
+[AC_REQUIRE([AC_PROG_CC_C_O])dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+# FIXME: we rely on the cache variable name because
+# there is no other way.
+set dummy $CC
+am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
+eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
+if test "$am_t" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+dnl Make sure AC_PROG_CC is never called again, or it will override our
+dnl setting of CC.
+m4_define([AC_PROG_CC],
+          [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/ax_cc_maxopt.m4])
+m4_include([m4/ax_cflags_warn_all.m4])
+m4_include([m4/ax_check_compiler_flags.m4])
+m4_include([m4/ax_compiler_vendor.m4])
+m4_include([m4/ax_configure_args.m4])
+m4_include([m4/ax_enable_builddir.m4])
+m4_include([m4/ax_gcc_archflag.m4])
+m4_include([m4/ax_gcc_x86_cpuid.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
+m4_include([acinclude.m4])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/build-ios.sh b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/build-ios.sh
new file mode 100755
index 0000000..3dea242
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/build-ios.sh
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+PLATFORM_IOS=/Developer/Platforms/iPhoneOS.platform/
+PLATFORM_IOS_SIM=/Developer/Platforms/iPhoneSimulator.platform/
+SDK_IOS_VERSION="4.2"
+MIN_IOS_VERSION="3.0"
+OUTPUT_DIR="universal-ios"
+
+build_target () {
+    local platform=$1
+    local sdk=$2
+    local arch=$3
+    local triple=$4
+    local builddir=$5
+
+    mkdir -p "${builddir}"
+    pushd "${builddir}"
+    export CC="${platform}"/Developer/usr/bin/gcc-4.2
+    export CFLAGS="-arch ${arch} -isysroot ${sdk} -miphoneos-version-min=${MIN_IOS_VERSION}"
+    ../configure --host=${triple} && make
+    popd
+}
+
+# Build all targets
+build_target "${PLATFORM_IOS}" "${PLATFORM_IOS}/Developer/SDKs/iPhoneOS${SDK_IOS_VERSION}.sdk/" armv6 arm-apple-darwin10 armv6-ios
+build_target "${PLATFORM_IOS}" "${PLATFORM_IOS}/Developer/SDKs/iPhoneOS${SDK_IOS_VERSION}.sdk/" armv7 arm-apple-darwin10 armv7-ios
+build_target "${PLATFORM_IOS_SIM}" "${PLATFORM_IOS_SIM}/Developer/SDKs/iPhoneSimulator${SDK_IOS_VERSION}.sdk/" i386 i386-apple-darwin10 i386-ios-sim
+
+# Create universal output directories
+mkdir -p "${OUTPUT_DIR}"
+mkdir -p "${OUTPUT_DIR}/include"
+mkdir -p "${OUTPUT_DIR}/include/armv6"
+mkdir -p "${OUTPUT_DIR}/include/armv7"
+mkdir -p "${OUTPUT_DIR}/include/i386"
+
+# Create the universal binary
+lipo -create armv6-ios/.libs/libffi.a armv7-ios/.libs/libffi.a i386-ios-sim/.libs/libffi.a -output "${OUTPUT_DIR}/libffi.a"
+
+# Copy in the headers
+copy_headers () {
+    local src=$1
+    local dest=$2
+
+    # Fix non-relative header reference
+    sed 's/<ffitarget.h>/"ffitarget.h"/' < "${src}/include/ffi.h" > "${dest}/ffi.h"
+    cp "${src}/include/ffitarget.h" "${dest}"
+}
+
+copy_headers armv6-ios "${OUTPUT_DIR}/include/armv6"
+copy_headers armv7-ios "${OUTPUT_DIR}/include/armv7"
+copy_headers i386-ios-sim "${OUTPUT_DIR}/include/i386"
+
+# Create top-level header
+(
+cat << EOF
+#ifdef __arm__
+  #include <arm/arch.h>
+  #ifdef _ARM_ARCH_6
+    #include "include/armv6/ffi.h"
+  #elif _ARM_ARCH_7
+    #include "include/armv7/ffi.h"
+  #endif
+#elif defined(__i386__)
+  #include "include/i386/ffi.h"
+#endif
+EOF
+) > "${OUTPUT_DIR}/ffi.h"
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/compile b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/compile
new file mode 100755
index 0000000..c0096a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/compile
@@ -0,0 +1,143 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2009-10-06.20; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009  Free Software
+# Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# 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 2, 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 <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand `-c -o'.
+Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file `INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as `compile cc -o foo foo.c'.
+	# So we strip `-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no `-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # `.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use `[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.guess b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.guess
new file mode 100755
index 0000000..dc84c68
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.guess
@@ -0,0 +1,1501 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+#   Free Software Foundation, Inc.
+
+timestamp='2009-11-20'
+
+# This file 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner.  Please send patches (context
+# diff format) to <config-patches@gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[456])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	LIBC=gnu
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    i386)
+		eval $set_cc_for_build
+		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		      grep IS_64BIT_ARCH >/dev/null
+		  then
+		      UNAME_PROCESSOR="x86_64"
+		  fi
+		fi ;;
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.sub b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.sub
new file mode 100755
index 0000000..2a55a50
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/config.sub
@@ -0,0 +1,1705 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+#   Free Software Foundation, Inc.
+
+timestamp='2009-11-20'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze)
+		os=
+		basic_machine=$1
+		;;
+        -bluegene*)
+	        os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+        microblaze)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+        -auroraux)
+	        os=-auroraux
+		;;
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+        mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure
new file mode 100755
index 0000000..231c83a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure
@@ -0,0 +1,17191 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for libffi 3.0.10.
+#
+# Report bugs to <http://sourceware.org/libffi.html>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=-vx ;;
+	  *v* ) as_opts=-v ;;
+	  *x* ) as_opts=-x ;;
+	  * ) as_opts= ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: http://sourceware.org/libffi.html about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='libffi'
+PACKAGE_TARNAME='libffi'
+PACKAGE_VERSION='3.0.10'
+PACKAGE_STRING='libffi 3.0.10'
+PACKAGE_BUGREPORT='http://sourceware.org/libffi.html'
+PACKAGE_URL=''
+
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+toolexeclibdir
+toolexecdir
+FFI_DEBUG_FALSE
+FFI_DEBUG_TRUE
+TARGETDIR
+TARGET
+FFI_EXEC_TRAMPOLINE_TABLE
+FFI_EXEC_TRAMPOLINE_TABLE_FALSE
+FFI_EXEC_TRAMPOLINE_TABLE_TRUE
+sys_symbol_underscore
+HAVE_LONG_DOUBLE
+ALLOCA
+PA64_HPUX_FALSE
+PA64_HPUX_TRUE
+PA_HPUX_FALSE
+PA_HPUX_TRUE
+PA_LINUX_FALSE
+PA_LINUX_TRUE
+SH64_FALSE
+SH64_TRUE
+SH_FALSE
+SH_TRUE
+X86_64_FALSE
+X86_64_TRUE
+S390_FALSE
+S390_TRUE
+FRV_FALSE
+FRV_TRUE
+LIBFFI_CRIS_FALSE
+LIBFFI_CRIS_TRUE
+AVR32_FALSE
+AVR32_TRUE
+ARM_FALSE
+ARM_TRUE
+POWERPC_FREEBSD_FALSE
+POWERPC_FREEBSD_TRUE
+POWERPC_DARWIN_FALSE
+POWERPC_DARWIN_TRUE
+POWERPC_AIX_FALSE
+POWERPC_AIX_TRUE
+POWERPC_FALSE
+POWERPC_TRUE
+MOXIE_FALSE
+MOXIE_TRUE
+M68K_FALSE
+M68K_TRUE
+M32R_FALSE
+M32R_TRUE
+IA64_FALSE
+IA64_TRUE
+ALPHA_FALSE
+ALPHA_TRUE
+X86_DARWIN_FALSE
+X86_DARWIN_TRUE
+X86_WIN64_FALSE
+X86_WIN64_TRUE
+X86_WIN32_FALSE
+X86_WIN32_TRUE
+X86_FREEBSD_FALSE
+X86_FREEBSD_TRUE
+X86_FALSE
+X86_TRUE
+SPARC_FALSE
+SPARC_TRUE
+MIPS_FALSE
+MIPS_TRUE
+AM_LTLDFLAGS
+AM_RUNTESTFLAGS
+TESTSUBDIR_FALSE
+TESTSUBDIR_TRUE
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+PRTDIAG
+CPP
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+LIBTOOL
+am__fastdepCCAS_FALSE
+am__fastdepCCAS_TRUE
+CCASDEPMODE
+CCASFLAGS
+CCAS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+ax_enable_builddir_sed
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_builddir
+enable_dependency_tracking
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_portable_binary
+with_gcc_arch
+enable_maintainer_mode
+enable_debug
+enable_structs
+enable_raw_api
+enable_purify_safety
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CCAS
+CCASFLAGS
+CPP
+CPPFLAGS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures libffi 3.0.10 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/libffi]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+  --target=TARGET   configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of libffi 3.0.10:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-builddir      disable automatic build in subdir of sources
+
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+  --enable-portable-binary
+                          disable compiler optimizations that would produce
+                          unportable binaries
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer
+  --enable-debug          debugging mode
+  --disable-structs       omit code for struct support
+  --disable-raw-api       make the raw api unavailable
+  --enable-purify-safety  purify-safe mode
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic              try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot=DIR Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).
+  --with-gcc-arch=<arch>  use architecture <arch> for gcc -march/-mtune,
+                          instead of guessing
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CCAS        assembler compiler command (defaults to CC)
+  CCASFLAGS   assembler compiler flags (defaults to CFLAGS)
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <http://sourceware.org/libffi.html>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+libffi configure 3.0.10
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------------------------ ##
+## Report this to http://sourceware.org/libffi.html ##
+## ------------------------------------------------ ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+  ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+  fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by libffi $as_me 3.0.10, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_config_headers="$ac_config_headers fficonfig.h"
+
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if ${ac_cv_target+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+
+target_alias=${target_alias-$host_alias}
+
+. ${srcdir}/configure.host
+
+
+   # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args
+   if test "${ac_configure_args+set}" != "set" ; then
+      ac_configure_args=
+      for ac_arg in ${1+"$@"}; do
+         ac_configure_args="$ac_configure_args '$ac_arg'"
+      done
+   fi
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+
+ax_enable_builddir="."
+# Check whether --enable-builddir was given.
+if test "${enable_builddir+set}" = set; then :
+  enableval=$enable_builddir; ax_enable_builddir="$enableval"
+else
+  ax_enable_builddir="auto"
+fi
+
+if test ".$ac_srcdir_defaulted" != ".no" ; then
+if test ".$srcdir" = ".." ; then
+  if test -f config.status ; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: toplevel srcdir already configured... skipping subdir build" >&5
+$as_echo "$as_me: toplevel srcdir already configured... skipping subdir build" >&6;}
+  else
+    test ".$ax_enable_builddir" = "."  && ax_enable_builddir="."
+    test ".$ax_enable_builddir" = ".no"  && ax_enable_builddir="."
+    test ".$TARGET" = "." && TARGET="$target"
+    test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="$TARGET"
+    if test ".$ax_enable_builddir" != ".." ; then    # we know where to go and
+      as_dir=$ax_enable_builddir; as_fn_mkdir_p
+      echo __.$ax_enable_builddir.__ > $ax_enable_builddir/conftest.tmp
+      cd $ax_enable_builddir
+      if grep __.$ax_enable_builddir.__ conftest.tmp >/dev/null 2>/dev/null ; then
+        rm conftest.tmp
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: continue configure in default builddir \"./$ax_enable_builddir\"" >&5
+$as_echo "continue configure in default builddir \"./$ax_enable_builddir\"" >&6; }
+      else
+        as_fn_error $? "could not change to default builddir \"./$ax_enable_builddir\"" "$LINENO" 5
+      fi
+      srcdir=`echo "$ax_enable_builddir" |
+              sed -e 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g;s,[/]$,,;'`
+      # going to restart from subdirectory location
+      test -f $srcdir/config.log   && mv $srcdir/config.log   .
+      test -f $srcdir/confdefs.h   && mv $srcdir/confdefs.h   .
+      test -f $srcdir/conftest.log && mv $srcdir/conftest.log .
+      test -f $srcdir/$cache_file  && mv $srcdir/$cache_file  .
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: ....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&5
+$as_echo "....exec $SHELL $srcdir/$0 \"--srcdir=$srcdir\" \"--enable-builddir=$ax_enable_builddir\" ${1+\"$@\"}" >&6; }
+      case "$0" in # restart
+       /\\*) eval $SHELL "'$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;;
+       *) eval $SHELL "'$srcdir/$0'" "'--srcdir=$srcdir'" "'--enable-builddir=$ax_enable_builddir'" $ac_configure_args ;;
+      esac ; exit $?
+    fi
+  fi
+fi fi
+test ".$ax_enable_builddir" = ".auto" && ax_enable_builddir="."
+# Extract the first word of "gsed sed", so it can be a program name with args.
+set dummy gsed sed; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ax_enable_builddir_sed+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ax_enable_builddir_sed in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ax_enable_builddir_sed="$ax_enable_builddir_sed" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ax_enable_builddir_sed="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_ax_enable_builddir_sed" && ac_cv_path_ax_enable_builddir_sed="sed"
+  ;;
+esac
+fi
+ax_enable_builddir_sed=$ac_cv_path_ax_enable_builddir_sed
+if test -n "$ax_enable_builddir_sed"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_enable_builddir_sed" >&5
+$as_echo "$ax_enable_builddir_sed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ax_enable_builddir_auxdir="$am_aux_dir"
+ac_config_commands="$ac_config_commands buildir"
+
+
+am__api_version='1.11'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='libffi'
+ VERSION='3.0.10'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+# The same as in boehm-gc and libstdc++. Have to borrow it from there.
+# We must force CC to /not/ be precious variables; otherwise
+# the wrong, non-multilib-adjusted value will be used in multilibs.
+# As a side effect, we have to subst CFLAGS ourselves.
+# Also save and restore CFLAGS, since AC_PROG_CC will come up with
+# defaults of its own if none are provided.
+
+
+
+save_CFLAGS=$CFLAGS
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+CFLAGS=$save_CFLAGS
+
+
+
+
+
+# By default we simply use the C compiler to build assembly code.
+
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+
+
+
+depcc="$CCAS"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CCAS_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CCAS_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CCAS_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CCAS_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; }
+CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then
+  am__fastdepCCAS_TRUE=
+  am__fastdepCCAS_FALSE='#'
+else
+  am__fastdepCCAS_TRUE='#'
+  am__fastdepCCAS_FALSE=
+fi
+
+
+if test "x$CC" != xcc; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
+$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
+$as_echo_n "checking whether cc understands -c and -o together... " >&6; }
+fi
+set dummy $CC; ac_cc=`$as_echo "$2" |
+		      sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
+if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+# Make sure it works both with $CC and with simple cc.
+# We do the test twice because some compilers refuse to overwrite an
+# existing .o file with -o, though they will create one.
+ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+rm -f conftest2.*
+if { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } &&
+   test -f conftest2.$ac_objext && { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; };
+then
+  eval ac_cv_prog_cc_${ac_cc}_c_o=yes
+  if test "x$CC" != xcc; then
+    # Test first that cc exists at all.
+    if { ac_try='cc -c conftest.$ac_ext >&5'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+      ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+      rm -f conftest2.*
+      if { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } &&
+	 test -f conftest2.$ac_objext && { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; };
+      then
+	# cc works too.
+	:
+      else
+	# cc exists but doesn't like -o.
+	eval ac_cv_prog_cc_${ac_cc}_c_o=no
+      fi
+    fi
+  fi
+else
+  eval ac_cv_prog_cc_${ac_cc}_c_o=no
+fi
+rm -f core conftest*
+
+fi
+if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h
+
+fi
+
+# FIXME: we rely on the cache variable name because
+# there is no other way.
+set dummy $CC
+am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
+eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
+if test "$am_t" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4'
+macro_revision='1.3293'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; pic_mode="$withval"
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      lt_prog_compiler_pic='-Xcompiler -fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ F* | *Sun*Fortran*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_flag_spec_ld=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec=
+	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_flag_spec_ld='+b $libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5
+$as_echo_n "checking for C compiler vendor... " >&6; }
+if ${ax_cv_c_compiler_vendor+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ax_cv_c_compiler_vendor=unknown
+  # note: don't check for gcc first since some other compilers define __GNUC__
+  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
+    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+#if !($vencpp)
+      thisisanerror;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ax_cv_c_compiler_vendor=`echo $ventest | cut -d: -f1`; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5
+$as_echo "$ax_cv_c_compiler_vendor" >&6; }
+
+
+
+
+
+
+# Check whether --enable-portable-binary was given.
+if test "${enable_portable_binary+set}" = set; then :
+  enableval=$enable_portable_binary; acx_maxopt_portable=$withval
+else
+  acx_maxopt_portable=no
+fi
+
+
+# Try to determine "good" native compiler flags if none specified via CFLAGS
+if test "$ac_test_CFLAGS" != "set"; then
+  CFLAGS=""
+  case $ax_cv_c_compiler_vendor in
+    dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
+	 if test "x$acx_maxopt_portable" = xno; then
+           CFLAGS="$CFLAGS -arch host"
+         fi;;
+
+    sun) CFLAGS="-native -fast -xO5 -dalign"
+	 if test "x$acx_maxopt_portable" = xyes; then
+	   CFLAGS="$CFLAGS -xarch=generic"
+         fi;;
+
+    hp)  CFLAGS="+Oall +Optrs_ansi +DSnative"
+	 if test "x$acx_maxopt_portable" = xyes; then
+	   CFLAGS="$CFLAGS +DAportable"
+	 fi;;
+
+    ibm) if test "x$acx_maxopt_portable" = xno; then
+           xlc_opt="-qarch=auto -qtune=auto"
+	 else
+           xlc_opt="-qtune=auto"
+	 fi
+          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $xlc_opt" >&5
+$as_echo_n "checking whether C compiler accepts $xlc_opt... " >&6; }
+ax_save_FLAGS=$CFLAGS
+   CFLAGS="$xlc_opt"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=yes
+else
+  eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   CFLAGS=$ax_save_FLAGS
+eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
+$as_echo "$ax_check_compiler_flags" >&6; }
+if test "x$ax_check_compiler_flags" = xyes; then
+	CFLAGS="-O3 -qansialias -w $xlc_opt"
+else
+	CFLAGS="-O3 -qansialias -w"
+                echo "******************************************************"
+                echo "*  You seem to have the IBM  C compiler.  It is      *"
+                echo "*  recommended for best performance that you use:    *"
+                echo "*                                                    *"
+                echo "*    CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
+                echo "*                      ^^^        ^^^                *"
+                echo "*  where xxx is pwr2, pwr3, 604, or whatever kind of *"
+                echo "*  CPU you have.  (Set the CFLAGS environment var.   *"
+                echo "*  and re-run configure.)  For more info, man cc.    *"
+                echo "******************************************************"
+fi
+
+         ;;
+
+    intel) CFLAGS="-O3 -ansi_alias"
+	if test "x$acx_maxopt_portable" = xno; then
+	  icc_archflag=unknown
+	  icc_flags=""
+	  case $host_cpu in
+	    i686*|x86_64*)
+              # icc accepts gcc assembly syntax, so these should work:
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
+$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
+if ${ax_cv_gcc_x86_cpuid_0+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ax_cv_gcc_x86_cpuid_0=unknown
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+
+     int op = 0, eax, ebx, ecx, edx;
+     FILE *f;
+      __asm__("cpuid"
+        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+        : "a" (op));
+     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+     fclose(f);
+     return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
+else
+  ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
+$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
+$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
+if ${ax_cv_gcc_x86_cpuid_1+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ax_cv_gcc_x86_cpuid_1=unknown
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+
+     int op = 1, eax, ebx, ecx, edx;
+     FILE *f;
+      __asm__("cpuid"
+        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+        : "a" (op));
+     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+     fclose(f);
+     return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
+else
+  ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
+$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+	      case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
+                *:756e6547:*:*) # Intel
+                  case $ax_cv_gcc_x86_cpuid_1 in
+                    *6a?:*[234]:*:*|*6[789b]?:*:*:*) icc_flags="-xK";;
+                    *f3[347]:*:*:*|*f41347:*:*:*) icc_flags="-xP -xN -xW -xK";;
+                    *f??:*:*:*) icc_flags="-xN -xW -xK";;
+                  esac ;;
+              esac ;;
+          esac
+          if test "x$icc_flags" != x; then
+            for flag in $icc_flags; do
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
+ax_save_FLAGS=$CFLAGS
+   CFLAGS="$flag"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes
+else
+  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   CFLAGS=$ax_save_FLAGS
+eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
+$as_echo "$ax_check_compiler_flags" >&6; }
+if test "x$ax_check_compiler_flags" = xyes; then
+	icc_archflag=$flag; break
+else
+	:
+fi
+
+            done
+          fi
+          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc architecture flag" >&5
+$as_echo_n "checking for icc architecture flag... " >&6; }
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $icc_archflag" >&5
+$as_echo "$icc_archflag" >&6; }
+          if test "x$icc_archflag" != xunknown; then
+            CFLAGS="$CFLAGS $icc_archflag"
+          fi
+        fi
+	;;
+
+    gnu)
+     # default optimization flags for gcc on all systems
+     CFLAGS="-O3 -fomit-frame-pointer"
+
+     #  -fstrict-aliasing for gcc-2.95+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5
+$as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; }
+if ${ax_cv_c_flags__fstrict_aliasing+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+      ax_save_FLAGS=$CFLAGS
+      CFLAGS="-fstrict-aliasing"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ax_cv_c_flags__fstrict_aliasing=yes
+else
+  ax_cv_c_flags__fstrict_aliasing=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      CFLAGS=$ax_save_FLAGS
+fi
+
+eval ax_check_compiler_flags=$ax_cv_c_flags__fstrict_aliasing
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
+$as_echo "$ax_check_compiler_flags" >&6; }
+if test "x$ax_check_compiler_flags" = xyes; then
+	CFLAGS="$CFLAGS -fstrict-aliasing"
+else
+	:
+fi
+
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -ffast-math" >&5
+$as_echo_n "checking whether C compiler accepts -ffast-math... " >&6; }
+if ${ax_cv_c_flags__ffast_math+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+      ax_save_FLAGS=$CFLAGS
+      CFLAGS="-ffast-math"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ax_cv_c_flags__ffast_math=yes
+else
+  ax_cv_c_flags__ffast_math=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      CFLAGS=$ax_save_FLAGS
+fi
+
+eval ax_check_compiler_flags=$ax_cv_c_flags__ffast_math
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
+$as_echo "$ax_check_compiler_flags" >&6; }
+if test "x$ax_check_compiler_flags" = xyes; then
+	CFLAGS="$CFLAGS -ffast-math"
+else
+	:
+fi
+
+
+
+
+
+
+# Check whether --with-gcc-arch was given.
+if test "${with_gcc_arch+set}" = set; then :
+  withval=$with_gcc_arch; ax_gcc_arch=$withval
+else
+  ax_gcc_arch=yes
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
+$as_echo_n "checking for gcc architecture flag... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+if ${ax_cv_gcc_archflag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+ax_cv_gcc_archflag="unknown"
+
+if test "$GCC" = yes; then
+
+if test "x$ax_gcc_arch" = xyes; then
+ax_gcc_arch=""
+if test "$cross_compiling" = no; then
+case $host_cpu in
+  i[3456]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
+$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
+if ${ax_cv_gcc_x86_cpuid_0+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ax_cv_gcc_x86_cpuid_0=unknown
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+
+     int op = 0, eax, ebx, ecx, edx;
+     FILE *f;
+      __asm__("cpuid"
+        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+        : "a" (op));
+     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+     fclose(f);
+     return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
+else
+  ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
+$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
+$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
+if ${ax_cv_gcc_x86_cpuid_1+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ax_cv_gcc_x86_cpuid_1=unknown
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+
+     int op = 1, eax, ebx, ecx, edx;
+     FILE *f;
+      __asm__("cpuid"
+        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+        : "a" (op));
+     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+     fclose(f);
+     return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
+else
+  ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
+$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+     case $ax_cv_gcc_x86_cpuid_0 in
+       *:756e6547:*:*) # Intel
+          case $ax_cv_gcc_x86_cpuid_1 in
+	    *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
+	    *5??:*:*:*) ax_gcc_arch=pentium ;;
+	    *6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
+	    *6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
+	    *6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
+	    *6[9d]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
+	    *6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
+	    *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
+            *f3[347]:*:*:*|*f41347:*:*:*)
+		case $host_cpu in
+                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
+                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
+                esac ;;
+            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
+          esac ;;
+       *:68747541:*:*) # AMD
+          case $ax_cv_gcc_x86_cpuid_1 in
+	    *5[67]?:*:*:*) ax_gcc_arch=k6 ;;
+	    *5[8d]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
+	    *5[9]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
+	    *60?:*:*:*) ax_gcc_arch=k7 ;;
+	    *6[12]?:*:*:*) ax_gcc_arch="athlon k7" ;;
+	    *6[34]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
+	    *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
+	    *6[68a]?:*:*:*)
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x80000006 output" >&5
+$as_echo_n "checking for x86 cpuid 0x80000006 output... " >&6; }
+if ${ax_cv_gcc_x86_cpuid_0x80000006+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ax_cv_gcc_x86_cpuid_0x80000006=unknown
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+
+     int op = 0x80000006, eax, ebx, ecx, edx;
+     FILE *f;
+      __asm__("cpuid"
+        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+        : "a" (op));
+     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+     fclose(f);
+     return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ax_cv_gcc_x86_cpuid_0x80000006=`cat conftest_cpuid`; rm -f conftest_cpuid
+else
+  ax_cv_gcc_x86_cpuid_0x80000006=unknown; rm -f conftest_cpuid
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x80000006" >&5
+$as_echo "$ax_cv_gcc_x86_cpuid_0x80000006" >&6; }
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ # L2 cache size
+	       case $ax_cv_gcc_x86_cpuid_0x80000006 in
+                 *:*:*[1-9a-f]??????:*) # (L2 = ecx >> 16) >= 256
+			ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
+                 *) ax_gcc_arch="athlon-4 athlon k7" ;;
+	       esac ;;
+	    *f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
+	    *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
+	    *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
+	    *f??:*:*:*) ax_gcc_arch="k8" ;;
+          esac ;;
+	*:746e6543:*:*) # IDT
+	   case $ax_cv_gcc_x86_cpuid_1 in
+	     *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
+	     *58?:*:*:*) ax_gcc_arch=winchip2 ;;
+	     *6[78]?:*:*:*) ax_gcc_arch=c3 ;;
+	     *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
+	   esac ;;
+     esac
+     if test x"$ax_gcc_arch" = x; then # fallback
+	case $host_cpu in
+	  i586*) ax_gcc_arch=pentium ;;
+	  i686*) ax_gcc_arch=pentiumpro ;;
+        esac
+     fi
+     ;;
+
+  sparc*)
+     # Extract the first word of "prtdiag", so it can be a program name with args.
+set dummy prtdiag; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PRTDIAG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PRTDIAG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PRTDIAG="$PRTDIAG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PRTDIAG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_PRTDIAG" && ac_cv_path_PRTDIAG="prtdiag"
+  ;;
+esac
+fi
+PRTDIAG=$ac_cv_path_PRTDIAG
+if test -n "$PRTDIAG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRTDIAG" >&5
+$as_echo "$PRTDIAG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+     cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
+     cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
+     case $cputype in
+         *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
+         *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
+         *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
+         *supersparc*|*tms390z5[05]*) ax_gcc_arch="supersparc v8" ;;
+         *hypersparc*|*rt62[056]*) ax_gcc_arch="hypersparc v8" ;;
+         *cypress*) ax_gcc_arch=cypress ;;
+     esac ;;
+
+  alphaev5) ax_gcc_arch=ev5 ;;
+  alphaev56) ax_gcc_arch=ev56 ;;
+  alphapca56) ax_gcc_arch="pca56 ev56" ;;
+  alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
+  alphaev6) ax_gcc_arch=ev6 ;;
+  alphaev67) ax_gcc_arch=ev67 ;;
+  alphaev68) ax_gcc_arch="ev68 ev67" ;;
+  alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
+  alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
+  alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
+
+  powerpc*)
+     cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
+     cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
+     case $cputype in
+       *750*) ax_gcc_arch="750 G3" ;;
+       *740[0-9]*) ax_gcc_arch="$cputype 7400 G4" ;;
+       *74[4-5][0-9]*) ax_gcc_arch="$cputype 7450 G4" ;;
+       *74[0-9][0-9]*) ax_gcc_arch="$cputype G4" ;;
+       *970*) ax_gcc_arch="970 G5 power4";;
+       *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
+       *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
+       603ev|8240) ax_gcc_arch="$cputype 603e 603";;
+       *) ax_gcc_arch=$cputype ;;
+     esac
+     ax_gcc_arch="$ax_gcc_arch powerpc"
+     ;;
+esac
+fi # not cross-compiling
+fi # guess arch
+
+if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
+for arch in $ax_gcc_arch; do
+  if test "x$acx_maxopt_portable" = xyes; then # if we require portable code
+    flags="-mtune=$arch"
+    # -mcpu=$arch and m$arch generate nonportable code on every arch except
+    # x86.  And some other arches (e.g. Alpha) don't accept -mtune.  Grrr.
+    case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
+  else
+    flags="-march=$arch -mcpu=$arch -m$arch"
+  fi
+  for flag in $flags; do
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
+ax_save_FLAGS=$CFLAGS
+   CFLAGS="$flag"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes
+else
+  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   CFLAGS=$ax_save_FLAGS
+eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
+$as_echo "$ax_check_compiler_flags" >&6; }
+if test "x$ax_check_compiler_flags" = xyes; then
+	ax_cv_gcc_archflag=$flag; break
+else
+	:
+fi
+
+  done
+  test "x$ax_cv_gcc_archflag" = xunknown || break
+done
+fi
+
+fi # $GCC=yes
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
+$as_echo_n "checking for gcc architecture flag... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_archflag" >&5
+$as_echo "$ax_cv_gcc_archflag" >&6; }
+if test "x$ax_cv_gcc_archflag" = xunknown; then
+  :
+else
+  CFLAGS="$CFLAGS $ax_cv_gcc_archflag"
+fi
+
+     ;;
+  esac
+
+  if test -z "$CFLAGS"; then
+	echo ""
+	echo "********************************************************"
+        echo "* WARNING: Don't know the best CFLAGS for this system  *"
+        echo "* Use ./configure CFLAGS=... to specify your own flags *"
+	echo "* (otherwise, a default of CFLAGS=-O3 will be used)    *"
+	echo "********************************************************"
+	echo ""
+        CFLAGS="-O3"
+  fi
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CFLAGS" >&5
+$as_echo_n "checking whether C compiler accepts $CFLAGS... " >&6; }
+ax_save_FLAGS=$CFLAGS
+   CFLAGS="$CFLAGS"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=yes
+else
+  eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   CFLAGS=$ax_save_FLAGS
+eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
+$as_echo "$ax_check_compiler_flags" >&6; }
+if test "x$ax_check_compiler_flags" = xyes; then
+	:
+else
+
+	echo ""
+        echo "********************************************************"
+        echo "* WARNING: The guessed CFLAGS don't seem to work with  *"
+        echo "* your compiler.                                       *"
+        echo "* Use ./configure CFLAGS=... to specify your own flags *"
+        echo "********************************************************"
+        echo ""
+        CFLAGS=""
+
+fi
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for maximum warnings" >&5
+$as_echo_n "checking CFLAGS for maximum warnings... " >&6; }
+if ${ac_cv_cflags_warn_all+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_cflags_warn_all="no, unknown"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ ac_save_CFLAGS="$CFLAGS"
+for ac_arg in "-pedantic  % -Wall"          "-xstrconst % -v"             "-std1      % -verbose -w0 -warnprotos"    "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd"    "-ansi -ansiE % -fullwarn"    "+ESlit     % +w1"            "-Xc        % -pvctl,fullmsg"    "-h conform % -h msglevel 2"    #
+do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_cflags_warn_all=`echo $ac_arg | sed -e 's,.*% *,,'` ; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+ CFLAGS="$ac_save_CFLAGS"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_warn_all" >&5
+$as_echo "$ac_cv_cflags_warn_all" >&6; }
+case ".$ac_cv_cflags_warn_all" in
+     .ok|.ok,*)  ;;
+   .|.no|.no,*)
+ ;;
+   *)
+   if echo " $CFLAGS " | grep " $ac_cv_cflags_warn_all " 2>&1 >/dev/null
+   then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$ac_cv_cflags_warn_all"; } >&5
+  (: CFLAGS does contain $ac_cv_cflags_warn_all) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+   else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$ac_cv_cflags_warn_all\""; } >&5
+  (: CFLAGS="$CFLAGS $ac_cv_cflags_warn_all") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+                      CFLAGS="$CFLAGS $ac_cv_cflags_warn_all"
+   fi
+ ;;
+esac
+
+if test "x$GCC" = "xyes"; then
+  CFLAGS="$CFLAGS -fexceptions"
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=no
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+   if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+for ac_header in sys/mman.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_mman_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_MMAN_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_func in mmap
+do :
+  ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
+if test "x$ac_cv_func_mmap" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_MMAP 1
+_ACEOF
+
+fi
+done
+
+
+ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_mman_h" = xyes; then :
+  libffi_header_sys_mman_h=yes
+else
+  libffi_header_sys_mman_h=no
+fi
+
+
+ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
+if test "x$ac_cv_func_mmap" = xyes; then :
+  libffi_func_mmap=yes
+else
+  libffi_func_mmap=no
+fi
+
+if test "$libffi_header_sys_mman_h" != yes \
+ || test "$libffi_func_mmap" != yes; then
+   ac_cv_func_mmap_file=no
+   ac_cv_func_mmap_dev_zero=no
+   ac_cv_func_mmap_anon=no
+else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether read-only mmap of a plain file works" >&5
+$as_echo_n "checking whether read-only mmap of a plain file works... " >&6; }
+if ${ac_cv_func_mmap_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # Add a system to this blacklist if
+   # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a
+   # memory area containing the same data that you'd get if you applied
+   # read() to the same fd.  The only system known to have a problem here
+   # is VMS, where text files have record structure.
+   case "$host_os" in
+     vms* | ultrix*)
+	ac_cv_func_mmap_file=no ;;
+     *)
+	ac_cv_func_mmap_file=yes;;
+   esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_file" >&5
+$as_echo "$ac_cv_func_mmap_file" >&6; }
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap from /dev/zero works" >&5
+$as_echo_n "checking whether mmap from /dev/zero works... " >&6; }
+if ${ac_cv_func_mmap_dev_zero+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # Add a system to this blacklist if it has mmap() but /dev/zero
+   # does not exist, or if mmapping /dev/zero does not give anonymous
+   # zeroed pages with both the following properties:
+   # 1. If you map N consecutive pages in with one call, and then
+   #    unmap any subset of those pages, the pages that were not
+   #    explicitly unmapped remain accessible.
+   # 2. If you map two adjacent blocks of memory and then unmap them
+   #    both at once, they must both go away.
+   # Systems known to be in this category are Windows (all variants),
+   # VMS, and Darwin.
+   case "$host_os" in
+     vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00)
+	ac_cv_func_mmap_dev_zero=no ;;
+     *)
+	ac_cv_func_mmap_dev_zero=yes;;
+   esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_dev_zero" >&5
+$as_echo "$ac_cv_func_mmap_dev_zero" >&6; }
+
+   # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for.
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANON(YMOUS)" >&5
+$as_echo_n "checking for MAP_ANON(YMOUS)... " >&6; }
+if ${ac_cv_decl_map_anon+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#ifndef MAP_ANONYMOUS
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+
+int
+main ()
+{
+int n = MAP_ANONYMOUS;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_decl_map_anon=yes
+else
+  ac_cv_decl_map_anon=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_map_anon" >&5
+$as_echo "$ac_cv_decl_map_anon" >&6; }
+
+   if test $ac_cv_decl_map_anon = no; then
+     ac_cv_func_mmap_anon=no
+   else
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap with MAP_ANON(YMOUS) works" >&5
+$as_echo_n "checking whether mmap with MAP_ANON(YMOUS) works... " >&6; }
+if ${ac_cv_func_mmap_anon+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # Add a system to this blacklist if it has mmap() and MAP_ANON or
+   # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
+   # doesn't give anonymous zeroed pages with the same properties listed
+   # above for use of /dev/zero.
+   # Systems known to be in this category are Windows, VMS, and SCO Unix.
+   case "$host_os" in
+     vms* | cygwin* | pe | mingw* | sco* | udk* )
+	ac_cv_func_mmap_anon=no ;;
+     *)
+	ac_cv_func_mmap_anon=yes;;
+   esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_anon" >&5
+$as_echo "$ac_cv_func_mmap_anon" >&6; }
+   fi
+fi
+
+if test $ac_cv_func_mmap_file = yes; then
+
+$as_echo "#define HAVE_MMAP_FILE 1" >>confdefs.h
+
+fi
+if test $ac_cv_func_mmap_dev_zero = yes; then
+
+$as_echo "#define HAVE_MMAP_DEV_ZERO 1" >>confdefs.h
+
+fi
+if test $ac_cv_func_mmap_anon = yes; then
+
+$as_echo "#define HAVE_MMAP_ANON 1" >>confdefs.h
+
+fi
+
+
+ if test -d $srcdir/testsuite; then
+  TESTSUBDIR_TRUE=
+  TESTSUBDIR_FALSE='#'
+else
+  TESTSUBDIR_TRUE='#'
+  TESTSUBDIR_FALSE=
+fi
+
+
+TARGETDIR="unknown"
+case "$host" in
+  alpha*-*-*)
+	TARGET=ALPHA; TARGETDIR=alpha;
+	# Support 128-bit long double, changeable via command-line switch.
+	HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)'
+	;;
+
+  arm*-*-*)
+	TARGET=ARM; TARGETDIR=arm
+	;;
+
+  amd64-*-freebsd* | amd64-*-openbsd*)
+	TARGET=X86_64; TARGETDIR=x86
+  	;;
+
+  amd64-*-freebsd*)
+	TARGET=X86_64; TARGETDIR=x86
+	;;
+
+  avr32*-*-*)
+	TARGET=AVR32; TARGETDIR=avr32
+	;;
+
+  cris-*-*)
+	TARGET=LIBFFI_CRIS; TARGETDIR=cris
+	;;
+
+  frv-*-*)
+	TARGET=FRV; TARGETDIR=frv
+	;;
+
+  hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*)
+	TARGET=PA_LINUX; TARGETDIR=pa
+	;;
+  hppa*64-*-hpux*)
+	TARGET=PA64_HPUX; TARGETDIR=pa
+	;;
+  hppa*-*-hpux*)
+	TARGET=PA_HPUX; TARGETDIR=pa
+	;;
+
+  i?86-*-freebsd* | i?86-*-openbsd*)
+	TARGET=X86_FREEBSD; TARGETDIR=x86
+	;;
+  i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix*)
+	TARGET=X86_WIN32; TARGETDIR=x86
+	# All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
+	# We must also check with_cross_host to decide if this is a native
+	# or cross-build and select where to install dlls appropriately.
+	if test -n "$with_cross_host" &&
+	   test x"$with_cross_host" != x"no"; then
+	  AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"';
+	else
+	  AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"';
+	fi
+	;;
+  i?86-*-darwin*)
+	TARGET=X86_DARWIN; TARGETDIR=x86
+	;;
+  i?86-*-solaris2.1[0-9]*)
+	TARGET=X86_64; TARGETDIR=x86
+	;;
+  i?86-*-*)
+	TARGET=X86; TARGETDIR=x86
+	;;
+
+  ia64*-*-*)
+	TARGET=IA64; TARGETDIR=ia64
+	;;
+
+  m32r*-*-*)
+	TARGET=M32R; TARGETDIR=m32r
+	;;
+
+  m68k-*-*)
+	TARGET=M68K; TARGETDIR=m68k
+	;;
+
+  mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*)
+	TARGET=MIPS; TARGETDIR=mips
+	;;
+  mips*-*-linux* | mips*-*-openbsd*)
+	# Support 128-bit long double for NewABI.
+	HAVE_LONG_DOUBLE='defined(__mips64)'
+	TARGET=MIPS; TARGETDIR=mips
+	;;
+
+  powerpc*-*-linux* | powerpc-*-sysv*)
+	TARGET=POWERPC; TARGETDIR=powerpc
+	;;
+  powerpc-*-beos*)
+	TARGET=POWERPC; TARGETDIR=powerpc
+	;;
+  powerpc-*-darwin* | powerpc64-*-darwin*)
+	TARGET=POWERPC_DARWIN; TARGETDIR=powerpc
+	;;
+  powerpc-*-aix* | rs6000-*-aix*)
+	TARGET=POWERPC_AIX; TARGETDIR=powerpc
+	;;
+  powerpc-*-freebsd* | powerpc-*-openbsd*)
+	TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
+	;;
+  powerpc64-*-freebsd*)
+	TARGET=POWERPC; TARGETDIR=powerpc
+	;;
+  powerpc*-*-rtems*)
+	TARGET=POWERPC; TARGETDIR=powerpc
+	;;
+
+  s390-*-* | s390x-*-*)
+	TARGET=S390; TARGETDIR=s390
+	;;
+
+  sh-*-* | sh[34]*-*-*)
+	TARGET=SH; TARGETDIR=sh
+	;;
+  sh64-*-* | sh5*-*-*)
+	TARGET=SH64; TARGETDIR=sh64
+	;;
+
+  sparc*-*-*)
+	TARGET=SPARC; TARGETDIR=sparc
+	;;
+
+  x86_64-*-darwin*)
+	TARGET=X86_DARWIN; TARGETDIR=x86
+	;;
+
+  x86_64-*-cygwin* | x86_64-*-mingw*)
+	TARGET=X86_WIN64; TARGETDIR=x86
+	;;
+
+  x86_64-*-*)
+	TARGET=X86_64; TARGETDIR=x86
+	;;
+esac
+
+
+
+
+if test $TARGETDIR = unknown; then
+  as_fn_error $? "\"libffi has not been ported to $host.\"" "$LINENO" 5
+fi
+
+ if test x$TARGET = xMIPS; then
+  MIPS_TRUE=
+  MIPS_FALSE='#'
+else
+  MIPS_TRUE='#'
+  MIPS_FALSE=
+fi
+
+ if test x$TARGET = xSPARC; then
+  SPARC_TRUE=
+  SPARC_FALSE='#'
+else
+  SPARC_TRUE='#'
+  SPARC_FALSE=
+fi
+
+ if test x$TARGET = xX86; then
+  X86_TRUE=
+  X86_FALSE='#'
+else
+  X86_TRUE='#'
+  X86_FALSE=
+fi
+
+ if test x$TARGET = xX86_FREEBSD; then
+  X86_FREEBSD_TRUE=
+  X86_FREEBSD_FALSE='#'
+else
+  X86_FREEBSD_TRUE='#'
+  X86_FREEBSD_FALSE=
+fi
+
+ if test x$TARGET = xX86_WIN32; then
+  X86_WIN32_TRUE=
+  X86_WIN32_FALSE='#'
+else
+  X86_WIN32_TRUE='#'
+  X86_WIN32_FALSE=
+fi
+
+ if test x$TARGET = xX86_WIN64; then
+  X86_WIN64_TRUE=
+  X86_WIN64_FALSE='#'
+else
+  X86_WIN64_TRUE='#'
+  X86_WIN64_FALSE=
+fi
+
+ if test x$TARGET = xX86_DARWIN; then
+  X86_DARWIN_TRUE=
+  X86_DARWIN_FALSE='#'
+else
+  X86_DARWIN_TRUE='#'
+  X86_DARWIN_FALSE=
+fi
+
+ if test x$TARGET = xALPHA; then
+  ALPHA_TRUE=
+  ALPHA_FALSE='#'
+else
+  ALPHA_TRUE='#'
+  ALPHA_FALSE=
+fi
+
+ if test x$TARGET = xIA64; then
+  IA64_TRUE=
+  IA64_FALSE='#'
+else
+  IA64_TRUE='#'
+  IA64_FALSE=
+fi
+
+ if test x$TARGET = xM32R; then
+  M32R_TRUE=
+  M32R_FALSE='#'
+else
+  M32R_TRUE='#'
+  M32R_FALSE=
+fi
+
+ if test x$TARGET = xM68K; then
+  M68K_TRUE=
+  M68K_FALSE='#'
+else
+  M68K_TRUE='#'
+  M68K_FALSE=
+fi
+
+ if test x$TARGET = xMOXIE; then
+  MOXIE_TRUE=
+  MOXIE_FALSE='#'
+else
+  MOXIE_TRUE='#'
+  MOXIE_FALSE=
+fi
+
+ if test x$TARGET = xPOWERPC; then
+  POWERPC_TRUE=
+  POWERPC_FALSE='#'
+else
+  POWERPC_TRUE='#'
+  POWERPC_FALSE=
+fi
+
+ if test x$TARGET = xPOWERPC_AIX; then
+  POWERPC_AIX_TRUE=
+  POWERPC_AIX_FALSE='#'
+else
+  POWERPC_AIX_TRUE='#'
+  POWERPC_AIX_FALSE=
+fi
+
+ if test x$TARGET = xPOWERPC_DARWIN; then
+  POWERPC_DARWIN_TRUE=
+  POWERPC_DARWIN_FALSE='#'
+else
+  POWERPC_DARWIN_TRUE='#'
+  POWERPC_DARWIN_FALSE=
+fi
+
+ if test x$TARGET = xPOWERPC_FREEBSD; then
+  POWERPC_FREEBSD_TRUE=
+  POWERPC_FREEBSD_FALSE='#'
+else
+  POWERPC_FREEBSD_TRUE='#'
+  POWERPC_FREEBSD_FALSE=
+fi
+
+ if test x$TARGET = xARM; then
+  ARM_TRUE=
+  ARM_FALSE='#'
+else
+  ARM_TRUE='#'
+  ARM_FALSE=
+fi
+
+ if test x$TARGET = xAVR32; then
+  AVR32_TRUE=
+  AVR32_FALSE='#'
+else
+  AVR32_TRUE='#'
+  AVR32_FALSE=
+fi
+
+ if test x$TARGET = xLIBFFI_CRIS; then
+  LIBFFI_CRIS_TRUE=
+  LIBFFI_CRIS_FALSE='#'
+else
+  LIBFFI_CRIS_TRUE='#'
+  LIBFFI_CRIS_FALSE=
+fi
+
+ if test x$TARGET = xFRV; then
+  FRV_TRUE=
+  FRV_FALSE='#'
+else
+  FRV_TRUE='#'
+  FRV_FALSE=
+fi
+
+ if test x$TARGET = xS390; then
+  S390_TRUE=
+  S390_FALSE='#'
+else
+  S390_TRUE='#'
+  S390_FALSE=
+fi
+
+ if test x$TARGET = xX86_64; then
+  X86_64_TRUE=
+  X86_64_FALSE='#'
+else
+  X86_64_TRUE='#'
+  X86_64_FALSE=
+fi
+
+ if test x$TARGET = xSH; then
+  SH_TRUE=
+  SH_FALSE='#'
+else
+  SH_TRUE='#'
+  SH_FALSE=
+fi
+
+ if test x$TARGET = xSH64; then
+  SH64_TRUE=
+  SH64_FALSE='#'
+else
+  SH64_TRUE='#'
+  SH64_FALSE=
+fi
+
+ if test x$TARGET = xPA_LINUX; then
+  PA_LINUX_TRUE=
+  PA_LINUX_FALSE='#'
+else
+  PA_LINUX_TRUE='#'
+  PA_LINUX_FALSE=
+fi
+
+ if test x$TARGET = xPA_HPUX; then
+  PA_HPUX_TRUE=
+  PA_HPUX_FALSE='#'
+else
+  PA_HPUX_TRUE='#'
+  PA_HPUX_FALSE=
+fi
+
+ if test x$TARGET = xPA64_HPUX; then
+  PA64_HPUX_TRUE=
+  PA64_HPUX_FALSE='#'
+else
+  PA64_HPUX_TRUE='#'
+  PA64_HPUX_FALSE=
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+for ac_func in memcpy
+do :
+  ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy"
+if test "x$ac_cv_func_memcpy" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_MEMCPY 1
+_ACEOF
+
+fi
+done
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments.  Useless!
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
+$as_echo_n "checking for working alloca.h... " >&6; }
+if ${ac_cv_working_alloca_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <alloca.h>
+int
+main ()
+{
+char *p = (char *) alloca (2 * sizeof (int));
+			  if (p) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_working_alloca_h=yes
+else
+  ac_cv_working_alloca_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
+$as_echo "$ac_cv_working_alloca_h" >&6; }
+if test $ac_cv_working_alloca_h = yes; then
+
+$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
+$as_echo_n "checking for alloca... " >&6; }
+if ${ac_cv_func_alloca_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  ifdef HAVE_ALLOCA_H
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
+void *alloca (size_t);
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+int
+main ()
+{
+char *p = (char *) alloca (1);
+				    if (p) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_func_alloca_works=yes
+else
+  ac_cv_func_alloca_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
+$as_echo "$ac_cv_func_alloca_works" >&6; }
+
+if test $ac_cv_func_alloca_works = yes; then
+
+$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
+
+else
+  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble.  Some versions do not even contain alloca or
+# contain a buggy version.  If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
+
+$as_echo "#define C_ALLOCA 1" >>confdefs.h
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
+$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
+if ${ac_cv_os_cray+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined CRAY && ! defined CRAY2
+webecray
+#else
+wenotbecray
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "webecray" >/dev/null 2>&1; then :
+  ac_cv_os_cray=yes
+else
+  ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
+$as_echo "$ac_cv_os_cray" >&6; }
+if test $ac_cv_os_cray = yes; then
+  for ac_func in _getb67 GETB67 getb67; do
+    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define CRAY_STACKSEG_END $ac_func
+_ACEOF
+
+    break
+fi
+
+  done
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
+$as_echo_n "checking stack direction for C alloca... " >&6; }
+if ${ac_cv_c_stack_direction+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ac_cv_c_stack_direction=0
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+find_stack_direction ()
+{
+  static char *addr = 0;
+  auto char dummy;
+  if (addr == 0)
+    {
+      addr = &dummy;
+      return find_stack_direction ();
+    }
+  else
+    return (&dummy > addr) ? 1 : -1;
+}
+
+int
+main ()
+{
+  return find_stack_direction () < 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_stack_direction=1
+else
+  ac_cv_c_stack_direction=-1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
+$as_echo "$ac_cv_c_stack_direction" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+_ACEOF
+
+
+fi
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
+$as_echo_n "checking size of double... " >&6; }
+if ${ac_cv_sizeof_double+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_double" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (double)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_double=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5
+$as_echo "$ac_cv_sizeof_double" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_DOUBLE $ac_cv_sizeof_double
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5
+$as_echo_n "checking size of long double... " >&6; }
+if ${ac_cv_sizeof_long_double+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_long_double" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long double)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_long_double=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5
+$as_echo "$ac_cv_sizeof_long_double" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
+_ACEOF
+
+
+
+# Also AC_SUBST this variable for ffi.h.
+if test -z "$HAVE_LONG_DOUBLE"; then
+  HAVE_LONG_DOUBLE=0
+  if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then
+    if test $ac_cv_sizeof_long_double != 0; then
+      HAVE_LONG_DOUBLE=1
+
+$as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h
+
+    fi
+  fi
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if ${ac_cv_c_bigendian+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_bigendian=unknown
+    # See if we're dealing with a universal compiler.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+	       not a universal capable compiler
+	     #endif
+	     typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+	# Check for potential -arch flags.  It is not universal unless
+	# there are at least two -arch flags with different values.
+	ac_arch=
+	ac_prev=
+	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+	 if test -n "$ac_prev"; then
+	   case $ac_word in
+	     i?86 | x86_64 | ppc | ppc64)
+	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+		 ac_arch=$ac_word
+	       else
+		 ac_cv_c_bigendian=universal
+		 break
+	       fi
+	       ;;
+	   esac
+	   ac_prev=
+	 elif test "x$ac_word" = "x-arch"; then
+	   ac_prev=arch
+	 fi
+       done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if sys/param.h defines the BYTE_ORDER macro.
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+	     #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+		     && LITTLE_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+		#include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to _BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # Compile a test program.
+      if test "$cross_compiling" = yes; then :
+  # Try to guess by grepping values from an object file.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+short int ascii_mm[] =
+		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+		short int ascii_ii[] =
+		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+		int use_ascii (int i) {
+		  return ascii_mm[i] + ascii_ii[i];
+		}
+		short int ebcdic_ii[] =
+		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+		short int ebcdic_mm[] =
+		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+		int use_ebcdic (int i) {
+		  return ebcdic_mm[i] + ebcdic_ii[i];
+		}
+		extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+	      ac_cv_c_bigendian=yes
+	    fi
+	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+	      if test "$ac_cv_c_bigendian" = unknown; then
+		ac_cv_c_bigendian=no
+	      else
+		# finding both strings is unlikely to happen, but who knows?
+		ac_cv_c_bigendian=unknown
+	      fi
+	    fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+
+	     /* Are we little or big endian?  From Harbison&Steele.  */
+	     union
+	     {
+	       long int l;
+	       char c[sizeof (long int)];
+	     } u;
+	     u.l = 1;
+	     return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_bigendian=no
+else
+  ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+   yes)
+     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+   no)
+      ;; #(
+   universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+     ;; #(
+   *)
+     as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .cfi pseudo-op support" >&5
+$as_echo_n "checking assembler .cfi pseudo-op support... " >&6; }
+if ${libffi_cv_as_cfi_pseudo_op+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    libffi_cv_as_cfi_pseudo_op=unknown
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+asm (".cfi_startproc\n\t.cfi_endproc");
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libffi_cv_as_cfi_pseudo_op=yes
+else
+  libffi_cv_as_cfi_pseudo_op=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_cfi_pseudo_op" >&5
+$as_echo "$libffi_cv_as_cfi_pseudo_op" >&6; }
+if test "x$libffi_cv_as_cfi_pseudo_op" = xyes; then
+
+$as_echo "#define HAVE_AS_CFI_PSEUDO_OP 1" >>confdefs.h
+
+fi
+
+if test x$TARGET = xSPARC; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler and linker support unaligned pc related relocs" >&5
+$as_echo_n "checking assembler and linker support unaligned pc related relocs... " >&6; }
+if ${libffi_cv_as_sparc_ua_pcrel+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+	save_CFLAGS="$CFLAGS"
+	save_LDFLAGS="$LDFLAGS"
+	CFLAGS="$CFLAGS -fpic"
+	LDFLAGS="$LDFLAGS -shared"
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  libffi_cv_as_sparc_ua_pcrel=yes
+else
+  libffi_cv_as_sparc_ua_pcrel=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	CFLAGS="$save_CFLAGS"
+	LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_sparc_ua_pcrel" >&5
+$as_echo "$libffi_cv_as_sparc_ua_pcrel" >&6; }
+    if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then
+
+$as_echo "#define HAVE_AS_SPARC_UA_PCREL 1" >>confdefs.h
+
+    fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .register pseudo-op support" >&5
+$as_echo_n "checking assembler .register pseudo-op support... " >&6; }
+if ${libffi_cv_as_register_pseudo_op+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+       libffi_cv_as_register_pseudo_op=unknown
+       # Check if we have .register
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+asm (".register %g2, #scratch");
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libffi_cv_as_register_pseudo_op=yes
+else
+  libffi_cv_as_register_pseudo_op=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_register_pseudo_op" >&5
+$as_echo "$libffi_cv_as_register_pseudo_op" >&6; }
+    if test "x$libffi_cv_as_register_pseudo_op" = xyes; then
+
+$as_echo "#define HAVE_AS_REGISTER_PSEUDO_OP 1" >>confdefs.h
+
+    fi
+fi
+
+if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports pc related relocs" >&5
+$as_echo_n "checking assembler supports pc related relocs... " >&6; }
+if ${libffi_cv_as_x86_pcrel+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+	libffi_cv_as_x86_pcrel=no
+	echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
+	if $CC $CFLAGS -c conftest.s > /dev/null; then
+	   libffi_cv_as_x86_pcrel=yes
+	fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_pcrel" >&5
+$as_echo "$libffi_cv_as_x86_pcrel" >&6; }
+    if test "x$libffi_cv_as_x86_pcrel" = xyes; then
+
+$as_echo "#define HAVE_AS_X86_PCREL 1" >>confdefs.h
+
+    fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .ascii pseudo-op support" >&5
+$as_echo_n "checking assembler .ascii pseudo-op support... " >&6; }
+if ${libffi_cv_as_ascii_pseudo_op+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+       libffi_cv_as_ascii_pseudo_op=unknown
+       # Check if we have .ascii
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+asm (".ascii \\"string\\"");
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libffi_cv_as_ascii_pseudo_op=yes
+else
+  libffi_cv_as_ascii_pseudo_op=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_ascii_pseudo_op" >&5
+$as_echo "$libffi_cv_as_ascii_pseudo_op" >&6; }
+    if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then
+
+$as_echo "#define HAVE_AS_ASCII_PSEUDO_OP 1" >>confdefs.h
+
+    fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .string pseudo-op support" >&5
+$as_echo_n "checking assembler .string pseudo-op support... " >&6; }
+if ${libffi_cv_as_string_pseudo_op+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+       libffi_cv_as_string_pseudo_op=unknown
+       # Check if we have .string
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+asm (".string \\"string\\"");
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libffi_cv_as_string_pseudo_op=yes
+else
+  libffi_cv_as_string_pseudo_op=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_string_pseudo_op" >&5
+$as_echo "$libffi_cv_as_string_pseudo_op" >&6; }
+    if test "x$libffi_cv_as_string_pseudo_op" = xyes; then
+
+$as_echo "#define HAVE_AS_STRING_PSEUDO_OP 1" >>confdefs.h
+
+    fi
+fi
+
+if test x$TARGET = xX86_WIN64; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ prefix in compiled symbols" >&5
+$as_echo_n "checking for _ prefix in compiled symbols... " >&6; }
+if ${lt_cv_sys_symbol_underscore+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sys_symbol_underscore=no
+  cat > conftest.$ac_ext <<_LT_EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    ac_nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$ac_nlist"; then
+      # See whether the symbols have a leading underscore.
+      if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
+        lt_cv_sys_symbol_underscore=yes
+      else
+        if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
+	  :
+        else
+	  echo "configure: cannot find nm_test_func in $ac_nlist" >&5
+        fi
+      fi
+    else
+      echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "configure: failed program was:" >&5
+    cat conftest.c >&5
+  fi
+  rm -rf conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_symbol_underscore" >&5
+$as_echo "$lt_cv_sys_symbol_underscore" >&6; }
+  sys_symbol_underscore=$lt_cv_sys_symbol_underscore
+
+
+    if test "x$sys_symbol_underscore" = xyes; then
+
+$as_echo "#define SYMBOL_UNDERSCORE 1" >>confdefs.h
+
+    fi
+fi
+
+
+FFI_EXEC_TRAMPOLINE_TABLE=0
+case "$target" in
+     *arm*-apple-darwin*)
+       FFI_EXEC_TRAMPOLINE_TABLE=1
+
+$as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h
+
+     ;;
+     *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*)
+
+$as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h
+
+     ;;
+esac
+ if test x$FFI_EXEC_TRAMPOLINE_TABLE = x1; then
+  FFI_EXEC_TRAMPOLINE_TABLE_TRUE=
+  FFI_EXEC_TRAMPOLINE_TABLE_FALSE='#'
+else
+  FFI_EXEC_TRAMPOLINE_TABLE_TRUE='#'
+  FFI_EXEC_TRAMPOLINE_TABLE_FALSE=
+fi
+
+
+
+if test x$TARGET = xX86_64; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler supports unwind section type" >&5
+$as_echo_n "checking assembler supports unwind section type... " >&6; }
+if ${libffi_cv_as_x86_64_unwind_section_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+	libffi_cv_as_x86_64_unwind_section_type=yes
+	echo '.section .eh_frame,"a",@unwind' > conftest.s
+	if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
+	    libffi_cv_as_x86_64_unwind_section_type=no
+	fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_as_x86_64_unwind_section_type" >&5
+$as_echo "$libffi_cv_as_x86_64_unwind_section_type" >&6; }
+    if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then
+
+$as_echo "#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1" >>confdefs.h
+
+    fi
+fi
+
+if test "x$GCC" = "xyes"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .eh_frame section should be read-only" >&5
+$as_echo_n "checking whether .eh_frame section should be read-only... " >&6; }
+if ${libffi_cv_ro_eh_frame+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+  	libffi_cv_ro_eh_frame=no
+  	echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
+  	if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
+  	    if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
+  		libffi_cv_ro_eh_frame=yes
+  	    elif grep '.section.*eh_frame.*#alloc' conftest.c \
+  		 | grep -v '#write' > /dev/null; then
+  		libffi_cv_ro_eh_frame=yes
+  	    fi
+  	fi
+  	rm -f conftest.*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_ro_eh_frame" >&5
+$as_echo "$libffi_cv_ro_eh_frame" >&6; }
+  if test "x$libffi_cv_ro_eh_frame" = xyes; then
+
+$as_echo "#define HAVE_RO_EH_FRAME 1" >>confdefs.h
+
+
+$as_echo "#define EH_FRAME_FLAGS \"a\"" >>confdefs.h
+
+  else
+
+$as_echo "#define EH_FRAME_FLAGS \"aw\"" >>confdefs.h
+
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((visibility(\"hidden\")))" >&5
+$as_echo_n "checking for __attribute__((visibility(\"hidden\")))... " >&6; }
+if ${libffi_cv_hidden_visibility_attribute+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+  	echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1  ; }' > conftest.c
+  	libffi_cv_hidden_visibility_attribute=no
+  	if { ac_try='${CC-cc} -Werror -S conftest.c -o conftest.s 1>&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+  	    if grep '\.hidden.*foo' conftest.s >/dev/null; then
+  		libffi_cv_hidden_visibility_attribute=yes
+  	    fi
+  	fi
+  	rm -f conftest.*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libffi_cv_hidden_visibility_attribute" >&5
+$as_echo "$libffi_cv_hidden_visibility_attribute" >&6; }
+  if test $libffi_cv_hidden_visibility_attribute = yes; then
+
+$as_echo "#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1" >>confdefs.h
+
+  fi
+fi
+
+
+
+
+
+
+
+
+# Check whether --enable-debug was given.
+if test "${enable_debug+set}" = set; then :
+  enableval=$enable_debug; if test "$enable_debug" = "yes"; then
+
+$as_echo "#define FFI_DEBUG 1" >>confdefs.h
+
+  fi
+fi
+
+ if test "$enable_debug" = "yes"; then
+  FFI_DEBUG_TRUE=
+  FFI_DEBUG_FALSE='#'
+else
+  FFI_DEBUG_TRUE='#'
+  FFI_DEBUG_FALSE=
+fi
+
+
+# Check whether --enable-structs was given.
+if test "${enable_structs+set}" = set; then :
+  enableval=$enable_structs; if test "$enable_structs" = "no"; then
+
+$as_echo "#define FFI_NO_STRUCTS 1" >>confdefs.h
+
+  fi
+fi
+
+
+# Check whether --enable-raw-api was given.
+if test "${enable_raw_api+set}" = set; then :
+  enableval=$enable_raw_api; if test "$enable_raw_api" = "no"; then
+
+$as_echo "#define FFI_NO_RAW_API 1" >>confdefs.h
+
+  fi
+fi
+
+
+# Check whether --enable-purify-safety was given.
+if test "${enable_purify_safety+set}" = set; then :
+  enableval=$enable_purify_safety; if test "$enable_purify_safety" = "yes"; then
+
+$as_echo "#define USING_PURIFY 1" >>confdefs.h
+
+  fi
+fi
+
+
+# These variables are only ever used when we cross-build to X86_WIN32.
+# And we only support this with GCC, so...
+if test x"$GCC" != x"no"; then
+  if test -n "$with_cross_host" &&
+     test x"$with_cross_host" != x"no"; then
+    toolexecdir='$(exec_prefix)/$(target_alias)'
+    toolexeclibdir='$(toolexecdir)/lib'
+  else
+    toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
+    toolexeclibdir='$(libdir)'
+  fi
+  multi_os_directory=`$CC -print-multi-os-directory`
+  case $multi_os_directory in
+    .) ;; # Avoid trailing /.
+    *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
+  esac
+
+
+fi
+
+if test "${multilib}" = "yes"; then
+  multilib_arg="--enable-multilib"
+else
+  multilib_arg=
+fi
+
+ac_config_commands="$ac_config_commands include"
+
+ac_config_commands="$ac_config_commands src"
+
+
+ac_config_links="$ac_config_links include/ffitarget.h:src/$TARGETDIR/ffitarget.h"
+
+
+ac_config_files="$ac_config_files include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${TESTSUBDIR_TRUE}" && test -z "${TESTSUBDIR_FALSE}"; then
+  as_fn_error $? "conditional \"TESTSUBDIR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MIPS_TRUE}" && test -z "${MIPS_FALSE}"; then
+  as_fn_error $? "conditional \"MIPS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SPARC_TRUE}" && test -z "${SPARC_FALSE}"; then
+  as_fn_error $? "conditional \"SPARC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${X86_TRUE}" && test -z "${X86_FALSE}"; then
+  as_fn_error $? "conditional \"X86\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${X86_FREEBSD_TRUE}" && test -z "${X86_FREEBSD_FALSE}"; then
+  as_fn_error $? "conditional \"X86_FREEBSD\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${X86_WIN32_TRUE}" && test -z "${X86_WIN32_FALSE}"; then
+  as_fn_error $? "conditional \"X86_WIN32\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${X86_WIN64_TRUE}" && test -z "${X86_WIN64_FALSE}"; then
+  as_fn_error $? "conditional \"X86_WIN64\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${X86_DARWIN_TRUE}" && test -z "${X86_DARWIN_FALSE}"; then
+  as_fn_error $? "conditional \"X86_DARWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ALPHA_TRUE}" && test -z "${ALPHA_FALSE}"; then
+  as_fn_error $? "conditional \"ALPHA\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${IA64_TRUE}" && test -z "${IA64_FALSE}"; then
+  as_fn_error $? "conditional \"IA64\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${M32R_TRUE}" && test -z "${M32R_FALSE}"; then
+  as_fn_error $? "conditional \"M32R\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${M68K_TRUE}" && test -z "${M68K_FALSE}"; then
+  as_fn_error $? "conditional \"M68K\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MOXIE_TRUE}" && test -z "${MOXIE_FALSE}"; then
+  as_fn_error $? "conditional \"MOXIE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${POWERPC_TRUE}" && test -z "${POWERPC_FALSE}"; then
+  as_fn_error $? "conditional \"POWERPC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${POWERPC_AIX_TRUE}" && test -z "${POWERPC_AIX_FALSE}"; then
+  as_fn_error $? "conditional \"POWERPC_AIX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${POWERPC_DARWIN_TRUE}" && test -z "${POWERPC_DARWIN_FALSE}"; then
+  as_fn_error $? "conditional \"POWERPC_DARWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${POWERPC_FREEBSD_TRUE}" && test -z "${POWERPC_FREEBSD_FALSE}"; then
+  as_fn_error $? "conditional \"POWERPC_FREEBSD\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ARM_TRUE}" && test -z "${ARM_FALSE}"; then
+  as_fn_error $? "conditional \"ARM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AVR32_TRUE}" && test -z "${AVR32_FALSE}"; then
+  as_fn_error $? "conditional \"AVR32\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBFFI_CRIS_TRUE}" && test -z "${LIBFFI_CRIS_FALSE}"; then
+  as_fn_error $? "conditional \"LIBFFI_CRIS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${FRV_TRUE}" && test -z "${FRV_FALSE}"; then
+  as_fn_error $? "conditional \"FRV\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${S390_TRUE}" && test -z "${S390_FALSE}"; then
+  as_fn_error $? "conditional \"S390\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${X86_64_TRUE}" && test -z "${X86_64_FALSE}"; then
+  as_fn_error $? "conditional \"X86_64\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SH_TRUE}" && test -z "${SH_FALSE}"; then
+  as_fn_error $? "conditional \"SH\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SH64_TRUE}" && test -z "${SH64_FALSE}"; then
+  as_fn_error $? "conditional \"SH64\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PA_LINUX_TRUE}" && test -z "${PA_LINUX_FALSE}"; then
+  as_fn_error $? "conditional \"PA_LINUX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PA_HPUX_TRUE}" && test -z "${PA_HPUX_FALSE}"; then
+  as_fn_error $? "conditional \"PA_HPUX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PA64_HPUX_TRUE}" && test -z "${PA64_HPUX_FALSE}"; then
+  as_fn_error $? "conditional \"PA64_HPUX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+if test -z "${FFI_EXEC_TRAMPOLINE_TABLE_TRUE}" && test -z "${FFI_EXEC_TRAMPOLINE_TABLE_FALSE}"; then
+  as_fn_error $? "conditional \"FFI_EXEC_TRAMPOLINE_TABLE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${FFI_DEBUG_TRUE}" && test -z "${FFI_DEBUG_FALSE}"; then
+  as_fn_error $? "conditional \"FFI_DEBUG\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by libffi $as_me 3.0.10, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_links="$ac_config_links"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration links:
+$config_links
+
+Configuration commands:
+$config_commands
+
+Report bugs to <http://sourceware.org/libffi.html>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+libffi config.status 3.0.10
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+ax_enable_builddir_srcdir="$srcdir"                    # $srcdir
+ax_enable_builddir_host="$HOST"                        # $HOST / $host
+ax_enable_builddir_version="$VERSION"                  # $VERSION
+ax_enable_builddir_package="$PACKAGE"                  # $PACKAGE
+ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX
+ax_enable_builddir_sed="$ax_enable_builddir_sed"       # $SED
+ax_enable_builddir="$ax_enable_builddir"               # $SUB
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+nm_file_list_spec \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_flag_spec_ld \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+TARGETDIR="$TARGETDIR"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "fficonfig.h") CONFIG_HEADERS="$CONFIG_HEADERS fficonfig.h" ;;
+    "buildir") CONFIG_COMMANDS="$CONFIG_COMMANDS buildir" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "include") CONFIG_COMMANDS="$CONFIG_COMMANDS include" ;;
+    "src") CONFIG_COMMANDS="$CONFIG_COMMANDS src" ;;
+    "include/ffitarget.h") CONFIG_LINKS="$CONFIG_LINKS include/ffitarget.h:src/$TARGETDIR/ffitarget.h" ;;
+    "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
+    "include/ffi.h") CONFIG_FILES="$CONFIG_FILES include/ffi.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;;
+    "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;;
+    "libffi.pc") CONFIG_FILES="$CONFIG_FILES libffi.pc" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS  :L $CONFIG_LINKS  :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+  :L)
+  #
+  # CONFIG_LINK
+  #
+
+  if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then
+    :
+  else
+    # Prefer the file from the source tree if names are identical.
+    if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then
+      ac_source=$srcdir/$ac_source
+    fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5
+$as_echo "$as_me: linking $ac_source to $ac_file" >&6;}
+
+    if test ! -r "$ac_source"; then
+      as_fn_error $? "$ac_source: file not found" "$LINENO" 5
+    fi
+    rm -f "$ac_file"
+
+    # Try a relative symlink, then a hard link, then a copy.
+    case $ac_source in
+    [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;;
+	*) ac_rel_source=$ac_top_build_prefix$ac_source ;;
+    esac
+    ln -s "$ac_rel_source" "$ac_file" 2>/dev/null ||
+      ln "$ac_source" "$ac_file" 2>/dev/null ||
+      cp -p "$ac_source" "$ac_file" ||
+      as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5
+  fi
+ ;;
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "buildir":C)   ac_top_srcdir="$ax_enable_builddir_srcdir"
+  if test ".$ax_enable_builddir" = ".." ; then
+    if test -f "$top_srcdir/Makefile" ; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - left untouched" >&5
+$as_echo "$as_me: skipping top_srcdir/Makefile - left untouched" >&6;}
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: skipping top_srcdir/Makefile - not created" >&5
+$as_echo "$as_me: skipping top_srcdir/Makefile - not created" >&6;}
+    fi
+  else
+    if test -f "$ac_top_srcdir/Makefile" ; then
+      a=`grep "^VERSION " "$ac_top_srcdir/Makefile"` ; b=`grep "^VERSION " Makefile`
+      test "$a" != "$b" && rm "$ac_top_srcdir/Makefile"
+    fi
+    if test -f "$ac_top_srcdir/Makefile" ; then
+	echo "$ac_top_srcdir/Makefile : $ac_top_srcdir/Makefile.in" > $tmp/conftemp.mk
+	echo "	@ echo 'REMOVED,,,' >\$@" >> $tmp/conftemp.mk
+      eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null"
+      if grep '^REMOVED,,,' "$ac_top_srcdir/Makefile" >/dev/null
+      then rm $ac_top_srcdir/Makefile ; fi
+      cp $tmp/conftemp.mk $ac_top_srcdir/makefiles.mk~      ## DEBUGGING
+    fi
+    if test ! -f "$ac_top_srcdir/Makefile" ; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: create top_srcdir/Makefile guessed from local Makefile" >&5
+$as_echo "$as_me: create top_srcdir/Makefile guessed from local Makefile" >&6;}
+      x='`' ; cat >$tmp/conftemp.sed <<_EOF
+/^\$/n
+x
+/^\$/bS
+x
+/\\\\\$/{H;d;}
+{H;s/.*//;x;}
+bM
+:S
+x
+/\\\\\$/{h;d;}
+{h;s/.*//;x;}
+:M
+s/\\(\\n\\)	/\\1 /g
+/^	/d
+/^[	 ]*[\\#]/d
+/^VPATH *=/d
+s/^srcdir *=.*/srcdir = ./
+s/^top_srcdir *=.*/top_srcdir = ./
+/[:=]/!d
+/^\\./d
+/ = /b
+/ .= /b
+/:/!b
+s/:.*/:/
+s/ /  /g
+s/ \\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/ \\1 \\1-all\\2/g
+s/^\\([a-z][a-z-]*[a-zA-Z0-9]\\)\\([ :]\\)/\\1 \\1-all\\2/
+s/  / /g
+/^all all-all[ :]/i\\
+all-configured : all-all
+s/ [a-zA-Z0-9-]*-all [a-zA-Z0-9-]*-all-all//g
+/-all-all/d
+a\\
+	@ HOST="\$(HOST)\" \\\\\\
+	; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\
+	; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+	; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\
+	; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" = "0" ; then : \\\\\\
+	; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\
+	; test ".\$\$BUILD" = "." && BUILD="." \\\\\\
+	; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\
+	; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+	; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done
+/dist-all *:/a\\
+	@ HOST="\$(HOST)\" \\\\\\
+	; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\
+	; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+	; found=$x echo \$\$BUILD | wc -w $x \\\\\\
+	; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\
+	; if test "\$\$found" = "0" ; then : \\\\\\
+	; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\
+	; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+	; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\
+	; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done
+/dist-[a-zA-Z0-9]*-all *:/a\\
+	@ HOST="\$(HOST)\" \\\\\\
+	; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\
+	; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+	; found=$x echo \$\$BUILD | wc -w $x \\\\\\
+	; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\
+	; if test "\$\$found" = "0" ; then : \\\\\\
+	; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\
+	; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+	; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\
+	; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done
+/distclean-all *:/a\\
+	@ HOST="\$(HOST)\" \\\\\\
+	; test ".\$\$HOST" = "." && HOST=$x sh $ax_enable_builddir_auxdir/config.guess $x \\\\\\
+	; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\
+	; use=$x basename "\$\@" -all $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\
+	; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\
+	; test ".\$\$BUILD" = "." && BUILD="." \\\\\\
+	; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+	; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\
+	; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+	; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\
+	; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\
+	; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile
+_EOF
+      cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefile.sed~"            ## DEBUGGING
+      $ax_enable_builddir_sed -f $tmp/conftemp.sed Makefile >$ac_top_srcdir/Makefile
+      if test -f "$ac_top_srcdir/Makefile.mk" ; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&5
+$as_echo "$as_me: extend top_srcdir/Makefile with top_srcdir/Makefile.mk" >&6;}
+        cat $ac_top_srcdir/Makefile.mk >>$ac_top_srcdir/Makefile
+      fi ; xxxx="####"
+      echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$ac_top_srcdir/Makefile
+      # sanity check
+      if grep '^; echo "MAKE ' $ac_top_srcdir/Makefile >/dev/null ; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: buggy sed found - it deletes tab in \"a\" text parts" >&5
+$as_echo "$as_me: buggy sed found - it deletes tab in \"a\" text parts" >&6;}
+        $ax_enable_builddir_sed -e '/^@ HOST=/s/^/	/' -e '/^; /s/^/	/' $ac_top_srcdir/Makefile \
+          >$ac_top_srcdir/Makefile~
+        (test -s $ac_top_srcdir/Makefile~ && mv $ac_top_srcdir/Makefile~ $ac_top_srcdir/Makefile) 2>/dev/null
+      fi
+    else
+      xxxx="\\#\\#\\#\\#"
+      # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed
+      echo "s!^$xxxx [^|]* | *$ax_enable_builddir *\$!$xxxx ...... $ax_enable_builddir!" >$tmp/conftemp.sed
+      $ax_enable_builddir_sed -f "$tmp/conftemp.sed" "$ac_top_srcdir/Makefile" >$tmp/mkfile.tmp
+        cp "$tmp/conftemp.sed" "$ac_top_srcdir/makefiles.sed~"         ## DEBUGGING
+        cp "$tmp/mkfile.tmp"   "$ac_top_srcdir/makefiles.out~"         ## DEBUGGING
+      if cmp -s "$ac_top_srcdir/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: keeping top_srcdir/Makefile from earlier configure" >&5
+$as_echo "$as_me: keeping top_srcdir/Makefile from earlier configure" >&6;}
+        rm "$tmp/mkfile.tmp"
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: reusing top_srcdir/Makefile from earlier configure" >&5
+$as_echo "$as_me: reusing top_srcdir/Makefile from earlier configure" >&6;}
+        mv "$tmp/mkfile.tmp" "$ac_top_srcdir/Makefile"
+      fi
+    fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&5
+$as_echo "$as_me: build in $ax_enable_builddir (HOST=$ax_enable_builddir_host)" >&6;}
+    xxxx="####"
+    echo "$xxxx" "$ax_enable_builddir_host" "|$ax_enable_builddir" >>$ac_top_srcdir/Makefile
+  fi
+ ;;
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
+#                 Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool 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 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=""
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into a binary
+# during linking.  This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  if test x"$xsi_shell" = xyes; then
+  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\    # positional parameters, so assign one to ordinary parameter first.\
+\    func_stripname_result=${3}\
+\    func_stripname_result=${func_stripname_result#"${1}"}\
+\    func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\    func_split_long_opt_name=${1%%=*}\
+\    func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\    func_split_short_opt_arg=${1#??}\
+\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\    case ${1} in\
+\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\      *)    func_lo2o_result=${1} ;;\
+\    esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+    func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+    func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+    func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+    eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\    func_quote_for_eval "${2}"\
+\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+ ;;
+    "include":C) test -d include || mkdir include ;;
+    "src":C)
+test -d src || mkdir src
+test -d src/$TARGETDIR || mkdir src/$TARGETDIR
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.ac b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.ac
new file mode 100644
index 0000000..2d92d33
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.ac
@@ -0,0 +1,496 @@
+dnl Process this with autoconf to create configure
+
+AC_PREREQ(2.63)
+
+AC_INIT([libffi], [3.0.10], [http://sourceware.org/libffi.html])
+AC_CONFIG_HEADERS([fficonfig.h])
+
+AC_CANONICAL_SYSTEM
+target_alias=${target_alias-$host_alias}
+
+. ${srcdir}/configure.host
+
+AX_ENABLE_BUILDDIR
+
+AM_INIT_AUTOMAKE
+
+# The same as in boehm-gc and libstdc++. Have to borrow it from there.
+# We must force CC to /not/ be precious variables; otherwise
+# the wrong, non-multilib-adjusted value will be used in multilibs.
+# As a side effect, we have to subst CFLAGS ourselves.
+# Also save and restore CFLAGS, since AC_PROG_CC will come up with
+# defaults of its own if none are provided.
+
+m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
+m4_define([_AC_ARG_VAR_PRECIOUS],[])
+save_CFLAGS=$CFLAGS
+AC_PROG_CC
+CFLAGS=$save_CFLAGS
+m4_undefine([_AC_ARG_VAR_PRECIOUS])
+m4_rename([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
+
+AC_SUBST(CFLAGS)
+
+AM_PROG_AS
+AM_PROG_CC_C_O
+AC_PROG_LIBTOOL
+AC_CONFIG_MACRO_DIR([m4])
+
+AX_CC_MAXOPT
+AX_CFLAGS_WARN_ALL
+if test "x$GCC" = "xyes"; then
+  CFLAGS="$CFLAGS -fexceptions"
+fi
+
+AM_MAINTAINER_MODE
+
+AC_CHECK_HEADERS(sys/mman.h)
+AC_CHECK_FUNCS(mmap)
+AC_FUNC_MMAP_BLACKLIST
+
+dnl The -no-testsuite modules omit the test subdir.
+AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite)
+
+TARGETDIR="unknown"
+case "$host" in
+  alpha*-*-*)
+	TARGET=ALPHA; TARGETDIR=alpha;
+	# Support 128-bit long double, changeable via command-line switch.
+	HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)'
+	;;
+
+  arm*-*-*)
+	TARGET=ARM; TARGETDIR=arm
+	;;
+
+  amd64-*-freebsd* | amd64-*-openbsd*)
+	TARGET=X86_64; TARGETDIR=x86
+  	;;
+
+  amd64-*-freebsd*)
+	TARGET=X86_64; TARGETDIR=x86
+	;;
+
+  avr32*-*-*)
+	TARGET=AVR32; TARGETDIR=avr32
+	;;
+
+  cris-*-*)
+	TARGET=LIBFFI_CRIS; TARGETDIR=cris
+	;;
+
+  frv-*-*)
+	TARGET=FRV; TARGETDIR=frv
+	;;
+
+  hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*)
+	TARGET=PA_LINUX; TARGETDIR=pa
+	;;
+  hppa*64-*-hpux*)
+	TARGET=PA64_HPUX; TARGETDIR=pa
+	;;
+  hppa*-*-hpux*)
+	TARGET=PA_HPUX; TARGETDIR=pa
+	;;
+
+  i?86-*-freebsd* | i?86-*-openbsd*)
+	TARGET=X86_FREEBSD; TARGETDIR=x86
+	;;
+  i?86-win32* | i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix*)
+	TARGET=X86_WIN32; TARGETDIR=x86
+	# All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
+	# We must also check with_cross_host to decide if this is a native
+	# or cross-build and select where to install dlls appropriately.
+	if test -n "$with_cross_host" &&
+	   test x"$with_cross_host" != x"no"; then
+	  AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"';
+	else
+	  AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"';
+	fi
+	;;
+  i?86-*-darwin*)
+	TARGET=X86_DARWIN; TARGETDIR=x86
+	;;
+  i?86-*-solaris2.1[[0-9]]*)
+	TARGET=X86_64; TARGETDIR=x86
+	;;
+  i?86-*-*)
+	TARGET=X86; TARGETDIR=x86
+	;;
+
+  ia64*-*-*)
+	TARGET=IA64; TARGETDIR=ia64
+	;;
+
+  m32r*-*-*)
+	TARGET=M32R; TARGETDIR=m32r
+	;;
+
+  m68k-*-*)
+	TARGET=M68K; TARGETDIR=m68k
+	;;
+
+  mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*)
+	TARGET=MIPS; TARGETDIR=mips
+	;;
+  mips*-*-linux* | mips*-*-openbsd*)
+	# Support 128-bit long double for NewABI.
+	HAVE_LONG_DOUBLE='defined(__mips64)'
+	TARGET=MIPS; TARGETDIR=mips
+	;;
+
+  powerpc*-*-linux* | powerpc-*-sysv*)
+	TARGET=POWERPC; TARGETDIR=powerpc
+	;;
+  powerpc-*-beos*)
+	TARGET=POWERPC; TARGETDIR=powerpc
+	;;
+  powerpc-*-darwin* | powerpc64-*-darwin*)
+	TARGET=POWERPC_DARWIN; TARGETDIR=powerpc
+	;;
+  powerpc-*-aix* | rs6000-*-aix*)
+	TARGET=POWERPC_AIX; TARGETDIR=powerpc
+	;;
+  powerpc-*-freebsd* | powerpc-*-openbsd*)
+	TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
+	;;
+  powerpc64-*-freebsd*)
+	TARGET=POWERPC; TARGETDIR=powerpc
+	;;
+  powerpc*-*-rtems*)
+	TARGET=POWERPC; TARGETDIR=powerpc
+	;;
+
+  s390-*-* | s390x-*-*)
+	TARGET=S390; TARGETDIR=s390
+	;;
+
+  sh-*-* | sh[[34]]*-*-*)
+	TARGET=SH; TARGETDIR=sh
+	;;
+  sh64-*-* | sh5*-*-*)
+	TARGET=SH64; TARGETDIR=sh64
+	;;
+
+  sparc*-*-*)
+	TARGET=SPARC; TARGETDIR=sparc
+	;;
+
+  x86_64-*-darwin*)
+	TARGET=X86_DARWIN; TARGETDIR=x86
+	;;
+
+  x86_64-*-cygwin* | x86_64-*-mingw*)
+	TARGET=X86_WIN64; TARGETDIR=x86
+	;;
+
+  x86_64-*-*)
+	TARGET=X86_64; TARGETDIR=x86
+	;;
+esac
+
+AC_SUBST(AM_RUNTESTFLAGS)
+AC_SUBST(AM_LTLDFLAGS)
+
+if test $TARGETDIR = unknown; then
+  AC_MSG_ERROR(["libffi has not been ported to $host."])
+fi
+
+AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
+AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
+AM_CONDITIONAL(X86, test x$TARGET = xX86)
+AM_CONDITIONAL(X86_FREEBSD, test x$TARGET = xX86_FREEBSD)
+AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32)
+AM_CONDITIONAL(X86_WIN64, test x$TARGET = xX86_WIN64)
+AM_CONDITIONAL(X86_DARWIN, test x$TARGET = xX86_DARWIN)
+AM_CONDITIONAL(ALPHA, test x$TARGET = xALPHA)
+AM_CONDITIONAL(IA64, test x$TARGET = xIA64)
+AM_CONDITIONAL(M32R, test x$TARGET = xM32R)
+AM_CONDITIONAL(M68K, test x$TARGET = xM68K)
+AM_CONDITIONAL(MOXIE, test x$TARGET = xMOXIE)
+AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC)
+AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX)
+AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
+AM_CONDITIONAL(POWERPC_FREEBSD, test x$TARGET = xPOWERPC_FREEBSD)
+AM_CONDITIONAL(ARM, test x$TARGET = xARM)
+AM_CONDITIONAL(AVR32, test x$TARGET = xAVR32)
+AM_CONDITIONAL(LIBFFI_CRIS, test x$TARGET = xLIBFFI_CRIS)
+AM_CONDITIONAL(FRV, test x$TARGET = xFRV)
+AM_CONDITIONAL(S390, test x$TARGET = xS390)
+AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64)
+AM_CONDITIONAL(SH, test x$TARGET = xSH)
+AM_CONDITIONAL(SH64, test x$TARGET = xSH64)
+AM_CONDITIONAL(PA_LINUX, test x$TARGET = xPA_LINUX)
+AM_CONDITIONAL(PA_HPUX, test x$TARGET = xPA_HPUX)
+AM_CONDITIONAL(PA64_HPUX, test x$TARGET = xPA64_HPUX)
+
+AC_HEADER_STDC
+AC_CHECK_FUNCS(memcpy)
+AC_FUNC_ALLOCA
+
+AC_CHECK_SIZEOF(double)
+AC_CHECK_SIZEOF(long double)
+
+# Also AC_SUBST this variable for ffi.h.
+if test -z "$HAVE_LONG_DOUBLE"; then
+  HAVE_LONG_DOUBLE=0
+  if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then
+    if test $ac_cv_sizeof_long_double != 0; then
+      HAVE_LONG_DOUBLE=1
+      AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the long double type and it is bigger than a double])
+    fi
+  fi
+fi
+AC_SUBST(HAVE_LONG_DOUBLE)
+
+AC_C_BIGENDIAN
+
+AC_CACHE_CHECK([assembler .cfi pseudo-op support],
+    libffi_cv_as_cfi_pseudo_op, [
+    libffi_cv_as_cfi_pseudo_op=unknown
+    AC_TRY_COMPILE([asm (".cfi_startproc\n\t.cfi_endproc");],,
+		   [libffi_cv_as_cfi_pseudo_op=yes],
+		   [libffi_cv_as_cfi_pseudo_op=no])
+])
+if test "x$libffi_cv_as_cfi_pseudo_op" = xyes; then
+    AC_DEFINE(HAVE_AS_CFI_PSEUDO_OP, 1,
+	      [Define if your assembler supports .cfi_* directives.])
+fi
+
+if test x$TARGET = xSPARC; then
+    AC_CACHE_CHECK([assembler and linker support unaligned pc related relocs],
+	libffi_cv_as_sparc_ua_pcrel, [
+	save_CFLAGS="$CFLAGS"
+	save_LDFLAGS="$LDFLAGS"
+	CFLAGS="$CFLAGS -fpic"
+	LDFLAGS="$LDFLAGS -shared"
+	AC_TRY_LINK([asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");],,
+		    [libffi_cv_as_sparc_ua_pcrel=yes],
+		    [libffi_cv_as_sparc_ua_pcrel=no])
+	CFLAGS="$save_CFLAGS"
+	LDFLAGS="$save_LDFLAGS"])
+    if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then
+	AC_DEFINE(HAVE_AS_SPARC_UA_PCREL, 1,
+		  [Define if your assembler and linker support unaligned PC relative relocs.])
+    fi
+
+    AC_CACHE_CHECK([assembler .register pseudo-op support],
+       libffi_cv_as_register_pseudo_op, [
+       libffi_cv_as_register_pseudo_op=unknown
+       # Check if we have .register
+       AC_TRY_COMPILE([asm (".register %g2, #scratch");],,
+		       [libffi_cv_as_register_pseudo_op=yes],
+		       [libffi_cv_as_register_pseudo_op=no])
+    ])
+    if test "x$libffi_cv_as_register_pseudo_op" = xyes; then
+       AC_DEFINE(HAVE_AS_REGISTER_PSEUDO_OP, 1,
+	       [Define if your assembler supports .register.])
+    fi
+fi
+
+if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then
+    AC_CACHE_CHECK([assembler supports pc related relocs],
+	libffi_cv_as_x86_pcrel, [
+	libffi_cv_as_x86_pcrel=no
+	echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
+	if $CC $CFLAGS -c conftest.s > /dev/null; then
+	   libffi_cv_as_x86_pcrel=yes
+	fi
+	])
+    if test "x$libffi_cv_as_x86_pcrel" = xyes; then
+	AC_DEFINE(HAVE_AS_X86_PCREL, 1,
+		  [Define if your assembler supports PC relative relocs.])
+    fi
+
+    AC_CACHE_CHECK([assembler .ascii pseudo-op support],
+       libffi_cv_as_ascii_pseudo_op, [
+       libffi_cv_as_ascii_pseudo_op=unknown
+       # Check if we have .ascii
+       AC_TRY_COMPILE([asm (".ascii \\"string\\"");],,
+		       [libffi_cv_as_ascii_pseudo_op=yes],
+		       [libffi_cv_as_ascii_pseudo_op=no])
+    ])
+    if test "x$libffi_cv_as_ascii_pseudo_op" = xyes; then
+       AC_DEFINE(HAVE_AS_ASCII_PSEUDO_OP, 1,
+	       [Define if your assembler supports .ascii.])
+    fi
+
+    AC_CACHE_CHECK([assembler .string pseudo-op support],
+       libffi_cv_as_string_pseudo_op, [
+       libffi_cv_as_string_pseudo_op=unknown
+       # Check if we have .string
+       AC_TRY_COMPILE([asm (".string \\"string\\"");],,
+		       [libffi_cv_as_string_pseudo_op=yes],
+		       [libffi_cv_as_string_pseudo_op=no])
+    ])
+    if test "x$libffi_cv_as_string_pseudo_op" = xyes; then
+       AC_DEFINE(HAVE_AS_STRING_PSEUDO_OP, 1,
+	       [Define if your assembler supports .string.])
+    fi
+fi
+
+if test x$TARGET = xX86_WIN64; then
+    LT_SYS_SYMBOL_USCORE
+    if test "x$sys_symbol_underscore" = xyes; then
+        AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.])
+    fi
+fi
+
+
+FFI_EXEC_TRAMPOLINE_TABLE=0
+case "$target" in
+     *arm*-apple-darwin*)
+       FFI_EXEC_TRAMPOLINE_TABLE=1
+       AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1,
+                 [Cannot use PROT_EXEC on this target, so, we revert to
+                   alternative means])
+     ;;
+     *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*)
+       AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1,
+                 [Cannot use malloc on this target, so, we revert to
+                   alternative means])
+     ;;
+esac
+AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1)
+AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE)
+
+if test x$TARGET = xX86_64; then
+    AC_CACHE_CHECK([assembler supports unwind section type],
+	libffi_cv_as_x86_64_unwind_section_type, [
+	libffi_cv_as_x86_64_unwind_section_type=yes
+	echo '.section .eh_frame,"a",@unwind' > conftest.s
+	if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
+	    libffi_cv_as_x86_64_unwind_section_type=no
+	fi
+	])
+    if test "x$libffi_cv_as_x86_64_unwind_section_type" = xyes; then
+	AC_DEFINE(HAVE_AS_X86_64_UNWIND_SECTION_TYPE, 1,
+		  [Define if your assembler supports unwind section type.])
+    fi
+fi
+
+if test "x$GCC" = "xyes"; then
+  AC_CACHE_CHECK([whether .eh_frame section should be read-only],
+      libffi_cv_ro_eh_frame, [
+  	libffi_cv_ro_eh_frame=no
+  	echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
+  	if $CC $CFLAGS -S -fpic -fexceptions -o conftest.s conftest.c > /dev/null 2>&1; then
+  	    if grep '.section.*eh_frame.*"a"' conftest.s > /dev/null; then
+  		libffi_cv_ro_eh_frame=yes
+  	    elif grep '.section.*eh_frame.*#alloc' conftest.c \
+  		 | grep -v '#write' > /dev/null; then
+  		libffi_cv_ro_eh_frame=yes
+  	    fi
+  	fi
+  	rm -f conftest.*
+      ])
+  if test "x$libffi_cv_ro_eh_frame" = xyes; then
+      AC_DEFINE(HAVE_RO_EH_FRAME, 1,
+  	      [Define if .eh_frame sections should be read-only.])
+      AC_DEFINE(EH_FRAME_FLAGS, "a",
+  	      [Define to the flags needed for the .section .eh_frame directive.  ])
+  else
+      AC_DEFINE(EH_FRAME_FLAGS, "aw",
+  	      [Define to the flags needed for the .section .eh_frame directive.  ])
+  fi
+
+  AC_CACHE_CHECK([for __attribute__((visibility("hidden")))],
+      libffi_cv_hidden_visibility_attribute, [
+  	echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1  ; }' > conftest.c
+  	libffi_cv_hidden_visibility_attribute=no
+  	if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then
+  	    if grep '\.hidden.*foo' conftest.s >/dev/null; then
+  		libffi_cv_hidden_visibility_attribute=yes
+  	    fi
+  	fi
+  	rm -f conftest.*
+      ])
+  if test $libffi_cv_hidden_visibility_attribute = yes; then
+      AC_DEFINE(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE, 1,
+  	      [Define if __attribute__((visibility("hidden"))) is supported.])
+  fi
+fi
+
+AH_BOTTOM([
+#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
+#ifdef LIBFFI_ASM
+#define FFI_HIDDEN(name) .hidden name
+#else
+#define FFI_HIDDEN __attribute__ ((visibility ("hidden")))
+#endif
+#else
+#ifdef LIBFFI_ASM
+#define FFI_HIDDEN(name)
+#else
+#define FFI_HIDDEN
+#endif
+#endif
+])
+
+AC_SUBST(TARGET)
+AC_SUBST(TARGETDIR)
+
+AC_SUBST(SHELL)
+
+AC_ARG_ENABLE(debug,
+[  --enable-debug          debugging mode],
+  if test "$enable_debug" = "yes"; then
+    AC_DEFINE(FFI_DEBUG, 1, [Define this if you want extra debugging.])
+  fi)
+AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes")
+
+AC_ARG_ENABLE(structs,
+[  --disable-structs       omit code for struct support],
+  if test "$enable_structs" = "no"; then
+    AC_DEFINE(FFI_NO_STRUCTS, 1, [Define this is you do not want support for aggregate types.])
+  fi)
+
+AC_ARG_ENABLE(raw-api,
+[  --disable-raw-api       make the raw api unavailable],
+  if test "$enable_raw_api" = "no"; then
+    AC_DEFINE(FFI_NO_RAW_API, 1, [Define this is you do not want support for the raw API.])
+  fi)
+
+AC_ARG_ENABLE(purify-safety,
+[  --enable-purify-safety  purify-safe mode],
+  if test "$enable_purify_safety" = "yes"; then
+    AC_DEFINE(USING_PURIFY, 1, [Define this if you are using Purify and want to suppress spurious messages.])
+  fi)
+
+# These variables are only ever used when we cross-build to X86_WIN32.
+# And we only support this with GCC, so...
+if test x"$GCC" != x"no"; then
+  if test -n "$with_cross_host" &&
+     test x"$with_cross_host" != x"no"; then
+    toolexecdir='$(exec_prefix)/$(target_alias)'
+    toolexeclibdir='$(toolexecdir)/lib'
+  else
+    toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
+    toolexeclibdir='$(libdir)'
+  fi
+  multi_os_directory=`$CC -print-multi-os-directory`
+  case $multi_os_directory in
+    .) ;; # Avoid trailing /.
+    *) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;;
+  esac
+  AC_SUBST(toolexecdir)
+  AC_SUBST(toolexeclibdir)
+fi
+
+if test "${multilib}" = "yes"; then
+  multilib_arg="--enable-multilib"
+else
+  multilib_arg=
+fi
+
+AC_CONFIG_COMMANDS(include, [test -d include || mkdir include])
+AC_CONFIG_COMMANDS(src, [
+test -d src || mkdir src
+test -d src/$TARGETDIR || mkdir src/$TARGETDIR
+], [TARGETDIR="$TARGETDIR"])
+
+AC_CONFIG_LINKS(include/ffitarget.h:src/$TARGETDIR/ffitarget.h)
+
+AC_CONFIG_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile libffi.pc)
+
+AC_OUTPUT
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.host b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.host
new file mode 100644
index 0000000..f52457b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/configure.host
@@ -0,0 +1,11 @@
+# configure.host
+#
+# This shell script handles all host based configuration for libffi.
+# 
+
+# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
+case "${host}" in
+  frv*-elf)
+    LDFLAGS=`echo $LDFLAGS | sed "s/\-B[^ ]*libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/
+    ;;
+esac
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/depcomp b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/depcomp
new file mode 100755
index 0000000..df8eea7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/depcomp
@@ -0,0 +1,630 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
+# Software Foundation, Inc.
+
+# 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 2, 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 <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputing dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u="sed s,\\\\\\\\,/,g"
+   depmode=msvisualcpp
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> "$depfile"
+    echo >> "$depfile"
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${
+	       s/^ *//
+	       s/ \\*$//
+	       s/$/:/
+	       p
+	     }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.info b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.info
new file mode 100644
index 0000000..449320c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.info
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.texi b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.texi
new file mode 100644
index 0000000..5cdd667
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/libffi.texi
@@ -0,0 +1,600 @@
+\input texinfo   @c -*-texinfo-*-
+@c %**start of header
+@setfilename libffi.info
+@settitle libffi
+@setchapternewpage off
+@c %**end of header
+
+@c Merge the standard indexes into a single one.
+@syncodeindex fn cp
+@syncodeindex vr cp
+@syncodeindex ky cp
+@syncodeindex pg cp
+@syncodeindex tp cp
+
+@include version.texi
+
+@copying
+
+This manual is for Libffi, a portable foreign-function interface
+library.
+
+Copyright @copyright{} 2008, 2010 Red Hat, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.  A copy of the license is included in the
+section entitled ``GNU General Public License''.
+
+@end quotation
+@end copying
+
+@dircategory Development
+@direntry
+* libffi: (libffi).             Portable foreign-function interface library.
+@end direntry
+
+@titlepage
+@title Libffi
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+
+@ifnottex
+@node Top
+@top libffi
+
+@insertcopying
+
+@menu
+* Introduction::                What is libffi?
+* Using libffi::                How to use libffi.
+* Missing Features::            Things libffi can't do.
+* Index::                       Index.
+@end menu
+
+@end ifnottex
+
+
+@node Introduction
+@chapter What is libffi?
+
+Compilers for high level languages generate code that follow certain
+conventions.  These conventions are necessary, in part, for separate
+compilation to work.  One such convention is the @dfn{calling
+convention}.  The calling convention is a set of assumptions made by
+the compiler about where function arguments will be found on entry to
+a function.  A calling convention also specifies where the return
+value for a function is found.  The calling convention is also
+sometimes called the @dfn{ABI} or @dfn{Application Binary Interface}.
+@cindex calling convention
+@cindex ABI
+@cindex Application Binary Interface
+
+Some programs may not know at the time of compilation what arguments
+are to be passed to a function.  For instance, an interpreter may be
+told at run-time about the number and types of arguments used to call
+a given function.  @samp{Libffi} can be used in such programs to
+provide a bridge from the interpreter program to compiled code.
+
+The @samp{libffi} library provides a portable, high level programming
+interface to various calling conventions.  This allows a programmer to
+call any function specified by a call interface description at run
+time.
+
+@acronym{FFI} stands for Foreign Function Interface.  A foreign
+function interface is the popular name for the interface that allows
+code written in one language to call code written in another language.
+The @samp{libffi} library really only provides the lowest, machine
+dependent layer of a fully featured foreign function interface.  A
+layer must exist above @samp{libffi} that handles type conversions for
+values passed between the two languages.
+@cindex FFI
+@cindex Foreign Function Interface
+
+
+@node Using libffi
+@chapter Using libffi
+
+@menu
+* The Basics::                  The basic libffi API.
+* Simple Example::              A simple example.
+* Types::                       libffi type descriptions.
+* Multiple ABIs::               Different passing styles on one platform.
+* The Closure API::             Writing a generic function.
+* Closure Example::             A closure example.
+@end menu
+
+
+@node The Basics
+@section The Basics
+
+@samp{Libffi} assumes that you have a pointer to the function you wish
+to call and that you know the number and types of arguments to pass
+it, as well as the return type of the function.
+
+The first thing you must do is create an @code{ffi_cif} object that
+matches the signature of the function you wish to call.  This is a
+separate step because it is common to make multiple calls using a
+single @code{ffi_cif}.  The @dfn{cif} in @code{ffi_cif} stands for
+Call InterFace.  To prepare a call interface object, use the function
+@code{ffi_prep_cif}.
+@cindex cif
+
+@findex ffi_prep_cif
+@defun ffi_status ffi_prep_cif (ffi_cif *@var{cif}, ffi_abi @var{abi}, unsigned int @var{nargs}, ffi_type *@var{rtype}, ffi_type **@var{argtypes})
+This initializes @var{cif} according to the given parameters.
+
+@var{abi} is the ABI to use; normally @code{FFI_DEFAULT_ABI} is what
+you want.  @ref{Multiple ABIs} for more information.
+
+@var{nargs} is the number of arguments that this function accepts.
+@samp{libffi} does not yet handle varargs functions; see @ref{Missing
+Features} for more information.
+
+@var{rtype} is a pointer to an @code{ffi_type} structure that
+describes the return type of the function.  @xref{Types}.
+
+@var{argtypes} is a vector of @code{ffi_type} pointers.
+@var{argtypes} must have @var{nargs} elements.  If @var{nargs} is 0,
+this argument is ignored.
+
+@code{ffi_prep_cif} returns a @code{libffi} status code, of type
+@code{ffi_status}.  This will be either @code{FFI_OK} if everything
+worked properly; @code{FFI_BAD_TYPEDEF} if one of the @code{ffi_type}
+objects is incorrect; or @code{FFI_BAD_ABI} if the @var{abi} parameter
+is invalid.
+@end defun
+
+
+To call a function using an initialized @code{ffi_cif}, use the
+@code{ffi_call} function:
+
+@findex ffi_call
+@defun void ffi_call (ffi_cif *@var{cif}, void *@var{fn}, void *@var{rvalue}, void **@var{avalues})
+This calls the function @var{fn} according to the description given in
+@var{cif}.  @var{cif} must have already been prepared using
+@code{ffi_prep_cif}.
+
+@var{rvalue} is a pointer to a chunk of memory that will hold the
+result of the function call.  This must be large enough to hold the
+result and must be suitably aligned; it is the caller's responsibility
+to ensure this.  If @var{cif} declares that the function returns
+@code{void} (using @code{ffi_type_void}), then @var{rvalue} is
+ignored.  If @var{rvalue} is @samp{NULL}, then the return value is
+discarded.
+
+@var{avalues} is a vector of @code{void *} pointers that point to the
+memory locations holding the argument values for a call.  If @var{cif}
+declares that the function has no arguments (i.e., @var{nargs} was 0),
+then @var{avalues} is ignored.  Note that argument values may be
+modified by the callee (for instance, structs passed by value); the
+burden of copying pass-by-value arguments is placed on the caller.
+@end defun
+
+
+@node Simple Example
+@section Simple Example
+
+Here is a trivial example that calls @code{puts} a few times.
+
+@example
+#include <stdio.h>
+#include <ffi.h>
+
+int main()
+@{
+  ffi_cif cif;
+  ffi_type *args[1];
+  void *values[1];
+  char *s;
+  int rc;
+  
+  /* Initialize the argument info vectors */    
+  args[0] = &ffi_type_pointer;
+  values[0] = &s;
+  
+  /* Initialize the cif */
+  if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 
+		       &ffi_type_uint, args) == FFI_OK)
+    @{
+      s = "Hello World!";
+      ffi_call(&cif, puts, &rc, values);
+      /* rc now holds the result of the call to puts */
+      
+      /* values holds a pointer to the function's arg, so to 
+         call puts() again all we need to do is change the 
+         value of s */
+      s = "This is cool!";
+      ffi_call(&cif, puts, &rc, values);
+    @}
+  
+  return 0;
+@}
+@end example
+
+
+@node Types
+@section Types
+
+@menu
+* Primitive Types::             Built-in types.
+* Structures::                  Structure types.
+* Type Example::                Structure type example.
+@end menu
+
+@node Primitive Types
+@subsection Primitive Types
+
+@code{Libffi} provides a number of built-in type descriptors that can
+be used to describe argument and return types:
+
+@table @code
+@item ffi_type_void
+@tindex ffi_type_void
+The type @code{void}.  This cannot be used for argument types, only
+for return values.
+
+@item ffi_type_uint8
+@tindex ffi_type_uint8
+An unsigned, 8-bit integer type.
+
+@item ffi_type_sint8
+@tindex ffi_type_sint8
+A signed, 8-bit integer type.
+
+@item ffi_type_uint16
+@tindex ffi_type_uint16
+An unsigned, 16-bit integer type.
+
+@item ffi_type_sint16
+@tindex ffi_type_sint16
+A signed, 16-bit integer type.
+
+@item ffi_type_uint32
+@tindex ffi_type_uint32
+An unsigned, 32-bit integer type.
+
+@item ffi_type_sint32
+@tindex ffi_type_sint32
+A signed, 32-bit integer type.
+
+@item ffi_type_uint64
+@tindex ffi_type_uint64
+An unsigned, 64-bit integer type.
+
+@item ffi_type_sint64
+@tindex ffi_type_sint64
+A signed, 64-bit integer type.
+
+@item ffi_type_float
+@tindex ffi_type_float
+The C @code{float} type.
+
+@item ffi_type_double
+@tindex ffi_type_double
+The C @code{double} type.
+
+@item ffi_type_uchar
+@tindex ffi_type_uchar
+The C @code{unsigned char} type.
+
+@item ffi_type_schar
+@tindex ffi_type_schar
+The C @code{signed char} type.  (Note that there is not an exact
+equivalent to the C @code{char} type in @code{libffi}; ordinarily you
+should either use @code{ffi_type_schar} or @code{ffi_type_uchar}
+depending on whether @code{char} is signed.)
+
+@item ffi_type_ushort
+@tindex ffi_type_ushort
+The C @code{unsigned short} type.
+
+@item ffi_type_sshort
+@tindex ffi_type_sshort
+The C @code{short} type.
+
+@item ffi_type_uint
+@tindex ffi_type_uint
+The C @code{unsigned int} type.
+
+@item ffi_type_sint
+@tindex ffi_type_sint
+The C @code{int} type.
+
+@item ffi_type_ulong
+@tindex ffi_type_ulong
+The C @code{unsigned long} type.
+
+@item ffi_type_slong
+@tindex ffi_type_slong
+The C @code{long} type.
+
+@item ffi_type_longdouble
+@tindex ffi_type_longdouble
+On platforms that have a C @code{long double} type, this is defined.
+On other platforms, it is not.
+
+@item ffi_type_pointer
+@tindex ffi_type_pointer
+A generic @code{void *} pointer.  You should use this for all
+pointers, regardless of their real type.
+@end table
+
+Each of these is of type @code{ffi_type}, so you must take the address
+when passing to @code{ffi_prep_cif}.
+
+
+@node Structures
+@subsection Structures
+
+Although @samp{libffi} has no special support for unions or
+bit-fields, it is perfectly happy passing structures back and forth.
+You must first describe the structure to @samp{libffi} by creating a
+new @code{ffi_type} object for it.
+
+@tindex ffi_type
+@deftp ffi_type
+The @code{ffi_type} has the following members:
+@table @code
+@item size_t size
+This is set by @code{libffi}; you should initialize it to zero.
+
+@item unsigned short alignment
+This is set by @code{libffi}; you should initialize it to zero.
+
+@item unsigned short type
+For a structure, this should be set to @code{FFI_TYPE_STRUCT}.
+
+@item ffi_type **elements
+This is a @samp{NULL}-terminated array of pointers to @code{ffi_type}
+objects.  There is one element per field of the struct.
+@end table
+@end deftp
+
+
+@node Type Example
+@subsection Type Example
+
+The following example initializes a @code{ffi_type} object
+representing the @code{tm} struct from Linux's @file{time.h}.
+
+Here is how the struct is defined:
+
+@example
+struct tm @{
+    int tm_sec;
+    int tm_min;
+    int tm_hour;
+    int tm_mday;
+    int tm_mon;
+    int tm_year;
+    int tm_wday;
+    int tm_yday;
+    int tm_isdst;
+    /* Those are for future use. */
+    long int __tm_gmtoff__;
+    __const char *__tm_zone__;
+@};
+@end example
+
+Here is the corresponding code to describe this struct to
+@code{libffi}:
+
+@example
+    @{
+      ffi_type tm_type;
+      ffi_type *tm_type_elements[12];
+      int i;
+
+      tm_type.size = tm_type.alignment = 0;
+      tm_type.elements = &tm_type_elements;
+    
+      for (i = 0; i < 9; i++)
+          tm_type_elements[i] = &ffi_type_sint;
+
+      tm_type_elements[9] = &ffi_type_slong;
+      tm_type_elements[10] = &ffi_type_pointer;
+      tm_type_elements[11] = NULL;
+
+      /* tm_type can now be used to represent tm argument types and
+	 return types for ffi_prep_cif() */
+    @}
+@end example
+
+
+@node Multiple ABIs
+@section Multiple ABIs
+
+A given platform may provide multiple different ABIs at once.  For
+instance, the x86 platform has both @samp{stdcall} and @samp{fastcall}
+functions.
+
+@code{libffi} provides some support for this.  However, this is
+necessarily platform-specific.
+
+@c FIXME: document the platforms
+
+@node The Closure API
+@section The Closure API
+
+@code{libffi} also provides a way to write a generic function -- a
+function that can accept and decode any combination of arguments.
+This can be useful when writing an interpreter, or to provide wrappers
+for arbitrary functions.
+
+This facility is called the @dfn{closure API}.  Closures are not
+supported on all platforms; you can check the @code{FFI_CLOSURES}
+define to determine whether they are supported on the current
+platform.
+@cindex closures
+@cindex closure API
+@findex FFI_CLOSURES
+
+Because closures work by assembling a tiny function at runtime, they
+require special allocation on platforms that have a non-executable
+heap.  Memory management for closures is handled by a pair of
+functions:
+
+@findex ffi_closure_alloc
+@defun void *ffi_closure_alloc (size_t @var{size}, void **@var{code})
+Allocate a chunk of memory holding @var{size} bytes.  This returns a
+pointer to the writable address, and sets *@var{code} to the
+corresponding executable address.
+
+@var{size} should be sufficient to hold a @code{ffi_closure} object.
+@end defun
+
+@findex ffi_closure_free
+@defun void ffi_closure_free (void *@var{writable})
+Free memory allocated using @code{ffi_closure_alloc}.  The argument is
+the writable address that was returned.
+@end defun
+
+
+Once you have allocated the memory for a closure, you must construct a
+@code{ffi_cif} describing the function call.  Finally you can prepare
+the closure function:
+
+@findex ffi_prep_closure_loc
+@defun ffi_status ffi_prep_closure_loc (ffi_closure *@var{closure}, ffi_cif *@var{cif}, void (*@var{fun}) (ffi_cif *@var{cif}, void *@var{ret}, void **@var{args}, void *@var{user_data}), void *@var{user_data}, void *@var{codeloc})
+Prepare a closure function.
+
+@var{closure} is the address of a @code{ffi_closure} object; this is
+the writable address returned by @code{ffi_closure_alloc}.
+
+@var{cif} is the @code{ffi_cif} describing the function parameters.
+
+@var{user_data} is an arbitrary datum that is passed, uninterpreted,
+to your closure function.
+
+@var{codeloc} is the executable address returned by
+@code{ffi_closure_alloc}.
+
+@var{fun} is the function which will be called when the closure is
+invoked.  It is called with the arguments:
+@table @var
+@item cif
+The @code{ffi_cif} passed to @code{ffi_prep_closure_loc}.
+
+@item ret
+A pointer to the memory used for the function's return value.
+@var{fun} must fill this, unless the function is declared as returning
+@code{void}.
+@c FIXME: is this NULL for void-returning functions?
+
+@item args
+A vector of pointers to memory holding the arguments to the function.
+
+@item user_data
+The same @var{user_data} that was passed to
+@code{ffi_prep_closure_loc}.
+@end table
+
+@code{ffi_prep_closure_loc} will return @code{FFI_OK} if everything
+went ok, and something else on error.
+@c FIXME: what?
+
+After calling @code{ffi_prep_closure_loc}, you can cast @var{codeloc}
+to the appropriate pointer-to-function type.
+@end defun
+
+You may see old code referring to @code{ffi_prep_closure}.  This
+function is deprecated, as it cannot handle the need for separate
+writable and executable addresses.
+
+@node Closure Example
+@section Closure Example
+
+A trivial example that creates a new @code{puts} by binding 
+@code{fputs} with @code{stdin}.
+
+@example
+#include <stdio.h>
+#include <ffi.h>
+
+/* Acts like puts with the file given at time of enclosure. */
+void puts_binding(ffi_cif *cif, unsigned int *ret, void* args[], 
+                  FILE *stream)
+@{
+  *ret = fputs(*(char **)args[0], stream);
+@}
+
+int main()
+@{
+  ffi_cif cif;
+  ffi_type *args[1];
+  ffi_closure *closure;
+
+  int (*bound_puts)(char *);
+  int rc;
+  
+  /* Allocate closure and bound_puts */
+  closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);
+
+  if (closure)
+    @{
+      /* Initialize the argument info vectors */
+      args[0] = &ffi_type_pointer;
+
+      /* Initialize the cif */
+      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+                       &ffi_type_uint, args) == FFI_OK)
+        @{
+          /* Initialize the closure, setting stream to stdout */
+          if (ffi_prep_closure_loc(closure, &cif, puts_binding, 
+                                   stdout, bound_puts) == FFI_OK)
+            @{
+              rc = bound_puts("Hello World!");
+              /* rc now holds the result of the call to fputs */
+            @}
+        @}
+    @}
+
+  /* Deallocate both closure, and bound_puts */
+  ffi_closure_free(closure);
+
+  return 0;
+@}
+
+@end example
+
+
+@node Missing Features
+@chapter Missing Features
+
+@code{libffi} is missing a few features.  We welcome patches to add
+support for these.
+
+@itemize @bullet
+@item
+There is no support for calling varargs functions.  This may work on
+some platforms, depending on how the ABI is defined, but it is not
+reliable.
+
+@item
+There is no support for bit fields in structures.
+
+@item
+The closure API is
+
+@c FIXME: ...
+
+@item
+The ``raw'' API is undocumented.
+@c argument promotion?
+@c unions?
+@c anything else?
+@end itemize
+
+
+@node Index
+@unnumbered Index
+
+@printindex cp
+
+@bye
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/stamp-vti b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/stamp-vti
new file mode 100644
index 0000000..5377bb8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/stamp-vti
@@ -0,0 +1,4 @@
+@set UPDATED 23 August 2011
+@set UPDATED-MONTH August 2011
+@set EDITION 3.0.10
+@set VERSION 3.0.10
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/version.texi b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/version.texi
new file mode 100644
index 0000000..5377bb8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/doc/version.texi
@@ -0,0 +1,4 @@
+@set UPDATED 23 August 2011
+@set UPDATED-MONTH August 2011
+@set EDITION 3.0.10
+@set VERSION 3.0.10
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.h.in b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.h.in
new file mode 100644
index 0000000..6c92c56
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.h.in
@@ -0,0 +1,199 @@
+/* fficonfig.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+   systems. This function is required for `alloca.c' support on those systems.
+   */
+#undef CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#undef C_ALLOCA
+
+/* Define to the flags needed for the .section .eh_frame directive. */
+#undef EH_FRAME_FLAGS
+
+/* Define this if you want extra debugging. */
+#undef FFI_DEBUG
+
+/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */
+#undef FFI_EXEC_TRAMPOLINE_TABLE
+
+/* Cannot use malloc on this target, so, we revert to alternative means */
+#undef FFI_MMAP_EXEC_WRIT
+
+/* Define this is you do not want support for the raw API. */
+#undef FFI_NO_RAW_API
+
+/* Define this is you do not want support for aggregate types. */
+#undef FFI_NO_STRUCTS
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+   */
+#undef HAVE_ALLOCA_H
+
+/* Define if your assembler supports .ascii. */
+#undef HAVE_AS_ASCII_PSEUDO_OP
+
+/* Define if your assembler supports .cfi_* directives. */
+#undef HAVE_AS_CFI_PSEUDO_OP
+
+/* Define if your assembler supports .register. */
+#undef HAVE_AS_REGISTER_PSEUDO_OP
+
+/* Define if your assembler and linker support unaligned PC relative relocs.
+   */
+#undef HAVE_AS_SPARC_UA_PCREL
+
+/* Define if your assembler supports .string. */
+#undef HAVE_AS_STRING_PSEUDO_OP
+
+/* Define if your assembler supports unwind section type. */
+#undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
+
+/* Define if your assembler supports PC relative relocs. */
+#undef HAVE_AS_X86_PCREL
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define if __attribute__((visibility("hidden"))) is supported. */
+#undef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you have the long double type and it is bigger than a double */
+#undef HAVE_LONG_DOUBLE
+
+/* Define to 1 if you have the `memcpy' function. */
+#undef HAVE_MEMCPY
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mmap' function. */
+#undef HAVE_MMAP
+
+/* Define if mmap with MAP_ANON(YMOUS) works. */
+#undef HAVE_MMAP_ANON
+
+/* Define if mmap of /dev/zero works. */
+#undef HAVE_MMAP_DEV_ZERO
+
+/* Define if read-only mmap of a plain file works. */
+#undef HAVE_MMAP_FILE
+
+/* Define if .eh_frame sections should be read-only. */
+#undef HAVE_RO_EH_FRAME
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#undef HAVE_SYS_MMAN_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+#undef NO_MINUS_C_MINUS_O
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of `double', as computed by sizeof. */
+#undef SIZEOF_DOUBLE
+
+/* The size of `long double', as computed by sizeof. */
+#undef SIZEOF_LONG_DOUBLE
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at runtime.
+	STACK_DIRECTION > 0 => grows toward higher addresses
+	STACK_DIRECTION < 0 => grows toward lower addresses
+	STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define this if you are using Purify and want to suppress spurious messages.
+   */
+#undef USING_PURIFY
+
+/* Version number of package */
+#undef VERSION
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#  undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+
+#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
+#ifdef LIBFFI_ASM
+#define FFI_HIDDEN(name) .hidden name
+#else
+#define FFI_HIDDEN __attribute__ ((visibility ("hidden")))
+#endif
+#else
+#ifdef LIBFFI_ASM
+#define FFI_HIDDEN(name)
+#else
+#define FFI_HIDDEN
+#endif
+#endif
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.hw b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.hw
new file mode 100644
index 0000000..4d7506a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/fficonfig.hw
@@ -0,0 +1,57 @@
+/* -----------------------------------------------------------------*-C-*-
+   libffi - Copyright (c) 1996-2003, 2007, 2008  Red Hat, Inc.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+/* -------------------------------------------------------------------
+
+   -------------------------------------------------------------------- */
+
+#ifndef LIBFFICONFIG_H
+#define LIBFFICONFIG_H
+
+#define HAVE_ALLOCA         1
+#define HAVE_MEMCPY         1
+#define HAVE_MEMORY_H       1
+#define HAVE_STDLIB_H       1
+#define HAVE_STRING_H       1
+#define HAVE_SYS_STAT_H     1
+#define HAVE_SYS_TYPES_H    1
+#define STDC_HEADERS        1
+
+#if defined(X86_WIN64)
+#define SIZEOF_DOUBLE       8
+#define SIZEOF_LONG_DOUBLE  0
+#else
+#define SIZEOF_DOUBLE       8
+#define SIZEOF_LONG_DOUBLE  0
+#endif
+
+#ifdef LIBFFI_ASM
+#define FFI_HIDDEN(name)
+#else
+#define FFI_HIDDEN
+#endif
+
+#endif /* LIBFFICONFIG_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.am b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.am
new file mode 100644
index 0000000..fd28024
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.am
@@ -0,0 +1,9 @@
+## Process this with automake to create Makefile.in
+
+AUTOMAKE_OPTIONS=foreign
+
+DISTCLEANFILES=ffitarget.h
+EXTRA_DIST=ffi.h.in ffi_common.h
+
+includesdir = $(libdir)/@PACKAGE_NAME@-@PACKAGE_VERSION@/include
+nodist_includes_HEADERS = ffi.h ffitarget.h
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.in b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.in
new file mode 100644
index 0000000..f3d3ef2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/Makefile.in
@@ -0,0 +1,487 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = include
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/ffi.h.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \
+	$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
+	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
+	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
+	$(top_srcdir)/m4/ax_configure_args.m4 \
+	$(top_srcdir)/m4/ax_enable_builddir.m4 \
+	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
+	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/fficonfig.h
+CONFIG_CLEAN_FILES = ffi.h ffitarget.h
+CONFIG_CLEAN_VPATH_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(includesdir)"
+HEADERS = $(nodist_includes_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_LTLDFLAGS = @AM_LTLDFLAGS@
+AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PRTDIAG = @PRTDIAG@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TARGET = @TARGET@
+TARGETDIR = @TARGETDIR@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_enable_builddir_sed = @ax_enable_builddir_sed@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+toolexecdir = @toolexecdir@
+toolexeclibdir = @toolexeclibdir@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+DISTCLEANFILES = ffitarget.h
+EXTRA_DIST = ffi.h.in ffi_common.h
+includesdir = $(libdir)/@PACKAGE_NAME@-@PACKAGE_VERSION@/include
+nodist_includes_HEADERS = ffi.h ffitarget.h
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign include/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+ffi.h: $(top_builddir)/config.status $(srcdir)/ffi.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-nodist_includesHEADERS: $(nodist_includes_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
+	@list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
+	done
+
+uninstall-nodist_includesHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(nodist_includes_HEADERS)'; test -n "$(includesdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$files" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(includesdir)" && rm -f $$files
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(includesdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-nodist_includesHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-nodist_includesHEADERS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+	clean-libtool ctags distclean distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-nodist_includesHEADERS \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-nodist_includesHEADERS
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.in b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.in
new file mode 100644
index 0000000..f5a29b0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.in
@@ -0,0 +1,427 @@
+/* -----------------------------------------------------------------*-C-*-
+   libffi @VERSION@ - Copyright (c) 2011 Anthony Green
+                    - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+/* -------------------------------------------------------------------
+   The basic API is described in the README file.
+
+   The raw API is designed to bypass some of the argument packing
+   and unpacking on architectures for which it can be avoided.
+
+   The closure API allows interpreted functions to be packaged up
+   inside a C function pointer, so that they can be called as C functions,
+   with no understanding on the client side that they are interpreted.
+   It can also be used in other cases in which it is necessary to package
+   up a user specified parameter and a function pointer as a single
+   function pointer.
+
+   The closure API must be implemented in order to get its functionality,
+   e.g. for use by gij.  Routines are provided to emulate the raw API
+   if the underlying platform doesn't allow faster implementation.
+
+   More details on the raw and cloure API can be found in:
+
+   http://gcc.gnu.org/ml/java/1999-q3/msg00138.html
+
+   and
+
+   http://gcc.gnu.org/ml/java/1999-q3/msg00174.html
+   -------------------------------------------------------------------- */
+
+#ifndef LIBFFI_H
+#define LIBFFI_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Specify which architecture libffi is configured for. */
+#ifndef @TARGET@
+#define @TARGET@
+#endif
+
+/* ---- System configuration information --------------------------------- */
+
+#include <ffitarget.h>
+
+#ifndef LIBFFI_ASM
+
+#ifdef _MSC_VER
+#define __attribute__(X)
+#endif
+
+#include <stddef.h>
+#include <limits.h>
+
+/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example).
+   But we can find it either under the correct ANSI name, or under GNU
+   C's internal name.  */
+
+#define FFI_64_BIT_MAX 9223372036854775807
+
+#ifdef LONG_LONG_MAX
+# define FFI_LONG_LONG_MAX LONG_LONG_MAX
+#else
+# ifdef LLONG_MAX
+#  define FFI_LONG_LONG_MAX LLONG_MAX
+#  ifdef _AIX52 /* or newer has C99 LLONG_MAX */
+#   undef FFI_64_BIT_MAX
+#   define FFI_64_BIT_MAX 9223372036854775807LL
+#  endif /* _AIX52 or newer */
+# else
+#  ifdef __GNUC__
+#   define FFI_LONG_LONG_MAX __LONG_LONG_MAX__
+#  endif
+#  ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */
+#   ifndef __PPC64__
+#    if defined (__IBMC__) || defined (__IBMCPP__)
+#     define FFI_LONG_LONG_MAX LONGLONG_MAX
+#    endif
+#   endif /* __PPC64__ */
+#   undef  FFI_64_BIT_MAX
+#   define FFI_64_BIT_MAX 9223372036854775807LL
+#  endif
+# endif
+#endif
+
+/* The closure code assumes that this works on pointers, i.e. a size_t	*/
+/* can hold a pointer.							*/
+
+typedef struct _ffi_type
+{
+  size_t size;
+  unsigned short alignment;
+  unsigned short type;
+  struct _ffi_type **elements;
+} ffi_type;
+
+#ifndef LIBFFI_HIDE_BASIC_TYPES
+#if SCHAR_MAX == 127
+# define ffi_type_uchar                ffi_type_uint8
+# define ffi_type_schar                ffi_type_sint8
+#else
+ #error "char size not supported"
+#endif
+
+#if SHRT_MAX == 32767
+# define ffi_type_ushort       ffi_type_uint16
+# define ffi_type_sshort       ffi_type_sint16
+#elif SHRT_MAX == 2147483647
+# define ffi_type_ushort       ffi_type_uint32
+# define ffi_type_sshort       ffi_type_sint32
+#else
+ #error "short size not supported"
+#endif
+
+#if INT_MAX == 32767
+# define ffi_type_uint         ffi_type_uint16
+# define ffi_type_sint         ffi_type_sint16
+#elif INT_MAX == 2147483647
+# define ffi_type_uint         ffi_type_uint32
+# define ffi_type_sint         ffi_type_sint32
+#elif INT_MAX == 9223372036854775807
+# define ffi_type_uint         ffi_type_uint64
+# define ffi_type_sint         ffi_type_sint64
+#else
+ #error "int size not supported"
+#endif
+
+#if LONG_MAX == 2147483647
+# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX
+ #error "no 64-bit data type supported"
+# endif
+#elif LONG_MAX != FFI_64_BIT_MAX
+ #error "long size not supported"
+#endif
+
+#if LONG_MAX == 2147483647
+# define ffi_type_ulong        ffi_type_uint32
+# define ffi_type_slong        ffi_type_sint32
+#elif LONG_MAX == FFI_64_BIT_MAX
+# define ffi_type_ulong        ffi_type_uint64
+# define ffi_type_slong        ffi_type_sint64
+#else
+ #error "long size not supported"
+#endif
+
+/* These are defined in types.c */
+extern ffi_type ffi_type_void;
+extern ffi_type ffi_type_uint8;
+extern ffi_type ffi_type_sint8;
+extern ffi_type ffi_type_uint16;
+extern ffi_type ffi_type_sint16;
+extern ffi_type ffi_type_uint32;
+extern ffi_type ffi_type_sint32;
+extern ffi_type ffi_type_uint64;
+extern ffi_type ffi_type_sint64;
+extern ffi_type ffi_type_float;
+extern ffi_type ffi_type_double;
+extern ffi_type ffi_type_pointer;
+
+#if @HAVE_LONG_DOUBLE@
+extern ffi_type ffi_type_longdouble;
+#else
+#define ffi_type_longdouble ffi_type_double
+#endif
+#endif /* LIBFFI_HIDE_BASIC_TYPES */
+
+typedef enum {
+  FFI_OK = 0,
+  FFI_BAD_TYPEDEF,
+  FFI_BAD_ABI
+} ffi_status;
+
+typedef unsigned FFI_TYPE;
+
+typedef struct {
+  ffi_abi abi;
+  unsigned nargs;
+  ffi_type **arg_types;
+  ffi_type *rtype;
+  unsigned bytes;
+  unsigned flags;
+#ifdef FFI_EXTRA_CIF_FIELDS
+  FFI_EXTRA_CIF_FIELDS;
+#endif
+} ffi_cif;
+
+/* ---- Definitions for the raw API -------------------------------------- */
+
+#ifndef FFI_SIZEOF_ARG
+# if LONG_MAX == 2147483647
+#  define FFI_SIZEOF_ARG        4
+# elif LONG_MAX == FFI_64_BIT_MAX
+#  define FFI_SIZEOF_ARG        8
+# endif
+#endif
+
+#ifndef FFI_SIZEOF_JAVA_RAW
+#  define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG
+#endif
+
+typedef union {
+  ffi_sarg  sint;
+  ffi_arg   uint;
+  float	    flt;
+  char      data[FFI_SIZEOF_ARG];
+  void*     ptr;
+} ffi_raw;
+
+#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8
+/* This is a special case for mips64/n32 ABI (and perhaps others) where
+   sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8.  */
+typedef union {
+  signed int	sint;
+  unsigned int	uint;
+  float		flt;
+  char		data[FFI_SIZEOF_JAVA_RAW];
+  void*		ptr;
+} ffi_java_raw;
+#else
+typedef ffi_raw ffi_java_raw;
+#endif
+
+
+void ffi_raw_call (ffi_cif *cif,
+		   void (*fn)(void),
+		   void *rvalue,
+		   ffi_raw *avalue);
+
+void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw);
+void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args);
+size_t ffi_raw_size (ffi_cif *cif);
+
+/* This is analogous to the raw API, except it uses Java parameter	*/
+/* packing, even on 64-bit machines.  I.e. on 64-bit machines		*/
+/* longs and doubles are followed by an empty 64-bit word.		*/
+
+void ffi_java_raw_call (ffi_cif *cif,
+			void (*fn)(void),
+			void *rvalue,
+			ffi_java_raw *avalue);
+
+void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw);
+void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args);
+size_t ffi_java_raw_size (ffi_cif *cif);
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#if FFI_CLOSURES
+
+#ifdef _MSC_VER
+__declspec(align(8))
+#endif
+typedef struct {
+  char tramp[FFI_TRAMPOLINE_SIZE];
+  ffi_cif   *cif;
+  void     (*fun)(ffi_cif*,void*,void**,void*);
+  void      *user_data;
+#ifdef __GNUC__
+} ffi_closure __attribute__((aligned (8)));
+#else
+} ffi_closure;
+# ifdef __sgi
+#  pragma pack 0
+# endif
+#endif
+
+void *ffi_closure_alloc (size_t size, void **code);
+void ffi_closure_free (void *);
+
+ffi_status
+ffi_prep_closure (ffi_closure*,
+		  ffi_cif *,
+		  void (*fun)(ffi_cif*,void*,void**,void*),
+		  void *user_data);
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure*,
+		      ffi_cif *,
+		      void (*fun)(ffi_cif*,void*,void**,void*),
+		      void *user_data,
+		      void*codeloc);
+
+#ifdef __sgi
+# pragma pack 8
+#endif
+typedef struct {
+  char tramp[FFI_TRAMPOLINE_SIZE];
+
+  ffi_cif   *cif;
+
+#if !FFI_NATIVE_RAW_API
+
+  /* if this is enabled, then a raw closure has the same layout 
+     as a regular closure.  We use this to install an intermediate 
+     handler to do the transaltion, void** -> ffi_raw*. */
+
+  void     (*translate_args)(ffi_cif*,void*,void**,void*);
+  void      *this_closure;
+
+#endif
+
+  void     (*fun)(ffi_cif*,void*,ffi_raw*,void*);
+  void      *user_data;
+
+} ffi_raw_closure;
+
+typedef struct {
+  char tramp[FFI_TRAMPOLINE_SIZE];
+
+  ffi_cif   *cif;
+
+#if !FFI_NATIVE_RAW_API
+
+  /* if this is enabled, then a raw closure has the same layout 
+     as a regular closure.  We use this to install an intermediate 
+     handler to do the transaltion, void** -> ffi_raw*. */
+
+  void     (*translate_args)(ffi_cif*,void*,void**,void*);
+  void      *this_closure;
+
+#endif
+
+  void     (*fun)(ffi_cif*,void*,ffi_java_raw*,void*);
+  void      *user_data;
+
+} ffi_java_raw_closure;
+
+ffi_status
+ffi_prep_raw_closure (ffi_raw_closure*,
+		      ffi_cif *cif,
+		      void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
+		      void *user_data);
+
+ffi_status
+ffi_prep_raw_closure_loc (ffi_raw_closure*,
+			  ffi_cif *cif,
+			  void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
+			  void *user_data,
+			  void *codeloc);
+
+ffi_status
+ffi_prep_java_raw_closure (ffi_java_raw_closure*,
+		           ffi_cif *cif,
+		           void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
+		           void *user_data);
+
+ffi_status
+ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*,
+			       ffi_cif *cif,
+			       void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
+			       void *user_data,
+			       void *codeloc);
+
+#endif /* FFI_CLOSURES */
+
+/* ---- Public interface definition -------------------------------------- */
+
+ffi_status ffi_prep_cif(ffi_cif *cif,
+			ffi_abi abi,
+			unsigned int nargs,
+			ffi_type *rtype,
+			ffi_type **atypes);
+
+void ffi_call(ffi_cif *cif,
+	      void (*fn)(void),
+	      void *rvalue,
+	      void **avalue);
+
+/* Useful for eliminating compiler warnings */
+#define FFI_FN(f) ((void (*)(void))f)
+
+/* ---- Definitions shared with assembly code ---------------------------- */
+
+#endif
+
+/* If these change, update src/mips/ffitarget.h. */
+#define FFI_TYPE_VOID       0    
+#define FFI_TYPE_INT        1
+#define FFI_TYPE_FLOAT      2    
+#define FFI_TYPE_DOUBLE     3
+#if @HAVE_LONG_DOUBLE@
+#define FFI_TYPE_LONGDOUBLE 4
+#else
+#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE
+#endif
+#define FFI_TYPE_UINT8      5   
+#define FFI_TYPE_SINT8      6
+#define FFI_TYPE_UINT16     7 
+#define FFI_TYPE_SINT16     8
+#define FFI_TYPE_UINT32     9
+#define FFI_TYPE_SINT32     10
+#define FFI_TYPE_UINT64     11
+#define FFI_TYPE_SINT64     12
+#define FFI_TYPE_STRUCT     13
+#define FFI_TYPE_POINTER    14
+
+/* This should always refer to the last type code (for sanity checks) */
+#define FFI_TYPE_LAST       FFI_TYPE_POINTER
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc
new file mode 100644
index 0000000..7ba954c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc
@@ -0,0 +1,427 @@
+/* -----------------------------------------------------------------*-C-*-
+   libffi 3.0.10 - Copyright (c) 2011 Anthony Green
+                    - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+/* -------------------------------------------------------------------
+   The basic API is described in the README file.
+
+   The raw API is designed to bypass some of the argument packing
+   and unpacking on architectures for which it can be avoided.
+
+   The closure API allows interpreted functions to be packaged up
+   inside a C function pointer, so that they can be called as C functions,
+   with no understanding on the client side that they are interpreted.
+   It can also be used in other cases in which it is necessary to package
+   up a user specified parameter and a function pointer as a single
+   function pointer.
+
+   The closure API must be implemented in order to get its functionality,
+   e.g. for use by gij.  Routines are provided to emulate the raw API
+   if the underlying platform doesn't allow faster implementation.
+
+   More details on the raw and cloure API can be found in:
+
+   http://gcc.gnu.org/ml/java/1999-q3/msg00138.html
+
+   and
+
+   http://gcc.gnu.org/ml/java/1999-q3/msg00174.html
+   -------------------------------------------------------------------- */
+
+#ifndef LIBFFI_H
+#define LIBFFI_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Specify which architecture libffi is configured for. */
+#ifndef X86_WIN32
+#define X86_WIN32
+#endif
+
+/* ---- System configuration information --------------------------------- */
+
+#include <ffitarget.h>
+
+#ifndef LIBFFI_ASM
+
+#ifdef _MSC_VER
+#define __attribute__(X)
+#endif
+
+#include <stddef.h>
+#include <limits.h>
+
+/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example).
+   But we can find it either under the correct ANSI name, or under GNU
+   C's internal name.  */
+
+#define FFI_64_BIT_MAX 9223372036854775807
+
+#ifdef LONG_LONG_MAX
+# define FFI_LONG_LONG_MAX LONG_LONG_MAX
+#else
+# ifdef LLONG_MAX
+#  define FFI_LONG_LONG_MAX LLONG_MAX
+#  ifdef _AIX52 /* or newer has C99 LLONG_MAX */
+#   undef FFI_64_BIT_MAX
+#   define FFI_64_BIT_MAX 9223372036854775807LL
+#  endif /* _AIX52 or newer */
+# else
+#  ifdef __GNUC__
+#   define FFI_LONG_LONG_MAX __LONG_LONG_MAX__
+#  endif
+#  ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */
+#   ifndef __PPC64__
+#    if defined (__IBMC__) || defined (__IBMCPP__)
+#     define FFI_LONG_LONG_MAX LONGLONG_MAX
+#    endif
+#   endif /* __PPC64__ */
+#   undef  FFI_64_BIT_MAX
+#   define FFI_64_BIT_MAX 9223372036854775807LL
+#  endif
+# endif
+#endif
+
+/* The closure code assumes that this works on pointers, i.e. a size_t	*/
+/* can hold a pointer.							*/
+
+typedef struct _ffi_type
+{
+  size_t size;
+  unsigned short alignment;
+  unsigned short type;
+  struct _ffi_type **elements;
+} ffi_type;
+
+#ifndef LIBFFI_HIDE_BASIC_TYPES
+#if SCHAR_MAX == 127
+# define ffi_type_uchar                ffi_type_uint8
+# define ffi_type_schar                ffi_type_sint8
+#else
+ #error "char size not supported"
+#endif
+
+#if SHRT_MAX == 32767
+# define ffi_type_ushort       ffi_type_uint16
+# define ffi_type_sshort       ffi_type_sint16
+#elif SHRT_MAX == 2147483647
+# define ffi_type_ushort       ffi_type_uint32
+# define ffi_type_sshort       ffi_type_sint32
+#else
+ #error "short size not supported"
+#endif
+
+#if INT_MAX == 32767
+# define ffi_type_uint         ffi_type_uint16
+# define ffi_type_sint         ffi_type_sint16
+#elif INT_MAX == 2147483647
+# define ffi_type_uint         ffi_type_uint32
+# define ffi_type_sint         ffi_type_sint32
+#elif INT_MAX == 9223372036854775807
+# define ffi_type_uint         ffi_type_uint64
+# define ffi_type_sint         ffi_type_sint64
+#else
+ #error "int size not supported"
+#endif
+
+#if LONG_MAX == 2147483647
+# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX
+ #error "no 64-bit data type supported"
+# endif
+#elif LONG_MAX != FFI_64_BIT_MAX
+ #error "long size not supported"
+#endif
+
+#if LONG_MAX == 2147483647
+# define ffi_type_ulong        ffi_type_uint32
+# define ffi_type_slong        ffi_type_sint32
+#elif LONG_MAX == FFI_64_BIT_MAX
+# define ffi_type_ulong        ffi_type_uint64
+# define ffi_type_slong        ffi_type_sint64
+#else
+ #error "long size not supported"
+#endif
+
+/* These are defined in types.c */
+extern ffi_type ffi_type_void;
+extern ffi_type ffi_type_uint8;
+extern ffi_type ffi_type_sint8;
+extern ffi_type ffi_type_uint16;
+extern ffi_type ffi_type_sint16;
+extern ffi_type ffi_type_uint32;
+extern ffi_type ffi_type_sint32;
+extern ffi_type ffi_type_uint64;
+extern ffi_type ffi_type_sint64;
+extern ffi_type ffi_type_float;
+extern ffi_type ffi_type_double;
+extern ffi_type ffi_type_pointer;
+
+#if 0
+extern ffi_type ffi_type_longdouble;
+#else
+#define ffi_type_longdouble ffi_type_double
+#endif
+#endif /* LIBFFI_HIDE_BASIC_TYPES */
+
+typedef enum {
+  FFI_OK = 0,
+  FFI_BAD_TYPEDEF,
+  FFI_BAD_ABI
+} ffi_status;
+
+typedef unsigned FFI_TYPE;
+
+typedef struct {
+  ffi_abi abi;
+  unsigned nargs;
+  ffi_type **arg_types;
+  ffi_type *rtype;
+  unsigned bytes;
+  unsigned flags;
+#ifdef FFI_EXTRA_CIF_FIELDS
+  FFI_EXTRA_CIF_FIELDS;
+#endif
+} ffi_cif;
+
+/* ---- Definitions for the raw API -------------------------------------- */
+
+#ifndef FFI_SIZEOF_ARG
+# if LONG_MAX == 2147483647
+#  define FFI_SIZEOF_ARG        4
+# elif LONG_MAX == FFI_64_BIT_MAX
+#  define FFI_SIZEOF_ARG        8
+# endif
+#endif
+
+#ifndef FFI_SIZEOF_JAVA_RAW
+#  define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG
+#endif
+
+typedef union {
+  ffi_sarg  sint;
+  ffi_arg   uint;
+  float	    flt;
+  char      data[FFI_SIZEOF_ARG];
+  void*     ptr;
+} ffi_raw;
+
+#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8
+/* This is a special case for mips64/n32 ABI (and perhaps others) where
+   sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8.  */
+typedef union {
+  signed int	sint;
+  unsigned int	uint;
+  float		flt;
+  char		data[FFI_SIZEOF_JAVA_RAW];
+  void*		ptr;
+} ffi_java_raw;
+#else
+typedef ffi_raw ffi_java_raw;
+#endif
+
+
+void ffi_raw_call (ffi_cif *cif,
+		   void (*fn)(void),
+		   void *rvalue,
+		   ffi_raw *avalue);
+
+void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw);
+void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args);
+size_t ffi_raw_size (ffi_cif *cif);
+
+/* This is analogous to the raw API, except it uses Java parameter	*/
+/* packing, even on 64-bit machines.  I.e. on 64-bit machines		*/
+/* longs and doubles are followed by an empty 64-bit word.		*/
+
+void ffi_java_raw_call (ffi_cif *cif,
+			void (*fn)(void),
+			void *rvalue,
+			ffi_java_raw *avalue);
+
+void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw);
+void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args);
+size_t ffi_java_raw_size (ffi_cif *cif);
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#if FFI_CLOSURES
+
+#ifdef _MSC_VER
+__declspec(align(8))
+#endif
+typedef struct {
+  char tramp[FFI_TRAMPOLINE_SIZE];
+  ffi_cif   *cif;
+  void     (*fun)(ffi_cif*,void*,void**,void*);
+  void      *user_data;
+#ifdef __GNUC__
+} ffi_closure __attribute__((aligned (8)));
+#else
+} ffi_closure;
+# ifdef __sgi
+#  pragma pack 0
+# endif
+#endif
+
+void *ffi_closure_alloc (size_t size, void **code);
+void ffi_closure_free (void *);
+
+ffi_status
+ffi_prep_closure (ffi_closure*,
+		  ffi_cif *,
+		  void (*fun)(ffi_cif*,void*,void**,void*),
+		  void *user_data);
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure*,
+		      ffi_cif *,
+		      void (*fun)(ffi_cif*,void*,void**,void*),
+		      void *user_data,
+		      void*codeloc);
+
+#ifdef __sgi
+# pragma pack 8
+#endif
+typedef struct {
+  char tramp[FFI_TRAMPOLINE_SIZE];
+
+  ffi_cif   *cif;
+
+#if !FFI_NATIVE_RAW_API
+
+  /* if this is enabled, then a raw closure has the same layout 
+     as a regular closure.  We use this to install an intermediate 
+     handler to do the transaltion, void** -> ffi_raw*. */
+
+  void     (*translate_args)(ffi_cif*,void*,void**,void*);
+  void      *this_closure;
+
+#endif
+
+  void     (*fun)(ffi_cif*,void*,ffi_raw*,void*);
+  void      *user_data;
+
+} ffi_raw_closure;
+
+typedef struct {
+  char tramp[FFI_TRAMPOLINE_SIZE];
+
+  ffi_cif   *cif;
+
+#if !FFI_NATIVE_RAW_API
+
+  /* if this is enabled, then a raw closure has the same layout 
+     as a regular closure.  We use this to install an intermediate 
+     handler to do the transaltion, void** -> ffi_raw*. */
+
+  void     (*translate_args)(ffi_cif*,void*,void**,void*);
+  void      *this_closure;
+
+#endif
+
+  void     (*fun)(ffi_cif*,void*,ffi_java_raw*,void*);
+  void      *user_data;
+
+} ffi_java_raw_closure;
+
+ffi_status
+ffi_prep_raw_closure (ffi_raw_closure*,
+		      ffi_cif *cif,
+		      void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
+		      void *user_data);
+
+ffi_status
+ffi_prep_raw_closure_loc (ffi_raw_closure*,
+			  ffi_cif *cif,
+			  void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
+			  void *user_data,
+			  void *codeloc);
+
+ffi_status
+ffi_prep_java_raw_closure (ffi_java_raw_closure*,
+		           ffi_cif *cif,
+		           void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
+		           void *user_data);
+
+ffi_status
+ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*,
+			       ffi_cif *cif,
+			       void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
+			       void *user_data,
+			       void *codeloc);
+
+#endif /* FFI_CLOSURES */
+
+/* ---- Public interface definition -------------------------------------- */
+
+ffi_status ffi_prep_cif(ffi_cif *cif,
+			ffi_abi abi,
+			unsigned int nargs,
+			ffi_type *rtype,
+			ffi_type **atypes);
+
+void ffi_call(ffi_cif *cif,
+	      void (*fn)(void),
+	      void *rvalue,
+	      void **avalue);
+
+/* Useful for eliminating compiler warnings */
+#define FFI_FN(f) ((void (*)(void))f)
+
+/* ---- Definitions shared with assembly code ---------------------------- */
+
+#endif
+
+/* If these change, update src/mips/ffitarget.h. */
+#define FFI_TYPE_VOID       0    
+#define FFI_TYPE_INT        1
+#define FFI_TYPE_FLOAT      2    
+#define FFI_TYPE_DOUBLE     3
+#if 0
+#define FFI_TYPE_LONGDOUBLE 4
+#else
+#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE
+#endif
+#define FFI_TYPE_UINT8      5   
+#define FFI_TYPE_SINT8      6
+#define FFI_TYPE_UINT16     7 
+#define FFI_TYPE_SINT16     8
+#define FFI_TYPE_UINT32     9
+#define FFI_TYPE_SINT32     10
+#define FFI_TYPE_UINT64     11
+#define FFI_TYPE_SINT64     12
+#define FFI_TYPE_STRUCT     13
+#define FFI_TYPE_POINTER    14
+
+/* This should always refer to the last type code (for sanity checks) */
+#define FFI_TYPE_LAST       FFI_TYPE_POINTER
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc64 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc64
new file mode 100644
index 0000000..6489c9f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi.h.vc64
@@ -0,0 +1,427 @@
+/* -----------------------------------------------------------------*-C-*-
+   libffi 3.0.10 - Copyright (c) 2011 Anthony Green
+                    - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+/* -------------------------------------------------------------------
+   The basic API is described in the README file.
+
+   The raw API is designed to bypass some of the argument packing
+   and unpacking on architectures for which it can be avoided.
+
+   The closure API allows interpreted functions to be packaged up
+   inside a C function pointer, so that they can be called as C functions,
+   with no understanding on the client side that they are interpreted.
+   It can also be used in other cases in which it is necessary to package
+   up a user specified parameter and a function pointer as a single
+   function pointer.
+
+   The closure API must be implemented in order to get its functionality,
+   e.g. for use by gij.  Routines are provided to emulate the raw API
+   if the underlying platform doesn't allow faster implementation.
+
+   More details on the raw and cloure API can be found in:
+
+   http://gcc.gnu.org/ml/java/1999-q3/msg00138.html
+
+   and
+
+   http://gcc.gnu.org/ml/java/1999-q3/msg00174.html
+   -------------------------------------------------------------------- */
+
+#ifndef LIBFFI_H
+#define LIBFFI_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Specify which architecture libffi is configured for. */
+#ifndef X86_WIN64
+#define X86_WIN64
+#endif
+
+/* ---- System configuration information --------------------------------- */
+
+#include <ffitarget.h>
+
+#ifndef LIBFFI_ASM
+
+#ifdef _MSC_VER
+#define __attribute__(X)
+#endif
+
+#include <stddef.h>
+#include <limits.h>
+
+/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example).
+   But we can find it either under the correct ANSI name, or under GNU
+   C's internal name.  */
+
+#define FFI_64_BIT_MAX 9223372036854775807
+
+#ifdef LONG_LONG_MAX
+# define FFI_LONG_LONG_MAX LONG_LONG_MAX
+#else
+# ifdef LLONG_MAX
+#  define FFI_LONG_LONG_MAX LLONG_MAX
+#  ifdef _AIX52 /* or newer has C99 LLONG_MAX */
+#   undef FFI_64_BIT_MAX
+#   define FFI_64_BIT_MAX 9223372036854775807LL
+#  endif /* _AIX52 or newer */
+# else
+#  ifdef __GNUC__
+#   define FFI_LONG_LONG_MAX __LONG_LONG_MAX__
+#  endif
+#  ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */
+#   ifndef __PPC64__
+#    if defined (__IBMC__) || defined (__IBMCPP__)
+#     define FFI_LONG_LONG_MAX LONGLONG_MAX
+#    endif
+#   endif /* __PPC64__ */
+#   undef  FFI_64_BIT_MAX
+#   define FFI_64_BIT_MAX 9223372036854775807LL
+#  endif
+# endif
+#endif
+
+/* The closure code assumes that this works on pointers, i.e. a size_t	*/
+/* can hold a pointer.							*/
+
+typedef struct _ffi_type
+{
+  size_t size;
+  unsigned short alignment;
+  unsigned short type;
+  struct _ffi_type **elements;
+} ffi_type;
+
+#ifndef LIBFFI_HIDE_BASIC_TYPES
+#if SCHAR_MAX == 127
+# define ffi_type_uchar                ffi_type_uint8
+# define ffi_type_schar                ffi_type_sint8
+#else
+ #error "char size not supported"
+#endif
+
+#if SHRT_MAX == 32767
+# define ffi_type_ushort       ffi_type_uint16
+# define ffi_type_sshort       ffi_type_sint16
+#elif SHRT_MAX == 2147483647
+# define ffi_type_ushort       ffi_type_uint32
+# define ffi_type_sshort       ffi_type_sint32
+#else
+ #error "short size not supported"
+#endif
+
+#if INT_MAX == 32767
+# define ffi_type_uint         ffi_type_uint16
+# define ffi_type_sint         ffi_type_sint16
+#elif INT_MAX == 2147483647
+# define ffi_type_uint         ffi_type_uint32
+# define ffi_type_sint         ffi_type_sint32
+#elif INT_MAX == 9223372036854775807
+# define ffi_type_uint         ffi_type_uint64
+# define ffi_type_sint         ffi_type_sint64
+#else
+ #error "int size not supported"
+#endif
+
+#if LONG_MAX == 2147483647
+# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX
+ #error "no 64-bit data type supported"
+# endif
+#elif LONG_MAX != FFI_64_BIT_MAX
+ #error "long size not supported"
+#endif
+
+#if LONG_MAX == 2147483647
+# define ffi_type_ulong        ffi_type_uint32
+# define ffi_type_slong        ffi_type_sint32
+#elif LONG_MAX == FFI_64_BIT_MAX
+# define ffi_type_ulong        ffi_type_uint64
+# define ffi_type_slong        ffi_type_sint64
+#else
+ #error "long size not supported"
+#endif
+
+/* These are defined in types.c */
+extern ffi_type ffi_type_void;
+extern ffi_type ffi_type_uint8;
+extern ffi_type ffi_type_sint8;
+extern ffi_type ffi_type_uint16;
+extern ffi_type ffi_type_sint16;
+extern ffi_type ffi_type_uint32;
+extern ffi_type ffi_type_sint32;
+extern ffi_type ffi_type_uint64;
+extern ffi_type ffi_type_sint64;
+extern ffi_type ffi_type_float;
+extern ffi_type ffi_type_double;
+extern ffi_type ffi_type_pointer;
+
+#if 0
+extern ffi_type ffi_type_longdouble;
+#else
+#define ffi_type_longdouble ffi_type_double
+#endif
+#endif /* LIBFFI_HIDE_BASIC_TYPES */
+
+typedef enum {
+  FFI_OK = 0,
+  FFI_BAD_TYPEDEF,
+  FFI_BAD_ABI
+} ffi_status;
+
+typedef unsigned FFI_TYPE;
+
+typedef struct {
+  ffi_abi abi;
+  unsigned nargs;
+  ffi_type **arg_types;
+  ffi_type *rtype;
+  unsigned bytes;
+  unsigned flags;
+#ifdef FFI_EXTRA_CIF_FIELDS
+  FFI_EXTRA_CIF_FIELDS;
+#endif
+} ffi_cif;
+
+/* ---- Definitions for the raw API -------------------------------------- */
+
+#ifndef FFI_SIZEOF_ARG
+# if LONG_MAX == 2147483647
+#  define FFI_SIZEOF_ARG        4
+# elif LONG_MAX == FFI_64_BIT_MAX
+#  define FFI_SIZEOF_ARG        8
+# endif
+#endif
+
+#ifndef FFI_SIZEOF_JAVA_RAW
+#  define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG
+#endif
+
+typedef union {
+  ffi_sarg  sint;
+  ffi_arg   uint;
+  float	    flt;
+  char      data[FFI_SIZEOF_ARG];
+  void*     ptr;
+} ffi_raw;
+
+#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8
+/* This is a special case for mips64/n32 ABI (and perhaps others) where
+   sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8.  */
+typedef union {
+  signed int	sint;
+  unsigned int	uint;
+  float		flt;
+  char		data[FFI_SIZEOF_JAVA_RAW];
+  void*		ptr;
+} ffi_java_raw;
+#else
+typedef ffi_raw ffi_java_raw;
+#endif
+
+
+void ffi_raw_call (ffi_cif *cif,
+		   void (*fn)(void),
+		   void *rvalue,
+		   ffi_raw *avalue);
+
+void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw);
+void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args);
+size_t ffi_raw_size (ffi_cif *cif);
+
+/* This is analogous to the raw API, except it uses Java parameter	*/
+/* packing, even on 64-bit machines.  I.e. on 64-bit machines		*/
+/* longs and doubles are followed by an empty 64-bit word.		*/
+
+void ffi_java_raw_call (ffi_cif *cif,
+			void (*fn)(void),
+			void *rvalue,
+			ffi_java_raw *avalue);
+
+void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw);
+void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args);
+size_t ffi_java_raw_size (ffi_cif *cif);
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#if FFI_CLOSURES
+
+#ifdef _MSC_VER
+__declspec(align(8))
+#endif
+typedef struct {
+  char tramp[FFI_TRAMPOLINE_SIZE];
+  ffi_cif   *cif;
+  void     (*fun)(ffi_cif*,void*,void**,void*);
+  void      *user_data;
+#ifdef __GNUC__
+} ffi_closure __attribute__((aligned (8)));
+#else
+} ffi_closure;
+# ifdef __sgi
+#  pragma pack 0
+# endif
+#endif
+
+void *ffi_closure_alloc (size_t size, void **code);
+void ffi_closure_free (void *);
+
+ffi_status
+ffi_prep_closure (ffi_closure*,
+		  ffi_cif *,
+		  void (*fun)(ffi_cif*,void*,void**,void*),
+		  void *user_data);
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure*,
+		      ffi_cif *,
+		      void (*fun)(ffi_cif*,void*,void**,void*),
+		      void *user_data,
+		      void*codeloc);
+
+#ifdef __sgi
+# pragma pack 8
+#endif
+typedef struct {
+  char tramp[FFI_TRAMPOLINE_SIZE];
+
+  ffi_cif   *cif;
+
+#if !FFI_NATIVE_RAW_API
+
+  /* if this is enabled, then a raw closure has the same layout 
+     as a regular closure.  We use this to install an intermediate 
+     handler to do the transaltion, void** -> ffi_raw*. */
+
+  void     (*translate_args)(ffi_cif*,void*,void**,void*);
+  void      *this_closure;
+
+#endif
+
+  void     (*fun)(ffi_cif*,void*,ffi_raw*,void*);
+  void      *user_data;
+
+} ffi_raw_closure;
+
+typedef struct {
+  char tramp[FFI_TRAMPOLINE_SIZE];
+
+  ffi_cif   *cif;
+
+#if !FFI_NATIVE_RAW_API
+
+  /* if this is enabled, then a raw closure has the same layout 
+     as a regular closure.  We use this to install an intermediate 
+     handler to do the transaltion, void** -> ffi_raw*. */
+
+  void     (*translate_args)(ffi_cif*,void*,void**,void*);
+  void      *this_closure;
+
+#endif
+
+  void     (*fun)(ffi_cif*,void*,ffi_java_raw*,void*);
+  void      *user_data;
+
+} ffi_java_raw_closure;
+
+ffi_status
+ffi_prep_raw_closure (ffi_raw_closure*,
+		      ffi_cif *cif,
+		      void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
+		      void *user_data);
+
+ffi_status
+ffi_prep_raw_closure_loc (ffi_raw_closure*,
+			  ffi_cif *cif,
+			  void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
+			  void *user_data,
+			  void *codeloc);
+
+ffi_status
+ffi_prep_java_raw_closure (ffi_java_raw_closure*,
+		           ffi_cif *cif,
+		           void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
+		           void *user_data);
+
+ffi_status
+ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*,
+			       ffi_cif *cif,
+			       void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
+			       void *user_data,
+			       void *codeloc);
+
+#endif /* FFI_CLOSURES */
+
+/* ---- Public interface definition -------------------------------------- */
+
+ffi_status ffi_prep_cif(ffi_cif *cif,
+			ffi_abi abi,
+			unsigned int nargs,
+			ffi_type *rtype,
+			ffi_type **atypes);
+
+void ffi_call(ffi_cif *cif,
+	      void (*fn)(void),
+	      void *rvalue,
+	      void **avalue);
+
+/* Useful for eliminating compiler warnings */
+#define FFI_FN(f) ((void (*)(void))f)
+
+/* ---- Definitions shared with assembly code ---------------------------- */
+
+#endif
+
+/* If these change, update src/mips/ffitarget.h. */
+#define FFI_TYPE_VOID       0    
+#define FFI_TYPE_INT        1
+#define FFI_TYPE_FLOAT      2    
+#define FFI_TYPE_DOUBLE     3
+#if 0
+#define FFI_TYPE_LONGDOUBLE 4
+#else
+#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE
+#endif
+#define FFI_TYPE_UINT8      5   
+#define FFI_TYPE_SINT8      6
+#define FFI_TYPE_UINT16     7 
+#define FFI_TYPE_SINT16     8
+#define FFI_TYPE_UINT32     9
+#define FFI_TYPE_SINT32     10
+#define FFI_TYPE_UINT64     11
+#define FFI_TYPE_SINT64     12
+#define FFI_TYPE_STRUCT     13
+#define FFI_TYPE_POINTER    14
+
+/* This should always refer to the last type code (for sanity checks) */
+#define FFI_TYPE_LAST       FFI_TYPE_POINTER
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif 
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi_common.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi_common.h
new file mode 100644
index 0000000..d953762
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/include/ffi_common.h
@@ -0,0 +1,126 @@
+/* -----------------------------------------------------------------------
+   ffi_common.h - Copyright (C) 2011  Anthony Green
+                  Copyright (C) 2007  Free Software Foundation, Inc
+                  Copyright (c) 1996  Red Hat, Inc.
+                  
+   Common internal definitions and macros. Only necessary for building
+   libffi.
+   ----------------------------------------------------------------------- */
+
+#ifndef FFI_COMMON_H
+#define FFI_COMMON_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <fficonfig.h>
+
+/* Do not move this. Some versions of AIX are very picky about where
+   this is positioned. */
+#ifdef __GNUC__
+/* mingw64 defines this already in malloc.h. */
+#ifndef alloca
+# define alloca __builtin_alloca
+#endif
+# define MAYBE_UNUSED __attribute__((__unused__))
+#else
+# define MAYBE_UNUSED
+# if HAVE_ALLOCA_H
+#  include <alloca.h>
+# else
+#  ifdef _AIX
+ #pragma alloca
+#  else
+#   ifndef alloca /* predefined by HP cc +Olibcalls */
+#    ifdef _MSC_VER
+#     define alloca _alloca
+#    else
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+/* Check for the existence of memcpy. */
+#if STDC_HEADERS
+# include <string.h>
+#else
+# ifndef HAVE_MEMCPY
+#  define memcpy(d, s, n) bcopy ((s), (d), (n))
+# endif
+#endif
+
+#if defined(FFI_DEBUG)
+#include <stdio.h>
+#endif
+
+#ifdef FFI_DEBUG
+void ffi_assert(char *expr, char *file, int line);
+void ffi_stop_here(void);
+void ffi_type_test(ffi_type *a, char *file, int line);
+
+#define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__))
+#define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l)))
+#define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__)
+#else
+#define FFI_ASSERT(x)
+#define FFI_ASSERT_AT(x, f, l)
+#define FFI_ASSERT_VALID_TYPE(x)
+#endif
+
+#define ALIGN(v, a)  (((((size_t) (v))-1) | ((a)-1))+1)
+#define ALIGN_DOWN(v, a) (((size_t) (v)) & -a)
+
+/* Perform machine dependent cif processing */
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif);
+
+/* Extended cif, used in callback from assembly routine */
+typedef struct
+{
+  ffi_cif *cif;
+  void *rvalue;
+  void **avalue;
+} extended_cif;
+
+/* Terse sized type definitions.  */
+#if defined(_MSC_VER) || defined(__sgi)
+typedef unsigned char UINT8;
+typedef signed char   SINT8;
+typedef unsigned short UINT16;
+typedef signed short   SINT16;
+typedef unsigned int UINT32;
+typedef signed int   SINT32;
+# ifdef _MSC_VER
+typedef unsigned __int64 UINT64;
+typedef signed __int64   SINT64;
+# else
+# include <inttypes.h>
+typedef uint64_t UINT64;
+typedef int64_t  SINT64;
+# endif
+#else
+typedef unsigned int UINT8  __attribute__((__mode__(__QI__)));
+typedef signed int   SINT8  __attribute__((__mode__(__QI__)));
+typedef unsigned int UINT16 __attribute__((__mode__(__HI__)));
+typedef signed int   SINT16 __attribute__((__mode__(__HI__)));
+typedef unsigned int UINT32 __attribute__((__mode__(__SI__)));
+typedef signed int   SINT32 __attribute__((__mode__(__SI__)));
+typedef unsigned int UINT64 __attribute__((__mode__(__DI__)));
+typedef signed int   SINT64 __attribute__((__mode__(__DI__)));
+#endif
+
+typedef float FLOAT32;
+
+#ifndef __GNUC__
+#define __builtin_expect(x, expected_value) (x)
+#endif
+#define LIKELY(x)    __builtin_expect((x),1)
+#define UNLIKELY(x)  __builtin_expect((x),1)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh
new file mode 100755
index 0000000..6781b98
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/install-sh
@@ -0,0 +1,520 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2009-04-28.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# 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
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dst_arg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test -z "$d" && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libffi.pc.in b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libffi.pc.in
new file mode 100644
index 0000000..c2e1c7b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libffi.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=${libdir}/@PACKAGE_NAME@-@PACKAGE_VERSION@/include
+
+Name: @PACKAGE_NAME@
+Description: Library supporting Foreign Function Interfaces
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} -lffi
+Cflags: -I${includedir}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libtool-version b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libtool-version
new file mode 100644
index 0000000..b8b80e0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/libtool-version
@@ -0,0 +1,29 @@
+# This file is used to maintain libtool version info for libffi.  See
+# the libtool manual to understand the meaning of the fields.  This is
+# a separate file so that version updates don't involve re-running
+# automake.
+#
+# Here are a set of rules to help you update your library version
+# information:
+# 
+# 1. Start with version information of `0:0:0' for each libtool library.
+#
+# 2. Update the version information only immediately before a public
+#    release of your software. More frequent updates are unnecessary,
+#    and only guarantee that the current interface number gets larger
+#    faster.
+#
+# 3. If the library source code has changed at all since the last
+#    update, then increment revision (`c:r:a' becomes `c:r+1:a').
+#
+# 4. If any interfaces have been added, removed, or changed since the
+#    last update, increment current, and set revision to 0.
+#
+# 5. If any interfaces have been added since the last public release,
+#    then increment age.
+#
+# 6. If any interfaces have been removed since the last public
+#    release, then set age to 0.
+#
+# CURRENT:REVISION:AGE
+5:10:0
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ltmain.sh b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ltmain.sh
new file mode 100755
index 0000000..aa5624c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/ltmain.sh
@@ -0,0 +1,9636 @@
+
+# libtool (GNU libtool) 2.4
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool 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 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#         host-triplet:	$host
+#         shell:		$SHELL
+#         compiler:		$LTCC
+#         compiler flags:		$LTCFLAGS
+#         linker:		$LD (gnu? $with_gnu_ld)
+#         $progname:	(GNU libtool) 2.4
+#         automake:	$automake_version
+#         autoconf:	$autoconf_version
+#
+# Report bugs to <bug-libtool@gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION=2.4
+TIMESTAMP=""
+package_revision=1.3293
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+$lt_unset CDPATH
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${EGREP="/bin/grep -E"}
+: ${FGREP="/bin/grep -F"}
+: ${GREP="/bin/grep"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SED="/bin/sed"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+    # Extract subdirectory from the argument.
+    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+    case ${2} in
+      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+    esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+		s@/\./@/@g
+		t dotsl
+		s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
+
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=:
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "$1" | $SED \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+  case $1 in
+  [0-9]* | *[!a-zA-Z0-9_]*)
+    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+    ;;
+  * )
+    func_tr_sh_result=$1
+    ;;
+  esac
+}
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $opt_debug
+
+    $SED -n '/(C)/!b go
+	:more
+	/\./!{
+	  N
+	  s/\n# / /
+	  b more
+	}
+	:go
+	/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/^#  *.*--help/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    echo
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+	:print
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
+	p
+	d
+     }
+     /^# .* home page:/b print
+     /^# General help using/b print
+     ' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $opt_debug
+
+    func_error "missing argument for $1."
+    exit_cmd=exit
+}
+
+
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+
+    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+    my_sed_long_arg='1s/^--[^=]*=//'
+
+    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+nonopt=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+    eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+    func_quote_for_eval "${2}"
+    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+    func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+  shift; set dummy --mode clean ${1+"$@"}; shift
+  ;;
+compile|compil|compi|comp|com|co|c)
+  shift; set dummy --mode compile ${1+"$@"}; shift
+  ;;
+execute|execut|execu|exec|exe|ex|e)
+  shift; set dummy --mode execute ${1+"$@"}; shift
+  ;;
+finish|finis|fini|fin|fi|f)
+  shift; set dummy --mode finish ${1+"$@"}; shift
+  ;;
+install|instal|insta|inst|ins|in|i)
+  shift; set dummy --mode install ${1+"$@"}; shift
+  ;;
+link|lin|li|l)
+  shift; set dummy --mode link ${1+"$@"}; shift
+  ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+  shift; set dummy --mode uninstall ${1+"$@"}; shift
+  ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly.  This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+  # this just eases exit handling
+  while test $# -gt 0; do
+    opt="$1"
+    shift
+    case $opt in
+      --debug|-x)	opt_debug='set -x'
+			func_echo "enabling shell trace mode"
+			$opt_debug
+			;;
+      --dry-run|--dryrun|-n)
+			opt_dry_run=:
+			;;
+      --config)
+			opt_config=:
+func_config
+			;;
+      --dlopen|-dlopen)
+			optarg="$1"
+			opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
+			shift
+			;;
+      --preserve-dup-deps)
+			opt_preserve_dup_deps=:
+			;;
+      --features)
+			opt_features=:
+func_features
+			;;
+      --finish)
+			opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+			;;
+      --help)
+			opt_help=:
+			;;
+      --help-all)
+			opt_help_all=:
+opt_help=': help-all'
+			;;
+      --mode)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_mode="$optarg"
+case $optarg in
+  # Valid mode arguments:
+  clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+  # Catch anything else as an error
+  *) func_error "invalid argument for $opt"
+     exit_cmd=exit
+     break
+     ;;
+esac
+			shift
+			;;
+      --no-silent|--no-quiet)
+			opt_silent=false
+func_append preserve_args " $opt"
+			;;
+      --no-verbose)
+			opt_verbose=false
+func_append preserve_args " $opt"
+			;;
+      --silent|--quiet)
+			opt_silent=:
+func_append preserve_args " $opt"
+        opt_verbose=false
+			;;
+      --verbose|-v)
+			opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+			;;
+      --tag)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
+			shift
+			;;
+
+      -\?|-h)		func_usage				;;
+      --help)		func_help				;;
+      --version)	func_version				;;
+
+      # Separate optargs to long options:
+      --*=*)
+			func_split_long_opt "$opt"
+			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      # Separate non-argument short options:
+      -\?*|-h*|-n*|-v*)
+			func_split_short_opt "$opt"
+			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      --)		break					;;
+      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
+      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
+    esac
+  done
+
+  # Validate options:
+
+  # save first non-option argument
+  if test "$#" -gt 0; then
+    nonopt="$opt"
+    shift
+  fi
+
+  # preserve --debug
+  test "$opt_debug" = : || func_append preserve_args " --debug"
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+      ;;
+  esac
+
+  $opt_help || {
+    # Sanity checks first:
+    func_check_version_match
+
+    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+      func_fatal_configuration "not configured to build any kind of library"
+    fi
+
+    # Darwin sucks
+    eval std_shrext=\"$shrext_cmds\"
+
+    # Only execute mode is allowed to have -dlopen flags.
+    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+      func_error "unrecognized option \`-dlopen'"
+      $ECHO "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Change the help message to a mode-specific one.
+    generic_help="$help"
+    help="Try \`$progname --help --mode=$opt_mode' for more information."
+  }
+
+
+  # Bail if the options were screwed
+  $exit_cmd $EXIT_FAILURE
+}
+
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case "$lt_sysroot:$1" in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result="=$func_stripname_result"
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_append_quoted CC_quoted "$arg"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $opt_debug
+  func_convert_core_file_wine_to_w32_result="$1"
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$lt_sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $opt_debug
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=""
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $opt_debug
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $opt_debug
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $opt_debug
+  if test -z "$2" && test -n "$1" ; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  \`$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result="$1"
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $opt_debug
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  \`$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result="$3"
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $opt_debug
+  case $4 in
+  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $opt_debug
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $opt_debug
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $opt_debug
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $opt_debug
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  func_append later " $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_append_quoted lastarg "$arg"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  func_append base_compile " $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  func_append dir "/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+	func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+	if func_lalib_unsafe_p "$opt"; then
+	  func_append libs " $opt"
+	else
+	  func_warning "\`$opt' is not a valid libtool archive"
+	fi
+
+      else
+	func_fatal_error "invalid argument \`$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	    > $tmpdir/tmp-la
+	  mv -f $tmpdir/tmp-la $lib
+	done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+	$ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+	libdir=LIBDIR
+	eval flag=\"$hardcode_libdir_flag_spec\"
+
+	$ECHO "   - use the \`$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+	$ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+	solaris2.[6789]|solaris2.1[0-9])
+	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	  echo "pages."
+	  ;;
+	*)
+	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
+	  ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	func_append files " $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	func_append staticlibs " $file"
+	;;
+
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append current_libdirs " $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append future_libdirs " $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	func_append dir "$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+          case $host in
+	    *cygwin* | *mingw* | *cegcc* )
+	      # if an import library, we need to obtain dlname
+	      if func_win32_import_lib_p "$dlprefile"; then
+	        func_tr_sh "$dlprefile"
+	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
+	        dlprefile_dlbasename=""
+	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+	          # Use subshell, to avoid clobbering current variable values
+	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+	          if test -n "$dlprefile_dlname" ; then
+	            func_basename "$dlprefile_dlname"
+	            dlprefile_dlbasename="$func_basename_result"
+	          else
+	            # no lafile. user explicitly requested -dlpreopen <import library>.
+	            $sharedlib_from_linklib_cmd "$dlprefile"
+	            dlprefile_dlbasename=$sharedlib_from_linklib_result
+	          fi
+	        fi
+	        $opt_dry_run || {
+	          if test -n "$dlprefile_dlbasename" ; then
+	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+	          else
+	            func_warning "Could not compute DLL name from $name"
+	            eval '$ECHO ": $name " >> "$nlist"'
+	          fi
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+	        }
+	      else # not an import lib
+	        $opt_dry_run || {
+	          eval '$ECHO ": $name " >> "$nlist"'
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	        }
+	      fi
+	    ;;
+	    *)
+	      $opt_dry_run || {
+	        eval '$ECHO ": $name " >> "$nlist"'
+	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	      }
+	    ;;
+          esac
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) func_append symtab_cflags " $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      func_to_tool_file "$1" func_convert_file_msys_to_w32
+      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $opt_debug
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $opt_debug
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[	 ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive which possess that section. Heuristic: eliminate
+    # all those which have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $opt_debug
+  if func_cygming_gnu_implib_p "$1" ; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1" ; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=""
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  for lt_wr_arg
+  do
+    case \$lt_wr_arg in
+    --lt-*) ;;
+    *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+    esac
+    shift
+  done
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# fixup the dll searchpath if we need to.
+	#
+	# Fix the DLL searchpath if we need to.  Do this before prepending
+	# to shlibpath, because on Windows, both are PATH and uninstalled
+	# libraries must come first.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+volatile const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+      if (strcmp (argv[i], debug_opt) == 0)
+	{
+          lt_debug = 1;
+          continue;
+	}
+      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+		    "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+	    cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+	    cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+		  tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+		  actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(main) libtool target name: %s\n",
+		  target_name);
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+		  nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+		      i, nonnull (newargz[i]));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+		      "(main) failed to launch target \"%s\": %s\n",
+		      lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+		      "checking path component for symlinks: %s\n",
+		      tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  lt_fatal (__FILE__, __LINE__,
+		    "error accessing file \"%s\": %s",
+		    tmp_pathspec, nonnull (strerror (errno)));
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+		"could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+	       int line, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+              $SED -e 's/\([\\"]\)/\\\1/g' \
+	           -e 's/^/  fputs ("/' -e 's/$/\\n", f);/'
+
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir="$arg"
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      func_append dlfiles " $arg"
+	    else
+	      func_append dlprefiles " $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) func_append deplibs " $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      func_append moreargs " $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      func_append dlfiles " $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    func_append dlprefiles " $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) func_append rpath " $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) func_append xrpath " $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  func_append weak_libs " $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname "-L" '' "$arg"
+	if test -z "$func_stripname_result"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	func_resolve_sysroot "$func_stripname_result"
+	dir=$func_resolve_sysroot_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "* | *" $arg "*)
+	  # Will only happen for absolute or sysroot arguments
+	  ;;
+	*)
+	  # Preserve sysroot, but never include relative directories
+	  case $dir in
+	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+	    *) func_append deplibs " -L$dir" ;;
+	  esac
+	  func_append lib_search_path " $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) func_append dllsearchpath ":$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    func_append deplibs " System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	func_append deplibs " $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) func_append new_inherited_linker_flags " $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	=*)
+	  func_stripname '=' '' "$dir"
+	  dir=$lt_sysroot$func_stripname_result
+	  ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) func_append xrpath " $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $func_quote_for_eval_result"
+	  func_append compiler_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $wl$func_quote_for_eval_result"
+	  func_append compiler_flags " $wl$func_quote_for_eval_result"
+	  func_append linker_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	func_append objs " $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		func_append dlfiles " $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      func_append dlprefiles " $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	func_append deplibs " $arg"
+	func_append old_deplibs " $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	func_resolve_sysroot "$arg"
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  func_append dlfiles " $func_resolve_sysroot_result"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  func_append dlprefiles " $func_resolve_sysroot_result"
+	  prev=
+	else
+	  func_append deplibs " $func_resolve_sysroot_result"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps ; then
+	case "$libs " in
+	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+	  esac
+	  func_append pre_post_deps " $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  func_resolve_sysroot "$lib"
+	  case $lib in
+	  *.la)	func_source "$func_resolve_sysroot_result" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) func_append deplibs " $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    func_append compiler_flags " $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    dir=$func_resolve_sysroot_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) func_append xrpath " $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la)
+	  func_resolve_sysroot "$deplib"
+	  lib=$func_resolve_sysroot_result
+	  ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      else
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      func_append newdlprefiles " $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      func_append newdlfiles " $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && func_append dlfiles " $dlopen"
+	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    func_append convenience " $ladir/$objdir/$old_library"
+	    func_append old_convenience " $ladir/$objdir/$old_library"
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    deplibs="$deplib $deplibs"
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	if test -n "$old_library" &&
+	   { test "$prefer_static_libs" = yes ||
+	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	  linklib=$old_library
+	else
+	  for l in $old_library $library_names; do
+	    linklib="$l"
+	  done
+	fi
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    func_append dlprefiles " $lib $dependency_libs"
+	  else
+	    func_append newdlfiles " $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$lt_sysroot$libdir"
+	    absdir="$lt_sysroot$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  case "$host" in
+	    # special handling for platforms with PE-DLLs.
+	    *cygwin* | *mingw* | *cegcc* )
+	      # Linker will automatically link against shared library if both
+	      # static and shared are present.  Therefore, ensure we extract
+	      # symbols from the import library if a shared library is present
+	      # (otherwise, the dlopen module name will be incorrect).  We do
+	      # this by putting the import library name into $newdlprefiles.
+	      # We recover the dlopen module name by 'saving' the la file
+	      # name in a special purpose variable, and (later) extracting the
+	      # dlname from the la file.
+	      if test -n "$dlname"; then
+	        func_tr_sh "$dir/$linklib"
+	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+	        func_append newdlprefiles " $dir/$linklib"
+	      else
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      fi
+	    ;;
+	    * )
+	      # Prefer using a static library (so that no silly _DYNAMIC symbols
+	      # are required to link).
+	      if test -n "$old_library"; then
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      # Otherwise, use the dlname, so that lt_dlopen finds it.
+	      elif test -n "$dlname"; then
+	        func_append newdlprefiles " $dir/$dlname"
+	      else
+	        func_append newdlprefiles " $dir/$linklib"
+	      fi
+	    ;;
+	  esac
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  func_append newlib_search_path " $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         func_resolve_sysroot "$func_stripname_result"
+	         func_append newlib_search_path " $func_resolve_sysroot_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) func_append temp_rpath "$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      func_append notinst_deplibs " $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      func_append notinst_deplibs " $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    echo
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      func_append add_dir " -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) func_append finalize_shlibpath "$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) func_append finalize_shlibpath "$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    func_append add_dir " -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) func_append xrpath " $temp_xrpath";;
+		   esac;;
+	      *) func_append temp_deplibs " $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  func_append newlib_search_path " $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $func_resolve_sysroot_result"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_resolve_sysroot "$deplib"
+	        deplib=$func_resolve_sysroot_result
+	        func_dirname "$deplib" "" "."
+		dir=$func_dirname_result
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) func_append lib_search_path " $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) func_append tmp_libs " $deplib" ;;
+	      esac
+	      ;;
+	    *) func_append tmp_libs " $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  func_append tmp_libs " $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  func_append libobjs " $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|qnx|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  func_append verstring ":${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_append libobjs " $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$opt_mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       func_append removelist " $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	func_append oldlibs " $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  func_replace_sysroot "$libdir"
+	  func_append temp_xrpath " -R$func_replace_sysroot_result"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) func_append dlfiles " $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) func_append dlprefiles " $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    func_append deplibs " System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      func_append deplibs " -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    func_append newdeplibs " $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    func_append newdeplibs " $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      func_append newdeplibs " $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      func_append newdeplibs " $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		if test -n "$file_magic_glob"; then
+		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+		else
+		  libnameglob=$libname
+		fi
+		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  if test "$want_nocaseglob" = yes; then
+		    shopt -s nocaseglob
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		    $nocaseglob
+		  else
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		  fi
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			func_append newdeplibs " $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      func_append newdeplibs " $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		func_replace_sysroot "$libdir"
+		libdir=$func_replace_sysroot_result
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		func_append dep_rpath " $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_apped perm_rpath " $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+	    else
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      func_append rpath "$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  func_append linknames " $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  func_append delfiles " $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd1 in $cmds; do
+	      IFS="$save_ifs"
+	      # Take the normal branch if the nm_file_list_spec branch
+	      # doesn't work or if tool conversion is not needed.
+	      case $nm_file_list_spec~$to_tool_file_cmd in
+		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+		  try_normal_branch=yes
+		  eval cmd=\"$cmd1\"
+		  func_len " $cmd"
+		  len=$func_len_result
+		  ;;
+		*)
+		  try_normal_branch=no
+		  ;;
+	      esac
+	      if test "$try_normal_branch" = yes \
+		 && { test "$len" -lt "$max_cmd_len" \
+		      || test "$max_cmd_len" -le -1; }
+	      then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      elif test -n "$nm_file_list_spec"; then
+		func_basename "$output"
+		output_la=$func_basename_result
+		save_libobjs=$libobjs
+		save_output=$output
+		output=${output_objdir}/${output_la}.nm
+		func_to_tool_file "$output"
+		libobjs=$nm_file_list_spec$func_to_tool_file_result
+		func_append delfiles " $output"
+		func_verbose "creating $NM input file list: $output"
+		for obj in $save_libobjs; do
+		  func_to_tool_file "$obj"
+		  $ECHO "$func_to_tool_file_result"
+		done > "$output"
+		eval cmd=\"$cmd1\"
+		func_show_eval "$cmd" 'exit $?'
+		output=$save_output
+		libobjs=$save_libobjs
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    func_append tmp_deplibs " $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    func_append generated " $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    func_append libobjs " $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  func_append linker_flags " $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    echo ')' >> $output
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$func_to_tool_file_result
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval concat_cmds=\"$reload_cmds\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      func_append delfiles " $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$opt_mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append libobjs " $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$opt_mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      func_append compile_command " ${wl}-bind_at_load"
+	      func_append finalize_command " ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append perm_rpath " $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) func_append dllsearchpath ":$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_perm_rpath " $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+	func_to_tool_file "$output_objdir/$outputname"
+	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    func_append oldobjs " $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	func_append generated " $gentop"
+
+	func_extract_archives $gentop $addlibs
+	func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append oldobjs " $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      func_append oldobjs " $gentop/$newobj"
+	      ;;
+	    *) func_append oldobjs " $obj" ;;
+	    esac
+	  done
+	fi
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	elif test -n "$archiver_list_spec"; then
+	  func_verbose "using command file archive linking..."
+	  for obj in $oldobjs
+	  do
+	    func_to_tool_file "$obj"
+	    $ECHO "$func_to_tool_file_result"
+	  done > $output_objdir/$libname.libcmd
+	  func_to_tool_file "$output_objdir/$libname.libcmd"
+	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      -L*)
+		func_stripname -L '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -L$func_replace_sysroot_result"
+		;;
+	      -R*)
+		func_stripname -R '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -R$func_replace_sysroot_result"
+		;;
+	      *) func_append newdependency_libs " $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      *) func_append newdlfiles " $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlfiles " $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlprefiles " $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test "x$bindir" != x ;
+	      then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=yes ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	odir="$objdir"
+      else
+	odir="$dir/$objdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$opt_mode" = uninstall && odir="$dir"
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test "$opt_mode" = clean; then
+	case " $rmdirs " in
+	  *" $odir "*) ;;
+	  *) func_append rmdirs " $odir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    func_append rmfiles " $odir/$n"
+	  done
+	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+	  case "$opt_mode" in
+	  clean)
+	    case " $library_names " in
+	    *" $dlname "*) ;;
+	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    func_append rmfiles " $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    func_append rmfiles " $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$opt_mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    func_append rmfiles " $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      func_append rmfiles " $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      func_append rmfiles " $odir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      func_append rmfiles " $odir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$opt_mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4
new file mode 100644
index 0000000..2957da7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4
@@ -0,0 +1,176 @@
+# ===========================================================================
+#       http://www.gnu.org/software/autoconf-archive/ax_cc_maxopt.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CC_MAXOPT
+#
+# DESCRIPTION
+#
+#   Try to turn on "good" C optimization flags for various compilers and
+#   architectures, for some definition of "good". (In our case, good for
+#   FFTW and hopefully for other scientific codes. Modify as needed.)
+#
+#   The user can override the flags by setting the CFLAGS environment
+#   variable. The user can also specify --enable-portable-binary in order to
+#   disable any optimization flags that might result in a binary that only
+#   runs on the host architecture.
+#
+#   Note also that the flags assume that ANSI C aliasing rules are followed
+#   by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point
+#   computations can be re-ordered as needed.
+#
+#   Requires macros: AX_CHECK_COMPILER_FLAGS, AX_COMPILER_VENDOR,
+#   AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2008 Matteo Frigo
+#
+#   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 <http://www.gnu.org/licenses/>.
+#
+#   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_CC_MAXOPT],
+[
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AX_COMPILER_VENDOR])
+AC_REQUIRE([AC_CANONICAL_HOST])
+
+AC_ARG_ENABLE(portable-binary, [AS_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])],
+	acx_maxopt_portable=$withval, acx_maxopt_portable=no)
+
+# Try to determine "good" native compiler flags if none specified via CFLAGS
+if test "$ac_test_CFLAGS" != "set"; then
+  CFLAGS=""
+  case $ax_cv_c_compiler_vendor in
+    dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
+	 if test "x$acx_maxopt_portable" = xno; then
+           CFLAGS="$CFLAGS -arch host"
+         fi;;
+
+    sun) CFLAGS="-native -fast -xO5 -dalign"
+	 if test "x$acx_maxopt_portable" = xyes; then
+	   CFLAGS="$CFLAGS -xarch=generic"
+         fi;;
+
+    hp)  CFLAGS="+Oall +Optrs_ansi +DSnative"
+	 if test "x$acx_maxopt_portable" = xyes; then
+	   CFLAGS="$CFLAGS +DAportable"
+	 fi;;
+
+    ibm) if test "x$acx_maxopt_portable" = xno; then
+           xlc_opt="-qarch=auto -qtune=auto"
+	 else
+           xlc_opt="-qtune=auto"
+	 fi
+         AX_CHECK_COMPILER_FLAGS($xlc_opt,
+		CFLAGS="-O3 -qansialias -w $xlc_opt",
+               [CFLAGS="-O3 -qansialias -w"
+                echo "******************************************************"
+                echo "*  You seem to have the IBM  C compiler.  It is      *"
+                echo "*  recommended for best performance that you use:    *"
+                echo "*                                                    *"
+                echo "*    CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
+                echo "*                      ^^^        ^^^                *"
+                echo "*  where xxx is pwr2, pwr3, 604, or whatever kind of *"
+                echo "*  CPU you have.  (Set the CFLAGS environment var.   *"
+                echo "*  and re-run configure.)  For more info, man cc.    *"
+                echo "******************************************************"])
+         ;;
+
+    intel) CFLAGS="-O3 -ansi_alias"
+	if test "x$acx_maxopt_portable" = xno; then
+	  icc_archflag=unknown
+	  icc_flags=""
+	  case $host_cpu in
+	    i686*|x86_64*)
+              # icc accepts gcc assembly syntax, so these should work:
+	      AX_GCC_X86_CPUID(0)
+              AX_GCC_X86_CPUID(1)
+	      case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
+                *:756e6547:*:*) # Intel
+                  case $ax_cv_gcc_x86_cpuid_1 in
+                    *6a?:*[[234]]:*:*|*6[[789b]]?:*:*:*) icc_flags="-xK";;
+                    *f3[[347]]:*:*:*|*f4[1347]:*:*:*) icc_flags="-xP -xN -xW -xK";;
+                    *f??:*:*:*) icc_flags="-xN -xW -xK";;
+                  esac ;;
+              esac ;;
+          esac
+          if test "x$icc_flags" != x; then
+            for flag in $icc_flags; do
+              AX_CHECK_COMPILER_FLAGS($flag, [icc_archflag=$flag; break])
+            done
+          fi
+          AC_MSG_CHECKING([for icc architecture flag])
+	  AC_MSG_RESULT($icc_archflag)
+          if test "x$icc_archflag" != xunknown; then
+            CFLAGS="$CFLAGS $icc_archflag"
+          fi
+        fi
+	;;
+
+    gnu)
+     # default optimization flags for gcc on all systems
+     CFLAGS="-O3 -fomit-frame-pointer"
+
+     #  -fstrict-aliasing for gcc-2.95+
+     AX_CHECK_COMPILER_FLAGS(-fstrict-aliasing,
+	CFLAGS="$CFLAGS -fstrict-aliasing")
+
+     AX_CHECK_COMPILER_FLAGS(-ffast-math, CFLAGS="$CFLAGS -ffast-math")
+
+     AX_GCC_ARCHFLAG($acx_maxopt_portable)
+     ;;
+  esac
+
+  if test -z "$CFLAGS"; then
+	echo ""
+	echo "********************************************************"
+        echo "* WARNING: Don't know the best CFLAGS for this system  *"
+        echo "* Use ./configure CFLAGS=... to specify your own flags *"
+	echo "* (otherwise, a default of CFLAGS=-O3 will be used)    *"
+	echo "********************************************************"
+	echo ""
+        CFLAGS="-O3"
+  fi
+
+  AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [
+	echo ""
+        echo "********************************************************"
+        echo "* WARNING: The guessed CFLAGS don't seem to work with  *"
+        echo "* your compiler.                                       *"
+        echo "* Use ./configure CFLAGS=... to specify your own flags *"
+        echo "********************************************************"
+        echo ""
+        CFLAGS=""
+  ])
+
+fi
+])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4
new file mode 100644
index 0000000..7625580
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4
@@ -0,0 +1,195 @@
+# ===========================================================================
+#    http://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CFLAGS_WARN_ALL   [(shellvar [,default, [A/NA]])]
+#   AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
+#   AX_FCFLAGS_WARN_ALL  [(shellvar [,default, [A/NA]])]
+#
+# DESCRIPTION
+#
+#   Try to find a compiler option that enables most reasonable warnings.
+#
+#   For the GNU compiler it will be -Wall (and -ansi -pedantic) The result
+#   is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default.
+#
+#   Currently this macro knows about the GCC, Solaris, Digital Unix, AIX,
+#   HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and
+#   Intel compilers.  For a given compiler, the Fortran flags are much more
+#   experimental than their C equivalents.
+#
+#    - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS
+#    - $2 add-value-if-not-found : nothing
+#    - $3 action-if-found : add value to shellvariable
+#    - $4 action-if-not-found : nothing
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2010 Rhys Ulerich <rhys.ulerich@gmail.com>
+#
+#   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 <http://www.gnu.org/licenses/>.
+#
+#   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 10
+
+AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl
+AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
+AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_warn_all])dnl
+AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
+VAR,[VAR="no, unknown"
+ AC_LANG_PUSH([C])
+ ac_save_[]FLAGS="$[]FLAGS"
+for ac_arg dnl
+in "-pedantic  % -Wall"       dnl   GCC
+   "-xstrconst % -v"          dnl Solaris C
+   "-std1      % -verbose -w0 -warnprotos" dnl Digital Unix
+   "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
+   "-ansi -ansiE % -fullwarn" dnl IRIX
+   "+ESlit     % +w1"         dnl HP-UX C
+   "-Xc        % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10)
+   "-h conform % -h msglevel 2" dnl Cray C (Unicos)
+   #
+do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+                     [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
+done
+ FLAGS="$ac_save_[]FLAGS"
+ AC_LANG_POP([C])
+])
+case ".$VAR" in
+     .ok|.ok,*) m4_ifvaln($3,$3) ;;
+   .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[
+        AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])
+                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;;
+   *) m4_ifvaln($3,$3,[
+   if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
+   then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
+   else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
+                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
+   fi ]) ;;
+esac
+AS_VAR_POPDEF([VAR])dnl
+AS_VAR_POPDEF([FLAGS])dnl
+])
+
+dnl the only difference - the LANG selection... and the default FLAGS
+
+AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl
+AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl
+AS_VAR_PUSHDEF([VAR],[ax_cv_cxxflags_warn_all])dnl
+AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
+VAR,[VAR="no, unknown"
+ AC_LANG_PUSH([C++])
+ ac_save_[]FLAGS="$[]FLAGS"
+for ac_arg dnl
+in "-pedantic  % -Wall"       dnl   GCC
+   "-xstrconst % -v"          dnl Solaris C
+   "-std1      % -verbose -w0 -warnprotos" dnl Digital Unix
+   "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
+   "-ansi -ansiE % -fullwarn" dnl IRIX
+   "+ESlit     % +w1"         dnl HP-UX C
+   "-Xc        % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10)
+   "-h conform % -h msglevel 2" dnl Cray C (Unicos)
+   #
+do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+                     [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
+done
+ FLAGS="$ac_save_[]FLAGS"
+ AC_LANG_POP([C++])
+])
+case ".$VAR" in
+     .ok|.ok,*) m4_ifvaln($3,$3) ;;
+   .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[
+        AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])
+                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;;
+   *) m4_ifvaln($3,$3,[
+   if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
+   then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
+   else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
+                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
+   fi ]) ;;
+esac
+AS_VAR_POPDEF([VAR])dnl
+AS_VAR_POPDEF([FLAGS])dnl
+])
+
+dnl the only difference - the LANG selection... and the default FLAGS
+
+AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl
+AS_VAR_PUSHDEF([FLAGS],[FCFLAGS])dnl
+AS_VAR_PUSHDEF([VAR],[ax_cv_fcflags_warn_all])dnl
+AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
+VAR,[VAR="no, unknown"
+ AC_LANG_PUSH([Fortran])
+ ac_save_[]FLAGS="$[]FLAGS"
+for ac_arg dnl
+in "-warn all  % -warn all"   dnl Intel
+   "-pedantic  % -Wall"       dnl GCC
+   "-xstrconst % -v"          dnl Solaris C
+   "-std1      % -verbose -w0 -warnprotos" dnl Digital Unix
+   "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
+   "-ansi -ansiE % -fullwarn" dnl IRIX
+   "+ESlit     % +w1"         dnl HP-UX C
+   "-Xc        % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10)
+   "-h conform % -h msglevel 2" dnl Cray C (Unicos)
+   #
+do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+                     [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
+done
+ FLAGS="$ac_save_[]FLAGS"
+ AC_LANG_POP([Fortran])
+])
+case ".$VAR" in
+     .ok|.ok,*) m4_ifvaln($3,$3) ;;
+   .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[
+        AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])
+                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;;
+   *) m4_ifvaln($3,$3,[
+   if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
+   then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
+   else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
+                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
+   fi ]) ;;
+esac
+AS_VAR_POPDEF([VAR])dnl
+AS_VAR_POPDEF([FLAGS])dnl
+])
+
+dnl  implementation tactics:
+dnl   the for-argument contains a list of options. The first part of
+dnl   these does only exist to detect the compiler - usually it is
+dnl   a global option to enable -ansi or -extrawarnings. All other
+dnl   compilers will fail about it. That was needed since a lot of
+dnl   compilers will give false positives for some option-syntax
+dnl   like -Woption or -Xoption as they think of it is a pass-through
+dnl   to later compile stages or something. The "%" is used as a
+dnl   delimiter. A non-option comment can be given after "%%" marks
+dnl   which will be shown but not added to the respective C/CXXFLAGS.
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4
new file mode 100644
index 0000000..35bfd2a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4
@@ -0,0 +1,76 @@
+# ===========================================================================
+#  http://www.gnu.org/software/autoconf-archive/ax_check_compiler_flags.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CHECK_COMPILER_FLAGS(FLAGS, [ACTION-SUCCESS], [ACTION-FAILURE])
+#
+# DESCRIPTION
+#
+#   Check whether the given compiler FLAGS work with the current language's
+#   compiler, or whether they give an error. (Warnings, however, are
+#   ignored.)
+#
+#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
+#   success/failure.
+#
+# LICENSE
+#
+#   Copyright (c) 2009 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2009 Matteo Frigo
+#
+#   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 <http://www.gnu.org/licenses/>.
+#
+#   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 9
+
+AC_DEFUN([AX_CHECK_COMPILER_FLAGS],
+[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
+AC_MSG_CHECKING([whether _AC_LANG compiler accepts $1])
+dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname:
+AS_LITERAL_IF([$1],
+  [AC_CACHE_VAL(AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1]), [
+      ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
+      _AC_LANG_PREFIX[]FLAGS="$1"
+      AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
+        AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
+        AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
+      _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])],
+  [ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
+   _AC_LANG_PREFIX[]FLAGS="$1"
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
+     eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
+     eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
+   _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])
+eval ax_check_compiler_flags=$AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])
+AC_MSG_RESULT($ax_check_compiler_flags)
+if test "x$ax_check_compiler_flags" = xyes; then
+	m4_default([$2], :)
+else
+	m4_default([$3], :)
+fi
+])dnl AX_CHECK_COMPILER_FLAGS
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4
new file mode 100644
index 0000000..3214706
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4
@@ -0,0 +1,63 @@
+# ===========================================================================
+#    http://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_COMPILER_VENDOR
+#
+# DESCRIPTION
+#
+#   Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun,
+#   hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft,
+#   watcom, etc. The vendor is returned in the cache variable
+#   $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2008 Matteo Frigo
+#
+#   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 <http://www.gnu.org/licenses/>.
+#
+#   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 9
+
+AC_DEFUN([AX_COMPILER_VENDOR],
+[
+AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
+ [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
+  # note: don't check for gcc first since some other compilers define __GNUC__
+  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
+    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
+#if !($vencpp)
+      thisisanerror;
+#endif
+])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
+  done
+ ])
+])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_configure_args.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_configure_args.m4
new file mode 100644
index 0000000..0726b1b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_configure_args.m4
@@ -0,0 +1,70 @@
+# ===========================================================================
+#     http://www.gnu.org/software/autoconf-archive/ax_configure_args.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CONFIGURE_ARGS
+#
+# DESCRIPTION
+#
+#   Helper macro for AX_ENABLE_BUILDDIR.
+#
+#   The traditional way of starting a subdir-configure is running the script
+#   with ${1+"$@"} but since autoconf 2.60 this is broken. Instead we have
+#   to rely on eval'ing $ac_configure_args however some old autoconf
+#   versions do not provide that. To ensure maximum portability of autoconf
+#   extension macros this helper can be AC_REQUIRE'd so that
+#   $ac_configure_args will alsways be present.
+#
+#   Sadly, the traditional "exec $SHELL" of the enable_builddir macros is
+#   spoiled now and must be replaced by "eval + exit $?".
+#
+#   Example:
+#
+#     AC_DEFUN([AX_ENABLE_SUBDIR],[dnl
+#       AC_REQUIRE([AX_CONFIGURE_ARGS])dnl
+#       eval $SHELL $ac_configure_args || exit $?
+#       ...])
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#
+#   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 <http://www.gnu.org/licenses/>.
+#
+#   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 9
+
+AC_DEFUN([AX_CONFIGURE_ARGS],[
+   # [$]@ is unsable in 2.60+ but earlier autoconf had no ac_configure_args
+   if test "${ac_configure_args+set}" != "set" ; then
+      ac_configure_args=
+      for ac_arg in ${1+"[$]@"}; do
+         ac_configure_args="$ac_configure_args '$ac_arg'"
+      done
+   fi
+])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_enable_builddir.m4
new file mode 100644
index 0000000..959dec3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_enable_builddir.m4
@@ -0,0 +1,300 @@
+# ===========================================================================
+#    http://www.gnu.org/software/autoconf-archive/ax_enable_builddir.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_ENABLE_BUILDDIR [(dirstring-or-command [,Makefile.mk [,-all]])]
+#
+# DESCRIPTION
+#
+#   If the current configure was run within the srcdir then we move all
+#   configure-files into a subdir and let the configure steps continue
+#   there. We provide an option --disable-builddir to suppress the move into
+#   a separate builddir.
+#
+#   Defaults:
+#
+#     $1 = $host (overridden with $HOST)
+#     $2 = Makefile.mk
+#     $3 = -all
+#
+#   This macro must be called before AM_INIT_AUTOMAKE. It creates a default
+#   toplevel srcdir Makefile from the information found in the created
+#   toplevel builddir Makefile. It just copies the variables and
+#   rule-targets, each extended with a default rule-execution that recurses
+#   into the build directory of the current "HOST". You can override the
+#   auto-dection through `config.guess` and build-time of course, as in
+#
+#     make HOST=i386-mingw-cross
+#
+#   which can of course set at configure time as well using
+#
+#     configure --host=i386-mingw-cross
+#
+#   After the default has been created, additional rules can be appended
+#   that will not just recurse into the subdirectories and only ever exist
+#   in the srcdir toplevel makefile - these parts are read from the $2 =
+#   Makefile.mk file
+#
+#   The automatic rules are usually scanning the toplevel Makefile for lines
+#   like '#### $host |$builddir' to recognize the place where to recurse
+#   into. Usually, the last one is the only one used. However, almost all
+#   targets have an additional "*-all" rule which makes the script to
+#   recurse into _all_ variants of the current HOST (!!) setting. The "-all"
+#   suffix can be overriden for the macro as well.
+#
+#   a special rule is only given for things like "dist" that will copy the
+#   tarball from the builddir to the sourcedir (or $(PUB)) for reason of
+#   convenience.
+#
+# LICENSE
+#
+#   Copyright (c) 2009 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2009 Alan Jenkins <alan-jenkins@tuffmail.co.uk>
+#
+#   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 <http://www.gnu.org/licenses/>.
+#
+#   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 22
+
+AC_DEFUN([AX_ENABLE_BUILDDIR],[
+AC_REQUIRE([AC_CANONICAL_HOST])[]dnl
+AC_REQUIRE([AX_CONFIGURE_ARGS])[]dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])[]dnl
+AC_BEFORE([$0],[AM_INIT_AUTOMAKE])dnl
+AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl
+AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl
+AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl
+SUB="."
+AC_ARG_ENABLE([builddir], AS_HELP_STRING(
+  [--disable-builddir],[disable automatic build in subdir of sources])
+  ,[SUB="$enableval"], [SUB="auto"])
+if test ".$ac_srcdir_defaulted" != ".no" ; then
+if test ".$srcdir" = ".." ; then
+  if test -f config.status ; then
+    AC_MSG_NOTICE(toplevel srcdir already configured... skipping subdir build)
+  else
+    test ".$SUB" = "."  && SUB="."
+    test ".$SUB" = ".no"  && SUB="."
+    test ".$TARGET" = "." && TARGET="$target"
+    test ".$SUB" = ".auto" && SUB="m4_ifval([$1], [$1],[$TARGET])"
+    if test ".$SUB" != ".." ; then    # we know where to go and
+      AS_MKDIR_P([$SUB])
+      echo __.$SUB.__ > $SUB/conftest.tmp
+      cd $SUB
+      if grep __.$SUB.__ conftest.tmp >/dev/null 2>/dev/null ; then
+        rm conftest.tmp
+        AC_MSG_RESULT([continue configure in default builddir "./$SUB"])
+      else
+        AC_MSG_ERROR([could not change to default builddir "./$SUB"])
+      fi
+      srcdir=`echo "$SUB" |
+              sed -e 's,^\./,,;s,[[^/]]$,&/,;s,[[^/]]*/,../,g;s,[[/]]$,,;'`
+      # going to restart from subdirectory location
+      test -f $srcdir/config.log   && mv $srcdir/config.log   .
+      test -f $srcdir/confdefs.h   && mv $srcdir/confdefs.h   .
+      test -f $srcdir/conftest.log && mv $srcdir/conftest.log .
+      test -f $srcdir/$cache_file  && mv $srcdir/$cache_file  .
+      AC_MSG_RESULT(....exec $SHELL $srcdir/[$]0 "--srcdir=$srcdir" "--enable-builddir=$SUB" ${1+"[$]@"})
+      case "[$]0" in # restart
+       [/\\]*) eval $SHELL "'[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;;
+       *) eval $SHELL "'$srcdir/[$]0'" "'--srcdir=$srcdir'" "'--enable-builddir=$SUB'" $ac_configure_args ;;
+      esac ; exit $?
+    fi
+  fi
+fi fi
+test ".$SUB" = ".auto" && SUB="."
+dnl ac_path_prog uses "set dummy" to override $@ which would defeat the "exec"
+AC_PATH_PROG(SED,gsed sed, sed)
+AUX="$am_aux_dir"
+AS_VAR_POPDEF([SED])dnl
+AS_VAR_POPDEF([AUX])dnl
+AS_VAR_POPDEF([SUB])dnl
+AC_CONFIG_COMMANDS([buildir],[dnl .............. config.status ..............
+AS_VAR_PUSHDEF([SUB],[ax_enable_builddir])dnl
+AS_VAR_PUSHDEF([TOP],[top_srcdir])dnl
+AS_VAR_PUSHDEF([SRC],[ac_top_srcdir])dnl
+AS_VAR_PUSHDEF([AUX],[ax_enable_builddir_auxdir])dnl
+AS_VAR_PUSHDEF([SED],[ax_enable_builddir_sed])dnl
+pushdef([END],[Makefile.mk])dnl
+pushdef([_ALL],[ifelse([$3],,[-all],[$3])])dnl
+  SRC="$ax_enable_builddir_srcdir"
+  if test ".$SUB" = ".." ; then
+    if test -f "$TOP/Makefile" ; then
+      AC_MSG_NOTICE([skipping TOP/Makefile - left untouched])
+    else
+      AC_MSG_NOTICE([skipping TOP/Makefile - not created])
+    fi
+  else
+    if test -f "$SRC/Makefile" ; then
+      a=`grep "^VERSION " "$SRC/Makefile"` ; b=`grep "^VERSION " Makefile`
+      test "$a" != "$b" && rm "$SRC/Makefile"
+    fi
+    if test -f "$SRC/Makefile" ; then
+	echo "$SRC/Makefile : $SRC/Makefile.in" > $tmp/conftemp.mk
+	echo "	[]@ echo 'REMOVED,,,' >\$[]@" >> $tmp/conftemp.mk
+      eval "${MAKE-make} -f $tmp/conftemp.mk 2>/dev/null >/dev/null"
+      if grep '^REMOVED,,,' "$SRC/Makefile" >/dev/null
+      then rm $SRC/Makefile ; fi
+      cp $tmp/conftemp.mk $SRC/makefiles.mk~      ## DEBUGGING
+    fi
+    if test ! -f "$SRC/Makefile" ; then
+      AC_MSG_NOTICE([create TOP/Makefile guessed from local Makefile])
+      x='`' ; cat >$tmp/conftemp.sed <<_EOF
+/^\$/n
+x
+/^\$/bS
+x
+/\\\\\$/{H;d;}
+{H;s/.*//;x;}
+bM
+:S
+x
+/\\\\\$/{h;d;}
+{h;s/.*//;x;}
+:M
+s/\\(\\n\\)	/\\1 /g
+/^	/d
+/^[[	 ]]*[[\\#]]/d
+/^VPATH *=/d
+s/^srcdir *=.*/srcdir = ./
+s/^top_srcdir *=.*/top_srcdir = ./
+/[[:=]]/!d
+/^\\./d
+dnl Now handle rules (i.e. lines containing ":" but not " = ").
+/ = /b
+/ .= /b
+/:/!b
+s/:.*/:/
+s/ /  /g
+s/ \\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/ \\1 \\1[]_ALL\\2/g
+s/^\\([[a-z]][[a-z-]]*[[a-zA-Z0-9]]\\)\\([[ :]]\\)/\\1 \\1[]_ALL\\2/
+s/  / /g
+/^all all[]_ALL[[ :]]/i\\
+all-configured : all[]_ALL
+dnl dist-all exists... and would make for dist-all-all
+s/ [[a-zA-Z0-9-]]*[]_ALL [[a-zA-Z0-9-]]*[]_ALL[]_ALL//g
+/[]_ALL[]_ALL/d
+a\\
+	@ HOST="\$(HOST)\" \\\\\\
+	; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\
+	; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+	; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\
+	; echo "MAKE \$\$HOST : \$\$n * \$\@"; if test "\$\$n" = "0" ; then : \\\\\\
+	; BUILD=$x grep "^####.*|" Makefile |tail -1| sed -e 's/.*|//' $x ; fi \\\\\\
+	; test ".\$\$BUILD" = "." && BUILD="." \\\\\\
+	; test "\$\$use" = "\$\@" && BUILD=$x echo "\$\$BUILD" | tail -1 $x \\\\\\
+	; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+	; (cd "\$\$i" && test ! -f configure && \$(MAKE) \$\$use) || exit; done
+dnl special rule add-on: "dist" copies the tarball to $(PUB). (source tree)
+/dist[]_ALL *:/a\\
+	@ HOST="\$(HOST)\" \\\\\\
+	; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\
+	; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+	; found=$x echo \$\$BUILD | wc -w $x \\\\\\
+	; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).tar.*" \\\\\\
+	; if test "\$\$found" = "0" ; then : \\\\\\
+	; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\
+	; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+	; for f in \$\$i/\$(PACKAGE)-\$(VERSION).tar.* \\\\\\
+	; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done
+dnl special rule add-on: "dist-foo" copies all the archives to $(PUB). (source tree)
+/dist-[[a-zA-Z0-9]]*[]_ALL *:/a\\
+	@ HOST="\$(HOST)\" \\\\\\
+	; test ".\$\$HOST" = "." && HOST=$x sh ./config.guess $x \\\\\\
+	; BUILD=$x grep "^#### \$\$HOST " Makefile | sed -e 's/.*|//' $x \\\\\\
+	; found=$x echo \$\$BUILD | wc -w $x \\\\\\
+	; echo "MAKE \$\$HOST : \$\$found \$(PACKAGE)-\$(VERSION).*" \\\\\\
+	; if test "\$\$found" = "0" ; then : \\\\\\
+	; BUILD=$x grep "^#### .*|" Makefile |tail -1| sed -e 's/.*|//' $x \\\\\\
+	; fi ; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+	; for f in \$\$i/\$(PACKAGE)-\$(VERSION).* \\\\\\
+	; do test -f "\$\$f" && mv "\$\$f" \$(PUB). ; done ; break ; done
+dnl special rule add-on: "distclean" removes all local builddirs completely
+/distclean[]_ALL *:/a\\
+	@ HOST="\$(HOST)\" \\\\\\
+	; test ".\$\$HOST" = "." && HOST=$x sh $AUX/config.guess $x \\\\\\
+	; BUILD=$x grep "^#### .*|" Makefile | sed -e 's/.*|//' $x \\\\\\
+	; use=$x basename "\$\@" _ALL $x; n=$x echo \$\$BUILD | wc -w $x \\\\\\
+	; echo "MAKE \$\$HOST : \$\$n * \$\@ (all local builds)" \\\\\\
+	; test ".\$\$BUILD" = "." && BUILD="." \\\\\\
+	; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+	; echo "# rm -r \$\$i"; done ; echo "# (sleep 3)" ; sleep 3 \\\\\\
+	; for i in \$\$BUILD ; do test ".\$\$i" = "." && continue \\\\\\
+	; echo "\$\$i" | grep "^/" > /dev/null && continue \\\\\\
+	; echo "\$\$i" | grep "^../" > /dev/null && continue \\\\\\
+	; echo "rm -r \$\$i"; (rm -r "\$\$i") ; done ; rm Makefile
+_EOF
+      cp "$tmp/conftemp.sed" "$SRC/makefile.sed~"            ## DEBUGGING
+      $SED -f $tmp/conftemp.sed Makefile >$SRC/Makefile
+      if test -f "$SRC/m4_ifval([$2],[$2],[END])" ; then
+        AC_MSG_NOTICE([extend TOP/Makefile with TOP/m4_ifval([$2],[$2],[END])])
+        cat $SRC/END >>$SRC/Makefile
+      fi ; xxxx="####"
+      echo "$xxxx CONFIGURATIONS FOR TOPLEVEL MAKEFILE: " >>$SRC/Makefile
+      # sanity check
+      if grep '^; echo "MAKE ' $SRC/Makefile >/dev/null ; then
+        AC_MSG_NOTICE([buggy sed found - it deletes tab in "a" text parts])
+        $SED -e '/^@ HOST=/s/^/	/' -e '/^; /s/^/	/' $SRC/Makefile \
+          >$SRC/Makefile~
+        (test -s $SRC/Makefile~ && mv $SRC/Makefile~ $SRC/Makefile) 2>/dev/null
+      fi
+    else
+      xxxx="\\#\\#\\#\\#"
+      # echo "/^$xxxx *$ax_enable_builddir_host /d" >$tmp/conftemp.sed
+      echo "s!^$xxxx [[^|]]* | *$SUB *\$!$xxxx ...... $SUB!" >$tmp/conftemp.sed
+      $SED -f "$tmp/conftemp.sed" "$SRC/Makefile" >$tmp/mkfile.tmp
+        cp "$tmp/conftemp.sed" "$SRC/makefiles.sed~"         ## DEBUGGING
+        cp "$tmp/mkfile.tmp"   "$SRC/makefiles.out~"         ## DEBUGGING
+      if cmp -s "$SRC/Makefile" "$tmp/mkfile.tmp" 2>/dev/null ; then
+        AC_MSG_NOTICE([keeping TOP/Makefile from earlier configure])
+        rm "$tmp/mkfile.tmp"
+      else
+        AC_MSG_NOTICE([reusing TOP/Makefile from earlier configure])
+        mv "$tmp/mkfile.tmp" "$SRC/Makefile"
+      fi
+    fi
+    AC_MSG_NOTICE([build in $SUB (HOST=$ax_enable_builddir_host)])
+    xxxx="####"
+    echo "$xxxx" "$ax_enable_builddir_host" "|$SUB" >>$SRC/Makefile
+  fi
+popdef([END])dnl
+AS_VAR_POPDEF([SED])dnl
+AS_VAR_POPDEF([AUX])dnl
+AS_VAR_POPDEF([SRC])dnl
+AS_VAR_POPDEF([TOP])dnl
+AS_VAR_POPDEF([SUB])dnl
+],[dnl
+ax_enable_builddir_srcdir="$srcdir"                    # $srcdir
+ax_enable_builddir_host="$HOST"                        # $HOST / $host
+ax_enable_builddir_version="$VERSION"                  # $VERSION
+ax_enable_builddir_package="$PACKAGE"                  # $PACKAGE
+ax_enable_builddir_auxdir="$ax_enable_builddir_auxdir" # $AUX
+ax_enable_builddir_sed="$ax_enable_builddir_sed"       # $SED
+ax_enable_builddir="$ax_enable_builddir"               # $SUB
+])dnl
+])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4
new file mode 100644
index 0000000..d37a913
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4
@@ -0,0 +1,215 @@
+# ===========================================================================
+#      http://www.gnu.org/software/autoconf-archive/ax_gcc_archflag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE])
+#
+# DESCRIPTION
+#
+#   This macro tries to guess the "native" arch corresponding to the target
+#   architecture for use with gcc's -march=arch or -mtune=arch flags. If
+#   found, the cache variable $ax_cv_gcc_archflag is set to this flag and
+#   ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is is set to
+#   "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is
+#   to add $ax_cv_gcc_archflag to the end of $CFLAGS.
+#
+#   PORTABLE? should be either [yes] (default) or [no]. In the former case,
+#   the flag is set to -mtune (or equivalent) so that the architecture is
+#   only used for tuning, but the instruction set used is still portable. In
+#   the latter case, the flag is set to -march (or equivalent) so that
+#   architecture-specific instructions are enabled.
+#
+#   The user can specify --with-gcc-arch=<arch> in order to override the
+#   macro's choice of architecture, or --without-gcc-arch to disable this.
+#
+#   When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is
+#   called unless the user specified --with-gcc-arch manually.
+#
+#   Requires macros: AX_CHECK_COMPILER_FLAGS, AX_GCC_X86_CPUID
+#
+#   (The main emphasis here is on recent CPUs, on the principle that doing
+#   high-performance computing on old hardware is uncommon.)
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2008 Matteo Frigo
+#
+#   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 <http://www.gnu.org/licenses/>.
+#
+#   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 8
+
+AC_DEFUN([AX_GCC_ARCHFLAG],
+[AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_CANONICAL_HOST])
+
+AC_ARG_WITH(gcc-arch, [AS_HELP_STRING([--with-gcc-arch=<arch>], [use architecture <arch> for gcc -march/-mtune, instead of guessing])],
+	ax_gcc_arch=$withval, ax_gcc_arch=yes)
+
+AC_MSG_CHECKING([for gcc architecture flag])
+AC_MSG_RESULT([])
+AC_CACHE_VAL(ax_cv_gcc_archflag,
+[
+ax_cv_gcc_archflag="unknown"
+
+if test "$GCC" = yes; then
+
+if test "x$ax_gcc_arch" = xyes; then
+ax_gcc_arch=""
+if test "$cross_compiling" = no; then
+case $host_cpu in
+  i[[3456]]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
+     AX_GCC_X86_CPUID(0)
+     AX_GCC_X86_CPUID(1)
+     case $ax_cv_gcc_x86_cpuid_0 in
+       *:756e6547:*:*) # Intel
+          case $ax_cv_gcc_x86_cpuid_1 in
+	    *5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
+	    *5??:*:*:*) ax_gcc_arch=pentium ;;
+	    *6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
+	    *6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
+	    *6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
+	    *6[[9d]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
+	    *6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
+	    *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
+            *f3[[347]]:*:*:*|*f4[1347]:*:*:*)
+		case $host_cpu in
+                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
+                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
+                esac ;;
+            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
+          esac ;;
+       *:68747541:*:*) # AMD
+          case $ax_cv_gcc_x86_cpuid_1 in
+	    *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;;
+	    *5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
+	    *5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
+	    *60?:*:*:*) ax_gcc_arch=k7 ;;
+	    *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;;
+	    *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
+	    *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
+	    *6[[68a]]?:*:*:*)
+	       AX_GCC_X86_CPUID(0x80000006) # L2 cache size
+	       case $ax_cv_gcc_x86_cpuid_0x80000006 in
+                 *:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256
+			ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
+                 *) ax_gcc_arch="athlon-4 athlon k7" ;;
+	       esac ;;
+	    *f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
+	    *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
+	    *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
+	    *f??:*:*:*) ax_gcc_arch="k8" ;;
+          esac ;;
+	*:746e6543:*:*) # IDT
+	   case $ax_cv_gcc_x86_cpuid_1 in
+	     *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
+	     *58?:*:*:*) ax_gcc_arch=winchip2 ;;
+	     *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;;
+	     *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
+	   esac ;;
+     esac
+     if test x"$ax_gcc_arch" = x; then # fallback
+	case $host_cpu in
+	  i586*) ax_gcc_arch=pentium ;;
+	  i686*) ax_gcc_arch=pentiumpro ;;
+        esac
+     fi
+     ;;
+
+  sparc*)
+     AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/])
+     cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
+     cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
+     case $cputype in
+         *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
+         *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
+         *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
+         *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;;
+         *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;;
+         *cypress*) ax_gcc_arch=cypress ;;
+     esac ;;
+
+  alphaev5) ax_gcc_arch=ev5 ;;
+  alphaev56) ax_gcc_arch=ev56 ;;
+  alphapca56) ax_gcc_arch="pca56 ev56" ;;
+  alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
+  alphaev6) ax_gcc_arch=ev6 ;;
+  alphaev67) ax_gcc_arch=ev67 ;;
+  alphaev68) ax_gcc_arch="ev68 ev67" ;;
+  alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
+  alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
+  alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
+
+  powerpc*)
+     cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
+     cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
+     case $cputype in
+       *750*) ax_gcc_arch="750 G3" ;;
+       *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;;
+       *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;;
+       *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;;
+       *970*) ax_gcc_arch="970 G5 power4";;
+       *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
+       *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
+       603ev|8240) ax_gcc_arch="$cputype 603e 603";;
+       *) ax_gcc_arch=$cputype ;;
+     esac
+     ax_gcc_arch="$ax_gcc_arch powerpc"
+     ;;
+esac
+fi # not cross-compiling
+fi # guess arch
+
+if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
+for arch in $ax_gcc_arch; do
+  if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code
+    flags="-mtune=$arch"
+    # -mcpu=$arch and m$arch generate nonportable code on every arch except
+    # x86.  And some other arches (e.g. Alpha) don't accept -mtune.  Grrr.
+    case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
+  else
+    flags="-march=$arch -mcpu=$arch -m$arch"
+  fi
+  for flag in $flags; do
+    AX_CHECK_COMPILER_FLAGS($flag, [ax_cv_gcc_archflag=$flag; break])
+  done
+  test "x$ax_cv_gcc_archflag" = xunknown || break
+done
+fi
+
+fi # $GCC=yes
+])
+AC_MSG_CHECKING([for gcc architecture flag])
+AC_MSG_RESULT($ax_cv_gcc_archflag)
+if test "x$ax_cv_gcc_archflag" = xunknown; then
+  m4_default([$3],:)
+else
+  m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"])
+fi
+])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4
new file mode 100644
index 0000000..7d46fee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4
@@ -0,0 +1,79 @@
+# ===========================================================================
+#     http://www.gnu.org/software/autoconf-archive/ax_gcc_x86_cpuid.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_GCC_X86_CPUID(OP)
+#
+# DESCRIPTION
+#
+#   On Pentium and later x86 processors, with gcc or a compiler that has a
+#   compatible syntax for inline assembly instructions, run a small program
+#   that executes the cpuid instruction with input OP. This can be used to
+#   detect the CPU type.
+#
+#   On output, the values of the eax, ebx, ecx, and edx registers are stored
+#   as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable
+#   ax_cv_gcc_x86_cpuid_OP.
+#
+#   If the cpuid instruction fails (because you are running a
+#   cross-compiler, or because you are not using gcc, or because you are on
+#   a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP
+#   is set to the string "unknown".
+#
+#   This macro mainly exists to be used in AX_GCC_ARCHFLAG.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2008 Matteo Frigo
+#
+#   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 <http://www.gnu.org/licenses/>.
+#
+#   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 7
+
+AC_DEFUN([AX_GCC_X86_CPUID],
+[AC_REQUIRE([AC_PROG_CC])
+AC_LANG_PUSH([C])
+AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1,
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [
+     int op = $1, eax, ebx, ecx, edx;
+     FILE *f;
+      __asm__("cpuid"
+        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
+        : "a" (op));
+     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+     fclose(f);
+     return 0;
+])],
+     [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid],
+     [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid],
+     [ax_cv_gcc_x86_cpuid_$1=unknown])])
+AC_LANG_POP([C])
+])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/libtool.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/libtool.m4
new file mode 100644
index 0000000..d812584
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/libtool.m4
@@ -0,0 +1,7831 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
+#                 Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
+#                 Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool 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 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_REPLACE_SHELLFNS
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES
+# --------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
+
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[123]]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t@_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t@_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ F* | *Sun*Fortran*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*) ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    freebsd1*)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
+    [[If ld is used when linking, flag to hardcode $libdir into a binary
+    during linking.  This must work even if $libdir does not exist]])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd[[12]]*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+	      '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
+
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
+
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltoptions.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltoptions.m4
new file mode 100644
index 0000000..17cfd51
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltoptions.m4
@@ -0,0 +1,369 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 7 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [pic_mode="$withval"],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltsugar.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltsugar.m4
new file mode 100644
index 0000000..9000a05
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltsugar.m4
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltversion.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltversion.m4
new file mode 100644
index 0000000..9c7b5d4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 3293 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4])
+m4_define([LT_PACKAGE_REVISION], [1.3293])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4'
+macro_revision='1.3293'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/lt~obsolete.m4 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/lt~obsolete.m4
new file mode 100644
index 0000000..c573da9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/m4/lt~obsolete.m4
@@ -0,0 +1,98 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.am b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.am
new file mode 100644
index 0000000..2519277
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.am
@@ -0,0 +1,8 @@
+## Process this with automake to create Makefile.in
+
+AUTOMAKE_OPTIONS=foreign
+
+EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3
+
+man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.in b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.in
new file mode 100644
index 0000000..2cb5ea8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/Makefile.in
@@ -0,0 +1,466 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = man
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \
+	$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
+	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
+	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
+	$(top_srcdir)/m4/ax_configure_args.m4 \
+	$(top_srcdir)/m4/ax_enable_builddir.m4 \
+	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
+	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/fficonfig.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+man3dir = $(mandir)/man3
+am__installdirs = "$(DESTDIR)$(man3dir)"
+NROFF = nroff
+MANS = $(man_MANS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_LTLDFLAGS = @AM_LTLDFLAGS@
+AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PRTDIAG = @PRTDIAG@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TARGET = @TARGET@
+TARGETDIR = @TARGETDIR@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_enable_builddir_sed = @ax_enable_builddir_sed@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+toolexecdir = @toolexecdir@
+toolexeclibdir = @toolexeclibdir@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3
+man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign man/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man3: $(man_MANS)
+	@$(NORMAL_INSTALL)
+	test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)"
+	@list=''; test -n "$(man3dir)" || exit 0; \
+	{ for i in $$list; do echo "$$i"; done; \
+	l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.3[a-z]*$$/p'; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man3:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man3dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.3[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	test -z "$$files" || { \
+	  echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \
+	  cd "$(DESTDIR)$(man3dir)" && rm -f $$files; }
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@list='$(MANS)'; if test -n "$$list"; then \
+	  list=`for p in $$list; do \
+	    if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	    if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
+	  if test -n "$$list" && \
+	    grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
+	    echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
+	    grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/         /' >&2; \
+	    echo "       to fix them, install help2man, remove and regenerate the man pages;" >&2; \
+	    echo "       typically \`make maintainer-clean' will remove them" >&2; \
+	    exit 1; \
+	  else :; fi; \
+	else :; fi
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(MANS)
+installdirs:
+	for dir in "$(DESTDIR)$(man3dir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man3
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-man
+
+uninstall-man: uninstall-man3
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-man3 \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am uninstall-man uninstall-man3
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi.3 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi.3
new file mode 100644
index 0000000..18b5d5d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi.3
@@ -0,0 +1,31 @@
+.Dd February 15, 2008
+.Dt FFI 3
+.Sh NAME
+.Nm FFI
+.Nd Foreign Function Interface
+.Sh LIBRARY
+libffi, -lffi
+.Sh SYNOPSIS
+.In ffi.h
+.Ft ffi_status
+.Fo ffi_prep_cif
+.Fa "ffi_cif *cif"
+.Fa "ffi_abi abi"
+.Fa "unsigned int nargs"
+.Fa "ffi_type *rtype"
+.Fa "ffi_type **atypes"
+.Fc
+.Ft void
+.Fo ffi_call
+.Fa "ffi_cif *cif"
+.Fa "void (*fn)(void)"
+.Fa "void *rvalue"
+.Fa "void **avalue"
+.Fc
+.Sh DESCRIPTION
+The foreign function interface provides a mechanism by which a function can
+generate a call to another function at runtime without requiring knowledge of
+the called function's interface at compile time.
+.Sh SEE ALSO
+.Xr ffi_prep_cif 3 ,
+.Xr ffi_call 3
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_call.3 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_call.3
new file mode 100644
index 0000000..5351513
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_call.3
@@ -0,0 +1,103 @@
+.Dd February 15, 2008
+.Dt ffi_call 3
+.Sh NAME
+.Nm ffi_call
+.Nd Invoke a foreign function.
+.Sh SYNOPSIS
+.In ffi.h
+.Ft void
+.Fo ffi_call
+.Fa "ffi_cif *cif"
+.Fa "void (*fn)(void)"
+.Fa "void *rvalue"
+.Fa "void **avalue"
+.Fc
+.Sh DESCRIPTION
+The
+.Nm ffi_call
+function provides a simple mechanism for invoking a function without
+requiring knowledge of the function's interface at compile time.
+.Fa fn
+is called with the values retrieved from the pointers in the
+.Fa avalue
+array. The return value from
+.Fa fn
+is placed in storage pointed to by
+.Fa rvalue .
+.Fa cif
+contains information describing the data types, sizes and alignments of the
+arguments to and return value from
+.Fa fn ,
+and must be initialized with
+.Nm ffi_prep_cif
+before it is used with
+.Nm ffi_call .
+.Pp
+.Fa rvalue
+must point to storage that is sizeof(ffi_arg) or larger for non-floating point
+types. For smaller-sized return value types, the
+.Nm ffi_arg
+or
+.Nm ffi_sarg
+integral type must be used to hold
+the return value.
+.Sh EXAMPLES
+.Bd -literal
+#include <ffi.h>
+#include <stdio.h>
+
+unsigned char
+foo(unsigned int, float);
+
+int
+main(int argc, const char **argv)
+{
+    ffi_cif cif;
+    ffi_type *arg_types[2];
+    void *arg_values[2];
+    ffi_status status;
+
+    // Because the return value from foo() is smaller than sizeof(long), it
+    // must be passed as ffi_arg or ffi_sarg.
+    ffi_arg result;
+
+    // Specify the data type of each argument. Available types are defined
+    // in <ffi/ffi.h>.
+    arg_types[0] = &ffi_type_uint;
+    arg_types[1] = &ffi_type_float;
+
+    // Prepare the ffi_cif structure.
+    if ((status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
+        2, &ffi_type_uint8, arg_types)) != FFI_OK)
+    {
+        // Handle the ffi_status error.
+    }
+
+    // Specify the values of each argument.
+    unsigned int arg1 = 42;
+    float arg2 = 5.1;
+
+    arg_values[0] = &arg1;
+    arg_values[1] = &arg2;
+
+    // Invoke the function.
+    ffi_call(&cif, FFI_FN(foo), &result, arg_values);
+
+    // The ffi_arg 'result' now contains the unsigned char returned from foo(),
+    // which can be accessed by a typecast.
+    printf("result is %hhu", (unsigned char)result);
+
+    return 0;
+}
+
+// The target function.
+unsigned char
+foo(unsigned int x, float y)
+{
+    unsigned char result = x - y;
+    return result;
+}
+.Ed
+.Sh SEE ALSO
+.Xr ffi 3 ,
+.Xr ffi_prep_cif 3
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_prep_cif.3 b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_prep_cif.3
new file mode 100644
index 0000000..9436b31
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/man/ffi_prep_cif.3
@@ -0,0 +1,66 @@
+.Dd February 15, 2008
+.Dt ffi_prep_cif 3
+.Sh NAME
+.Nm ffi_prep_cif
+.Nd Prepare a
+.Nm ffi_cif
+structure for use with
+.Nm ffi_call 
+.
+.Sh SYNOPSIS
+.In ffi.h
+.Ft ffi_status
+.Fo ffi_prep_cif
+.Fa "ffi_cif *cif"
+.Fa "ffi_abi abi"
+.Fa "unsigned int nargs"
+.Fa "ffi_type *rtype"
+.Fa "ffi_type **atypes"
+.Fc
+.Sh DESCRIPTION
+The
+.Nm ffi_prep_cif
+function prepares a
+.Nm ffi_cif
+structure for use with 
+.Nm ffi_call
+.
+.Fa abi
+specifies a set of calling conventions to use.
+.Fa atypes
+is an array of
+.Fa nargs
+pointers to
+.Nm ffi_type
+structs that describe the data type, size and alignment of each argument.
+.Fa rtype
+points to an
+.Nm ffi_type
+that describes the data type, size and alignment of the
+return value.
+.Sh RETURN VALUES
+Upon successful completion,
+.Nm ffi_prep_cif
+returns
+.Nm FFI_OK .
+It will return
+.Nm FFI_BAD_TYPEDEF
+if
+.Fa cif
+is
+.Nm NULL
+or
+.Fa atypes
+or
+.Fa rtype
+is malformed. If
+.Fa abi
+does not refer to a valid ABI,
+.Nm FFI_BAD_ABI
+will be returned. Available ABIs are
+defined in
+.Nm <ffitarget.h>
+.
+.Sh SEE ALSO
+.Xr ffi 3 ,
+.Xr ffi_call 3 
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/mdate-sh b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/mdate-sh
new file mode 100644
index 0000000..cd916c0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/mdate-sh
@@ -0,0 +1,201 @@
+#!/bin/sh
+# Get modification time of a file or directory and pretty-print it.
+
+scriptversion=2005-06-29.22
+
+# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005 Free Software
+# Foundation, Inc.
+# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
+#
+# 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 2, 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, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+  '')
+     echo "$0: No file.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: mdate-sh [--help] [--version] FILE
+
+Pretty-print the modification time of FILE.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "mdate-sh $scriptversion"
+    exit $?
+    ;;
+esac
+
+# Prevent date giving response in another language.
+LANG=C
+export LANG
+LC_ALL=C
+export LC_ALL
+LC_TIME=C
+export LC_TIME
+
+# GNU ls changes its time format in response to the TIME_STYLE
+# variable.  Since we cannot assume `unset' works, revert this
+# variable to its documented default.
+if test "${TIME_STYLE+set}" = set; then
+  TIME_STYLE=posix-long-iso
+  export TIME_STYLE
+fi
+
+save_arg1=$1
+
+# Find out how to get the extended ls output of a file or directory.
+if ls -L /dev/null 1>/dev/null 2>&1; then
+  ls_command='ls -L -l -d'
+else
+  ls_command='ls -l -d'
+fi
+
+# A `ls -l' line looks as follows on OS/2.
+#  drwxrwx---        0 Aug 11  2001 foo
+# This differs from Unix, which adds ownership information.
+#  drwxrwx---   2 root  root      4096 Aug 11  2001 foo
+#
+# To find the date, we split the line on spaces and iterate on words
+# until we find a month.  This cannot work with files whose owner is a
+# user named `Jan', or `Feb', etc.  However, it's unlikely that `/'
+# will be owned by a user whose name is a month.  So we first look at
+# the extended ls output of the root directory to decide how many
+# words should be skipped to get the date.
+
+# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
+set x`ls -l -d /`
+
+# Find which argument is the month.
+month=
+command=
+until test $month
+do
+  shift
+  # Add another shift to the command.
+  command="$command shift;"
+  case $1 in
+    Jan) month=January; nummonth=1;;
+    Feb) month=February; nummonth=2;;
+    Mar) month=March; nummonth=3;;
+    Apr) month=April; nummonth=4;;
+    May) month=May; nummonth=5;;
+    Jun) month=June; nummonth=6;;
+    Jul) month=July; nummonth=7;;
+    Aug) month=August; nummonth=8;;
+    Sep) month=September; nummonth=9;;
+    Oct) month=October; nummonth=10;;
+    Nov) month=November; nummonth=11;;
+    Dec) month=December; nummonth=12;;
+  esac
+done
+
+# Get the extended ls output of the file or directory.
+set dummy x`eval "$ls_command \"\$save_arg1\""`
+
+# Remove all preceding arguments
+eval $command
+
+# Because of the dummy argument above, month is in $2.
+#
+# On a POSIX system, we should have
+#
+# $# = 5
+# $1 = file size
+# $2 = month
+# $3 = day
+# $4 = year or time
+# $5 = filename
+#
+# On Darwin 7.7.0 and 7.6.0, we have
+#
+# $# = 4
+# $1 = day
+# $2 = month
+# $3 = year or time
+# $4 = filename
+
+# Get the month.
+case $2 in
+  Jan) month=January; nummonth=1;;
+  Feb) month=February; nummonth=2;;
+  Mar) month=March; nummonth=3;;
+  Apr) month=April; nummonth=4;;
+  May) month=May; nummonth=5;;
+  Jun) month=June; nummonth=6;;
+  Jul) month=July; nummonth=7;;
+  Aug) month=August; nummonth=8;;
+  Sep) month=September; nummonth=9;;
+  Oct) month=October; nummonth=10;;
+  Nov) month=November; nummonth=11;;
+  Dec) month=December; nummonth=12;;
+esac
+
+case $3 in
+  ???*) day=$1;;
+  *) day=$3; shift;;
+esac
+
+# Here we have to deal with the problem that the ls output gives either
+# the time of day or the year.
+case $3 in
+  *:*) set `date`; eval year=\$$#
+       case $2 in
+	 Jan) nummonthtod=1;;
+	 Feb) nummonthtod=2;;
+	 Mar) nummonthtod=3;;
+	 Apr) nummonthtod=4;;
+	 May) nummonthtod=5;;
+	 Jun) nummonthtod=6;;
+	 Jul) nummonthtod=7;;
+	 Aug) nummonthtod=8;;
+	 Sep) nummonthtod=9;;
+	 Oct) nummonthtod=10;;
+	 Nov) nummonthtod=11;;
+	 Dec) nummonthtod=12;;
+       esac
+       # For the first six month of the year the time notation can also
+       # be used for files modified in the last year.
+       if (expr $nummonth \> $nummonthtod) > /dev/null;
+       then
+	 year=`expr $year - 1`
+       fi;;
+  *) year=$3;;
+esac
+
+# The result.
+echo $day $month $year
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing
new file mode 100755
index 0000000..28055d2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/missing
@@ -0,0 +1,376 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2009-04-28.21; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# 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 2, 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 <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar*)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG="\${$#}"
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  tar*)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case $firstarg in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case $firstarg in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/msvcc.sh b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/msvcc.sh
new file mode 100755
index 0000000..dcdbeab
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/msvcc.sh
@@ -0,0 +1,197 @@
+#!/bin/sh
+
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (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.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is the MSVC wrappificator.
+#
+# The Initial Developer of the Original Code is
+# Timothy Wall <twalljava@dev.java.net>.
+# Portions created by the Initial Developer are Copyright (C) 2009
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Daniel Witte <dwitte@mozilla.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+#
+# GCC-compatible wrapper for cl.exe and ml.exe. Arguments are given in GCC
+# format and translated into something sensible for cl or ml.
+#
+
+args="-nologo -W3"
+md=-MD
+cl="cl"
+ml="ml"
+safeseh="-safeseh"
+output=
+
+while [ $# -gt 0 ]
+do
+  case $1
+  in
+    -fexceptions)
+      # Don't enable exceptions for now.
+      #args="$args -EHac"
+      shift 1
+    ;;
+    -m32)
+      shift 1
+    ;;
+    -m64)
+      cl="cl"   # "$MSVC/x86_amd64/cl"
+      ml="ml64" # "$MSVC/x86_amd64/ml64"
+      safeseh=
+      shift 1
+    ;;
+    -O0)
+      args="$args -Od"
+      shift 1
+    ;;
+    -O*)
+      # If we're optimizing, make sure we explicitly turn on some optimizations
+      # that are implicitly disabled by debug symbols (-Zi).
+      args="$args $1 -OPT:REF -OPT:ICF -INCREMENTAL:NO"
+      shift 1
+    ;;
+    -g)
+      # Enable debug symbol generation.
+      args="$args -Zi -DEBUG"
+      shift 1
+    ;;
+    -DFFI_DEBUG)
+      # Link against debug CRT and enable runtime error checks.
+      args="$args -RTC1"
+      defines="$defines $1"
+      md=-MDd
+      shift 1
+    ;;
+    -c)
+      args="$args -c"
+      args="$(echo $args | sed 's%/Fe%/Fo%g')"
+      single="-c"
+      shift 1
+    ;;
+    -D*=*)
+      name="$(echo $1|sed 's/-D\([^=][^=]*\)=.*/\1/g')"
+      value="$(echo $1|sed 's/-D[^=][^=]*=//g')"
+      args="$args -D${name}='$value'"
+      defines="$defines -D${name}='$value'"
+      shift 1
+    ;;
+    -D*)
+      args="$args $1"
+      defines="$defines $1"
+      shift 1
+    ;;
+    -I)
+      args="$args -I$2"
+      includes="$includes -I$2"
+      shift 2
+    ;;
+    -I*)
+      args="$args $1"
+      includes="$includes $1"
+      shift 1
+    ;;
+    -W|-Wextra)
+      # TODO map extra warnings
+      shift 1
+    ;;
+    -Wall)
+      # -Wall on MSVC is overzealous, and we already build with -W3. Nothing
+      # to do here.
+      shift 1
+    ;;
+    -Werror)
+      args="$args -WX"
+      shift 1
+    ;;
+    -W*)
+      # TODO map specific warnings
+      shift 1
+    ;;
+    -S)
+      args="$args -FAs"
+      shift 1
+    ;;
+    -o)
+      outdir="$(dirname $2)"
+      base="$(basename $2|sed 's/\.[^.]*//g')"
+      if [ -n "$single" ]; then 
+        output="-Fo$2"
+      else
+        output="-Fe$2"
+      fi
+      if [ -n "$assembly" ]; then
+        args="$args $output"
+      else
+        args="$args $output -Fd$outdir/$base -Fp$outdir/$base -Fa$outdir/$base"
+      fi
+      shift 2
+    ;;
+    *.S)
+      src=$1
+      assembly="true"
+      shift 1
+    ;;
+    *.c)
+      args="$args $1"
+      shift 1
+    ;;
+    *)
+      # Assume it's an MSVC argument, and pass it through.
+      args="$args $1"
+      shift 1
+    ;;
+  esac
+done
+
+if [ -n "$assembly" ]; then
+    if [ -z "$outdir" ]; then
+      outdir="."
+    fi
+    ppsrc="$outdir/$(basename $src|sed 's/.S$/.asm/g')"
+    echo "$cl -nologo -EP $includes $defines $src > $ppsrc"
+    "$cl" -nologo -EP $includes $defines $src > $ppsrc || exit $?
+    output="$(echo $output | sed 's%/F[dpa][^ ]*%%g')"
+    args="-nologo $safeseh $single $output $ppsrc"
+
+    echo "$ml $args"
+    eval "\"$ml\" $args"
+    result=$?
+
+    # required to fix ml64 broken output?
+    #mv *.obj $outdir
+else
+    args="$md $args"
+    echo "$cl $args"
+    eval "\"$cl\" $args"
+    result=$?
+fi
+
+exit $result
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffi.c
new file mode 100644
index 0000000..8d6b2ba
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffi.c
@@ -0,0 +1,284 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 1998, 2001, 2007, 2008  Red Hat, Inc.
+   
+   Alpha Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+#include <stdlib.h>
+
+/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
+   all further uses in this file will refer to the 128-bit type.  */
+#if defined(__LONG_DOUBLE_128__)
+# if FFI_TYPE_LONGDOUBLE != 4
+#  error FFI_TYPE_LONGDOUBLE out of date
+# endif
+#else
+# undef FFI_TYPE_LONGDOUBLE
+# define FFI_TYPE_LONGDOUBLE 4
+#endif
+
+extern void ffi_call_osf(void *, unsigned long, unsigned, void *, void (*)(void))
+  FFI_HIDDEN;
+extern void ffi_closure_osf(void) FFI_HIDDEN;
+
+
+ffi_status
+ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  /* Adjust cif->bytes to represent a minimum 6 words for the temporary
+     register argument loading area.  */
+  if (cif->bytes < 6*FFI_SIZEOF_ARG)
+    cif->bytes = 6*FFI_SIZEOF_ARG;
+
+  /* Set the return type flag */
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_STRUCT:
+    case FFI_TYPE_FLOAT:
+    case FFI_TYPE_DOUBLE:
+      cif->flags = cif->rtype->type;
+      break;
+
+    case FFI_TYPE_LONGDOUBLE:
+      /* 128-bit long double is returned in memory, like a struct.  */
+      cif->flags = FFI_TYPE_STRUCT;
+      break;
+
+    default:
+      cif->flags = FFI_TYPE_INT;
+      break;
+    }
+  
+  return FFI_OK;
+}
+
+
+void
+ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  unsigned long *stack, *argp;
+  long i, avn;
+  ffi_type **arg_types;
+  
+  /* If the return value is a struct and we don't have a return
+     value address then we need to make one.  */
+  if (rvalue == NULL && cif->flags == FFI_TYPE_STRUCT)
+    rvalue = alloca(cif->rtype->size);
+
+  /* Allocate the space for the arguments, plus 4 words of temp
+     space for ffi_call_osf.  */
+  argp = stack = alloca(cif->bytes + 4*FFI_SIZEOF_ARG);
+
+  if (cif->flags == FFI_TYPE_STRUCT)
+    *(void **) argp++ = rvalue;
+
+  i = 0;
+  avn = cif->nargs;
+  arg_types = cif->arg_types;
+
+  while (i < avn)
+    {
+      size_t size = (*arg_types)->size;
+
+      switch ((*arg_types)->type)
+	{
+	case FFI_TYPE_SINT8:
+	  *(SINT64 *) argp = *(SINT8 *)(* avalue);
+	  break;
+		  
+	case FFI_TYPE_UINT8:
+	  *(SINT64 *) argp = *(UINT8 *)(* avalue);
+	  break;
+		  
+	case FFI_TYPE_SINT16:
+	  *(SINT64 *) argp = *(SINT16 *)(* avalue);
+	  break;
+		  
+	case FFI_TYPE_UINT16:
+	  *(SINT64 *) argp = *(UINT16 *)(* avalue);
+	  break;
+		  
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_UINT32:
+	  /* Note that unsigned 32-bit quantities are sign extended.  */
+	  *(SINT64 *) argp = *(SINT32 *)(* avalue);
+	  break;
+		  
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_POINTER:
+	  *(UINT64 *) argp = *(UINT64 *)(* avalue);
+	  break;
+
+	case FFI_TYPE_FLOAT:
+	  if (argp - stack < 6)
+	    {
+	      /* Note the conversion -- all the fp regs are loaded as
+		 doubles.  The in-register format is the same.  */
+	      *(double *) argp = *(float *)(* avalue);
+	    }
+	  else
+	    *(float *) argp = *(float *)(* avalue);
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  *(double *) argp = *(double *)(* avalue);
+	  break;
+
+	case FFI_TYPE_LONGDOUBLE:
+	  /* 128-bit long double is passed by reference.  */
+	  *(long double **) argp = (long double *)(* avalue);
+	  size = sizeof (long double *);
+	  break;
+
+	case FFI_TYPE_STRUCT:
+	  memcpy(argp, *avalue, (*arg_types)->size);
+	  break;
+
+	default:
+	  FFI_ASSERT(0);
+	}
+
+      argp += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
+      i++, arg_types++, avalue++;
+    }
+
+  ffi_call_osf(stack, cif->bytes, cif->flags, rvalue, fn);
+}
+
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*, void*, void**, void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  unsigned int *tramp;
+
+  tramp = (unsigned int *) &closure->tramp[0];
+  tramp[0] = 0x47fb0401;	/* mov $27,$1		*/
+  tramp[1] = 0xa77b0010;	/* ldq $27,16($27)	*/
+  tramp[2] = 0x6bfb0000;	/* jmp $31,($27),0	*/
+  tramp[3] = 0x47ff041f;	/* nop			*/
+  *(void **) &tramp[4] = ffi_closure_osf;
+
+  closure->cif = cif;
+  closure->fun = fun;
+  closure->user_data = user_data;
+
+  /* Flush the Icache.
+
+     Tru64 UNIX as doesn't understand the imb mnemonic, so use call_pal
+     instead, since both Compaq as and gas can handle it.
+
+     0x86 is PAL_imb in Tru64 UNIX <alpha/pal.h>.  */
+  asm volatile ("call_pal 0x86" : : : "memory");
+
+  return FFI_OK;
+}
+
+
+long FFI_HIDDEN
+ffi_closure_osf_inner(ffi_closure *closure, void *rvalue, unsigned long *argp)
+{
+  ffi_cif *cif;
+  void **avalue;
+  ffi_type **arg_types;
+  long i, avn, argn;
+
+  cif = closure->cif;
+  avalue = alloca(cif->nargs * sizeof(void *));
+
+  argn = 0;
+
+  /* Copy the caller's structure return address to that the closure
+     returns the data directly to the caller.  */
+  if (cif->flags == FFI_TYPE_STRUCT)
+    {
+      rvalue = (void *) argp[0];
+      argn = 1;
+    }
+
+  i = 0;
+  avn = cif->nargs;
+  arg_types = cif->arg_types;
+  
+  /* Grab the addresses of the arguments from the stack frame.  */
+  while (i < avn)
+    {
+      size_t size = arg_types[i]->size;
+
+      switch (arg_types[i]->type)
+	{
+	case FFI_TYPE_SINT8:
+	case FFI_TYPE_UINT8:
+	case FFI_TYPE_SINT16:
+	case FFI_TYPE_UINT16:
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_UINT32:
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_POINTER:
+	case FFI_TYPE_STRUCT:
+	  avalue[i] = &argp[argn];
+	  break;
+
+	case FFI_TYPE_FLOAT:
+	  if (argn < 6)
+	    {
+	      /* Floats coming from registers need conversion from double
+	         back to float format.  */
+	      *(float *)&argp[argn - 6] = *(double *)&argp[argn - 6];
+	      avalue[i] = &argp[argn - 6];
+	    }
+	  else
+	    avalue[i] = &argp[argn];
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  avalue[i] = &argp[argn - (argn < 6 ? 6 : 0)];
+	  break;
+
+	case FFI_TYPE_LONGDOUBLE:
+	  /* 128-bit long double is passed by reference.  */
+	  avalue[i] = (long double *) argp[argn];
+	  size = sizeof (long double *);
+	  break;
+
+	default:
+	  abort ();
+	}
+
+      argn += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
+      i++;
+    }
+
+  /* Invoke the closure.  */
+  closure->fun (cif, rvalue, avalue, closure->user_data);
+
+  /* Tell ffi_closure_osf how to perform return type promotions.  */
+  return cif->rtype->type;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffitarget.h
new file mode 100644
index 0000000..7d06eb0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/ffitarget.h
@@ -0,0 +1,48 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Target configuration macros for Alpha.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_OSF,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_OSF
+} ffi_abi;
+#endif
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 24
+#define FFI_NATIVE_RAW_API 0
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/osf.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/osf.S
new file mode 100644
index 0000000..6b9f4df
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/alpha/osf.S
@@ -0,0 +1,387 @@
+/* -----------------------------------------------------------------------
+   osf.S - Copyright (c) 1998, 2001, 2007, 2008, 2011 Red Hat
+   
+   Alpha/OSF Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+	.arch ev6
+	.text
+
+/* ffi_call_osf (void *args, unsigned long bytes, unsigned flags,
+		 void *raddr, void (*fnaddr)(void));
+
+   Bit o trickiness here -- ARGS+BYTES is the base of the stack frame
+   for this function.  This has been allocated by ffi_call.  We also
+   deallocate some of the stack that has been alloca'd.  */
+
+	.align	3
+	.globl	ffi_call_osf
+	.ent	ffi_call_osf
+	FFI_HIDDEN(ffi_call_osf)
+
+ffi_call_osf:
+	.frame	$15, 32, $26, 0
+	.mask   0x4008000, -32
+$LFB1:
+	addq	$16,$17,$1
+	mov	$16, $30
+	stq	$26, 0($1)
+	stq	$15, 8($1)
+	stq	$18, 16($1)
+	mov	$1, $15
+$LCFI1:
+	.prologue 0
+
+	stq	$19, 24($1)
+	mov	$20, $27
+
+	# Load up all of the (potential) argument registers.
+	ldq	$16, 0($30)
+	ldt	$f16, 0($30)
+	ldt	$f17, 8($30)
+	ldq	$17, 8($30)
+	ldt	$f18, 16($30)
+	ldq	$18, 16($30)
+	ldt	$f19, 24($30)
+	ldq	$19, 24($30)
+	ldt	$f20, 32($30)
+	ldq	$20, 32($30)
+	ldt	$f21, 40($30)
+	ldq	$21, 40($30)
+
+	# Deallocate the register argument area.
+	lda	$30, 48($30)
+
+	jsr	$26, ($27), 0
+	ldgp	$29, 0($26)
+
+	# If the return value pointer is NULL, assume no return value.
+	ldq	$19, 24($15)
+	ldq	$18, 16($15)
+	ldq	$26, 0($15)
+$LCFI2:
+	beq	$19, $noretval
+
+	# Store the return value out in the proper type.
+	cmpeq	$18, FFI_TYPE_INT, $1
+	bne	$1, $retint
+	cmpeq	$18, FFI_TYPE_FLOAT, $2
+	bne	$2, $retfloat
+	cmpeq	$18, FFI_TYPE_DOUBLE, $3
+	bne	$3, $retdouble
+
+	.align	3
+$noretval:
+	ldq	$15, 8($15)
+	ret
+
+	.align	4
+$retint:
+	stq	$0, 0($19)
+	nop
+	ldq	$15, 8($15)
+	ret
+
+	.align	4
+$retfloat:
+	sts	$f0, 0($19)
+	nop
+	ldq	$15, 8($15)
+	ret
+
+	.align	4
+$retdouble:
+	stt	$f0, 0($19)
+	nop
+	ldq	$15, 8($15)
+	ret
+$LFE1:
+
+	.end	ffi_call_osf
+
+/* ffi_closure_osf(...)
+
+   Receives the closure argument in $1.   */
+
+	.align	3
+	.globl	ffi_closure_osf
+	.ent	ffi_closure_osf
+	FFI_HIDDEN(ffi_closure_osf)
+
+ffi_closure_osf:
+	.frame	$30, 16*8, $26, 0
+	.mask	0x4000000, -16*8
+$LFB2:
+	ldgp	$29, 0($27)
+	subq	$30, 16*8, $30
+$LCFI5:
+	stq	$26, 0($30)
+$LCFI6:
+	.prologue 1
+
+	# Store all of the potential argument registers in va_list format.
+	stt	$f16, 4*8($30)
+	stt	$f17, 5*8($30)
+	stt	$f18, 6*8($30)
+	stt	$f19, 7*8($30)
+	stt	$f20, 8*8($30)
+	stt	$f21, 9*8($30)
+	stq	$16, 10*8($30)
+	stq	$17, 11*8($30)
+	stq	$18, 12*8($30)
+	stq	$19, 13*8($30)
+	stq	$20, 14*8($30)
+	stq	$21, 15*8($30)
+
+	# Call ffi_closure_osf_inner to do the bulk of the work.
+	mov	$1, $16
+	lda	$17, 2*8($30)
+	lda	$18, 10*8($30)
+	jsr	$26, ffi_closure_osf_inner
+	ldgp	$29, 0($26)
+	ldq	$26, 0($30)
+
+	# Load up the return value in the proper type.
+	lda	$1, $load_table
+	s4addq	$0, $1, $1
+	ldl	$1, 0($1)
+	addq	$1, $29, $1
+	jmp	$31, ($1), $load_32
+
+	.align 4
+$load_none:
+	addq	$30, 16*8, $30
+	ret
+
+	.align 4
+$load_float:
+	lds	$f0, 16($30)
+	nop
+	addq	$30, 16*8, $30
+	ret
+
+	.align 4
+$load_double:
+	ldt	$f0, 16($30)
+	nop
+	addq	$30, 16*8, $30
+	ret
+
+	.align 4
+$load_u8:
+#ifdef __alpha_bwx__
+	ldbu	$0, 16($30)
+	nop
+#else
+	ldq	$0, 16($30)
+	and	$0, 255, $0
+#endif
+	addq	$30, 16*8, $30
+	ret
+
+	.align 4
+$load_s8:
+#ifdef __alpha_bwx__
+	ldbu	$0, 16($30)
+	sextb	$0, $0
+#else
+	ldq	$0, 16($30)
+	sll	$0, 56, $0
+	sra	$0, 56, $0
+#endif
+	addq	$30, 16*8, $30
+	ret
+
+	.align 4
+$load_u16:
+#ifdef __alpha_bwx__
+	ldwu	$0, 16($30)
+	nop
+#else
+	ldq	$0, 16($30)
+	zapnot	$0, 3, $0
+#endif
+	addq	$30, 16*8, $30
+	ret
+
+	.align 4
+$load_s16:
+#ifdef __alpha_bwx__
+	ldwu	$0, 16($30)
+	sextw	$0, $0
+#else
+	ldq	$0, 16($30)
+	sll	$0, 48, $0
+	sra	$0, 48, $0
+#endif
+	addq	$30, 16*8, $30
+	ret
+
+	.align 4
+$load_32:
+	ldl	$0, 16($30)
+	nop
+	addq	$30, 16*8, $30
+	ret
+
+	.align 4
+$load_64:
+	ldq	$0, 16($30)
+	nop
+	addq	$30, 16*8, $30
+	ret
+$LFE2:
+
+	.end	ffi_closure_osf
+
+#ifdef __ELF__
+.section .rodata
+#else
+.rdata
+#endif
+$load_table:
+	.gprel32 $load_none	# FFI_TYPE_VOID
+	.gprel32 $load_32	# FFI_TYPE_INT
+	.gprel32 $load_float	# FFI_TYPE_FLOAT
+	.gprel32 $load_double	# FFI_TYPE_DOUBLE
+	.gprel32 $load_none	# FFI_TYPE_LONGDOUBLE
+	.gprel32 $load_u8	# FFI_TYPE_UINT8
+	.gprel32 $load_s8	# FFI_TYPE_SINT8
+	.gprel32 $load_u16	# FFI_TYPE_UINT16
+	.gprel32 $load_s16	# FFI_TYPE_SINT16
+	.gprel32 $load_32	# FFI_TYPE_UINT32
+	.gprel32 $load_32	# FFI_TYPE_SINT32
+	.gprel32 $load_64	# FFI_TYPE_UINT64
+	.gprel32 $load_64	# FFI_TYPE_SINT64
+	.gprel32 $load_none	# FFI_TYPE_STRUCT
+	.gprel32 $load_64	# FFI_TYPE_POINTER
+
+/* Assert that the table above is in sync with ffi.h.  */
+
+#if	   FFI_TYPE_FLOAT != 2		\
+	|| FFI_TYPE_DOUBLE != 3		\
+	|| FFI_TYPE_UINT8 != 5		\
+	|| FFI_TYPE_SINT8 != 6		\
+	|| FFI_TYPE_UINT16 != 7		\
+	|| FFI_TYPE_SINT16 != 8		\
+	|| FFI_TYPE_UINT32 != 9		\
+	|| FFI_TYPE_SINT32 != 10	\
+	|| FFI_TYPE_UINT64 != 11	\
+	|| FFI_TYPE_SINT64 != 12	\
+	|| FFI_TYPE_STRUCT != 13	\
+	|| FFI_TYPE_POINTER != 14	\
+	|| FFI_TYPE_LAST != 14
+#error "osf.S out of sync with ffi.h"
+#endif
+
+#ifdef __ELF__
+# define UA_SI		.4byte
+# define FDE_ENCODING	0x1b	/* pcrel sdata4 */
+# define FDE_ENCODE(X)	.4byte X-.
+# define FDE_ARANGE(X)	.4byte X
+#elif defined __osf__
+# define UA_SI		.align 0; .long
+# define FDE_ENCODING	0x50	/* aligned absolute */
+# define FDE_ENCODE(X)	.align 3; .quad X
+# define FDE_ARANGE(X)	.align 0; .quad X
+#endif
+
+#ifdef __ELF__
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
+#elif defined __osf__
+	.data
+	.align 3
+	.globl _GLOBAL__F_ffi_call_osf
+_GLOBAL__F_ffi_call_osf:
+#endif
+__FRAME_BEGIN__:
+	UA_SI	$LECIE1-$LSCIE1	# Length of Common Information Entry
+$LSCIE1:
+	UA_SI	0x0		# CIE Identifier Tag
+	.byte	0x1		# CIE Version
+	.ascii "zR\0"		# CIE Augmentation
+	.byte	0x1		# uleb128 0x1; CIE Code Alignment Factor
+	.byte	0x78		# sleb128 -8; CIE Data Alignment Factor
+	.byte	26		# CIE RA Column
+	.byte	0x1		# uleb128 0x1; Augmentation size
+	.byte	FDE_ENCODING	# FDE Encoding
+	.byte	0xc		# DW_CFA_def_cfa
+	.byte	30		# uleb128 column 30
+	.byte	0		# uleb128 offset 0
+	.align 3
+$LECIE1:
+$LSFDE1:
+	UA_SI	$LEFDE1-$LASFDE1		# FDE Length
+$LASFDE1:
+	UA_SI	$LASFDE1-__FRAME_BEGIN__	# FDE CIE offset
+	FDE_ENCODE($LFB1)			# FDE initial location
+	FDE_ARANGE($LFE1-$LFB1)			# FDE address range
+	.byte	0x0		# uleb128 0x0; Augmentation size
+
+	.byte	0x4		# DW_CFA_advance_loc4
+	UA_SI	$LCFI1-$LFB1
+	.byte	0x9a		# DW_CFA_offset, column 26
+	.byte	4		# uleb128 4*-8
+	.byte	0x8f		# DW_CFA_offset, column 15
+	.byte	0x3		# uleb128 3*-8
+	.byte	0xc		# DW_CFA_def_cfa
+	.byte	15		# uleb128 column 15
+	.byte	32		# uleb128 offset 32
+
+	.byte	0x4		# DW_CFA_advance_loc4
+	UA_SI	$LCFI2-$LCFI1
+	.byte	0xda		# DW_CFA_restore, column 26
+	.align 3
+$LEFDE1:
+
+$LSFDE3:
+	UA_SI	$LEFDE3-$LASFDE3		# FDE Length
+$LASFDE3:
+	UA_SI	$LASFDE3-__FRAME_BEGIN__	# FDE CIE offset
+	FDE_ENCODE($LFB2)			# FDE initial location
+	FDE_ARANGE($LFE2-$LFB2)			# FDE address range
+	.byte	0x0		# uleb128 0x0; Augmentation size
+
+	.byte	0x4		# DW_CFA_advance_loc4
+	UA_SI	$LCFI5-$LFB2
+	.byte	0xe		# DW_CFA_def_cfa_offset
+	.byte	0x80,0x1	# uleb128 128
+
+	.byte	0x4		# DW_CFA_advance_loc4
+	UA_SI	$LCFI6-$LCFI5
+	.byte	0x9a		# DW_CFA_offset, column 26
+	.byte	16		# uleb128 offset 16*-8
+	.align 3
+$LEFDE3:
+#if defined __osf__
+	.align 0
+	.long	0		# End of Table
+#endif
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffi.c
new file mode 100644
index 0000000..b2e7667
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffi.c
@@ -0,0 +1,728 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 2011 Plausible Labs Cooperative, Inc.
+           Copyright (c) 2011 Anthony Green
+	   Copyright (c) 2011 Free Software Foundation
+           Copyright (c) 1998, 2008, 2011  Red Hat, Inc.
+	   
+   ARM Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+
+/* Forward declares. */
+static int vfp_type_p (ffi_type *);
+static void layout_vfp_args (ffi_cif *);
+
+/* ffi_prep_args is called by the assembly routine once stack space
+   has been allocated for the function's arguments
+   
+   The vfp_space parameter is the load area for VFP regs, the return
+   value is cif->vfp_used (word bitset of VFP regs used for passing
+   arguments). These are only used for the VFP hard-float ABI.
+*/
+int ffi_prep_args(char *stack, extended_cif *ecif, float *vfp_space)
+{
+  register unsigned int i, vi = 0;
+  register void **p_argv;
+  register char *argp;
+  register ffi_type **p_arg;
+
+  argp = stack;
+
+  if ( ecif->cif->flags == FFI_TYPE_STRUCT ) {
+    *(void **) argp = ecif->rvalue;
+    argp += 4;
+  }
+
+  p_argv = ecif->avalue;
+
+  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+       (i != 0);
+       i--, p_arg++)
+    {
+      size_t z;
+
+      /* Allocated in VFP registers. */
+      if (ecif->cif->abi == FFI_VFP
+	  && vi < ecif->cif->vfp_nargs && vfp_type_p (*p_arg))
+	{
+	  float* vfp_slot = vfp_space + ecif->cif->vfp_args[vi++];
+	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
+	    *((float*)vfp_slot) = *((float*)*p_argv);
+	  else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
+	    *((double*)vfp_slot) = *((double*)*p_argv);
+	  else
+	    memcpy(vfp_slot, *p_argv, (*p_arg)->size);
+	  p_argv++;
+	  continue;
+	}
+
+      /* Align if necessary */
+      if (((*p_arg)->alignment - 1) & (unsigned) argp) {
+	argp = (char *) ALIGN(argp, (*p_arg)->alignment);
+      }
+
+      if ((*p_arg)->type == FFI_TYPE_STRUCT)
+	argp = (char *) ALIGN(argp, 4);
+
+	  z = (*p_arg)->size;
+	  if (z < sizeof(int))
+	    {
+	      z = sizeof(int);
+	      switch ((*p_arg)->type)
+		{
+		case FFI_TYPE_SINT8:
+		  *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
+		  break;
+		  
+		case FFI_TYPE_UINT8:
+		  *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
+		  break;
+		  
+		case FFI_TYPE_SINT16:
+		  *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
+		  break;
+		  
+		case FFI_TYPE_UINT16:
+		  *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
+		  break;
+		  
+		case FFI_TYPE_STRUCT:
+		  memcpy(argp, *p_argv, (*p_arg)->size);
+		  break;
+
+		default:
+		  FFI_ASSERT(0);
+		}
+	    }
+	  else if (z == sizeof(int))
+	    {
+	      *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
+	    }
+	  else
+	    {
+	      memcpy(argp, *p_argv, z);
+	    }
+	  p_argv++;
+	  argp += z;
+    }
+
+  /* Indicate the VFP registers used. */
+  return ecif->cif->vfp_used;
+}
+
+/* Perform machine dependent cif processing */
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  int type_code;
+  /* Round the stack up to a multiple of 8 bytes.  This isn't needed 
+     everywhere, but it is on some platforms, and it doesn't harm anything
+     when it isn't needed.  */
+  cif->bytes = (cif->bytes + 7) & ~7;
+
+  /* Set the return type flag */
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_VOID:
+    case FFI_TYPE_FLOAT:
+    case FFI_TYPE_DOUBLE:
+      cif->flags = (unsigned) cif->rtype->type;
+      break;
+
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_UINT64:
+      cif->flags = (unsigned) FFI_TYPE_SINT64;
+      break;
+
+    case FFI_TYPE_STRUCT:
+      if (cif->abi == FFI_VFP
+	  && (type_code = vfp_type_p (cif->rtype)) != 0)
+	{
+	  /* A Composite Type passed in VFP registers, either
+	     FFI_TYPE_STRUCT_VFP_FLOAT or FFI_TYPE_STRUCT_VFP_DOUBLE. */
+	  cif->flags = (unsigned) type_code;
+	}
+      else if (cif->rtype->size <= 4)
+	/* A Composite Type not larger than 4 bytes is returned in r0.  */
+	cif->flags = (unsigned)FFI_TYPE_INT;
+      else
+	/* A Composite Type larger than 4 bytes, or whose size cannot
+	   be determined statically ... is stored in memory at an
+	   address passed [in r0].  */
+	cif->flags = (unsigned)FFI_TYPE_STRUCT;
+      break;
+
+    default:
+      cif->flags = FFI_TYPE_INT;
+      break;
+    }
+
+  /* Map out the register placements of VFP register args.
+     The VFP hard-float calling conventions are slightly more sophisticated than
+     the base calling conventions, so we do it here instead of in ffi_prep_args(). */
+  if (cif->abi == FFI_VFP)
+    layout_vfp_args (cif);
+
+  return FFI_OK;
+}
+
+/* Prototypes for assembly functions, in sysv.S */
+extern void ffi_call_SYSV (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *);
+extern void ffi_call_VFP (void (*fn)(void), extended_cif *, unsigned, unsigned, unsigned *);
+
+void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+
+  int small_struct = (cif->flags == FFI_TYPE_INT 
+		      && cif->rtype->type == FFI_TYPE_STRUCT);
+  int vfp_struct = (cif->flags == FFI_TYPE_STRUCT_VFP_FLOAT
+		    || cif->flags == FFI_TYPE_STRUCT_VFP_DOUBLE);
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+
+  unsigned int temp;
+  
+  /* If the return value is a struct and we don't have a return	*/
+  /* value address then we need to make one		        */
+
+  if ((rvalue == NULL) && 
+      (cif->flags == FFI_TYPE_STRUCT))
+    {
+      ecif.rvalue = alloca(cif->rtype->size);
+    }
+  else if (small_struct)
+    ecif.rvalue = &temp;
+  else if (vfp_struct)
+    {
+      /* Largest case is double x 4. */
+      ecif.rvalue = alloca(32);
+    }
+  else
+    ecif.rvalue = rvalue;
+
+  switch (cif->abi) 
+    {
+    case FFI_SYSV:
+      ffi_call_SYSV (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue);
+      break;
+
+    case FFI_VFP:
+      ffi_call_VFP (fn, &ecif, cif->bytes, cif->flags, ecif.rvalue);
+      break;
+
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+  if (small_struct)
+    memcpy (rvalue, &temp, cif->rtype->size);
+  else if (vfp_struct)
+    memcpy (rvalue, ecif.rvalue, cif->rtype->size);
+}
+
+/** private members **/
+
+static void ffi_prep_incoming_args_SYSV (char *stack, void **ret,
+					 void** args, ffi_cif* cif, float *vfp_stack);
+
+void ffi_closure_SYSV (ffi_closure *);
+
+void ffi_closure_VFP (ffi_closure *);
+
+/* This function is jumped to by the trampoline */
+
+unsigned int
+ffi_closure_SYSV_inner (closure, respp, args, vfp_args)
+     ffi_closure *closure;
+     void **respp;
+     void *args;
+     void *vfp_args;
+{
+  // our various things...
+  ffi_cif       *cif;
+  void         **arg_area;
+
+  cif         = closure->cif;
+  arg_area    = (void**) alloca (cif->nargs * sizeof (void*));  
+
+  /* this call will initialize ARG_AREA, such that each
+   * element in that array points to the corresponding 
+   * value on the stack; and if the function returns
+   * a structure, it will re-set RESP to point to the
+   * structure return address.  */
+
+  ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif, vfp_args);
+
+  (closure->fun) (cif, *respp, arg_area, closure->user_data);
+
+  return cif->flags;
+}
+
+/*@-exportheader@*/
+static void 
+ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
+			    void **avalue, ffi_cif *cif,
+			    /* Used only under VFP hard-float ABI. */
+			    float *vfp_stack)
+/*@=exportheader@*/
+{
+  register unsigned int i, vi = 0;
+  register void **p_argv;
+  register char *argp;
+  register ffi_type **p_arg;
+
+  argp = stack;
+
+  if ( cif->flags == FFI_TYPE_STRUCT ) {
+    *rvalue = *(void **) argp;
+    argp += 4;
+  }
+
+  p_argv = avalue;
+
+  for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
+    {
+      size_t z;
+      size_t alignment;
+  
+      if (cif->abi == FFI_VFP
+	  && vi < cif->vfp_nargs && vfp_type_p (*p_arg))
+	{
+	  *p_argv++ = (void*)(vfp_stack + cif->vfp_args[vi++]);
+	  continue;
+	}
+
+      alignment = (*p_arg)->alignment;
+      if (alignment < 4)
+	alignment = 4;
+      /* Align if necessary */
+      if ((alignment - 1) & (unsigned) argp) {
+	argp = (char *) ALIGN(argp, alignment);
+      }
+
+      z = (*p_arg)->size;
+
+      /* because we're little endian, this is what it turns into.   */
+
+      *p_argv = (void*) argp;
+
+      p_argv++;
+      argp += z;
+    }
+  
+  return;
+}
+
+/* How to make a trampoline.  */
+
+#if FFI_EXEC_TRAMPOLINE_TABLE
+
+#include <mach/mach.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern void *ffi_closure_trampoline_table_page;
+
+typedef struct ffi_trampoline_table ffi_trampoline_table;
+typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry;
+
+struct ffi_trampoline_table {
+  /* contigious writable and executable pages */
+  vm_address_t config_page;
+  vm_address_t trampoline_page;
+
+  /* free list tracking */
+  uint16_t free_count;
+  ffi_trampoline_table_entry *free_list;
+  ffi_trampoline_table_entry *free_list_pool;
+
+  ffi_trampoline_table *prev;
+  ffi_trampoline_table *next;
+};
+
+struct ffi_trampoline_table_entry {
+  void *(*trampoline)();
+  ffi_trampoline_table_entry *next;
+};
+
+/* Override the standard architecture trampoline size */
+// XXX TODO - Fix
+#undef FFI_TRAMPOLINE_SIZE
+#define FFI_TRAMPOLINE_SIZE 12
+
+/* The trampoline configuration is placed at 4080 bytes prior to the trampoline's entry point */
+#define FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc) ((void **) (((uint8_t *) codeloc) - 4080));
+
+/* The first 16 bytes of the config page are unused, as they are unaddressable from the trampoline page. */
+#define FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET 16
+
+/* Total number of trampolines that fit in one trampoline table */
+#define FFI_TRAMPOLINE_COUNT ((PAGE_SIZE - FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) / FFI_TRAMPOLINE_SIZE)
+
+static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER;
+static ffi_trampoline_table *ffi_trampoline_tables = NULL;
+
+static ffi_trampoline_table *
+ffi_trampoline_table_alloc ()
+{
+  ffi_trampoline_table *table = NULL;
+
+  /* Loop until we can allocate two contigious pages */
+  while (table == NULL) {
+    vm_address_t config_page = 0x0;
+    kern_return_t kt;
+
+    /* Try to allocate two pages */
+    kt = vm_allocate (mach_task_self (), &config_page, PAGE_SIZE*2, VM_FLAGS_ANYWHERE);
+    if (kt != KERN_SUCCESS) {
+      fprintf(stderr, "vm_allocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
+      break;
+    }
+
+    /* Now drop the second half of the allocation to make room for the trampoline table */
+    vm_address_t trampoline_page = config_page+PAGE_SIZE;
+    kt = vm_deallocate (mach_task_self (), trampoline_page, PAGE_SIZE);
+    if (kt != KERN_SUCCESS) {
+      fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
+      break;
+    }
+
+    /* Remap the trampoline table to directly follow the config page */
+    vm_prot_t cur_prot;
+    vm_prot_t max_prot;
+
+    kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_SIZE, 0x0, FALSE, mach_task_self (), (vm_address_t) &ffi_closure_trampoline_table_page, FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE);
+
+    /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */
+    if (kt != KERN_SUCCESS) {
+      /* Log unexpected failures */
+      if (kt != KERN_NO_SPACE) {
+        fprintf(stderr, "vm_remap() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
+      }
+
+      vm_deallocate (mach_task_self (), config_page, PAGE_SIZE);
+      continue;
+    }
+
+    /* We have valid trampoline and config pages */
+    table = calloc (1, sizeof(ffi_trampoline_table));
+    table->free_count = FFI_TRAMPOLINE_COUNT;
+    table->config_page = config_page;
+    table->trampoline_page = trampoline_page;
+
+    /* Create and initialize the free list */
+    table->free_list_pool = calloc(FFI_TRAMPOLINE_COUNT, sizeof(ffi_trampoline_table_entry));
+
+    uint16_t i;
+    for (i = 0; i < table->free_count; i++) {
+      ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
+      entry->trampoline = (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
+
+      if (i < table->free_count - 1)
+        entry->next = &table->free_list_pool[i+1];
+    }
+
+    table->free_list = table->free_list_pool;
+  }
+
+  return table;
+}
+
+void *
+ffi_closure_alloc (size_t size, void **code)
+{
+  /* Create the closure */
+  ffi_closure *closure = malloc(size);
+  if (closure == NULL)
+    return NULL;
+
+  pthread_mutex_lock(&ffi_trampoline_lock);
+
+  /* Check for an active trampoline table with available entries. */
+  ffi_trampoline_table *table = ffi_trampoline_tables;
+  if (table == NULL || table->free_list == NULL) {
+    table = ffi_trampoline_table_alloc ();
+    if (table == NULL) {
+      free(closure);
+      return NULL;
+    }
+
+    /* Insert the new table at the top of the list */
+    table->next = ffi_trampoline_tables;
+    if (table->next != NULL)
+        table->next->prev = table;
+
+    ffi_trampoline_tables = table;
+  }
+
+  /* Claim the free entry */
+  ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list;
+  ffi_trampoline_tables->free_list = entry->next;
+  ffi_trampoline_tables->free_count--;
+  entry->next = NULL;
+
+  pthread_mutex_unlock(&ffi_trampoline_lock);
+
+  /* Initialize the return values */
+  *code = entry->trampoline;
+  closure->trampoline_table = table;
+  closure->trampoline_table_entry = entry;
+
+  return closure;
+}
+
+void
+ffi_closure_free (void *ptr)
+{
+  ffi_closure *closure = ptr;
+
+  pthread_mutex_lock(&ffi_trampoline_lock);
+
+  /* Fetch the table and entry references */
+  ffi_trampoline_table *table = closure->trampoline_table;
+  ffi_trampoline_table_entry *entry = closure->trampoline_table_entry;
+
+  /* Return the entry to the free list */
+  entry->next = table->free_list;
+  table->free_list = entry;
+  table->free_count++;
+
+  /* If all trampolines within this table are free, and at least one other table exists, deallocate
+   * the table */
+  if (table->free_count == FFI_TRAMPOLINE_COUNT && ffi_trampoline_tables != table) {
+    /* Remove from the list */
+    if (table->prev != NULL)
+      table->prev->next = table->next;
+
+    if (table->next != NULL)
+      table->next->prev = table->prev;
+
+    /* Deallocate pages */
+    kern_return_t kt;
+    kt = vm_deallocate (mach_task_self (), table->config_page, PAGE_SIZE);
+    if (kt != KERN_SUCCESS)
+      fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
+
+    kt = vm_deallocate (mach_task_self (), table->trampoline_page, PAGE_SIZE);
+    if (kt != KERN_SUCCESS)
+      fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
+
+    /* Deallocate free list */
+    free (table->free_list_pool);
+    free (table);
+  } else if (ffi_trampoline_tables != table) {
+    /* Otherwise, bump this table to the top of the list */
+    table->prev = NULL;
+    table->next = ffi_trampoline_tables;
+    if (ffi_trampoline_tables != NULL)
+      ffi_trampoline_tables->prev = table;
+
+    ffi_trampoline_tables = table;
+  }
+
+  pthread_mutex_unlock (&ffi_trampoline_lock);
+
+  /* Free the closure */
+  free (closure);
+}
+
+#else
+
+#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX)				\
+({ unsigned char *__tramp = (unsigned char*)(TRAMP);			\
+   unsigned int  __fun = (unsigned int)(FUN);				\
+   unsigned int  __ctx = (unsigned int)(CTX);				\
+   unsigned char *insns = (unsigned char *)(CTX);                       \
+   *(unsigned int*) &__tramp[0] = 0xe92d000f; /* stmfd sp!, {r0-r3} */	\
+   *(unsigned int*) &__tramp[4] = 0xe59f0000; /* ldr r0, [pc] */	\
+   *(unsigned int*) &__tramp[8] = 0xe59ff000; /* ldr pc, [pc] */	\
+   *(unsigned int*) &__tramp[12] = __ctx;				\
+   *(unsigned int*) &__tramp[16] = __fun;				\
+   __clear_cache((&__tramp[0]), (&__tramp[19])); /* Clear data mapping.  */ \
+   __clear_cache(insns, insns + 3 * sizeof (unsigned int));             \
+                                                 /* Clear instruction   \
+                                                    mapping.  */        \
+ })
+
+#endif
+
+/* the cif must already be prep'ed */
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*,void*,void**,void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  void (*closure_func)(ffi_closure*) = NULL;
+
+  if (cif->abi == FFI_SYSV)
+    closure_func = &ffi_closure_SYSV;
+  else if (cif->abi == FFI_VFP)
+    closure_func = &ffi_closure_VFP;
+  else
+    return FFI_BAD_ABI;
+    
+#if FFI_EXEC_TRAMPOLINE_TABLE
+  void **config = FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc);
+  config[0] = closure;
+  config[1] = closure_func;
+#else
+  FFI_INIT_TRAMPOLINE (&closure->tramp[0], \
+		       closure_func,  \
+		       codeloc);
+#endif
+
+  closure->cif  = cif;
+  closure->user_data = user_data;
+  closure->fun  = fun;
+
+  return FFI_OK;
+}
+
+/* Below are routines for VFP hard-float support. */
+
+static int rec_vfp_type_p (ffi_type *t, int *elt, int *elnum)
+{
+  switch (t->type)
+    {
+    case FFI_TYPE_FLOAT:
+    case FFI_TYPE_DOUBLE:
+      *elt = (int) t->type;
+      *elnum = 1;
+      return 1;
+
+    case FFI_TYPE_STRUCT_VFP_FLOAT:
+      *elt = FFI_TYPE_FLOAT;
+      *elnum = t->size / sizeof (float);
+      return 1;
+
+    case FFI_TYPE_STRUCT_VFP_DOUBLE:
+      *elt = FFI_TYPE_DOUBLE;
+      *elnum = t->size / sizeof (double);
+      return 1;
+
+    case FFI_TYPE_STRUCT:;
+      {
+	int base_elt = 0, total_elnum = 0;
+	ffi_type **el = t->elements;
+	while (*el)
+	  {
+	    int el_elt = 0, el_elnum = 0;
+	    if (! rec_vfp_type_p (*el, &el_elt, &el_elnum)
+		|| (base_elt && base_elt != el_elt)
+		|| total_elnum + el_elnum > 4)
+	      return 0;
+	    base_elt = el_elt;
+	    total_elnum += el_elnum;
+	    el++;
+	  }
+	*elnum = total_elnum;
+	*elt = base_elt;
+	return 1;
+      }
+    default: ;
+    }
+  return 0;
+}
+
+static int vfp_type_p (ffi_type *t)
+{
+  int elt, elnum;
+  if (rec_vfp_type_p (t, &elt, &elnum))
+    {
+      if (t->type == FFI_TYPE_STRUCT)
+	{
+	  if (elnum == 1)
+	    t->type = elt;
+	  else
+	    t->type = (elt == FFI_TYPE_FLOAT
+		       ? FFI_TYPE_STRUCT_VFP_FLOAT
+		       : FFI_TYPE_STRUCT_VFP_DOUBLE);
+	}
+      return (int) t->type;
+    }
+  return 0;
+}
+
+static void place_vfp_arg (ffi_cif *cif, ffi_type *t)
+{
+  int reg = cif->vfp_reg_free;
+  int nregs = t->size / sizeof (float);
+  int align = ((t->type == FFI_TYPE_STRUCT_VFP_FLOAT
+		|| t->type == FFI_TYPE_FLOAT) ? 1 : 2);
+  /* Align register number. */
+  if ((reg & 1) && align == 2)
+    reg++;
+  while (reg + nregs <= 16)
+    {
+      int s, new_used = 0;
+      for (s = reg; s < reg + nregs; s++)
+	{
+	  new_used |= (1 << s);
+	  if (cif->vfp_used & (1 << s))
+	    {
+	      reg += align;
+	      goto next_reg;
+	    }
+	}
+      /* Found regs to allocate. */
+      cif->vfp_used |= new_used;
+      cif->vfp_args[cif->vfp_nargs++] = reg;
+
+      /* Update vfp_reg_free. */
+      if (cif->vfp_used & (1 << cif->vfp_reg_free))
+	{
+	  reg += nregs;
+	  while (cif->vfp_used & (1 << reg))
+	    reg += 1;
+	  cif->vfp_reg_free = reg;
+	}
+      return;
+    next_reg: ;
+    }
+}
+
+static void layout_vfp_args (ffi_cif *cif)
+{
+  int i;
+  /* Init VFP fields */
+  cif->vfp_used = 0;
+  cif->vfp_nargs = 0;
+  cif->vfp_reg_free = 0;
+  memset (cif->vfp_args, -1, 16); /* Init to -1. */
+
+  for (i = 0; i < cif->nargs; i++)
+    {
+      ffi_type *t = cif->arg_types[i];
+      if (vfp_type_p (t))
+	place_vfp_arg (cif, t);
+    }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffitarget.h
new file mode 100644
index 0000000..ce25b23
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/ffitarget.h
@@ -0,0 +1,65 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+                 Copyright (c) 2010 CodeSourcery
+
+   Target configuration macros for ARM.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_SYSV,
+  FFI_VFP,
+  FFI_LAST_ABI,
+#ifdef __ARM_PCS_VFP
+  FFI_DEFAULT_ABI = FFI_VFP,
+#else
+  FFI_DEFAULT_ABI = FFI_SYSV,
+#endif
+} ffi_abi;
+#endif
+
+#define FFI_EXTRA_CIF_FIELDS			\
+  int vfp_used;					\
+  short vfp_reg_free, vfp_nargs;		\
+  signed char vfp_args[16]			\
+
+/* Internally used. */
+#define FFI_TYPE_STRUCT_VFP_FLOAT  (FFI_TYPE_LAST + 1)
+#define FFI_TYPE_STRUCT_VFP_DOUBLE (FFI_TYPE_LAST + 2)
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 20
+#define FFI_NATIVE_RAW_API 0
+
+#endif
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/gentramp.sh b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/gentramp.sh
new file mode 100755
index 0000000..74f0b86
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/gentramp.sh
@@ -0,0 +1,118 @@
+#!/bin/sh
+
+# -----------------------------------------------------------------------
+#  gentramp.sh - Copyright (c) 2010, Plausible Labs Cooperative, Inc.
+#  
+#  ARM Trampoline Page Generator
+#
+#  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.
+#  -----------------------------------------------------------------------
+
+PROGNAME=$0
+
+# Each trampoline is exactly 3 instructions, or 12 bytes. If any of these values change,
+# the entire arm trampoline implementation must be updated to match, too.
+
+# Size of an individual trampoline, in bytes
+TRAMPOLINE_SIZE=12
+
+# Page size, in bytes
+PAGE_SIZE=4096
+
+# Compute the size of the reachable config page; The first 16 bytes of the config page
+# are unreachable due to our maximum pc-relative ldr offset.
+PAGE_AVAIL=`expr $PAGE_SIZE - 16`
+
+# Compute the number of of available trampolines. 
+TRAMPOLINE_COUNT=`expr $PAGE_AVAIL / $TRAMPOLINE_SIZE`
+
+header () {
+    echo "# GENERATED CODE - DO NOT EDIT"
+    echo "# This file was generated by $PROGNAME"
+    echo ""
+
+    # Write out the license header
+cat << EOF
+#  Copyright (c) 2010, Plausible Labs Cooperative, Inc.
+#  
+#  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.
+#  -----------------------------------------------------------------------
+
+EOF
+
+    # Write out the trampoline table, aligned to the page boundary
+    echo ".text"
+    echo ".align 12"
+    echo ".globl _ffi_closure_trampoline_table_page"
+    echo "_ffi_closure_trampoline_table_page:"
+}
+
+
+# WARNING - Don't modify the trampoline code size without also updating the relevent libffi code
+trampoline () {
+    cat << END
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+END
+}
+
+main () {
+    # Write out the header
+    header
+
+    # Write out the trampolines
+    local i=0
+    while [ $i -lt ${TRAMPOLINE_COUNT} ]; do
+        trampoline
+        local i=`expr $i + 1`
+    done
+}
+
+main
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/sysv.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/sysv.S
new file mode 100644
index 0000000..14a7f03
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/sysv.S
@@ -0,0 +1,497 @@
+/* -----------------------------------------------------------------------
+   sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc.
+	    Copyright (c) 2011 Plausible Labs Cooperative, Inc.
+   
+   ARM Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+#ifdef HAVE_MACHINE_ASM_H
+#include <machine/asm.h>
+#else
+#ifdef __USER_LABEL_PREFIX__
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels.  */
+#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+#else
+#define CNAME(x) x
+#endif
+#ifdef __APPLE__
+#define ENTRY(x) .globl CNAME(x); CNAME(x):
+#else
+#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
+#endif /* __APPLE__ */
+#endif
+
+#ifdef __ELF__
+#define LSYM(x) .x
+#else
+#define LSYM(x) x
+#endif
+
+/* Use the SOFTFP return value ABI on Mac OS X, as per the iOS ABI
+  Function Call Guide */
+#ifdef __APPLE__
+#define __SOFTFP__
+#endif
+
+/* We need a better way of testing for this, but for now, this is all 
+   we can do.  */
+@ This selects the minimum architecture level required.
+#define __ARM_ARCH__ 3
+
+#if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
+# undef __ARM_ARCH__
+# define __ARM_ARCH__ 4
+#endif
+        
+#if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \
+	|| defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \
+	|| defined(__ARM_ARCH_5TEJ__)
+# undef __ARM_ARCH__
+# define __ARM_ARCH__ 5
+#endif
+
+#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
+        || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
+        || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \
+	|| defined(__ARM_ARCH_6M__)
+# undef __ARM_ARCH__
+# define __ARM_ARCH__ 6
+#endif
+
+#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
+        || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
+	|| defined(__ARM_ARCH_7EM__)
+# undef __ARM_ARCH__
+# define __ARM_ARCH__ 7
+#endif
+
+#if __ARM_ARCH__ >= 5
+# define call_reg(x)	blx	x
+#elif defined (__ARM_ARCH_4T__)
+# define call_reg(x)	mov	lr, pc ; bx	x
+# if defined(__thumb__) || defined(__THUMB_INTERWORK__)
+#  define __INTERWORKING__
+# endif
+#else
+# define call_reg(x)	mov	lr, pc ; mov	pc, x
+#endif
+
+/* Conditionally compile unwinder directives.  */
+#ifdef __ARM_EABI__
+#define UNWIND
+#else
+#define UNWIND @
+#endif	
+
+	
+#if defined(__thumb__) && !defined(__THUMB_INTERWORK__)
+.macro	ARM_FUNC_START name
+	.text
+	.align 0
+	.thumb
+	.thumb_func
+#ifdef __APPLE__
+	ENTRY($0)
+#else
+	ENTRY(\name)
+#endif
+	bx	pc
+	nop
+	.arm
+	UNWIND .fnstart
+/* A hook to tell gdb that we've switched to ARM mode.  Also used to call
+   directly from other local arm routines.  */
+#ifdef __APPLE__
+_L__$0:
+#else
+_L__\name:
+#endif
+.endm
+#else
+.macro	ARM_FUNC_START name
+	.text
+	.align 0
+	.arm
+#ifdef __APPLE__
+	ENTRY($0)
+#else
+	ENTRY(\name)
+#endif
+	UNWIND .fnstart
+.endm
+#endif
+
+.macro	RETLDM	regs=, cond=, dirn=ia
+#if defined (__INTERWORKING__)
+	.ifc "\regs",""
+	ldr\cond	lr, [sp], #4
+	.else
+	ldm\cond\dirn	sp!, {\regs, lr}
+	.endif
+	bx\cond	lr
+#else
+	.ifc "\regs",""
+	ldr\cond	pc, [sp], #4
+	.else
+	ldm\cond\dirn	sp!, {\regs, pc}
+	.endif
+#endif
+.endm
+
+	@ r0:   ffi_prep_args
+	@ r1:   &ecif
+	@ r2:   cif->bytes
+	@ r3:   fig->flags
+	@ sp+0: ecif.rvalue
+
+	@ This assumes we are using gas.
+ARM_FUNC_START ffi_call_SYSV
+	@ Save registers
+        stmfd	sp!, {r0-r3, fp, lr}
+	UNWIND .save	{r0-r3, fp, lr}
+	mov	fp, sp
+
+	UNWIND .setfp	fp, sp
+
+	@ Make room for all of the new args.
+	sub	sp, fp, r2
+
+	@ Place all of the ffi_prep_args in position
+	mov	r0, sp
+	@     r1 already set
+
+	@ Call ffi_prep_args(stack, &ecif)
+	bl	ffi_prep_args
+
+	@ move first 4 parameters in registers
+	ldmia	sp, {r0-r3}
+
+	@ and adjust stack
+	sub	lr, fp, sp	@ cif->bytes == fp - sp
+	ldr	ip, [fp]	@ load fn() in advance
+	cmp	lr, #16
+	movhs	lr, #16
+	add	sp, sp, lr
+
+	@ call (fn) (...)
+	call_reg(ip)
+	
+	@ Remove the space we pushed for the args
+	mov	sp, fp
+
+	@ Load r2 with the pointer to storage for the return value
+	ldr	r2, [sp, #24]
+
+	@ Load r3 with the return type code 
+	ldr	r3, [sp, #12]
+
+	@ If the return value pointer is NULL, assume no return value.
+	cmp	r2, #0
+	beq	LSYM(Lepilogue)
+
+@ return INT
+	cmp	r3, #FFI_TYPE_INT
+#if defined(__SOFTFP__) || defined(__ARM_EABI__)
+	cmpne	r3, #FFI_TYPE_FLOAT
+#endif
+	streq	r0, [r2]
+	beq	LSYM(Lepilogue)
+
+	@ return INT64
+	cmp	r3, #FFI_TYPE_SINT64
+#if defined(__SOFTFP__) || defined(__ARM_EABI__)
+	cmpne	r3, #FFI_TYPE_DOUBLE
+#endif
+	stmeqia	r2, {r0, r1}
+
+#if !defined(__SOFTFP__) && !defined(__ARM_EABI__)
+	beq	LSYM(Lepilogue)
+
+@ return FLOAT
+	cmp	r3, #FFI_TYPE_FLOAT
+	stfeqs	f0, [r2]
+	beq	LSYM(Lepilogue)
+
+@ return DOUBLE or LONGDOUBLE
+	cmp	r3, #FFI_TYPE_DOUBLE
+	stfeqd	f0, [r2]
+#endif
+
+LSYM(Lepilogue):
+#if defined (__INTERWORKING__)
+	ldmia   sp!, {r0-r3,fp, lr}
+	bx	lr
+#else
+	ldmia   sp!, {r0-r3,fp, pc}
+#endif
+
+.ffi_call_SYSV_end:
+	UNWIND .fnend
+#ifdef __ELF__
+        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
+#endif
+
+
+/*
+	unsigned int FFI_HIDDEN
+	ffi_closure_SYSV_inner (closure, respp, args)
+	     ffi_closure *closure;
+	     void **respp;
+  	     void *args;
+*/
+
+ARM_FUNC_START ffi_closure_SYSV
+	UNWIND .pad #16
+	add	ip, sp, #16
+	stmfd	sp!, {ip, lr}
+	UNWIND .save	{r0, lr}
+	add	r2, sp, #8
+	UNWIND .pad #16
+	sub	sp, sp, #16
+	str	sp, [sp, #8]
+	add	r1, sp, #8
+	bl	CNAME(ffi_closure_SYSV_inner)
+	cmp	r0, #FFI_TYPE_INT
+	beq	.Lretint
+
+	cmp	r0, #FFI_TYPE_FLOAT
+#if defined(__SOFTFP__) || defined(__ARM_EABI__)
+	beq	.Lretint
+#else
+	beq	.Lretfloat
+#endif
+
+	cmp	r0, #FFI_TYPE_DOUBLE
+#if defined(__SOFTFP__) || defined(__ARM_EABI__)
+	beq	.Lretlonglong
+#else
+	beq	.Lretdouble
+#endif
+
+	cmp	r0, #FFI_TYPE_LONGDOUBLE
+#if defined(__SOFTFP__) || defined(__ARM_EABI__)
+	beq	.Lretlonglong
+#else
+	beq	.Lretlongdouble
+#endif
+
+	cmp	r0, #FFI_TYPE_SINT64
+	beq	.Lretlonglong
+.Lclosure_epilogue:
+	add	sp, sp, #16
+	ldmfd	sp, {sp, pc}
+.Lretint:
+	ldr	r0, [sp]
+	b	.Lclosure_epilogue
+.Lretlonglong:
+	ldr	r0, [sp]
+	ldr	r1, [sp, #4]
+	b	.Lclosure_epilogue
+
+#if !defined(__SOFTFP__) && !defined(__ARM_EABI__)
+.Lretfloat:
+	ldfs	f0, [sp]
+	b	.Lclosure_epilogue
+.Lretdouble:
+	ldfd	f0, [sp]
+	b	.Lclosure_epilogue
+.Lretlongdouble:
+	ldfd	f0, [sp]
+	b	.Lclosure_epilogue
+#endif
+
+.ffi_closure_SYSV_end:
+	UNWIND .fnend
+#ifdef __ELF__
+        .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
+#endif
+
+
+/* Below are VFP hard-float ABI call and closure implementations.
+   Add VFP FPU directive here. */
+	.fpu	vfp
+
+	@ r0:   fn
+	@ r1:   &ecif
+	@ r2:   cif->bytes
+	@ r3:   fig->flags
+	@ sp+0: ecif.rvalue
+
+ARM_FUNC_START ffi_call_VFP
+	@ Save registers
+        stmfd	sp!, {r0-r3, fp, lr}
+	UNWIND .save	{r0-r3, fp, lr}
+	mov	fp, sp
+	UNWIND .setfp	fp, sp
+
+	@ Make room for all of the new args.
+	sub	sp, sp, r2
+
+	@ Make room for loading VFP args
+	sub	sp, sp, #64
+
+	@ Place all of the ffi_prep_args in position
+	mov	r0, sp
+	@     r1 already set
+	sub	r2, fp, #64   @ VFP scratch space
+
+	@ Call ffi_prep_args(stack, &ecif, vfp_space)
+	bl	ffi_prep_args
+
+	@ Load VFP register args if needed
+	cmp	r0, #0
+	beq	LSYM(Lbase_args)
+
+	@ Load only d0 if possible
+	cmp	r0, #3
+	sub	ip, fp, #64
+	flddle	d0, [ip]
+	fldmiadgt	ip, {d0-d7}
+
+LSYM(Lbase_args):
+	@ move first 4 parameters in registers
+	ldmia	sp, {r0-r3}
+
+	@ and adjust stack
+	sub	lr, ip, sp	@ cif->bytes == (fp - 64) - sp
+	ldr	ip, [fp]	@ load fn() in advance
+        cmp	lr, #16
+	movhs	lr, #16
+        add	sp, sp, lr
+
+	@ call (fn) (...)
+	call_reg(ip)
+
+	@ Remove the space we pushed for the args
+	mov	sp, fp
+
+	@ Load r2 with the pointer to storage for
+	@ the return value
+	ldr	r2, [sp, #24]
+
+	@ Load r3 with the return type code 
+	ldr	r3, [sp, #12]
+
+	@ If the return value pointer is NULL,
+	@ assume no return value.
+	cmp	r2, #0
+	beq	LSYM(Lepilogue_vfp)
+
+	cmp	r3, #FFI_TYPE_INT
+	streq	r0, [r2]
+	beq	LSYM(Lepilogue_vfp)
+
+	cmp	r3, #FFI_TYPE_SINT64
+	stmeqia	r2, {r0, r1}
+	beq	LSYM(Lepilogue_vfp)
+
+	cmp	r3, #FFI_TYPE_FLOAT
+	fstseq	s0, [r2]
+	beq	LSYM(Lepilogue_vfp)
+	
+	cmp	r3, #FFI_TYPE_DOUBLE
+	fstdeq	d0, [r2]
+	beq	LSYM(Lepilogue_vfp)
+
+	cmp	r3, #FFI_TYPE_STRUCT_VFP_FLOAT
+	cmpne	r3, #FFI_TYPE_STRUCT_VFP_DOUBLE
+	fstmiadeq	r2, {d0-d3}
+
+LSYM(Lepilogue_vfp):
+	RETLDM	"r0-r3,fp"
+
+.ffi_call_VFP_end:
+	UNWIND .fnend
+        .size    CNAME(ffi_call_VFP),.ffi_call_VFP_end-CNAME(ffi_call_VFP)
+
+
+ARM_FUNC_START ffi_closure_VFP
+	fstmfdd	sp!, {d0-d7}
+	@ r0-r3, then d0-d7
+	UNWIND .pad #80
+	add	ip, sp, #80
+	stmfd	sp!, {ip, lr}
+	UNWIND .save	{r0, lr}
+	add	r2, sp, #72
+	add	r3, sp, #8
+	UNWIND .pad #72
+	sub	sp, sp, #72
+	str	sp, [sp, #64]
+	add	r1, sp, #64
+	bl	ffi_closure_SYSV_inner
+
+	cmp	r0, #FFI_TYPE_INT
+	beq	.Lretint_vfp
+
+	cmp	r0, #FFI_TYPE_FLOAT
+	beq	.Lretfloat_vfp
+
+	cmp	r0, #FFI_TYPE_DOUBLE
+	cmpne	r0, #FFI_TYPE_LONGDOUBLE
+	beq	.Lretdouble_vfp
+
+	cmp	r0, #FFI_TYPE_SINT64
+	beq	.Lretlonglong_vfp
+
+	cmp	r0, #FFI_TYPE_STRUCT_VFP_FLOAT
+	beq	.Lretfloat_struct_vfp
+
+	cmp	r0, #FFI_TYPE_STRUCT_VFP_DOUBLE
+	beq	.Lretdouble_struct_vfp
+	
+.Lclosure_epilogue_vfp:
+	add	sp, sp, #72
+	ldmfd	sp, {sp, pc}
+
+.Lretfloat_vfp:
+	flds	s0, [sp]
+	b	.Lclosure_epilogue_vfp
+.Lretdouble_vfp:
+	fldd	d0, [sp]
+	b	.Lclosure_epilogue_vfp
+.Lretint_vfp:
+	ldr	r0, [sp]
+	b	.Lclosure_epilogue_vfp
+.Lretlonglong_vfp:
+	ldmia	sp, {r0, r1}
+	b	.Lclosure_epilogue_vfp
+.Lretfloat_struct_vfp:
+	fldmiad	sp, {d0-d1}
+	b	.Lclosure_epilogue_vfp
+.Lretdouble_struct_vfp:
+	fldmiad	sp, {d0-d3}
+	b	.Lclosure_epilogue_vfp
+
+.ffi_closure_VFP_end:
+	UNWIND .fnend
+        .size    CNAME(ffi_closure_VFP),.ffi_closure_VFP_end-CNAME(ffi_closure_VFP)
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",%progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/trampoline.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/trampoline.S
new file mode 100644
index 0000000..7b47429
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/arm/trampoline.S
@@ -0,0 +1,4450 @@
+# GENERATED CODE - DO NOT EDIT
+# This file was generated by ./gentramp.sh
+
+#  Copyright (c) 2010, Plausible Labs Cooperative, Inc.
+#  
+#  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.
+#  -----------------------------------------------------------------------
+
+.text
+.align 12
+.globl _ffi_closure_trampoline_table_page
+_ffi_closure_trampoline_table_page:
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
+
+    // trampoline
+    // Save to stack
+    stmfd sp!, {r0-r3}
+
+    // Load the context argument from the config page.
+    // This places the first usable config value at _ffi_closure_trampoline_table-4080
+    // This accounts for the above 4-byte stmfd instruction, plus 8 bytes constant when loading from pc.
+    ldr r0, [pc, #-4092]
+
+    // Load the jump address from the config page.
+    ldr pc, [pc, #-4092]
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffi.c
new file mode 100644
index 0000000..3d43397
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffi.c
@@ -0,0 +1,423 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 2011  Anthony Green
+           Copyright (c) 2009  Bradley Smith <brad@brad-smith.co.uk>
+
+   AVR32 Foreign Function Interface
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <asm/unistd.h>
+
+/* #define DEBUG */
+
+extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
+    unsigned int, unsigned int, unsigned int*, unsigned int,
+    void (*fn)(void));
+extern void ffi_closure_SYSV (ffi_closure *);
+
+unsigned int pass_struct_on_stack(ffi_type *type)
+{
+    if(type->type != FFI_TYPE_STRUCT)
+        return 0;
+
+    if(type->alignment < type->size &&
+        !(type->size == 4 || type->size == 8) &&
+        !(type->size == 8 && type->alignment >= 4))
+        return 1;
+
+    if(type->size == 3 || type->size == 5 || type->size == 6 ||
+        type->size == 7)
+        return 1;
+
+    return 0;
+}
+
+/* ffi_prep_args is called by the assembly routine once stack space
+ * has been allocated for the function's arguments
+ *
+ * This is annoyingly complex since we need to keep track of used
+ * registers.
+ */
+
+void ffi_prep_args(char *stack, extended_cif *ecif)
+{
+    unsigned int i;
+    void **p_argv;
+    ffi_type **p_arg;
+    char *reg_base = stack;
+    char *stack_base = stack + 20;
+    unsigned int stack_offset = 0;
+    unsigned int reg_mask = 0;
+
+    p_argv = ecif->avalue;
+
+    /* If cif->flags is struct then we know it's not passed in registers */
+    if(ecif->cif->flags == FFI_TYPE_STRUCT)
+    {
+        *(void**)reg_base = ecif->rvalue;
+        reg_mask |= 1;
+    }
+
+    for(i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs;
+        i++, p_arg++)
+    {
+        size_t z = (*p_arg)->size;
+        int alignment = (*p_arg)->alignment;
+        int type = (*p_arg)->type;
+        char *addr = 0;
+
+        if(z % 4 != 0)
+            z += (4 - z % 4);
+
+        if(reg_mask != 0x1f)
+        {
+            if(pass_struct_on_stack(*p_arg))
+            {
+                addr = stack_base + stack_offset;
+                stack_offset += z;
+            }
+            else if(z == sizeof(int))
+            {
+                char index = 0;
+
+                while((reg_mask >> index) & 1)
+                    index++;
+
+                addr = reg_base + (index * 4);
+                reg_mask |= (1 << index);
+            }
+            else if(z == 2 * sizeof(int))
+            {
+                if(!((reg_mask >> 1) & 1))
+                {
+                    addr = reg_base + 4;
+                    reg_mask |= (3 << 1);
+                }
+                else if(!((reg_mask >> 3) & 1))
+                {
+                    addr = reg_base + 12;
+                    reg_mask |= (3 << 3);
+                }
+            }
+        }
+
+        if(!addr)
+        {
+            addr = stack_base + stack_offset;
+            stack_offset += z;
+        }
+
+        if(type == FFI_TYPE_STRUCT && (*p_arg)->elements[1] == NULL)
+            type = (*p_arg)->elements[0]->type;
+
+        switch(type)
+        {
+        case FFI_TYPE_UINT8:
+            *(unsigned int *)addr = (unsigned int)*(UINT8 *)(*p_argv);
+            break;
+        case FFI_TYPE_SINT8:
+            *(signed int *)addr = (signed int)*(SINT8 *)(*p_argv);
+            break;
+        case FFI_TYPE_UINT16:
+            *(unsigned int *)addr = (unsigned int)*(UINT16 *)(*p_argv);
+            break;
+        case FFI_TYPE_SINT16:
+            *(signed int *)addr = (signed int)*(SINT16 *)(*p_argv);
+            break;
+        default:
+            memcpy(addr, *p_argv, z);
+        }
+
+        p_argv++;
+    }
+
+#ifdef DEBUG
+    /* Debugging */
+    for(i = 0; i < 5; i++)
+    {
+        if((reg_mask & (1 << i)) == 0)
+            printf("r%d: (unused)\n", 12 - i);
+        else
+            printf("r%d: 0x%08x\n", 12 - i, ((unsigned int*)reg_base)[i]);
+    }
+
+    for(i = 0; i < stack_offset / 4; i++)
+    {
+        printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack_base)[i]);
+    }
+#endif
+}
+
+/* Perform machine dependent cif processing */
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+{
+    /* Round the stack up to a multiple of 8 bytes.  This isn't needed
+     * everywhere, but it is on some platforms, and it doesn't harm
+     * anything when it isn't needed. */
+    cif->bytes = (cif->bytes + 7) & ~7;
+
+    /* Flag to indicate that he return value is in fact a struct */
+    cif->rstruct_flag = 0;
+
+    /* Set the return type flag */
+    switch(cif->rtype->type)
+    {
+    case FFI_TYPE_SINT8:
+    case FFI_TYPE_UINT8:
+        cif->flags = (unsigned)FFI_TYPE_UINT8;
+        break;
+    case FFI_TYPE_SINT16:
+    case FFI_TYPE_UINT16:
+        cif->flags = (unsigned)FFI_TYPE_UINT16;
+        break;
+    case FFI_TYPE_FLOAT:
+    case FFI_TYPE_SINT32:
+    case FFI_TYPE_UINT32:
+    case FFI_TYPE_POINTER:
+        cif->flags = (unsigned)FFI_TYPE_UINT32;
+        break;
+    case FFI_TYPE_DOUBLE:
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_UINT64:
+        cif->flags = (unsigned)FFI_TYPE_UINT64;
+        break;
+    case FFI_TYPE_STRUCT:
+        cif->rstruct_flag = 1;
+        if(!pass_struct_on_stack(cif->rtype))
+        {
+            if(cif->rtype->size <= 1)
+                cif->flags = (unsigned)FFI_TYPE_UINT8;
+            else if(cif->rtype->size <= 2)
+                cif->flags = (unsigned)FFI_TYPE_UINT16;
+            else if(cif->rtype->size <= 4)
+                cif->flags = (unsigned)FFI_TYPE_UINT32;
+            else if(cif->rtype->size <= 8)
+                cif->flags = (unsigned)FFI_TYPE_UINT64;
+            else
+                cif->flags = (unsigned)cif->rtype->type;
+        }
+        else
+            cif->flags = (unsigned)cif->rtype->type;
+        break;
+    default:
+        cif->flags = (unsigned)cif->rtype->type;
+        break;
+    }
+
+    return FFI_OK;
+}
+
+void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+    extended_cif ecif;
+
+    unsigned int size = 0, i = 0;
+    ffi_type **p_arg;
+
+    ecif.cif = cif;
+    ecif.avalue = avalue;
+
+    for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
+        size += (*p_arg)->size + (4 - (*p_arg)->size % 4);
+
+    /* If the return value is a struct and we don't have a return value
+     * address then we need to make one */
+
+    /* If cif->flags is struct then it's not suitable for registers */
+    if((rvalue == NULL) && (cif->flags == FFI_TYPE_STRUCT))
+        ecif.rvalue = alloca(cif->rtype->size);
+    else
+        ecif.rvalue = rvalue;
+
+    switch(cif->abi)
+    {
+    case FFI_SYSV:
+        ffi_call_SYSV(ffi_prep_args, &ecif, size, cif->flags,
+            ecif.rvalue, cif->rstruct_flag, fn);
+        break;
+    default:
+        FFI_ASSERT(0);
+        break;
+    }
+}
+
+static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
+    void **avalue, ffi_cif *cif)
+{
+    register unsigned int i, reg_mask = 0;
+    register void **p_argv;
+    register ffi_type **p_arg;
+    register char *reg_base = stack;
+    register char *stack_base = stack + 20;
+    register unsigned int stack_offset = 0;
+
+#ifdef DEBUG
+    /* Debugging */
+    for(i = 0; i < cif->nargs + 7; i++)
+    {
+        printf("sp+%d: 0x%08x\n", i*4, ((unsigned int*)stack)[i]);
+    }
+#endif
+
+    /* If cif->flags is struct then we know it's not passed in registers */
+    if(cif->flags == FFI_TYPE_STRUCT)
+    {
+        *rvalue = *(void **)reg_base;
+        reg_mask |= 1;
+    }
+
+    p_argv = avalue;
+
+    for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
+    {
+        size_t z = (*p_arg)->size;
+        int alignment = (*p_arg)->alignment;
+
+        *p_argv = 0;
+
+        if(z % 4 != 0)
+            z += (4 - z % 4);
+
+        if(reg_mask != 0x1f)
+        {
+            if(pass_struct_on_stack(*p_arg))
+            {
+                *p_argv = (void*)stack_base + stack_offset;
+                stack_offset += z;
+            }
+            else if(z <= sizeof(int))
+            {
+                char index = 0;
+
+                while((reg_mask >> index) & 1)
+                    index++;
+
+                *p_argv = (void*)reg_base + (index * 4);
+                reg_mask |= (1 << index);
+            }
+            else if(z == 2 * sizeof(int))
+            {
+                if(!((reg_mask >> 1) & 1))
+                {
+                    *p_argv = (void*)reg_base + 4;
+                    reg_mask |= (3 << 1);
+                }
+                else if(!((reg_mask >> 3) & 1))
+                {
+                    *p_argv = (void*)reg_base + 12;
+                    reg_mask |= (3 << 3);
+                }
+            }
+        }
+
+        if(!*p_argv)
+        {
+            *p_argv = (void*)stack_base + stack_offset;
+            stack_offset += z;
+        }
+
+        if((*p_arg)->type != FFI_TYPE_STRUCT ||
+            (*p_arg)->elements[1] == NULL)
+        {
+            if(alignment == 1)
+                **(unsigned int**)p_argv <<= 24;
+            else if(alignment == 2)
+                **(unsigned int**)p_argv <<= 16;
+        }
+
+        p_argv++;
+    }
+
+#ifdef DEBUG
+    /* Debugging */
+    for(i = 0; i < cif->nargs; i++)
+    {
+        printf("sp+%d: 0x%08x\n", i*4, *(((unsigned int**)avalue)[i]));
+    }
+#endif
+}
+
+/* This function is jumped to by the trampoline */
+
+unsigned int ffi_closure_SYSV_inner(ffi_closure *closure, void **respp,
+    void *args)
+{
+    ffi_cif *cif;
+    void **arg_area;
+    unsigned int i, size = 0;
+    ffi_type **p_arg;
+
+    cif = closure->cif;
+
+    for(i = 0, p_arg = cif->arg_types; i < cif->nargs; i++, p_arg++)
+        size += (*p_arg)->size + (4 - (*p_arg)->size % 4);
+
+    arg_area = (void **)alloca(size);
+
+    /* this call will initialize ARG_AREA, such that each element in that
+     * array points to the corresponding value on the stack; and if the
+     * function returns a structure, it will re-set RESP to point to the
+     * structure return address. */
+
+    ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif);
+
+    (closure->fun)(cif, *respp, arg_area, closure->user_data);
+
+    return cif->flags;
+}
+
+ffi_status ffi_prep_closure_loc(ffi_closure* closure, ffi_cif* cif,
+    void (*fun)(ffi_cif*, void*, void**, void*), void *user_data,
+    void *codeloc)
+{
+    if (cif->abi != FFI_SYSV)
+      return FFI_BAD_ABI;
+
+    unsigned char *__tramp = (unsigned char*)(&closure->tramp[0]);
+    unsigned int  __fun = (unsigned int)(&ffi_closure_SYSV);
+    unsigned int  __ctx = (unsigned int)(codeloc);
+    unsigned int  __rstruct_flag = (unsigned int)(cif->rstruct_flag);
+    unsigned int  __inner = (unsigned int)(&ffi_closure_SYSV_inner);
+    *(unsigned int*) &__tramp[0] = 0xebcd1f00;    /* pushm  r8-r12 */
+    *(unsigned int*) &__tramp[4] = 0xfefc0010;    /* ld.w   r12, pc[16] */
+    *(unsigned int*) &__tramp[8] = 0xfefb0010;    /* ld.w   r11, pc[16] */
+    *(unsigned int*) &__tramp[12] = 0xfefa0010;   /* ld.w   r10, pc[16] */
+    *(unsigned int*) &__tramp[16] = 0xfeff0010;   /* ld.w   pc, pc[16] */
+    *(unsigned int*) &__tramp[20] = __ctx;
+    *(unsigned int*) &__tramp[24] = __rstruct_flag;
+    *(unsigned int*) &__tramp[28] = __inner;
+    *(unsigned int*) &__tramp[32] = __fun;
+    syscall(__NR_cacheflush, 0, (&__tramp[0]), 36);
+
+    closure->cif = cif;
+    closure->user_data = user_data;
+    closure->fun  = fun;
+
+    return FFI_OK;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffitarget.h
new file mode 100644
index 0000000..b85d062
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/ffitarget.h
@@ -0,0 +1,50 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 2009  Bradley Smith <brad@brad-smith.co.uk>
+   Target configuration macros for AVR32.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_SYSV,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_SYSV
+} ffi_abi;
+#endif
+
+#define FFI_EXTRA_CIF_FIELDS unsigned int rstruct_flag
+
+/* Definitions for closures */
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 36
+#define FFI_NATIVE_RAW_API 0
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/sysv.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/sysv.S
new file mode 100644
index 0000000..a984b3c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/avr32/sysv.S
@@ -0,0 +1,208 @@
+/* -----------------------------------------------------------------------
+   sysv.S - Copyright (c) 2009  Bradley Smith <brad@brad-smith.co.uk>
+
+   AVR32 Foreign Function Interface
+
+   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.
+   --------------------------------------------------------------------- */
+
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+
+    /* r12:  ffi_prep_args
+     * r11:  &ecif
+     * r10:  size
+     * r9:   cif->flags
+     * r8:   ecif.rvalue
+     * sp+0: cif->rstruct_flag
+     * sp+4: fn */
+
+    .text
+    .align  1
+    .globl  ffi_call_SYSV
+    .type   ffi_call_SYSV, @function
+ffi_call_SYSV:
+    stm     --sp, r0,r1,lr
+    stm     --sp, r8-r12
+    mov     r0, sp
+
+    /* Make room for all of the new args. */
+    sub     sp, r10
+    /* Pad to make way for potential skipped registers */
+    sub     sp, 20
+
+    /* Call ffi_prep_args(stack, &ecif). */
+    /* r11 already set */
+    mov     r1, r12
+    mov     r12, sp
+    icall   r1
+
+    /* Save new argument size */
+    mov     r1, r12
+
+    /* Move first 5 parameters in registers. */
+    ldm     sp++, r8-r12
+
+    /* call (fn) (...). */
+    ld.w    r1, r0[36]
+    icall   r1
+
+    /* Remove the space we pushed for the args. */
+    mov     sp, r0
+
+    /* Load r1 with the rstruct flag. */
+    ld.w    r1, sp[32]
+
+    /* Load r9 with the return type code. */
+    ld.w    r9, sp[12]
+
+    /* Load r8 with the return value pointer. */
+    ld.w    r8, sp[16]
+
+    /* If the return value pointer is NULL, assume no return value. */
+    cp.w    r8, 0
+    breq    .Lend
+
+    /* Check if return type is actually a struct */
+    cp.w    r1, 0
+    breq    1f
+
+    /* Return 8bit */
+    cp.w    r9, FFI_TYPE_UINT8
+    breq    .Lstore8
+
+    /* Return 16bit */
+    cp.w    r9, FFI_TYPE_UINT16
+    breq    .Lstore16
+
+1:
+    /* Return 32bit */
+    cp.w    r9, FFI_TYPE_UINT32
+    breq    .Lstore32
+    cp.w    r9, FFI_TYPE_UINT16
+    breq    .Lstore32
+    cp.w    r9, FFI_TYPE_UINT8
+    breq    .Lstore32
+
+    /* Return 64bit */
+    cp.w    r9, FFI_TYPE_UINT64
+    breq    .Lstore64
+
+    /* Didn't match anything */
+    bral    .Lend
+
+.Lstore64:
+    st.w    r8[0], r11
+    st.w    r8[4], r10
+    bral    .Lend
+
+.Lstore32:
+    st.w    r8[0], r12
+    bral    .Lend
+
+.Lstore16:
+    st.h    r8[0], r12
+    bral    .Lend
+
+.Lstore8:
+    st.b    r8[0], r12
+    bral    .Lend
+
+.Lend:
+    sub     sp, -20
+    ldm     sp++, r0,r1,pc
+
+    .size   ffi_call_SYSV, . - ffi_call_SYSV
+
+
+    /* r12:  __ctx
+     * r11:  __rstruct_flag
+     * r10:  __inner */
+
+    .align  1
+    .globl  ffi_closure_SYSV
+    .type   ffi_closure_SYSV, @function
+ffi_closure_SYSV:
+    stm     --sp, r0,lr
+    mov     r0, r11
+    mov     r8, r10
+    sub     r10, sp, -8
+    sub     sp, 12
+    st.w    sp[8], sp
+    sub     r11, sp, -8
+    icall   r8
+
+    /* Check if return type is actually a struct */
+    cp.w    r0, 0
+    breq    1f
+
+    /* Return 8bit */
+    cp.w    r12, FFI_TYPE_UINT8
+    breq    .Lget8
+
+    /* Return 16bit */
+    cp.w    r12, FFI_TYPE_UINT16
+    breq    .Lget16
+
+1:
+    /* Return 32bit */
+    cp.w    r12, FFI_TYPE_UINT32
+    breq    .Lget32
+    cp.w    r12, FFI_TYPE_UINT16
+    breq    .Lget32
+    cp.w    r12, FFI_TYPE_UINT8
+    breq    .Lget32
+
+    /* Return 64bit */
+    cp.w    r12, FFI_TYPE_UINT64
+    breq    .Lget64
+
+    /* Didn't match anything */
+    bral    .Lclend
+
+.Lget64:
+    ld.w    r11, sp[0]
+    ld.w    r10, sp[4]
+    bral    .Lclend
+
+.Lget32:
+    ld.w    r12, sp[0]
+    bral    .Lclend
+
+.Lget16:
+    ld.uh   r12, sp[0]
+    bral    .Lclend
+
+.Lget8:
+    ld.ub   r12, sp[0]
+    bral    .Lclend
+
+.Lclend:
+    sub     sp, -12
+    ldm     sp++, r0,lr
+    sub     sp, -20
+    mov     pc, lr
+
+    .size   ffi_closure_SYSV, . - ffi_closure_SYSV
+
+#if defined __ELF__ && defined __linux__
+    .section    .note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/closures.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/closures.c
new file mode 100644
index 0000000..1b37827
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/closures.c
@@ -0,0 +1,615 @@
+/* -----------------------------------------------------------------------
+   closures.c - Copyright (c) 2007, 2009, 2010  Red Hat, Inc.
+                Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc
+                Copyright (c) 2011 Plausible Labs Cooperative, Inc.
+
+   Code to allocate and deallocate memory for closures.
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#if defined __linux__ && !defined _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
+# if __gnu_linux__
+/* This macro indicates it may be forbidden to map anonymous memory
+   with both write and execute permission.  Code compiled when this
+   option is defined will attempt to map such pages once, but if it
+   fails, it falls back to creating a temporary file in a writable and
+   executable filesystem and mapping pages from it into separate
+   locations in the virtual memory space, one location writable and
+   another executable.  */
+#  define FFI_MMAP_EXEC_WRIT 1
+#  define HAVE_MNTENT 1
+# endif
+# if defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)
+/* Windows systems may have Data Execution Protection (DEP) enabled, 
+   which requires the use of VirtualMalloc/VirtualFree to alloc/free
+   executable memory. */
+#  define FFI_MMAP_EXEC_WRIT 1
+# endif
+#endif
+
+#if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX
+# ifdef __linux__
+/* When defined to 1 check for SELinux and if SELinux is active,
+   don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that
+   might cause audit messages.  */
+#  define FFI_MMAP_EXEC_SELINUX 1
+# endif
+#endif
+
+#if FFI_CLOSURES
+
+# if FFI_EXEC_TRAMPOLINE_TABLE
+
+// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations.
+
+# elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
+
+#define USE_LOCKS 1
+#define USE_DL_PREFIX 1
+#ifdef __GNUC__
+#ifndef USE_BUILTIN_FFS
+#define USE_BUILTIN_FFS 1
+#endif
+#endif
+
+/* We need to use mmap, not sbrk.  */
+#define HAVE_MORECORE 0
+
+/* We could, in theory, support mremap, but it wouldn't buy us anything.  */
+#define HAVE_MREMAP 0
+
+/* We have no use for this, so save some code and data.  */
+#define NO_MALLINFO 1
+
+/* We need all allocations to be in regular segments, otherwise we
+   lose track of the corresponding code address.  */
+#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T
+
+/* Don't allocate more than a page unless needed.  */
+#define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize)
+
+#if FFI_CLOSURE_TEST
+/* Don't release single pages, to avoid a worst-case scenario of
+   continuously allocating and releasing single pages, but release
+   pairs of pages, which should do just as well given that allocations
+   are likely to be small.  */
+#define DEFAULT_TRIM_THRESHOLD ((size_t)malloc_getpagesize)
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#ifndef _MSC_VER
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <stdio.h>
+#if !defined(X86_WIN32) && !defined(X86_WIN64)
+#ifdef HAVE_MNTENT
+#include <mntent.h>
+#endif /* HAVE_MNTENT */
+#include <sys/param.h>
+#include <pthread.h>
+
+/* We don't want sys/mman.h to be included after we redefine mmap and
+   dlmunmap.  */
+#include <sys/mman.h>
+#define LACKS_SYS_MMAN_H 1
+
+#if FFI_MMAP_EXEC_SELINUX
+#include <sys/statfs.h>
+#include <stdlib.h>
+
+static int selinux_enabled = -1;
+
+static int
+selinux_enabled_check (void)
+{
+  struct statfs sfs;
+  FILE *f;
+  char *buf = NULL;
+  size_t len = 0;
+
+  if (statfs ("/selinux", &sfs) >= 0
+      && (unsigned int) sfs.f_type == 0xf97cff8cU)
+    return 1;
+  f = fopen ("/proc/mounts", "r");
+  if (f == NULL)
+    return 0;
+  while (getline (&buf, &len, f) >= 0)
+    {
+      char *p = strchr (buf, ' ');
+      if (p == NULL)
+        break;
+      p = strchr (p + 1, ' ');
+      if (p == NULL)
+        break;
+      if (strncmp (p + 1, "selinuxfs ", 10) == 0)
+        {
+          free (buf);
+          fclose (f);
+          return 1;
+        }
+    }
+  free (buf);
+  fclose (f);
+  return 0;
+}
+
+#define is_selinux_enabled() (selinux_enabled >= 0 ? selinux_enabled \
+			      : (selinux_enabled = selinux_enabled_check ()))
+
+#else
+
+#define is_selinux_enabled() 0
+
+#endif /* !FFI_MMAP_EXEC_SELINUX */
+
+#elif defined (__CYGWIN__) || defined(__INTERIX)
+
+#include <sys/mman.h>
+
+/* Cygwin is Linux-like, but not quite that Linux-like.  */
+#define is_selinux_enabled() 0
+
+#endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */
+
+/* Declare all functions defined in dlmalloc.c as static.  */
+static void *dlmalloc(size_t);
+static void dlfree(void*);
+static void *dlcalloc(size_t, size_t) MAYBE_UNUSED;
+static void *dlrealloc(void *, size_t) MAYBE_UNUSED;
+static void *dlmemalign(size_t, size_t) MAYBE_UNUSED;
+static void *dlvalloc(size_t) MAYBE_UNUSED;
+static int dlmallopt(int, int) MAYBE_UNUSED;
+static size_t dlmalloc_footprint(void) MAYBE_UNUSED;
+static size_t dlmalloc_max_footprint(void) MAYBE_UNUSED;
+static void** dlindependent_calloc(size_t, size_t, void**) MAYBE_UNUSED;
+static void** dlindependent_comalloc(size_t, size_t*, void**) MAYBE_UNUSED;
+static void *dlpvalloc(size_t) MAYBE_UNUSED;
+static int dlmalloc_trim(size_t) MAYBE_UNUSED;
+static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED;
+static void dlmalloc_stats(void) MAYBE_UNUSED;
+
+#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX)
+/* Use these for mmap and munmap within dlmalloc.c.  */
+static void *dlmmap(void *, size_t, int, int, int, off_t);
+static int dlmunmap(void *, size_t);
+#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */
+
+#define mmap dlmmap
+#define munmap dlmunmap
+
+#include "dlmalloc.c"
+
+#undef mmap
+#undef munmap
+
+#if !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX)
+
+/* A mutex used to synchronize access to *exec* variables in this file.  */
+static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* A file descriptor of a temporary file from which we'll map
+   executable pages.  */
+static int execfd = -1;
+
+/* The amount of space already allocated from the temporary file.  */
+static size_t execsize = 0;
+
+/* Open a temporary file name, and immediately unlink it.  */
+static int
+open_temp_exec_file_name (char *name)
+{
+  int fd = mkstemp (name);
+
+  if (fd != -1)
+    unlink (name);
+
+  return fd;
+}
+
+/* Open a temporary file in the named directory.  */
+static int
+open_temp_exec_file_dir (const char *dir)
+{
+  static const char suffix[] = "/ffiXXXXXX";
+  int lendir = strlen (dir);
+  char *tempname = __builtin_alloca (lendir + sizeof (suffix));
+
+  if (!tempname)
+    return -1;
+
+  memcpy (tempname, dir, lendir);
+  memcpy (tempname + lendir, suffix, sizeof (suffix));
+
+  return open_temp_exec_file_name (tempname);
+}
+
+/* Open a temporary file in the directory in the named environment
+   variable.  */
+static int
+open_temp_exec_file_env (const char *envvar)
+{
+  const char *value = getenv (envvar);
+
+  if (!value)
+    return -1;
+
+  return open_temp_exec_file_dir (value);
+}
+
+#ifdef HAVE_MNTENT
+/* Open a temporary file in an executable and writable mount point
+   listed in the mounts file.  Subsequent calls with the same mounts
+   keep searching for mount points in the same file.  Providing NULL
+   as the mounts file closes the file.  */
+static int
+open_temp_exec_file_mnt (const char *mounts)
+{
+  static const char *last_mounts;
+  static FILE *last_mntent;
+
+  if (mounts != last_mounts)
+    {
+      if (last_mntent)
+	endmntent (last_mntent);
+
+      last_mounts = mounts;
+
+      if (mounts)
+	last_mntent = setmntent (mounts, "r");
+      else
+	last_mntent = NULL;
+    }
+
+  if (!last_mntent)
+    return -1;
+
+  for (;;)
+    {
+      int fd;
+      struct mntent mnt;
+      char buf[MAXPATHLEN * 3];
+
+      if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)) == NULL)
+	return -1;
+
+      if (hasmntopt (&mnt, "ro")
+	  || hasmntopt (&mnt, "noexec")
+	  || access (mnt.mnt_dir, W_OK))
+	continue;
+
+      fd = open_temp_exec_file_dir (mnt.mnt_dir);
+
+      if (fd != -1)
+	return fd;
+    }
+}
+#endif /* HAVE_MNTENT */
+
+/* Instructions to look for a location to hold a temporary file that
+   can be mapped in for execution.  */
+static struct
+{
+  int (*func)(const char *);
+  const char *arg;
+  int repeat;
+} open_temp_exec_file_opts[] = {
+  { open_temp_exec_file_env, "TMPDIR", 0 },
+  { open_temp_exec_file_dir, "/tmp", 0 },
+  { open_temp_exec_file_dir, "/var/tmp", 0 },
+  { open_temp_exec_file_dir, "/dev/shm", 0 },
+  { open_temp_exec_file_env, "HOME", 0 },
+#ifdef HAVE_MNTENT
+  { open_temp_exec_file_mnt, "/etc/mtab", 1 },
+  { open_temp_exec_file_mnt, "/proc/mounts", 1 },
+#endif /* HAVE_MNTENT */
+};
+
+/* Current index into open_temp_exec_file_opts.  */
+static int open_temp_exec_file_opts_idx = 0;
+
+/* Reset a current multi-call func, then advances to the next entry.
+   If we're at the last, go back to the first and return nonzero,
+   otherwise return zero.  */
+static int
+open_temp_exec_file_opts_next (void)
+{
+  if (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat)
+    open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func (NULL);
+
+  open_temp_exec_file_opts_idx++;
+  if (open_temp_exec_file_opts_idx
+      == (sizeof (open_temp_exec_file_opts)
+	  / sizeof (*open_temp_exec_file_opts)))
+    {
+      open_temp_exec_file_opts_idx = 0;
+      return 1;
+    }
+
+  return 0;
+}
+
+/* Return a file descriptor of a temporary zero-sized file in a
+   writable and exexutable filesystem.  */
+static int
+open_temp_exec_file (void)
+{
+  int fd;
+
+  do
+    {
+      fd = open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func
+	(open_temp_exec_file_opts[open_temp_exec_file_opts_idx].arg);
+
+      if (!open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat
+	  || fd == -1)
+	{
+	  if (open_temp_exec_file_opts_next ())
+	    break;
+	}
+    }
+  while (fd == -1);
+
+  return fd;
+}
+
+/* Map in a chunk of memory from the temporary exec file into separate
+   locations in the virtual memory address space, one writable and one
+   executable.  Returns the address of the writable portion, after
+   storing an offset to the corresponding executable portion at the
+   last word of the requested chunk.  */
+static void *
+dlmmap_locked (void *start, size_t length, int prot, int flags, off_t offset)
+{
+  void *ptr;
+
+  if (execfd == -1)
+    {
+      open_temp_exec_file_opts_idx = 0;
+    retry_open:
+      execfd = open_temp_exec_file ();
+      if (execfd == -1)
+	return MFAIL;
+    }
+
+  offset = execsize;
+
+  if (ftruncate (execfd, offset + length))
+    return MFAIL;
+
+  flags &= ~(MAP_PRIVATE | MAP_ANONYMOUS);
+  flags |= MAP_SHARED;
+
+  ptr = mmap (NULL, length, (prot & ~PROT_WRITE) | PROT_EXEC,
+	      flags, execfd, offset);
+  if (ptr == MFAIL)
+    {
+      if (!offset)
+	{
+	  close (execfd);
+	  goto retry_open;
+	}
+      ftruncate (execfd, offset);
+      return MFAIL;
+    }
+  else if (!offset
+	   && open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat)
+    open_temp_exec_file_opts_next ();
+
+  start = mmap (start, length, prot, flags, execfd, offset);
+
+  if (start == MFAIL)
+    {
+      munmap (ptr, length);
+      ftruncate (execfd, offset);
+      return start;
+    }
+
+  mmap_exec_offset ((char *)start, length) = (char*)ptr - (char*)start;
+
+  execsize += length;
+
+  return start;
+}
+
+/* Map in a writable and executable chunk of memory if possible.
+   Failing that, fall back to dlmmap_locked.  */
+static void *
+dlmmap (void *start, size_t length, int prot,
+	int flags, int fd, off_t offset)
+{
+  void *ptr;
+
+  assert (start == NULL && length % malloc_getpagesize == 0
+	  && prot == (PROT_READ | PROT_WRITE)
+	  && flags == (MAP_PRIVATE | MAP_ANONYMOUS)
+	  && fd == -1 && offset == 0);
+
+#if FFI_CLOSURE_TEST
+  printf ("mapping in %zi\n", length);
+#endif
+
+  if (execfd == -1 && !is_selinux_enabled ())
+    {
+      ptr = mmap (start, length, prot | PROT_EXEC, flags, fd, offset);
+
+      if (ptr != MFAIL || (errno != EPERM && errno != EACCES))
+	/* Cool, no need to mess with separate segments.  */
+	return ptr;
+
+      /* If MREMAP_DUP is ever introduced and implemented, try mmap
+	 with ((prot & ~PROT_WRITE) | PROT_EXEC) and mremap with
+	 MREMAP_DUP and prot at this point.  */
+    }
+
+  if (execsize == 0 || execfd == -1)
+    {
+      pthread_mutex_lock (&open_temp_exec_file_mutex);
+      ptr = dlmmap_locked (start, length, prot, flags, offset);
+      pthread_mutex_unlock (&open_temp_exec_file_mutex);
+
+      return ptr;
+    }
+
+  return dlmmap_locked (start, length, prot, flags, offset);
+}
+
+/* Release memory at the given address, as well as the corresponding
+   executable page if it's separate.  */
+static int
+dlmunmap (void *start, size_t length)
+{
+  /* We don't bother decreasing execsize or truncating the file, since
+     we can't quite tell whether we're unmapping the end of the file.
+     We don't expect frequent deallocation anyway.  If we did, we
+     could locate pages in the file by writing to the pages being
+     deallocated and checking that the file contents change.
+     Yuck.  */
+  msegmentptr seg = segment_holding (gm, start);
+  void *code;
+
+#if FFI_CLOSURE_TEST
+  printf ("unmapping %zi\n", length);
+#endif
+
+  if (seg && (code = add_segment_exec_offset (start, seg)) != start)
+    {
+      int ret = munmap (code, length);
+      if (ret)
+	return ret;
+    }
+
+  return munmap (start, length);
+}
+
+#if FFI_CLOSURE_FREE_CODE
+/* Return segment holding given code address.  */
+static msegmentptr
+segment_holding_code (mstate m, char* addr)
+{
+  msegmentptr sp = &m->seg;
+  for (;;) {
+    if (addr >= add_segment_exec_offset (sp->base, sp)
+	&& addr < add_segment_exec_offset (sp->base, sp) + sp->size)
+      return sp;
+    if ((sp = sp->next) == 0)
+      return 0;
+  }
+}
+#endif
+
+#endif /* !(defined(X86_WIN32) || defined(X86_WIN64) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */
+
+/* Allocate a chunk of memory with the given size.  Returns a pointer
+   to the writable address, and sets *CODE to the executable
+   corresponding virtual address.  */
+void *
+ffi_closure_alloc (size_t size, void **code)
+{
+  void *ptr;
+
+  if (!code)
+    return NULL;
+
+  ptr = dlmalloc (size);
+
+  if (ptr)
+    {
+      msegmentptr seg = segment_holding (gm, ptr);
+
+      *code = add_segment_exec_offset (ptr, seg);
+    }
+
+  return ptr;
+}
+
+/* Release a chunk of memory allocated with ffi_closure_alloc.  If
+   FFI_CLOSURE_FREE_CODE is nonzero, the given address can be the
+   writable or the executable address given.  Otherwise, only the
+   writable address can be provided here.  */
+void
+ffi_closure_free (void *ptr)
+{
+#if FFI_CLOSURE_FREE_CODE
+  msegmentptr seg = segment_holding_code (gm, ptr);
+
+  if (seg)
+    ptr = sub_segment_exec_offset (ptr, seg);
+#endif
+
+  dlfree (ptr);
+}
+
+
+#if FFI_CLOSURE_TEST
+/* Do some internal sanity testing to make sure allocation and
+   deallocation of pages are working as intended.  */
+int main ()
+{
+  void *p[3];
+#define GET(idx, len) do { p[idx] = dlmalloc (len); printf ("allocated %zi for p[%i]\n", (len), (idx)); } while (0)
+#define PUT(idx) do { printf ("freeing p[%i]\n", (idx)); dlfree (p[idx]); } while (0)
+  GET (0, malloc_getpagesize / 2);
+  GET (1, 2 * malloc_getpagesize - 64 * sizeof (void*));
+  PUT (1);
+  GET (1, 2 * malloc_getpagesize);
+  GET (2, malloc_getpagesize / 2);
+  PUT (1);
+  PUT (0);
+  PUT (2);
+  return 0;
+}
+#endif /* FFI_CLOSURE_TEST */
+# else /* ! FFI_MMAP_EXEC_WRIT */
+
+/* On many systems, memory returned by malloc is writable and
+   executable, so just use it.  */
+
+#include <stdlib.h>
+
+void *
+ffi_closure_alloc (size_t size, void **code)
+{
+  if (!code)
+    return NULL;
+
+  return *code = malloc (size);
+}
+
+void
+ffi_closure_free (void *ptr)
+{
+  free (ptr);
+}
+
+# endif /* ! FFI_MMAP_EXEC_WRIT */
+#endif /* FFI_CLOSURES */
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffi.c
new file mode 100644
index 0000000..f25d7b4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffi.c
@@ -0,0 +1,383 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 1998 Cygnus Solutions
+           Copyright (c) 2004 Simon Posnjak
+	   Copyright (c) 2005 Axis Communications AB
+	   Copyright (C) 2007 Free Software Foundation, Inc.
+
+   CRIS Foreign Function Interface
+
+   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 SIMON POSNJAK 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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG)
+
+static ffi_status
+initialize_aggregate_packed_struct (ffi_type * arg)
+{
+  ffi_type **ptr;
+
+  FFI_ASSERT (arg != NULL);
+
+  FFI_ASSERT (arg->elements != NULL);
+  FFI_ASSERT (arg->size == 0);
+  FFI_ASSERT (arg->alignment == 0);
+
+  ptr = &(arg->elements[0]);
+
+  while ((*ptr) != NULL)
+    {
+      if (((*ptr)->size == 0)
+	  && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK))
+	return FFI_BAD_TYPEDEF;
+
+      FFI_ASSERT (ffi_type_test ((*ptr)));
+
+      arg->size += (*ptr)->size;
+
+      arg->alignment = (arg->alignment > (*ptr)->alignment) ?
+	arg->alignment : (*ptr)->alignment;
+
+      ptr++;
+    }
+
+  if (arg->size == 0)
+    return FFI_BAD_TYPEDEF;
+  else
+    return FFI_OK;
+}
+
+int
+ffi_prep_args (char *stack, extended_cif * ecif)
+{
+  unsigned int i;
+  unsigned int struct_count = 0;
+  void **p_argv;
+  char *argp;
+  ffi_type **p_arg;
+
+  argp = stack;
+
+  p_argv = ecif->avalue;
+
+  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+       (i != 0); i--, p_arg++)
+    {
+      size_t z;
+
+      switch ((*p_arg)->type)
+	{
+	case FFI_TYPE_STRUCT:
+	  {
+	    z = (*p_arg)->size;
+	    if (z <= 4)
+	      {
+		memcpy (argp, *p_argv, z);
+		z = 4;
+	      }
+	    else if (z <= 8)
+	      {
+		memcpy (argp, *p_argv, z);
+		z = 8;
+	      }
+	    else
+	      {
+		unsigned int uiLocOnStack;
+		z = sizeof (void *);
+		uiLocOnStack = 4 * ecif->cif->nargs + struct_count;
+		struct_count = struct_count + (*p_arg)->size;
+		*(unsigned int *) argp =
+		  (unsigned int) (UINT32 *) (stack + uiLocOnStack);
+		memcpy ((stack + uiLocOnStack), *p_argv, (*p_arg)->size);
+	      }
+	    break;
+	  }
+	default:
+	  z = (*p_arg)->size;
+	  if (z < sizeof (int))
+	    {
+	      switch ((*p_arg)->type)
+		{
+		case FFI_TYPE_SINT8:
+		  *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv);
+		  break;
+
+		case FFI_TYPE_UINT8:
+		  *(unsigned int *) argp =
+		    (unsigned int) *(UINT8 *) (*p_argv);
+		  break;
+
+		case FFI_TYPE_SINT16:
+		  *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv);
+		  break;
+
+		case FFI_TYPE_UINT16:
+		  *(unsigned int *) argp =
+		    (unsigned int) *(UINT16 *) (*p_argv);
+		  break;
+
+		default:
+		  FFI_ASSERT (0);
+		}
+	      z = sizeof (int);
+	    }
+	  else if (z == sizeof (int))
+	    *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv);
+	  else
+	    memcpy (argp, *p_argv, z);
+	  break;
+	}
+      p_argv++;
+      argp += z;
+    }
+
+  return (struct_count);
+}
+
+ffi_status
+ffi_prep_cif (ffi_cif * cif,
+	      ffi_abi abi, unsigned int nargs,
+	      ffi_type * rtype, ffi_type ** atypes)
+{
+  unsigned bytes = 0;
+  unsigned int i;
+  ffi_type **ptr;
+
+  FFI_ASSERT (cif != NULL);
+  FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI);
+
+  cif->abi = abi;
+  cif->arg_types = atypes;
+  cif->nargs = nargs;
+  cif->rtype = rtype;
+
+  cif->flags = 0;
+
+  if ((cif->rtype->size == 0)
+      && (initialize_aggregate_packed_struct (cif->rtype) != FFI_OK))
+    return FFI_BAD_TYPEDEF;
+
+  FFI_ASSERT_VALID_TYPE (cif->rtype);
+
+  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
+    {
+      if (((*ptr)->size == 0)
+	  && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK))
+	return FFI_BAD_TYPEDEF;
+
+      FFI_ASSERT_VALID_TYPE (*ptr);
+
+      if (((*ptr)->alignment - 1) & bytes)
+	bytes = ALIGN (bytes, (*ptr)->alignment);
+      if ((*ptr)->type == FFI_TYPE_STRUCT)
+	{
+	  if ((*ptr)->size > 8)
+	    {
+	      bytes += (*ptr)->size;
+	      bytes += sizeof (void *);
+	    }
+	  else
+	    {
+	      if ((*ptr)->size > 4)
+		bytes += 8;
+	      else
+		bytes += 4;
+	    }
+	}
+      else
+	bytes += STACK_ARG_SIZE ((*ptr)->size);
+    }
+
+  cif->bytes = bytes;
+
+  return ffi_prep_cif_machdep (cif);
+}
+
+ffi_status
+ffi_prep_cif_machdep (ffi_cif * cif)
+{
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_VOID:
+    case FFI_TYPE_STRUCT:
+    case FFI_TYPE_FLOAT:
+    case FFI_TYPE_DOUBLE:
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_UINT64:
+      cif->flags = (unsigned) cif->rtype->type;
+      break;
+
+    default:
+      cif->flags = FFI_TYPE_INT;
+      break;
+    }
+
+  return FFI_OK;
+}
+
+extern void ffi_call_SYSV (int (*)(char *, extended_cif *),
+			   extended_cif *,
+			   unsigned, unsigned, unsigned *, void (*fn) ())
+     __attribute__ ((__visibility__ ("hidden")));
+
+void
+ffi_call (ffi_cif * cif, void (*fn) (), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+
+  if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
+    {
+      ecif.rvalue = alloca (cif->rtype->size);
+    }
+  else
+    ecif.rvalue = rvalue;
+
+  switch (cif->abi)
+    {
+    case FFI_SYSV:
+      ffi_call_SYSV (ffi_prep_args, &ecif, cif->bytes,
+		     cif->flags, ecif.rvalue, fn);
+      break;
+    default:
+      FFI_ASSERT (0);
+      break;
+    }
+}
+
+/* Because the following variables are not exported outside libffi, we
+   mark them hidden.  */
+
+/* Assembly code for the jump stub.  */
+extern const char ffi_cris_trampoline_template[]
+ __attribute__ ((__visibility__ ("hidden")));
+
+/* Offset into ffi_cris_trampoline_template of where to put the
+   ffi_prep_closure_inner function.  */
+extern const int ffi_cris_trampoline_fn_offset
+ __attribute__ ((__visibility__ ("hidden")));
+
+/* Offset into ffi_cris_trampoline_template of where to put the
+   closure data.  */
+extern const int ffi_cris_trampoline_closure_offset
+ __attribute__ ((__visibility__ ("hidden")));
+
+/* This function is sibling-called (jumped to) by the closure
+   trampoline.  We get R10..R13 at PARAMS[0..3] and a copy of [SP] at
+   PARAMS[4] to simplify handling of a straddling parameter.  A copy
+   of R9 is at PARAMS[5] and SP at PARAMS[6].  These parameters are
+   put at the appropriate place in CLOSURE which is then executed and
+   the return value is passed back to the caller.  */
+
+static unsigned long long
+ffi_prep_closure_inner (void **params, ffi_closure* closure)
+{
+  char *register_args = (char *) params;
+  void *struct_ret = params[5];
+  char *stack_args = params[6];
+  char *ptr = register_args;
+  ffi_cif *cif = closure->cif;
+  ffi_type **arg_types = cif->arg_types;
+
+  /* Max room needed is number of arguments as 64-bit values.  */
+  void **avalue = alloca (closure->cif->nargs * sizeof(void *));
+  int i;
+  int doing_regs;
+  long long llret = 0;
+
+  /* Find the address of each argument.  */
+  for (i = 0, doing_regs = 1; i < cif->nargs; i++)
+    {
+      /* Types up to and including 8 bytes go by-value.  */
+      if (arg_types[i]->size <= 4)
+	{
+	  avalue[i] = ptr;
+	  ptr += 4;
+	}
+      else if (arg_types[i]->size <= 8)
+	{
+	  avalue[i] = ptr;
+	  ptr += 8;
+	}
+      else
+	{
+	  FFI_ASSERT (arg_types[i]->type == FFI_TYPE_STRUCT);
+
+	  /* Passed by-reference, so copy the pointer.  */
+	  avalue[i] = *(void **) ptr;
+	  ptr += 4;
+	}
+
+      /* If we've handled more arguments than fit in registers, start
+	 looking at the those passed on the stack.  Step over the
+	 first one if we had a straddling parameter.  */
+      if (doing_regs && ptr >= register_args + 4*4)
+	{
+	  ptr = stack_args + ((ptr > register_args + 4*4) ? 4 : 0);
+	  doing_regs = 0;
+	}
+    }
+
+  /* Invoke the closure.  */
+  (closure->fun) (cif,
+
+		  cif->rtype->type == FFI_TYPE_STRUCT
+		  /* The caller allocated space for the return
+		     structure, and passed a pointer to this space in
+		     R9.  */
+		  ? struct_ret
+
+		  /* We take advantage of being able to ignore that
+		     the high part isn't set if the return value is
+		     not in R10:R11, but in R10 only.  */
+		  : (void *) &llret,
+
+		  avalue, closure->user_data);
+
+  return llret;
+}
+
+/* API function: Prepare the trampoline.  */
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif *, void *, void **, void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  void *innerfn = ffi_prep_closure_inner;
+  FFI_ASSERT (cif->abi == FFI_SYSV);
+  closure->cif  = cif;
+  closure->user_data = user_data;
+  closure->fun  = fun;
+  memcpy (closure->tramp, ffi_cris_trampoline_template,
+	  FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE);
+  memcpy (closure->tramp + ffi_cris_trampoline_fn_offset,
+	  &innerfn, sizeof (void *));
+  memcpy (closure->tramp + ffi_cris_trampoline_closure_offset,
+	  &codeloc, sizeof (void *));
+
+  return FFI_OK;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffitarget.h
new file mode 100644
index 0000000..0e3705d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/ffitarget.h
@@ -0,0 +1,51 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Target configuration macros for CRIS.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_SYSV,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_SYSV
+} ffi_abi;
+#endif
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE 36
+#define FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE (7*4)
+#define FFI_TRAMPOLINE_SIZE \
+ (FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE + FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE)
+#define FFI_NATIVE_RAW_API 0
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/sysv.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/sysv.S
new file mode 100644
index 0000000..79abaee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/cris/sysv.S
@@ -0,0 +1,215 @@
+/* -----------------------------------------------------------------------
+   sysv.S - Copyright (c) 2004 Simon Posnjak
+	    Copyright (c) 2005 Axis Communications AB
+
+   CRIS Foreign Function Interface
+
+   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 SIMON POSNJAK 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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM
+#include <ffi.h>
+#define CONCAT(x,y) x ## y
+#define XCONCAT(x,y) CONCAT (x, y)
+#define L(x) XCONCAT (__USER_LABEL_PREFIX__, x)
+
+	.text
+
+	;; OK, when we get called we should have this (according to
+	;; AXIS ETRAX 100LX Programmer's Manual chapter 6.3).
+	;;
+	;; R10:	 ffi_prep_args (func. pointer)
+	;; R11:  &ecif
+	;; R12:  cif->bytes
+	;; R13:  fig->flags
+	;; sp+0: ecif.rvalue
+	;; sp+4: fn (function pointer to the function that we need to call)
+
+	.globl  L(ffi_call_SYSV)
+	.type   L(ffi_call_SYSV),@function
+	.hidden	L(ffi_call_SYSV)
+
+L(ffi_call_SYSV):
+	;; Save the regs to the stack.
+	push $srp
+	;; Used for stack pointer saving.
+	push $r6
+	;; Used for function address pointer.
+	push $r7
+	;; Used for stack pointer saving.
+	push $r8
+	;; We save fig->flags to stack we will need them after we
+	;; call The Function.
+	push $r13
+
+	;; Saving current stack pointer.
+	move.d $sp,$r8
+	move.d $sp,$r6
+
+	;; Move address of ffi_prep_args to r13.
+	move.d $r10,$r13
+
+	;; Make room on the stack for the args of fn.
+	sub.d  $r12,$sp
+
+	;; Function void ffi_prep_args(char *stack, extended_cif *ecif) parameters are:
+	;; 	r10 <-- stack pointer
+	;; 	r11 <-- &ecif (already there)
+	move.d $sp,$r10
+
+	;; Call the function.
+	jsr $r13
+
+	;; Save the size of the structures which are passed on stack.
+	move.d $r10,$r7
+
+	;; Move first four args in to r10..r13.
+	move.d [$sp+0],$r10
+	move.d [$sp+4],$r11
+	move.d [$sp+8],$r12
+	move.d [$sp+12],$r13
+
+	;; Adjust the stack and check if any parameters are given on stack.
+	addq 16,$sp
+	sub.d $r7,$r6
+	cmp.d $sp,$r6
+
+	bpl go_on
+	nop
+
+go_on_no_params_on_stack:
+	move.d $r6,$sp
+
+go_on:
+	;; Discover if we need to put rval address in to r9.
+	move.d [$r8+0],$r7
+	cmpq FFI_TYPE_STRUCT,$r7
+	bne call_now
+	nop
+
+	;; Move rval address to $r9.
+	move.d [$r8+20],$r9
+
+call_now:
+	;; Move address of The Function in to r7.
+	move.d [$r8+24],$r7
+
+	;; Call The Function.
+	jsr $r7
+
+	;; Reset stack.
+	move.d $r8,$sp
+
+	;; Load rval type (fig->flags) in to r13.
+	pop $r13
+
+	;; Detect rval type.
+	cmpq FFI_TYPE_VOID,$r13
+	beq epilogue
+
+	cmpq FFI_TYPE_STRUCT,$r13
+	beq epilogue
+
+	cmpq FFI_TYPE_DOUBLE,$r13
+	beq return_double_or_longlong
+
+	cmpq FFI_TYPE_UINT64,$r13
+	beq return_double_or_longlong
+
+	cmpq FFI_TYPE_SINT64,$r13
+	beq return_double_or_longlong
+	nop
+
+	;; Just return the 32 bit value.
+	ba return
+	nop
+
+return_double_or_longlong:
+	;; Load half of the rval to r10 and the other half to r11.
+	move.d [$sp+16],$r13
+	move.d $r10,[$r13]
+	addq 4,$r13
+	move.d $r11,[$r13]
+	ba epilogue
+	nop
+
+return:
+	;; Load the rval to r10.
+	move.d [$sp+16],$r13
+	move.d $r10,[$r13]
+
+epilogue:
+	pop $r8
+	pop $r7
+	pop $r6
+	Jump [$sp+]
+
+	.size   ffi_call_SYSV,.-ffi_call_SYSV
+
+/* Save R10..R13 into an array, somewhat like varargs.  Copy the next
+   argument too, to simplify handling of any straddling parameter.
+   Save R9 and SP after those.  Jump to function handling the rest.
+   Since this is a template, copied and the main function filled in by
+   the user.  */
+
+	.globl	L(ffi_cris_trampoline_template)
+	.type	L(ffi_cris_trampoline_template),@function
+	.hidden	L(ffi_cris_trampoline_template)
+
+L(ffi_cris_trampoline_template):
+0:
+	/* The value we get for "PC" is right after the prefix instruction,
+	   two bytes from the beginning, i.e. 0b+2. */
+	move.d $r10,[$pc+2f-(0b+2)]
+	move.d $pc,$r10
+1:
+	addq 2f-1b+4,$r10
+	move.d $r11,[$r10+]
+	move.d $r12,[$r10+]
+	move.d $r13,[$r10+]
+	move.d [$sp],$r11
+	move.d $r11,[$r10+]
+	move.d $r9,[$r10+]
+	move.d $sp,[$r10+]
+	subq FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE,$r10
+	move.d 0,$r11
+3:
+        jump 0
+2:
+	.size	ffi_cris_trampoline_template,.-0b
+
+/* This macro create a constant usable as "extern const int \name" in
+   C from within libffi, when \name has no prefix decoration.  */
+
+	.macro const name,value
+	.globl	\name
+	.type	\name,@object
+	.hidden	\name
+\name:
+	.dword  \value
+	.size	\name,4
+	.endm
+
+/* Constants for offsets within the trampoline.  We could do this with
+   just symbols, avoiding memory contents and memory accesses, but the
+   C usage code would look a bit stranger.  */
+
+	const L(ffi_cris_trampoline_fn_offset),2b-4-0b
+	const L(ffi_cris_trampoline_closure_offset),3b-4-0b
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/debug.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/debug.c
new file mode 100644
index 0000000..51dcfcf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/debug.c
@@ -0,0 +1,59 @@
+/* -----------------------------------------------------------------------
+   debug.c - Copyright (c) 1996 Red Hat, Inc.
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/* General debugging routines */
+
+void ffi_stop_here(void)
+{
+  /* This function is only useful for debugging purposes.
+     Place a breakpoint on ffi_stop_here to be notified of
+     significant events. */
+}
+
+/* This function should only be called via the FFI_ASSERT() macro */
+
+void ffi_assert(char *expr, char *file, int line)
+{
+  fprintf(stderr, "ASSERTION FAILURE: %s at %s:%d\n", expr, file, line);
+  ffi_stop_here();
+  abort();
+}
+
+/* Perform a sanity check on an ffi_type structure */
+
+void ffi_type_test(ffi_type *a, char *file, int line)
+{
+  FFI_ASSERT_AT(a != NULL, file, line);
+
+  FFI_ASSERT_AT(a->type <= FFI_TYPE_LAST, file, line);
+  FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->size > 0, file, line);
+  FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->alignment > 0, file, line);
+  FFI_ASSERT_AT(a->type != FFI_TYPE_STRUCT || a->elements != NULL, file, line);
+
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/dlmalloc.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/dlmalloc.c
new file mode 100644
index 0000000..5c9f9c2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/dlmalloc.c
@@ -0,0 +1,5161 @@
+/*
+  This is a version (aka dlmalloc) of malloc/free/realloc written by
+  Doug Lea and released to the public domain, as explained at
+  http://creativecommons.org/licenses/publicdomain.  Send questions,
+  comments, complaints, performance data, etc to dl@cs.oswego.edu
+
+* Version 2.8.3 Thu Sep 22 11:16:15 2005  Doug Lea  (dl at gee)
+
+   Note: There may be an updated version of this malloc obtainable at
+           ftp://gee.cs.oswego.edu/pub/misc/malloc.c
+         Check before installing!
+
+* Quickstart
+
+  This library is all in one file to simplify the most common usage:
+  ftp it, compile it (-O3), and link it into another program. All of
+  the compile-time options default to reasonable values for use on
+  most platforms.  You might later want to step through various
+  compile-time and dynamic tuning options.
+
+  For convenience, an include file for code using this malloc is at:
+     ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h
+  You don't really need this .h file unless you call functions not
+  defined in your system include files.  The .h file contains only the
+  excerpts from this file needed for using this malloc on ANSI C/C++
+  systems, so long as you haven't changed compile-time options about
+  naming and tuning parameters.  If you do, then you can create your
+  own malloc.h that does include all settings by cutting at the point
+  indicated below. Note that you may already by default be using a C
+  library containing a malloc that is based on some version of this
+  malloc (for example in linux). You might still want to use the one
+  in this file to customize settings or to avoid overheads associated
+  with library versions.
+
+* Vital statistics:
+
+  Supported pointer/size_t representation:       4 or 8 bytes
+       size_t MUST be an unsigned type of the same width as
+       pointers. (If you are using an ancient system that declares
+       size_t as a signed type, or need it to be a different width
+       than pointers, you can use a previous release of this malloc
+       (e.g. 2.7.2) supporting these.)
+
+  Alignment:                                     8 bytes (default)
+       This suffices for nearly all current machines and C compilers.
+       However, you can define MALLOC_ALIGNMENT to be wider than this
+       if necessary (up to 128bytes), at the expense of using more space.
+
+  Minimum overhead per allocated chunk:   4 or  8 bytes (if 4byte sizes)
+                                          8 or 16 bytes (if 8byte sizes)
+       Each malloced chunk has a hidden word of overhead holding size
+       and status information, and additional cross-check word
+       if FOOTERS is defined.
+
+  Minimum allocated size: 4-byte ptrs:  16 bytes    (including overhead)
+                          8-byte ptrs:  32 bytes    (including overhead)
+
+       Even a request for zero bytes (i.e., malloc(0)) returns a
+       pointer to something of the minimum allocatable size.
+       The maximum overhead wastage (i.e., number of extra bytes
+       allocated than were requested in malloc) is less than or equal
+       to the minimum size, except for requests >= mmap_threshold that
+       are serviced via mmap(), where the worst case wastage is about
+       32 bytes plus the remainder from a system page (the minimal
+       mmap unit); typically 4096 or 8192 bytes.
+
+  Security: static-safe; optionally more or less
+       The "security" of malloc refers to the ability of malicious
+       code to accentuate the effects of errors (for example, freeing
+       space that is not currently malloc'ed or overwriting past the
+       ends of chunks) in code that calls malloc.  This malloc
+       guarantees not to modify any memory locations below the base of
+       heap, i.e., static variables, even in the presence of usage
+       errors.  The routines additionally detect most improper frees
+       and reallocs.  All this holds as long as the static bookkeeping
+       for malloc itself is not corrupted by some other means.  This
+       is only one aspect of security -- these checks do not, and
+       cannot, detect all possible programming errors.
+
+       If FOOTERS is defined nonzero, then each allocated chunk
+       carries an additional check word to verify that it was malloced
+       from its space.  These check words are the same within each
+       execution of a program using malloc, but differ across
+       executions, so externally crafted fake chunks cannot be
+       freed. This improves security by rejecting frees/reallocs that
+       could corrupt heap memory, in addition to the checks preventing
+       writes to statics that are always on.  This may further improve
+       security at the expense of time and space overhead.  (Note that
+       FOOTERS may also be worth using with MSPACES.)
+
+       By default detected errors cause the program to abort (calling
+       "abort()"). You can override this to instead proceed past
+       errors by defining PROCEED_ON_ERROR.  In this case, a bad free
+       has no effect, and a malloc that encounters a bad address
+       caused by user overwrites will ignore the bad address by
+       dropping pointers and indices to all known memory. This may
+       be appropriate for programs that should continue if at all
+       possible in the face of programming errors, although they may
+       run out of memory because dropped memory is never reclaimed.
+
+       If you don't like either of these options, you can define
+       CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything
+       else. And if if you are sure that your program using malloc has
+       no errors or vulnerabilities, you can define INSECURE to 1,
+       which might (or might not) provide a small performance improvement.
+
+  Thread-safety: NOT thread-safe unless USE_LOCKS defined
+       When USE_LOCKS is defined, each public call to malloc, free,
+       etc is surrounded with either a pthread mutex or a win32
+       spinlock (depending on WIN32). This is not especially fast, and
+       can be a major bottleneck.  It is designed only to provide
+       minimal protection in concurrent environments, and to provide a
+       basis for extensions.  If you are using malloc in a concurrent
+       program, consider instead using ptmalloc, which is derived from
+       a version of this malloc. (See http://www.malloc.de).
+
+  System requirements: Any combination of MORECORE and/or MMAP/MUNMAP
+       This malloc can use unix sbrk or any emulation (invoked using
+       the CALL_MORECORE macro) and/or mmap/munmap or any emulation
+       (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system
+       memory.  On most unix systems, it tends to work best if both
+       MORECORE and MMAP are enabled.  On Win32, it uses emulations
+       based on VirtualAlloc. It also uses common C library functions
+       like memset.
+
+  Compliance: I believe it is compliant with the Single Unix Specification
+       (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably
+       others as well.
+
+* Overview of algorithms
+
+  This is not the fastest, most space-conserving, most portable, or
+  most tunable malloc ever written. However it is among the fastest
+  while also being among the most space-conserving, portable and
+  tunable.  Consistent balance across these factors results in a good
+  general-purpose allocator for malloc-intensive programs.
+
+  In most ways, this malloc is a best-fit allocator. Generally, it
+  chooses the best-fitting existing chunk for a request, with ties
+  broken in approximately least-recently-used order. (This strategy
+  normally maintains low fragmentation.) However, for requests less
+  than 256bytes, it deviates from best-fit when there is not an
+  exactly fitting available chunk by preferring to use space adjacent
+  to that used for the previous small request, as well as by breaking
+  ties in approximately most-recently-used order. (These enhance
+  locality of series of small allocations.)  And for very large requests
+  (>= 256Kb by default), it relies on system memory mapping
+  facilities, if supported.  (This helps avoid carrying around and
+  possibly fragmenting memory used only for large chunks.)
+
+  All operations (except malloc_stats and mallinfo) have execution
+  times that are bounded by a constant factor of the number of bits in
+  a size_t, not counting any clearing in calloc or copying in realloc,
+  or actions surrounding MORECORE and MMAP that have times
+  proportional to the number of non-contiguous regions returned by
+  system allocation routines, which is often just 1.
+
+  The implementation is not very modular and seriously overuses
+  macros. Perhaps someday all C compilers will do as good a job
+  inlining modular code as can now be done by brute-force expansion,
+  but now, enough of them seem not to.
+
+  Some compilers issue a lot of warnings about code that is
+  dead/unreachable only on some platforms, and also about intentional
+  uses of negation on unsigned types. All known cases of each can be
+  ignored.
+
+  For a longer but out of date high-level description, see
+     http://gee.cs.oswego.edu/dl/html/malloc.html
+
+* MSPACES
+  If MSPACES is defined, then in addition to malloc, free, etc.,
+  this file also defines mspace_malloc, mspace_free, etc. These
+  are versions of malloc routines that take an "mspace" argument
+  obtained using create_mspace, to control all internal bookkeeping.
+  If ONLY_MSPACES is defined, only these versions are compiled.
+  So if you would like to use this allocator for only some allocations,
+  and your system malloc for others, you can compile with
+  ONLY_MSPACES and then do something like...
+    static mspace mymspace = create_mspace(0,0); // for example
+    #define mymalloc(bytes)  mspace_malloc(mymspace, bytes)
+
+  (Note: If you only need one instance of an mspace, you can instead
+  use "USE_DL_PREFIX" to relabel the global malloc.)
+
+  You can similarly create thread-local allocators by storing
+  mspaces as thread-locals. For example:
+    static __thread mspace tlms = 0;
+    void*  tlmalloc(size_t bytes) {
+      if (tlms == 0) tlms = create_mspace(0, 0);
+      return mspace_malloc(tlms, bytes);
+    }
+    void  tlfree(void* mem) { mspace_free(tlms, mem); }
+
+  Unless FOOTERS is defined, each mspace is completely independent.
+  You cannot allocate from one and free to another (although
+  conformance is only weakly checked, so usage errors are not always
+  caught). If FOOTERS is defined, then each chunk carries around a tag
+  indicating its originating mspace, and frees are directed to their
+  originating spaces.
+
+ -------------------------  Compile-time options ---------------------------
+
+Be careful in setting #define values for numerical constants of type
+size_t. On some systems, literal values are not automatically extended
+to size_t precision unless they are explicitly casted.
+
+WIN32                    default: defined if _WIN32 defined
+  Defining WIN32 sets up defaults for MS environment and compilers.
+  Otherwise defaults are for unix.
+
+MALLOC_ALIGNMENT         default: (size_t)8
+  Controls the minimum alignment for malloc'ed chunks.  It must be a
+  power of two and at least 8, even on machines for which smaller
+  alignments would suffice. It may be defined as larger than this
+  though. Note however that code and data structures are optimized for
+  the case of 8-byte alignment.
+
+MSPACES                  default: 0 (false)
+  If true, compile in support for independent allocation spaces.
+  This is only supported if HAVE_MMAP is true.
+
+ONLY_MSPACES             default: 0 (false)
+  If true, only compile in mspace versions, not regular versions.
+
+USE_LOCKS                default: 0 (false)
+  Causes each call to each public routine to be surrounded with
+  pthread or WIN32 mutex lock/unlock. (If set true, this can be
+  overridden on a per-mspace basis for mspace versions.)
+
+FOOTERS                  default: 0
+  If true, provide extra checking and dispatching by placing
+  information in the footers of allocated chunks. This adds
+  space and time overhead.
+
+INSECURE                 default: 0
+  If true, omit checks for usage errors and heap space overwrites.
+
+USE_DL_PREFIX            default: NOT defined
+  Causes compiler to prefix all public routines with the string 'dl'.
+  This can be useful when you only want to use this malloc in one part
+  of a program, using your regular system malloc elsewhere.
+
+ABORT                    default: defined as abort()
+  Defines how to abort on failed checks.  On most systems, a failed
+  check cannot die with an "assert" or even print an informative
+  message, because the underlying print routines in turn call malloc,
+  which will fail again.  Generally, the best policy is to simply call
+  abort(). It's not very useful to do more than this because many
+  errors due to overwriting will show up as address faults (null, odd
+  addresses etc) rather than malloc-triggered checks, so will also
+  abort.  Also, most compilers know that abort() does not return, so
+  can better optimize code conditionally calling it.
+
+PROCEED_ON_ERROR           default: defined as 0 (false)
+  Controls whether detected bad addresses cause them to bypassed
+  rather than aborting. If set, detected bad arguments to free and
+  realloc are ignored. And all bookkeeping information is zeroed out
+  upon a detected overwrite of freed heap space, thus losing the
+  ability to ever return it from malloc again, but enabling the
+  application to proceed. If PROCEED_ON_ERROR is defined, the
+  static variable malloc_corruption_error_count is compiled in
+  and can be examined to see if errors have occurred. This option
+  generates slower code than the default abort policy.
+
+DEBUG                    default: NOT defined
+  The DEBUG setting is mainly intended for people trying to modify
+  this code or diagnose problems when porting to new platforms.
+  However, it may also be able to better isolate user errors than just
+  using runtime checks.  The assertions in the check routines spell
+  out in more detail the assumptions and invariants underlying the
+  algorithms.  The checking is fairly extensive, and will slow down
+  execution noticeably. Calling malloc_stats or mallinfo with DEBUG
+  set will attempt to check every non-mmapped allocated and free chunk
+  in the course of computing the summaries.
+
+ABORT_ON_ASSERT_FAILURE   default: defined as 1 (true)
+  Debugging assertion failures can be nearly impossible if your
+  version of the assert macro causes malloc to be called, which will
+  lead to a cascade of further failures, blowing the runtime stack.
+  ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(),
+  which will usually make debugging easier.
+
+MALLOC_FAILURE_ACTION     default: sets errno to ENOMEM, or no-op on win32
+  The action to take before "return 0" when malloc fails to be able to
+  return memory because there is none available.
+
+HAVE_MORECORE             default: 1 (true) unless win32 or ONLY_MSPACES
+  True if this system supports sbrk or an emulation of it.
+
+MORECORE                  default: sbrk
+  The name of the sbrk-style system routine to call to obtain more
+  memory.  See below for guidance on writing custom MORECORE
+  functions. The type of the argument to sbrk/MORECORE varies across
+  systems.  It cannot be size_t, because it supports negative
+  arguments, so it is normally the signed type of the same width as
+  size_t (sometimes declared as "intptr_t").  It doesn't much matter
+  though. Internally, we only call it with arguments less than half
+  the max value of a size_t, which should work across all reasonable
+  possibilities, although sometimes generating compiler warnings.  See
+  near the end of this file for guidelines for creating a custom
+  version of MORECORE.
+
+MORECORE_CONTIGUOUS       default: 1 (true)
+  If true, take advantage of fact that consecutive calls to MORECORE
+  with positive arguments always return contiguous increasing
+  addresses.  This is true of unix sbrk. It does not hurt too much to
+  set it true anyway, since malloc copes with non-contiguities.
+  Setting it false when definitely non-contiguous saves time
+  and possibly wasted space it would take to discover this though.
+
+MORECORE_CANNOT_TRIM      default: NOT defined
+  True if MORECORE cannot release space back to the system when given
+  negative arguments. This is generally necessary only if you are
+  using a hand-crafted MORECORE function that cannot handle negative
+  arguments.
+
+HAVE_MMAP                 default: 1 (true)
+  True if this system supports mmap or an emulation of it.  If so, and
+  HAVE_MORECORE is not true, MMAP is used for all system
+  allocation. If set and HAVE_MORECORE is true as well, MMAP is
+  primarily used to directly allocate very large blocks. It is also
+  used as a backup strategy in cases where MORECORE fails to provide
+  space from system. Note: A single call to MUNMAP is assumed to be
+  able to unmap memory that may have be allocated using multiple calls
+  to MMAP, so long as they are adjacent.
+
+HAVE_MREMAP               default: 1 on linux, else 0
+  If true realloc() uses mremap() to re-allocate large blocks and
+  extend or shrink allocation spaces.
+
+MMAP_CLEARS               default: 1 on unix
+  True if mmap clears memory so calloc doesn't need to. This is true
+  for standard unix mmap using /dev/zero.
+
+USE_BUILTIN_FFS            default: 0 (i.e., not used)
+  Causes malloc to use the builtin ffs() function to compute indices.
+  Some compilers may recognize and intrinsify ffs to be faster than the
+  supplied C version. Also, the case of x86 using gcc is special-cased
+  to an asm instruction, so is already as fast as it can be, and so
+  this setting has no effect. (On most x86s, the asm version is only
+  slightly faster than the C version.)
+
+malloc_getpagesize         default: derive from system includes, or 4096.
+  The system page size. To the extent possible, this malloc manages
+  memory from the system in page-size units.  This may be (and
+  usually is) a function rather than a constant. This is ignored
+  if WIN32, where page size is determined using getSystemInfo during
+  initialization.
+
+USE_DEV_RANDOM             default: 0 (i.e., not used)
+  Causes malloc to use /dev/random to initialize secure magic seed for
+  stamping footers. Otherwise, the current time is used.
+
+NO_MALLINFO                default: 0
+  If defined, don't compile "mallinfo". This can be a simple way
+  of dealing with mismatches between system declarations and
+  those in this file.
+
+MALLINFO_FIELD_TYPE        default: size_t
+  The type of the fields in the mallinfo struct. This was originally
+  defined as "int" in SVID etc, but is more usefully defined as
+  size_t. The value is used only if  HAVE_USR_INCLUDE_MALLOC_H is not set
+
+REALLOC_ZERO_BYTES_FREES    default: not defined
+  This should be set if a call to realloc with zero bytes should 
+  be the same as a call to free. Some people think it should. Otherwise, 
+  since this malloc returns a unique pointer for malloc(0), so does 
+  realloc(p, 0).
+
+LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H
+LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H,  LACKS_ERRNO_H
+LACKS_STDLIB_H                default: NOT defined unless on WIN32
+  Define these if your system does not have these header files.
+  You might need to manually insert some of the declarations they provide.
+
+DEFAULT_GRANULARITY        default: page size if MORECORE_CONTIGUOUS,
+                                system_info.dwAllocationGranularity in WIN32,
+                                otherwise 64K.
+      Also settable using mallopt(M_GRANULARITY, x)
+  The unit for allocating and deallocating memory from the system.  On
+  most systems with contiguous MORECORE, there is no reason to
+  make this more than a page. However, systems with MMAP tend to
+  either require or encourage larger granularities.  You can increase
+  this value to prevent system allocation functions to be called so
+  often, especially if they are slow.  The value must be at least one
+  page and must be a power of two.  Setting to 0 causes initialization
+  to either page size or win32 region size.  (Note: In previous
+  versions of malloc, the equivalent of this option was called
+  "TOP_PAD")
+
+DEFAULT_TRIM_THRESHOLD    default: 2MB
+      Also settable using mallopt(M_TRIM_THRESHOLD, x)
+  The maximum amount of unused top-most memory to keep before
+  releasing via malloc_trim in free().  Automatic trimming is mainly
+  useful in long-lived programs using contiguous MORECORE.  Because
+  trimming via sbrk can be slow on some systems, and can sometimes be
+  wasteful (in cases where programs immediately afterward allocate
+  more large chunks) the value should be high enough so that your
+  overall system performance would improve by releasing this much
+  memory.  As a rough guide, you might set to a value close to the
+  average size of a process (program) running on your system.
+  Releasing this much memory would allow such a process to run in
+  memory.  Generally, it is worth tuning trim thresholds when a
+  program undergoes phases where several large chunks are allocated
+  and released in ways that can reuse each other's storage, perhaps
+  mixed with phases where there are no such chunks at all. The trim
+  value must be greater than page size to have any useful effect.  To
+  disable trimming completely, you can set to MAX_SIZE_T. Note that the trick
+  some people use of mallocing a huge space and then freeing it at
+  program startup, in an attempt to reserve system memory, doesn't
+  have the intended effect under automatic trimming, since that memory
+  will immediately be returned to the system.
+
+DEFAULT_MMAP_THRESHOLD       default: 256K
+      Also settable using mallopt(M_MMAP_THRESHOLD, x)
+  The request size threshold for using MMAP to directly service a
+  request. Requests of at least this size that cannot be allocated
+  using already-existing space will be serviced via mmap.  (If enough
+  normal freed space already exists it is used instead.)  Using mmap
+  segregates relatively large chunks of memory so that they can be
+  individually obtained and released from the host system. A request
+  serviced through mmap is never reused by any other request (at least
+  not directly; the system may just so happen to remap successive
+  requests to the same locations).  Segregating space in this way has
+  the benefits that: Mmapped space can always be individually released
+  back to the system, which helps keep the system level memory demands
+  of a long-lived program low.  Also, mapped memory doesn't become
+  `locked' between other chunks, as can happen with normally allocated
+  chunks, which means that even trimming via malloc_trim would not
+  release them.  However, it has the disadvantage that the space
+  cannot be reclaimed, consolidated, and then used to service later
+  requests, as happens with normal chunks.  The advantages of mmap
+  nearly always outweigh disadvantages for "large" chunks, but the
+  value of "large" may vary across systems.  The default is an
+  empirically derived value that works well in most systems. You can
+  disable mmap by setting to MAX_SIZE_T.
+
+*/
+
+#ifndef WIN32
+#ifdef _WIN32
+#define WIN32 1
+#endif  /* _WIN32 */
+#endif  /* WIN32 */
+#ifdef WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#define HAVE_MMAP 1
+#define HAVE_MORECORE 0
+#define LACKS_UNISTD_H
+#define LACKS_SYS_PARAM_H
+#define LACKS_SYS_MMAN_H
+#define LACKS_STRING_H
+#define LACKS_STRINGS_H
+#define LACKS_SYS_TYPES_H
+#define LACKS_ERRNO_H
+#define MALLOC_FAILURE_ACTION
+#define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */
+#endif  /* WIN32 */
+
+#ifdef __OS2__
+#define INCL_DOS
+#include <os2.h>
+#define HAVE_MMAP 1
+#define HAVE_MORECORE 0
+#define LACKS_SYS_MMAN_H
+#endif  /* __OS2__ */
+
+#if defined(DARWIN) || defined(_DARWIN)
+/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */
+#ifndef HAVE_MORECORE
+#define HAVE_MORECORE 0
+#define HAVE_MMAP 1
+#endif  /* HAVE_MORECORE */
+#endif  /* DARWIN */
+
+#ifndef LACKS_SYS_TYPES_H
+#include <sys/types.h>  /* For size_t */
+#endif  /* LACKS_SYS_TYPES_H */
+
+/* The maximum possible size_t value has all bits set */
+#define MAX_SIZE_T           (~(size_t)0)
+
+#ifndef ONLY_MSPACES
+#define ONLY_MSPACES 0
+#endif  /* ONLY_MSPACES */
+#ifndef MSPACES
+#if ONLY_MSPACES
+#define MSPACES 1
+#else   /* ONLY_MSPACES */
+#define MSPACES 0
+#endif  /* ONLY_MSPACES */
+#endif  /* MSPACES */
+#ifndef MALLOC_ALIGNMENT
+#define MALLOC_ALIGNMENT ((size_t)8U)
+#endif  /* MALLOC_ALIGNMENT */
+#ifndef FOOTERS
+#define FOOTERS 0
+#endif  /* FOOTERS */
+#ifndef ABORT
+#define ABORT  abort()
+#endif  /* ABORT */
+#ifndef ABORT_ON_ASSERT_FAILURE
+#define ABORT_ON_ASSERT_FAILURE 1
+#endif  /* ABORT_ON_ASSERT_FAILURE */
+#ifndef PROCEED_ON_ERROR
+#define PROCEED_ON_ERROR 0
+#endif  /* PROCEED_ON_ERROR */
+#ifndef USE_LOCKS
+#define USE_LOCKS 0
+#endif  /* USE_LOCKS */
+#ifndef INSECURE
+#define INSECURE 0
+#endif  /* INSECURE */
+#ifndef HAVE_MMAP
+#define HAVE_MMAP 1
+#endif  /* HAVE_MMAP */
+#ifndef MMAP_CLEARS
+#define MMAP_CLEARS 1
+#endif  /* MMAP_CLEARS */
+#ifndef HAVE_MREMAP
+#ifdef linux
+#define HAVE_MREMAP 1
+#else   /* linux */
+#define HAVE_MREMAP 0
+#endif  /* linux */
+#endif  /* HAVE_MREMAP */
+#ifndef MALLOC_FAILURE_ACTION
+#define MALLOC_FAILURE_ACTION  errno = ENOMEM;
+#endif  /* MALLOC_FAILURE_ACTION */
+#ifndef HAVE_MORECORE
+#if ONLY_MSPACES
+#define HAVE_MORECORE 0
+#else   /* ONLY_MSPACES */
+#define HAVE_MORECORE 1
+#endif  /* ONLY_MSPACES */
+#endif  /* HAVE_MORECORE */
+#if !HAVE_MORECORE
+#define MORECORE_CONTIGUOUS 0
+#else   /* !HAVE_MORECORE */
+#ifndef MORECORE
+#define MORECORE sbrk
+#endif  /* MORECORE */
+#ifndef MORECORE_CONTIGUOUS
+#define MORECORE_CONTIGUOUS 1
+#endif  /* MORECORE_CONTIGUOUS */
+#endif  /* HAVE_MORECORE */
+#ifndef DEFAULT_GRANULARITY
+#if MORECORE_CONTIGUOUS
+#define DEFAULT_GRANULARITY (0)  /* 0 means to compute in init_mparams */
+#else   /* MORECORE_CONTIGUOUS */
+#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U)
+#endif  /* MORECORE_CONTIGUOUS */
+#endif  /* DEFAULT_GRANULARITY */
+#ifndef DEFAULT_TRIM_THRESHOLD
+#ifndef MORECORE_CANNOT_TRIM
+#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U)
+#else   /* MORECORE_CANNOT_TRIM */
+#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T
+#endif  /* MORECORE_CANNOT_TRIM */
+#endif  /* DEFAULT_TRIM_THRESHOLD */
+#ifndef DEFAULT_MMAP_THRESHOLD
+#if HAVE_MMAP
+#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U)
+#else   /* HAVE_MMAP */
+#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T
+#endif  /* HAVE_MMAP */
+#endif  /* DEFAULT_MMAP_THRESHOLD */
+#ifndef USE_BUILTIN_FFS
+#define USE_BUILTIN_FFS 0
+#endif  /* USE_BUILTIN_FFS */
+#ifndef USE_DEV_RANDOM
+#define USE_DEV_RANDOM 0
+#endif  /* USE_DEV_RANDOM */
+#ifndef NO_MALLINFO
+#define NO_MALLINFO 0
+#endif  /* NO_MALLINFO */
+#ifndef MALLINFO_FIELD_TYPE
+#define MALLINFO_FIELD_TYPE size_t
+#endif  /* MALLINFO_FIELD_TYPE */
+
+/*
+  mallopt tuning options.  SVID/XPG defines four standard parameter
+  numbers for mallopt, normally defined in malloc.h.  None of these
+  are used in this malloc, so setting them has no effect. But this
+  malloc does support the following options.
+*/
+
+#define M_TRIM_THRESHOLD     (-1)
+#define M_GRANULARITY        (-2)
+#define M_MMAP_THRESHOLD     (-3)
+
+/* ------------------------ Mallinfo declarations ------------------------ */
+
+#if !NO_MALLINFO
+/*
+  This version of malloc supports the standard SVID/XPG mallinfo
+  routine that returns a struct containing usage properties and
+  statistics. It should work on any system that has a
+  /usr/include/malloc.h defining struct mallinfo.  The main
+  declaration needed is the mallinfo struct that is returned (by-copy)
+  by mallinfo().  The malloinfo struct contains a bunch of fields that
+  are not even meaningful in this version of malloc.  These fields are
+  are instead filled by mallinfo() with other numbers that might be of
+  interest.
+
+  HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
+  /usr/include/malloc.h file that includes a declaration of struct
+  mallinfo.  If so, it is included; else a compliant version is
+  declared below.  These must be precisely the same for mallinfo() to
+  work.  The original SVID version of this struct, defined on most
+  systems with mallinfo, declares all fields as ints. But some others
+  define as unsigned long. If your system defines the fields using a
+  type of different width than listed here, you MUST #include your
+  system version and #define HAVE_USR_INCLUDE_MALLOC_H.
+*/
+
+/* #define HAVE_USR_INCLUDE_MALLOC_H */
+
+#ifdef HAVE_USR_INCLUDE_MALLOC_H
+#include "/usr/include/malloc.h"
+#else /* HAVE_USR_INCLUDE_MALLOC_H */
+
+/* HP-UX's stdlib.h redefines mallinfo unless _STRUCT_MALLINFO is defined */
+#define _STRUCT_MALLINFO
+
+struct mallinfo {
+  MALLINFO_FIELD_TYPE arena;    /* non-mmapped space allocated from system */
+  MALLINFO_FIELD_TYPE ordblks;  /* number of free chunks */
+  MALLINFO_FIELD_TYPE smblks;   /* always 0 */
+  MALLINFO_FIELD_TYPE hblks;    /* always 0 */
+  MALLINFO_FIELD_TYPE hblkhd;   /* space in mmapped regions */
+  MALLINFO_FIELD_TYPE usmblks;  /* maximum total allocated space */
+  MALLINFO_FIELD_TYPE fsmblks;  /* always 0 */
+  MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
+  MALLINFO_FIELD_TYPE fordblks; /* total free space */
+  MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
+};
+
+#endif /* HAVE_USR_INCLUDE_MALLOC_H */
+#endif /* NO_MALLINFO */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#if !ONLY_MSPACES
+
+/* ------------------- Declarations of public routines ------------------- */
+
+#ifndef USE_DL_PREFIX
+#define dlcalloc               calloc
+#define dlfree                 free
+#define dlmalloc               malloc
+#define dlmemalign             memalign
+#define dlrealloc              realloc
+#define dlvalloc               valloc
+#define dlpvalloc              pvalloc
+#define dlmallinfo             mallinfo
+#define dlmallopt              mallopt
+#define dlmalloc_trim          malloc_trim
+#define dlmalloc_stats         malloc_stats
+#define dlmalloc_usable_size   malloc_usable_size
+#define dlmalloc_footprint     malloc_footprint
+#define dlmalloc_max_footprint malloc_max_footprint
+#define dlindependent_calloc   independent_calloc
+#define dlindependent_comalloc independent_comalloc
+#endif /* USE_DL_PREFIX */
+
+
+/*
+  malloc(size_t n)
+  Returns a pointer to a newly allocated chunk of at least n bytes, or
+  null if no space is available, in which case errno is set to ENOMEM
+  on ANSI C systems.
+
+  If n is zero, malloc returns a minimum-sized chunk. (The minimum
+  size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
+  systems.)  Note that size_t is an unsigned type, so calls with
+  arguments that would be negative if signed are interpreted as
+  requests for huge amounts of space, which will often fail. The
+  maximum supported value of n differs across systems, but is in all
+  cases less than the maximum representable value of a size_t.
+*/
+void* dlmalloc(size_t);
+
+/*
+  free(void* p)
+  Releases the chunk of memory pointed to by p, that had been previously
+  allocated using malloc or a related routine such as realloc.
+  It has no effect if p is null. If p was not malloced or already
+  freed, free(p) will by default cause the current program to abort.
+*/
+void  dlfree(void*);
+
+/*
+  calloc(size_t n_elements, size_t element_size);
+  Returns a pointer to n_elements * element_size bytes, with all locations
+  set to zero.
+*/
+void* dlcalloc(size_t, size_t);
+
+/*
+  realloc(void* p, size_t n)
+  Returns a pointer to a chunk of size n that contains the same data
+  as does chunk p up to the minimum of (n, p's size) bytes, or null
+  if no space is available.
+
+  The returned pointer may or may not be the same as p. The algorithm
+  prefers extending p in most cases when possible, otherwise it
+  employs the equivalent of a malloc-copy-free sequence.
+
+  If p is null, realloc is equivalent to malloc.
+
+  If space is not available, realloc returns null, errno is set (if on
+  ANSI) and p is NOT freed.
+
+  if n is for fewer bytes than already held by p, the newly unused
+  space is lopped off and freed if possible.  realloc with a size
+  argument of zero (re)allocates a minimum-sized chunk.
+
+  The old unix realloc convention of allowing the last-free'd chunk
+  to be used as an argument to realloc is not supported.
+*/
+
+void* dlrealloc(void*, size_t);
+
+/*
+  memalign(size_t alignment, size_t n);
+  Returns a pointer to a newly allocated chunk of n bytes, aligned
+  in accord with the alignment argument.
+
+  The alignment argument should be a power of two. If the argument is
+  not a power of two, the nearest greater power is used.
+  8-byte alignment is guaranteed by normal malloc calls, so don't
+  bother calling memalign with an argument of 8 or less.
+
+  Overreliance on memalign is a sure way to fragment space.
+*/
+void* dlmemalign(size_t, size_t);
+
+/*
+  valloc(size_t n);
+  Equivalent to memalign(pagesize, n), where pagesize is the page
+  size of the system. If the pagesize is unknown, 4096 is used.
+*/
+void* dlvalloc(size_t);
+
+/*
+  mallopt(int parameter_number, int parameter_value)
+  Sets tunable parameters The format is to provide a
+  (parameter-number, parameter-value) pair.  mallopt then sets the
+  corresponding parameter to the argument value if it can (i.e., so
+  long as the value is meaningful), and returns 1 if successful else
+  0.  SVID/XPG/ANSI defines four standard param numbers for mallopt,
+  normally defined in malloc.h.  None of these are use in this malloc,
+  so setting them has no effect. But this malloc also supports other
+  options in mallopt. See below for details.  Briefly, supported
+  parameters are as follows (listed defaults are for "typical"
+  configurations).
+
+  Symbol            param #  default    allowed param values
+  M_TRIM_THRESHOLD     -1   2*1024*1024   any   (MAX_SIZE_T disables)
+  M_GRANULARITY        -2     page size   any power of 2 >= page size
+  M_MMAP_THRESHOLD     -3      256*1024   any   (or 0 if no MMAP support)
+*/
+int dlmallopt(int, int);
+
+/*
+  malloc_footprint();
+  Returns the number of bytes obtained from the system.  The total
+  number of bytes allocated by malloc, realloc etc., is less than this
+  value. Unlike mallinfo, this function returns only a precomputed
+  result, so can be called frequently to monitor memory consumption.
+  Even if locks are otherwise defined, this function does not use them,
+  so results might not be up to date.
+*/
+size_t dlmalloc_footprint(void);
+
+/*
+  malloc_max_footprint();
+  Returns the maximum number of bytes obtained from the system. This
+  value will be greater than current footprint if deallocated space
+  has been reclaimed by the system. The peak number of bytes allocated
+  by malloc, realloc etc., is less than this value. Unlike mallinfo,
+  this function returns only a precomputed result, so can be called
+  frequently to monitor memory consumption.  Even if locks are
+  otherwise defined, this function does not use them, so results might
+  not be up to date.
+*/
+size_t dlmalloc_max_footprint(void);
+
+#if !NO_MALLINFO
+/*
+  mallinfo()
+  Returns (by copy) a struct containing various summary statistics:
+
+  arena:     current total non-mmapped bytes allocated from system
+  ordblks:   the number of free chunks
+  smblks:    always zero.
+  hblks:     current number of mmapped regions
+  hblkhd:    total bytes held in mmapped regions
+  usmblks:   the maximum total allocated space. This will be greater
+                than current total if trimming has occurred.
+  fsmblks:   always zero
+  uordblks:  current total allocated space (normal or mmapped)
+  fordblks:  total free space
+  keepcost:  the maximum number of bytes that could ideally be released
+               back to system via malloc_trim. ("ideally" means that
+               it ignores page restrictions etc.)
+
+  Because these fields are ints, but internal bookkeeping may
+  be kept as longs, the reported values may wrap around zero and
+  thus be inaccurate.
+*/
+struct mallinfo dlmallinfo(void);
+#endif /* NO_MALLINFO */
+
+/*
+  independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
+
+  independent_calloc is similar to calloc, but instead of returning a
+  single cleared space, it returns an array of pointers to n_elements
+  independent elements that can hold contents of size elem_size, each
+  of which starts out cleared, and can be independently freed,
+  realloc'ed etc. The elements are guaranteed to be adjacently
+  allocated (this is not guaranteed to occur with multiple callocs or
+  mallocs), which may also improve cache locality in some
+  applications.
+
+  The "chunks" argument is optional (i.e., may be null, which is
+  probably the most typical usage). If it is null, the returned array
+  is itself dynamically allocated and should also be freed when it is
+  no longer needed. Otherwise, the chunks array must be of at least
+  n_elements in length. It is filled in with the pointers to the
+  chunks.
+
+  In either case, independent_calloc returns this pointer array, or
+  null if the allocation failed.  If n_elements is zero and "chunks"
+  is null, it returns a chunk representing an array with zero elements
+  (which should be freed if not wanted).
+
+  Each element must be individually freed when it is no longer
+  needed. If you'd like to instead be able to free all at once, you
+  should instead use regular calloc and assign pointers into this
+  space to represent elements.  (In this case though, you cannot
+  independently free elements.)
+
+  independent_calloc simplifies and speeds up implementations of many
+  kinds of pools.  It may also be useful when constructing large data
+  structures that initially have a fixed number of fixed-sized nodes,
+  but the number is not known at compile time, and some of the nodes
+  may later need to be freed. For example:
+
+  struct Node { int item; struct Node* next; };
+
+  struct Node* build_list() {
+    struct Node** pool;
+    int n = read_number_of_nodes_needed();
+    if (n <= 0) return 0;
+    pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
+    if (pool == 0) die();
+    // organize into a linked list...
+    struct Node* first = pool[0];
+    for (i = 0; i < n-1; ++i)
+      pool[i]->next = pool[i+1];
+    free(pool);     // Can now free the array (or not, if it is needed later)
+    return first;
+  }
+*/
+void** dlindependent_calloc(size_t, size_t, void**);
+
+/*
+  independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
+
+  independent_comalloc allocates, all at once, a set of n_elements
+  chunks with sizes indicated in the "sizes" array.    It returns
+  an array of pointers to these elements, each of which can be
+  independently freed, realloc'ed etc. The elements are guaranteed to
+  be adjacently allocated (this is not guaranteed to occur with
+  multiple callocs or mallocs), which may also improve cache locality
+  in some applications.
+
+  The "chunks" argument is optional (i.e., may be null). If it is null
+  the returned array is itself dynamically allocated and should also
+  be freed when it is no longer needed. Otherwise, the chunks array
+  must be of at least n_elements in length. It is filled in with the
+  pointers to the chunks.
+
+  In either case, independent_comalloc returns this pointer array, or
+  null if the allocation failed.  If n_elements is zero and chunks is
+  null, it returns a chunk representing an array with zero elements
+  (which should be freed if not wanted).
+
+  Each element must be individually freed when it is no longer
+  needed. If you'd like to instead be able to free all at once, you
+  should instead use a single regular malloc, and assign pointers at
+  particular offsets in the aggregate space. (In this case though, you
+  cannot independently free elements.)
+
+  independent_comallac differs from independent_calloc in that each
+  element may have a different size, and also that it does not
+  automatically clear elements.
+
+  independent_comalloc can be used to speed up allocation in cases
+  where several structs or objects must always be allocated at the
+  same time.  For example:
+
+  struct Head { ... }
+  struct Foot { ... }
+
+  void send_message(char* msg) {
+    int msglen = strlen(msg);
+    size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
+    void* chunks[3];
+    if (independent_comalloc(3, sizes, chunks) == 0)
+      die();
+    struct Head* head = (struct Head*)(chunks[0]);
+    char*        body = (char*)(chunks[1]);
+    struct Foot* foot = (struct Foot*)(chunks[2]);
+    // ...
+  }
+
+  In general though, independent_comalloc is worth using only for
+  larger values of n_elements. For small values, you probably won't
+  detect enough difference from series of malloc calls to bother.
+
+  Overuse of independent_comalloc can increase overall memory usage,
+  since it cannot reuse existing noncontiguous small chunks that
+  might be available for some of the elements.
+*/
+void** dlindependent_comalloc(size_t, size_t*, void**);
+
+
+/*
+  pvalloc(size_t n);
+  Equivalent to valloc(minimum-page-that-holds(n)), that is,
+  round up n to nearest pagesize.
+ */
+void*  dlpvalloc(size_t);
+
+/*
+  malloc_trim(size_t pad);
+
+  If possible, gives memory back to the system (via negative arguments
+  to sbrk) if there is unused memory at the `high' end of the malloc
+  pool or in unused MMAP segments. You can call this after freeing
+  large blocks of memory to potentially reduce the system-level memory
+  requirements of a program. However, it cannot guarantee to reduce
+  memory. Under some allocation patterns, some large free blocks of
+  memory will be locked between two used chunks, so they cannot be
+  given back to the system.
+
+  The `pad' argument to malloc_trim represents the amount of free
+  trailing space to leave untrimmed. If this argument is zero, only
+  the minimum amount of memory to maintain internal data structures
+  will be left. Non-zero arguments can be supplied to maintain enough
+  trailing space to service future expected allocations without having
+  to re-obtain memory from the system.
+
+  Malloc_trim returns 1 if it actually released any memory, else 0.
+*/
+int  dlmalloc_trim(size_t);
+
+/*
+  malloc_usable_size(void* p);
+
+  Returns the number of bytes you can actually use in
+  an allocated chunk, which may be more than you requested (although
+  often not) due to alignment and minimum size constraints.
+  You can use this many bytes without worrying about
+  overwriting other allocated objects. This is not a particularly great
+  programming practice. malloc_usable_size can be more useful in
+  debugging and assertions, for example:
+
+  p = malloc(n);
+  assert(malloc_usable_size(p) >= 256);
+*/
+size_t dlmalloc_usable_size(void*);
+
+/*
+  malloc_stats();
+  Prints on stderr the amount of space obtained from the system (both
+  via sbrk and mmap), the maximum amount (which may be more than
+  current if malloc_trim and/or munmap got called), and the current
+  number of bytes allocated via malloc (or realloc, etc) but not yet
+  freed. Note that this is the number of bytes allocated, not the
+  number requested. It will be larger than the number requested
+  because of alignment and bookkeeping overhead. Because it includes
+  alignment wastage as being in use, this figure may be greater than
+  zero even when no user-level chunks are allocated.
+
+  The reported current and maximum system memory can be inaccurate if
+  a program makes other calls to system memory allocation functions
+  (normally sbrk) outside of malloc.
+
+  malloc_stats prints only the most commonly interesting statistics.
+  More information can be obtained by calling mallinfo.
+*/
+void  dlmalloc_stats(void);
+
+#endif /* ONLY_MSPACES */
+
+#if MSPACES
+
+/*
+  mspace is an opaque type representing an independent
+  region of space that supports mspace_malloc, etc.
+*/
+typedef void* mspace;
+
+/*
+  create_mspace creates and returns a new independent space with the
+  given initial capacity, or, if 0, the default granularity size.  It
+  returns null if there is no system memory available to create the
+  space.  If argument locked is non-zero, the space uses a separate
+  lock to control access. The capacity of the space will grow
+  dynamically as needed to service mspace_malloc requests.  You can
+  control the sizes of incremental increases of this space by
+  compiling with a different DEFAULT_GRANULARITY or dynamically
+  setting with mallopt(M_GRANULARITY, value).
+*/
+mspace create_mspace(size_t capacity, int locked);
+
+/*
+  destroy_mspace destroys the given space, and attempts to return all
+  of its memory back to the system, returning the total number of
+  bytes freed. After destruction, the results of access to all memory
+  used by the space become undefined.
+*/
+size_t destroy_mspace(mspace msp);
+
+/*
+  create_mspace_with_base uses the memory supplied as the initial base
+  of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
+  space is used for bookkeeping, so the capacity must be at least this
+  large. (Otherwise 0 is returned.) When this initial space is
+  exhausted, additional memory will be obtained from the system.
+  Destroying this space will deallocate all additionally allocated
+  space (if possible) but not the initial base.
+*/
+mspace create_mspace_with_base(void* base, size_t capacity, int locked);
+
+/*
+  mspace_malloc behaves as malloc, but operates within
+  the given space.
+*/
+void* mspace_malloc(mspace msp, size_t bytes);
+
+/*
+  mspace_free behaves as free, but operates within
+  the given space.
+
+  If compiled with FOOTERS==1, mspace_free is not actually needed.
+  free may be called instead of mspace_free because freed chunks from
+  any space are handled by their originating spaces.
+*/
+void mspace_free(mspace msp, void* mem);
+
+/*
+  mspace_realloc behaves as realloc, but operates within
+  the given space.
+
+  If compiled with FOOTERS==1, mspace_realloc is not actually
+  needed.  realloc may be called instead of mspace_realloc because
+  realloced chunks from any space are handled by their originating
+  spaces.
+*/
+void* mspace_realloc(mspace msp, void* mem, size_t newsize);
+
+/*
+  mspace_calloc behaves as calloc, but operates within
+  the given space.
+*/
+void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
+
+/*
+  mspace_memalign behaves as memalign, but operates within
+  the given space.
+*/
+void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
+
+/*
+  mspace_independent_calloc behaves as independent_calloc, but
+  operates within the given space.
+*/
+void** mspace_independent_calloc(mspace msp, size_t n_elements,
+                                 size_t elem_size, void* chunks[]);
+
+/*
+  mspace_independent_comalloc behaves as independent_comalloc, but
+  operates within the given space.
+*/
+void** mspace_independent_comalloc(mspace msp, size_t n_elements,
+                                   size_t sizes[], void* chunks[]);
+
+/*
+  mspace_footprint() returns the number of bytes obtained from the
+  system for this space.
+*/
+size_t mspace_footprint(mspace msp);
+
+/*
+  mspace_max_footprint() returns the peak number of bytes obtained from the
+  system for this space.
+*/
+size_t mspace_max_footprint(mspace msp);
+
+
+#if !NO_MALLINFO
+/*
+  mspace_mallinfo behaves as mallinfo, but reports properties of
+  the given space.
+*/
+struct mallinfo mspace_mallinfo(mspace msp);
+#endif /* NO_MALLINFO */
+
+/*
+  mspace_malloc_stats behaves as malloc_stats, but reports
+  properties of the given space.
+*/
+void mspace_malloc_stats(mspace msp);
+
+/*
+  mspace_trim behaves as malloc_trim, but
+  operates within the given space.
+*/
+int mspace_trim(mspace msp, size_t pad);
+
+/*
+  An alias for mallopt.
+*/
+int mspace_mallopt(int, int);
+
+#endif /* MSPACES */
+
+#ifdef __cplusplus
+};  /* end of extern "C" */
+#endif /* __cplusplus */
+
+/*
+  ========================================================================
+  To make a fully customizable malloc.h header file, cut everything
+  above this line, put into file malloc.h, edit to suit, and #include it
+  on the next line, as well as in programs that use this malloc.
+  ========================================================================
+*/
+
+/* #include "malloc.h" */
+
+/*------------------------------ internal #includes ---------------------- */
+
+#ifdef _MSC_VER
+#pragma warning( disable : 4146 ) /* no "unsigned" warnings */
+#endif /* _MSC_VER */
+
+#include <stdio.h>       /* for printing in malloc_stats */
+
+#ifndef LACKS_ERRNO_H
+#include <errno.h>       /* for MALLOC_FAILURE_ACTION */
+#endif /* LACKS_ERRNO_H */
+#if FOOTERS
+#include <time.h>        /* for magic initialization */
+#endif /* FOOTERS */
+#ifndef LACKS_STDLIB_H
+#include <stdlib.h>      /* for abort() */
+#endif /* LACKS_STDLIB_H */
+#ifdef DEBUG
+#if ABORT_ON_ASSERT_FAILURE
+#define assert(x) if(!(x)) ABORT
+#else /* ABORT_ON_ASSERT_FAILURE */
+#include <assert.h>
+#endif /* ABORT_ON_ASSERT_FAILURE */
+#else  /* DEBUG */
+#define assert(x)
+#endif /* DEBUG */
+#ifndef LACKS_STRING_H
+#include <string.h>      /* for memset etc */
+#endif  /* LACKS_STRING_H */
+#if USE_BUILTIN_FFS
+#ifndef LACKS_STRINGS_H
+#include <strings.h>     /* for ffs */
+#endif /* LACKS_STRINGS_H */
+#endif /* USE_BUILTIN_FFS */
+#if HAVE_MMAP
+#ifndef LACKS_SYS_MMAN_H
+#include <sys/mman.h>    /* for mmap */
+#endif /* LACKS_SYS_MMAN_H */
+#ifndef LACKS_FCNTL_H
+#include <fcntl.h>
+#endif /* LACKS_FCNTL_H */
+#endif /* HAVE_MMAP */
+#if HAVE_MORECORE
+#ifndef LACKS_UNISTD_H
+#include <unistd.h>     /* for sbrk */
+#else /* LACKS_UNISTD_H */
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
+extern void*     sbrk(ptrdiff_t);
+#endif /* FreeBSD etc */
+#endif /* LACKS_UNISTD_H */
+#endif /* HAVE_MMAP */
+
+#ifndef WIN32
+#ifndef malloc_getpagesize
+#  ifdef _SC_PAGESIZE         /* some SVR4 systems omit an underscore */
+#    ifndef _SC_PAGE_SIZE
+#      define _SC_PAGE_SIZE _SC_PAGESIZE
+#    endif
+#  endif
+#  ifdef _SC_PAGE_SIZE
+#    define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
+#  else
+#    if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
+       extern size_t getpagesize();
+#      define malloc_getpagesize getpagesize()
+#    else
+#      ifdef WIN32 /* use supplied emulation of getpagesize */
+#        define malloc_getpagesize getpagesize()
+#      else
+#        ifndef LACKS_SYS_PARAM_H
+#          include <sys/param.h>
+#        endif
+#        ifdef EXEC_PAGESIZE
+#          define malloc_getpagesize EXEC_PAGESIZE
+#        else
+#          ifdef NBPG
+#            ifndef CLSIZE
+#              define malloc_getpagesize NBPG
+#            else
+#              define malloc_getpagesize (NBPG * CLSIZE)
+#            endif
+#          else
+#            ifdef NBPC
+#              define malloc_getpagesize NBPC
+#            else
+#              ifdef PAGESIZE
+#                define malloc_getpagesize PAGESIZE
+#              else /* just guess */
+#                define malloc_getpagesize ((size_t)4096U)
+#              endif
+#            endif
+#          endif
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+#endif
+
+/* ------------------- size_t and alignment properties -------------------- */
+
+/* The byte and bit size of a size_t */
+#define SIZE_T_SIZE         (sizeof(size_t))
+#define SIZE_T_BITSIZE      (sizeof(size_t) << 3)
+
+/* Some constants coerced to size_t */
+/* Annoying but necessary to avoid errors on some plaftorms */
+#define SIZE_T_ZERO         ((size_t)0)
+#define SIZE_T_ONE          ((size_t)1)
+#define SIZE_T_TWO          ((size_t)2)
+#define TWO_SIZE_T_SIZES    (SIZE_T_SIZE<<1)
+#define FOUR_SIZE_T_SIZES   (SIZE_T_SIZE<<2)
+#define SIX_SIZE_T_SIZES    (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)
+#define HALF_MAX_SIZE_T     (MAX_SIZE_T / 2U)
+
+/* The bit mask value corresponding to MALLOC_ALIGNMENT */
+#define CHUNK_ALIGN_MASK    (MALLOC_ALIGNMENT - SIZE_T_ONE)
+
+/* True if address a has acceptable alignment */
+#define is_aligned(A)       (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0)
+
+/* the number of bytes to offset an address to align it */
+#define align_offset(A)\
+ ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
+  ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))
+
+/* -------------------------- MMAP preliminaries ------------------------- */
+
+/*
+   If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and
+   checks to fail so compiler optimizer can delete code rather than
+   using so many "#if"s.
+*/
+
+
+/* MORECORE and MMAP must return MFAIL on failure */
+#define MFAIL                ((void*)(MAX_SIZE_T))
+#define CMFAIL               ((char*)(MFAIL)) /* defined for convenience */
+
+#if !HAVE_MMAP
+#define IS_MMAPPED_BIT       (SIZE_T_ZERO)
+#define USE_MMAP_BIT         (SIZE_T_ZERO)
+#define CALL_MMAP(s)         MFAIL
+#define CALL_MUNMAP(a, s)    (-1)
+#define DIRECT_MMAP(s)       MFAIL
+
+#else /* HAVE_MMAP */
+#define IS_MMAPPED_BIT       (SIZE_T_ONE)
+#define USE_MMAP_BIT         (SIZE_T_ONE)
+
+#if !defined(WIN32) && !defined (__OS2__)
+#define CALL_MUNMAP(a, s)    munmap((a), (s))
+#define MMAP_PROT            (PROT_READ|PROT_WRITE)
+#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
+#define MAP_ANONYMOUS        MAP_ANON
+#endif /* MAP_ANON */
+#ifdef MAP_ANONYMOUS
+#define MMAP_FLAGS           (MAP_PRIVATE|MAP_ANONYMOUS)
+#define CALL_MMAP(s)         mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0)
+#else /* MAP_ANONYMOUS */
+/*
+   Nearly all versions of mmap support MAP_ANONYMOUS, so the following
+   is unlikely to be needed, but is supplied just in case.
+*/
+#define MMAP_FLAGS           (MAP_PRIVATE)
+static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
+#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \
+           (dev_zero_fd = open("/dev/zero", O_RDWR), \
+            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \
+            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0))
+#endif /* MAP_ANONYMOUS */
+
+#define DIRECT_MMAP(s)       CALL_MMAP(s)
+
+#elif defined(__OS2__)
+
+/* OS/2 MMAP via DosAllocMem */
+static void* os2mmap(size_t size) {
+  void* ptr;
+  if (DosAllocMem(&ptr, size, OBJ_ANY|PAG_COMMIT|PAG_READ|PAG_WRITE) &&
+      DosAllocMem(&ptr, size, PAG_COMMIT|PAG_READ|PAG_WRITE))
+    return MFAIL;
+  return ptr;
+}
+
+#define os2direct_mmap(n)     os2mmap(n)
+
+/* This function supports releasing coalesed segments */
+static int os2munmap(void* ptr, size_t size) {
+  while (size) {
+    ULONG ulSize = size;
+    ULONG ulFlags = 0;
+    if (DosQueryMem(ptr, &ulSize, &ulFlags) != 0)
+      return -1;
+    if ((ulFlags & PAG_BASE) == 0 ||(ulFlags & PAG_COMMIT) == 0 ||
+        ulSize > size)
+      return -1;
+    if (DosFreeMem(ptr) != 0)
+      return -1;
+    ptr = ( void * ) ( ( char * ) ptr + ulSize );
+    size -= ulSize;
+  }
+  return 0;
+}
+
+#define CALL_MMAP(s)         os2mmap(s)
+#define CALL_MUNMAP(a, s)    os2munmap((a), (s))
+#define DIRECT_MMAP(s)       os2direct_mmap(s)
+
+#else /* WIN32 */
+
+/* Win32 MMAP via VirtualAlloc */
+static void* win32mmap(size_t size) {
+  void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+  return (ptr != 0)? ptr: MFAIL;
+}
+
+/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
+static void* win32direct_mmap(size_t size) {
+  void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
+                           PAGE_EXECUTE_READWRITE);
+  return (ptr != 0)? ptr: MFAIL;
+}
+
+/* This function supports releasing coalesed segments */
+static int win32munmap(void* ptr, size_t size) {
+  MEMORY_BASIC_INFORMATION minfo;
+  char* cptr = ptr;
+  while (size) {
+    if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0)
+      return -1;
+    if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr ||
+        minfo.State != MEM_COMMIT || minfo.RegionSize > size)
+      return -1;
+    if (VirtualFree(cptr, 0, MEM_RELEASE) == 0)
+      return -1;
+    cptr += minfo.RegionSize;
+    size -= minfo.RegionSize;
+  }
+  return 0;
+}
+
+#define CALL_MMAP(s)         win32mmap(s)
+#define CALL_MUNMAP(a, s)    win32munmap((a), (s))
+#define DIRECT_MMAP(s)       win32direct_mmap(s)
+#endif /* WIN32 */
+#endif /* HAVE_MMAP */
+
+#if HAVE_MMAP && HAVE_MREMAP
+#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv))
+#else  /* HAVE_MMAP && HAVE_MREMAP */
+#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL
+#endif /* HAVE_MMAP && HAVE_MREMAP */
+
+#if HAVE_MORECORE
+#define CALL_MORECORE(S)     MORECORE(S)
+#else  /* HAVE_MORECORE */
+#define CALL_MORECORE(S)     MFAIL
+#endif /* HAVE_MORECORE */
+
+/* mstate bit set if continguous morecore disabled or failed */
+#define USE_NONCONTIGUOUS_BIT (4U)
+
+/* segment bit set in create_mspace_with_base */
+#define EXTERN_BIT            (8U)
+
+
+/* --------------------------- Lock preliminaries ------------------------ */
+
+#if USE_LOCKS
+
+/*
+  When locks are defined, there are up to two global locks:
+
+  * If HAVE_MORECORE, morecore_mutex protects sequences of calls to
+    MORECORE.  In many cases sys_alloc requires two calls, that should
+    not be interleaved with calls by other threads.  This does not
+    protect against direct calls to MORECORE by other threads not
+    using this lock, so there is still code to cope the best we can on
+    interference.
+
+  * magic_init_mutex ensures that mparams.magic and other
+    unique mparams values are initialized only once.
+*/
+
+#if !defined(WIN32) && !defined(__OS2__)
+/* By default use posix locks */
+#include <pthread.h>
+#define MLOCK_T pthread_mutex_t
+#define INITIAL_LOCK(l)      pthread_mutex_init(l, NULL)
+#define ACQUIRE_LOCK(l)      pthread_mutex_lock(l)
+#define RELEASE_LOCK(l)      pthread_mutex_unlock(l)
+
+#if HAVE_MORECORE
+static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif /* HAVE_MORECORE */
+
+static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+#elif defined(__OS2__)
+#define MLOCK_T HMTX
+#define INITIAL_LOCK(l)      DosCreateMutexSem(0, l, 0, FALSE)
+#define ACQUIRE_LOCK(l)      DosRequestMutexSem(*l, SEM_INDEFINITE_WAIT)
+#define RELEASE_LOCK(l)      DosReleaseMutexSem(*l)
+#if HAVE_MORECORE
+static MLOCK_T morecore_mutex;
+#endif /* HAVE_MORECORE */
+static MLOCK_T magic_init_mutex;
+
+#else /* WIN32 */
+/*
+   Because lock-protected regions have bounded times, and there
+   are no recursive lock calls, we can use simple spinlocks.
+*/
+
+#define MLOCK_T long
+static int win32_acquire_lock (MLOCK_T *sl) {
+  for (;;) {
+#ifdef InterlockedCompareExchangePointer
+    if (!InterlockedCompareExchange(sl, 1, 0))
+      return 0;
+#else  /* Use older void* version */
+    if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0))
+      return 0;
+#endif /* InterlockedCompareExchangePointer */
+    Sleep (0);
+  }
+}
+
+static void win32_release_lock (MLOCK_T *sl) {
+  InterlockedExchange (sl, 0);
+}
+
+#define INITIAL_LOCK(l)      *(l)=0
+#define ACQUIRE_LOCK(l)      win32_acquire_lock(l)
+#define RELEASE_LOCK(l)      win32_release_lock(l)
+#if HAVE_MORECORE
+static MLOCK_T morecore_mutex;
+#endif /* HAVE_MORECORE */
+static MLOCK_T magic_init_mutex;
+#endif /* WIN32 */
+
+#define USE_LOCK_BIT               (2U)
+#else  /* USE_LOCKS */
+#define USE_LOCK_BIT               (0U)
+#define INITIAL_LOCK(l)
+#endif /* USE_LOCKS */
+
+#if USE_LOCKS && HAVE_MORECORE
+#define ACQUIRE_MORECORE_LOCK()    ACQUIRE_LOCK(&morecore_mutex);
+#define RELEASE_MORECORE_LOCK()    RELEASE_LOCK(&morecore_mutex);
+#else /* USE_LOCKS && HAVE_MORECORE */
+#define ACQUIRE_MORECORE_LOCK()
+#define RELEASE_MORECORE_LOCK()
+#endif /* USE_LOCKS && HAVE_MORECORE */
+
+#if USE_LOCKS
+#define ACQUIRE_MAGIC_INIT_LOCK()  ACQUIRE_LOCK(&magic_init_mutex);
+#define RELEASE_MAGIC_INIT_LOCK()  RELEASE_LOCK(&magic_init_mutex);
+#else  /* USE_LOCKS */
+#define ACQUIRE_MAGIC_INIT_LOCK()
+#define RELEASE_MAGIC_INIT_LOCK()
+#endif /* USE_LOCKS */
+
+
+/* -----------------------  Chunk representations ------------------------ */
+
+/*
+  (The following includes lightly edited explanations by Colin Plumb.)
+
+  The malloc_chunk declaration below is misleading (but accurate and
+  necessary).  It declares a "view" into memory allowing access to
+  necessary fields at known offsets from a given base.
+
+  Chunks of memory are maintained using a `boundary tag' method as
+  originally described by Knuth.  (See the paper by Paul Wilson
+  ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such
+  techniques.)  Sizes of free chunks are stored both in the front of
+  each chunk and at the end.  This makes consolidating fragmented
+  chunks into bigger chunks fast.  The head fields also hold bits
+  representing whether chunks are free or in use.
+
+  Here are some pictures to make it clearer.  They are "exploded" to
+  show that the state of a chunk can be thought of as extending from
+  the high 31 bits of the head field of its header through the
+  prev_foot and PINUSE_BIT bit of the following chunk header.
+
+  A chunk that's in use looks like:
+
+   chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+           | Size of previous chunk (if P = 1)                             |
+           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
+         | Size of this chunk                                         1| +-+
+   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         |                                                               |
+         +-                                                             -+
+         |                                                               |
+         +-                                                             -+
+         |                                                               :
+         +-      size - sizeof(size_t) available payload bytes          -+
+         :                                                               |
+ chunk-> +-                                                             -+
+         |                                                               |
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1|
+       | Size of next chunk (may or may not be in use)               | +-+
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+    And if it's free, it looks like this:
+
+   chunk-> +-                                                             -+
+           | User payload (must be in use, or we would have merged!)       |
+           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
+         | Size of this chunk                                         0| +-+
+   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         | Next pointer                                                  |
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         | Prev pointer                                                  |
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         |                                                               :
+         +-      size - sizeof(struct chunk) unused bytes               -+
+         :                                                               |
+ chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         | Size of this chunk                                            |
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0|
+       | Size of next chunk (must be in use, or we would have merged)| +-+
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                                                               :
+       +- User payload                                                -+
+       :                                                               |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+                                                                     |0|
+                                                                     +-+
+  Note that since we always merge adjacent free chunks, the chunks
+  adjacent to a free chunk must be in use.
+
+  Given a pointer to a chunk (which can be derived trivially from the
+  payload pointer) we can, in O(1) time, find out whether the adjacent
+  chunks are free, and if so, unlink them from the lists that they
+  are on and merge them with the current chunk.
+
+  Chunks always begin on even word boundaries, so the mem portion
+  (which is returned to the user) is also on an even word boundary, and
+  thus at least double-word aligned.
+
+  The P (PINUSE_BIT) bit, stored in the unused low-order bit of the
+  chunk size (which is always a multiple of two words), is an in-use
+  bit for the *previous* chunk.  If that bit is *clear*, then the
+  word before the current chunk size contains the previous chunk
+  size, and can be used to find the front of the previous chunk.
+  The very first chunk allocated always has this bit set, preventing
+  access to non-existent (or non-owned) memory. If pinuse is set for
+  any given chunk, then you CANNOT determine the size of the
+  previous chunk, and might even get a memory addressing fault when
+  trying to do so.
+
+  The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of
+  the chunk size redundantly records whether the current chunk is
+  inuse. This redundancy enables usage checks within free and realloc,
+  and reduces indirection when freeing and consolidating chunks.
+
+  Each freshly allocated chunk must have both cinuse and pinuse set.
+  That is, each allocated chunk borders either a previously allocated
+  and still in-use chunk, or the base of its memory arena. This is
+  ensured by making all allocations from the the `lowest' part of any
+  found chunk.  Further, no free chunk physically borders another one,
+  so each free chunk is known to be preceded and followed by either
+  inuse chunks or the ends of memory.
+
+  Note that the `foot' of the current chunk is actually represented
+  as the prev_foot of the NEXT chunk. This makes it easier to
+  deal with alignments etc but can be very confusing when trying
+  to extend or adapt this code.
+
+  The exceptions to all this are
+
+     1. The special chunk `top' is the top-most available chunk (i.e.,
+        the one bordering the end of available memory). It is treated
+        specially.  Top is never included in any bin, is used only if
+        no other chunk is available, and is released back to the
+        system if it is very large (see M_TRIM_THRESHOLD).  In effect,
+        the top chunk is treated as larger (and thus less well
+        fitting) than any other available chunk.  The top chunk
+        doesn't update its trailing size field since there is no next
+        contiguous chunk that would have to index off it. However,
+        space is still allocated for it (TOP_FOOT_SIZE) to enable
+        separation or merging when space is extended.
+
+     3. Chunks allocated via mmap, which have the lowest-order bit
+        (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set
+        PINUSE_BIT in their head fields.  Because they are allocated
+        one-by-one, each must carry its own prev_foot field, which is
+        also used to hold the offset this chunk has within its mmapped
+        region, which is needed to preserve alignment. Each mmapped
+        chunk is trailed by the first two fields of a fake next-chunk
+        for sake of usage checks.
+
+*/
+
+struct malloc_chunk {
+  size_t               prev_foot;  /* Size of previous chunk (if free).  */
+  size_t               head;       /* Size and inuse bits. */
+  struct malloc_chunk* fd;         /* double links -- used only if free. */
+  struct malloc_chunk* bk;
+};
+
+typedef struct malloc_chunk  mchunk;
+typedef struct malloc_chunk* mchunkptr;
+typedef struct malloc_chunk* sbinptr;  /* The type of bins of chunks */
+typedef unsigned int bindex_t;         /* Described below */
+typedef unsigned int binmap_t;         /* Described below */
+typedef unsigned int flag_t;           /* The type of various bit flag sets */
+
+/* ------------------- Chunks sizes and alignments ----------------------- */
+
+#define MCHUNK_SIZE         (sizeof(mchunk))
+
+#if FOOTERS
+#define CHUNK_OVERHEAD      (TWO_SIZE_T_SIZES)
+#else /* FOOTERS */
+#define CHUNK_OVERHEAD      (SIZE_T_SIZE)
+#endif /* FOOTERS */
+
+/* MMapped chunks need a second word of overhead ... */
+#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES)
+/* ... and additional padding for fake next-chunk at foot */
+#define MMAP_FOOT_PAD       (FOUR_SIZE_T_SIZES)
+
+/* The smallest size we can malloc is an aligned minimal chunk */
+#define MIN_CHUNK_SIZE\
+  ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
+
+/* conversion from malloc headers to user pointers, and back */
+#define chunk2mem(p)        ((void*)((char*)(p)       + TWO_SIZE_T_SIZES))
+#define mem2chunk(mem)      ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES))
+/* chunk associated with aligned address A */
+#define align_as_chunk(A)   (mchunkptr)((A) + align_offset(chunk2mem(A)))
+
+/* Bounds on request (not chunk) sizes. */
+#define MAX_REQUEST         ((-MIN_CHUNK_SIZE) << 2)
+#define MIN_REQUEST         (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE)
+
+/* pad request bytes into a usable size */
+#define pad_request(req) \
+   (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
+
+/* pad request, checking for minimum (but not maximum) */
+#define request2size(req) \
+  (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))
+
+
+/* ------------------ Operations on head and foot fields ----------------- */
+
+/*
+  The head field of a chunk is or'ed with PINUSE_BIT when previous
+  adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in
+  use. If the chunk was obtained with mmap, the prev_foot field has
+  IS_MMAPPED_BIT set, otherwise holding the offset of the base of the
+  mmapped region to the base of the chunk.
+*/
+
+#define PINUSE_BIT          (SIZE_T_ONE)
+#define CINUSE_BIT          (SIZE_T_TWO)
+#define INUSE_BITS          (PINUSE_BIT|CINUSE_BIT)
+
+/* Head value for fenceposts */
+#define FENCEPOST_HEAD      (INUSE_BITS|SIZE_T_SIZE)
+
+/* extraction of fields from head words */
+#define cinuse(p)           ((p)->head & CINUSE_BIT)
+#define pinuse(p)           ((p)->head & PINUSE_BIT)
+#define chunksize(p)        ((p)->head & ~(INUSE_BITS))
+
+#define clear_pinuse(p)     ((p)->head &= ~PINUSE_BIT)
+#define clear_cinuse(p)     ((p)->head &= ~CINUSE_BIT)
+
+/* Treat space at ptr +/- offset as a chunk */
+#define chunk_plus_offset(p, s)  ((mchunkptr)(((char*)(p)) + (s)))
+#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s)))
+
+/* Ptr to next or previous physical malloc_chunk. */
+#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS)))
+#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) ))
+
+/* extract next chunk's pinuse bit */
+#define next_pinuse(p)  ((next_chunk(p)->head) & PINUSE_BIT)
+
+/* Get/set size at footer */
+#define get_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot)
+#define set_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s))
+
+/* Set size, pinuse bit, and foot */
+#define set_size_and_pinuse_of_free_chunk(p, s)\
+  ((p)->head = (s|PINUSE_BIT), set_foot(p, s))
+
+/* Set size, pinuse bit, foot, and clear next pinuse */
+#define set_free_with_pinuse(p, s, n)\
+  (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s))
+
+#define is_mmapped(p)\
+  (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT))
+
+/* Get the internal overhead associated with chunk p */
+#define overhead_for(p)\
+ (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD)
+
+/* Return true if malloced space is not necessarily cleared */
+#if MMAP_CLEARS
+#define calloc_must_clear(p) (!is_mmapped(p))
+#else /* MMAP_CLEARS */
+#define calloc_must_clear(p) (1)
+#endif /* MMAP_CLEARS */
+
+/* ---------------------- Overlaid data structures ----------------------- */
+
+/*
+  When chunks are not in use, they are treated as nodes of either
+  lists or trees.
+
+  "Small"  chunks are stored in circular doubly-linked lists, and look
+  like this:
+
+    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Size of previous chunk                            |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    `head:' |             Size of chunk, in bytes                         |P|
+      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Forward pointer to next chunk in list             |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Back pointer to previous chunk in list            |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Unused space (may be 0 bytes long)                .
+            .                                                               .
+            .                                                               |
+nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    `foot:' |             Size of chunk, in bytes                           |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+  Larger chunks are kept in a form of bitwise digital trees (aka
+  tries) keyed on chunksizes.  Because malloc_tree_chunks are only for
+  free chunks greater than 256 bytes, their size doesn't impose any
+  constraints on user chunk sizes.  Each node looks like:
+
+    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Size of previous chunk                            |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    `head:' |             Size of chunk, in bytes                         |P|
+      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Forward pointer to next chunk of same size        |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Back pointer to previous chunk of same size       |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Pointer to left child (child[0])                  |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Pointer to right child (child[1])                 |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Pointer to parent                                 |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             bin index of this chunk                           |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Unused space                                      .
+            .                                                               |
+nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    `foot:' |             Size of chunk, in bytes                           |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+  Each tree holding treenodes is a tree of unique chunk sizes.  Chunks
+  of the same size are arranged in a circularly-linked list, with only
+  the oldest chunk (the next to be used, in our FIFO ordering)
+  actually in the tree.  (Tree members are distinguished by a non-null
+  parent pointer.)  If a chunk with the same size an an existing node
+  is inserted, it is linked off the existing node using pointers that
+  work in the same way as fd/bk pointers of small chunks.
+
+  Each tree contains a power of 2 sized range of chunk sizes (the
+  smallest is 0x100 <= x < 0x180), which is is divided in half at each
+  tree level, with the chunks in the smaller half of the range (0x100
+  <= x < 0x140 for the top nose) in the left subtree and the larger
+  half (0x140 <= x < 0x180) in the right subtree.  This is, of course,
+  done by inspecting individual bits.
+
+  Using these rules, each node's left subtree contains all smaller
+  sizes than its right subtree.  However, the node at the root of each
+  subtree has no particular ordering relationship to either.  (The
+  dividing line between the subtree sizes is based on trie relation.)
+  If we remove the last chunk of a given size from the interior of the
+  tree, we need to replace it with a leaf node.  The tree ordering
+  rules permit a node to be replaced by any leaf below it.
+
+  The smallest chunk in a tree (a common operation in a best-fit
+  allocator) can be found by walking a path to the leftmost leaf in
+  the tree.  Unlike a usual binary tree, where we follow left child
+  pointers until we reach a null, here we follow the right child
+  pointer any time the left one is null, until we reach a leaf with
+  both child pointers null. The smallest chunk in the tree will be
+  somewhere along that path.
+
+  The worst case number of steps to add, find, or remove a node is
+  bounded by the number of bits differentiating chunks within
+  bins. Under current bin calculations, this ranges from 6 up to 21
+  (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case
+  is of course much better.
+*/
+
+struct malloc_tree_chunk {
+  /* The first four fields must be compatible with malloc_chunk */
+  size_t                    prev_foot;
+  size_t                    head;
+  struct malloc_tree_chunk* fd;
+  struct malloc_tree_chunk* bk;
+
+  struct malloc_tree_chunk* child[2];
+  struct malloc_tree_chunk* parent;
+  bindex_t                  index;
+};
+
+typedef struct malloc_tree_chunk  tchunk;
+typedef struct malloc_tree_chunk* tchunkptr;
+typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */
+
+/* A little helper macro for trees */
+#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1])
+
+/* ----------------------------- Segments -------------------------------- */
+
+/*
+  Each malloc space may include non-contiguous segments, held in a
+  list headed by an embedded malloc_segment record representing the
+  top-most space. Segments also include flags holding properties of
+  the space. Large chunks that are directly allocated by mmap are not
+  included in this list. They are instead independently created and
+  destroyed without otherwise keeping track of them.
+
+  Segment management mainly comes into play for spaces allocated by
+  MMAP.  Any call to MMAP might or might not return memory that is
+  adjacent to an existing segment.  MORECORE normally contiguously
+  extends the current space, so this space is almost always adjacent,
+  which is simpler and faster to deal with. (This is why MORECORE is
+  used preferentially to MMAP when both are available -- see
+  sys_alloc.)  When allocating using MMAP, we don't use any of the
+  hinting mechanisms (inconsistently) supported in various
+  implementations of unix mmap, or distinguish reserving from
+  committing memory. Instead, we just ask for space, and exploit
+  contiguity when we get it.  It is probably possible to do
+  better than this on some systems, but no general scheme seems
+  to be significantly better.
+
+  Management entails a simpler variant of the consolidation scheme
+  used for chunks to reduce fragmentation -- new adjacent memory is
+  normally prepended or appended to an existing segment. However,
+  there are limitations compared to chunk consolidation that mostly
+  reflect the fact that segment processing is relatively infrequent
+  (occurring only when getting memory from system) and that we
+  don't expect to have huge numbers of segments:
+
+  * Segments are not indexed, so traversal requires linear scans.  (It
+    would be possible to index these, but is not worth the extra
+    overhead and complexity for most programs on most platforms.)
+  * New segments are only appended to old ones when holding top-most
+    memory; if they cannot be prepended to others, they are held in
+    different segments.
+
+  Except for the top-most segment of an mstate, each segment record
+  is kept at the tail of its segment. Segments are added by pushing
+  segment records onto the list headed by &mstate.seg for the
+  containing mstate.
+
+  Segment flags control allocation/merge/deallocation policies:
+  * If EXTERN_BIT set, then we did not allocate this segment,
+    and so should not try to deallocate or merge with others.
+    (This currently holds only for the initial segment passed
+    into create_mspace_with_base.)
+  * If IS_MMAPPED_BIT set, the segment may be merged with
+    other surrounding mmapped segments and trimmed/de-allocated
+    using munmap.
+  * If neither bit is set, then the segment was obtained using
+    MORECORE so can be merged with surrounding MORECORE'd segments
+    and deallocated/trimmed using MORECORE with negative arguments.
+*/
+
+struct malloc_segment {
+  char*        base;             /* base address */
+  size_t       size;             /* allocated size */
+  struct malloc_segment* next;   /* ptr to next segment */
+#if FFI_MMAP_EXEC_WRIT
+  /* The mmap magic is supposed to store the address of the executable
+     segment at the very end of the requested block.  */
+
+# define mmap_exec_offset(b,s) (*(ptrdiff_t*)((b)+(s)-sizeof(ptrdiff_t)))
+
+  /* We can only merge segments if their corresponding executable
+     segments are at identical offsets.  */
+# define check_segment_merge(S,b,s) \
+  (mmap_exec_offset((b),(s)) == (S)->exec_offset)
+
+# define add_segment_exec_offset(p,S) ((char*)(p) + (S)->exec_offset)
+# define sub_segment_exec_offset(p,S) ((char*)(p) - (S)->exec_offset)
+
+  /* The removal of sflags only works with HAVE_MORECORE == 0.  */
+
+# define get_segment_flags(S)   (IS_MMAPPED_BIT)
+# define set_segment_flags(S,v) \
+  (((v) != IS_MMAPPED_BIT) ? (ABORT, (v)) :				\
+   (((S)->exec_offset =							\
+     mmap_exec_offset((S)->base, (S)->size)),				\
+    (mmap_exec_offset((S)->base + (S)->exec_offset, (S)->size) !=	\
+     (S)->exec_offset) ? (ABORT, (v)) :					\
+   (mmap_exec_offset((S)->base, (S)->size) = 0), (v)))
+
+  /* We use an offset here, instead of a pointer, because then, when
+     base changes, we don't have to modify this.  On architectures
+     with segmented addresses, this might not work.  */
+  ptrdiff_t    exec_offset;
+#else
+
+# define get_segment_flags(S)   ((S)->sflags)
+# define set_segment_flags(S,v) ((S)->sflags = (v))
+# define check_segment_merge(S,b,s) (1)
+
+  flag_t       sflags;           /* mmap and extern flag */
+#endif
+};
+
+#define is_mmapped_segment(S)  (get_segment_flags(S) & IS_MMAPPED_BIT)
+#define is_extern_segment(S)   (get_segment_flags(S) & EXTERN_BIT)
+
+typedef struct malloc_segment  msegment;
+typedef struct malloc_segment* msegmentptr;
+
+/* ---------------------------- malloc_state ----------------------------- */
+
+/*
+   A malloc_state holds all of the bookkeeping for a space.
+   The main fields are:
+
+  Top
+    The topmost chunk of the currently active segment. Its size is
+    cached in topsize.  The actual size of topmost space is
+    topsize+TOP_FOOT_SIZE, which includes space reserved for adding
+    fenceposts and segment records if necessary when getting more
+    space from the system.  The size at which to autotrim top is
+    cached from mparams in trim_check, except that it is disabled if
+    an autotrim fails.
+
+  Designated victim (dv)
+    This is the preferred chunk for servicing small requests that
+    don't have exact fits.  It is normally the chunk split off most
+    recently to service another small request.  Its size is cached in
+    dvsize. The link fields of this chunk are not maintained since it
+    is not kept in a bin.
+
+  SmallBins
+    An array of bin headers for free chunks.  These bins hold chunks
+    with sizes less than MIN_LARGE_SIZE bytes. Each bin contains
+    chunks of all the same size, spaced 8 bytes apart.  To simplify
+    use in double-linked lists, each bin header acts as a malloc_chunk
+    pointing to the real first node, if it exists (else pointing to
+    itself).  This avoids special-casing for headers.  But to avoid
+    waste, we allocate only the fd/bk pointers of bins, and then use
+    repositioning tricks to treat these as the fields of a chunk.
+
+  TreeBins
+    Treebins are pointers to the roots of trees holding a range of
+    sizes. There are 2 equally spaced treebins for each power of two
+    from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything
+    larger.
+
+  Bin maps
+    There is one bit map for small bins ("smallmap") and one for
+    treebins ("treemap).  Each bin sets its bit when non-empty, and
+    clears the bit when empty.  Bit operations are then used to avoid
+    bin-by-bin searching -- nearly all "search" is done without ever
+    looking at bins that won't be selected.  The bit maps
+    conservatively use 32 bits per map word, even if on 64bit system.
+    For a good description of some of the bit-based techniques used
+    here, see Henry S. Warren Jr's book "Hacker's Delight" (and
+    supplement at http://hackersdelight.org/). Many of these are
+    intended to reduce the branchiness of paths through malloc etc, as
+    well as to reduce the number of memory locations read or written.
+
+  Segments
+    A list of segments headed by an embedded malloc_segment record
+    representing the initial space.
+
+  Address check support
+    The least_addr field is the least address ever obtained from
+    MORECORE or MMAP. Attempted frees and reallocs of any address less
+    than this are trapped (unless INSECURE is defined).
+
+  Magic tag
+    A cross-check field that should always hold same value as mparams.magic.
+
+  Flags
+    Bits recording whether to use MMAP, locks, or contiguous MORECORE
+
+  Statistics
+    Each space keeps track of current and maximum system memory
+    obtained via MORECORE or MMAP.
+
+  Locking
+    If USE_LOCKS is defined, the "mutex" lock is acquired and released
+    around every public call using this mspace.
+*/
+
+/* Bin types, widths and sizes */
+#define NSMALLBINS        (32U)
+#define NTREEBINS         (32U)
+#define SMALLBIN_SHIFT    (3U)
+#define SMALLBIN_WIDTH    (SIZE_T_ONE << SMALLBIN_SHIFT)
+#define TREEBIN_SHIFT     (8U)
+#define MIN_LARGE_SIZE    (SIZE_T_ONE << TREEBIN_SHIFT)
+#define MAX_SMALL_SIZE    (MIN_LARGE_SIZE - SIZE_T_ONE)
+#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD)
+
+struct malloc_state {
+  binmap_t   smallmap;
+  binmap_t   treemap;
+  size_t     dvsize;
+  size_t     topsize;
+  char*      least_addr;
+  mchunkptr  dv;
+  mchunkptr  top;
+  size_t     trim_check;
+  size_t     magic;
+  mchunkptr  smallbins[(NSMALLBINS+1)*2];
+  tbinptr    treebins[NTREEBINS];
+  size_t     footprint;
+  size_t     max_footprint;
+  flag_t     mflags;
+#if USE_LOCKS
+  MLOCK_T    mutex;     /* locate lock among fields that rarely change */
+#endif /* USE_LOCKS */
+  msegment   seg;
+};
+
+typedef struct malloc_state*    mstate;
+
+/* ------------- Global malloc_state and malloc_params ------------------- */
+
+/*
+  malloc_params holds global properties, including those that can be
+  dynamically set using mallopt. There is a single instance, mparams,
+  initialized in init_mparams.
+*/
+
+struct malloc_params {
+  size_t magic;
+  size_t page_size;
+  size_t granularity;
+  size_t mmap_threshold;
+  size_t trim_threshold;
+  flag_t default_mflags;
+};
+
+static struct malloc_params mparams;
+
+/* The global malloc_state used for all non-"mspace" calls */
+static struct malloc_state _gm_;
+#define gm                 (&_gm_)
+#define is_global(M)       ((M) == &_gm_)
+#define is_initialized(M)  ((M)->top != 0)
+
+/* -------------------------- system alloc setup ------------------------- */
+
+/* Operations on mflags */
+
+#define use_lock(M)           ((M)->mflags &   USE_LOCK_BIT)
+#define enable_lock(M)        ((M)->mflags |=  USE_LOCK_BIT)
+#define disable_lock(M)       ((M)->mflags &= ~USE_LOCK_BIT)
+
+#define use_mmap(M)           ((M)->mflags &   USE_MMAP_BIT)
+#define enable_mmap(M)        ((M)->mflags |=  USE_MMAP_BIT)
+#define disable_mmap(M)       ((M)->mflags &= ~USE_MMAP_BIT)
+
+#define use_noncontiguous(M)  ((M)->mflags &   USE_NONCONTIGUOUS_BIT)
+#define disable_contiguous(M) ((M)->mflags |=  USE_NONCONTIGUOUS_BIT)
+
+#define set_lock(M,L)\
+ ((M)->mflags = (L)?\
+  ((M)->mflags | USE_LOCK_BIT) :\
+  ((M)->mflags & ~USE_LOCK_BIT))
+
+/* page-align a size */
+#define page_align(S)\
+ (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE))
+
+/* granularity-align a size */
+#define granularity_align(S)\
+  (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE))
+
+#define is_page_aligned(S)\
+   (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0)
+#define is_granularity_aligned(S)\
+   (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0)
+
+/*  True if segment S holds address A */
+#define segment_holds(S, A)\
+  ((char*)(A) >= S->base && (char*)(A) < S->base + S->size)
+
+/* Return segment holding given address */
+static msegmentptr segment_holding(mstate m, char* addr) {
+  msegmentptr sp = &m->seg;
+  for (;;) {
+    if (addr >= sp->base && addr < sp->base + sp->size)
+      return sp;
+    if ((sp = sp->next) == 0)
+      return 0;
+  }
+}
+
+/* Return true if segment contains a segment link */
+static int has_segment_link(mstate m, msegmentptr ss) {
+  msegmentptr sp = &m->seg;
+  for (;;) {
+    if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size)
+      return 1;
+    if ((sp = sp->next) == 0)
+      return 0;
+  }
+}
+
+#ifndef MORECORE_CANNOT_TRIM
+#define should_trim(M,s)  ((s) > (M)->trim_check)
+#else  /* MORECORE_CANNOT_TRIM */
+#define should_trim(M,s)  (0)
+#endif /* MORECORE_CANNOT_TRIM */
+
+/*
+  TOP_FOOT_SIZE is padding at the end of a segment, including space
+  that may be needed to place segment records and fenceposts when new
+  noncontiguous segments are added.
+*/
+#define TOP_FOOT_SIZE\
+  (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)
+
+
+/* -------------------------------  Hooks -------------------------------- */
+
+/*
+  PREACTION should be defined to return 0 on success, and nonzero on
+  failure. If you are not using locking, you can redefine these to do
+  anything you like.
+*/
+
+#if USE_LOCKS
+
+/* Ensure locks are initialized */
+#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams())
+
+#define PREACTION(M)  ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0)
+#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); }
+#else /* USE_LOCKS */
+
+#ifndef PREACTION
+#define PREACTION(M) (0)
+#endif  /* PREACTION */
+
+#ifndef POSTACTION
+#define POSTACTION(M)
+#endif  /* POSTACTION */
+
+#endif /* USE_LOCKS */
+
+/*
+  CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses.
+  USAGE_ERROR_ACTION is triggered on detected bad frees and
+  reallocs. The argument p is an address that might have triggered the
+  fault. It is ignored by the two predefined actions, but might be
+  useful in custom actions that try to help diagnose errors.
+*/
+
+#if PROCEED_ON_ERROR
+
+/* A count of the number of corruption errors causing resets */
+int malloc_corruption_error_count;
+
+/* default corruption action */
+static void reset_on_error(mstate m);
+
+#define CORRUPTION_ERROR_ACTION(m)  reset_on_error(m)
+#define USAGE_ERROR_ACTION(m, p)
+
+#else /* PROCEED_ON_ERROR */
+
+#ifndef CORRUPTION_ERROR_ACTION
+#define CORRUPTION_ERROR_ACTION(m) ABORT
+#endif /* CORRUPTION_ERROR_ACTION */
+
+#ifndef USAGE_ERROR_ACTION
+#define USAGE_ERROR_ACTION(m,p) ABORT
+#endif /* USAGE_ERROR_ACTION */
+
+#endif /* PROCEED_ON_ERROR */
+
+/* -------------------------- Debugging setup ---------------------------- */
+
+#if ! DEBUG
+
+#define check_free_chunk(M,P)
+#define check_inuse_chunk(M,P)
+#define check_malloced_chunk(M,P,N)
+#define check_mmapped_chunk(M,P)
+#define check_malloc_state(M)
+#define check_top_chunk(M,P)
+
+#else /* DEBUG */
+#define check_free_chunk(M,P)       do_check_free_chunk(M,P)
+#define check_inuse_chunk(M,P)      do_check_inuse_chunk(M,P)
+#define check_top_chunk(M,P)        do_check_top_chunk(M,P)
+#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N)
+#define check_mmapped_chunk(M,P)    do_check_mmapped_chunk(M,P)
+#define check_malloc_state(M)       do_check_malloc_state(M)
+
+static void   do_check_any_chunk(mstate m, mchunkptr p);
+static void   do_check_top_chunk(mstate m, mchunkptr p);
+static void   do_check_mmapped_chunk(mstate m, mchunkptr p);
+static void   do_check_inuse_chunk(mstate m, mchunkptr p);
+static void   do_check_free_chunk(mstate m, mchunkptr p);
+static void   do_check_malloced_chunk(mstate m, void* mem, size_t s);
+static void   do_check_tree(mstate m, tchunkptr t);
+static void   do_check_treebin(mstate m, bindex_t i);
+static void   do_check_smallbin(mstate m, bindex_t i);
+static void   do_check_malloc_state(mstate m);
+static int    bin_find(mstate m, mchunkptr x);
+static size_t traverse_and_check(mstate m);
+#endif /* DEBUG */
+
+/* ---------------------------- Indexing Bins ---------------------------- */
+
+#define is_small(s)         (((s) >> SMALLBIN_SHIFT) < NSMALLBINS)
+#define small_index(s)      ((s)  >> SMALLBIN_SHIFT)
+#define small_index2size(i) ((i)  << SMALLBIN_SHIFT)
+#define MIN_SMALL_INDEX     (small_index(MIN_CHUNK_SIZE))
+
+/* addressing by index. See above about smallbin repositioning */
+#define smallbin_at(M, i)   ((sbinptr)((char*)&((M)->smallbins[(i)<<1])))
+#define treebin_at(M,i)     (&((M)->treebins[i]))
+
+/* assign tree index for size S to variable I */
+#if defined(__GNUC__) && defined(i386)
+#define compute_tree_index(S, I)\
+{\
+  size_t X = S >> TREEBIN_SHIFT;\
+  if (X == 0)\
+    I = 0;\
+  else if (X > 0xFFFF)\
+    I = NTREEBINS-1;\
+  else {\
+    unsigned int K;\
+    __asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm"  (X));\
+    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
+  }\
+}
+#else /* GNUC */
+#define compute_tree_index(S, I)\
+{\
+  size_t X = S >> TREEBIN_SHIFT;\
+  if (X == 0)\
+    I = 0;\
+  else if (X > 0xFFFF)\
+    I = NTREEBINS-1;\
+  else {\
+    unsigned int Y = (unsigned int)X;\
+    unsigned int N = ((Y - 0x100) >> 16) & 8;\
+    unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\
+    N += K;\
+    N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\
+    K = 14 - N + ((Y <<= K) >> 15);\
+    I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\
+  }\
+}
+#endif /* GNUC */
+
+/* Bit representing maximum resolved size in a treebin at i */
+#define bit_for_tree_index(i) \
+   (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)
+
+/* Shift placing maximum resolved bit in a treebin at i as sign bit */
+#define leftshift_for_tree_index(i) \
+   ((i == NTREEBINS-1)? 0 : \
+    ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))
+
+/* The size of the smallest chunk held in bin with index i */
+#define minsize_for_tree_index(i) \
+   ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) |  \
+   (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))
+
+
+/* ------------------------ Operations on bin maps ----------------------- */
+
+/* bit corresponding to given index */
+#define idx2bit(i)              ((binmap_t)(1) << (i))
+
+/* Mark/Clear bits with given index */
+#define mark_smallmap(M,i)      ((M)->smallmap |=  idx2bit(i))
+#define clear_smallmap(M,i)     ((M)->smallmap &= ~idx2bit(i))
+#define smallmap_is_marked(M,i) ((M)->smallmap &   idx2bit(i))
+
+#define mark_treemap(M,i)       ((M)->treemap  |=  idx2bit(i))
+#define clear_treemap(M,i)      ((M)->treemap  &= ~idx2bit(i))
+#define treemap_is_marked(M,i)  ((M)->treemap  &   idx2bit(i))
+
+/* index corresponding to given bit */
+
+#if defined(__GNUC__) && defined(i386)
+#define compute_bit2idx(X, I)\
+{\
+  unsigned int J;\
+  __asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\
+  I = (bindex_t)J;\
+}
+
+#else /* GNUC */
+#if  USE_BUILTIN_FFS
+#define compute_bit2idx(X, I) I = ffs(X)-1
+
+#else /* USE_BUILTIN_FFS */
+#define compute_bit2idx(X, I)\
+{\
+  unsigned int Y = X - 1;\
+  unsigned int K = Y >> (16-4) & 16;\
+  unsigned int N = K;        Y >>= K;\
+  N += K = Y >> (8-3) &  8;  Y >>= K;\
+  N += K = Y >> (4-2) &  4;  Y >>= K;\
+  N += K = Y >> (2-1) &  2;  Y >>= K;\
+  N += K = Y >> (1-0) &  1;  Y >>= K;\
+  I = (bindex_t)(N + Y);\
+}
+#endif /* USE_BUILTIN_FFS */
+#endif /* GNUC */
+
+/* isolate the least set bit of a bitmap */
+#define least_bit(x)         ((x) & -(x))
+
+/* mask with all bits to left of least bit of x on */
+#define left_bits(x)         ((x<<1) | -(x<<1))
+
+/* mask with all bits to left of or equal to least bit of x on */
+#define same_or_left_bits(x) ((x) | -(x))
+
+
+/* ----------------------- Runtime Check Support ------------------------- */
+
+/*
+  For security, the main invariant is that malloc/free/etc never
+  writes to a static address other than malloc_state, unless static
+  malloc_state itself has been corrupted, which cannot occur via
+  malloc (because of these checks). In essence this means that we
+  believe all pointers, sizes, maps etc held in malloc_state, but
+  check all of those linked or offsetted from other embedded data
+  structures.  These checks are interspersed with main code in a way
+  that tends to minimize their run-time cost.
+
+  When FOOTERS is defined, in addition to range checking, we also
+  verify footer fields of inuse chunks, which can be used guarantee
+  that the mstate controlling malloc/free is intact.  This is a
+  streamlined version of the approach described by William Robertson
+  et al in "Run-time Detection of Heap-based Overflows" LISA'03
+  http://www.usenix.org/events/lisa03/tech/robertson.html The footer
+  of an inuse chunk holds the xor of its mstate and a random seed,
+  that is checked upon calls to free() and realloc().  This is
+  (probablistically) unguessable from outside the program, but can be
+  computed by any code successfully malloc'ing any chunk, so does not
+  itself provide protection against code that has already broken
+  security through some other means.  Unlike Robertson et al, we
+  always dynamically check addresses of all offset chunks (previous,
+  next, etc). This turns out to be cheaper than relying on hashes.
+*/
+
+#if !INSECURE
+/* Check if address a is at least as high as any from MORECORE or MMAP */
+#define ok_address(M, a) ((char*)(a) >= (M)->least_addr)
+/* Check if address of next chunk n is higher than base chunk p */
+#define ok_next(p, n)    ((char*)(p) < (char*)(n))
+/* Check if p has its cinuse bit on */
+#define ok_cinuse(p)     cinuse(p)
+/* Check if p has its pinuse bit on */
+#define ok_pinuse(p)     pinuse(p)
+
+#else /* !INSECURE */
+#define ok_address(M, a) (1)
+#define ok_next(b, n)    (1)
+#define ok_cinuse(p)     (1)
+#define ok_pinuse(p)     (1)
+#endif /* !INSECURE */
+
+#if (FOOTERS && !INSECURE)
+/* Check if (alleged) mstate m has expected magic field */
+#define ok_magic(M)      ((M)->magic == mparams.magic)
+#else  /* (FOOTERS && !INSECURE) */
+#define ok_magic(M)      (1)
+#endif /* (FOOTERS && !INSECURE) */
+
+
+/* In gcc, use __builtin_expect to minimize impact of checks */
+#if !INSECURE
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define RTCHECK(e)  __builtin_expect(e, 1)
+#else /* GNUC */
+#define RTCHECK(e)  (e)
+#endif /* GNUC */
+#else /* !INSECURE */
+#define RTCHECK(e)  (1)
+#endif /* !INSECURE */
+
+/* macros to set up inuse chunks with or without footers */
+
+#if !FOOTERS
+
+#define mark_inuse_foot(M,p,s)
+
+/* Set cinuse bit and pinuse bit of next chunk */
+#define set_inuse(M,p,s)\
+  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
+  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
+
+/* Set cinuse and pinuse of this chunk and pinuse of next chunk */
+#define set_inuse_and_pinuse(M,p,s)\
+  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
+  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
+
+/* Set size, cinuse and pinuse bit of this chunk */
+#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
+  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT))
+
+#else /* FOOTERS */
+
+/* Set foot of inuse chunk to be xor of mstate and seed */
+#define mark_inuse_foot(M,p,s)\
+  (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic))
+
+#define get_mstate_for(p)\
+  ((mstate)(((mchunkptr)((char*)(p) +\
+    (chunksize(p))))->prev_foot ^ mparams.magic))
+
+#define set_inuse(M,p,s)\
+  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
+  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \
+  mark_inuse_foot(M,p,s))
+
+#define set_inuse_and_pinuse(M,p,s)\
+  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
+  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\
+ mark_inuse_foot(M,p,s))
+
+#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
+  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
+  mark_inuse_foot(M, p, s))
+
+#endif /* !FOOTERS */
+
+/* ---------------------------- setting mparams -------------------------- */
+
+/* Initialize mparams */
+static int init_mparams(void) {
+  if (mparams.page_size == 0) {
+    size_t s;
+
+    mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD;
+    mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD;
+#if MORECORE_CONTIGUOUS
+    mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT;
+#else  /* MORECORE_CONTIGUOUS */
+    mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT;
+#endif /* MORECORE_CONTIGUOUS */
+
+#if (FOOTERS && !INSECURE)
+    {
+#if USE_DEV_RANDOM
+      int fd;
+      unsigned char buf[sizeof(size_t)];
+      /* Try to use /dev/urandom, else fall back on using time */
+      if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 &&
+          read(fd, buf, sizeof(buf)) == sizeof(buf)) {
+        s = *((size_t *) buf);
+        close(fd);
+      }
+      else
+#endif /* USE_DEV_RANDOM */
+        s = (size_t)(time(0) ^ (size_t)0x55555555U);
+
+      s |= (size_t)8U;    /* ensure nonzero */
+      s &= ~(size_t)7U;   /* improve chances of fault for bad values */
+
+    }
+#else /* (FOOTERS && !INSECURE) */
+    s = (size_t)0x58585858U;
+#endif /* (FOOTERS && !INSECURE) */
+    ACQUIRE_MAGIC_INIT_LOCK();
+    if (mparams.magic == 0) {
+      mparams.magic = s;
+      /* Set up lock for main malloc area */
+      INITIAL_LOCK(&gm->mutex);
+      gm->mflags = mparams.default_mflags;
+    }
+    RELEASE_MAGIC_INIT_LOCK();
+
+#if !defined(WIN32) && !defined(__OS2__)
+    mparams.page_size = malloc_getpagesize;
+    mparams.granularity = ((DEFAULT_GRANULARITY != 0)?
+                           DEFAULT_GRANULARITY : mparams.page_size);
+#elif defined (__OS2__)
+ /* if low-memory is used, os2munmap() would break
+    if it were anything other than 64k */
+    mparams.page_size = 4096u;
+    mparams.granularity = 65536u;
+#else /* WIN32 */
+    {
+      SYSTEM_INFO system_info;
+      GetSystemInfo(&system_info);
+      mparams.page_size = system_info.dwPageSize;
+      mparams.granularity = system_info.dwAllocationGranularity;
+    }
+#endif /* WIN32 */
+
+    /* Sanity-check configuration:
+       size_t must be unsigned and as wide as pointer type.
+       ints must be at least 4 bytes.
+       alignment must be at least 8.
+       Alignment, min chunk size, and page size must all be powers of 2.
+    */
+    if ((sizeof(size_t) != sizeof(char*)) ||
+        (MAX_SIZE_T < MIN_CHUNK_SIZE)  ||
+        (sizeof(int) < 4)  ||
+        (MALLOC_ALIGNMENT < (size_t)8U) ||
+        ((MALLOC_ALIGNMENT    & (MALLOC_ALIGNMENT-SIZE_T_ONE))    != 0) ||
+        ((MCHUNK_SIZE         & (MCHUNK_SIZE-SIZE_T_ONE))         != 0) ||
+        ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) ||
+        ((mparams.page_size   & (mparams.page_size-SIZE_T_ONE))   != 0))
+      ABORT;
+  }
+  return 0;
+}
+
+/* support for mallopt */
+static int change_mparam(int param_number, int value) {
+  size_t val = (size_t)value;
+  init_mparams();
+  switch(param_number) {
+  case M_TRIM_THRESHOLD:
+    mparams.trim_threshold = val;
+    return 1;
+  case M_GRANULARITY:
+    if (val >= mparams.page_size && ((val & (val-1)) == 0)) {
+      mparams.granularity = val;
+      return 1;
+    }
+    else
+      return 0;
+  case M_MMAP_THRESHOLD:
+    mparams.mmap_threshold = val;
+    return 1;
+  default:
+    return 0;
+  }
+}
+
+#if DEBUG
+/* ------------------------- Debugging Support --------------------------- */
+
+/* Check properties of any chunk, whether free, inuse, mmapped etc  */
+static void do_check_any_chunk(mstate m, mchunkptr p) {
+  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
+  assert(ok_address(m, p));
+}
+
+/* Check properties of top chunk */
+static void do_check_top_chunk(mstate m, mchunkptr p) {
+  msegmentptr sp = segment_holding(m, (char*)p);
+  size_t  sz = chunksize(p);
+  assert(sp != 0);
+  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
+  assert(ok_address(m, p));
+  assert(sz == m->topsize);
+  assert(sz > 0);
+  assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE);
+  assert(pinuse(p));
+  assert(!next_pinuse(p));
+}
+
+/* Check properties of (inuse) mmapped chunks */
+static void do_check_mmapped_chunk(mstate m, mchunkptr p) {
+  size_t  sz = chunksize(p);
+  size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD);
+  assert(is_mmapped(p));
+  assert(use_mmap(m));
+  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
+  assert(ok_address(m, p));
+  assert(!is_small(sz));
+  assert((len & (mparams.page_size-SIZE_T_ONE)) == 0);
+  assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD);
+  assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0);
+}
+
+/* Check properties of inuse chunks */
+static void do_check_inuse_chunk(mstate m, mchunkptr p) {
+  do_check_any_chunk(m, p);
+  assert(cinuse(p));
+  assert(next_pinuse(p));
+  /* If not pinuse and not mmapped, previous chunk has OK offset */
+  assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p);
+  if (is_mmapped(p))
+    do_check_mmapped_chunk(m, p);
+}
+
+/* Check properties of free chunks */
+static void do_check_free_chunk(mstate m, mchunkptr p) {
+  size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT);
+  mchunkptr next = chunk_plus_offset(p, sz);
+  do_check_any_chunk(m, p);
+  assert(!cinuse(p));
+  assert(!next_pinuse(p));
+  assert (!is_mmapped(p));
+  if (p != m->dv && p != m->top) {
+    if (sz >= MIN_CHUNK_SIZE) {
+      assert((sz & CHUNK_ALIGN_MASK) == 0);
+      assert(is_aligned(chunk2mem(p)));
+      assert(next->prev_foot == sz);
+      assert(pinuse(p));
+      assert (next == m->top || cinuse(next));
+      assert(p->fd->bk == p);
+      assert(p->bk->fd == p);
+    }
+    else  /* markers are always of size SIZE_T_SIZE */
+      assert(sz == SIZE_T_SIZE);
+  }
+}
+
+/* Check properties of malloced chunks at the point they are malloced */
+static void do_check_malloced_chunk(mstate m, void* mem, size_t s) {
+  if (mem != 0) {
+    mchunkptr p = mem2chunk(mem);
+    size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT);
+    do_check_inuse_chunk(m, p);
+    assert((sz & CHUNK_ALIGN_MASK) == 0);
+    assert(sz >= MIN_CHUNK_SIZE);
+    assert(sz >= s);
+    /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */
+    assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE));
+  }
+}
+
+/* Check a tree and its subtrees.  */
+static void do_check_tree(mstate m, tchunkptr t) {
+  tchunkptr head = 0;
+  tchunkptr u = t;
+  bindex_t tindex = t->index;
+  size_t tsize = chunksize(t);
+  bindex_t idx;
+  compute_tree_index(tsize, idx);
+  assert(tindex == idx);
+  assert(tsize >= MIN_LARGE_SIZE);
+  assert(tsize >= minsize_for_tree_index(idx));
+  assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1))));
+
+  do { /* traverse through chain of same-sized nodes */
+    do_check_any_chunk(m, ((mchunkptr)u));
+    assert(u->index == tindex);
+    assert(chunksize(u) == tsize);
+    assert(!cinuse(u));
+    assert(!next_pinuse(u));
+    assert(u->fd->bk == u);
+    assert(u->bk->fd == u);
+    if (u->parent == 0) {
+      assert(u->child[0] == 0);
+      assert(u->child[1] == 0);
+    }
+    else {
+      assert(head == 0); /* only one node on chain has parent */
+      head = u;
+      assert(u->parent != u);
+      assert (u->parent->child[0] == u ||
+              u->parent->child[1] == u ||
+              *((tbinptr*)(u->parent)) == u);
+      if (u->child[0] != 0) {
+        assert(u->child[0]->parent == u);
+        assert(u->child[0] != u);
+        do_check_tree(m, u->child[0]);
+      }
+      if (u->child[1] != 0) {
+        assert(u->child[1]->parent == u);
+        assert(u->child[1] != u);
+        do_check_tree(m, u->child[1]);
+      }
+      if (u->child[0] != 0 && u->child[1] != 0) {
+        assert(chunksize(u->child[0]) < chunksize(u->child[1]));
+      }
+    }
+    u = u->fd;
+  } while (u != t);
+  assert(head != 0);
+}
+
+/*  Check all the chunks in a treebin.  */
+static void do_check_treebin(mstate m, bindex_t i) {
+  tbinptr* tb = treebin_at(m, i);
+  tchunkptr t = *tb;
+  int empty = (m->treemap & (1U << i)) == 0;
+  if (t == 0)
+    assert(empty);
+  if (!empty)
+    do_check_tree(m, t);
+}
+
+/*  Check all the chunks in a smallbin.  */
+static void do_check_smallbin(mstate m, bindex_t i) {
+  sbinptr b = smallbin_at(m, i);
+  mchunkptr p = b->bk;
+  unsigned int empty = (m->smallmap & (1U << i)) == 0;
+  if (p == b)
+    assert(empty);
+  if (!empty) {
+    for (; p != b; p = p->bk) {
+      size_t size = chunksize(p);
+      mchunkptr q;
+      /* each chunk claims to be free */
+      do_check_free_chunk(m, p);
+      /* chunk belongs in bin */
+      assert(small_index(size) == i);
+      assert(p->bk == b || chunksize(p->bk) == chunksize(p));
+      /* chunk is followed by an inuse chunk */
+      q = next_chunk(p);
+      if (q->head != FENCEPOST_HEAD)
+        do_check_inuse_chunk(m, q);
+    }
+  }
+}
+
+/* Find x in a bin. Used in other check functions. */
+static int bin_find(mstate m, mchunkptr x) {
+  size_t size = chunksize(x);
+  if (is_small(size)) {
+    bindex_t sidx = small_index(size);
+    sbinptr b = smallbin_at(m, sidx);
+    if (smallmap_is_marked(m, sidx)) {
+      mchunkptr p = b;
+      do {
+        if (p == x)
+          return 1;
+      } while ((p = p->fd) != b);
+    }
+  }
+  else {
+    bindex_t tidx;
+    compute_tree_index(size, tidx);
+    if (treemap_is_marked(m, tidx)) {
+      tchunkptr t = *treebin_at(m, tidx);
+      size_t sizebits = size << leftshift_for_tree_index(tidx);
+      while (t != 0 && chunksize(t) != size) {
+        t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
+        sizebits <<= 1;
+      }
+      if (t != 0) {
+        tchunkptr u = t;
+        do {
+          if (u == (tchunkptr)x)
+            return 1;
+        } while ((u = u->fd) != t);
+      }
+    }
+  }
+  return 0;
+}
+
+/* Traverse each chunk and check it; return total */
+static size_t traverse_and_check(mstate m) {
+  size_t sum = 0;
+  if (is_initialized(m)) {
+    msegmentptr s = &m->seg;
+    sum += m->topsize + TOP_FOOT_SIZE;
+    while (s != 0) {
+      mchunkptr q = align_as_chunk(s->base);
+      mchunkptr lastq = 0;
+      assert(pinuse(q));
+      while (segment_holds(s, q) &&
+             q != m->top && q->head != FENCEPOST_HEAD) {
+        sum += chunksize(q);
+        if (cinuse(q)) {
+          assert(!bin_find(m, q));
+          do_check_inuse_chunk(m, q);
+        }
+        else {
+          assert(q == m->dv || bin_find(m, q));
+          assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */
+          do_check_free_chunk(m, q);
+        }
+        lastq = q;
+        q = next_chunk(q);
+      }
+      s = s->next;
+    }
+  }
+  return sum;
+}
+
+/* Check all properties of malloc_state. */
+static void do_check_malloc_state(mstate m) {
+  bindex_t i;
+  size_t total;
+  /* check bins */
+  for (i = 0; i < NSMALLBINS; ++i)
+    do_check_smallbin(m, i);
+  for (i = 0; i < NTREEBINS; ++i)
+    do_check_treebin(m, i);
+
+  if (m->dvsize != 0) { /* check dv chunk */
+    do_check_any_chunk(m, m->dv);
+    assert(m->dvsize == chunksize(m->dv));
+    assert(m->dvsize >= MIN_CHUNK_SIZE);
+    assert(bin_find(m, m->dv) == 0);
+  }
+
+  if (m->top != 0) {   /* check top chunk */
+    do_check_top_chunk(m, m->top);
+    assert(m->topsize == chunksize(m->top));
+    assert(m->topsize > 0);
+    assert(bin_find(m, m->top) == 0);
+  }
+
+  total = traverse_and_check(m);
+  assert(total <= m->footprint);
+  assert(m->footprint <= m->max_footprint);
+}
+#endif /* DEBUG */
+
+/* ----------------------------- statistics ------------------------------ */
+
+#if !NO_MALLINFO
+static struct mallinfo internal_mallinfo(mstate m) {
+  struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+  if (!PREACTION(m)) {
+    check_malloc_state(m);
+    if (is_initialized(m)) {
+      size_t nfree = SIZE_T_ONE; /* top always free */
+      size_t mfree = m->topsize + TOP_FOOT_SIZE;
+      size_t sum = mfree;
+      msegmentptr s = &m->seg;
+      while (s != 0) {
+        mchunkptr q = align_as_chunk(s->base);
+        while (segment_holds(s, q) &&
+               q != m->top && q->head != FENCEPOST_HEAD) {
+          size_t sz = chunksize(q);
+          sum += sz;
+          if (!cinuse(q)) {
+            mfree += sz;
+            ++nfree;
+          }
+          q = next_chunk(q);
+        }
+        s = s->next;
+      }
+
+      nm.arena    = sum;
+      nm.ordblks  = nfree;
+      nm.hblkhd   = m->footprint - sum;
+      nm.usmblks  = m->max_footprint;
+      nm.uordblks = m->footprint - mfree;
+      nm.fordblks = mfree;
+      nm.keepcost = m->topsize;
+    }
+
+    POSTACTION(m);
+  }
+  return nm;
+}
+#endif /* !NO_MALLINFO */
+
+static void internal_malloc_stats(mstate m) {
+  if (!PREACTION(m)) {
+    size_t maxfp = 0;
+    size_t fp = 0;
+    size_t used = 0;
+    check_malloc_state(m);
+    if (is_initialized(m)) {
+      msegmentptr s = &m->seg;
+      maxfp = m->max_footprint;
+      fp = m->footprint;
+      used = fp - (m->topsize + TOP_FOOT_SIZE);
+
+      while (s != 0) {
+        mchunkptr q = align_as_chunk(s->base);
+        while (segment_holds(s, q) &&
+               q != m->top && q->head != FENCEPOST_HEAD) {
+          if (!cinuse(q))
+            used -= chunksize(q);
+          q = next_chunk(q);
+        }
+        s = s->next;
+      }
+    }
+
+    fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp));
+    fprintf(stderr, "system bytes     = %10lu\n", (unsigned long)(fp));
+    fprintf(stderr, "in use bytes     = %10lu\n", (unsigned long)(used));
+
+    POSTACTION(m);
+  }
+}
+
+/* ----------------------- Operations on smallbins ----------------------- */
+
+/*
+  Various forms of linking and unlinking are defined as macros.  Even
+  the ones for trees, which are very long but have very short typical
+  paths.  This is ugly but reduces reliance on inlining support of
+  compilers.
+*/
+
+/* Link a free chunk into a smallbin  */
+#define insert_small_chunk(M, P, S) {\
+  bindex_t I  = small_index(S);\
+  mchunkptr B = smallbin_at(M, I);\
+  mchunkptr F = B;\
+  assert(S >= MIN_CHUNK_SIZE);\
+  if (!smallmap_is_marked(M, I))\
+    mark_smallmap(M, I);\
+  else if (RTCHECK(ok_address(M, B->fd)))\
+    F = B->fd;\
+  else {\
+    CORRUPTION_ERROR_ACTION(M);\
+  }\
+  B->fd = P;\
+  F->bk = P;\
+  P->fd = F;\
+  P->bk = B;\
+}
+
+/* Unlink a chunk from a smallbin  */
+#define unlink_small_chunk(M, P, S) {\
+  mchunkptr F = P->fd;\
+  mchunkptr B = P->bk;\
+  bindex_t I = small_index(S);\
+  assert(P != B);\
+  assert(P != F);\
+  assert(chunksize(P) == small_index2size(I));\
+  if (F == B)\
+    clear_smallmap(M, I);\
+  else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\
+                   (B == smallbin_at(M,I) || ok_address(M, B)))) {\
+    F->bk = B;\
+    B->fd = F;\
+  }\
+  else {\
+    CORRUPTION_ERROR_ACTION(M);\
+  }\
+}
+
+/* Unlink the first chunk from a smallbin */
+#define unlink_first_small_chunk(M, B, P, I) {\
+  mchunkptr F = P->fd;\
+  assert(P != B);\
+  assert(P != F);\
+  assert(chunksize(P) == small_index2size(I));\
+  if (B == F)\
+    clear_smallmap(M, I);\
+  else if (RTCHECK(ok_address(M, F))) {\
+    B->fd = F;\
+    F->bk = B;\
+  }\
+  else {\
+    CORRUPTION_ERROR_ACTION(M);\
+  }\
+}
+
+/* Replace dv node, binning the old one */
+/* Used only when dvsize known to be small */
+#define replace_dv(M, P, S) {\
+  size_t DVS = M->dvsize;\
+  if (DVS != 0) {\
+    mchunkptr DV = M->dv;\
+    assert(is_small(DVS));\
+    insert_small_chunk(M, DV, DVS);\
+  }\
+  M->dvsize = S;\
+  M->dv = P;\
+}
+
+/* ------------------------- Operations on trees ------------------------- */
+
+/* Insert chunk into tree */
+#define insert_large_chunk(M, X, S) {\
+  tbinptr* H;\
+  bindex_t I;\
+  compute_tree_index(S, I);\
+  H = treebin_at(M, I);\
+  X->index = I;\
+  X->child[0] = X->child[1] = 0;\
+  if (!treemap_is_marked(M, I)) {\
+    mark_treemap(M, I);\
+    *H = X;\
+    X->parent = (tchunkptr)H;\
+    X->fd = X->bk = X;\
+  }\
+  else {\
+    tchunkptr T = *H;\
+    size_t K = S << leftshift_for_tree_index(I);\
+    for (;;) {\
+      if (chunksize(T) != S) {\
+        tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\
+        K <<= 1;\
+        if (*C != 0)\
+          T = *C;\
+        else if (RTCHECK(ok_address(M, C))) {\
+          *C = X;\
+          X->parent = T;\
+          X->fd = X->bk = X;\
+          break;\
+        }\
+        else {\
+          CORRUPTION_ERROR_ACTION(M);\
+          break;\
+        }\
+      }\
+      else {\
+        tchunkptr F = T->fd;\
+        if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\
+          T->fd = F->bk = X;\
+          X->fd = F;\
+          X->bk = T;\
+          X->parent = 0;\
+          break;\
+        }\
+        else {\
+          CORRUPTION_ERROR_ACTION(M);\
+          break;\
+        }\
+      }\
+    }\
+  }\
+}
+
+/*
+  Unlink steps:
+
+  1. If x is a chained node, unlink it from its same-sized fd/bk links
+     and choose its bk node as its replacement.
+  2. If x was the last node of its size, but not a leaf node, it must
+     be replaced with a leaf node (not merely one with an open left or
+     right), to make sure that lefts and rights of descendents
+     correspond properly to bit masks.  We use the rightmost descendent
+     of x.  We could use any other leaf, but this is easy to locate and
+     tends to counteract removal of leftmosts elsewhere, and so keeps
+     paths shorter than minimally guaranteed.  This doesn't loop much
+     because on average a node in a tree is near the bottom.
+  3. If x is the base of a chain (i.e., has parent links) relink
+     x's parent and children to x's replacement (or null if none).
+*/
+
+#define unlink_large_chunk(M, X) {\
+  tchunkptr XP = X->parent;\
+  tchunkptr R;\
+  if (X->bk != X) {\
+    tchunkptr F = X->fd;\
+    R = X->bk;\
+    if (RTCHECK(ok_address(M, F))) {\
+      F->bk = R;\
+      R->fd = F;\
+    }\
+    else {\
+      CORRUPTION_ERROR_ACTION(M);\
+    }\
+  }\
+  else {\
+    tchunkptr* RP;\
+    if (((R = *(RP = &(X->child[1]))) != 0) ||\
+        ((R = *(RP = &(X->child[0]))) != 0)) {\
+      tchunkptr* CP;\
+      while ((*(CP = &(R->child[1])) != 0) ||\
+             (*(CP = &(R->child[0])) != 0)) {\
+        R = *(RP = CP);\
+      }\
+      if (RTCHECK(ok_address(M, RP)))\
+        *RP = 0;\
+      else {\
+        CORRUPTION_ERROR_ACTION(M);\
+      }\
+    }\
+  }\
+  if (XP != 0) {\
+    tbinptr* H = treebin_at(M, X->index);\
+    if (X == *H) {\
+      if ((*H = R) == 0) \
+        clear_treemap(M, X->index);\
+    }\
+    else if (RTCHECK(ok_address(M, XP))) {\
+      if (XP->child[0] == X) \
+        XP->child[0] = R;\
+      else \
+        XP->child[1] = R;\
+    }\
+    else\
+      CORRUPTION_ERROR_ACTION(M);\
+    if (R != 0) {\
+      if (RTCHECK(ok_address(M, R))) {\
+        tchunkptr C0, C1;\
+        R->parent = XP;\
+        if ((C0 = X->child[0]) != 0) {\
+          if (RTCHECK(ok_address(M, C0))) {\
+            R->child[0] = C0;\
+            C0->parent = R;\
+          }\
+          else\
+            CORRUPTION_ERROR_ACTION(M);\
+        }\
+        if ((C1 = X->child[1]) != 0) {\
+          if (RTCHECK(ok_address(M, C1))) {\
+            R->child[1] = C1;\
+            C1->parent = R;\
+          }\
+          else\
+            CORRUPTION_ERROR_ACTION(M);\
+        }\
+      }\
+      else\
+        CORRUPTION_ERROR_ACTION(M);\
+    }\
+  }\
+}
+
+/* Relays to large vs small bin operations */
+
+#define insert_chunk(M, P, S)\
+  if (is_small(S)) insert_small_chunk(M, P, S)\
+  else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); }
+
+#define unlink_chunk(M, P, S)\
+  if (is_small(S)) unlink_small_chunk(M, P, S)\
+  else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); }
+
+
+/* Relays to internal calls to malloc/free from realloc, memalign etc */
+
+#if ONLY_MSPACES
+#define internal_malloc(m, b) mspace_malloc(m, b)
+#define internal_free(m, mem) mspace_free(m,mem);
+#else /* ONLY_MSPACES */
+#if MSPACES
+#define internal_malloc(m, b)\
+   (m == gm)? dlmalloc(b) : mspace_malloc(m, b)
+#define internal_free(m, mem)\
+   if (m == gm) dlfree(mem); else mspace_free(m,mem);
+#else /* MSPACES */
+#define internal_malloc(m, b) dlmalloc(b)
+#define internal_free(m, mem) dlfree(mem)
+#endif /* MSPACES */
+#endif /* ONLY_MSPACES */
+
+/* -----------------------  Direct-mmapping chunks ----------------------- */
+
+/*
+  Directly mmapped chunks are set up with an offset to the start of
+  the mmapped region stored in the prev_foot field of the chunk. This
+  allows reconstruction of the required argument to MUNMAP when freed,
+  and also allows adjustment of the returned chunk to meet alignment
+  requirements (especially in memalign).  There is also enough space
+  allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain
+  the PINUSE bit so frees can be checked.
+*/
+
+/* Malloc using mmap */
+static void* mmap_alloc(mstate m, size_t nb) {
+  size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
+  if (mmsize > nb) {     /* Check for wrap around 0 */
+    char* mm = (char*)(DIRECT_MMAP(mmsize));
+    if (mm != CMFAIL) {
+      size_t offset = align_offset(chunk2mem(mm));
+      size_t psize = mmsize - offset - MMAP_FOOT_PAD;
+      mchunkptr p = (mchunkptr)(mm + offset);
+      p->prev_foot = offset | IS_MMAPPED_BIT;
+      (p)->head = (psize|CINUSE_BIT);
+      mark_inuse_foot(m, p, psize);
+      chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD;
+      chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0;
+
+      if (mm < m->least_addr)
+        m->least_addr = mm;
+      if ((m->footprint += mmsize) > m->max_footprint)
+        m->max_footprint = m->footprint;
+      assert(is_aligned(chunk2mem(p)));
+      check_mmapped_chunk(m, p);
+      return chunk2mem(p);
+    }
+  }
+  return 0;
+}
+
+/* Realloc using mmap */
+static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) {
+  size_t oldsize = chunksize(oldp);
+  if (is_small(nb)) /* Can't shrink mmap regions below small size */
+    return 0;
+  /* Keep old chunk if big enough but not too big */
+  if (oldsize >= nb + SIZE_T_SIZE &&
+      (oldsize - nb) <= (mparams.granularity << 1))
+    return oldp;
+  else {
+    size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT;
+    size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD;
+    size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES +
+                                         CHUNK_ALIGN_MASK);
+    char* cp = (char*)CALL_MREMAP((char*)oldp - offset,
+                                  oldmmsize, newmmsize, 1);
+    if (cp != CMFAIL) {
+      mchunkptr newp = (mchunkptr)(cp + offset);
+      size_t psize = newmmsize - offset - MMAP_FOOT_PAD;
+      newp->head = (psize|CINUSE_BIT);
+      mark_inuse_foot(m, newp, psize);
+      chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD;
+      chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0;
+
+      if (cp < m->least_addr)
+        m->least_addr = cp;
+      if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint)
+        m->max_footprint = m->footprint;
+      check_mmapped_chunk(m, newp);
+      return newp;
+    }
+  }
+  return 0;
+}
+
+/* -------------------------- mspace management -------------------------- */
+
+/* Initialize top chunk and its size */
+static void init_top(mstate m, mchunkptr p, size_t psize) {
+  /* Ensure alignment */
+  size_t offset = align_offset(chunk2mem(p));
+  p = (mchunkptr)((char*)p + offset);
+  psize -= offset;
+
+  m->top = p;
+  m->topsize = psize;
+  p->head = psize | PINUSE_BIT;
+  /* set size of fake trailing chunk holding overhead space only once */
+  chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE;
+  m->trim_check = mparams.trim_threshold; /* reset on each update */
+}
+
+/* Initialize bins for a new mstate that is otherwise zeroed out */
+static void init_bins(mstate m) {
+  /* Establish circular links for smallbins */
+  bindex_t i;
+  for (i = 0; i < NSMALLBINS; ++i) {
+    sbinptr bin = smallbin_at(m,i);
+    bin->fd = bin->bk = bin;
+  }
+}
+
+#if PROCEED_ON_ERROR
+
+/* default corruption action */
+static void reset_on_error(mstate m) {
+  int i;
+  ++malloc_corruption_error_count;
+  /* Reinitialize fields to forget about all memory */
+  m->smallbins = m->treebins = 0;
+  m->dvsize = m->topsize = 0;
+  m->seg.base = 0;
+  m->seg.size = 0;
+  m->seg.next = 0;
+  m->top = m->dv = 0;
+  for (i = 0; i < NTREEBINS; ++i)
+    *treebin_at(m, i) = 0;
+  init_bins(m);
+}
+#endif /* PROCEED_ON_ERROR */
+
+/* Allocate chunk and prepend remainder with chunk in successor base. */
+static void* prepend_alloc(mstate m, char* newbase, char* oldbase,
+                           size_t nb) {
+  mchunkptr p = align_as_chunk(newbase);
+  mchunkptr oldfirst = align_as_chunk(oldbase);
+  size_t psize = (char*)oldfirst - (char*)p;
+  mchunkptr q = chunk_plus_offset(p, nb);
+  size_t qsize = psize - nb;
+  set_size_and_pinuse_of_inuse_chunk(m, p, nb);
+
+  assert((char*)oldfirst > (char*)q);
+  assert(pinuse(oldfirst));
+  assert(qsize >= MIN_CHUNK_SIZE);
+
+  /* consolidate remainder with first chunk of old base */
+  if (oldfirst == m->top) {
+    size_t tsize = m->topsize += qsize;
+    m->top = q;
+    q->head = tsize | PINUSE_BIT;
+    check_top_chunk(m, q);
+  }
+  else if (oldfirst == m->dv) {
+    size_t dsize = m->dvsize += qsize;
+    m->dv = q;
+    set_size_and_pinuse_of_free_chunk(q, dsize);
+  }
+  else {
+    if (!cinuse(oldfirst)) {
+      size_t nsize = chunksize(oldfirst);
+      unlink_chunk(m, oldfirst, nsize);
+      oldfirst = chunk_plus_offset(oldfirst, nsize);
+      qsize += nsize;
+    }
+    set_free_with_pinuse(q, qsize, oldfirst);
+    insert_chunk(m, q, qsize);
+    check_free_chunk(m, q);
+  }
+
+  check_malloced_chunk(m, chunk2mem(p), nb);
+  return chunk2mem(p);
+}
+
+
+/* Add a segment to hold a new noncontiguous region */
+static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) {
+  /* Determine locations and sizes of segment, fenceposts, old top */
+  char* old_top = (char*)m->top;
+  msegmentptr oldsp = segment_holding(m, old_top);
+  char* old_end = oldsp->base + oldsp->size;
+  size_t ssize = pad_request(sizeof(struct malloc_segment));
+  char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
+  size_t offset = align_offset(chunk2mem(rawsp));
+  char* asp = rawsp + offset;
+  char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp;
+  mchunkptr sp = (mchunkptr)csp;
+  msegmentptr ss = (msegmentptr)(chunk2mem(sp));
+  mchunkptr tnext = chunk_plus_offset(sp, ssize);
+  mchunkptr p = tnext;
+  int nfences = 0;
+
+  /* reset top to new space */
+  init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
+
+  /* Set up segment record */
+  assert(is_aligned(ss));
+  set_size_and_pinuse_of_inuse_chunk(m, sp, ssize);
+  *ss = m->seg; /* Push current record */
+  m->seg.base = tbase;
+  m->seg.size = tsize;
+  set_segment_flags(&m->seg, mmapped);
+  m->seg.next = ss;
+
+  /* Insert trailing fenceposts */
+  for (;;) {
+    mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE);
+    p->head = FENCEPOST_HEAD;
+    ++nfences;
+    if ((char*)(&(nextp->head)) < old_end)
+      p = nextp;
+    else
+      break;
+  }
+  assert(nfences >= 2);
+
+  /* Insert the rest of old top into a bin as an ordinary free chunk */
+  if (csp != old_top) {
+    mchunkptr q = (mchunkptr)old_top;
+    size_t psize = csp - old_top;
+    mchunkptr tn = chunk_plus_offset(q, psize);
+    set_free_with_pinuse(q, psize, tn);
+    insert_chunk(m, q, psize);
+  }
+
+  check_top_chunk(m, m->top);
+}
+
+/* -------------------------- System allocation -------------------------- */
+
+/* Get memory from system using MORECORE or MMAP */
+static void* sys_alloc(mstate m, size_t nb) {
+  char* tbase = CMFAIL;
+  size_t tsize = 0;
+  flag_t mmap_flag = 0;
+
+  init_mparams();
+
+  /* Directly map large chunks */
+  if (use_mmap(m) && nb >= mparams.mmap_threshold) {
+    void* mem = mmap_alloc(m, nb);
+    if (mem != 0)
+      return mem;
+  }
+
+  /*
+    Try getting memory in any of three ways (in most-preferred to
+    least-preferred order):
+    1. A call to MORECORE that can normally contiguously extend memory.
+       (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or
+       or main space is mmapped or a previous contiguous call failed)
+    2. A call to MMAP new space (disabled if not HAVE_MMAP).
+       Note that under the default settings, if MORECORE is unable to
+       fulfill a request, and HAVE_MMAP is true, then mmap is
+       used as a noncontiguous system allocator. This is a useful backup
+       strategy for systems with holes in address spaces -- in this case
+       sbrk cannot contiguously expand the heap, but mmap may be able to
+       find space.
+    3. A call to MORECORE that cannot usually contiguously extend memory.
+       (disabled if not HAVE_MORECORE)
+  */
+
+  if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) {
+    char* br = CMFAIL;
+    msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top);
+    size_t asize = 0;
+    ACQUIRE_MORECORE_LOCK();
+
+    if (ss == 0) {  /* First time through or recovery */
+      char* base = (char*)CALL_MORECORE(0);
+      if (base != CMFAIL) {
+        asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE);
+        /* Adjust to end on a page boundary */
+        if (!is_page_aligned(base))
+          asize += (page_align((size_t)base) - (size_t)base);
+        /* Can't call MORECORE if size is negative when treated as signed */
+        if (asize < HALF_MAX_SIZE_T &&
+            (br = (char*)(CALL_MORECORE(asize))) == base) {
+          tbase = base;
+          tsize = asize;
+        }
+      }
+    }
+    else {
+      /* Subtract out existing available top space from MORECORE request. */
+      asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE);
+      /* Use mem here only if it did continuously extend old space */
+      if (asize < HALF_MAX_SIZE_T &&
+          (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) {
+        tbase = br;
+        tsize = asize;
+      }
+    }
+
+    if (tbase == CMFAIL) {    /* Cope with partial failure */
+      if (br != CMFAIL) {    /* Try to use/extend the space we did get */
+        if (asize < HALF_MAX_SIZE_T &&
+            asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) {
+          size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize);
+          if (esize < HALF_MAX_SIZE_T) {
+            char* end = (char*)CALL_MORECORE(esize);
+            if (end != CMFAIL)
+              asize += esize;
+            else {            /* Can't use; try to release */
+              (void)CALL_MORECORE(-asize);
+              br = CMFAIL;
+            }
+          }
+        }
+      }
+      if (br != CMFAIL) {    /* Use the space we did get */
+        tbase = br;
+        tsize = asize;
+      }
+      else
+        disable_contiguous(m); /* Don't try contiguous path in the future */
+    }
+
+    RELEASE_MORECORE_LOCK();
+  }
+
+  if (HAVE_MMAP && tbase == CMFAIL) {  /* Try MMAP */
+    size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE;
+    size_t rsize = granularity_align(req);
+    if (rsize > nb) { /* Fail if wraps around zero */
+      char* mp = (char*)(CALL_MMAP(rsize));
+      if (mp != CMFAIL) {
+        tbase = mp;
+        tsize = rsize;
+        mmap_flag = IS_MMAPPED_BIT;
+      }
+    }
+  }
+
+  if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */
+    size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE);
+    if (asize < HALF_MAX_SIZE_T) {
+      char* br = CMFAIL;
+      char* end = CMFAIL;
+      ACQUIRE_MORECORE_LOCK();
+      br = (char*)(CALL_MORECORE(asize));
+      end = (char*)(CALL_MORECORE(0));
+      RELEASE_MORECORE_LOCK();
+      if (br != CMFAIL && end != CMFAIL && br < end) {
+        size_t ssize = end - br;
+        if (ssize > nb + TOP_FOOT_SIZE) {
+          tbase = br;
+          tsize = ssize;
+        }
+      }
+    }
+  }
+
+  if (tbase != CMFAIL) {
+
+    if ((m->footprint += tsize) > m->max_footprint)
+      m->max_footprint = m->footprint;
+
+    if (!is_initialized(m)) { /* first-time initialization */
+      m->seg.base = m->least_addr = tbase;
+      m->seg.size = tsize;
+      set_segment_flags(&m->seg, mmap_flag);
+      m->magic = mparams.magic;
+      init_bins(m);
+      if (is_global(m)) 
+        init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
+      else {
+        /* Offset top by embedded malloc_state */
+        mchunkptr mn = next_chunk(mem2chunk(m));
+        init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE);
+      }
+    }
+
+    else {
+      /* Try to merge with an existing segment */
+      msegmentptr sp = &m->seg;
+      while (sp != 0 && tbase != sp->base + sp->size)
+        sp = sp->next;
+      if (sp != 0 &&
+          !is_extern_segment(sp) &&
+	  check_segment_merge(sp, tbase, tsize) &&
+          (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag &&
+          segment_holds(sp, m->top)) { /* append */
+        sp->size += tsize;
+        init_top(m, m->top, m->topsize + tsize);
+      }
+      else {
+        if (tbase < m->least_addr)
+          m->least_addr = tbase;
+        sp = &m->seg;
+        while (sp != 0 && sp->base != tbase + tsize)
+          sp = sp->next;
+        if (sp != 0 &&
+            !is_extern_segment(sp) &&
+	    check_segment_merge(sp, tbase, tsize) &&
+            (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag) {
+          char* oldbase = sp->base;
+          sp->base = tbase;
+          sp->size += tsize;
+          return prepend_alloc(m, tbase, oldbase, nb);
+        }
+        else
+          add_segment(m, tbase, tsize, mmap_flag);
+      }
+    }
+
+    if (nb < m->topsize) { /* Allocate from new or extended top space */
+      size_t rsize = m->topsize -= nb;
+      mchunkptr p = m->top;
+      mchunkptr r = m->top = chunk_plus_offset(p, nb);
+      r->head = rsize | PINUSE_BIT;
+      set_size_and_pinuse_of_inuse_chunk(m, p, nb);
+      check_top_chunk(m, m->top);
+      check_malloced_chunk(m, chunk2mem(p), nb);
+      return chunk2mem(p);
+    }
+  }
+
+  MALLOC_FAILURE_ACTION;
+  return 0;
+}
+
+/* -----------------------  system deallocation -------------------------- */
+
+/* Unmap and unlink any mmapped segments that don't contain used chunks */
+static size_t release_unused_segments(mstate m) {
+  size_t released = 0;
+  msegmentptr pred = &m->seg;
+  msegmentptr sp = pred->next;
+  while (sp != 0) {
+    char* base = sp->base;
+    size_t size = sp->size;
+    msegmentptr next = sp->next;
+    if (is_mmapped_segment(sp) && !is_extern_segment(sp)) {
+      mchunkptr p = align_as_chunk(base);
+      size_t psize = chunksize(p);
+      /* Can unmap if first chunk holds entire segment and not pinned */
+      if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) {
+        tchunkptr tp = (tchunkptr)p;
+        assert(segment_holds(sp, (char*)sp));
+        if (p == m->dv) {
+          m->dv = 0;
+          m->dvsize = 0;
+        }
+        else {
+          unlink_large_chunk(m, tp);
+        }
+        if (CALL_MUNMAP(base, size) == 0) {
+          released += size;
+          m->footprint -= size;
+          /* unlink obsoleted record */
+          sp = pred;
+          sp->next = next;
+        }
+        else { /* back out if cannot unmap */
+          insert_large_chunk(m, tp, psize);
+        }
+      }
+    }
+    pred = sp;
+    sp = next;
+  }
+  return released;
+}
+
+static int sys_trim(mstate m, size_t pad) {
+  size_t released = 0;
+  if (pad < MAX_REQUEST && is_initialized(m)) {
+    pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */
+
+    if (m->topsize > pad) {
+      /* Shrink top space in granularity-size units, keeping at least one */
+      size_t unit = mparams.granularity;
+      size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -
+                      SIZE_T_ONE) * unit;
+      msegmentptr sp = segment_holding(m, (char*)m->top);
+
+      if (!is_extern_segment(sp)) {
+        if (is_mmapped_segment(sp)) {
+          if (HAVE_MMAP &&
+              sp->size >= extra &&
+              !has_segment_link(m, sp)) { /* can't shrink if pinned */
+            size_t newsize = sp->size - extra;
+            /* Prefer mremap, fall back to munmap */
+            if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) ||
+                (CALL_MUNMAP(sp->base + newsize, extra) == 0)) {
+              released = extra;
+            }
+          }
+        }
+        else if (HAVE_MORECORE) {
+          if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */
+            extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit;
+          ACQUIRE_MORECORE_LOCK();
+          {
+            /* Make sure end of memory is where we last set it. */
+            char* old_br = (char*)(CALL_MORECORE(0));
+            if (old_br == sp->base + sp->size) {
+              char* rel_br = (char*)(CALL_MORECORE(-extra));
+              char* new_br = (char*)(CALL_MORECORE(0));
+              if (rel_br != CMFAIL && new_br < old_br)
+                released = old_br - new_br;
+            }
+          }
+          RELEASE_MORECORE_LOCK();
+        }
+      }
+
+      if (released != 0) {
+        sp->size -= released;
+        m->footprint -= released;
+        init_top(m, m->top, m->topsize - released);
+        check_top_chunk(m, m->top);
+      }
+    }
+
+    /* Unmap any unused mmapped segments */
+    if (HAVE_MMAP) 
+      released += release_unused_segments(m);
+
+    /* On failure, disable autotrim to avoid repeated failed future calls */
+    if (released == 0)
+      m->trim_check = MAX_SIZE_T;
+  }
+
+  return (released != 0)? 1 : 0;
+}
+
+/* ---------------------------- malloc support --------------------------- */
+
+/* allocate a large request from the best fitting chunk in a treebin */
+static void* tmalloc_large(mstate m, size_t nb) {
+  tchunkptr v = 0;
+  size_t rsize = -nb; /* Unsigned negation */
+  tchunkptr t;
+  bindex_t idx;
+  compute_tree_index(nb, idx);
+
+  if ((t = *treebin_at(m, idx)) != 0) {
+    /* Traverse tree for this bin looking for node with size == nb */
+    size_t sizebits = nb << leftshift_for_tree_index(idx);
+    tchunkptr rst = 0;  /* The deepest untaken right subtree */
+    for (;;) {
+      tchunkptr rt;
+      size_t trem = chunksize(t) - nb;
+      if (trem < rsize) {
+        v = t;
+        if ((rsize = trem) == 0)
+          break;
+      }
+      rt = t->child[1];
+      t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
+      if (rt != 0 && rt != t)
+        rst = rt;
+      if (t == 0) {
+        t = rst; /* set t to least subtree holding sizes > nb */
+        break;
+      }
+      sizebits <<= 1;
+    }
+  }
+
+  if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */
+    binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap;
+    if (leftbits != 0) {
+      bindex_t i;
+      binmap_t leastbit = least_bit(leftbits);
+      compute_bit2idx(leastbit, i);
+      t = *treebin_at(m, i);
+    }
+  }
+
+  while (t != 0) { /* find smallest of tree or subtree */
+    size_t trem = chunksize(t) - nb;
+    if (trem < rsize) {
+      rsize = trem;
+      v = t;
+    }
+    t = leftmost_child(t);
+  }
+
+  /*  If dv is a better fit, return 0 so malloc will use it */
+  if (v != 0 && rsize < (size_t)(m->dvsize - nb)) {
+    if (RTCHECK(ok_address(m, v))) { /* split */
+      mchunkptr r = chunk_plus_offset(v, nb);
+      assert(chunksize(v) == rsize + nb);
+      if (RTCHECK(ok_next(v, r))) {
+        unlink_large_chunk(m, v);
+        if (rsize < MIN_CHUNK_SIZE)
+          set_inuse_and_pinuse(m, v, (rsize + nb));
+        else {
+          set_size_and_pinuse_of_inuse_chunk(m, v, nb);
+          set_size_and_pinuse_of_free_chunk(r, rsize);
+          insert_chunk(m, r, rsize);
+        }
+        return chunk2mem(v);
+      }
+    }
+    CORRUPTION_ERROR_ACTION(m);
+  }
+  return 0;
+}
+
+/* allocate a small request from the best fitting chunk in a treebin */
+static void* tmalloc_small(mstate m, size_t nb) {
+  tchunkptr t, v;
+  size_t rsize;
+  bindex_t i;
+  binmap_t leastbit = least_bit(m->treemap);
+  compute_bit2idx(leastbit, i);
+
+  v = t = *treebin_at(m, i);
+  rsize = chunksize(t) - nb;
+
+  while ((t = leftmost_child(t)) != 0) {
+    size_t trem = chunksize(t) - nb;
+    if (trem < rsize) {
+      rsize = trem;
+      v = t;
+    }
+  }
+
+  if (RTCHECK(ok_address(m, v))) {
+    mchunkptr r = chunk_plus_offset(v, nb);
+    assert(chunksize(v) == rsize + nb);
+    if (RTCHECK(ok_next(v, r))) {
+      unlink_large_chunk(m, v);
+      if (rsize < MIN_CHUNK_SIZE)
+        set_inuse_and_pinuse(m, v, (rsize + nb));
+      else {
+        set_size_and_pinuse_of_inuse_chunk(m, v, nb);
+        set_size_and_pinuse_of_free_chunk(r, rsize);
+        replace_dv(m, r, rsize);
+      }
+      return chunk2mem(v);
+    }
+  }
+
+  CORRUPTION_ERROR_ACTION(m);
+  return 0;
+}
+
+/* --------------------------- realloc support --------------------------- */
+
+static void* internal_realloc(mstate m, void* oldmem, size_t bytes) {
+  if (bytes >= MAX_REQUEST) {
+    MALLOC_FAILURE_ACTION;
+    return 0;
+  }
+  if (!PREACTION(m)) {
+    mchunkptr oldp = mem2chunk(oldmem);
+    size_t oldsize = chunksize(oldp);
+    mchunkptr next = chunk_plus_offset(oldp, oldsize);
+    mchunkptr newp = 0;
+    void* extra = 0;
+
+    /* Try to either shrink or extend into top. Else malloc-copy-free */
+
+    if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) &&
+                ok_next(oldp, next) && ok_pinuse(next))) {
+      size_t nb = request2size(bytes);
+      if (is_mmapped(oldp))
+        newp = mmap_resize(m, oldp, nb);
+      else if (oldsize >= nb) { /* already big enough */
+        size_t rsize = oldsize - nb;
+        newp = oldp;
+        if (rsize >= MIN_CHUNK_SIZE) {
+          mchunkptr remainder = chunk_plus_offset(newp, nb);
+          set_inuse(m, newp, nb);
+          set_inuse(m, remainder, rsize);
+          extra = chunk2mem(remainder);
+        }
+      }
+      else if (next == m->top && oldsize + m->topsize > nb) {
+        /* Expand into top */
+        size_t newsize = oldsize + m->topsize;
+        size_t newtopsize = newsize - nb;
+        mchunkptr newtop = chunk_plus_offset(oldp, nb);
+        set_inuse(m, oldp, nb);
+        newtop->head = newtopsize |PINUSE_BIT;
+        m->top = newtop;
+        m->topsize = newtopsize;
+        newp = oldp;
+      }
+    }
+    else {
+      USAGE_ERROR_ACTION(m, oldmem);
+      POSTACTION(m);
+      return 0;
+    }
+
+    POSTACTION(m);
+
+    if (newp != 0) {
+      if (extra != 0) {
+        internal_free(m, extra);
+      }
+      check_inuse_chunk(m, newp);
+      return chunk2mem(newp);
+    }
+    else {
+      void* newmem = internal_malloc(m, bytes);
+      if (newmem != 0) {
+        size_t oc = oldsize - overhead_for(oldp);
+        memcpy(newmem, oldmem, (oc < bytes)? oc : bytes);
+        internal_free(m, oldmem);
+      }
+      return newmem;
+    }
+  }
+  return 0;
+}
+
+/* --------------------------- memalign support -------------------------- */
+
+static void* internal_memalign(mstate m, size_t alignment, size_t bytes) {
+  if (alignment <= MALLOC_ALIGNMENT)    /* Can just use malloc */
+    return internal_malloc(m, bytes);
+  if (alignment <  MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */
+    alignment = MIN_CHUNK_SIZE;
+  if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */
+    size_t a = MALLOC_ALIGNMENT << 1;
+    while (a < alignment) a <<= 1;
+    alignment = a;
+  }
+  
+  if (bytes >= MAX_REQUEST - alignment) {
+    if (m != 0)  { /* Test isn't needed but avoids compiler warning */
+      MALLOC_FAILURE_ACTION;
+    }
+  }
+  else {
+    size_t nb = request2size(bytes);
+    size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD;
+    char* mem = (char*)internal_malloc(m, req);
+    if (mem != 0) {
+      void* leader = 0;
+      void* trailer = 0;
+      mchunkptr p = mem2chunk(mem);
+
+      if (PREACTION(m)) return 0;
+      if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */
+        /*
+          Find an aligned spot inside chunk.  Since we need to give
+          back leading space in a chunk of at least MIN_CHUNK_SIZE, if
+          the first calculation places us at a spot with less than
+          MIN_CHUNK_SIZE leader, we can move to the next aligned spot.
+          We've allocated enough total room so that this is always
+          possible.
+        */
+        char* br = (char*)mem2chunk((size_t)(((size_t)(mem +
+                                                       alignment -
+                                                       SIZE_T_ONE)) &
+                                             -alignment));
+        char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)?
+          br : br+alignment;
+        mchunkptr newp = (mchunkptr)pos;
+        size_t leadsize = pos - (char*)(p);
+        size_t newsize = chunksize(p) - leadsize;
+
+        if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */
+          newp->prev_foot = p->prev_foot + leadsize;
+          newp->head = (newsize|CINUSE_BIT);
+        }
+        else { /* Otherwise, give back leader, use the rest */
+          set_inuse(m, newp, newsize);
+          set_inuse(m, p, leadsize);
+          leader = chunk2mem(p);
+        }
+        p = newp;
+      }
+
+      /* Give back spare room at the end */
+      if (!is_mmapped(p)) {
+        size_t size = chunksize(p);
+        if (size > nb + MIN_CHUNK_SIZE) {
+          size_t remainder_size = size - nb;
+          mchunkptr remainder = chunk_plus_offset(p, nb);
+          set_inuse(m, p, nb);
+          set_inuse(m, remainder, remainder_size);
+          trailer = chunk2mem(remainder);
+        }
+      }
+
+      assert (chunksize(p) >= nb);
+      assert((((size_t)(chunk2mem(p))) % alignment) == 0);
+      check_inuse_chunk(m, p);
+      POSTACTION(m);
+      if (leader != 0) {
+        internal_free(m, leader);
+      }
+      if (trailer != 0) {
+        internal_free(m, trailer);
+      }
+      return chunk2mem(p);
+    }
+  }
+  return 0;
+}
+
+/* ------------------------ comalloc/coalloc support --------------------- */
+
+static void** ialloc(mstate m,
+                     size_t n_elements,
+                     size_t* sizes,
+                     int opts,
+                     void* chunks[]) {
+  /*
+    This provides common support for independent_X routines, handling
+    all of the combinations that can result.
+
+    The opts arg has:
+    bit 0 set if all elements are same size (using sizes[0])
+    bit 1 set if elements should be zeroed
+  */
+
+  size_t    element_size;   /* chunksize of each element, if all same */
+  size_t    contents_size;  /* total size of elements */
+  size_t    array_size;     /* request size of pointer array */
+  void*     mem;            /* malloced aggregate space */
+  mchunkptr p;              /* corresponding chunk */
+  size_t    remainder_size; /* remaining bytes while splitting */
+  void**    marray;         /* either "chunks" or malloced ptr array */
+  mchunkptr array_chunk;    /* chunk for malloced ptr array */
+  flag_t    was_enabled;    /* to disable mmap */
+  size_t    size;
+  size_t    i;
+
+  /* compute array length, if needed */
+  if (chunks != 0) {
+    if (n_elements == 0)
+      return chunks; /* nothing to do */
+    marray = chunks;
+    array_size = 0;
+  }
+  else {
+    /* if empty req, must still return chunk representing empty array */
+    if (n_elements == 0)
+      return (void**)internal_malloc(m, 0);
+    marray = 0;
+    array_size = request2size(n_elements * (sizeof(void*)));
+  }
+
+  /* compute total element size */
+  if (opts & 0x1) { /* all-same-size */
+    element_size = request2size(*sizes);
+    contents_size = n_elements * element_size;
+  }
+  else { /* add up all the sizes */
+    element_size = 0;
+    contents_size = 0;
+    for (i = 0; i != n_elements; ++i)
+      contents_size += request2size(sizes[i]);
+  }
+
+  size = contents_size + array_size;
+
+  /*
+     Allocate the aggregate chunk.  First disable direct-mmapping so
+     malloc won't use it, since we would not be able to later
+     free/realloc space internal to a segregated mmap region.
+  */
+  was_enabled = use_mmap(m);
+  disable_mmap(m);
+  mem = internal_malloc(m, size - CHUNK_OVERHEAD);
+  if (was_enabled)
+    enable_mmap(m);
+  if (mem == 0)
+    return 0;
+
+  if (PREACTION(m)) return 0;
+  p = mem2chunk(mem);
+  remainder_size = chunksize(p);
+
+  assert(!is_mmapped(p));
+
+  if (opts & 0x2) {       /* optionally clear the elements */
+    memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size);
+  }
+
+  /* If not provided, allocate the pointer array as final part of chunk */
+  if (marray == 0) {
+    size_t  array_chunk_size;
+    array_chunk = chunk_plus_offset(p, contents_size);
+    array_chunk_size = remainder_size - contents_size;
+    marray = (void**) (chunk2mem(array_chunk));
+    set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size);
+    remainder_size = contents_size;
+  }
+
+  /* split out elements */
+  for (i = 0; ; ++i) {
+    marray[i] = chunk2mem(p);
+    if (i != n_elements-1) {
+      if (element_size != 0)
+        size = element_size;
+      else
+        size = request2size(sizes[i]);
+      remainder_size -= size;
+      set_size_and_pinuse_of_inuse_chunk(m, p, size);
+      p = chunk_plus_offset(p, size);
+    }
+    else { /* the final element absorbs any overallocation slop */
+      set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size);
+      break;
+    }
+  }
+
+#if DEBUG
+  if (marray != chunks) {
+    /* final element must have exactly exhausted chunk */
+    if (element_size != 0) {
+      assert(remainder_size == element_size);
+    }
+    else {
+      assert(remainder_size == request2size(sizes[i]));
+    }
+    check_inuse_chunk(m, mem2chunk(marray));
+  }
+  for (i = 0; i != n_elements; ++i)
+    check_inuse_chunk(m, mem2chunk(marray[i]));
+
+#endif /* DEBUG */
+
+  POSTACTION(m);
+  return marray;
+}
+
+
+/* -------------------------- public routines ---------------------------- */
+
+#if !ONLY_MSPACES
+
+void* dlmalloc(size_t bytes) {
+  /*
+     Basic algorithm:
+     If a small request (< 256 bytes minus per-chunk overhead):
+       1. If one exists, use a remainderless chunk in associated smallbin.
+          (Remainderless means that there are too few excess bytes to
+          represent as a chunk.)
+       2. If it is big enough, use the dv chunk, which is normally the
+          chunk adjacent to the one used for the most recent small request.
+       3. If one exists, split the smallest available chunk in a bin,
+          saving remainder in dv.
+       4. If it is big enough, use the top chunk.
+       5. If available, get memory from system and use it
+     Otherwise, for a large request:
+       1. Find the smallest available binned chunk that fits, and use it
+          if it is better fitting than dv chunk, splitting if necessary.
+       2. If better fitting than any binned chunk, use the dv chunk.
+       3. If it is big enough, use the top chunk.
+       4. If request size >= mmap threshold, try to directly mmap this chunk.
+       5. If available, get memory from system and use it
+
+     The ugly goto's here ensure that postaction occurs along all paths.
+  */
+
+  if (!PREACTION(gm)) {
+    void* mem;
+    size_t nb;
+    if (bytes <= MAX_SMALL_REQUEST) {
+      bindex_t idx;
+      binmap_t smallbits;
+      nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
+      idx = small_index(nb);
+      smallbits = gm->smallmap >> idx;
+
+      if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
+        mchunkptr b, p;
+        idx += ~smallbits & 1;       /* Uses next bin if idx empty */
+        b = smallbin_at(gm, idx);
+        p = b->fd;
+        assert(chunksize(p) == small_index2size(idx));
+        unlink_first_small_chunk(gm, b, p, idx);
+        set_inuse_and_pinuse(gm, p, small_index2size(idx));
+        mem = chunk2mem(p);
+        check_malloced_chunk(gm, mem, nb);
+        goto postaction;
+      }
+
+      else if (nb > gm->dvsize) {
+        if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
+          mchunkptr b, p, r;
+          size_t rsize;
+          bindex_t i;
+          binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
+          binmap_t leastbit = least_bit(leftbits);
+          compute_bit2idx(leastbit, i);
+          b = smallbin_at(gm, i);
+          p = b->fd;
+          assert(chunksize(p) == small_index2size(i));
+          unlink_first_small_chunk(gm, b, p, i);
+          rsize = small_index2size(i) - nb;
+          /* Fit here cannot be remainderless if 4byte sizes */
+          if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
+            set_inuse_and_pinuse(gm, p, small_index2size(i));
+          else {
+            set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
+            r = chunk_plus_offset(p, nb);
+            set_size_and_pinuse_of_free_chunk(r, rsize);
+            replace_dv(gm, r, rsize);
+          }
+          mem = chunk2mem(p);
+          check_malloced_chunk(gm, mem, nb);
+          goto postaction;
+        }
+
+        else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) {
+          check_malloced_chunk(gm, mem, nb);
+          goto postaction;
+        }
+      }
+    }
+    else if (bytes >= MAX_REQUEST)
+      nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
+    else {
+      nb = pad_request(bytes);
+      if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) {
+        check_malloced_chunk(gm, mem, nb);
+        goto postaction;
+      }
+    }
+
+    if (nb <= gm->dvsize) {
+      size_t rsize = gm->dvsize - nb;
+      mchunkptr p = gm->dv;
+      if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
+        mchunkptr r = gm->dv = chunk_plus_offset(p, nb);
+        gm->dvsize = rsize;
+        set_size_and_pinuse_of_free_chunk(r, rsize);
+        set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
+      }
+      else { /* exhaust dv */
+        size_t dvs = gm->dvsize;
+        gm->dvsize = 0;
+        gm->dv = 0;
+        set_inuse_and_pinuse(gm, p, dvs);
+      }
+      mem = chunk2mem(p);
+      check_malloced_chunk(gm, mem, nb);
+      goto postaction;
+    }
+
+    else if (nb < gm->topsize) { /* Split top */
+      size_t rsize = gm->topsize -= nb;
+      mchunkptr p = gm->top;
+      mchunkptr r = gm->top = chunk_plus_offset(p, nb);
+      r->head = rsize | PINUSE_BIT;
+      set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
+      mem = chunk2mem(p);
+      check_top_chunk(gm, gm->top);
+      check_malloced_chunk(gm, mem, nb);
+      goto postaction;
+    }
+
+    mem = sys_alloc(gm, nb);
+
+  postaction:
+    POSTACTION(gm);
+    return mem;
+  }
+
+  return 0;
+}
+
+void dlfree(void* mem) {
+  /*
+     Consolidate freed chunks with preceding or succeeding bordering
+     free chunks, if they exist, and then place in a bin.  Intermixed
+     with special cases for top, dv, mmapped chunks, and usage errors.
+  */
+
+  if (mem != 0) {
+    mchunkptr p  = mem2chunk(mem);
+#if FOOTERS
+    mstate fm = get_mstate_for(p);
+    if (!ok_magic(fm)) {
+      USAGE_ERROR_ACTION(fm, p);
+      return;
+    }
+#else /* FOOTERS */
+#define fm gm
+#endif /* FOOTERS */
+    if (!PREACTION(fm)) {
+      check_inuse_chunk(fm, p);
+      if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) {
+        size_t psize = chunksize(p);
+        mchunkptr next = chunk_plus_offset(p, psize);
+        if (!pinuse(p)) {
+          size_t prevsize = p->prev_foot;
+          if ((prevsize & IS_MMAPPED_BIT) != 0) {
+            prevsize &= ~IS_MMAPPED_BIT;
+            psize += prevsize + MMAP_FOOT_PAD;
+            if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
+              fm->footprint -= psize;
+            goto postaction;
+          }
+          else {
+            mchunkptr prev = chunk_minus_offset(p, prevsize);
+            psize += prevsize;
+            p = prev;
+            if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
+              if (p != fm->dv) {
+                unlink_chunk(fm, p, prevsize);
+              }
+              else if ((next->head & INUSE_BITS) == INUSE_BITS) {
+                fm->dvsize = psize;
+                set_free_with_pinuse(p, psize, next);
+                goto postaction;
+              }
+            }
+            else
+              goto erroraction;
+          }
+        }
+
+        if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
+          if (!cinuse(next)) {  /* consolidate forward */
+            if (next == fm->top) {
+              size_t tsize = fm->topsize += psize;
+              fm->top = p;
+              p->head = tsize | PINUSE_BIT;
+              if (p == fm->dv) {
+                fm->dv = 0;
+                fm->dvsize = 0;
+              }
+              if (should_trim(fm, tsize))
+                sys_trim(fm, 0);
+              goto postaction;
+            }
+            else if (next == fm->dv) {
+              size_t dsize = fm->dvsize += psize;
+              fm->dv = p;
+              set_size_and_pinuse_of_free_chunk(p, dsize);
+              goto postaction;
+            }
+            else {
+              size_t nsize = chunksize(next);
+              psize += nsize;
+              unlink_chunk(fm, next, nsize);
+              set_size_and_pinuse_of_free_chunk(p, psize);
+              if (p == fm->dv) {
+                fm->dvsize = psize;
+                goto postaction;
+              }
+            }
+          }
+          else
+            set_free_with_pinuse(p, psize, next);
+          insert_chunk(fm, p, psize);
+          check_free_chunk(fm, p);
+          goto postaction;
+        }
+      }
+    erroraction:
+      USAGE_ERROR_ACTION(fm, p);
+    postaction:
+      POSTACTION(fm);
+    }
+  }
+#if !FOOTERS
+#undef fm
+#endif /* FOOTERS */
+}
+
+void* dlcalloc(size_t n_elements, size_t elem_size) {
+  void* mem;
+  size_t req = 0;
+  if (n_elements != 0) {
+    req = n_elements * elem_size;
+    if (((n_elements | elem_size) & ~(size_t)0xffff) &&
+        (req / n_elements != elem_size))
+      req = MAX_SIZE_T; /* force downstream failure on overflow */
+  }
+  mem = dlmalloc(req);
+  if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
+    memset(mem, 0, req);
+  return mem;
+}
+
+void* dlrealloc(void* oldmem, size_t bytes) {
+  if (oldmem == 0)
+    return dlmalloc(bytes);
+#ifdef REALLOC_ZERO_BYTES_FREES
+  if (bytes == 0) {
+    dlfree(oldmem);
+    return 0;
+  }
+#endif /* REALLOC_ZERO_BYTES_FREES */
+  else {
+#if ! FOOTERS
+    mstate m = gm;
+#else /* FOOTERS */
+    mstate m = get_mstate_for(mem2chunk(oldmem));
+    if (!ok_magic(m)) {
+      USAGE_ERROR_ACTION(m, oldmem);
+      return 0;
+    }
+#endif /* FOOTERS */
+    return internal_realloc(m, oldmem, bytes);
+  }
+}
+
+void* dlmemalign(size_t alignment, size_t bytes) {
+  return internal_memalign(gm, alignment, bytes);
+}
+
+void** dlindependent_calloc(size_t n_elements, size_t elem_size,
+                                 void* chunks[]) {
+  size_t sz = elem_size; /* serves as 1-element array */
+  return ialloc(gm, n_elements, &sz, 3, chunks);
+}
+
+void** dlindependent_comalloc(size_t n_elements, size_t sizes[],
+                                   void* chunks[]) {
+  return ialloc(gm, n_elements, sizes, 0, chunks);
+}
+
+void* dlvalloc(size_t bytes) {
+  size_t pagesz;
+  init_mparams();
+  pagesz = mparams.page_size;
+  return dlmemalign(pagesz, bytes);
+}
+
+void* dlpvalloc(size_t bytes) {
+  size_t pagesz;
+  init_mparams();
+  pagesz = mparams.page_size;
+  return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE));
+}
+
+int dlmalloc_trim(size_t pad) {
+  int result = 0;
+  if (!PREACTION(gm)) {
+    result = sys_trim(gm, pad);
+    POSTACTION(gm);
+  }
+  return result;
+}
+
+size_t dlmalloc_footprint(void) {
+  return gm->footprint;
+}
+
+size_t dlmalloc_max_footprint(void) {
+  return gm->max_footprint;
+}
+
+#if !NO_MALLINFO
+struct mallinfo dlmallinfo(void) {
+  return internal_mallinfo(gm);
+}
+#endif /* NO_MALLINFO */
+
+void dlmalloc_stats() {
+  internal_malloc_stats(gm);
+}
+
+size_t dlmalloc_usable_size(void* mem) {
+  if (mem != 0) {
+    mchunkptr p = mem2chunk(mem);
+    if (cinuse(p))
+      return chunksize(p) - overhead_for(p);
+  }
+  return 0;
+}
+
+int dlmallopt(int param_number, int value) {
+  return change_mparam(param_number, value);
+}
+
+#endif /* !ONLY_MSPACES */
+
+/* ----------------------------- user mspaces ---------------------------- */
+
+#if MSPACES
+
+static mstate init_user_mstate(char* tbase, size_t tsize) {
+  size_t msize = pad_request(sizeof(struct malloc_state));
+  mchunkptr mn;
+  mchunkptr msp = align_as_chunk(tbase);
+  mstate m = (mstate)(chunk2mem(msp));
+  memset(m, 0, msize);
+  INITIAL_LOCK(&m->mutex);
+  msp->head = (msize|PINUSE_BIT|CINUSE_BIT);
+  m->seg.base = m->least_addr = tbase;
+  m->seg.size = m->footprint = m->max_footprint = tsize;
+  m->magic = mparams.magic;
+  m->mflags = mparams.default_mflags;
+  disable_contiguous(m);
+  init_bins(m);
+  mn = next_chunk(mem2chunk(m));
+  init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE);
+  check_top_chunk(m, m->top);
+  return m;
+}
+
+mspace create_mspace(size_t capacity, int locked) {
+  mstate m = 0;
+  size_t msize = pad_request(sizeof(struct malloc_state));
+  init_mparams(); /* Ensure pagesize etc initialized */
+
+  if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
+    size_t rs = ((capacity == 0)? mparams.granularity :
+                 (capacity + TOP_FOOT_SIZE + msize));
+    size_t tsize = granularity_align(rs);
+    char* tbase = (char*)(CALL_MMAP(tsize));
+    if (tbase != CMFAIL) {
+      m = init_user_mstate(tbase, tsize);
+      set_segment_flags(&m->seg, IS_MMAPPED_BIT);
+      set_lock(m, locked);
+    }
+  }
+  return (mspace)m;
+}
+
+mspace create_mspace_with_base(void* base, size_t capacity, int locked) {
+  mstate m = 0;
+  size_t msize = pad_request(sizeof(struct malloc_state));
+  init_mparams(); /* Ensure pagesize etc initialized */
+
+  if (capacity > msize + TOP_FOOT_SIZE &&
+      capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
+    m = init_user_mstate((char*)base, capacity);
+    set_segment_flags(&m->seg, EXTERN_BIT);
+    set_lock(m, locked);
+  }
+  return (mspace)m;
+}
+
+size_t destroy_mspace(mspace msp) {
+  size_t freed = 0;
+  mstate ms = (mstate)msp;
+  if (ok_magic(ms)) {
+    msegmentptr sp = &ms->seg;
+    while (sp != 0) {
+      char* base = sp->base;
+      size_t size = sp->size;
+      flag_t flag = get_segment_flags(sp);
+      sp = sp->next;
+      if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) &&
+          CALL_MUNMAP(base, size) == 0)
+        freed += size;
+    }
+  }
+  else {
+    USAGE_ERROR_ACTION(ms,ms);
+  }
+  return freed;
+}
+
+/*
+  mspace versions of routines are near-clones of the global
+  versions. This is not so nice but better than the alternatives.
+*/
+
+
+void* mspace_malloc(mspace msp, size_t bytes) {
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+    return 0;
+  }
+  if (!PREACTION(ms)) {
+    void* mem;
+    size_t nb;
+    if (bytes <= MAX_SMALL_REQUEST) {
+      bindex_t idx;
+      binmap_t smallbits;
+      nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
+      idx = small_index(nb);
+      smallbits = ms->smallmap >> idx;
+
+      if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
+        mchunkptr b, p;
+        idx += ~smallbits & 1;       /* Uses next bin if idx empty */
+        b = smallbin_at(ms, idx);
+        p = b->fd;
+        assert(chunksize(p) == small_index2size(idx));
+        unlink_first_small_chunk(ms, b, p, idx);
+        set_inuse_and_pinuse(ms, p, small_index2size(idx));
+        mem = chunk2mem(p);
+        check_malloced_chunk(ms, mem, nb);
+        goto postaction;
+      }
+
+      else if (nb > ms->dvsize) {
+        if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
+          mchunkptr b, p, r;
+          size_t rsize;
+          bindex_t i;
+          binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
+          binmap_t leastbit = least_bit(leftbits);
+          compute_bit2idx(leastbit, i);
+          b = smallbin_at(ms, i);
+          p = b->fd;
+          assert(chunksize(p) == small_index2size(i));
+          unlink_first_small_chunk(ms, b, p, i);
+          rsize = small_index2size(i) - nb;
+          /* Fit here cannot be remainderless if 4byte sizes */
+          if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
+            set_inuse_and_pinuse(ms, p, small_index2size(i));
+          else {
+            set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
+            r = chunk_plus_offset(p, nb);
+            set_size_and_pinuse_of_free_chunk(r, rsize);
+            replace_dv(ms, r, rsize);
+          }
+          mem = chunk2mem(p);
+          check_malloced_chunk(ms, mem, nb);
+          goto postaction;
+        }
+
+        else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) {
+          check_malloced_chunk(ms, mem, nb);
+          goto postaction;
+        }
+      }
+    }
+    else if (bytes >= MAX_REQUEST)
+      nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
+    else {
+      nb = pad_request(bytes);
+      if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {
+        check_malloced_chunk(ms, mem, nb);
+        goto postaction;
+      }
+    }
+
+    if (nb <= ms->dvsize) {
+      size_t rsize = ms->dvsize - nb;
+      mchunkptr p = ms->dv;
+      if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
+        mchunkptr r = ms->dv = chunk_plus_offset(p, nb);
+        ms->dvsize = rsize;
+        set_size_and_pinuse_of_free_chunk(r, rsize);
+        set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
+      }
+      else { /* exhaust dv */
+        size_t dvs = ms->dvsize;
+        ms->dvsize = 0;
+        ms->dv = 0;
+        set_inuse_and_pinuse(ms, p, dvs);
+      }
+      mem = chunk2mem(p);
+      check_malloced_chunk(ms, mem, nb);
+      goto postaction;
+    }
+
+    else if (nb < ms->topsize) { /* Split top */
+      size_t rsize = ms->topsize -= nb;
+      mchunkptr p = ms->top;
+      mchunkptr r = ms->top = chunk_plus_offset(p, nb);
+      r->head = rsize | PINUSE_BIT;
+      set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
+      mem = chunk2mem(p);
+      check_top_chunk(ms, ms->top);
+      check_malloced_chunk(ms, mem, nb);
+      goto postaction;
+    }
+
+    mem = sys_alloc(ms, nb);
+
+  postaction:
+    POSTACTION(ms);
+    return mem;
+  }
+
+  return 0;
+}
+
+void mspace_free(mspace msp, void* mem) {
+  if (mem != 0) {
+    mchunkptr p  = mem2chunk(mem);
+#if FOOTERS
+    mstate fm = get_mstate_for(p);
+#else /* FOOTERS */
+    mstate fm = (mstate)msp;
+#endif /* FOOTERS */
+    if (!ok_magic(fm)) {
+      USAGE_ERROR_ACTION(fm, p);
+      return;
+    }
+    if (!PREACTION(fm)) {
+      check_inuse_chunk(fm, p);
+      if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) {
+        size_t psize = chunksize(p);
+        mchunkptr next = chunk_plus_offset(p, psize);
+        if (!pinuse(p)) {
+          size_t prevsize = p->prev_foot;
+          if ((prevsize & IS_MMAPPED_BIT) != 0) {
+            prevsize &= ~IS_MMAPPED_BIT;
+            psize += prevsize + MMAP_FOOT_PAD;
+            if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
+              fm->footprint -= psize;
+            goto postaction;
+          }
+          else {
+            mchunkptr prev = chunk_minus_offset(p, prevsize);
+            psize += prevsize;
+            p = prev;
+            if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
+              if (p != fm->dv) {
+                unlink_chunk(fm, p, prevsize);
+              }
+              else if ((next->head & INUSE_BITS) == INUSE_BITS) {
+                fm->dvsize = psize;
+                set_free_with_pinuse(p, psize, next);
+                goto postaction;
+              }
+            }
+            else
+              goto erroraction;
+          }
+        }
+
+        if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
+          if (!cinuse(next)) {  /* consolidate forward */
+            if (next == fm->top) {
+              size_t tsize = fm->topsize += psize;
+              fm->top = p;
+              p->head = tsize | PINUSE_BIT;
+              if (p == fm->dv) {
+                fm->dv = 0;
+                fm->dvsize = 0;
+              }
+              if (should_trim(fm, tsize))
+                sys_trim(fm, 0);
+              goto postaction;
+            }
+            else if (next == fm->dv) {
+              size_t dsize = fm->dvsize += psize;
+              fm->dv = p;
+              set_size_and_pinuse_of_free_chunk(p, dsize);
+              goto postaction;
+            }
+            else {
+              size_t nsize = chunksize(next);
+              psize += nsize;
+              unlink_chunk(fm, next, nsize);
+              set_size_and_pinuse_of_free_chunk(p, psize);
+              if (p == fm->dv) {
+                fm->dvsize = psize;
+                goto postaction;
+              }
+            }
+          }
+          else
+            set_free_with_pinuse(p, psize, next);
+          insert_chunk(fm, p, psize);
+          check_free_chunk(fm, p);
+          goto postaction;
+        }
+      }
+    erroraction:
+      USAGE_ERROR_ACTION(fm, p);
+    postaction:
+      POSTACTION(fm);
+    }
+  }
+}
+
+void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) {
+  void* mem;
+  size_t req = 0;
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+    return 0;
+  }
+  if (n_elements != 0) {
+    req = n_elements * elem_size;
+    if (((n_elements | elem_size) & ~(size_t)0xffff) &&
+        (req / n_elements != elem_size))
+      req = MAX_SIZE_T; /* force downstream failure on overflow */
+  }
+  mem = internal_malloc(ms, req);
+  if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
+    memset(mem, 0, req);
+  return mem;
+}
+
+void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) {
+  if (oldmem == 0)
+    return mspace_malloc(msp, bytes);
+#ifdef REALLOC_ZERO_BYTES_FREES
+  if (bytes == 0) {
+    mspace_free(msp, oldmem);
+    return 0;
+  }
+#endif /* REALLOC_ZERO_BYTES_FREES */
+  else {
+#if FOOTERS
+    mchunkptr p  = mem2chunk(oldmem);
+    mstate ms = get_mstate_for(p);
+#else /* FOOTERS */
+    mstate ms = (mstate)msp;
+#endif /* FOOTERS */
+    if (!ok_magic(ms)) {
+      USAGE_ERROR_ACTION(ms,ms);
+      return 0;
+    }
+    return internal_realloc(ms, oldmem, bytes);
+  }
+}
+
+void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) {
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+    return 0;
+  }
+  return internal_memalign(ms, alignment, bytes);
+}
+
+void** mspace_independent_calloc(mspace msp, size_t n_elements,
+                                 size_t elem_size, void* chunks[]) {
+  size_t sz = elem_size; /* serves as 1-element array */
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+    return 0;
+  }
+  return ialloc(ms, n_elements, &sz, 3, chunks);
+}
+
+void** mspace_independent_comalloc(mspace msp, size_t n_elements,
+                                   size_t sizes[], void* chunks[]) {
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+    return 0;
+  }
+  return ialloc(ms, n_elements, sizes, 0, chunks);
+}
+
+int mspace_trim(mspace msp, size_t pad) {
+  int result = 0;
+  mstate ms = (mstate)msp;
+  if (ok_magic(ms)) {
+    if (!PREACTION(ms)) {
+      result = sys_trim(ms, pad);
+      POSTACTION(ms);
+    }
+  }
+  else {
+    USAGE_ERROR_ACTION(ms,ms);
+  }
+  return result;
+}
+
+void mspace_malloc_stats(mspace msp) {
+  mstate ms = (mstate)msp;
+  if (ok_magic(ms)) {
+    internal_malloc_stats(ms);
+  }
+  else {
+    USAGE_ERROR_ACTION(ms,ms);
+  }
+}
+
+size_t mspace_footprint(mspace msp) {
+  size_t result;
+  mstate ms = (mstate)msp;
+  if (ok_magic(ms)) {
+    result = ms->footprint;
+  }
+  USAGE_ERROR_ACTION(ms,ms);
+  return result;
+}
+
+
+size_t mspace_max_footprint(mspace msp) {
+  size_t result;
+  mstate ms = (mstate)msp;
+  if (ok_magic(ms)) {
+    result = ms->max_footprint;
+  }
+  USAGE_ERROR_ACTION(ms,ms);
+  return result;
+}
+
+
+#if !NO_MALLINFO
+struct mallinfo mspace_mallinfo(mspace msp) {
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+  }
+  return internal_mallinfo(ms);
+}
+#endif /* NO_MALLINFO */
+
+int mspace_mallopt(int param_number, int value) {
+  return change_mparam(param_number, value);
+}
+
+#endif /* MSPACES */
+
+/* -------------------- Alternative MORECORE functions ------------------- */
+
+/*
+  Guidelines for creating a custom version of MORECORE:
+
+  * For best performance, MORECORE should allocate in multiples of pagesize.
+  * MORECORE may allocate more memory than requested. (Or even less,
+      but this will usually result in a malloc failure.)
+  * MORECORE must not allocate memory when given argument zero, but
+      instead return one past the end address of memory from previous
+      nonzero call.
+  * For best performance, consecutive calls to MORECORE with positive
+      arguments should return increasing addresses, indicating that
+      space has been contiguously extended.
+  * Even though consecutive calls to MORECORE need not return contiguous
+      addresses, it must be OK for malloc'ed chunks to span multiple
+      regions in those cases where they do happen to be contiguous.
+  * MORECORE need not handle negative arguments -- it may instead
+      just return MFAIL when given negative arguments.
+      Negative arguments are always multiples of pagesize. MORECORE
+      must not misinterpret negative args as large positive unsigned
+      args. You can suppress all such calls from even occurring by defining
+      MORECORE_CANNOT_TRIM,
+
+  As an example alternative MORECORE, here is a custom allocator
+  kindly contributed for pre-OSX macOS.  It uses virtually but not
+  necessarily physically contiguous non-paged memory (locked in,
+  present and won't get swapped out).  You can use it by uncommenting
+  this section, adding some #includes, and setting up the appropriate
+  defines above:
+
+      #define MORECORE osMoreCore
+
+  There is also a shutdown routine that should somehow be called for
+  cleanup upon program exit.
+
+  #define MAX_POOL_ENTRIES 100
+  #define MINIMUM_MORECORE_SIZE  (64 * 1024U)
+  static int next_os_pool;
+  void *our_os_pools[MAX_POOL_ENTRIES];
+
+  void *osMoreCore(int size)
+  {
+    void *ptr = 0;
+    static void *sbrk_top = 0;
+
+    if (size > 0)
+    {
+      if (size < MINIMUM_MORECORE_SIZE)
+         size = MINIMUM_MORECORE_SIZE;
+      if (CurrentExecutionLevel() == kTaskLevel)
+         ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
+      if (ptr == 0)
+      {
+        return (void *) MFAIL;
+      }
+      // save ptrs so they can be freed during cleanup
+      our_os_pools[next_os_pool] = ptr;
+      next_os_pool++;
+      ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
+      sbrk_top = (char *) ptr + size;
+      return ptr;
+    }
+    else if (size < 0)
+    {
+      // we don't currently support shrink behavior
+      return (void *) MFAIL;
+    }
+    else
+    {
+      return sbrk_top;
+    }
+  }
+
+  // cleanup any allocated memory pools
+  // called as last thing before shutting down driver
+
+  void osCleanupMem(void)
+  {
+    void **ptr;
+
+    for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
+      if (*ptr)
+      {
+         PoolDeallocate(*ptr);
+         *ptr = 0;
+      }
+  }
+
+*/
+
+
+/* -----------------------------------------------------------------------
+History:
+    V2.8.3 Thu Sep 22 11:16:32 2005  Doug Lea  (dl at gee)
+      * Add max_footprint functions
+      * Ensure all appropriate literals are size_t
+      * Fix conditional compilation problem for some #define settings
+      * Avoid concatenating segments with the one provided
+        in create_mspace_with_base
+      * Rename some variables to avoid compiler shadowing warnings
+      * Use explicit lock initialization.
+      * Better handling of sbrk interference.
+      * Simplify and fix segment insertion, trimming and mspace_destroy
+      * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x
+      * Thanks especially to Dennis Flanagan for help on these.
+
+    V2.8.2 Sun Jun 12 16:01:10 2005  Doug Lea  (dl at gee)
+      * Fix memalign brace error.
+
+    V2.8.1 Wed Jun  8 16:11:46 2005  Doug Lea  (dl at gee)
+      * Fix improper #endif nesting in C++
+      * Add explicit casts needed for C++
+
+    V2.8.0 Mon May 30 14:09:02 2005  Doug Lea  (dl at gee)
+      * Use trees for large bins
+      * Support mspaces
+      * Use segments to unify sbrk-based and mmap-based system allocation,
+        removing need for emulation on most platforms without sbrk.
+      * Default safety checks
+      * Optional footer checks. Thanks to William Robertson for the idea.
+      * Internal code refactoring
+      * Incorporate suggestions and platform-specific changes.
+        Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas,
+        Aaron Bachmann,  Emery Berger, and others.
+      * Speed up non-fastbin processing enough to remove fastbins.
+      * Remove useless cfree() to avoid conflicts with other apps.
+      * Remove internal memcpy, memset. Compilers handle builtins better.
+      * Remove some options that no one ever used and rename others.
+
+    V2.7.2 Sat Aug 17 09:07:30 2002  Doug Lea  (dl at gee)
+      * Fix malloc_state bitmap array misdeclaration
+
+    V2.7.1 Thu Jul 25 10:58:03 2002  Doug Lea  (dl at gee)
+      * Allow tuning of FIRST_SORTED_BIN_SIZE
+      * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte.
+      * Better detection and support for non-contiguousness of MORECORE.
+        Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger
+      * Bypass most of malloc if no frees. Thanks To Emery Berger.
+      * Fix freeing of old top non-contiguous chunk im sysmalloc.
+      * Raised default trim and map thresholds to 256K.
+      * Fix mmap-related #defines. Thanks to Lubos Lunak.
+      * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield.
+      * Branch-free bin calculation
+      * Default trim and mmap thresholds now 256K.
+
+    V2.7.0 Sun Mar 11 14:14:06 2001  Doug Lea  (dl at gee)
+      * Introduce independent_comalloc and independent_calloc.
+        Thanks to Michael Pachos for motivation and help.
+      * Make optional .h file available
+      * Allow > 2GB requests on 32bit systems.
+      * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>.
+        Thanks also to Andreas Mueller <a.mueller at paradatec.de>,
+        and Anonymous.
+      * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for
+        helping test this.)
+      * memalign: check alignment arg
+      * realloc: don't try to shift chunks backwards, since this
+        leads to  more fragmentation in some programs and doesn't
+        seem to help in any others.
+      * Collect all cases in malloc requiring system memory into sysmalloc
+      * Use mmap as backup to sbrk
+      * Place all internal state in malloc_state
+      * Introduce fastbins (although similar to 2.5.1)
+      * Many minor tunings and cosmetic improvements
+      * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK
+      * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS
+        Thanks to Tony E. Bennett <tbennett@nvidia.com> and others.
+      * Include errno.h to support default failure action.
+
+    V2.6.6 Sun Dec  5 07:42:19 1999  Doug Lea  (dl at gee)
+      * return null for negative arguments
+      * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com>
+         * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
+          (e.g. WIN32 platforms)
+         * Cleanup header file inclusion for WIN32 platforms
+         * Cleanup code to avoid Microsoft Visual C++ compiler complaints
+         * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
+           memory allocation routines
+         * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
+         * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
+           usage of 'assert' in non-WIN32 code
+         * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
+           avoid infinite loop
+      * Always call 'fREe()' rather than 'free()'
+
+    V2.6.5 Wed Jun 17 15:57:31 1998  Doug Lea  (dl at gee)
+      * Fixed ordering problem with boundary-stamping
+
+    V2.6.3 Sun May 19 08:17:58 1996  Doug Lea  (dl at gee)
+      * Added pvalloc, as recommended by H.J. Liu
+      * Added 64bit pointer support mainly from Wolfram Gloger
+      * Added anonymously donated WIN32 sbrk emulation
+      * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
+      * malloc_extend_top: fix mask error that caused wastage after
+        foreign sbrks
+      * Add linux mremap support code from HJ Liu
+
+    V2.6.2 Tue Dec  5 06:52:55 1995  Doug Lea  (dl at gee)
+      * Integrated most documentation with the code.
+      * Add support for mmap, with help from
+        Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+      * Use last_remainder in more cases.
+      * Pack bins using idea from  colin@nyx10.cs.du.edu
+      * Use ordered bins instead of best-fit threshhold
+      * Eliminate block-local decls to simplify tracing and debugging.
+      * Support another case of realloc via move into top
+      * Fix error occuring when initial sbrk_base not word-aligned.
+      * Rely on page size for units instead of SBRK_UNIT to
+        avoid surprises about sbrk alignment conventions.
+      * Add mallinfo, mallopt. Thanks to Raymond Nijssen
+        (raymond@es.ele.tue.nl) for the suggestion.
+      * Add `pad' argument to malloc_trim and top_pad mallopt parameter.
+      * More precautions for cases where other routines call sbrk,
+        courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+      * Added macros etc., allowing use in linux libc from
+        H.J. Lu (hjl@gnu.ai.mit.edu)
+      * Inverted this history list
+
+    V2.6.1 Sat Dec  2 14:10:57 1995  Doug Lea  (dl at gee)
+      * Re-tuned and fixed to behave more nicely with V2.6.0 changes.
+      * Removed all preallocation code since under current scheme
+        the work required to undo bad preallocations exceeds
+        the work saved in good cases for most test programs.
+      * No longer use return list or unconsolidated bins since
+        no scheme using them consistently outperforms those that don't
+        given above changes.
+      * Use best fit for very large chunks to prevent some worst-cases.
+      * Added some support for debugging
+
+    V2.6.0 Sat Nov  4 07:05:23 1995  Doug Lea  (dl at gee)
+      * Removed footers when chunks are in use. Thanks to
+        Paul Wilson (wilson@cs.texas.edu) for the suggestion.
+
+    V2.5.4 Wed Nov  1 07:54:51 1995  Doug Lea  (dl at gee)
+      * Added malloc_trim, with help from Wolfram Gloger
+        (wmglo@Dent.MED.Uni-Muenchen.DE).
+
+    V2.5.3 Tue Apr 26 10:16:01 1994  Doug Lea  (dl at g)
+
+    V2.5.2 Tue Apr  5 16:20:40 1994  Doug Lea  (dl at g)
+      * realloc: try to expand in both directions
+      * malloc: swap order of clean-bin strategy;
+      * realloc: only conditionally expand backwards
+      * Try not to scavenge used bins
+      * Use bin counts as a guide to preallocation
+      * Occasionally bin return list chunks in first scan
+      * Add a few optimizations from colin@nyx10.cs.du.edu
+
+    V2.5.1 Sat Aug 14 15:40:43 1993  Doug Lea  (dl at g)
+      * faster bin computation & slightly different binning
+      * merged all consolidations to one part of malloc proper
+         (eliminating old malloc_find_space & malloc_clean_bin)
+      * Scan 2 returns chunks (not just 1)
+      * Propagate failure in realloc if malloc returns 0
+      * Add stuff to allow compilation on non-ANSI compilers
+          from kpv@research.att.com
+
+    V2.5 Sat Aug  7 07:41:59 1993  Doug Lea  (dl at g.oswego.edu)
+      * removed potential for odd address access in prev_chunk
+      * removed dependency on getpagesize.h
+      * misc cosmetics and a bit more internal documentation
+      * anticosmetics: mangled names in macros to evade debugger strangeness
+      * tested on sparc, hp-700, dec-mips, rs6000
+          with gcc & native cc (hp, dec only) allowing
+          Detlefs & Zorn comparison study (in SIGPLAN Notices.)
+
+    Trial version Fri Aug 28 13:14:29 1992  Doug Lea  (dl at g.oswego.edu)
+      * Based loosely on libg++-1.2X malloc. (It retains some of the overall
+         structure of old version,  but most details differ.)
+ 
+*/
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/eabi.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/eabi.S
new file mode 100644
index 0000000..379ea4b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/eabi.S
@@ -0,0 +1,128 @@
+/* -----------------------------------------------------------------------
+   eabi.S - Copyright (c) 2004  Anthony Green
+   
+   FR-V Assembly glue.
+
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+	.globl ffi_prep_args_EABI
+
+	.text
+	.p2align 4
+	.globl ffi_call_EABI
+	.type ffi_call_EABI, @function
+
+	# gr8 :   ffi_prep_args
+	# gr9 :   &ecif
+	# gr10:   cif->bytes
+	# gr11:   fig->flags
+	# gr12:   ecif.rvalue
+	# gr13:   fn
+	
+ffi_call_EABI:	
+	addi	sp, #-80, sp
+	sti	fp, @(sp, #24)
+	addi	sp, #24, fp
+	movsg	lr, gr5
+
+	/* Make room for the new arguments.  */
+	/* subi	sp, fp, gr10 */
+	
+	/* Store return address and incoming args on stack.  */
+	sti	gr5, @(fp, #8)
+	sti	gr8, @(fp, #-4)
+	sti	gr9, @(fp, #-8)
+	sti	gr10, @(fp, #-12)
+	sti	gr11, @(fp, #-16)
+	sti	gr12, @(fp, #-20)
+	sti	gr13, @(fp, #-24)
+
+	sub     sp, gr10, sp
+	
+	/* Call ffi_prep_args.  */
+	ldi	@(fp, #-4), gr4
+	addi	sp, #0, gr8
+	ldi	@(fp, #-8), gr9
+#ifdef __FRV_FDPIC__
+	ldd	@(gr4, gr0), gr14
+	calll	@(gr14, gr0)
+#else
+	calll	@(gr4, gr0)
+#endif	
+
+	/* ffi_prep_args returns the new stack pointer.  */
+	mov	gr8, gr4
+		
+	ldi	@(sp, #0), gr8
+	ldi	@(sp, #4), gr9
+	ldi	@(sp, #8), gr10
+	ldi	@(sp, #12), gr11
+	ldi	@(sp, #16), gr12
+	ldi	@(sp, #20), gr13
+
+	/* Always copy the return value pointer into the hidden
+	   parameter register.  This is only strictly necessary
+	   when we're returning an aggregate type, but it doesn't
+	   hurt to do this all the time, and it saves a branch.  */
+	ldi	@(fp, #-20), gr3
+
+	/* Use the ffi_prep_args return value for the new sp.  */
+	mov	gr4, sp
+	
+	/* Call the target function.  */
+	ldi	@(fp, -24), gr4
+#ifdef __FRV_FDPIC__
+	ldd	@(gr4, gr0), gr14
+	calll	@(gr14, gr0)
+#else
+	calll	@(gr4, gr0)
+#endif	
+
+	/* Store the result. */
+	ldi	@(fp, #-16), gr10  /* fig->flags */
+	ldi	@(fp, #-20), gr4   /* ecif.rvalue */
+
+	/* Is the return value stored in two registers?  */
+	cmpi	gr10, #8, icc0
+	bne	icc0, 0, .L2
+	/*   Yes, save them.  */
+	sti	gr8, @(gr4, #0)
+	sti	gr9, @(gr4, #4)
+	bra	.L3
+.L2:
+	/* Is the return value a structure?  */
+	cmpi	gr10, #-1, icc0
+	beq	icc0, 0, .L3
+	/*   No, save a 4 byte return value.  */
+	sti	gr8, @(gr4, #0)
+.L3:	
+
+	/* Restore the stack, and return.  */
+	ldi	@(fp, 8), gr5
+	ld	@(fp, gr0), fp
+	addi	sp,#80,sp
+	jmpl	@(gr5,gr0)
+	.size ffi_call_EABI, .-ffi_call_EABI
+	
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffi.c
new file mode 100644
index 0000000..5698c89
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffi.c
@@ -0,0 +1,292 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (C) 2004  Anthony Green
+   Copyright (C) 2007  Free Software Foundation, Inc.
+	   Copyright (C) 2008  Red Hat, Inc.
+   
+   FR-V Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+
+/* ffi_prep_args is called by the assembly routine once stack space
+   has been allocated for the function's arguments */
+
+void *ffi_prep_args(char *stack, extended_cif *ecif)
+{
+  register unsigned int i;
+  register void **p_argv;
+  register char *argp;
+  register ffi_type **p_arg;
+  register int count = 0;
+
+  p_argv = ecif->avalue;
+  argp = stack;
+
+  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+       (i != 0);
+       i--, p_arg++)
+    {
+      size_t z;
+      
+      z = (*p_arg)->size;
+
+      if ((*p_arg)->type == FFI_TYPE_STRUCT)
+	{
+	  z = sizeof(void*);
+	  *(void **) argp = *p_argv;
+	} 
+      /*      if ((*p_arg)->type == FFI_TYPE_FLOAT)
+	{
+	  if (count > 24)
+	    {
+	      // This is going on the stack.  Turn it into a double.  
+	      *(double *) argp = (double) *(float*)(* p_argv);
+	      z = sizeof(double);
+	    }
+	  else
+	    *(void **) argp = *(void **)(* p_argv);
+	}  */
+      else if (z < sizeof(int))
+	{
+	  z = sizeof(int);
+	  switch ((*p_arg)->type)
+	    {
+	    case FFI_TYPE_SINT8:
+	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
+	      break;
+	      
+	    case FFI_TYPE_UINT8:
+	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
+	      break;
+	      
+	    case FFI_TYPE_SINT16:
+	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
+	      break;
+		  
+	    case FFI_TYPE_UINT16:
+	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
+	      break;
+		  
+	    default:
+	      FFI_ASSERT(0);
+	    }
+	}
+      else if (z == sizeof(int))
+	{
+	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
+	}
+      else
+	{
+	  memcpy(argp, *p_argv, z);
+	}
+      p_argv++;
+      argp += z;
+      count += z;
+    }
+
+  return (stack + ((count > 24) ? 24 : ALIGN_DOWN(count, 8)));
+}
+
+/* Perform machine dependent cif processing */
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  if (cif->rtype->type == FFI_TYPE_STRUCT)
+    cif->flags = -1;
+  else
+    cif->flags = cif->rtype->size;
+
+  cif->bytes = ALIGN (cif->bytes, 8);
+
+  return FFI_OK;
+}
+
+extern void ffi_call_EABI(void *(*)(char *, extended_cif *), 
+			  extended_cif *, 
+			  unsigned, unsigned, 
+			  unsigned *, 
+			  void (*fn)(void));
+
+void ffi_call(ffi_cif *cif, 
+	      void (*fn)(void), 
+	      void *rvalue, 
+	      void **avalue)
+{
+  extended_cif ecif;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+  
+  /* If the return value is a struct and we don't have a return	*/
+  /* value address then we need to make one		        */
+
+  if ((rvalue == NULL) && 
+      (cif->rtype->type == FFI_TYPE_STRUCT))
+    {
+      ecif.rvalue = alloca(cif->rtype->size);
+    }
+  else
+    ecif.rvalue = rvalue;
+    
+  
+  switch (cif->abi) 
+    {
+    case FFI_EABI:
+      ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, 
+		    cif->flags, ecif.rvalue, fn);
+      break;
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+}
+
+void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3,
+		       unsigned arg4, unsigned arg5, unsigned arg6)
+{
+  /* This function is called by a trampoline.  The trampoline stows a
+     pointer to the ffi_closure object in gr7.  We must save this
+     pointer in a place that will persist while we do our work.  */
+  register ffi_closure *creg __asm__ ("gr7");
+  ffi_closure *closure = creg;
+
+  /* Arguments that don't fit in registers are found on the stack
+     at a fixed offset above the current frame pointer.  */
+  register char *frame_pointer __asm__ ("fp");
+  char *stack_args = frame_pointer + 16;
+
+  /* Lay the register arguments down in a continuous chunk of memory.  */
+  unsigned register_args[6] =
+    { arg1, arg2, arg3, arg4, arg5, arg6 };
+
+  ffi_cif *cif = closure->cif;
+  ffi_type **arg_types = cif->arg_types;
+  void **avalue = alloca (cif->nargs * sizeof(void *));
+  char *ptr = (char *) register_args;
+  int i;
+
+  /* Find the address of each argument.  */
+  for (i = 0; i < cif->nargs; i++)
+    {
+      switch (arg_types[i]->type)
+	{
+	case FFI_TYPE_SINT8:
+	case FFI_TYPE_UINT8:
+	  avalue[i] = ptr + 3;
+	  break;
+	case FFI_TYPE_SINT16:
+	case FFI_TYPE_UINT16:
+	  avalue[i] = ptr + 2;
+	  break;
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_UINT32:
+	case FFI_TYPE_FLOAT:
+	  avalue[i] = ptr;
+	  break;
+	case FFI_TYPE_STRUCT:
+	  avalue[i] = *(void**)ptr;
+	  break;
+	default:
+	  /* This is an 8-byte value.  */
+	  avalue[i] = ptr;
+	  ptr += 4;
+	  break;
+	}
+      ptr += 4;
+
+      /* If we've handled more arguments than fit in registers,
+	 start looking at the those passed on the stack.  */
+      if (ptr == ((char *)register_args + (6*4)))
+	ptr = stack_args;
+    }
+
+  /* Invoke the closure.  */
+  if (cif->rtype->type == FFI_TYPE_STRUCT)
+    {
+      /* The caller allocates space for the return structure, and
+       passes a pointer to this space in gr3.  Use this value directly
+       as the return value.  */
+      register void *return_struct_ptr __asm__("gr3");
+      (closure->fun) (cif, return_struct_ptr, avalue, closure->user_data);
+    }
+  else
+    {
+      /* Allocate space for the return value and call the function.  */
+      long long rvalue;
+      (closure->fun) (cif, &rvalue, avalue, closure->user_data);
+
+      /* Functions return 4-byte or smaller results in gr8.  8-byte
+	 values also use gr9.  We fill the both, even for small return
+	 values, just to avoid a branch.  */ 
+      asm ("ldi  @(%0, #0), gr8" : : "r" (&rvalue));
+      asm ("ldi  @(%0, #0), gr9" : : "r" (&((int *) &rvalue)[1]));
+    }
+}
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*, void*, void**, void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
+  unsigned long fn = (long) ffi_closure_eabi;
+  unsigned long cls = (long) codeloc;
+#ifdef __FRV_FDPIC__
+  register void *got __asm__("gr15");
+#endif
+  int i;
+
+  fn = (unsigned long) ffi_closure_eabi;
+
+#ifdef __FRV_FDPIC__
+  tramp[0] = &((unsigned int *)codeloc)[2];
+  tramp[1] = got;
+  tramp[2] = 0x8cfc0000 + (fn  & 0xffff); /* setlos lo(fn), gr6    */
+  tramp[3] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7   */
+  tramp[4] = 0x8cf80000 + (fn  >> 16);	  /* sethi hi(fn), gr6     */
+  tramp[5] = 0x8ef80000 + (cls >> 16);    /* sethi hi(cls), gr7    */
+  tramp[6] = 0x9cc86000;                  /* ldi @(gr6, #0), gr14  */
+  tramp[7] = 0x8030e000;                  /* jmpl @(gr14, gr0)     */
+#else
+  tramp[0] = 0x8cfc0000 + (fn  & 0xffff); /* setlos lo(fn), gr6    */
+  tramp[1] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7   */
+  tramp[2] = 0x8cf80000 + (fn  >> 16);	  /* sethi hi(fn), gr6     */
+  tramp[3] = 0x8ef80000 + (cls >> 16);    /* sethi hi(cls), gr7    */
+  tramp[4] = 0x80300006;                  /* jmpl @(gr0, gr6)      */
+#endif
+
+  closure->cif = cif;
+  closure->fun = fun;
+  closure->user_data = user_data;
+
+  /* Cache flushing.  */
+  for (i = 0; i < FFI_TRAMPOLINE_SIZE; i++)
+    __asm__ volatile ("dcf @(%0,%1)\n\tici @(%2,%1)" :: "r" (tramp), "r" (i),
+		      "r" (codeloc));
+
+  return FFI_OK;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffitarget.h
new file mode 100644
index 0000000..4839069
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/frv/ffitarget.h
@@ -0,0 +1,57 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2004  Red Hat, Inc.
+   Target configuration macros for FR-V
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+/* ---- System specific configurations ----------------------------------- */
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_EABI,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_EABI
+} ffi_abi;
+#endif
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_NATIVE_RAW_API 0
+
+#ifdef __FRV_FDPIC__
+/* Trampolines are 8 4-byte instructions long.  */
+#define FFI_TRAMPOLINE_SIZE (8*4)
+#else
+/* Trampolines are 5 4-byte instructions long.  */
+#define FFI_TRAMPOLINE_SIZE (5*4)
+#endif
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffi.c
new file mode 100644
index 0000000..60120ed
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffi.c
@@ -0,0 +1,582 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 2011 Anthony Green
+           Copyright (c) 2000 Hewlett Packard Company
+           Copyright (c) 1998, 2007, 2008 Red Hat, Inc.
+	   
+   IA64 Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include <float.h>
+
+#include "ia64_flags.h"
+
+/* A 64-bit pointer value.  In LP64 mode, this is effectively a plain
+   pointer.  In ILP32 mode, it's a pointer that's been extended to 
+   64 bits by "addp4".  */
+typedef void *PTR64 __attribute__((mode(DI)));
+
+/* Memory image of fp register contents.  This is the implementation
+   specific format used by ldf.fill/stf.spill.  All we care about is
+   that it wants a 16 byte aligned slot.  */
+typedef struct
+{
+  UINT64 x[2] __attribute__((aligned(16)));
+} fpreg;
+
+
+/* The stack layout given to ffi_call_unix and ffi_closure_unix_inner.  */
+
+struct ia64_args
+{
+  fpreg fp_regs[8];	/* Contents of 8 fp arg registers.  */
+  UINT64 gp_regs[8];	/* Contents of 8 gp arg registers.  */
+  UINT64 other_args[];	/* Arguments passed on stack, variable size.  */
+};
+
+
+/* Adjust ADDR, a pointer to an 8 byte slot, to point to the low LEN bytes.  */
+
+static inline void *
+endian_adjust (void *addr, size_t len)
+{
+#ifdef __BIG_ENDIAN__
+  return addr + (8 - len);
+#else
+  return addr;
+#endif
+}
+
+/* Store VALUE to ADDR in the current cpu implementation's fp spill format.
+   This is a macro instead of a function, so that it works for all 3 floating
+   point types without type conversions.  Type conversion to long double breaks
+   the denorm support.  */
+
+#define stf_spill(addr, value)	\
+  asm ("stf.spill %0 = %1%P0" : "=m" (*addr) : "f"(value));
+
+/* Load a value from ADDR, which is in the current cpu implementation's
+   fp spill format.  As above, this must also be a macro.  */
+
+#define ldf_fill(result, addr)	\
+  asm ("ldf.fill %0 = %1%P1" : "=f"(result) : "m"(*addr));
+
+/* Return the size of the C type associated with with TYPE.  Which will
+   be one of the FFI_IA64_TYPE_HFA_* values.  */
+
+static size_t
+hfa_type_size (int type)
+{
+  switch (type)
+    {
+    case FFI_IA64_TYPE_HFA_FLOAT:
+      return sizeof(float);
+    case FFI_IA64_TYPE_HFA_DOUBLE:
+      return sizeof(double);
+    case FFI_IA64_TYPE_HFA_LDOUBLE:
+      return sizeof(__float80);
+    default:
+      abort ();
+    }
+}
+
+/* Load from ADDR a value indicated by TYPE.  Which will be one of
+   the FFI_IA64_TYPE_HFA_* values.  */
+
+static void
+hfa_type_load (fpreg *fpaddr, int type, void *addr)
+{
+  switch (type)
+    {
+    case FFI_IA64_TYPE_HFA_FLOAT:
+      stf_spill (fpaddr, *(float *) addr);
+      return;
+    case FFI_IA64_TYPE_HFA_DOUBLE:
+      stf_spill (fpaddr, *(double *) addr);
+      return;
+    case FFI_IA64_TYPE_HFA_LDOUBLE:
+      stf_spill (fpaddr, *(__float80 *) addr);
+      return;
+    default:
+      abort ();
+    }
+}
+
+/* Load VALUE into ADDR as indicated by TYPE.  Which will be one of
+   the FFI_IA64_TYPE_HFA_* values.  */
+
+static void
+hfa_type_store (int type, void *addr, fpreg *fpaddr)
+{
+  switch (type)
+    {
+    case FFI_IA64_TYPE_HFA_FLOAT:
+      {
+	float result;
+	ldf_fill (result, fpaddr);
+	*(float *) addr = result;
+	break;
+      }
+    case FFI_IA64_TYPE_HFA_DOUBLE:
+      {
+	double result;
+	ldf_fill (result, fpaddr);
+	*(double *) addr = result;
+	break;
+      }
+    case FFI_IA64_TYPE_HFA_LDOUBLE:
+      {
+	__float80 result;
+	ldf_fill (result, fpaddr);
+	*(__float80 *) addr = result;
+	break;
+      }
+    default:
+      abort ();
+    }
+}
+
+/* Is TYPE a struct containing floats, doubles, or extended doubles,
+   all of the same fp type?  If so, return the element type.  Return
+   FFI_TYPE_VOID if not.  */
+
+static int
+hfa_element_type (ffi_type *type, int nested)
+{
+  int element = FFI_TYPE_VOID;
+
+  switch (type->type)
+    {
+    case FFI_TYPE_FLOAT:
+      /* We want to return VOID for raw floating-point types, but the
+	 synthetic HFA type if we're nested within an aggregate.  */
+      if (nested)
+	element = FFI_IA64_TYPE_HFA_FLOAT;
+      break;
+
+    case FFI_TYPE_DOUBLE:
+      /* Similarly.  */
+      if (nested)
+	element = FFI_IA64_TYPE_HFA_DOUBLE;
+      break;
+
+    case FFI_TYPE_LONGDOUBLE:
+      /* Similarly, except that that HFA is true for double extended,
+	 but not quad precision.  Both have sizeof == 16, so tell the
+	 difference based on the precision.  */
+      if (LDBL_MANT_DIG == 64 && nested)
+	element = FFI_IA64_TYPE_HFA_LDOUBLE;
+      break;
+
+    case FFI_TYPE_STRUCT:
+      {
+	ffi_type **ptr = &type->elements[0];
+
+	for (ptr = &type->elements[0]; *ptr ; ptr++)
+	  {
+	    int sub_element = hfa_element_type (*ptr, 1);
+	    if (sub_element == FFI_TYPE_VOID)
+	      return FFI_TYPE_VOID;
+
+	    if (element == FFI_TYPE_VOID)
+	      element = sub_element;
+	    else if (element != sub_element)
+	      return FFI_TYPE_VOID;
+	  }
+      }
+      break;
+
+    default:
+      return FFI_TYPE_VOID;
+    }
+
+  return element;
+}
+
+
+/* Perform machine dependent cif processing. */
+
+ffi_status
+ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  int flags;
+
+  /* Adjust cif->bytes to include space for the bits of the ia64_args frame
+     that precedes the integer register portion.  The estimate that the
+     generic bits did for the argument space required is good enough for the
+     integer component.  */
+  cif->bytes += offsetof(struct ia64_args, gp_regs[0]);
+  if (cif->bytes < sizeof(struct ia64_args))
+    cif->bytes = sizeof(struct ia64_args);
+
+  /* Set the return type flag. */
+  flags = cif->rtype->type;
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_LONGDOUBLE:
+      /* Leave FFI_TYPE_LONGDOUBLE as meaning double extended precision,
+	 and encode quad precision as a two-word integer structure.  */
+      if (LDBL_MANT_DIG != 64)
+	flags = FFI_IA64_TYPE_SMALL_STRUCT | (16 << 8);
+      break;
+
+    case FFI_TYPE_STRUCT:
+      {
+        size_t size = cif->rtype->size;
+  	int hfa_type = hfa_element_type (cif->rtype, 0);
+
+	if (hfa_type != FFI_TYPE_VOID)
+	  {
+	    size_t nelts = size / hfa_type_size (hfa_type);
+	    if (nelts <= 8)
+	      flags = hfa_type | (size << 8);
+	  }
+	else
+	  {
+	    if (size <= 32)
+	      flags = FFI_IA64_TYPE_SMALL_STRUCT | (size << 8);
+	  }
+      }
+      break;
+
+    default:
+      break;
+    }
+  cif->flags = flags;
+
+  return FFI_OK;
+}
+
+extern int ffi_call_unix (struct ia64_args *, PTR64, void (*)(void), UINT64);
+
+void
+ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  struct ia64_args *stack;
+  long i, avn, gpcount, fpcount;
+  ffi_type **p_arg;
+
+  FFI_ASSERT (cif->abi == FFI_UNIX);
+
+  /* If we have no spot for a return value, make one.  */
+  if (rvalue == NULL && cif->rtype->type != FFI_TYPE_VOID)
+    rvalue = alloca (cif->rtype->size);
+    
+  /* Allocate the stack frame.  */
+  stack = alloca (cif->bytes);
+
+  gpcount = fpcount = 0;
+  avn = cif->nargs;
+  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
+    {
+      switch ((*p_arg)->type)
+	{
+	case FFI_TYPE_SINT8:
+	  stack->gp_regs[gpcount++] = *(SINT8 *)avalue[i];
+	  break;
+	case FFI_TYPE_UINT8:
+	  stack->gp_regs[gpcount++] = *(UINT8 *)avalue[i];
+	  break;
+	case FFI_TYPE_SINT16:
+	  stack->gp_regs[gpcount++] = *(SINT16 *)avalue[i];
+	  break;
+	case FFI_TYPE_UINT16:
+	  stack->gp_regs[gpcount++] = *(UINT16 *)avalue[i];
+	  break;
+	case FFI_TYPE_SINT32:
+	  stack->gp_regs[gpcount++] = *(SINT32 *)avalue[i];
+	  break;
+	case FFI_TYPE_UINT32:
+	  stack->gp_regs[gpcount++] = *(UINT32 *)avalue[i];
+	  break;
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_UINT64:
+	  stack->gp_regs[gpcount++] = *(UINT64 *)avalue[i];
+	  break;
+
+	case FFI_TYPE_POINTER:
+	  stack->gp_regs[gpcount++] = (UINT64)(PTR64) *(void **)avalue[i];
+	  break;
+
+	case FFI_TYPE_FLOAT:
+	  if (gpcount < 8 && fpcount < 8)
+	    stf_spill (&stack->fp_regs[fpcount++], *(float *)avalue[i]);
+	  stack->gp_regs[gpcount++] = *(UINT32 *)avalue[i];
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  if (gpcount < 8 && fpcount < 8)
+	    stf_spill (&stack->fp_regs[fpcount++], *(double *)avalue[i]);
+	  stack->gp_regs[gpcount++] = *(UINT64 *)avalue[i];
+	  break;
+
+	case FFI_TYPE_LONGDOUBLE:
+	  if (gpcount & 1)
+	    gpcount++;
+	  if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8)
+	    stf_spill (&stack->fp_regs[fpcount++], *(__float80 *)avalue[i]);
+	  memcpy (&stack->gp_regs[gpcount], avalue[i], 16);
+	  gpcount += 2;
+	  break;
+
+	case FFI_TYPE_STRUCT:
+	  {
+	    size_t size = (*p_arg)->size;
+	    size_t align = (*p_arg)->alignment;
+	    int hfa_type = hfa_element_type (*p_arg, 0);
+
+	    FFI_ASSERT (align <= 16);
+	    if (align == 16 && (gpcount & 1))
+	      gpcount++;
+
+	    if (hfa_type != FFI_TYPE_VOID)
+	      {
+		size_t hfa_size = hfa_type_size (hfa_type);
+		size_t offset = 0;
+		size_t gp_offset = gpcount * 8;
+
+		while (fpcount < 8
+		       && offset < size
+		       && gp_offset < 8 * 8)
+		  {
+		    hfa_type_load (&stack->fp_regs[fpcount], hfa_type,
+				   avalue[i] + offset);
+		    offset += hfa_size;
+		    gp_offset += hfa_size;
+		    fpcount += 1;
+		  }
+	      }
+
+	    memcpy (&stack->gp_regs[gpcount], avalue[i], size);
+	    gpcount += (size + 7) / 8;
+	  }
+	  break;
+
+	default:
+	  abort ();
+	}
+    }
+
+  ffi_call_unix (stack, rvalue, fn, cif->flags);
+}
+
+/* Closures represent a pair consisting of a function pointer, and
+   some user data.  A closure is invoked by reinterpreting the closure
+   as a function pointer, and branching to it.  Thus we can make an
+   interpreted function callable as a C function: We turn the
+   interpreter itself, together with a pointer specifying the
+   interpreted procedure, into a closure.
+
+   For IA64, function pointer are already pairs consisting of a code
+   pointer, and a gp pointer.  The latter is needed to access global
+   variables.  Here we set up such a pair as the first two words of
+   the closure (in the "trampoline" area), but we replace the gp
+   pointer with a pointer to the closure itself.  We also add the real
+   gp pointer to the closure.  This allows the function entry code to
+   both retrieve the user data, and to restire the correct gp pointer.  */
+
+extern void ffi_closure_unix ();
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*,void*,void**,void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  /* The layout of a function descriptor.  A C function pointer really 
+     points to one of these.  */
+  struct ia64_fd
+  {
+    UINT64 code_pointer;
+    UINT64 gp;
+  };
+
+  struct ffi_ia64_trampoline_struct
+  {
+    UINT64 code_pointer;	/* Pointer to ffi_closure_unix.  */
+    UINT64 fake_gp;		/* Pointer to closure, installed as gp.  */
+    UINT64 real_gp;		/* Real gp value.  */
+  };
+
+  struct ffi_ia64_trampoline_struct *tramp;
+  struct ia64_fd *fd;
+
+  if (cif->abi != FFI_UNIX)
+    return FFI_BAD_ABI;
+
+  tramp = (struct ffi_ia64_trampoline_struct *)closure->tramp;
+  fd = (struct ia64_fd *)(void *)ffi_closure_unix;
+
+  tramp->code_pointer = fd->code_pointer;
+  tramp->real_gp = fd->gp;
+  tramp->fake_gp = (UINT64)(PTR64)codeloc;
+  closure->cif = cif;
+  closure->user_data = user_data;
+  closure->fun = fun;
+
+  return FFI_OK;
+}
+
+
+UINT64
+ffi_closure_unix_inner (ffi_closure *closure, struct ia64_args *stack,
+			void *rvalue, void *r8)
+{
+  ffi_cif *cif;
+  void **avalue;
+  ffi_type **p_arg;
+  long i, avn, gpcount, fpcount;
+
+  cif = closure->cif;
+  avn = cif->nargs;
+  avalue = alloca (avn * sizeof (void *));
+
+  /* If the structure return value is passed in memory get that location
+     from r8 so as to pass the value directly back to the caller.  */
+  if (cif->flags == FFI_TYPE_STRUCT)
+    rvalue = r8;
+
+  gpcount = fpcount = 0;
+  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
+    {
+      switch ((*p_arg)->type)
+	{
+	case FFI_TYPE_SINT8:
+	case FFI_TYPE_UINT8:
+	  avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 1);
+	  break;
+	case FFI_TYPE_SINT16:
+	case FFI_TYPE_UINT16:
+	  avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 2);
+	  break;
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_UINT32:
+	  avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], 4);
+	  break;
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_UINT64:
+	  avalue[i] = &stack->gp_regs[gpcount++];
+	  break;
+	case FFI_TYPE_POINTER:
+	  avalue[i] = endian_adjust(&stack->gp_regs[gpcount++], sizeof(void*));
+	  break;
+
+	case FFI_TYPE_FLOAT:
+	  if (gpcount < 8 && fpcount < 8)
+	    {
+	      fpreg *addr = &stack->fp_regs[fpcount++];
+	      float result;
+	      avalue[i] = addr;
+	      ldf_fill (result, addr);
+	      *(float *)addr = result;
+	    }
+	  else
+	    avalue[i] = endian_adjust(&stack->gp_regs[gpcount], 4);
+	  gpcount++;
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  if (gpcount < 8 && fpcount < 8)
+	    {
+	      fpreg *addr = &stack->fp_regs[fpcount++];
+	      double result;
+	      avalue[i] = addr;
+	      ldf_fill (result, addr);
+	      *(double *)addr = result;
+	    }
+	  else
+	    avalue[i] = &stack->gp_regs[gpcount];
+	  gpcount++;
+	  break;
+
+	case FFI_TYPE_LONGDOUBLE:
+	  if (gpcount & 1)
+	    gpcount++;
+	  if (LDBL_MANT_DIG == 64 && gpcount < 8 && fpcount < 8)
+	    {
+	      fpreg *addr = &stack->fp_regs[fpcount++];
+	      __float80 result;
+	      avalue[i] = addr;
+	      ldf_fill (result, addr);
+	      *(__float80 *)addr = result;
+	    }
+	  else
+	    avalue[i] = &stack->gp_regs[gpcount];
+	  gpcount += 2;
+	  break;
+
+	case FFI_TYPE_STRUCT:
+	  {
+	    size_t size = (*p_arg)->size;
+	    size_t align = (*p_arg)->alignment;
+	    int hfa_type = hfa_element_type (*p_arg, 0);
+
+	    FFI_ASSERT (align <= 16);
+	    if (align == 16 && (gpcount & 1))
+	      gpcount++;
+
+	    if (hfa_type != FFI_TYPE_VOID)
+	      {
+		size_t hfa_size = hfa_type_size (hfa_type);
+		size_t offset = 0;
+		size_t gp_offset = gpcount * 8;
+		void *addr = alloca (size);
+
+		avalue[i] = addr;
+
+		while (fpcount < 8
+		       && offset < size
+		       && gp_offset < 8 * 8)
+		  {
+		    hfa_type_store (hfa_type, addr + offset,
+				    &stack->fp_regs[fpcount]);
+		    offset += hfa_size;
+		    gp_offset += hfa_size;
+		    fpcount += 1;
+		  }
+
+		if (offset < size)
+		  memcpy (addr + offset, (char *)stack->gp_regs + gp_offset,
+			  size - offset);
+	      }
+	    else
+	      avalue[i] = &stack->gp_regs[gpcount];
+
+	    gpcount += (size + 7) / 8;
+	  }
+	  break;
+
+	default:
+	  abort ();
+	}
+    }
+
+  closure->fun (cif, rvalue, avalue, closure->user_data);
+
+  return cif->flags;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffitarget.h
new file mode 100644
index 0000000..0d2001d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ffitarget.h
@@ -0,0 +1,50 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Target configuration macros for IA-64.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+#ifndef LIBFFI_ASM
+typedef unsigned long long          ffi_arg;
+typedef signed long long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_UNIX,   	/* Linux and all Unix variants use the same conventions	*/
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_UNIX
+} ffi_abi;
+#endif
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 24  /* Really the following struct, which 	*/
+				/* can be interpreted as a C function	*/
+				/* descriptor:				*/
+
+#endif
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ia64_flags.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ia64_flags.h
new file mode 100644
index 0000000..9d652ce
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/ia64_flags.h
@@ -0,0 +1,40 @@
+/* -----------------------------------------------------------------------
+   ia64_flags.h - Copyright (c) 2000 Hewlett Packard Company
+   
+   IA64/unix Foreign Function Interface 
+
+   Original author: Hans Boehm, HP Labs
+
+   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.
+   ----------------------------------------------------------------------- */
+
+/* "Type" codes used between assembly and C.  When used as a part of
+   a cfi->flags value, the low byte will be these extra type codes,
+   and bits 8-31 will be the actual size of the type.  */
+
+/* Small structures containing N words in integer registers.  */
+#define FFI_IA64_TYPE_SMALL_STRUCT	(FFI_TYPE_LAST + 1)
+
+/* Homogeneous Floating Point Aggregates (HFAs) which are returned
+   in FP registers.  */
+#define FFI_IA64_TYPE_HFA_FLOAT		(FFI_TYPE_LAST + 2)
+#define FFI_IA64_TYPE_HFA_DOUBLE	(FFI_TYPE_LAST + 3)
+#define FFI_IA64_TYPE_HFA_LDOUBLE	(FFI_TYPE_LAST + 4)
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/unix.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/unix.S
new file mode 100644
index 0000000..4d2a86d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/ia64/unix.S
@@ -0,0 +1,560 @@
+/* -----------------------------------------------------------------------
+   unix.S - Copyright (c) 1998, 2008 Red Hat, Inc.
+            Copyright (c) 2000 Hewlett Packard Company
+   
+   IA64/unix Foreign Function Interface 
+
+   Primary author: Hans Boehm, HP Labs
+
+   Loosely modeled on Cygnus code for other platforms.
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+#include "ia64_flags.h"
+
+	.pred.safe_across_calls p1-p5,p16-p63
+.text
+
+/* int ffi_call_unix (struct ia64_args *stack, PTR64 rvalue,
+		      void (*fn)(void), int flags);
+ */
+
+        .align 16
+        .global	ffi_call_unix
+        .proc	ffi_call_unix
+ffi_call_unix:
+	.prologue
+	/* Bit o trickiness.  We actually share a stack frame with ffi_call.
+	   Rely on the fact that ffi_call uses a vframe and don't bother
+	   tracking one here at all.  */
+	.fframe	0
+	.save	ar.pfs, r36 // loc0
+	alloc   loc0 = ar.pfs, 4, 3, 8, 0
+	.save	rp, loc1
+	mov 	loc1 = b0
+	.body
+	add	r16 = 16, in0
+	mov	loc2 = gp
+	mov	r8 = in1
+	;;
+
+	/* Load up all of the argument registers.  */
+	ldf.fill f8 = [in0], 32
+	ldf.fill f9 = [r16], 32
+	;;
+	ldf.fill f10 = [in0], 32
+	ldf.fill f11 = [r16], 32
+	;;
+	ldf.fill f12 = [in0], 32
+	ldf.fill f13 = [r16], 32
+	;;
+	ldf.fill f14 = [in0], 32
+	ldf.fill f15 = [r16], 24
+	;;
+	ld8	out0 = [in0], 16
+	ld8	out1 = [r16], 16
+	;;
+	ld8	out2 = [in0], 16
+	ld8	out3 = [r16], 16
+	;;
+	ld8	out4 = [in0], 16
+	ld8	out5 = [r16], 16
+	;;
+	ld8	out6 = [in0]
+	ld8	out7 = [r16]
+	;;
+
+	/* Deallocate the register save area from the stack frame.  */
+	mov	sp = in0
+
+	/* Call the target function.  */
+	ld8	r16 = [in2], 8
+	;;
+	ld8	gp = [in2]
+	mov	b6 = r16
+	br.call.sptk.many b0 = b6
+	;;
+
+	/* Dispatch to handle return value.  */
+	mov	gp = loc2
+	zxt1	r16 = in3
+	;;
+	mov	ar.pfs = loc0
+	addl	r18 = @ltoffx(.Lst_table), gp
+	;;
+	ld8.mov	r18 = [r18], .Lst_table
+	mov	b0 = loc1
+	;;
+	shladd	r18 = r16, 3, r18
+	;;
+	ld8	r17 = [r18]
+	shr	in3 = in3, 8
+	;;
+	add	r17 = r17, r18
+	;;
+	mov	b6 = r17
+	br	b6
+	;;
+
+.Lst_void:
+	br.ret.sptk.many b0
+	;;
+.Lst_uint8:
+	zxt1	r8 = r8
+	;;
+	st8	[in1] = r8
+	br.ret.sptk.many b0
+	;;
+.Lst_sint8:
+	sxt1	r8 = r8
+	;;
+	st8	[in1] = r8
+	br.ret.sptk.many b0
+	;;
+.Lst_uint16:
+	zxt2	r8 = r8
+	;;
+	st8	[in1] = r8
+	br.ret.sptk.many b0
+	;;
+.Lst_sint16:
+	sxt2	r8 = r8
+	;;
+	st8	[in1] = r8
+	br.ret.sptk.many b0
+	;;
+.Lst_uint32:
+	zxt4	r8 = r8
+	;;
+	st8	[in1] = r8
+	br.ret.sptk.many b0
+	;;
+.Lst_sint32:
+	sxt4	r8 = r8
+	;;
+	st8	[in1] = r8
+	br.ret.sptk.many b0
+	;;
+.Lst_int64:
+	st8	[in1] = r8
+	br.ret.sptk.many b0
+	;;
+.Lst_float:
+	stfs	[in1] = f8
+	br.ret.sptk.many b0
+	;;
+.Lst_double:
+	stfd	[in1] = f8
+	br.ret.sptk.many b0
+	;;
+.Lst_ldouble:
+	stfe	[in1] = f8
+	br.ret.sptk.many b0
+	;;
+
+.Lst_small_struct:
+	add	sp = -16, sp
+	cmp.lt	p6, p0 = 8, in3
+	cmp.lt	p7, p0 = 16, in3
+	cmp.lt	p8, p0 = 24, in3
+	;;
+	add	r16 = 8, sp
+	add	r17 = 16, sp
+	add	r18 = 24, sp
+	;;
+	st8	[sp] = r8
+(p6)	st8	[r16] = r9
+	mov	out0 = in1
+(p7)	st8	[r17] = r10
+(p8)	st8	[r18] = r11
+	mov	out1 = sp
+	mov	out2 = in3
+	br.call.sptk.many b0 = memcpy#
+	;;
+	mov	ar.pfs = loc0
+	mov	b0 = loc1
+	mov	gp = loc2
+	br.ret.sptk.many b0
+
+.Lst_hfa_float:
+	add	r16 = 4, in1
+	cmp.lt	p6, p0 = 4, in3
+	;;
+	stfs	[in1] = f8, 8
+(p6)	stfs	[r16] = f9, 8
+	cmp.lt	p7, p0 = 8, in3
+	cmp.lt	p8, p0 = 12, in3
+	;;
+(p7)	stfs	[in1] = f10, 8
+(p8)	stfs	[r16] = f11, 8
+	cmp.lt	p9, p0 = 16, in3
+	cmp.lt	p10, p0 = 20, in3
+	;;
+(p9)	stfs	[in1] = f12, 8
+(p10)	stfs	[r16] = f13, 8
+	cmp.lt	p6, p0 = 24, in3
+	cmp.lt	p7, p0 = 28, in3
+	;;
+(p6)	stfs	[in1] = f14
+(p7)	stfs	[r16] = f15
+	br.ret.sptk.many b0
+	;;
+
+.Lst_hfa_double:
+	add	r16 = 8, in1
+	cmp.lt	p6, p0 = 8, in3
+	;;
+	stfd	[in1] = f8, 16
+(p6)	stfd	[r16] = f9, 16
+	cmp.lt	p7, p0 = 16, in3
+	cmp.lt	p8, p0 = 24, in3
+	;;
+(p7)	stfd	[in1] = f10, 16
+(p8)	stfd	[r16] = f11, 16
+	cmp.lt	p9, p0 = 32, in3
+	cmp.lt	p10, p0 = 40, in3
+	;;
+(p9)	stfd	[in1] = f12, 16
+(p10)	stfd	[r16] = f13, 16
+	cmp.lt	p6, p0 = 48, in3
+	cmp.lt	p7, p0 = 56, in3
+	;;
+(p6)	stfd	[in1] = f14
+(p7)	stfd	[r16] = f15
+	br.ret.sptk.many b0
+	;;
+
+.Lst_hfa_ldouble:
+	add	r16 = 16, in1
+	cmp.lt	p6, p0 = 16, in3
+	;;
+	stfe	[in1] = f8, 32
+(p6)	stfe	[r16] = f9, 32
+	cmp.lt	p7, p0 = 32, in3
+	cmp.lt	p8, p0 = 48, in3
+	;;
+(p7)	stfe	[in1] = f10, 32
+(p8)	stfe	[r16] = f11, 32
+	cmp.lt	p9, p0 = 64, in3
+	cmp.lt	p10, p0 = 80, in3
+	;;
+(p9)	stfe	[in1] = f12, 32
+(p10)	stfe	[r16] = f13, 32
+	cmp.lt	p6, p0 = 96, in3
+	cmp.lt	p7, p0 = 112, in3
+	;;
+(p6)	stfe	[in1] = f14
+(p7)	stfe	[r16] = f15
+	br.ret.sptk.many b0
+	;;
+
+        .endp ffi_call_unix
+
+        .align 16
+        .global ffi_closure_unix
+        .proc ffi_closure_unix
+
+#define FRAME_SIZE	(8*16 + 8*8 + 8*16)
+
+ffi_closure_unix:
+	.prologue
+	.save	ar.pfs, r40 // loc0
+	alloc   loc0 = ar.pfs, 8, 4, 4, 0
+	.fframe	FRAME_SIZE
+	add	r12 = -FRAME_SIZE, r12
+	.save	rp, loc1
+	mov	loc1 = b0
+	.save	ar.unat, loc2
+	mov	loc2 = ar.unat
+	.body
+
+	/* Retrieve closure pointer and real gp.  */
+#ifdef _ILP32
+	addp4	out0 = 0, gp
+	addp4	gp = 16, gp
+#else
+	mov	out0 = gp
+	add	gp = 16, gp
+#endif
+	;;
+	ld8	gp = [gp]
+
+	/* Spill all of the possible argument registers.  */
+	add	r16 = 16 + 8*16, sp
+	add	r17 = 16 + 8*16 + 16, sp
+	;;
+	stf.spill [r16] = f8, 32
+	stf.spill [r17] = f9, 32
+	mov	loc3 = gp
+	;;
+	stf.spill [r16] = f10, 32
+	stf.spill [r17] = f11, 32
+	;;
+	stf.spill [r16] = f12, 32
+	stf.spill [r17] = f13, 32
+	;;
+	stf.spill [r16] = f14, 32
+	stf.spill [r17] = f15, 24
+	;;
+	.mem.offset 0, 0
+	st8.spill [r16] = in0, 16
+	.mem.offset 8, 0
+	st8.spill [r17] = in1, 16
+	add	out1 = 16 + 8*16, sp
+	;;
+	.mem.offset 0, 0
+	st8.spill [r16] = in2, 16
+	.mem.offset 8, 0
+	st8.spill [r17] = in3, 16
+	add	out2 = 16, sp
+	;;
+	.mem.offset 0, 0
+	st8.spill [r16] = in4, 16
+	.mem.offset 8, 0
+	st8.spill [r17] = in5, 16
+	mov	out3 = r8
+	;;
+	.mem.offset 0, 0
+	st8.spill [r16] = in6
+	.mem.offset 8, 0
+	st8.spill [r17] = in7
+
+	/* Invoke ffi_closure_unix_inner for the hard work.  */
+	br.call.sptk.many b0 = ffi_closure_unix_inner
+	;;
+
+	/* Dispatch to handle return value.  */
+	mov	gp = loc3
+	zxt1	r16 = r8
+	;;
+	addl	r18 = @ltoffx(.Lld_table), gp
+	mov	ar.pfs = loc0
+	;;
+	ld8.mov	r18 = [r18], .Lld_table
+	mov	b0 = loc1
+	;;
+	shladd	r18 = r16, 3, r18
+	mov	ar.unat = loc2
+	;;
+	ld8	r17 = [r18]
+	shr	r8 = r8, 8
+	;;
+	add	r17 = r17, r18
+	add	r16 = 16, sp
+	;;
+	mov	b6 = r17
+	br	b6
+	;;
+	.label_state 1
+
+.Lld_void:
+	.restore sp
+	add	sp = FRAME_SIZE, sp
+	br.ret.sptk.many b0
+	;;
+.Lld_int:
+	.body
+	.copy_state 1
+	ld8	r8 = [r16]
+	.restore sp
+	add	sp = FRAME_SIZE, sp
+	br.ret.sptk.many b0
+	;;
+.Lld_float:
+	.body
+	.copy_state 1
+	ldfs	f8 = [r16]
+	.restore sp
+	add	sp = FRAME_SIZE, sp
+	br.ret.sptk.many b0
+	;;
+.Lld_double:
+	.body
+	.copy_state 1
+	ldfd	f8 = [r16]
+	.restore sp
+	add	sp = FRAME_SIZE, sp
+	br.ret.sptk.many b0
+	;;
+.Lld_ldouble:
+	.body
+	.copy_state 1
+	ldfe	f8 = [r16]
+	.restore sp
+	add	sp = FRAME_SIZE, sp
+	br.ret.sptk.many b0
+	;;
+
+.Lld_small_struct:
+	.body
+	.copy_state 1
+	add	r17 = 8, r16
+	cmp.lt	p6, p0 = 8, r8
+	cmp.lt	p7, p0 = 16, r8
+	cmp.lt	p8, p0 = 24, r8
+	;;
+	ld8	r8 = [r16], 16
+(p6)	ld8	r9 = [r17], 16
+	;;
+(p7)	ld8	r10 = [r16]
+(p8)	ld8	r11 = [r17]
+	.restore sp
+	add	sp = FRAME_SIZE, sp
+	br.ret.sptk.many b0
+	;;
+
+.Lld_hfa_float:
+	.body
+	.copy_state 1
+	add	r17 = 4, r16
+	cmp.lt	p6, p0 = 4, r8
+	;;
+	ldfs	f8 = [r16], 8
+(p6)	ldfs	f9 = [r17], 8
+	cmp.lt	p7, p0 = 8, r8
+	cmp.lt	p8, p0 = 12, r8
+	;;
+(p7)	ldfs	f10 = [r16], 8
+(p8)	ldfs	f11 = [r17], 8
+	cmp.lt	p9, p0 = 16, r8
+	cmp.lt	p10, p0 = 20, r8
+	;;
+(p9)	ldfs	f12 = [r16], 8
+(p10)	ldfs	f13 = [r17], 8
+	cmp.lt	p6, p0 = 24, r8
+	cmp.lt	p7, p0 = 28, r8
+	;;
+(p6)	ldfs	f14 = [r16]
+(p7)	ldfs	f15 = [r17]
+	.restore sp
+	add	sp = FRAME_SIZE, sp
+	br.ret.sptk.many b0
+	;;
+
+.Lld_hfa_double:
+	.body
+	.copy_state 1
+	add	r17 = 8, r16
+	cmp.lt	p6, p0 = 8, r8
+	;;
+	ldfd	f8 = [r16], 16
+(p6)	ldfd	f9 = [r17], 16
+	cmp.lt	p7, p0 = 16, r8
+	cmp.lt	p8, p0 = 24, r8
+	;;
+(p7)	ldfd	f10 = [r16], 16
+(p8)	ldfd	f11 = [r17], 16
+	cmp.lt	p9, p0 = 32, r8
+	cmp.lt	p10, p0 = 40, r8
+	;;
+(p9)	ldfd	f12 = [r16], 16
+(p10)	ldfd	f13 = [r17], 16
+	cmp.lt	p6, p0 = 48, r8
+	cmp.lt	p7, p0 = 56, r8
+	;;
+(p6)	ldfd	f14 = [r16]
+(p7)	ldfd	f15 = [r17]
+	.restore sp
+	add	sp = FRAME_SIZE, sp
+	br.ret.sptk.many b0
+	;;
+
+.Lld_hfa_ldouble:
+	.body
+	.copy_state 1
+	add	r17 = 16, r16
+	cmp.lt	p6, p0 = 16, r8
+	;;
+	ldfe	f8 = [r16], 32
+(p6)	ldfe	f9 = [r17], 32
+	cmp.lt	p7, p0 = 32, r8
+	cmp.lt	p8, p0 = 48, r8
+	;;
+(p7)	ldfe	f10 = [r16], 32
+(p8)	ldfe	f11 = [r17], 32
+	cmp.lt	p9, p0 = 64, r8
+	cmp.lt	p10, p0 = 80, r8
+	;;
+(p9)	ldfe	f12 = [r16], 32
+(p10)	ldfe	f13 = [r17], 32
+	cmp.lt	p6, p0 = 96, r8
+	cmp.lt	p7, p0 = 112, r8
+	;;
+(p6)	ldfe	f14 = [r16]
+(p7)	ldfe	f15 = [r17]
+	.restore sp
+	add	sp = FRAME_SIZE, sp
+	br.ret.sptk.many b0
+	;;
+
+	.endp	ffi_closure_unix
+
+	.section .rodata
+	.align	8
+.Lst_table:
+	data8	@pcrel(.Lst_void)		// FFI_TYPE_VOID
+	data8	@pcrel(.Lst_sint32)		// FFI_TYPE_INT
+	data8	@pcrel(.Lst_float)		// FFI_TYPE_FLOAT
+	data8	@pcrel(.Lst_double)		// FFI_TYPE_DOUBLE
+	data8	@pcrel(.Lst_ldouble)		// FFI_TYPE_LONGDOUBLE
+	data8	@pcrel(.Lst_uint8)		// FFI_TYPE_UINT8
+	data8	@pcrel(.Lst_sint8)		// FFI_TYPE_SINT8
+	data8	@pcrel(.Lst_uint16)		// FFI_TYPE_UINT16
+	data8	@pcrel(.Lst_sint16)		// FFI_TYPE_SINT16
+	data8	@pcrel(.Lst_uint32)		// FFI_TYPE_UINT32
+	data8	@pcrel(.Lst_sint32)		// FFI_TYPE_SINT32
+	data8	@pcrel(.Lst_int64)		// FFI_TYPE_UINT64
+	data8	@pcrel(.Lst_int64)		// FFI_TYPE_SINT64
+	data8	@pcrel(.Lst_void)		// FFI_TYPE_STRUCT
+	data8	@pcrel(.Lst_int64)		// FFI_TYPE_POINTER
+	data8 	@pcrel(.Lst_small_struct)	// FFI_IA64_TYPE_SMALL_STRUCT
+	data8	@pcrel(.Lst_hfa_float)		// FFI_IA64_TYPE_HFA_FLOAT
+	data8	@pcrel(.Lst_hfa_double)		// FFI_IA64_TYPE_HFA_DOUBLE
+	data8	@pcrel(.Lst_hfa_ldouble)	// FFI_IA64_TYPE_HFA_LDOUBLE
+
+.Lld_table:
+	data8	@pcrel(.Lld_void)		// FFI_TYPE_VOID
+	data8	@pcrel(.Lld_int)		// FFI_TYPE_INT
+	data8	@pcrel(.Lld_float)		// FFI_TYPE_FLOAT
+	data8	@pcrel(.Lld_double)		// FFI_TYPE_DOUBLE
+	data8	@pcrel(.Lld_ldouble)		// FFI_TYPE_LONGDOUBLE
+	data8	@pcrel(.Lld_int)		// FFI_TYPE_UINT8
+	data8	@pcrel(.Lld_int)		// FFI_TYPE_SINT8
+	data8	@pcrel(.Lld_int)		// FFI_TYPE_UINT16
+	data8	@pcrel(.Lld_int)		// FFI_TYPE_SINT16
+	data8	@pcrel(.Lld_int)		// FFI_TYPE_UINT32
+	data8	@pcrel(.Lld_int)		// FFI_TYPE_SINT32
+	data8	@pcrel(.Lld_int)		// FFI_TYPE_UINT64
+	data8	@pcrel(.Lld_int)		// FFI_TYPE_SINT64
+	data8	@pcrel(.Lld_void)		// FFI_TYPE_STRUCT
+	data8	@pcrel(.Lld_int)		// FFI_TYPE_POINTER
+	data8 	@pcrel(.Lld_small_struct)	// FFI_IA64_TYPE_SMALL_STRUCT
+	data8	@pcrel(.Lld_hfa_float)		// FFI_IA64_TYPE_HFA_FLOAT
+	data8	@pcrel(.Lld_hfa_double)		// FFI_IA64_TYPE_HFA_DOUBLE
+	data8	@pcrel(.Lld_hfa_ldouble)	// FFI_IA64_TYPE_HFA_LDOUBLE
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/java_raw_api.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/java_raw_api.c
new file mode 100644
index 0000000..522c8bf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/java_raw_api.c
@@ -0,0 +1,356 @@
+/* -----------------------------------------------------------------------
+   java_raw_api.c - Copyright (c) 1999, 2007, 2008  Red Hat, Inc.
+
+   Cloned from raw_api.c
+
+   Raw_api.c author: Kresten Krab Thorup <krab@gnu.org>
+   Java_raw_api.c author: Hans-J. Boehm <hboehm@hpl.hp.com>
+
+   $Id $
+
+   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.
+   ----------------------------------------------------------------------- */
+
+/* This defines a Java- and 64-bit specific variant of the raw API.	*/
+/* It assumes that "raw" argument blocks look like Java stacks on a	*/
+/* 64-bit machine.  Arguments that can be stored in a single stack	*/
+/* stack slots (longs, doubles) occupy 128 bits, but only the first	*/
+/* 64 bits are actually used.						*/
+
+#include <ffi.h>
+#include <ffi_common.h>
+#include <stdlib.h>
+
+#if !defined(NO_JAVA_RAW_API) && !defined(FFI_NO_RAW_API)
+
+size_t
+ffi_java_raw_size (ffi_cif *cif)
+{
+  size_t result = 0;
+  int i;
+
+  ffi_type **at = cif->arg_types;
+
+  for (i = cif->nargs-1; i >= 0; i--, at++)
+    {
+      switch((*at) -> type) {
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_DOUBLE:
+	  result += 2 * FFI_SIZEOF_JAVA_RAW;
+	  break;
+	case FFI_TYPE_STRUCT:
+	  /* No structure parameters in Java.	*/
+	  abort();
+	default:
+	  result += FFI_SIZEOF_JAVA_RAW;
+      }
+    }
+
+  return result;
+}
+
+
+void
+ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args)
+{
+  unsigned i;
+  ffi_type **tp = cif->arg_types;
+
+#if WORDS_BIGENDIAN
+
+  for (i = 0; i < cif->nargs; i++, tp++, args++)
+    {
+      switch ((*tp)->type)
+	{
+	case FFI_TYPE_UINT8:
+	case FFI_TYPE_SINT8:
+	  *args = (void*) ((char*)(raw++) + 3);
+	  break;
+
+	case FFI_TYPE_UINT16:
+	case FFI_TYPE_SINT16:
+	  *args = (void*) ((char*)(raw++) + 2);
+	  break;
+
+#if FFI_SIZEOF_JAVA_RAW == 8
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_DOUBLE:
+	  *args = (void *)raw;
+	  raw += 2;
+	  break;
+#endif
+
+	case FFI_TYPE_POINTER:
+	  *args = (void*) &(raw++)->ptr;
+	  break;
+
+	default:
+	  *args = raw;
+	  raw +=
+	    ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
+	}
+    }
+
+#else /* WORDS_BIGENDIAN */
+
+#if !PDP
+
+  /* then assume little endian */
+  for (i = 0; i < cif->nargs; i++, tp++, args++)
+    {
+#if FFI_SIZEOF_JAVA_RAW == 8
+      switch((*tp)->type) {
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_DOUBLE:
+	  *args = (void*) raw;
+	  raw += 2;
+	  break;
+	default:
+	  *args = (void*) raw++;
+      }
+#else /* FFI_SIZEOF_JAVA_RAW != 8 */
+	*args = (void*) raw;
+	raw +=
+	  ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
+#endif /* FFI_SIZEOF_JAVA_RAW == 8 */
+    }
+
+#else
+#error "pdp endian not supported"
+#endif /* ! PDP */
+
+#endif /* WORDS_BIGENDIAN */
+}
+
+void
+ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw)
+{
+  unsigned i;
+  ffi_type **tp = cif->arg_types;
+
+  for (i = 0; i < cif->nargs; i++, tp++, args++)
+    {
+      switch ((*tp)->type)
+	{
+	case FFI_TYPE_UINT8:
+#if WORDS_BIGENDIAN
+	  *(UINT32*)(raw++) = *(UINT8*) (*args);
+#else
+	  (raw++)->uint = *(UINT8*) (*args);
+#endif
+	  break;
+
+	case FFI_TYPE_SINT8:
+#if WORDS_BIGENDIAN
+	  *(SINT32*)(raw++) = *(SINT8*) (*args);
+#else
+	  (raw++)->sint = *(SINT8*) (*args);
+#endif
+	  break;
+
+	case FFI_TYPE_UINT16:
+#if WORDS_BIGENDIAN
+	  *(UINT32*)(raw++) = *(UINT16*) (*args);
+#else
+	  (raw++)->uint = *(UINT16*) (*args);
+#endif
+	  break;
+
+	case FFI_TYPE_SINT16:
+#if WORDS_BIGENDIAN
+	  *(SINT32*)(raw++) = *(SINT16*) (*args);
+#else
+	  (raw++)->sint = *(SINT16*) (*args);
+#endif
+	  break;
+
+	case FFI_TYPE_UINT32:
+#if WORDS_BIGENDIAN
+	  *(UINT32*)(raw++) = *(UINT32*) (*args);
+#else
+	  (raw++)->uint = *(UINT32*) (*args);
+#endif
+	  break;
+
+	case FFI_TYPE_SINT32:
+#if WORDS_BIGENDIAN
+	  *(SINT32*)(raw++) = *(SINT32*) (*args);
+#else
+	  (raw++)->sint = *(SINT32*) (*args);
+#endif
+	  break;
+
+	case FFI_TYPE_FLOAT:
+	  (raw++)->flt = *(FLOAT32*) (*args);
+	  break;
+
+#if FFI_SIZEOF_JAVA_RAW == 8
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_DOUBLE:
+	  raw->uint = *(UINT64*) (*args);
+	  raw += 2;
+	  break;
+#endif
+
+	case FFI_TYPE_POINTER:
+	  (raw++)->ptr = **(void***) args;
+	  break;
+
+	default:
+#if FFI_SIZEOF_JAVA_RAW == 8
+	  FFI_ASSERT(0);	/* Should have covered all cases */
+#else
+	  memcpy ((void*) raw->data, (void*)*args, (*tp)->size);
+	  raw +=
+	    ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw);
+#endif
+	}
+    }
+}
+
+#if !FFI_NATIVE_RAW_API
+
+static void
+ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue)
+{
+#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_UINT8:
+    case FFI_TYPE_UINT16:
+    case FFI_TYPE_UINT32:
+      *(UINT64 *)rvalue <<= 32;
+      break;
+
+    case FFI_TYPE_SINT8:
+    case FFI_TYPE_SINT16:
+    case FFI_TYPE_SINT32:
+    case FFI_TYPE_INT:
+#if FFI_SIZEOF_JAVA_RAW == 4
+    case FFI_TYPE_POINTER:
+#endif
+      *(SINT64 *)rvalue <<= 32;
+      break;
+
+    default:
+      break;
+    }
+#endif
+}
+
+static void
+ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue)
+{
+#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_UINT8:
+    case FFI_TYPE_UINT16:
+    case FFI_TYPE_UINT32:
+      *(UINT64 *)rvalue >>= 32;
+      break;
+
+    case FFI_TYPE_SINT8:
+    case FFI_TYPE_SINT16:
+    case FFI_TYPE_SINT32:
+    case FFI_TYPE_INT:
+      *(SINT64 *)rvalue >>= 32;
+      break;
+
+    default:
+      break;
+    }
+#endif
+}
+
+/* This is a generic definition of ffi_raw_call, to be used if the
+ * native system does not provide a machine-specific implementation.
+ * Having this, allows code to be written for the raw API, without
+ * the need for system-specific code to handle input in that format;
+ * these following couple of functions will handle the translation forth
+ * and back automatically. */
+
+void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue,
+			ffi_java_raw *raw)
+{
+  void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
+  ffi_java_raw_to_ptrarray (cif, raw, avalue);
+  ffi_call (cif, fn, rvalue, avalue);
+  ffi_java_rvalue_to_raw (cif, rvalue);
+}
+
+#if FFI_CLOSURES		/* base system provides closures */
+
+static void
+ffi_java_translate_args (ffi_cif *cif, void *rvalue,
+		    void **avalue, void *user_data)
+{
+  ffi_java_raw *raw = (ffi_java_raw*)alloca (ffi_java_raw_size (cif));
+  ffi_raw_closure *cl = (ffi_raw_closure*)user_data;
+
+  ffi_java_ptrarray_to_raw (cif, avalue, raw);
+  (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data);
+  ffi_java_raw_to_rvalue (cif, rvalue);
+}
+
+ffi_status
+ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl,
+			       ffi_cif *cif,
+			       void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
+			       void *user_data,
+			       void *codeloc)
+{
+  ffi_status status;
+
+  status = ffi_prep_closure_loc ((ffi_closure*) cl,
+				 cif,
+				 &ffi_java_translate_args,
+				 codeloc,
+				 codeloc);
+  if (status == FFI_OK)
+    {
+      cl->fun       = fun;
+      cl->user_data = user_data;
+    }
+
+  return status;
+}
+
+/* Again, here is the generic version of ffi_prep_raw_closure, which
+ * will install an intermediate "hub" for translation of arguments from
+ * the pointer-array format, to the raw format */
+
+ffi_status
+ffi_prep_java_raw_closure (ffi_java_raw_closure* cl,
+			   ffi_cif *cif,
+			   void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
+			   void *user_data)
+{
+  return ffi_prep_java_raw_closure_loc (cl, cif, fun, user_data, cl);
+}
+
+#endif /* FFI_CLOSURES */
+#endif /* !FFI_NATIVE_RAW_API */
+#endif /* !FFI_NO_RAW_API */
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffi.c
new file mode 100644
index 0000000..3000063
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffi.c
@@ -0,0 +1,232 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 2004  Renesas Technology
+           Copyright (c) 2008  Red Hat, Inc.
+   
+   M32R Foreign Function Interface 
+
+   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 RENESAS TECHNOLOGY 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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+
+/* ffi_prep_args is called by the assembly routine once stack
+   space has been allocated for the function's arguments.  */
+
+void ffi_prep_args(char *stack, extended_cif *ecif)
+{
+  unsigned int i;
+  int tmp;
+  unsigned int avn;
+  void **p_argv;
+  char *argp;
+  ffi_type **p_arg;
+
+  tmp = 0;
+  argp = stack;
+
+  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 8)
+    {
+      *(void **) argp = ecif->rvalue;
+      argp += 4;
+    }
+
+  avn = ecif->cif->nargs;
+  p_argv = ecif->avalue;
+
+  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+       (i != 0) && (avn != 0);
+       i--, p_arg++)
+    {
+      size_t z;
+
+      /* Align if necessary.  */
+      if (((*p_arg)->alignment - 1) & (unsigned) argp)
+	argp = (char *) ALIGN (argp, (*p_arg)->alignment);
+
+      if (avn != 0) 
+	{
+	  avn--;
+	  z = (*p_arg)->size;
+	  if (z < sizeof (int))
+	    {
+	      z = sizeof (int);
+
+	      switch ((*p_arg)->type)
+		{
+		case FFI_TYPE_SINT8:
+		  *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
+		  break;
+		  
+		case FFI_TYPE_UINT8:
+		  *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
+		  break;
+		  
+		case FFI_TYPE_SINT16:
+		  *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
+		  break;
+		  
+		case FFI_TYPE_UINT16:
+		  *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
+		  break;
+		  
+		case FFI_TYPE_STRUCT:
+	  	  z = (*p_arg)->size;
+	  	  if ((*p_arg)->alignment != 1)
+		    memcpy (argp, *p_argv, z);
+		  else
+		    memcpy (argp + 4 - z, *p_argv, z);
+	  	  z = sizeof (int);
+		  break;
+
+		default:
+		  FFI_ASSERT(0);
+		}
+	    }
+	  else if (z == sizeof (int))
+	    {
+	       *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
+	    }
+	  else
+	    {
+	      if ((*p_arg)->type == FFI_TYPE_STRUCT)
+	        {
+		  if (z > 8)
+		    {
+		      *(unsigned int *) argp = (unsigned int)(void *)(* p_argv);
+		      z = sizeof(void *);
+		    }
+		  else
+		    {
+	              memcpy(argp, *p_argv, z);
+		      z = 8;
+		    }
+	        }
+	      else
+	        {
+		  /* Double or long long 64bit.  */
+	          memcpy (argp, *p_argv, z);
+	        }
+	    }
+	  p_argv++;
+	  argp += z;
+	}
+    }
+  
+  return;
+}
+
+/* Perform machine dependent cif processing.  */
+ffi_status
+ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  /* Set the return type flag.  */
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_VOID:
+      cif->flags = (unsigned) cif->rtype->type;
+      break;
+
+    case FFI_TYPE_STRUCT:
+      if (cif->rtype->size <= 4)
+	cif->flags = FFI_TYPE_INT;
+
+      else if (cif->rtype->size <= 8)
+	cif->flags = FFI_TYPE_DOUBLE;
+
+      else
+	cif->flags = (unsigned) cif->rtype->type;
+      break;
+
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_UINT64:
+    case FFI_TYPE_DOUBLE:
+      cif->flags = FFI_TYPE_DOUBLE;
+      break;
+
+    case FFI_TYPE_FLOAT:
+    default:
+      cif->flags = FFI_TYPE_INT;
+      break;
+    }
+
+  return FFI_OK;
+}
+
+extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
+			  unsigned, unsigned, unsigned *, void (*fn)(void));
+
+void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+  
+  /* If the return value is a struct and we don't have
+     a return value address then we need to make one.  */
+  if ((rvalue == NULL) && 
+      (cif->rtype->type == FFI_TYPE_STRUCT))
+    {
+      ecif.rvalue = alloca (cif->rtype->size);
+    }
+  else
+    ecif.rvalue = rvalue;    
+  
+  switch (cif->abi) 
+    {
+    case FFI_SYSV:
+      ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, 
+		    cif->flags, ecif.rvalue, fn);
+      if (cif->rtype->type == FFI_TYPE_STRUCT)
+	{
+	  int size = cif->rtype->size;
+	  int align = cif->rtype->alignment;
+
+	  if (size < 4)
+	    {
+	      if (align == 1)
+	        *(unsigned long *)(ecif.rvalue) <<= (4 - size) * 8;
+	    }
+	  else if (4 < size && size < 8)
+	    {
+	      if (align == 1)
+		{
+		  memcpy (ecif.rvalue, ecif.rvalue + 8-size, size);
+		}
+	      else if (align == 2)
+		{
+		  if (size & 1)
+		    size += 1;
+
+		  if (size != 8)
+		    memcpy (ecif.rvalue, ecif.rvalue + 8-size, size);
+		}
+	    }
+	}
+      break;
+
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffitarget.h
new file mode 100644
index 0000000..2e2ea48
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/ffitarget.h
@@ -0,0 +1,48 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 2004  Renesas Technology.
+   Target configuration macros for M32R.
+
+   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 RENESAS TECHNOLOGY 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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+/* ---- Generic type definitions ----------------------------------------- */
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi
+  {
+    FFI_FIRST_ABI = 0,
+    FFI_SYSV,
+    FFI_LAST_ABI,
+    FFI_DEFAULT_ABI = FFI_SYSV
+  } ffi_abi;
+#endif
+
+#define FFI_CLOSURES 		0
+#define FFI_TRAMPOLINE_SIZE	24
+#define FFI_NATIVE_RAW_API 	0
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/sysv.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/sysv.S
new file mode 100644
index 0000000..06b75c2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m32r/sysv.S
@@ -0,0 +1,121 @@
+/* -----------------------------------------------------------------------
+   sysv.S - Copyright (c) 2004 Renesas Technology
+   
+   M32R Foreign Function Interface 
+
+   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 RENESAS TECHNOLOGY 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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+#ifdef HAVE_MACHINE_ASM_H
+#include <machine/asm.h>
+#else
+/* XXX these lose for some platforms, I'm sure.  */
+#define CNAME(x) x
+#define ENTRY(x) .globl CNAME(x)! .type CNAME(x),%function! CNAME(x):
+#endif
+
+.text
+
+	/* R0:   ffi_prep_args */
+	/* R1:   &ecif */
+	/* R2:   cif->bytes */
+	/* R3:   fig->flags */
+	/* sp+0: ecif.rvalue */
+	/* sp+4: fn */
+
+	/* This assumes we are using gas.  */
+ENTRY(ffi_call_SYSV)
+	/* Save registers.  */
+	push	fp
+	push	lr
+	push	r3
+	push	r2
+	push	r1
+	push	r0
+	mv	fp, sp
+
+	/* Make room for all of the new args.  */
+	sub	sp, r2
+
+	/* Place all of the ffi_prep_args in position.  */
+	mv	lr, r0	
+	mv	r0, sp
+	/* R1 already set.  */
+
+	/* And call.  */
+	jl	lr
+
+	/* Move first 4 parameters in registers...  */
+	ld	r0, @(0,sp)
+	ld	r1, @(4,sp)
+	ld	r2, @(8,sp)
+        ld	r3, @(12,sp)
+
+	/* ...and adjust the stack.  */
+	ld	lr, @(8,fp)
+        cmpi	lr, #16
+	bc	adjust_stack
+	ldi	lr, #16
+adjust_stack:
+        add	sp, lr
+
+	/* Call the function.  */
+	ld	lr, @(28,fp)
+	jl	lr	
+
+	/* Remove the space we pushed for the args.  */
+	mv	sp, fp	
+
+	/* Load R2 with the pointer to storage for the return value.  */
+	ld	r2, @(24,sp)
+
+	/* Load R3 with the return type code.  */
+	ld	r3, @(12,sp)
+
+	/* If the return value pointer is NULL, assume no return value.  */
+	beqz	r2, epilogue
+
+	/* Return INT.  */
+	ldi	r4, #FFI_TYPE_INT
+	bne	r3, r4, return_double
+	st	r0, @r2	
+	bra	epilogue
+
+return_double:
+	/* Return DOUBLE or LONGDOUBLE.  */
+	ldi	r4, #FFI_TYPE_DOUBLE
+	bne	r3, r4, epilogue
+	st	r0, @r2	
+	st	r1, @(4,r2)
+
+epilogue:
+	pop	r0
+	pop	r1
+	pop	r2
+	pop	r3
+	pop	lr
+	pop	fp
+        jmp lr
+
+.ffi_call_SYSV_end:
+        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffi.c
new file mode 100644
index 0000000..0d4df1e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffi.c
@@ -0,0 +1,288 @@
+/* -----------------------------------------------------------------------
+   ffi.c
+   
+   m68k Foreign Function Interface 
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+#ifdef __rtems__
+void rtems_cache_flush_multiple_data_lines( const void *, size_t );
+#else
+#include <sys/syscall.h>
+#include <asm/cachectl.h>
+#endif
+
+void ffi_call_SYSV (extended_cif *,
+		    unsigned, unsigned,
+		    void *, void (*fn) ());
+void *ffi_prep_args (void *stack, extended_cif *ecif);
+void ffi_closure_SYSV (ffi_closure *);
+void ffi_closure_struct_SYSV (ffi_closure *);
+unsigned int ffi_closure_SYSV_inner (ffi_closure *closure,
+				     void *resp, void *args);
+
+/* ffi_prep_args is called by the assembly routine once stack space has
+   been allocated for the function's arguments.  */
+
+void *
+ffi_prep_args (void *stack, extended_cif *ecif)
+{
+  unsigned int i;
+  void **p_argv;
+  char *argp;
+  ffi_type **p_arg;
+  void *struct_value_ptr;
+
+  argp = stack;
+
+  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
+      && !ecif->cif->flags)
+    struct_value_ptr = ecif->rvalue;
+  else
+    struct_value_ptr = NULL;
+
+  p_argv = ecif->avalue;
+
+  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+       i != 0;
+       i--, p_arg++)
+    {
+      size_t z;
+
+      z = (*p_arg)->size;
+      if (z < sizeof (int))
+	{
+	  switch ((*p_arg)->type)
+	    {
+	    case FFI_TYPE_SINT8:
+	      *(signed int *) argp = (signed int) *(SINT8 *) *p_argv;
+	      break;
+
+	    case FFI_TYPE_UINT8:
+	      *(unsigned int *) argp = (unsigned int) *(UINT8 *) *p_argv;
+	      break;
+
+	    case FFI_TYPE_SINT16:
+	      *(signed int *) argp = (signed int) *(SINT16 *) *p_argv;
+	      break;
+
+	    case FFI_TYPE_UINT16:
+	      *(unsigned int *) argp = (unsigned int) *(UINT16 *) *p_argv;
+	      break;
+
+	    case FFI_TYPE_STRUCT:
+	      memcpy (argp + sizeof (int) - z, *p_argv, z);
+	      break;
+
+	    default:
+	      FFI_ASSERT (0);
+	    }
+	  z = sizeof (int);
+	}
+      else
+	{
+	  memcpy (argp, *p_argv, z);
+
+	  /* Align if necessary.  */
+	  if ((sizeof(int) - 1) & z)
+	    z = ALIGN(z, sizeof(int));
+	}
+
+      p_argv++;
+      argp += z;
+    }
+
+  return struct_value_ptr;
+}
+
+#define CIF_FLAGS_INT		1
+#define CIF_FLAGS_DINT		2
+#define CIF_FLAGS_FLOAT		4
+#define CIF_FLAGS_DOUBLE	8
+#define CIF_FLAGS_LDOUBLE	16
+#define CIF_FLAGS_POINTER	32
+#define CIF_FLAGS_STRUCT1	64
+#define CIF_FLAGS_STRUCT2	128
+
+/* Perform machine dependent cif processing */
+ffi_status
+ffi_prep_cif_machdep (ffi_cif *cif)
+{
+  /* Set the return type flag */
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_VOID:
+      cif->flags = 0;
+      break;
+
+    case FFI_TYPE_STRUCT:
+      switch (cif->rtype->size)
+	{
+	case 1:
+	  cif->flags = CIF_FLAGS_STRUCT1;
+	  break;
+	case 2:
+	  cif->flags = CIF_FLAGS_STRUCT2;
+	  break;
+	case 4:
+	  cif->flags = CIF_FLAGS_INT;
+	  break;
+	case 8:
+	  cif->flags = CIF_FLAGS_DINT;
+	  break;
+	default:
+	  cif->flags = 0;
+	  break;
+	}
+      break;
+
+    case FFI_TYPE_FLOAT:
+      cif->flags = CIF_FLAGS_FLOAT;
+      break;
+
+    case FFI_TYPE_DOUBLE:
+      cif->flags = CIF_FLAGS_DOUBLE;
+      break;
+
+#if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE)
+    case FFI_TYPE_LONGDOUBLE:
+      cif->flags = CIF_FLAGS_LDOUBLE;
+      break;
+#endif
+
+    case FFI_TYPE_POINTER:
+      cif->flags = CIF_FLAGS_POINTER;
+      break;
+
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_UINT64:
+      cif->flags = CIF_FLAGS_DINT;
+      break;
+
+    default:
+      cif->flags = CIF_FLAGS_INT;
+      break;
+    }
+
+  return FFI_OK;
+}
+
+void
+ffi_call (ffi_cif *cif, void (*fn) (), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+
+  /* If the return value is a struct and we don't have a return value
+     address then we need to make one.  */
+
+  if (rvalue == NULL
+      && cif->rtype->type == FFI_TYPE_STRUCT
+      && cif->rtype->size > 8)
+    ecif.rvalue = alloca (cif->rtype->size);
+  else
+    ecif.rvalue = rvalue;
+
+  switch (cif->abi)
+    {
+    case FFI_SYSV:
+      ffi_call_SYSV (&ecif, cif->bytes, cif->flags,
+		     ecif.rvalue, fn);
+      break;
+
+    default:
+      FFI_ASSERT (0);
+      break;
+    }
+}
+
+static void
+ffi_prep_incoming_args_SYSV (char *stack, void **avalue, ffi_cif *cif)
+{
+  unsigned int i;
+  void **p_argv;
+  char *argp;
+  ffi_type **p_arg;
+
+  argp = stack;
+  p_argv = avalue;
+
+  for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
+    {
+      size_t z;
+
+      z = (*p_arg)->size;
+      if (z <= 4)
+	{
+	  *p_argv = (void *) (argp + 4 - z);
+
+	  z = 4;
+	}
+      else
+	{
+	  *p_argv = (void *) argp;
+
+	  /* Align if necessary */
+	  if ((sizeof(int) - 1) & z)
+	    z = ALIGN(z, sizeof(int));
+	}
+
+      p_argv++;
+      argp += z;
+    }
+}
+
+unsigned int
+ffi_closure_SYSV_inner (ffi_closure *closure, void *resp, void *args)
+{
+  ffi_cif *cif;
+  void **arg_area;
+
+  cif = closure->cif;
+  arg_area = (void**) alloca (cif->nargs * sizeof (void *));
+
+  ffi_prep_incoming_args_SYSV(args, arg_area, cif);
+
+  (closure->fun) (cif, resp, arg_area, closure->user_data);
+
+  return cif->flags;
+}
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*,void*,void**,void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  FFI_ASSERT (cif->abi == FFI_SYSV);
+
+  *(unsigned short *)closure->tramp = 0x207c;
+  *(void **)(closure->tramp + 2) = codeloc;
+  *(unsigned short *)(closure->tramp + 6) = 0x4ef9;
+  if (cif->rtype->type == FFI_TYPE_STRUCT
+      && !cif->flags)
+    *(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV;
+  else
+    *(void **)(closure->tramp + 8) = ffi_closure_SYSV;
+
+#ifdef __rtems__
+  rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE );
+#else
+  syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE,
+	  FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE);
+#endif
+
+  closure->cif  = cif;
+  closure->user_data = user_data;
+  closure->fun  = fun;
+
+  return FFI_OK;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffitarget.h
new file mode 100644
index 0000000..3b777ed
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/ffitarget.h
@@ -0,0 +1,49 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Target configuration macros for Motorola 68K.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_SYSV,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_SYSV
+} ffi_abi;
+#endif
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 16
+#define FFI_NATIVE_RAW_API 0
+
+#endif
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/sysv.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/sysv.S
new file mode 100644
index 0000000..c782f51
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/m68k/sysv.S
@@ -0,0 +1,270 @@
+/* -----------------------------------------------------------------------
+	
+   sysv.S - Copyright (c) 1998 Andreas Schwab
+	    Copyright (c) 2008 Red Hat, Inc. 
+   
+   m68k Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+#ifdef HAVE_AS_CFI_PSEUDO_OP
+#define CFI_STARTPROC()		.cfi_startproc
+#define CFI_OFFSET(reg,off)	.cfi_offset	reg,off
+#define CFI_DEF_CFA(reg,off)	.cfi_def_cfa	reg,off
+#define CFI_ENDPROC()		.cfi_endproc
+#else
+#define CFI_STARTPROC()
+#define CFI_OFFSET(reg,off)
+#define CFI_DEF_CFA(reg,off)
+#define CFI_ENDPROC()
+#endif
+
+	.text
+
+	.globl	ffi_call_SYSV
+	.type	ffi_call_SYSV,@function
+	.align	4
+
+ffi_call_SYSV:
+	CFI_STARTPROC()
+	link	%fp,#0
+	CFI_OFFSET(14,-8)
+	CFI_DEF_CFA(14,8)
+	move.l	%d2,-(%sp)
+	CFI_OFFSET(2,-12)
+
+	| Make room for all of the new args.
+	sub.l	12(%fp),%sp
+
+	| Call ffi_prep_args
+	move.l	8(%fp),-(%sp)
+	pea	4(%sp)
+#if !defined __PIC__
+	jsr	ffi_prep_args
+#else
+	bsr.l	ffi_prep_args@PLTPC
+#endif
+	addq.l	#8,%sp	
+
+	| Pass pointer to struct value, if any
+	move.l	%a0,%a1
+
+	| Call the function
+	move.l	24(%fp),%a0
+	jsr	(%a0)
+
+	| Remove the space we pushed for the args
+	add.l	12(%fp),%sp
+
+	| Load the pointer to storage for the return value
+	move.l	20(%fp),%a1
+
+	| Load the return type code 
+	move.l	16(%fp),%d2
+
+	| If the return value pointer is NULL, assume no return value.
+	| NOTE: On the mc68000, tst on an address register is not supported.
+#if defined(__mc68000__) && !defined(__mcoldfire__)
+	cmp.w	#0, %a1
+#else
+	tst.l	%a1
+#endif
+	jbeq	noretval
+
+	btst	#0,%d2
+	jbeq	retlongint
+	move.l	%d0,(%a1)
+	jbra	epilogue
+
+retlongint:
+	btst	#1,%d2
+	jbeq	retfloat
+	move.l	%d0,(%a1)
+	move.l	%d1,4(%a1)
+	jbra	epilogue
+
+retfloat:
+	btst	#2,%d2
+	jbeq	retdouble
+#if defined(__MC68881__)
+	fmove.s	%fp0,(%a1)
+#else
+	move.l	%d0,(%a1)
+#endif
+	jbra	epilogue
+
+retdouble:
+	btst	#3,%d2
+	jbeq	retlongdouble
+#if defined(__MC68881__)
+	fmove.d	%fp0,(%a1)
+#else
+	move.l	%d0,(%a1)+
+	move.l	%d1,(%a1)
+#endif
+	jbra	epilogue
+
+retlongdouble:
+	btst	#4,%d2
+	jbeq	retpointer
+#if defined(__MC68881__)
+	fmove.x	%fp0,(%a1)
+#else
+	move.l	%d0,(%a1)+
+	move.l	%d1,(%a1)+
+	move.l	%d2,(%a1)
+#endif
+	jbra	epilogue
+
+retpointer:
+	btst	#5,%d2
+	jbeq	retstruct1
+	move.l	%a0,(%a1)
+	jbra	epilogue
+
+retstruct1:
+	btst	#6,%d2
+	jbeq	retstruct2
+	move.b	%d0,(%a1)
+	jbra	epilogue
+
+retstruct2:
+	btst	#7,%d2
+	jbeq	noretval
+	move.w	%d0,(%a1)
+
+noretval:
+epilogue:
+	move.l	(%sp)+,%d2
+	unlk	%fp
+	rts
+	CFI_ENDPROC()
+	.size	ffi_call_SYSV,.-ffi_call_SYSV
+
+	.globl	ffi_closure_SYSV
+	.type	ffi_closure_SYSV, @function
+	.align	4
+
+ffi_closure_SYSV:
+	CFI_STARTPROC()
+	link	%fp,#-12
+	CFI_OFFSET(14,-8)
+	CFI_DEF_CFA(14,8)
+	move.l	%sp,-12(%fp)
+	pea	8(%fp)
+	pea	-12(%fp)
+	move.l	%a0,-(%sp)
+#if !defined __PIC__
+	jsr	ffi_closure_SYSV_inner
+#else
+	bsr.l	ffi_closure_SYSV_inner@PLTPC
+#endif
+
+	lsr.l	#1,%d0
+	jne	1f
+	jcc	.Lcls_epilogue
+	move.l	-12(%fp),%d0
+.Lcls_epilogue:
+	unlk	%fp
+	rts
+1:
+	lea	-12(%fp),%a0
+	lsr.l	#2,%d0
+	jne	1f
+	jcs	.Lcls_ret_float
+	move.l	(%a0)+,%d0
+	move.l	(%a0),%d1
+	jra	.Lcls_epilogue
+.Lcls_ret_float:
+#if defined(__MC68881__)
+	fmove.s	(%a0),%fp0
+#else
+	move.l	(%a0),%d0
+#endif
+	jra	.Lcls_epilogue
+1:
+	lsr.l	#2,%d0
+	jne	1f
+	jcs	.Lcls_ret_ldouble
+#if defined(__MC68881__)
+	fmove.d	(%a0),%fp0
+#else
+	move.l	(%a0)+,%d0
+	move.l	(%a0),%d1
+#endif
+	jra	.Lcls_epilogue
+.Lcls_ret_ldouble:
+#if defined(__MC68881__)
+	fmove.x	(%a0),%fp0
+#else
+	move.l	(%a0)+,%d0
+	move.l	(%a0)+,%d1
+	move.l	(%a0),%d2
+#endif
+	jra	.Lcls_epilogue
+1:
+	lsr.l	#2,%d0
+	jne	.Lcls_ret_struct2
+	jcs	.Lcls_ret_struct1
+	move.l	(%a0),%a0
+	move.l	%a0,%d0
+	jra	.Lcls_epilogue
+.Lcls_ret_struct1:
+	move.b	(%a0),%d0
+	jra	.Lcls_epilogue
+.Lcls_ret_struct2:
+	move.w	(%a0),%d0
+	jra	.Lcls_epilogue
+	CFI_ENDPROC()
+
+	.size	ffi_closure_SYSV,.-ffi_closure_SYSV
+
+	.globl	ffi_closure_struct_SYSV
+	.type	ffi_closure_struct_SYSV, @function
+	.align	4
+
+ffi_closure_struct_SYSV:
+	CFI_STARTPROC()
+	link	%fp,#0
+	CFI_OFFSET(14,-8)
+	CFI_DEF_CFA(14,8)
+	move.l	%sp,-12(%fp)
+	pea	8(%fp)
+	move.l	%a1,-(%sp)
+	move.l	%a0,-(%sp)
+#if !defined __PIC__
+	jsr	ffi_closure_SYSV_inner
+#else
+	bsr.l	ffi_closure_SYSV_inner@PLTPC
+#endif
+	unlk	%fp
+	rts
+	CFI_ENDPROC()
+	.size	ffi_closure_struct_SYSV,.-ffi_closure_struct_SYSV
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffi.c
new file mode 100644
index 0000000..a7acb8a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffi.c
@@ -0,0 +1,1038 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 2011  Anthony Green
+           Copyright (c) 2008  David Daney
+           Copyright (c) 1996, 2007, 2008, 2011  Red Hat, Inc.
+   
+   MIPS Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+
+#ifdef __GNUC__
+#  if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))
+#    define USE__BUILTIN___CLEAR_CACHE 1
+#  endif
+#endif
+
+#ifndef USE__BUILTIN___CLEAR_CACHE
+#  if defined(__OpenBSD__)
+#    include <mips64/sysarch.h>
+#  else
+#    include <sys/cachectl.h>
+#  endif
+#endif
+
+#ifdef FFI_DEBUG
+# define FFI_MIPS_STOP_HERE() ffi_stop_here()
+#else
+# define FFI_MIPS_STOP_HERE() do {} while(0)
+#endif
+
+#ifdef FFI_MIPS_N32
+#define FIX_ARGP \
+FFI_ASSERT(argp <= &stack[bytes]); \
+if (argp == &stack[bytes]) \
+{ \
+  argp = stack; \
+  FFI_MIPS_STOP_HERE(); \
+}
+#else
+#define FIX_ARGP 
+#endif
+
+
+/* ffi_prep_args is called by the assembly routine once stack space
+   has been allocated for the function's arguments */
+
+static void ffi_prep_args(char *stack, 
+			  extended_cif *ecif,
+			  int bytes,
+			  int flags)
+{
+  int i;
+  void **p_argv;
+  char *argp;
+  ffi_type **p_arg;
+  int ecif_test;
+
+#ifdef FFI_MIPS_N32
+  /* If more than 8 double words are used, the remainder go
+     on the stack. We reorder stuff on the stack here to 
+     support this easily. */
+  if (bytes > 8 * sizeof(ffi_arg))
+    argp = &stack[bytes - (8 * sizeof(ffi_arg))];
+  else
+    argp = stack;
+#else
+  argp = stack;
+#endif
+
+  memset(stack, 0, bytes);
+
+#ifdef FFI_MIPS_N32
+  ecif_test = ecif->cif->rstruct_flag != 0;
+#else
+  ecif_test = ecif->cif->rtype->type == FFI_TYPE_STRUCT;
+#endif  
+    if (ecif_test)
+    {
+      *(ffi_arg *) argp = (ffi_arg) ecif->rvalue;
+      argp += sizeof(ffi_arg);
+      FIX_ARGP;
+    }
+
+  p_argv = ecif->avalue;
+
+  for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; i++, p_arg++)
+    {
+      size_t z;
+      unsigned int a;
+
+      /* Align if necessary.  */
+      a = (*p_arg)->alignment;
+      if (a < sizeof(ffi_arg))
+        a = sizeof(ffi_arg);
+      
+      if ((a - 1) & (unsigned long) argp)
+	{
+	  argp = (char *) ALIGN(argp, a);
+	  FIX_ARGP;
+	}
+
+      z = (*p_arg)->size;
+      if (z <= sizeof(ffi_arg))
+	{
+          int type = (*p_arg)->type;
+	  z = sizeof(ffi_arg);
+
+          /* The size of a pointer depends on the ABI */
+          if (type == FFI_TYPE_POINTER)
+            type = (ecif->cif->abi == FFI_N64
+		    || ecif->cif->abi == FFI_N64_SOFT_FLOAT)
+	      ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32;
+
+	if (i < 8 && (ecif->cif->abi == FFI_N32_SOFT_FLOAT
+		      || ecif->cif->abi == FFI_N64_SOFT_FLOAT))
+	  {
+	    switch (type)
+	      {
+	      case FFI_TYPE_FLOAT:
+		type = FFI_TYPE_UINT32;
+		break;
+	      case FFI_TYPE_DOUBLE:
+		type = FFI_TYPE_UINT64;
+		break;
+	      default:
+		break;
+	      }
+	  }
+	  switch (type)
+	    {
+	      case FFI_TYPE_SINT8:
+		*(ffi_arg *)argp = *(SINT8 *)(* p_argv);
+		break;
+
+	      case FFI_TYPE_UINT8:
+		*(ffi_arg *)argp = *(UINT8 *)(* p_argv);
+		break;
+		  
+	      case FFI_TYPE_SINT16:
+		*(ffi_arg *)argp = *(SINT16 *)(* p_argv);
+		break;
+		  
+	      case FFI_TYPE_UINT16:
+		*(ffi_arg *)argp = *(UINT16 *)(* p_argv);
+		break;
+		  
+	      case FFI_TYPE_SINT32:
+		*(ffi_arg *)argp = *(SINT32 *)(* p_argv);
+		break;
+		  
+	      case FFI_TYPE_UINT32:
+		*(ffi_arg *)argp = *(UINT32 *)(* p_argv);
+		break;
+
+	      /* This can only happen with 64bit slots.  */
+	      case FFI_TYPE_FLOAT:
+		*(float *) argp = *(float *)(* p_argv);
+		break;
+
+	      /* Handle structures.  */
+	      default:
+		memcpy(argp, *p_argv, (*p_arg)->size);
+		break;
+	    }
+	}
+      else
+	{
+#ifdef FFI_MIPS_O32
+	  memcpy(argp, *p_argv, z);
+#else
+	  {
+	    unsigned long end = (unsigned long) argp + z;
+	    unsigned long cap = (unsigned long) stack + bytes;
+
+	    /* Check if the data will fit within the register space.
+	       Handle it if it doesn't.  */
+
+	    if (end <= cap)
+	      memcpy(argp, *p_argv, z);
+	    else
+	      {
+		unsigned long portion = cap - (unsigned long)argp;
+
+		memcpy(argp, *p_argv, portion);
+		argp = stack;
+                z -= portion;
+		memcpy(argp, (void*)((unsigned long)(*p_argv) + portion),
+                       z);
+	      }
+	  }
+#endif
+      }
+      p_argv++;
+      argp += z;
+      FIX_ARGP;
+    }
+}
+
+#ifdef FFI_MIPS_N32
+
+/* The n32 spec says that if "a chunk consists solely of a double 
+   float field (but not a double, which is part of a union), it
+   is passed in a floating point register. Any other chunk is
+   passed in an integer register". This code traverses structure
+   definitions and generates the appropriate flags. */
+
+static unsigned
+calc_n32_struct_flags(int soft_float, ffi_type *arg,
+		      unsigned *loc, unsigned *arg_reg)
+{
+  unsigned flags = 0;
+  unsigned index = 0;
+
+  ffi_type *e;
+
+  if (soft_float)
+    return 0;
+
+  while ((e = arg->elements[index]))
+    {
+      /* Align this object.  */
+      *loc = ALIGN(*loc, e->alignment);
+      if (e->type == FFI_TYPE_DOUBLE)
+	{
+          /* Already aligned to FFI_SIZEOF_ARG.  */
+          *arg_reg = *loc / FFI_SIZEOF_ARG;
+          if (*arg_reg > 7)
+            break;
+	  flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS));
+          *loc += e->size;
+	}
+      else
+        *loc += e->size;
+      index++;
+    }
+  /* Next Argument register at alignment of FFI_SIZEOF_ARG.  */
+  *arg_reg = ALIGN(*loc, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
+
+  return flags;
+}
+
+static unsigned
+calc_n32_return_struct_flags(int soft_float, ffi_type *arg)
+{
+  unsigned flags = 0;
+  unsigned small = FFI_TYPE_SMALLSTRUCT;
+  ffi_type *e;
+
+  /* Returning structures under n32 is a tricky thing.
+     A struct with only one or two floating point fields 
+     is returned in $f0 (and $f2 if necessary). Any other
+     struct results at most 128 bits are returned in $2
+     (the first 64 bits) and $3 (remainder, if necessary).
+     Larger structs are handled normally. */
+  
+  if (arg->size > 16)
+    return 0;
+
+  if (arg->size > 8)
+    small = FFI_TYPE_SMALLSTRUCT2;
+
+  e = arg->elements[0];
+
+  if (e->type == FFI_TYPE_DOUBLE)
+    flags = FFI_TYPE_DOUBLE;
+  else if (e->type == FFI_TYPE_FLOAT)
+    flags = FFI_TYPE_FLOAT;
+
+  if (flags && (e = arg->elements[1]))
+    {
+      if (e->type == FFI_TYPE_DOUBLE)
+	flags += FFI_TYPE_DOUBLE << FFI_FLAG_BITS;
+      else if (e->type == FFI_TYPE_FLOAT)
+	flags += FFI_TYPE_FLOAT << FFI_FLAG_BITS;
+      else 
+	return small;
+
+      if (flags && (arg->elements[2]))
+	{
+	  /* There are three arguments and the first two are 
+	     floats! This must be passed the old way. */
+	  return small;
+	}
+      if (soft_float)
+	flags += FFI_TYPE_STRUCT_SOFT;
+    }
+  else
+    if (!flags)
+      return small;
+
+  return flags;
+}
+
+#endif
+
+/* Perform machine dependent cif processing */
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  cif->flags = 0;
+
+#ifdef FFI_MIPS_O32
+  /* Set the flags necessary for O32 processing.  FFI_O32_SOFT_FLOAT
+   * does not have special handling for floating point args.
+   */
+
+  if (cif->rtype->type != FFI_TYPE_STRUCT && cif->abi == FFI_O32)
+    {
+      if (cif->nargs > 0)
+	{
+	  switch ((cif->arg_types)[0]->type)
+	    {
+	    case FFI_TYPE_FLOAT:
+	    case FFI_TYPE_DOUBLE:
+	      cif->flags += (cif->arg_types)[0]->type;
+	      break;
+	      
+	    default:
+	      break;
+	    }
+
+	  if (cif->nargs > 1)
+	    {
+	      /* Only handle the second argument if the first
+		 is a float or double. */
+	      if (cif->flags)
+		{
+		  switch ((cif->arg_types)[1]->type)
+		    {
+		    case FFI_TYPE_FLOAT:
+		    case FFI_TYPE_DOUBLE:
+		      cif->flags += (cif->arg_types)[1]->type << FFI_FLAG_BITS;
+		      break;
+		      
+		    default:
+		      break;
+		    }
+		}
+	    }
+	}
+    }
+      
+  /* Set the return type flag */
+
+  if (cif->abi == FFI_O32_SOFT_FLOAT)
+    {
+      switch (cif->rtype->type)
+        {
+        case FFI_TYPE_VOID:
+        case FFI_TYPE_STRUCT:
+          cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2);
+          break;
+
+        case FFI_TYPE_SINT64:
+        case FFI_TYPE_UINT64:
+        case FFI_TYPE_DOUBLE:
+          cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2);
+          break;
+      
+        case FFI_TYPE_FLOAT:
+        default:
+          cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2);
+          break;
+        }
+    }
+  else
+    {
+      /* FFI_O32 */      
+      switch (cif->rtype->type)
+        {
+        case FFI_TYPE_VOID:
+        case FFI_TYPE_STRUCT:
+        case FFI_TYPE_FLOAT:
+        case FFI_TYPE_DOUBLE:
+          cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2);
+          break;
+
+        case FFI_TYPE_SINT64:
+        case FFI_TYPE_UINT64:
+          cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 2);
+          break;
+      
+        default:
+          cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 2);
+          break;
+        }
+    }
+#endif
+
+#ifdef FFI_MIPS_N32
+  /* Set the flags necessary for N32 processing */
+  {
+    int type;
+    unsigned arg_reg = 0;
+    unsigned loc = 0;
+    unsigned count = (cif->nargs < 8) ? cif->nargs : 8;
+    unsigned index = 0;
+
+    unsigned struct_flags = 0;
+    int soft_float = (cif->abi == FFI_N32_SOFT_FLOAT
+		      || cif->abi == FFI_N64_SOFT_FLOAT);
+
+    if (cif->rtype->type == FFI_TYPE_STRUCT)
+      {
+	struct_flags = calc_n32_return_struct_flags(soft_float, cif->rtype);
+
+	if (struct_flags == 0)
+	  {
+	    /* This means that the structure is being passed as
+	       a hidden argument */
+
+	    arg_reg = 1;
+	    count = (cif->nargs < 7) ? cif->nargs : 7;
+
+	    cif->rstruct_flag = !0;
+	  }
+	else
+	    cif->rstruct_flag = 0;
+      }
+    else
+      cif->rstruct_flag = 0;
+
+    while (count-- > 0 && arg_reg < 8)
+      {
+	type = (cif->arg_types)[index]->type;
+	if (soft_float)
+	  {
+	    switch (type)
+	      {
+	      case FFI_TYPE_FLOAT:
+		type = FFI_TYPE_UINT32;
+		break;
+	      case FFI_TYPE_DOUBLE:
+		type = FFI_TYPE_UINT64;
+		break;
+	      default:
+		break;
+	      }
+	  }
+	switch (type)
+	  {
+	  case FFI_TYPE_FLOAT:
+	  case FFI_TYPE_DOUBLE:
+	    cif->flags +=
+              ((cif->arg_types)[index]->type << (arg_reg * FFI_FLAG_BITS));
+	    arg_reg++;
+	    break;
+          case FFI_TYPE_LONGDOUBLE:
+            /* Align it.  */
+            arg_reg = ALIGN(arg_reg, 2);
+            /* Treat it as two adjacent doubles.  */
+	    if (soft_float) 
+	      {
+		arg_reg += 2;
+	      }
+	    else
+	      {
+		cif->flags +=
+		  (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
+		arg_reg++;
+		cif->flags +=
+		  (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
+		arg_reg++;
+	      }
+            break;
+
+	  case FFI_TYPE_STRUCT:
+            loc = arg_reg * FFI_SIZEOF_ARG;
+	    cif->flags += calc_n32_struct_flags(soft_float,
+						(cif->arg_types)[index],
+						&loc, &arg_reg);
+	    break;
+
+	  default:
+	    arg_reg++;
+            break;
+	  }
+
+	index++;
+      }
+
+  /* Set the return type flag */
+    switch (cif->rtype->type)
+      {
+      case FFI_TYPE_STRUCT:
+	{
+	  if (struct_flags == 0)
+	    {
+	      /* The structure is returned through a hidden
+		 first argument. Do nothing, 'cause FFI_TYPE_VOID 
+		 is 0 */
+	    }
+	  else
+	    {
+	      /* The structure is returned via some tricky
+		 mechanism */
+	      cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8);
+	      cif->flags += struct_flags << (4 + (FFI_FLAG_BITS * 8));
+	    }
+	  break;
+	}
+      
+      case FFI_TYPE_VOID:
+	/* Do nothing, 'cause FFI_TYPE_VOID is 0 */
+	break;
+
+      case FFI_TYPE_POINTER:
+	if (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N32)
+	  cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8);
+	else
+	  cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
+	break;
+
+      case FFI_TYPE_FLOAT:
+	if (soft_float)
+	  {
+	    cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8);
+	    break;
+	  }
+	/* else fall through */
+      case FFI_TYPE_DOUBLE:
+	if (soft_float)
+	  cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
+	else
+	  cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8);
+	break;
+
+      case FFI_TYPE_LONGDOUBLE:
+	/* Long double is returned as if it were a struct containing
+	   two doubles.  */
+	if (soft_float)
+	  {
+	    cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8);
+	    cif->flags += FFI_TYPE_SMALLSTRUCT2 << (4 + (FFI_FLAG_BITS * 8));
+ 	  }
+	else
+	  {
+	    cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8);
+	    cif->flags += (FFI_TYPE_DOUBLE
+			   + (FFI_TYPE_DOUBLE << FFI_FLAG_BITS))
+					      << (4 + (FFI_FLAG_BITS * 8));
+	  }
+	break;
+      default:
+	cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
+	break;
+      }
+  }
+#endif
+  
+  return FFI_OK;
+}
+
+/* Low level routine for calling O32 functions */
+extern int ffi_call_O32(void (*)(char *, extended_cif *, int, int), 
+			extended_cif *, unsigned, 
+			unsigned, unsigned *, void (*)(void));
+
+/* Low level routine for calling N32 functions */
+extern int ffi_call_N32(void (*)(char *, extended_cif *, int, int), 
+			extended_cif *, unsigned, 
+			unsigned, void *, void (*)(void));
+
+void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+  
+  /* If the return value is a struct and we don't have a return	*/
+  /* value address then we need to make one		        */
+  
+  if ((rvalue == NULL) && 
+      (cif->rtype->type == FFI_TYPE_STRUCT))
+    ecif.rvalue = alloca(cif->rtype->size);
+  else
+    ecif.rvalue = rvalue;
+    
+  switch (cif->abi) 
+    {
+#ifdef FFI_MIPS_O32
+    case FFI_O32:
+    case FFI_O32_SOFT_FLOAT:
+      ffi_call_O32(ffi_prep_args, &ecif, cif->bytes, 
+		   cif->flags, ecif.rvalue, fn);
+      break;
+#endif
+
+#ifdef FFI_MIPS_N32
+    case FFI_N32:
+    case FFI_N32_SOFT_FLOAT:
+    case FFI_N64:
+    case FFI_N64_SOFT_FLOAT:
+      {
+        int copy_rvalue = 0;
+	int copy_offset = 0;
+        char *rvalue_copy = ecif.rvalue;
+        if (cif->rtype->type == FFI_TYPE_STRUCT && cif->rtype->size < 16)
+          {
+            /* For structures smaller than 16 bytes we clobber memory
+               in 8 byte increments.  Make a copy so we don't clobber
+               the callers memory outside of the struct bounds.  */
+            rvalue_copy = alloca(16);
+            copy_rvalue = 1;
+          }
+	else if (cif->rtype->type == FFI_TYPE_FLOAT
+		 && (cif->abi == FFI_N64_SOFT_FLOAT
+		     || cif->abi == FFI_N32_SOFT_FLOAT))
+	  {
+	    rvalue_copy = alloca (8);
+	    copy_rvalue = 1;
+#if defined(__MIPSEB__) || defined(_MIPSEB)
+	    copy_offset = 4;
+#endif
+	  }
+        ffi_call_N32(ffi_prep_args, &ecif, cif->bytes,
+                     cif->flags, rvalue_copy, fn);
+        if (copy_rvalue)
+          memcpy(ecif.rvalue, rvalue_copy + copy_offset, cif->rtype->size);
+      }
+      break;
+#endif
+
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+}
+
+#if FFI_CLOSURES
+#if defined(FFI_MIPS_O32)
+extern void ffi_closure_O32(void);
+#else
+extern void ffi_closure_N32(void);
+#endif /* FFI_MIPS_O32 */
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure *closure,
+		      ffi_cif *cif,
+		      void (*fun)(ffi_cif*,void*,void**,void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
+  void * fn;
+  char *clear_location = (char *) codeloc;
+
+#if defined(FFI_MIPS_O32)
+  if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT)
+    return FFI_BAD_ABI;
+  fn = ffi_closure_O32;
+#else /* FFI_MIPS_N32 */
+  if (cif->abi != FFI_N32 && cif->abi != FFI_N64)
+    return FFI_BAD_ABI;
+  fn = ffi_closure_N32;
+#endif /* FFI_MIPS_O32 */
+
+#if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32)
+  /* lui  $25,high(fn) */
+  tramp[0] = 0x3c190000 | ((unsigned)fn >> 16);
+  /* ori  $25,low(fn)  */
+  tramp[1] = 0x37390000 | ((unsigned)fn & 0xffff);
+  /* lui  $12,high(codeloc) */
+  tramp[2] = 0x3c0c0000 | ((unsigned)codeloc >> 16);
+  /* jr   $25          */
+  tramp[3] = 0x03200008;
+  /* ori  $12,low(codeloc)  */
+  tramp[4] = 0x358c0000 | ((unsigned)codeloc & 0xffff);
+#else
+  /* N64 has a somewhat larger trampoline.  */
+  /* lui  $25,high(fn) */
+  tramp[0] = 0x3c190000 | ((unsigned long)fn >> 48);
+  /* lui  $12,high(codeloc) */
+  tramp[1] = 0x3c0c0000 | ((unsigned long)codeloc >> 48);
+  /* ori  $25,mid-high(fn)  */
+  tramp[2] = 0x37390000 | (((unsigned long)fn >> 32 ) & 0xffff);
+  /* ori  $12,mid-high(codeloc)  */
+  tramp[3] = 0x358c0000 | (((unsigned long)codeloc >> 32) & 0xffff);
+  /* dsll $25,$25,16 */
+  tramp[4] = 0x0019cc38;
+  /* dsll $12,$12,16 */
+  tramp[5] = 0x000c6438;
+  /* ori  $25,mid-low(fn)  */
+  tramp[6] = 0x37390000 | (((unsigned long)fn >> 16 ) & 0xffff);
+  /* ori  $12,mid-low(codeloc)  */
+  tramp[7] = 0x358c0000 | (((unsigned long)codeloc >> 16) & 0xffff);
+  /* dsll $25,$25,16 */
+  tramp[8] = 0x0019cc38;
+  /* dsll $12,$12,16 */
+  tramp[9] = 0x000c6438;
+  /* ori  $25,low(fn)  */
+  tramp[10] = 0x37390000 | ((unsigned long)fn  & 0xffff);
+  /* jr   $25          */
+  tramp[11] = 0x03200008;
+  /* ori  $12,low(codeloc)  */
+  tramp[12] = 0x358c0000 | ((unsigned long)codeloc & 0xffff);
+
+#endif
+
+  closure->cif = cif;
+  closure->fun = fun;
+  closure->user_data = user_data;
+
+#ifdef USE__BUILTIN___CLEAR_CACHE
+  __builtin___clear_cache(clear_location, clear_location + FFI_TRAMPOLINE_SIZE);
+#else
+  cacheflush (clear_location, FFI_TRAMPOLINE_SIZE, ICACHE);
+#endif
+  return FFI_OK;
+}
+
+/*
+ * Decodes the arguments to a function, which will be stored on the
+ * stack. AR is the pointer to the beginning of the integer arguments
+ * (and, depending upon the arguments, some floating-point arguments
+ * as well). FPR is a pointer to the area where floating point
+ * registers have been saved, if any.
+ *
+ * RVALUE is the location where the function return value will be
+ * stored. CLOSURE is the prepared closure to invoke.
+ *
+ * This function should only be called from assembly, which is in
+ * turn called from a trampoline.
+ *
+ * Returns the function return type.
+ *
+ * Based on the similar routine for sparc.
+ */
+int
+ffi_closure_mips_inner_O32 (ffi_closure *closure,
+			    void *rvalue, ffi_arg *ar,
+			    double *fpr)
+{
+  ffi_cif *cif;
+  void **avaluep;
+  ffi_arg *avalue;
+  ffi_type **arg_types;
+  int i, avn, argn, seen_int;
+
+  cif = closure->cif;
+  avalue = alloca (cif->nargs * sizeof (ffi_arg));
+  avaluep = alloca (cif->nargs * sizeof (ffi_arg));
+
+  seen_int = (cif->abi == FFI_O32_SOFT_FLOAT);
+  argn = 0;
+
+  if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_STRUCT)
+    {
+      rvalue = (void *)(UINT32)ar[0];
+      argn = 1;
+    }
+
+  i = 0;
+  avn = cif->nargs;
+  arg_types = cif->arg_types;
+
+  while (i < avn)
+    {
+      if (i < 2 && !seen_int &&
+	  (arg_types[i]->type == FFI_TYPE_FLOAT ||
+	   arg_types[i]->type == FFI_TYPE_DOUBLE ||
+	   arg_types[i]->type == FFI_TYPE_LONGDOUBLE))
+	{
+#if defined(__MIPSEB__) || defined(_MIPSEB)
+	  if (arg_types[i]->type == FFI_TYPE_FLOAT)
+	    avaluep[i] = ((char *) &fpr[i]) + sizeof (float);
+	  else
+#endif
+	    avaluep[i] = (char *) &fpr[i];
+	}
+      else
+	{
+	  if (arg_types[i]->alignment == 8 && (argn & 0x1))
+	    argn++;
+	  switch (arg_types[i]->type)
+	    {
+	      case FFI_TYPE_SINT8:
+		avaluep[i] = &avalue[i];
+		*(SINT8 *) &avalue[i] = (SINT8) ar[argn];
+		break;
+
+	      case FFI_TYPE_UINT8:
+		avaluep[i] = &avalue[i];
+		*(UINT8 *) &avalue[i] = (UINT8) ar[argn];
+		break;
+		  
+	      case FFI_TYPE_SINT16:
+		avaluep[i] = &avalue[i];
+		*(SINT16 *) &avalue[i] = (SINT16) ar[argn];
+		break;
+		  
+	      case FFI_TYPE_UINT16:
+		avaluep[i] = &avalue[i];
+		*(UINT16 *) &avalue[i] = (UINT16) ar[argn];
+		break;
+
+	      default:
+		avaluep[i] = (char *) &ar[argn];
+		break;
+	    }
+	  seen_int = 1;
+	}
+      argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
+      i++;
+    }
+
+  /* Invoke the closure. */
+  (closure->fun) (cif, rvalue, avaluep, closure->user_data);
+
+  if (cif->abi == FFI_O32_SOFT_FLOAT)
+    {
+      switch (cif->rtype->type)
+        {
+        case FFI_TYPE_FLOAT:
+          return FFI_TYPE_INT;
+        case FFI_TYPE_DOUBLE:
+          return FFI_TYPE_UINT64;
+        default:
+          return cif->rtype->type;
+        }
+    }
+  else
+    {
+      return cif->rtype->type;
+    }
+}
+
+#if defined(FFI_MIPS_N32)
+
+static void
+copy_struct_N32(char *target, unsigned offset, ffi_abi abi, ffi_type *type,
+                int argn, unsigned arg_offset, ffi_arg *ar,
+                ffi_arg *fpr, int soft_float)
+{
+  ffi_type **elt_typep = type->elements;
+  while(*elt_typep)
+    {
+      ffi_type *elt_type = *elt_typep;
+      unsigned o;
+      char *tp;
+      char *argp;
+      char *fpp;
+
+      o = ALIGN(offset, elt_type->alignment);
+      arg_offset += o - offset;
+      offset = o;
+      argn += arg_offset / sizeof(ffi_arg);
+      arg_offset = arg_offset % sizeof(ffi_arg);
+
+      argp = (char *)(ar + argn);
+      fpp = (char *)(argn >= 8 ? ar + argn : fpr + argn);
+
+      tp = target + offset;
+
+      if (elt_type->type == FFI_TYPE_DOUBLE && !soft_float)
+        *(double *)tp = *(double *)fpp;
+      else
+        memcpy(tp, argp + arg_offset, elt_type->size);
+
+      offset += elt_type->size;
+      arg_offset += elt_type->size;
+      elt_typep++;
+      argn += arg_offset / sizeof(ffi_arg);
+      arg_offset = arg_offset % sizeof(ffi_arg);
+    }
+}
+
+/*
+ * Decodes the arguments to a function, which will be stored on the
+ * stack. AR is the pointer to the beginning of the integer
+ * arguments. FPR is a pointer to the area where floating point
+ * registers have been saved.
+ *
+ * RVALUE is the location where the function return value will be
+ * stored. CLOSURE is the prepared closure to invoke.
+ *
+ * This function should only be called from assembly, which is in
+ * turn called from a trampoline.
+ *
+ * Returns the function return flags.
+ *
+ */
+int
+ffi_closure_mips_inner_N32 (ffi_closure *closure,
+			    void *rvalue, ffi_arg *ar,
+			    ffi_arg *fpr)
+{
+  ffi_cif *cif;
+  void **avaluep;
+  ffi_arg *avalue;
+  ffi_type **arg_types;
+  int i, avn, argn;
+  int soft_float;
+  ffi_arg *argp;
+
+  cif = closure->cif;
+  soft_float = cif->abi == FFI_N64_SOFT_FLOAT
+    || cif->abi == FFI_N32_SOFT_FLOAT;
+  avalue = alloca (cif->nargs * sizeof (ffi_arg));
+  avaluep = alloca (cif->nargs * sizeof (ffi_arg));
+
+  argn = 0;
+
+  if (cif->rstruct_flag)
+    {
+#if _MIPS_SIM==_ABIN32
+      rvalue = (void *)(UINT32)ar[0];
+#else /* N64 */
+      rvalue = (void *)ar[0];
+#endif
+      argn = 1;
+    }
+
+  i = 0;
+  avn = cif->nargs;
+  arg_types = cif->arg_types;
+
+  while (i < avn)
+    {
+      if (arg_types[i]->type == FFI_TYPE_FLOAT
+	  || arg_types[i]->type == FFI_TYPE_DOUBLE
+	  || arg_types[i]->type == FFI_TYPE_LONGDOUBLE)
+        {
+          argp = (argn >= 8 || soft_float) ? ar + argn : fpr + argn;
+          if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((unsigned)argp & (arg_types[i]->alignment-1)))
+            {
+              argp=(ffi_arg*)ALIGN(argp,arg_types[i]->alignment);
+              argn++;
+            }
+#if defined(__MIPSEB__) || defined(_MIPSEB)
+          if (arg_types[i]->type == FFI_TYPE_FLOAT && argn < 8)
+            avaluep[i] = ((char *) argp) + sizeof (float);
+          else
+#endif
+            avaluep[i] = (char *) argp;
+        }
+      else
+        {
+          unsigned type = arg_types[i]->type;
+
+          if (arg_types[i]->alignment > sizeof(ffi_arg))
+            argn = ALIGN(argn, arg_types[i]->alignment / sizeof(ffi_arg));
+
+          argp = ar + argn;
+
+          /* The size of a pointer depends on the ABI */
+          if (type == FFI_TYPE_POINTER)
+            type = (cif->abi == FFI_N64 || cif->abi == FFI_N64_SOFT_FLOAT)
+	      ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32;
+
+	  if (soft_float && type ==  FFI_TYPE_FLOAT)
+	    type = FFI_TYPE_UINT32;
+
+          switch (type)
+            {
+            case FFI_TYPE_SINT8:
+              avaluep[i] = &avalue[i];
+              *(SINT8 *) &avalue[i] = (SINT8) *argp;
+              break;
+
+            case FFI_TYPE_UINT8:
+              avaluep[i] = &avalue[i];
+              *(UINT8 *) &avalue[i] = (UINT8) *argp;
+              break;
+
+            case FFI_TYPE_SINT16:
+              avaluep[i] = &avalue[i];
+              *(SINT16 *) &avalue[i] = (SINT16) *argp;
+              break;
+
+            case FFI_TYPE_UINT16:
+              avaluep[i] = &avalue[i];
+              *(UINT16 *) &avalue[i] = (UINT16) *argp;
+              break;
+
+            case FFI_TYPE_SINT32:
+              avaluep[i] = &avalue[i];
+              *(SINT32 *) &avalue[i] = (SINT32) *argp;
+              break;
+
+            case FFI_TYPE_UINT32:
+              avaluep[i] = &avalue[i];
+              *(UINT32 *) &avalue[i] = (UINT32) *argp;
+              break;
+
+            case FFI_TYPE_STRUCT:
+              if (argn < 8)
+                {
+                  /* Allocate space for the struct as at least part of
+                     it was passed in registers.  */
+                  avaluep[i] = alloca(arg_types[i]->size);
+                  copy_struct_N32(avaluep[i], 0, cif->abi, arg_types[i],
+                                  argn, 0, ar, fpr, soft_float);
+
+                  break;
+                }
+              /* Else fall through.  */
+            default:
+              avaluep[i] = (char *) argp;
+              break;
+            }
+        }
+      argn += ALIGN(arg_types[i]->size, sizeof(ffi_arg)) / sizeof(ffi_arg);
+      i++;
+    }
+
+  /* Invoke the closure. */
+  (closure->fun) (cif, rvalue, avaluep, closure->user_data);
+
+  return cif->flags >> (FFI_FLAG_BITS * 8);
+}
+
+#endif /* FFI_MIPS_N32 */
+
+#endif /* FFI_CLOSURES */
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffitarget.h
new file mode 100644
index 0000000..637adbf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/ffitarget.h
@@ -0,0 +1,242 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Target configuration macros for MIPS.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+#ifdef linux
+# include <asm/sgidefs.h>
+#elif defined(__rtems__)
+/*
+ * Subprogram calling convention - copied from sgidefs.h
+ */
+#define _MIPS_SIM_ABI32		1
+#define _MIPS_SIM_NABI32	2
+#define _MIPS_SIM_ABI64		3
+#elif !defined(__OpenBSD__)
+# include <sgidefs.h>
+#endif
+
+#  ifndef _ABIN32
+#    define _ABIN32 _MIPS_SIM_NABI32
+#  endif
+#  ifndef _ABI64
+#    define _ABI64 _MIPS_SIM_ABI64
+#  endif
+#  ifndef _ABIO32
+#    define _ABIO32 _MIPS_SIM_ABI32
+#  endif
+
+#if !defined(_MIPS_SIM)
+# error -- something is very wrong --
+#else
+#  if (_MIPS_SIM==_ABIN32 && defined(_ABIN32)) || (_MIPS_SIM==_ABI64 && defined(_ABI64))
+#    define FFI_MIPS_N32
+#  else
+#    if (_MIPS_SIM==_ABIO32 && defined(_ABIO32))
+#      define FFI_MIPS_O32
+#    else
+#     error -- this is an unsupported platform --
+#    endif
+#  endif
+#endif
+
+#ifdef FFI_MIPS_O32
+/* O32 stack frames have 32bit integer args */
+#  define FFI_SIZEOF_ARG    4
+#else
+/* N32 and N64 frames have 64bit integer args */
+#  define FFI_SIZEOF_ARG    8
+#  if _MIPS_SIM == _ABIN32
+#    define FFI_SIZEOF_JAVA_RAW  4
+#  endif
+#endif
+
+#define FFI_FLAG_BITS 2
+
+/* SGI's strange assembler requires that we multiply by 4 rather 
+   than shift left by FFI_FLAG_BITS */
+
+#define FFI_ARGS_D   FFI_TYPE_DOUBLE
+#define FFI_ARGS_F   FFI_TYPE_FLOAT
+#define FFI_ARGS_DD  FFI_TYPE_DOUBLE * 4 + FFI_TYPE_DOUBLE
+#define FFI_ARGS_FF  FFI_TYPE_FLOAT * 4 +  FFI_TYPE_FLOAT
+#define FFI_ARGS_FD  FFI_TYPE_DOUBLE * 4 + FFI_TYPE_FLOAT
+#define FFI_ARGS_DF  FFI_TYPE_FLOAT * 4 + FFI_TYPE_DOUBLE
+
+/* Needed for N32 structure returns */
+#define FFI_TYPE_SMALLSTRUCT  FFI_TYPE_UINT8
+#define FFI_TYPE_SMALLSTRUCT2 FFI_TYPE_SINT8
+
+#if 0
+/* The SGI assembler can't handle this.. */
+#define FFI_TYPE_STRUCT_DD (( FFI_ARGS_DD ) << 4) + FFI_TYPE_STRUCT
+/* (and so on) */
+#else
+/* ...so we calculate these by hand! */
+#define FFI_TYPE_STRUCT_D      61
+#define FFI_TYPE_STRUCT_F      45
+#define FFI_TYPE_STRUCT_DD     253
+#define FFI_TYPE_STRUCT_FF     173
+#define FFI_TYPE_STRUCT_FD     237
+#define FFI_TYPE_STRUCT_DF     189
+#define FFI_TYPE_STRUCT_SMALL  93
+#define FFI_TYPE_STRUCT_SMALL2 109
+
+/* and for n32 soft float, add 16 * 2^4 */
+#define FFI_TYPE_STRUCT_D_SOFT      317
+#define FFI_TYPE_STRUCT_F_SOFT      301
+#define FFI_TYPE_STRUCT_DD_SOFT     509
+#define FFI_TYPE_STRUCT_FF_SOFT     429
+#define FFI_TYPE_STRUCT_FD_SOFT     493
+#define FFI_TYPE_STRUCT_DF_SOFT     445
+#define FFI_TYPE_STRUCT_SOFT        16
+#endif
+
+#ifdef LIBFFI_ASM
+#define v0 $2
+#define v1 $3
+#define a0 $4
+#define a1 $5
+#define a2 $6
+#define a3 $7
+#define a4 $8		
+#define a5 $9		
+#define a6 $10		
+#define a7 $11		
+#define t0 $8
+#define t1 $9
+#define t2 $10
+#define t3 $11
+#define t4 $12		
+#define t5 $13
+#define t6 $14	
+#define t7 $15
+#define t8 $24
+#define t9 $25
+#define ra $31		
+
+#ifdef FFI_MIPS_O32
+# define REG_L	lw
+# define REG_S	sw
+# define SUBU	subu
+# define ADDU	addu
+# define SRL	srl
+# define LI	li
+#else /* !FFI_MIPS_O32 */
+# define REG_L	ld
+# define REG_S	sd
+# define SUBU	dsubu
+# define ADDU	daddu
+# define SRL	dsrl
+# define LI 	dli
+# if (_MIPS_SIM==_ABI64)
+#  define LA dla
+#  define EH_FRAME_ALIGN 3
+#  define FDE_ADDR_BYTES .8byte
+# else
+#  define LA la
+#  define EH_FRAME_ALIGN 2
+#  define FDE_ADDR_BYTES .4byte
+# endif /* _MIPS_SIM==_ABI64 */
+#endif /* !FFI_MIPS_O32 */
+#else /* !LIBFFI_ASM */
+# ifdef __GNUC__
+#  ifdef FFI_MIPS_O32
+/* O32 stack frames have 32bit integer args */
+typedef unsigned int     ffi_arg __attribute__((__mode__(__SI__)));
+typedef signed   int     ffi_sarg __attribute__((__mode__(__SI__)));
+#else
+/* N32 and N64 frames have 64bit integer args */
+typedef unsigned int     ffi_arg __attribute__((__mode__(__DI__)));
+typedef signed   int     ffi_sarg __attribute__((__mode__(__DI__)));
+#  endif
+# else
+#  ifdef FFI_MIPS_O32
+/* O32 stack frames have 32bit integer args */
+typedef __uint32_t ffi_arg;
+typedef __int32_t ffi_sarg;
+#  else
+/* N32 and N64 frames have 64bit integer args */
+typedef __uint64_t ffi_arg;
+typedef __int64_t ffi_sarg;
+#  endif
+# endif /* __GNUC__ */
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_O32,
+  FFI_N32,
+  FFI_N64,
+  FFI_O32_SOFT_FLOAT,
+  FFI_N32_SOFT_FLOAT,
+  FFI_N64_SOFT_FLOAT,
+  FFI_LAST_ABI,
+
+#ifdef FFI_MIPS_O32
+#ifdef __mips_soft_float
+  FFI_DEFAULT_ABI = FFI_O32_SOFT_FLOAT
+#else
+  FFI_DEFAULT_ABI = FFI_O32
+#endif
+#else
+# if _MIPS_SIM==_ABI64
+#  ifdef __mips_soft_float
+  FFI_DEFAULT_ABI = FFI_N64_SOFT_FLOAT
+#  else
+  FFI_DEFAULT_ABI = FFI_N64
+#  endif
+# else
+#  ifdef __mips_soft_float
+  FFI_DEFAULT_ABI = FFI_N32_SOFT_FLOAT
+#  else
+  FFI_DEFAULT_ABI = FFI_N32
+#  endif
+# endif
+#endif
+} ffi_abi;
+
+#define FFI_EXTRA_CIF_FIELDS unsigned rstruct_flag
+#endif /* !LIBFFI_ASM */
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#if defined(FFI_MIPS_O32)
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 20
+#else
+/* N32/N64. */
+# define FFI_CLOSURES 1
+#if _MIPS_SIM==_ABI64
+#define FFI_TRAMPOLINE_SIZE 52
+#else
+#define FFI_TRAMPOLINE_SIZE 20
+#endif
+#endif /* FFI_MIPS_O32 */
+#define FFI_NATIVE_RAW_API 0
+
+#endif
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/n32.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/n32.S
new file mode 100644
index 0000000..ae23094
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/n32.S
@@ -0,0 +1,591 @@
+/* -----------------------------------------------------------------------
+   n32.S - Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010  Red Hat, Inc.
+   
+   MIPS Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+/* Only build this code if we are compiling for n32 */	
+
+#if defined(FFI_MIPS_N32)
+
+#define callback a0
+#define bytes	 a2
+#define flags	 a3
+#define raddr    a4
+#define fn       a5
+
+#define SIZEOF_FRAME	( 8 * FFI_SIZEOF_ARG )
+
+#ifdef __GNUC__
+	.abicalls
+#endif
+	.text
+	.align	2
+	.globl	ffi_call_N32
+	.ent	ffi_call_N32
+ffi_call_N32:	
+.LFB3:
+	.frame	$fp, SIZEOF_FRAME, ra
+	.mask	0xc0000000,-FFI_SIZEOF_ARG
+	.fmask	0x00000000,0
+
+	# Prologue
+	SUBU	$sp, SIZEOF_FRAME			# Frame size
+.LCFI0:
+	REG_S	$fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp)	# Save frame pointer
+	REG_S	ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp)	# Save return address
+.LCFI1:
+	move	$fp, $sp
+.LCFI3:
+	move	t9, callback	# callback function pointer
+	REG_S	bytes, 2*FFI_SIZEOF_ARG($fp) # bytes
+	REG_S	flags, 3*FFI_SIZEOF_ARG($fp) # flags
+	REG_S	raddr, 4*FFI_SIZEOF_ARG($fp) # raddr
+	REG_S	fn,    5*FFI_SIZEOF_ARG($fp) # fn
+
+	# Allocate at least 4 words in the argstack
+	move	v0, bytes
+	bge	bytes, 4 * FFI_SIZEOF_ARG, bigger	
+	LI	v0, 4 * FFI_SIZEOF_ARG
+	b	sixteen
+
+	bigger:	
+	ADDU	t4, v0, 2 * FFI_SIZEOF_ARG -1	# make sure it is aligned 
+	and	v0, t4, -2 * FFI_SIZEOF_ARG		# to a proper boundry.
+
+sixteen:
+	SUBU	$sp, $sp, v0	# move the stack pointer to reflect the
+				# arg space
+
+	move	a0, $sp         # 4 * FFI_SIZEOF_ARG
+	ADDU	a3, $fp, 3 * FFI_SIZEOF_ARG
+
+	# Call ffi_prep_args
+	jal	t9
+	
+	# Copy the stack pointer to t9
+	move	t9, $sp
+	
+	# Fix the stack if there are more than 8 64bit slots worth
+	# of arguments.
+
+	# Load the number of bytes
+	REG_L	t6, 2*FFI_SIZEOF_ARG($fp)
+
+	# Is it bigger than 8 * FFI_SIZEOF_ARG?
+	daddiu	t8, t6, -(8 * FFI_SIZEOF_ARG)
+	bltz	t8, loadregs
+
+	ADDU	t9, t9, t8
+	
+loadregs:	
+
+	REG_L	t6, 3*FFI_SIZEOF_ARG($fp)  # load the flags word into t6.
+
+	and	t4, t6, ((1<<FFI_FLAG_BITS)-1)
+	bnez	t4, arg1_floatp
+	REG_L	a0, 0*FFI_SIZEOF_ARG(t9)
+	b	arg1_next
+arg1_floatp:	
+	bne	t4, FFI_TYPE_FLOAT, arg1_doublep
+	l.s	$f12, 0*FFI_SIZEOF_ARG(t9)
+	b	arg1_next
+arg1_doublep:	
+	l.d	$f12, 0*FFI_SIZEOF_ARG(t9)
+arg1_next:	
+	
+	SRL	t4, t6, 1*FFI_FLAG_BITS
+	and	t4, ((1<<FFI_FLAG_BITS)-1)
+	bnez	t4, arg2_floatp
+	REG_L	a1, 1*FFI_SIZEOF_ARG(t9)
+	b	arg2_next
+arg2_floatp:
+	bne	t4, FFI_TYPE_FLOAT, arg2_doublep
+	l.s	$f13, 1*FFI_SIZEOF_ARG(t9)	
+	b	arg2_next
+arg2_doublep:	
+	l.d	$f13, 1*FFI_SIZEOF_ARG(t9)	
+arg2_next:	
+	
+	SRL	t4, t6, 2*FFI_FLAG_BITS
+	and	t4, ((1<<FFI_FLAG_BITS)-1)
+	bnez	t4, arg3_floatp
+	REG_L	a2, 2*FFI_SIZEOF_ARG(t9)
+	b	arg3_next
+arg3_floatp:
+	bne	t4, FFI_TYPE_FLOAT, arg3_doublep
+	l.s	$f14, 2*FFI_SIZEOF_ARG(t9)	
+	b	arg3_next
+arg3_doublep:	
+	l.d	$f14, 2*FFI_SIZEOF_ARG(t9)	
+arg3_next:	
+	
+	SRL	t4, t6, 3*FFI_FLAG_BITS
+	and	t4, ((1<<FFI_FLAG_BITS)-1)
+	bnez	t4, arg4_floatp
+	REG_L	a3, 3*FFI_SIZEOF_ARG(t9)
+	b	arg4_next
+arg4_floatp:
+	bne	t4, FFI_TYPE_FLOAT, arg4_doublep
+	l.s	$f15, 3*FFI_SIZEOF_ARG(t9)	
+	b	arg4_next
+arg4_doublep:	
+	l.d	$f15, 3*FFI_SIZEOF_ARG(t9)	
+arg4_next:	
+	
+	SRL	t4, t6, 4*FFI_FLAG_BITS
+	and	t4, ((1<<FFI_FLAG_BITS)-1)
+	bnez	t4, arg5_floatp
+	REG_L	a4, 4*FFI_SIZEOF_ARG(t9)
+	b	arg5_next
+arg5_floatp:
+	bne	t4, FFI_TYPE_FLOAT, arg5_doublep
+	l.s	$f16, 4*FFI_SIZEOF_ARG(t9)	
+	b	arg5_next
+arg5_doublep:	
+	l.d	$f16, 4*FFI_SIZEOF_ARG(t9)	
+arg5_next:	
+	
+	SRL	t4, t6, 5*FFI_FLAG_BITS
+	and	t4, ((1<<FFI_FLAG_BITS)-1)
+	bnez	t4, arg6_floatp
+	REG_L	a5, 5*FFI_SIZEOF_ARG(t9)
+	b	arg6_next
+arg6_floatp:
+	bne	t4, FFI_TYPE_FLOAT, arg6_doublep
+	l.s	$f17, 5*FFI_SIZEOF_ARG(t9)	
+	b	arg6_next
+arg6_doublep:	
+	l.d	$f17, 5*FFI_SIZEOF_ARG(t9)	
+arg6_next:	
+	
+	SRL	t4, t6, 6*FFI_FLAG_BITS
+	and	t4, ((1<<FFI_FLAG_BITS)-1)
+	bnez	t4, arg7_floatp
+	REG_L	a6, 6*FFI_SIZEOF_ARG(t9)
+	b	arg7_next
+arg7_floatp:
+	bne	t4, FFI_TYPE_FLOAT, arg7_doublep
+	l.s	$f18, 6*FFI_SIZEOF_ARG(t9)	
+	b	arg7_next
+arg7_doublep:	
+	l.d	$f18, 6*FFI_SIZEOF_ARG(t9)	
+arg7_next:	
+	
+	SRL	t4, t6, 7*FFI_FLAG_BITS
+	and	t4, ((1<<FFI_FLAG_BITS)-1)
+	bnez	t4, arg8_floatp
+	REG_L	a7, 7*FFI_SIZEOF_ARG(t9)
+	b	arg8_next
+arg8_floatp:
+	bne	t4, FFI_TYPE_FLOAT, arg8_doublep
+ 	l.s	$f19, 7*FFI_SIZEOF_ARG(t9)	
+	b	arg8_next
+arg8_doublep:	
+ 	l.d	$f19, 7*FFI_SIZEOF_ARG(t9)	
+arg8_next:	
+
+callit:		
+	# Load the function pointer
+	REG_L	t9, 5*FFI_SIZEOF_ARG($fp)
+
+	# If the return value pointer is NULL, assume no return value.
+	REG_L	t5, 4*FFI_SIZEOF_ARG($fp)
+	beqz	t5, noretval
+
+	# Shift the return type flag over
+	SRL	t6, 8*FFI_FLAG_BITS
+
+	beq	t6, FFI_TYPE_SINT32, retint	
+	bne     t6, FFI_TYPE_INT, retfloat
+retint:
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	REG_S	v0, 0(t4)
+	b	epilogue
+
+retfloat:
+	bne     t6, FFI_TYPE_FLOAT, retdouble
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	s.s	$f0, 0(t4)
+	b	epilogue
+
+retdouble:	
+	bne	t6, FFI_TYPE_DOUBLE, retstruct_d
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	s.d	$f0, 0(t4)
+	b	epilogue
+
+retstruct_d:	
+	bne	t6, FFI_TYPE_STRUCT_D, retstruct_f
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	s.d	$f0, 0(t4)
+	b	epilogue
+	
+retstruct_f:	
+	bne	t6, FFI_TYPE_STRUCT_F, retstruct_d_d
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	s.s	$f0, 0(t4)
+	b	epilogue
+	
+retstruct_d_d:	
+	bne	t6, FFI_TYPE_STRUCT_DD, retstruct_f_f
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	s.d	$f0, 0(t4)
+	s.d	$f2, 8(t4)
+	b	epilogue
+	
+retstruct_f_f:	
+	bne	t6, FFI_TYPE_STRUCT_FF, retstruct_d_f
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	s.s	$f0, 0(t4)
+	s.s	$f2, 4(t4)
+	b	epilogue
+	
+retstruct_d_f:	
+	bne	t6, FFI_TYPE_STRUCT_DF, retstruct_f_d
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	s.d	$f0, 0(t4)
+	s.s	$f2, 8(t4)
+	b	epilogue
+	
+retstruct_f_d:	
+	bne	t6, FFI_TYPE_STRUCT_FD, retstruct_d_soft
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	s.s	$f0, 0(t4)
+	s.d	$f2, 8(t4)
+	b	epilogue
+
+retstruct_d_soft:
+	bne	t6, FFI_TYPE_STRUCT_D_SOFT, retstruct_f_soft
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	sd	v0, 0(t4)
+	b	epilogue
+	
+retstruct_f_soft:	
+	bne	t6, FFI_TYPE_STRUCT_F_SOFT, retstruct_d_d_soft
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	sw	v0, 0(t4)
+	b	epilogue
+	
+retstruct_d_d_soft:	
+	bne	t6, FFI_TYPE_STRUCT_DD_SOFT, retstruct_f_f_soft
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	sd	v0, 0(t4)
+	sd	v1, 8(t4)
+	b	epilogue
+	
+retstruct_f_f_soft:	
+	bne	t6, FFI_TYPE_STRUCT_FF_SOFT, retstruct_d_f_soft
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	sw	v0, 0(t4)
+	sw	v1, 4(t4)
+	b	epilogue
+	
+retstruct_d_f_soft:	
+	bne	t6, FFI_TYPE_STRUCT_DF_SOFT, retstruct_f_d_soft
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	sd	v0, 0(t4)
+	sw	v1, 8(t4)
+	b	epilogue
+	
+retstruct_f_d_soft:	
+	bne	t6, FFI_TYPE_STRUCT_FD_SOFT, retstruct_small
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	sw	v0, 0(t4)
+	sd	v1, 8(t4)
+	b	epilogue
+	
+retstruct_small:	
+	bne	t6, FFI_TYPE_STRUCT_SMALL, retstruct_small2
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	REG_S	v0, 0(t4)
+	b	epilogue
+	
+retstruct_small2:	
+	bne	t6, FFI_TYPE_STRUCT_SMALL2, retstruct
+	jal	t9
+	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+	REG_S	v0, 0(t4)
+	REG_S	v1, 8(t4)
+	b	epilogue
+	
+retstruct:	
+noretval:	
+	jal	t9
+	
+	# Epilogue
+epilogue:	
+	move	$sp, $fp	
+	REG_L	$fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Restore frame pointer
+	REG_L	ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp)  # Restore return address
+	ADDU	$sp, SIZEOF_FRAME		      # Fix stack pointer
+	j	ra
+
+.LFE3:
+	.end	ffi_call_N32
+
+/* ffi_closure_N32. Expects address of the passed-in ffi_closure in t0
+   ($12). Stores any arguments passed in registers onto the stack,
+   then calls ffi_closure_mips_inner_N32, which then decodes
+   them.
+	
+	Stack layout:
+
+	20 - Start of parameters, original sp
+	19 - Called function a7 save
+	18 - Called function a6 save
+	17 - Called function a5 save
+	16 - Called function a4 save
+	15 - Called function a3 save
+	14 - Called function a2 save
+	13 - Called function a1 save
+	12 - Called function a0 save
+	11 - Called function f19
+	10 - Called function f18
+	 9 - Called function f17
+	 8 - Called function f16
+	 7 - Called function f15
+         6 - Called function f14
+         5 - Called function f13
+         4 - Called function f12
+	 3 - return value high (v1 or $f2)
+	 2 - return value low (v0 or $f0)
+	 1 - ra save
+	 0 - gp save our sp  points here
+	 */
+
+#define SIZEOF_FRAME2	(20 * FFI_SIZEOF_ARG)
+	
+#define A7_OFF2		(19 * FFI_SIZEOF_ARG)
+#define A6_OFF2		(18 * FFI_SIZEOF_ARG)
+#define A5_OFF2		(17 * FFI_SIZEOF_ARG)
+#define A4_OFF2		(16 * FFI_SIZEOF_ARG)
+#define A3_OFF2		(15 * FFI_SIZEOF_ARG)
+#define A2_OFF2		(14 * FFI_SIZEOF_ARG)
+#define A1_OFF2		(13 * FFI_SIZEOF_ARG)
+#define A0_OFF2		(12 * FFI_SIZEOF_ARG)	
+
+#define F19_OFF2	(11 * FFI_SIZEOF_ARG)
+#define F18_OFF2	(10 * FFI_SIZEOF_ARG)
+#define F17_OFF2	(9  * FFI_SIZEOF_ARG)
+#define F16_OFF2	(8  * FFI_SIZEOF_ARG)
+#define F15_OFF2	(7  * FFI_SIZEOF_ARG)
+#define F14_OFF2	(6  * FFI_SIZEOF_ARG)
+#define F13_OFF2	(5  * FFI_SIZEOF_ARG)
+#define F12_OFF2	(4  * FFI_SIZEOF_ARG)
+
+#define V1_OFF2		(3  * FFI_SIZEOF_ARG)
+#define V0_OFF2		(2  * FFI_SIZEOF_ARG)
+
+#define RA_OFF2		(1  * FFI_SIZEOF_ARG)
+#define GP_OFF2		(0  * FFI_SIZEOF_ARG)
+
+	.align	2
+	.globl	ffi_closure_N32
+	.ent	ffi_closure_N32
+ffi_closure_N32:
+.LFB2:
+	.frame	$sp, SIZEOF_FRAME2, ra
+	.mask	0x90000000,-(SIZEOF_FRAME2 - RA_OFF2)
+	.fmask	0x00000000,0
+	SUBU	$sp, SIZEOF_FRAME2
+.LCFI5:
+	.cpsetup t9, GP_OFF2, ffi_closure_N32
+	REG_S	ra, RA_OFF2($sp)	# Save return address
+.LCFI6:
+	# Store all possible argument registers. If there are more than
+	# fit in registers, then they were stored on the stack.
+	REG_S	a0, A0_OFF2($sp)
+	REG_S	a1, A1_OFF2($sp)
+	REG_S	a2, A2_OFF2($sp)
+	REG_S	a3, A3_OFF2($sp)
+	REG_S	a4, A4_OFF2($sp)
+	REG_S	a5, A5_OFF2($sp)
+	REG_S	a6, A6_OFF2($sp)
+	REG_S	a7, A7_OFF2($sp)
+
+	# Store all possible float/double registers.
+	s.d	$f12, F12_OFF2($sp)
+	s.d	$f13, F13_OFF2($sp)
+	s.d	$f14, F14_OFF2($sp)
+	s.d	$f15, F15_OFF2($sp)
+	s.d	$f16, F16_OFF2($sp)
+	s.d	$f17, F17_OFF2($sp)
+	s.d	$f18, F18_OFF2($sp)
+	s.d	$f19, F19_OFF2($sp)
+
+	# Call ffi_closure_mips_inner_N32 to do the real work.
+	LA	t9, ffi_closure_mips_inner_N32
+	move	a0, $12	 # Pointer to the ffi_closure
+	ADDU	a1, $sp, V0_OFF2
+	ADDU	a2, $sp, A0_OFF2
+	ADDU	a3, $sp, F12_OFF2
+	jalr	t9
+
+	# Return flags are in v0
+	bne     v0, FFI_TYPE_SINT32, cls_retint
+	lw	v0, V0_OFF2($sp)
+	b	cls_epilogue
+
+cls_retint:
+	bne     v0, FFI_TYPE_INT, cls_retfloat
+	REG_L	v0, V0_OFF2($sp)
+	b	cls_epilogue
+
+cls_retfloat:
+	bne     v0, FFI_TYPE_FLOAT, cls_retdouble
+	l.s	$f0, V0_OFF2($sp)
+	b	cls_epilogue
+
+cls_retdouble:	
+	bne	v0, FFI_TYPE_DOUBLE, cls_retstruct_d
+	l.d	$f0, V0_OFF2($sp)
+	b	cls_epilogue
+
+cls_retstruct_d:	
+	bne	v0, FFI_TYPE_STRUCT_D, cls_retstruct_f
+	l.d	$f0, V0_OFF2($sp)
+	b	cls_epilogue
+	
+cls_retstruct_f:	
+	bne	v0, FFI_TYPE_STRUCT_F, cls_retstruct_d_d
+	l.s	$f0, V0_OFF2($sp)
+	b	cls_epilogue
+	
+cls_retstruct_d_d:	
+	bne	v0, FFI_TYPE_STRUCT_DD, cls_retstruct_f_f
+	l.d	$f0, V0_OFF2($sp)
+	l.d	$f2, V1_OFF2($sp)
+	b	cls_epilogue
+	
+cls_retstruct_f_f:	
+	bne	v0, FFI_TYPE_STRUCT_FF, cls_retstruct_d_f
+	l.s	$f0, V0_OFF2($sp)
+	l.s	$f2, V1_OFF2($sp)
+	b	cls_epilogue
+	
+cls_retstruct_d_f:	
+	bne	v0, FFI_TYPE_STRUCT_DF, cls_retstruct_f_d
+	l.d	$f0, V0_OFF2($sp)
+	l.s	$f2, V1_OFF2($sp)
+	b	cls_epilogue
+	
+cls_retstruct_f_d:	
+	bne	v0, FFI_TYPE_STRUCT_FD, cls_retstruct_small2
+	l.s	$f0, V0_OFF2($sp)
+	l.d	$f2, V1_OFF2($sp)
+	b	cls_epilogue
+	
+cls_retstruct_small2:	
+	REG_L	v0, V0_OFF2($sp)
+	REG_L	v1, V1_OFF2($sp)
+	
+	# Epilogue
+cls_epilogue:	
+	REG_L	ra,  RA_OFF2($sp)	 # Restore return address
+	.cpreturn
+	ADDU	$sp, SIZEOF_FRAME2
+	j	ra
+.LFE2:	
+	.end	ffi_closure_N32
+
+#ifdef __GNUC__
+        .section        .eh_frame,"aw",@progbits
+.Lframe1:
+        .4byte  .LECIE1-.LSCIE1		# length
+.LSCIE1:
+        .4byte  0x0			# CIE
+        .byte   0x1			# Version 1
+        .ascii  "\000"			# Augmentation
+        .uleb128 0x1			# Code alignment 1
+        .sleb128 -4			# Data alignment -4
+        .byte   0x1f			# Return Address $31
+        .byte   0xc			# DW_CFA_def_cfa
+        .uleb128 0x1d			# in $sp
+        .uleb128 0x0			# offset 0
+        .align  EH_FRAME_ALIGN
+.LECIE1:
+
+.LSFDE1:
+        .4byte  .LEFDE1-.LASFDE1	# length.
+.LASFDE1:
+        .4byte  .LASFDE1-.Lframe1	# CIE_pointer.
+        FDE_ADDR_BYTES  .LFB3		# initial_location.
+        FDE_ADDR_BYTES  .LFE3-.LFB3	# address_range.
+        .byte   0x4			# DW_CFA_advance_loc4
+        .4byte  .LCFI0-.LFB3		# to .LCFI0
+        .byte   0xe			# DW_CFA_def_cfa_offset
+        .uleb128 SIZEOF_FRAME		# adjust stack.by SIZEOF_FRAME
+        .byte   0x4			# DW_CFA_advance_loc4
+        .4byte  .LCFI1-.LCFI0		# to .LCFI1
+        .byte   0x9e			# DW_CFA_offset of $fp
+        .uleb128 2*FFI_SIZEOF_ARG/4	# 
+        .byte   0x9f			# DW_CFA_offset of ra
+        .uleb128 1*FFI_SIZEOF_ARG/4	# 
+        .byte   0x4			# DW_CFA_advance_loc4
+        .4byte  .LCFI3-.LCFI1		# to .LCFI3
+        .byte   0xd			# DW_CFA_def_cfa_register
+        .uleb128 0x1e			# in $fp
+        .align  EH_FRAME_ALIGN
+.LEFDE1:
+.LSFDE3:
+	.4byte	.LEFDE3-.LASFDE3	# length
+.LASFDE3:
+	.4byte	.LASFDE3-.Lframe1	# CIE_pointer.
+	FDE_ADDR_BYTES	.LFB2		# initial_location.
+	FDE_ADDR_BYTES	.LFE2-.LFB2	# address_range.
+	.byte	0x4			# DW_CFA_advance_loc4
+	.4byte	.LCFI5-.LFB2		# to .LCFI5
+	.byte	0xe			# DW_CFA_def_cfa_offset
+	.uleb128 SIZEOF_FRAME2		# adjust stack.by SIZEOF_FRAME
+	.byte	0x4			# DW_CFA_advance_loc4
+	.4byte	.LCFI6-.LCFI5		# to .LCFI6
+	.byte	0x9c			# DW_CFA_offset of $gp ($28)
+	.uleb128 (SIZEOF_FRAME2 - GP_OFF2)/4
+	.byte	0x9f			# DW_CFA_offset of ra ($31)
+	.uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4
+	.align	EH_FRAME_ALIGN
+.LEFDE3:
+#endif /* __GNUC__ */	
+	
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/o32.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/o32.S
new file mode 100644
index 0000000..eb27981
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/mips/o32.S
@@ -0,0 +1,381 @@
+/* -----------------------------------------------------------------------
+   o32.S - Copyright (c) 1996, 1998, 2005  Red Hat, Inc.
+   
+   MIPS Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+/* Only build this code if we are compiling for o32 */	
+
+#if defined(FFI_MIPS_O32)
+	
+#define callback a0
+#define bytes	 a2
+#define flags	 a3
+		
+#define SIZEOF_FRAME	(4 * FFI_SIZEOF_ARG + 2 * FFI_SIZEOF_ARG)
+#define A3_OFF		(SIZEOF_FRAME + 3 * FFI_SIZEOF_ARG)
+#define FP_OFF		(SIZEOF_FRAME - 2 * FFI_SIZEOF_ARG)
+#define RA_OFF		(SIZEOF_FRAME - 1 * FFI_SIZEOF_ARG)
+
+	.abicalls
+	.text
+	.align	2
+	.globl	ffi_call_O32
+	.ent	ffi_call_O32
+ffi_call_O32:	
+$LFB0:
+	# Prologue
+	SUBU	$sp, SIZEOF_FRAME	# Frame size
+$LCFI0:
+	REG_S	$fp, FP_OFF($sp)	# Save frame pointer
+$LCFI1:
+	REG_S	ra, RA_OFF($sp)		# Save return address
+$LCFI2:
+	move	$fp, $sp
+
+$LCFI3:
+	move	t9, callback		# callback function pointer
+	REG_S	flags, A3_OFF($fp)	# flags
+
+	# Allocate at least 4 words in the argstack
+	LI	v0, 4 * FFI_SIZEOF_ARG
+	blt	bytes, v0, sixteen
+
+	ADDU	v0, bytes, 7	# make sure it is aligned 
+	and	v0, -8		# to an 8 byte boundry
+
+sixteen:
+	SUBU	$sp, v0		# move the stack pointer to reflect the
+				# arg space
+
+	ADDU	a0, $sp, 4 * FFI_SIZEOF_ARG
+
+	jalr	t9
+	
+	REG_L	t0, A3_OFF($fp)		# load the flags word
+	SRL	t2, t0, 4		# shift our arg info
+	and     t0, ((1<<4)-1)          # mask out the return type
+		
+	ADDU	$sp, 4 * FFI_SIZEOF_ARG		# adjust $sp to new args
+
+	bnez	t0, pass_d			# make it quick for int
+	REG_L	a0, 0*FFI_SIZEOF_ARG($sp)	# just go ahead and load the
+	REG_L	a1, 1*FFI_SIZEOF_ARG($sp)	# four regs.
+	REG_L	a2, 2*FFI_SIZEOF_ARG($sp)
+	REG_L	a3, 3*FFI_SIZEOF_ARG($sp)
+	b	call_it
+
+pass_d:
+	bne	t0, FFI_ARGS_D, pass_f
+	l.d	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
+	REG_L	a2,   2*FFI_SIZEOF_ARG($sp)	# passing a double
+	REG_L	a3,   3*FFI_SIZEOF_ARG($sp)
+	b	call_it
+
+pass_f:	
+	bne	t0, FFI_ARGS_F, pass_d_d
+	l.s	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
+	REG_L	a1,   1*FFI_SIZEOF_ARG($sp)	# passing a float
+	REG_L	a2,   2*FFI_SIZEOF_ARG($sp)
+	REG_L	a3,   3*FFI_SIZEOF_ARG($sp)
+	b	call_it		
+
+pass_d_d:		
+	bne	t0, FFI_ARGS_DD, pass_f_f
+	l.d	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
+	l.d	$f14, 2*FFI_SIZEOF_ARG($sp)	# passing two doubles
+	b	call_it
+
+pass_f_f:	
+	bne	t0, FFI_ARGS_FF, pass_d_f
+	l.s	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
+	l.s	$f14, 1*FFI_SIZEOF_ARG($sp)	# passing two floats
+	REG_L	a2,   2*FFI_SIZEOF_ARG($sp)
+	REG_L	a3,   3*FFI_SIZEOF_ARG($sp)
+	b	call_it
+
+pass_d_f:		
+	bne	t0, FFI_ARGS_DF, pass_f_d
+	l.d	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
+	l.s	$f14, 2*FFI_SIZEOF_ARG($sp)	# passing double and float
+	REG_L	a3,   3*FFI_SIZEOF_ARG($sp)
+	b	call_it
+
+pass_f_d:		
+ # assume that the only other combination must be float then double
+ #	bne	t0, FFI_ARGS_F_D, call_it
+	l.s	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
+	l.d	$f14, 2*FFI_SIZEOF_ARG($sp)	# passing double and float
+
+call_it:	
+	# Load the function pointer
+	REG_L	t9, SIZEOF_FRAME + 5*FFI_SIZEOF_ARG($fp)
+
+	# If the return value pointer is NULL, assume no return value.
+	REG_L	t1, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
+	beqz	t1, noretval
+
+	bne     t2, FFI_TYPE_INT, retlonglong
+	jalr	t9
+	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
+	REG_S	v0, 0(t0)
+	b	epilogue
+
+retlonglong:
+	# Really any 64-bit int, signed or not.
+	bne	t2, FFI_TYPE_UINT64, retfloat
+	jalr	t9
+	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
+	REG_S	v1, 4(t0)
+	REG_S	v0, 0(t0)
+	b	epilogue
+
+retfloat:
+	bne     t2, FFI_TYPE_FLOAT, retdouble
+	jalr	t9
+	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
+	s.s	$f0, 0(t0)
+	b	epilogue
+
+retdouble:	
+	bne	t2, FFI_TYPE_DOUBLE, noretval
+	jalr	t9
+	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
+	s.d	$f0, 0(t0)
+	b	epilogue
+	
+noretval:	
+	jalr	t9
+	
+	# Epilogue
+epilogue:	
+	move	$sp, $fp	
+	REG_L	$fp, FP_OFF($sp)	# Restore frame pointer
+	REG_L	ra, RA_OFF($sp)		# Restore return address
+	ADDU	$sp, SIZEOF_FRAME	# Fix stack pointer
+	j	ra
+
+$LFE0:
+	.end	ffi_call_O32
+
+
+/* ffi_closure_O32. Expects address of the passed-in ffi_closure
+	in t4 ($12). Stores any arguments passed in registers onto the
+	stack, then calls ffi_closure_mips_inner_O32, which
+	then decodes them.
+	
+	Stack layout:
+
+	 3 - a3 save
+	 2 - a2 save
+	 1 - a1 save
+	 0 - a0 save, original sp
+	-1 - ra save
+	-2 - fp save
+	-3 - $16 (s0) save
+	-4 - cprestore
+	-5 - return value high (v1)
+	-6 - return value low (v0)
+	-7 - f14 (le high, be low)
+	-8 - f14 (le low, be high)
+	-9 - f12 (le high, be low)
+       -10 - f12 (le low, be high)
+       -11 - Called function a3 save
+       -12 - Called function a2 save
+       -13 - Called function a1 save
+       -14 - Called function a0 save, our sp and fp point here
+	 */
+	
+#define SIZEOF_FRAME2	(14 * FFI_SIZEOF_ARG)
+#define A3_OFF2		(SIZEOF_FRAME2 + 3 * FFI_SIZEOF_ARG)
+#define A2_OFF2		(SIZEOF_FRAME2 + 2 * FFI_SIZEOF_ARG)
+#define A1_OFF2		(SIZEOF_FRAME2 + 1 * FFI_SIZEOF_ARG)
+#define A0_OFF2		(SIZEOF_FRAME2 + 0 * FFI_SIZEOF_ARG)
+#define RA_OFF2		(SIZEOF_FRAME2 - 1 * FFI_SIZEOF_ARG)
+#define FP_OFF2		(SIZEOF_FRAME2 - 2 * FFI_SIZEOF_ARG)
+#define S0_OFF2		(SIZEOF_FRAME2 - 3 * FFI_SIZEOF_ARG)
+#define GP_OFF2		(SIZEOF_FRAME2 - 4 * FFI_SIZEOF_ARG)
+#define V1_OFF2		(SIZEOF_FRAME2 - 5 * FFI_SIZEOF_ARG)
+#define V0_OFF2		(SIZEOF_FRAME2 - 6 * FFI_SIZEOF_ARG)
+#define FA_1_1_OFF2	(SIZEOF_FRAME2 - 7 * FFI_SIZEOF_ARG)
+#define FA_1_0_OFF2	(SIZEOF_FRAME2 - 8 * FFI_SIZEOF_ARG)
+#define FA_0_1_OFF2	(SIZEOF_FRAME2 - 9 * FFI_SIZEOF_ARG)
+#define FA_0_0_OFF2	(SIZEOF_FRAME2 - 10 * FFI_SIZEOF_ARG)
+
+	.text
+	.align	2
+	.globl	ffi_closure_O32
+	.ent	ffi_closure_O32
+ffi_closure_O32:
+$LFB1:
+	# Prologue
+	.frame	$fp, SIZEOF_FRAME2, ra
+	.set	noreorder
+	.cpload	t9
+	.set	reorder
+	SUBU	$sp, SIZEOF_FRAME2
+	.cprestore GP_OFF2
+$LCFI4:
+	REG_S	$16, S0_OFF2($sp)	 # Save s0
+	REG_S	$fp, FP_OFF2($sp)	 # Save frame pointer
+	REG_S	ra, RA_OFF2($sp)	 # Save return address
+$LCFI6:
+	move	$fp, $sp
+
+$LCFI7:
+	# Store all possible argument registers. If there are more than
+	# four arguments, then they are stored above where we put a3.
+	REG_S	a0, A0_OFF2($fp)
+	REG_S	a1, A1_OFF2($fp)
+	REG_S	a2, A2_OFF2($fp)
+	REG_S	a3, A3_OFF2($fp)
+
+	# Load ABI enum to s0
+	REG_L	$16, 20($12)	# cif pointer follows tramp.
+	REG_L	$16, 0($16)	# abi is first member.
+
+	li	$13, 1		# FFI_O32
+	bne	$16, $13, 1f	# Skip fp save if FFI_O32_SOFT_FLOAT
+	
+	# Store all possible float/double registers.
+	s.d	$f12, FA_0_0_OFF2($fp)
+	s.d	$f14, FA_1_0_OFF2($fp)
+1:	
+	# Call ffi_closure_mips_inner_O32 to do the work.
+	la	t9, ffi_closure_mips_inner_O32
+	move	a0, $12	 # Pointer to the ffi_closure
+	addu	a1, $fp, V0_OFF2
+	addu	a2, $fp, A0_OFF2
+	addu	a3, $fp, FA_0_0_OFF2
+	jalr	t9
+
+	# Load the return value into the appropriate register.
+	move	$8, $2
+	li	$9, FFI_TYPE_VOID
+	beq	$8, $9, closure_done
+
+	li	$13, 1		# FFI_O32
+	bne	$16, $13, 1f	# Skip fp restore if FFI_O32_SOFT_FLOAT
+
+	li	$9, FFI_TYPE_FLOAT
+	l.s	$f0, V0_OFF2($fp)
+	beq	$8, $9, closure_done
+
+	li	$9, FFI_TYPE_DOUBLE
+	l.d	$f0, V0_OFF2($fp)
+	beq	$8, $9, closure_done
+1:	
+	REG_L	$3, V1_OFF2($fp)
+	REG_L	$2, V0_OFF2($fp)
+
+closure_done:
+	# Epilogue
+	move	$sp, $fp
+	REG_L	$16, S0_OFF2($sp)	 # Restore s0
+	REG_L	$fp, FP_OFF2($sp)	 # Restore frame pointer
+	REG_L	ra,  RA_OFF2($sp)	 # Restore return address
+	ADDU	$sp, SIZEOF_FRAME2
+	j	ra
+$LFE1:
+	.end	ffi_closure_O32
+
+/* DWARF-2 unwind info. */
+
+	.section	.eh_frame,"a",@progbits
+$Lframe0:
+	.4byte	$LECIE0-$LSCIE0	 # Length of Common Information Entry
+$LSCIE0:
+	.4byte	0x0	 # CIE Identifier Tag
+	.byte	0x1	 # CIE Version
+	.ascii "zR\0"	 # CIE Augmentation
+	.uleb128 0x1	 # CIE Code Alignment Factor
+	.sleb128 4	 # CIE Data Alignment Factor
+	.byte	0x1f	 # CIE RA Column
+	.uleb128 0x1	 # Augmentation size
+	.byte	0x00	 # FDE Encoding (absptr)
+	.byte	0xc	 # DW_CFA_def_cfa
+	.uleb128 0x1d
+	.uleb128 0x0
+	.align	2
+$LECIE0:
+$LSFDE0:
+	.4byte	$LEFDE0-$LASFDE0	 # FDE Length
+$LASFDE0:
+	.4byte	$LASFDE0-$Lframe0	 # FDE CIE offset
+	.4byte	$LFB0	 # FDE initial location
+	.4byte	$LFE0-$LFB0	 # FDE address range
+	.uleb128 0x0	 # Augmentation size
+	.byte	0x4	 # DW_CFA_advance_loc4
+	.4byte	$LCFI0-$LFB0
+	.byte	0xe	 # DW_CFA_def_cfa_offset
+	.uleb128 0x18
+	.byte	0x4	 # DW_CFA_advance_loc4
+	.4byte	$LCFI2-$LCFI0
+	.byte	0x11	 # DW_CFA_offset_extended_sf
+	.uleb128 0x1e	 # $fp
+	.sleb128 -2	 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp)
+	.byte	0x11	 # DW_CFA_offset_extended_sf
+	.uleb128 0x1f	 # $ra
+	.sleb128 -1	 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp)
+	.byte	0x4	 # DW_CFA_advance_loc4
+	.4byte	$LCFI3-$LCFI2
+	.byte	0xc	 # DW_CFA_def_cfa
+	.uleb128 0x1e
+	.uleb128 0x18
+	.align	2
+$LEFDE0:
+$LSFDE1:
+	.4byte	$LEFDE1-$LASFDE1	 # FDE Length
+$LASFDE1:
+	.4byte	$LASFDE1-$Lframe0	 # FDE CIE offset
+	.4byte	$LFB1	 # FDE initial location
+	.4byte	$LFE1-$LFB1	 # FDE address range
+	.uleb128 0x0	 # Augmentation size
+	.byte	0x4	 # DW_CFA_advance_loc4
+	.4byte	$LCFI4-$LFB1
+	.byte	0xe	 # DW_CFA_def_cfa_offset
+	.uleb128 0x38
+	.byte	0x4	 # DW_CFA_advance_loc4
+	.4byte	$LCFI6-$LCFI4
+	.byte	0x11	 # DW_CFA_offset_extended_sf
+	.uleb128 0x10	 # $16
+	.sleb128 -3	 # SIZEOF_FRAME2 - 3*FFI_SIZEOF_ARG($sp)
+	.byte	0x11	 # DW_CFA_offset_extended_sf
+	.uleb128 0x1e	 # $fp
+	.sleb128 -2	 # SIZEOF_FRAME2 - 2*FFI_SIZEOF_ARG($sp)
+	.byte	0x11	 # DW_CFA_offset_extended_sf
+	.uleb128 0x1f	 # $ra
+	.sleb128 -1	 # SIZEOF_FRAME2 - 1*FFI_SIZEOF_ARG($sp)
+	.byte	0x4	 # DW_CFA_advance_loc4
+	.4byte	$LCFI7-$LCFI6
+	.byte	0xc	 # DW_CFA_def_cfa
+	.uleb128 0x1e
+	.uleb128 0x38
+	.align	2
+$LEFDE1:
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/eabi.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/eabi.S
new file mode 100644
index 0000000..379ea4b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/eabi.S
@@ -0,0 +1,128 @@
+/* -----------------------------------------------------------------------
+   eabi.S - Copyright (c) 2004  Anthony Green
+   
+   FR-V Assembly glue.
+
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+	.globl ffi_prep_args_EABI
+
+	.text
+	.p2align 4
+	.globl ffi_call_EABI
+	.type ffi_call_EABI, @function
+
+	# gr8 :   ffi_prep_args
+	# gr9 :   &ecif
+	# gr10:   cif->bytes
+	# gr11:   fig->flags
+	# gr12:   ecif.rvalue
+	# gr13:   fn
+	
+ffi_call_EABI:	
+	addi	sp, #-80, sp
+	sti	fp, @(sp, #24)
+	addi	sp, #24, fp
+	movsg	lr, gr5
+
+	/* Make room for the new arguments.  */
+	/* subi	sp, fp, gr10 */
+	
+	/* Store return address and incoming args on stack.  */
+	sti	gr5, @(fp, #8)
+	sti	gr8, @(fp, #-4)
+	sti	gr9, @(fp, #-8)
+	sti	gr10, @(fp, #-12)
+	sti	gr11, @(fp, #-16)
+	sti	gr12, @(fp, #-20)
+	sti	gr13, @(fp, #-24)
+
+	sub     sp, gr10, sp
+	
+	/* Call ffi_prep_args.  */
+	ldi	@(fp, #-4), gr4
+	addi	sp, #0, gr8
+	ldi	@(fp, #-8), gr9
+#ifdef __FRV_FDPIC__
+	ldd	@(gr4, gr0), gr14
+	calll	@(gr14, gr0)
+#else
+	calll	@(gr4, gr0)
+#endif	
+
+	/* ffi_prep_args returns the new stack pointer.  */
+	mov	gr8, gr4
+		
+	ldi	@(sp, #0), gr8
+	ldi	@(sp, #4), gr9
+	ldi	@(sp, #8), gr10
+	ldi	@(sp, #12), gr11
+	ldi	@(sp, #16), gr12
+	ldi	@(sp, #20), gr13
+
+	/* Always copy the return value pointer into the hidden
+	   parameter register.  This is only strictly necessary
+	   when we're returning an aggregate type, but it doesn't
+	   hurt to do this all the time, and it saves a branch.  */
+	ldi	@(fp, #-20), gr3
+
+	/* Use the ffi_prep_args return value for the new sp.  */
+	mov	gr4, sp
+	
+	/* Call the target function.  */
+	ldi	@(fp, -24), gr4
+#ifdef __FRV_FDPIC__
+	ldd	@(gr4, gr0), gr14
+	calll	@(gr14, gr0)
+#else
+	calll	@(gr4, gr0)
+#endif	
+
+	/* Store the result. */
+	ldi	@(fp, #-16), gr10  /* fig->flags */
+	ldi	@(fp, #-20), gr4   /* ecif.rvalue */
+
+	/* Is the return value stored in two registers?  */
+	cmpi	gr10, #8, icc0
+	bne	icc0, 0, .L2
+	/*   Yes, save them.  */
+	sti	gr8, @(gr4, #0)
+	sti	gr9, @(gr4, #4)
+	bra	.L3
+.L2:
+	/* Is the return value a structure?  */
+	cmpi	gr10, #-1, icc0
+	beq	icc0, 0, .L3
+	/*   No, save a 4 byte return value.  */
+	sti	gr8, @(gr4, #0)
+.L3:	
+
+	/* Restore the stack, and return.  */
+	ldi	@(fp, 8), gr5
+	ld	@(fp, gr0), fp
+	addi	sp,#80,sp
+	jmpl	@(gr5,gr0)
+	.size ffi_call_EABI, .-ffi_call_EABI
+	
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/ffi.c
new file mode 100644
index 0000000..54cbbb9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/moxie/ffi.c
@@ -0,0 +1,276 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (C) 2009  Anthony Green
+   
+   Moxie Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+
+/* ffi_prep_args is called by the assembly routine once stack space
+   has been allocated for the function's arguments */
+
+void *ffi_prep_args(char *stack, extended_cif *ecif)
+{
+  register unsigned int i;
+  register void **p_argv;
+  register char *argp;
+  register ffi_type **p_arg;
+  register int count = 0;
+
+  p_argv = ecif->avalue;
+  argp = stack;
+
+  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+       (i != 0);
+       i--, p_arg++)
+    {
+      size_t z;
+      
+      z = (*p_arg)->size;
+
+      if ((*p_arg)->type == FFI_TYPE_STRUCT)
+	{
+	  z = sizeof(void*);
+	  *(void **) argp = *p_argv;
+	} 
+      /*      if ((*p_arg)->type == FFI_TYPE_FLOAT)
+	{
+	  if (count > 24)
+	    {
+	      // This is going on the stack.  Turn it into a double.  
+	      *(double *) argp = (double) *(float*)(* p_argv);
+	      z = sizeof(double);
+	    }
+	  else
+	    *(void **) argp = *(void **)(* p_argv);
+	}  */
+      else if (z < sizeof(int))
+	{
+	  z = sizeof(int);
+	  switch ((*p_arg)->type)
+	    {
+	    case FFI_TYPE_SINT8:
+	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
+	      break;
+	      
+	    case FFI_TYPE_UINT8:
+	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
+	      break;
+	      
+	    case FFI_TYPE_SINT16:
+	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
+	      break;
+		  
+	    case FFI_TYPE_UINT16:
+	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
+	      break;
+		  
+	    default:
+	      FFI_ASSERT(0);
+	    }
+	}
+      else if (z == sizeof(int))
+	{
+	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
+	}
+      else
+	{
+	  memcpy(argp, *p_argv, z);
+	}
+      p_argv++;
+      argp += z;
+      count += z;
+    }
+
+  return (stack + ((count > 24) ? 24 : ALIGN_DOWN(count, 8)));
+}
+
+/* Perform machine dependent cif processing */
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  if (cif->rtype->type == FFI_TYPE_STRUCT)
+    cif->flags = -1;
+  else
+    cif->flags = cif->rtype->size;
+
+  cif->bytes = ALIGN (cif->bytes, 8);
+
+  return FFI_OK;
+}
+
+extern void ffi_call_EABI(void *(*)(char *, extended_cif *), 
+			  extended_cif *, 
+			  unsigned, unsigned, 
+			  unsigned *, 
+			  void (*fn)(void));
+
+void ffi_call(ffi_cif *cif, 
+	      void (*fn)(void), 
+	      void *rvalue, 
+	      void **avalue)
+{
+  extended_cif ecif;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+  
+  /* If the return value is a struct and we don't have a return	*/
+  /* value address then we need to make one		        */
+
+  if ((rvalue == NULL) && 
+      (cif->rtype->type == FFI_TYPE_STRUCT))
+    {
+      ecif.rvalue = alloca(cif->rtype->size);
+    }
+  else
+    ecif.rvalue = rvalue;
+    
+  
+  switch (cif->abi) 
+    {
+    case FFI_EABI:
+      ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, 
+		    cif->flags, ecif.rvalue, fn);
+      break;
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+}
+
+void ffi_closure_eabi (unsigned arg1, unsigned arg2, unsigned arg3,
+		       unsigned arg4, unsigned arg5, unsigned arg6)
+{
+  /* This function is called by a trampoline.  The trampoline stows a
+     pointer to the ffi_closure object in gr7.  We must save this
+     pointer in a place that will persist while we do our work.  */
+  register ffi_closure *creg __asm__ ("gr7");
+  ffi_closure *closure = creg;
+
+  /* Arguments that don't fit in registers are found on the stack
+     at a fixed offset above the current frame pointer.  */
+  register char *frame_pointer __asm__ ("fp");
+  char *stack_args = frame_pointer + 16;
+
+  /* Lay the register arguments down in a continuous chunk of memory.  */
+  unsigned register_args[6] =
+    { arg1, arg2, arg3, arg4, arg5, arg6 };
+
+  ffi_cif *cif = closure->cif;
+  ffi_type **arg_types = cif->arg_types;
+  void **avalue = alloca (cif->nargs * sizeof(void *));
+  char *ptr = (char *) register_args;
+  int i;
+
+  /* Find the address of each argument.  */
+  for (i = 0; i < cif->nargs; i++)
+    {
+      switch (arg_types[i]->type)
+	{
+	case FFI_TYPE_SINT8:
+	case FFI_TYPE_UINT8:
+	  avalue[i] = ptr + 3;
+	  break;
+	case FFI_TYPE_SINT16:
+	case FFI_TYPE_UINT16:
+	  avalue[i] = ptr + 2;
+	  break;
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_UINT32:
+	case FFI_TYPE_FLOAT:
+	  avalue[i] = ptr;
+	  break;
+	case FFI_TYPE_STRUCT:
+	  avalue[i] = *(void**)ptr;
+	  break;
+	default:
+	  /* This is an 8-byte value.  */
+	  avalue[i] = ptr;
+	  ptr += 4;
+	  break;
+	}
+      ptr += 4;
+
+      /* If we've handled more arguments than fit in registers,
+	 start looking at the those passed on the stack.  */
+      if (ptr == ((char *)register_args + (6*4)))
+	ptr = stack_args;
+    }
+
+  /* Invoke the closure.  */
+  if (cif->rtype->type == FFI_TYPE_STRUCT)
+    {
+      /* The caller allocates space for the return structure, and
+       passes a pointer to this space in gr3.  Use this value directly
+       as the return value.  */
+      register void *return_struct_ptr __asm__("gr3");
+      (closure->fun) (cif, return_struct_ptr, avalue, closure->user_data);
+    }
+  else
+    {
+      /* Allocate space for the return value and call the function.  */
+      long long rvalue;
+      (closure->fun) (cif, &rvalue, avalue, closure->user_data);
+
+      /* Functions return 4-byte or smaller results in gr8.  8-byte
+	 values also use gr9.  We fill the both, even for small return
+	 values, just to avoid a branch.  */ 
+      asm ("ldi  @(%0, #0), gr8" : : "r" (&rvalue));
+      asm ("ldi  @(%0, #0), gr9" : : "r" (&((int *) &rvalue)[1]));
+    }
+}
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*, void*, void**, void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
+  unsigned long fn = (long) ffi_closure_eabi;
+  unsigned long cls = (long) codeloc;
+  int i;
+
+  fn = (unsigned long) ffi_closure_eabi;
+
+  tramp[0] = 0x8cfc0000 + (fn  & 0xffff); /* setlos lo(fn), gr6    */
+  tramp[1] = 0x8efc0000 + (cls & 0xffff); /* setlos lo(cls), gr7   */
+  tramp[2] = 0x8cf80000 + (fn  >> 16);	  /* sethi hi(fn), gr6     */
+  tramp[3] = 0x8ef80000 + (cls >> 16);    /* sethi hi(cls), gr7    */
+  tramp[4] = 0x80300006;                  /* jmpl @(gr0, gr6)      */
+
+  closure->cif = cif;
+  closure->fun = fun;
+  closure->user_data = user_data;
+
+  /* Cache flushing.  */
+  for (i = 0; i < FFI_TRAMPOLINE_SIZE; i++)
+    __asm__ volatile ("dcf @(%0,%1)\n\tici @(%2,%1)" :: "r" (tramp), "r" (i),
+		      "r" (codeloc));
+
+  return FFI_OK;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffi.c
new file mode 100644
index 0000000..4ce2bc6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffi.c
@@ -0,0 +1,719 @@
+/* -----------------------------------------------------------------------
+   ffi.c - (c) 2011 Anthony Green
+           (c) 2008 Red Hat, Inc.
+	   (c) 2006 Free Software Foundation, Inc.
+           (c) 2003-2004 Randolph Chung <tausq@debian.org>
+           
+   HPPA Foreign Function Interface
+   HP-UX PA ABI support 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#define ROUND_UP(v, a)  (((size_t)(v) + (a) - 1) & ~((a) - 1))
+
+#define MIN_STACK_SIZE  64
+#define FIRST_ARG_SLOT  9
+#define DEBUG_LEVEL   0
+
+#define fldw(addr, fpreg) \
+  __asm__ volatile ("fldw 0(%0), %%" #fpreg "L" : : "r"(addr) : #fpreg)
+#define fstw(fpreg, addr) \
+  __asm__ volatile ("fstw %%" #fpreg "L, 0(%0)" : : "r"(addr))
+#define fldd(addr, fpreg) \
+  __asm__ volatile ("fldd 0(%0), %%" #fpreg : : "r"(addr) : #fpreg)
+#define fstd(fpreg, addr) \
+  __asm__ volatile ("fstd %%" #fpreg "L, 0(%0)" : : "r"(addr))
+
+#define debug(lvl, x...) do { if (lvl <= DEBUG_LEVEL) { printf(x); } } while (0)
+
+static inline int ffi_struct_type(ffi_type *t)
+{
+  size_t sz = t->size;
+
+  /* Small structure results are passed in registers,
+     larger ones are passed by pointer.  Note that
+     small structures of size 2, 4 and 8 differ from
+     the corresponding integer types in that they have
+     different alignment requirements.  */
+
+  if (sz <= 1)
+    return FFI_TYPE_UINT8;
+  else if (sz == 2)
+    return FFI_TYPE_SMALL_STRUCT2;
+  else if (sz == 3)
+    return FFI_TYPE_SMALL_STRUCT3;
+  else if (sz == 4)
+    return FFI_TYPE_SMALL_STRUCT4;
+  else if (sz == 5)
+    return FFI_TYPE_SMALL_STRUCT5;
+  else if (sz == 6)
+    return FFI_TYPE_SMALL_STRUCT6;
+  else if (sz == 7)
+    return FFI_TYPE_SMALL_STRUCT7;
+  else if (sz <= 8)
+    return FFI_TYPE_SMALL_STRUCT8;
+  else
+    return FFI_TYPE_STRUCT; /* else, we pass it by pointer.  */
+}
+
+/* PA has a downward growing stack, which looks like this:
+
+   Offset
+	[ Variable args ]
+   SP = (4*(n+9))       arg word N
+   ...
+   SP-52                arg word 4
+	[ Fixed args ]
+   SP-48                arg word 3
+   SP-44                arg word 2
+   SP-40                arg word 1
+   SP-36                arg word 0
+	[ Frame marker ]
+   ...
+   SP-20                RP
+   SP-4                 previous SP
+
+   The first four argument words on the stack are reserved for use by
+   the callee.  Instead, the general and floating registers replace
+   the first four argument slots.  Non FP arguments are passed solely
+   in the general registers.  FP arguments are passed in both general
+   and floating registers when using libffi.
+
+   Non-FP 32-bit args are passed in gr26, gr25, gr24 and gr23.
+   Non-FP 64-bit args are passed in register pairs, starting
+   on an odd numbered register (i.e. r25+r26 and r23+r24).
+   FP 32-bit arguments are passed in fr4L, fr5L, fr6L and fr7L.
+   FP 64-bit arguments are passed in fr5 and fr7.
+
+   The registers are allocated in the same manner as stack slots.
+   This allows the callee to save its arguments on the stack if
+   necessary:
+
+   arg word 3 -> gr23 or fr7L
+   arg word 2 -> gr24 or fr6L or fr7R
+   arg word 1 -> gr25 or fr5L
+   arg word 0 -> gr26 or fr4L or fr5R
+
+   Note that fr4R and fr6R are never used for arguments (i.e.,
+   doubles are not passed in fr4 or fr6).
+
+   The rest of the arguments are passed on the stack starting at SP-52,
+   but 64-bit arguments need to be aligned to an 8-byte boundary
+
+   This means we can have holes either in the register allocation,
+   or in the stack.  */
+
+/* ffi_prep_args is called by the assembly routine once stack space
+   has been allocated for the function's arguments
+
+   The following code will put everything into the stack frame
+   (which was allocated by the asm routine), and on return
+   the asm routine will load the arguments that should be
+   passed by register into the appropriate registers
+
+   NOTE: We load floating point args in this function... that means we
+   assume gcc will not mess with fp regs in here.  */
+
+void ffi_prep_args_pa32(UINT32 *stack, extended_cif *ecif, unsigned bytes)
+{
+  register unsigned int i;
+  register ffi_type **p_arg;
+  register void **p_argv;
+  unsigned int slot = FIRST_ARG_SLOT;
+  char *dest_cpy;
+  size_t len;
+
+  debug(1, "%s: stack = %p, ecif = %p, bytes = %u\n", __FUNCTION__, stack,
+	ecif, bytes);
+
+  p_arg = ecif->cif->arg_types;
+  p_argv = ecif->avalue;
+
+  for (i = 0; i < ecif->cif->nargs; i++)
+    {
+      int type = (*p_arg)->type;
+
+      switch (type)
+	{
+	case FFI_TYPE_SINT8:
+	  *(SINT32 *)(stack - slot) = *(SINT8 *)(*p_argv);
+	  break;
+
+	case FFI_TYPE_UINT8:
+	  *(UINT32 *)(stack - slot) = *(UINT8 *)(*p_argv);
+	  break;
+
+	case FFI_TYPE_SINT16:
+	  *(SINT32 *)(stack - slot) = *(SINT16 *)(*p_argv);
+	  break;
+
+	case FFI_TYPE_UINT16:
+	  *(UINT32 *)(stack - slot) = *(UINT16 *)(*p_argv);
+	  break;
+
+	case FFI_TYPE_UINT32:
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_POINTER:
+	  debug(3, "Storing UINT32 %u in slot %u\n", *(UINT32 *)(*p_argv),
+		slot);
+	  *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv);
+	  break;
+
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_SINT64:
+	  /* Align slot for 64-bit type.  */
+	  slot += (slot & 1) ? 1 : 2;
+	  *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv);
+	  break;
+
+	case FFI_TYPE_FLOAT:
+	  /* First 4 args go in fr4L - fr7L.  */
+	  debug(3, "Storing UINT32(float) in slot %u\n", slot);
+	  *(UINT32 *)(stack - slot) = *(UINT32 *)(*p_argv);
+	  switch (slot - FIRST_ARG_SLOT)
+	    {
+	    /* First 4 args go in fr4L - fr7L.  */
+	    case 0: fldw(stack - slot, fr4); break;
+	    case 1: fldw(stack - slot, fr5); break;
+	    case 2: fldw(stack - slot, fr6); break;
+	    case 3: fldw(stack - slot, fr7); break;
+	    }
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  /* Align slot for 64-bit type.  */
+	  slot += (slot & 1) ? 1 : 2;
+	  debug(3, "Storing UINT64(double) at slot %u\n", slot);
+	  *(UINT64 *)(stack - slot) = *(UINT64 *)(*p_argv);
+	  switch (slot - FIRST_ARG_SLOT)
+	    {
+	      /* First 2 args go in fr5, fr7.  */
+	      case 1: fldd(stack - slot, fr5); break;
+	      case 3: fldd(stack - slot, fr7); break;
+	    }
+	  break;
+
+#ifdef PA_HPUX
+	case FFI_TYPE_LONGDOUBLE:
+	  /* Long doubles are passed in the same manner as structures
+	     larger than 8 bytes.  */
+	  *(UINT32 *)(stack - slot) = (UINT32)(*p_argv);
+	  break;
+#endif
+
+	case FFI_TYPE_STRUCT:
+
+	  /* Structs smaller or equal than 4 bytes are passed in one
+	     register. Structs smaller or equal 8 bytes are passed in two
+	     registers. Larger structures are passed by pointer.  */
+
+	  len = (*p_arg)->size;
+	  if (len <= 4)
+	    {
+	      dest_cpy = (char *)(stack - slot) + 4 - len;
+	      memcpy(dest_cpy, (char *)*p_argv, len);
+	    }
+	  else if (len <= 8)
+	    {
+	      slot += (slot & 1) ? 1 : 2;
+	      dest_cpy = (char *)(stack - slot) + 8 - len;
+	      memcpy(dest_cpy, (char *)*p_argv, len);
+	    }
+	  else
+	    *(UINT32 *)(stack - slot) = (UINT32)(*p_argv);
+	  break;
+
+	default:
+	  FFI_ASSERT(0);
+	}
+
+      slot++;
+      p_arg++;
+      p_argv++;
+    }
+
+  /* Make sure we didn't mess up and scribble on the stack.  */
+  {
+    unsigned int n;
+
+    debug(5, "Stack setup:\n");
+    for (n = 0; n < (bytes + 3) / 4; n++)
+      {
+	if ((n%4) == 0) { debug(5, "\n%08x: ", (unsigned int)(stack - n)); }
+	debug(5, "%08x ", *(stack - n));
+      }
+    debug(5, "\n");
+  }
+
+  FFI_ASSERT(slot * 4 <= bytes);
+
+  return;
+}
+
+static void ffi_size_stack_pa32(ffi_cif *cif)
+{
+  ffi_type **ptr;
+  int i;
+  int z = 0; /* # stack slots */
+
+  for (ptr = cif->arg_types, i = 0; i < cif->nargs; ptr++, i++)
+    {
+      int type = (*ptr)->type;
+
+      switch (type)
+	{
+	case FFI_TYPE_DOUBLE:
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_SINT64:
+	  z += 2 + (z & 1); /* must start on even regs, so we may waste one */
+	  break;
+
+#ifdef PA_HPUX
+	case FFI_TYPE_LONGDOUBLE:
+#endif
+	case FFI_TYPE_STRUCT:
+	  z += 1; /* pass by ptr, callee will copy */
+	  break;
+
+	default: /* <= 32-bit values */
+	  z++;
+	}
+    }
+
+  /* We can fit up to 6 args in the default 64-byte stack frame,
+     if we need more, we need more stack.  */
+  if (z <= 6)
+    cif->bytes = MIN_STACK_SIZE; /* min stack size */
+  else
+    cif->bytes = 64 + ROUND_UP((z - 6) * sizeof(UINT32), MIN_STACK_SIZE);
+
+  debug(3, "Calculated stack size is %u bytes\n", cif->bytes);
+}
+
+/* Perform machine dependent cif processing.  */
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  /* Set the return type flag */
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_VOID:
+    case FFI_TYPE_FLOAT:
+    case FFI_TYPE_DOUBLE:
+      cif->flags = (unsigned) cif->rtype->type;
+      break;
+
+#ifdef PA_HPUX
+    case FFI_TYPE_LONGDOUBLE:
+      /* Long doubles are treated like a structure.  */
+      cif->flags = FFI_TYPE_STRUCT;
+      break;
+#endif
+
+    case FFI_TYPE_STRUCT:
+      /* For the return type we have to check the size of the structures.
+	 If the size is smaller or equal 4 bytes, the result is given back
+	 in one register. If the size is smaller or equal 8 bytes than we
+	 return the result in two registers. But if the size is bigger than
+	 8 bytes, we work with pointers.  */
+      cif->flags = ffi_struct_type(cif->rtype);
+      break;
+
+    case FFI_TYPE_UINT64:
+    case FFI_TYPE_SINT64:
+      cif->flags = FFI_TYPE_UINT64;
+      break;
+
+    default:
+      cif->flags = FFI_TYPE_INT;
+      break;
+    }
+
+  /* Lucky us, because of the unique PA ABI we get to do our
+     own stack sizing.  */
+  switch (cif->abi)
+    {
+    case FFI_PA32:
+      ffi_size_stack_pa32(cif);
+      break;
+
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+
+  return FFI_OK;
+}
+
+extern void ffi_call_pa32(void (*)(UINT32 *, extended_cif *, unsigned),
+			  extended_cif *, unsigned, unsigned, unsigned *,
+			  void (*fn)(void));
+
+void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+
+  /* If the return value is a struct and we don't have a return
+     value address then we need to make one.  */
+
+  if (rvalue == NULL
+#ifdef PA_HPUX
+      && (cif->rtype->type == FFI_TYPE_STRUCT
+	  || cif->rtype->type == FFI_TYPE_LONGDOUBLE))
+#else
+      && cif->rtype->type == FFI_TYPE_STRUCT)
+#endif
+    {
+      ecif.rvalue = alloca(cif->rtype->size);
+    }
+  else
+    ecif.rvalue = rvalue;
+
+
+  switch (cif->abi)
+    {
+    case FFI_PA32:
+      debug(3, "Calling ffi_call_pa32: ecif=%p, bytes=%u, flags=%u, rvalue=%p, fn=%p\n", &ecif, cif->bytes, cif->flags, ecif.rvalue, (void *)fn);
+      ffi_call_pa32(ffi_prep_args_pa32, &ecif, cif->bytes,
+		     cif->flags, ecif.rvalue, fn);
+      break;
+
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+}
+
+#if FFI_CLOSURES
+/* This is more-or-less an inverse of ffi_call -- we have arguments on
+   the stack, and we need to fill them into a cif structure and invoke
+   the user function. This really ought to be in asm to make sure
+   the compiler doesn't do things we don't expect.  */
+ffi_status ffi_closure_inner_pa32(ffi_closure *closure, UINT32 *stack)
+{
+  ffi_cif *cif;
+  void **avalue;
+  void *rvalue;
+  UINT32 ret[2]; /* function can return up to 64-bits in registers */
+  ffi_type **p_arg;
+  char *tmp;
+  int i, avn;
+  unsigned int slot = FIRST_ARG_SLOT;
+  register UINT32 r28 asm("r28");
+
+  cif = closure->cif;
+
+  /* If returning via structure, callee will write to our pointer.  */
+  if (cif->flags == FFI_TYPE_STRUCT)
+    rvalue = (void *)r28;
+  else
+    rvalue = &ret[0];
+
+  avalue = (void **)alloca(cif->nargs * FFI_SIZEOF_ARG);
+  avn = cif->nargs;
+  p_arg = cif->arg_types;
+
+  for (i = 0; i < avn; i++)
+    {
+      int type = (*p_arg)->type;
+
+      switch (type)
+	{
+	case FFI_TYPE_SINT8:
+	case FFI_TYPE_UINT8:
+	case FFI_TYPE_SINT16:
+	case FFI_TYPE_UINT16:
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_UINT32:
+	case FFI_TYPE_POINTER:
+	  avalue[i] = (char *)(stack - slot) + sizeof(UINT32) - (*p_arg)->size;
+	  break;
+
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_UINT64:
+	  slot += (slot & 1) ? 1 : 2;
+	  avalue[i] = (void *)(stack - slot);
+	  break;
+
+	case FFI_TYPE_FLOAT:
+#ifdef PA_LINUX
+	  /* The closure call is indirect.  In Linux, floating point
+	     arguments in indirect calls with a prototype are passed
+	     in the floating point registers instead of the general
+	     registers.  So, we need to replace what was previously
+	     stored in the current slot with the value in the
+	     corresponding floating point register.  */
+	  switch (slot - FIRST_ARG_SLOT)
+	    {
+	    case 0: fstw(fr4, (void *)(stack - slot)); break;
+	    case 1: fstw(fr5, (void *)(stack - slot)); break;
+	    case 2: fstw(fr6, (void *)(stack - slot)); break;
+	    case 3: fstw(fr7, (void *)(stack - slot)); break;
+	    }
+#endif
+	  avalue[i] = (void *)(stack - slot);
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  slot += (slot & 1) ? 1 : 2;
+#ifdef PA_LINUX
+	  /* See previous comment for FFI_TYPE_FLOAT.  */
+	  switch (slot - FIRST_ARG_SLOT)
+	    {
+	    case 1: fstd(fr5, (void *)(stack - slot)); break;
+	    case 3: fstd(fr7, (void *)(stack - slot)); break;
+	    }
+#endif
+	  avalue[i] = (void *)(stack - slot);
+	  break;
+
+#ifdef PA_HPUX
+	case FFI_TYPE_LONGDOUBLE:
+	  /* Long doubles are treated like a big structure.  */
+	  avalue[i] = (void *) *(stack - slot);
+	  break;
+#endif
+
+	case FFI_TYPE_STRUCT:
+	  /* Structs smaller or equal than 4 bytes are passed in one
+	     register. Structs smaller or equal 8 bytes are passed in two
+	     registers. Larger structures are passed by pointer.  */
+	  if((*p_arg)->size <= 4)
+	    {
+	      avalue[i] = (void *)(stack - slot) + sizeof(UINT32) -
+		(*p_arg)->size;
+	    }
+	  else if ((*p_arg)->size <= 8)
+	    {
+	      slot += (slot & 1) ? 1 : 2;
+	      avalue[i] = (void *)(stack - slot) + sizeof(UINT64) -
+		(*p_arg)->size;
+	    }
+	  else
+	    avalue[i] = (void *) *(stack - slot);
+	  break;
+
+	default:
+	  FFI_ASSERT(0);
+	}
+
+      slot++;
+      p_arg++;
+    }
+
+  /* Invoke the closure.  */
+  (closure->fun) (cif, rvalue, avalue, closure->user_data);
+
+  debug(3, "after calling function, ret[0] = %08x, ret[1] = %08x\n", ret[0],
+	ret[1]);
+
+  /* Store the result using the lower 2 bytes of the flags.  */
+  switch (cif->flags)
+    {
+    case FFI_TYPE_UINT8:
+      *(stack - FIRST_ARG_SLOT) = (UINT8)(ret[0] >> 24);
+      break;
+    case FFI_TYPE_SINT8:
+      *(stack - FIRST_ARG_SLOT) = (SINT8)(ret[0] >> 24);
+      break;
+    case FFI_TYPE_UINT16:
+      *(stack - FIRST_ARG_SLOT) = (UINT16)(ret[0] >> 16);
+      break;
+    case FFI_TYPE_SINT16:
+      *(stack - FIRST_ARG_SLOT) = (SINT16)(ret[0] >> 16);
+      break;
+    case FFI_TYPE_INT:
+    case FFI_TYPE_SINT32:
+    case FFI_TYPE_UINT32:
+      *(stack - FIRST_ARG_SLOT) = ret[0];
+      break;
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_UINT64:
+      *(stack - FIRST_ARG_SLOT) = ret[0];
+      *(stack - FIRST_ARG_SLOT - 1) = ret[1];
+      break;
+
+    case FFI_TYPE_DOUBLE:
+      fldd(rvalue, fr4);
+      break;
+
+    case FFI_TYPE_FLOAT:
+      fldw(rvalue, fr4);
+      break;
+
+    case FFI_TYPE_STRUCT:
+      /* Don't need a return value, done by caller.  */
+      break;
+
+    case FFI_TYPE_SMALL_STRUCT2:
+    case FFI_TYPE_SMALL_STRUCT3:
+    case FFI_TYPE_SMALL_STRUCT4:
+      tmp = (void*)(stack -  FIRST_ARG_SLOT);
+      tmp += 4 - cif->rtype->size;
+      memcpy((void*)tmp, &ret[0], cif->rtype->size);
+      break;
+
+    case FFI_TYPE_SMALL_STRUCT5:
+    case FFI_TYPE_SMALL_STRUCT6:
+    case FFI_TYPE_SMALL_STRUCT7:
+    case FFI_TYPE_SMALL_STRUCT8:
+      {
+	unsigned int ret2[2];
+	int off;
+
+	/* Right justify ret[0] and ret[1] */
+	switch (cif->flags)
+	  {
+	    case FFI_TYPE_SMALL_STRUCT5: off = 3; break;
+	    case FFI_TYPE_SMALL_STRUCT6: off = 2; break;
+	    case FFI_TYPE_SMALL_STRUCT7: off = 1; break;
+	    default: off = 0; break;
+	  }
+
+	memset (ret2, 0, sizeof (ret2));
+	memcpy ((char *)ret2 + off, ret, 8 - off);
+
+	*(stack - FIRST_ARG_SLOT) = ret2[0];
+	*(stack - FIRST_ARG_SLOT - 1) = ret2[1];
+      }
+      break;
+
+    case FFI_TYPE_POINTER:
+    case FFI_TYPE_VOID:
+      break;
+
+    default:
+      debug(0, "assert with cif->flags: %d\n",cif->flags);
+      FFI_ASSERT(0);
+      break;
+    }
+  return FFI_OK;
+}
+
+/* Fill in a closure to refer to the specified fun and user_data.
+   cif specifies the argument and result types for fun.
+   The cif must already be prep'ed.  */
+
+extern void ffi_closure_pa32(void);
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*,void*,void**,void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  UINT32 *tramp = (UINT32 *)(closure->tramp);
+#ifdef PA_HPUX
+  UINT32 *tmp;
+#endif
+
+  if (cif->abi != FFI_PA32)
+    return FFI_BAD_ABI;
+
+  /* Make a small trampoline that will branch to our
+     handler function. Use PC-relative addressing.  */
+
+#ifdef PA_LINUX
+  tramp[0] = 0xeaa00000; /* b,l .+8,%r21        ; %r21 <- pc+8 */
+  tramp[1] = 0xd6a01c1e; /* depi 0,31,2,%r21    ; mask priv bits */
+  tramp[2] = 0x4aa10028; /* ldw 20(%r21),%r1    ; load plabel */
+  tramp[3] = 0x36b53ff1; /* ldo -8(%r21),%r21   ; get closure addr */
+  tramp[4] = 0x0c201096; /* ldw 0(%r1),%r22     ; address of handler */
+  tramp[5] = 0xeac0c000; /* bv%r0(%r22)         ; branch to handler */
+  tramp[6] = 0x0c281093; /* ldw 4(%r1),%r19     ; GP of handler */
+  tramp[7] = ((UINT32)(ffi_closure_pa32) & ~2);
+
+  /* Flush d/icache -- have to flush up 2 two lines because of
+     alignment.  */
+  __asm__ volatile(
+		   "fdc 0(%0)\n\t"
+		   "fdc %1(%0)\n\t"
+		   "fic 0(%%sr4, %0)\n\t"
+		   "fic %1(%%sr4, %0)\n\t"
+		   "sync\n\t"
+		   "nop\n\t"
+		   "nop\n\t"
+		   "nop\n\t"
+		   "nop\n\t"
+		   "nop\n\t"
+		   "nop\n\t"
+		   "nop\n"
+		   :
+		   : "r"((unsigned long)tramp & ~31),
+		     "r"(32 /* stride */)
+		   : "memory");
+#endif
+
+#ifdef PA_HPUX
+  tramp[0] = 0xeaa00000; /* b,l .+8,%r21        ; %r21 <- pc+8  */
+  tramp[1] = 0xd6a01c1e; /* depi 0,31,2,%r21    ; mask priv bits  */
+  tramp[2] = 0x4aa10038; /* ldw 28(%r21),%r1    ; load plabel  */
+  tramp[3] = 0x36b53ff1; /* ldo -8(%r21),%r21   ; get closure addr  */
+  tramp[4] = 0x0c201096; /* ldw 0(%r1),%r22     ; address of handler  */
+  tramp[5] = 0x02c010b4; /* ldsid (%r22),%r20   ; load space id  */
+  tramp[6] = 0x00141820; /* mtsp %r20,%sr0      ; into %sr0  */
+  tramp[7] = 0xe2c00000; /* be 0(%sr0,%r22)     ; branch to handler  */
+  tramp[8] = 0x0c281093; /* ldw 4(%r1),%r19     ; GP of handler  */
+  tramp[9] = ((UINT32)(ffi_closure_pa32) & ~2);
+
+  /* Flush d/icache -- have to flush three lines because of alignment.  */
+  __asm__ volatile(
+		   "copy %1,%0\n\t"
+		   "fdc,m %2(%0)\n\t"
+		   "fdc,m %2(%0)\n\t"
+		   "fdc,m %2(%0)\n\t"
+		   "ldsid (%1),%0\n\t"
+		   "mtsp %0,%%sr0\n\t"
+		   "copy %1,%0\n\t"
+		   "fic,m %2(%%sr0,%0)\n\t"
+		   "fic,m %2(%%sr0,%0)\n\t"
+		   "fic,m %2(%%sr0,%0)\n\t"
+		   "sync\n\t"
+		   "nop\n\t"
+		   "nop\n\t"
+		   "nop\n\t"
+		   "nop\n\t"
+		   "nop\n\t"
+		   "nop\n\t"
+		   "nop\n"
+		   : "=&r" ((unsigned long)tmp)
+		   : "r" ((unsigned long)tramp & ~31),
+		     "r" (32/* stride */)
+		   : "memory");
+#endif
+
+  closure->cif  = cif;
+  closure->user_data = user_data;
+  closure->fun  = fun;
+
+  return FFI_OK;
+}
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffitarget.h
new file mode 100644
index 0000000..efa2f4e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/ffitarget.h
@@ -0,0 +1,78 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Target configuration macros for hppa.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+/* ---- System specific configurations ----------------------------------- */
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+
+#ifdef PA_LINUX
+  FFI_PA32,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_PA32
+#endif
+
+#ifdef PA_HPUX
+  FFI_PA32,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_PA32
+#endif
+
+#ifdef PA64_HPUX
+#error "PA64_HPUX FFI is not yet implemented"
+  FFI_PA64,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_PA64
+#endif
+} ffi_abi;
+#endif
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_NATIVE_RAW_API 0
+
+#ifdef PA_LINUX
+#define FFI_TRAMPOLINE_SIZE 32
+#else
+#define FFI_TRAMPOLINE_SIZE 40
+#endif
+
+#define FFI_TYPE_SMALL_STRUCT2 -1
+#define FFI_TYPE_SMALL_STRUCT3 -2
+#define FFI_TYPE_SMALL_STRUCT4 -3
+#define FFI_TYPE_SMALL_STRUCT5 -4
+#define FFI_TYPE_SMALL_STRUCT6 -5
+#define FFI_TYPE_SMALL_STRUCT7 -6
+#define FFI_TYPE_SMALL_STRUCT8 -7
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/hpux32.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/hpux32.S
new file mode 100644
index 0000000..40528ba
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/hpux32.S
@@ -0,0 +1,368 @@
+/* -----------------------------------------------------------------------
+   hpux32.S - Copyright (c) 2006 Free Software Foundation, Inc.
+	                (c) 2008 Red Hat, Inc.
+   based on src/pa/linux.S
+
+   HP-UX PA Foreign Function Interface
+
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+
+	.LEVEL 1.1
+	.SPACE	$PRIVATE$
+	.IMPORT	$global$,DATA
+	.IMPORT	$$dyncall,MILLICODE
+	.SUBSPA	$DATA$
+	.align	4
+
+	/* void ffi_call_pa32(void (*)(char *, extended_cif *),
+			       extended_cif *ecif,
+			       unsigned bytes,
+			       unsigned flags,
+			       unsigned *rvalue,
+			       void (*fn)(void));
+	 */
+
+	.export	ffi_call_pa32,ENTRY,PRIV_LEV=3
+	.import	ffi_prep_args_pa32,CODE
+
+	.SPACE	$TEXT$
+	.SUBSPA $CODE$
+	.align	4
+
+L$FB1
+ffi_call_pa32
+	.proc
+	.callinfo	FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4
+	.entry
+	stw	%rp, -20(%sp)
+	copy	%r3, %r1
+L$CFI11
+	copy	%sp, %r3
+L$CFI12
+
+	/* Setup the stack for calling prep_args...
+	   We want the stack to look like this:
+
+	   [ Previous stack                            ] <- %r3
+
+	   [ 64-bytes register save area               ] <- %r4
+
+	   [ Stack space for actual call, passed as    ] <- %arg0
+	   [     arg0 to ffi_prep_args_pa32           ]
+
+	   [ Stack for calling prep_args               ] <- %sp
+	 */
+
+	stwm	%r1, 64(%sp)
+	stw	%r4, 12(%r3)
+L$CFI13
+	copy	%sp, %r4
+
+	addl	%arg2, %r4, %arg0	; arg stack
+	stw	%arg3, -48(%r3)		; save flags we need it later
+
+	/* Call prep_args:
+	   %arg0(stack) -- set up above
+	   %arg1(ecif)  -- same as incoming param
+	   %arg2(bytes) -- same as incoming param */
+	bl	ffi_prep_args_pa32,%r2
+	ldo	64(%arg0), %sp
+	ldo	-64(%sp), %sp
+
+	/* now %sp should point where %arg0 was pointing.  */
+
+	/* Load the arguments that should be passed in registers
+	   The fp args are loaded by the prep_args function.  */
+	ldw	-36(%sp), %arg0
+	ldw	-40(%sp), %arg1
+	ldw	-44(%sp), %arg2
+	ldw	-48(%sp), %arg3
+
+	/* in case the function is going to return a structure
+	   we need to give it a place to put the result.  */
+	ldw	-52(%r3), %ret0		; %ret0 <- rvalue
+	ldw	-56(%r3), %r22		; %r22 <- function to call
+	bl	$$dyncall, %r31		; Call the user function
+	copy	%r31, %rp
+
+	/* Prepare to store the result; we need to recover flags and rvalue.  */
+	ldw	-48(%r3), %r21		; r21 <- flags
+	ldw	-52(%r3), %r20		; r20 <- rvalue
+
+	/* Store the result according to the return type.  The most
+	   likely types should come first.  */
+
+L$checkint
+	comib,<>,n FFI_TYPE_INT, %r21, L$checkint8
+	b	L$done
+	stw	%ret0, 0(%r20)
+
+L$checkint8
+	comib,<>,n FFI_TYPE_UINT8, %r21, L$checkint16
+	b	L$done
+	stb	%ret0, 0(%r20)
+
+L$checkint16
+	comib,<>,n FFI_TYPE_UINT16, %r21, L$checkdbl
+	b	L$done
+	sth	%ret0, 0(%r20)
+
+L$checkdbl
+	comib,<>,n FFI_TYPE_DOUBLE, %r21, L$checkfloat
+	b	L$done
+	fstd	%fr4,0(%r20)
+
+L$checkfloat
+	comib,<>,n FFI_TYPE_FLOAT, %r21, L$checkll
+	b	L$done
+	fstw	%fr4L,0(%r20)
+
+L$checkll
+	comib,<>,n FFI_TYPE_UINT64, %r21, L$checksmst2
+	stw	%ret0, 0(%r20)
+	b	L$done
+	stw	%ret1, 4(%r20)
+
+L$checksmst2
+	comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, L$checksmst3
+	/* 2-byte structs are returned in ret0 as ????xxyy.  */
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	L$done
+	stb	%ret0, 0(%r20)
+
+L$checksmst3
+	comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, L$checksmst4
+	/* 3-byte structs are returned in ret0 as ??xxyyzz.  */
+	extru	%ret0, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	L$done
+	stb	%ret0, 0(%r20)
+
+L$checksmst4
+	comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, L$checksmst5
+	/* 4-byte structs are returned in ret0 as wwxxyyzz.  */
+	extru	%ret0, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	L$done
+	stb	%ret0, 0(%r20)
+
+L$checksmst5
+	comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, L$checksmst6
+	/* 5 byte values are returned right justified:
+	      ret0     ret1
+	   5: ??????aa bbccddee */
+	stbs,ma	%ret0, 1(%r20)
+	extru	%ret1, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	L$done
+	stb	%ret1, 0(%r20)
+
+L$checksmst6
+	comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, L$checksmst7
+	/* 6 byte values are returned right justified:
+	      ret0     ret1
+	   6: ????aabb ccddeeff */
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	stbs,ma	%ret0, 1(%r20)
+	extru	%ret1, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	L$done
+	stb	%ret1, 0(%r20)
+
+L$checksmst7
+	comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, L$checksmst8
+	/* 7 byte values are returned right justified:
+	      ret0     ret1
+	   7: ??aabbcc ddeeffgg */
+	extru	%ret0, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	stbs,ma	%ret0, 1(%r20)
+	extru	%ret1, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	L$done
+	stb	%ret1, 0(%r20)
+
+L$checksmst8
+	comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, L$done
+	/* 8 byte values are returned right justified:
+	      ret0     ret1
+	   8: aabbccdd eeffgghh */
+	extru	%ret0, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	stbs,ma	%ret0, 1(%r20)
+	extru	%ret1, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	stb	%ret1, 0(%r20)
+
+L$done
+	/* all done, return */
+	copy	%r4, %sp	; pop arg stack
+	ldw	12(%r3), %r4
+	ldwm	-64(%sp), %r3	; .. and pop stack
+	ldw	-20(%sp), %rp
+	bv	%r0(%rp)
+	nop
+	.exit
+	.procend
+L$FE1
+
+	/* void ffi_closure_pa32(void);
+	   Called with closure argument in %r21 */
+
+	.SPACE $TEXT$
+	.SUBSPA $CODE$
+	.export ffi_closure_pa32,ENTRY,PRIV_LEV=3,RTNVAL=GR
+	.import ffi_closure_inner_pa32,CODE
+	.align 4
+L$FB2
+ffi_closure_pa32
+	.proc
+	.callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
+	.entry
+
+	stw	%rp, -20(%sp)
+	copy	%r3, %r1
+L$CFI21
+	copy	%sp, %r3
+L$CFI22
+	stwm	%r1, 64(%sp)
+
+	/* Put arguments onto the stack and call ffi_closure_inner.  */
+	stw	%arg0, -36(%r3)
+	stw	%arg1, -40(%r3)
+	stw	%arg2, -44(%r3)
+	stw	%arg3, -48(%r3)
+
+	copy	%r21, %arg0
+	bl	ffi_closure_inner_pa32, %r2
+	copy    %r3, %arg1
+	ldwm	-64(%sp), %r3
+	ldw	-20(%sp), %rp
+	ldw	-36(%sp), %ret0
+	bv	%r0(%rp)
+	ldw	-40(%sp), %ret1
+	.exit
+	.procend
+L$FE2:
+
+	.SPACE $PRIVATE$
+	.SUBSPA $DATA$
+
+	.align 4
+	.EXPORT _GLOBAL__F_ffi_call_pa32,DATA
+_GLOBAL__F_ffi_call_pa32
+L$frame1:
+	.word   L$ECIE1-L$SCIE1 ;# Length of Common Information Entry
+L$SCIE1:
+	.word   0x0     ;# CIE Identifier Tag
+	.byte   0x1     ;# CIE Version
+	.ascii "\0"     ;# CIE Augmentation
+	.uleb128 0x1    ;# CIE Code Alignment Factor
+	.sleb128 4      ;# CIE Data Alignment Factor
+	.byte   0x2     ;# CIE RA Column
+	.byte   0xc     ;# DW_CFA_def_cfa
+	.uleb128 0x1e
+	.uleb128 0x0
+	.align 4
+L$ECIE1:
+L$SFDE1:
+	.word   L$EFDE1-L$ASFDE1        ;# FDE Length
+L$ASFDE1:
+	.word   L$ASFDE1-L$frame1       ;# FDE CIE offset
+	.word   L$FB1   ;# FDE initial location
+	.word   L$FE1-L$FB1     ;# FDE address range
+
+	.byte   0x4     ;# DW_CFA_advance_loc4
+	.word   L$CFI11-L$FB1
+	.byte	0x83	;# DW_CFA_offset, column 0x3
+	.uleb128 0x0
+	.byte   0x11    ;# DW_CFA_offset_extended_sf; save r2 at [r30-20]
+	.uleb128 0x2
+	.sleb128 -5
+
+	.byte   0x4     ;# DW_CFA_advance_loc4
+	.word   L$CFI12-L$CFI11
+	.byte   0xd     ;# DW_CFA_def_cfa_register = r3
+	.uleb128 0x3
+
+	.byte   0x4     ;# DW_CFA_advance_loc4
+	.word   L$CFI13-L$CFI12
+	.byte	0x84	;# DW_CFA_offset, column 0x4
+	.uleb128 0x3
+
+	.align 4
+L$EFDE1:
+
+L$SFDE2:
+	.word   L$EFDE2-L$ASFDE2        ;# FDE Length
+L$ASFDE2:
+	.word   L$ASFDE2-L$frame1       ;# FDE CIE offset
+	.word   L$FB2   ;# FDE initial location
+	.word   L$FE2-L$FB2     ;# FDE address range
+	.byte   0x4     ;# DW_CFA_advance_loc4
+	.word   L$CFI21-L$FB2
+	.byte   0x83    ;# DW_CFA_offset, column 0x3
+	.uleb128 0x0
+	.byte   0x11    ;# DW_CFA_offset_extended_sf
+	.uleb128 0x2
+	.sleb128 -5
+
+	.byte   0x4     ;# DW_CFA_advance_loc4
+	.word   L$CFI22-L$CFI21
+	.byte   0xd     ;# DW_CFA_def_cfa_register = r3
+	.uleb128 0x3
+
+	.align 4
+L$EFDE2:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/linux.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/linux.S
new file mode 100644
index 0000000..f11ae76
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/pa/linux.S
@@ -0,0 +1,357 @@
+/* -----------------------------------------------------------------------
+   linux.S - (c) 2003-2004 Randolph Chung <tausq@debian.org>
+	     (c) 2008 Red Hat, Inc.
+
+   HPPA Foreign Function Interface
+
+   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 RENESAS TECHNOLOGY 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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+
+	.text
+	.level 1.1
+	.align 4
+
+	/* void ffi_call_pa32(void (*)(char *, extended_cif *),
+			       extended_cif *ecif,
+			       unsigned bytes,
+			       unsigned flags,
+			       unsigned *rvalue,
+			       void (*fn)(void));
+	 */
+
+	.export ffi_call_pa32,code
+	.import ffi_prep_args_pa32,code
+
+	.type ffi_call_pa32, @function
+.LFB1:
+ffi_call_pa32:
+	.proc
+	.callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4
+	.entry
+	stw %rp, -20(%sp)
+	copy %r3, %r1
+.LCFI11:
+
+	copy %sp, %r3
+.LCFI12:
+
+	/* Setup the stack for calling prep_args...
+	   We want the stack to look like this:
+
+	   [ Previous stack                            ] <- %r3
+
+	   [ 64-bytes register save area               ] <- %r4
+
+	   [ Stack space for actual call, passed as    ] <- %arg0
+	   [     arg0 to ffi_prep_args_pa32           ]
+
+	   [ Stack for calling prep_args               ] <- %sp
+	 */
+
+	stwm %r1, 64(%sp)
+	stw %r4, 12(%r3)
+.LCFI13:
+	copy %sp, %r4
+
+	addl %arg2, %r4, %arg0      /* arg stack */
+	stw %arg3, -48(%r3)         /* save flags; we need it later */
+
+	/* Call prep_args:
+	   %arg0(stack) -- set up above
+	   %arg1(ecif) -- same as incoming param
+	   %arg2(bytes) -- same as incoming param */
+	bl ffi_prep_args_pa32,%r2
+	ldo 64(%arg0), %sp
+	ldo -64(%sp), %sp
+
+	/* now %sp should point where %arg0 was pointing.  */
+
+	/* Load the arguments that should be passed in registers
+	   The fp args were loaded by the prep_args function.  */
+	ldw -36(%sp), %arg0
+	ldw -40(%sp), %arg1
+	ldw -44(%sp), %arg2
+	ldw -48(%sp), %arg3
+
+	/* in case the function is going to return a structure
+	   we need to give it a place to put the result.  */
+	ldw -52(%r3), %ret0                     /* %ret0 <- rvalue */
+	ldw -56(%r3), %r22                      /* %r22 <- function to call */
+	bl $$dyncall, %r31                      /* Call the user function */
+	copy %r31, %rp
+
+	/* Prepare to store the result; we need to recover flags and rvalue.  */
+	ldw -48(%r3), %r21                      /* r21 <- flags */
+	ldw -52(%r3), %r20                      /* r20 <- rvalue */
+
+	/* Store the result according to the return type.  */
+
+.Lcheckint:
+	comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8
+	b	.Ldone
+	stw	%ret0, 0(%r20)
+
+.Lcheckint8:
+	comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16
+	b	.Ldone
+	stb	%ret0, 0(%r20)
+
+.Lcheckint16:
+	comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl
+	b	.Ldone
+	sth	%ret0, 0(%r20)
+
+.Lcheckdbl:
+	comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat
+	b	.Ldone
+	fstd	%fr4,0(%r20)
+
+.Lcheckfloat:
+	comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll
+	b	.Ldone
+	fstw	%fr4L,0(%r20)
+
+.Lcheckll:
+	comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2
+	stw	%ret0, 0(%r20)
+	b	.Ldone
+	stw	%ret1, 4(%r20)
+
+.Lchecksmst2:
+	comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3
+	/* 2-byte structs are returned in ret0 as ????xxyy.  */
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	.Ldone
+	stb	%ret0, 0(%r20)
+
+.Lchecksmst3:
+	comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4
+	/* 3-byte structs are returned in ret0 as ??xxyyzz.  */
+	extru	%ret0, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	.Ldone
+	stb	%ret0, 0(%r20)
+
+.Lchecksmst4:
+	comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5
+	/* 4-byte structs are returned in ret0 as wwxxyyzz.  */
+	extru	%ret0, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	.Ldone
+	stb	%ret0, 0(%r20)
+
+.Lchecksmst5:
+	comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6
+	/* 5 byte values are returned right justified:
+	      ret0     ret1
+	   5: ??????aa bbccddee */
+	stbs,ma	%ret0, 1(%r20)
+	extru	%ret1, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	.Ldone
+	stb	%ret1, 0(%r20)
+
+.Lchecksmst6:
+	comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7
+	/* 6 byte values are returned right justified:
+	      ret0     ret1
+	   6: ????aabb ccddeeff */
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	stbs,ma	%ret0, 1(%r20)
+	extru	%ret1, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	.Ldone
+	stb	%ret1, 0(%r20)
+
+.Lchecksmst7:
+	comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8
+	/* 7 byte values are returned right justified:
+	      ret0     ret1
+	   7: ??aabbcc ddeeffgg */
+	extru	%ret0, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	stbs,ma	%ret0, 1(%r20)
+	extru	%ret1, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	b	.Ldone
+	stb	%ret1, 0(%r20)
+
+.Lchecksmst8:
+	comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone
+	/* 8 byte values are returned right justified:
+	      ret0     ret1
+	   8: aabbccdd eeffgghh */
+	extru	%ret0, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret0, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	stbs,ma	%ret0, 1(%r20)
+	extru	%ret1, 7, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 15, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	extru	%ret1, 23, 8, %r22
+	stbs,ma	%r22, 1(%r20)
+	stb	%ret1, 0(%r20)
+
+.Ldone:
+	/* all done, return */
+	copy %r4, %sp                           /* pop arg stack */
+	ldw 12(%r3), %r4
+	ldwm -64(%sp), %r3                      /* .. and pop stack */
+	ldw -20(%sp), %rp
+	bv %r0(%rp)
+	nop
+	.exit
+	.procend
+.LFE1:
+
+	/* void ffi_closure_pa32(void);
+	   Called with closure argument in %r21 */
+	.export ffi_closure_pa32,code
+	.import ffi_closure_inner_pa32,code
+
+	.type ffi_closure_pa32, @function
+.LFB2:
+ffi_closure_pa32:
+	.proc
+	.callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
+	.entry
+
+	stw %rp, -20(%sp)
+.LCFI20:
+	copy %r3, %r1
+.LCFI21:
+	copy %sp, %r3
+.LCFI22:
+	stwm %r1, 64(%sp)
+
+	/* Put arguments onto the stack and call ffi_closure_inner.  */
+	stw %arg0, -36(%r3)
+	stw %arg1, -40(%r3)
+	stw %arg2, -44(%r3)
+	stw %arg3, -48(%r3)
+
+	copy %r21, %arg0
+	bl ffi_closure_inner_pa32, %r2
+	copy %r3, %arg1
+
+	ldwm -64(%sp), %r3
+	ldw -20(%sp), %rp
+	ldw -36(%sp), %ret0
+	bv %r0(%r2)
+	ldw -40(%sp), %ret1
+
+	.exit
+	.procend
+.LFE2:
+
+	.section        ".eh_frame",EH_FRAME_FLAGS,@progbits
+.Lframe1:
+	.word   .LECIE1-.LSCIE1 ;# Length of Common Information Entry
+.LSCIE1:
+	.word   0x0     ;# CIE Identifier Tag
+	.byte   0x1     ;# CIE Version
+	.ascii "\0"     ;# CIE Augmentation
+	.uleb128 0x1    ;# CIE Code Alignment Factor
+	.sleb128 4      ;# CIE Data Alignment Factor
+	.byte   0x2     ;# CIE RA Column
+	.byte   0xc     ;# DW_CFA_def_cfa
+	.uleb128 0x1e
+	.uleb128 0x0
+	.align 4
+.LECIE1:
+.LSFDE1:
+	.word   .LEFDE1-.LASFDE1        ;# FDE Length
+.LASFDE1:
+	.word   .LASFDE1-.Lframe1       ;# FDE CIE offset
+	.word   .LFB1   ;# FDE initial location
+	.word   .LFE1-.LFB1     ;# FDE address range
+
+	.byte   0x4     ;# DW_CFA_advance_loc4
+	.word   .LCFI11-.LFB1
+	.byte	0x83	;# DW_CFA_offset, column 0x3
+	.uleb128 0x0
+	.byte   0x11    ;# DW_CFA_offset_extended_sf; save r2 at [r30-20]
+	.uleb128 0x2
+	.sleb128 -5
+
+	.byte   0x4     ;# DW_CFA_advance_loc4
+	.word   .LCFI12-.LCFI11
+	.byte   0xd     ;# DW_CFA_def_cfa_register = r3
+	.uleb128 0x3
+
+	.byte   0x4     ;# DW_CFA_advance_loc4
+	.word   .LCFI13-.LCFI12
+	.byte	0x84	;# DW_CFA_offset, column 0x4
+	.uleb128 0x3
+
+	.align 4
+.LEFDE1:
+
+.LSFDE2:
+	.word   .LEFDE2-.LASFDE2        ;# FDE Length
+.LASFDE2:
+	.word   .LASFDE2-.Lframe1       ;# FDE CIE offset
+	.word   .LFB2   ;# FDE initial location
+	.word   .LFE2-.LFB2     ;# FDE address range
+	.byte   0x4     ;# DW_CFA_advance_loc4
+	.word   .LCFI21-.LFB2
+	.byte   0x83    ;# DW_CFA_offset, column 0x3
+	.uleb128 0x0
+	.byte   0x11    ;# DW_CFA_offset_extended_sf
+	.uleb128 0x2
+	.sleb128 -5
+
+	.byte   0x4     ;# DW_CFA_advance_loc4
+	.word   .LCFI22-.LCFI21
+	.byte   0xd     ;# DW_CFA_def_cfa_register = r3
+	.uleb128 0x3
+
+	.align 4
+.LEFDE2:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix.S
new file mode 100644
index 0000000..213f2db
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix.S
@@ -0,0 +1,328 @@
+/* -----------------------------------------------------------------------
+   aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc.
+   based on darwin.S by John Hornkvist
+
+   PowerPC Assembly glue.
+
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+
+	.set r0,0
+	.set r1,1
+	.set r2,2
+	.set r3,3
+	.set r4,4
+	.set r5,5
+	.set r6,6
+	.set r7,7
+	.set r8,8
+	.set r9,9
+	.set r10,10
+	.set r11,11
+	.set r12,12
+	.set r13,13
+	.set r14,14
+	.set r15,15
+	.set r16,16
+	.set r17,17
+	.set r18,18
+	.set r19,19
+	.set r20,20
+	.set r21,21
+	.set r22,22
+	.set r23,23
+	.set r24,24
+	.set r25,25
+	.set r26,26
+	.set r27,27
+	.set r28,28
+	.set r29,29
+	.set r30,30
+	.set r31,31
+	.set f0,0
+	.set f1,1
+	.set f2,2
+	.set f3,3
+	.set f4,4
+	.set f5,5
+	.set f6,6
+	.set f7,7
+	.set f8,8
+	.set f9,9
+	.set f10,10
+	.set f11,11
+	.set f12,12
+	.set f13,13
+	.set f14,14
+	.set f15,15
+	.set f16,16
+	.set f17,17
+	.set f18,18
+	.set f19,19
+	.set f20,20
+	.set f21,21
+
+	.extern .ffi_prep_args
+
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+#define JUMPTARGET(name) name
+#define L(x) x
+	.file "aix.S"
+	.toc
+
+	/* void ffi_call_AIX(extended_cif *ecif, unsigned long bytes,
+	 *		     unsigned int flags, unsigned int *rvalue,
+	 *		     void (*fn)(),
+	 *		     void (*prep_args)(extended_cif*, unsigned *const));
+	 * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args
+	 */
+
+.csect .text[PR]
+	.align 2
+	.globl ffi_call_AIX
+	.globl .ffi_call_AIX
+.csect ffi_call_AIX[DS]
+ffi_call_AIX:
+#ifdef __64BIT__
+	.llong .ffi_call_AIX, TOC[tc0], 0
+	.csect .text[PR]
+.ffi_call_AIX:
+	/* Save registers we use.  */
+	mflr	r0
+
+	std	r28,-32(r1)
+	std	r29,-24(r1)
+	std	r30,-16(r1)
+	std	r31, -8(r1)
+
+	std	r0, 16(r1)
+	mr	r28, r1		/* our AP.  */
+	stdux	r1, r1, r4
+
+	/* Save arguments over call...  */
+	mr	r31, r5	/* flags, */
+	mr	r30, r6	/* rvalue, */
+	mr	r29, r7	/* function address.  */
+	std	r2, 40(r1)
+
+	/* Call ffi_prep_args.  */
+	mr	r4, r1
+	bl	.ffi_prep_args
+	nop
+
+	/* Now do the call.  */
+	ld	r0, 0(r29)
+	ld	r2, 8(r29)
+	ld	r11, 16(r29)
+	/* Set up cr1 with bits 4-7 of the flags.  */
+	mtcrf	0x40, r31
+	mtctr	r0
+	/* Load all those argument registers.  */
+	// We have set up a nice stack frame, just load it into registers.
+	ld	r3, 40+(1*8)(r1)
+	ld	r4, 40+(2*8)(r1)
+	ld	r5, 40+(3*8)(r1)
+	ld	r6, 40+(4*8)(r1)
+	nop
+	ld	r7, 40+(5*8)(r1)
+	ld	r8, 40+(6*8)(r1)
+	ld	r9, 40+(7*8)(r1)
+	ld	r10,40+(8*8)(r1)
+
+L1:
+	/* Load all the FP registers.  */
+	bf	6,L2 // 2f + 0x18
+	lfd	f1,-32-(13*8)(r28)
+	lfd	f2,-32-(12*8)(r28)
+	lfd	f3,-32-(11*8)(r28)
+	lfd	f4,-32-(10*8)(r28)
+	nop
+	lfd	f5,-32-(9*8)(r28)
+	lfd	f6,-32-(8*8)(r28)
+	lfd	f7,-32-(7*8)(r28)
+	lfd	f8,-32-(6*8)(r28)
+	nop
+	lfd	f9,-32-(5*8)(r28)
+	lfd	f10,-32-(4*8)(r28)
+	lfd	f11,-32-(3*8)(r28)
+	lfd	f12,-32-(2*8)(r28)
+	nop
+	lfd	f13,-32-(1*8)(r28)
+
+L2:
+	/* Make the call.  */
+	bctrl
+	ld	r2, 40(r1)
+
+	/* Now, deal with the return value.  */
+	mtcrf	0x01, r31
+
+	bt	30, L(done_return_value)
+	bt	29, L(fp_return_value)
+	std	r3, 0(r30)
+
+	/* Fall through...  */
+
+L(done_return_value):
+	/* Restore the registers we used and return.  */
+	mr	r1, r28
+	ld	r0, 16(r28)
+	ld	r28, -32(r1)
+	mtlr	r0
+	ld	r29, -24(r1)
+	ld	r30, -16(r1)
+	ld	r31, -8(r1)
+	blr
+
+L(fp_return_value):
+	bf	28, L(float_return_value)
+	stfd	f1, 0(r30)
+	bf	31, L(done_return_value)
+	stfd	f2, 8(r30)
+	b	L(done_return_value)
+L(float_return_value):
+	stfs	f1, 0(r30)
+	b	L(done_return_value)
+
+#else /* ! __64BIT__ */
+	
+	.long .ffi_call_AIX, TOC[tc0], 0
+	.csect .text[PR]
+.ffi_call_AIX:
+	/* Save registers we use.  */
+	mflr	r0
+
+	stw	r28,-16(r1)
+	stw	r29,-12(r1)
+	stw	r30, -8(r1)
+	stw	r31, -4(r1)
+
+	stw	r0, 8(r1)
+	mr	r28, r1		/* out AP.  */
+	stwux	r1, r1, r4
+
+	/* Save arguments over call...  */
+	mr	r31, r5	/* flags, */
+	mr	r30, r6	/* rvalue, */
+	mr	r29, r7	/* function address, */
+	stw	r2, 20(r1)
+
+	/* Call ffi_prep_args.  */
+	mr	r4, r1
+	bl	.ffi_prep_args
+	nop
+
+	/* Now do the call.  */
+	lwz	r0, 0(r29)
+	lwz	r2, 4(r29)
+	lwz	r11, 8(r29)
+	/* Set up cr1 with bits 4-7 of the flags.  */
+	mtcrf	0x40, r31
+	mtctr	r0
+	/* Load all those argument registers.  */
+	// We have set up a nice stack frame, just load it into registers.
+	lwz	r3, 20+(1*4)(r1)
+	lwz	r4, 20+(2*4)(r1)
+	lwz	r5, 20+(3*4)(r1)
+	lwz	r6, 20+(4*4)(r1)
+	nop
+	lwz	r7, 20+(5*4)(r1)
+	lwz	r8, 20+(6*4)(r1)
+	lwz	r9, 20+(7*4)(r1)
+	lwz	r10,20+(8*4)(r1)
+
+L1:
+	/* Load all the FP registers.  */
+	bf	6,L2 // 2f + 0x18
+	lfd	f1,-16-(13*8)(r28)
+	lfd	f2,-16-(12*8)(r28)
+	lfd	f3,-16-(11*8)(r28)
+	lfd	f4,-16-(10*8)(r28)
+	nop
+	lfd	f5,-16-(9*8)(r28)
+	lfd	f6,-16-(8*8)(r28)
+	lfd	f7,-16-(7*8)(r28)
+	lfd	f8,-16-(6*8)(r28)
+	nop
+	lfd	f9,-16-(5*8)(r28)
+	lfd	f10,-16-(4*8)(r28)
+	lfd	f11,-16-(3*8)(r28)
+	lfd	f12,-16-(2*8)(r28)
+	nop
+	lfd	f13,-16-(1*8)(r28)
+
+L2:
+	/* Make the call.  */
+	bctrl
+	lwz	r2, 20(r1)
+
+	/* Now, deal with the return value.  */
+	mtcrf	0x01, r31
+
+	bt	30, L(done_return_value)
+	bt	29, L(fp_return_value)
+	stw	r3, 0(r30)
+	bf	28, L(done_return_value)
+	stw	r4, 4(r30)
+
+	/* Fall through...  */
+
+L(done_return_value):
+	/* Restore the registers we used and return.  */
+	mr	r1, r28
+	lwz	r0, 8(r28)
+	lwz	r28,-16(r1)
+	mtlr	r0
+	lwz	r29,-12(r1)
+	lwz	r30, -8(r1)
+	lwz	r31, -4(r1)
+	blr
+
+L(fp_return_value):
+	bf	28, L(float_return_value)
+	stfd	f1, 0(r30)
+	b	L(done_return_value)
+L(float_return_value):
+	stfs	f1, 0(r30)
+	b	L(done_return_value)
+#endif
+	.long 0
+	.byte 0,0,0,1,128,4,0,0
+//END(ffi_call_AIX)
+
+.csect .text[PR]
+	.align 2
+	.globl ffi_call_DARWIN
+	.globl .ffi_call_DARWIN
+.csect ffi_call_DARWIN[DS]
+ffi_call_DARWIN:
+#ifdef __64BIT__
+	.llong .ffi_call_DARWIN, TOC[tc0], 0
+#else
+	.long .ffi_call_DARWIN, TOC[tc0], 0
+#endif
+	.csect .text[PR]
+.ffi_call_DARWIN:
+	blr
+	.long 0
+	.byte 0,0,0,0,0,0,0,0
+//END(ffi_call_DARWIN)
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix_closure.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix_closure.S
new file mode 100644
index 0000000..c906017
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/aix_closure.S
@@ -0,0 +1,445 @@
+/* -----------------------------------------------------------------------
+   aix_closure.S - Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc.
+   based on darwin_closure.S
+
+   PowerPC Assembly glue.
+
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+
+	.set r0,0
+	.set r1,1
+	.set r2,2
+	.set r3,3
+	.set r4,4
+	.set r5,5
+	.set r6,6
+	.set r7,7
+	.set r8,8
+	.set r9,9
+	.set r10,10
+	.set r11,11
+	.set r12,12
+	.set r13,13
+	.set r14,14
+	.set r15,15
+	.set r16,16
+	.set r17,17
+	.set r18,18
+	.set r19,19
+	.set r20,20
+	.set r21,21
+	.set r22,22
+	.set r23,23
+	.set r24,24
+	.set r25,25
+	.set r26,26
+	.set r27,27
+	.set r28,28
+	.set r29,29
+	.set r30,30
+	.set r31,31
+	.set f0,0
+	.set f1,1
+	.set f2,2
+	.set f3,3
+	.set f4,4
+	.set f5,5
+	.set f6,6
+	.set f7,7
+	.set f8,8
+	.set f9,9
+	.set f10,10
+	.set f11,11
+	.set f12,12
+	.set f13,13
+	.set f14,14
+	.set f15,15
+	.set f16,16
+	.set f17,17
+	.set f18,18
+	.set f19,19
+	.set f20,20
+	.set f21,21
+
+	.extern .ffi_closure_helper_DARWIN
+
+#define LIBFFI_ASM
+#define JUMPTARGET(name) name
+#define L(x) x
+	.file "aix_closure.S"
+	.toc
+LC..60:
+	.tc L..60[TC],L..60
+	.csect .text[PR]
+	.align 2
+
+.csect .text[PR]
+	.align 2
+	.globl ffi_closure_ASM
+	.globl .ffi_closure_ASM
+.csect ffi_closure_ASM[DS]
+ffi_closure_ASM:
+#ifdef __64BIT__
+	.llong .ffi_closure_ASM, TOC[tc0], 0
+	.csect .text[PR]
+.ffi_closure_ASM:
+/* we want to build up an area for the parameters passed */
+/* in registers (both floating point and integer) */
+
+	/* we store gpr 3 to gpr 10 (aligned to 4)
+	in the parents outgoing area  */
+	std   r3, 48+(0*8)(r1)
+	std   r4, 48+(1*8)(r1)
+	std   r5, 48+(2*8)(r1)
+	std   r6, 48+(3*8)(r1)
+	mflr  r0
+
+	std   r7, 48+(4*8)(r1)
+	std   r8, 48+(5*8)(r1)
+	std   r9, 48+(6*8)(r1)
+	std   r10, 48+(7*8)(r1)
+	std   r0, 16(r1)	/* save the return address */
+
+
+	/* 48  Bytes (Linkage Area) */
+	/* 64  Bytes (params) */
+	/* 16  Bytes (result) */
+	/* 104 Bytes (13*8 from FPR) */
+	/* 8   Bytes (alignment) */
+	/* 240 Bytes */
+
+	stdu  r1, -240(r1)	/* skip over caller save area
+				   keep stack aligned to 16  */
+
+	/* next save fpr 1 to fpr 13 (aligned to 8) */
+	stfd  f1, 128+(0*8)(r1)
+	stfd  f2, 128+(1*8)(r1)
+	stfd  f3, 128+(2*8)(r1)
+	stfd  f4, 128+(3*8)(r1)
+	stfd  f5, 128+(4*8)(r1)
+	stfd  f6, 128+(5*8)(r1)
+	stfd  f7, 128+(6*8)(r1)
+	stfd  f8, 128+(7*8)(r1)
+	stfd  f9, 128+(8*8)(r1)
+	stfd  f10, 128+(9*8)(r1)
+	stfd  f11, 128+(10*8)(r1)
+	stfd  f12, 128+(11*8)(r1)
+	stfd  f13, 128+(12*8)(r1)
+
+	/* set up registers for the routine that actually does the work */
+	/* get the context pointer from the trampoline */
+	mr r3, r11
+
+	/* now load up the pointer to the result storage */
+	addi r4, r1, 112
+
+	/* now load up the pointer to the saved gpr registers */
+	addi r5, r1, 288
+
+	/* now load up the pointer to the saved fpr registers */
+	addi r6, r1, 128
+
+	/* make the call */
+	bl .ffi_closure_helper_DARWIN
+	nop
+
+	/* now r3 contains the return type */
+	/* so use it to look up in a table */
+	/* so we know how to deal with each type */
+
+	/* look up the proper starting point in table  */
+	/* by using return type as offset */
+	ld	r4, LC..60(2)	/* get address of jump table */
+	sldi	r3, r3, 4	/* now multiply return type by 16 */
+	ld	r0, 240+16(r1)	/* load return address */
+	add	r3, r3, r4	/* add contents of table to table address */
+	mtctr	r3
+	bctr			/* jump to it */
+
+/* Each fragment must be exactly 16 bytes long (4 instructions).
+   Align to 16 byte boundary for cache and dispatch efficiency.  */
+	.align 4
+
+L..60:
+/* case FFI_TYPE_VOID */
+	mtlr r0
+	addi r1, r1, 240
+	blr
+	nop
+
+/* case FFI_TYPE_INT */
+	lwa r3, 112+4(r1)
+	mtlr r0
+	addi r1, r1, 240
+	blr
+
+/* case FFI_TYPE_FLOAT */
+	lfs f1, 112+0(r1)
+	mtlr r0
+	addi r1, r1, 240
+	blr
+
+/* case FFI_TYPE_DOUBLE */
+	lfd f1, 112+0(r1)
+	mtlr r0
+	addi r1, r1, 240
+	blr
+
+/* case FFI_TYPE_LONGDOUBLE */
+	lfd f1, 112+0(r1)
+	mtlr r0
+	lfd f2, 112+8(r1)
+	b L..finish
+
+/* case FFI_TYPE_UINT8 */
+	lbz r3, 112+7(r1)
+	mtlr r0
+	addi r1, r1, 240
+	blr
+
+/* case FFI_TYPE_SINT8 */
+	lbz r3, 112+7(r1)
+	mtlr r0
+	extsb r3, r3
+	b L..finish
+
+/* case FFI_TYPE_UINT16 */
+	lhz r3, 112+6(r1)
+	mtlr r0
+L..finish:
+	addi r1, r1, 240
+	blr
+
+/* case FFI_TYPE_SINT16 */
+	lha r3, 112+6(r1)
+	mtlr r0
+	addi r1, r1, 240
+	blr
+
+/* case FFI_TYPE_UINT32 */
+	lwz r3, 112+4(r1)
+	mtlr r0
+	addi r1, r1, 240
+	blr
+
+/* case FFI_TYPE_SINT32 */
+	lwa r3, 112+4(r1)
+	mtlr r0
+	addi r1, r1, 240
+	blr
+
+/* case FFI_TYPE_UINT64 */
+	ld r3, 112+0(r1)
+	mtlr r0
+	addi r1, r1, 240
+	blr
+
+/* case FFI_TYPE_SINT64 */
+	ld r3, 112+0(r1)
+	mtlr r0
+	addi r1, r1, 240
+	blr
+
+/* case FFI_TYPE_STRUCT */
+	mtlr r0
+	addi r1, r1, 240
+	blr
+	nop
+
+/* case FFI_TYPE_POINTER */
+	ld r3, 112+0(r1)
+	mtlr r0
+	addi r1, r1, 240
+	blr
+
+#else /* ! __64BIT__ */
+	
+	.long .ffi_closure_ASM, TOC[tc0], 0
+	.csect .text[PR]
+.ffi_closure_ASM:
+/* we want to build up an area for the parameters passed */
+/* in registers (both floating point and integer) */
+
+	/* we store gpr 3 to gpr 10 (aligned to 4)
+	in the parents outgoing area  */
+	stw   r3, 24+(0*4)(r1)
+	stw   r4, 24+(1*4)(r1)
+	stw   r5, 24+(2*4)(r1)
+	stw   r6, 24+(3*4)(r1)
+	mflr  r0
+
+	stw   r7, 24+(4*4)(r1)
+	stw   r8, 24+(5*4)(r1)
+	stw   r9, 24+(6*4)(r1)
+	stw   r10, 24+(7*4)(r1)
+	stw   r0, 8(r1)
+
+	/* 24 Bytes (Linkage Area) */
+	/* 32 Bytes (params) */
+	/* 16  Bytes (result) */
+	/* 104 Bytes (13*8 from FPR) */
+	/* 176 Bytes */
+
+	stwu  r1, -176(r1)	/* skip over caller save area
+				   keep stack aligned to 16  */
+
+	/* next save fpr 1 to fpr 13 (aligned to 8) */
+	stfd  f1, 72+(0*8)(r1)
+	stfd  f2, 72+(1*8)(r1)
+	stfd  f3, 72+(2*8)(r1)
+	stfd  f4, 72+(3*8)(r1)
+	stfd  f5, 72+(4*8)(r1)
+	stfd  f6, 72+(5*8)(r1)
+	stfd  f7, 72+(6*8)(r1)
+	stfd  f8, 72+(7*8)(r1)
+	stfd  f9, 72+(8*8)(r1)
+	stfd  f10, 72+(9*8)(r1)
+	stfd  f11, 72+(10*8)(r1)
+	stfd  f12, 72+(11*8)(r1)
+	stfd  f13, 72+(12*8)(r1)
+
+	/* set up registers for the routine that actually does the work */
+	/* get the context pointer from the trampoline */
+	mr r3, r11
+
+	/* now load up the pointer to the result storage */
+	addi r4, r1, 56
+
+	/* now load up the pointer to the saved gpr registers */
+	addi r5, r1, 200
+
+	/* now load up the pointer to the saved fpr registers */
+	addi r6, r1, 72
+
+	/* make the call */
+	bl .ffi_closure_helper_DARWIN
+	nop
+
+	/* now r3 contains the return type */
+	/* so use it to look up in a table */
+	/* so we know how to deal with each type */
+
+	/* look up the proper starting point in table  */
+	/* by using return type as offset */
+	lwz	r4, LC..60(2)	/* get address of jump table */
+	slwi	r3, r3, 4	/* now multiply return type by 4 */
+	lwz	r0, 176+8(r1)	/* load return address */
+	add	r3, r3, r4	/* add contents of table to table address */
+	mtctr	r3
+	bctr			/* jump to it */
+
+/* Each fragment must be exactly 16 bytes long (4 instructions).
+   Align to 16 byte boundary for cache and dispatch efficiency.  */
+	.align 4
+
+L..60:
+/* case FFI_TYPE_VOID */
+	mtlr r0
+	addi r1, r1, 176
+	blr
+	nop
+
+/* case FFI_TYPE_INT */
+	lwz r3, 56+0(r1)
+	mtlr r0
+	addi r1, r1, 176
+	blr
+
+/* case FFI_TYPE_FLOAT */
+	lfs f1, 56+0(r1)
+	mtlr r0
+	addi r1, r1, 176
+	blr
+
+/* case FFI_TYPE_DOUBLE */
+	lfd f1, 56+0(r1)
+	mtlr r0
+	addi r1, r1, 176
+	blr
+
+/* case FFI_TYPE_LONGDOUBLE */
+	lfd f1, 56+0(r1)
+	mtlr r0
+	lfd f2, 56+8(r1)
+	b L..finish
+
+/* case FFI_TYPE_UINT8 */
+	lbz r3, 56+3(r1)
+	mtlr r0
+	addi r1, r1, 176
+	blr
+
+/* case FFI_TYPE_SINT8 */
+	lbz r3, 56+3(r1)
+	mtlr r0
+	extsb r3, r3
+	b L..finish
+
+/* case FFI_TYPE_UINT16 */
+	lhz r3, 56+2(r1)
+	mtlr r0
+	addi r1, r1, 176
+	blr
+
+/* case FFI_TYPE_SINT16 */
+	lha r3, 56+2(r1)
+	mtlr r0
+	addi r1, r1, 176
+	blr
+
+/* case FFI_TYPE_UINT32 */
+	lwz r3, 56+0(r1)
+	mtlr r0
+	addi r1, r1, 176
+	blr
+
+/* case FFI_TYPE_SINT32 */
+	lwz r3, 56+0(r1)
+	mtlr r0
+	addi r1, r1, 176
+	blr
+
+/* case FFI_TYPE_UINT64 */
+	lwz r3, 56+0(r1)
+	mtlr r0
+	lwz r4, 56+4(r1)
+	b L..finish
+
+/* case FFI_TYPE_SINT64 */
+	lwz r3, 56+0(r1)
+	mtlr r0
+	lwz r4, 56+4(r1)
+	b L..finish
+
+/* case FFI_TYPE_STRUCT */
+	mtlr r0
+	addi r1, r1, 176
+	blr
+	nop
+
+/* case FFI_TYPE_POINTER */
+	lwz r3, 56+0(r1)
+	mtlr r0
+L..finish:
+	addi r1, r1, 176
+	blr
+#endif
+/* END(ffi_closure_ASM) */
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/asm.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/asm.h
new file mode 100644
index 0000000..994f62d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/asm.h
@@ -0,0 +1,125 @@
+/* -----------------------------------------------------------------------
+   asm.h - Copyright (c) 1998 Geoffrey Keating
+
+   PowerPC Assembly glue.
+
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+
+#define ASM_GLOBAL_DIRECTIVE .globl
+
+
+#define C_SYMBOL_NAME(name) name
+/* Macro for a label.  */
+#ifdef	__STDC__
+#define C_LABEL(name)		name##:
+#else
+#define C_LABEL(name)		name/**/:
+#endif
+
+/* This seems to always be the case on PPC.  */
+#define ALIGNARG(log2) log2
+/* For ELF we need the `.type' directive to make shared libs work right.  */
+#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg;
+#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+
+/* If compiled for profiling, call `_mcount' at the start of each function.  */
+#ifdef	PROF
+/* The mcount code relies on the return address being on the stack
+   to locate our caller and so it can restore it; so store one just
+   for its benefit.  */
+#ifdef PIC
+#define CALL_MCOUNT							      \
+  .pushsection;								      \
+  .section ".data";							      \
+  .align ALIGNARG(2);							      \
+0:.long 0;								      \
+  .previous;								      \
+  mflr  %r0;								      \
+  stw   %r0,4(%r1);							      \
+  bl    _GLOBAL_OFFSET_TABLE_@local-4;					      \
+  mflr  %r11;								      \
+  lwz   %r0,0b@got(%r11);						      \
+  bl    JUMPTARGET(_mcount);
+#else  /* PIC */
+#define CALL_MCOUNT							      \
+  .section ".data";							      \
+  .align ALIGNARG(2);							      \
+0:.long 0;								      \
+  .previous;								      \
+  mflr  %r0;								      \
+  lis   %r11,0b@ha;							      \
+  stw   %r0,4(%r1);							      \
+  addi  %r0,%r11,0b@l;							      \
+  bl    JUMPTARGET(_mcount);
+#endif /* PIC */
+#else  /* PROF */
+#define CALL_MCOUNT		/* Do nothing.  */
+#endif /* PROF */
+
+#define	ENTRY(name)							      \
+  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
+  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
+  .align ALIGNARG(2);							      \
+  C_LABEL(name)								      \
+  CALL_MCOUNT
+
+#define EALIGN_W_0  /* No words to insert.  */
+#define EALIGN_W_1  nop
+#define EALIGN_W_2  nop;nop
+#define EALIGN_W_3  nop;nop;nop
+#define EALIGN_W_4  EALIGN_W_3;nop
+#define EALIGN_W_5  EALIGN_W_4;nop
+#define EALIGN_W_6  EALIGN_W_5;nop
+#define EALIGN_W_7  EALIGN_W_6;nop
+
+/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
+   past a 2^align boundary.  */
+#ifdef PROF
+#define EALIGN(name, alignt, words)					      \
+  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
+  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
+  .align ALIGNARG(2);							      \
+  C_LABEL(name)								      \
+  CALL_MCOUNT								      \
+  b 0f;									      \
+  .align ALIGNARG(alignt);						      \
+  EALIGN_W_##words;							      \
+  0:
+#else /* PROF */
+#define EALIGN(name, alignt, words)					      \
+  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
+  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
+  .align ALIGNARG(alignt);						      \
+  EALIGN_W_##words;							      \
+  C_LABEL(name)
+#endif
+
+#define END(name)							      \
+  ASM_SIZE_DIRECTIVE(name)
+
+#ifdef PIC
+#define JUMPTARGET(name) name##@plt
+#else
+#define JUMPTARGET(name) name
+#endif
+
+/* Local labels stripped out by the linker.  */
+#define L(x) .L##x
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin.S
new file mode 100644
index 0000000..4f987dc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin.S
@@ -0,0 +1,383 @@
+/* -----------------------------------------------------------------------
+   darwin.S - Copyright (c) 2000 John Hornkvist
+	      Copyright (c) 2004, 2010 Free Software Foundation, Inc.
+
+   PowerPC Assembly glue.
+
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM
+#if defined(__ppc64__)
+#define MODE_CHOICE(x, y) y
+#else
+#define MODE_CHOICE(x, y) x
+#endif
+
+#define machine_choice	MODE_CHOICE(ppc7400,ppc64)
+
+; Define some pseudo-opcodes for size-independent load & store of GPRs ...
+#define lgu		MODE_CHOICE(lwzu, ldu)
+#define lg		MODE_CHOICE(lwz,ld)
+#define sg		MODE_CHOICE(stw,std)
+#define sgu		MODE_CHOICE(stwu,stdu)
+#define sgux		MODE_CHOICE(stwux,stdux)
+
+; ... and the size of GPRs and their storage indicator.
+#define GPR_BYTES	MODE_CHOICE(4,8)
+#define LOG2_GPR_BYTES	MODE_CHOICE(2,3)	/* log2(GPR_BYTES) */
+#define g_long		MODE_CHOICE(long, quad)	/* usage is ".g_long" */
+
+; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04.
+#define LINKAGE_SIZE	MODE_CHOICE(24,48)
+#define PARAM_AREA	MODE_CHOICE(32,64)
+#define SAVED_LR_OFFSET	MODE_CHOICE(8,16)	/* save position for lr */
+
+/* If there is any FP stuff we make space for all of the regs.  */
+#define SAVED_FPR_COUNT 13
+#define FPR_SIZE	8
+#define RESULT_BYTES	16
+
+/* This should be kept in step with the same value in ffi_darwin.c.  */
+#define ASM_NEEDS_REGISTERS 4
+#define SAVE_REGS_SIZE (ASM_NEEDS_REGISTERS * GPR_BYTES)
+
+#include <fficonfig.h>
+#include <ffi.h>
+
+#define JUMPTARGET(name) name
+#define L(x) x
+
+	.text
+	.align 2
+	.globl _ffi_prep_args
+
+	.align 2
+	.globl _ffi_call_DARWIN
+
+	/* We arrive here with:
+	   r3 = ptr to extended cif.
+	   r4 = -bytes.
+	   r5 = cif flags.
+	   r6 = ptr to return value.
+	   r7 = fn pointer (user func).
+	   r8 = fn pointer (ffi_prep_args).
+	   r9 = ffi_type* for the ret val.  */
+
+_ffi_call_DARWIN:
+Lstartcode:
+	mr   	r12,r8	/* We only need r12 until the call,
+			   so it does not have to be saved.  */
+LFB1:
+	/* Save the old stack pointer as AP.  */
+	mr	r8,r1
+LCFI0:
+	
+	/* Save the retval type in parents frame.  */
+	sg	r9,(LINKAGE_SIZE+6*GPR_BYTES)(r8)
+
+	/* Allocate the stack space we need.  */
+	sgux	r1,r1,r4
+
+	/* Save registers we use.  */
+	mflr	r9
+	sg	r9,SAVED_LR_OFFSET(r8)
+
+	sg	r28,-(4 * GPR_BYTES)(r8)	
+	sg	r29,-(3 * GPR_BYTES)(r8)
+	sg	r30,-(2 * GPR_BYTES)(r8)
+	sg	r31,-(    GPR_BYTES)(r8)
+
+#if !defined(POWERPC_DARWIN)
+	/* The TOC slot is reserved in the Darwin ABI and r2 is volatile.  */
+	sg	r2,(5 * GPR_BYTES)(r1)
+#endif
+
+LCFI1:
+
+	/* Save arguments over call.  */
+	mr	r31,r5	/* flags,  */
+	mr	r30,r6	/* rvalue,  */
+	mr	r29,r7	/* function address,  */
+	mr	r28,r8	/* our AP.  */
+LCFI2:
+	/* Call ffi_prep_args. r3 = extended cif, r4 = stack ptr copy.  */
+	mr	r4,r1
+	li	r9,0
+
+	mtctr	r12 /* r12 holds address of _ffi_prep_args.  */
+	bctrl
+
+#if !defined(POWERPC_DARWIN)
+	/* The TOC slot is reserved in the Darwin ABI and r2 is volatile.  */
+	lg     r2,(5 * GPR_BYTES)(r1)
+#endif
+	/* Now do the call.
+	   Set up cr1 with bits 4-7 of the flags.  */
+	mtcrf	0x40,r31
+	/* Get the address to call into CTR.  */
+	mtctr	r29
+	/* Load all those argument registers.
+	   We have set up a nice stack frame, just load it into registers.  */
+	lg     r3, (LINKAGE_SIZE                )(r1)
+	lg     r4, (LINKAGE_SIZE +     GPR_BYTES)(r1)
+	lg     r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r1)
+	lg     r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r1)
+	nop
+	lg     r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r1)
+	lg     r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r1)
+	lg     r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r1)
+	lg     r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r1)
+
+L1:
+	/* ... Load all the FP registers.  */
+	bf	6,L2	/* No floats to load.  */
+	lfd	f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28)
+	lfd	f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28)
+	lfd	f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28)
+	lfd	f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28)
+	nop
+	lfd	f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28)
+	lfd	f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28)
+	lfd	f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28)
+	lfd	f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28)
+	nop
+	lfd     f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28)
+	lfd     f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28)
+	lfd     f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28)
+	lfd     f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28)
+	nop
+	lfd     f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28)
+
+L2:
+	mr	r12,r29	/* Put the target address in r12 as specified.  */
+	mtctr  	r12
+	nop
+	nop
+
+	/* Make the call.  */
+	bctrl
+
+	/* Now, deal with the return value.  */
+
+	/* m64 structure returns can occupy the same set of registers as
+	   would be used to pass such a structure as arg0 - so take care 
+	   not to step on any possibly hot regs.  */
+
+	/* Get the flags.. */
+	mtcrf	0x03,r31 ; we need c6 & cr7 now.
+	; FLAG_RETURNS_NOTHING also covers struct ret-by-ref.
+	bt	30,L(done_return_value)	  ; FLAG_RETURNS_NOTHING
+	bf	27,L(scalar_return_value) ; not FLAG_RETURNS_STRUCT
+	
+	/* OK, so we have a struct.  */
+#if defined(__ppc64__)
+	bt	31,L(maybe_return_128) ; FLAG_RETURNS_128BITS, special case 
+
+	/* OK, we have to map the return back to a mem struct.
+	   We are about to trample the parents param area, so recover the
+	   return type.  r29 is free, since the call is done.  */
+	lg	r29,(LINKAGE_SIZE + 6 * GPR_BYTES)(r28)
+
+	sg	r3, (LINKAGE_SIZE                )(r28)
+	sg	r4, (LINKAGE_SIZE +     GPR_BYTES)(r28)
+	sg	r5, (LINKAGE_SIZE + 2 * GPR_BYTES)(r28)
+	sg	r6, (LINKAGE_SIZE + 3 * GPR_BYTES)(r28)
+	nop
+	sg	r7, (LINKAGE_SIZE + 4 * GPR_BYTES)(r28)
+	sg	r8, (LINKAGE_SIZE + 5 * GPR_BYTES)(r28)
+	sg	r9, (LINKAGE_SIZE + 6 * GPR_BYTES)(r28)
+	sg	r10,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28)
+	/* OK, so do the block move - we trust that memcpy will not trample
+	   the fprs...  */
+	mr 	r3,r30 ; dest
+	addi	r4,r28,LINKAGE_SIZE ; source
+	/* The size is a size_t, should be long.  */
+	lg	r5,0(r29)
+	/* Figure out small structs */
+	cmpi	0,r5,4
+	bgt	L3	; 1, 2 and 4 bytes have special rules.
+	cmpi	0,r5,3
+	beq	L3	; not 3
+	addi	r4,r4,8
+	subf	r4,r5,r4
+L3:
+	bl	_memcpy
+	
+	/* ... do we need the FP registers? - recover the flags.. */
+	mtcrf	0x03,r31 ; we need c6 & cr7 now.
+	bf	29,L(done_return_value)	/* No floats in the struct.  */
+	stfd	f1, -SAVE_REGS_SIZE-(13*FPR_SIZE)(r28)
+	stfd	f2, -SAVE_REGS_SIZE-(12*FPR_SIZE)(r28)
+	stfd	f3, -SAVE_REGS_SIZE-(11*FPR_SIZE)(r28)
+	stfd	f4, -SAVE_REGS_SIZE-(10*FPR_SIZE)(r28)
+	nop
+	stfd	f5, -SAVE_REGS_SIZE-( 9*FPR_SIZE)(r28)
+	stfd	f6, -SAVE_REGS_SIZE-( 8*FPR_SIZE)(r28)
+	stfd	f7, -SAVE_REGS_SIZE-( 7*FPR_SIZE)(r28)
+	stfd	f8, -SAVE_REGS_SIZE-( 6*FPR_SIZE)(r28)
+	nop
+	stfd	f9, -SAVE_REGS_SIZE-( 5*FPR_SIZE)(r28)
+	stfd	f10,-SAVE_REGS_SIZE-( 4*FPR_SIZE)(r28)
+	stfd	f11,-SAVE_REGS_SIZE-( 3*FPR_SIZE)(r28)
+	stfd	f12,-SAVE_REGS_SIZE-( 2*FPR_SIZE)(r28)
+	nop
+	stfd	f13,-SAVE_REGS_SIZE-( 1*FPR_SIZE)(r28)
+
+	mr	r3,r29	; ffi_type *
+	mr	r4,r30	; dest
+	addi	r5,r28,-SAVE_REGS_SIZE-(13*FPR_SIZE) ; fprs
+	xor	r6,r6,r6
+	sg	r6,(LINKAGE_SIZE + 7 * GPR_BYTES)(r28)
+	addi	r6,r28,(LINKAGE_SIZE + 7 * GPR_BYTES) ; point to a zeroed counter.
+	bl 	_darwin64_struct_floats_to_mem
+
+	b L(done_return_value)
+#else
+	stw	r3,0(r30) ; m32 the only struct return in reg is 4 bytes.
+#endif
+	b L(done_return_value)
+
+L(fp_return_value):
+	/* Do we have long double to store?  */
+	bf	31,L(fd_return_value) ; FLAG_RETURNS_128BITS
+	stfd	f1,0(r30)
+	stfd	f2,FPR_SIZE(r30)
+	b	L(done_return_value)
+
+L(fd_return_value):
+	/* Do we have double to store?  */
+	bf	28,L(float_return_value)
+	stfd	f1,0(r30)
+	b	L(done_return_value)
+
+L(float_return_value):
+	/* We only have a float to store.  */
+	stfs	f1,0(r30)
+	b	L(done_return_value)
+
+L(scalar_return_value):
+	bt	29,L(fp_return_value)	; FLAG_RETURNS_FP
+	; ffi_arg is defined as unsigned long. 
+	sg	r3,0(r30)		; Save the reg.
+	bf	28,L(done_return_value) ; not FLAG_RETURNS_64BITS 
+
+#if defined(__ppc64__)
+L(maybe_return_128):
+	std	r3,0(r30)
+	bf	31,L(done_return_value) ; not FLAG_RETURNS_128BITS 
+	std	r4,8(r30)
+#else
+	stw	r4,4(r30)
+#endif
+
+	/* Fall through.  */
+	/* We want this at the end to simplify eh epilog computation.  */
+
+L(done_return_value):
+	/* Restore the registers we used and return.  */
+	lg	r29,SAVED_LR_OFFSET(r28)
+	; epilog
+	lg	r31,-(1 * GPR_BYTES)(r28)
+	mtlr	r29
+	lg	r30,-(2 * GPR_BYTES)(r28)
+	lg	r29,-(3 * GPR_BYTES)(r28)
+	lg	r28,-(4 * GPR_BYTES)(r28)
+	lg	r1,0(r1)
+	blr
+LFE1:
+	.align	1
+/* END(_ffi_call_DARWIN)  */
+
+/* Provide a null definition of _ffi_call_AIX.  */
+	.text
+	.globl _ffi_call_AIX
+	.align 2
+_ffi_call_AIX:
+	blr
+/* END(_ffi_call_AIX)  */
+
+/* EH stuff.  */
+
+#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78)
+
+	.static_data
+	.align LOG2_GPR_BYTES
+LLFB0$non_lazy_ptr:
+	.g_long Lstartcode
+
+	.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
+EH_frame1:
+	.set	L$set$0,LECIE1-LSCIE1
+	.long	L$set$0	; Length of Common Information Entry
+LSCIE1:
+	.long	0x0	; CIE Identifier Tag
+	.byte	0x1	; CIE Version
+	.ascii	"zR\0"	; CIE Augmentation
+	.byte	0x1	; uleb128 0x1; CIE Code Alignment Factor
+	.byte	EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor
+	.byte	0x41	; CIE RA Column
+	.byte	0x1	; uleb128 0x1; Augmentation size
+	.byte	0x10	; FDE Encoding (indirect pcrel)
+	.byte	0xc	; DW_CFA_def_cfa
+	.byte	0x1	; uleb128 0x1
+	.byte	0x0	; uleb128 0x0
+	.align	LOG2_GPR_BYTES
+LECIE1:
+
+	.globl _ffi_call_DARWIN.eh
+_ffi_call_DARWIN.eh:
+LSFDE1:
+	.set	L$set$1,LEFDE1-LASFDE1
+	.long	L$set$1	; FDE Length
+LASFDE1:
+	.long	LASFDE1-EH_frame1 ; FDE CIE offset
+	.g_long	LLFB0$non_lazy_ptr-.	; FDE initial location
+	.set	L$set$3,LFE1-Lstartcode
+	.g_long	L$set$3	; FDE address range
+	.byte   0x0     ; uleb128 0x0; Augmentation size
+	.byte	0x4	; DW_CFA_advance_loc4
+	.set	L$set$4,LCFI0-Lstartcode
+	.long	L$set$4
+	.byte	0xd	; DW_CFA_def_cfa_register
+	.byte	0x08	; uleb128 0x08
+	.byte	0x4	; DW_CFA_advance_loc4
+	.set	L$set$5,LCFI1-LCFI0
+	.long	L$set$5
+	.byte   0x11    ; DW_CFA_offset_extended_sf
+	.byte	0x41	; uleb128 0x41
+	.byte   0x7e    ; sleb128 -2
+	.byte	0x9f	; DW_CFA_offset, column 0x1f
+	.byte	0x1	; uleb128 0x1
+	.byte	0x9e	; DW_CFA_offset, column 0x1e
+	.byte	0x2	; uleb128 0x2
+	.byte	0x9d	; DW_CFA_offset, column 0x1d
+	.byte	0x3	; uleb128 0x3
+	.byte	0x9c	; DW_CFA_offset, column 0x1c
+	.byte	0x4	; uleb128 0x4
+	.byte	0x4	; DW_CFA_advance_loc4
+	.set	L$set$6,LCFI2-LCFI1
+	.long	L$set$6
+	.byte	0xd	; DW_CFA_def_cfa_register
+	.byte	0x1c	; uleb128 0x1c
+	.align LOG2_GPR_BYTES
+LEFDE1:
+	.align 1
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin_closure.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin_closure.S
new file mode 100644
index 0000000..db20cf6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/darwin_closure.S
@@ -0,0 +1,575 @@
+/* -----------------------------------------------------------------------
+   darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010, 
+   Free Software Foundation, Inc. 
+   based on ppc_closure.S
+
+   PowerPC Assembly glue.
+
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM
+#define L(x) x
+
+#if defined(__ppc64__)
+#define MODE_CHOICE(x, y) y
+#else
+#define MODE_CHOICE(x, y) x
+#endif
+
+#define machine_choice	MODE_CHOICE(ppc7400,ppc64)
+
+; Define some pseudo-opcodes for size-independent load & store of GPRs ...
+#define lgu		MODE_CHOICE(lwzu, ldu)
+#define lg		MODE_CHOICE(lwz,ld)
+#define sg		MODE_CHOICE(stw,std)
+#define sgu		MODE_CHOICE(stwu,stdu)
+
+; ... and the size of GPRs and their storage indicator.
+#define GPR_BYTES	MODE_CHOICE(4,8)
+#define LOG2_GPR_BYTES	MODE_CHOICE(2,3)	/* log2(GPR_BYTES) */
+#define g_long		MODE_CHOICE(long, quad)	/* usage is ".g_long" */
+
+; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04.
+#define LINKAGE_SIZE	MODE_CHOICE(24,48)
+#define PARAM_AREA	MODE_CHOICE(32,64)
+
+#define SAVED_CR_OFFSET	MODE_CHOICE(4,8)	/* save position for CR */
+#define SAVED_LR_OFFSET	MODE_CHOICE(8,16)	/* save position for lr */
+
+/* WARNING: if ffi_type is changed... here be monsters.  
+   Offsets of items within the result type.  */
+#define FFI_TYPE_TYPE	MODE_CHOICE(6,10)
+#define FFI_TYPE_ELEM	MODE_CHOICE(8,16)
+
+#define SAVED_FPR_COUNT 13
+#define FPR_SIZE	8
+/* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */
+#define RESULT_BYTES	MODE_CHOICE(16,176)
+
+; The whole stack frame **MUST** be 16byte-aligned.
+#define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL)
+#define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES))
+
+#define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE)
+#define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA)
+
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
+; We no longer need the pic symbol stub for Darwin >= 9.
+#define BLCLS_HELP _ffi_closure_helper_DARWIN
+#define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p
+#define PASS_STR_FLOATS _darwin64_pass_struct_floats
+#undef WANT_STUB
+#else
+#define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub
+#define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub
+#define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub
+#define WANT_STUB
+#endif
+
+/* m32/m64
+
+   The stack layout looks like this:
+
+   |   Additional params...			| |     Higher address
+   ~						~ ~
+   |   Parameters      (at least 8*4/8=32/64)	| | NUM_GPR_ARG_REGISTERS
+   |--------------------------------------------| |
+   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
+   |--------------------------------------------| |
+   |   Reserved                       2*4/8	| |
+   |--------------------------------------------| |
+   |   Space for callee`s LR		4/8	| |
+   |--------------------------------------------| |
+   |   Saved CR [low word for m64]      4/8	| |
+   |--------------------------------------------| |
+   |   Current backchain pointer	4/8	|-/ Parent`s frame.
+   |--------------------------------------------| <+ <<< on entry to
+   |   Result Bytes		       16/176	| |
+   |--------------------------------------------| |
+   ~   padding to 16-byte alignment		~ ~
+   |--------------------------------------------| |
+   |   NUM_FPR_ARG_REGISTERS slots		| |
+   |   here fp13 .. fp1		       13*8	| |
+   |--------------------------------------------| |
+   |   R3..R10			  8*4/8=32/64	| | NUM_GPR_ARG_REGISTERS
+   |--------------------------------------------| |
+   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
+   |--------------------------------------------| |	stack	|
+   |   Reserved [compiler,binder]     2*4/8	| |	grows	|
+   |--------------------------------------------| |	down	V
+   |   Space for callees LR		4/8	| |
+   |--------------------------------------------| |	lower addresses
+   |   Saved CR [low word for m64]      4/8	| |
+   |--------------------------------------------| |     stack pointer here
+   |   Current backchain pointer	4/8	|-/	during
+   |--------------------------------------------|   <<<	call.
+
+*/
+
+	.file	"darwin_closure.S"
+
+	.machine machine_choice
+
+	.text
+	.globl _ffi_closure_ASM
+	.align LOG2_GPR_BYTES
+_ffi_closure_ASM:
+LFB1:
+Lstartcode:
+	mflr	r0			/* extract return address  */
+	sg	r0,SAVED_LR_OFFSET(r1)	/* save the return address  */
+LCFI0:
+	sgu	r1,-SAVE_SIZE(r1)	/* skip over caller save area
+					keep stack aligned to 16.  */
+LCFI1:
+	/* We want to build up an area for the parameters passed
+	   in registers. (both floating point and integer)  */
+
+	/* Put gpr 3 to gpr 10 in the parents outgoing area...
+	   ... the remainder of any params that overflowed the regs will
+	   follow here.  */
+	sg	r3, (PARENT_PARM_BASE                )(r1)
+	sg	r4, (PARENT_PARM_BASE + GPR_BYTES    )(r1)
+	sg	r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1)
+	sg	r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1)
+	sg	r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1)
+	sg	r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1)
+	sg	r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1)
+	sg	r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1)
+
+	/* We save fpr 1 to fpr 14 in our own save frame.  */
+	stfd	f1, (FP_SAVE_BASE                 )(r1)
+	stfd	f2, (FP_SAVE_BASE +  FPR_SIZE     )(r1)
+	stfd	f3, (FP_SAVE_BASE +  FPR_SIZE * 2 )(r1)
+	stfd	f4, (FP_SAVE_BASE +  FPR_SIZE * 3 )(r1)
+	stfd	f5, (FP_SAVE_BASE +  FPR_SIZE * 4 )(r1)
+	stfd	f6, (FP_SAVE_BASE +  FPR_SIZE * 5 )(r1)
+	stfd	f7, (FP_SAVE_BASE +  FPR_SIZE * 6 )(r1)
+	stfd	f8, (FP_SAVE_BASE +  FPR_SIZE * 7 )(r1)
+	stfd	f9, (FP_SAVE_BASE +  FPR_SIZE * 8 )(r1)
+	stfd	f10,(FP_SAVE_BASE +  FPR_SIZE * 9 )(r1)
+	stfd	f11,(FP_SAVE_BASE +  FPR_SIZE * 10)(r1)
+	stfd	f12,(FP_SAVE_BASE +  FPR_SIZE * 11)(r1)
+	stfd	f13,(FP_SAVE_BASE +  FPR_SIZE * 12)(r1)
+
+	/* Set up registers for the routine that actually does the work
+	   get the context pointer from the trampoline.  */
+	mr	r3,r11
+
+	/* Now load up the pointer to the result storage.  */
+	addi	r4,r1,(SAVE_SIZE-RESULT_BYTES)
+
+	/* Now load up the pointer to the saved gpr registers.  */
+	addi	r5,r1,PARENT_PARM_BASE
+
+	/* Now load up the pointer to the saved fpr registers.  */
+	addi	r6,r1,FP_SAVE_BASE
+
+	/* Make the call.  */
+	bl	BLCLS_HELP
+
+	/* r3 contains the rtype pointer... save it since we will need
+	   it later.  */
+	sg	r3,LINKAGE_SIZE(r1)	; ffi_type * result_type
+	lg	r0,0(r3)		; size => r0
+	lhz	r3,FFI_TYPE_TYPE(r3)	; type => r3
+
+	/* The helper will have intercepted struture returns and inserted
+	   the caller`s destination address for structs returned by ref.  */
+
+	/* r3 contains the return type  so use it to look up in a table
+	   so we know how to deal with each type.  */
+
+	addi	r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here.  */
+	bl	Lget_ret_type0_addr	/* Get pointer to Lret_type0 into LR.  */
+	mflr	r4			/* Move to r4.  */
+	slwi	r3,r3,4			/* Now multiply return type by 16.  */
+	add	r3,r3,r4		/* Add contents of table to table address.  */
+	mtctr	r3
+	bctr			 	 /* Jump to it.  */
+LFE1:
+/* Each of the ret_typeX code fragments has to be exactly 16 bytes long
+   (4 instructions). For cache effectiveness we align to a 16 byte boundary
+   first.  */
+
+	.align 4
+
+	nop
+	nop
+	nop
+Lget_ret_type0_addr:
+	blrl
+
+/* case FFI_TYPE_VOID  */
+Lret_type0:
+	b	Lfinish
+	nop
+	nop
+	nop
+
+/* case FFI_TYPE_INT  */
+Lret_type1:
+	lg	r3,0(r5)
+	b	Lfinish
+	nop
+	nop
+
+/* case FFI_TYPE_FLOAT  */
+Lret_type2:
+	lfs	f1,0(r5)
+	b	Lfinish
+	nop
+	nop
+
+/* case FFI_TYPE_DOUBLE  */
+Lret_type3:
+	lfd	f1,0(r5)
+	b	Lfinish
+	nop
+	nop
+
+/* case FFI_TYPE_LONGDOUBLE  */
+Lret_type4:
+	lfd	f1,0(r5)
+	lfd	f2,8(r5)
+	b	Lfinish
+	nop
+
+/* case FFI_TYPE_UINT8  */
+Lret_type5:
+#if defined(__ppc64__)
+	lbz	r3,7(r5)
+#else
+	lbz	r3,3(r5)
+#endif
+	b	Lfinish
+	nop
+	nop
+
+/* case FFI_TYPE_SINT8  */
+Lret_type6:
+#if defined(__ppc64__)
+	lbz	r3,7(r5)
+#else
+	lbz	r3,3(r5)
+#endif
+	extsb	r3,r3
+	b	Lfinish
+	nop
+
+/* case FFI_TYPE_UINT16  */
+Lret_type7:
+#if defined(__ppc64__)
+	lhz	r3,6(r5)
+#else
+	lhz	r3,2(r5)
+#endif
+	b	Lfinish
+	nop
+	nop
+
+/* case FFI_TYPE_SINT16  */
+Lret_type8:
+#if defined(__ppc64__)
+	lha	r3,6(r5)
+#else
+	lha	r3,2(r5)
+#endif
+	b	Lfinish
+	nop
+	nop
+
+/* case FFI_TYPE_UINT32  */
+Lret_type9:
+#if defined(__ppc64__)
+	lwz	r3,4(r5)
+#else
+	lwz	r3,0(r5)
+#endif
+	b	Lfinish
+	nop
+	nop
+
+/* case FFI_TYPE_SINT32  */
+Lret_type10:
+#if defined(__ppc64__)
+	lwz	r3,4(r5)
+#else
+	lwz	r3,0(r5)
+#endif
+	b	Lfinish
+	nop
+	nop
+
+/* case FFI_TYPE_UINT64  */
+Lret_type11:
+#if defined(__ppc64__)
+	lg	r3,0(r5)
+	b	Lfinish
+	nop
+#else
+	lwz	r3,0(r5)
+	lwz	r4,4(r5)
+	b	Lfinish
+#endif
+	nop
+
+/* case FFI_TYPE_SINT64  */
+Lret_type12:
+#if defined(__ppc64__)
+	lg	r3,0(r5)
+	b	Lfinish
+	nop
+#else
+	lwz	r3,0(r5)
+	lwz	r4,4(r5)
+	b	Lfinish
+#endif
+	nop
+
+/* case FFI_TYPE_STRUCT  */
+Lret_type13:
+#if defined(__ppc64__)
+	lg	r3,0(r5)		; we need at least this...
+	cmpi	0,r0,4
+	bgt	Lstructend		; not a special small case
+	b	Lsmallstruct		; see if we need more.
+#else
+	cmpi	0,r0,4
+	bgt	Lfinish		; not by value
+	lg	r3,0(r5)
+	b	Lfinish
+#endif
+/* case FFI_TYPE_POINTER  */
+Lret_type14:
+	lg	r3,0(r5)
+	b	Lfinish
+	nop
+	nop
+
+#if defined(__ppc64__)
+Lsmallstruct:
+	beq	Lfour			; continuation of Lret13.
+	cmpi	0,r0,3
+	beq	Lfinish			; don`t adjust this - can`t be any floats here...
+	srdi	r3,r3,48
+	cmpi	0,r0,2
+	beq	Lfinish			; .. or here ..
+	srdi	r3,r3,8
+	b 	Lfinish			; .. or here.
+
+Lfour:
+	lg	r6,LINKAGE_SIZE(r1)	; get the result type
+	lg	r6,FFI_TYPE_ELEM(r6)	; elements array pointer
+	lg	r6,0(r6)		; first element
+	lhz	r0,FFI_TYPE_TYPE(r6)	; OK go the type
+	cmpi	0,r0,2			; FFI_TYPE_FLOAT
+	bne	Lfourint
+	lfs	f1,0(r5)		; just one float in the struct.
+	b 	Lfinish
+
+Lfourint:
+	srdi	r3,r3,32		; four bytes.
+	b 	Lfinish
+
+Lstructend:
+	lg	r3,LINKAGE_SIZE(r1)	; get the result type
+	bl	STRUCT_RETVALUE_P
+	cmpi	0,r3,0
+	beq	Lfinish			; nope.
+	/* Recover a pointer to the results.  */
+	addi	r11,r1,(SAVE_SIZE-RESULT_BYTES)
+	lg	r3,0(r11)		; we need at least this...
+	lg	r4,8(r11)
+	cmpi	0,r0,16
+	beq	Lfinish		; special case 16 bytes we don't consider floats.
+
+	/* OK, frustratingly, the process of saving the struct to mem might have
+	   messed with the FPRs, so we have to re-load them :(.
+	   We`ll use our FPRs space again - calling: 
+	   void darwin64_pass_struct_floats (ffi_type *s, char *src, 
+					     unsigned *nfpr, double **fprs) 
+	   We`ll temporarily pinch the first two slots of the param area for local
+	   vars used by the routine.  */
+	xor	r6,r6,r6
+	addi	r5,r1,PARENT_PARM_BASE		; some space
+	sg	r6,0(r5)			; *nfpr zeroed.
+	addi	r6,r5,8				; **fprs
+	addi	r3,r1,FP_SAVE_BASE		; pointer to FPRs space
+	sg	r3,0(r6)
+	mr	r4,r11				; the struct is here...
+	lg	r3,LINKAGE_SIZE(r1)		; ffi_type * result_type.
+	bl	PASS_STR_FLOATS			; get struct floats into FPR save space.
+	/* See if we used any floats  */
+	lwz	r0,(SAVE_SIZE-RESULT_BYTES)(r1)	
+	cmpi	0,r0,0
+	beq	Lstructints			; nope.
+	/* OK load `em up... */
+	lfd	f1, (FP_SAVE_BASE                 )(r1)
+	lfd	f2, (FP_SAVE_BASE +  FPR_SIZE     )(r1)
+	lfd	f3, (FP_SAVE_BASE +  FPR_SIZE * 2 )(r1)
+	lfd	f4, (FP_SAVE_BASE +  FPR_SIZE * 3 )(r1)
+	lfd	f5, (FP_SAVE_BASE +  FPR_SIZE * 4 )(r1)
+	lfd	f6, (FP_SAVE_BASE +  FPR_SIZE * 5 )(r1)
+	lfd	f7, (FP_SAVE_BASE +  FPR_SIZE * 6 )(r1)
+	lfd	f8, (FP_SAVE_BASE +  FPR_SIZE * 7 )(r1)
+	lfd	f9, (FP_SAVE_BASE +  FPR_SIZE * 8 )(r1)
+	lfd	f10,(FP_SAVE_BASE +  FPR_SIZE * 9 )(r1)
+	lfd	f11,(FP_SAVE_BASE +  FPR_SIZE * 10)(r1)
+	lfd	f12,(FP_SAVE_BASE +  FPR_SIZE * 11)(r1)
+	lfd	f13,(FP_SAVE_BASE +  FPR_SIZE * 12)(r1)
+
+	/* point back at our saved struct.  */
+Lstructints:
+	addi	r11,r1,(SAVE_SIZE-RESULT_BYTES)
+	lg	r3,0(r11)			; we end up picking the
+	lg	r4,8(r11)			; first two again.
+	lg	r5,16(r11)
+	lg	r6,24(r11)
+	lg	r7,32(r11)
+	lg	r8,40(r11)
+	lg	r9,48(r11)
+	lg	r10,56(r11)
+#endif
+
+/* case done  */
+Lfinish:
+	addi	r1,r1,SAVE_SIZE		/* Restore stack pointer.  */
+	lg	r0,SAVED_LR_OFFSET(r1)	/* Get return address.  */
+	mtlr	r0			/* Reset link register.  */
+	blr
+Lendcode:
+	.align 1
+	
+/* END(ffi_closure_ASM)  */
+
+/* EH frame stuff.  */
+#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78)
+/* 176, 400 */
+#define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90)
+#define EH_FRAME_OFFSETB MODE_CHOICE(1,3)
+
+	.static_data
+	.align LOG2_GPR_BYTES
+LLFB1$non_lazy_ptr:
+	.g_long Lstartcode
+
+	.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
+EH_frame1:
+	.set	L$set$0,LECIE1-LSCIE1
+	.long	L$set$0	; Length of Common Information Entry
+LSCIE1:
+	.long	0x0	; CIE Identifier Tag
+	.byte	0x1	; CIE Version
+	.ascii	"zR\0"	; CIE Augmentation
+	.byte	0x1	; uleb128 0x1; CIE Code Alignment Factor
+	.byte	EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor
+	.byte	0x41	; CIE RA Column
+	.byte	0x1	; uleb128 0x1; Augmentation size
+	.byte	0x10	; FDE Encoding (indirect pcrel)
+	.byte	0xc	; DW_CFA_def_cfa
+	.byte	0x1	; uleb128 0x1
+	.byte	0x0	; uleb128 0x0
+	.align	LOG2_GPR_BYTES
+LECIE1:
+	.globl _ffi_closure_ASM.eh
+_ffi_closure_ASM.eh:
+LSFDE1:
+	.set	L$set$1,LEFDE1-LASFDE1
+	.long	L$set$1	; FDE Length
+
+LASFDE1:
+	.long	LASFDE1-EH_frame1	; FDE CIE offset
+	.g_long	LLFB1$non_lazy_ptr-.	; FDE initial location
+	.set	L$set$3,LFE1-Lstartcode
+	.g_long	L$set$3	; FDE address range
+	.byte   0x0     ; uleb128 0x0; Augmentation size
+	.byte	0x4	; DW_CFA_advance_loc4
+	.set	L$set$3,LCFI1-LCFI0
+	.long	L$set$3
+	.byte	0xe	; DW_CFA_def_cfa_offset
+	.byte	EH_FRAME_OFFSETA,EH_FRAME_OFFSETB	; uleb128 176,1/190,3
+	.byte	0x4	; DW_CFA_advance_loc4
+	.set	L$set$4,LCFI0-Lstartcode
+	.long	L$set$4
+	.byte   0x11    ; DW_CFA_offset_extended_sf
+	.byte	0x41	; uleb128 0x41
+	.byte   0x7e    ; sleb128 -2
+	.align	LOG2_GPR_BYTES
+LEFDE1:
+	.align 	1
+
+#ifdef WANT_STUB
+	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+	.align 5
+L_ffi_closure_helper_DARWIN$stub:
+	.indirect_symbol _ffi_closure_helper_DARWIN
+	mflr r0
+	bcl 20,31,"L00000000001$spb"
+"L00000000001$spb":
+	mflr r11
+	addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L00000000001$spb")
+	mtlr r0
+	lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L00000000001$spb")(r11)
+	mtctr r12
+	bctr
+	.lazy_symbol_pointer
+L_ffi_closure_helper_DARWIN$lazy_ptr:
+	.indirect_symbol _ffi_closure_helper_DARWIN
+	.long	dyld_stub_binding_helper
+
+#if defined(__ppc64__)
+	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+	.align 5
+L_darwin64_struct_ret_by_value_p$stub:
+	.indirect_symbol _darwin64_struct_ret_by_value_p
+	mflr r0
+	bcl 20,31,"L00000000002$spb"
+"L00000000002$spb":
+	mflr r11
+	addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L00000000002$spb")
+	mtlr r0
+	lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L00000000002$spb")(r11)
+	mtctr r12
+	bctr
+	.lazy_symbol_pointer
+L_darwin64_struct_ret_by_value_p$lazy_ptr:
+	.indirect_symbol _darwin64_struct_ret_by_value_p
+	.long	dyld_stub_binding_helper
+	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+	.align 5
+L_darwin64_pass_struct_floats$stub:
+	.indirect_symbol _darwin64_pass_struct_floats
+	mflr r0
+	bcl 20,31,"L00000000003$spb"
+"L00000000003$spb":
+	mflr r11
+	addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L00000000003$spb")
+	mtlr r0
+	lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L00000000003$spb")(r11)
+	mtctr r12
+	bctr
+	.lazy_symbol_pointer
+L_darwin64_pass_struct_floats$lazy_ptr:
+	.indirect_symbol _darwin64_pass_struct_floats
+	.long	dyld_stub_binding_helper
+#  endif
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi.c
new file mode 100644
index 0000000..fb2a39f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi.c
@@ -0,0 +1,1448 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (C) 2011 Anthony Green
+           Copyright (C) 2008 Red Hat, Inc
+           Copyright (C) 2007, 2008 Free Software Foundation, Inc
+	   Copyright (c) 1998 Geoffrey Keating
+
+   PowerPC Foreign Function Interface
+
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+
+extern void ffi_closure_SYSV (void);
+extern void FFI_HIDDEN ffi_closure_LINUX64 (void);
+
+enum {
+  /* The assembly depends on these exact flags.  */
+  FLAG_RETURNS_SMST	= 1 << (31-31), /* Used for FFI_SYSV small structs.  */
+  FLAG_RETURNS_NOTHING  = 1 << (31-30), /* These go in cr7 */
+  FLAG_RETURNS_FP       = 1 << (31-29),
+  FLAG_RETURNS_64BITS   = 1 << (31-28),
+
+  FLAG_RETURNS_128BITS  = 1 << (31-27), /* cr6  */
+  FLAG_SYSV_SMST_R4     = 1 << (31-26), /* use r4 for FFI_SYSV 8 byte
+					   structs.  */
+  FLAG_SYSV_SMST_R3     = 1 << (31-25), /* use r3 for FFI_SYSV 4 byte
+					   structs.  */
+  /* Bits (31-24) through (31-19) store shift value for SMST */
+
+  FLAG_ARG_NEEDS_COPY   = 1 << (31- 7),
+  FLAG_FP_ARGUMENTS     = 1 << (31- 6), /* cr1.eq; specified by ABI */
+  FLAG_4_GPR_ARGUMENTS  = 1 << (31- 5),
+  FLAG_RETVAL_REFERENCE = 1 << (31- 4)
+};
+
+/* About the SYSV ABI.  */
+unsigned int NUM_GPR_ARG_REGISTERS = 8;
+#ifndef __NO_FPRS__
+unsigned int NUM_FPR_ARG_REGISTERS = 8;
+#else
+unsigned int NUM_FPR_ARG_REGISTERS = 0;
+#endif
+
+enum { ASM_NEEDS_REGISTERS = 4 };
+
+/* ffi_prep_args_SYSV is called by the assembly routine once stack space
+   has been allocated for the function's arguments.
+
+   The stack layout we want looks like this:
+
+   |   Return address from ffi_call_SYSV 4bytes	|	higher addresses
+   |--------------------------------------------|
+   |   Previous backchain pointer	4	|       stack pointer here
+   |--------------------------------------------|<+ <<<	on entry to
+   |   Saved r28-r31			4*4	| |	ffi_call_SYSV
+   |--------------------------------------------| |
+   |   GPR registers r3-r10		8*4	| |	ffi_call_SYSV
+   |--------------------------------------------| |
+   |   FPR registers f1-f8 (optional)	8*8	| |
+   |--------------------------------------------| |	stack	|
+   |   Space for copied structures		| |	grows	|
+   |--------------------------------------------| |	down    V
+   |   Parameters that didn't fit in registers  | |
+   |--------------------------------------------| |	lower addresses
+   |   Space for callee's LR		4	| |
+   |--------------------------------------------| |	stack pointer here
+   |   Current backchain pointer	4	|-/	during
+   |--------------------------------------------|   <<<	ffi_call_SYSV
+
+*/
+
+void
+ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
+{
+  const unsigned bytes = ecif->cif->bytes;
+  const unsigned flags = ecif->cif->flags;
+
+  typedef union {
+    char *c;
+    unsigned *u;
+    long long *ll;
+    float *f;
+    double *d;
+  } valp;
+
+  /* 'stacktop' points at the previous backchain pointer.  */
+  valp stacktop;
+
+  /* 'gpr_base' points at the space for gpr3, and grows upwards as
+     we use GPR registers.  */
+  valp gpr_base;
+  int intarg_count;
+
+  /* 'fpr_base' points at the space for fpr1, and grows upwards as
+     we use FPR registers.  */
+  valp fpr_base;
+  int fparg_count;
+
+  /* 'copy_space' grows down as we put structures in it.  It should
+     stay 16-byte aligned.  */
+  valp copy_space;
+
+  /* 'next_arg' grows up as we put parameters in it.  */
+  valp next_arg;
+
+  int i, ii MAYBE_UNUSED;
+  ffi_type **ptr;
+  double double_tmp;
+  union {
+    void **v;
+    char **c;
+    signed char **sc;
+    unsigned char **uc;
+    signed short **ss;
+    unsigned short **us;
+    unsigned int **ui;
+    long long **ll;
+    float **f;
+    double **d;
+  } p_argv;
+  size_t struct_copy_size;
+  unsigned gprvalue;
+
+  if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
+    NUM_FPR_ARG_REGISTERS = 0;
+
+  stacktop.c = (char *) stack + bytes;
+  gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS;
+  intarg_count = 0;
+  fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS;
+  fparg_count = 0;
+  copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c);
+  next_arg.u = stack + 2;
+
+  /* Check that everything starts aligned properly.  */
+  FFI_ASSERT (((unsigned) (char *) stack & 0xF) == 0);
+  FFI_ASSERT (((unsigned) copy_space.c & 0xF) == 0);
+  FFI_ASSERT (((unsigned) stacktop.c & 0xF) == 0);
+  FFI_ASSERT ((bytes & 0xF) == 0);
+  FFI_ASSERT (copy_space.c >= next_arg.c);
+
+  /* Deal with return values that are actually pass-by-reference.  */
+  if (flags & FLAG_RETVAL_REFERENCE)
+    {
+      *gpr_base.u++ = (unsigned long) (char *) ecif->rvalue;
+      intarg_count++;
+    }
+
+  /* Now for the arguments.  */
+  p_argv.v = ecif->avalue;
+  for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
+       i > 0;
+       i--, ptr++, p_argv.v++)
+    {
+      switch ((*ptr)->type)
+	{
+	case FFI_TYPE_FLOAT:
+	  /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32.  */
+	  if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
+	    goto soft_float_prep;
+	  double_tmp = **p_argv.f;
+	  if (fparg_count >= NUM_FPR_ARG_REGISTERS)
+	    {
+	      *next_arg.f = (float) double_tmp;
+	      next_arg.u += 1;
+	      intarg_count++;
+	    }
+	  else
+	    *fpr_base.d++ = double_tmp;
+	  fparg_count++;
+	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64.  */
+	  if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
+	    goto soft_double_prep;
+	  double_tmp = **p_argv.d;
+
+	  if (fparg_count >= NUM_FPR_ARG_REGISTERS)
+	    {
+	      if (intarg_count >= NUM_GPR_ARG_REGISTERS
+		  && intarg_count % 2 != 0)
+		{
+		  intarg_count++;
+		  next_arg.u++;
+		}
+	      *next_arg.d = double_tmp;
+	      next_arg.u += 2;
+	    }
+	  else
+	    *fpr_base.d++ = double_tmp;
+	  fparg_count++;
+	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
+	  break;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	case FFI_TYPE_LONGDOUBLE:
+	  if ((ecif->cif->abi != FFI_LINUX)
+		&& (ecif->cif->abi != FFI_LINUX_SOFT_FLOAT))
+	    goto do_struct;
+	  /* The soft float ABI for long doubles works like this,
+	     a long double is passed in four consecutive gprs if available.
+	     A maximum of 2 long doubles can be passed in gprs.
+	     If we do not have 4 gprs left, the long double is passed on the
+	     stack, 4-byte aligned.  */
+	  if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
+	    {
+	      unsigned int int_tmp = (*p_argv.ui)[0];
+	      if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3)
+		{
+		  if (intarg_count < NUM_GPR_ARG_REGISTERS)
+		    intarg_count += NUM_GPR_ARG_REGISTERS - intarg_count;
+		  *next_arg.u = int_tmp;
+		  next_arg.u++;
+		  for (ii = 1; ii < 4; ii++)
+		    {
+		      int_tmp = (*p_argv.ui)[ii];
+		      *next_arg.u = int_tmp;
+		      next_arg.u++;
+		    }
+		}
+	      else
+		{
+		  *gpr_base.u++ = int_tmp;
+		  for (ii = 1; ii < 4; ii++)
+		    {
+		      int_tmp = (*p_argv.ui)[ii];
+		      *gpr_base.u++ = int_tmp;
+		    }
+		}
+	      intarg_count +=4;
+	    }
+	  else
+	    {
+	      double_tmp = (*p_argv.d)[0];
+
+	      if (fparg_count >= NUM_FPR_ARG_REGISTERS - 1)
+		{
+		  if (intarg_count >= NUM_GPR_ARG_REGISTERS
+		      && intarg_count % 2 != 0)
+		    {
+		      intarg_count++;
+		      next_arg.u++;
+		    }
+		  *next_arg.d = double_tmp;
+		  next_arg.u += 2;
+		  double_tmp = (*p_argv.d)[1];
+		  *next_arg.d = double_tmp;
+		  next_arg.u += 2;
+		}
+	      else
+		{
+		  *fpr_base.d++ = double_tmp;
+		  double_tmp = (*p_argv.d)[1];
+		  *fpr_base.d++ = double_tmp;
+		}
+
+	      fparg_count += 2;
+	      FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
+	    }
+	  break;
+#endif
+
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_SINT64:
+	soft_double_prep:
+	  if (intarg_count == NUM_GPR_ARG_REGISTERS-1)
+	    intarg_count++;
+	  if (intarg_count >= NUM_GPR_ARG_REGISTERS)
+	    {
+	      if (intarg_count % 2 != 0)
+		{
+		  intarg_count++;
+		  next_arg.u++;
+		}
+	      *next_arg.ll = **p_argv.ll;
+	      next_arg.u += 2;
+	    }
+	  else
+	    {
+	      /* whoops: abi states only certain register pairs
+	       * can be used for passing long long int
+	       * specifically (r3,r4), (r5,r6), (r7,r8),
+	       * (r9,r10) and if next arg is long long but
+	       * not correct starting register of pair then skip
+	       * until the proper starting register
+	       */
+	      if (intarg_count % 2 != 0)
+		{
+		  intarg_count ++;
+		  gpr_base.u++;
+		}
+	      *gpr_base.ll++ = **p_argv.ll;
+	    }
+	  intarg_count += 2;
+	  break;
+
+	case FFI_TYPE_STRUCT:
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	do_struct:
+#endif
+	  struct_copy_size = ((*ptr)->size + 15) & ~0xF;
+	  copy_space.c -= struct_copy_size;
+	  memcpy (copy_space.c, *p_argv.c, (*ptr)->size);
+
+	  gprvalue = (unsigned long) copy_space.c;
+
+	  FFI_ASSERT (copy_space.c > next_arg.c);
+	  FFI_ASSERT (flags & FLAG_ARG_NEEDS_COPY);
+	  goto putgpr;
+
+	case FFI_TYPE_UINT8:
+	  gprvalue = **p_argv.uc;
+	  goto putgpr;
+	case FFI_TYPE_SINT8:
+	  gprvalue = **p_argv.sc;
+	  goto putgpr;
+	case FFI_TYPE_UINT16:
+	  gprvalue = **p_argv.us;
+	  goto putgpr;
+	case FFI_TYPE_SINT16:
+	  gprvalue = **p_argv.ss;
+	  goto putgpr;
+
+	case FFI_TYPE_INT:
+	case FFI_TYPE_UINT32:
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_POINTER:
+	soft_float_prep:
+
+	  gprvalue = **p_argv.ui;
+
+	putgpr:
+	  if (intarg_count >= NUM_GPR_ARG_REGISTERS)
+	    *next_arg.u++ = gprvalue;
+	  else
+	    *gpr_base.u++ = gprvalue;
+	  intarg_count++;
+	  break;
+	}
+    }
+
+  /* Check that we didn't overrun the stack...  */
+  FFI_ASSERT (copy_space.c >= next_arg.c);
+  FFI_ASSERT (gpr_base.u <= stacktop.u - ASM_NEEDS_REGISTERS);
+  FFI_ASSERT (fpr_base.u
+	      <= stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS);
+  FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4);
+}
+
+/* About the LINUX64 ABI.  */
+enum {
+  NUM_GPR_ARG_REGISTERS64 = 8,
+  NUM_FPR_ARG_REGISTERS64 = 13
+};
+enum { ASM_NEEDS_REGISTERS64 = 4 };
+
+/* ffi_prep_args64 is called by the assembly routine once stack space
+   has been allocated for the function's arguments.
+
+   The stack layout we want looks like this:
+
+   |   Ret addr from ffi_call_LINUX64	8bytes	|	higher addresses
+   |--------------------------------------------|
+   |   CR save area			8bytes	|
+   |--------------------------------------------|
+   |   Previous backchain pointer	8	|	stack pointer here
+   |--------------------------------------------|<+ <<<	on entry to
+   |   Saved r28-r31			4*8	| |	ffi_call_LINUX64
+   |--------------------------------------------| |
+   |   GPR registers r3-r10		8*8	| |
+   |--------------------------------------------| |
+   |   FPR registers f1-f13 (optional)	13*8	| |
+   |--------------------------------------------| |
+   |   Parameter save area		        | |
+   |--------------------------------------------| |
+   |   TOC save area			8	| |
+   |--------------------------------------------| |	stack	|
+   |   Linker doubleword		8	| |	grows	|
+   |--------------------------------------------| |	down	V
+   |   Compiler doubleword		8	| |
+   |--------------------------------------------| |	lower addresses
+   |   Space for callee's LR		8	| |
+   |--------------------------------------------| |
+   |   CR save area			8	| |
+   |--------------------------------------------| |	stack pointer here
+   |   Current backchain pointer	8	|-/	during
+   |--------------------------------------------|   <<<	ffi_call_LINUX64
+
+*/
+
+void FFI_HIDDEN
+ffi_prep_args64 (extended_cif *ecif, unsigned long *const stack)
+{
+  const unsigned long bytes = ecif->cif->bytes;
+  const unsigned long flags = ecif->cif->flags;
+
+  typedef union {
+    char *c;
+    unsigned long *ul;
+    float *f;
+    double *d;
+  } valp;
+
+  /* 'stacktop' points at the previous backchain pointer.  */
+  valp stacktop;
+
+  /* 'next_arg' points at the space for gpr3, and grows upwards as
+     we use GPR registers, then continues at rest.  */
+  valp gpr_base;
+  valp gpr_end;
+  valp rest;
+  valp next_arg;
+
+  /* 'fpr_base' points at the space for fpr3, and grows upwards as
+     we use FPR registers.  */
+  valp fpr_base;
+  int fparg_count;
+
+  int i, words;
+  ffi_type **ptr;
+  double double_tmp;
+  union {
+    void **v;
+    char **c;
+    signed char **sc;
+    unsigned char **uc;
+    signed short **ss;
+    unsigned short **us;
+    signed int **si;
+    unsigned int **ui;
+    unsigned long **ul;
+    float **f;
+    double **d;
+  } p_argv;
+  unsigned long gprvalue;
+
+  stacktop.c = (char *) stack + bytes;
+  gpr_base.ul = stacktop.ul - ASM_NEEDS_REGISTERS64 - NUM_GPR_ARG_REGISTERS64;
+  gpr_end.ul = gpr_base.ul + NUM_GPR_ARG_REGISTERS64;
+  rest.ul = stack + 6 + NUM_GPR_ARG_REGISTERS64;
+  fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS64;
+  fparg_count = 0;
+  next_arg.ul = gpr_base.ul;
+
+  /* Check that everything starts aligned properly.  */
+  FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0);
+  FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0);
+  FFI_ASSERT ((bytes & 0xF) == 0);
+
+  /* Deal with return values that are actually pass-by-reference.  */
+  if (flags & FLAG_RETVAL_REFERENCE)
+    *next_arg.ul++ = (unsigned long) (char *) ecif->rvalue;
+
+  /* Now for the arguments.  */
+  p_argv.v = ecif->avalue;
+  for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
+       i > 0;
+       i--, ptr++, p_argv.v++)
+    {
+      switch ((*ptr)->type)
+	{
+	case FFI_TYPE_FLOAT:
+	  double_tmp = **p_argv.f;
+	  *next_arg.f = (float) double_tmp;
+	  if (++next_arg.ul == gpr_end.ul)
+	    next_arg.ul = rest.ul;
+	  if (fparg_count < NUM_FPR_ARG_REGISTERS64)
+	    *fpr_base.d++ = double_tmp;
+	  fparg_count++;
+	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  double_tmp = **p_argv.d;
+	  *next_arg.d = double_tmp;
+	  if (++next_arg.ul == gpr_end.ul)
+	    next_arg.ul = rest.ul;
+	  if (fparg_count < NUM_FPR_ARG_REGISTERS64)
+	    *fpr_base.d++ = double_tmp;
+	  fparg_count++;
+	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
+	  break;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	case FFI_TYPE_LONGDOUBLE:
+	  double_tmp = (*p_argv.d)[0];
+	  *next_arg.d = double_tmp;
+	  if (++next_arg.ul == gpr_end.ul)
+	    next_arg.ul = rest.ul;
+	  if (fparg_count < NUM_FPR_ARG_REGISTERS64)
+	    *fpr_base.d++ = double_tmp;
+	  fparg_count++;
+	  double_tmp = (*p_argv.d)[1];
+	  *next_arg.d = double_tmp;
+	  if (++next_arg.ul == gpr_end.ul)
+	    next_arg.ul = rest.ul;
+	  if (fparg_count < NUM_FPR_ARG_REGISTERS64)
+	    *fpr_base.d++ = double_tmp;
+	  fparg_count++;
+	  FFI_ASSERT (__LDBL_MANT_DIG__ == 106);
+	  FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
+	  break;
+#endif
+
+	case FFI_TYPE_STRUCT:
+	  words = ((*ptr)->size + 7) / 8;
+	  if (next_arg.ul >= gpr_base.ul && next_arg.ul + words > gpr_end.ul)
+	    {
+	      size_t first = gpr_end.c - next_arg.c;
+	      memcpy (next_arg.c, *p_argv.c, first);
+	      memcpy (rest.c, *p_argv.c + first, (*ptr)->size - first);
+	      next_arg.c = rest.c + words * 8 - first;
+	    }
+	  else
+	    {
+	      char *where = next_arg.c;
+
+	      /* Structures with size less than eight bytes are passed
+		 left-padded.  */
+	      if ((*ptr)->size < 8)
+		where += 8 - (*ptr)->size;
+
+	      memcpy (where, *p_argv.c, (*ptr)->size);
+	      next_arg.ul += words;
+	      if (next_arg.ul == gpr_end.ul)
+		next_arg.ul = rest.ul;
+	    }
+	  break;
+
+	case FFI_TYPE_UINT8:
+	  gprvalue = **p_argv.uc;
+	  goto putgpr;
+	case FFI_TYPE_SINT8:
+	  gprvalue = **p_argv.sc;
+	  goto putgpr;
+	case FFI_TYPE_UINT16:
+	  gprvalue = **p_argv.us;
+	  goto putgpr;
+	case FFI_TYPE_SINT16:
+	  gprvalue = **p_argv.ss;
+	  goto putgpr;
+	case FFI_TYPE_UINT32:
+	  gprvalue = **p_argv.ui;
+	  goto putgpr;
+	case FFI_TYPE_INT:
+	case FFI_TYPE_SINT32:
+	  gprvalue = **p_argv.si;
+	  goto putgpr;
+
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_POINTER:
+	  gprvalue = **p_argv.ul;
+	putgpr:
+	  *next_arg.ul++ = gprvalue;
+	  if (next_arg.ul == gpr_end.ul)
+	    next_arg.ul = rest.ul;
+	  break;
+	}
+    }
+
+  FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS
+	      || (next_arg.ul >= gpr_base.ul
+		  && next_arg.ul <= gpr_base.ul + 4));
+}
+
+
+
+/* Perform machine dependent cif processing */
+ffi_status
+ffi_prep_cif_machdep (ffi_cif *cif)
+{
+  /* All this is for the SYSV and LINUX64 ABI.  */
+  int i;
+  ffi_type **ptr;
+  unsigned bytes;
+  int fparg_count = 0, intarg_count = 0;
+  unsigned flags = 0;
+  unsigned struct_copy_size = 0;
+  unsigned type = cif->rtype->type;
+  unsigned size = cif->rtype->size;
+
+  if (cif->abi == FFI_LINUX_SOFT_FLOAT)
+    NUM_FPR_ARG_REGISTERS = 0;
+
+  if (cif->abi != FFI_LINUX64)
+    {
+      /* All the machine-independent calculation of cif->bytes will be wrong.
+	 Redo the calculation for SYSV.  */
+
+      /* Space for the frame pointer, callee's LR, and the asm's temp regs.  */
+      bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int);
+
+      /* Space for the GPR registers.  */
+      bytes += NUM_GPR_ARG_REGISTERS * sizeof (int);
+    }
+  else
+    {
+      /* 64-bit ABI.  */
+
+      /* Space for backchain, CR, LR, cc/ld doubleword, TOC and the asm's temp
+	 regs.  */
+      bytes = (6 + ASM_NEEDS_REGISTERS64) * sizeof (long);
+
+      /* Space for the mandatory parm save area and general registers.  */
+      bytes += 2 * NUM_GPR_ARG_REGISTERS64 * sizeof (long);
+    }
+
+  /* Return value handling.  The rules for SYSV are as follows:
+     - 32-bit (or less) integer values are returned in gpr3;
+     - Structures of size <= 4 bytes also returned in gpr3;
+     - 64-bit integer values and structures between 5 and 8 bytes are returned
+     in gpr3 and gpr4;
+     - Single/double FP values are returned in fpr1;
+     - Larger structures are allocated space and a pointer is passed as
+     the first argument.
+     - long doubles (if not equivalent to double) are returned in
+     fpr1,fpr2 for Linux and as for large structs for SysV.
+     For LINUX64:
+     - integer values in gpr3;
+     - Structures/Unions by reference;
+     - Single/double FP values in fpr1, long double in fpr1,fpr2.
+     - soft-float float/doubles are treated as UINT32/UINT64 respectivley.
+     - soft-float long doubles are returned in gpr3-gpr6.  */
+  switch (type)
+    {
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+    case FFI_TYPE_LONGDOUBLE:
+      if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX64
+	&& cif->abi != FFI_LINUX_SOFT_FLOAT)
+	goto byref;
+      flags |= FLAG_RETURNS_128BITS;
+      /* Fall through.  */
+#endif
+    case FFI_TYPE_DOUBLE:
+      flags |= FLAG_RETURNS_64BITS;
+      /* Fall through.  */
+    case FFI_TYPE_FLOAT:
+      /* With FFI_LINUX_SOFT_FLOAT no fp registers are used.  */
+      if (cif->abi != FFI_LINUX_SOFT_FLOAT)
+	flags |= FLAG_RETURNS_FP;
+      break;
+
+    case FFI_TYPE_UINT64:
+    case FFI_TYPE_SINT64:
+      flags |= FLAG_RETURNS_64BITS;
+      break;
+
+    case FFI_TYPE_STRUCT:
+      if (cif->abi == FFI_SYSV)
+	{
+	  /* The final SYSV ABI says that structures smaller or equal 8 bytes
+	     are returned in r3/r4. The FFI_GCC_SYSV ABI instead returns them
+	     in memory.  */
+
+	  /* Treat structs with size <= 8 bytes.  */
+	  if (size <= 8)
+	    {
+	      flags |= FLAG_RETURNS_SMST;
+	      /* These structs are returned in r3. We pack the type and the
+		 precalculated shift value (needed in the sysv.S) into flags.
+		 The same applies for the structs returned in r3/r4.  */
+	      if (size <= 4)
+		{
+		  flags |= FLAG_SYSV_SMST_R3;
+		  flags |= 8 * (4 - size) << 8;
+		  break;
+		}
+	      /* These structs are returned in r3 and r4. See above.   */
+	      if  (size <= 8)
+		{
+		  flags |= FLAG_SYSV_SMST_R3 | FLAG_SYSV_SMST_R4;
+		  flags |= 8 * (8 - size) << 8;
+		  break;
+		}
+	    }
+	}
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+    byref:
+#endif
+      intarg_count++;
+      flags |= FLAG_RETVAL_REFERENCE;
+      /* Fall through.  */
+    case FFI_TYPE_VOID:
+      flags |= FLAG_RETURNS_NOTHING;
+      break;
+
+    default:
+      /* Returns 32-bit integer, or similar.  Nothing to do here.  */
+      break;
+    }
+
+  if (cif->abi != FFI_LINUX64)
+    /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the
+       first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest
+       goes on the stack.  Structures and long doubles (if not equivalent
+       to double) are passed as a pointer to a copy of the structure.
+       Stuff on the stack needs to keep proper alignment.  */
+    for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
+      {
+	switch ((*ptr)->type)
+	  {
+	  case FFI_TYPE_FLOAT:
+	    /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32.  */
+	    if (cif->abi == FFI_LINUX_SOFT_FLOAT)
+	      goto soft_float_cif;
+	    fparg_count++;
+	    /* floating singles are not 8-aligned on stack */
+	    break;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	  case FFI_TYPE_LONGDOUBLE:
+	    if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
+	      goto do_struct;
+	    if (cif->abi == FFI_LINUX_SOFT_FLOAT)
+	      {
+		if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3
+		  || intarg_count < NUM_GPR_ARG_REGISTERS)
+		  /* A long double in FFI_LINUX_SOFT_FLOAT can use only
+		     a set of four consecutive gprs. If we have not enough,
+		     we have to adjust the intarg_count value.  */
+		  intarg_count += NUM_GPR_ARG_REGISTERS - intarg_count;
+		intarg_count += 4;
+		break;
+	      }
+	    else
+	      fparg_count++;
+	    /* Fall thru */
+#endif
+	  case FFI_TYPE_DOUBLE:
+	    /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64.  */
+	    if (cif->abi == FFI_LINUX_SOFT_FLOAT)
+	      goto soft_double_cif;
+	    fparg_count++;
+	    /* If this FP arg is going on the stack, it must be
+	       8-byte-aligned.  */
+	    if (fparg_count > NUM_FPR_ARG_REGISTERS
+		&& intarg_count >= NUM_GPR_ARG_REGISTERS
+		&& intarg_count % 2 != 0)
+	      intarg_count++;
+	    break;
+
+	  case FFI_TYPE_UINT64:
+	  case FFI_TYPE_SINT64:
+	  soft_double_cif:
+	    /* 'long long' arguments are passed as two words, but
+	       either both words must fit in registers or both go
+	       on the stack.  If they go on the stack, they must
+	       be 8-byte-aligned.
+
+	       Also, only certain register pairs can be used for
+	       passing long long int -- specifically (r3,r4), (r5,r6),
+	       (r7,r8), (r9,r10).
+	    */
+	    if (intarg_count == NUM_GPR_ARG_REGISTERS-1
+		|| intarg_count % 2 != 0)
+	      intarg_count++;
+	    intarg_count += 2;
+	    break;
+
+	  case FFI_TYPE_STRUCT:
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	  do_struct:
+#endif
+	    /* We must allocate space for a copy of these to enforce
+	       pass-by-value.  Pad the space up to a multiple of 16
+	       bytes (the maximum alignment required for anything under
+	       the SYSV ABI).  */
+	    struct_copy_size += ((*ptr)->size + 15) & ~0xF;
+	    /* Fall through (allocate space for the pointer).  */
+
+	  default:
+	  soft_float_cif:
+	    /* Everything else is passed as a 4-byte word in a GPR, either
+	       the object itself or a pointer to it.  */
+	    intarg_count++;
+	    break;
+	  }
+      }
+  else
+    for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
+      {
+	switch ((*ptr)->type)
+	  {
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	  case FFI_TYPE_LONGDOUBLE:
+	    if (cif->abi == FFI_LINUX_SOFT_FLOAT)
+	      intarg_count += 4;
+	    else
+	      {
+		fparg_count += 2;
+		intarg_count += 2;
+	      }
+	    break;
+#endif
+	  case FFI_TYPE_FLOAT:
+	  case FFI_TYPE_DOUBLE:
+	    fparg_count++;
+	    intarg_count++;
+	    break;
+
+	  case FFI_TYPE_STRUCT:
+	    intarg_count += ((*ptr)->size + 7) / 8;
+	    break;
+
+	  default:
+	    /* Everything else is passed as a 8-byte word in a GPR, either
+	       the object itself or a pointer to it.  */
+	    intarg_count++;
+	    break;
+	  }
+      }
+
+  if (fparg_count != 0)
+    flags |= FLAG_FP_ARGUMENTS;
+  if (intarg_count > 4)
+    flags |= FLAG_4_GPR_ARGUMENTS;
+  if (struct_copy_size != 0)
+    flags |= FLAG_ARG_NEEDS_COPY;
+
+  if (cif->abi != FFI_LINUX64)
+    {
+      /* Space for the FPR registers, if needed.  */
+      if (fparg_count != 0)
+	bytes += NUM_FPR_ARG_REGISTERS * sizeof (double);
+
+      /* Stack space.  */
+      if (intarg_count > NUM_GPR_ARG_REGISTERS)
+	bytes += (intarg_count - NUM_GPR_ARG_REGISTERS) * sizeof (int);
+      if (fparg_count > NUM_FPR_ARG_REGISTERS)
+	bytes += (fparg_count - NUM_FPR_ARG_REGISTERS) * sizeof (double);
+    }
+  else
+    {
+      /* Space for the FPR registers, if needed.  */
+      if (fparg_count != 0)
+	bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double);
+
+      /* Stack space.  */
+      if (intarg_count > NUM_GPR_ARG_REGISTERS64)
+	bytes += (intarg_count - NUM_GPR_ARG_REGISTERS64) * sizeof (long);
+    }
+
+  /* The stack space allocated needs to be a multiple of 16 bytes.  */
+  bytes = (bytes + 15) & ~0xF;
+
+  /* Add in the space for the copied structures.  */
+  bytes += struct_copy_size;
+
+  cif->flags = flags;
+  cif->bytes = bytes;
+
+  return FFI_OK;
+}
+
+extern void ffi_call_SYSV(extended_cif *, unsigned, unsigned, unsigned *,
+			  void (*fn)(void));
+extern void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, unsigned long,
+					unsigned long, unsigned long *,
+					void (*fn)(void));
+
+void
+ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+
+  /* If the return value is a struct and we don't have a return	*/
+  /* value address then we need to make one		        */
+
+  if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
+    {
+      ecif.rvalue = alloca(cif->rtype->size);
+    }
+  else
+    ecif.rvalue = rvalue;
+
+
+  switch (cif->abi)
+    {
+#ifndef POWERPC64
+    case FFI_SYSV:
+    case FFI_GCC_SYSV:
+    case FFI_LINUX:
+    case FFI_LINUX_SOFT_FLOAT:
+      ffi_call_SYSV (&ecif, -cif->bytes, cif->flags, ecif.rvalue, fn);
+      break;
+#else
+    case FFI_LINUX64:
+      ffi_call_LINUX64 (&ecif, -(long) cif->bytes, cif->flags, ecif.rvalue, fn);
+      break;
+#endif
+    default:
+      FFI_ASSERT (0);
+      break;
+    }
+}
+
+
+#ifndef POWERPC64
+#define MIN_CACHE_LINE_SIZE 8
+
+static void
+flush_icache (char *wraddr, char *xaddr, int size)
+{
+  int i;
+  for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE)
+    __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;"
+		      : : "r" (xaddr + i), "r" (wraddr + i) : "memory");
+  __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;"
+		    : : "r"(xaddr + size - 1), "r"(wraddr + size - 1)
+		    : "memory");
+}
+#endif
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure *closure,
+		      ffi_cif *cif,
+		      void (*fun) (ffi_cif *, void *, void **, void *),
+		      void *user_data,
+		      void *codeloc)
+{
+#ifdef POWERPC64
+  void **tramp = (void **) &closure->tramp[0];
+
+  if (cif->abi != FFI_LINUX64)
+    return FFI_BAD_ABI;
+  /* Copy function address and TOC from ffi_closure_LINUX64.  */
+  memcpy (tramp, (char *) ffi_closure_LINUX64, 16);
+  tramp[2] = codeloc;
+#else
+  unsigned int *tramp;
+
+  if (! (cif->abi == FFI_GCC_SYSV 
+	 || cif->abi == FFI_SYSV
+	 || cif->abi == FFI_LINUX
+	 || cif->abi == FFI_LINUX_SOFT_FLOAT))
+    return FFI_BAD_ABI;
+
+  tramp = (unsigned int *) &closure->tramp[0];
+  tramp[0] = 0x7c0802a6;  /*   mflr    r0 */
+  tramp[1] = 0x4800000d;  /*   bl      10 <trampoline_initial+0x10> */
+  tramp[4] = 0x7d6802a6;  /*   mflr    r11 */
+  tramp[5] = 0x7c0803a6;  /*   mtlr    r0 */
+  tramp[6] = 0x800b0000;  /*   lwz     r0,0(r11) */
+  tramp[7] = 0x816b0004;  /*   lwz     r11,4(r11) */
+  tramp[8] = 0x7c0903a6;  /*   mtctr   r0 */
+  tramp[9] = 0x4e800420;  /*   bctr */
+  *(void **) &tramp[2] = (void *) ffi_closure_SYSV; /* function */
+  *(void **) &tramp[3] = codeloc;                   /* context */
+
+  /* Flush the icache.  */
+  flush_icache ((char *)tramp, (char *)codeloc, FFI_TRAMPOLINE_SIZE);
+#endif
+
+  closure->cif = cif;
+  closure->fun = fun;
+  closure->user_data = user_data;
+
+  return FFI_OK;
+}
+
+typedef union
+{
+  float f;
+  double d;
+} ffi_dblfl;
+
+int ffi_closure_helper_SYSV (ffi_closure *, void *, unsigned long *,
+			     ffi_dblfl *, unsigned long *);
+
+/* Basically the trampoline invokes ffi_closure_SYSV, and on
+ * entry, r11 holds the address of the closure.
+ * After storing the registers that could possibly contain
+ * parameters to be passed into the stack frame and setting
+ * up space for a return value, ffi_closure_SYSV invokes the
+ * following helper function to do most of the work
+ */
+
+int
+ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
+			 unsigned long *pgr, ffi_dblfl *pfr,
+			 unsigned long *pst)
+{
+  /* rvalue is the pointer to space for return value in closure assembly */
+  /* pgr is the pointer to where r3-r10 are stored in ffi_closure_SYSV */
+  /* pfr is the pointer to where f1-f8 are stored in ffi_closure_SYSV  */
+  /* pst is the pointer to outgoing parameter stack in original caller */
+
+  void **          avalue;
+  ffi_type **      arg_types;
+  long             i, avn;
+  long             nf;   /* number of floating registers already used */
+  long             ng;   /* number of general registers already used */
+  ffi_cif *        cif;
+  double           temp;
+  unsigned         size;
+
+  cif = closure->cif;
+  avalue = alloca (cif->nargs * sizeof (void *));
+  size = cif->rtype->size;
+
+  nf = 0;
+  ng = 0;
+
+  /* Copy the caller's structure return value address so that the closure
+     returns the data directly to the caller.
+     For FFI_SYSV the result is passed in r3/r4 if the struct size is less
+     or equal 8 bytes.  */
+
+  if ((cif->rtype->type == FFI_TYPE_STRUCT
+       && !((cif->abi == FFI_SYSV) && (size <= 8)))
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+      || (cif->rtype->type == FFI_TYPE_LONGDOUBLE
+	  && cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
+#endif
+      )
+    {
+      rvalue = (void *) *pgr;
+      ng++;
+      pgr++;
+    }
+
+  i = 0;
+  avn = cif->nargs;
+  arg_types = cif->arg_types;
+
+  /* Grab the addresses of the arguments from the stack frame.  */
+  while (i < avn)
+    {
+      switch (arg_types[i]->type)
+	{
+	case FFI_TYPE_SINT8:
+	case FFI_TYPE_UINT8:
+	  /* there are 8 gpr registers used to pass values */
+	  if (ng < 8)
+	    {
+	      avalue[i] = (char *) pgr + 3;
+	      ng++;
+	      pgr++;
+	    }
+	  else
+	    {
+	      avalue[i] = (char *) pst + 3;
+	      pst++;
+	    }
+	  break;
+
+	case FFI_TYPE_SINT16:
+	case FFI_TYPE_UINT16:
+	  /* there are 8 gpr registers used to pass values */
+	  if (ng < 8)
+	    {
+	      avalue[i] = (char *) pgr + 2;
+	      ng++;
+	      pgr++;
+	    }
+	  else
+	    {
+	      avalue[i] = (char *) pst + 2;
+	      pst++;
+	    }
+	  break;
+
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_UINT32:
+	case FFI_TYPE_POINTER:
+	soft_float_closure:
+	  /* there are 8 gpr registers used to pass values */
+	  if (ng < 8)
+	    {
+	      avalue[i] = pgr;
+	      ng++;
+	      pgr++;
+	    }
+	  else
+	    {
+	      avalue[i] = pst;
+	      pst++;
+	    }
+	  break;
+
+	case FFI_TYPE_STRUCT:
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	do_struct:
+#endif
+	  /* Structs are passed by reference. The address will appear in a
+	     gpr if it is one of the first 8 arguments.  */
+	  if (ng < 8)
+	    {
+	      avalue[i] = (void *) *pgr;
+	      ng++;
+	      pgr++;
+	    }
+	  else
+	    {
+	      avalue[i] = (void *) *pst;
+	      pst++;
+	    }
+	  break;
+
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_UINT64:
+	soft_double_closure:
+	  /* passing long long ints are complex, they must
+	   * be passed in suitable register pairs such as
+	   * (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10)
+	   * and if the entire pair aren't available then the outgoing
+	   * parameter stack is used for both but an alignment of 8
+	   * must will be kept.  So we must either look in pgr
+	   * or pst to find the correct address for this type
+	   * of parameter.
+	   */
+	  if (ng < 7)
+	    {
+	      if (ng & 0x01)
+		{
+		  /* skip r4, r6, r8 as starting points */
+		  ng++;
+		  pgr++;
+		}
+	      avalue[i] = pgr;
+	      ng += 2;
+	      pgr += 2;
+	    }
+	  else
+	    {
+	      if (((long) pst) & 4)
+		pst++;
+	      avalue[i] = pst;
+	      pst += 2;
+	      ng = 8;
+	    }
+	  break;
+
+	case FFI_TYPE_FLOAT:
+	  /* With FFI_LINUX_SOFT_FLOAT floats are handled like UINT32.  */
+	  if (cif->abi == FFI_LINUX_SOFT_FLOAT)
+	    goto soft_float_closure;
+	  /* unfortunately float values are stored as doubles
+	   * in the ffi_closure_SYSV code (since we don't check
+	   * the type in that routine).
+	   */
+
+	  /* there are 8 64bit floating point registers */
+
+	  if (nf < 8)
+	    {
+	      temp = pfr->d;
+	      pfr->f = (float) temp;
+	      avalue[i] = pfr;
+	      nf++;
+	      pfr++;
+	    }
+	  else
+	    {
+	      /* FIXME? here we are really changing the values
+	       * stored in the original calling routines outgoing
+	       * parameter stack.  This is probably a really
+	       * naughty thing to do but...
+	       */
+	      avalue[i] = pst;
+	      pst += 1;
+	    }
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64.  */
+	  if (cif->abi == FFI_LINUX_SOFT_FLOAT)
+	    goto soft_double_closure;
+	  /* On the outgoing stack all values are aligned to 8 */
+	  /* there are 8 64bit floating point registers */
+
+	  if (nf < 8)
+	    {
+	      avalue[i] = pfr;
+	      nf++;
+	      pfr++;
+	    }
+	  else
+	    {
+	      if (((long) pst) & 4)
+		pst++;
+	      avalue[i] = pst;
+	      pst += 2;
+	    }
+	  break;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	case FFI_TYPE_LONGDOUBLE:
+	  if (cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
+	    goto do_struct;
+	  if (cif->abi == FFI_LINUX_SOFT_FLOAT)
+	    { /* Test if for the whole long double, 4 gprs are available.
+		 otherwise the stuff ends up on the stack.  */
+	      if (ng < 5)
+		{
+		  avalue[i] = pgr;
+		  pgr += 4;
+		  ng += 4;
+		}
+	      else
+		{
+		  avalue[i] = pst;
+		  pst += 4;
+		  ng = 8;
+		}
+	      break;
+	    }
+	  if (nf < 7)
+	    {
+	      avalue[i] = pfr;
+	      pfr += 2;
+	      nf += 2;
+	    }
+	  else
+	    {
+	      if (((long) pst) & 4)
+		pst++;
+	      avalue[i] = pst;
+	      pst += 4;
+	      nf = 8;
+	    }
+	  break;
+#endif
+
+	default:
+	  FFI_ASSERT (0);
+	}
+
+      i++;
+    }
+
+
+  (closure->fun) (cif, rvalue, avalue, closure->user_data);
+
+  /* Tell ffi_closure_SYSV how to perform return type promotions.
+     Because the FFI_SYSV ABI returns the structures <= 8 bytes in r3/r4
+     we have to tell ffi_closure_SYSV how to treat them. We combine the base
+     type FFI_SYSV_TYPE_SMALL_STRUCT - 1  with the size of the struct.
+     So a one byte struct gets the return type 16. Return type 1 to 15 are
+     already used and we never have a struct with size zero. That is the reason
+     for the subtraction of 1. See the comment in ffitarget.h about ordering.
+  */
+  if (cif->abi == FFI_SYSV && cif->rtype->type == FFI_TYPE_STRUCT
+      && size <= 8)
+    return (FFI_SYSV_TYPE_SMALL_STRUCT - 1) + size;
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+  else if (cif->rtype->type == FFI_TYPE_LONGDOUBLE
+	   && cif->abi != FFI_LINUX && cif->abi != FFI_LINUX_SOFT_FLOAT)
+    return FFI_TYPE_STRUCT;
+#endif
+  /* With FFI_LINUX_SOFT_FLOAT floats and doubles are handled like UINT32
+     respectivley UINT64.  */
+  if (cif->abi == FFI_LINUX_SOFT_FLOAT)
+    {
+      switch (cif->rtype->type)
+	{
+	case FFI_TYPE_FLOAT:
+	  return FFI_TYPE_UINT32;
+	  break;
+	case FFI_TYPE_DOUBLE:
+	  return FFI_TYPE_UINT64;
+	  break;
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	case FFI_TYPE_LONGDOUBLE:
+	  return FFI_TYPE_UINT128;
+	  break;
+#endif
+	default:
+	  return cif->rtype->type;
+	}
+    }
+  else
+    {
+      return cif->rtype->type;
+    }
+}
+
+int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_closure *, void *,
+					   unsigned long *, ffi_dblfl *);
+
+int FFI_HIDDEN
+ffi_closure_helper_LINUX64 (ffi_closure *closure, void *rvalue,
+			    unsigned long *pst, ffi_dblfl *pfr)
+{
+  /* rvalue is the pointer to space for return value in closure assembly */
+  /* pst is the pointer to parameter save area
+     (r3-r10 are stored into its first 8 slots by ffi_closure_LINUX64) */
+  /* pfr is the pointer to where f1-f13 are stored in ffi_closure_LINUX64 */
+
+  void **avalue;
+  ffi_type **arg_types;
+  long i, avn;
+  ffi_cif *cif;
+  ffi_dblfl *end_pfr = pfr + NUM_FPR_ARG_REGISTERS64;
+
+  cif = closure->cif;
+  avalue = alloca (cif->nargs * sizeof (void *));
+
+  /* Copy the caller's structure return value address so that the closure
+     returns the data directly to the caller.  */
+  if (cif->rtype->type == FFI_TYPE_STRUCT)
+    {
+      rvalue = (void *) *pst;
+      pst++;
+    }
+
+  i = 0;
+  avn = cif->nargs;
+  arg_types = cif->arg_types;
+
+  /* Grab the addresses of the arguments from the stack frame.  */
+  while (i < avn)
+    {
+      switch (arg_types[i]->type)
+	{
+	case FFI_TYPE_SINT8:
+	case FFI_TYPE_UINT8:
+	  avalue[i] = (char *) pst + 7;
+	  pst++;
+	  break;
+
+	case FFI_TYPE_SINT16:
+	case FFI_TYPE_UINT16:
+	  avalue[i] = (char *) pst + 6;
+	  pst++;
+	  break;
+
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_UINT32:
+	  avalue[i] = (char *) pst + 4;
+	  pst++;
+	  break;
+
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_POINTER:
+	  avalue[i] = pst;
+	  pst++;
+	  break;
+
+	case FFI_TYPE_STRUCT:
+	  /* Structures with size less than eight bytes are passed
+	     left-padded.  */
+	  if (arg_types[i]->size < 8)
+	    avalue[i] = (char *) pst + 8 - arg_types[i]->size;
+	  else
+	    avalue[i] = pst;
+	  pst += (arg_types[i]->size + 7) / 8;
+	  break;
+
+	case FFI_TYPE_FLOAT:
+	  /* unfortunately float values are stored as doubles
+	   * in the ffi_closure_LINUX64 code (since we don't check
+	   * the type in that routine).
+	   */
+
+	  /* there are 13 64bit floating point registers */
+
+	  if (pfr < end_pfr)
+	    {
+	      double temp = pfr->d;
+	      pfr->f = (float) temp;
+	      avalue[i] = pfr;
+	      pfr++;
+	    }
+	  else
+	    avalue[i] = pst;
+	  pst++;
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  /* On the outgoing stack all values are aligned to 8 */
+	  /* there are 13 64bit floating point registers */
+
+	  if (pfr < end_pfr)
+	    {
+	      avalue[i] = pfr;
+	      pfr++;
+	    }
+	  else
+	    avalue[i] = pst;
+	  pst++;
+	  break;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	case FFI_TYPE_LONGDOUBLE:
+	  if (pfr + 1 < end_pfr)
+	    {
+	      avalue[i] = pfr;
+	      pfr += 2;
+	    }
+	  else
+	    {
+	      if (pfr < end_pfr)
+		{
+		  /* Passed partly in f13 and partly on the stack.
+		     Move it all to the stack.  */
+		  *pst = *(unsigned long *) pfr;
+		  pfr++;
+		}
+	      avalue[i] = pst;
+	    }
+	  pst += 2;
+	  break;
+#endif
+
+	default:
+	  FFI_ASSERT (0);
+	}
+
+      i++;
+    }
+
+
+  (closure->fun) (cif, rvalue, avalue, closure->user_data);
+
+  /* Tell ffi_closure_LINUX64 how to perform return type promotions.  */
+  return cif->rtype->type;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c
new file mode 100644
index 0000000..ee03dab
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c
@@ -0,0 +1,1359 @@
+/* -----------------------------------------------------------------------
+   ffi_darwin.c
+
+   Copyright (C) 1998 Geoffrey Keating
+   Copyright (C) 2001 John Hornkvist
+   Copyright (C) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+
+   FFI support for Darwin and AIX.
+   
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+
+extern void ffi_closure_ASM (void);
+
+enum {
+  /* The assembly depends on these exact flags.  
+     For Darwin64 (when FLAG_RETURNS_STRUCT is set):
+       FLAG_RETURNS_FP indicates that the structure embeds FP data.
+       FLAG_RETURNS_128BITS signals a special struct size that is not
+       expanded for float content.  */
+  FLAG_RETURNS_128BITS	= 1 << (31-31), /* These go in cr7  */
+  FLAG_RETURNS_NOTHING	= 1 << (31-30),
+  FLAG_RETURNS_FP	= 1 << (31-29),
+  FLAG_RETURNS_64BITS	= 1 << (31-28),
+
+  FLAG_RETURNS_STRUCT	= 1 << (31-27), /* This goes in cr6  */
+
+  FLAG_ARG_NEEDS_COPY   = 1 << (31- 7),
+  FLAG_FP_ARGUMENTS     = 1 << (31- 6), /* cr1.eq; specified by ABI  */
+  FLAG_4_GPR_ARGUMENTS  = 1 << (31- 5),
+  FLAG_RETVAL_REFERENCE = 1 << (31- 4)
+};
+
+/* About the DARWIN ABI.  */
+enum {
+  NUM_GPR_ARG_REGISTERS = 8,
+  NUM_FPR_ARG_REGISTERS = 13,
+  LINKAGE_AREA_GPRS = 6
+};
+
+enum { ASM_NEEDS_REGISTERS = 4 }; /* r28-r31 */
+
+/* ffi_prep_args is called by the assembly routine once stack space
+   has been allocated for the function's arguments.
+   
+   m32/m64
+
+   The stack layout we want looks like this:
+
+   |   Return address from ffi_call_DARWIN      |	higher addresses
+   |--------------------------------------------|
+   |   Previous backchain pointer	4/8	|	stack pointer here
+   |--------------------------------------------|<+ <<<	on entry to
+   |   ASM_NEEDS_REGISTERS=r28-r31   4*(4/8)	| |	ffi_call_DARWIN
+   |--------------------------------------------| |
+   |   When we have any FP activity... the	| |
+   |   FPRs occupy NUM_FPR_ARG_REGISTERS slots	| |
+   |   here fp13 .. fp1 from high to low addr.	| |
+   ~						~ ~
+   |   Parameters      (at least 8*4/8=32/64)	| | NUM_GPR_ARG_REGISTERS
+   |--------------------------------------------| |
+   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
+   |--------------------------------------------| |	stack	|
+   |   Reserved                       2*4/8	| |	grows	|
+   |--------------------------------------------| |	down	V
+   |   Space for callee's LR		4/8	| |
+   |--------------------------------------------| |	lower addresses
+   |   Saved CR [low word for m64]      4/8	| |
+   |--------------------------------------------| |     stack pointer here
+   |   Current backchain pointer	4/8	|-/	during
+   |--------------------------------------------|   <<<	ffi_call_DARWIN
+
+   */
+
+#if defined(POWERPC_DARWIN64)
+static void
+darwin64_pass_struct_by_value 
+  (ffi_type *, char *, unsigned, unsigned *, double **, unsigned long **);
+#endif
+
+/* This depends on GPR_SIZE = sizeof (unsigned long) */
+
+void
+ffi_prep_args (extended_cif *ecif, unsigned long *const stack)
+{
+  const unsigned bytes = ecif->cif->bytes;
+  const unsigned flags = ecif->cif->flags;
+  const unsigned nargs = ecif->cif->nargs;
+#if !defined(POWERPC_DARWIN64) 
+  const ffi_abi abi = ecif->cif->abi;
+#endif
+
+  /* 'stacktop' points at the previous backchain pointer.  */
+  unsigned long *const stacktop = stack + (bytes / sizeof(unsigned long));
+
+  /* 'fpr_base' points at the space for fpr1, and grows upwards as
+     we use FPR registers.  */
+  double *fpr_base = (double *) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS;
+  int gp_count = 0, fparg_count = 0;
+
+  /* 'next_arg' grows up as we put parameters in it.  */
+  unsigned long *next_arg = stack + LINKAGE_AREA_GPRS; /* 6 reserved positions.  */
+
+  int i;
+  double double_tmp;
+  void **p_argv = ecif->avalue;
+  unsigned long gprvalue;
+  ffi_type** ptr = ecif->cif->arg_types;
+#if !defined(POWERPC_DARWIN64) 
+  char *dest_cpy;
+#endif
+  unsigned size_al = 0;
+
+  /* Check that everything starts aligned properly.  */
+  FFI_ASSERT(((unsigned) (char *) stack & 0xF) == 0);
+  FFI_ASSERT(((unsigned) (char *) stacktop & 0xF) == 0);
+  FFI_ASSERT((bytes & 0xF) == 0);
+
+  /* Deal with return values that are actually pass-by-reference.
+     Rule:
+     Return values are referenced by r3, so r4 is the first parameter.  */
+
+  if (flags & FLAG_RETVAL_REFERENCE)
+    *next_arg++ = (unsigned long) (char *) ecif->rvalue;
+
+  /* Now for the arguments.  */
+  for (i = nargs; i > 0; i--, ptr++, p_argv++)
+    {
+      switch ((*ptr)->type)
+	{
+	/* If a floating-point parameter appears before all of the general-
+	   purpose registers are filled, the corresponding GPRs that match
+	   the size of the floating-point parameter are skipped.  */
+	case FFI_TYPE_FLOAT:
+	  double_tmp = *(float *) *p_argv;
+	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
+	    *fpr_base++ = double_tmp;
+#if defined(POWERPC_DARWIN)
+	  *(float *)next_arg = *(float *) *p_argv;
+#else
+	  *(double *)next_arg = double_tmp;
+#endif
+	  next_arg++;
+	  gp_count++;
+	  fparg_count++;
+	  FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  double_tmp = *(double *) *p_argv;
+	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
+	    *fpr_base++ = double_tmp;
+	  *(double *)next_arg = double_tmp;
+#ifdef POWERPC64
+	  next_arg++;
+	  gp_count++;
+#else
+	  next_arg += 2;
+	  gp_count += 2;
+#endif
+	  fparg_count++;
+	  FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
+	  break;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+
+	case FFI_TYPE_LONGDOUBLE:
+#  if defined(POWERPC64) && !defined(POWERPC_DARWIN64)
+	  /* ??? This will exceed the regs count when the value starts at fp13
+	     and it will not put the extra bit on the stack.  */
+	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
+	    *(long double *) fpr_base++ = *(long double *) *p_argv;
+	  else
+	    *(long double *) next_arg = *(long double *) *p_argv;
+	  next_arg += 2;
+	  fparg_count += 2;
+#  else
+	  double_tmp = ((double *) *p_argv)[0];
+	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
+	    *fpr_base++ = double_tmp;
+	  *(double *) next_arg = double_tmp;
+#    if defined(POWERPC_DARWIN64)
+	  next_arg++;
+	  gp_count++;
+#    else
+	  next_arg += 2;
+	  gp_count += 2;
+#    endif
+	  fparg_count++;
+	  double_tmp = ((double *) *p_argv)[1];
+	  if (fparg_count < NUM_FPR_ARG_REGISTERS)
+	    *fpr_base++ = double_tmp;
+	  *(double *) next_arg = double_tmp;
+#    if defined(POWERPC_DARWIN64)
+	  next_arg++;
+	  gp_count++;
+#    else
+	  next_arg += 2;
+	  gp_count += 2;
+#    endif
+	  fparg_count++;
+#  endif
+	  FFI_ASSERT(flags & FLAG_FP_ARGUMENTS);
+	  break;
+#endif
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_SINT64:
+#ifdef POWERPC64
+	  gprvalue = *(long long *) *p_argv;
+	  goto putgpr;
+#else
+	  *(long long *) next_arg = *(long long *) *p_argv;
+	  next_arg += 2;
+	  gp_count += 2;
+#endif
+	  break;
+	case FFI_TYPE_POINTER:
+	  gprvalue = *(unsigned long *) *p_argv;
+	  goto putgpr;
+	case FFI_TYPE_UINT8:
+	  gprvalue = *(unsigned char *) *p_argv;
+	  goto putgpr;
+	case FFI_TYPE_SINT8:
+	  gprvalue = *(signed char *) *p_argv;
+	  goto putgpr;
+	case FFI_TYPE_UINT16:
+	  gprvalue = *(unsigned short *) *p_argv;
+	  goto putgpr;
+	case FFI_TYPE_SINT16:
+	  gprvalue = *(signed short *) *p_argv;
+	  goto putgpr;
+
+	case FFI_TYPE_STRUCT:
+	  size_al = (*ptr)->size;
+#if defined(POWERPC_DARWIN64)
+	  next_arg = (unsigned long *)ALIGN((char *)next_arg, (*ptr)->alignment);
+	  darwin64_pass_struct_by_value (*ptr, (char *) *p_argv, 
+					 (unsigned) size_al,
+					 (unsigned int *) &fparg_count,
+					 &fpr_base, &next_arg);
+#else
+	  dest_cpy = (char *) next_arg;
+
+	  /* If the first member of the struct is a double, then include enough
+	     padding in the struct size to align it to double-word.  */
+	  if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
+	    size_al = ALIGN((*ptr)->size, 8);
+
+#  if defined(POWERPC64) 
+	  FFI_ASSERT (abi != FFI_DARWIN);
+	  memcpy ((char *) dest_cpy, (char *) *p_argv, size_al);
+	  next_arg += (size_al + 7) / 8;
+#  else
+	  /* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
+	     SI 4 bytes) are aligned as if they were those modes.
+	     Structures with 3 byte in size are padded upwards.  */
+	  if (size_al < 3 && abi == FFI_DARWIN)
+	    dest_cpy += 4 - size_al;
+
+	  memcpy((char *) dest_cpy, (char *) *p_argv, size_al);
+	  next_arg += (size_al + 3) / 4;
+#  endif
+#endif
+	  break;
+
+	case FFI_TYPE_INT:
+	case FFI_TYPE_SINT32:
+	  gprvalue = *(signed int *) *p_argv;
+	  goto putgpr;
+
+	case FFI_TYPE_UINT32:
+	  gprvalue = *(unsigned int *) *p_argv;
+	putgpr:
+	  *next_arg++ = gprvalue;
+	  gp_count++;
+	  break;
+	default:
+	  break;
+	}
+    }
+
+  /* Check that we didn't overrun the stack...  */
+  //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS);
+  //FFI_ASSERT((unsigned *)fpr_base
+  //	     <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS);
+  //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4);
+}
+
+#if defined(POWERPC_DARWIN64)
+
+/* See if we can put some of the struct into fprs.
+   This should not be called for structures of size 16 bytes, since these are not
+   broken out this way.  */
+static void
+darwin64_scan_struct_for_floats (ffi_type *s, unsigned *nfpr)
+{
+  int i;
+
+  FFI_ASSERT (s->type == FFI_TYPE_STRUCT)
+
+  for (i = 0; s->elements[i] != NULL; i++)
+    {
+      ffi_type *p = s->elements[i];
+      switch (p->type)
+	{
+	  case FFI_TYPE_STRUCT:
+	    darwin64_scan_struct_for_floats (p, nfpr);
+	    break;
+	  case FFI_TYPE_LONGDOUBLE:
+	    (*nfpr) += 2;
+	    break;
+	  case FFI_TYPE_DOUBLE:
+	  case FFI_TYPE_FLOAT:
+	    (*nfpr) += 1;
+	    break;
+	  default:
+	    break;    
+	}
+    }
+}
+
+static int
+darwin64_struct_size_exceeds_gprs_p (ffi_type *s, char *src, unsigned *nfpr)
+{
+  unsigned struct_offset=0, i;
+
+  for (i = 0; s->elements[i] != NULL; i++)
+    {
+      char *item_base;
+      ffi_type *p = s->elements[i];
+      /* Find the start of this item (0 for the first one).  */
+      if (i > 0)
+        struct_offset = ALIGN(struct_offset, p->alignment);
+
+      item_base = src + struct_offset;
+
+      switch (p->type)
+	{
+	  case FFI_TYPE_STRUCT:
+	    if (darwin64_struct_size_exceeds_gprs_p (p, item_base, nfpr))
+	      return 1;
+	    break;
+	  case FFI_TYPE_LONGDOUBLE:
+	    if (*nfpr >= NUM_FPR_ARG_REGISTERS)
+	      return 1;
+	    (*nfpr) += 1;
+	    item_base += 8;
+	  /* FALL THROUGH */
+	  case FFI_TYPE_DOUBLE:
+	    if (*nfpr >= NUM_FPR_ARG_REGISTERS)
+	      return 1;
+	    (*nfpr) += 1;
+	    break;
+	  case FFI_TYPE_FLOAT:
+	    if (*nfpr >= NUM_FPR_ARG_REGISTERS)
+	      return 1;
+	    (*nfpr) += 1;
+	    break;
+	  default:
+	    /* If we try and place any item, that is non-float, once we've
+	       exceeded the 8 GPR mark, then we can't fit the struct.  */
+	    if ((unsigned long)item_base >= 8*8) 
+	      return 1;
+	    break;    
+	}
+      /* now count the size of what we just used.  */
+      struct_offset += p->size;
+    }
+  return 0;
+}
+
+/* Can this struct be returned by value?  */
+int 
+darwin64_struct_ret_by_value_p (ffi_type *s)
+{
+  unsigned nfp = 0;
+
+  FFI_ASSERT (s && s->type == FFI_TYPE_STRUCT);
+  
+  /* The largest structure we can return is 8long + 13 doubles.  */
+  if (s->size > 168)
+    return 0;
+  
+  /* We can't pass more than 13 floats.  */
+  darwin64_scan_struct_for_floats (s, &nfp);
+  if (nfp > 13)
+    return 0;
+  
+  /* If there are not too many floats, and the struct is
+     small enough to accommodate in the GPRs, then it must be OK.  */
+  if (s->size <= 64)
+    return 1;
+  
+  /* Well, we have to look harder.  */
+  nfp = 0;
+  if (darwin64_struct_size_exceeds_gprs_p (s, NULL, &nfp))
+    return 0;
+  
+  return 1;
+}
+
+void
+darwin64_pass_struct_floats (ffi_type *s, char *src, 
+			     unsigned *nfpr, double **fprs)
+{
+  int i;
+  double *fpr_base = *fprs;
+  unsigned struct_offset = 0;
+
+  /* We don't assume anything about the alignment of the source.  */
+  for (i = 0; s->elements[i] != NULL; i++)
+    {
+      char *item_base;
+      ffi_type *p = s->elements[i];
+      /* Find the start of this item (0 for the first one).  */
+      if (i > 0)
+        struct_offset = ALIGN(struct_offset, p->alignment);
+      item_base = src + struct_offset;
+
+      switch (p->type)
+	{
+	  case FFI_TYPE_STRUCT:
+	    darwin64_pass_struct_floats (p, item_base, nfpr,
+					   &fpr_base);
+	    break;
+	  case FFI_TYPE_LONGDOUBLE:
+	    if (*nfpr < NUM_FPR_ARG_REGISTERS)
+	      *fpr_base++ = *(double *)item_base;
+	    (*nfpr) += 1;
+	    item_base += 8;
+	  /* FALL THROUGH */
+	  case FFI_TYPE_DOUBLE:
+	    if (*nfpr < NUM_FPR_ARG_REGISTERS)
+	      *fpr_base++ = *(double *)item_base;
+	    (*nfpr) += 1;
+	    break;
+	  case FFI_TYPE_FLOAT:
+	    if (*nfpr < NUM_FPR_ARG_REGISTERS)
+	      *fpr_base++ = (double) *(float *)item_base;
+	    (*nfpr) += 1;
+	    break;
+	  default:
+	    break;    
+	}
+      /* now count the size of what we just used.  */
+      struct_offset += p->size;
+    }
+  /* Update the scores.  */
+  *fprs = fpr_base;
+}
+
+/* Darwin64 special rules.
+   Break out a struct into params and float registers.  */
+static void
+darwin64_pass_struct_by_value (ffi_type *s, char *src, unsigned size,
+			       unsigned *nfpr, double **fprs, unsigned long **arg)
+{
+  unsigned long *next_arg = *arg;
+  char *dest_cpy = (char *)next_arg;
+
+  FFI_ASSERT (s->type == FFI_TYPE_STRUCT)
+
+  if (!size)
+    return;
+
+  /* First... special cases.  */
+  if (size < 3
+      || (size == 4 
+	  && s->elements[0] 
+	  && s->elements[0]->type != FFI_TYPE_FLOAT))
+    {
+      /* Must be at least one GPR, padding is unspecified in value, 
+	 let's make it zero.  */
+      *next_arg = 0UL; 
+      dest_cpy += 8 - size;
+      memcpy ((char *) dest_cpy, src, size);
+      next_arg++;
+    }
+  else if (size == 16)
+    {
+      memcpy ((char *) dest_cpy, src, size);
+      next_arg += 2;
+    }
+  else
+    {
+      /* now the general case, we consider embedded floats.  */
+      memcpy ((char *) dest_cpy, src, size);
+      darwin64_pass_struct_floats (s, src, nfpr, fprs);
+      next_arg += (size+7)/8;
+    }
+    
+  *arg = next_arg;
+}
+
+double *
+darwin64_struct_floats_to_mem (ffi_type *s, char *dest, double *fprs, unsigned *nf)
+{
+  int i;
+  unsigned struct_offset = 0;
+
+  /* We don't assume anything about the alignment of the source.  */
+  for (i = 0; s->elements[i] != NULL; i++)
+    {
+      char *item_base;
+      ffi_type *p = s->elements[i];
+      /* Find the start of this item (0 for the first one).  */
+      if (i > 0)
+        struct_offset = ALIGN(struct_offset, p->alignment);
+      item_base = dest + struct_offset;
+
+      switch (p->type)
+	{
+	  case FFI_TYPE_STRUCT:
+	    fprs = darwin64_struct_floats_to_mem (p, item_base, fprs, nf);
+	    break;
+	  case FFI_TYPE_LONGDOUBLE:
+	    if (*nf < NUM_FPR_ARG_REGISTERS)
+	      {
+		*(double *)item_base = *fprs++ ;
+		(*nf) += 1;
+	      }
+	    item_base += 8;
+	  /* FALL THROUGH */
+	  case FFI_TYPE_DOUBLE:
+	    if (*nf < NUM_FPR_ARG_REGISTERS)
+	      {
+		*(double *)item_base = *fprs++ ;
+		(*nf) += 1;
+	      }
+	    break;
+	  case FFI_TYPE_FLOAT:
+	    if (*nf < NUM_FPR_ARG_REGISTERS)
+	      {
+		*(float *)item_base = (float) *fprs++ ;
+		(*nf) += 1;
+	      }
+	    break;
+	  default:
+	    break;    
+	}
+      /* now count the size of what we just used.  */
+      struct_offset += p->size;
+    }
+  return fprs;
+}
+
+#endif
+
+/* Adjust the size of S to be correct for Darwin.
+   On Darwin m32, the first field of a structure has natural alignment.  
+   On Darwin m64, all fields have natural alignment.  */
+
+static void
+darwin_adjust_aggregate_sizes (ffi_type *s)
+{
+  int i;
+
+  if (s->type != FFI_TYPE_STRUCT)
+    return;
+
+  s->size = 0;
+  for (i = 0; s->elements[i] != NULL; i++)
+    {
+      ffi_type *p;
+      int align;
+      
+      p = s->elements[i];
+      if (p->type == FFI_TYPE_STRUCT)
+	darwin_adjust_aggregate_sizes (p);
+#if defined(POWERPC_DARWIN64)
+      /* Natural alignment for all items.  */
+      align = p->alignment;
+#else
+      /* Natrual alignment for the first item... */
+      if (i == 0)
+	align = p->alignment;
+      else if (p->alignment == 16 || p->alignment < 4)
+	/* .. subsequent items with vector or align < 4 have natural align.  */
+	align = p->alignment;
+      else
+	/* .. or align is 4.  */
+	align = 4;
+#endif
+      /* Pad, if necessary, before adding the current item.  */
+      s->size = ALIGN(s->size, align) + p->size;
+    }
+  
+  s->size = ALIGN(s->size, s->alignment);
+  
+  /* This should not be necessary on m64, but harmless.  */
+  if (s->elements[0]->type == FFI_TYPE_UINT64
+      || s->elements[0]->type == FFI_TYPE_SINT64
+      || s->elements[0]->type == FFI_TYPE_DOUBLE
+      || s->elements[0]->alignment == 8)
+    s->alignment = s->alignment > 8 ? s->alignment : 8;
+  /* Do not add additional tail padding.  */
+}
+
+/* Adjust the size of S to be correct for AIX.
+   Word-align double unless it is the first member of a structure.  */
+
+static void
+aix_adjust_aggregate_sizes (ffi_type *s)
+{
+  int i;
+
+  if (s->type != FFI_TYPE_STRUCT)
+    return;
+
+  s->size = 0;
+  for (i = 0; s->elements[i] != NULL; i++)
+    {
+      ffi_type *p;
+      int align;
+      
+      p = s->elements[i];
+      aix_adjust_aggregate_sizes (p);
+      align = p->alignment;
+      if (i != 0 && p->type == FFI_TYPE_DOUBLE)
+	align = 4;
+      s->size = ALIGN(s->size, align) + p->size;
+    }
+  
+  s->size = ALIGN(s->size, s->alignment);
+  
+  if (s->elements[0]->type == FFI_TYPE_UINT64
+      || s->elements[0]->type == FFI_TYPE_SINT64
+      || s->elements[0]->type == FFI_TYPE_DOUBLE
+      || s->elements[0]->alignment == 8)
+    s->alignment = s->alignment > 8 ? s->alignment : 8;
+  /* Do not add additional tail padding.  */
+}
+
+/* Perform machine dependent cif processing.  */
+ffi_status
+ffi_prep_cif_machdep (ffi_cif *cif)
+{
+  /* All this is for the DARWIN ABI.  */
+  unsigned i;
+  ffi_type **ptr;
+  unsigned bytes;
+  unsigned fparg_count = 0, intarg_count = 0;
+  unsigned flags = 0;
+  unsigned size_al = 0;
+
+  /* All the machine-independent calculation of cif->bytes will be wrong.
+     All the calculation of structure sizes will also be wrong.
+     Redo the calculation for DARWIN.  */
+
+  if (cif->abi == FFI_DARWIN)
+    {
+      darwin_adjust_aggregate_sizes (cif->rtype);
+      for (i = 0; i < cif->nargs; i++)
+	darwin_adjust_aggregate_sizes (cif->arg_types[i]);
+    }
+
+  if (cif->abi == FFI_AIX)
+    {
+      aix_adjust_aggregate_sizes (cif->rtype);
+      for (i = 0; i < cif->nargs; i++)
+	aix_adjust_aggregate_sizes (cif->arg_types[i]);
+    }
+
+  /* Space for the frame pointer, callee's LR, CR, etc, and for
+     the asm's temp regs.  */
+
+  bytes = (LINKAGE_AREA_GPRS + ASM_NEEDS_REGISTERS) * sizeof(unsigned long);
+
+  /* Return value handling.  
+    The rules m32 are as follows:
+     - 32-bit (or less) integer values are returned in gpr3;
+     - structures of size <= 4 bytes also returned in gpr3;
+     - 64-bit integer values [??? and structures between 5 and 8 bytes] are
+       returned in gpr3 and gpr4;
+     - Single/double FP values are returned in fpr1;
+     - Long double FP (if not equivalent to double) values are returned in
+       fpr1 and fpr2;
+     m64:
+     - 64-bit or smaller integral values are returned in GPR3
+     - Single/double FP values are returned in fpr1;
+     - Long double FP values are returned in fpr1 and fpr2;
+     m64 Structures:
+     - If the structure could be accommodated in registers were it to be the
+       first argument to a routine, then it is returned in those registers.
+     m32/m64 structures otherwise:
+     - Larger structures values are allocated space and a pointer is passed
+       as the first argument.  */
+  switch (cif->rtype->type)
+    {
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+    case FFI_TYPE_LONGDOUBLE:
+      flags |= FLAG_RETURNS_128BITS;
+      flags |= FLAG_RETURNS_FP;
+      break;
+#endif
+
+    case FFI_TYPE_DOUBLE:
+      flags |= FLAG_RETURNS_64BITS;
+      /* Fall through.  */
+    case FFI_TYPE_FLOAT:
+      flags |= FLAG_RETURNS_FP;
+      break;
+
+    case FFI_TYPE_UINT64:
+    case FFI_TYPE_SINT64:
+#ifdef POWERPC64
+    case FFI_TYPE_POINTER:
+#endif
+      flags |= FLAG_RETURNS_64BITS;
+      break;
+
+    case FFI_TYPE_STRUCT:
+#if defined(POWERPC_DARWIN64)
+      {
+	/* Can we fit the struct into regs?  */
+	if (darwin64_struct_ret_by_value_p (cif->rtype))
+	  {
+	    unsigned nfpr = 0;
+	    flags |= FLAG_RETURNS_STRUCT;
+	    if (cif->rtype->size != 16)
+	      darwin64_scan_struct_for_floats (cif->rtype, &nfpr) ;
+	    else
+	      flags |= FLAG_RETURNS_128BITS;
+	    /* Will be 0 for 16byte struct.  */
+	    if (nfpr)
+	      flags |= FLAG_RETURNS_FP;
+	  }
+	else /* By ref. */
+	  {
+	    flags |= FLAG_RETVAL_REFERENCE;
+	    flags |= FLAG_RETURNS_NOTHING;
+	    intarg_count++;
+	  }
+      }
+#elif defined(DARWIN_PPC)
+      if (cif->rtype->size <= 4)
+	flags |= FLAG_RETURNS_STRUCT;
+      else /* else by reference.  */
+	{
+	  flags |= FLAG_RETVAL_REFERENCE;
+	  flags |= FLAG_RETURNS_NOTHING;
+	  intarg_count++;
+	}
+#else /* assume we pass by ref.  */
+      flags |= FLAG_RETVAL_REFERENCE;
+      flags |= FLAG_RETURNS_NOTHING;
+      intarg_count++;
+#endif
+      break;
+    case FFI_TYPE_VOID:
+      flags |= FLAG_RETURNS_NOTHING;
+      break;
+
+    default:
+      /* Returns 32-bit integer, or similar.  Nothing to do here.  */
+      break;
+    }
+
+  /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the
+     first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest
+     goes on the stack.  
+     ??? Structures are passed as a pointer to a copy of the structure. 
+     Stuff on the stack needs to keep proper alignment.  
+     For m64 the count is effectively of half-GPRs.  */
+  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
+    {
+      unsigned align_words;
+      switch ((*ptr)->type)
+	{
+	case FFI_TYPE_FLOAT:
+	case FFI_TYPE_DOUBLE:
+	  fparg_count++;
+#if !defined(POWERPC_DARWIN64)
+	  /* If this FP arg is going on the stack, it must be
+	     8-byte-aligned.  */
+	  if (fparg_count > NUM_FPR_ARG_REGISTERS
+	      && (intarg_count & 0x01) != 0)
+	    intarg_count++;
+#endif
+	  break;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	case FFI_TYPE_LONGDOUBLE:
+	  fparg_count += 2;
+	  /* If this FP arg is going on the stack, it must be
+	     16-byte-aligned.  */
+	  if (fparg_count >= NUM_FPR_ARG_REGISTERS)
+#if defined (POWERPC64)
+	    intarg_count = ALIGN(intarg_count, 2);
+#else
+	    intarg_count = ALIGN(intarg_count, 4);
+#endif
+	  break;
+#endif
+
+	case FFI_TYPE_UINT64:
+	case FFI_TYPE_SINT64:
+#if defined(POWERPC64)
+	  intarg_count++;
+#else
+	  /* 'long long' arguments are passed as two words, but
+	     either both words must fit in registers or both go
+	     on the stack.  If they go on the stack, they must
+	     be 8-byte-aligned.  */
+	  if (intarg_count == NUM_GPR_ARG_REGISTERS-1
+	      || (intarg_count >= NUM_GPR_ARG_REGISTERS 
+	          && (intarg_count & 0x01) != 0))
+	    intarg_count++;
+	  intarg_count += 2;
+#endif
+	  break;
+
+	case FFI_TYPE_STRUCT:
+	  size_al = (*ptr)->size;
+#if defined(POWERPC_DARWIN64)
+	  align_words = (*ptr)->alignment >> 3;
+	  if (align_words)
+	    intarg_count = ALIGN(intarg_count, align_words);
+	  /* Base size of the struct.  */
+	  intarg_count += (size_al + 7) / 8;
+	  /* If 16 bytes then don't worry about floats.  */
+	  if (size_al != 16)
+	    /* Scan through for floats to be placed in regs.  */
+	    darwin64_scan_struct_for_floats (*ptr, &fparg_count) ;
+#else
+	  align_words = (*ptr)->alignment >> 2;
+	  if (align_words)
+	    intarg_count = ALIGN(intarg_count, align_words);
+	  /* If the first member of the struct is a double, then align
+	     the struct to double-word. 
+	  if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE)
+	    size_al = ALIGN((*ptr)->size, 8); */
+#  ifdef POWERPC64
+	  intarg_count += (size_al + 7) / 8;
+#  else
+	  intarg_count += (size_al + 3) / 4;
+#  endif
+#endif
+	  break;
+
+	default:
+	  /* Everything else is passed as a 4-byte word in a GPR, either
+	     the object itself or a pointer to it.  */
+	  intarg_count++;
+	  break;
+	}
+    }
+
+  if (fparg_count != 0)
+    flags |= FLAG_FP_ARGUMENTS;
+
+#if defined(POWERPC_DARWIN64)
+  /* Space to image the FPR registers, if needed - which includes when they might be
+     used in a struct return.  */
+  if (fparg_count != 0 
+      || ((flags & FLAG_RETURNS_STRUCT)
+	   && (flags & FLAG_RETURNS_FP)))
+    bytes += NUM_FPR_ARG_REGISTERS * sizeof(double);
+#else
+  /* Space for the FPR registers, if needed.  */
+  if (fparg_count != 0)
+    bytes += NUM_FPR_ARG_REGISTERS * sizeof(double);
+#endif
+
+  /* Stack space.  */
+#ifdef POWERPC64
+  if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS)
+    bytes += (intarg_count + fparg_count) * sizeof(long);
+#else
+  if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS)
+    bytes += (intarg_count + 2 * fparg_count) * sizeof(long);
+#endif
+  else
+    bytes += NUM_GPR_ARG_REGISTERS * sizeof(long);
+
+  /* The stack space allocated needs to be a multiple of 16 bytes.  */
+  bytes = ALIGN(bytes, 16) ;
+
+  cif->flags = flags;
+  cif->bytes = bytes;
+
+  return FFI_OK;
+}
+
+extern void ffi_call_AIX(extended_cif *, long, unsigned, unsigned *,
+			 void (*fn)(void), void (*fn2)(void));
+
+extern void ffi_call_DARWIN(extended_cif *, long, unsigned, unsigned *,
+			    void (*fn)(void), void (*fn2)(void), ffi_type*);
+
+void
+ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+
+  /* If the return value is a struct and we don't have a return
+     value address then we need to make one.  */
+
+  if ((rvalue == NULL) &&
+      (cif->rtype->type == FFI_TYPE_STRUCT))
+    {
+      ecif.rvalue = alloca (cif->rtype->size);
+    }
+  else
+    ecif.rvalue = rvalue;
+
+  switch (cif->abi)
+    {
+    case FFI_AIX:
+      ffi_call_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
+		   FFI_FN(ffi_prep_args));
+      break;
+    case FFI_DARWIN:
+      ffi_call_DARWIN(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn,
+		      FFI_FN(ffi_prep_args), cif->rtype);
+      break;
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+}
+
+static void flush_icache(char *);
+static void flush_range(char *, int);
+
+/* The layout of a function descriptor.  A C function pointer really
+   points to one of these.  */
+
+typedef struct aix_fd_struct {
+  void *code_pointer;
+  void *toc;
+} aix_fd;
+
+/* here I'd like to add the stack frame layout we use in darwin_closure.S
+   and aix_closure.S
+
+   m32/m64
+
+   The stack layout looks like this:
+
+   |   Additional params...			| |     Higher address
+   ~						~ ~
+   |   Parameters      (at least 8*4/8=32/64)	| | NUM_GPR_ARG_REGISTERS
+   |--------------------------------------------| |
+   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
+   |--------------------------------------------| |
+   |   Reserved                       2*4/8	| |
+   |--------------------------------------------| |
+   |   Space for callee's LR		4/8	| |
+   |--------------------------------------------| |
+   |   Saved CR [low word for m64]      4/8	| |
+   |--------------------------------------------| |
+   |   Current backchain pointer	4/8	|-/ Parent's frame.
+   |--------------------------------------------| <+ <<< on entry to ffi_closure_ASM
+   |   Result Bytes			16	| |
+   |--------------------------------------------| |
+   ~   padding to 16-byte alignment		~ ~
+   |--------------------------------------------| |
+   |   NUM_FPR_ARG_REGISTERS slots		| |
+   |   here fp13 .. fp1		       13*8	| |
+   |--------------------------------------------| |
+   |   R3..R10			  8*4/8=32/64	| | NUM_GPR_ARG_REGISTERS
+   |--------------------------------------------| |
+   |   TOC=R2 (AIX) Reserved (Darwin)   4/8	| |
+   |--------------------------------------------| |	stack	|
+   |   Reserved [compiler,binder]     2*4/8	| |	grows	|
+   |--------------------------------------------| |	down	V
+   |   Space for callee's LR		4/8	| |
+   |--------------------------------------------| |	lower addresses
+   |   Saved CR [low word for m64]      4/8	| |
+   |--------------------------------------------| |     stack pointer here
+   |   Current backchain pointer	4/8	|-/	during
+   |--------------------------------------------|   <<<	ffi_closure_ASM.
+
+*/
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*, void*, void**, void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  unsigned int *tramp;
+  struct ffi_aix_trampoline_struct *tramp_aix;
+  aix_fd *fd;
+
+  switch (cif->abi)
+    {
+      case FFI_DARWIN:
+
+	FFI_ASSERT (cif->abi == FFI_DARWIN);
+
+	tramp = (unsigned int *) &closure->tramp[0];
+#if defined(POWERPC_DARWIN64)
+	tramp[0] = 0x7c0802a6;  /*   mflr    r0  */
+	tramp[1] = 0x429f0015;  /*   bcl-    20,4*cr7+so,  +0x18 (L1)  */
+	/* We put the addresses here.  */
+	tramp[6] = 0x7d6802a6;  /*L1:   mflr    r11  */
+	tramp[7] = 0xe98b0000;  /*   ld     r12,0(r11) function address  */
+	tramp[8] = 0x7c0803a6;  /*   mtlr    r0   */
+	tramp[9] = 0x7d8903a6;  /*   mtctr   r12  */
+	tramp[10] = 0xe96b0008;  /*   lwz     r11,8(r11) static chain  */
+	tramp[11] = 0x4e800420;  /*   bctr  */
+
+	*((unsigned long *)&tramp[2]) = (unsigned long) ffi_closure_ASM; /* function  */
+	*((unsigned long *)&tramp[4]) = (unsigned long) codeloc; /* context  */
+#else
+	tramp[0] = 0x7c0802a6;  /*   mflr    r0  */
+	tramp[1] = 0x429f000d;  /*   bcl-    20,4*cr7+so,0x10  */
+	tramp[4] = 0x7d6802a6;  /*   mflr    r11  */
+	tramp[5] = 0x818b0000;  /*   lwz     r12,0(r11) function address  */
+	tramp[6] = 0x7c0803a6;  /*   mtlr    r0   */
+	tramp[7] = 0x7d8903a6;  /*   mtctr   r12  */
+	tramp[8] = 0x816b0004;  /*   lwz     r11,4(r11) static chain  */
+	tramp[9] = 0x4e800420;  /*   bctr  */
+	tramp[2] = (unsigned long) ffi_closure_ASM; /* function  */
+	tramp[3] = (unsigned long) codeloc; /* context  */
+#endif
+	closure->cif = cif;
+	closure->fun = fun;
+	closure->user_data = user_data;
+
+	/* Flush the icache. Only necessary on Darwin.  */
+	flush_range(codeloc, FFI_TRAMPOLINE_SIZE);
+
+	break;
+
+    case FFI_AIX:
+
+      tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp);
+      fd = (aix_fd *)(void *)ffi_closure_ASM;
+
+      FFI_ASSERT (cif->abi == FFI_AIX);
+
+      tramp_aix->code_pointer = fd->code_pointer;
+      tramp_aix->toc = fd->toc;
+      tramp_aix->static_chain = codeloc;
+      closure->cif = cif;
+      closure->fun = fun;
+      closure->user_data = user_data;
+
+    default:
+
+      FFI_ASSERT(0);
+      break;
+    }
+  return FFI_OK;
+}
+
+static void
+flush_icache(char *addr)
+{
+#ifndef _AIX
+  __asm__ volatile (
+		"dcbf 0,%0\n"
+		"\tsync\n"
+		"\ticbi 0,%0\n"
+		"\tsync\n"
+		"\tisync"
+		: : "r"(addr) : "memory");
+#endif
+}
+
+static void
+flush_range(char * addr1, int size)
+{
+#define MIN_LINE_SIZE 32
+  int i;
+  for (i = 0; i < size; i += MIN_LINE_SIZE)
+    flush_icache(addr1+i);
+  flush_icache(addr1+size-1);
+}
+
+typedef union
+{
+  float f;
+  double d;
+} ffi_dblfl;
+
+ffi_type *
+ffi_closure_helper_DARWIN (ffi_closure *, void *,
+			   unsigned long *, ffi_dblfl *);
+
+/* Basically the trampoline invokes ffi_closure_ASM, and on
+   entry, r11 holds the address of the closure.
+   After storing the registers that could possibly contain
+   parameters to be passed into the stack frame and setting
+   up space for a return value, ffi_closure_ASM invokes the
+   following helper function to do most of the work.  */
+
+ffi_type *
+ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue,
+			   unsigned long *pgr, ffi_dblfl *pfr)
+{
+  /* rvalue is the pointer to space for return value in closure assembly
+     pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM
+     pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM.  */
+
+  typedef double ldbits[2];
+
+  union ldu
+  {
+    ldbits lb;
+    long double ld;
+  };
+
+  void **          avalue;
+  ffi_type **      arg_types;
+  long             i, avn;
+  ffi_cif *        cif;
+  ffi_dblfl *      end_pfr = pfr + NUM_FPR_ARG_REGISTERS;
+  unsigned         size_al;
+#if defined(POWERPC_DARWIN64)
+  unsigned 	   fpsused = 0;
+#endif
+
+  cif = closure->cif;
+  avalue = alloca (cif->nargs * sizeof(void *));
+
+  if (cif->rtype->type == FFI_TYPE_STRUCT)
+    {
+#if defined(POWERPC_DARWIN64)
+      if (!darwin64_struct_ret_by_value_p (cif->rtype))
+	{
+    	  /* Won't fit into the regs - return by ref.  */
+	  rvalue = (void *) *pgr;
+	  pgr++;
+	}
+#elif defined(DARWIN_PPC)
+      if (cif->rtype->size > 4)
+	{
+	  rvalue = (void *) *pgr;
+	  pgr++;
+	}
+#else /* assume we return by ref.  */
+      rvalue = (void *) *pgr;
+      pgr++;
+#endif
+    }
+
+  i = 0;
+  avn = cif->nargs;
+  arg_types = cif->arg_types;
+
+  /* Grab the addresses of the arguments from the stack frame.  */
+  while (i < avn)
+    {
+      switch (arg_types[i]->type)
+	{
+	case FFI_TYPE_SINT8:
+	case FFI_TYPE_UINT8:
+#if  defined(POWERPC64)
+	  avalue[i] = (char *) pgr + 7;
+#else
+	  avalue[i] = (char *) pgr + 3;
+#endif
+	  pgr++;
+	  break;
+
+	case FFI_TYPE_SINT16:
+	case FFI_TYPE_UINT16:
+#if  defined(POWERPC64)
+	  avalue[i] = (char *) pgr + 6;
+#else
+	  avalue[i] = (char *) pgr + 2;
+#endif
+	  pgr++;
+	  break;
+
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_UINT32:
+#if  defined(POWERPC64)
+	  avalue[i] = (char *) pgr + 4;
+#else
+	case FFI_TYPE_POINTER:
+	  avalue[i] = pgr;
+#endif
+	  pgr++;
+	  break;
+
+	case FFI_TYPE_STRUCT:
+	  size_al = arg_types[i]->size;
+#if defined(POWERPC_DARWIN64)
+	  pgr = (unsigned long *)ALIGN((char *)pgr, arg_types[i]->alignment);
+	  if (size_al < 3 || size_al == 4)
+	    {
+	      avalue[i] = ((char *)pgr)+8-size_al;
+	      if (arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT
+		  && fpsused < NUM_FPR_ARG_REGISTERS)
+		{
+		  *(float *)pgr = (float) *(double *)pfr;
+		  pfr++;
+		  fpsused++;
+		}
+	    }
+	  else 
+	    {
+	      if (size_al != 16)
+		pfr = (ffi_dblfl *) 
+		    darwin64_struct_floats_to_mem (arg_types[i], (char *)pgr,
+						   (double *)pfr, &fpsused);
+	      avalue[i] = pgr;
+	    }
+	  pgr += (size_al + 7) / 8;
+#else
+	  /* If the first member of the struct is a double, then align
+	     the struct to double-word.  */
+	  if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
+	    size_al = ALIGN(arg_types[i]->size, 8);
+#  if defined(POWERPC64)
+	  FFI_ASSERT (cif->abi != FFI_DARWIN)
+	  avalue[i] = pgr;
+	  pgr += (size_al + 7) / 8;
+#  else
+	  /* Structures that match the basic modes (QI 1 byte, HI 2 bytes,
+	     SI 4 bytes) are aligned as if they were those modes.  */
+	  if (size_al < 3 && cif->abi == FFI_DARWIN)
+	    avalue[i] = (char*) pgr + 4 - size_al;
+	  else
+	    avalue[i] = pgr;
+	  pgr += (size_al + 3) / 4;
+#  endif
+#endif
+	  break;
+
+	case FFI_TYPE_SINT64:
+	case FFI_TYPE_UINT64:
+#if  defined(POWERPC64)
+	case FFI_TYPE_POINTER:
+	  avalue[i] = pgr;
+	  pgr++;
+	  break;
+#else
+	  /* Long long ints are passed in two gpr's.  */
+	  avalue[i] = pgr;
+	  pgr += 2;
+	  break;
+#endif
+
+	case FFI_TYPE_FLOAT:
+	  /* A float value consumes a GPR.
+	     There are 13 64bit floating point registers.  */
+	  if (pfr < end_pfr)
+	    {
+	      double temp = pfr->d;
+	      pfr->f = (float) temp;
+	      avalue[i] = pfr;
+	      pfr++;
+	    }
+	  else
+	    {
+	      avalue[i] = pgr;
+	    }
+	  pgr++;
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  /* A double value consumes two GPRs.
+	     There are 13 64bit floating point registers.  */
+	  if (pfr < end_pfr)
+	    {
+	      avalue[i] = pfr;
+	      pfr++;
+	    }
+	  else
+	    {
+	      avalue[i] = pgr;
+	    }
+#ifdef POWERPC64
+	  pgr++;
+#else
+	  pgr += 2;
+#endif
+	  break;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+
+	case FFI_TYPE_LONGDOUBLE:
+#ifdef POWERPC64
+	  if (pfr + 1 < end_pfr)
+	    {
+	      avalue[i] = pfr;
+	      pfr += 2;
+	    }
+	  else
+	    {
+	      if (pfr < end_pfr)
+		{
+		  *pgr = *(unsigned long *) pfr;
+		  pfr++;
+		}
+	      avalue[i] = pgr;
+	    }
+	  pgr += 2;
+#else  /* POWERPC64 */
+	  /* A long double value consumes four GPRs and two FPRs.
+	     There are 13 64bit floating point registers.  */
+	  if (pfr + 1 < end_pfr)
+	    {
+	      avalue[i] = pfr;
+	      pfr += 2;
+	    }
+	  /* Here we have the situation where one part of the long double
+	     is stored in fpr13 and the other part is already on the stack.
+	     We use a union to pass the long double to avalue[i].  */
+	  else if (pfr + 1 == end_pfr)
+	    {
+	      union ldu temp_ld;
+	      memcpy (&temp_ld.lb[0], pfr, sizeof(ldbits));
+	      memcpy (&temp_ld.lb[1], pgr + 2, sizeof(ldbits));
+	      avalue[i] = &temp_ld.ld;
+	      pfr++;
+	    }
+	  else
+	    {
+	      avalue[i] = pgr;
+	    }
+	  pgr += 4;
+#endif  /* POWERPC64 */
+	  break;
+#endif
+	default:
+	  FFI_ASSERT(0);
+	}
+      i++;
+    }
+
+  (closure->fun) (cif, rvalue, avalue, closure->user_data);
+
+  /* Tell ffi_closure_ASM to perform return type promotions.  */
+  return cif->rtype;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffitarget.h
new file mode 100644
index 0000000..d17f731
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ffitarget.h
@@ -0,0 +1,139 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc
+   Target configuration macros for PowerPC.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+/* ---- System specific configurations ----------------------------------- */
+
+#if defined (POWERPC) && defined (__powerpc64__)	/* linux64 */
+#ifndef POWERPC64
+#define POWERPC64
+#endif
+#elif defined (POWERPC_DARWIN) && defined (__ppc64__)	/* Darwin64 */
+#ifndef POWERPC64
+#define POWERPC64
+#endif
+#ifndef POWERPC_DARWIN64
+#define POWERPC_DARWIN64
+#endif
+#elif defined (POWERPC_AIX) && defined (__64BIT__)	/* AIX64 */
+#ifndef POWERPC64
+#define POWERPC64
+#endif
+#endif
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+
+#ifdef POWERPC
+  FFI_SYSV,
+  FFI_GCC_SYSV,
+  FFI_LINUX64,
+  FFI_LINUX,
+  FFI_LINUX_SOFT_FLOAT,
+# ifdef POWERPC64
+  FFI_DEFAULT_ABI = FFI_LINUX64,
+# else
+#  if (!defined(__NO_FPRS__) && (__LDBL_MANT_DIG__ == 106))
+  FFI_DEFAULT_ABI = FFI_LINUX,
+#  else
+#   ifdef __NO_FPRS__
+  FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT,
+#   else
+  FFI_DEFAULT_ABI = FFI_GCC_SYSV,
+#   endif
+#  endif
+# endif
+#endif
+
+#ifdef POWERPC_AIX
+  FFI_AIX,
+  FFI_DARWIN,
+  FFI_DEFAULT_ABI = FFI_AIX,
+#endif
+
+#ifdef POWERPC_DARWIN
+  FFI_AIX,
+  FFI_DARWIN,
+  FFI_DEFAULT_ABI = FFI_DARWIN,
+#endif
+
+#ifdef POWERPC_FREEBSD
+  FFI_SYSV,
+  FFI_GCC_SYSV,
+  FFI_LINUX64,
+  FFI_LINUX,
+  FFI_LINUX_SOFT_FLOAT,
+  FFI_DEFAULT_ABI = FFI_SYSV,
+#endif
+
+  FFI_LAST_ABI
+} ffi_abi;
+#endif
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_NATIVE_RAW_API 0
+
+/* For additional types like the below, take care about the order in
+   ppc_closures.S. They must follow after the FFI_TYPE_LAST.  */
+
+/* Needed for soft-float long-double-128 support.  */
+#define FFI_TYPE_UINT128 (FFI_TYPE_LAST + 1)
+
+/* Needed for FFI_SYSV small structure returns.
+   We use two flag bits, (FLAG_SYSV_SMST_R3, FLAG_SYSV_SMST_R4) which are
+   defined in ffi.c, to determine the exact return type and its size.  */
+#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 2)
+
+#if defined(POWERPC64) || defined(POWERPC_AIX)
+#  if defined(POWERPC_DARWIN64)
+#    define FFI_TRAMPOLINE_SIZE 48
+#  else
+#    define FFI_TRAMPOLINE_SIZE 24
+#  endif
+#else /* POWERPC || POWERPC_AIX */
+#  define FFI_TRAMPOLINE_SIZE 40
+#endif
+
+#ifndef LIBFFI_ASM
+#if defined(POWERPC_DARWIN) || defined(POWERPC_AIX)
+struct ffi_aix_trampoline_struct {
+    void * code_pointer;	/* Pointer to ffi_closure_ASM */
+    void * toc;			/* TOC */
+    void * static_chain;	/* Pointer to closure */
+};
+#endif
+#endif
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64.S
new file mode 100644
index 0000000..57b56cb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64.S
@@ -0,0 +1,187 @@
+/* -----------------------------------------------------------------------
+   sysv.h - Copyright (c) 2003 Jakub Jelinek <jakub@redhat.com>
+	    Copyright (c) 2008 Red Hat, Inc.
+
+   PowerPC64 Assembly glue.
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+
+#ifdef __powerpc64__
+	.hidden	ffi_call_LINUX64, .ffi_call_LINUX64
+	.globl	ffi_call_LINUX64, .ffi_call_LINUX64
+	.section	".opd","aw"
+	.align	3
+ffi_call_LINUX64:
+	.quad	.ffi_call_LINUX64,.TOC.@tocbase,0
+	.size	ffi_call_LINUX64,24
+	.type	.ffi_call_LINUX64,@function
+	.text
+.ffi_call_LINUX64:
+.LFB1:
+	mflr	%r0
+	std	%r28, -32(%r1)
+	std	%r29, -24(%r1)
+	std	%r30, -16(%r1)
+	std	%r31, -8(%r1)
+	std	%r0, 16(%r1)
+
+	mr	%r28, %r1	/* our AP.  */
+.LCFI0:
+	stdux	%r1, %r1, %r4
+	mr	%r31, %r5	/* flags, */
+	mr	%r30, %r6	/* rvalue, */
+	mr	%r29, %r7	/* function address.  */
+	std	%r2, 40(%r1)
+
+	/* Call ffi_prep_args64.  */
+	mr	%r4, %r1
+	bl	.ffi_prep_args64
+
+	ld	%r0, 0(%r29)
+	ld	%r2, 8(%r29)
+	ld	%r11, 16(%r29)
+
+	/* Now do the call.  */
+	/* Set up cr1 with bits 4-7 of the flags.  */
+	mtcrf	0x40, %r31
+
+	/* Get the address to call into CTR.  */
+	mtctr	%r0
+	/* Load all those argument registers.  */
+	ld	%r3, -32-(8*8)(%r28)
+	ld	%r4, -32-(7*8)(%r28)
+	ld	%r5, -32-(6*8)(%r28)
+	ld	%r6, -32-(5*8)(%r28)
+	bf-	5, 1f
+	ld	%r7, -32-(4*8)(%r28)
+	ld	%r8, -32-(3*8)(%r28)
+	ld	%r9, -32-(2*8)(%r28)
+	ld	%r10, -32-(1*8)(%r28)
+1:
+
+	/* Load all the FP registers.  */
+	bf-	6, 2f
+	lfd	%f1, -32-(21*8)(%r28)
+	lfd	%f2, -32-(20*8)(%r28)
+	lfd	%f3, -32-(19*8)(%r28)
+	lfd	%f4, -32-(18*8)(%r28)
+	lfd	%f5, -32-(17*8)(%r28)
+	lfd	%f6, -32-(16*8)(%r28)
+	lfd	%f7, -32-(15*8)(%r28)
+	lfd	%f8, -32-(14*8)(%r28)
+	lfd	%f9, -32-(13*8)(%r28)
+	lfd	%f10, -32-(12*8)(%r28)
+	lfd	%f11, -32-(11*8)(%r28)
+	lfd	%f12, -32-(10*8)(%r28)
+	lfd	%f13, -32-(9*8)(%r28)
+2:
+
+	/* Make the call.  */
+	bctrl
+
+	/* This must follow the call immediately, the unwinder
+	   uses this to find out if r2 has been saved or not.  */
+	ld	%r2, 40(%r1)
+
+	/* Now, deal with the return value.  */
+	mtcrf	0x01, %r31
+	bt-	30, .Ldone_return_value
+	bt-	29, .Lfp_return_value
+	std	%r3, 0(%r30)
+	/* Fall through...  */
+
+.Ldone_return_value:
+	/* Restore the registers we used and return.  */
+	mr	%r1, %r28
+	ld	%r0, 16(%r28)
+	ld	%r28, -32(%r1)
+	mtlr	%r0
+	ld	%r29, -24(%r1)
+	ld	%r30, -16(%r1)
+	ld	%r31, -8(%r1)
+	blr
+
+.Lfp_return_value:
+	bf	28, .Lfloat_return_value
+	stfd	%f1, 0(%r30)
+	mtcrf	0x02, %r31 /* cr6  */
+	bf	27, .Ldone_return_value
+	stfd	%f2, 8(%r30)
+	b	.Ldone_return_value
+.Lfloat_return_value:
+	stfs	%f1, 0(%r30)
+	b	.Ldone_return_value
+.LFE1:
+	.long	0
+	.byte	0,12,0,1,128,4,0,0
+	.size	.ffi_call_LINUX64,.-.ffi_call_LINUX64
+
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
+.Lframe1:
+	.4byte	.LECIE1-.LSCIE1	 # Length of Common Information Entry
+.LSCIE1:
+	.4byte	0x0	 # CIE Identifier Tag
+	.byte	0x1	 # CIE Version
+	.ascii "zR\0"	 # CIE Augmentation
+	.uleb128 0x1	 # CIE Code Alignment Factor
+	.sleb128 -8	 # CIE Data Alignment Factor
+	.byte	0x41	 # CIE RA Column
+	.uleb128 0x1	 # Augmentation size
+	.byte	0x14	 # FDE Encoding (pcrel udata8)
+	.byte	0xc	 # DW_CFA_def_cfa
+	.uleb128 0x1
+	.uleb128 0x0
+	.align 3
+.LECIE1:
+.LSFDE1:
+	.4byte	.LEFDE1-.LASFDE1	 # FDE Length
+.LASFDE1:
+	.4byte	.LASFDE1-.Lframe1	 # FDE CIE offset
+	.8byte	.LFB1-.	 # FDE initial location
+	.8byte	.LFE1-.LFB1	 # FDE address range
+	.uleb128 0x0	 # Augmentation size
+	.byte	0x2	 # DW_CFA_advance_loc1
+	.byte	.LCFI0-.LFB1
+	.byte	0xd	 # DW_CFA_def_cfa_register
+	.uleb128 0x1c
+	.byte	0x11	 # DW_CFA_offset_extended_sf
+	.uleb128 0x41
+	.sleb128 -2
+	.byte	0x9f	 # DW_CFA_offset, column 0x1f
+	.uleb128 0x1
+	.byte	0x9e	 # DW_CFA_offset, column 0x1e
+	.uleb128 0x2
+	.byte	0x9d	 # DW_CFA_offset, column 0x1d
+	.uleb128 0x3
+	.byte	0x9c	 # DW_CFA_offset, column 0x1c
+	.uleb128 0x4
+	.align 3
+.LEFDE1:
+#endif
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64_closure.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64_closure.S
new file mode 100644
index 0000000..f7aa2c9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/linux64_closure.S
@@ -0,0 +1,236 @@
+/* -----------------------------------------------------------------------
+   sysv.h - Copyright (c) 2003 Jakub Jelinek <jakub@redhat.com>
+	    Copyright (c) 2008 Red Hat, Inc.
+
+   PowerPC64 Assembly glue.
+
+   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.
+   ----------------------------------------------------------------------- */
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+
+	.file	"linux64_closure.S"
+
+#ifdef __powerpc64__
+	FFI_HIDDEN (ffi_closure_LINUX64)
+	FFI_HIDDEN (.ffi_closure_LINUX64)
+	.globl  ffi_closure_LINUX64, .ffi_closure_LINUX64
+	.section        ".opd","aw"
+	.align  3
+ffi_closure_LINUX64:
+	.quad   .ffi_closure_LINUX64,.TOC.@tocbase,0
+	.size   ffi_closure_LINUX64,24
+	.type   .ffi_closure_LINUX64,@function
+	.text
+.ffi_closure_LINUX64:
+.LFB1:
+	# save general regs into parm save area
+	std	%r3, 48(%r1)
+	std	%r4, 56(%r1)
+	std	%r5, 64(%r1)
+	std	%r6, 72(%r1)
+	mflr	%r0
+
+	std	%r7, 80(%r1)
+	std	%r8, 88(%r1)
+	std	%r9, 96(%r1)
+	std	%r10, 104(%r1)
+	std	%r0, 16(%r1)
+
+	# mandatory 48 bytes special reg save area + 64 bytes parm save area
+	# + 16 bytes retval area + 13*8 bytes fpr save area + round to 16
+	stdu	%r1, -240(%r1)
+.LCFI0:
+
+	# next save fpr 1 to fpr 13
+	stfd  %f1, 128+(0*8)(%r1)
+	stfd  %f2, 128+(1*8)(%r1)
+	stfd  %f3, 128+(2*8)(%r1)
+	stfd  %f4, 128+(3*8)(%r1)
+	stfd  %f5, 128+(4*8)(%r1)
+	stfd  %f6, 128+(5*8)(%r1)
+	stfd  %f7, 128+(6*8)(%r1)
+	stfd  %f8, 128+(7*8)(%r1)
+	stfd  %f9, 128+(8*8)(%r1)
+	stfd  %f10, 128+(9*8)(%r1)
+	stfd  %f11, 128+(10*8)(%r1)
+	stfd  %f12, 128+(11*8)(%r1)
+	stfd  %f13, 128+(12*8)(%r1)
+
+	# set up registers for the routine that actually does the work
+	# get the context pointer from the trampoline
+	mr %r3, %r11
+
+	# now load up the pointer to the result storage
+	addi %r4, %r1, 112
+
+	# now load up the pointer to the parameter save area
+	# in the previous frame
+	addi %r5, %r1, 240 + 48
+
+	# now load up the pointer to the saved fpr registers */
+	addi %r6, %r1, 128
+
+	# make the call
+	bl .ffi_closure_helper_LINUX64
+.Lret:
+
+	# now r3 contains the return type
+	# so use it to look up in a table
+	# so we know how to deal with each type
+
+	# look up the proper starting point in table
+	# by using return type as offset
+	mflr %r4		# move address of .Lret to r4
+	sldi %r3, %r3, 4	# now multiply return type by 16
+	addi %r4, %r4, .Lret_type0 - .Lret
+	ld %r0, 240+16(%r1)
+	add %r3, %r3, %r4	# add contents of table to table address
+	mtctr %r3
+	bctr			# jump to it
+
+# Each of the ret_typeX code fragments has to be exactly 16 bytes long
+# (4 instructions). For cache effectiveness we align to a 16 byte boundary
+# first.
+	.align 4
+
+.Lret_type0:
+# case FFI_TYPE_VOID
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+	nop
+# case FFI_TYPE_INT
+	lwa %r3, 112+4(%r1)
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+# case FFI_TYPE_FLOAT
+	lfs %f1, 112+0(%r1)
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+# case FFI_TYPE_DOUBLE
+	lfd %f1, 112+0(%r1)
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+# case FFI_TYPE_LONGDOUBLE
+	lfd %f1, 112+0(%r1)
+	mtlr %r0
+	lfd %f2, 112+8(%r1)
+	b .Lfinish
+# case FFI_TYPE_UINT8
+	lbz %r3, 112+7(%r1)
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+# case FFI_TYPE_SINT8
+	lbz %r3, 112+7(%r1)
+	extsb %r3,%r3
+	mtlr %r0
+	b .Lfinish
+# case FFI_TYPE_UINT16
+	lhz %r3, 112+6(%r1)
+	mtlr %r0
+.Lfinish:
+	addi %r1, %r1, 240
+	blr
+# case FFI_TYPE_SINT16
+	lha %r3, 112+6(%r1)
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+# case FFI_TYPE_UINT32
+	lwz %r3, 112+4(%r1)
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+# case FFI_TYPE_SINT32
+	lwa %r3, 112+4(%r1)
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+# case FFI_TYPE_UINT64
+	ld %r3, 112+0(%r1)
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+# case FFI_TYPE_SINT64
+	ld %r3, 112+0(%r1)
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+# case FFI_TYPE_STRUCT
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+	nop
+# case FFI_TYPE_POINTER
+	ld %r3, 112+0(%r1)
+	mtlr %r0
+	addi %r1, %r1, 240
+	blr
+# esac
+.LFE1:
+	.long	0
+	.byte	0,12,0,1,128,0,0,0
+	.size	.ffi_closure_LINUX64,.-.ffi_closure_LINUX64
+
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
+.Lframe1:
+	.4byte	.LECIE1-.LSCIE1	 # Length of Common Information Entry
+.LSCIE1:
+	.4byte	0x0	 # CIE Identifier Tag
+	.byte	0x1	 # CIE Version
+	.ascii "zR\0"	 # CIE Augmentation
+	.uleb128 0x1	 # CIE Code Alignment Factor
+	.sleb128 -8	 # CIE Data Alignment Factor
+	.byte	0x41	 # CIE RA Column
+	.uleb128 0x1	 # Augmentation size
+	.byte	0x14	 # FDE Encoding (pcrel udata8)
+	.byte	0xc	 # DW_CFA_def_cfa
+	.uleb128 0x1
+	.uleb128 0x0
+	.align 3
+.LECIE1:
+.LSFDE1:
+	.4byte	.LEFDE1-.LASFDE1	 # FDE Length
+.LASFDE1:
+	.4byte	.LASFDE1-.Lframe1	 # FDE CIE offset
+	.8byte	.LFB1-.	 # FDE initial location
+	.8byte	.LFE1-.LFB1	 # FDE address range
+	.uleb128 0x0	 # Augmentation size
+	.byte	0x2	 # DW_CFA_advance_loc1
+	.byte	.LCFI0-.LFB1
+	.byte	0xe	 # DW_CFA_def_cfa_offset
+	.uleb128 240
+	.byte	0x11	 # DW_CFA_offset_extended_sf
+	.uleb128 0x41
+	.sleb128 -2
+	.align 3
+.LEFDE1:
+#endif
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ppc_closure.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ppc_closure.S
new file mode 100644
index 0000000..56f7d1a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/ppc_closure.S
@@ -0,0 +1,327 @@
+/* -----------------------------------------------------------------------
+   sysv.h - Copyright (c) 2003 Jakub Jelinek <jakub@redhat.com>
+	    Copyright (c) 2008 Red Hat, Inc.
+
+   PowerPC Assembly glue.
+
+   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.
+   ----------------------------------------------------------------------- */
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+#include <powerpc/asm.h>
+
+	.file   "ppc_closure.S"
+
+#ifndef __powerpc64__
+
+ENTRY(ffi_closure_SYSV)
+.LFB1:
+	stwu %r1,-144(%r1)
+.LCFI0:
+	mflr %r0
+.LCFI1:
+	stw %r0,148(%r1)
+
+# we want to build up an areas for the parameters passed
+# in registers (both floating point and integer)
+
+	# so first save gpr 3 to gpr 10 (aligned to 4)
+	stw   %r3, 16(%r1)
+	stw   %r4, 20(%r1)
+	stw   %r5, 24(%r1)
+	stw   %r6, 28(%r1)
+	stw   %r7, 32(%r1)
+	stw   %r8, 36(%r1)
+	stw   %r9, 40(%r1)
+	stw   %r10,44(%r1)
+
+#ifndef __NO_FPRS__
+	# next save fpr 1 to fpr 8 (aligned to 8)
+	stfd  %f1, 48(%r1)
+	stfd  %f2, 56(%r1)
+	stfd  %f3, 64(%r1)
+	stfd  %f4, 72(%r1)
+	stfd  %f5, 80(%r1)
+	stfd  %f6, 88(%r1)
+	stfd  %f7, 96(%r1)
+	stfd  %f8, 104(%r1)
+#endif
+
+	# set up registers for the routine that actually does the work
+	# get the context pointer from the trampoline
+	mr %r3,%r11
+
+	# now load up the pointer to the result storage
+	addi %r4,%r1,112
+
+	# now load up the pointer to the saved gpr registers
+	addi %r5,%r1,16
+
+	# now load up the pointer to the saved fpr registers */
+	addi %r6,%r1,48
+
+	# now load up the pointer to the outgoing parameter
+	# stack in the previous frame
+	# i.e. the previous frame pointer + 8
+	addi %r7,%r1,152
+
+	# make the call
+	bl ffi_closure_helper_SYSV@local
+.Lret:
+	# now r3 contains the return type
+	# so use it to look up in a table
+	# so we know how to deal with each type
+
+	# look up the proper starting point in table
+	# by using return type as offset
+
+	mflr %r4		# move address of .Lret to r4
+	slwi %r3,%r3,4		# now multiply return type by 16
+	addi %r4, %r4, .Lret_type0 - .Lret
+	lwz %r0,148(%r1)
+	add %r3,%r3,%r4		# add contents of table to table address
+	mtctr %r3
+	bctr			# jump to it
+.LFE1:
+
+# Each of the ret_typeX code fragments has to be exactly 16 bytes long
+# (4 instructions). For cache effectiveness we align to a 16 byte boundary
+# first.
+	.align 4
+# case FFI_TYPE_VOID
+.Lret_type0:
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+	nop
+
+# case FFI_TYPE_INT
+	lwz %r3,112+0(%r1)
+	mtlr %r0
+.Lfinish:
+	addi %r1,%r1,144
+	blr
+
+# case FFI_TYPE_FLOAT
+	lfs %f1,112+0(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+# case FFI_TYPE_DOUBLE
+	lfd %f1,112+0(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+# case FFI_TYPE_LONGDOUBLE
+	lfd %f1,112+0(%r1)
+	lfd %f2,112+8(%r1)
+	mtlr %r0
+	b .Lfinish
+
+# case FFI_TYPE_UINT8
+	lbz %r3,112+3(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+# case FFI_TYPE_SINT8
+	lbz %r3,112+3(%r1)
+	extsb %r3,%r3
+	mtlr %r0
+	b .Lfinish
+
+# case FFI_TYPE_UINT16
+	lhz %r3,112+2(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+# case FFI_TYPE_SINT16
+	lha %r3,112+2(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+# case FFI_TYPE_UINT32
+	lwz %r3,112+0(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+# case FFI_TYPE_SINT32
+	lwz %r3,112+0(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+# case FFI_TYPE_UINT64
+	lwz %r3,112+0(%r1)
+	lwz %r4,112+4(%r1)
+	mtlr %r0
+	b .Lfinish
+
+# case FFI_TYPE_SINT64
+	lwz %r3,112+0(%r1)
+	lwz %r4,112+4(%r1)
+	mtlr %r0
+	b .Lfinish
+
+# case FFI_TYPE_STRUCT
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+	nop
+
+# case FFI_TYPE_POINTER
+	lwz %r3,112+0(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+# case FFI_TYPE_UINT128
+	lwz %r3,112+0(%r1)
+	lwz %r4,112+4(%r1)
+	lwz %r5,112+8(%r1)
+	bl .Luint128
+
+# The return types below are only used when the ABI type is FFI_SYSV.
+# case FFI_SYSV_TYPE_SMALL_STRUCT + 1. One byte struct.
+	lbz %r3,112+0(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+# case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct.
+	lhz %r3,112+0(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+# case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct.
+	lwz %r3,112+0(%r1)
+	srwi %r3,%r3,8
+	mtlr %r0
+	b .Lfinish
+
+# case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct.
+	lwz %r3,112+0(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+# case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct.
+	lwz %r3,112+0(%r1)
+	lwz %r4,112+4(%r1)
+	li %r5,24
+	b .Lstruct567
+
+# case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct.
+	lwz %r3,112+0(%r1)
+	lwz %r4,112+4(%r1)
+	li %r5,16
+	b .Lstruct567
+
+# case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct.
+	lwz %r3,112+0(%r1)
+	lwz %r4,112+4(%r1)
+	li %r5,8
+	b .Lstruct567
+
+# case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct.
+	lwz %r3,112+0(%r1)
+	lwz %r4,112+4(%r1)
+	mtlr %r0
+	b .Lfinish
+
+.Lstruct567:
+	subfic %r6,%r5,32
+	srw %r4,%r4,%r5
+	slw %r6,%r3,%r6
+	srw %r3,%r3,%r5
+	or %r4,%r6,%r4
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+.Luint128:
+	lwz %r6,112+12(%r1)
+	mtlr %r0
+	addi %r1,%r1,144
+	blr
+
+END(ffi_closure_SYSV)
+
+	.section	".eh_frame",EH_FRAME_FLAGS,@progbits
+.Lframe1:
+	.4byte	.LECIE1-.LSCIE1	 # Length of Common Information Entry
+.LSCIE1:
+	.4byte	0x0	 # CIE Identifier Tag
+	.byte	0x1	 # CIE Version
+#if defined _RELOCATABLE || defined __PIC__
+	.ascii "zR\0"	 # CIE Augmentation
+#else
+	.ascii "\0"	 # CIE Augmentation
+#endif
+	.uleb128 0x1	 # CIE Code Alignment Factor
+	.sleb128 -4	 # CIE Data Alignment Factor
+	.byte	0x41	 # CIE RA Column
+#if defined _RELOCATABLE || defined __PIC__
+	.uleb128 0x1	 # Augmentation size
+	.byte	0x1b	 # FDE Encoding (pcrel sdata4)
+#endif
+	.byte	0xc	 # DW_CFA_def_cfa
+	.uleb128 0x1
+	.uleb128 0x0
+	.align 2
+.LECIE1:
+.LSFDE1:
+	.4byte	.LEFDE1-.LASFDE1	 # FDE Length
+.LASFDE1:
+	.4byte	.LASFDE1-.Lframe1	 # FDE CIE offset
+#if defined _RELOCATABLE || defined __PIC__
+	.4byte	.LFB1-.	 # FDE initial location
+#else
+	.4byte	.LFB1	 # FDE initial location
+#endif
+	.4byte	.LFE1-.LFB1	 # FDE address range
+#if defined _RELOCATABLE || defined __PIC__
+	.uleb128 0x0	 # Augmentation size
+#endif
+	.byte	0x4	 # DW_CFA_advance_loc4
+	.4byte	.LCFI0-.LFB1
+	.byte	0xe	 # DW_CFA_def_cfa_offset
+	.uleb128 144
+	.byte	0x4	 # DW_CFA_advance_loc4
+	.4byte	.LCFI1-.LCFI0
+	.byte	0x11	 # DW_CFA_offset_extended_sf
+	.uleb128 0x41
+	.sleb128 -1
+	.align 2
+.LEFDE1:
+
+#endif
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/sysv.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/sysv.S
new file mode 100644
index 0000000..96ea22b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/powerpc/sysv.S
@@ -0,0 +1,219 @@
+/* -----------------------------------------------------------------------
+   sysv.S - Copyright (c) 1998 Geoffrey Keating
+   Copyright (C) 2007 Free Software Foundation, Inc
+
+   PowerPC Assembly glue.
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+#include <powerpc/asm.h>
+
+#ifndef __powerpc64__
+	.globl ffi_prep_args_SYSV
+ENTRY(ffi_call_SYSV)
+.LFB1:
+	/* Save the old stack pointer as AP.  */
+	mr	%r8,%r1
+
+.LCFI0:
+	/* Allocate the stack space we need.  */
+	stwux	%r1,%r1,%r4
+	/* Save registers we use.  */
+	mflr	%r9
+	stw	%r28,-16(%r8)
+.LCFI1:
+	stw	%r29,-12(%r8)
+.LCFI2:
+	stw	%r30, -8(%r8)
+.LCFI3:
+	stw	%r31, -4(%r8)
+.LCFI4:
+	stw	%r9,   4(%r8)
+.LCFI5:
+
+	/* Save arguments over call...  */
+	mr	%r31,%r5	/* flags, */
+	mr	%r30,%r6	/* rvalue, */
+	mr	%r29,%r7	/* function address, */
+	mr	%r28,%r8	/* our AP. */
+.LCFI6:
+
+	/* Call ffi_prep_args_SYSV.  */
+	mr	%r4,%r1
+	bl	ffi_prep_args_SYSV@local
+
+	/* Now do the call.  */
+	/* Set up cr1 with bits 4-7 of the flags.  */
+	mtcrf	0x40,%r31
+	/* Get the address to call into CTR.  */
+	mtctr	%r29
+	/* Load all those argument registers.  */
+	lwz	%r3,-16-(8*4)(%r28)
+	lwz	%r4,-16-(7*4)(%r28)
+	lwz	%r5,-16-(6*4)(%r28)
+	lwz	%r6,-16-(5*4)(%r28)
+	bf-	5,1f
+	nop
+	lwz	%r7,-16-(4*4)(%r28)
+	lwz	%r8,-16-(3*4)(%r28)
+	lwz	%r9,-16-(2*4)(%r28)
+	lwz	%r10,-16-(1*4)(%r28)
+	nop
+1:
+
+	/* Load all the FP registers.  */
+	bf-	6,2f
+	lfd	%f1,-16-(8*4)-(8*8)(%r28)
+	lfd	%f2,-16-(8*4)-(7*8)(%r28)
+	lfd	%f3,-16-(8*4)-(6*8)(%r28)
+	lfd	%f4,-16-(8*4)-(5*8)(%r28)
+	nop
+	lfd	%f5,-16-(8*4)-(4*8)(%r28)
+	lfd	%f6,-16-(8*4)-(3*8)(%r28)
+	lfd	%f7,-16-(8*4)-(2*8)(%r28)
+	lfd	%f8,-16-(8*4)-(1*8)(%r28)
+2:
+
+	/* Make the call.  */
+	bctrl
+
+	/* Now, deal with the return value.  */
+	mtcrf	0x01,%r31 /* cr7  */
+	bt-	31,L(small_struct_return_value)
+	bt-	30,L(done_return_value)
+	bt-	29,L(fp_return_value)
+	stw	%r3,0(%r30)
+	bf+	28,L(done_return_value)
+	stw	%r4,4(%r30)
+	mtcrf	0x02,%r31 /* cr6  */
+	bf	27,L(done_return_value)
+	stw     %r5,8(%r30)
+	stw	%r6,12(%r30)
+	/* Fall through...  */
+
+L(done_return_value):
+	/* Restore the registers we used and return.  */
+	lwz	%r9,   4(%r28)
+	lwz	%r31, -4(%r28)
+	mtlr	%r9
+	lwz	%r30, -8(%r28)
+	lwz	%r29,-12(%r28)
+	lwz	%r28,-16(%r28)
+	lwz	%r1,0(%r1)
+	blr
+
+L(fp_return_value):
+	bf	28,L(float_return_value)
+	stfd	%f1,0(%r30)
+	mtcrf   0x02,%r31 /* cr6  */
+	bf	27,L(done_return_value)
+	stfd	%f2,8(%r30)
+	b	L(done_return_value)
+L(float_return_value):
+	stfs	%f1,0(%r30)
+	b	L(done_return_value)
+
+L(small_struct_return_value):
+	extrwi	%r6,%r31,2,19         /* number of bytes padding = shift/8 */
+	mtcrf	0x02,%r31	      /* copy flags to cr[24:27] (cr6) */
+	extrwi	%r5,%r31,5,19         /* r5 <- number of bits of padding */
+	subfic  %r6,%r6,4             /* r6 <- number of useful bytes in r3 */
+	bf-	25,L(done_return_value) /* struct in r3 ? if not, done. */
+/* smst_one_register: */
+	slw	%r3,%r3,%r5           /* Left-justify value in r3 */
+	mtxer	%r6                   /* move byte count to XER ... */
+	stswx	%r3,0,%r30            /* ... and store that many bytes */
+	bf+	26,L(done_return_value)  /* struct in r3:r4 ? */
+	add	%r6,%r6,%r30          /* adjust pointer */
+	stswi	%r4,%r6,4             /* store last four bytes */
+	b	L(done_return_value)
+
+.LFE1:
+END(ffi_call_SYSV)
+
+      .section	".eh_frame",EH_FRAME_FLAGS,@progbits
+.Lframe1:
+      .4byte    .LECIE1-.LSCIE1  /*  Length of Common Information Entry */
+.LSCIE1:
+      .4byte    0x0      /*  CIE Identifier Tag */
+      .byte     0x1      /*  CIE Version */
+#if defined _RELOCATABLE || defined __PIC__
+      .ascii	"zR\0"   /*  CIE Augmentation */
+#else
+      .ascii	"\0"	 /*  CIE Augmentation */
+#endif
+      .uleb128  0x1      /*  CIE Code Alignment Factor */
+      .sleb128  -4	 /*  CIE Data Alignment Factor */
+      .byte     0x41     /*  CIE RA Column */
+#if defined _RELOCATABLE || defined __PIC__
+      .uleb128  0x1      /*  Augmentation size */
+      .byte	0x1b	 /*  FDE Encoding (pcrel sdata4) */
+#endif
+      .byte     0xc      /*  DW_CFA_def_cfa */
+      .uleb128  0x1
+      .uleb128  0x0
+      .align 2
+.LECIE1:
+.LSFDE1:
+      .4byte    .LEFDE1-.LASFDE1         /*  FDE Length */
+.LASFDE1:
+      .4byte    .LASFDE1-.Lframe1         /*  FDE CIE offset */
+#if defined _RELOCATABLE || defined __PIC__
+      .4byte    .LFB1-.  /*  FDE initial location */
+#else
+      .4byte    .LFB1    /*  FDE initial location */
+#endif
+      .4byte    .LFE1-.LFB1      /*  FDE address range */
+#if defined _RELOCATABLE || defined __PIC__
+      .uleb128  0x0	 /*  Augmentation size */
+#endif
+      .byte     0x4      /*  DW_CFA_advance_loc4 */
+      .4byte    .LCFI0-.LFB1
+      .byte     0xd      /*  DW_CFA_def_cfa_register */
+      .uleb128  0x08
+      .byte     0x4      /*  DW_CFA_advance_loc4 */
+      .4byte    .LCFI5-.LCFI0
+      .byte     0x11     /*  DW_CFA_offset_extended_sf */
+      .uleb128  0x41
+      .sleb128  -1
+      .byte     0x9f     /*  DW_CFA_offset, column 0x1f */
+      .uleb128  0x1
+      .byte     0x9e     /*  DW_CFA_offset, column 0x1e */
+      .uleb128  0x2
+      .byte     0x9d     /*  DW_CFA_offset, column 0x1d */
+      .uleb128  0x3
+      .byte     0x9c     /*  DW_CFA_offset, column 0x1c */
+      .uleb128  0x4
+      .byte     0x4      /*  DW_CFA_advance_loc4 */
+      .4byte    .LCFI6-.LCFI5
+      .byte     0xd      /*  DW_CFA_def_cfa_register */
+      .uleb128  0x1c
+      .align 2
+.LEFDE1:
+#endif
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/prep_cif.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/prep_cif.c
new file mode 100644
index 0000000..8548cfd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/prep_cif.c
@@ -0,0 +1,177 @@
+/* -----------------------------------------------------------------------
+   prep_cif.c - Copyright (c) 2011  Anthony Green
+                Copyright (c) 1996, 1998, 2007  Red Hat, Inc.
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+#include <stdlib.h>
+
+/* Round up to FFI_SIZEOF_ARG. */
+
+#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG)
+
+/* Perform machine independent initialization of aggregate type
+   specifications. */
+
+static ffi_status initialize_aggregate(ffi_type *arg)
+{
+  ffi_type **ptr;
+
+  if (UNLIKELY(arg == NULL || arg->elements == NULL))
+    return FFI_BAD_TYPEDEF;
+
+  arg->size = 0;
+  arg->alignment = 0;
+
+  ptr = &(arg->elements[0]);
+
+  if (UNLIKELY(ptr == 0))
+    return FFI_BAD_TYPEDEF;
+
+  while ((*ptr) != NULL)
+    {
+      if (UNLIKELY(((*ptr)->size == 0)
+		    && (initialize_aggregate((*ptr)) != FFI_OK)))
+	return FFI_BAD_TYPEDEF;
+
+      /* Perform a sanity check on the argument type */
+      FFI_ASSERT_VALID_TYPE(*ptr);
+
+      arg->size = ALIGN(arg->size, (*ptr)->alignment);
+      arg->size += (*ptr)->size;
+
+      arg->alignment = (arg->alignment > (*ptr)->alignment) ?
+	arg->alignment : (*ptr)->alignment;
+
+      ptr++;
+    }
+
+  /* Structure size includes tail padding.  This is important for
+     structures that fit in one register on ABIs like the PowerPC64
+     Linux ABI that right justify small structs in a register.
+     It's also needed for nested structure layout, for example
+     struct A { long a; char b; }; struct B { struct A x; char y; };
+     should find y at an offset of 2*sizeof(long) and result in a
+     total size of 3*sizeof(long).  */
+  arg->size = ALIGN (arg->size, arg->alignment);
+
+  if (arg->size == 0)
+    return FFI_BAD_TYPEDEF;
+  else
+    return FFI_OK;
+}
+
+#ifndef __CRIS__
+/* The CRIS ABI specifies structure elements to have byte
+   alignment only, so it completely overrides this functions,
+   which assumes "natural" alignment and padding.  */
+
+/* Perform machine independent ffi_cif preparation, then call
+   machine dependent routine. */
+
+ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
+			ffi_type *rtype, ffi_type **atypes)
+{
+  unsigned bytes = 0;
+  unsigned int i;
+  ffi_type **ptr;
+
+  FFI_ASSERT(cif != NULL);
+  if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI))
+    return FFI_BAD_ABI;
+
+  cif->abi = abi;
+  cif->arg_types = atypes;
+  cif->nargs = nargs;
+  cif->rtype = rtype;
+
+  cif->flags = 0;
+
+  /* Initialize the return type if necessary */
+  if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK))
+    return FFI_BAD_TYPEDEF;
+
+  /* Perform a sanity check on the return type */
+  FFI_ASSERT_VALID_TYPE(cif->rtype);
+
+  /* x86, x86-64 and s390 stack space allocation is handled in prep_machdep. */
+#if !defined M68K && !defined X86_ANY && !defined S390 && !defined PA
+  /* Make space for the return structure pointer */
+  if (cif->rtype->type == FFI_TYPE_STRUCT
+#ifdef SPARC
+      && (cif->abi != FFI_V9 || cif->rtype->size > 32)
+#endif
+     )
+    bytes = STACK_ARG_SIZE(sizeof(void*));
+#endif
+
+  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
+    {
+
+      /* Initialize any uninitialized aggregate type definitions */
+      if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))
+	return FFI_BAD_TYPEDEF;
+
+      /* Perform a sanity check on the argument type, do this
+	 check after the initialization.  */
+      FFI_ASSERT_VALID_TYPE(*ptr);
+
+#if !defined X86_ANY && !defined S390 && !defined PA
+#ifdef SPARC
+      if (((*ptr)->type == FFI_TYPE_STRUCT
+	   && ((*ptr)->size > 16 || cif->abi != FFI_V9))
+	  || ((*ptr)->type == FFI_TYPE_LONGDOUBLE
+	      && cif->abi != FFI_V9))
+	bytes += sizeof(void*);
+      else
+#endif
+	{
+	  /* Add any padding if necessary */
+	  if (((*ptr)->alignment - 1) & bytes)
+	    bytes = ALIGN(bytes, (*ptr)->alignment);
+
+	  bytes += STACK_ARG_SIZE((*ptr)->size);
+	}
+#endif
+    }
+
+  cif->bytes = bytes;
+
+  /* Perform machine dependent cif processing */
+  return ffi_prep_cif_machdep(cif);
+}
+#endif /* not __CRIS__ */
+
+#if FFI_CLOSURES
+
+ffi_status
+ffi_prep_closure (ffi_closure* closure,
+		  ffi_cif* cif,
+		  void (*fun)(ffi_cif*,void*,void**,void*),
+		  void *user_data)
+{
+  return ffi_prep_closure_loc (closure, cif, fun, user_data, closure);
+}
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c
new file mode 100644
index 0000000..ce21372
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/raw_api.c
@@ -0,0 +1,254 @@
+/* -----------------------------------------------------------------------
+   raw_api.c - Copyright (c) 1999, 2008  Red Hat, Inc.
+
+   Author: Kresten Krab Thorup <krab@gnu.org>
+
+   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.
+   ----------------------------------------------------------------------- */
+
+/* This file defines generic functions for use with the raw api. */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#if !FFI_NO_RAW_API
+
+size_t
+ffi_raw_size (ffi_cif *cif)
+{
+  size_t result = 0;
+  int i;
+
+  ffi_type **at = cif->arg_types;
+
+  for (i = cif->nargs-1; i >= 0; i--, at++)
+    {
+#if !FFI_NO_STRUCTS
+      if ((*at)->type == FFI_TYPE_STRUCT)
+	result += ALIGN (sizeof (void*), FFI_SIZEOF_ARG);
+      else
+#endif
+	result += ALIGN ((*at)->size, FFI_SIZEOF_ARG);
+    }
+
+  return result;
+}
+
+
+void
+ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args)
+{
+  unsigned i;
+  ffi_type **tp = cif->arg_types;
+
+#if WORDS_BIGENDIAN
+
+  for (i = 0; i < cif->nargs; i++, tp++, args++)
+    {	  
+      switch ((*tp)->type)
+	{
+	case FFI_TYPE_UINT8:
+	case FFI_TYPE_SINT8:
+	  *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 1);
+	  break;
+	  
+	case FFI_TYPE_UINT16:
+	case FFI_TYPE_SINT16:
+	  *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 2);
+	  break;
+
+#if FFI_SIZEOF_ARG >= 4	  
+	case FFI_TYPE_UINT32:
+	case FFI_TYPE_SINT32:
+	  *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 4);
+	  break;
+#endif
+	
+#if !FFI_NO_STRUCTS  
+	case FFI_TYPE_STRUCT:
+	  *args = (raw++)->ptr;
+	  break;
+#endif
+
+	case FFI_TYPE_POINTER:
+	  *args = (void*) &(raw++)->ptr;
+	  break;
+	  
+	default:
+	  *args = raw;
+	  raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
+	}
+    }
+
+#else /* WORDS_BIGENDIAN */
+
+#if !PDP
+
+  /* then assume little endian */
+  for (i = 0; i < cif->nargs; i++, tp++, args++)
+    {	  
+#if !FFI_NO_STRUCTS
+      if ((*tp)->type == FFI_TYPE_STRUCT)
+	{
+	  *args = (raw++)->ptr;
+	}
+      else
+#endif
+	{
+	  *args = (void*) raw;
+	  raw += ALIGN ((*tp)->size, sizeof (void*)) / sizeof (void*);
+	}
+    }
+
+#else
+#error "pdp endian not supported"
+#endif /* ! PDP */
+
+#endif /* WORDS_BIGENDIAN */
+}
+
+void
+ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw)
+{
+  unsigned i;
+  ffi_type **tp = cif->arg_types;
+
+  for (i = 0; i < cif->nargs; i++, tp++, args++)
+    {	  
+      switch ((*tp)->type)
+	{
+	case FFI_TYPE_UINT8:
+	  (raw++)->uint = *(UINT8*) (*args);
+	  break;
+
+	case FFI_TYPE_SINT8:
+	  (raw++)->sint = *(SINT8*) (*args);
+	  break;
+
+	case FFI_TYPE_UINT16:
+	  (raw++)->uint = *(UINT16*) (*args);
+	  break;
+
+	case FFI_TYPE_SINT16:
+	  (raw++)->sint = *(SINT16*) (*args);
+	  break;
+
+#if FFI_SIZEOF_ARG >= 4
+	case FFI_TYPE_UINT32:
+	  (raw++)->uint = *(UINT32*) (*args);
+	  break;
+
+	case FFI_TYPE_SINT32:
+	  (raw++)->sint = *(SINT32*) (*args);
+	  break;
+#endif
+
+#if !FFI_NO_STRUCTS
+	case FFI_TYPE_STRUCT:
+	  (raw++)->ptr = *args;
+	  break;
+#endif
+
+	case FFI_TYPE_POINTER:
+	  (raw++)->ptr = **(void***) args;
+	  break;
+
+	default:
+	  memcpy ((void*) raw->data, (void*)*args, (*tp)->size);
+	  raw += ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
+	}
+    }
+}
+
+#if !FFI_NATIVE_RAW_API
+
+
+/* This is a generic definition of ffi_raw_call, to be used if the
+ * native system does not provide a machine-specific implementation.
+ * Having this, allows code to be written for the raw API, without
+ * the need for system-specific code to handle input in that format;
+ * these following couple of functions will handle the translation forth
+ * and back automatically. */
+
+void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *raw)
+{
+  void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
+  ffi_raw_to_ptrarray (cif, raw, avalue);
+  ffi_call (cif, fn, rvalue, avalue);
+}
+
+#if FFI_CLOSURES		/* base system provides closures */
+
+static void
+ffi_translate_args (ffi_cif *cif, void *rvalue,
+		    void **avalue, void *user_data)
+{
+  ffi_raw *raw = (ffi_raw*)alloca (ffi_raw_size (cif));
+  ffi_raw_closure *cl = (ffi_raw_closure*)user_data;
+
+  ffi_ptrarray_to_raw (cif, avalue, raw);
+  (*cl->fun) (cif, rvalue, raw, cl->user_data);
+}
+
+ffi_status
+ffi_prep_raw_closure_loc (ffi_raw_closure* cl,
+			  ffi_cif *cif,
+			  void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
+			  void *user_data,
+			  void *codeloc)
+{
+  ffi_status status;
+
+  status = ffi_prep_closure_loc ((ffi_closure*) cl,
+				 cif,
+				 &ffi_translate_args,
+				 codeloc,
+				 codeloc);
+  if (status == FFI_OK)
+    {
+      cl->fun       = fun;
+      cl->user_data = user_data;
+    }
+
+  return status;
+}
+
+#endif /* FFI_CLOSURES */
+#endif /* !FFI_NATIVE_RAW_API */
+
+#if FFI_CLOSURES
+
+/* Again, here is the generic version of ffi_prep_raw_closure, which
+ * will install an intermediate "hub" for translation of arguments from
+ * the pointer-array format, to the raw format */
+
+ffi_status
+ffi_prep_raw_closure (ffi_raw_closure* cl,
+		      ffi_cif *cif,
+		      void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
+		      void *user_data)
+{
+  return ffi_prep_raw_closure_loc (cl, cif, fun, user_data, cl);
+}
+
+#endif /* FFI_CLOSURES */
+
+#endif /* !FFI_NO_RAW_API */
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffi.c
new file mode 100644
index 0000000..ca2675b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffi.c
@@ -0,0 +1,780 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 2000, 2007 Software AG
+           Copyright (c) 2008 Red Hat, Inc
+ 
+   S390 Foreign Function Interface
+ 
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+/*====================================================================*/
+/*                          Includes                                  */
+/*                          --------                                  */
+/*====================================================================*/
+ 
+#include <ffi.h>
+#include <ffi_common.h>
+ 
+#include <stdlib.h>
+#include <stdio.h>
+ 
+/*====================== End of Includes =============================*/
+ 
+/*====================================================================*/
+/*                           Defines                                  */
+/*                           -------                                  */
+/*====================================================================*/
+
+/* Maximum number of GPRs available for argument passing.  */ 
+#define MAX_GPRARGS 5
+
+/* Maximum number of FPRs available for argument passing.  */ 
+#ifdef __s390x__
+#define MAX_FPRARGS 4
+#else
+#define MAX_FPRARGS 2
+#endif
+
+/* Round to multiple of 16.  */
+#define ROUND_SIZE(size) (((size) + 15) & ~15)
+
+/* If these values change, sysv.S must be adapted!  */
+#define FFI390_RET_VOID		0
+#define FFI390_RET_STRUCT	1
+#define FFI390_RET_FLOAT	2
+#define FFI390_RET_DOUBLE	3
+#define FFI390_RET_INT32	4
+#define FFI390_RET_INT64	5
+
+/*===================== End of Defines ===============================*/
+ 
+/*====================================================================*/
+/*                          Prototypes                                */
+/*                          ----------                                */
+/*====================================================================*/
+ 
+static void ffi_prep_args (unsigned char *, extended_cif *);
+void
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
+__attribute__ ((visibility ("hidden")))
+#endif
+ffi_closure_helper_SYSV (ffi_closure *, unsigned long *, 
+			 unsigned long long *, unsigned long *);
+
+/*====================== End of Prototypes ===========================*/
+ 
+/*====================================================================*/
+/*                          Externals                                 */
+/*                          ---------                                 */
+/*====================================================================*/
+ 
+extern void ffi_call_SYSV(unsigned,
+			  extended_cif *,
+			  void (*)(unsigned char *, extended_cif *),
+			  unsigned,
+			  void *,
+			  void (*fn)(void));
+
+extern void ffi_closure_SYSV(void);
+ 
+/*====================== End of Externals ============================*/
+ 
+/*====================================================================*/
+/*                                                                    */
+/* Name     - ffi_check_struct_type.                                  */
+/*                                                                    */
+/* Function - Determine if a structure can be passed within a         */
+/*            general purpose or floating point register.             */
+/*                                                                    */
+/*====================================================================*/
+ 
+static int
+ffi_check_struct_type (ffi_type *arg)
+{
+  size_t size = arg->size;
+
+  /* If the struct has just one element, look at that element
+     to find out whether to consider the struct as floating point.  */
+  while (arg->type == FFI_TYPE_STRUCT 
+         && arg->elements[0] && !arg->elements[1])
+    arg = arg->elements[0];
+
+  /* Structs of size 1, 2, 4, and 8 are passed in registers,
+     just like the corresponding int/float types.  */
+  switch (size)
+    {
+      case 1:
+        return FFI_TYPE_UINT8;
+
+      case 2:
+        return FFI_TYPE_UINT16;
+
+      case 4:
+	if (arg->type == FFI_TYPE_FLOAT)
+          return FFI_TYPE_FLOAT;
+	else
+	  return FFI_TYPE_UINT32;
+
+      case 8:
+	if (arg->type == FFI_TYPE_DOUBLE)
+          return FFI_TYPE_DOUBLE;
+	else
+	  return FFI_TYPE_UINT64;
+
+      default:
+	break;
+    }
+
+  /* Other structs are passed via a pointer to the data.  */
+  return FFI_TYPE_POINTER;
+}
+ 
+/*======================== End of Routine ============================*/
+ 
+/*====================================================================*/
+/*                                                                    */
+/* Name     - ffi_prep_args.                                          */
+/*                                                                    */
+/* Function - Prepare parameters for call to function.                */
+/*                                                                    */
+/* ffi_prep_args is called by the assembly routine once stack space   */
+/* has been allocated for the function's arguments.                   */
+/*                                                                    */
+/*====================================================================*/
+ 
+static void
+ffi_prep_args (unsigned char *stack, extended_cif *ecif)
+{
+  /* The stack space will be filled with those areas:
+
+	FPR argument register save area     (highest addresses)
+	GPR argument register save area
+	temporary struct copies
+	overflow argument area              (lowest addresses)
+
+     We set up the following pointers:
+
+        p_fpr: bottom of the FPR area (growing upwards)
+	p_gpr: bottom of the GPR area (growing upwards)
+	p_ov: bottom of the overflow area (growing upwards)
+	p_struct: top of the struct copy area (growing downwards)
+
+     All areas are kept aligned to twice the word size.  */
+
+  int gpr_off = ecif->cif->bytes;
+  int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long));
+
+  unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off);
+  unsigned long *p_gpr = (unsigned long *)(stack + gpr_off);
+  unsigned char *p_struct = (unsigned char *)p_gpr;
+  unsigned long *p_ov = (unsigned long *)stack;
+
+  int n_fpr = 0;
+  int n_gpr = 0;
+  int n_ov = 0;
+
+  ffi_type **ptr;
+  void **p_argv = ecif->avalue;
+  int i;
+ 
+  /* If we returning a structure then we set the first parameter register
+     to the address of where we are returning this structure.  */
+
+  if (ecif->cif->flags == FFI390_RET_STRUCT)
+    p_gpr[n_gpr++] = (unsigned long) ecif->rvalue;
+
+  /* Now for the arguments.  */
+ 
+  for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
+       i > 0;
+       i--, ptr++, p_argv++)
+    {
+      void *arg = *p_argv;
+      int type = (*ptr)->type;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+      /* 16-byte long double is passed like a struct.  */
+      if (type == FFI_TYPE_LONGDOUBLE)
+	type = FFI_TYPE_STRUCT;
+#endif
+
+      /* Check how a structure type is passed.  */
+      if (type == FFI_TYPE_STRUCT)
+	{
+	  type = ffi_check_struct_type (*ptr);
+
+	  /* If we pass the struct via pointer, copy the data.  */
+	  if (type == FFI_TYPE_POINTER)
+	    {
+	      p_struct -= ROUND_SIZE ((*ptr)->size);
+	      memcpy (p_struct, (char *)arg, (*ptr)->size);
+	      arg = &p_struct;
+	    }
+	}
+
+      /* Now handle all primitive int/pointer/float data types.  */
+      switch (type) 
+	{
+	  case FFI_TYPE_DOUBLE:
+	    if (n_fpr < MAX_FPRARGS)
+	      p_fpr[n_fpr++] = *(unsigned long long *) arg;
+	    else
+#ifdef __s390x__
+	      p_ov[n_ov++] = *(unsigned long *) arg;
+#else
+	      p_ov[n_ov++] = ((unsigned long *) arg)[0],
+	      p_ov[n_ov++] = ((unsigned long *) arg)[1];
+#endif
+	    break;
+	
+	  case FFI_TYPE_FLOAT:
+	    if (n_fpr < MAX_FPRARGS)
+	      p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32;
+	    else
+	      p_ov[n_ov++] = *(unsigned int *) arg;
+	    break;
+
+	  case FFI_TYPE_POINTER:
+	    if (n_gpr < MAX_GPRARGS)
+	      p_gpr[n_gpr++] = (unsigned long)*(unsigned char **) arg;
+	    else
+	      p_ov[n_ov++] = (unsigned long)*(unsigned char **) arg;
+	    break;
+ 
+	  case FFI_TYPE_UINT64:
+	  case FFI_TYPE_SINT64:
+#ifdef __s390x__
+	    if (n_gpr < MAX_GPRARGS)
+	      p_gpr[n_gpr++] = *(unsigned long *) arg;
+	    else
+	      p_ov[n_ov++] = *(unsigned long *) arg;
+#else
+	    if (n_gpr == MAX_GPRARGS-1)
+	      n_gpr = MAX_GPRARGS;
+	    if (n_gpr < MAX_GPRARGS)
+	      p_gpr[n_gpr++] = ((unsigned long *) arg)[0],
+	      p_gpr[n_gpr++] = ((unsigned long *) arg)[1];
+	    else
+	      p_ov[n_ov++] = ((unsigned long *) arg)[0],
+	      p_ov[n_ov++] = ((unsigned long *) arg)[1];
+#endif
+	    break;
+ 
+	  case FFI_TYPE_UINT32:
+	    if (n_gpr < MAX_GPRARGS)
+	      p_gpr[n_gpr++] = *(unsigned int *) arg;
+	    else
+	      p_ov[n_ov++] = *(unsigned int *) arg;
+	    break;
+ 
+	  case FFI_TYPE_INT:
+	  case FFI_TYPE_SINT32:
+	    if (n_gpr < MAX_GPRARGS)
+	      p_gpr[n_gpr++] = *(signed int *) arg;
+	    else
+	      p_ov[n_ov++] = *(signed int *) arg;
+	    break;
+ 
+	  case FFI_TYPE_UINT16:
+	    if (n_gpr < MAX_GPRARGS)
+	      p_gpr[n_gpr++] = *(unsigned short *) arg;
+	    else
+	      p_ov[n_ov++] = *(unsigned short *) arg;
+	    break;
+ 
+	  case FFI_TYPE_SINT16:
+	    if (n_gpr < MAX_GPRARGS)
+	      p_gpr[n_gpr++] = *(signed short *) arg;
+	    else
+	      p_ov[n_ov++] = *(signed short *) arg;
+	    break;
+
+	  case FFI_TYPE_UINT8:
+	    if (n_gpr < MAX_GPRARGS)
+	      p_gpr[n_gpr++] = *(unsigned char *) arg;
+	    else
+	      p_ov[n_ov++] = *(unsigned char *) arg;
+	    break;
+ 
+	  case FFI_TYPE_SINT8:
+	    if (n_gpr < MAX_GPRARGS)
+	      p_gpr[n_gpr++] = *(signed char *) arg;
+	    else
+	      p_ov[n_ov++] = *(signed char *) arg;
+	    break;
+ 
+	  default:
+	    FFI_ASSERT (0);
+	    break;
+        }
+    }
+}
+
+/*======================== End of Routine ============================*/
+ 
+/*====================================================================*/
+/*                                                                    */
+/* Name     - ffi_prep_cif_machdep.                                   */
+/*                                                                    */
+/* Function - Perform machine dependent CIF processing.               */
+/*                                                                    */
+/*====================================================================*/
+ 
+ffi_status
+ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  size_t struct_size = 0;
+  int n_gpr = 0;
+  int n_fpr = 0;
+  int n_ov = 0;
+
+  ffi_type **ptr;
+  int i;
+
+  /* Determine return value handling.  */ 
+
+  switch (cif->rtype->type)
+    {
+      /* Void is easy.  */
+      case FFI_TYPE_VOID:
+	cif->flags = FFI390_RET_VOID;
+	break;
+
+      /* Structures are returned via a hidden pointer.  */
+      case FFI_TYPE_STRUCT:
+	cif->flags = FFI390_RET_STRUCT;
+	n_gpr++;  /* We need one GPR to pass the pointer.  */
+	break; 
+
+      /* Floating point values are returned in fpr 0.  */
+      case FFI_TYPE_FLOAT:
+	cif->flags = FFI390_RET_FLOAT;
+	break;
+
+      case FFI_TYPE_DOUBLE:
+	cif->flags = FFI390_RET_DOUBLE;
+	break;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+      case FFI_TYPE_LONGDOUBLE:
+	cif->flags = FFI390_RET_STRUCT;
+	n_gpr++;
+	break;
+#endif
+      /* Integer values are returned in gpr 2 (and gpr 3
+	 for 64-bit values on 31-bit machines).  */
+      case FFI_TYPE_UINT64:
+      case FFI_TYPE_SINT64:
+	cif->flags = FFI390_RET_INT64;
+	break;
+
+      case FFI_TYPE_POINTER:
+      case FFI_TYPE_INT:
+      case FFI_TYPE_UINT32:
+      case FFI_TYPE_SINT32:
+      case FFI_TYPE_UINT16:
+      case FFI_TYPE_SINT16:
+      case FFI_TYPE_UINT8:
+      case FFI_TYPE_SINT8:
+	/* These are to be extended to word size.  */
+#ifdef __s390x__
+	cif->flags = FFI390_RET_INT64;
+#else
+	cif->flags = FFI390_RET_INT32;
+#endif
+	break;
+ 
+      default:
+        FFI_ASSERT (0);
+        break;
+    }
+
+  /* Now for the arguments.  */
+ 
+  for (ptr = cif->arg_types, i = cif->nargs;
+       i > 0;
+       i--, ptr++)
+    {
+      int type = (*ptr)->type;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+      /* 16-byte long double is passed like a struct.  */
+      if (type == FFI_TYPE_LONGDOUBLE)
+	type = FFI_TYPE_STRUCT;
+#endif
+
+      /* Check how a structure type is passed.  */
+      if (type == FFI_TYPE_STRUCT)
+	{
+	  type = ffi_check_struct_type (*ptr);
+
+	  /* If we pass the struct via pointer, we must reserve space
+	     to copy its data for proper call-by-value semantics.  */
+	  if (type == FFI_TYPE_POINTER)
+	    struct_size += ROUND_SIZE ((*ptr)->size);
+	}
+
+      /* Now handle all primitive int/float data types.  */
+      switch (type) 
+	{
+	  /* The first MAX_FPRARGS floating point arguments
+	     go in FPRs, the rest overflow to the stack.  */
+
+	  case FFI_TYPE_DOUBLE:
+	    if (n_fpr < MAX_FPRARGS)
+	      n_fpr++;
+	    else
+	      n_ov += sizeof (double) / sizeof (long);
+	    break;
+	
+	  case FFI_TYPE_FLOAT:
+	    if (n_fpr < MAX_FPRARGS)
+	      n_fpr++;
+	    else
+	      n_ov++;
+	    break;
+
+	  /* On 31-bit machines, 64-bit integers are passed in GPR pairs,
+	     if one is still available, or else on the stack.  If only one
+	     register is free, skip the register (it won't be used for any 
+	     subsequent argument either).  */
+	      
+#ifndef __s390x__
+	  case FFI_TYPE_UINT64:
+	  case FFI_TYPE_SINT64:
+	    if (n_gpr == MAX_GPRARGS-1)
+	      n_gpr = MAX_GPRARGS;
+	    if (n_gpr < MAX_GPRARGS)
+	      n_gpr += 2;
+	    else
+	      n_ov += 2;
+	    break;
+#endif
+
+	  /* Everything else is passed in GPRs (until MAX_GPRARGS
+	     have been used) or overflows to the stack.  */
+
+	  default: 
+	    if (n_gpr < MAX_GPRARGS)
+	      n_gpr++;
+	    else
+	      n_ov++;
+	    break;
+        }
+    }
+
+  /* Total stack space as required for overflow arguments
+     and temporary structure copies.  */
+
+  cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size;
+ 
+  return FFI_OK;
+}
+ 
+/*======================== End of Routine ============================*/
+ 
+/*====================================================================*/
+/*                                                                    */
+/* Name     - ffi_call.                                               */
+/*                                                                    */
+/* Function - Call the FFI routine.                                   */
+/*                                                                    */
+/*====================================================================*/
+ 
+void
+ffi_call(ffi_cif *cif,
+	 void (*fn)(void),
+	 void *rvalue,
+	 void **avalue)
+{
+  int ret_type = cif->flags;
+  extended_cif ecif;
+ 
+  ecif.cif    = cif;
+  ecif.avalue = avalue;
+  ecif.rvalue = rvalue;
+
+  /* If we don't have a return value, we need to fake one.  */
+  if (rvalue == NULL)
+    {
+      if (ret_type == FFI390_RET_STRUCT)
+	ecif.rvalue = alloca (cif->rtype->size);
+      else
+	ret_type = FFI390_RET_VOID;
+    } 
+
+  switch (cif->abi)
+    {
+      case FFI_SYSV:
+        ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args,
+		       ret_type, ecif.rvalue, fn);
+        break;
+ 
+      default:
+        FFI_ASSERT (0);
+        break;
+    }
+}
+ 
+/*======================== End of Routine ============================*/
+
+/*====================================================================*/
+/*                                                                    */
+/* Name     - ffi_closure_helper_SYSV.                                */
+/*                                                                    */
+/* Function - Call a FFI closure target function.                     */
+/*                                                                    */
+/*====================================================================*/
+ 
+void
+ffi_closure_helper_SYSV (ffi_closure *closure,
+			 unsigned long *p_gpr,
+			 unsigned long long *p_fpr,
+			 unsigned long *p_ov)
+{
+  unsigned long long ret_buffer;
+
+  void *rvalue = &ret_buffer;
+  void **avalue;
+  void **p_arg;
+
+  int n_gpr = 0;
+  int n_fpr = 0;
+  int n_ov = 0;
+
+  ffi_type **ptr;
+  int i;
+
+  /* Allocate buffer for argument list pointers.  */
+
+  p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *));
+
+  /* If we returning a structure, pass the structure address 
+     directly to the target function.  Otherwise, have the target 
+     function store the return value to the GPR save area.  */
+
+  if (closure->cif->flags == FFI390_RET_STRUCT)
+    rvalue = (void *) p_gpr[n_gpr++];
+
+  /* Now for the arguments.  */
+
+  for (ptr = closure->cif->arg_types, i = closure->cif->nargs;
+       i > 0;
+       i--, p_arg++, ptr++)
+    {
+      int deref_struct_pointer = 0;
+      int type = (*ptr)->type;
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+      /* 16-byte long double is passed like a struct.  */
+      if (type == FFI_TYPE_LONGDOUBLE)
+	type = FFI_TYPE_STRUCT;
+#endif
+
+      /* Check how a structure type is passed.  */
+      if (type == FFI_TYPE_STRUCT)
+	{
+	  type = ffi_check_struct_type (*ptr);
+
+	  /* If we pass the struct via pointer, remember to 
+	     retrieve the pointer later.  */
+	  if (type == FFI_TYPE_POINTER)
+	    deref_struct_pointer = 1;
+	}
+
+      /* Pointers are passed like UINTs of the same size.  */
+      if (type == FFI_TYPE_POINTER)
+#ifdef __s390x__
+	type = FFI_TYPE_UINT64;
+#else
+	type = FFI_TYPE_UINT32;
+#endif
+
+      /* Now handle all primitive int/float data types.  */
+      switch (type) 
+	{
+	  case FFI_TYPE_DOUBLE:
+	    if (n_fpr < MAX_FPRARGS)
+	      *p_arg = &p_fpr[n_fpr++];
+	    else
+	      *p_arg = &p_ov[n_ov], 
+	      n_ov += sizeof (double) / sizeof (long);
+	    break;
+	
+	  case FFI_TYPE_FLOAT:
+	    if (n_fpr < MAX_FPRARGS)
+	      *p_arg = &p_fpr[n_fpr++];
+	    else
+	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
+	    break;
+ 
+	  case FFI_TYPE_UINT64:
+	  case FFI_TYPE_SINT64:
+#ifdef __s390x__
+	    if (n_gpr < MAX_GPRARGS)
+	      *p_arg = &p_gpr[n_gpr++];
+	    else
+	      *p_arg = &p_ov[n_ov++];
+#else
+	    if (n_gpr == MAX_GPRARGS-1)
+	      n_gpr = MAX_GPRARGS;
+	    if (n_gpr < MAX_GPRARGS)
+	      *p_arg = &p_gpr[n_gpr], n_gpr += 2;
+	    else
+	      *p_arg = &p_ov[n_ov], n_ov += 2;
+#endif
+	    break;
+ 
+	  case FFI_TYPE_INT:
+	  case FFI_TYPE_UINT32:
+	  case FFI_TYPE_SINT32:
+	    if (n_gpr < MAX_GPRARGS)
+	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4;
+	    else
+	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
+	    break;
+ 
+	  case FFI_TYPE_UINT16:
+	  case FFI_TYPE_SINT16:
+	    if (n_gpr < MAX_GPRARGS)
+	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2;
+	    else
+	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2;
+	    break;
+
+	  case FFI_TYPE_UINT8:
+	  case FFI_TYPE_SINT8:
+	    if (n_gpr < MAX_GPRARGS)
+	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1;
+	    else
+	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1;
+	    break;
+ 
+	  default:
+	    FFI_ASSERT (0);
+	    break;
+        }
+
+      /* If this is a struct passed via pointer, we need to
+	 actually retrieve that pointer.  */
+      if (deref_struct_pointer)
+	*p_arg = *(void **)*p_arg;
+    }
+
+
+  /* Call the target function.  */
+  (closure->fun) (closure->cif, rvalue, avalue, closure->user_data);
+
+  /* Convert the return value.  */
+  switch (closure->cif->rtype->type)
+    {
+      /* Void is easy, and so is struct.  */
+      case FFI_TYPE_VOID:
+      case FFI_TYPE_STRUCT:
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+      case FFI_TYPE_LONGDOUBLE:
+#endif
+	break;
+
+      /* Floating point values are returned in fpr 0.  */
+      case FFI_TYPE_FLOAT:
+	p_fpr[0] = (long long) *(unsigned int *) rvalue << 32;
+	break;
+
+      case FFI_TYPE_DOUBLE:
+	p_fpr[0] = *(unsigned long long *) rvalue;
+	break;
+
+      /* Integer values are returned in gpr 2 (and gpr 3
+	 for 64-bit values on 31-bit machines).  */
+      case FFI_TYPE_UINT64:
+      case FFI_TYPE_SINT64:
+#ifdef __s390x__
+	p_gpr[0] = *(unsigned long *) rvalue;
+#else
+	p_gpr[0] = ((unsigned long *) rvalue)[0],
+	p_gpr[1] = ((unsigned long *) rvalue)[1];
+#endif
+	break;
+
+      case FFI_TYPE_POINTER:
+      case FFI_TYPE_UINT32:
+      case FFI_TYPE_UINT16:
+      case FFI_TYPE_UINT8:
+	p_gpr[0] = *(unsigned long *) rvalue;
+	break;
+
+      case FFI_TYPE_INT:
+      case FFI_TYPE_SINT32:
+      case FFI_TYPE_SINT16:
+      case FFI_TYPE_SINT8:
+	p_gpr[0] = *(signed long *) rvalue;
+	break;
+
+      default:
+        FFI_ASSERT (0);
+        break;
+    }
+}
+ 
+/*======================== End of Routine ============================*/
+
+/*====================================================================*/
+/*                                                                    */
+/* Name     - ffi_prep_closure_loc.                                   */
+/*                                                                    */
+/* Function - Prepare a FFI closure.                                  */
+/*                                                                    */
+/*====================================================================*/
+ 
+ffi_status
+ffi_prep_closure_loc (ffi_closure *closure,
+		      ffi_cif *cif,
+		      void (*fun) (ffi_cif *, void *, void **, void *),
+		      void *user_data,
+		      void *codeloc)
+{
+  FFI_ASSERT (cif->abi == FFI_SYSV);
+
+#ifndef __s390x__
+  *(short *)&closure->tramp [0] = 0x0d10;   /* basr %r1,0 */
+  *(short *)&closure->tramp [2] = 0x9801;   /* lm %r0,%r1,6(%r1) */
+  *(short *)&closure->tramp [4] = 0x1006;
+  *(short *)&closure->tramp [6] = 0x07f1;   /* br %r1 */
+  *(long  *)&closure->tramp [8] = (long)codeloc;
+  *(long  *)&closure->tramp[12] = (long)&ffi_closure_SYSV;
+#else
+  *(short *)&closure->tramp [0] = 0x0d10;   /* basr %r1,0 */
+  *(short *)&closure->tramp [2] = 0xeb01;   /* lmg %r0,%r1,14(%r1) */
+  *(short *)&closure->tramp [4] = 0x100e;
+  *(short *)&closure->tramp [6] = 0x0004;
+  *(short *)&closure->tramp [8] = 0x07f1;   /* br %r1 */
+  *(long  *)&closure->tramp[16] = (long)codeloc;
+  *(long  *)&closure->tramp[24] = (long)&ffi_closure_SYSV;
+#endif 
+ 
+  closure->cif = cif;
+  closure->user_data = user_data;
+  closure->fun = fun;
+ 
+  return FFI_OK;
+}
+
+/*======================== End of Routine ============================*/
+ 
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffitarget.h
new file mode 100644
index 0000000..a262691
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/ffitarget.h
@@ -0,0 +1,62 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Target configuration macros for S390.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+#if defined (__s390x__)
+#ifndef S390X
+#define S390X
+#endif
+#endif
+
+/* ---- System specific configurations ----------------------------------- */
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_SYSV,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_SYSV
+} ffi_abi;
+#endif
+
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#ifdef S390X
+#define FFI_TRAMPOLINE_SIZE 32
+#else
+#define FFI_TRAMPOLINE_SIZE 16
+#endif
+#define FFI_NATIVE_RAW_API 0
+
+#endif
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/sysv.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/sysv.S
new file mode 100644
index 0000000..4731a31
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/s390/sysv.S
@@ -0,0 +1,434 @@
+/* -----------------------------------------------------------------------
+   sysv.S - Copyright (c) 2000 Software AG
+            Copyright (c) 2008 Red Hat, Inc.
+ 
+   S390 Foreign Function Interface
+ 
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+
+#ifndef __s390x__
+ 
+.text
+
+	# r2:	cif->bytes
+	# r3:	&ecif
+	# r4:	ffi_prep_args
+	# r5:	ret_type
+	# r6:	ecif.rvalue
+	# ov:	fn 
+ 
+	# This assumes we are using gas.
+	.globl	ffi_call_SYSV
+	.type	ffi_call_SYSV,%function
+ffi_call_SYSV:
+.LFB1:
+	stm	%r6,%r15,24(%r15)		# Save registers
+.LCFI0:
+	basr	%r13,0				# Set up base register
+.Lbase:
+	lr	%r11,%r15			# Set up frame pointer
+.LCFI1:
+	sr	%r15,%r2
+	ahi	%r15,-96-48			# Allocate stack
+	lr	%r8,%r6				# Save ecif.rvalue
+	sr	%r9,%r9
+	ic	%r9,.Ltable-.Lbase(%r13,%r5)	# Load epilog address
+	l	%r7,96(%r11)			# Load function address
+	st	%r11,0(%r15)			# Set up back chain
+	ahi	%r11,-48			# Register save area
+.LCFI2:
+
+	la	%r2,96(%r15)			# Save area
+						# r3 already holds &ecif
+	basr	%r14,%r4			# Call ffi_prep_args
+
+	lm	%r2,%r6,0(%r11)			# Load arguments
+	ld	%f0,32(%r11)
+	ld	%f2,40(%r11)
+	la	%r14,0(%r13,%r9)		# Set return address
+	br	%r7				# ... and call function
+
+.LretNone:					# Return void
+	l	%r4,48+56(%r11)
+	lm	%r6,%r15,48+24(%r11)
+	br	%r4
+
+.LretFloat:
+	l	%r4,48+56(%r11)
+	ste	%f0,0(%r8)			# Return float
+	lm	%r6,%r15,48+24(%r11)
+	br	%r4
+ 
+.LretDouble:
+	l	%r4,48+56(%r11)
+	std	%f0,0(%r8)			# Return double
+	lm	%r6,%r15,48+24(%r11)
+	br	%r4
+
+.LretInt32:
+	l	%r4,48+56(%r11)
+	st	%r2,0(%r8)			# Return int
+	lm	%r6,%r15,48+24(%r11)
+	br	%r4
+ 
+.LretInt64:
+	l	%r4,48+56(%r11)
+	stm	%r2,%r3,0(%r8)			# Return long long
+	lm	%r6,%r15,48+24(%r11)
+	br	%r4
+ 
+.Ltable:
+	.byte	.LretNone-.Lbase		# FFI390_RET_VOID
+	.byte	.LretNone-.Lbase		# FFI390_RET_STRUCT
+	.byte	.LretFloat-.Lbase		# FFI390_RET_FLOAT
+	.byte	.LretDouble-.Lbase		# FFI390_RET_DOUBLE
+	.byte	.LretInt32-.Lbase		# FFI390_RET_INT32
+	.byte	.LretInt64-.Lbase		# FFI390_RET_INT64
+
+.LFE1: 
+.ffi_call_SYSV_end:
+	.size	 ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
+
+
+	.globl	ffi_closure_SYSV
+	.type	ffi_closure_SYSV,%function
+ffi_closure_SYSV:
+.LFB2:
+	stm	%r12,%r15,48(%r15)		# Save registers
+.LCFI10:
+	basr	%r13,0				# Set up base register
+.Lcbase:
+	stm	%r2,%r6,8(%r15)			# Save arguments
+	std	%f0,64(%r15)
+	std	%f2,72(%r15)
+	lr	%r1,%r15			# Set up stack frame
+	ahi	%r15,-96
+.LCFI11:
+	l	%r12,.Lchelper-.Lcbase(%r13)	# Get helper function
+	lr	%r2,%r0				# Closure
+	la	%r3,8(%r1)			# GPRs
+	la	%r4,64(%r1)			# FPRs
+	la	%r5,96(%r1)			# Overflow
+	st	%r1,0(%r15)			# Set up back chain
+
+	bas	%r14,0(%r12,%r13)		# Call helper
+
+	l	%r4,96+56(%r15)
+	ld	%f0,96+64(%r15)			# Load return registers
+	lm	%r2,%r3,96+8(%r15)
+	lm	%r12,%r15,96+48(%r15)
+	br	%r4
+
+	.align 4
+.Lchelper:
+	.long	ffi_closure_helper_SYSV-.Lcbase
+
+.LFE2: 
+
+.ffi_closure_SYSV_end:
+	.size	 ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
+
+
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
+.Lframe1:
+	.4byte	.LECIE1-.LSCIE1	# Length of Common Information Entry
+.LSCIE1:
+	.4byte	0x0	# CIE Identifier Tag
+	.byte	0x1	# CIE Version
+	.ascii "zR\0"	# CIE Augmentation
+	.uleb128 0x1	# CIE Code Alignment Factor
+	.sleb128 -4	# CIE Data Alignment Factor
+	.byte	0xe	# CIE RA Column
+	.uleb128 0x1	# Augmentation size
+	.byte	0x1b	# FDE Encoding (pcrel sdata4)
+	.byte	0xc	# DW_CFA_def_cfa
+	.uleb128 0xf
+	.uleb128 0x60
+	.align	4
+.LECIE1:
+.LSFDE1:
+	.4byte	.LEFDE1-.LASFDE1	# FDE Length
+.LASFDE1:
+	.4byte	.LASFDE1-.Lframe1	# FDE CIE offset
+	.4byte	.LFB1-.	# FDE initial location
+	.4byte	.LFE1-.LFB1	# FDE address range
+	.uleb128 0x0	# Augmentation size
+	.byte	0x4	# DW_CFA_advance_loc4
+	.4byte	.LCFI0-.LFB1
+	.byte	0x8f	# DW_CFA_offset, column 0xf
+	.uleb128 0x9
+	.byte	0x8e	# DW_CFA_offset, column 0xe
+	.uleb128 0xa
+	.byte	0x8d	# DW_CFA_offset, column 0xd
+	.uleb128 0xb
+	.byte	0x8c	# DW_CFA_offset, column 0xc
+	.uleb128 0xc
+	.byte	0x8b	# DW_CFA_offset, column 0xb
+	.uleb128 0xd
+	.byte	0x8a	# DW_CFA_offset, column 0xa
+	.uleb128 0xe
+	.byte	0x89	# DW_CFA_offset, column 0x9
+	.uleb128 0xf
+	.byte	0x88	# DW_CFA_offset, column 0x8
+	.uleb128 0x10
+	.byte	0x87	# DW_CFA_offset, column 0x7
+	.uleb128 0x11
+	.byte	0x86	# DW_CFA_offset, column 0x6
+	.uleb128 0x12
+	.byte	0x4	# DW_CFA_advance_loc4
+	.4byte	.LCFI1-.LCFI0
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0xb
+	.byte	0x4	# DW_CFA_advance_loc4
+	.4byte	.LCFI2-.LCFI1
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x90
+	.align	4
+.LEFDE1:
+.LSFDE2:
+	.4byte	.LEFDE2-.LASFDE2	# FDE Length
+.LASFDE2:
+	.4byte	.LASFDE2-.Lframe1	# FDE CIE offset
+	.4byte	.LFB2-.	# FDE initial location
+	.4byte	.LFE2-.LFB2	# FDE address range
+	.uleb128 0x0	# Augmentation size
+	.byte	0x4	# DW_CFA_advance_loc4
+	.4byte	.LCFI10-.LFB2
+	.byte	0x8f	# DW_CFA_offset, column 0xf
+	.uleb128 0x9
+	.byte	0x8e	# DW_CFA_offset, column 0xe
+	.uleb128 0xa
+	.byte	0x8d	# DW_CFA_offset, column 0xd
+	.uleb128 0xb
+	.byte	0x8c	# DW_CFA_offset, column 0xc
+	.uleb128 0xc
+	.byte	0x4	# DW_CFA_advance_loc4
+	.4byte	.LCFI11-.LCFI10
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0xc0
+	.align	4
+.LEFDE2:
+
+#else
+ 
+.text
+ 
+	# r2:	cif->bytes
+	# r3:	&ecif
+	# r4:	ffi_prep_args
+	# r5:	ret_type
+	# r6:	ecif.rvalue
+	# ov:	fn 
+ 
+	# This assumes we are using gas.
+	.globl	ffi_call_SYSV
+	.type	ffi_call_SYSV,%function
+ffi_call_SYSV:
+.LFB1:
+	stmg	%r6,%r15,48(%r15)		# Save registers
+.LCFI0:
+	larl	%r13,.Lbase			# Set up base register
+	lgr	%r11,%r15			# Set up frame pointer
+.LCFI1:
+	sgr	%r15,%r2
+	aghi	%r15,-160-80			# Allocate stack
+	lgr	%r8,%r6				# Save ecif.rvalue
+	llgc	%r9,.Ltable-.Lbase(%r13,%r5)	# Load epilog address
+	lg	%r7,160(%r11)			# Load function address
+	stg	%r11,0(%r15)			# Set up back chain
+	aghi	%r11,-80			# Register save area
+.LCFI2:
+
+	la	%r2,160(%r15)			# Save area
+						# r3 already holds &ecif
+	basr	%r14,%r4			# Call ffi_prep_args
+
+	lmg	%r2,%r6,0(%r11)			# Load arguments
+	ld	%f0,48(%r11)
+	ld	%f2,56(%r11)
+	ld	%f4,64(%r11)
+	ld	%f6,72(%r11)
+	la	%r14,0(%r13,%r9)		# Set return address
+	br	%r7				# ... and call function
+
+.Lbase:
+.LretNone:					# Return void
+	lg	%r4,80+112(%r11)
+	lmg	%r6,%r15,80+48(%r11)
+	br	%r4
+
+.LretFloat:
+	lg	%r4,80+112(%r11)
+	ste	%f0,0(%r8)			# Return float
+	lmg	%r6,%r15,80+48(%r11)
+	br	%r4
+ 
+.LretDouble:
+	lg	%r4,80+112(%r11)
+	std	%f0,0(%r8)			# Return double
+	lmg	%r6,%r15,80+48(%r11)
+	br	%r4
+
+.LretInt32:
+	lg	%r4,80+112(%r11)
+	st	%r2,0(%r8)			# Return int
+	lmg	%r6,%r15,80+48(%r11)
+	br	%r4
+ 
+.LretInt64:
+	lg	%r4,80+112(%r11)
+	stg	%r2,0(%r8)			# Return long
+	lmg	%r6,%r15,80+48(%r11)
+	br	%r4
+ 
+.Ltable:
+	.byte	.LretNone-.Lbase		# FFI390_RET_VOID
+	.byte	.LretNone-.Lbase		# FFI390_RET_STRUCT
+	.byte	.LretFloat-.Lbase		# FFI390_RET_FLOAT
+	.byte	.LretDouble-.Lbase		# FFI390_RET_DOUBLE
+	.byte	.LretInt32-.Lbase		# FFI390_RET_INT32
+	.byte	.LretInt64-.Lbase		# FFI390_RET_INT64
+
+.LFE1: 
+.ffi_call_SYSV_end:
+	.size	 ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
+
+
+	.globl	ffi_closure_SYSV
+	.type	ffi_closure_SYSV,%function
+ffi_closure_SYSV:
+.LFB2:
+	stmg	%r14,%r15,112(%r15)		# Save registers
+.LCFI10:
+	stmg	%r2,%r6,16(%r15)		# Save arguments
+	std	%f0,128(%r15)
+	std	%f2,136(%r15)
+	std	%f4,144(%r15)
+	std	%f6,152(%r15)
+	lgr	%r1,%r15			# Set up stack frame
+	aghi	%r15,-160
+.LCFI11:
+	lgr	%r2,%r0				# Closure
+	la	%r3,16(%r1)			# GPRs
+	la	%r4,128(%r1)			# FPRs
+	la	%r5,160(%r1)			# Overflow
+	stg	%r1,0(%r15)			# Set up back chain
+
+	brasl	%r14,ffi_closure_helper_SYSV	# Call helper
+
+	lg	%r14,160+112(%r15)
+	ld	%f0,160+128(%r15)		# Load return registers
+	lg	%r2,160+16(%r15)
+	la	%r15,160(%r15)
+	br	%r14
+.LFE2: 
+
+.ffi_closure_SYSV_end:
+	.size	 ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
+
+
+
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
+.Lframe1:
+	.4byte	.LECIE1-.LSCIE1	# Length of Common Information Entry
+.LSCIE1:
+	.4byte	0x0	# CIE Identifier Tag
+	.byte	0x1	# CIE Version
+	.ascii "zR\0"	# CIE Augmentation
+	.uleb128 0x1	# CIE Code Alignment Factor
+	.sleb128 -8	# CIE Data Alignment Factor
+	.byte	0xe	# CIE RA Column
+	.uleb128 0x1	# Augmentation size
+	.byte	0x1b	# FDE Encoding (pcrel sdata4)
+	.byte	0xc	# DW_CFA_def_cfa
+	.uleb128 0xf
+	.uleb128 0xa0
+	.align	8
+.LECIE1:
+.LSFDE1:
+	.4byte	.LEFDE1-.LASFDE1	# FDE Length
+.LASFDE1:
+	.4byte	.LASFDE1-.Lframe1	# FDE CIE offset
+	.4byte	.LFB1-.	# FDE initial location
+	.4byte	.LFE1-.LFB1	# FDE address range
+	.uleb128 0x0	# Augmentation size
+	.byte	0x4	# DW_CFA_advance_loc4
+	.4byte	.LCFI0-.LFB1
+	.byte	0x8f	# DW_CFA_offset, column 0xf
+	.uleb128 0x5
+	.byte	0x8e	# DW_CFA_offset, column 0xe
+	.uleb128 0x6
+	.byte	0x8d	# DW_CFA_offset, column 0xd
+	.uleb128 0x7
+	.byte	0x8c	# DW_CFA_offset, column 0xc
+	.uleb128 0x8
+	.byte	0x8b	# DW_CFA_offset, column 0xb
+	.uleb128 0x9
+	.byte	0x8a	# DW_CFA_offset, column 0xa
+	.uleb128 0xa
+	.byte	0x89	# DW_CFA_offset, column 0x9
+	.uleb128 0xb
+	.byte	0x88	# DW_CFA_offset, column 0x8
+	.uleb128 0xc
+	.byte	0x87	# DW_CFA_offset, column 0x7
+	.uleb128 0xd
+	.byte	0x86	# DW_CFA_offset, column 0x6
+	.uleb128 0xe
+	.byte	0x4	# DW_CFA_advance_loc4
+	.4byte	.LCFI1-.LCFI0
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0xb
+	.byte	0x4	# DW_CFA_advance_loc4
+	.4byte	.LCFI2-.LCFI1
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0xf0
+	.align	8
+.LEFDE1:
+.LSFDE2:
+	.4byte	.LEFDE2-.LASFDE2	# FDE Length
+.LASFDE2:
+	.4byte	.LASFDE2-.Lframe1	# FDE CIE offset
+	.4byte	.LFB2-.	# FDE initial location
+	.4byte	.LFE2-.LFB2	# FDE address range
+	.uleb128 0x0	# Augmentation size
+	.byte	0x4	# DW_CFA_advance_loc4
+	.4byte	.LCFI10-.LFB2
+	.byte	0x8f	# DW_CFA_offset, column 0xf
+	.uleb128 0x5
+	.byte	0x8e	# DW_CFA_offset, column 0xe
+	.uleb128 0x6
+	.byte	0x4	# DW_CFA_advance_loc4
+	.4byte	.LCFI11-.LCFI10
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x140
+	.align	8
+.LEFDE2:
+
+#endif
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffi.c
new file mode 100644
index 0000000..69bd025
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffi.c
@@ -0,0 +1,716 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Kaz Kojima
+           Copyright (c) 2008 Red Hat, Inc.
+   
+   SuperH Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+
+#define NGREGARG 4
+#if defined(__SH4__)
+#define NFREGARG 8
+#endif
+
+#if defined(__HITACHI__)
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
+#else
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
+#endif
+
+/* If the structure has essentialy an unique element, return its type.  */
+static int
+simple_type (ffi_type *arg)
+{
+  if (arg->type != FFI_TYPE_STRUCT)
+    return arg->type;
+  else if (arg->elements[1])
+    return FFI_TYPE_STRUCT;
+
+  return simple_type (arg->elements[0]);
+}
+
+static int
+return_type (ffi_type *arg)
+{
+  unsigned short type;
+
+  if (arg->type != FFI_TYPE_STRUCT)
+    return arg->type;
+
+  type = simple_type (arg->elements[0]);
+  if (! arg->elements[1])
+    {
+      switch (type)
+	{
+	case FFI_TYPE_SINT8:
+	case FFI_TYPE_UINT8:
+	case FFI_TYPE_SINT16:
+	case FFI_TYPE_UINT16:
+	case FFI_TYPE_SINT32:
+	case FFI_TYPE_UINT32:
+	  return FFI_TYPE_INT;
+
+	default:
+	  return type;
+	}
+    }
+
+  /* gcc uses r0/r1 pair for some kind of structures.  */
+  if (arg->size <= 2 * sizeof (int))
+    {
+      int i = 0;
+      ffi_type *e;
+
+      while ((e = arg->elements[i++]))
+	{
+	  type = simple_type (e);
+	  switch (type)
+	    {
+	    case FFI_TYPE_SINT32:
+	    case FFI_TYPE_UINT32:
+	    case FFI_TYPE_INT:
+	    case FFI_TYPE_FLOAT:
+	      return FFI_TYPE_UINT64;
+
+	    default:
+	      break;
+	    }
+	}
+    }
+
+  return FFI_TYPE_STRUCT;
+}
+
+/* ffi_prep_args is called by the assembly routine once stack space
+   has been allocated for the function's arguments */
+
+void ffi_prep_args(char *stack, extended_cif *ecif)
+{
+  register unsigned int i;
+  register int tmp;
+  register unsigned int avn;
+  register void **p_argv;
+  register char *argp;
+  register ffi_type **p_arg;
+  int greg, ireg;
+#if defined(__SH4__)
+  int freg = 0;
+#endif
+
+  tmp = 0;
+  argp = stack;
+
+  if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT)
+    {
+      *(void **) argp = ecif->rvalue;
+      argp += 4;
+      ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
+    }
+  else
+    ireg = 0;
+
+  /* Set arguments for registers.  */
+  greg = ireg;
+  avn = ecif->cif->nargs;
+  p_argv = ecif->avalue;
+
+  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
+    {
+      size_t z;
+
+      z = (*p_arg)->size;
+      if (z < sizeof(int))
+	{
+	  if (greg++ >= NGREGARG)
+	    continue;
+
+	  z = sizeof(int);
+	  switch ((*p_arg)->type)
+	    {
+	    case FFI_TYPE_SINT8:
+	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
+	      break;
+  
+	    case FFI_TYPE_UINT8:
+	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
+	      break;
+  
+	    case FFI_TYPE_SINT16:
+	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
+	      break;
+  
+	    case FFI_TYPE_UINT16:
+	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
+	      break;
+  
+	    case FFI_TYPE_STRUCT:
+	      *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
+	      break;
+
+	    default:
+	      FFI_ASSERT(0);
+	    }
+	  argp += z;
+	}
+      else if (z == sizeof(int))
+	{
+#if defined(__SH4__)
+	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
+	    {
+	      if (freg++ >= NFREGARG)
+		continue;
+	    }
+	  else
+#endif
+	    {
+	      if (greg++ >= NGREGARG)
+		continue;
+	    }
+	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
+	  argp += z;
+	}
+#if defined(__SH4__)
+      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
+	{
+	  if (freg + 1 >= NFREGARG)
+	    continue;
+	  freg = (freg + 1) & ~1;
+	  freg += 2;
+	  memcpy (argp, *p_argv, z);
+	  argp += z;
+	}
+#endif
+      else
+	{
+	  int n = (z + sizeof (int) - 1) / sizeof (int);
+#if defined(__SH4__)
+	  if (greg + n - 1 >= NGREGARG)
+	    continue;
+#else
+	  if (greg >= NGREGARG)
+	    continue;
+#endif
+	  greg += n;
+	  memcpy (argp, *p_argv, z);
+	  argp += n * sizeof (int);
+	}
+    }
+
+  /* Set arguments on stack.  */
+  greg = ireg;
+#if defined(__SH4__)
+  freg = 0;
+#endif
+  p_argv = ecif->avalue;
+
+  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
+    {
+      size_t z;
+
+      z = (*p_arg)->size;
+      if (z < sizeof(int))
+	{
+	  if (greg++ < NGREGARG)
+	    continue;
+
+	  z = sizeof(int);
+	  switch ((*p_arg)->type)
+	    {
+	    case FFI_TYPE_SINT8:
+	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
+	      break;
+  
+	    case FFI_TYPE_UINT8:
+	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
+	      break;
+  
+	    case FFI_TYPE_SINT16:
+	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
+	      break;
+  
+	    case FFI_TYPE_UINT16:
+	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
+	      break;
+  
+	    case FFI_TYPE_STRUCT:
+	      *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
+	      break;
+
+	    default:
+	      FFI_ASSERT(0);
+	    }
+	  argp += z;
+	}
+      else if (z == sizeof(int))
+	{
+#if defined(__SH4__)
+	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
+	    {
+	      if (freg++ < NFREGARG)
+		continue;
+	    }
+	  else
+#endif
+	    {
+	      if (greg++ < NGREGARG)
+		continue;
+	    }
+	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
+	  argp += z;
+	}
+#if defined(__SH4__)
+      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
+	{
+	  if (freg + 1 < NFREGARG)
+	    {
+	      freg = (freg + 1) & ~1;
+	      freg += 2;
+	      continue;
+	    }
+	  memcpy (argp, *p_argv, z);
+	  argp += z;
+	}
+#endif
+      else
+	{
+	  int n = (z + sizeof (int) - 1) / sizeof (int);
+	  if (greg + n - 1 < NGREGARG)
+	    {
+	      greg += n;
+	      continue;
+	    }
+#if (! defined(__SH4__))
+	  else if (greg < NGREGARG)
+	    {
+	      greg = NGREGARG;
+	      continue;
+	    }
+#endif
+	  memcpy (argp, *p_argv, z);
+	  argp += n * sizeof (int);
+	}
+    }
+
+  return;
+}
+
+/* Perform machine dependent cif processing */
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  int i, j;
+  int size, type;
+  int n, m;
+  int greg;
+#if defined(__SH4__)
+  int freg = 0;
+#endif
+
+  cif->flags = 0;
+
+  greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) &&
+	  STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0;
+
+#if defined(__SH4__)
+  for (i = j = 0; i < cif->nargs && j < 12; i++)
+    {
+      type = (cif->arg_types)[i]->type;
+      switch (type)
+	{
+	case FFI_TYPE_FLOAT:
+	  if (freg >= NFREGARG)
+	    continue;
+	  freg++;
+	  cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
+	  j++;
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  if ((freg + 1) >= NFREGARG)
+	    continue;
+	  freg = (freg + 1) & ~1;
+	  freg += 2;
+	  cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
+	  j++;
+	  break;
+	      
+	default:
+	  size = (cif->arg_types)[i]->size;
+	  n = (size + sizeof (int) - 1) / sizeof (int);
+	  if (greg + n - 1 >= NGREGARG)
+		continue;
+	  greg += n;
+	  for (m = 0; m < n; m++)
+	    cif->flags += FFI_TYPE_INT << (2 * j++);
+	  break;
+	}
+    }
+#else
+  for (i = j = 0; i < cif->nargs && j < 4; i++)
+    {
+      size = (cif->arg_types)[i]->size;
+      n = (size + sizeof (int) - 1) / sizeof (int);
+      if (greg >= NGREGARG)
+	continue;
+      else if (greg + n - 1 >= NGREGARG)
+	n = NGREGARG - greg;
+      greg += n;
+      for (m = 0; m < n; m++)
+        cif->flags += FFI_TYPE_INT << (2 * j++);
+    }
+#endif
+
+  /* Set the return type flag */
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_STRUCT:
+      cif->flags += (unsigned) (return_type (cif->rtype)) << 24;
+      break;
+
+    case FFI_TYPE_VOID:
+    case FFI_TYPE_FLOAT:
+    case FFI_TYPE_DOUBLE:
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_UINT64:
+      cif->flags += (unsigned) cif->rtype->type << 24;
+      break;
+
+    default:
+      cif->flags += FFI_TYPE_INT << 24;
+      break;
+    }
+
+  return FFI_OK;
+}
+
+extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
+			  unsigned, unsigned, unsigned *, void (*fn)(void));
+
+void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+  UINT64 trvalue;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+  
+  /* If the return value is a struct and we don't have a return	*/
+  /* value address then we need to make one		        */
+
+  if (cif->rtype->type == FFI_TYPE_STRUCT
+      && return_type (cif->rtype) != FFI_TYPE_STRUCT)
+    ecif.rvalue = &trvalue;
+  else if ((rvalue == NULL) && 
+      (cif->rtype->type == FFI_TYPE_STRUCT))
+    {
+      ecif.rvalue = alloca(cif->rtype->size);
+    }
+  else
+    ecif.rvalue = rvalue;
+
+  switch (cif->abi) 
+    {
+    case FFI_SYSV:
+      ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue,
+		    fn);
+      break;
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+
+  if (rvalue
+      && cif->rtype->type == FFI_TYPE_STRUCT
+      && return_type (cif->rtype) != FFI_TYPE_STRUCT)
+    memcpy (rvalue, &trvalue, cif->rtype->size);
+}
+
+extern void ffi_closure_SYSV (void);
+#if defined(__SH4__)
+extern void __ic_invalidate (void *line);
+#endif
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*, void*, void**, void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  unsigned int *tramp;
+  unsigned int insn;
+
+  FFI_ASSERT (cif->abi == FFI_GCC_SYSV);
+
+  tramp = (unsigned int *) &closure->tramp[0];
+  /* Set T bit if the function returns a struct pointed with R2.  */
+  insn = (return_type (cif->rtype) == FFI_TYPE_STRUCT
+	  ? 0x0018 /* sett */
+	  : 0x0008 /* clrt */);
+
+#ifdef __LITTLE_ENDIAN__
+  tramp[0] = 0xd301d102;
+  tramp[1] = 0x0000412b | (insn << 16);
+#else
+  tramp[0] = 0xd102d301;
+  tramp[1] = 0x412b0000 | insn;
+#endif
+  *(void **) &tramp[2] = (void *)codeloc;          /* ctx */
+  *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */
+
+  closure->cif = cif;
+  closure->fun = fun;
+  closure->user_data = user_data;
+
+#if defined(__SH4__)
+  /* Flush the icache.  */
+  __ic_invalidate(codeloc);
+#endif
+
+  return FFI_OK;
+}
+
+/* Basically the trampoline invokes ffi_closure_SYSV, and on 
+ * entry, r3 holds the address of the closure.
+ * After storing the registers that could possibly contain
+ * parameters to be passed into the stack frame and setting
+ * up space for a return value, ffi_closure_SYSV invokes the 
+ * following helper function to do most of the work.
+ */
+
+#ifdef __LITTLE_ENDIAN__
+#define OFS_INT8	0
+#define OFS_INT16	0
+#else
+#define OFS_INT8	3
+#define OFS_INT16	2
+#endif
+
+int
+ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, 
+			 unsigned long *pgr, unsigned long *pfr, 
+			 unsigned long *pst)
+{
+  void **avalue;
+  ffi_type **p_arg;
+  int i, avn;
+  int ireg, greg = 0;
+#if defined(__SH4__)
+  int freg = 0;
+#endif
+  ffi_cif *cif; 
+
+  cif = closure->cif;
+  avalue = alloca(cif->nargs * sizeof(void *));
+
+  /* Copy the caller's structure return value address so that the closure
+     returns the data directly to the caller.  */
+  if (cif->rtype->type == FFI_TYPE_STRUCT && STRUCT_VALUE_ADDRESS_WITH_ARG)
+    {
+      rvalue = (void *) *pgr++;
+      ireg = 1;
+    }
+  else
+    ireg = 0;
+
+  cif = closure->cif;
+  greg = ireg;
+  avn = cif->nargs;
+
+  /* Grab the addresses of the arguments from the stack frame.  */
+  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
+    {
+      size_t z;
+
+      z = (*p_arg)->size;
+      if (z < sizeof(int))
+	{
+	  if (greg++ >= NGREGARG)
+	    continue;
+
+	  z = sizeof(int);
+	  switch ((*p_arg)->type)
+	    {
+	    case FFI_TYPE_SINT8:
+	    case FFI_TYPE_UINT8:
+	      avalue[i] = (((char *)pgr) + OFS_INT8);
+	      break;
+  
+	    case FFI_TYPE_SINT16:
+	    case FFI_TYPE_UINT16:
+	      avalue[i] = (((char *)pgr) + OFS_INT16);
+	      break;
+  
+	    case FFI_TYPE_STRUCT:
+	      avalue[i] = pgr;
+	      break;
+
+	    default:
+	      FFI_ASSERT(0);
+	    }
+	  pgr++;
+	}
+      else if (z == sizeof(int))
+	{
+#if defined(__SH4__)
+	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
+	    {
+	      if (freg++ >= NFREGARG)
+		continue;
+	      avalue[i] = pfr;
+	      pfr++;
+	    }
+	  else
+#endif
+	    {
+	      if (greg++ >= NGREGARG)
+		continue;
+	      avalue[i] = pgr;
+	      pgr++;
+	    }
+	}
+#if defined(__SH4__)
+      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
+	{
+	  if (freg + 1 >= NFREGARG)
+	    continue;
+	  if (freg & 1)
+	    pfr++;
+	  freg = (freg + 1) & ~1;
+	  freg += 2;
+	  avalue[i] = pfr;
+	  pfr += 2;
+	}
+#endif
+      else
+	{
+	  int n = (z + sizeof (int) - 1) / sizeof (int);
+#if defined(__SH4__)
+	  if (greg + n - 1 >= NGREGARG)
+	    continue;
+#else
+	  if (greg >= NGREGARG)
+	    continue;
+#endif
+	  greg += n;
+	  avalue[i] = pgr;
+	  pgr += n;
+	}
+    }
+
+  greg = ireg;
+#if defined(__SH4__)
+  freg = 0;
+#endif
+
+  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
+    {
+      size_t z;
+
+      z = (*p_arg)->size;
+      if (z < sizeof(int))
+	{
+	  if (greg++ < NGREGARG)
+	    continue;
+
+	  z = sizeof(int);
+	  switch ((*p_arg)->type)
+	    {
+	    case FFI_TYPE_SINT8:
+	    case FFI_TYPE_UINT8:
+	      avalue[i] = (((char *)pst) + OFS_INT8);
+	      break;
+  
+	    case FFI_TYPE_SINT16:
+	    case FFI_TYPE_UINT16:
+	      avalue[i] = (((char *)pst) + OFS_INT16);
+	      break;
+  
+	    case FFI_TYPE_STRUCT:
+	      avalue[i] = pst;
+	      break;
+
+	    default:
+	      FFI_ASSERT(0);
+	    }
+	  pst++;
+	}
+      else if (z == sizeof(int))
+	{
+#if defined(__SH4__)
+	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
+	    {
+	      if (freg++ < NFREGARG)
+		continue;
+	    }
+	  else
+#endif
+	    {
+	      if (greg++ < NGREGARG)
+		continue;
+	    }
+	  avalue[i] = pst;
+	  pst++;
+	}
+#if defined(__SH4__)
+      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
+	{
+	  if (freg + 1 < NFREGARG)
+	    {
+	      freg = (freg + 1) & ~1;
+	      freg += 2;
+	      continue;
+	    }
+	  avalue[i] = pst;
+	  pst += 2;
+	}
+#endif
+      else
+	{
+	  int n = (z + sizeof (int) - 1) / sizeof (int);
+	  if (greg + n - 1 < NGREGARG)
+	    {
+	      greg += n;
+	      continue;
+	    }
+#if (! defined(__SH4__))
+	  else if (greg < NGREGARG)
+	    {
+	      greg += n;
+	      pst += greg - NGREGARG;
+	      continue;
+	    }
+#endif
+	  avalue[i] = pst;
+	  pst += n;
+	}
+    }
+
+  (closure->fun) (cif, rvalue, avalue, closure->user_data);
+
+  /* Tell ffi_closure_SYSV how to perform return type promotions.  */
+  return return_type (cif->rtype);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffitarget.h
new file mode 100644
index 0000000..4f1f639
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/ffitarget.h
@@ -0,0 +1,49 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Target configuration macros for SuperH.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+/* ---- Generic type definitions ----------------------------------------- */
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_SYSV,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_SYSV
+} ffi_abi;
+#endif
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 16
+#define FFI_NATIVE_RAW_API 0
+
+#endif
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/sysv.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/sysv.S
new file mode 100644
index 0000000..5be7516
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh/sysv.S
@@ -0,0 +1,850 @@
+/* -----------------------------------------------------------------------
+   sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima
+   
+   SuperH Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+#ifdef HAVE_MACHINE_ASM_H
+#include <machine/asm.h>
+#else
+/* XXX these lose for some platforms, I'm sure. */
+#define CNAME(x) x
+#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
+#endif
+
+#if defined(__HITACHI__)
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
+#else
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
+#endif
+
+.text
+
+	# r4:	ffi_prep_args
+	# r5:	&ecif
+	# r6:	bytes
+	# r7:	flags
+	# sp+0: rvalue
+	# sp+4: fn
+
+	# This assumes we are using gas.
+ENTRY(ffi_call_SYSV)
+	# Save registers
+.LFB1:
+	mov.l	r8,@-r15
+.LCFI0:
+	mov.l	r9,@-r15
+.LCFI1:
+	mov.l	r10,@-r15
+.LCFI2:
+	mov.l	r12,@-r15
+.LCFI3:
+	mov.l	r14,@-r15
+.LCFI4:
+	sts.l	pr,@-r15
+.LCFI5:
+	mov	r15,r14
+.LCFI6:
+#if defined(__SH4__)
+	mov	r6,r8
+	mov	r7,r9
+
+	sub	r6,r15
+	add	#-16,r15
+	mov	#~7,r0
+	and	r0,r15
+
+	mov	r4,r0
+	jsr	@r0
+	 mov	r15,r4
+
+	mov	r9,r1
+	shlr8	r9
+	shlr8	r9
+	shlr8	r9
+
+	mov	#FFI_TYPE_STRUCT,r2
+	cmp/eq	r2,r9
+	bf	1f
+#if STRUCT_VALUE_ADDRESS_WITH_ARG
+ 	mov.l	@r15+,r4
+	bra	2f
+	 mov	#5,r2
+#else
+ 	mov.l	@r15+,r10
+#endif
+1:
+	mov	#4,r2
+2:
+	mov	#4,r3
+
+L_pass:
+	cmp/pl	r8
+	bf	L_call_it
+
+	mov	r1,r0
+	and	#3,r0
+
+L_pass_d:
+	cmp/eq	#FFI_TYPE_DOUBLE,r0
+	bf	L_pass_f
+
+	mov	r3,r0
+	and	#1,r0
+	tst	r0,r0
+	bt	1f
+	add	#1,r3
+1:
+	mov	#12,r0
+	cmp/hs	r0,r3
+	bt/s	3f
+	 shlr2	r1
+	bsr	L_pop_d
+	 nop
+3:
+	add	#2,r3
+	bra	L_pass
+	 add	#-8,r8
+
+L_pop_d:
+	mov	r3,r0
+	add	r0,r0
+	add	r3,r0
+	add	#-12,r0
+	braf	r0
+	 nop
+#ifdef __LITTLE_ENDIAN__
+	fmov.s	@r15+,fr5
+	rts
+	 fmov.s	@r15+,fr4
+	fmov.s	@r15+,fr7
+	rts
+	 fmov.s	@r15+,fr6
+	fmov.s	@r15+,fr9
+	rts
+	 fmov.s	@r15+,fr8
+	fmov.s	@r15+,fr11
+	rts
+	 fmov.s	@r15+,fr10
+#else
+	fmov.s	@r15+,fr4
+	rts
+	 fmov.s	@r15+,fr5
+	fmov.s	@r15+,fr6
+	rts
+	 fmov.s	@r15+,fr7
+	fmov.s	@r15+,fr8
+	rts
+	 fmov.s	@r15+,fr9
+	fmov.s	@r15+,fr10
+	rts
+	 fmov.s	@r15+,fr11
+#endif
+
+L_pass_f:
+	cmp/eq	#FFI_TYPE_FLOAT,r0
+	bf	L_pass_i
+
+	mov	#12,r0
+	cmp/hs	r0,r3
+	bt/s	2f
+	 shlr2	r1
+	bsr	L_pop_f
+	 nop
+2:
+	add	#1,r3
+	bra	L_pass
+	 add	#-4,r8
+
+L_pop_f:
+	mov	r3,r0
+	shll2	r0
+	add	#-16,r0
+	braf	r0
+	 nop
+#ifdef __LITTLE_ENDIAN__
+	rts
+	 fmov.s	@r15+,fr5
+	rts
+	 fmov.s	@r15+,fr4
+	rts
+	 fmov.s	@r15+,fr7
+	rts
+	 fmov.s	@r15+,fr6
+	rts
+	 fmov.s	@r15+,fr9
+	rts
+	 fmov.s	@r15+,fr8
+	rts
+	 fmov.s	@r15+,fr11
+	rts
+	 fmov.s	@r15+,fr10
+#else
+	rts
+	 fmov.s	@r15+,fr4
+	rts
+	 fmov.s	@r15+,fr5
+	rts
+	 fmov.s	@r15+,fr6
+	rts
+	 fmov.s	@r15+,fr7
+	rts
+	 fmov.s	@r15+,fr8
+	rts
+	 fmov.s	@r15+,fr9
+	rts
+	 fmov.s	@r15+,fr10
+	rts
+	 fmov.s	@r15+,fr11
+#endif
+
+L_pass_i:
+	cmp/eq	#FFI_TYPE_INT,r0
+	bf	L_call_it
+
+	mov	#8,r0
+	cmp/hs	r0,r2
+	bt/s	2f
+	 shlr2	r1
+	bsr	L_pop_i
+	 nop
+2:
+	add	#1,r2
+	bra	L_pass
+	 add	#-4,r8
+
+L_pop_i:
+	mov	r2,r0
+	shll2	r0
+	add	#-16,r0
+	braf	r0
+	 nop
+	rts
+	 mov.l	@r15+,r4
+	rts
+	 mov.l	@r15+,r5
+	rts
+	 mov.l	@r15+,r6
+	rts
+	 mov.l	@r15+,r7
+
+L_call_it:
+	# call function
+#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
+	mov	r10, r2
+#endif
+	mov.l  @(28,r14),r1
+	jsr    @r1
+	 nop
+
+L_ret_d:
+	mov	#FFI_TYPE_DOUBLE,r2
+	cmp/eq	r2,r9
+	bf	L_ret_ll
+
+	mov.l	@(24,r14),r1
+#ifdef __LITTLE_ENDIAN__
+	fmov.s	fr1,@r1
+	add	#4,r1
+	bra	L_epilogue
+	 fmov.s	fr0,@r1
+#else
+	fmov.s	fr0,@r1
+	add	#4,r1
+	bra	L_epilogue
+	 fmov.s	fr1,@r1
+#endif
+
+L_ret_ll:
+	mov	#FFI_TYPE_SINT64,r2
+	cmp/eq	r2,r9
+	bt/s	1f
+	 mov	#FFI_TYPE_UINT64,r2
+	cmp/eq	r2,r9
+	bf	L_ret_f
+
+1:
+	mov.l	@(24,r14),r2
+	mov.l	r0,@r2
+	bra	L_epilogue
+	 mov.l	r1,@(4,r2)
+
+L_ret_f:
+	mov	#FFI_TYPE_FLOAT,r2
+	cmp/eq	r2,r9
+	bf	L_ret_i
+
+	mov.l	@(24,r14),r1
+	bra	L_epilogue
+	 fmov.s	fr0,@r1
+
+L_ret_i:
+	mov	#FFI_TYPE_INT,r2
+	cmp/eq	r2,r9
+	bf	L_epilogue
+
+	mov.l	@(24,r14),r1
+	bra	L_epilogue
+	 mov.l	r0,@r1
+
+L_epilogue:
+	# Remove the space we pushed for the args
+	mov   r14,r15
+
+	lds.l  @r15+,pr
+	mov.l  @r15+,r14
+	mov.l  @r15+,r12
+	mov.l  @r15+,r10
+	mov.l  @r15+,r9
+	rts
+	 mov.l  @r15+,r8
+#else
+	mov	r6,r8
+	mov	r7,r9
+
+	sub	r6,r15
+	add	#-16,r15
+	mov	#~7,r0
+	and	r0,r15
+
+	mov	r4,r0
+	jsr	@r0
+	 mov	r15,r4
+
+	mov	r9,r3
+	shlr8	r9
+	shlr8	r9
+	shlr8	r9
+
+	mov	#FFI_TYPE_STRUCT,r2
+	cmp/eq	r2,r9
+	bf	1f
+#if STRUCT_VALUE_ADDRESS_WITH_ARG
+	mov.l	@r15+,r4
+	bra	2f
+	 mov	#5,r2
+#else
+	mov.l	@r15+,r10
+#endif
+1:
+	mov	#4,r2
+2:
+
+L_pass:
+	cmp/pl	r8
+	bf	L_call_it
+
+	mov	r3,r0
+	and	#3,r0
+
+L_pass_d:
+	cmp/eq	#FFI_TYPE_DOUBLE,r0
+	bf	L_pass_i
+
+	mov	r15,r0
+	and	#7,r0
+	tst	r0,r0
+	bt	1f
+	add	#4,r15
+1:
+	mov	#8,r0
+	cmp/hs	r0,r2
+	bt/s	2f
+	 shlr2	r3
+	bsr	L_pop_d
+	 nop
+2:
+	add	#2,r2
+	bra	L_pass
+	 add	#-8,r8
+
+L_pop_d:
+	mov	r2,r0
+	add	r0,r0
+	add	r2,r0
+	add	#-12,r0
+	add	r0,r0
+	braf	r0
+	 nop
+	mov.l	@r15+,r4
+	rts
+	 mov.l	@r15+,r5
+	mov.l	@r15+,r5
+	rts
+	 mov.l	@r15+,r6
+	mov.l	@r15+,r6
+	rts
+	 mov.l	@r15+,r7
+	rts
+	 mov.l	@r15+,r7
+
+L_pass_i:
+	cmp/eq	#FFI_TYPE_INT,r0
+	bf	L_call_it
+
+	mov	#8,r0
+	cmp/hs	r0,r2
+	bt/s	2f
+	 shlr2	r3
+	bsr	L_pop_i
+	 nop
+2:
+	add	#1,r2
+	bra	L_pass
+	 add	#-4,r8
+
+L_pop_i:
+	mov	r2,r0
+	shll2	r0
+	add	#-16,r0
+	braf	r0
+	 nop
+	rts
+	 mov.l	@r15+,r4
+	rts
+	 mov.l	@r15+,r5
+	rts
+	 mov.l	@r15+,r6
+	rts
+	 mov.l	@r15+,r7
+
+L_call_it:
+	# call function
+#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
+	mov	r10, r2
+#endif
+	mov.l  @(28,r14),r1
+	jsr    @r1
+	 nop
+
+L_ret_d:
+	mov	#FFI_TYPE_DOUBLE,r2
+	cmp/eq	r2,r9
+	bf	L_ret_ll
+
+	mov.l	@(24,r14),r2
+	mov.l	r0,@r2
+	bra	L_epilogue
+	 mov.l	r1,@(4,r2)
+
+L_ret_ll:
+	mov	#FFI_TYPE_SINT64,r2
+	cmp/eq	r2,r9
+	bt/s	1f
+	 mov	#FFI_TYPE_UINT64,r2
+	cmp/eq	r2,r9
+	bf	L_ret_i
+
+1:
+	mov.l	@(24,r14),r2
+	mov.l	r0,@r2
+	bra	L_epilogue
+	 mov.l	r1,@(4,r2)
+
+L_ret_i:
+	mov	#FFI_TYPE_FLOAT,r2
+	cmp/eq	r2,r9
+	bt	1f
+	mov	#FFI_TYPE_INT,r2
+	cmp/eq	r2,r9
+	bf	L_epilogue
+1:
+	mov.l	@(24,r14),r1
+	bra	L_epilogue
+	 mov.l	r0,@r1
+
+L_epilogue:
+	# Remove the space we pushed for the args
+	mov   r14,r15
+
+	lds.l  @r15+,pr
+	mov.l  @r15+,r14
+	mov.l  @r15+,r12
+	mov.l  @r15+,r10
+	mov.l  @r15+,r9
+	rts
+	 mov.l  @r15+,r8
+#endif
+.LFE1:
+.ffi_call_SYSV_end:
+        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
+
+.globl	ffi_closure_helper_SYSV
+
+ENTRY(ffi_closure_SYSV)
+.LFB2:
+	mov.l	r7,@-r15
+.LCFI7:
+	mov.l	r6,@-r15
+.LCFI8:
+	mov.l	r5,@-r15
+.LCFI9:
+	mov.l	r4,@-r15
+.LCFIA:
+	mov.l	r14,@-r15
+.LCFIB:
+	sts.l	pr,@-r15
+
+	/* Stack layout:	
+	   xx bytes (on stack parameters)
+	   16 bytes (register parameters)
+	    4 bytes (saved frame pointer)
+	    4 bytes (saved return address)
+	   32 bytes (floating register parameters, SH-4 only)
+	    8 bytes (result)
+	    4 bytes (pad)
+	    4 bytes (5th arg)
+	   <- new stack pointer
+	*/
+.LCFIC:
+#if defined(__SH4__)
+	add	#-48,r15
+#else
+	add	#-16,r15
+#endif
+.LCFID:
+	mov	r15,r14
+.LCFIE:
+
+#if defined(__SH4__)
+	mov	r14,r1
+	add	#48,r1
+#ifdef __LITTLE_ENDIAN__
+	fmov.s	fr10,@-r1
+	fmov.s	fr11,@-r1
+	fmov.s	fr8,@-r1
+	fmov.s	fr9,@-r1
+	fmov.s	fr6,@-r1
+	fmov.s	fr7,@-r1
+	fmov.s	fr4,@-r1
+	fmov.s	fr5,@-r1
+#else
+	fmov.s	fr11,@-r1
+	fmov.s	fr10,@-r1
+	fmov.s	fr9,@-r1
+	fmov.s	fr8,@-r1
+	fmov.s	fr7,@-r1
+	fmov.s	fr6,@-r1
+	fmov.s	fr5,@-r1
+	fmov.s	fr4,@-r1
+#endif
+	mov	r1,r7
+	mov	r14,r6
+	add	#56,r6
+#else
+	mov	r14,r6
+	add	#24,r6
+#endif
+
+	bt/s	10f
+	 mov	r2, r5
+	mov	r14,r1
+	add	#8,r1
+	mov	r1,r5
+10:
+
+	mov	r14,r1
+#if defined(__SH4__)
+	add	#72,r1
+#else
+	add	#40,r1
+#endif
+	mov.l	r1,@r14
+
+#ifdef PIC
+	mov.l	L_got,r1
+	mova	L_got,r0
+	add	r0,r1
+	mov.l	L_helper,r0
+	add	r1,r0
+#else
+	mov.l	L_helper,r0
+#endif
+	jsr	@r0
+	 mov	r3,r4
+
+	shll	r0
+	mov	r0,r1
+	mova	L_table,r0
+	add	r1,r0
+	mov.w	@r0,r0
+	mov	r14,r2
+	braf	r0
+	 add	#8,r2
+0:
+	.align 2
+#ifdef PIC
+L_got:
+	.long	_GLOBAL_OFFSET_TABLE_
+L_helper:
+	.long	ffi_closure_helper_SYSV@GOTOFF
+#else
+L_helper:
+	.long	ffi_closure_helper_SYSV
+#endif
+L_table:
+	.short L_case_v - 0b	/* FFI_TYPE_VOID */
+	.short L_case_i - 0b	/* FFI_TYPE_INT */
+#if defined(__SH4__)
+	.short L_case_f - 0b	/* FFI_TYPE_FLOAT */
+	.short L_case_d - 0b	/* FFI_TYPE_DOUBLE */
+	.short L_case_d - 0b	/* FFI_TYPE_LONGDOUBLE */
+#else
+	.short L_case_i - 0b	/* FFI_TYPE_FLOAT */
+	.short L_case_ll - 0b	/* FFI_TYPE_DOUBLE */
+	.short L_case_ll - 0b	/* FFI_TYPE_LONGDOUBLE */
+#endif
+	.short L_case_uq - 0b	/* FFI_TYPE_UINT8 */
+	.short L_case_q - 0b	/* FFI_TYPE_SINT8 */
+	.short L_case_uh - 0b	/* FFI_TYPE_UINT16 */
+	.short L_case_h - 0b	/* FFI_TYPE_SINT16 */
+	.short L_case_i - 0b	/* FFI_TYPE_UINT32 */
+	.short L_case_i - 0b	/* FFI_TYPE_SINT32 */
+	.short L_case_ll - 0b	/* FFI_TYPE_UINT64 */
+	.short L_case_ll - 0b	/* FFI_TYPE_SINT64 */
+	.short L_case_v - 0b	/* FFI_TYPE_STRUCT */
+	.short L_case_i - 0b	/* FFI_TYPE_POINTER */
+
+#if defined(__SH4__)
+L_case_d:
+#ifdef __LITTLE_ENDIAN__
+	fmov.s	@r2+,fr1
+	bra	L_case_v
+	 fmov.s	@r2,fr0
+#else
+	fmov.s	@r2+,fr0
+	bra	L_case_v
+	 fmov.s	@r2,fr1
+#endif
+
+L_case_f:
+	bra	L_case_v
+	 fmov.s	@r2,fr0
+#endif
+	
+L_case_ll:
+	mov.l	@r2+,r0
+	bra	L_case_v
+	 mov.l	@r2,r1
+	
+L_case_i:
+	bra	L_case_v
+	 mov.l	@r2,r0
+	
+L_case_q:
+#ifdef __LITTLE_ENDIAN__
+#else
+	add	#3,r2
+#endif
+	bra	L_case_v
+	 mov.b	@r2,r0
+
+L_case_uq:
+#ifdef __LITTLE_ENDIAN__
+#else
+	add	#3,r2
+#endif
+	mov.b	@r2,r0
+	bra	L_case_v
+	 extu.b r0,r0
+
+L_case_h:
+#ifdef __LITTLE_ENDIAN__
+#else
+	add	#2,r2
+#endif
+	bra	L_case_v
+	 mov.w	@r2,r0
+
+L_case_uh:
+#ifdef __LITTLE_ENDIAN__
+#else
+	add	#2,r2
+#endif
+	mov.w	@r2,r0
+	extu.w	r0,r0
+	/* fall through */
+
+L_case_v:
+#if defined(__SH4__)
+	add	#48,r15
+#else
+	add	#16,r15
+#endif
+	lds.l	@r15+,pr
+	mov.l	@r15+,r14
+	rts
+	 add	#16,r15
+.LFE2:
+.ffi_closure_SYSV_end:
+        .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
+
+	.section	".eh_frame","aw",@progbits
+__FRAME_BEGIN__:
+	.4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
+.LSCIE1:
+	.4byte	0x0	/* CIE Identifier Tag */
+	.byte	0x1	/* CIE Version */
+#ifdef PIC
+	.ascii "zR\0"	/* CIE Augmentation */
+#else
+	.byte	0x0	/* CIE Augmentation */
+#endif
+	.byte	0x1	/* uleb128 0x1; CIE Code Alignment Factor */
+	.byte	0x7c	/* sleb128 -4; CIE Data Alignment Factor */
+	.byte	0x11	/* CIE RA Column */
+#ifdef PIC
+	.uleb128 0x1	/* Augmentation size */
+	.byte	0x10	/* FDE Encoding (pcrel) */
+#endif
+	.byte	0xc	/* DW_CFA_def_cfa */
+	.byte	0xf	/* uleb128 0xf */
+	.byte	0x0	/* uleb128 0x0 */
+	.align	2
+.LECIE1:
+.LSFDE1:
+	.4byte	.LEFDE1-.LASFDE1	/* FDE Length */
+.LASFDE1:
+	.4byte	.LASFDE1-__FRAME_BEGIN__	/* FDE CIE offset */
+#ifdef PIC
+	.4byte	.LFB1-.	/* FDE initial location */
+#else
+	.4byte	.LFB1	/* FDE initial location */
+#endif
+	.4byte	.LFE1-.LFB1	 /* FDE address range */
+#ifdef PIC
+	.uleb128 0x0	/* Augmentation size */
+#endif
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFI0-.LFB1
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x4	/* uleb128 0x4 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFI1-.LCFI0
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x8	/* uleb128 0x4 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFI2-.LCFI1
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0xc	/* uleb128 0x4 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFI3-.LCFI2
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x10	/* uleb128 0x4 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFI4-.LCFI3
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x14	/* uleb128 0x4 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFI5-.LCFI4
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x18	/* uleb128 0x4 */
+	.byte	0x91	/* DW_CFA_offset, column 0x11 */
+	.byte	0x6	/* uleb128 0x6 */
+	.byte	0x8e	/* DW_CFA_offset, column 0xe */
+	.byte	0x5	/* uleb128 0x5 */
+	.byte	0x8c	/* DW_CFA_offset, column 0xc */
+	.byte	0x4	/* uleb128 0x4 */
+	.byte	0x8a	/* DW_CFA_offset, column 0xa */
+	.byte	0x3	/* uleb128 0x3 */
+	.byte	0x89	/* DW_CFA_offset, column 0x9 */
+	.byte	0x2	/* uleb128 0x2 */
+	.byte	0x88	/* DW_CFA_offset, column 0x8 */
+	.byte	0x1	/* uleb128 0x1 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFI6-.LCFI5
+	.byte	0xd	/* DW_CFA_def_cfa_register */
+	.byte	0xe	/* uleb128 0xe */
+	.align	2
+.LEFDE1:
+
+.LSFDE3:
+	.4byte	.LEFDE3-.LASFDE3	/* FDE Length */
+.LASFDE3:
+	.4byte	.LASFDE3-__FRAME_BEGIN__	/* FDE CIE offset */
+#ifdef PIC
+	.4byte	.LFB2-.	/* FDE initial location */
+#else
+	.4byte	.LFB2	/* FDE initial location */
+#endif
+	.4byte	.LFE2-.LFB2	 /* FDE address range */
+#ifdef PIC
+	.uleb128 0x0	/* Augmentation size */
+#endif
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFI7-.LFB2
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x4	/* uleb128 0x4 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFI8-.LCFI7
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x8	/* uleb128 0x4 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFI9-.LCFI8
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0xc	/* uleb128 0x4 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFIA-.LCFI9
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x10	/* uleb128 0x4 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFIB-.LCFIA
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x14	/* uleb128 0x4 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFIC-.LCFIB
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x18	/* uleb128 0x4 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFID-.LCFIC
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+#if defined(__SH4__)
+	.byte	24+48	/* uleb128 24+48 */
+#else
+	.byte	24+16	/* uleb128 24+16 */
+#endif
+	.byte	0x91	/* DW_CFA_offset, column 0x11 */
+	.byte	0x6	/* uleb128 0x6 */
+	.byte	0x8e	/* DW_CFA_offset, column 0xe */
+	.byte	0x5	/* uleb128 0x5 */
+	.byte	0x84	/* DW_CFA_offset, column 0x4 */
+	.byte	0x4	/* uleb128 0x4 */
+	.byte	0x85	/* DW_CFA_offset, column 0x5 */
+	.byte	0x3	/* uleb128 0x3 */
+	.byte	0x86	/* DW_CFA_offset, column 0x6 */
+	.byte	0x2	/* uleb128 0x2 */
+	.byte	0x87	/* DW_CFA_offset, column 0x7 */
+	.byte	0x1	/* uleb128 0x1 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	.LCFIE-.LCFID
+	.byte	0xd	/* DW_CFA_def_cfa_register */
+	.byte	0xe	/* uleb128 0xe */
+	.align	2
+.LEFDE3:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffi.c
new file mode 100644
index 0000000..8fbc05c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffi.c
@@ -0,0 +1,468 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 2003, 2004, 2006, 2007 Kaz Kojima
+           Copyright (c) 2008 Anthony Green
+   
+   SuperH SHmedia Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+
+#define NGREGARG 8
+#define NFREGARG 12
+
+static int
+return_type (ffi_type *arg)
+{
+
+  if (arg->type != FFI_TYPE_STRUCT)
+    return arg->type;
+
+  /* gcc uses r2 if the result can be packed in on register.  */
+  if (arg->size <= sizeof (UINT8))
+    return FFI_TYPE_UINT8;
+  else if (arg->size <= sizeof (UINT16))
+    return FFI_TYPE_UINT16;
+  else if (arg->size <= sizeof (UINT32))
+    return FFI_TYPE_UINT32;
+  else if (arg->size <= sizeof (UINT64))
+    return FFI_TYPE_UINT64;
+
+  return FFI_TYPE_STRUCT;
+}
+
+/* ffi_prep_args is called by the assembly routine once stack space
+   has been allocated for the function's arguments */
+
+void ffi_prep_args(char *stack, extended_cif *ecif)
+{
+  register unsigned int i;
+  register unsigned int avn;
+  register void **p_argv;
+  register char *argp;
+  register ffi_type **p_arg;
+
+  argp = stack;
+
+  if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT)
+    {
+      *(void **) argp = ecif->rvalue;
+      argp += sizeof (UINT64);
+    }
+
+  avn = ecif->cif->nargs;
+  p_argv = ecif->avalue;
+
+  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
+    {
+      size_t z;
+      int align;
+
+      z = (*p_arg)->size;
+      align = (*p_arg)->alignment;
+      if (z < sizeof (UINT32))
+	{
+	  switch ((*p_arg)->type)
+	    {
+	    case FFI_TYPE_SINT8:
+	      *(SINT64 *) argp = (SINT64) *(SINT8 *)(*p_argv);
+	      break;
+  
+	    case FFI_TYPE_UINT8:
+	      *(UINT64 *) argp = (UINT64) *(UINT8 *)(*p_argv);
+	      break;
+  
+	    case FFI_TYPE_SINT16:
+	      *(SINT64 *) argp = (SINT64) *(SINT16 *)(*p_argv);
+	      break;
+  
+	    case FFI_TYPE_UINT16:
+	      *(UINT64 *) argp = (UINT64) *(UINT16 *)(*p_argv);
+	      break;
+  
+	    case FFI_TYPE_STRUCT:
+	      memcpy (argp, *p_argv, z);
+	      break;
+
+	    default:
+	      FFI_ASSERT(0);
+	    }
+	  argp += sizeof (UINT64);
+	}
+      else if (z == sizeof (UINT32) && align == sizeof (UINT32))
+	{
+	  switch ((*p_arg)->type)
+	    {
+	    case FFI_TYPE_INT:
+	    case FFI_TYPE_SINT32:
+	      *(SINT64 *) argp = (SINT64) *(SINT32 *) (*p_argv);
+	      break;
+
+	    case FFI_TYPE_FLOAT:
+	    case FFI_TYPE_POINTER:
+	    case FFI_TYPE_UINT32:
+	    case FFI_TYPE_STRUCT:
+	      *(UINT64 *) argp = (UINT64) *(UINT32 *) (*p_argv);
+	      break;
+
+	    default:
+	      FFI_ASSERT(0);
+	      break;
+	    }
+	  argp += sizeof (UINT64);
+	}
+      else if (z == sizeof (UINT64)
+	       && align == sizeof (UINT64)
+	       && ((int) *p_argv & (sizeof (UINT64) - 1)) == 0)
+	{
+	  *(UINT64 *) argp = *(UINT64 *) (*p_argv);
+	  argp += sizeof (UINT64);
+	}
+      else
+	{
+	  int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64);
+
+	  memcpy (argp, *p_argv, z);
+	  argp += n * sizeof (UINT64);
+	}
+    }
+
+  return;
+}
+
+/* Perform machine dependent cif processing */
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  int i, j;
+  int size, type;
+  int n, m;
+  int greg;
+  int freg;
+  int fpair = -1;
+
+  greg = (return_type (cif->rtype) == FFI_TYPE_STRUCT ? 1 : 0);
+  freg = 0;
+  cif->flags2 = 0;
+
+  for (i = j = 0; i < cif->nargs; i++)
+    {
+      type = (cif->arg_types)[i]->type;
+      switch (type)
+	{
+	case FFI_TYPE_FLOAT:
+	  greg++;
+	  cif->bytes += sizeof (UINT64) - sizeof (float);
+	  if (freg >= NFREGARG - 1)
+	    continue;
+	  if (fpair < 0)
+	    {
+	      fpair = freg;
+	      freg += 2;
+	    }
+	  else
+	    fpair = -1;
+	  cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++);
+	  break;
+
+	case FFI_TYPE_DOUBLE:
+	  if (greg++ >= NGREGARG && (freg + 1) >= NFREGARG)
+	    continue;
+	  if ((freg + 1) < NFREGARG)
+	    {
+	      freg += 2;
+	      cif->flags2 += ((cif->arg_types)[i]->type) << (2 * j++);
+	    }
+	  else
+	    cif->flags2 += FFI_TYPE_INT << (2 * j++);
+	  break;
+	      
+	default:
+	  size = (cif->arg_types)[i]->size;
+	  if (size < sizeof (UINT64))
+	    cif->bytes += sizeof (UINT64) - size;
+	  n = (size + sizeof (UINT64) - 1) / sizeof (UINT64);
+	  if (greg >= NGREGARG)
+	    continue;
+	  else if (greg + n - 1 >= NGREGARG)
+	    greg = NGREGARG;
+	  else
+	    greg += n;
+	  for (m = 0; m < n; m++)
+	    cif->flags2 += FFI_TYPE_INT << (2 * j++);
+	  break;
+	}
+    }
+
+  /* Set the return type flag */
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_STRUCT:
+      cif->flags = return_type (cif->rtype);
+      break;
+
+    case FFI_TYPE_VOID:
+    case FFI_TYPE_FLOAT:
+    case FFI_TYPE_DOUBLE:
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_UINT64:
+      cif->flags = cif->rtype->type;
+      break;
+
+    default:
+      cif->flags = FFI_TYPE_INT;
+      break;
+    }
+
+  return FFI_OK;
+}
+
+/*@-declundef@*/
+/*@-exportheader@*/
+extern void ffi_call_SYSV(void (*)(char *, extended_cif *), 
+			  /*@out@*/ extended_cif *, 
+			  unsigned, unsigned, long long,
+			  /*@out@*/ unsigned *, 
+			  void (*fn)(void));
+/*@=declundef@*/
+/*@=exportheader@*/
+
+void ffi_call(/*@dependent@*/ ffi_cif *cif, 
+	      void (*fn)(void), 
+	      /*@out@*/ void *rvalue, 
+	      /*@dependent@*/ void **avalue)
+{
+  extended_cif ecif;
+  UINT64 trvalue;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+  
+  /* If the return value is a struct and we don't have a return	*/
+  /* value address then we need to make one		        */
+
+  if (cif->rtype->type == FFI_TYPE_STRUCT
+      && return_type (cif->rtype) != FFI_TYPE_STRUCT)
+    ecif.rvalue = &trvalue;
+  else if ((rvalue == NULL) && 
+      (cif->rtype->type == FFI_TYPE_STRUCT))
+    {
+      ecif.rvalue = alloca(cif->rtype->size);
+    }
+  else
+    ecif.rvalue = rvalue;
+
+  switch (cif->abi) 
+    {
+    case FFI_SYSV:
+      ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, cif->flags2,
+		    ecif.rvalue, fn);
+      break;
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+
+  if (rvalue
+      && cif->rtype->type == FFI_TYPE_STRUCT
+      && return_type (cif->rtype) != FFI_TYPE_STRUCT)
+    memcpy (rvalue, &trvalue, cif->rtype->size);
+}
+
+extern void ffi_closure_SYSV (void);
+extern void __ic_invalidate (void *line);
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure *closure,
+		      ffi_cif *cif,
+		      void (*fun)(ffi_cif*, void*, void**, void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  unsigned int *tramp;
+
+  FFI_ASSERT (cif->abi == FFI_GCC_SYSV);
+
+  tramp = (unsigned int *) &closure->tramp[0];
+  /* Since ffi_closure is an aligned object, the ffi trampoline is
+     called as an SHcompact code.  Sigh.
+     SHcompact part:
+     mova @(1,pc),r0; add #1,r0; jmp @r0; nop;
+     SHmedia part:
+     movi fnaddr >> 16,r1; shori fnaddr,r1; ptabs/l r1,tr0
+     movi cxt >> 16,r1; shori cxt,r1; blink tr0,r63  */
+#ifdef __LITTLE_ENDIAN__
+  tramp[0] = 0x7001c701;
+  tramp[1] = 0x0009402b;
+#else
+  tramp[0] = 0xc7017001;
+  tramp[1] = 0x402b0009;
+#endif
+  tramp[2] = 0xcc000010 | (((UINT32) ffi_closure_SYSV) >> 16) << 10;
+  tramp[3] = 0xc8000010 | (((UINT32) ffi_closure_SYSV) & 0xffff) << 10;
+  tramp[4] = 0x6bf10600;
+  tramp[5] = 0xcc000010 | (((UINT32) codeloc) >> 16) << 10;
+  tramp[6] = 0xc8000010 | (((UINT32) codeloc) & 0xffff) << 10;
+  tramp[7] = 0x4401fff0;
+
+  closure->cif = cif;
+  closure->fun = fun;
+  closure->user_data = user_data;
+
+  /* Flush the icache.  */
+  asm volatile ("ocbwb %0,0; synco; icbi %1,0; synci" : : "r" (tramp),
+		"r"(codeloc));
+
+  return FFI_OK;
+}
+
+/* Basically the trampoline invokes ffi_closure_SYSV, and on 
+ * entry, r3 holds the address of the closure.
+ * After storing the registers that could possibly contain
+ * parameters to be passed into the stack frame and setting
+ * up space for a return value, ffi_closure_SYSV invokes the 
+ * following helper function to do most of the work.
+ */
+
+int
+ffi_closure_helper_SYSV (ffi_closure *closure, UINT64 *rvalue, 
+			 UINT64 *pgr, UINT64 *pfr, UINT64 *pst)
+{
+  void **avalue;
+  ffi_type **p_arg;
+  int i, avn;
+  int greg, freg;
+  ffi_cif *cif;
+  int fpair = -1;
+
+  cif = closure->cif;
+  avalue = alloca (cif->nargs * sizeof (void *));
+
+  /* Copy the caller's structure return value address so that the closure
+     returns the data directly to the caller.  */
+  if (return_type (cif->rtype) == FFI_TYPE_STRUCT)
+    {
+      rvalue = (UINT64 *) *pgr;
+      greg = 1;
+    }
+  else
+    greg = 0;
+
+  freg = 0;
+  cif = closure->cif;
+  avn = cif->nargs;
+
+  /* Grab the addresses of the arguments from the stack frame.  */
+  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
+    {
+      size_t z;
+      void *p;
+
+      z = (*p_arg)->size;
+      if (z < sizeof (UINT32))
+	{
+	  p = pgr + greg++;
+
+	  switch ((*p_arg)->type)
+	    {
+	    case FFI_TYPE_SINT8:
+	    case FFI_TYPE_UINT8:
+	    case FFI_TYPE_SINT16:
+	    case FFI_TYPE_UINT16:
+	    case FFI_TYPE_STRUCT:
+#ifdef __LITTLE_ENDIAN__
+	      avalue[i] = p;
+#else
+	      avalue[i] = ((char *) p) + sizeof (UINT32) - z;
+#endif
+	      break;
+
+	    default:
+	      FFI_ASSERT(0);
+	    }
+	}
+      else if (z == sizeof (UINT32))
+	{
+	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
+	    {
+	      if (freg < NFREGARG - 1)
+		{
+		  if (fpair >= 0)
+		    {
+		      avalue[i] = (UINT32 *) pfr + fpair;
+		      fpair = -1;
+		    }
+		  else
+		    {
+#ifdef __LITTLE_ENDIAN__
+		      fpair = freg;
+		      avalue[i] = (UINT32 *) pfr + (1 ^ freg);
+#else
+		      fpair = 1 ^ freg;
+		      avalue[i] = (UINT32 *) pfr + freg;
+#endif
+		      freg += 2;
+		    }
+		}
+	      else
+#ifdef __LITTLE_ENDIAN__
+		avalue[i] = pgr + greg;
+#else
+		avalue[i] = (UINT32 *) (pgr + greg) + 1;
+#endif
+	    }
+	  else
+#ifdef __LITTLE_ENDIAN__
+	    avalue[i] = pgr + greg;
+#else
+	    avalue[i] = (UINT32 *) (pgr + greg) + 1;
+#endif
+	  greg++;
+	}
+      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
+	{
+	  if (freg + 1 >= NFREGARG)
+	    avalue[i] = pgr + greg;
+	  else
+	    {
+	      avalue[i] = pfr + (freg >> 1);
+	      freg += 2;
+	    }
+	  greg++;
+	}
+      else
+	{
+	  int n = (z + sizeof (UINT64) - 1) / sizeof (UINT64);
+
+	  avalue[i] = pgr + greg;
+	  greg += n;
+	}
+    }
+
+  (closure->fun) (cif, rvalue, avalue, closure->user_data);
+
+  /* Tell ffi_closure_SYSV how to perform return type promotions.  */
+  return return_type (cif->rtype);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffitarget.h
new file mode 100644
index 0000000..d935b89
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/ffitarget.h
@@ -0,0 +1,53 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Target configuration macros for SuperH - SHmedia.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+/* ---- Generic type definitions ----------------------------------------- */
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_SYSV,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_SYSV
+} ffi_abi;
+
+#define FFI_EXTRA_CIF_FIELDS long long flags2
+#endif
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 32
+#define FFI_NATIVE_RAW_API 0
+
+#endif
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/sysv.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/sysv.S
new file mode 100644
index 0000000..c4587d5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sh64/sysv.S
@@ -0,0 +1,539 @@
+/* -----------------------------------------------------------------------
+   sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima
+   
+   SuperH SHmedia Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+#ifdef HAVE_MACHINE_ASM_H
+#include <machine/asm.h>
+#else
+/* XXX these lose for some platforms, I'm sure. */
+#define CNAME(x) x
+#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
+#endif
+
+#ifdef __LITTLE_ENDIAN__
+#define OFS_FLT	0
+#else
+#define OFS_FLT	4
+#endif
+
+	.section	.text..SHmedia32,"ax"
+
+	# r2:	ffi_prep_args
+	# r3:	&ecif
+	# r4:	bytes
+	# r5:	flags
+	# r6:	flags2
+	# r7:	rvalue
+	# r8:	fn
+
+	# This assumes we are using gas.
+	.align	5
+ENTRY(ffi_call_SYSV)
+	# Save registers
+.LFB1:
+	addi.l	r15, -48, r15
+.LCFI0:
+	st.q	r15, 40, r32
+	st.q	r15, 32, r31
+	st.q	r15, 24, r30
+	st.q	r15, 16, r29
+	st.q	r15, 8, r28
+	st.l	r15, 4, r18
+	st.l	r15, 0, r14
+.LCFI1:
+	add.l	r15, r63, r14
+.LCFI2:
+#	add	r4, r63, r28
+	add	r5, r63, r29
+	add	r6, r63, r30
+	add	r7, r63, r31
+	add	r8, r63, r32
+
+	addi	r4, (64 + 7), r4
+	andi	r4, ~7, r4
+	sub.l	r15, r4, r15
+
+	ptabs/l	r2, tr0
+	add	r15, r63, r2
+	blink	tr0, r18
+
+	addi	r15, 64, r22
+	movi	0, r0
+	movi	0, r1
+	movi	-1, r23
+
+	pt/l	1f, tr1
+	bnei/l	r29, FFI_TYPE_STRUCT, tr1
+	ld.l	r15, 0, r19
+	addi	r15, 8, r15
+	addi	r0, 1, r0
+1:
+
+.L_pass:
+	andi	r30, 3, r20
+	shlri	r30, 2, r30
+
+	pt/l	.L_call_it, tr0
+	pt/l	.L_pass_i, tr1
+	pt/l	.L_pass_f, tr2
+
+	beqi/l	r20, FFI_TYPE_VOID, tr0
+	beqi/l	r20, FFI_TYPE_INT, tr1
+	beqi/l	r20, FFI_TYPE_FLOAT, tr2
+
+.L_pass_d:
+	addi	r0, 1, r0
+	pt/l	3f, tr0
+	movi	12, r20
+	bge/l	r1, r20, tr0
+
+	pt/l	.L_pop_d, tr1
+	pt/l	2f, tr0
+	blink	tr1, r63
+2:
+	addi.l	r15, 8, r15
+3:
+	pt/l	.L_pass, tr0
+	addi	r1, 2, r1
+	blink	tr0, r63
+
+.L_pop_d:
+	pt/l	.L_pop_d_tbl, tr1
+	gettr	tr1, r20
+	shlli	r1, 2, r21
+	add	r20, r21, r20
+	ptabs/l	r20, tr1
+	blink	tr1, r63
+
+.L_pop_d_tbl:
+	fld.d	r15, 0, dr0
+	blink	tr0, r63
+	fld.d	r15, 0, dr2
+	blink	tr0, r63
+	fld.d	r15, 0, dr4
+	blink	tr0, r63
+	fld.d	r15, 0, dr6
+	blink	tr0, r63
+	fld.d	r15, 0, dr8
+	blink	tr0, r63
+	fld.d	r15, 0, dr10
+	blink	tr0, r63
+
+.L_pass_f:
+	addi	r0, 1, r0
+	pt/l	3f, tr0
+	movi	12, r20
+	bge/l	r1, r20, tr0
+
+	pt/l	.L_pop_f, tr1
+	pt/l	2f, tr0
+	blink	tr1, r63
+2:
+	addi.l	r15, 8, r15
+3:
+	pt/l	.L_pass, tr0
+	blink	tr0, r63
+
+.L_pop_f:
+	pt/l	.L_pop_f_tbl, tr1
+	pt/l	5f, tr2
+	gettr	tr1, r20
+	bge/l	r23, r63, tr2
+	add	r1, r63, r23 
+	shlli	r1, 3, r21
+	addi	r1, 2, r1
+	add	r20, r21, r20
+	ptabs/l	r20, tr1
+	blink	tr1, r63
+5:
+	addi	r23, 1, r21
+	movi	-1, r23
+	shlli	r21, 3, r21
+	add	r20, r21, r20
+	ptabs/l	r20, tr1
+	blink	tr1, r63
+
+.L_pop_f_tbl:
+	fld.s	r15, OFS_FLT, fr0
+	blink	tr0, r63
+	fld.s	r15, OFS_FLT, fr1
+	blink	tr0, r63
+	fld.s	r15, OFS_FLT, fr2
+	blink	tr0, r63
+	fld.s	r15, OFS_FLT, fr3
+	blink	tr0, r63
+	fld.s	r15, OFS_FLT, fr4
+	blink	tr0, r63
+	fld.s	r15, OFS_FLT, fr5
+	blink	tr0, r63
+	fld.s	r15, OFS_FLT, fr6
+	blink	tr0, r63
+	fld.s	r15, OFS_FLT, fr7
+	blink	tr0, r63
+	fld.s	r15, OFS_FLT, fr8
+	blink	tr0, r63
+	fld.s	r15, OFS_FLT, fr9
+	blink	tr0, r63
+	fld.s	r15, OFS_FLT, fr10
+	blink	tr0, r63
+	fld.s	r15, OFS_FLT, fr11
+	blink	tr0, r63
+
+.L_pass_i:
+	pt/l	3f, tr0
+	movi	8, r20
+	bge/l	r0, r20, tr0
+
+	pt/l	.L_pop_i, tr1
+	pt/l	2f, tr0
+	blink	tr1, r63
+2:
+	addi.l	r15, 8, r15
+3:
+	pt/l	.L_pass, tr0
+	addi	r0, 1, r0
+	blink	tr0, r63
+
+.L_pop_i:
+	pt/l	.L_pop_i_tbl, tr1
+	gettr	tr1, r20
+	shlli	r0, 3, r21
+	add	r20, r21, r20
+	ptabs/l	r20, tr1
+	blink	tr1, r63
+
+.L_pop_i_tbl:
+	ld.q	r15, 0, r2
+	blink	tr0, r63
+	ld.q	r15, 0, r3
+	blink	tr0, r63
+	ld.q	r15, 0, r4
+	blink	tr0, r63
+	ld.q	r15, 0, r5
+	blink	tr0, r63
+	ld.q	r15, 0, r6
+	blink	tr0, r63
+	ld.q	r15, 0, r7
+	blink	tr0, r63
+	ld.q	r15, 0, r8
+	blink	tr0, r63
+	ld.q	r15, 0, r9
+	blink	tr0, r63
+
+.L_call_it:
+	# call function
+	pt/l	1f, tr1
+	bnei/l	r29, FFI_TYPE_STRUCT, tr1
+	add	r19, r63, r2
+1:
+	add	r22, r63, r15
+	ptabs/l	r32, tr0
+	blink	tr0, r18
+
+	pt/l	.L_ret_i, tr0
+	pt/l	.L_ret_ll, tr1
+	pt/l	.L_ret_d, tr2
+	pt/l	.L_ret_f, tr3
+	pt/l	.L_epilogue, tr4
+
+	beqi/l	r29, FFI_TYPE_INT, tr0
+	beqi/l	r29, FFI_TYPE_UINT32, tr0
+	beqi/l	r29, FFI_TYPE_SINT64, tr1
+	beqi/l	r29, FFI_TYPE_UINT64, tr1
+	beqi/l	r29, FFI_TYPE_DOUBLE, tr2
+	beqi/l	r29, FFI_TYPE_FLOAT, tr3
+
+	pt/l	.L_ret_q, tr0
+	pt/l	.L_ret_h, tr1
+
+	beqi/l	r29, FFI_TYPE_UINT8, tr0
+	beqi/l	r29, FFI_TYPE_UINT16, tr1
+	blink	tr4, r63
+
+.L_ret_d:
+	fst.d	r31, 0, dr0
+	blink	tr4, r63
+
+.L_ret_ll:
+	st.q	r31, 0, r2
+	blink	tr4, r63
+
+.L_ret_f:
+	fst.s	r31, OFS_FLT, fr0
+	blink	tr4, r63
+
+.L_ret_q:
+	st.b	r31, 0, r2
+	blink	tr4, r63
+
+.L_ret_h:
+	st.w	r31, 0, r2
+	blink	tr4, r63
+
+.L_ret_i:
+	st.l	r31, 0, r2
+	# Fall
+
+.L_epilogue:
+	# Remove the space we pushed for the args
+	add	r14, r63, r15
+
+	ld.l	r15, 0, r14
+	ld.l	r15, 4, r18
+	ld.q	r15, 8, r28
+	ld.q	r15, 16, r29
+	ld.q	r15, 24, r30
+	ld.q	r15, 32, r31
+	ld.q	r15, 40, r32
+	addi.l	r15, 48, r15
+	ptabs	r18, tr0
+	blink	tr0, r63
+
+.LFE1:
+.ffi_call_SYSV_end:
+	.size	 CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
+
+	.align	5
+ENTRY(ffi_closure_SYSV)
+.LFB2:
+	addi.l	r15, -136, r15
+.LCFI3:
+	st.l	r15, 12, r18
+	st.l	r15, 8, r14
+	st.l	r15, 4, r12
+.LCFI4:
+	add	r15, r63, r14
+.LCFI5:
+	/* Stack layout:	
+	   ...
+	   64 bytes (register parameters)
+	   48 bytes (floating register parameters)
+	    8 bytes (result)
+	    4 bytes (r18)
+	    4 bytes (r14)
+	    4 bytes (r12)
+	    4 bytes (for align)
+	   <- new stack pointer
+	*/
+	fst.d	r14, 24, dr0
+	fst.d	r14, 32, dr2
+	fst.d	r14, 40, dr4
+	fst.d	r14, 48, dr6
+	fst.d	r14, 56, dr8
+	fst.d	r14, 64, dr10
+	st.q	r14, 72, r2
+	st.q	r14, 80, r3
+	st.q	r14, 88, r4
+	st.q	r14, 96, r5
+	st.q	r14, 104, r6
+	st.q	r14, 112, r7
+	st.q	r14, 120, r8
+	st.q	r14, 128, r9
+
+	add	r1, r63, r2
+	addi	r14, 16, r3
+	addi	r14, 72, r4
+	addi	r14, 24, r5
+	addi	r14, 136, r6
+#ifdef PIC
+	movi	(((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12
+        shori	((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12
+.LPCS0:	ptrel/u r12, tr0
+	movi	((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1
+	gettr	tr0, r12
+	ldx.l	r1, r12, r1
+	ptabs	r1, tr0
+#else
+	pt/l	ffi_closure_helper_SYSV, tr0
+#endif
+	blink	tr0, r18
+
+	shlli	r2, 1, r1
+        movi    (((datalabel .L_table) >> 16) & 65535), r2
+        shori   ((datalabel .L_table) & 65535), r2
+        ldx.w   r2, r1, r1
+        add     r1, r2, r1
+	pt/l	.L_case_v, tr1
+        ptabs   r1, tr0
+        blink   tr0, r63
+
+        .align 2
+.L_table:
+	.word	.L_case_v - datalabel .L_table	/* FFI_TYPE_VOID */
+	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_INT */
+	.word	.L_case_f - datalabel .L_table	/* FFI_TYPE_FLOAT */
+	.word	.L_case_d - datalabel .L_table	/* FFI_TYPE_DOUBLE */
+	.word	.L_case_d - datalabel .L_table	/* FFI_TYPE_LONGDOUBLE */
+	.word	.L_case_uq - datalabel .L_table	/* FFI_TYPE_UINT8 */
+	.word	.L_case_q - datalabel .L_table	/* FFI_TYPE_SINT8 */
+	.word	.L_case_uh - datalabel .L_table	/* FFI_TYPE_UINT16 */
+	.word	.L_case_h - datalabel .L_table	/* FFI_TYPE_SINT16 */
+	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_UINT32 */
+	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_SINT32 */
+	.word	.L_case_ll - datalabel .L_table	/* FFI_TYPE_UINT64 */
+	.word	.L_case_ll - datalabel .L_table	/* FFI_TYPE_SINT64 */
+	.word	.L_case_v - datalabel .L_table	/* FFI_TYPE_STRUCT */
+	.word	.L_case_i - datalabel .L_table	/* FFI_TYPE_POINTER */
+
+        .align 2
+.L_case_d:
+	fld.d	r14, 16, dr0
+	blink	tr1, r63
+.L_case_f:
+	fld.s	r14, 16, fr0
+	blink	tr1, r63
+.L_case_ll:
+	ld.q	r14, 16, r2
+	blink	tr1, r63
+.L_case_i:
+	ld.l	r14, 16, r2
+	blink	tr1, r63
+.L_case_q:
+	ld.b	r14, 16, r2
+	blink	tr1, r63
+.L_case_uq:
+	ld.ub	r14, 16, r2
+	blink	tr1, r63
+.L_case_h:
+	ld.w	r14, 16, r2
+	blink	tr1, r63
+.L_case_uh:
+	ld.uw	r14, 16, r2
+	blink	tr1, r63
+.L_case_v:
+	add.l	r14, r63, r15
+	ld.l	r15, 4, r12
+	ld.l	r15, 8, r14
+	ld.l	r15, 12, r18
+	addi.l	r15, 136, r15
+	ptabs	r18, tr0
+	blink	tr0, r63
+
+.LFE2:
+.ffi_closure_SYSV_end:
+	.size	 CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
+
+	.section	".eh_frame","aw",@progbits
+__FRAME_BEGIN__:
+	.4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
+.LSCIE1:
+	.4byte	0x0	/* CIE Identifier Tag */
+	.byte	0x1	/* CIE Version */
+#ifdef PIC
+	.ascii "zR\0"	/* CIE Augmentation */
+#else
+	.byte	0x0	/* CIE Augmentation */
+#endif
+	.uleb128 0x1	/* CIE Code Alignment Factor */
+	.sleb128 -4	/* CIE Data Alignment Factor */
+	.byte	0x12	/* CIE RA Column */
+#ifdef PIC
+	.uleb128 0x1	/* Augmentation size */
+	.byte	0x10	/* FDE Encoding (pcrel) */
+#endif
+	.byte	0xc	/* DW_CFA_def_cfa */
+	.uleb128 0xf
+	.uleb128 0x0
+	.align	2
+.LECIE1:
+.LSFDE1:
+	.4byte	datalabel .LEFDE1-datalabel .LASFDE1	/* FDE Length */
+.LASFDE1:
+	.4byte	datalabel .LASFDE1-datalabel __FRAME_BEGIN__
+#ifdef PIC
+	.4byte	.LFB1-.	/* FDE initial location */
+#else
+	.4byte	.LFB1	/* FDE initial location */
+#endif
+	.4byte	datalabel .LFE1-datalabel .LFB1	/* FDE address range */
+#ifdef PIC
+	.uleb128 0x0	/* Augmentation size */
+#endif
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	datalabel .LCFI0-datalabel .LFB1
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.uleb128 0x30
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	datalabel .LCFI1-datalabel .LCFI0
+	.byte   0x8e	/* DW_CFA_offset, column 0xe */
+	.uleb128 0xc
+	.byte   0x92	/* DW_CFA_offset, column 0x12 */
+	.uleb128 0xb
+	.byte   0x9c	/* DW_CFA_offset, column 0x1c */
+	.uleb128 0xa
+	.byte   0x9d	/* DW_CFA_offset, column 0x1d */
+	.uleb128 0x8
+	.byte   0x9e	/* DW_CFA_offset, column 0x1e */
+	.uleb128 0x6
+	.byte   0x9f	/* DW_CFA_offset, column 0x1f */
+	.uleb128 0x4
+	.byte   0xa0	/* DW_CFA_offset, column 0x20 */
+	.uleb128 0x2
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	datalabel .LCFI2-datalabel .LCFI1
+	.byte	0xd	/* DW_CFA_def_cfa_register */
+	.uleb128 0xe
+	.align	2
+.LEFDE1:
+
+.LSFDE3:
+	.4byte	datalabel .LEFDE3-datalabel .LASFDE3	/* FDE Length */
+.LASFDE3:
+	.4byte	datalabel .LASFDE3-datalabel __FRAME_BEGIN__
+#ifdef PIC
+	.4byte	.LFB2-.	/* FDE initial location */
+#else
+	.4byte	.LFB2	/* FDE initial location */
+#endif
+	.4byte	datalabel .LFE2-datalabel .LFB2	/* FDE address range */
+#ifdef PIC
+	.uleb128 0x0	/* Augmentation size */
+#endif
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	datalabel .LCFI3-datalabel .LFB2
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.uleb128 0x88
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	datalabel .LCFI4-datalabel .LCFI3
+	.byte   0x8c	/* DW_CFA_offset, column 0xc */
+	.uleb128 0x21
+	.byte   0x8e	/* DW_CFA_offset, column 0xe */
+	.uleb128 0x20
+	.byte   0x92	/* DW_CFA_offset, column 0x12 */
+	.uleb128 0x1f
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.4byte	datalabel .LCFI5-datalabel .LCFI4
+	.byte	0xd	/* DW_CFA_def_cfa_register */
+	.uleb128 0xe
+	.align	2
+.LEFDE3:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffi.c
new file mode 100644
index 0000000..1ac5d46
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffi.c
@@ -0,0 +1,669 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 2011 Anthony Green
+           Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc.
+   
+   SPARC Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+
+
+/* ffi_prep_args is called by the assembly routine once stack space
+   has been allocated for the function's arguments */
+
+void ffi_prep_args_v8(char *stack, extended_cif *ecif)
+{
+  int i;
+  void **p_argv;
+  char *argp;
+  ffi_type **p_arg;
+
+  /* Skip 16 words for the window save area */
+  argp = stack + 16*sizeof(int);
+
+  /* This should only really be done when we are returning a structure,
+     however, it's faster just to do it all the time...
+
+  if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) */
+  *(int *) argp = (long)ecif->rvalue;
+
+  /* And 1 word for the  structure return value. */
+  argp += sizeof(int);
+
+#ifdef USING_PURIFY
+  /* Purify will probably complain in our assembly routine, unless we
+     zero out this memory. */
+
+  ((int*)argp)[0] = 0;
+  ((int*)argp)[1] = 0;
+  ((int*)argp)[2] = 0;
+  ((int*)argp)[3] = 0;
+  ((int*)argp)[4] = 0;
+  ((int*)argp)[5] = 0;
+#endif
+
+  p_argv = ecif->avalue;
+
+  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++)
+    {
+      size_t z;
+
+	  if ((*p_arg)->type == FFI_TYPE_STRUCT
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	      || (*p_arg)->type == FFI_TYPE_LONGDOUBLE
+#endif
+	      )
+	    {
+	      *(unsigned int *) argp = (unsigned long)(* p_argv);
+	      z = sizeof(int);
+	    }
+	  else
+	    {
+	      z = (*p_arg)->size;
+	      if (z < sizeof(int))
+		{
+		  z = sizeof(int);
+		  switch ((*p_arg)->type)
+		    {
+		    case FFI_TYPE_SINT8:
+		      *(signed int *) argp = *(SINT8 *)(* p_argv);
+		      break;
+		      
+		    case FFI_TYPE_UINT8:
+		      *(unsigned int *) argp = *(UINT8 *)(* p_argv);
+		      break;
+		      
+		    case FFI_TYPE_SINT16:
+		      *(signed int *) argp = *(SINT16 *)(* p_argv);
+		      break;
+		      
+		    case FFI_TYPE_UINT16:
+		      *(unsigned int *) argp = *(UINT16 *)(* p_argv);
+		      break;
+
+		    default:
+		      FFI_ASSERT(0);
+		    }
+		}
+	      else
+		{
+		  memcpy(argp, *p_argv, z);
+		}
+	    }
+	  p_argv++;
+	  argp += z;
+    }
+  
+  return;
+}
+
+int ffi_prep_args_v9(char *stack, extended_cif *ecif)
+{
+  int i, ret = 0;
+  int tmp;
+  void **p_argv;
+  char *argp;
+  ffi_type **p_arg;
+
+  tmp = 0;
+
+  /* Skip 16 words for the window save area */
+  argp = stack + 16*sizeof(long long);
+
+#ifdef USING_PURIFY
+  /* Purify will probably complain in our assembly routine, unless we
+     zero out this memory. */
+
+  ((long long*)argp)[0] = 0;
+  ((long long*)argp)[1] = 0;
+  ((long long*)argp)[2] = 0;
+  ((long long*)argp)[3] = 0;
+  ((long long*)argp)[4] = 0;
+  ((long long*)argp)[5] = 0;
+#endif
+
+  p_argv = ecif->avalue;
+
+  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT &&
+      ecif->cif->rtype->size > 32)
+    {
+      *(unsigned long long *) argp = (unsigned long)ecif->rvalue;
+      argp += sizeof(long long);
+      tmp = 1;
+    }
+
+  for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs;
+       i++, p_arg++)
+    {
+      size_t z;
+
+      z = (*p_arg)->size;
+      switch ((*p_arg)->type)
+	{
+	case FFI_TYPE_STRUCT:
+	  if (z > 16)
+	    {
+	      /* For structures larger than 16 bytes we pass reference.  */
+	      *(unsigned long long *) argp = (unsigned long)* p_argv;
+	      argp += sizeof(long long);
+	      tmp++;
+	      p_argv++;
+	      continue;
+	    }
+	  /* FALLTHROUGH */
+	case FFI_TYPE_FLOAT:
+	case FFI_TYPE_DOUBLE:
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	case FFI_TYPE_LONGDOUBLE:
+#endif
+	  ret = 1; /* We should promote into FP regs as well as integer.  */
+	  break;
+	}
+      if (z < sizeof(long long))
+	{
+	  switch ((*p_arg)->type)
+	    {
+	    case FFI_TYPE_SINT8:
+	      *(signed long long *) argp = *(SINT8 *)(* p_argv);
+	      break;
+
+	    case FFI_TYPE_UINT8:
+	      *(unsigned long long *) argp = *(UINT8 *)(* p_argv);
+	      break;
+
+	    case FFI_TYPE_SINT16:
+	      *(signed long long *) argp = *(SINT16 *)(* p_argv);
+	      break;
+
+	    case FFI_TYPE_UINT16:
+	      *(unsigned long long *) argp = *(UINT16 *)(* p_argv);
+	      break;
+
+	    case FFI_TYPE_SINT32:
+	      *(signed long long *) argp = *(SINT32 *)(* p_argv);
+	      break;
+
+	    case FFI_TYPE_UINT32:
+	      *(unsigned long long *) argp = *(UINT32 *)(* p_argv);
+	      break;
+
+	    case FFI_TYPE_FLOAT:
+	      *(float *) (argp + 4) = *(FLOAT32 *)(* p_argv); /* Right justify */
+	      break;
+
+	    case FFI_TYPE_STRUCT:
+	      memcpy(argp, *p_argv, z);
+	      break;
+
+	    default:
+	      FFI_ASSERT(0);
+	    }
+	  z = sizeof(long long);
+	  tmp++;
+	}
+      else if (z == sizeof(long long))
+	{
+	  memcpy(argp, *p_argv, z);
+	  z = sizeof(long long);
+	  tmp++;
+	}
+      else
+	{
+	  if ((tmp & 1) && (*p_arg)->alignment > 8)
+	    {
+	      tmp++;
+	      argp += sizeof(long long);
+	    }
+	  memcpy(argp, *p_argv, z);
+	  z = 2 * sizeof(long long);
+	  tmp += 2;
+	}
+      p_argv++;
+      argp += z;
+    }
+
+  return ret;
+}
+
+/* Perform machine dependent cif processing */
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  int wordsize;
+
+  if (cif->abi != FFI_V9)
+    {
+      wordsize = 4;
+
+      /* If we are returning a struct, this will already have been added.
+	 Otherwise we need to add it because it's always got to be there! */
+
+      if (cif->rtype->type != FFI_TYPE_STRUCT)
+	cif->bytes += wordsize;
+
+      /* sparc call frames require that space is allocated for 6 args,
+	 even if they aren't used. Make that space if necessary. */
+  
+      if (cif->bytes < 4*6+4)
+	cif->bytes = 4*6+4;
+    }
+  else
+    {
+      wordsize = 8;
+
+      /* sparc call frames require that space is allocated for 6 args,
+	 even if they aren't used. Make that space if necessary. */
+  
+      if (cif->bytes < 8*6)
+	cif->bytes = 8*6;
+    }
+
+  /* Adjust cif->bytes. to include 16 words for the window save area,
+     and maybe the struct/union return pointer area, */
+
+  cif->bytes += 16 * wordsize;
+
+  /* The stack must be 2 word aligned, so round bytes up
+     appropriately. */
+
+  cif->bytes = ALIGN(cif->bytes, 2 * wordsize);
+
+  /* Set the return type flag */
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_VOID:
+    case FFI_TYPE_FLOAT:
+    case FFI_TYPE_DOUBLE:
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+    case FFI_TYPE_LONGDOUBLE:
+#endif
+      cif->flags = cif->rtype->type;
+      break;
+
+    case FFI_TYPE_STRUCT:
+      if (cif->abi == FFI_V9 && cif->rtype->size > 32)
+	cif->flags = FFI_TYPE_VOID;
+      else
+	cif->flags = FFI_TYPE_STRUCT;
+      break;
+
+    case FFI_TYPE_SINT8:
+    case FFI_TYPE_UINT8:
+    case FFI_TYPE_SINT16:
+    case FFI_TYPE_UINT16:
+      if (cif->abi == FFI_V9)
+	cif->flags = FFI_TYPE_INT;
+      else
+	cif->flags = cif->rtype->type;
+      break;
+
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_UINT64:
+      if (cif->abi == FFI_V9)
+	cif->flags = FFI_TYPE_INT;
+      else
+	cif->flags = FFI_TYPE_SINT64;
+      break;
+
+    default:
+      cif->flags = FFI_TYPE_INT;
+      break;
+    }
+  return FFI_OK;
+}
+
+int ffi_v9_layout_struct(ffi_type *arg, int off, char *ret, char *intg, char *flt)
+{
+  ffi_type **ptr = &arg->elements[0];
+
+  while (*ptr != NULL)
+    {
+      if (off & ((*ptr)->alignment - 1))
+	off = ALIGN(off, (*ptr)->alignment);
+
+      switch ((*ptr)->type)
+	{
+	case FFI_TYPE_STRUCT:
+	  off = ffi_v9_layout_struct(*ptr, off, ret, intg, flt);
+	  off = ALIGN(off, FFI_SIZEOF_ARG);
+	  break;
+	case FFI_TYPE_FLOAT:
+	case FFI_TYPE_DOUBLE:
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	case FFI_TYPE_LONGDOUBLE:
+#endif
+	  memmove(ret + off, flt + off, (*ptr)->size);
+	  off += (*ptr)->size;
+	  break;
+	default:
+	  memmove(ret + off, intg + off, (*ptr)->size);
+	  off += (*ptr)->size;
+	  break;
+	}
+      ptr++;
+    }
+  return off;
+}
+
+
+#ifdef SPARC64
+extern int ffi_call_v9(void *, extended_cif *, unsigned, 
+		       unsigned, unsigned *, void (*fn)(void));
+#else
+extern int ffi_call_v8(void *, extended_cif *, unsigned, 
+		       unsigned, unsigned *, void (*fn)(void));
+#endif
+
+void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+  void *rval = rvalue;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+
+  /* If the return value is a struct and we don't have a return	*/
+  /* value address then we need to make one		        */
+
+  ecif.rvalue = rvalue;
+  if (cif->rtype->type == FFI_TYPE_STRUCT)
+    {
+      if (cif->rtype->size <= 32)
+	rval = alloca(64);
+      else
+	{
+	  rval = NULL;
+	  if (rvalue == NULL)
+	    ecif.rvalue = alloca(cif->rtype->size);
+	}
+    }
+
+  switch (cif->abi) 
+    {
+    case FFI_V8:
+#ifdef SPARC64
+      /* We don't yet support calling 32bit code from 64bit */
+      FFI_ASSERT(0);
+#else
+      if (rvalue && (cif->rtype->type == FFI_TYPE_STRUCT
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	  || cif->flags == FFI_TYPE_LONGDOUBLE
+#endif
+	  ))
+	{
+	  /* For v8, we need an "unimp" with size of returning struct */
+	  /* behind "call", so we alloc some executable space for it. */
+	  /* l7 is used, we need to make sure v8.S doesn't use %l7.   */
+	  unsigned int *call_struct = NULL;
+	  ffi_closure_alloc(32, &call_struct);
+	  if (call_struct)
+	    {
+	      unsigned long f = (unsigned long)fn;
+	      call_struct[0] = 0xae10001f;		 /* mov   %i7, %l7	 */
+	      call_struct[1] = 0xbe10000f;		 /* mov   %o7, %i7	 */
+	      call_struct[2] = 0x03000000 | f >> 10;     /* sethi %hi(fn), %g1	 */
+	      call_struct[3] = 0x9fc06000 | (f & 0x3ff); /* jmp %g1+%lo(fn), %o7 */
+	      call_struct[4] = 0x01000000;		 /* nop			 */
+	      if (cif->rtype->size < 0x7f)
+		call_struct[5] = cif->rtype->size;	 /* unimp		 */
+	      else
+		call_struct[5] = 0x01000000;	     	 /* nop			 */
+	      call_struct[6] = 0x81c7e008;		 /* ret			 */
+	      call_struct[7] = 0xbe100017;		 /* mov   %l7, %i7	 */
+	      asm volatile ("iflush %0; iflush %0+8; iflush %0+16; iflush %0+24" : :
+			    "r" (call_struct) : "memory");
+	      /* SPARC v8 requires 5 instructions for flush to be visible */
+	      asm volatile ("nop; nop; nop; nop; nop");
+	      ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
+			  cif->flags, rvalue, call_struct);
+	      ffi_closure_free(call_struct);
+	    }
+	  else
+	    {
+	      ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
+			  cif->flags, rvalue, fn);
+	    }
+	}
+      else
+	{
+	  ffi_call_v8(ffi_prep_args_v8, &ecif, cif->bytes,
+		      cif->flags, rvalue, fn);
+	}
+#endif
+      break;
+    case FFI_V9:
+#ifdef SPARC64
+      ffi_call_v9(ffi_prep_args_v9, &ecif, cif->bytes,
+		  cif->flags, rval, fn);
+      if (rvalue && rval && cif->rtype->type == FFI_TYPE_STRUCT)
+	ffi_v9_layout_struct(cif->rtype, 0, (char *)rvalue, (char *)rval, ((char *)rval)+32);
+#else
+      /* And vice versa */
+      FFI_ASSERT(0);
+#endif
+      break;
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+}
+
+
+#ifdef SPARC64
+extern void ffi_closure_v9(void);
+#else
+extern void ffi_closure_v8(void);
+#endif
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*, void*, void**, void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
+  unsigned long fn;
+#ifdef SPARC64
+  /* Trampoline address is equal to the closure address.  We take advantage
+     of that to reduce the trampoline size by 8 bytes. */
+  if (cif->abi != FFI_V9)
+    return FFI_BAD_ABI;
+  fn = (unsigned long) ffi_closure_v9;
+  tramp[0] = 0x83414000;	/* rd	%pc, %g1	*/
+  tramp[1] = 0xca586010;	/* ldx	[%g1+16], %g5	*/
+  tramp[2] = 0x81c14000;	/* jmp	%g5		*/
+  tramp[3] = 0x01000000;	/* nop			*/
+  *((unsigned long *) &tramp[4]) = fn;
+#else
+  unsigned long ctx = (unsigned long) codeloc;
+  if (cif->abi != FFI_V8)
+    return FFI_BAD_ABI;
+  fn = (unsigned long) ffi_closure_v8;
+  tramp[0] = 0x03000000 | fn >> 10;	/* sethi %hi(fn), %g1	*/
+  tramp[1] = 0x05000000 | ctx >> 10;	/* sethi %hi(ctx), %g2	*/
+  tramp[2] = 0x81c06000 | (fn & 0x3ff);	/* jmp   %g1+%lo(fn)	*/
+  tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or    %g2, %lo(ctx)	*/
+#endif
+
+  closure->cif = cif;
+  closure->fun = fun;
+  closure->user_data = user_data;
+
+  /* Flush the Icache.  closure is 8 bytes aligned.  */
+#ifdef SPARC64
+  asm volatile ("flush	%0; flush %0+8" : : "r" (closure) : "memory");
+#else
+  asm volatile ("iflush	%0; iflush %0+8" : : "r" (closure) : "memory");
+  /* SPARC v8 requires 5 instructions for flush to be visible */
+  asm volatile ("nop; nop; nop; nop; nop");
+#endif
+
+  return FFI_OK;
+}
+
+int
+ffi_closure_sparc_inner_v8(ffi_closure *closure,
+  void *rvalue, unsigned long *gpr, unsigned long *scratch)
+{
+  ffi_cif *cif;
+  ffi_type **arg_types;
+  void **avalue;
+  int i, argn;
+
+  cif = closure->cif;
+  arg_types = cif->arg_types;
+  avalue = alloca(cif->nargs * sizeof(void *));
+
+  /* Copy the caller's structure return address so that the closure
+     returns the data directly to the caller.  */
+  if (cif->flags == FFI_TYPE_STRUCT
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE  
+      || cif->flags == FFI_TYPE_LONGDOUBLE
+#endif
+     )
+    rvalue = (void *) gpr[0];
+
+  /* Always skip the structure return address.  */
+  argn = 1;
+
+  /* Grab the addresses of the arguments from the stack frame.  */
+  for (i = 0; i < cif->nargs; i++)
+    {
+      if (arg_types[i]->type == FFI_TYPE_STRUCT
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	  || arg_types[i]->type == FFI_TYPE_LONGDOUBLE
+#endif
+         )
+	{
+	  /* Straight copy of invisible reference.  */
+	  avalue[i] = (void *)gpr[argn++];
+	}
+      else if ((arg_types[i]->type == FFI_TYPE_DOUBLE
+	       || arg_types[i]->type == FFI_TYPE_SINT64
+	       || arg_types[i]->type == FFI_TYPE_UINT64)
+	       /* gpr is 8-byte aligned.  */
+	       && (argn % 2) != 0)
+	{
+	  /* Align on a 8-byte boundary.  */
+	  scratch[0] = gpr[argn];
+	  scratch[1] = gpr[argn+1];
+	  avalue[i] = scratch;
+	  scratch -= 2;
+	  argn += 2;
+	}
+      else
+	{
+	  /* Always right-justify.  */
+	  argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
+	  avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size;
+	}
+    }
+
+  /* Invoke the closure.  */
+  (closure->fun) (cif, rvalue, avalue, closure->user_data);
+
+  /* Tell ffi_closure_sparc how to perform return type promotions.  */
+  return cif->rtype->type;
+}
+
+int
+ffi_closure_sparc_inner_v9(ffi_closure *closure,
+  void *rvalue, unsigned long *gpr, double *fpr)
+{
+  ffi_cif *cif;
+  ffi_type **arg_types;
+  void **avalue;
+  int i, argn, fp_slot_max;
+
+  cif = closure->cif;
+  arg_types = cif->arg_types;
+  avalue = alloca(cif->nargs * sizeof(void *));
+
+  /* Copy the caller's structure return address so that the closure
+     returns the data directly to the caller.  */
+  if (cif->flags == FFI_TYPE_VOID
+      && cif->rtype->type == FFI_TYPE_STRUCT)
+    {
+      rvalue = (void *) gpr[0];
+      /* Skip the structure return address.  */
+      argn = 1;
+    }
+  else
+    argn = 0;
+
+  fp_slot_max = 16 - argn;
+
+  /* Grab the addresses of the arguments from the stack frame.  */
+  for (i = 0; i < cif->nargs; i++)
+    {
+      if (arg_types[i]->type == FFI_TYPE_STRUCT)
+	{
+	  if (arg_types[i]->size > 16)
+	    {
+	      /* Straight copy of invisible reference.  */
+	      avalue[i] = (void *)gpr[argn++];
+	    }
+	  else
+	    {
+	      /* Left-justify.  */
+	      ffi_v9_layout_struct(arg_types[i],
+				   0,
+				   (char *) &gpr[argn],
+				   (char *) &gpr[argn],
+				   (char *) &fpr[argn]);
+	      avalue[i] = &gpr[argn];
+	      argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
+	    }
+	}
+      else
+	{
+	  /* Right-justify.  */
+	  argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
+
+	  /* Align on a 16-byte boundary.  */
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	  if (arg_types[i]->type == FFI_TYPE_LONGDOUBLE && (argn % 2) != 0)
+	    argn++;
+#endif
+	  if (i < fp_slot_max
+	      && (arg_types[i]->type == FFI_TYPE_FLOAT
+		  || arg_types[i]->type == FFI_TYPE_DOUBLE
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+		  || arg_types[i]->type == FFI_TYPE_LONGDOUBLE
+#endif
+		  ))
+	    avalue[i] = ((char *) &fpr[argn]) - arg_types[i]->size;
+	  else
+	    avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size;
+	}
+    }
+
+  /* Invoke the closure.  */
+  (closure->fun) (cif, rvalue, avalue, closure->user_data);
+
+  /* Tell ffi_closure_sparc how to perform return type promotions.  */
+  return cif->rtype->type;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffitarget.h
new file mode 100644
index 0000000..51275cb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/ffitarget.h
@@ -0,0 +1,68 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Target configuration macros for SPARC.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+/* ---- System specific configurations ----------------------------------- */
+
+#if defined(__arch64__) || defined(__sparcv9)
+#ifndef SPARC64
+#define SPARC64
+#endif
+#endif
+
+#ifndef LIBFFI_ASM
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+  FFI_V8,
+  FFI_V8PLUS,
+  FFI_V9,
+  FFI_LAST_ABI,
+#ifdef SPARC64
+  FFI_DEFAULT_ABI = FFI_V9
+#else
+  FFI_DEFAULT_ABI = FFI_V8
+#endif
+} ffi_abi;
+#endif
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_NATIVE_RAW_API 0
+
+#ifdef SPARC64
+#define FFI_TRAMPOLINE_SIZE 24
+#else
+#define FFI_TRAMPOLINE_SIZE 16
+#endif
+
+#endif
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v8.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v8.S
new file mode 100644
index 0000000..2c4eb60
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v8.S
@@ -0,0 +1,313 @@
+/* -----------------------------------------------------------------------
+   v8.S - Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc.
+   
+   SPARC Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+#define STACKFRAME 96		/* Minimum stack framesize for SPARC */
+#define ARGS (64+4)		/* Offset of register area in frame */
+
+.text
+        .align 8
+.globl ffi_call_v8
+.globl _ffi_call_v8
+
+ffi_call_v8:
+_ffi_call_v8:
+.LLFB1:
+	save	%sp, -STACKFRAME, %sp
+.LLCFI0:
+	
+	sub	%sp, %i2, %sp	! alloca() space in stack for frame to set up
+	add	%sp, STACKFRAME, %l0	! %l0 has start of 
+					! frame to set up
+
+	mov	%l0, %o0	! call routine to set up frame
+	call	%i0
+	mov	%i1, %o1	! (delay)
+
+	ld	[%l0+ARGS], %o0	! call foreign function
+	ld	[%l0+ARGS+4], %o1
+	ld	[%l0+ARGS+8], %o2
+	ld	[%l0+ARGS+12], %o3
+	ld	[%l0+ARGS+16], %o4
+	ld	[%l0+ARGS+20], %o5
+	call	%i5
+	mov	%l0, %sp	! (delay) switch to frame
+	nop			! STRUCT returning functions skip 12 instead of 8 bytes
+
+	! If the return value pointer is NULL, assume no return value.
+	tst	%i4
+	bz	done
+	nop
+
+	cmp	%i3, FFI_TYPE_INT
+	be,a	done
+	st	%o0, [%i4]	! (delay)
+
+	cmp	%i3, FFI_TYPE_FLOAT
+	be,a	done
+	st	%f0, [%i4+0]	! (delay)
+
+	cmp	%i3, FFI_TYPE_DOUBLE
+	be,a	double
+	st	%f0, [%i4+0]	! (delay)
+
+	cmp	%i3, FFI_TYPE_SINT8
+	be,a	sint8
+	sll	%o0, 24, %o0	! (delay)
+
+	cmp	%i3, FFI_TYPE_UINT8
+	be,a	uint8
+	sll	%o0, 24, %o0	! (delay)
+
+	cmp	%i3, FFI_TYPE_SINT16
+	be,a	sint16
+	sll	%o0, 16, %o0	! (delay)
+
+	cmp	%i3, FFI_TYPE_UINT16
+	be,a	uint16
+	sll	%o0, 16, %o0	! (delay)
+
+	cmp	%i3, FFI_TYPE_SINT64
+	be,a	longlong
+	st	%o0, [%i4+0]	! (delay)
+done:
+	ret
+	restore
+
+double:
+	st	%f1, [%i4+4]
+	ret
+	restore
+
+sint8:
+	sra	%o0, 24, %o0
+	st	%o0, [%i4+0]
+	ret
+	restore
+
+uint8:
+	srl	%o0, 24, %o0
+	st	%o0, [%i4+0]
+	ret
+	restore
+
+sint16:
+	sra	%o0, 16, %o0
+	st	%o0, [%i4+0]
+	ret
+	restore
+
+uint16:
+	srl	%o0, 16, %o0
+	st	%o0, [%i4+0]
+	ret
+	restore
+
+longlong:
+	st	%o1, [%i4+4]
+	ret
+	restore
+.LLFE1:
+
+.ffi_call_v8_end:
+	.size	ffi_call_v8,.ffi_call_v8_end-ffi_call_v8
+
+
+#undef STACKFRAME
+#define	STACKFRAME	104	/* 16*4 register window +
+				   1*4 struct return +	
+				   6*4 args backing store +
+				   3*4 locals */
+
+/* ffi_closure_v8(...)
+
+   Receives the closure argument in %g2.   */
+
+	.text
+	.align 8
+	.globl ffi_closure_v8
+
+ffi_closure_v8:
+#ifdef HAVE_AS_REGISTER_PSEUDO_OP
+		.register	%g2, #scratch
+#endif
+.LLFB2:
+	! Reserve frame space for all arguments in case
+	! we need to align them on a 8-byte boundary.
+	ld	[%g2+FFI_TRAMPOLINE_SIZE], %g1
+	ld	[%g1+4], %g1
+	sll	%g1, 3, %g1
+	add	%g1, STACKFRAME, %g1
+	! %g1 == STACKFRAME + 8*nargs
+	neg	%g1
+	save	%sp, %g1, %sp
+.LLCFI1:
+
+	! Store all of the potential argument registers in va_list format.
+	st	%i0, [%fp+68+0]
+	st	%i1, [%fp+68+4]
+	st	%i2, [%fp+68+8]
+	st	%i3, [%fp+68+12]
+	st	%i4, [%fp+68+16]
+	st	%i5, [%fp+68+20]
+
+	! Call ffi_closure_sparc_inner to do the bulk of the work.
+	mov	%g2, %o0
+	add	%fp, -8, %o1
+	add	%fp,  64, %o2
+	call	ffi_closure_sparc_inner_v8
+	 add	%fp, -16, %o3
+
+	! Load up the return value in the proper type.
+	! See ffi_prep_cif_machdep for the list of cases.
+	cmp	%o0, FFI_TYPE_VOID
+	be	done1
+
+	cmp	%o0, FFI_TYPE_INT
+	be	done1
+	 ld	[%fp-8], %i0
+
+	cmp	%o0, FFI_TYPE_FLOAT
+	be,a	done1
+	 ld	[%fp-8], %f0
+
+	cmp	%o0, FFI_TYPE_DOUBLE
+	be,a	done1
+	 ldd	[%fp-8], %f0
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	cmp	%o0, FFI_TYPE_LONGDOUBLE
+	be	done2
+#endif
+
+	cmp	%o0, FFI_TYPE_STRUCT
+	be	done2
+
+	cmp	%o0, FFI_TYPE_SINT64
+	be,a	done1
+	 ldd	[%fp-8], %i0
+
+	ld	[%fp-8], %i0
+done1:
+	jmp	%i7+8
+	 restore
+done2:
+	! Skip 'unimp'.
+	jmp	%i7+12
+	 restore
+.LLFE2:
+
+.ffi_closure_v8_end:
+	.size	ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8
+
+#ifdef SPARC64
+#define WS 8
+#define nword	xword
+#define uanword	uaxword
+#else
+#define WS 4
+#define nword	long
+#define uanword	uaword
+#endif
+
+#ifdef HAVE_RO_EH_FRAME
+	.section	".eh_frame",#alloc
+#else
+	.section	".eh_frame",#alloc,#write
+#endif
+.LLframe1:
+	.uaword	.LLECIE1-.LLSCIE1	! Length of Common Information Entry
+.LLSCIE1:
+	.uaword	0x0	! CIE Identifier Tag
+	.byte	0x1	! CIE Version
+	.ascii "zR\0"	! CIE Augmentation
+	.byte	0x1	! uleb128 0x1; CIE Code Alignment Factor
+	.byte	0x80-WS	! sleb128 -WS; CIE Data Alignment Factor
+	.byte	0xf	! CIE RA Column
+	.byte	0x1	! uleb128 0x1; Augmentation size
+#ifdef HAVE_AS_SPARC_UA_PCREL
+	.byte	0x1b	! FDE Encoding (pcrel sdata4)
+#else
+	.byte	0x50	! FDE Encoding (aligned absolute)
+#endif
+	.byte	0xc	! DW_CFA_def_cfa
+	.byte	0xe	! uleb128 0xe
+	.byte	0x0	! uleb128 0x0
+	.align	WS
+.LLECIE1:
+.LLSFDE1:
+	.uaword	.LLEFDE1-.LLASFDE1	! FDE Length
+.LLASFDE1:
+	.uaword	.LLASFDE1-.LLframe1	! FDE CIE offset
+#ifdef HAVE_AS_SPARC_UA_PCREL
+	.uaword	%r_disp32(.LLFB1)
+	.uaword	.LLFE1-.LLFB1	! FDE address range
+#else
+	.align	WS
+	.nword	.LLFB1
+	.uanword .LLFE1-.LLFB1	! FDE address range
+#endif
+	.byte	0x0	! uleb128 0x0; Augmentation size
+	.byte	0x4	! DW_CFA_advance_loc4
+	.uaword	.LLCFI0-.LLFB1
+	.byte	0xd	! DW_CFA_def_cfa_register
+	.byte	0x1e	! uleb128 0x1e
+	.byte	0x2d	! DW_CFA_GNU_window_save
+	.byte	0x9	! DW_CFA_register
+	.byte	0xf	! uleb128 0xf
+	.byte	0x1f	! uleb128 0x1f
+	.align	WS
+.LLEFDE1:
+.LLSFDE2:
+	.uaword	.LLEFDE2-.LLASFDE2	! FDE Length
+.LLASFDE2:
+	.uaword	.LLASFDE2-.LLframe1	! FDE CIE offset
+#ifdef HAVE_AS_SPARC_UA_PCREL
+	.uaword	%r_disp32(.LLFB2)
+	.uaword	.LLFE2-.LLFB2	! FDE address range
+#else
+	.align	WS
+	.nword	.LLFB2
+	.uanword .LLFE2-.LLFB2	! FDE address range
+#endif
+	.byte	0x0	! uleb128 0x0; Augmentation size
+	.byte	0x4	! DW_CFA_advance_loc4
+	.uaword	.LLCFI1-.LLFB2
+	.byte	0xd	! DW_CFA_def_cfa_register
+	.byte	0x1e	! uleb128 0x1e
+	.byte	0x2d	! DW_CFA_GNU_window_save
+	.byte	0x9	! DW_CFA_register
+	.byte	0xf	! uleb128 0xf
+	.byte	0x1f	! uleb128 0x1f
+	.align	WS
+.LLEFDE2:
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v9.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v9.S
new file mode 100644
index 0000000..489ff02
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/sparc/v9.S
@@ -0,0 +1,307 @@
+/* -----------------------------------------------------------------------
+   v9.S - Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc.
+   
+   SPARC 64-bit Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+#ifdef SPARC64
+/* Only compile this in for 64bit builds, because otherwise the object file
+   will have inproper architecture due to used instructions.  */
+
+#define STACKFRAME 128		/* Minimum stack framesize for SPARC */
+#define STACK_BIAS 2047
+#define ARGS (128)		/* Offset of register area in frame */
+
+.text
+        .align 8
+.globl ffi_call_v9
+.globl _ffi_call_v9
+
+ffi_call_v9:
+_ffi_call_v9:
+.LLFB1:
+	save	%sp, -STACKFRAME, %sp
+.LLCFI0:
+	
+	sub	%sp, %i2, %sp	! alloca() space in stack for frame to set up
+	add	%sp, STACKFRAME+STACK_BIAS, %l0	! %l0 has start of 
+						! frame to set up
+
+	mov	%l0, %o0	! call routine to set up frame
+	call	%i0
+	 mov	%i1, %o1	! (delay)
+	brz,pt	%o0, 1f
+	 ldx	[%l0+ARGS], %o0	! call foreign function
+
+	ldd	[%l0+ARGS], %f0
+	ldd	[%l0+ARGS+8], %f2
+	ldd	[%l0+ARGS+16], %f4
+	ldd	[%l0+ARGS+24], %f6
+	ldd	[%l0+ARGS+32], %f8
+	ldd	[%l0+ARGS+40], %f10
+	ldd	[%l0+ARGS+48], %f12
+	ldd	[%l0+ARGS+56], %f14
+	ldd	[%l0+ARGS+64], %f16
+	ldd	[%l0+ARGS+72], %f18
+	ldd	[%l0+ARGS+80], %f20
+	ldd	[%l0+ARGS+88], %f22
+	ldd	[%l0+ARGS+96], %f24
+	ldd	[%l0+ARGS+104], %f26
+	ldd	[%l0+ARGS+112], %f28
+	ldd	[%l0+ARGS+120], %f30
+
+1:	ldx	[%l0+ARGS+8], %o1
+	ldx	[%l0+ARGS+16], %o2
+	ldx	[%l0+ARGS+24], %o3
+	ldx	[%l0+ARGS+32], %o4
+	ldx	[%l0+ARGS+40], %o5
+	call	%i5
+	 sub	%l0, STACK_BIAS, %sp	! (delay) switch to frame
+
+	! If the return value pointer is NULL, assume no return value.
+	brz,pn	%i4, done
+	 nop
+
+	cmp	%i3, FFI_TYPE_INT
+	be,a,pt	%icc, done
+	 stx	%o0, [%i4+0]	! (delay)
+
+	cmp	%i3, FFI_TYPE_FLOAT
+	be,a,pn	%icc, done
+	 st	%f0, [%i4+0]	! (delay)
+
+	cmp	%i3, FFI_TYPE_DOUBLE
+	be,a,pn	%icc, done
+	 std	%f0, [%i4+0]	! (delay)
+
+	cmp	%i3, FFI_TYPE_STRUCT
+	be,pn	%icc, dostruct
+
+	cmp	%i3, FFI_TYPE_LONGDOUBLE
+	bne,pt	%icc, done
+	 nop
+	std	%f0, [%i4+0]
+	std	%f2, [%i4+8]
+
+done:	ret
+	 restore
+
+dostruct:
+	/* This will not work correctly for unions. */
+	stx	%o0, [%i4+0]
+	stx	%o1, [%i4+8]
+	stx	%o2, [%i4+16]
+	stx	%o3, [%i4+24]
+	std	%f0, [%i4+32]
+	std	%f2, [%i4+40]
+	std	%f4, [%i4+48]
+	std	%f6, [%i4+56]
+	ret
+	 restore
+.LLFE1:
+
+.ffi_call_v9_end:
+	.size	ffi_call_v9,.ffi_call_v9_end-ffi_call_v9
+
+
+#undef STACKFRAME
+#define	STACKFRAME	 336	/* 16*8 register window +
+				   6*8 args backing store +
+				   20*8 locals */
+#define	FP		%fp+STACK_BIAS
+
+/* ffi_closure_v9(...)
+
+   Receives the closure argument in %g1.   */
+
+	.text
+	.align 8
+	.globl ffi_closure_v9
+
+ffi_closure_v9:
+.LLFB2:
+	save	%sp, -STACKFRAME, %sp
+.LLCFI1:
+
+	! Store all of the potential argument registers in va_list format.
+	stx	%i0, [FP+128+0]
+	stx	%i1, [FP+128+8]
+	stx	%i2, [FP+128+16]
+	stx	%i3, [FP+128+24]
+	stx	%i4, [FP+128+32]
+	stx	%i5, [FP+128+40]
+
+	! Store possible floating point argument registers too.
+	std	%f0,  [FP-128]
+	std	%f2,  [FP-120]
+	std	%f4,  [FP-112]
+	std	%f6,  [FP-104]
+	std	%f8,  [FP-96]
+	std	%f10, [FP-88]
+	std     %f12, [FP-80]
+	std     %f14, [FP-72]
+	std     %f16, [FP-64]
+	std     %f18, [FP-56]
+	std     %f20, [FP-48]
+	std     %f22, [FP-40]
+	std     %f24, [FP-32]
+	std     %f26, [FP-24]
+	std     %f28, [FP-16]
+	std     %f30, [FP-8]
+
+	! Call ffi_closure_sparc_inner to do the bulk of the work.
+	mov	%g1, %o0
+	add	%fp, STACK_BIAS-160, %o1
+	add	%fp, STACK_BIAS+128, %o2
+	call	ffi_closure_sparc_inner_v9
+	 add	%fp, STACK_BIAS-128, %o3
+
+	! Load up the return value in the proper type.
+	! See ffi_prep_cif_machdep for the list of cases.
+	cmp	%o0, FFI_TYPE_VOID
+	be,pn	%icc, done1
+
+	cmp	%o0, FFI_TYPE_INT
+	be,pn	%icc, integer
+
+	cmp	%o0, FFI_TYPE_FLOAT
+	be,a,pn	%icc, done1
+	 ld	[FP-160], %f0
+
+	cmp	%o0, FFI_TYPE_DOUBLE
+	be,a,pn	%icc, done1
+	 ldd	[FP-160], %f0
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+	cmp	%o0, FFI_TYPE_LONGDOUBLE
+	be,a,pn	%icc, longdouble1
+	 ldd	[FP-160], %f0
+#endif
+
+	! FFI_TYPE_STRUCT
+	ldx	[FP-152], %i1
+	ldx	[FP-144], %i2
+	ldx	[FP-136], %i3
+	ldd	[FP-160], %f0
+	ldd	[FP-152], %f2
+	ldd	[FP-144], %f4
+	ldd	[FP-136], %f6
+
+integer:
+	ldx	[FP-160], %i0
+
+done1:
+	ret
+	 restore
+
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+longdouble1:
+	ldd	[FP-152], %f2
+	ret
+	 restore
+#endif
+.LLFE2:
+
+.ffi_closure_v9_end:
+	.size	ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9
+
+#ifdef HAVE_RO_EH_FRAME
+	.section	".eh_frame",#alloc
+#else
+	.section	".eh_frame",#alloc,#write
+#endif
+.LLframe1:
+	.uaword	.LLECIE1-.LLSCIE1	! Length of Common Information Entry
+.LLSCIE1:
+	.uaword	0x0	! CIE Identifier Tag
+	.byte	0x1	! CIE Version
+	.ascii "zR\0"	! CIE Augmentation
+	.byte	0x1	! uleb128 0x1; CIE Code Alignment Factor
+	.byte	0x78	! sleb128 -8; CIE Data Alignment Factor
+	.byte	0xf	! CIE RA Column
+	.byte	0x1	! uleb128 0x1; Augmentation size
+#ifdef HAVE_AS_SPARC_UA_PCREL
+	.byte	0x1b	! FDE Encoding (pcrel sdata4)
+#else
+	.byte	0x50	! FDE Encoding (aligned absolute)
+#endif
+	.byte	0xc	! DW_CFA_def_cfa
+	.byte	0xe	! uleb128 0xe
+	.byte	0xff,0xf	! uleb128 0x7ff
+	.align 8
+.LLECIE1:
+.LLSFDE1:
+	.uaword	.LLEFDE1-.LLASFDE1	! FDE Length
+.LLASFDE1:
+	.uaword	.LLASFDE1-.LLframe1	! FDE CIE offset
+#ifdef HAVE_AS_SPARC_UA_PCREL
+	.uaword	%r_disp32(.LLFB1)
+	.uaword	.LLFE1-.LLFB1		! FDE address range
+#else
+	.align 8
+	.xword	.LLFB1
+	.uaxword	.LLFE1-.LLFB1	! FDE address range
+#endif
+	.byte	0x0	! uleb128 0x0; Augmentation size
+	.byte	0x4	! DW_CFA_advance_loc4
+	.uaword	.LLCFI0-.LLFB1
+	.byte	0xd	! DW_CFA_def_cfa_register
+	.byte	0x1e	! uleb128 0x1e
+	.byte	0x2d	! DW_CFA_GNU_window_save
+	.byte	0x9	! DW_CFA_register
+	.byte	0xf	! uleb128 0xf
+	.byte	0x1f	! uleb128 0x1f
+	.align 8
+.LLEFDE1:
+.LLSFDE2:
+	.uaword	.LLEFDE2-.LLASFDE2	! FDE Length
+.LLASFDE2:
+	.uaword	.LLASFDE2-.LLframe1	! FDE CIE offset
+#ifdef HAVE_AS_SPARC_UA_PCREL
+	.uaword	%r_disp32(.LLFB2)
+	.uaword	.LLFE2-.LLFB2		! FDE address range
+#else
+	.align 8
+	.xword	.LLFB2
+	.uaxword	.LLFE2-.LLFB2	! FDE address range
+#endif
+	.byte	0x0	! uleb128 0x0; Augmentation size
+	.byte	0x4	! DW_CFA_advance_loc4
+	.uaword	.LLCFI1-.LLFB2
+	.byte	0xd	! DW_CFA_def_cfa_register
+	.byte	0x1e	! uleb128 0x1e
+	.byte	0x2d	! DW_CFA_GNU_window_save
+	.byte	0x9	! DW_CFA_register
+	.byte	0xf	! uleb128 0xf
+	.byte	0x1f	! uleb128 0x1f
+	.align 8
+.LLEFDE2:
+#endif
+
+#ifdef __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/types.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/types.c
new file mode 100644
index 0000000..0a11eb0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/types.c
@@ -0,0 +1,77 @@
+/* -----------------------------------------------------------------------
+   types.c - Copyright (c) 1996, 1998  Red Hat, Inc.
+   
+   Predefined ffi_types needed by libffi.
+
+   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.
+   ----------------------------------------------------------------------- */
+
+/* Hide the basic type definitions from the header file, so that we
+   can redefine them here as "const".  */
+#define LIBFFI_HIDE_BASIC_TYPES
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+/* Type definitions */
+
+#define FFI_TYPEDEF(name, type, id)		\
+struct struct_align_##name {			\
+  char c;					\
+  type x;					\
+};						\
+const ffi_type ffi_type_##name = {		\
+  sizeof(type),					\
+  offsetof(struct struct_align_##name, x),	\
+  id, NULL					\
+}
+
+/* Size and alignment are fake here. They must not be 0. */
+const ffi_type ffi_type_void = {
+  1, 1, FFI_TYPE_VOID, NULL
+};
+
+FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8);
+FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8);
+FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16);
+FFI_TYPEDEF(sint16, SINT16, FFI_TYPE_SINT16);
+FFI_TYPEDEF(uint32, UINT32, FFI_TYPE_UINT32);
+FFI_TYPEDEF(sint32, SINT32, FFI_TYPE_SINT32);
+FFI_TYPEDEF(uint64, UINT64, FFI_TYPE_UINT64);
+FFI_TYPEDEF(sint64, SINT64, FFI_TYPE_SINT64);
+
+FFI_TYPEDEF(pointer, void*, FFI_TYPE_POINTER);
+
+FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT);
+FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE);
+
+#ifdef __alpha__
+/* Even if we're not configured to default to 128-bit long double, 
+   maintain binary compatibility, as -mlong-double-128 can be used
+   at any time.  */
+/* Validate the hard-coded number below.  */
+# if defined(__LONG_DOUBLE_128__) && FFI_TYPE_LONGDOUBLE != 4
+#  error FFI_TYPE_LONGDOUBLE out of date
+# endif
+const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL };
+#elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
+FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE);
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin.S
new file mode 100644
index 0000000..8f0f070
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin.S
@@ -0,0 +1,444 @@
+/* -----------------------------------------------------------------------
+   darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005  Red Hat, Inc.
+	Copyright (C) 2008  Free Software Foundation, Inc.
+
+   X86 Foreign Function Interface
+
+   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.
+   -----------------------------------------------------------------------
+   */
+
+#ifndef __x86_64__
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+.text
+
+.globl _ffi_prep_args
+
+	.align 4
+.globl _ffi_call_SYSV
+
+_ffi_call_SYSV:
+.LFB1:
+        pushl %ebp
+.LCFI0:
+        movl  %esp,%ebp
+.LCFI1:
+        subl $8,%esp
+	/* Make room for all of the new args.  */
+	movl  16(%ebp),%ecx
+	subl  %ecx,%esp
+
+	movl  %esp,%eax
+
+	/* Place all of the ffi_prep_args in position  */
+	subl  $8,%esp
+	pushl 12(%ebp)
+	pushl %eax
+	call  *8(%ebp)
+
+	/* Return stack to previous state and call the function  */
+	addl  $16,%esp	
+
+	call  *28(%ebp)
+
+	/* Load %ecx with the return type code  */
+	movl  20(%ebp),%ecx	
+
+	/* Protect %esi.  We're going to pop it in the epilogue.  */
+	pushl %esi
+
+	/* If the return value pointer is NULL, assume no return value.  */
+	cmpl  $0,24(%ebp)
+	jne  0f
+
+	/* Even if there is no space for the return value, we are 
+	   obliged to handle floating-point values.  */
+	cmpl  $FFI_TYPE_FLOAT,%ecx
+	jne   noretval
+	fstp  %st(0)
+
+	jmp   epilogue
+0:
+	.align 4
+	call 1f
+.Lstore_table:
+	.long   noretval-.Lstore_table		/* FFI_TYPE_VOID */
+	.long   retint-.Lstore_table		/* FFI_TYPE_INT */
+	.long   retfloat-.Lstore_table		/* FFI_TYPE_FLOAT */
+	.long   retdouble-.Lstore_table		/* FFI_TYPE_DOUBLE */
+	.long   retlongdouble-.Lstore_table     /* FFI_TYPE_LONGDOUBLE */
+	.long   retuint8-.Lstore_table		/* FFI_TYPE_UINT8 */
+	.long   retsint8-.Lstore_table		/* FFI_TYPE_SINT8 */
+	.long   retuint16-.Lstore_table		/* FFI_TYPE_UINT16 */
+	.long   retsint16-.Lstore_table		/* FFI_TYPE_SINT16 */
+	.long   retint-.Lstore_table		/* FFI_TYPE_UINT32 */
+	.long   retint-.Lstore_table		/* FFI_TYPE_SINT32 */
+	.long   retint64-.Lstore_table		/* FFI_TYPE_UINT64 */
+	.long   retint64-.Lstore_table		/* FFI_TYPE_SINT64 */
+	.long   retstruct-.Lstore_table		/* FFI_TYPE_STRUCT */
+	.long   retint-.Lstore_table		/* FFI_TYPE_POINTER */
+	.long   retstruct1b-.Lstore_table	/* FFI_TYPE_SMALL_STRUCT_1B */
+	.long   retstruct2b-.Lstore_table	/* FFI_TYPE_SMALL_STRUCT_2B */
+1:
+	pop  %esi
+	add  (%esi, %ecx, 4), %esi
+	jmp  *%esi
+
+	/* Sign/zero extend as appropriate.  */
+retsint8:
+	movsbl  %al, %eax
+	jmp  retint
+
+retsint16:
+	movswl  %ax, %eax
+	jmp  retint
+
+retuint8:
+	movzbl  %al, %eax
+	jmp  retint
+
+retuint16:
+	movzwl  %ax, %eax
+	jmp  retint
+
+retfloat:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx
+	fstps (%ecx)
+	jmp   epilogue
+
+retdouble:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx
+	fstpl (%ecx)
+	jmp   epilogue
+
+retlongdouble:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx
+	fstpt (%ecx)
+	jmp   epilogue
+
+retint64:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx
+	movl  %eax,0(%ecx)
+	movl  %edx,4(%ecx)
+	jmp   epilogue
+
+retstruct1b:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx
+	movb  %al,0(%ecx)
+	jmp   epilogue
+
+retstruct2b:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx
+	movw  %ax,0(%ecx)
+	jmp   epilogue
+
+retint:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx
+	movl  %eax,0(%ecx)
+
+retstruct:
+	/* Nothing to do!  */
+
+noretval:
+epilogue:
+	popl %esi
+	movl %ebp,%esp
+	popl %ebp
+	ret
+
+.LFE1:
+.ffi_call_SYSV_end:
+
+	.align	4
+FFI_HIDDEN (ffi_closure_SYSV)
+.globl _ffi_closure_SYSV
+
+_ffi_closure_SYSV:
+.LFB2:
+	pushl	%ebp
+.LCFI2:
+	movl	%esp, %ebp
+.LCFI3:
+	subl	$40, %esp
+	leal	-24(%ebp), %edx
+	movl	%edx, -12(%ebp)	/* resp */
+	leal	8(%ebp), %edx
+	movl	%edx, 4(%esp)	/* args = __builtin_dwarf_cfa () */
+	leal	-12(%ebp), %edx
+	movl	%edx, (%esp)	/* &resp */
+	movl	%ebx, 8(%esp)
+.LCFI7:
+	call	L_ffi_closure_SYSV_inner$stub
+	movl	8(%esp), %ebx
+	movl	-12(%ebp), %ecx
+	cmpl	$FFI_TYPE_INT, %eax
+	je	.Lcls_retint
+
+	/* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
+	   FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
+	cmpl	$FFI_TYPE_UINT64, %eax
+	jge	0f
+	cmpl	$FFI_TYPE_UINT8, %eax
+	jge	.Lcls_retint
+
+0:	cmpl	$FFI_TYPE_FLOAT, %eax
+	je	.Lcls_retfloat
+	cmpl	$FFI_TYPE_DOUBLE, %eax
+	je	.Lcls_retdouble
+	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
+	je	.Lcls_retldouble
+	cmpl	$FFI_TYPE_SINT64, %eax
+	je	.Lcls_retllong
+	cmpl	$FFI_TYPE_SMALL_STRUCT_1B, %eax
+	je	.Lcls_retstruct1b
+	cmpl	$FFI_TYPE_SMALL_STRUCT_2B, %eax
+	je	.Lcls_retstruct2b
+	cmpl	$FFI_TYPE_STRUCT, %eax
+	je	.Lcls_retstruct
+.Lcls_epilogue:
+	movl	%ebp, %esp
+	popl	%ebp
+	ret
+.Lcls_retint:
+	movl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+.Lcls_retfloat:
+	flds	(%ecx)
+	jmp	.Lcls_epilogue
+.Lcls_retdouble:
+	fldl	(%ecx)
+	jmp	.Lcls_epilogue
+.Lcls_retldouble:
+	fldt	(%ecx)
+	jmp	.Lcls_epilogue
+.Lcls_retllong:
+	movl	(%ecx), %eax
+	movl	4(%ecx), %edx
+	jmp	.Lcls_epilogue
+.Lcls_retstruct1b:
+	movsbl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+.Lcls_retstruct2b:
+	movswl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+.Lcls_retstruct:
+	lea -8(%ebp),%esp
+	movl	%ebp, %esp
+	popl	%ebp
+	ret $4
+.LFE2:
+
+#if !FFI_NO_RAW_API
+
+#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
+#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
+#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
+#define CIF_FLAGS_OFFSET 20
+
+	.align	4
+FFI_HIDDEN (ffi_closure_raw_SYSV)
+.globl _ffi_closure_raw_SYSV
+
+_ffi_closure_raw_SYSV:
+.LFB3:
+	pushl	%ebp
+.LCFI4:
+	movl	%esp, %ebp
+.LCFI5:
+	pushl	%esi
+.LCFI6:
+	subl	$36, %esp
+	movl	RAW_CLOSURE_CIF_OFFSET(%eax), %esi	 /* closure->cif */
+	movl	RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
+	movl	%edx, 12(%esp)	/* user_data */
+	leal	8(%ebp), %edx	/* __builtin_dwarf_cfa () */
+	movl	%edx, 8(%esp)	/* raw_args */
+	leal	-24(%ebp), %edx
+	movl	%edx, 4(%esp)	/* &res */
+	movl	%esi, (%esp)	/* cif */
+	call	*RAW_CLOSURE_FUN_OFFSET(%eax)		 /* closure->fun */
+	movl	CIF_FLAGS_OFFSET(%esi), %eax		 /* rtype */
+	cmpl	$FFI_TYPE_INT, %eax
+	je	.Lrcls_retint
+
+	/* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
+	   FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
+	cmpl	$FFI_TYPE_UINT64, %eax
+	jge	0f
+	cmpl	$FFI_TYPE_UINT8, %eax
+	jge	.Lrcls_retint
+0:
+	cmpl	$FFI_TYPE_FLOAT, %eax
+	je	.Lrcls_retfloat
+	cmpl	$FFI_TYPE_DOUBLE, %eax
+	je	.Lrcls_retdouble
+	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
+	je	.Lrcls_retldouble
+	cmpl	$FFI_TYPE_SINT64, %eax
+	je	.Lrcls_retllong
+.Lrcls_epilogue:
+	addl	$36, %esp
+	popl	%esi
+	popl	%ebp
+	ret
+.Lrcls_retint:
+	movl	-24(%ebp), %eax
+	jmp	.Lrcls_epilogue
+.Lrcls_retfloat:
+	flds	-24(%ebp)
+	jmp	.Lrcls_epilogue
+.Lrcls_retdouble:
+	fldl	-24(%ebp)
+	jmp	.Lrcls_epilogue
+.Lrcls_retldouble:
+	fldt	-24(%ebp)
+	jmp	.Lrcls_epilogue
+.Lrcls_retllong:
+	movl	-24(%ebp), %eax
+	movl	-20(%ebp), %edx
+	jmp	.Lrcls_epilogue
+.LFE3:
+#endif
+
+.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
+L_ffi_closure_SYSV_inner$stub:
+	.indirect_symbol _ffi_closure_SYSV_inner
+	hlt ; hlt ; hlt ; hlt ; hlt
+
+
+.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
+EH_frame1:
+	.set	L$set$0,LECIE1-LSCIE1
+	.long	L$set$0
+LSCIE1:
+	.long	0x0
+	.byte	0x1
+	.ascii "zR\0"
+	.byte	0x1
+	.byte	0x7c
+	.byte	0x8
+	.byte	0x1
+	.byte	0x10
+	.byte	0xc
+	.byte	0x5
+	.byte	0x4
+	.byte	0x88
+	.byte	0x1
+	.align 2
+LECIE1:
+.globl _ffi_call_SYSV.eh
+_ffi_call_SYSV.eh:
+LSFDE1:
+	.set	L$set$1,LEFDE1-LASFDE1
+	.long	L$set$1
+LASFDE1:
+	.long	LASFDE1-EH_frame1
+	.long	.LFB1-.
+	.set L$set$2,.LFE1-.LFB1
+	.long L$set$2
+	.byte	0x0
+	.byte	0x4
+	.set L$set$3,.LCFI0-.LFB1
+	.long L$set$3
+	.byte	0xe
+	.byte	0x8
+	.byte	0x84
+	.byte	0x2
+	.byte	0x4
+	.set L$set$4,.LCFI1-.LCFI0
+	.long L$set$4
+	.byte	0xd
+	.byte	0x4
+	.align 2
+LEFDE1:
+.globl _ffi_closure_SYSV.eh
+_ffi_closure_SYSV.eh:
+LSFDE2:
+	.set	L$set$5,LEFDE2-LASFDE2
+	.long	L$set$5
+LASFDE2:
+	.long	LASFDE2-EH_frame1
+	.long	.LFB2-.
+	.set L$set$6,.LFE2-.LFB2
+	.long L$set$6
+	.byte	0x0
+	.byte	0x4
+	.set L$set$7,.LCFI2-.LFB2
+	.long L$set$7
+	.byte	0xe
+	.byte	0x8
+	.byte	0x84
+	.byte	0x2
+	.byte	0x4
+	.set L$set$8,.LCFI3-.LCFI2
+	.long L$set$8
+	.byte	0xd
+	.byte	0x4
+	.align 2
+LEFDE2:
+
+#if !FFI_NO_RAW_API
+
+.globl _ffi_closure_raw_SYSV.eh
+_ffi_closure_raw_SYSV.eh:
+LSFDE3:
+	.set	L$set$10,LEFDE3-LASFDE3
+	.long	L$set$10
+LASFDE3:
+	.long	LASFDE3-EH_frame1
+	.long	.LFB3-.
+	.set L$set$11,.LFE3-.LFB3
+	.long L$set$11
+	.byte	0x0
+	.byte	0x4
+	.set L$set$12,.LCFI4-.LFB3
+	.long L$set$12
+	.byte	0xe
+	.byte	0x8
+	.byte	0x84
+	.byte	0x2
+	.byte	0x4
+	.set L$set$13,.LCFI5-.LCFI4
+	.long L$set$13
+	.byte	0xd
+	.byte	0x4
+	.byte	0x4
+	.set L$set$14,.LCFI6-.LCFI5
+	.long L$set$14
+	.byte	0x85
+	.byte	0x3
+	.align 2
+LEFDE3:
+
+#endif
+
+#endif /* ifndef __x86_64__ */
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin64.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin64.S
new file mode 100644
index 0000000..2f7394e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/darwin64.S
@@ -0,0 +1,416 @@
+/* -----------------------------------------------------------------------
+   darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc.
+	        Copyright (c) 2008 Red Hat, Inc.
+   derived from unix64.S
+
+   x86-64 Foreign Function Interface for Darwin.
+
+   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 AUTHOR 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.
+   ----------------------------------------------------------------------- */
+
+#ifdef __x86_64__
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+
+	.file "darwin64.S"
+.text
+
+/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
+		    void *raddr, void (*fnaddr)(void));
+
+   Bit o trickiness here -- ARGS+BYTES is the base of the stack frame
+   for this function.  This has been allocated by ffi_call.  We also
+   deallocate some of the stack that has been alloca'd.  */
+
+	.align	3
+	.globl	_ffi_call_unix64
+
+_ffi_call_unix64:
+LUW0:
+	movq	(%rsp), %r10		/* Load return address.  */
+	leaq	(%rdi, %rsi), %rax	/* Find local stack base.  */
+	movq	%rdx, (%rax)		/* Save flags.  */
+	movq	%rcx, 8(%rax)		/* Save raddr.  */
+	movq	%rbp, 16(%rax)		/* Save old frame pointer.  */
+	movq	%r10, 24(%rax)		/* Relocate return address.  */
+	movq	%rax, %rbp		/* Finalize local stack frame.  */
+LUW1:
+	movq	%rdi, %r10		/* Save a copy of the register area. */
+	movq	%r8, %r11		/* Save a copy of the target fn.  */
+	movl	%r9d, %eax		/* Set number of SSE registers.  */
+
+	/* Load up all argument registers.  */
+	movq	(%r10), %rdi
+	movq	8(%r10), %rsi
+	movq	16(%r10), %rdx
+	movq	24(%r10), %rcx
+	movq	32(%r10), %r8
+	movq	40(%r10), %r9
+	testl	%eax, %eax
+	jnz	Lload_sse
+Lret_from_load_sse:
+
+	/* Deallocate the reg arg area.  */
+	leaq	176(%r10), %rsp
+
+	/* Call the user function.  */
+	call	*%r11
+
+	/* Deallocate stack arg area; local stack frame in redzone.  */
+	leaq	24(%rbp), %rsp
+
+	movq	0(%rbp), %rcx		/* Reload flags.  */
+	movq	8(%rbp), %rdi		/* Reload raddr.  */
+	movq	16(%rbp), %rbp		/* Reload old frame pointer.  */
+LUW2:
+
+	/* The first byte of the flags contains the FFI_TYPE.  */
+	movzbl	%cl, %r10d
+	leaq	Lstore_table(%rip), %r11
+	movslq	(%r11, %r10, 4), %r10
+	addq	%r11, %r10
+	jmp	*%r10
+
+Lstore_table:
+	.long	Lst_void-Lstore_table		/* FFI_TYPE_VOID */
+	.long	Lst_sint32-Lstore_table		/* FFI_TYPE_INT */
+	.long	Lst_float-Lstore_table		/* FFI_TYPE_FLOAT */
+	.long	Lst_double-Lstore_table		/* FFI_TYPE_DOUBLE */
+	.long	Lst_ldouble-Lstore_table	/* FFI_TYPE_LONGDOUBLE */
+	.long	Lst_uint8-Lstore_table		/* FFI_TYPE_UINT8 */
+	.long	Lst_sint8-Lstore_table		/* FFI_TYPE_SINT8 */
+	.long	Lst_uint16-Lstore_table		/* FFI_TYPE_UINT16 */
+	.long	Lst_sint16-Lstore_table		/* FFI_TYPE_SINT16 */
+	.long	Lst_uint32-Lstore_table		/* FFI_TYPE_UINT32 */
+	.long	Lst_sint32-Lstore_table		/* FFI_TYPE_SINT32 */
+	.long	Lst_int64-Lstore_table		/* FFI_TYPE_UINT64 */
+	.long	Lst_int64-Lstore_table		/* FFI_TYPE_SINT64 */
+	.long	Lst_struct-Lstore_table		/* FFI_TYPE_STRUCT */
+	.long	Lst_int64-Lstore_table		/* FFI_TYPE_POINTER */
+
+	.text
+	.align	3
+Lst_void:
+	ret
+	.align	3
+Lst_uint8:
+	movzbq	%al, %rax
+	movq	%rax, (%rdi)
+	ret
+	.align	3
+Lst_sint8:
+	movsbq	%al, %rax
+	movq	%rax, (%rdi)
+	ret
+	.align	3
+Lst_uint16:
+	movzwq	%ax, %rax
+	movq	%rax, (%rdi)
+	.align	3
+Lst_sint16:
+	movswq	%ax, %rax
+	movq	%rax, (%rdi)
+	ret
+	.align	3
+Lst_uint32:
+	movl	%eax, %eax
+	movq	%rax, (%rdi)
+	.align	3
+Lst_sint32:
+	cltq
+	movq	%rax, (%rdi)
+	ret
+	.align	3
+Lst_int64:
+	movq	%rax, (%rdi)
+	ret
+	.align	3
+Lst_float:
+	movss	%xmm0, (%rdi)
+	ret
+	.align	3
+Lst_double:
+	movsd	%xmm0, (%rdi)
+	ret
+Lst_ldouble:
+	fstpt	(%rdi)
+	ret
+	.align	3
+Lst_struct:
+	leaq	-20(%rsp), %rsi		/* Scratch area in redzone.  */
+
+	/* We have to locate the values now, and since we don't want to
+	   write too much data into the user's return value, we spill the
+	   value to a 16 byte scratch area first.  Bits 8, 9, and 10
+	   control where the values are located.  Only one of the three
+	   bits will be set; see ffi_prep_cif_machdep for the pattern.  */
+	movd	%xmm0, %r10
+	movd	%xmm1, %r11
+	testl	$0x100, %ecx
+	cmovnz	%rax, %rdx
+	cmovnz	%r10, %rax
+	testl	$0x200, %ecx
+	cmovnz	%r10, %rdx
+	testl	$0x400, %ecx
+	cmovnz	%r10, %rax
+	cmovnz	%r11, %rdx
+	movq	%rax, (%rsi)
+	movq	%rdx, 8(%rsi)
+
+	/* Bits 12-31 contain the true size of the structure.  Copy from
+	   the scratch area to the true destination.  */
+	shrl	$12, %ecx
+	rep movsb
+	ret
+
+	/* Many times we can avoid loading any SSE registers at all.
+	   It's not worth an indirect jump to load the exact set of
+	   SSE registers needed; zero or all is a good compromise.  */
+	.align	3
+LUW3:
+Lload_sse:
+	movdqa	48(%r10), %xmm0
+	movdqa	64(%r10), %xmm1
+	movdqa	80(%r10), %xmm2
+	movdqa	96(%r10), %xmm3
+	movdqa	112(%r10), %xmm4
+	movdqa	128(%r10), %xmm5
+	movdqa	144(%r10), %xmm6
+	movdqa	160(%r10), %xmm7
+	jmp	Lret_from_load_sse
+
+LUW4:
+	.align	3
+	.globl	_ffi_closure_unix64
+
+_ffi_closure_unix64:
+LUW5:
+	/* The carry flag is set by the trampoline iff SSE registers
+	   are used.  Don't clobber it before the branch instruction.  */
+	leaq    -200(%rsp), %rsp
+LUW6:
+	movq	%rdi, (%rsp)
+	movq    %rsi, 8(%rsp)
+	movq    %rdx, 16(%rsp)
+	movq    %rcx, 24(%rsp)
+	movq    %r8, 32(%rsp)
+	movq    %r9, 40(%rsp)
+	jc      Lsave_sse
+Lret_from_save_sse:
+
+	movq	%r10, %rdi
+	leaq	176(%rsp), %rsi
+	movq	%rsp, %rdx
+	leaq	208(%rsp), %rcx
+	call	_ffi_closure_unix64_inner
+
+	/* Deallocate stack frame early; return value is now in redzone.  */
+	addq	$200, %rsp
+LUW7:
+
+	/* The first byte of the return value contains the FFI_TYPE.  */
+	movzbl	%al, %r10d
+	leaq	Lload_table(%rip), %r11
+	movslq	(%r11, %r10, 4), %r10
+	addq	%r11, %r10
+	jmp	*%r10
+
+Lload_table:
+	.long	Lld_void-Lload_table		/* FFI_TYPE_VOID */
+	.long	Lld_int32-Lload_table		/* FFI_TYPE_INT */
+	.long	Lld_float-Lload_table		/* FFI_TYPE_FLOAT */
+	.long	Lld_double-Lload_table		/* FFI_TYPE_DOUBLE */
+	.long	Lld_ldouble-Lload_table		/* FFI_TYPE_LONGDOUBLE */
+	.long	Lld_int8-Lload_table		/* FFI_TYPE_UINT8 */
+	.long	Lld_int8-Lload_table		/* FFI_TYPE_SINT8 */
+	.long	Lld_int16-Lload_table		/* FFI_TYPE_UINT16 */
+	.long	Lld_int16-Lload_table		/* FFI_TYPE_SINT16 */
+	.long	Lld_int32-Lload_table		/* FFI_TYPE_UINT32 */
+	.long	Lld_int32-Lload_table		/* FFI_TYPE_SINT32 */
+	.long	Lld_int64-Lload_table		/* FFI_TYPE_UINT64 */
+	.long	Lld_int64-Lload_table		/* FFI_TYPE_SINT64 */
+	.long	Lld_struct-Lload_table		/* FFI_TYPE_STRUCT */
+	.long	Lld_int64-Lload_table		/* FFI_TYPE_POINTER */
+
+	.text
+	.align	3
+Lld_void:
+	ret
+	.align	3
+Lld_int8:
+	movzbl	-24(%rsp), %eax
+	ret
+	.align	3
+Lld_int16:
+	movzwl	-24(%rsp), %eax
+	ret
+	.align	3
+Lld_int32:
+	movl	-24(%rsp), %eax
+	ret
+	.align	3
+Lld_int64:
+	movq	-24(%rsp), %rax
+	ret
+	.align	3
+Lld_float:
+	movss	-24(%rsp), %xmm0
+	ret
+	.align	3
+Lld_double:
+	movsd	-24(%rsp), %xmm0
+	ret
+	.align	3
+Lld_ldouble:
+	fldt	-24(%rsp)
+	ret
+	.align	3
+Lld_struct:
+	/* There are four possibilities here, %rax/%rdx, %xmm0/%rax,
+	   %rax/%xmm0, %xmm0/%xmm1.  We collapse two by always loading
+	   both rdx and xmm1 with the second word.  For the remaining,
+	   bit 8 set means xmm0 gets the second word, and bit 9 means
+	   that rax gets the second word.  */
+	movq	-24(%rsp), %rcx
+	movq	-16(%rsp), %rdx
+	movq	-16(%rsp), %xmm1
+	testl	$0x100, %eax
+	cmovnz	%rdx, %rcx
+	movd	%rcx, %xmm0
+	testl	$0x200, %eax
+	movq	-24(%rsp), %rax
+	cmovnz	%rdx, %rax
+	ret
+
+	/* See the comment above Lload_sse; the same logic applies here.  */
+	.align	3
+LUW8:
+Lsave_sse:
+	movdqa	%xmm0, 48(%rsp)
+	movdqa	%xmm1, 64(%rsp)
+	movdqa	%xmm2, 80(%rsp)
+	movdqa	%xmm3, 96(%rsp)
+	movdqa	%xmm4, 112(%rsp)
+	movdqa	%xmm5, 128(%rsp)
+	movdqa	%xmm6, 144(%rsp)
+	movdqa	%xmm7, 160(%rsp)
+	jmp	Lret_from_save_sse
+
+LUW9:
+.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
+EH_frame1:
+	.set	L$set$0,LECIE1-LSCIE1		/* CIE Length */
+	.long	L$set$0
+LSCIE1:
+	.long	0x0		/* CIE Identifier Tag */
+	.byte	0x1		/* CIE Version */
+	.ascii	"zR\0"		/* CIE Augmentation */
+	.byte	0x1		/* uleb128 0x1; CIE Code Alignment Factor */
+	.byte	0x78		/* sleb128 -8; CIE Data Alignment Factor */
+	.byte	0x10		/* CIE RA Column */
+	.byte	0x1		/* uleb128 0x1; Augmentation size */
+	.byte	0x10		/* FDE Encoding (pcrel sdata4) */
+	.byte	0xc		/* DW_CFA_def_cfa, %rsp offset 8 */
+	.byte	0x7		/* uleb128 0x7 */
+	.byte	0x8		/* uleb128 0x8 */
+	.byte	0x90		/* DW_CFA_offset, column 0x10 */
+	.byte	0x1
+	.align	3
+LECIE1:
+	.globl _ffi_call_unix64.eh
+_ffi_call_unix64.eh:
+LSFDE1:
+	.set	L$set$1,LEFDE1-LASFDE1	/* FDE Length */
+	.long	L$set$1
+LASFDE1:
+	.long	LASFDE1-EH_frame1	/* FDE CIE offset */
+	.quad	LUW0-.			/* FDE initial location */
+	.set	L$set$2,LUW4-LUW0	/* FDE address range */
+	.quad	L$set$2
+	.byte	0x0			/* Augmentation size */
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.set	L$set$3,LUW1-LUW0
+	.long	L$set$3
+
+	/* New stack frame based off rbp.  This is a itty bit of unwind
+	   trickery in that the CFA *has* changed.  There is no easy way
+	   to describe it correctly on entry to the function.  Fortunately,
+	   it doesn't matter too much since at all points we can correctly
+	   unwind back to ffi_call.  Note that the location to which we
+	   moved the return address is (the new) CFA-8, so from the
+	   perspective of the unwind info, it hasn't moved.  */
+	.byte	0xc			/* DW_CFA_def_cfa, %rbp offset 32 */
+	.byte	0x6
+	.byte	0x20
+	.byte	0x80+6			/* DW_CFA_offset, %rbp offset 2*-8 */
+	.byte	0x2
+	.byte	0xa			/* DW_CFA_remember_state */
+
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.set	L$set$4,LUW2-LUW1
+	.long	L$set$4
+	.byte	0xc			/* DW_CFA_def_cfa, %rsp offset 8 */
+	.byte	0x7
+	.byte	0x8
+	.byte	0xc0+6			/* DW_CFA_restore, %rbp */
+
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.set	L$set$5,LUW3-LUW2
+	.long	L$set$5
+	.byte	0xb			/* DW_CFA_restore_state */
+
+	.align	3
+LEFDE1:
+	.globl _ffi_closure_unix64.eh
+_ffi_closure_unix64.eh:
+LSFDE3:
+	.set	L$set$6,LEFDE3-LASFDE3	/* FDE Length */
+	.long	L$set$6
+LASFDE3:
+	.long	LASFDE3-EH_frame1	/* FDE CIE offset */
+	.quad	LUW5-.			/* FDE initial location */
+	.set	L$set$7,LUW9-LUW5	/* FDE address range */
+	.quad	L$set$7
+	.byte	0x0			/* Augmentation size */
+
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.set	L$set$8,LUW6-LUW5
+	.long	L$set$8
+	.byte	0xe			/* DW_CFA_def_cfa_offset */
+	.byte	208,1			/* uleb128 208 */
+	.byte	0xa			/* DW_CFA_remember_state */
+
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.set	L$set$9,LUW7-LUW6
+	.long	L$set$9
+	.byte	0xe			/* DW_CFA_def_cfa_offset */
+	.byte	0x8
+
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.set	L$set$10,LUW8-LUW7
+	.long	L$set$10
+	.byte	0xb			/* DW_CFA_restore_state */
+
+	.align	3
+LEFDE3:
+	.subsections_via_symbols
+
+#endif /* __x86_64__ */
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c
new file mode 100644
index 0000000..34f9c66
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi.c
@@ -0,0 +1,644 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008  Red Hat, Inc.
+           Copyright (c) 2002  Ranjit Mathew
+           Copyright (c) 2002  Bo Thorsen
+           Copyright (c) 2002  Roger Sayle
+           Copyright (C) 2008, 2010  Free Software Foundation, Inc.
+
+   x86 Foreign Function Interface
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#if !defined(__x86_64__) || defined(_WIN64)
+
+#ifdef _WIN64
+#include <windows.h>
+#endif
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+
+/* ffi_prep_args is called by the assembly routine once stack space
+   has been allocated for the function's arguments */
+
+void ffi_prep_args(char *stack, extended_cif *ecif)
+{
+  register unsigned int i;
+  register void **p_argv;
+  register char *argp;
+  register ffi_type **p_arg;
+
+  argp = stack;
+
+  if (ecif->cif->flags == FFI_TYPE_STRUCT
+#ifdef X86_WIN64
+      && (ecif->cif->rtype->size != 1 && ecif->cif->rtype->size != 2
+          && ecif->cif->rtype->size != 4 && ecif->cif->rtype->size != 8)
+#endif
+      )
+    {
+      *(void **) argp = ecif->rvalue;
+      argp += sizeof(void*);
+    }
+
+  p_argv = ecif->avalue;
+
+  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
+       i != 0;
+       i--, p_arg++)
+    {
+      size_t z;
+
+      /* Align if necessary */
+      if ((sizeof(void*) - 1) & (size_t) argp)
+        argp = (char *) ALIGN(argp, sizeof(void*));
+
+      z = (*p_arg)->size;
+#ifdef X86_WIN64
+      if (z > sizeof(ffi_arg)
+          || ((*p_arg)->type == FFI_TYPE_STRUCT
+              && (z != 1 && z != 2 && z != 4 && z != 8))
+#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
+          || ((*p_arg)->type == FFI_TYPE_LONGDOUBLE)
+#endif
+          )
+        {
+          z = sizeof(ffi_arg);
+          *(void **)argp = *p_argv;
+        }
+      else if ((*p_arg)->type == FFI_TYPE_FLOAT)
+        {
+          memcpy(argp, *p_argv, z);
+        }
+      else
+#endif
+      if (z < sizeof(ffi_arg))
+        {
+          z = sizeof(ffi_arg);
+          switch ((*p_arg)->type)
+            {
+            case FFI_TYPE_SINT8:
+              *(ffi_sarg *) argp = (ffi_sarg)*(SINT8 *)(* p_argv);
+              break;
+
+            case FFI_TYPE_UINT8:
+              *(ffi_arg *) argp = (ffi_arg)*(UINT8 *)(* p_argv);
+              break;
+
+            case FFI_TYPE_SINT16:
+              *(ffi_sarg *) argp = (ffi_sarg)*(SINT16 *)(* p_argv);
+              break;
+
+            case FFI_TYPE_UINT16:
+              *(ffi_arg *) argp = (ffi_arg)*(UINT16 *)(* p_argv);
+              break;
+
+            case FFI_TYPE_SINT32:
+              *(ffi_sarg *) argp = (ffi_sarg)*(SINT32 *)(* p_argv);
+              break;
+
+            case FFI_TYPE_UINT32:
+              *(ffi_arg *) argp = (ffi_arg)*(UINT32 *)(* p_argv);
+              break;
+
+            case FFI_TYPE_STRUCT:
+              *(ffi_arg *) argp = *(ffi_arg *)(* p_argv);
+              break;
+
+            default:
+              FFI_ASSERT(0);
+            }
+        }
+      else
+        {
+          memcpy(argp, *p_argv, z);
+        }
+      p_argv++;
+#ifdef X86_WIN64
+      argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
+#else
+      argp += z;
+#endif
+    }
+  
+  return;
+}
+
+/* Perform machine dependent cif processing */
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+{
+  unsigned int i;
+  ffi_type **ptr;
+
+  /* Set the return type flag */
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_VOID:
+    case FFI_TYPE_UINT8:
+    case FFI_TYPE_UINT16:
+    case FFI_TYPE_SINT8:
+    case FFI_TYPE_SINT16:
+#ifdef X86_WIN64
+    case FFI_TYPE_UINT32:
+    case FFI_TYPE_SINT32:
+#endif
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_FLOAT:
+    case FFI_TYPE_DOUBLE:
+#ifndef X86_WIN64
+#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE
+    case FFI_TYPE_LONGDOUBLE:
+#endif
+#endif
+      cif->flags = (unsigned) cif->rtype->type;
+      break;
+
+    case FFI_TYPE_UINT64:
+#ifdef X86_WIN64
+    case FFI_TYPE_POINTER:
+#endif
+      cif->flags = FFI_TYPE_SINT64;
+      break;
+
+    case FFI_TYPE_STRUCT:
+#ifndef X86
+      if (cif->rtype->size == 1)
+        {
+          cif->flags = FFI_TYPE_SMALL_STRUCT_1B; /* same as char size */
+        }
+      else if (cif->rtype->size == 2)
+        {
+          cif->flags = FFI_TYPE_SMALL_STRUCT_2B; /* same as short size */
+        }
+      else if (cif->rtype->size == 4)
+        {
+#ifdef X86_WIN64
+          cif->flags = FFI_TYPE_SMALL_STRUCT_4B;
+#else
+          cif->flags = FFI_TYPE_INT; /* same as int type */
+#endif
+        }
+      else if (cif->rtype->size == 8)
+        {
+          cif->flags = FFI_TYPE_SINT64; /* same as int64 type */
+        }
+      else
+#endif
+        {
+          cif->flags = FFI_TYPE_STRUCT;
+          /* allocate space for return value pointer */
+          cif->bytes += ALIGN(sizeof(void*), FFI_SIZEOF_ARG);
+        }
+      break;
+
+    default:
+#ifdef X86_WIN64
+      cif->flags = FFI_TYPE_SINT64;
+      break;
+    case FFI_TYPE_INT:
+      cif->flags = FFI_TYPE_SINT32;
+#else
+      cif->flags = FFI_TYPE_INT;
+#endif
+      break;
+    }
+
+  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
+    {
+      if (((*ptr)->alignment - 1) & cif->bytes)
+        cif->bytes = ALIGN(cif->bytes, (*ptr)->alignment);
+      cif->bytes += ALIGN((*ptr)->size, FFI_SIZEOF_ARG);
+    }
+
+#ifdef X86_WIN64
+  /* ensure space for storing four registers */
+  cif->bytes += 4 * sizeof(ffi_arg);
+#endif
+
+#ifdef X86_DARWIN
+  cif->bytes = (cif->bytes + 15) & ~0xF;
+#endif
+
+  return FFI_OK;
+}
+
+#ifdef X86_WIN64
+extern int
+ffi_call_win64(void (*)(char *, extended_cif *), extended_cif *,
+               unsigned, unsigned, unsigned *, void (*fn)(void));
+#elif defined(X86_WIN32)
+extern void
+ffi_call_win32(void (*)(char *, extended_cif *), extended_cif *,
+               unsigned, unsigned, unsigned *, void (*fn)(void));
+#else
+extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *,
+                          unsigned, unsigned, unsigned *, void (*fn)(void));
+#endif
+
+void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+  
+  /* If the return value is a struct and we don't have a return */
+  /* value address then we need to make one                     */
+
+#ifdef X86_WIN64
+  if (rvalue == NULL
+      && cif->flags == FFI_TYPE_STRUCT
+      && cif->rtype->size != 1 && cif->rtype->size != 2
+      && cif->rtype->size != 4 && cif->rtype->size != 8)
+    {
+      ecif.rvalue = alloca((cif->rtype->size + 0xF) & ~0xF);
+    }
+#else
+  if (rvalue == NULL
+      && cif->flags == FFI_TYPE_STRUCT)
+    {
+      ecif.rvalue = alloca(cif->rtype->size);
+    }
+#endif
+  else
+    ecif.rvalue = rvalue;
+    
+  
+  switch (cif->abi) 
+    {
+#ifdef X86_WIN64
+    case FFI_WIN64:
+      ffi_call_win64(ffi_prep_args, &ecif, cif->bytes,
+                     cif->flags, ecif.rvalue, fn);
+      break;
+#elif defined(X86_WIN32)
+    case FFI_SYSV:
+    case FFI_STDCALL:
+      ffi_call_win32(ffi_prep_args, &ecif, cif->bytes, cif->flags,
+                     ecif.rvalue, fn);
+      break;
+#else
+    case FFI_SYSV:
+      ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue,
+                    fn);
+      break;
+#endif
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+}
+
+
+/** private members **/
+
+/* The following __attribute__((regparm(1))) decorations will have no effect
+   on MSVC - standard cdecl convention applies. */
+static void ffi_prep_incoming_args_SYSV (char *stack, void **ret,
+                                         void** args, ffi_cif* cif);
+void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *)
+     __attribute__ ((regparm(1)));
+unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *)
+     __attribute__ ((regparm(1)));
+void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *)
+     __attribute__ ((regparm(1)));
+#ifdef X86_WIN32
+void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *)
+     __attribute__ ((regparm(1)));
+#endif
+#ifdef X86_WIN64
+void FFI_HIDDEN ffi_closure_win64 (ffi_closure *);
+#endif
+
+/* This function is jumped to by the trampoline */
+
+#ifdef X86_WIN64
+void * FFI_HIDDEN
+ffi_closure_win64_inner (ffi_closure *closure, void *args) {
+  ffi_cif       *cif;
+  void         **arg_area;
+  void          *result;
+  void          *resp = &result;
+
+  cif         = closure->cif;
+  arg_area    = (void**) alloca (cif->nargs * sizeof (void*));  
+
+  /* this call will initialize ARG_AREA, such that each
+   * element in that array points to the corresponding 
+   * value on the stack; and if the function returns
+   * a structure, it will change RESP to point to the
+   * structure return address.  */
+
+  ffi_prep_incoming_args_SYSV(args, &resp, arg_area, cif);
+  
+  (closure->fun) (cif, resp, arg_area, closure->user_data);
+
+  /* The result is returned in rax.  This does the right thing for
+     result types except for floats; we have to 'mov xmm0, rax' in the
+     caller to correct this.
+     TODO: structure sizes of 3 5 6 7 are returned by reference, too!!!
+  */
+  return cif->rtype->size > sizeof(void *) ? resp : *(void **)resp;
+}
+
+#else
+unsigned int FFI_HIDDEN __attribute__ ((regparm(1)))
+ffi_closure_SYSV_inner (ffi_closure *closure, void **respp, void *args)
+{
+  /* our various things...  */
+  ffi_cif       *cif;
+  void         **arg_area;
+
+  cif         = closure->cif;
+  arg_area    = (void**) alloca (cif->nargs * sizeof (void*));  
+
+  /* this call will initialize ARG_AREA, such that each
+   * element in that array points to the corresponding 
+   * value on the stack; and if the function returns
+   * a structure, it will change RESP to point to the
+   * structure return address.  */
+
+  ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif);
+
+  (closure->fun) (cif, *respp, arg_area, closure->user_data);
+
+  return cif->flags;
+}
+#endif /* !X86_WIN64 */
+
+static void
+ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue,
+                            ffi_cif *cif)
+{
+  register unsigned int i;
+  register void **p_argv;
+  register char *argp;
+  register ffi_type **p_arg;
+
+  argp = stack;
+
+#ifdef X86_WIN64
+  if (cif->rtype->size > sizeof(ffi_arg)
+      || (cif->flags == FFI_TYPE_STRUCT
+          && (cif->rtype->size != 1 && cif->rtype->size != 2
+              && cif->rtype->size != 4 && cif->rtype->size != 8))) {
+    *rvalue = *(void **) argp;
+    argp += sizeof(void *);
+  }
+#else
+  if ( cif->flags == FFI_TYPE_STRUCT ) {
+    *rvalue = *(void **) argp;
+    argp += sizeof(void *);
+  }
+#endif
+
+  p_argv = avalue;
+
+  for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
+    {
+      size_t z;
+
+      /* Align if necessary */
+      if ((sizeof(void*) - 1) & (size_t) argp) {
+        argp = (char *) ALIGN(argp, sizeof(void*));
+      }
+
+#ifdef X86_WIN64
+      if ((*p_arg)->size > sizeof(ffi_arg)
+          || ((*p_arg)->type == FFI_TYPE_STRUCT
+              && ((*p_arg)->size != 1 && (*p_arg)->size != 2
+                  && (*p_arg)->size != 4 && (*p_arg)->size != 8)))
+        {
+          z = sizeof(void *);
+          *p_argv = *(void **)argp;
+        }
+      else
+#endif
+        {
+          z = (*p_arg)->size;
+          
+          /* because we're little endian, this is what it turns into.   */
+          
+          *p_argv = (void*) argp;
+        }
+          
+      p_argv++;
+#ifdef X86_WIN64
+      argp += (z + sizeof(void*) - 1) & ~(sizeof(void*) - 1);
+#else
+      argp += z;
+#endif
+    }
+  
+  return;
+}
+
+#define FFI_INIT_TRAMPOLINE_WIN64(TRAMP,FUN,CTX,MASK) \
+{ unsigned char *__tramp = (unsigned char*)(TRAMP); \
+   void*  __fun = (void*)(FUN); \
+   void*  __ctx = (void*)(CTX); \
+   *(unsigned char*) &__tramp[0] = 0x41; \
+   *(unsigned char*) &__tramp[1] = 0xbb; \
+   *(unsigned int*) &__tramp[2] = MASK; /* mov $mask, %r11 */ \
+   *(unsigned char*) &__tramp[6] = 0x48; \
+   *(unsigned char*) &__tramp[7] = 0xb8; \
+   *(void**) &__tramp[8] = __ctx; /* mov __ctx, %rax */ \
+   *(unsigned char *)  &__tramp[16] = 0x49; \
+   *(unsigned char *)  &__tramp[17] = 0xba; \
+   *(void**) &__tramp[18] = __fun; /* mov __fun, %r10 */ \
+   *(unsigned char *)  &__tramp[26] = 0x41; \
+   *(unsigned char *)  &__tramp[27] = 0xff; \
+   *(unsigned char *)  &__tramp[28] = 0xe2; /* jmp %r10 */ \
+ }
+
+/* How to make a trampoline.  Derived from gcc/config/i386/i386.c. */
+
+#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \
+{ unsigned char *__tramp = (unsigned char*)(TRAMP); \
+   unsigned int  __fun = (unsigned int)(FUN); \
+   unsigned int  __ctx = (unsigned int)(CTX); \
+   unsigned int  __dis = __fun - (__ctx + 10);  \
+   *(unsigned char*) &__tramp[0] = 0xb8; \
+   *(unsigned int*)  &__tramp[1] = __ctx; /* movl __ctx, %eax */ \
+   *(unsigned char *)  &__tramp[5] = 0xe9; \
+   *(unsigned int*)  &__tramp[6] = __dis; /* jmp __fun  */ \
+ }
+
+#define FFI_INIT_TRAMPOLINE_STDCALL(TRAMP,FUN,CTX,SIZE)  \
+{ unsigned char *__tramp = (unsigned char*)(TRAMP); \
+   unsigned int  __fun = (unsigned int)(FUN); \
+   unsigned int  __ctx = (unsigned int)(CTX); \
+   unsigned int  __dis = __fun - (__ctx + 10); \
+   unsigned short __size = (unsigned short)(SIZE); \
+   *(unsigned char*) &__tramp[0] = 0xb8; \
+   *(unsigned int*)  &__tramp[1] = __ctx; /* movl __ctx, %eax */ \
+   *(unsigned char *)  &__tramp[5] = 0xe8; \
+   *(unsigned int*)  &__tramp[6] = __dis; /* call __fun  */ \
+   *(unsigned char *)  &__tramp[10] = 0xc2; \
+   *(unsigned short*)  &__tramp[11] = __size; /* ret __size  */ \
+ }
+
+/* the cif must already be prep'ed */
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+                      ffi_cif* cif,
+                      void (*fun)(ffi_cif*,void*,void**,void*),
+                      void *user_data,
+                      void *codeloc)
+{
+#ifdef X86_WIN64
+#define ISFLOAT(IDX) (cif->arg_types[IDX]->type == FFI_TYPE_FLOAT || cif->arg_types[IDX]->type == FFI_TYPE_DOUBLE)
+#define FLAG(IDX) (cif->nargs>(IDX)&&ISFLOAT(IDX)?(1<<(IDX)):0)
+  if (cif->abi == FFI_WIN64) 
+    {
+      int mask = FLAG(0)|FLAG(1)|FLAG(2)|FLAG(3);
+      FFI_INIT_TRAMPOLINE_WIN64 (&closure->tramp[0],
+                                 &ffi_closure_win64,
+                                 codeloc, mask);
+      /* make sure we can execute here */
+    }
+#else
+  if (cif->abi == FFI_SYSV)
+    {
+      FFI_INIT_TRAMPOLINE (&closure->tramp[0],
+                           &ffi_closure_SYSV,
+                           (void*)codeloc);
+    }
+#ifdef X86_WIN32
+  else if (cif->abi == FFI_STDCALL)
+    {
+      FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0],
+                                   &ffi_closure_STDCALL,
+                                   (void*)codeloc, cif->bytes);
+    }
+#endif /* X86_WIN32 */
+#endif /* !X86_WIN64 */
+  else
+    {
+      return FFI_BAD_ABI;
+    }
+    
+  closure->cif  = cif;
+  closure->user_data = user_data;
+  closure->fun  = fun;
+
+  return FFI_OK;
+}
+
+/* ------- Native raw API support -------------------------------- */
+
+#if !FFI_NO_RAW_API
+
+ffi_status
+ffi_prep_raw_closure_loc (ffi_raw_closure* closure,
+                          ffi_cif* cif,
+                          void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
+                          void *user_data,
+                          void *codeloc)
+{
+  int i;
+
+  if (cif->abi != FFI_SYSV) {
+    return FFI_BAD_ABI;
+  }
+
+  /* we currently don't support certain kinds of arguments for raw
+     closures.  This should be implemented by a separate assembly
+     language routine, since it would require argument processing,
+     something we don't do now for performance.  */
+
+  for (i = cif->nargs-1; i >= 0; i--)
+    {
+      FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT);
+      FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE);
+    }
+  
+
+  FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV,
+                       codeloc);
+    
+  closure->cif  = cif;
+  closure->user_data = user_data;
+  closure->fun  = fun;
+
+  return FFI_OK;
+}
+
+static void 
+ffi_prep_args_raw(char *stack, extended_cif *ecif)
+{
+  memcpy (stack, ecif->avalue, ecif->cif->bytes);
+}
+
+/* we borrow this routine from libffi (it must be changed, though, to
+ * actually call the function passed in the first argument.  as of
+ * libffi-1.20, this is not the case.)
+ */
+
+void
+ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue)
+{
+  extended_cif ecif;
+  void **avalue = (void **)fake_avalue;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+  
+  /* If the return value is a struct and we don't have a return */
+  /* value address then we need to make one                     */
+
+  if ((rvalue == NULL) && 
+      (cif->rtype->type == FFI_TYPE_STRUCT))
+    {
+      ecif.rvalue = alloca(cif->rtype->size);
+    }
+  else
+    ecif.rvalue = rvalue;
+    
+  
+  switch (cif->abi) 
+    {
+#ifdef X86_WIN32
+    case FFI_SYSV:
+    case FFI_STDCALL:
+      ffi_call_win32(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags,
+                     ecif.rvalue, fn);
+      break;
+#else
+    case FFI_SYSV:
+      ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags,
+                    ecif.rvalue, fn);
+      break;
+#endif
+    default:
+      FFI_ASSERT(0);
+      break;
+    }
+}
+
+#endif
+
+#endif /* !__x86_64__  || X86_WIN64 */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi64.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi64.c
new file mode 100644
index 0000000..c8eb455
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffi64.c
@@ -0,0 +1,635 @@
+/* -----------------------------------------------------------------------
+   ffi64.c - Copyright (c) 20011  Anthony Green
+             Copyright (c) 2008, 2010  Red Hat, Inc.
+             Copyright (c) 2002, 2007  Bo Thorsen <bo@suse.de>
+             
+   x86-64 Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#include <ffi.h>
+#include <ffi_common.h>
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#ifdef __x86_64__
+
+#define MAX_GPR_REGS 6
+#define MAX_SSE_REGS 8
+
+struct register_args
+{
+  /* Registers for argument passing.  */
+  UINT64 gpr[MAX_GPR_REGS];
+  __int128_t sse[MAX_SSE_REGS];
+};
+
+extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
+			     void *raddr, void (*fnaddr)(void), unsigned ssecount);
+
+/* All reference to register classes here is identical to the code in
+   gcc/config/i386/i386.c. Do *not* change one without the other.  */
+
+/* Register class used for passing given 64bit part of the argument.
+   These represent classes as documented by the PS ABI, with the
+   exception of SSESF, SSEDF classes, that are basically SSE class,
+   just gcc will use SF or DFmode move instead of DImode to avoid
+   reformatting penalties.
+
+   Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves
+   whenever possible (upper half does contain padding).  */
+enum x86_64_reg_class
+  {
+    X86_64_NO_CLASS,
+    X86_64_INTEGER_CLASS,
+    X86_64_INTEGERSI_CLASS,
+    X86_64_SSE_CLASS,
+    X86_64_SSESF_CLASS,
+    X86_64_SSEDF_CLASS,
+    X86_64_SSEUP_CLASS,
+    X86_64_X87_CLASS,
+    X86_64_X87UP_CLASS,
+    X86_64_COMPLEX_X87_CLASS,
+    X86_64_MEMORY_CLASS
+  };
+
+#define MAX_CLASSES 4
+
+#define SSE_CLASS_P(X)	((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS)
+
+/* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
+   of this code is to classify each 8bytes of incoming argument by the register
+   class and assign registers accordingly.  */
+
+/* Return the union class of CLASS1 and CLASS2.
+   See the x86-64 PS ABI for details.  */
+
+static enum x86_64_reg_class
+merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
+{
+  /* Rule #1: If both classes are equal, this is the resulting class.  */
+  if (class1 == class2)
+    return class1;
+
+  /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
+     the other class.  */
+  if (class1 == X86_64_NO_CLASS)
+    return class2;
+  if (class2 == X86_64_NO_CLASS)
+    return class1;
+
+  /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
+  if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
+    return X86_64_MEMORY_CLASS;
+
+  /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
+  if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
+      || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
+    return X86_64_INTEGERSI_CLASS;
+  if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
+      || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
+    return X86_64_INTEGER_CLASS;
+
+  /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class,
+     MEMORY is used.  */
+  if (class1 == X86_64_X87_CLASS
+      || class1 == X86_64_X87UP_CLASS
+      || class1 == X86_64_COMPLEX_X87_CLASS
+      || class2 == X86_64_X87_CLASS
+      || class2 == X86_64_X87UP_CLASS
+      || class2 == X86_64_COMPLEX_X87_CLASS)
+    return X86_64_MEMORY_CLASS;
+
+  /* Rule #6: Otherwise class SSE is used.  */
+  return X86_64_SSE_CLASS;
+}
+
+/* Classify the argument of type TYPE and mode MODE.
+   CLASSES will be filled by the register class used to pass each word
+   of the operand.  The number of words is returned.  In case the parameter
+   should be passed in memory, 0 is returned. As a special case for zero
+   sized containers, classes[0] will be NO_CLASS and 1 is returned.
+
+   See the x86-64 PS ABI for details.
+*/
+static int
+classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
+		   size_t byte_offset)
+{
+  switch (type->type)
+    {
+    case FFI_TYPE_UINT8:
+    case FFI_TYPE_SINT8:
+    case FFI_TYPE_UINT16:
+    case FFI_TYPE_SINT16:
+    case FFI_TYPE_UINT32:
+    case FFI_TYPE_SINT32:
+    case FFI_TYPE_UINT64:
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_POINTER:
+      {
+	int size = byte_offset + type->size;
+
+	if (size <= 4)
+	  {
+	    classes[0] = X86_64_INTEGERSI_CLASS;
+	    return 1;
+	  }
+	else if (size <= 8)
+	  {
+	    classes[0] = X86_64_INTEGER_CLASS;
+	    return 1;
+	  }
+	else if (size <= 12)
+	  {
+	    classes[0] = X86_64_INTEGER_CLASS;
+	    classes[1] = X86_64_INTEGERSI_CLASS;
+	    return 2;
+	  }
+	else if (size <= 16)
+	  {
+	    classes[0] = classes[1] = X86_64_INTEGERSI_CLASS;
+	    return 2;
+	  }
+	else
+	  FFI_ASSERT (0);
+      }
+    case FFI_TYPE_FLOAT:
+      if (!(byte_offset % 8))
+	classes[0] = X86_64_SSESF_CLASS;
+      else
+	classes[0] = X86_64_SSE_CLASS;
+      return 1;
+    case FFI_TYPE_DOUBLE:
+      classes[0] = X86_64_SSEDF_CLASS;
+      return 1;
+    case FFI_TYPE_LONGDOUBLE:
+      classes[0] = X86_64_X87_CLASS;
+      classes[1] = X86_64_X87UP_CLASS;
+      return 2;
+    case FFI_TYPE_STRUCT:
+      {
+	const int UNITS_PER_WORD = 8;
+	int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
+	ffi_type **ptr; 
+	int i;
+	enum x86_64_reg_class subclasses[MAX_CLASSES];
+
+	/* If the struct is larger than 32 bytes, pass it on the stack.  */
+	if (type->size > 32)
+	  return 0;
+
+	for (i = 0; i < words; i++)
+	  classes[i] = X86_64_NO_CLASS;
+
+	/* Zero sized arrays or structures are NO_CLASS.  We return 0 to
+	   signalize memory class, so handle it as special case.  */
+	if (!words)
+	  {
+	    classes[0] = X86_64_NO_CLASS;
+	    return 1;
+	  }
+
+	/* Merge the fields of structure.  */
+	for (ptr = type->elements; *ptr != NULL; ptr++)
+	  {
+	    int num;
+
+	    byte_offset = ALIGN (byte_offset, (*ptr)->alignment);
+
+	    num = classify_argument (*ptr, subclasses, byte_offset % 8);
+	    if (num == 0)
+	      return 0;
+	    for (i = 0; i < num; i++)
+	      {
+		int pos = byte_offset / 8;
+		classes[i + pos] =
+		  merge_classes (subclasses[i], classes[i + pos]);
+	      }
+
+	    byte_offset += (*ptr)->size;
+	  }
+
+	if (words > 2)
+	  {
+	    /* When size > 16 bytes, if the first one isn't
+	       X86_64_SSE_CLASS or any other ones aren't
+	       X86_64_SSEUP_CLASS, everything should be passed in
+	       memory.  */
+	    if (classes[0] != X86_64_SSE_CLASS)
+	      return 0;
+
+	    for (i = 1; i < words; i++)
+	      if (classes[i] != X86_64_SSEUP_CLASS)
+		return 0;
+	  }
+
+	/* Final merger cleanup.  */
+	for (i = 0; i < words; i++)
+	  {
+	    /* If one class is MEMORY, everything should be passed in
+	       memory.  */
+	    if (classes[i] == X86_64_MEMORY_CLASS)
+	      return 0;
+
+	    /* The X86_64_SSEUP_CLASS should be always preceded by
+	       X86_64_SSE_CLASS or X86_64_SSEUP_CLASS.  */
+	    if (classes[i] == X86_64_SSEUP_CLASS
+		&& classes[i - 1] != X86_64_SSE_CLASS
+		&& classes[i - 1] != X86_64_SSEUP_CLASS)
+	      {
+		/* The first one should never be X86_64_SSEUP_CLASS.  */
+		FFI_ASSERT (i != 0);
+		classes[i] = X86_64_SSE_CLASS;
+	      }
+
+	    /*  If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
+		everything should be passed in memory.  */
+	    if (classes[i] == X86_64_X87UP_CLASS
+		&& (classes[i - 1] != X86_64_X87_CLASS))
+	      {
+		/* The first one should never be X86_64_X87UP_CLASS.  */
+		FFI_ASSERT (i != 0);
+		return 0;
+	      }
+	  }
+	return words;
+      }
+
+    default:
+      FFI_ASSERT(0);
+    }
+  return 0; /* Never reached.  */
+}
+
+/* Examine the argument and return set number of register required in each
+   class.  Return zero iff parameter should be passed in memory, otherwise
+   the number of registers.  */
+
+static int
+examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES],
+		  _Bool in_return, int *pngpr, int *pnsse)
+{
+  int i, n, ngpr, nsse;
+
+  n = classify_argument (type, classes, 0);
+  if (n == 0)
+    return 0;
+
+  ngpr = nsse = 0;
+  for (i = 0; i < n; ++i)
+    switch (classes[i])
+      {
+      case X86_64_INTEGER_CLASS:
+      case X86_64_INTEGERSI_CLASS:
+	ngpr++;
+	break;
+      case X86_64_SSE_CLASS:
+      case X86_64_SSESF_CLASS:
+      case X86_64_SSEDF_CLASS:
+	nsse++;
+	break;
+      case X86_64_NO_CLASS:
+      case X86_64_SSEUP_CLASS:
+	break;
+      case X86_64_X87_CLASS:
+      case X86_64_X87UP_CLASS:
+      case X86_64_COMPLEX_X87_CLASS:
+	return in_return != 0;
+      default:
+	abort ();
+      }
+
+  *pngpr = ngpr;
+  *pnsse = nsse;
+
+  return n;
+}
+
+/* Perform machine dependent cif processing.  */
+
+ffi_status
+ffi_prep_cif_machdep (ffi_cif *cif)
+{
+  int gprcount, ssecount, i, avn, n, ngpr, nsse, flags;
+  enum x86_64_reg_class classes[MAX_CLASSES];
+  size_t bytes;
+
+  gprcount = ssecount = 0;
+
+  flags = cif->rtype->type;
+  if (flags != FFI_TYPE_VOID)
+    {
+      n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse);
+      if (n == 0)
+	{
+	  /* The return value is passed in memory.  A pointer to that
+	     memory is the first argument.  Allocate a register for it.  */
+	  gprcount++;
+	  /* We don't have to do anything in asm for the return.  */
+	  flags = FFI_TYPE_VOID;
+	}
+      else if (flags == FFI_TYPE_STRUCT)
+	{
+	  /* Mark which registers the result appears in.  */
+	  _Bool sse0 = SSE_CLASS_P (classes[0]);
+	  _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]);
+	  if (sse0 && !sse1)
+	    flags |= 1 << 8;
+	  else if (!sse0 && sse1)
+	    flags |= 1 << 9;
+	  else if (sse0 && sse1)
+	    flags |= 1 << 10;
+	  /* Mark the true size of the structure.  */
+	  flags |= cif->rtype->size << 12;
+	}
+    }
+
+  /* Go over all arguments and determine the way they should be passed.
+     If it's in a register and there is space for it, let that be so. If
+     not, add it's size to the stack byte count.  */
+  for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++)
+    {
+      if (examine_argument (cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0
+	  || gprcount + ngpr > MAX_GPR_REGS
+	  || ssecount + nsse > MAX_SSE_REGS)
+	{
+	  long align = cif->arg_types[i]->alignment;
+
+	  if (align < 8)
+	    align = 8;
+
+	  bytes = ALIGN (bytes, align);
+	  bytes += cif->arg_types[i]->size;
+	}
+      else
+	{
+	  gprcount += ngpr;
+	  ssecount += nsse;
+	}
+    }
+  if (ssecount)
+    flags |= 1 << 11;
+  cif->flags = flags;
+  cif->bytes = ALIGN (bytes, 8);
+
+  return FFI_OK;
+}
+
+void
+ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+{
+  enum x86_64_reg_class classes[MAX_CLASSES];
+  char *stack, *argp;
+  ffi_type **arg_types;
+  int gprcount, ssecount, ngpr, nsse, i, avn;
+  _Bool ret_in_memory;
+  struct register_args *reg_args;
+
+  /* Can't call 32-bit mode from 64-bit mode.  */
+  FFI_ASSERT (cif->abi == FFI_UNIX64);
+
+  /* If the return value is a struct and we don't have a return value
+     address then we need to make one.  Note the setting of flags to
+     VOID above in ffi_prep_cif_machdep.  */
+  ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT
+		   && (cif->flags & 0xff) == FFI_TYPE_VOID);
+  if (rvalue == NULL && ret_in_memory)
+    rvalue = alloca (cif->rtype->size);
+
+  /* Allocate the space for the arguments, plus 4 words of temp space.  */
+  stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8);
+  reg_args = (struct register_args *) stack;
+  argp = stack + sizeof (struct register_args);
+
+  gprcount = ssecount = 0;
+
+  /* If the return value is passed in memory, add the pointer as the
+     first integer argument.  */
+  if (ret_in_memory)
+    reg_args->gpr[gprcount++] = (long) rvalue;
+
+  avn = cif->nargs;
+  arg_types = cif->arg_types;
+
+  for (i = 0; i < avn; ++i)
+    {
+      size_t size = arg_types[i]->size;
+      int n;
+
+      n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
+      if (n == 0
+	  || gprcount + ngpr > MAX_GPR_REGS
+	  || ssecount + nsse > MAX_SSE_REGS)
+	{
+	  long align = arg_types[i]->alignment;
+
+	  /* Stack arguments are *always* at least 8 byte aligned.  */
+	  if (align < 8)
+	    align = 8;
+
+	  /* Pass this argument in memory.  */
+	  argp = (void *) ALIGN (argp, align);
+	  memcpy (argp, avalue[i], size);
+	  argp += size;
+	}
+      else
+	{
+	  /* The argument is passed entirely in registers.  */
+	  char *a = (char *) avalue[i];
+	  int j;
+
+	  for (j = 0; j < n; j++, a += 8, size -= 8)
+	    {
+	      switch (classes[j])
+		{
+		case X86_64_INTEGER_CLASS:
+		case X86_64_INTEGERSI_CLASS:
+		  reg_args->gpr[gprcount] = 0;
+		  memcpy (&reg_args->gpr[gprcount], a, size < 8 ? size : 8);
+		  gprcount++;
+		  break;
+		case X86_64_SSE_CLASS:
+		case X86_64_SSEDF_CLASS:
+		  reg_args->sse[ssecount++] = *(UINT64 *) a;
+		  break;
+		case X86_64_SSESF_CLASS:
+		  reg_args->sse[ssecount++] = *(UINT32 *) a;
+		  break;
+		default:
+		  abort();
+		}
+	    }
+	}
+    }
+
+  ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args),
+		   cif->flags, rvalue, fn, ssecount);
+}
+
+
+extern void ffi_closure_unix64(void);
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*, void*, void**, void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  volatile unsigned short *tramp;
+
+  /* Sanity check on the cif ABI.  */
+  {
+    int abi = cif->abi;
+    if (UNLIKELY (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)))
+      return FFI_BAD_ABI;
+  }
+
+  tramp = (volatile unsigned short *) &closure->tramp[0];
+
+  tramp[0] = 0xbb49;		/* mov <code>, %r11	*/
+  *(void * volatile *) &tramp[1] = ffi_closure_unix64;
+  tramp[5] = 0xba49;		/* mov <data>, %r10	*/
+  *(void * volatile *) &tramp[6] = codeloc;
+
+  /* Set the carry bit iff the function uses any sse registers.
+     This is clc or stc, together with the first byte of the jmp.  */
+  tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8;
+
+  tramp[11] = 0xe3ff;			/* jmp *%r11    */
+
+  closure->cif = cif;
+  closure->fun = fun;
+  closure->user_data = user_data;
+
+  return FFI_OK;
+}
+
+int
+ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
+			 struct register_args *reg_args, char *argp)
+{
+  ffi_cif *cif;
+  void **avalue;
+  ffi_type **arg_types;
+  long i, avn;
+  int gprcount, ssecount, ngpr, nsse;
+  int ret;
+
+  cif = closure->cif;
+  avalue = alloca(cif->nargs * sizeof(void *));
+  gprcount = ssecount = 0;
+
+  ret = cif->rtype->type;
+  if (ret != FFI_TYPE_VOID)
+    {
+      enum x86_64_reg_class classes[MAX_CLASSES];
+      int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse);
+      if (n == 0)
+	{
+	  /* The return value goes in memory.  Arrange for the closure
+	     return value to go directly back to the original caller.  */
+	  rvalue = (void *) reg_args->gpr[gprcount++];
+	  /* We don't have to do anything in asm for the return.  */
+	  ret = FFI_TYPE_VOID;
+	}
+      else if (ret == FFI_TYPE_STRUCT && n == 2)
+	{
+	  /* Mark which register the second word of the structure goes in.  */
+	  _Bool sse0 = SSE_CLASS_P (classes[0]);
+	  _Bool sse1 = SSE_CLASS_P (classes[1]);
+	  if (!sse0 && sse1)
+	    ret |= 1 << 8;
+	  else if (sse0 && !sse1)
+	    ret |= 1 << 9;
+	}
+    }
+
+  avn = cif->nargs;
+  arg_types = cif->arg_types;
+  
+  for (i = 0; i < avn; ++i)
+    {
+      enum x86_64_reg_class classes[MAX_CLASSES];
+      int n;
+
+      n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse);
+      if (n == 0
+	  || gprcount + ngpr > MAX_GPR_REGS
+	  || ssecount + nsse > MAX_SSE_REGS)
+	{
+	  long align = arg_types[i]->alignment;
+
+	  /* Stack arguments are *always* at least 8 byte aligned.  */
+	  if (align < 8)
+	    align = 8;
+
+	  /* Pass this argument in memory.  */
+	  argp = (void *) ALIGN (argp, align);
+	  avalue[i] = argp;
+	  argp += arg_types[i]->size;
+	}
+      /* If the argument is in a single register, or two consecutive
+	 integer registers, then we can use that address directly.  */
+      else if (n == 1
+	       || (n == 2 && !(SSE_CLASS_P (classes[0])
+			       || SSE_CLASS_P (classes[1]))))
+	{
+	  /* The argument is in a single register.  */
+	  if (SSE_CLASS_P (classes[0]))
+	    {
+	      avalue[i] = &reg_args->sse[ssecount];
+	      ssecount += n;
+	    }
+	  else
+	    {
+	      avalue[i] = &reg_args->gpr[gprcount];
+	      gprcount += n;
+	    }
+	}
+      /* Otherwise, allocate space to make them consecutive.  */
+      else
+	{
+	  char *a = alloca (16);
+	  int j;
+
+	  avalue[i] = a;
+	  for (j = 0; j < n; j++, a += 8)
+	    {
+	      if (SSE_CLASS_P (classes[j]))
+		memcpy (a, &reg_args->sse[ssecount++], 8);
+	      else
+		memcpy (a, &reg_args->gpr[gprcount++], 8);
+	    }
+	}
+    }
+
+  /* Invoke the closure.  */
+  closure->fun (cif, rvalue, avalue, closure->user_data);
+
+  /* Tell assembly how to perform return type promotions.  */
+  return ret;
+}
+
+#endif /* __x86_64__ */
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffitarget.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffitarget.h
new file mode 100644
index 0000000..542e6d4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/ffitarget.h
@@ -0,0 +1,121 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003, 2010  Red Hat, Inc.
+   Copyright (C) 2008  Free Software Foundation, Inc.
+
+   Target configuration macros for x86 and x86-64.
+
+   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.
+
+   ----------------------------------------------------------------------- */
+
+#ifndef LIBFFI_TARGET_H
+#define LIBFFI_TARGET_H
+
+/* ---- System specific configurations ----------------------------------- */
+
+/* For code common to all platforms on x86 and x86_64. */
+#define X86_ANY
+
+#if defined (X86_64) && defined (__i386__)
+#undef X86_64
+#define X86
+#endif
+
+#ifdef X86_WIN64
+#define FFI_SIZEOF_ARG 8
+#define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */
+#endif
+
+/* ---- Generic type definitions ----------------------------------------- */
+
+#ifndef LIBFFI_ASM
+#ifdef X86_WIN64
+#ifdef _MSC_VER
+typedef unsigned __int64       ffi_arg;
+typedef __int64                ffi_sarg;
+#else
+typedef unsigned long long     ffi_arg;
+typedef long long              ffi_sarg;
+#endif
+#else
+typedef unsigned long          ffi_arg;
+typedef signed long            ffi_sarg;
+#endif
+
+typedef enum ffi_abi {
+  FFI_FIRST_ABI = 0,
+
+  /* ---- Intel x86 Win32 ---------- */
+#ifdef X86_WIN32
+  FFI_SYSV,
+  FFI_STDCALL,
+  FFI_LAST_ABI,
+  /* TODO: Add fastcall support for the sake of completeness */
+  FFI_DEFAULT_ABI = FFI_SYSV
+
+#elif defined(X86_WIN64)
+  FFI_WIN64,
+  FFI_LAST_ABI,
+  FFI_DEFAULT_ABI = FFI_WIN64
+
+#else
+  /* ---- Intel x86 and AMD x86-64 - */
+  FFI_SYSV,
+  FFI_UNIX64,   /* Unix variants all use the same ABI for x86-64  */
+  FFI_LAST_ABI,
+#if defined(__i386__) || defined(__i386)
+  FFI_DEFAULT_ABI = FFI_SYSV
+#else
+  FFI_DEFAULT_ABI = FFI_UNIX64
+#endif
+#endif
+} ffi_abi;
+#endif
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1)
+#define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2)
+#define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3)
+
+#if defined (X86_64) || (defined (__x86_64__) && defined (X86_DARWIN))
+#define FFI_TRAMPOLINE_SIZE 24
+#define FFI_NATIVE_RAW_API 0
+#else
+#ifdef X86_WIN32
+#define FFI_TRAMPOLINE_SIZE 13
+#else
+#ifdef X86_WIN64
+#define FFI_TRAMPOLINE_SIZE 29
+#define FFI_NATIVE_RAW_API 0
+#define FFI_NO_RAW_API 1
+#else
+#define FFI_TRAMPOLINE_SIZE 10
+#endif
+#endif
+#ifndef X86_WIN64
+#define FFI_NATIVE_RAW_API 1	/* x86 has native raw api support */
+#endif
+#endif
+
+#endif
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/freebsd.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/freebsd.S
new file mode 100644
index 0000000..afde513
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/freebsd.S
@@ -0,0 +1,458 @@
+/* -----------------------------------------------------------------------
+   freebsd.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005  Red Hat, Inc.
+	       Copyright (c) 2008  Björn König
+	
+   X86 Foreign Function Interface for FreeBSD
+
+   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.
+----------------------------------------------------------------------- */
+
+#ifndef __x86_64__
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+.text
+
+.globl ffi_prep_args
+
+	.align 4
+.globl ffi_call_SYSV
+        .type    ffi_call_SYSV,@function
+
+ffi_call_SYSV:
+.LFB1:
+        pushl %ebp
+.LCFI0:
+        movl  %esp,%ebp
+.LCFI1:
+	/* Make room for all of the new args.  */
+	movl  16(%ebp),%ecx
+	subl  %ecx,%esp
+
+	movl  %esp,%eax
+
+	/* Place all of the ffi_prep_args in position  */
+	pushl 12(%ebp)
+	pushl %eax
+	call  *8(%ebp)
+
+	/* Return stack to previous state and call the function  */
+	addl  $8,%esp	
+
+	call  *28(%ebp)
+
+	/* Load %ecx with the return type code  */
+	movl  20(%ebp),%ecx	
+
+	/* Protect %esi.  We're going to pop it in the epilogue.  */
+	pushl %esi
+
+	/* If the return value pointer is NULL, assume no return value.  */
+	cmpl  $0,24(%ebp)
+	jne  0f
+
+	/* Even if there is no space for the return value, we are 
+	   obliged to handle floating-point values.  */
+	cmpl  $FFI_TYPE_FLOAT,%ecx
+	jne   noretval
+	fstp  %st(0)
+
+        jmp   epilogue
+
+0:
+	call  1f
+
+.Lstore_table:
+	.long	noretval-.Lstore_table	/* FFI_TYPE_VOID */
+	.long	retint-.Lstore_table	/* FFI_TYPE_INT */
+	.long	retfloat-.Lstore_table	/* FFI_TYPE_FLOAT */
+	.long	retdouble-.Lstore_table	/* FFI_TYPE_DOUBLE */
+	.long	retlongdouble-.Lstore_table	/* FFI_TYPE_LONGDOUBLE */
+	.long	retuint8-.Lstore_table	/* FFI_TYPE_UINT8 */
+	.long	retsint8-.Lstore_table	/* FFI_TYPE_SINT8 */
+	.long	retuint16-.Lstore_table	/* FFI_TYPE_UINT16 */
+	.long	retsint16-.Lstore_table	/* FFI_TYPE_SINT16 */
+	.long	retint-.Lstore_table	/* FFI_TYPE_UINT32 */
+	.long	retint-.Lstore_table	/* FFI_TYPE_SINT32 */
+	.long	retint64-.Lstore_table	/* FFI_TYPE_UINT64 */
+	.long	retint64-.Lstore_table	/* FFI_TYPE_SINT64 */
+	.long	retstruct-.Lstore_table	/* FFI_TYPE_STRUCT */
+	.long	retint-.Lstore_table	/* FFI_TYPE_POINTER */
+	.long   retstruct1b-.Lstore_table	/* FFI_TYPE_SMALL_STRUCT_1B */
+	.long   retstruct2b-.Lstore_table	/* FFI_TYPE_SMALL_STRUCT_2B */
+
+1:
+	pop  %esi
+	add  (%esi, %ecx, 4), %esi
+	jmp  *%esi
+
+	/* Sign/zero extend as appropriate.  */
+retsint8:
+	movsbl  %al, %eax
+	jmp  retint
+
+retsint16:
+	movswl  %ax, %eax
+	jmp  retint
+
+retuint8:
+	movzbl  %al, %eax
+	jmp  retint
+
+retuint16:
+	movzwl  %ax, %eax
+	jmp  retint
+
+retfloat:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx	
+	fstps (%ecx)
+	jmp   epilogue
+
+retdouble:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx	
+	fstpl (%ecx)
+	jmp   epilogue
+
+retlongdouble:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx	
+	fstpt (%ecx)
+	jmp   epilogue
+	
+retint64:	
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx	
+	movl  %eax,0(%ecx)
+	movl  %edx,4(%ecx)
+	jmp   epilogue
+	
+retstruct1b:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx
+	movb  %al,0(%ecx)
+	jmp   epilogue
+
+retstruct2b:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx
+	movw  %ax,0(%ecx)
+	jmp   epilogue
+
+retint:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx	
+	movl  %eax,0(%ecx)
+
+retstruct:
+	/* Nothing to do!  */
+
+noretval:
+epilogue:
+        popl %esi
+        movl %ebp,%esp
+        popl %ebp
+        ret
+.LFE1:
+.ffi_call_SYSV_end:
+        .size    ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
+
+	.align	4
+FFI_HIDDEN (ffi_closure_SYSV)
+.globl ffi_closure_SYSV
+	.type	ffi_closure_SYSV, @function
+
+ffi_closure_SYSV:
+.LFB2:
+	pushl	%ebp
+.LCFI2:
+	movl	%esp, %ebp
+.LCFI3:
+	subl	$40, %esp
+	leal	-24(%ebp), %edx
+	movl	%edx, -12(%ebp)	/* resp */
+	leal	8(%ebp), %edx
+	movl	%edx, 4(%esp)	/* args = __builtin_dwarf_cfa () */
+	leal	-12(%ebp), %edx
+	movl	%edx, (%esp)	/* &resp */
+#if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__
+	call	ffi_closure_SYSV_inner
+#else
+	movl	%ebx, 8(%esp)
+.LCFI7:
+	call	1f
+1:	popl	%ebx
+	addl	$_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
+	call	ffi_closure_SYSV_inner@PLT
+	movl	8(%esp), %ebx
+#endif
+	movl	-12(%ebp), %ecx
+	cmpl	$FFI_TYPE_INT, %eax
+	je	.Lcls_retint
+
+	/* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
+	   FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
+	cmpl	$FFI_TYPE_UINT64, %eax
+	jge	0f
+	cmpl	$FFI_TYPE_UINT8, %eax
+	jge	.Lcls_retint
+	
+0:	cmpl	$FFI_TYPE_FLOAT, %eax
+	je	.Lcls_retfloat
+	cmpl	$FFI_TYPE_DOUBLE, %eax
+	je	.Lcls_retdouble
+	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
+	je	.Lcls_retldouble
+	cmpl	$FFI_TYPE_SINT64, %eax
+	je	.Lcls_retllong
+	cmpl	$FFI_TYPE_SMALL_STRUCT_1B, %eax
+	je	.Lcls_retstruct1b
+	cmpl	$FFI_TYPE_SMALL_STRUCT_2B, %eax
+	je	.Lcls_retstruct2b
+	cmpl	$FFI_TYPE_STRUCT, %eax
+	je	.Lcls_retstruct
+.Lcls_epilogue:
+	movl	%ebp, %esp
+	popl	%ebp
+	ret
+.Lcls_retint:
+	movl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+.Lcls_retfloat:
+	flds	(%ecx)
+	jmp	.Lcls_epilogue
+.Lcls_retdouble:
+	fldl	(%ecx)
+	jmp	.Lcls_epilogue
+.Lcls_retldouble:
+	fldt	(%ecx)
+	jmp	.Lcls_epilogue
+.Lcls_retllong:
+	movl	(%ecx), %eax
+	movl	4(%ecx), %edx
+	jmp	.Lcls_epilogue
+.Lcls_retstruct1b:
+	movsbl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+.Lcls_retstruct2b:
+	movswl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+.Lcls_retstruct:
+	movl	%ebp, %esp
+	popl	%ebp
+	ret	$4
+.LFE2:
+	.size	ffi_closure_SYSV, .-ffi_closure_SYSV
+
+#if !FFI_NO_RAW_API
+
+#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
+#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
+#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
+#define CIF_FLAGS_OFFSET 20
+
+	.align	4
+FFI_HIDDEN (ffi_closure_raw_SYSV)
+.globl ffi_closure_raw_SYSV
+	.type	ffi_closure_raw_SYSV, @function
+
+ffi_closure_raw_SYSV:
+.LFB3:
+	pushl	%ebp
+.LCFI4:
+	movl	%esp, %ebp
+.LCFI5:
+	pushl	%esi
+.LCFI6:
+	subl	$36, %esp
+	movl	RAW_CLOSURE_CIF_OFFSET(%eax), %esi	 /* closure->cif */
+	movl	RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
+	movl	%edx, 12(%esp)	/* user_data */
+	leal	8(%ebp), %edx	/* __builtin_dwarf_cfa () */
+	movl	%edx, 8(%esp)	/* raw_args */
+	leal	-24(%ebp), %edx
+	movl	%edx, 4(%esp)	/* &res */
+	movl	%esi, (%esp)	/* cif */
+	call	*RAW_CLOSURE_FUN_OFFSET(%eax)		 /* closure->fun */
+	movl	CIF_FLAGS_OFFSET(%esi), %eax		 /* rtype */
+	cmpl	$FFI_TYPE_INT, %eax
+	je	.Lrcls_retint
+
+	/* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
+	   FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
+	cmpl	$FFI_TYPE_UINT64, %eax
+	jge	0f
+	cmpl	$FFI_TYPE_UINT8, %eax
+	jge	.Lrcls_retint
+0:
+	cmpl	$FFI_TYPE_FLOAT, %eax
+	je	.Lrcls_retfloat
+	cmpl	$FFI_TYPE_DOUBLE, %eax
+	je	.Lrcls_retdouble
+	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
+	je	.Lrcls_retldouble
+	cmpl	$FFI_TYPE_SINT64, %eax
+	je	.Lrcls_retllong
+.Lrcls_epilogue:
+	addl	$36, %esp
+	popl	%esi
+	popl	%ebp
+	ret
+.Lrcls_retint:
+	movl	-24(%ebp), %eax
+	jmp	.Lrcls_epilogue
+.Lrcls_retfloat:
+	flds	-24(%ebp)
+	jmp	.Lrcls_epilogue
+.Lrcls_retdouble:
+	fldl	-24(%ebp)
+	jmp	.Lrcls_epilogue
+.Lrcls_retldouble:
+	fldt	-24(%ebp)
+	jmp	.Lrcls_epilogue
+.Lrcls_retllong:
+	movl	-24(%ebp), %eax
+	movl	-20(%ebp), %edx
+	jmp	.Lrcls_epilogue
+.LFE3:
+	.size	ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV
+#endif
+
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
+.Lframe1:
+	.long	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
+.LSCIE1:
+	.long	0x0	/* CIE Identifier Tag */
+	.byte	0x1	/* CIE Version */
+#ifdef __PIC__
+	.ascii "zR\0"	/* CIE Augmentation */
+#else
+	.ascii "\0"	/* CIE Augmentation */
+#endif
+	.byte	0x1	/* .uleb128 0x1; CIE Code Alignment Factor */
+	.byte	0x7c	/* .sleb128 -4; CIE Data Alignment Factor */
+	.byte	0x8	/* CIE RA Column */
+#ifdef __PIC__
+	.byte	0x1	/* .uleb128 0x1; Augmentation size */
+	.byte	0x1b	/* FDE Encoding (pcrel sdata4) */
+#endif
+	.byte	0xc	/* DW_CFA_def_cfa */
+	.byte	0x4	/* .uleb128 0x4 */
+	.byte	0x4	/* .uleb128 0x4 */
+	.byte	0x88	/* DW_CFA_offset, column 0x8 */
+	.byte	0x1	/* .uleb128 0x1 */
+	.align 4
+.LECIE1:
+.LSFDE1:
+	.long	.LEFDE1-.LASFDE1	/* FDE Length */
+.LASFDE1:
+	.long	.LASFDE1-.Lframe1	/* FDE CIE offset */
+#ifdef __PIC__
+	.long	.LFB1-.	/* FDE initial location */
+#else
+	.long	.LFB1	/* FDE initial location */
+#endif
+	.long	.LFE1-.LFB1	/* FDE address range */
+#ifdef __PIC__
+	.byte	0x0	/* .uleb128 0x0; Augmentation size */
+#endif
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI0-.LFB1
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x8	/* .uleb128 0x8 */
+	.byte	0x85	/* DW_CFA_offset, column 0x5 */
+	.byte	0x2	/* .uleb128 0x2 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI1-.LCFI0
+	.byte	0xd	/* DW_CFA_def_cfa_register */
+	.byte	0x5	/* .uleb128 0x5 */
+	.align 4
+.LEFDE1:
+.LSFDE2:
+	.long	.LEFDE2-.LASFDE2	/* FDE Length */
+.LASFDE2:
+	.long	.LASFDE2-.Lframe1	/* FDE CIE offset */
+#ifdef __PIC__
+	.long	.LFB2-.	/* FDE initial location */
+#else
+	.long	.LFB2
+#endif
+	.long	.LFE2-.LFB2	/* FDE address range */
+#ifdef __PIC__
+	.byte	0x0	/* .uleb128 0x0; Augmentation size */
+#endif
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI2-.LFB2
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x8	/* .uleb128 0x8 */
+	.byte	0x85	/* DW_CFA_offset, column 0x5 */
+	.byte	0x2	/* .uleb128 0x2 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI3-.LCFI2
+	.byte	0xd	/* DW_CFA_def_cfa_register */
+	.byte	0x5	/* .uleb128 0x5 */
+#if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI7-.LCFI3
+	.byte	0x83	/* DW_CFA_offset, column 0x3 */
+	.byte	0xa	/* .uleb128 0xa */
+#endif
+	.align 4
+.LEFDE2:
+
+#if !FFI_NO_RAW_API
+
+.LSFDE3:
+	.long	.LEFDE3-.LASFDE3	/* FDE Length */
+.LASFDE3:
+	.long	.LASFDE3-.Lframe1	/* FDE CIE offset */
+#ifdef __PIC__
+	.long	.LFB3-.	/* FDE initial location */
+#else
+	.long	.LFB3
+#endif
+	.long	.LFE3-.LFB3	/* FDE address range */
+#ifdef __PIC__
+	.byte	0x0	/* .uleb128 0x0; Augmentation size */
+#endif
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI4-.LFB3
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x8	/* .uleb128 0x8 */
+	.byte	0x85	/* DW_CFA_offset, column 0x5 */
+	.byte	0x2	/* .uleb128 0x2 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI5-.LCFI4
+	.byte	0xd	/* DW_CFA_def_cfa_register */
+	.byte	0x5	/* .uleb128 0x5 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI6-.LCFI5
+	.byte	0x86	/* DW_CFA_offset, column 0x6 */
+	.byte	0x3	/* .uleb128 0x3 */
+	.align 4
+.LEFDE3:
+
+#endif
+
+#endif /* ifndef __x86_64__ */
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/sysv.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/sysv.S
new file mode 100644
index 0000000..f108dd8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/sysv.S
@@ -0,0 +1,468 @@
+/* -----------------------------------------------------------------------
+   sysv.S - Copyright (c) 1996, 1998, 2001-2003, 2005, 2008, 2010  Red Hat, Inc.
+   
+   X86 Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#ifndef __x86_64__
+
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+.text
+
+.globl ffi_prep_args
+
+	.align 4
+.globl ffi_call_SYSV
+        .type    ffi_call_SYSV,@function
+
+ffi_call_SYSV:
+.LFB1:
+        pushl %ebp
+.LCFI0:
+        movl  %esp,%ebp
+.LCFI1:
+	/* Make room for all of the new args.  */
+	movl  16(%ebp),%ecx
+	subl  %ecx,%esp
+
+        /* Align the stack pointer to 16-bytes */
+        andl  $0xfffffff0, %esp
+
+	movl  %esp,%eax
+
+	/* Place all of the ffi_prep_args in position  */
+	pushl 12(%ebp)
+	pushl %eax
+	call  *8(%ebp)
+
+	/* Return stack to previous state and call the function  */
+	addl  $8,%esp	
+
+	call  *28(%ebp)
+
+	/* Load %ecx with the return type code  */
+	movl  20(%ebp),%ecx	
+
+	/* Protect %esi.  We're going to pop it in the epilogue.  */
+	pushl %esi
+
+	/* If the return value pointer is NULL, assume no return value.  */
+	cmpl  $0,24(%ebp)
+	jne  0f
+
+	/* Even if there is no space for the return value, we are 
+	   obliged to handle floating-point values.  */
+	cmpl  $FFI_TYPE_FLOAT,%ecx
+	jne   noretval
+	fstp  %st(0)
+
+        jmp   epilogue
+
+0:
+	call  1f
+
+.Lstore_table:
+	.long	noretval-.Lstore_table	/* FFI_TYPE_VOID */
+	.long	retint-.Lstore_table	/* FFI_TYPE_INT */
+	.long	retfloat-.Lstore_table	/* FFI_TYPE_FLOAT */
+	.long	retdouble-.Lstore_table	/* FFI_TYPE_DOUBLE */
+	.long	retlongdouble-.Lstore_table	/* FFI_TYPE_LONGDOUBLE */
+	.long	retuint8-.Lstore_table	/* FFI_TYPE_UINT8 */
+	.long	retsint8-.Lstore_table	/* FFI_TYPE_SINT8 */
+	.long	retuint16-.Lstore_table	/* FFI_TYPE_UINT16 */
+	.long	retsint16-.Lstore_table	/* FFI_TYPE_SINT16 */
+	.long	retint-.Lstore_table	/* FFI_TYPE_UINT32 */
+	.long	retint-.Lstore_table	/* FFI_TYPE_SINT32 */
+	.long	retint64-.Lstore_table	/* FFI_TYPE_UINT64 */
+	.long	retint64-.Lstore_table	/* FFI_TYPE_SINT64 */
+	.long	retstruct-.Lstore_table	/* FFI_TYPE_STRUCT */
+	.long	retint-.Lstore_table	/* FFI_TYPE_POINTER */
+
+1:
+	pop  %esi
+	add  (%esi, %ecx, 4), %esi
+	jmp  *%esi
+
+	/* Sign/zero extend as appropriate.  */
+retsint8:
+	movsbl  %al, %eax
+	jmp  retint
+
+retsint16:
+	movswl  %ax, %eax
+	jmp  retint
+
+retuint8:
+	movzbl  %al, %eax
+	jmp  retint
+
+retuint16:
+	movzwl  %ax, %eax
+	jmp  retint
+
+retfloat:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx	
+	fstps (%ecx)
+	jmp   epilogue
+
+retdouble:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx	
+	fstpl (%ecx)
+	jmp   epilogue
+
+retlongdouble:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx	
+	fstpt (%ecx)
+	jmp   epilogue
+	
+retint64:	
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx	
+	movl  %eax,0(%ecx)
+	movl  %edx,4(%ecx)
+	jmp   epilogue
+	
+retint:
+	/* Load %ecx with the pointer to storage for the return value  */
+	movl  24(%ebp),%ecx	
+	movl  %eax,0(%ecx)
+
+retstruct:
+	/* Nothing to do!  */
+
+noretval:
+epilogue:
+        popl %esi
+        movl %ebp,%esp
+        popl %ebp
+        ret
+.LFE1:
+.ffi_call_SYSV_end:
+        .size    ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
+
+	.align	4
+FFI_HIDDEN (ffi_closure_SYSV)
+.globl ffi_closure_SYSV
+	.type	ffi_closure_SYSV, @function
+
+ffi_closure_SYSV:
+.LFB2:
+	pushl	%ebp
+.LCFI2:
+	movl	%esp, %ebp
+.LCFI3:
+	subl	$40, %esp
+	leal	-24(%ebp), %edx
+	movl	%edx, -12(%ebp)	/* resp */
+	leal	8(%ebp), %edx
+	movl	%edx, 4(%esp)	/* args = __builtin_dwarf_cfa () */
+	leal	-12(%ebp), %edx
+	movl	%edx, (%esp)	/* &resp */
+#if defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE || !defined __PIC__
+	call	ffi_closure_SYSV_inner
+#else
+	movl	%ebx, 8(%esp)
+.LCFI7:
+	call	1f
+1:	popl	%ebx
+	addl	$_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx
+	call	ffi_closure_SYSV_inner@PLT
+	movl	8(%esp), %ebx
+#endif
+	movl	-12(%ebp), %ecx
+	cmpl	$FFI_TYPE_INT, %eax
+	je	.Lcls_retint
+
+	/* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
+	   FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
+	cmpl	$FFI_TYPE_UINT64, %eax
+	jge	0f
+	cmpl	$FFI_TYPE_UINT8, %eax
+	jge	.Lcls_retint
+	
+0:	cmpl	$FFI_TYPE_FLOAT, %eax
+	je	.Lcls_retfloat
+	cmpl	$FFI_TYPE_DOUBLE, %eax
+	je	.Lcls_retdouble
+	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
+	je	.Lcls_retldouble
+	cmpl	$FFI_TYPE_SINT64, %eax
+	je	.Lcls_retllong
+	cmpl	$FFI_TYPE_STRUCT, %eax
+	je	.Lcls_retstruct
+.Lcls_epilogue:
+	movl	%ebp, %esp
+	popl	%ebp
+	ret
+.Lcls_retint:
+	movl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+.Lcls_retfloat:
+	flds	(%ecx)
+	jmp	.Lcls_epilogue
+.Lcls_retdouble:
+	fldl	(%ecx)
+	jmp	.Lcls_epilogue
+.Lcls_retldouble:
+	fldt	(%ecx)
+	jmp	.Lcls_epilogue
+.Lcls_retllong:
+	movl	(%ecx), %eax
+	movl	4(%ecx), %edx
+	jmp	.Lcls_epilogue
+.Lcls_retstruct:
+	movl	%ebp, %esp
+	popl	%ebp
+	ret	$4
+.LFE2:
+	.size	ffi_closure_SYSV, .-ffi_closure_SYSV
+
+#if !FFI_NO_RAW_API
+
+/* Precalculate for e.g. the Solaris 10/x86 assembler.  */
+#if FFI_TRAMPOLINE_SIZE == 10
+#define RAW_CLOSURE_CIF_OFFSET 12
+#define RAW_CLOSURE_FUN_OFFSET 16
+#define RAW_CLOSURE_USER_DATA_OFFSET 20
+#elif FFI_TRAMPOLINE_SIZE == 24
+#define RAW_CLOSURE_CIF_OFFSET 24
+#define RAW_CLOSURE_FUN_OFFSET 28
+#define RAW_CLOSURE_USER_DATA_OFFSET 32
+#else
+#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
+#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
+#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
+#endif
+#define CIF_FLAGS_OFFSET 20
+
+	.align	4
+FFI_HIDDEN (ffi_closure_raw_SYSV)
+.globl ffi_closure_raw_SYSV
+	.type	ffi_closure_raw_SYSV, @function
+
+ffi_closure_raw_SYSV:
+.LFB3:
+	pushl	%ebp
+.LCFI4:
+	movl	%esp, %ebp
+.LCFI5:
+	pushl	%esi
+.LCFI6:
+	subl	$36, %esp
+	movl	RAW_CLOSURE_CIF_OFFSET(%eax), %esi	 /* closure->cif */
+	movl	RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
+	movl	%edx, 12(%esp)	/* user_data */
+	leal	8(%ebp), %edx	/* __builtin_dwarf_cfa () */
+	movl	%edx, 8(%esp)	/* raw_args */
+	leal	-24(%ebp), %edx
+	movl	%edx, 4(%esp)	/* &res */
+	movl	%esi, (%esp)	/* cif */
+	call	*RAW_CLOSURE_FUN_OFFSET(%eax)		 /* closure->fun */
+	movl	CIF_FLAGS_OFFSET(%esi), %eax		 /* rtype */
+	cmpl	$FFI_TYPE_INT, %eax
+	je	.Lrcls_retint
+
+	/* Handle FFI_TYPE_UINT8, FFI_TYPE_SINT8, FFI_TYPE_UINT16,
+	   FFI_TYPE_SINT16, FFI_TYPE_UINT32, FFI_TYPE_SINT32.  */
+	cmpl	$FFI_TYPE_UINT64, %eax
+	jge	0f
+	cmpl	$FFI_TYPE_UINT8, %eax
+	jge	.Lrcls_retint
+0:
+	cmpl	$FFI_TYPE_FLOAT, %eax
+	je	.Lrcls_retfloat
+	cmpl	$FFI_TYPE_DOUBLE, %eax
+	je	.Lrcls_retdouble
+	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
+	je	.Lrcls_retldouble
+	cmpl	$FFI_TYPE_SINT64, %eax
+	je	.Lrcls_retllong
+.Lrcls_epilogue:
+	addl	$36, %esp
+	popl	%esi
+	popl	%ebp
+	ret
+.Lrcls_retint:
+	movl	-24(%ebp), %eax
+	jmp	.Lrcls_epilogue
+.Lrcls_retfloat:
+	flds	-24(%ebp)
+	jmp	.Lrcls_epilogue
+.Lrcls_retdouble:
+	fldl	-24(%ebp)
+	jmp	.Lrcls_epilogue
+.Lrcls_retldouble:
+	fldt	-24(%ebp)
+	jmp	.Lrcls_epilogue
+.Lrcls_retllong:
+	movl	-24(%ebp), %eax
+	movl	-20(%ebp), %edx
+	jmp	.Lrcls_epilogue
+.LFE3:
+	.size	ffi_closure_raw_SYSV, .-ffi_closure_raw_SYSV
+#endif
+
+#if defined __PIC__
+# if defined __sun__ && defined __svr4__
+/* 32-bit Solaris 2/x86 uses datarel encoding for PIC.  GNU ld before 2.22
+   doesn't correctly sort .eh_frame_hdr with mixed encodings, so match this.  */
+#  define FDE_ENCODING		0x30	/* datarel */
+#  define FDE_ENCODE(X)		X@GOTOFF
+# else
+#  define FDE_ENCODING		0x1b	/* pcrel sdata4 */
+#  if defined HAVE_AS_X86_PCREL
+#   define FDE_ENCODE(X)	X-.
+#  else
+#   define FDE_ENCODE(X)	X@rel
+#  endif
+# endif
+#else
+# define FDE_ENCODING		0	/* absolute */
+# define FDE_ENCODE(X)		X
+#endif
+
+	.section	.eh_frame,EH_FRAME_FLAGS,@progbits
+.Lframe1:
+	.long	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
+.LSCIE1:
+	.long	0x0	/* CIE Identifier Tag */
+	.byte	0x1	/* CIE Version */
+#ifdef HAVE_AS_ASCII_PSEUDO_OP
+#ifdef __PIC__
+	.ascii "zR\0"	/* CIE Augmentation */
+#else
+	.ascii "\0"	/* CIE Augmentation */
+#endif
+#elif defined HAVE_AS_STRING_PSEUDO_OP
+#ifdef __PIC__
+	.string "zR"	/* CIE Augmentation */
+#else
+	.string ""	/* CIE Augmentation */
+#endif
+#else
+#error missing .ascii/.string
+#endif
+	.byte	0x1	/* .uleb128 0x1; CIE Code Alignment Factor */
+	.byte	0x7c	/* .sleb128 -4; CIE Data Alignment Factor */
+	.byte	0x8	/* CIE RA Column */
+#ifdef __PIC__
+	.byte	0x1	/* .uleb128 0x1; Augmentation size */
+	.byte	FDE_ENCODING
+#endif
+	.byte	0xc	/* DW_CFA_def_cfa */
+	.byte	0x4	/* .uleb128 0x4 */
+	.byte	0x4	/* .uleb128 0x4 */
+	.byte	0x88	/* DW_CFA_offset, column 0x8 */
+	.byte	0x1	/* .uleb128 0x1 */
+	.align 4
+.LECIE1:
+.LSFDE1:
+	.long	.LEFDE1-.LASFDE1	/* FDE Length */
+.LASFDE1:
+	.long	.LASFDE1-.Lframe1	/* FDE CIE offset */
+	.long	FDE_ENCODE(.LFB1)	/* FDE initial location */
+	.long	.LFE1-.LFB1		/* FDE address range */
+#ifdef __PIC__
+	.byte	0x0	/* .uleb128 0x0; Augmentation size */
+#endif
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI0-.LFB1
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x8	/* .uleb128 0x8 */
+	.byte	0x85	/* DW_CFA_offset, column 0x5 */
+	.byte	0x2	/* .uleb128 0x2 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI1-.LCFI0
+	.byte	0xd	/* DW_CFA_def_cfa_register */
+	.byte	0x5	/* .uleb128 0x5 */
+	.align 4
+.LEFDE1:
+.LSFDE2:
+	.long	.LEFDE2-.LASFDE2	/* FDE Length */
+.LASFDE2:
+	.long	.LASFDE2-.Lframe1	/* FDE CIE offset */
+	.long	FDE_ENCODE(.LFB2)	/* FDE initial location */
+	.long	.LFE2-.LFB2		/* FDE address range */
+#ifdef __PIC__
+	.byte	0x0	/* .uleb128 0x0; Augmentation size */
+#endif
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI2-.LFB2
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x8	/* .uleb128 0x8 */
+	.byte	0x85	/* DW_CFA_offset, column 0x5 */
+	.byte	0x2	/* .uleb128 0x2 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI3-.LCFI2
+	.byte	0xd	/* DW_CFA_def_cfa_register */
+	.byte	0x5	/* .uleb128 0x5 */
+#if !defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE && defined __PIC__
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI7-.LCFI3
+	.byte	0x83	/* DW_CFA_offset, column 0x3 */
+	.byte	0xa	/* .uleb128 0xa */
+#endif
+	.align 4
+.LEFDE2:
+
+#if !FFI_NO_RAW_API
+
+.LSFDE3:
+	.long	.LEFDE3-.LASFDE3	/* FDE Length */
+.LASFDE3:
+	.long	.LASFDE3-.Lframe1	/* FDE CIE offset */
+	.long	FDE_ENCODE(.LFB3)	/* FDE initial location */
+	.long	.LFE3-.LFB3		/* FDE address range */
+#ifdef __PIC__
+	.byte	0x0	/* .uleb128 0x0; Augmentation size */
+#endif
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI4-.LFB3
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
+	.byte	0x8	/* .uleb128 0x8 */
+	.byte	0x85	/* DW_CFA_offset, column 0x5 */
+	.byte	0x2	/* .uleb128 0x2 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI5-.LCFI4
+	.byte	0xd	/* DW_CFA_def_cfa_register */
+	.byte	0x5	/* .uleb128 0x5 */
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI6-.LCFI5
+	.byte	0x86	/* DW_CFA_offset, column 0x6 */
+	.byte	0x3	/* .uleb128 0x3 */
+	.align 4
+.LEFDE3:
+
+#endif
+
+#endif /* ifndef __x86_64__ */
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/unix64.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/unix64.S
new file mode 100644
index 0000000..7a6619a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/unix64.S
@@ -0,0 +1,426 @@
+/* -----------------------------------------------------------------------
+   unix64.S - Copyright (c) 2002  Bo Thorsen <bo@suse.de>
+	      Copyright (c) 2008  Red Hat, Inc
+
+   x86-64 Foreign Function Interface 
+
+   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.
+   ----------------------------------------------------------------------- */
+
+#ifdef __x86_64__
+#define LIBFFI_ASM	
+#include <fficonfig.h>
+#include <ffi.h>
+
+.text
+
+/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
+	            void *raddr, void (*fnaddr)(void));
+
+   Bit o trickiness here -- ARGS+BYTES is the base of the stack frame
+   for this function.  This has been allocated by ffi_call.  We also
+   deallocate some of the stack that has been alloca'd.  */
+
+	.align	2
+	.globl	ffi_call_unix64
+	.type	ffi_call_unix64,@function
+
+ffi_call_unix64:
+.LUW0:
+	movq	(%rsp), %r10		/* Load return address.  */
+	leaq	(%rdi, %rsi), %rax	/* Find local stack base.  */
+	movq	%rdx, (%rax)		/* Save flags.  */
+	movq	%rcx, 8(%rax)		/* Save raddr.  */
+	movq	%rbp, 16(%rax)		/* Save old frame pointer.  */
+	movq	%r10, 24(%rax)		/* Relocate return address.  */
+	movq	%rax, %rbp		/* Finalize local stack frame.  */
+.LUW1:
+	movq	%rdi, %r10		/* Save a copy of the register area. */
+	movq	%r8, %r11		/* Save a copy of the target fn.  */
+	movl	%r9d, %eax		/* Set number of SSE registers.  */
+
+	/* Load up all argument registers.  */
+	movq	(%r10), %rdi
+	movq	8(%r10), %rsi
+	movq	16(%r10), %rdx
+	movq	24(%r10), %rcx
+	movq	32(%r10), %r8
+	movq	40(%r10), %r9
+	testl	%eax, %eax
+	jnz	.Lload_sse
+.Lret_from_load_sse:
+
+	/* Deallocate the reg arg area.  */
+	leaq	176(%r10), %rsp
+
+	/* Call the user function.  */
+	call	*%r11
+
+	/* Deallocate stack arg area; local stack frame in redzone.  */
+	leaq	24(%rbp), %rsp
+
+	movq	0(%rbp), %rcx		/* Reload flags.  */
+	movq	8(%rbp), %rdi		/* Reload raddr.  */
+	movq	16(%rbp), %rbp		/* Reload old frame pointer.  */
+.LUW2:
+
+	/* The first byte of the flags contains the FFI_TYPE.  */
+	movzbl	%cl, %r10d
+	leaq	.Lstore_table(%rip), %r11
+	movslq	(%r11, %r10, 4), %r10
+	addq	%r11, %r10
+	jmp	*%r10
+
+.Lstore_table:
+	.long	.Lst_void-.Lstore_table		/* FFI_TYPE_VOID */
+	.long	.Lst_sint32-.Lstore_table	/* FFI_TYPE_INT */
+	.long	.Lst_float-.Lstore_table	/* FFI_TYPE_FLOAT */
+	.long	.Lst_double-.Lstore_table	/* FFI_TYPE_DOUBLE */
+	.long	.Lst_ldouble-.Lstore_table	/* FFI_TYPE_LONGDOUBLE */
+	.long	.Lst_uint8-.Lstore_table	/* FFI_TYPE_UINT8 */
+	.long	.Lst_sint8-.Lstore_table	/* FFI_TYPE_SINT8 */
+	.long	.Lst_uint16-.Lstore_table	/* FFI_TYPE_UINT16 */
+	.long	.Lst_sint16-.Lstore_table	/* FFI_TYPE_SINT16 */
+	.long	.Lst_uint32-.Lstore_table	/* FFI_TYPE_UINT32 */
+	.long	.Lst_sint32-.Lstore_table	/* FFI_TYPE_SINT32 */
+	.long	.Lst_int64-.Lstore_table	/* FFI_TYPE_UINT64 */
+	.long	.Lst_int64-.Lstore_table	/* FFI_TYPE_SINT64 */
+	.long	.Lst_struct-.Lstore_table	/* FFI_TYPE_STRUCT */
+	.long	.Lst_int64-.Lstore_table	/* FFI_TYPE_POINTER */
+
+	.align 2
+.Lst_void:
+	ret
+	.align 2
+
+.Lst_uint8:
+	movzbq	%al, %rax
+	movq	%rax, (%rdi)
+	ret
+	.align 2
+.Lst_sint8:
+	movsbq	%al, %rax
+	movq	%rax, (%rdi)
+	ret
+	.align 2
+.Lst_uint16:
+	movzwq	%ax, %rax
+	movq	%rax, (%rdi)
+	.align 2
+.Lst_sint16:
+	movswq	%ax, %rax
+	movq	%rax, (%rdi)
+	ret
+	.align 2
+.Lst_uint32:
+	movl	%eax, %eax
+	movq	%rax, (%rdi)
+	.align 2
+.Lst_sint32:
+	cltq
+	movq	%rax, (%rdi)
+	ret
+	.align 2
+.Lst_int64:
+	movq	%rax, (%rdi)
+	ret
+
+	.align 2
+.Lst_float:
+	movss	%xmm0, (%rdi)
+	ret
+	.align 2
+.Lst_double:
+	movsd	%xmm0, (%rdi)
+	ret
+.Lst_ldouble:
+	fstpt	(%rdi)
+	ret
+
+	.align 2
+.Lst_struct:
+	leaq	-20(%rsp), %rsi		/* Scratch area in redzone.  */
+
+	/* We have to locate the values now, and since we don't want to
+	   write too much data into the user's return value, we spill the
+	   value to a 16 byte scratch area first.  Bits 8, 9, and 10
+	   control where the values are located.  Only one of the three
+	   bits will be set; see ffi_prep_cif_machdep for the pattern.  */
+	movd	%xmm0, %r10
+	movd	%xmm1, %r11
+	testl	$0x100, %ecx
+	cmovnz	%rax, %rdx
+	cmovnz	%r10, %rax
+	testl	$0x200, %ecx
+	cmovnz	%r10, %rdx
+	testl	$0x400, %ecx
+	cmovnz	%r10, %rax
+	cmovnz	%r11, %rdx
+	movq	%rax, (%rsi)
+	movq	%rdx, 8(%rsi)
+
+	/* Bits 12-31 contain the true size of the structure.  Copy from
+	   the scratch area to the true destination.  */
+	shrl	$12, %ecx
+	rep movsb
+	ret
+
+	/* Many times we can avoid loading any SSE registers at all.
+	   It's not worth an indirect jump to load the exact set of
+	   SSE registers needed; zero or all is a good compromise.  */
+	.align 2
+.LUW3:
+.Lload_sse:
+	movdqa	48(%r10), %xmm0
+	movdqa	64(%r10), %xmm1
+	movdqa	80(%r10), %xmm2
+	movdqa	96(%r10), %xmm3
+	movdqa	112(%r10), %xmm4
+	movdqa	128(%r10), %xmm5
+	movdqa	144(%r10), %xmm6
+	movdqa	160(%r10), %xmm7
+	jmp	.Lret_from_load_sse
+
+.LUW4:
+	.size    ffi_call_unix64,.-ffi_call_unix64
+
+	.align	2
+	.globl ffi_closure_unix64
+	.type	ffi_closure_unix64,@function
+
+ffi_closure_unix64:
+.LUW5:
+	/* The carry flag is set by the trampoline iff SSE registers
+	   are used.  Don't clobber it before the branch instruction.  */
+	leaq    -200(%rsp), %rsp
+.LUW6:
+	movq	%rdi, (%rsp)
+	movq    %rsi, 8(%rsp)
+	movq    %rdx, 16(%rsp)
+	movq    %rcx, 24(%rsp)
+	movq    %r8, 32(%rsp)
+	movq    %r9, 40(%rsp)
+	jc      .Lsave_sse
+.Lret_from_save_sse:
+
+	movq	%r10, %rdi
+	leaq	176(%rsp), %rsi
+	movq	%rsp, %rdx
+	leaq	208(%rsp), %rcx
+	call	ffi_closure_unix64_inner@PLT
+
+	/* Deallocate stack frame early; return value is now in redzone.  */
+	addq	$200, %rsp
+.LUW7:
+
+	/* The first byte of the return value contains the FFI_TYPE.  */
+	movzbl	%al, %r10d
+	leaq	.Lload_table(%rip), %r11
+	movslq	(%r11, %r10, 4), %r10
+	addq	%r11, %r10
+	jmp	*%r10
+
+.Lload_table:
+	.long	.Lld_void-.Lload_table		/* FFI_TYPE_VOID */
+	.long	.Lld_int32-.Lload_table		/* FFI_TYPE_INT */
+	.long	.Lld_float-.Lload_table		/* FFI_TYPE_FLOAT */
+	.long	.Lld_double-.Lload_table	/* FFI_TYPE_DOUBLE */
+	.long	.Lld_ldouble-.Lload_table	/* FFI_TYPE_LONGDOUBLE */
+	.long	.Lld_int8-.Lload_table		/* FFI_TYPE_UINT8 */
+	.long	.Lld_int8-.Lload_table		/* FFI_TYPE_SINT8 */
+	.long	.Lld_int16-.Lload_table		/* FFI_TYPE_UINT16 */
+	.long	.Lld_int16-.Lload_table		/* FFI_TYPE_SINT16 */
+	.long	.Lld_int32-.Lload_table		/* FFI_TYPE_UINT32 */
+	.long	.Lld_int32-.Lload_table		/* FFI_TYPE_SINT32 */
+	.long	.Lld_int64-.Lload_table		/* FFI_TYPE_UINT64 */
+	.long	.Lld_int64-.Lload_table		/* FFI_TYPE_SINT64 */
+	.long	.Lld_struct-.Lload_table	/* FFI_TYPE_STRUCT */
+	.long	.Lld_int64-.Lload_table		/* FFI_TYPE_POINTER */
+
+	.align 2
+.Lld_void:
+	ret
+
+	.align 2
+.Lld_int8:
+	movzbl	-24(%rsp), %eax
+	ret
+	.align 2
+.Lld_int16:
+	movzwl	-24(%rsp), %eax
+	ret
+	.align 2
+.Lld_int32:
+	movl	-24(%rsp), %eax
+	ret
+	.align 2
+.Lld_int64:
+	movq	-24(%rsp), %rax
+	ret
+
+	.align 2
+.Lld_float:
+	movss	-24(%rsp), %xmm0
+	ret
+	.align 2
+.Lld_double:
+	movsd	-24(%rsp), %xmm0
+	ret
+	.align 2
+.Lld_ldouble:
+	fldt	-24(%rsp)
+	ret
+
+	.align 2
+.Lld_struct:
+	/* There are four possibilities here, %rax/%rdx, %xmm0/%rax,
+	   %rax/%xmm0, %xmm0/%xmm1.  We collapse two by always loading
+	   both rdx and xmm1 with the second word.  For the remaining,
+	   bit 8 set means xmm0 gets the second word, and bit 9 means
+	   that rax gets the second word.  */
+	movq	-24(%rsp), %rcx
+	movq	-16(%rsp), %rdx
+	movq	-16(%rsp), %xmm1
+	testl	$0x100, %eax
+	cmovnz	%rdx, %rcx
+	movd	%rcx, %xmm0
+	testl	$0x200, %eax
+	movq	-24(%rsp), %rax
+	cmovnz	%rdx, %rax
+	ret
+
+	/* See the comment above .Lload_sse; the same logic applies here.  */
+	.align 2
+.LUW8:
+.Lsave_sse:
+	movdqa	%xmm0, 48(%rsp)
+	movdqa	%xmm1, 64(%rsp)
+	movdqa	%xmm2, 80(%rsp)
+	movdqa	%xmm3, 96(%rsp)
+	movdqa	%xmm4, 112(%rsp)
+	movdqa	%xmm5, 128(%rsp)
+	movdqa	%xmm6, 144(%rsp)
+	movdqa	%xmm7, 160(%rsp)
+	jmp	.Lret_from_save_sse
+
+.LUW9:
+	.size	ffi_closure_unix64,.-ffi_closure_unix64
+
+#ifdef HAVE_AS_X86_64_UNWIND_SECTION_TYPE
+	.section	.eh_frame,"a",@unwind
+#else
+	.section	.eh_frame,"a",@progbits
+#endif
+.Lframe1:
+	.long	.LECIE1-.LSCIE1		/* CIE Length */
+.LSCIE1:
+	.long	0			/* CIE Identifier Tag */
+	.byte	1			/* CIE Version */
+	.ascii "zR\0"			/* CIE Augmentation */
+	.uleb128 1			/* CIE Code Alignment Factor */
+	.sleb128 -8			/* CIE Data Alignment Factor */
+	.byte	0x10			/* CIE RA Column */
+	.uleb128 1			/* Augmentation size */
+	.byte	0x1b			/* FDE Encoding (pcrel sdata4) */
+	.byte	0xc			/* DW_CFA_def_cfa, %rsp offset 8 */
+	.uleb128 7
+	.uleb128 8
+	.byte	0x80+16			/* DW_CFA_offset, %rip offset 1*-8 */
+	.uleb128 1
+	.align 8
+.LECIE1:
+.LSFDE1:
+	.long	.LEFDE1-.LASFDE1	/* FDE Length */
+.LASFDE1:
+	.long	.LASFDE1-.Lframe1	/* FDE CIE offset */
+#if HAVE_AS_X86_PCREL
+	.long	.LUW0-.			/* FDE initial location */
+#else
+	.long	.LUW0@rel
+#endif
+	.long	.LUW4-.LUW0		/* FDE address range */
+	.uleb128 0x0			/* Augmentation size */
+
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.long	.LUW1-.LUW0
+
+	/* New stack frame based off rbp.  This is a itty bit of unwind
+	   trickery in that the CFA *has* changed.  There is no easy way
+	   to describe it correctly on entry to the function.  Fortunately,
+	   it doesn't matter too much since at all points we can correctly
+	   unwind back to ffi_call.  Note that the location to which we
+	   moved the return address is (the new) CFA-8, so from the
+	   perspective of the unwind info, it hasn't moved.  */
+	.byte	0xc			/* DW_CFA_def_cfa, %rbp offset 32 */
+	.uleb128 6
+	.uleb128 32
+	.byte	0x80+6			/* DW_CFA_offset, %rbp offset 2*-8 */
+	.uleb128 2
+	.byte	0xa			/* DW_CFA_remember_state */
+
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.long	.LUW2-.LUW1
+	.byte	0xc			/* DW_CFA_def_cfa, %rsp offset 8 */
+	.uleb128 7
+	.uleb128 8
+	.byte	0xc0+6			/* DW_CFA_restore, %rbp */
+
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.long	.LUW3-.LUW2
+	.byte	0xb			/* DW_CFA_restore_state */
+
+	.align 8
+.LEFDE1:
+.LSFDE3:
+	.long	.LEFDE3-.LASFDE3	/* FDE Length */
+.LASFDE3:
+	.long	.LASFDE3-.Lframe1	/* FDE CIE offset */
+#if HAVE_AS_X86_PCREL
+	.long	.LUW5-.			/* FDE initial location */
+#else
+	.long	.LUW5@rel
+#endif
+	.long	.LUW9-.LUW5		/* FDE address range */
+	.uleb128 0x0			/* Augmentation size */
+
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.long	.LUW6-.LUW5
+	.byte	0xe			/* DW_CFA_def_cfa_offset */
+	.uleb128 208
+	.byte	0xa			/* DW_CFA_remember_state */
+
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.long	.LUW7-.LUW6
+	.byte	0xe			/* DW_CFA_def_cfa_offset */
+	.uleb128 8
+
+	.byte	0x4			/* DW_CFA_advance_loc4 */
+	.long	.LUW8-.LUW7
+	.byte	0xb			/* DW_CFA_restore_state */
+
+	.align 8
+.LEFDE3:
+
+#endif /* __x86_64__ */
+
+#if defined __ELF__ && defined __linux__
+	.section	.note.GNU-stack,"",@progbits
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win32.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win32.S
new file mode 100644
index 0000000..06c893f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win32.S
@@ -0,0 +1,1065 @@
+/* -----------------------------------------------------------------------
+   win32.S - Copyright (c) 1996, 1998, 2001, 2002, 2009  Red Hat, Inc.
+	     Copyright (c) 2001  John Beniton
+	     Copyright (c) 2002  Ranjit Mathew
+	     Copyright (c) 2009  Daniel Witte
+			
+ 
+   X86 Foreign Function Interface
+ 
+   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.
+   -----------------------------------------------------------------------
+   */
+ 
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+
+#ifdef _MSC_VER
+
+.386
+.MODEL FLAT, C
+
+EXTRN ffi_closure_SYSV_inner:NEAR
+
+_TEXT SEGMENT
+
+ffi_call_win32 PROC NEAR,
+    ffi_prep_args : NEAR PTR DWORD,
+    ecif          : NEAR PTR DWORD,
+    cif_bytes     : DWORD,
+    cif_flags     : DWORD,
+    rvalue        : NEAR PTR DWORD,
+    fn            : NEAR PTR DWORD
+
+        ;; Make room for all of the new args.
+        mov  ecx, cif_bytes
+        sub  esp, ecx
+
+        mov  eax, esp
+
+        ;; Place all of the ffi_prep_args in position
+        push ecif
+        push eax
+        call ffi_prep_args
+
+        ;; Return stack to previous state and call the function
+        add  esp, 8
+
+        call fn
+
+        ;; cdecl:   we restore esp in the epilogue, so there's no need to
+        ;;          remove the space we pushed for the args.
+        ;; stdcall: the callee has already cleaned the stack.
+
+        ;; Load ecx with the return type code
+        mov  ecx, cif_flags
+
+        ;; If the return value pointer is NULL, assume no return value.
+        cmp  rvalue, 0
+        jne  ca_jumptable
+
+        ;; Even if there is no space for the return value, we are
+        ;; obliged to handle floating-point values.
+        cmp  ecx, FFI_TYPE_FLOAT
+        jne  ca_epilogue
+        fstp st(0)
+
+        jmp  ca_epilogue
+
+ca_jumptable:
+        jmp  [ca_jumpdata + 4 * ecx]
+ca_jumpdata:
+        ;; Do not insert anything here between label and jump table.
+        dd offset ca_epilogue       ;; FFI_TYPE_VOID
+        dd offset ca_retint         ;; FFI_TYPE_INT
+        dd offset ca_retfloat       ;; FFI_TYPE_FLOAT
+        dd offset ca_retdouble      ;; FFI_TYPE_DOUBLE
+        dd offset ca_retlongdouble  ;; FFI_TYPE_LONGDOUBLE
+        dd offset ca_retint8        ;; FFI_TYPE_UINT8
+        dd offset ca_retint8        ;; FFI_TYPE_SINT8
+        dd offset ca_retint16       ;; FFI_TYPE_UINT16
+        dd offset ca_retint16       ;; FFI_TYPE_SINT16
+        dd offset ca_retint         ;; FFI_TYPE_UINT32
+        dd offset ca_retint         ;; FFI_TYPE_SINT32
+        dd offset ca_retint64       ;; FFI_TYPE_UINT64
+        dd offset ca_retint64       ;; FFI_TYPE_SINT64
+        dd offset ca_epilogue       ;; FFI_TYPE_STRUCT
+        dd offset ca_retint         ;; FFI_TYPE_POINTER
+        dd offset ca_retint8        ;; FFI_TYPE_SMALL_STRUCT_1B
+        dd offset ca_retint16       ;; FFI_TYPE_SMALL_STRUCT_2B
+        dd offset ca_retint         ;; FFI_TYPE_SMALL_STRUCT_4B
+
+ca_retint8:
+        ;; Load %ecx with the pointer to storage for the return value
+        mov   ecx, rvalue
+        mov   [ecx + 0], al
+        jmp   ca_epilogue
+
+ca_retint16:
+        ;; Load %ecx with the pointer to storage for the return value
+        mov   ecx, rvalue
+        mov   [ecx + 0], ax
+        jmp   ca_epilogue
+
+ca_retint:
+        ;; Load %ecx with the pointer to storage for the return value
+        mov   ecx, rvalue
+        mov   [ecx + 0], eax
+        jmp   ca_epilogue
+
+ca_retint64:
+        ;; Load %ecx with the pointer to storage for the return value
+        mov   ecx, rvalue
+        mov   [ecx + 0], eax
+        mov   [ecx + 4], edx
+        jmp   ca_epilogue
+
+ca_retfloat:
+        ;; Load %ecx with the pointer to storage for the return value
+        mov   ecx, rvalue
+        fstp  DWORD PTR [ecx]
+        jmp   ca_epilogue
+
+ca_retdouble:
+        ;; Load %ecx with the pointer to storage for the return value
+        mov   ecx, rvalue
+        fstp  QWORD PTR [ecx]
+        jmp   ca_epilogue
+
+ca_retlongdouble:
+        ;; Load %ecx with the pointer to storage for the return value
+        mov   ecx, rvalue
+        fstp  TBYTE PTR [ecx]
+        jmp   ca_epilogue
+
+ca_epilogue:
+        ;; Epilogue code is autogenerated.
+        ret
+ffi_call_win32 ENDP
+
+ffi_closure_SYSV PROC NEAR <FORCEFRAME>
+    ;; the ffi_closure ctx is passed in eax by the trampoline.
+
+        sub  esp, 40
+        lea  edx, [ebp - 24]
+        mov  [ebp - 12], edx         ;; resp
+        lea  edx, [ebp + 8]
+        mov  [esp + 8], edx          ;; args
+        lea  edx, [ebp - 12]
+        mov  [esp + 4], edx          ;; &resp
+        mov  [esp], eax              ;; closure
+        call ffi_closure_SYSV_inner
+        mov  ecx, [ebp - 12]
+
+cs_jumptable:
+        jmp  [cs_jumpdata + 4 * eax]
+cs_jumpdata:
+        ;; Do not insert anything here between the label and jump table.
+        dd offset cs_epilogue       ;; FFI_TYPE_VOID
+        dd offset cs_retint         ;; FFI_TYPE_INT
+        dd offset cs_retfloat       ;; FFI_TYPE_FLOAT
+        dd offset cs_retdouble      ;; FFI_TYPE_DOUBLE
+        dd offset cs_retlongdouble  ;; FFI_TYPE_LONGDOUBLE
+        dd offset cs_retint8        ;; FFI_TYPE_UINT8
+        dd offset cs_retint8        ;; FFI_TYPE_SINT8
+        dd offset cs_retint16       ;; FFI_TYPE_UINT16
+        dd offset cs_retint16       ;; FFI_TYPE_SINT16
+        dd offset cs_retint         ;; FFI_TYPE_UINT32
+        dd offset cs_retint         ;; FFI_TYPE_SINT32
+        dd offset cs_retint64       ;; FFI_TYPE_UINT64
+        dd offset cs_retint64       ;; FFI_TYPE_SINT64
+        dd offset cs_retstruct      ;; FFI_TYPE_STRUCT
+        dd offset cs_retint         ;; FFI_TYPE_POINTER
+        dd offset cs_retint8        ;; FFI_TYPE_SMALL_STRUCT_1B
+        dd offset cs_retint16       ;; FFI_TYPE_SMALL_STRUCT_2B
+        dd offset cs_retint         ;; FFI_TYPE_SMALL_STRUCT_4B
+
+cs_retint8:
+        mov   al, [ecx]
+        jmp   cs_epilogue
+
+cs_retint16:
+        mov   ax, [ecx]
+        jmp   cs_epilogue
+
+cs_retint:
+        mov   eax, [ecx]
+        jmp   cs_epilogue
+
+cs_retint64:
+        mov   eax, [ecx + 0]
+        mov   edx, [ecx + 4]
+        jmp   cs_epilogue
+
+cs_retfloat:
+        fld   DWORD PTR [ecx]
+        jmp   cs_epilogue
+
+cs_retdouble:
+        fld   QWORD PTR [ecx]
+        jmp   cs_epilogue
+
+cs_retlongdouble:
+        fld   TBYTE PTR [ecx]
+        jmp   cs_epilogue
+
+cs_retstruct:
+        ;; Caller expects us to pop struct return value pointer hidden arg.
+        ;; Epilogue code is autogenerated.
+        ret	4
+
+cs_epilogue:
+        ;; Epilogue code is autogenerated.
+        ret
+ffi_closure_SYSV ENDP
+
+#if !FFI_NO_RAW_API
+
+#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) AND NOT 3)
+#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
+#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
+#define CIF_FLAGS_OFFSET 20
+
+ffi_closure_raw_SYSV PROC NEAR USES esi
+    ;; the ffi_closure ctx is passed in eax by the trampoline.
+
+        sub  esp, 40
+        mov  esi, [eax + RAW_CLOSURE_CIF_OFFSET]        ;; closure->cif
+        mov  edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET]  ;; closure->user_data
+        mov  [esp + 12], edx                            ;; user_data
+        lea  edx, [ebp + 8]
+        mov  [esp + 8], edx                             ;; raw_args
+        lea  edx, [ebp - 24]
+        mov  [esp + 4], edx                             ;; &res
+        mov  [esp], esi                                 ;; cif
+        call DWORD PTR [eax + RAW_CLOSURE_FUN_OFFSET]   ;; closure->fun
+        mov  eax, [esi + CIF_FLAGS_OFFSET]              ;; cif->flags
+        lea  ecx, [ebp - 24]
+
+cr_jumptable:
+        jmp  [cr_jumpdata + 4 * eax]
+cr_jumpdata:
+        ;; Do not insert anything here between the label and jump table.
+        dd offset cr_epilogue       ;; FFI_TYPE_VOID
+        dd offset cr_retint         ;; FFI_TYPE_INT
+        dd offset cr_retfloat       ;; FFI_TYPE_FLOAT
+        dd offset cr_retdouble      ;; FFI_TYPE_DOUBLE
+        dd offset cr_retlongdouble  ;; FFI_TYPE_LONGDOUBLE
+        dd offset cr_retint8        ;; FFI_TYPE_UINT8
+        dd offset cr_retint8        ;; FFI_TYPE_SINT8
+        dd offset cr_retint16       ;; FFI_TYPE_UINT16
+        dd offset cr_retint16       ;; FFI_TYPE_SINT16
+        dd offset cr_retint         ;; FFI_TYPE_UINT32
+        dd offset cr_retint         ;; FFI_TYPE_SINT32
+        dd offset cr_retint64       ;; FFI_TYPE_UINT64
+        dd offset cr_retint64       ;; FFI_TYPE_SINT64
+        dd offset cr_epilogue       ;; FFI_TYPE_STRUCT
+        dd offset cr_retint         ;; FFI_TYPE_POINTER
+        dd offset cr_retint8        ;; FFI_TYPE_SMALL_STRUCT_1B
+        dd offset cr_retint16       ;; FFI_TYPE_SMALL_STRUCT_2B
+        dd offset cr_retint         ;; FFI_TYPE_SMALL_STRUCT_4B
+
+cr_retint8:
+        mov   al, [ecx]
+        jmp   cr_epilogue
+
+cr_retint16:
+        mov   ax, [ecx]
+        jmp   cr_epilogue
+
+cr_retint:
+        mov   eax, [ecx]
+        jmp   cr_epilogue
+
+cr_retint64:
+        mov   eax, [ecx + 0]
+        mov   edx, [ecx + 4]
+        jmp   cr_epilogue
+
+cr_retfloat:
+        fld   DWORD PTR [ecx]
+        jmp   cr_epilogue
+
+cr_retdouble:
+        fld   QWORD PTR [ecx]
+        jmp   cr_epilogue
+
+cr_retlongdouble:
+        fld   TBYTE PTR [ecx]
+        jmp   cr_epilogue
+
+cr_epilogue:
+        ;; Epilogue code is autogenerated.
+        ret
+ffi_closure_raw_SYSV ENDP
+
+#endif /* !FFI_NO_RAW_API */
+
+ffi_closure_STDCALL PROC NEAR <FORCEFRAME>
+    ;; the ffi_closure ctx is passed in eax by the trampoline.
+
+        sub  esp, 40
+        lea  edx, [ebp - 24]
+        mov  [ebp - 12], edx         ;; resp
+        lea  edx, [ebp + 12]         ;; account for stub return address on stack
+        mov  [esp + 8], edx          ;; args
+        lea  edx, [ebp - 12]
+        mov  [esp + 4], edx          ;; &resp
+        mov  [esp], eax              ;; closure
+        call ffi_closure_SYSV_inner
+        mov  ecx, [ebp - 12]
+
+cd_jumptable:
+        jmp  [cd_jumpdata + 4 * eax]
+cd_jumpdata:
+        ;; Do not insert anything here between the label and jump table.
+        dd offset cd_epilogue       ;; FFI_TYPE_VOID
+        dd offset cd_retint         ;; FFI_TYPE_INT
+        dd offset cd_retfloat       ;; FFI_TYPE_FLOAT
+        dd offset cd_retdouble      ;; FFI_TYPE_DOUBLE
+        dd offset cd_retlongdouble  ;; FFI_TYPE_LONGDOUBLE
+        dd offset cd_retint8        ;; FFI_TYPE_UINT8
+        dd offset cd_retint8        ;; FFI_TYPE_SINT8
+        dd offset cd_retint16       ;; FFI_TYPE_UINT16
+        dd offset cd_retint16       ;; FFI_TYPE_SINT16
+        dd offset cd_retint         ;; FFI_TYPE_UINT32
+        dd offset cd_retint         ;; FFI_TYPE_SINT32
+        dd offset cd_retint64       ;; FFI_TYPE_UINT64
+        dd offset cd_retint64       ;; FFI_TYPE_SINT64
+        dd offset cd_epilogue       ;; FFI_TYPE_STRUCT
+        dd offset cd_retint         ;; FFI_TYPE_POINTER
+        dd offset cd_retint8        ;; FFI_TYPE_SMALL_STRUCT_1B
+        dd offset cd_retint16       ;; FFI_TYPE_SMALL_STRUCT_2B
+        dd offset cd_retint         ;; FFI_TYPE_SMALL_STRUCT_4B
+
+cd_retint8:
+        mov   al, [ecx]
+        jmp   cd_epilogue
+
+cd_retint16:
+        mov   ax, [ecx]
+        jmp   cd_epilogue
+
+cd_retint:
+        mov   eax, [ecx]
+        jmp   cd_epilogue
+
+cd_retint64:
+        mov   eax, [ecx + 0]
+        mov   edx, [ecx + 4]
+        jmp   cd_epilogue
+
+cd_retfloat:
+        fld   DWORD PTR [ecx]
+        jmp   cd_epilogue
+
+cd_retdouble:
+        fld   QWORD PTR [ecx]
+        jmp   cd_epilogue
+
+cd_retlongdouble:
+        fld   TBYTE PTR [ecx]
+        jmp   cd_epilogue
+
+cd_epilogue:
+        ;; Epilogue code is autogenerated.
+        ret
+ffi_closure_STDCALL ENDP
+
+_TEXT ENDS
+END
+
+#else
+
+	.text
+ 
+        # This assumes we are using gas.
+        .balign 16
+	.globl	_ffi_call_win32
+#ifndef __OS2__
+	.def	_ffi_call_win32;	.scl	2;	.type	32;	.endef
+#endif
+_ffi_call_win32:
+.LFB1:
+        pushl %ebp
+.LCFI0:
+        movl  %esp,%ebp
+.LCFI1:
+        # Make room for all of the new args.
+        movl  16(%ebp),%ecx                                                     
+        subl  %ecx,%esp
+ 
+        movl  %esp,%eax
+ 
+        # Place all of the ffi_prep_args in position
+        pushl 12(%ebp)
+        pushl %eax
+        call  *8(%ebp)
+ 
+        # Return stack to previous state and call the function
+        addl  $8,%esp
+ 
+        # FIXME: Align the stack to a 128-bit boundary to avoid
+        # potential performance hits.
+
+        call  *28(%ebp)
+ 
+        # stdcall functions pop arguments off the stack themselves
+
+        # Load %ecx with the return type code
+        movl  20(%ebp),%ecx
+ 
+        # If the return value pointer is NULL, assume no return value.
+        cmpl  $0,24(%ebp)
+        jne   0f
+ 
+        # Even if there is no space for the return value, we are
+        # obliged to handle floating-point values.
+        cmpl  $FFI_TYPE_FLOAT,%ecx
+        jne   .Lnoretval
+        fstp  %st(0)
+ 
+        jmp   .Lepilogue
+
+0:
+	call	1f
+	# Do not insert anything here between the call and the jump table.
+.Lstore_table:
+	.long	.Lnoretval		/* FFI_TYPE_VOID */
+	.long	.Lretint		/* FFI_TYPE_INT */
+	.long	.Lretfloat		/* FFI_TYPE_FLOAT */
+	.long	.Lretdouble		/* FFI_TYPE_DOUBLE */
+	.long	.Lretlongdouble		/* FFI_TYPE_LONGDOUBLE */
+	.long	.Lretuint8		/* FFI_TYPE_UINT8 */
+	.long	.Lretsint8		/* FFI_TYPE_SINT8 */
+	.long	.Lretuint16		/* FFI_TYPE_UINT16 */
+	.long	.Lretsint16		/* FFI_TYPE_SINT16 */
+	.long	.Lretint		/* FFI_TYPE_UINT32 */
+	.long	.Lretint		/* FFI_TYPE_SINT32 */
+	.long	.Lretint64		/* FFI_TYPE_UINT64 */
+	.long	.Lretint64		/* FFI_TYPE_SINT64 */
+	.long	.Lretstruct		/* FFI_TYPE_STRUCT */
+	.long	.Lretint		/* FFI_TYPE_POINTER */
+	.long	.Lretstruct1b		/* FFI_TYPE_SMALL_STRUCT_1B */
+	.long	.Lretstruct2b		/* FFI_TYPE_SMALL_STRUCT_2B */
+	.long	.Lretstruct4b		/* FFI_TYPE_SMALL_STRUCT_4B */
+1:
+	add	%ecx, %ecx
+	add	%ecx, %ecx
+	add	(%esp),%ecx
+	add	$4, %esp
+	jmp	*(%ecx)
+
+	/* Sign/zero extend as appropriate.  */
+.Lretsint8:
+	movsbl	%al, %eax
+	jmp	.Lretint
+
+.Lretsint16:
+	movswl	%ax, %eax
+	jmp	.Lretint
+
+.Lretuint8:
+	movzbl	%al, %eax
+	jmp	.Lretint
+
+.Lretuint16:
+	movzwl	%ax, %eax
+	jmp	.Lretint
+
+.Lretint:
+        # Load %ecx with the pointer to storage for the return value
+        movl  24(%ebp),%ecx
+        movl  %eax,0(%ecx)
+        jmp   .Lepilogue
+ 
+.Lretfloat:
+         # Load %ecx with the pointer to storage for the return value
+        movl  24(%ebp),%ecx
+        fstps (%ecx)
+        jmp   .Lepilogue
+ 
+.Lretdouble:
+        # Load %ecx with the pointer to storage for the return value
+        movl  24(%ebp),%ecx
+        fstpl (%ecx)
+        jmp   .Lepilogue
+ 
+.Lretlongdouble:
+        # Load %ecx with the pointer to storage for the return value
+        movl  24(%ebp),%ecx
+        fstpt (%ecx)
+        jmp   .Lepilogue
+ 
+.Lretint64:
+        # Load %ecx with the pointer to storage for the return value
+        movl  24(%ebp),%ecx
+        movl  %eax,0(%ecx)
+        movl  %edx,4(%ecx)
+	jmp   .Lepilogue
+
+.Lretstruct1b:
+        # Load %ecx with the pointer to storage for the return value
+        movl  24(%ebp),%ecx
+        movb  %al,0(%ecx)
+        jmp   .Lepilogue
+ 
+.Lretstruct2b:
+        # Load %ecx with the pointer to storage for the return value
+        movl  24(%ebp),%ecx
+        movw  %ax,0(%ecx)
+        jmp   .Lepilogue
+
+.Lretstruct4b:
+        # Load %ecx with the pointer to storage for the return value
+        movl  24(%ebp),%ecx
+        movl  %eax,0(%ecx)
+        jmp   .Lepilogue
+
+.Lretstruct:
+        # Nothing to do!
+ 
+.Lnoretval:
+.Lepilogue:
+        movl %ebp,%esp
+        popl %ebp
+        ret
+.ffi_call_win32_end:
+.LFE1:
+
+        # This assumes we are using gas.
+        .balign 16
+	.globl	_ffi_closure_SYSV
+#ifndef __OS2__
+	.def	_ffi_closure_SYSV;	.scl	2;	.type	32;	.endef
+#endif
+_ffi_closure_SYSV:
+.LFB3:
+	pushl	%ebp
+.LCFI4:
+	movl	%esp, %ebp
+.LCFI5:
+	subl	$40, %esp
+	leal	-24(%ebp), %edx
+	movl	%edx, -12(%ebp)	/* resp */
+	leal	8(%ebp), %edx
+	movl	%edx, 4(%esp)	/* args = __builtin_dwarf_cfa () */
+	leal	-12(%ebp), %edx
+	movl	%edx, (%esp)	/* &resp */
+	call	_ffi_closure_SYSV_inner
+	movl	-12(%ebp), %ecx
+
+0:
+	call	1f
+	# Do not insert anything here between the call and the jump table.
+.Lcls_store_table:
+	.long	.Lcls_noretval		/* FFI_TYPE_VOID */
+	.long	.Lcls_retint		/* FFI_TYPE_INT */
+	.long	.Lcls_retfloat		/* FFI_TYPE_FLOAT */
+	.long	.Lcls_retdouble		/* FFI_TYPE_DOUBLE */
+	.long	.Lcls_retldouble	/* FFI_TYPE_LONGDOUBLE */
+	.long	.Lcls_retuint8		/* FFI_TYPE_UINT8 */
+	.long	.Lcls_retsint8		/* FFI_TYPE_SINT8 */
+	.long	.Lcls_retuint16		/* FFI_TYPE_UINT16 */
+	.long	.Lcls_retsint16		/* FFI_TYPE_SINT16 */
+	.long	.Lcls_retint		/* FFI_TYPE_UINT32 */
+	.long	.Lcls_retint		/* FFI_TYPE_SINT32 */
+	.long	.Lcls_retllong		/* FFI_TYPE_UINT64 */
+	.long	.Lcls_retllong		/* FFI_TYPE_SINT64 */
+	.long	.Lcls_retstruct		/* FFI_TYPE_STRUCT */
+	.long	.Lcls_retint		/* FFI_TYPE_POINTER */
+	.long	.Lcls_retstruct1	/* FFI_TYPE_SMALL_STRUCT_1B */
+	.long	.Lcls_retstruct2	/* FFI_TYPE_SMALL_STRUCT_2B */
+	.long	.Lcls_retstruct4	/* FFI_TYPE_SMALL_STRUCT_4B */
+
+1:
+	add	%eax, %eax
+	add	%eax, %eax
+	add	(%esp),%eax
+	add	$4, %esp
+	jmp	*(%eax)
+
+	/* Sign/zero extend as appropriate.  */
+.Lcls_retsint8:
+	movsbl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+
+.Lcls_retsint16:
+	movswl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+
+.Lcls_retuint8:
+	movzbl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+
+.Lcls_retuint16:
+	movzwl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+
+.Lcls_retint:
+	movl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+
+.Lcls_retfloat:
+	flds	(%ecx)
+	jmp	.Lcls_epilogue
+
+.Lcls_retdouble:
+	fldl	(%ecx)
+	jmp	.Lcls_epilogue
+
+.Lcls_retldouble:
+	fldt	(%ecx)
+	jmp	.Lcls_epilogue
+
+.Lcls_retllong:
+	movl	(%ecx), %eax
+	movl	4(%ecx), %edx
+	jmp	.Lcls_epilogue
+
+.Lcls_retstruct1:
+	movsbl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+
+.Lcls_retstruct2:
+	movswl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+
+.Lcls_retstruct4:
+	movl	(%ecx), %eax
+	jmp	.Lcls_epilogue
+
+.Lcls_retstruct:
+        # Caller expects us to pop struct return value pointer hidden arg.
+	movl	%ebp, %esp
+	popl	%ebp
+	ret	$0x4
+
+.Lcls_noretval:
+.Lcls_epilogue:
+	movl	%ebp, %esp
+	popl	%ebp
+	ret
+.ffi_closure_SYSV_end:
+.LFE3:
+
+#if !FFI_NO_RAW_API
+
+#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
+#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
+#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
+#define CIF_FLAGS_OFFSET 20
+
+        # This assumes we are using gas.
+        .balign 16
+	.globl	_ffi_closure_raw_SYSV
+#ifndef __OS2__
+	.def	_ffi_closure_raw_SYSV;	.scl	2;	.type	32;	.endef
+#endif
+_ffi_closure_raw_SYSV:
+.LFB4:
+	pushl	%ebp
+.LCFI6:
+	movl	%esp, %ebp
+.LCFI7:
+	pushl	%esi
+.LCFI8:
+	subl	$36, %esp
+	movl	RAW_CLOSURE_CIF_OFFSET(%eax), %esi	 /* closure->cif */
+	movl	RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
+	movl	%edx, 12(%esp)	/* user_data */
+	leal	8(%ebp), %edx	/* __builtin_dwarf_cfa () */
+	movl	%edx, 8(%esp)	/* raw_args */
+	leal	-24(%ebp), %edx
+	movl	%edx, 4(%esp)	/* &res */
+	movl	%esi, (%esp)	/* cif */
+	call	*RAW_CLOSURE_FUN_OFFSET(%eax)		 /* closure->fun */
+	movl	CIF_FLAGS_OFFSET(%esi), %eax		 /* rtype */
+0:
+	call	1f
+	# Do not insert anything here between the call and the jump table.
+.Lrcls_store_table:
+	.long	.Lrcls_noretval		/* FFI_TYPE_VOID */
+	.long	.Lrcls_retint		/* FFI_TYPE_INT */
+	.long	.Lrcls_retfloat		/* FFI_TYPE_FLOAT */
+	.long	.Lrcls_retdouble	/* FFI_TYPE_DOUBLE */
+	.long	.Lrcls_retldouble	/* FFI_TYPE_LONGDOUBLE */
+	.long	.Lrcls_retuint8		/* FFI_TYPE_UINT8 */
+	.long	.Lrcls_retsint8		/* FFI_TYPE_SINT8 */
+	.long	.Lrcls_retuint16	/* FFI_TYPE_UINT16 */
+	.long	.Lrcls_retsint16	/* FFI_TYPE_SINT16 */
+	.long	.Lrcls_retint		/* FFI_TYPE_UINT32 */
+	.long	.Lrcls_retint		/* FFI_TYPE_SINT32 */
+	.long	.Lrcls_retllong		/* FFI_TYPE_UINT64 */
+	.long	.Lrcls_retllong		/* FFI_TYPE_SINT64 */
+	.long	.Lrcls_retstruct	/* FFI_TYPE_STRUCT */
+	.long	.Lrcls_retint		/* FFI_TYPE_POINTER */
+	.long	.Lrcls_retstruct1	/* FFI_TYPE_SMALL_STRUCT_1B */
+	.long	.Lrcls_retstruct2	/* FFI_TYPE_SMALL_STRUCT_2B */
+	.long	.Lrcls_retstruct4	/* FFI_TYPE_SMALL_STRUCT_4B */
+1:
+	add	%eax, %eax
+	add	%eax, %eax
+	add	(%esp),%eax
+	add	$4, %esp
+	jmp	*(%eax)
+
+	/* Sign/zero extend as appropriate.  */
+.Lrcls_retsint8:
+	movsbl	-24(%ebp), %eax
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retsint16:
+	movswl	-24(%ebp), %eax
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retuint8:
+	movzbl	-24(%ebp), %eax
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retuint16:
+	movzwl	-24(%ebp), %eax
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retint:
+	movl	-24(%ebp), %eax
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retfloat:
+	flds	-24(%ebp)
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retdouble:
+	fldl	-24(%ebp)
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retldouble:
+	fldt	-24(%ebp)
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retllong:
+	movl	-24(%ebp), %eax
+	movl	-20(%ebp), %edx
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retstruct1:
+	movsbl	-24(%ebp), %eax
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retstruct2:
+	movswl	-24(%ebp), %eax
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retstruct4:
+	movl	-24(%ebp), %eax
+	jmp	.Lrcls_epilogue
+
+.Lrcls_retstruct:
+	# Nothing to do!
+
+.Lrcls_noretval:
+.Lrcls_epilogue:
+	addl	$36, %esp
+	popl	%esi
+	popl	%ebp
+	ret
+.ffi_closure_raw_SYSV_end:
+.LFE4:
+
+#endif /* !FFI_NO_RAW_API */
+
+        # This assumes we are using gas.
+	.balign	16
+	.globl	_ffi_closure_STDCALL
+#ifndef __OS2__
+	.def	_ffi_closure_STDCALL;	.scl	2;	.type	32;	.endef
+#endif
+_ffi_closure_STDCALL:
+.LFB5:
+	pushl	%ebp
+.LCFI9:
+	movl	%esp, %ebp
+.LCFI10:
+	subl	$40, %esp
+	leal	-24(%ebp), %edx
+	movl	%edx, -12(%ebp)	/* resp */
+	leal	12(%ebp), %edx  /* account for stub return address on stack */
+	movl	%edx, 4(%esp)	/* args */
+	leal	-12(%ebp), %edx
+	movl	%edx, (%esp)	/* &resp */
+	call	_ffi_closure_SYSV_inner
+	movl	-12(%ebp), %ecx
+0:
+	call	1f
+	# Do not insert anything here between the call and the jump table.
+.Lscls_store_table:
+	.long	.Lscls_noretval		/* FFI_TYPE_VOID */
+	.long	.Lscls_retint		/* FFI_TYPE_INT */
+	.long	.Lscls_retfloat		/* FFI_TYPE_FLOAT */
+	.long	.Lscls_retdouble	/* FFI_TYPE_DOUBLE */
+	.long	.Lscls_retldouble	/* FFI_TYPE_LONGDOUBLE */
+	.long	.Lscls_retuint8		/* FFI_TYPE_UINT8 */
+	.long	.Lscls_retsint8		/* FFI_TYPE_SINT8 */
+	.long	.Lscls_retuint16	/* FFI_TYPE_UINT16 */
+	.long	.Lscls_retsint16	/* FFI_TYPE_SINT16 */
+	.long	.Lscls_retint		/* FFI_TYPE_UINT32 */
+	.long	.Lscls_retint		/* FFI_TYPE_SINT32 */
+	.long	.Lscls_retllong		/* FFI_TYPE_UINT64 */
+	.long	.Lscls_retllong		/* FFI_TYPE_SINT64 */
+	.long	.Lscls_retstruct	/* FFI_TYPE_STRUCT */
+	.long	.Lscls_retint		/* FFI_TYPE_POINTER */
+	.long	.Lscls_retstruct1	/* FFI_TYPE_SMALL_STRUCT_1B */
+	.long	.Lscls_retstruct2	/* FFI_TYPE_SMALL_STRUCT_2B */
+	.long	.Lscls_retstruct4	/* FFI_TYPE_SMALL_STRUCT_4B */
+1:
+	add	%eax, %eax
+	add	%eax, %eax
+	add	(%esp),%eax
+	add	$4, %esp
+	jmp	*(%eax)
+
+	/* Sign/zero extend as appropriate.  */
+.Lscls_retsint8:
+	movsbl	(%ecx), %eax
+	jmp	.Lscls_epilogue
+
+.Lscls_retsint16:
+	movswl	(%ecx), %eax
+	jmp	.Lscls_epilogue
+
+.Lscls_retuint8:
+	movzbl	(%ecx), %eax
+	jmp	.Lscls_epilogue
+
+.Lscls_retuint16:
+	movzwl	(%ecx), %eax
+	jmp	.Lscls_epilogue
+
+.Lscls_retint:
+	movl	(%ecx), %eax
+	jmp	.Lscls_epilogue
+
+.Lscls_retfloat:
+	flds	(%ecx)
+	jmp	.Lscls_epilogue
+
+.Lscls_retdouble:
+	fldl	(%ecx)
+	jmp	.Lscls_epilogue
+
+.Lscls_retldouble:
+	fldt	(%ecx)
+	jmp	.Lscls_epilogue
+
+.Lscls_retllong:
+	movl	(%ecx), %eax
+	movl	4(%ecx), %edx
+	jmp	.Lscls_epilogue
+
+.Lscls_retstruct1:
+	movsbl	(%ecx), %eax
+	jmp	.Lscls_epilogue
+
+.Lscls_retstruct2:
+	movswl	(%ecx), %eax
+	jmp	.Lscls_epilogue
+
+.Lscls_retstruct4:
+	movl	(%ecx), %eax
+	jmp	.Lscls_epilogue
+
+.Lscls_retstruct:
+	# Nothing to do!
+
+.Lscls_noretval:
+.Lscls_epilogue:
+	movl	%ebp, %esp
+	popl	%ebp
+	ret
+.ffi_closure_STDCALL_end:
+.LFE5:
+
+#ifndef __OS2__
+	.section	.eh_frame,"w"
+#endif
+.Lframe1:
+.LSCIE1:
+	.long	.LECIE1-.LASCIE1  /* Length of Common Information Entry */
+.LASCIE1:
+	.long	0x0	/* CIE Identifier Tag */
+	.byte	0x1	/* CIE Version */
+#ifdef __PIC__
+	.ascii "zR\0"	/* CIE Augmentation */
+#else
+	.ascii "\0"	/* CIE Augmentation */
+#endif
+	.byte	0x1	/* .uleb128 0x1; CIE Code Alignment Factor */
+	.byte	0x7c	/* .sleb128 -4; CIE Data Alignment Factor */
+	.byte	0x8	/* CIE RA Column */
+#ifdef __PIC__
+	.byte	0x1	/* .uleb128 0x1; Augmentation size */
+	.byte	0x1b	/* FDE Encoding (pcrel sdata4) */
+#endif
+	.byte	0xc	/* DW_CFA_def_cfa CFA = r4 + 4 = 4(%esp) */
+	.byte	0x4	/* .uleb128 0x4 */
+	.byte	0x4	/* .uleb128 0x4 */
+	.byte	0x88	/* DW_CFA_offset, column 0x8 %eip at CFA + 1 * -4 */
+	.byte	0x1	/* .uleb128 0x1 */
+	.align 4
+.LECIE1:
+
+.LSFDE1:
+	.long	.LEFDE1-.LASFDE1	/* FDE Length */
+.LASFDE1:
+	.long	.LASFDE1-.Lframe1	/* FDE CIE offset */
+#if defined __PIC__ && defined HAVE_AS_X86_PCREL
+	.long	.LFB1-.	/* FDE initial location */
+#else
+	.long	.LFB1
+#endif
+	.long	.LFE1-.LFB1	/* FDE address range */
+#ifdef __PIC__
+	.byte	0x0	/* .uleb128 0x0; Augmentation size */
+#endif
+	/* DW_CFA_xxx CFI instructions go here.  */
+
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI0-.LFB1
+	.byte	0xe	/* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
+	.byte	0x8	/* .uleb128 0x8 */
+	.byte	0x85	/* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
+	.byte	0x2	/* .uleb128 0x2 */
+
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI1-.LCFI0
+	.byte	0xd	/* DW_CFA_def_cfa_register CFA = r5 = %ebp */
+	.byte	0x5	/* .uleb128 0x5 */
+
+	/* End of DW_CFA_xxx CFI instructions.  */
+	.align 4
+.LEFDE1:
+
+
+.LSFDE3:
+	.long	.LEFDE3-.LASFDE3	/* FDE Length */
+.LASFDE3:
+	.long	.LASFDE3-.Lframe1	/* FDE CIE offset */
+#if defined __PIC__ && defined HAVE_AS_X86_PCREL
+	.long	.LFB3-.	/* FDE initial location */
+#else
+	.long	.LFB3
+#endif
+	.long	.LFE3-.LFB3	/* FDE address range */
+#ifdef __PIC__
+	.byte	0x0	/* .uleb128 0x0; Augmentation size */
+#endif
+	/* DW_CFA_xxx CFI instructions go here.  */
+
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI4-.LFB3
+	.byte	0xe	/* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
+	.byte	0x8	/* .uleb128 0x8 */
+	.byte	0x85	/* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
+	.byte	0x2	/* .uleb128 0x2 */
+
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI5-.LCFI4
+	.byte	0xd	/* DW_CFA_def_cfa_register CFA = r5 = %ebp */
+	.byte	0x5	/* .uleb128 0x5 */
+
+	/* End of DW_CFA_xxx CFI instructions.  */
+	.align 4
+.LEFDE3:
+
+#if !FFI_NO_RAW_API
+
+.LSFDE4:
+	.long	.LEFDE4-.LASFDE4	/* FDE Length */
+.LASFDE4:
+	.long	.LASFDE4-.Lframe1	/* FDE CIE offset */
+#if defined __PIC__ && defined HAVE_AS_X86_PCREL
+	.long	.LFB4-.	/* FDE initial location */
+#else
+	.long	.LFB4
+#endif
+	.long	.LFE4-.LFB4	/* FDE address range */
+#ifdef __PIC__
+	.byte	0x0	/* .uleb128 0x0; Augmentation size */
+#endif
+	/* DW_CFA_xxx CFI instructions go here.  */
+
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI6-.LFB4
+	.byte	0xe	/* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
+	.byte	0x8	/* .uleb128 0x8 */
+	.byte	0x85	/* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
+	.byte	0x2	/* .uleb128 0x2 */
+
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI7-.LCFI6
+	.byte	0xd	/* DW_CFA_def_cfa_register CFA = r5 = %ebp */
+	.byte	0x5	/* .uleb128 0x5 */
+
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI8-.LCFI7
+	.byte	0x86	/* DW_CFA_offset, column 0x6 %esi at CFA + 3 * -4 */
+	.byte	0x3	/* .uleb128 0x3 */
+
+	/* End of DW_CFA_xxx CFI instructions.  */
+	.align 4
+.LEFDE4:
+
+#endif /* !FFI_NO_RAW_API */
+
+.LSFDE5:
+	.long	.LEFDE5-.LASFDE5	/* FDE Length */
+.LASFDE5:
+	.long	.LASFDE5-.Lframe1	/* FDE CIE offset */
+#if defined __PIC__ && defined HAVE_AS_X86_PCREL
+	.long	.LFB5-.	/* FDE initial location */
+#else
+	.long	.LFB5
+#endif
+	.long	.LFE5-.LFB5	/* FDE address range */
+#ifdef __PIC__
+	.byte	0x0	/* .uleb128 0x0; Augmentation size */
+#endif
+	/* DW_CFA_xxx CFI instructions go here.  */
+
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI9-.LFB5
+	.byte	0xe	/* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
+	.byte	0x8	/* .uleb128 0x8 */
+	.byte	0x85	/* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
+	.byte	0x2	/* .uleb128 0x2 */
+
+	.byte	0x4	/* DW_CFA_advance_loc4 */
+	.long	.LCFI10-.LCFI9
+	.byte	0xd	/* DW_CFA_def_cfa_register CFA = r5 = %ebp */
+	.byte	0x5	/* .uleb128 0x5 */
+
+	/* End of DW_CFA_xxx CFI instructions.  */
+	.align 4
+.LEFDE5:
+
+#endif /* !_MSC_VER */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win64.S b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win64.S
new file mode 100644
index 0000000..fcdb270
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/src/x86/win64.S
@@ -0,0 +1,468 @@
+#define LIBFFI_ASM
+#include <fficonfig.h>
+#include <ffi.h>
+	
+/* Constants for ffi_call_win64 */	
+#define STACK 0
+#define PREP_ARGS_FN 32
+#define ECIF 40
+#define CIF_BYTES 48
+#define CIF_FLAGS 56
+#define RVALUE 64
+#define FN 72
+
+/* ffi_call_win64 (void (*prep_args_fn)(char *, extended_cif *),
+                   extended_cif *ecif, unsigned bytes, unsigned flags,
+                   unsigned *rvalue, void (*fn)());
+ */
+
+#ifdef _MSC_VER
+PUBLIC	ffi_call_win64
+
+EXTRN	__chkstk:NEAR
+EXTRN	ffi_closure_win64_inner:NEAR
+
+_TEXT	SEGMENT
+
+;;; ffi_closure_win64 will be called with these registers set:
+;;;    rax points to 'closure'
+;;;    r11 contains a bit mask that specifies which of the
+;;;    first four parameters are float or double
+;;;
+;;; It must move the parameters passed in registers to their stack location,
+;;; call ffi_closure_win64_inner for the actual work, then return the result.
+;;; 
+ffi_closure_win64 PROC FRAME
+	;; copy register arguments onto stack
+	test	r11, 1
+	jne	first_is_float	
+	mov	QWORD PTR [rsp+8], rcx
+	jmp	second
+first_is_float:
+	movlpd	QWORD PTR [rsp+8], xmm0
+
+second:
+	test	r11, 2
+	jne	second_is_float	
+	mov	QWORD PTR [rsp+16], rdx
+	jmp	third
+second_is_float:
+	movlpd	QWORD PTR [rsp+16], xmm1
+
+third:
+	test	r11, 4
+	jne	third_is_float	
+	mov	QWORD PTR [rsp+24], r8
+	jmp	fourth
+third_is_float:
+	movlpd	QWORD PTR [rsp+24], xmm2
+
+fourth:
+	test	r11, 8
+	jne	fourth_is_float	
+	mov	QWORD PTR [rsp+32], r9
+	jmp	done
+fourth_is_float:
+	movlpd	QWORD PTR [rsp+32], xmm3
+
+done:
+        .ALLOCSTACK 40
+	sub	rsp, 40
+        .ENDPROLOG
+	mov	rcx, rax	; context is first parameter
+	mov	rdx, rsp	; stack is second parameter
+	add	rdx, 48		; point to start of arguments
+	mov	rax, ffi_closure_win64_inner
+	call	rax		; call the real closure function
+	add	rsp, 40
+	movd	xmm0, rax	; If the closure returned a float,
+                                ; ffi_closure_win64_inner wrote it to rax
+	ret	0
+ffi_closure_win64 ENDP
+
+ffi_call_win64 PROC FRAME
+        ;; copy registers onto stack
+	mov	QWORD PTR [rsp+32], r9
+	mov	QWORD PTR [rsp+24], r8
+	mov	QWORD PTR [rsp+16], rdx
+	mov	QWORD PTR [rsp+8], rcx
+        .PUSHREG rbp
+	push	rbp
+        .ALLOCSTACK 48
+	sub	rsp, 48					; 00000030H
+        .SETFRAME rbp, 32
+	lea	rbp, QWORD PTR [rsp+32]
+        .ENDPROLOG
+
+	mov	eax, DWORD PTR CIF_BYTES[rbp]
+	add	rax, 15
+	and	rax, -16
+	call	__chkstk
+	sub	rsp, rax
+	lea	rax, QWORD PTR [rsp+32]
+	mov	QWORD PTR STACK[rbp], rax
+
+	mov	rdx, QWORD PTR ECIF[rbp]
+	mov	rcx, QWORD PTR STACK[rbp]
+	call	QWORD PTR PREP_ARGS_FN[rbp]
+
+	mov	rsp, QWORD PTR STACK[rbp]
+
+	movlpd	xmm3, QWORD PTR [rsp+24]
+	movd	r9, xmm3
+
+	movlpd	xmm2, QWORD PTR [rsp+16]
+	movd	r8, xmm2
+
+	movlpd	xmm1, QWORD PTR [rsp+8]
+	movd	rdx, xmm1
+
+	movlpd	xmm0, QWORD PTR [rsp]
+	movd	rcx, xmm0
+
+	call	QWORD PTR FN[rbp]
+ret_struct4b$:
+ 	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_4B
+ 	jne	ret_struct2b$
+
+	mov	rcx, QWORD PTR RVALUE[rbp]
+	mov	DWORD PTR [rcx], eax
+	jmp	ret_void$
+
+ret_struct2b$:
+ 	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_2B
+ 	jne	ret_struct1b$
+
+	mov	rcx, QWORD PTR RVALUE[rbp]
+	mov	WORD PTR [rcx], ax
+	jmp	ret_void$
+
+ret_struct1b$:
+ 	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SMALL_STRUCT_1B
+ 	jne	ret_uint8$
+
+	mov	rcx, QWORD PTR RVALUE[rbp]
+	mov	BYTE PTR [rcx], al
+	jmp	ret_void$
+
+ret_uint8$:
+ 	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT8
+ 	jne	ret_sint8$
+
+	mov	rcx, QWORD PTR RVALUE[rbp]
+	movzx   rax, al
+	mov	QWORD PTR [rcx], rax
+	jmp	ret_void$
+
+ret_sint8$:
+ 	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT8
+ 	jne	ret_uint16$
+
+	mov	rcx, QWORD PTR RVALUE[rbp]
+	movsx   rax, al
+	mov	QWORD PTR [rcx], rax
+	jmp	ret_void$
+
+ret_uint16$:
+ 	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT16
+ 	jne	ret_sint16$
+
+	mov	rcx, QWORD PTR RVALUE[rbp]
+	movzx   rax, ax
+	mov	QWORD PTR [rcx], rax
+	jmp	SHORT ret_void$
+
+ret_sint16$:
+ 	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT16
+ 	jne	ret_uint32$
+
+	mov	rcx, QWORD PTR RVALUE[rbp]
+	movsx   rax, ax
+	mov	QWORD PTR [rcx], rax
+	jmp	SHORT ret_void$
+
+ret_uint32$:
+ 	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT32
+ 	jne	ret_sint32$
+
+	mov	rcx, QWORD PTR RVALUE[rbp]
+	mov     eax, eax
+	mov	QWORD PTR [rcx], rax
+	jmp	SHORT ret_void$
+
+ret_sint32$:
+ 	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT32
+ 	jne	ret_float$
+
+	mov	rcx, QWORD PTR RVALUE[rbp]
+	cdqe
+	mov	QWORD PTR [rcx], rax
+	jmp	SHORT ret_void$
+
+ret_float$:
+ 	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_FLOAT
+ 	jne	SHORT ret_double$
+
+ 	mov	rax, QWORD PTR RVALUE[rbp]
+ 	movss	DWORD PTR [rax], xmm0
+ 	jmp	SHORT ret_void$
+
+ret_double$:
+ 	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_DOUBLE
+ 	jne	SHORT ret_sint64$
+
+ 	mov	rax, QWORD PTR RVALUE[rbp]
+ 	movlpd	QWORD PTR [rax], xmm0
+ 	jmp	SHORT ret_void$
+
+ret_sint64$:
+  	cmp	DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT64
+  	jne	ret_void$
+
+ 	mov	rcx, QWORD PTR RVALUE[rbp]
+ 	mov	QWORD PTR [rcx], rax
+ 	jmp	SHORT ret_void$
+	
+ret_void$:
+	xor	rax, rax
+
+	lea	rsp, QWORD PTR [rbp+16]
+	pop	rbp
+	ret	0
+ffi_call_win64 ENDP
+_TEXT	ENDS
+END
+
+#else
+
+#ifdef SYMBOL_UNDERSCORE
+#define SYMBOL_NAME(name) _##name
+#else
+#define SYMBOL_NAME(name) name
+#endif
+
+.text
+
+.extern SYMBOL_NAME(ffi_closure_win64_inner)
+
+# ffi_closure_win64 will be called with these registers set:
+#    rax points to 'closure'
+#    r11 contains a bit mask that specifies which of the
+#    first four parameters are float or double
+#
+# It must move the parameters passed in registers to their stack location,
+# call ffi_closure_win64_inner for the actual work, then return the result.
+# 
+	.balign 16
+        .globl SYMBOL_NAME(ffi_closure_win64)
+SYMBOL_NAME(ffi_closure_win64):
+	# copy register arguments onto stack
+	test	$1,%r11
+	jne	.Lfirst_is_float	
+	mov	%rcx, 8(%rsp)
+	jmp	.Lsecond
+.Lfirst_is_float:
+	movlpd	%xmm0, 8(%rsp)
+
+.Lsecond:
+	test	$2, %r11
+	jne	.Lsecond_is_float	
+	mov	%rdx, 16(%rsp)
+	jmp	.Lthird
+.Lsecond_is_float:
+	movlpd	%xmm1, 16(%rsp)
+
+.Lthird:
+	test	$4, %r11
+	jne	.Lthird_is_float	
+	mov	%r8,24(%rsp)
+	jmp	.Lfourth
+.Lthird_is_float:
+	movlpd	%xmm2, 24(%rsp)
+
+.Lfourth:
+	test	$8, %r11
+	jne	.Lfourth_is_float	
+	mov	%r9, 32(%rsp)
+	jmp	.Ldone
+.Lfourth_is_float:
+	movlpd	%xmm3, 32(%rsp)
+
+.Ldone:
+#.ALLOCSTACK 40
+	sub	$40, %rsp
+#.ENDPROLOG
+	mov	%rax, %rcx	# context is first parameter
+	mov	%rsp, %rdx	# stack is second parameter
+	add	$48, %rdx	# point to start of arguments
+	mov	$SYMBOL_NAME(ffi_closure_win64_inner), %rax
+	callq	*%rax		# call the real closure function
+	add	$40, %rsp
+	movq	%rax, %xmm0	# If the closure returned a float,
+                                # ffi_closure_win64_inner wrote it to rax
+	retq
+.ffi_closure_win64_end:
+
+	.balign 16
+        .globl	SYMBOL_NAME(ffi_call_win64)
+SYMBOL_NAME(ffi_call_win64):
+        # copy registers onto stack
+	mov	%r9,32(%rsp)
+	mov	%r8,24(%rsp)
+	mov	%rdx,16(%rsp)
+	mov	%rcx,8(%rsp)
+        #.PUSHREG rbp
+	push	%rbp
+        #.ALLOCSTACK 48
+	sub	$48,%rsp
+        #.SETFRAME rbp, 32
+	lea	32(%rsp),%rbp
+        #.ENDPROLOG
+
+	mov	CIF_BYTES(%rbp),%eax
+	add	$15, %rax
+	and	$-16, %rax
+	cmpq	$0x1000, %rax
+	jb	Lch_done
+Lch_probe:
+	subq	$0x1000,%rsp
+	orl	$0x0, (%rsp)
+	subq	$0x1000,%rax
+	cmpq	$0x1000,%rax
+	ja	Lch_probe
+Lch_done:
+	subq	%rax, %rsp
+	orl	$0x0, (%rsp)
+	lea	32(%rsp), %rax
+	mov	%rax, STACK(%rbp)
+
+	mov	ECIF(%rbp), %rdx
+	mov	STACK(%rbp), %rcx
+	callq	*PREP_ARGS_FN(%rbp)
+
+	mov	STACK(%rbp), %rsp
+
+	movlpd	24(%rsp), %xmm3
+	movd	%xmm3, %r9
+
+	movlpd	16(%rsp), %xmm2
+	movd	%xmm2, %r8
+
+	movlpd	8(%rsp), %xmm1
+	movd	%xmm1, %rdx
+
+	movlpd	(%rsp), %xmm0
+	movd	%xmm0, %rcx
+
+	callq	*FN(%rbp)
+.Lret_struct4b:
+ 	cmpl	$FFI_TYPE_SMALL_STRUCT_4B, CIF_FLAGS(%rbp)
+ 	jne .Lret_struct2b
+
+	mov	RVALUE(%rbp), %rcx
+	mov	%eax, (%rcx)
+	jmp	.Lret_void
+
+.Lret_struct2b:
+	cmpl	$FFI_TYPE_SMALL_STRUCT_2B, CIF_FLAGS(%rbp)
+	jne .Lret_struct1b
+	
+	mov	RVALUE(%rbp), %rcx
+	mov	%ax, (%rcx)
+	jmp .Lret_void
+	
+.Lret_struct1b:
+	cmpl	$FFI_TYPE_SMALL_STRUCT_1B, CIF_FLAGS(%rbp)
+	jne .Lret_uint8
+	
+	mov	RVALUE(%rbp), %rcx
+	mov	%al, (%rcx)
+	jmp .Lret_void
+
+.Lret_uint8:
+	cmpl	$FFI_TYPE_UINT8, CIF_FLAGS(%rbp)
+	jne .Lret_sint8
+	
+        mov     RVALUE(%rbp), %rcx
+        movzbq  %al, %rax
+	movq    %rax, (%rcx)
+	jmp .Lret_void
+
+.Lret_sint8:
+	cmpl	$FFI_TYPE_SINT8, CIF_FLAGS(%rbp)
+	jne .Lret_uint16
+	
+        mov     RVALUE(%rbp), %rcx
+        movsbq  %al, %rax
+	movq    %rax, (%rcx)
+	jmp .Lret_void
+
+.Lret_uint16:
+	cmpl	$FFI_TYPE_UINT16, CIF_FLAGS(%rbp)
+	jne .Lret_sint16
+	
+        mov     RVALUE(%rbp), %rcx
+        movzwq  %ax, %rax
+	movq    %rax, (%rcx)
+	jmp .Lret_void
+
+.Lret_sint16:
+	cmpl	$FFI_TYPE_SINT16, CIF_FLAGS(%rbp)
+	jne .Lret_uint32
+	
+        mov     RVALUE(%rbp), %rcx
+        movswq  %ax, %rax
+	movq    %rax, (%rcx)
+	jmp .Lret_void
+
+.Lret_uint32:
+	cmpl	$FFI_TYPE_UINT32, CIF_FLAGS(%rbp)
+	jne .Lret_sint32
+	
+        mov     RVALUE(%rbp), %rcx
+        movl    %eax, %eax
+	movq    %rax, (%rcx)
+	jmp .Lret_void
+
+.Lret_sint32:
+ 	cmpl	$FFI_TYPE_SINT32, CIF_FLAGS(%rbp)
+ 	jne	.Lret_float
+
+	mov	RVALUE(%rbp), %rcx
+	cltq
+	movq	%rax, (%rcx)
+	jmp	.Lret_void
+
+.Lret_float:
+ 	cmpl	$FFI_TYPE_FLOAT, CIF_FLAGS(%rbp)
+ 	jne	.Lret_double
+
+ 	mov	RVALUE(%rbp), %rax
+ 	movss	%xmm0, (%rax)
+ 	jmp	.Lret_void
+
+.Lret_double:
+ 	cmpl	$FFI_TYPE_DOUBLE, CIF_FLAGS(%rbp)
+ 	jne	.Lret_sint64
+
+ 	mov	RVALUE(%rbp), %rax
+ 	movlpd	%xmm0, (%rax)
+ 	jmp	.Lret_void
+
+.Lret_sint64:
+  	cmpl	$FFI_TYPE_SINT64, CIF_FLAGS(%rbp)
+  	jne	.Lret_void
+
+ 	mov	RVALUE(%rbp), %rcx
+ 	mov	%rax, (%rcx)
+ 	jmp	.Lret_void
+	
+.Lret_void:
+	xor	%rax, %rax
+
+	lea	16(%rbp), %rsp
+	pop	%rbp
+	retq
+.ffi_call_win64_end:
+#endif /* !_MSC_VER */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.am b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.am
new file mode 100644
index 0000000..cfd1df4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.am
@@ -0,0 +1,80 @@
+## Process this file with automake to produce Makefile.in.
+
+AUTOMAKE_OPTIONS = foreign dejagnu
+
+# Setup the testing framework, if you have one
+EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \
+            echo $(top_builddir)/../expect/expect ; \
+          else echo expect ; fi`
+
+RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \
+	       echo $(top_srcdir)/../dejagnu/runtest ; \
+	    else echo runtest; fi`
+
+AM_RUNTESTFLAGS =
+
+CLEANFILES = *.exe core* *.log *.sum
+
+EXTRA_DIST = libffi.special/special.exp	\
+libffi.special/unwindtest_ffi_call.cc libffi.special/unwindtest.cc \
+libffi.special/ffitestcxx.h config/default.exp lib/target-libpath.exp \
+lib/libffi.exp lib/wrapper.exp libffi.call/float.c \
+libffi.call/cls_multi_schar.c libffi.call/float3.c \
+libffi.call/cls_3_1byte.c libffi.call/stret_large2.c \
+libffi.call/cls_5_1_byte.c libffi.call/stret_medium.c \
+libffi.call/promotion.c libffi.call/cls_dbls_struct.c \
+libffi.call/nested_struct.c libffi.call/closure_fn1.c \
+libffi.call/cls_4_1byte.c libffi.call/cls_float.c \
+libffi.call/cls_2byte.c libffi.call/closure_fn4.c \
+libffi.call/return_fl2.c libffi.call/nested_struct7.c \
+libffi.call/cls_uint.c libffi.call/cls_align_sint64.c \
+libffi.call/float1.c libffi.call/cls_19byte.c \
+libffi.call/nested_struct1.c libffi.call/cls_4byte.c \
+libffi.call/return_fl1.c libffi.call/cls_align_pointer.c \
+libffi.call/nested_struct4.c libffi.call/nested_struct3.c \
+libffi.call/struct7.c libffi.call/nested_struct9.c \
+libffi.call/cls_sshort.c libffi.call/cls_ulonglong.c \
+libffi.call/cls_pointer_stack.c libffi.call/cls_multi_uchar.c \
+libffi.call/testclosure.c libffi.call/cls_3byte1.c \
+libffi.call/struct6.c libffi.call/return_uc.c libffi.call/return_ll1.c \
+libffi.call/cls_ushort.c libffi.call/stret_medium2.c \
+libffi.call/cls_multi_ushortchar.c libffi.call/return_dbl2.c \
+libffi.call/closure_loc_fn0.c libffi.call/return_sc.c \
+libffi.call/nested_struct8.c libffi.call/cls_7_1_byte.c	\
+libffi.call/return_ll.c libffi.call/cls_pointer.c \
+libffi.call/err_bad_abi.c libffi.call/return_dbl1.c \
+libffi.call/call.exp libffi.call/ffitest.h libffi.call/strlen.c	\
+libffi.call/return_sl.c libffi.call/cls_1_1byte.c \
+libffi.call/struct1.c libffi.call/cls_64byte.c libffi.call/return_ul.c \
+libffi.call/cls_double.c libffi.call/many_win32.c \
+libffi.call/cls_16byte.c libffi.call/cls_align_double.c	\
+libffi.call/cls_align_uint16.c libffi.call/cls_9byte1.c	\
+libffi.call/cls_multi_sshortchar.c libffi.call/cls_multi_ushort.c \
+libffi.call/closure_stdcall.c libffi.call/return_fl.c \
+libffi.call/strlen_win32.c libffi.call/return_ldl.c \
+libffi.call/cls_align_float.c libffi.call/struct3.c \
+libffi.call/cls_uchar.c libffi.call/cls_sint.c libffi.call/float2.c \
+libffi.call/cls_align_longdouble_split.c \
+libffi.call/cls_longdouble_va.c libffi.call/cls_multi_sshort.c \
+libffi.call/stret_large.c libffi.call/cls_align_sint16.c \
+libffi.call/nested_struct6.c libffi.call/cls_5byte.c \
+libffi.call/return_dbl.c libffi.call/cls_20byte.c \
+libffi.call/cls_8byte.c libffi.call/pyobjc-tc.c	\
+libffi.call/cls_24byte.c libffi.call/cls_align_longdouble_split2.c \
+libffi.call/cls_6_1_byte.c libffi.call/cls_schar.c \
+libffi.call/cls_18byte.c libffi.call/closure_fn3.c \
+libffi.call/err_bad_typedef.c libffi.call/closure_fn2.c	\
+libffi.call/struct2.c libffi.call/cls_3byte2.c \
+libffi.call/cls_align_longdouble.c libffi.call/cls_20byte1.c \
+libffi.call/return_fl3.c libffi.call/cls_align_uint32.c	\
+libffi.call/problem1.c libffi.call/float4.c \
+libffi.call/cls_align_uint64.c libffi.call/struct9.c \
+libffi.call/closure_fn5.c libffi.call/cls_align_sint32.c \
+libffi.call/closure_fn0.c libffi.call/closure_fn6.c \
+libffi.call/struct4.c libffi.call/nested_struct2.c \
+libffi.call/cls_6byte.c libffi.call/cls_7byte.c libffi.call/many.c \
+libffi.call/struct8.c libffi.call/negint.c libffi.call/struct5.c \
+libffi.call/cls_12byte.c libffi.call/cls_double_va.c \
+libffi.call/cls_longdouble.c libffi.call/cls_9byte2.c \
+libffi.call/nested_struct10.c libffi.call/nested_struct5.c \
+libffi.call/huge_struct.c
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.in b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.in
new file mode 100644
index 0000000..53de9c0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/Makefile.in
@@ -0,0 +1,500 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = testsuite
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \
+	$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
+	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
+	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
+	$(top_srcdir)/m4/ax_configure_args.m4 \
+	$(top_srcdir)/m4/ax_enable_builddir.m4 \
+	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
+	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/fficonfig.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+SOURCES =
+DIST_SOURCES =
+DEJATOOL = $(PACKAGE)
+RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_LTLDFLAGS = @AM_LTLDFLAGS@
+AM_RUNTESTFLAGS = 
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
+FGREP = @FGREP@
+GREP = @GREP@
+HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PRTDIAG = @PRTDIAG@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TARGET = @TARGET@
+TARGETDIR = @TARGETDIR@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_enable_builddir_sed = @ax_enable_builddir_sed@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+toolexecdir = @toolexecdir@
+toolexeclibdir = @toolexeclibdir@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign dejagnu
+
+# Setup the testing framework, if you have one
+EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \
+            echo $(top_builddir)/../expect/expect ; \
+          else echo expect ; fi`
+
+RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \
+	       echo $(top_srcdir)/../dejagnu/runtest ; \
+	    else echo runtest; fi`
+
+CLEANFILES = *.exe core* *.log *.sum
+EXTRA_DIST = libffi.special/special.exp	\
+libffi.special/unwindtest_ffi_call.cc libffi.special/unwindtest.cc \
+libffi.special/ffitestcxx.h config/default.exp lib/target-libpath.exp \
+lib/libffi.exp lib/wrapper.exp libffi.call/float.c \
+libffi.call/cls_multi_schar.c libffi.call/float3.c \
+libffi.call/cls_3_1byte.c libffi.call/stret_large2.c \
+libffi.call/cls_5_1_byte.c libffi.call/stret_medium.c \
+libffi.call/promotion.c libffi.call/cls_dbls_struct.c \
+libffi.call/nested_struct.c libffi.call/closure_fn1.c \
+libffi.call/cls_4_1byte.c libffi.call/cls_float.c \
+libffi.call/cls_2byte.c libffi.call/closure_fn4.c \
+libffi.call/return_fl2.c libffi.call/nested_struct7.c \
+libffi.call/cls_uint.c libffi.call/cls_align_sint64.c \
+libffi.call/float1.c libffi.call/cls_19byte.c \
+libffi.call/nested_struct1.c libffi.call/cls_4byte.c \
+libffi.call/return_fl1.c libffi.call/cls_align_pointer.c \
+libffi.call/nested_struct4.c libffi.call/nested_struct3.c \
+libffi.call/struct7.c libffi.call/nested_struct9.c \
+libffi.call/cls_sshort.c libffi.call/cls_ulonglong.c \
+libffi.call/cls_pointer_stack.c libffi.call/cls_multi_uchar.c \
+libffi.call/testclosure.c libffi.call/cls_3byte1.c \
+libffi.call/struct6.c libffi.call/return_uc.c libffi.call/return_ll1.c \
+libffi.call/cls_ushort.c libffi.call/stret_medium2.c \
+libffi.call/cls_multi_ushortchar.c libffi.call/return_dbl2.c \
+libffi.call/closure_loc_fn0.c libffi.call/return_sc.c \
+libffi.call/nested_struct8.c libffi.call/cls_7_1_byte.c	\
+libffi.call/return_ll.c libffi.call/cls_pointer.c \
+libffi.call/err_bad_abi.c libffi.call/return_dbl1.c \
+libffi.call/call.exp libffi.call/ffitest.h libffi.call/strlen.c	\
+libffi.call/return_sl.c libffi.call/cls_1_1byte.c \
+libffi.call/struct1.c libffi.call/cls_64byte.c libffi.call/return_ul.c \
+libffi.call/cls_double.c libffi.call/many_win32.c \
+libffi.call/cls_16byte.c libffi.call/cls_align_double.c	\
+libffi.call/cls_align_uint16.c libffi.call/cls_9byte1.c	\
+libffi.call/cls_multi_sshortchar.c libffi.call/cls_multi_ushort.c \
+libffi.call/closure_stdcall.c libffi.call/return_fl.c \
+libffi.call/strlen_win32.c libffi.call/return_ldl.c \
+libffi.call/cls_align_float.c libffi.call/struct3.c \
+libffi.call/cls_uchar.c libffi.call/cls_sint.c libffi.call/float2.c \
+libffi.call/cls_align_longdouble_split.c \
+libffi.call/cls_longdouble_va.c libffi.call/cls_multi_sshort.c \
+libffi.call/stret_large.c libffi.call/cls_align_sint16.c \
+libffi.call/nested_struct6.c libffi.call/cls_5byte.c \
+libffi.call/return_dbl.c libffi.call/cls_20byte.c \
+libffi.call/cls_8byte.c libffi.call/pyobjc-tc.c	\
+libffi.call/cls_24byte.c libffi.call/cls_align_longdouble_split2.c \
+libffi.call/cls_6_1_byte.c libffi.call/cls_schar.c \
+libffi.call/cls_18byte.c libffi.call/closure_fn3.c \
+libffi.call/err_bad_typedef.c libffi.call/closure_fn2.c	\
+libffi.call/struct2.c libffi.call/cls_3byte2.c \
+libffi.call/cls_align_longdouble.c libffi.call/cls_20byte1.c \
+libffi.call/return_fl3.c libffi.call/cls_align_uint32.c	\
+libffi.call/problem1.c libffi.call/float4.c \
+libffi.call/cls_align_uint64.c libffi.call/struct9.c \
+libffi.call/closure_fn5.c libffi.call/cls_align_sint32.c \
+libffi.call/closure_fn0.c libffi.call/closure_fn6.c \
+libffi.call/struct4.c libffi.call/nested_struct2.c \
+libffi.call/cls_6byte.c libffi.call/cls_7byte.c libffi.call/many.c \
+libffi.call/struct8.c libffi.call/negint.c libffi.call/struct5.c \
+libffi.call/cls_12byte.c libffi.call/cls_double_va.c \
+libffi.call/cls_longdouble.c libffi.call/cls_9byte2.c \
+libffi.call/nested_struct10.c libffi.call/nested_struct5.c \
+libffi.call/huge_struct.c
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign testsuite/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+check-DEJAGNU: site.exp
+	srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \
+	EXPECT=$(EXPECT); export EXPECT; \
+	runtest=$(RUNTEST); \
+	if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
+	  exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \
+	    if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \
+	    then :; else exit_status=1; fi; \
+	  done; \
+	else echo "WARNING: could not find \`runtest'" 1>&2; :;\
+	fi; \
+	exit $$exit_status
+site.exp: Makefile
+	@echo 'Making a new site.exp file...'
+	@echo '## these variables are automatically generated by make ##' >site.tmp
+	@echo '# Do not edit here.  If you wish to override these values' >>site.tmp
+	@echo '# edit the last section' >>site.tmp
+	@echo 'set srcdir $(srcdir)' >>site.tmp
+	@echo "set objdir `pwd`" >>site.tmp
+	@echo 'set build_alias "$(build_alias)"' >>site.tmp
+	@echo 'set build_triplet $(build_triplet)' >>site.tmp
+	@echo 'set host_alias "$(host_alias)"' >>site.tmp
+	@echo 'set host_triplet $(host_triplet)' >>site.tmp
+	@echo 'set target_alias "$(target_alias)"' >>site.tmp
+	@echo 'set target_triplet $(target_triplet)' >>site.tmp
+	@echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp
+	@test ! -f site.exp || \
+	  sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp
+	@-rm -f site.bak
+	@test ! -f site.exp || mv site.exp site.bak
+	@mv site.tmp site.exp
+
+distclean-DEJAGNU:
+	-rm -f site.exp site.bak
+	-l='$(DEJATOOL)'; for tool in $$l; do \
+	  rm -f $$tool.sum $$tool.log; \
+	done
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-DEJAGNU distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-DEJAGNU check-am clean clean-generic \
+	clean-libtool distclean distclean-DEJAGNU distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/config/default.exp b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/config/default.exp
new file mode 100644
index 0000000..90967cc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/config/default.exp
@@ -0,0 +1 @@
+load_lib "standard.exp"
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp
new file mode 100644
index 0000000..304d2f5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp
@@ -0,0 +1,300 @@
+#   Copyright (C) 2003, 2005, 2008, 2009 Free Software Foundation, Inc.
+
+# 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 2 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+proc load_gcc_lib { filename } {
+    global srcdir
+    load_file $srcdir/lib/$filename
+}
+
+load_lib dg.exp
+load_lib libgloss.exp
+load_gcc_lib target-libpath.exp
+load_gcc_lib wrapper.exp
+
+
+# Define libffi callbacks for dg.exp.
+
+proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } {
+
+    # To get all \n in dg-output test strings to match printf output
+    # in a system that outputs it as \015\012 (i.e. not just \012), we
+    # need to change all \n into \r?\n.  As there is no dejagnu flag
+    # or hook to do that, we simply change the text being tested.
+    # Unfortunately, we have to know that the variable is called
+    # dg-output-text and lives in the caller of libffi-dg-test, which
+    # is two calls up.  Overriding proc dg-output would be longer and
+    # would necessarily have the same assumption.
+    upvar 2 dg-output-text output_match
+
+    if { [llength $output_match] > 1 } {
+	regsub -all "\n" [lindex $output_match 1] "\r?\n" x
+	set output_match [lreplace $output_match 1 1 $x]
+    }
+
+    # Set up the compiler flags, based on what we're going to do.
+
+    set options [list]
+    switch $do_what {
+	"compile" {
+	    set compile_type "assembly"
+	    set output_file "[file rootname [file tail $prog]].s"
+	}
+	"link" {
+	    set compile_type "executable"
+	    set output_file "[file rootname [file tail $prog]].exe"
+	    # The following line is needed for targets like the i960 where
+	    # the default output file is b.out.  Sigh.
+	}
+	"run" {
+	    set compile_type "executable"
+	    # FIXME: "./" is to cope with "." not being in $PATH.
+	    # Should this be handled elsewhere?
+	    # YES.
+	    set output_file "./[file rootname [file tail $prog]].exe"
+	    # This is the only place where we care if an executable was
+	    # created or not.  If it was, dg.exp will try to run it.
+	    remote_file build delete $output_file;
+	}
+	default {
+	    perror "$do_what: not a valid dg-do keyword"
+	    return ""
+	}
+    }
+
+    if { $extra_tool_flags != "" } {
+	lappend options "additional_flags=$extra_tool_flags"
+    }
+
+    set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options];
+
+
+    return [list $comp_output $output_file]
+}
+
+
+proc libffi-dg-test { prog do_what extra_tool_flags } {
+    return [libffi-dg-test-1 target_compile $prog $do_what $extra_tool_flags]
+}
+
+proc libffi-init { args } {
+    global gluefile wrap_flags;
+    global srcdir
+    global blddirffi
+    global objdir
+    global TOOL_OPTIONS
+    global tool
+    global libffi_include
+    global libffi_link_flags
+    global tool_root_dir
+    global ld_library_path
+
+    set blddirffi [pwd]/..
+    verbose "libffi $blddirffi"
+
+    set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
+    if {$gccdir != ""} {
+	set gccdir [file dirname $gccdir]
+    }
+    verbose "gccdir $gccdir"
+
+    set ld_library_path "."
+    append ld_library_path ":${gccdir}"
+
+    set compiler "${gccdir}/xgcc"
+    if { [is_remote host] == 0 && [which $compiler] != 0 } {
+	foreach i "[exec $compiler --print-multi-lib]" {
+	    set mldir ""
+	    regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir
+	    set mldir [string trimright $mldir "\;@"]
+	    if { "$mldir" == "." } {
+		continue
+	    }
+	    if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } {
+		append ld_library_path ":${gccdir}/${mldir}"
+	    }
+	}
+    }
+    # add the library path for libffi.
+    append ld_library_path ":${blddirffi}/.libs"
+
+    verbose "ld_library_path: $ld_library_path"
+
+    # Point to the Libffi headers in libffi.
+    set libffi_include "${blddirffi}/include"
+    verbose "libffi_include $libffi_include"
+
+    set libffi_dir  "${blddirffi}/.libs"
+    verbose "libffi_dir $libffi_dir"
+    if { $libffi_dir != "" } {
+	set libffi_dir [file dirname ${libffi_dir}]
+	set libffi_link_flags "-L${libffi_dir}/.libs"
+    }
+
+    set_ld_library_path_env_vars
+    libffi_maybe_build_wrapper "${objdir}/testglue.o"
+}
+
+proc libffi_exit { } {
+    global gluefile;
+
+    if [info exists gluefile] {
+	file_on_build delete $gluefile;
+	unset gluefile;
+    }
+}
+
+proc libffi_target_compile { source dest type options } {
+    global gluefile wrap_flags;
+    global srcdir
+    global blddirffi
+    global TOOL_OPTIONS
+    global libffi_link_flags
+    global libffi_include
+    global target_triplet
+
+
+    if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } {
+	lappend options "libs=${gluefile}"
+	lappend options "ldflags=$wrap_flags"
+    }
+
+    # TOOL_OPTIONS must come first, so that it doesn't override testcase
+    # specific options.
+    if [info exists TOOL_OPTIONS] {
+	lappend  options [concat "additional_flags=$TOOL_OPTIONS" $options];
+    }
+
+    # search for ffi_mips.h in srcdir, too
+    lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include  -I${libffi_include}/.."
+    lappend options "additional_flags=${libffi_link_flags}"
+
+    # Darwin needs a stack execution allowed flag.
+
+    if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"]
+	 || [istarget "*-*-darwin2*"] } {
+	lappend options "additional_flags=-Wl,-allow_stack_execute"
+    }
+
+    # If you're building the compiler with --prefix set to a place
+    # where it's not yet installed, then the linker won't be able to
+    # find the libgcc used by libffi.dylib.  We could pass the
+    # -dylib_file option, but that's complicated, and it's much easier
+    # to just make the linker find libgcc using -L options.
+    if { [string match "*-*-darwin*" $target_triplet] } {
+	lappend options "libs= -shared-libgcc"
+    }
+
+    if { [string match "*-*-openbsd*" $target_triplet] } {
+	lappend options "libs= -lpthread"
+    }
+
+    lappend options "libs= -lffi"
+
+    verbose "options: $options"
+    return [target_compile $source $dest $type $options]
+}
+
+# Utility routines.
+
+#
+# search_for -- looks for a string match in a file
+#
+proc search_for { file pattern } {
+    set fd [open $file r]
+    while { [gets $fd cur_line]>=0 } {
+	if [string match "*$pattern*" $cur_line] then {
+	    close $fd
+	    return 1
+	}
+    }
+    close $fd
+    return 0
+}
+
+# Modified dg-runtest that can cycle through a list of optimization options
+# as c-torture does.
+proc libffi-dg-runtest { testcases default-extra-flags } {
+    global runtests
+
+    foreach test $testcases {
+	# If we're only testing specific files and this isn't one of
+	# them, skip it.
+	if ![runtest_file_p $runtests $test] {
+	    continue
+	}
+
+	# Look for a loop within the source code - if we don't find one,
+	# don't pass -funroll[-all]-loops.
+	global torture_with_loops torture_without_loops
+	if [expr [search_for $test "for*("]+[search_for $test "while*("]] {
+	    set option_list $torture_with_loops
+	} else {
+	    set option_list $torture_without_loops
+	}
+
+	set nshort [file tail [file dirname $test]]/[file tail $test]
+
+	foreach flags $option_list {
+	    verbose "Testing $nshort, $flags" 1
+	    dg-test $test $flags ${default-extra-flags}
+	}
+    }
+}
+
+
+# Like check_conditional_xfail, but callable from a dg test.
+
+proc dg-xfail-if { args } {
+    set args [lreplace $args 0 0]
+    set selector "target [join [lindex $args 1]]"
+    if { [dg-process-target $selector] == "S" } {
+	global compiler_conditional_xfail_data
+	set compiler_conditional_xfail_data $args
+    }
+}
+
+
+# We need to make sure that additional_files and additional_sources
+# are both cleared out after every test.  It is not enough to clear
+# them out *before* the next test run because gcc-target-compile gets
+# run directly from some .exp files (outside of any test).  (Those
+# uses should eventually be eliminated.)
+
+# Because the DG framework doesn't provide a hook that is run at the
+# end of a test, we must replace dg-test with a wrapper.
+
+if { [info procs saved-dg-test] == [list] } {
+    rename dg-test saved-dg-test
+
+    proc dg-test { args } {
+	global additional_files
+	global additional_sources
+	global errorInfo
+
+	if { [ catch { eval saved-dg-test $args } errmsg ] } {
+	    set saved_info $errorInfo
+	    set additional_files ""
+	    set additional_sources ""
+	    error $errmsg $saved_info
+	}
+	set additional_files ""
+	set additional_sources ""
+    }
+}
+
+# Local Variables:
+# tcl-indent-level:4
+# End:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi.exp b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi.exp
new file mode 100644
index 0000000..4a65ed1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/libffi.exp
@@ -0,0 +1,350 @@
+#   Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+
+# 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; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+proc load_gcc_lib { filename } {
+    global srcdir
+    load_file $srcdir/lib/$filename
+}
+
+load_lib dg.exp
+load_lib libgloss.exp
+load_gcc_lib target-libpath.exp
+load_gcc_lib wrapper.exp
+
+
+# Define libffi callbacks for dg.exp.
+
+proc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } {
+
+    # To get all \n in dg-output test strings to match printf output
+    # in a system that outputs it as \015\012 (i.e. not just \012), we
+    # need to change all \n into \r?\n.  As there is no dejagnu flag
+    # or hook to do that, we simply change the text being tested.
+    # Unfortunately, we have to know that the variable is called
+    # dg-output-text and lives in the caller of libffi-dg-test, which
+    # is two calls up.  Overriding proc dg-output would be longer and
+    # would necessarily have the same assumption.
+    upvar 2 dg-output-text output_match
+
+    if { [llength $output_match] > 1 } {
+	regsub -all "\n" [lindex $output_match 1] "\r?\n" x
+	set output_match [lreplace $output_match 1 1 $x]
+    }
+
+    # Set up the compiler flags, based on what we're going to do.
+
+    set options [list]
+    switch $do_what {
+	"compile" {
+	    set compile_type "assembly"
+	    set output_file "[file rootname [file tail $prog]].s"
+	}
+	"link" {
+	    set compile_type "executable"
+	    set output_file "[file rootname [file tail $prog]].exe"
+	    # The following line is needed for targets like the i960 where
+	    # the default output file is b.out.  Sigh.
+	}
+	"run" {
+	    set compile_type "executable"
+	    # FIXME: "./" is to cope with "." not being in $PATH.
+	    # Should this be handled elsewhere?
+	    # YES.
+	    set output_file "./[file rootname [file tail $prog]].exe"
+	    # This is the only place where we care if an executable was
+	    # created or not.  If it was, dg.exp will try to run it.
+	    remote_file build delete $output_file;
+	}
+	default {
+	    perror "$do_what: not a valid dg-do keyword"
+	    return ""
+	}
+    }
+
+    if { $extra_tool_flags != "" } {
+	lappend options "additional_flags=$extra_tool_flags"
+    }
+
+    set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options];
+
+
+    return [list $comp_output $output_file]
+}
+
+
+proc libffi-dg-test { prog do_what extra_tool_flags } {
+    return [libffi-dg-test-1 target_compile $prog $do_what $extra_tool_flags]
+}
+
+proc libffi-init { args } {
+    global gluefile wrap_flags;
+    global srcdir
+    global blddirffi
+    global objdir
+    global TOOL_OPTIONS
+    global tool
+    global libffi_include
+    global libffi_link_flags
+    global tool_root_dir
+    global ld_library_path
+
+    set blddirffi [pwd]/.. 
+    verbose "libffi $blddirffi"
+
+    set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
+    if {$gccdir != ""} {
+	set gccdir [file dirname $gccdir]
+    }
+    verbose "gccdir $gccdir"
+
+    set ld_library_path "."
+    append ld_library_path ":${gccdir}"
+
+    set compiler "${gccdir}/xgcc"
+    if { [is_remote host] == 0 && [which $compiler] != 0 } {
+	foreach i "[exec $compiler --print-multi-lib]" {
+	    set mldir ""
+	    regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir
+	    set mldir [string trimright $mldir "\;@"]
+	    if { "$mldir" == "." } {
+		continue
+	    }
+	    if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } {
+		append ld_library_path ":${gccdir}/${mldir}"
+	    }
+	}
+    }
+    # add the library path for libffi.
+    append ld_library_path ":${blddirffi}/.libs"
+
+    verbose "ld_library_path: $ld_library_path"
+
+    # Point to the Libffi headers in libffi.
+    set libffi_include "${blddirffi}/include"
+    verbose "libffi_include $libffi_include"
+
+    set libffi_dir  "${blddirffi}/.libs"
+    verbose "libffi_dir $libffi_dir"
+    if { $libffi_dir != "" } {
+	set libffi_dir [file dirname ${libffi_dir}]
+	set libffi_link_flags "-L${libffi_dir}/.libs"
+    }
+
+    set_ld_library_path_env_vars
+    libffi_maybe_build_wrapper "${objdir}/testglue.o"
+}
+
+proc libffi_exit { } {
+    global gluefile;
+
+    if [info exists gluefile] {
+	file_on_build delete $gluefile;
+	unset gluefile;
+    }
+}
+
+proc libffi_target_compile { source dest type options } {
+    global gluefile wrap_flags;
+    global srcdir
+    global blddirffi
+    global TOOL_OPTIONS
+    global libffi_link_flags
+    global libffi_include
+    global target_triplet
+
+
+    if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } {
+	lappend options "libs=${gluefile}"
+	lappend options "ldflags=$wrap_flags"
+    }
+
+    # TOOL_OPTIONS must come first, so that it doesn't override testcase
+    # specific options.
+    if [info exists TOOL_OPTIONS] {
+	lappend  options [concat "additional_flags=$TOOL_OPTIONS" $options];
+    }
+
+    # search for ffi_mips.h in srcdir, too
+    lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include  -I${libffi_include}/.."
+    lappend options "additional_flags=${libffi_link_flags}"
+
+    # Darwin needs a stack execution allowed flag.
+
+    if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"]
+	 || [istarget "*-*-darwin2*"] } {
+	lappend options "additional_flags=-Wl,-allow_stack_execute"
+    }
+
+    # If you're building the compiler with --prefix set to a place
+    # where it's not yet installed, then the linker won't be able to
+    # find the libgcc used by libffi.dylib.  We could pass the
+    # -dylib_file option, but that's complicated, and it's much easier
+    # to just make the linker find libgcc using -L options.
+    if { [string match "*-*-darwin*" $target_triplet] } {
+	lappend options "libs= -shared-libgcc"
+    }
+
+    if { [string match "*-*-openbsd*" $target_triplet] } {
+	lappend options "libs= -lpthread"
+    }
+
+    lappend options "libs= -lffi"
+
+    verbose "options: $options"
+    return [target_compile $source $dest $type $options]
+}
+
+# Utility routines.
+
+#
+# search_for -- looks for a string match in a file
+#
+proc search_for { file pattern } {
+    set fd [open $file r]
+    while { [gets $fd cur_line]>=0 } {
+	if [string match "*$pattern*" $cur_line] then {
+	    close $fd
+	    return 1
+	}
+    }
+    close $fd
+    return 0
+}
+
+# Modified dg-runtest that can cycle through a list of optimization options
+# as c-torture does.
+proc libffi-dg-runtest { testcases default-extra-flags } {
+    global runtests
+
+    foreach test $testcases {
+	# If we're only testing specific files and this isn't one of
+	# them, skip it.
+	if ![runtest_file_p $runtests $test] {
+	    continue
+	}
+
+	# Look for a loop within the source code - if we don't find one,
+	# don't pass -funroll[-all]-loops.
+	global torture_with_loops torture_without_loops
+	if [expr [search_for $test "for*("]+[search_for $test "while*("]] {
+	    set option_list $torture_with_loops
+	} else {
+	    set option_list $torture_without_loops
+	}
+
+	set nshort [file tail [file dirname $test]]/[file tail $test]
+
+	foreach flags $option_list {
+	    verbose "Testing $nshort, $flags" 1
+	    dg-test $test $flags ${default-extra-flags}
+	}
+    }
+}
+
+
+# Like check_conditional_xfail, but callable from a dg test.
+
+proc dg-xfail-if { args } {
+    set args [lreplace $args 0 0]
+    set selector "target [join [lindex $args 1]]"
+    if { [dg-process-target $selector] == "S" } {
+	global compiler_conditional_xfail_data
+	set compiler_conditional_xfail_data $args
+    }
+}
+
+proc check-flags { args } {
+
+    # The args are within another list; pull them out.
+    set args [lindex $args 0]
+
+    # The next two arguments are optional.  If they were not specified,
+    # use the defaults.
+    if { [llength $args] == 2 } {
+	lappend $args [list "*"]
+    }
+    if { [llength $args] == 3 } {
+	lappend $args [list ""]
+    }
+
+    # If the option strings are the defaults, or the same as the
+    # defaults, there is no need to call check_conditional_xfail to
+    # compare them to the actual options.
+    if { [string compare [lindex $args 2] "*"] == 0
+	 && [string compare [lindex $args 3] "" ] == 0 } {
+	set result 1    
+    } else {
+	# The target list might be an effective-target keyword, so replace
+	# the original list with "*-*-*", since we already know it matches.
+	set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]]
+    }
+
+    return $result
+}
+
+proc dg-skip-if { args } {
+    # Verify the number of arguments.  The last two are optional.
+    set args [lreplace $args 0 0]
+    if { [llength $args] < 2 || [llength $args] > 4 } {
+        error "dg-skip-if 2: need 2, 3, or 4 arguments"
+    }
+
+    # Don't bother if we're already skipping the test.
+    upvar dg-do-what dg-do-what
+    if { [lindex ${dg-do-what} 1] == "N" } {
+      return
+    }
+
+    set selector [list target [lindex $args 1]]
+    if { [dg-process-target $selector] == "S" } {
+        if [check-flags $args] {
+            upvar dg-do-what dg-do-what
+            set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
+        }
+    }
+}
+
+# We need to make sure that additional_files and additional_sources
+# are both cleared out after every test.  It is not enough to clear
+# them out *before* the next test run because gcc-target-compile gets
+# run directly from some .exp files (outside of any test).  (Those
+# uses should eventually be eliminated.)
+
+# Because the DG framework doesn't provide a hook that is run at the
+# end of a test, we must replace dg-test with a wrapper.
+
+if { [info procs saved-dg-test] == [list] } {
+    rename dg-test saved-dg-test
+
+    proc dg-test { args } {
+	global additional_files
+	global additional_sources
+	global errorInfo
+
+	if { [ catch { eval saved-dg-test $args } errmsg ] } {
+	    set saved_info $errorInfo
+	    set additional_files ""
+	    set additional_sources ""
+	    error $errmsg $saved_info
+	}
+	set additional_files ""
+	set additional_sources ""
+    }
+}
+
+# Local Variables:
+# tcl-indent-level:4
+# End:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp
new file mode 100644
index 0000000..8999aa4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp
@@ -0,0 +1,263 @@
+# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
+
+# 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 GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# This file was contributed by John David Anglin (dave.anglin@nrc-cnrc.gc.ca)
+
+set orig_environment_saved 0
+set orig_ld_library_path_saved 0
+set orig_ld_run_path_saved 0
+set orig_shlib_path_saved 0
+set orig_ld_libraryn32_path_saved 0
+set orig_ld_library64_path_saved 0
+set orig_ld_library_path_32_saved 0
+set orig_ld_library_path_64_saved 0
+set orig_dyld_library_path_saved 0
+
+
+#######################################
+# proc set_ld_library_path_env_vars { }
+#######################################
+
+proc set_ld_library_path_env_vars { } {
+  global ld_library_path
+  global orig_environment_saved
+  global orig_ld_library_path_saved
+  global orig_ld_run_path_saved
+  global orig_shlib_path_saved
+  global orig_ld_libraryn32_path_saved
+  global orig_ld_library64_path_saved
+  global orig_ld_library_path_32_saved
+  global orig_ld_library_path_64_saved
+  global orig_dyld_library_path_saved
+  global orig_ld_library_path
+  global orig_ld_run_path
+  global orig_shlib_path
+  global orig_ld_libraryn32_path
+  global orig_ld_library64_path
+  global orig_ld_library_path_32
+  global orig_ld_library_path_64
+  global orig_dyld_library_path
+  global GCC_EXEC_PREFIX
+
+  # Set the relocated compiler prefix, but only if the user hasn't specified one.
+  if { [info exists GCC_EXEC_PREFIX] && ![info exists env(GCC_EXEC_PREFIX)] } {
+    setenv GCC_EXEC_PREFIX "$GCC_EXEC_PREFIX"
+  }
+
+  # Setting the ld library path causes trouble when testing cross-compilers.
+  if { [is_remote target] } {
+    return
+  }
+
+  if { $orig_environment_saved == 0 } {
+    global env
+
+    set orig_environment_saved 1
+
+    # Save the original environment.
+    if [info exists env(LD_LIBRARY_PATH)] {
+      set orig_ld_library_path "$env(LD_LIBRARY_PATH)"
+      set orig_ld_library_path_saved 1
+    }
+    if [info exists env(LD_RUN_PATH)] {
+      set orig_ld_run_path "$env(LD_RUN_PATH)"
+      set orig_ld_run_path_saved 1
+    }
+    if [info exists env(SHLIB_PATH)] {
+      set orig_shlib_path "$env(SHLIB_PATH)"
+      set orig_shlib_path_saved 1
+    }
+    if [info exists env(LD_LIBRARYN32_PATH)] {
+      set orig_ld_libraryn32_path "$env(LD_LIBRARYN32_PATH)"
+      set orig_ld_libraryn32_path_saved 1
+    }
+    if [info exists env(LD_LIBRARY64_PATH)] {
+      set orig_ld_library64_path "$env(LD_LIBRARY64_PATH)"
+      set orig_ld_library64_path_saved 1
+    }
+    if [info exists env(LD_LIBRARY_PATH_32)] {
+      set orig_ld_library_path_32 "$env(LD_LIBRARY_PATH_32)"
+      set orig_ld_library_path_32_saved 1
+    }
+    if [info exists env(LD_LIBRARY_PATH_64)] {
+      set orig_ld_library_path_64 "$env(LD_LIBRARY_PATH_64)"
+      set orig_ld_library_path_64_saved 1
+    }
+    if [info exists env(DYLD_LIBRARY_PATH)] {
+      set orig_dyld_library_path "$env(DYLD_LIBRARY_PATH)"
+      set orig_dyld_library_path_saved 1
+    }
+  }
+
+  # We need to set ld library path in the environment.  Currently,
+  # unix.exp doesn't set the environment correctly for all systems.
+  # It only sets SHLIB_PATH and LD_LIBRARY_PATH when it executes a
+  # program.  We also need the environment set for compilations, etc.
+  #
+  # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
+  # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
+  # (for the 64-bit ABI).  The same applies to Darwin (DYLD_LIBRARY_PATH),
+  # Solaris 32 bit (LD_LIBRARY_PATH_32), Solaris 64 bit (LD_LIBRARY_PATH_64),
+  # and HP-UX (SHLIB_PATH).  In some cases, the variables are independent
+  # of LD_LIBRARY_PATH, and in other cases LD_LIBRARY_PATH is used if the
+  # variable is not defined.
+  #
+  # Doing this is somewhat of a hack as ld_library_path gets repeated in
+  # SHLIB_PATH and LD_LIBRARY_PATH when unix_load sets these variables.
+  if { $orig_ld_library_path_saved } {
+    setenv LD_LIBRARY_PATH "$ld_library_path:$orig_ld_library_path"
+  } else {
+    setenv LD_LIBRARY_PATH "$ld_library_path"
+  }
+  if { $orig_ld_run_path_saved } {
+    setenv LD_RUN_PATH "$ld_library_path:$orig_ld_run_path"
+  } else {
+    setenv LD_RUN_PATH "$ld_library_path"
+  }
+  # The default shared library dynamic path search for 64-bit
+  # HP-UX executables searches LD_LIBRARY_PATH before SHLIB_PATH.
+  # LD_LIBRARY_PATH isn't used for 32-bit executables.  Thus, we
+  # set LD_LIBRARY_PATH and SHLIB_PATH as if they were independent.
+  if { $orig_shlib_path_saved } {
+    setenv SHLIB_PATH "$ld_library_path:$orig_shlib_path"
+  } else {
+    setenv SHLIB_PATH "$ld_library_path"
+  }
+  if { $orig_ld_libraryn32_path_saved } {
+    setenv LD_LIBRARYN32_PATH "$ld_library_path:$orig_ld_libraryn32_path"
+  } elseif { $orig_ld_library_path_saved } {
+    setenv LD_LIBRARYN32_PATH "$ld_library_path:$orig_ld_library_path"
+  } else {
+    setenv LD_LIBRARYN32_PATH "$ld_library_path"
+  }
+  if { $orig_ld_library64_path_saved } {
+    setenv LD_LIBRARY64_PATH "$ld_library_path:$orig_ld_library64_path"
+  } elseif { $orig_ld_library_path_saved } {
+    setenv LD_LIBRARY64_PATH "$ld_library_path:$orig_ld_library_path"
+  } else {
+    setenv LD_LIBRARY64_PATH "$ld_library_path"
+  }
+  if { $orig_ld_library_path_32_saved } {
+    setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path_32"
+  } elseif { $orig_ld_library_path_saved } {
+    setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path"
+  } else {
+    setenv LD_LIBRARY_PATH_32 "$ld_library_path"
+  }
+  if { $orig_ld_library_path_64_saved } {
+    setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path_64"
+  } elseif { $orig_ld_library_path_saved } {
+    setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path"
+  } else {
+    setenv LD_LIBRARY_PATH_64 "$ld_library_path"
+  }
+  if { $orig_dyld_library_path_saved } {
+    setenv DYLD_LIBRARY_PATH "$ld_library_path:$orig_dyld_library_path"
+  } else {
+    setenv DYLD_LIBRARY_PATH "$ld_library_path"
+  }
+
+  verbose -log "set_ld_library_path_env_vars: ld_library_path=$ld_library_path"
+}
+
+#######################################
+# proc restore_ld_library_path_env_vars { }
+#######################################
+
+proc restore_ld_library_path_env_vars { } {
+  global orig_environment_saved
+  global orig_ld_library_path_saved
+  global orig_ld_run_path_saved
+  global orig_shlib_path_saved
+  global orig_ld_libraryn32_path_saved
+  global orig_ld_library64_path_saved
+  global orig_ld_library_path_32_saved
+  global orig_ld_library_path_64_saved
+  global orig_dyld_library_path_saved
+  global orig_ld_library_path
+  global orig_ld_run_path
+  global orig_shlib_path
+  global orig_ld_libraryn32_path
+  global orig_ld_library64_path
+  global orig_ld_library_path_32
+  global orig_ld_library_path_64
+  global orig_dyld_library_path
+
+  if { $orig_environment_saved == 0 } {
+    return
+  }
+
+  if { $orig_ld_library_path_saved } {
+    setenv LD_LIBRARY_PATH "$orig_ld_library_path"
+  } elseif [info exists env(LD_LIBRARY_PATH)] {
+    unsetenv LD_LIBRARY_PATH
+  }
+  if { $orig_ld_run_path_saved } {
+    setenv LD_RUN_PATH "$orig_ld_run_path"
+  } elseif [info exists env(LD_RUN_PATH)] {
+    unsetenv LD_RUN_PATH
+  }
+  if { $orig_shlib_path_saved } {
+    setenv SHLIB_PATH "$orig_shlib_path"
+  } elseif [info exists env(SHLIB_PATH)] {
+    unsetenv SHLIB_PATH
+  }
+  if { $orig_ld_libraryn32_path_saved } {
+    setenv LD_LIBRARYN32_PATH "$orig_ld_libraryn32_path"
+  } elseif [info exists env(LD_LIBRARYN32_PATH)] {
+    unsetenv LD_LIBRARYN32_PATH
+  }
+  if { $orig_ld_library64_path_saved } {
+    setenv LD_LIBRARY64_PATH "$orig_ld_library64_path"
+  } elseif [info exists env(LD_LIBRARY64_PATH)] {
+    unsetenv LD_LIBRARY64_PATH
+  }
+  if { $orig_ld_library_path_32_saved } {
+    setenv LD_LIBRARY_PATH_32 "$orig_ld_library_path_32"
+  } elseif [info exists env(LD_LIBRARY_PATH_32)] {
+    unsetenv LD_LIBRARY_PATH_32
+  }
+  if { $orig_ld_library_path_64_saved } {
+    setenv LD_LIBRARY_PATH_64 "$orig_ld_library_path_64"
+  } elseif [info exists env(LD_LIBRARY_PATH_64)] {
+    unsetenv LD_LIBRARY_PATH_64
+  }
+  if { $orig_dyld_library_path_saved } {
+    setenv DYLD_LIBRARY_PATH "$orig_dyld_library_path"
+  } elseif [info exists env(DYLD_LIBRARY_PATH)] {
+    unsetenv DYLD_LIBRARY_PATH
+  }
+}
+
+#######################################
+# proc get_shlib_extension { }
+#######################################
+
+proc get_shlib_extension { } {
+    global shlib_ext
+
+    if { [ istarget *-*-darwin* ] } {
+	set shlib_ext "dylib"
+    } elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-mingw* ] } {
+	set shlib_ext "dll"
+    } elseif { [ istarget hppa*-*-hpux* ] } {
+	set shlib_ext "sl"
+    } else {
+	set shlib_ext "so"
+    }
+    return $shlib_ext
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/wrapper.exp b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/wrapper.exp
new file mode 100644
index 0000000..4e5ae43
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/lib/wrapper.exp
@@ -0,0 +1,45 @@
+#   Copyright (C) 2004, 2007 Free Software Foundation, Inc.
+
+# 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 GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# This file contains GCC-specifics for status wrappers for test programs.
+
+# ${tool}_maybe_build_wrapper -- Build wrapper object if the target
+# needs it.  FILENAME is the path to the wrapper file.  If there are
+# additional arguments, they are command-line options to provide to
+# the compiler when compiling FILENAME.
+
+proc ${tool}_maybe_build_wrapper { filename args } {
+    global gluefile wrap_flags
+
+    if { [target_info needs_status_wrapper] != "" \
+ 	 && [target_info needs_status_wrapper] != "0" \
+	 && ![info exists gluefile] } {
+	set saved_wrap_compile_flags [target_info wrap_compile_flags]
+	set flags [join $args " "]
+	# The wrapper code may contain code that gcc objects on.  This
+	# became true for dejagnu-1.4.4.  The set of warnings and code
+	# that gcc objects on may change, so just make sure -w is always
+	# passed to turn off all warnings.
+	set_currtarget_info wrap_compile_flags \
+	    "$saved_wrap_compile_flags -w $flags"
+	set result [build_wrapper $filename]
+	set_currtarget_info wrap_compile_flags "$saved_wrap_compile_flags"
+	if { $result != "" } {
+	    set gluefile [lindex $result 0]
+	    set wrap_flags [lindex $result 1]
+	}
+    }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/call.exp b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/call.exp
new file mode 100644
index 0000000..26acd81
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/call.exp
@@ -0,0 +1,32 @@
+# Copyright (C) 2003, 2006, 2009, 2010 Free Software Foundation, Inc.
+
+# 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; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+dg-init
+libffi-init
+
+global srcdir subdir
+
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O0 -W -Wall" ""
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O2" ""
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O3" ""
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-Os" ""
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] "-O2 -fomit-frame-pointer" ""
+
+dg-finish
+
+# Local Variables:
+# tcl-indent-level:4
+# End:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c
new file mode 100644
index 0000000..a579ff6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c
@@ -0,0 +1,89 @@
+/* Area:	closure_call
+   Purpose:	Check multiple values passing from different type.
+		Also, exceed the limit of gpr and fpr registers on PowerPC
+		Darwin.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+
+
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void
+closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		 void* userdata)
+{
+  *(ffi_arg*)resp =
+    (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) +
+    (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] +
+    (int)(*(signed short *)args[4]) +
+    (int)(*(unsigned long long *)args[5]) +
+    (int)*(int *)args[6] + (int)(*(int *)args[7]) +
+    (int)(*(double *)args[8]) + (int)*(int *)args[9] +
+    (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
+    (int)*(int *)args[12] + (int)(*(int *)args[13]) +
+    (int)(*(int *)args[14]) +  *(int *)args[15] + (intptr_t)userdata;
+
+  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
+	 (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]),
+	 (int)(*(unsigned long long *)args[2]),
+	 (int)*(int *)args[3], (int)(*(signed short *)args[4]),
+	 (int)(*(unsigned long long *)args[5]),
+	 (int)*(int *)args[6], (int)(*(int *)args[7]),
+	 (int)(*(double *)args[8]), (int)*(int *)args[9],
+	 (int)(*(int *)args[10]), (int)(*(float *)args[11]),
+	 (int)*(int *)args[12], (int)(*(int *)args[13]),
+	 (int)(*(int *)args[14]),*(int *)args[15],
+	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
+
+}
+
+typedef int (*closure_test_type0)(unsigned long long, int, unsigned long long,
+				  int, signed short, unsigned long long, int,
+				  int, double, int, int, float, int, int,
+				  int, int);
+
+int main (void)
+{
+  ffi_cif cif;
+  void * code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[17];
+  int res;
+
+  cl_arg_types[0] = &ffi_type_uint64;
+  cl_arg_types[1] = &ffi_type_sint;
+  cl_arg_types[2] = &ffi_type_uint64;
+  cl_arg_types[3] = &ffi_type_sint;
+  cl_arg_types[4] = &ffi_type_sshort;
+  cl_arg_types[5] = &ffi_type_uint64;
+  cl_arg_types[6] = &ffi_type_sint;
+  cl_arg_types[7] = &ffi_type_sint;
+  cl_arg_types[8] = &ffi_type_double;
+  cl_arg_types[9] = &ffi_type_sint;
+  cl_arg_types[10] = &ffi_type_sint;
+  cl_arg_types[11] = &ffi_type_float;
+  cl_arg_types[12] = &ffi_type_sint;
+  cl_arg_types[13] = &ffi_type_sint;
+  cl_arg_types[14] = &ffi_type_sint;
+  cl_arg_types[15] = &ffi_type_sint;
+  cl_arg_types[16] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
+		     &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0,
+                             (void *) 3 /* userdata */, code) == FFI_OK);
+
+  res = (*((closure_test_type0)code))
+    (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13,
+     19, 21, 1);
+  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 680" } */
+     exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c
new file mode 100644
index 0000000..9123173
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c
@@ -0,0 +1,81 @@
+/* Area:	closure_call.
+   Purpose:	Check multiple values passing from different type.
+		Also, exceed the limit of gpr and fpr registers on PowerPC
+		Darwin.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+
+static void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, void** args,
+			     void* userdata)
+{
+  *(ffi_arg*)resp =
+    (int)*(float *)args[0] +(int)(*(float *)args[1]) +
+    (int)(*(float *)args[2]) + (int)*(float *)args[3] +
+    (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) +
+    (int)*(float *)args[6] + (int)(*(int *)args[7]) +
+    (int)(*(double*)args[8]) + (int)*(int *)args[9] +
+    (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
+    (int)*(int *)args[12] + (int)(*(int *)args[13]) +
+    (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata;
+
+  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
+	 (int)*(float *)args[0], (int)(*(float *)args[1]),
+	 (int)(*(float *)args[2]), (int)*(float *)args[3],
+	 (int)(*(signed short *)args[4]), (int)(*(float *)args[5]),
+	 (int)*(float *)args[6], (int)(*(int *)args[7]),
+	 (int)(*(double *)args[8]), (int)*(int *)args[9],
+	 (int)(*(int *)args[10]), (int)(*(float *)args[11]),
+	 (int)*(int *)args[12], (int)(*(int *)args[13]),
+	 (int)(*(int *)args[14]), *(int *)args[15],
+	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
+}
+
+typedef int (*closure_test_type1)(float, float, float, float, signed short,
+				  float, float, int, double, int, int, float,
+				  int, int, int, int);
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[17];
+  int res;
+
+  cl_arg_types[0] = &ffi_type_float;
+  cl_arg_types[1] = &ffi_type_float;
+  cl_arg_types[2] = &ffi_type_float;
+  cl_arg_types[3] = &ffi_type_float;
+  cl_arg_types[4] = &ffi_type_sshort;
+  cl_arg_types[5] = &ffi_type_float;
+  cl_arg_types[6] = &ffi_type_float;
+  cl_arg_types[7] = &ffi_type_sint;
+  cl_arg_types[8] = &ffi_type_double;
+  cl_arg_types[9] = &ffi_type_sint;
+  cl_arg_types[10] = &ffi_type_sint;
+  cl_arg_types[11] = &ffi_type_float;
+  cl_arg_types[12] = &ffi_type_sint;
+  cl_arg_types[13] = &ffi_type_sint;
+  cl_arg_types[14] = &ffi_type_sint;
+  cl_arg_types[15] = &ffi_type_sint;
+  cl_arg_types[16] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
+		     &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1,
+                             (void *) 3 /* userdata */, code)  == FFI_OK);
+
+  res = (*((closure_test_type1)code))
+    (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13,
+     19, 21, 1);
+  /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 255" } */
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c
new file mode 100644
index 0000000..08ff9d9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c
@@ -0,0 +1,81 @@
+/* Area:	closure_call
+   Purpose:	Check multiple values passing from different type.
+		Also, exceed the limit of gpr and fpr registers on PowerPC
+		Darwin.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void closure_test_fn2(ffi_cif* cif __UNUSED__, void* resp, void** args,
+			     void* userdata)
+{
+  *(ffi_arg*)resp =
+    (int)*(double *)args[0] +(int)(*(double *)args[1]) +
+    (int)(*(double *)args[2]) + (int)*(double *)args[3] +
+    (int)(*(signed short *)args[4]) + (int)(*(double *)args[5]) +
+    (int)*(double *)args[6] + (int)(*(int *)args[7]) +
+    (int)(*(double *)args[8]) + (int)*(int *)args[9] +
+    (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
+    (int)*(int *)args[12] + (int)(*(float *)args[13]) +
+    (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata;
+
+  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
+	 (int)*(double *)args[0], (int)(*(double *)args[1]),
+	 (int)(*(double *)args[2]), (int)*(double *)args[3],
+	 (int)(*(signed short *)args[4]), (int)(*(double *)args[5]),
+	 (int)*(double *)args[6], (int)(*(int *)args[7]),
+	 (int)(*(double*)args[8]), (int)*(int *)args[9],
+	 (int)(*(int *)args[10]), (int)(*(float *)args[11]),
+	 (int)*(int *)args[12], (int)(*(float *)args[13]),
+	 (int)(*(int *)args[14]), *(int *)args[15], (int)(intptr_t)userdata,
+	 (int)*(ffi_arg *)resp);
+}
+
+typedef int (*closure_test_type2)(double, double, double, double, signed short,
+				  double, double, int, double, int, int, float,
+				  int, float, int, int);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[17];
+  int res;
+
+  cl_arg_types[0] = &ffi_type_double;
+  cl_arg_types[1] = &ffi_type_double;
+  cl_arg_types[2] = &ffi_type_double;
+  cl_arg_types[3] = &ffi_type_double;
+  cl_arg_types[4] = &ffi_type_sshort;
+  cl_arg_types[5] = &ffi_type_double;
+  cl_arg_types[6] = &ffi_type_double;
+  cl_arg_types[7] = &ffi_type_sint;
+  cl_arg_types[8] = &ffi_type_double;
+  cl_arg_types[9] = &ffi_type_sint;
+  cl_arg_types[10] = &ffi_type_sint;
+  cl_arg_types[11] = &ffi_type_float;
+  cl_arg_types[12] = &ffi_type_sint;
+  cl_arg_types[13] = &ffi_type_float;
+  cl_arg_types[14] = &ffi_type_sint;
+  cl_arg_types[15] = &ffi_type_sint;
+  cl_arg_types[16] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
+		     &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn2,
+                             (void *) 3 /* userdata */, code) == FFI_OK);
+
+  res = (*((closure_test_type2)code))
+    (1, 2, 3, 4, 127, 5, 6, 8, 9, 10, 11, 12.0, 13,
+     19.0, 21, 1);
+  /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 255" } */
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c
new file mode 100644
index 0000000..9b54d80
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c
@@ -0,0 +1,82 @@
+/* Area:	closure_call
+   Purpose:	Check multiple values passing from different type.
+		Also, exceed the limit of gpr and fpr registers on PowerPC
+		Darwin.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void closure_test_fn3(ffi_cif* cif __UNUSED__, void* resp, void** args,
+			     void* userdata)
+ {
+   *(ffi_arg*)resp =
+     (int)*(float *)args[0] +(int)(*(float *)args[1]) +
+     (int)(*(float *)args[2]) + (int)*(float *)args[3] +
+     (int)(*(float *)args[4]) + (int)(*(float *)args[5]) +
+     (int)*(float *)args[6] + (int)(*(float *)args[7]) +
+     (int)(*(double *)args[8]) + (int)*(int *)args[9] +
+     (int)(*(float *)args[10]) + (int)(*(float *)args[11]) +
+     (int)*(int *)args[12] + (int)(*(float *)args[13]) +
+     (int)(*(float *)args[14]) +  *(int *)args[15] + (intptr_t)userdata;
+
+   printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
+	  (int)*(float *)args[0], (int)(*(float *)args[1]),
+	  (int)(*(float *)args[2]), (int)*(float *)args[3],
+	  (int)(*(float *)args[4]), (int)(*(float *)args[5]),
+	  (int)*(float *)args[6], (int)(*(float *)args[7]),
+	  (int)(*(double *)args[8]), (int)*(int *)args[9],
+	  (int)(*(float *)args[10]), (int)(*(float *)args[11]),
+	  (int)*(int *)args[12], (int)(*(float *)args[13]),
+	  (int)(*(float *)args[14]), *(int *)args[15], (int)(intptr_t)userdata,
+	  (int)*(ffi_arg *)resp);
+
+ }
+
+typedef int (*closure_test_type3)(float, float, float, float, float, float,
+				  float, float, double, int, float, float, int,
+				  float, float, int);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[17];
+  int res;
+
+  cl_arg_types[0] = &ffi_type_float;
+  cl_arg_types[1] = &ffi_type_float;
+  cl_arg_types[2] = &ffi_type_float;
+  cl_arg_types[3] = &ffi_type_float;
+  cl_arg_types[4] = &ffi_type_float;
+  cl_arg_types[5] = &ffi_type_float;
+  cl_arg_types[6] = &ffi_type_float;
+  cl_arg_types[7] = &ffi_type_float;
+  cl_arg_types[8] = &ffi_type_double;
+  cl_arg_types[9] = &ffi_type_sint;
+  cl_arg_types[10] = &ffi_type_float;
+  cl_arg_types[11] = &ffi_type_float;
+  cl_arg_types[12] = &ffi_type_sint;
+  cl_arg_types[13] = &ffi_type_float;
+  cl_arg_types[14] = &ffi_type_float;
+  cl_arg_types[15] = &ffi_type_sint;
+  cl_arg_types[16] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
+		     &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn3,
+                             (void *) 3 /* userdata */, code)  == FFI_OK);
+
+  res = (*((closure_test_type3)code))
+    (1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9, 10, 11.11, 12.0, 13,
+     19.19, 21.21, 1);
+  /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 19 21 1 3: 135" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 135" } */
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c
new file mode 100644
index 0000000..d4a1530
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c
@@ -0,0 +1,89 @@
+/* Area:	closure_call
+   Purpose:	Check multiple long long values passing.
+		Also, exceed the limit of gpr and fpr registers on PowerPC
+		Darwin.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20031026	 */
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+
+static void
+closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		 void* userdata)
+{
+  *(ffi_arg*)resp =
+    (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] +
+    (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] +
+    (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] +
+    (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] +
+    (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] +
+    (int)*(unsigned long long *)args[10] +
+    (int)*(unsigned long long *)args[11] +
+    (int)*(unsigned long long *)args[12] +
+    (int)*(unsigned long long *)args[13] +
+    (int)*(unsigned long long *)args[14] +
+    *(int *)args[15] + (intptr_t)userdata;
+
+  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
+	 (int)*(unsigned long long *)args[0],
+	 (int)*(unsigned long long *)args[1],
+	 (int)*(unsigned long long *)args[2],
+	 (int)*(unsigned long long *)args[3],
+	 (int)*(unsigned long long *)args[4],
+	 (int)*(unsigned long long *)args[5],
+	 (int)*(unsigned long long *)args[6],
+	 (int)*(unsigned long long *)args[7],
+	 (int)*(unsigned long long *)args[8],
+	 (int)*(unsigned long long *)args[9],
+	 (int)*(unsigned long long *)args[10],
+	 (int)*(unsigned long long *)args[11],
+	 (int)*(unsigned long long *)args[12],
+	 (int)*(unsigned long long *)args[13],
+	 (int)*(unsigned long long *)args[14],
+	 *(int *)args[15],
+	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
+
+}
+
+typedef int (*closure_test_type0)(unsigned long long, unsigned long long,
+				  unsigned long long, unsigned long long,
+				  unsigned long long, unsigned long long,
+				  unsigned long long, unsigned long long,
+				  unsigned long long, unsigned long long,
+				  unsigned long long, unsigned long long,
+				  unsigned long long, unsigned long long,
+				  unsigned long long, int);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[17];
+  int i, res;
+
+  for (i = 0; i < 15; i++) {
+    cl_arg_types[i] = &ffi_type_uint64;
+  }
+  cl_arg_types[15] = &ffi_type_sint;
+  cl_arg_types[16] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
+		     &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0,
+                             (void *) 3 /* userdata */, code) == FFI_OK);
+
+  res = (*((closure_test_type0)code))
+    (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL,
+     13LL, 19LL, 21LL, 1);
+  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 680" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c
new file mode 100644
index 0000000..9907442
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c
@@ -0,0 +1,92 @@
+/* Area:	closure_call
+   Purpose:	Check multiple long long values passing.
+		Exceed the limit of gpr registers on PowerPC
+		Darwin.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20031026	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void
+closure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		 void* userdata)
+{
+  *(ffi_arg*)resp =
+    (int)*(unsigned long long *)args[0] + (int)*(unsigned long long *)args[1] +
+    (int)*(unsigned long long *)args[2] + (int)*(unsigned long long *)args[3] +
+    (int)*(unsigned long long *)args[4] + (int)*(unsigned long long *)args[5] +
+    (int)*(unsigned long long *)args[6] + (int)*(unsigned long long *)args[7] +
+    (int)*(unsigned long long *)args[8] + (int)*(unsigned long long *)args[9] +
+    (int)*(int *)args[10] +
+    (int)*(unsigned long long *)args[11] +
+    (int)*(unsigned long long *)args[12] +
+    (int)*(unsigned long long *)args[13] +
+    (int)*(unsigned long long *)args[14] +
+    *(int *)args[15] + (intptr_t)userdata;
+
+  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
+	 (int)*(unsigned long long *)args[0],
+	 (int)*(unsigned long long *)args[1],
+	 (int)*(unsigned long long *)args[2],
+	 (int)*(unsigned long long *)args[3],
+	 (int)*(unsigned long long *)args[4],
+	 (int)*(unsigned long long *)args[5],
+	 (int)*(unsigned long long *)args[6],
+	 (int)*(unsigned long long *)args[7],
+	 (int)*(unsigned long long *)args[8],
+	 (int)*(unsigned long long *)args[9],
+	 (int)*(int *)args[10],
+	 (int)*(unsigned long long *)args[11],
+	 (int)*(unsigned long long *)args[12],
+	 (int)*(unsigned long long *)args[13],
+	 (int)*(unsigned long long *)args[14],
+	 *(int *)args[15],
+	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
+
+}
+
+typedef int (*closure_test_type0)(unsigned long long, unsigned long long,
+				  unsigned long long, unsigned long long,
+				  unsigned long long, unsigned long long,
+				  unsigned long long, unsigned long long,
+				  unsigned long long, unsigned long long,
+				  int, unsigned long long,
+				  unsigned long long, unsigned long long,
+				  unsigned long long, int);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[17];
+  int i, res;
+
+  for (i = 0; i < 10; i++) {
+    cl_arg_types[i] = &ffi_type_uint64;
+  }
+  cl_arg_types[10] = &ffi_type_sint;
+  for (i = 11; i < 15; i++) {
+    cl_arg_types[i] = &ffi_type_uint64;
+  }
+  cl_arg_types[15] = &ffi_type_sint;
+  cl_arg_types[16] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
+		     &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn5,
+                             (void *) 3 /* userdata */, code) == FFI_OK);
+
+  res = (*((closure_test_type0)code))
+    (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL,
+     13LL, 19LL, 21LL, 1);
+  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 680" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c
new file mode 100644
index 0000000..73c54fd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c
@@ -0,0 +1,90 @@
+/* Area:	closure_call
+   Purpose:	Check multiple values passing from different type.
+		Also, exceed the limit of gpr and fpr registers on PowerPC.
+   Limitations:	none.
+   PR:		PR23404
+   Originator:	<andreast@gcc.gnu.org> 20050830	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void
+closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		 void* userdata)
+{
+  *(ffi_arg*)resp =
+    (int)*(unsigned long long *)args[0] +
+    (int)(*(unsigned long long *)args[1]) +
+    (int)(*(unsigned long long *)args[2]) +
+    (int)*(unsigned long long *)args[3] +
+    (int)(*(int *)args[4]) + (int)(*(double *)args[5]) +
+    (int)*(double *)args[6] + (int)(*(float *)args[7]) +
+    (int)(*(double *)args[8]) + (int)*(double *)args[9] +
+    (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
+    (int)*(int *)args[12] + (int)(*(int *)args[13]) +
+    (int)(*(double *)args[14]) +  (int)*(double *)args[15] +
+    (intptr_t)userdata;
+
+  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
+	 (int)*(unsigned long long  *)args[0],
+	 (int)(*(unsigned long long  *)args[1]),
+	 (int)(*(unsigned long long  *)args[2]),
+	 (int)*(unsigned long long  *)args[3],
+	 (int)(*(int *)args[4]), (int)(*(double *)args[5]),
+	 (int)*(double *)args[6], (int)(*(float *)args[7]),
+	 (int)(*(double *)args[8]), (int)*(double *)args[9],
+	 (int)(*(int *)args[10]), (int)(*(float *)args[11]),
+	 (int)*(int *)args[12], (int)(*(int *)args[13]),
+	 (int)(*(double *)args[14]), (int)(*(double *)args[15]),
+	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
+
+}
+
+typedef int (*closure_test_type0)(unsigned long long,
+				  unsigned long long,
+				  unsigned long long,
+				  unsigned long long,
+				  int, double, double, float, double, double,
+				  int, float, int, int, double, double);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[17];
+  int res;
+
+  cl_arg_types[0] = &ffi_type_uint64;
+  cl_arg_types[1] = &ffi_type_uint64;
+  cl_arg_types[2] = &ffi_type_uint64;
+  cl_arg_types[3] = &ffi_type_uint64;
+  cl_arg_types[4] = &ffi_type_sint;
+  cl_arg_types[5] = &ffi_type_double;
+  cl_arg_types[6] = &ffi_type_double;
+  cl_arg_types[7] = &ffi_type_float;
+  cl_arg_types[8] = &ffi_type_double;
+  cl_arg_types[9] = &ffi_type_double;
+  cl_arg_types[10] = &ffi_type_sint;
+  cl_arg_types[11] = &ffi_type_float;
+  cl_arg_types[12] = &ffi_type_sint;
+  cl_arg_types[13] = &ffi_type_sint;
+  cl_arg_types[14] = &ffi_type_double;
+  cl_arg_types[15] = &ffi_type_double;
+  cl_arg_types[16] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
+		     &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0,
+                             (void *) 3 /* userdata */, code) == FFI_OK);
+
+  res = (*((closure_test_type0)code))
+    (1, 2, 3, 4, 127, 429., 7., 8., 9.5, 10., 11, 12., 13,
+     19, 21., 1.);
+  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 680" } */
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c
new file mode 100644
index 0000000..b3afa0b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c
@@ -0,0 +1,95 @@
+/* Area:	closure_call
+   Purpose:	Check multiple values passing from different type.
+		Also, exceed the limit of gpr and fpr registers on PowerPC
+		Darwin.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+
+
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void
+closure_loc_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		 void* userdata)
+{
+  *(ffi_arg*)resp =
+    (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) +
+    (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] +
+    (int)(*(signed short *)args[4]) +
+    (int)(*(unsigned long long *)args[5]) +
+    (int)*(int *)args[6] + (int)(*(int *)args[7]) +
+    (int)(*(double *)args[8]) + (int)*(int *)args[9] +
+    (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
+    (int)*(int *)args[12] + (int)(*(int *)args[13]) +
+    (int)(*(int *)args[14]) +  *(int *)args[15] + (intptr_t)userdata;
+
+  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
+	 (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]),
+	 (int)(*(unsigned long long *)args[2]),
+	 (int)*(int *)args[3], (int)(*(signed short *)args[4]),
+	 (int)(*(unsigned long long *)args[5]),
+	 (int)*(int *)args[6], (int)(*(int *)args[7]),
+	 (int)(*(double *)args[8]), (int)*(int *)args[9],
+	 (int)(*(int *)args[10]), (int)(*(float *)args[11]),
+	 (int)*(int *)args[12], (int)(*(int *)args[13]),
+	 (int)(*(int *)args[14]),*(int *)args[15],
+	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
+
+}
+
+typedef int (*closure_loc_test_type0)(unsigned long long, int, unsigned long long,
+				  int, signed short, unsigned long long, int,
+				  int, double, int, int, float, int, int,
+				  int, int);
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_closure *pcl;
+  ffi_type * cl_arg_types[17];
+  int res;
+  void *codeloc;
+
+  cl_arg_types[0] = &ffi_type_uint64;
+  cl_arg_types[1] = &ffi_type_sint;
+  cl_arg_types[2] = &ffi_type_uint64;
+  cl_arg_types[3] = &ffi_type_sint;
+  cl_arg_types[4] = &ffi_type_sshort;
+  cl_arg_types[5] = &ffi_type_uint64;
+  cl_arg_types[6] = &ffi_type_sint;
+  cl_arg_types[7] = &ffi_type_sint;
+  cl_arg_types[8] = &ffi_type_double;
+  cl_arg_types[9] = &ffi_type_sint;
+  cl_arg_types[10] = &ffi_type_sint;
+  cl_arg_types[11] = &ffi_type_float;
+  cl_arg_types[12] = &ffi_type_sint;
+  cl_arg_types[13] = &ffi_type_sint;
+  cl_arg_types[14] = &ffi_type_sint;
+  cl_arg_types[15] = &ffi_type_sint;
+  cl_arg_types[16] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
+		     &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+  pcl = ffi_closure_alloc(sizeof(ffi_closure), &codeloc);
+  CHECK(pcl != NULL);
+  CHECK(codeloc != NULL);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_loc_test_fn0,
+			 (void *) 3 /* userdata */, codeloc) == FFI_OK);
+  
+  CHECK(memcmp(pcl, codeloc, sizeof(*pcl)) == 0);
+
+  res = (*((closure_loc_test_type0)codeloc))
+    (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13,
+     19, 21, 1);
+  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 680" } */
+     exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c
new file mode 100644
index 0000000..6bfcc1f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c
@@ -0,0 +1,64 @@
+/* Area:	closure_call (stdcall convention)
+   Purpose:	Check handling when caller expects stdcall callee
+   Limitations:	none.
+   PR:		none.
+   Originator:	<twalljava@dev.java.net> */
+
+/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
+#include "ffitest.h"
+
+static void
+closure_test_stdcall(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		 void* userdata)
+{
+  *(ffi_arg*)resp =
+    (int)*(int *)args[0] + (int)(*(int *)args[1])
+    + (int)(*(int *)args[2])  + (int)(*(int *)args[3])
+    + (int)(intptr_t)userdata;
+
+  printf("%d %d %d %d: %d\n",
+	 (int)*(int *)args[0], (int)(*(int *)args[1]),
+	 (int)(*(int *)args[2]), (int)(*(int *)args[3]),
+         (int)*(ffi_arg *)resp);
+
+}
+
+typedef int (__stdcall *closure_test_type0)(int, int, int, int);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[17];
+  int res;
+  void* sp_pre;
+  void* sp_post;
+  char buf[1024];
+
+  cl_arg_types[0] = &ffi_type_uint;
+  cl_arg_types[1] = &ffi_type_uint;
+  cl_arg_types[2] = &ffi_type_uint;
+  cl_arg_types[3] = &ffi_type_uint;
+  cl_arg_types[4] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 4,
+		     &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_stdcall,
+                             (void *) 3 /* userdata */, code) == FFI_OK);
+
+  asm volatile (" movl %%esp,%0" : "=g" (sp_pre));
+  res = (*(closure_test_type0)code)(0, 1, 2, 3);
+  asm volatile (" movl %%esp,%0" : "=g" (sp_post));
+  /* { dg-output "0 1 2 3: 9" } */
+
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 9" } */
+
+  sprintf(buf, "mismatch: pre=%p vs post=%p", sp_pre, sp_post);
+  printf("stack pointer %s\n", (sp_pre == sp_post ? "match" : buf));
+  /* { dg-output "\nstack pointer match" } */
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c
new file mode 100644
index 0000000..f0a334f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c
@@ -0,0 +1,94 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_12byte {
+  int a;
+  int b;
+  int c;
+} cls_struct_12byte;
+
+cls_struct_12byte cls_struct_12byte_fn(struct cls_struct_12byte b1,
+			    struct cls_struct_12byte b2)
+{
+  struct cls_struct_12byte result;
+
+  result.a = b1.a + b2.a;
+  result.b = b1.b + b2.b;
+  result.c = b1.c + b2.c;
+
+  printf("%d %d %d %d %d %d: %d %d %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c,
+	 result.a, result.b, result.c);
+
+  return result;
+}
+
+static void cls_struct_12byte_gn(ffi_cif* cif __UNUSED__, void* resp,
+				 void** args , void* userdata __UNUSED__)
+{
+  struct cls_struct_12byte b1, b2;
+
+  b1 = *(struct cls_struct_12byte*)(args[0]);
+  b2 = *(struct cls_struct_12byte*)(args[1]);
+
+  *(cls_struct_12byte*)resp = cls_struct_12byte_fn(b1, b2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_12byte h_dbl = { 7, 4, 9 };
+  struct cls_struct_12byte j_dbl = { 1, 5, 3 };
+  struct cls_struct_12byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_sint;
+  cls_struct_fields[1] = &ffi_type_sint;
+  cls_struct_fields[2] = &ffi_type_sint;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &h_dbl;
+  args_dbl[1] = &j_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_12byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "7 4 9 1 5 3: 8 9 12" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 8 9 12" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_12byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl.a = 0;
+  res_dbl.b = 0;
+  res_dbl.c = 0;
+
+  res_dbl = ((cls_struct_12byte(*)(cls_struct_12byte, cls_struct_12byte))(code))(h_dbl, j_dbl);
+  /* { dg-output "\n7 4 9 1 5 3: 8 9 12" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 8 9 12" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c
new file mode 100644
index 0000000..9b9292a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c
@@ -0,0 +1,95 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_16byte {
+  int a;
+  double b;
+  int c;
+} cls_struct_16byte;
+
+cls_struct_16byte cls_struct_16byte_fn(struct cls_struct_16byte b1,
+			    struct cls_struct_16byte b2)
+{
+  struct cls_struct_16byte result;
+
+  result.a = b1.a + b2.a;
+  result.b = b1.b + b2.b;
+  result.c = b1.c + b2.c;
+
+  printf("%d %g %d %d %g %d: %d %g %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c,
+	 result.a, result.b, result.c);
+
+  return result;
+}
+
+static void cls_struct_16byte_gn(ffi_cif* cif __UNUSED__, void* resp,
+				 void** args, void* userdata __UNUSED__)
+{
+  struct cls_struct_16byte b1, b2;
+
+  b1 = *(struct cls_struct_16byte*)(args[0]);
+  b2 = *(struct cls_struct_16byte*)(args[1]);
+
+  *(cls_struct_16byte*)resp = cls_struct_16byte_fn(b1, b2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_16byte h_dbl = { 7, 8.0, 9 };
+  struct cls_struct_16byte j_dbl = { 1, 9.0, 3 };
+  struct cls_struct_16byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_sint;
+  cls_struct_fields[1] = &ffi_type_double;
+  cls_struct_fields[2] = &ffi_type_sint;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &h_dbl;
+  args_dbl[1] = &j_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_16byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "7 8 9 1 9 3: 8 17 12" } */
+  printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 8 17 12" } */
+
+  res_dbl.a = 0;
+  res_dbl.b = 0.0;
+  res_dbl.c = 0;
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_16byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_16byte(*)(cls_struct_16byte, cls_struct_16byte))(code))(h_dbl, j_dbl);
+  /* { dg-output "\n7 8 9 1 9 3: 8 17 12" } */
+  printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 8 17 12" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c
new file mode 100644
index 0000000..40c8c6d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c
@@ -0,0 +1,96 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Double alignment check on darwin.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030915	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_18byte {
+  double a;
+  unsigned char b;
+  unsigned char c;
+  double d;
+} cls_struct_18byte;
+
+cls_struct_18byte cls_struct_18byte_fn(struct cls_struct_18byte a1,
+			    struct cls_struct_18byte a2)
+{
+  struct cls_struct_18byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+  result.d = a1.d + a2.d;
+
+
+  printf("%g %d %d %g %g %d %d %g: %g %d %d %g\n", a1.a, a1.b, a1.c, a1.d,
+	 a2.a, a2.b, a2.c, a2.d,
+	 result.a, result.b, result.c, result.d);
+  return result;
+}
+
+static void
+cls_struct_18byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		     void* userdata __UNUSED__)
+{
+  struct cls_struct_18byte a1, a2;
+
+  a1 = *(struct cls_struct_18byte*)(args[0]);
+  a2 = *(struct cls_struct_18byte*)(args[1]);
+
+  *(cls_struct_18byte*)resp = cls_struct_18byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[3];
+  ffi_type* cls_struct_fields[5];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[3];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_18byte g_dbl = { 1.0, 127, 126, 3.0 };
+  struct cls_struct_18byte f_dbl = { 4.0, 125, 124, 5.0 };
+  struct cls_struct_18byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_double;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = &ffi_type_double;
+  cls_struct_fields[4] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_18byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 127 126 3 4 125 124 5: 5 252 250 8" } */
+  printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
+  /* { dg-output "\nres: 5 252 250 8" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_18byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_18byte(*)(cls_struct_18byte, cls_struct_18byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n1 127 126 3 4 125 124 5: 5 252 250 8" } */
+  printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
+  /* { dg-output "\nres: 5 252 250 8" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c
new file mode 100644
index 0000000..aa64248
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c
@@ -0,0 +1,102 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Double alignment check on darwin.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030915	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_19byte {
+  double a;
+  unsigned char b;
+  unsigned char c;
+  double d;
+  unsigned char e;
+} cls_struct_19byte;
+
+cls_struct_19byte cls_struct_19byte_fn(struct cls_struct_19byte a1,
+			    struct cls_struct_19byte a2)
+{
+  struct cls_struct_19byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+  result.d = a1.d + a2.d;
+  result.e = a1.e + a2.e;
+
+
+  printf("%g %d %d %g %d %g %d %d %g %d: %g %d %d %g %d\n",
+	 a1.a, a1.b, a1.c, a1.d, a1.e,
+	 a2.a, a2.b, a2.c, a2.d, a2.e,
+	 result.a, result.b, result.c, result.d, result.e);
+  return result;
+}
+
+static void
+cls_struct_19byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		     void* userdata __UNUSED__)
+{
+  struct cls_struct_19byte a1, a2;
+
+  a1 = *(struct cls_struct_19byte*)(args[0]);
+  a2 = *(struct cls_struct_19byte*)(args[1]);
+
+  *(cls_struct_19byte*)resp = cls_struct_19byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[3];
+  ffi_type* cls_struct_fields[6];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[3];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_19byte g_dbl = { 1.0, 127, 126, 3.0, 120 };
+  struct cls_struct_19byte f_dbl = { 4.0, 125, 124, 5.0, 119 };
+  struct cls_struct_19byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_double;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = &ffi_type_double;
+  cls_struct_fields[4] = &ffi_type_uchar;
+  cls_struct_fields[5] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_19byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */
+  printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
+	 res_dbl.d, res_dbl.e);
+  /* { dg-output "\nres: 5 252 250 8 239" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_19byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_19byte(*)(cls_struct_19byte, cls_struct_19byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */
+  printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
+	 res_dbl.d, res_dbl.e);
+  /* { dg-output "\nres: 5 252 250 8 239" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c
new file mode 100644
index 0000000..b9402d6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c
@@ -0,0 +1,89 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Especially with small structures which may fit in one
+		register. Depending on the ABI.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030902	 */
+
+
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_1_1byte {
+  unsigned char a;
+} cls_struct_1_1byte;
+
+cls_struct_1_1byte cls_struct_1_1byte_fn(struct cls_struct_1_1byte a1,
+			    struct cls_struct_1_1byte a2)
+{
+  struct cls_struct_1_1byte result;
+
+  result.a = a1.a + a2.a;
+
+  printf("%d %d: %d\n", a1.a, a2.a, result.a);
+
+  return  result;
+}
+
+static void
+cls_struct_1_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		      void* userdata __UNUSED__)
+{
+
+  struct cls_struct_1_1byte a1, a2;
+
+  a1 = *(struct cls_struct_1_1byte*)(args[0]);
+  a2 = *(struct cls_struct_1_1byte*)(args[1]);
+
+  *(cls_struct_1_1byte*)resp = cls_struct_1_1byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[2];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_1_1byte g_dbl = { 12 };
+  struct cls_struct_1_1byte f_dbl = { 178 };
+  struct cls_struct_1_1byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_1_1byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 178: 190" } */
+  printf("res: %d\n", res_dbl.a);
+  /* { dg-output "\nres: 190" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_1_1byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_1_1byte(*)(cls_struct_1_1byte, cls_struct_1_1byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 178: 190" } */
+  printf("res: %d\n", res_dbl.a);
+  /* { dg-output "\nres: 190" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c
new file mode 100644
index 0000000..80dd7ac
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c
@@ -0,0 +1,91 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_20byte {
+  double a;
+  double b;
+  int c;
+} cls_struct_20byte;
+
+cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1,
+			    struct cls_struct_20byte a2)
+{
+  struct cls_struct_20byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%g %g %d %g %g %d: %g %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c,
+	 result.a, result.b, result.c);
+  return result;
+}
+
+static void
+cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		     void* userdata __UNUSED__)
+{
+  struct cls_struct_20byte a1, a2;
+
+  a1 = *(struct cls_struct_20byte*)(args[0]);
+  a2 = *(struct cls_struct_20byte*)(args[1]);
+
+  *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_20byte g_dbl = { 1.0, 2.0, 3 };
+  struct cls_struct_20byte f_dbl = { 4.0, 5.0, 7 };
+  struct cls_struct_20byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_double;
+  cls_struct_fields[1] = &ffi_type_double;
+  cls_struct_fields[2] = &ffi_type_sint;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 2 3 4 5 7: 5 7 10" } */
+  printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 5 7 10" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */
+  printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 5 7 10" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c
new file mode 100644
index 0000000..50bcbbf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c
@@ -0,0 +1,93 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_20byte {
+  int a;
+  double b;
+  double c;
+} cls_struct_20byte;
+
+cls_struct_20byte cls_struct_20byte_fn(struct cls_struct_20byte a1,
+			    struct cls_struct_20byte a2)
+{
+  struct cls_struct_20byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %g %g %d %g %g: %d %g %g\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c,
+	 result.a, result.b, result.c);
+  return result;
+}
+
+static void
+cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		     void* userdata __UNUSED__)
+{
+  struct cls_struct_20byte a1, a2;
+
+  a1 = *(struct cls_struct_20byte*)(args[0]);
+  a2 = *(struct cls_struct_20byte*)(args[1]);
+
+  *(cls_struct_20byte*)resp = cls_struct_20byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[3];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[3];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_20byte g_dbl = { 1, 2.0, 3.0 };
+  struct cls_struct_20byte f_dbl = { 4, 5.0, 7.0 };
+  struct cls_struct_20byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_sint;
+  cls_struct_fields[1] = &ffi_type_double;
+  cls_struct_fields[2] = &ffi_type_double;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_20byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 2 3 4 5 7: 5 7 10" } */
+  printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 5 7 10" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */
+  printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 5 7 10" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c
new file mode 100644
index 0000000..46a6eb4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c
@@ -0,0 +1,113 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_24byte {
+  double a;
+  double b;
+  int c;
+  float d;
+} cls_struct_24byte;
+
+cls_struct_24byte cls_struct_24byte_fn(struct cls_struct_24byte b0,
+			    struct cls_struct_24byte b1,
+			    struct cls_struct_24byte b2,
+			    struct cls_struct_24byte b3)
+{
+  struct cls_struct_24byte result;
+
+  result.a = b0.a + b1.a + b2.a + b3.a;
+  result.b = b0.b + b1.b + b2.b + b3.b;
+  result.c = b0.c + b1.c + b2.c + b3.c;
+  result.d = b0.d + b1.d + b2.d + b3.d;
+
+  printf("%g %g %d %g %g %g %d %g %g %g %d %g %g %g %d %g: %g %g %d %g\n",
+	 b0.a, b0.b, b0.c, b0.d,
+	 b1.a, b1.b, b1.c, b1.d,
+	 b2.a, b2.b, b2.c, b2.d,
+	 b3.a, b3.b, b3.c, b2.d,
+	 result.a, result.b, result.c, result.d);
+
+  return result;
+}
+
+static void
+cls_struct_24byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		     void* userdata __UNUSED__)
+{
+  struct cls_struct_24byte b0, b1, b2, b3;
+
+  b0 = *(struct cls_struct_24byte*)(args[0]);
+  b1 = *(struct cls_struct_24byte*)(args[1]);
+  b2 = *(struct cls_struct_24byte*)(args[2]);
+  b3 = *(struct cls_struct_24byte*)(args[3]);
+
+  *(cls_struct_24byte*)resp = cls_struct_24byte_fn(b0, b1, b2, b3);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[5];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_24byte e_dbl = { 9.0, 2.0, 6, 5.0 };
+  struct cls_struct_24byte f_dbl = { 1.0, 2.0, 3, 7.0 };
+  struct cls_struct_24byte g_dbl = { 4.0, 5.0, 7, 9.0 };
+  struct cls_struct_24byte h_dbl = { 8.0, 6.0, 1, 4.0 };
+  struct cls_struct_24byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_double;
+  cls_struct_fields[1] = &ffi_type_double;
+  cls_struct_fields[2] = &ffi_type_sint;
+  cls_struct_fields[3] = &ffi_type_float;
+  cls_struct_fields[4] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = &cls_struct_type;
+  dbl_arg_types[3] = &cls_struct_type;
+  dbl_arg_types[4] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = &g_dbl;
+  args_dbl[3] = &h_dbl;
+  args_dbl[4] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_24byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */
+  printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
+  /* { dg-output "\nres: 22 15 17 25" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_24byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_24byte(*)(cls_struct_24byte,
+				   cls_struct_24byte,
+				   cls_struct_24byte,
+				   cls_struct_24byte))
+	     (code))(e_dbl, f_dbl, g_dbl, h_dbl);
+  /* { dg-output "\n9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */
+  printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
+  /* { dg-output "\nres: 22 15 17 25" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c
new file mode 100644
index 0000000..101e130
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c
@@ -0,0 +1,90 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Especially with small structures which may fit in one
+		register. Depending on the ABI.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_2byte {
+  unsigned char a;
+  unsigned char b;
+} cls_struct_2byte;
+
+cls_struct_2byte cls_struct_2byte_fn(struct cls_struct_2byte a1,
+			    struct cls_struct_2byte a2)
+{
+  struct cls_struct_2byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+
+  printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
+
+  return  result;
+}
+
+static void
+cls_struct_2byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_2byte a1, a2;
+
+  a1 = *(struct cls_struct_2byte*)(args[0]);
+  a2 = *(struct cls_struct_2byte*)(args[1]);
+
+  *(cls_struct_2byte*)resp = cls_struct_2byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_2byte g_dbl = { 12, 127 };
+  struct cls_struct_2byte f_dbl = { 1, 13 };
+  struct cls_struct_2byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_2byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 127 1 13: 13 140" } */
+  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 13 140" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_2byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_2byte(*)(cls_struct_2byte, cls_struct_2byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 127 1 13: 13 140" } */
+  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 13 140" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c
new file mode 100644
index 0000000..fc780c3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c
@@ -0,0 +1,95 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Especially with small structures which may fit in one
+		register. Depending on the ABI.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030902	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_3_1byte {
+  unsigned char a;
+  unsigned char b;
+  unsigned char c;
+} cls_struct_3_1byte;
+
+cls_struct_3_1byte cls_struct_3_1byte_fn(struct cls_struct_3_1byte a1,
+			    struct cls_struct_3_1byte a2)
+{
+  struct cls_struct_3_1byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c,
+	 a2.a, a2.b, a2.c,
+	 result.a, result.b, result.c);
+
+  return  result;
+}
+
+static void
+cls_struct_3_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		      void* userdata __UNUSED__)
+{
+
+  struct cls_struct_3_1byte a1, a2;
+
+  a1 = *(struct cls_struct_3_1byte*)(args[0]);
+  a2 = *(struct cls_struct_3_1byte*)(args[1]);
+
+  *(cls_struct_3_1byte*)resp = cls_struct_3_1byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_3_1byte g_dbl = { 12, 13, 14 };
+  struct cls_struct_3_1byte f_dbl = { 178, 179, 180 };
+  struct cls_struct_3_1byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_3_1byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 13 14 178 179 180: 190 192 194" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 190 192 194" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3_1byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_3_1byte(*)(cls_struct_3_1byte, cls_struct_3_1byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 13 14 178 179 180: 190 192 194" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 190 192 194" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c
new file mode 100644
index 0000000..5705ce3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c
@@ -0,0 +1,90 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Especially with small structures which may fit in one
+		register. Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_3byte {
+  unsigned short a;
+  unsigned char b;
+} cls_struct_3byte;
+
+cls_struct_3byte cls_struct_3byte_fn(struct cls_struct_3byte a1,
+			    struct cls_struct_3byte a2)
+{
+  struct cls_struct_3byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+
+  printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
+
+  return  result;
+}
+
+static void
+cls_struct_3byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_3byte a1, a2;
+
+  a1 = *(struct cls_struct_3byte*)(args[0]);
+  a2 = *(struct cls_struct_3byte*)(args[1]);
+
+  *(cls_struct_3byte*)resp = cls_struct_3byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_3byte g_dbl = { 12, 119 };
+  struct cls_struct_3byte f_dbl = { 1, 15 };
+  struct cls_struct_3byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_ushort;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_3byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 119 1 15: 13 134" } */
+  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 13 134" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_3byte(*)(cls_struct_3byte, cls_struct_3byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 119 1 15: 13 134" } */
+  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 13 134" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c
new file mode 100644
index 0000000..01770a0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c
@@ -0,0 +1,90 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Especially with small structures which may fit in one
+		register. Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_3byte_1 {
+  unsigned char a;
+  unsigned short b;
+} cls_struct_3byte_1;
+
+cls_struct_3byte_1 cls_struct_3byte_fn1(struct cls_struct_3byte_1 a1,
+			    struct cls_struct_3byte_1 a2)
+{
+  struct cls_struct_3byte_1 result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+
+  printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
+
+  return  result;
+}
+
+static void
+cls_struct_3byte_gn1(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		     void* userdata __UNUSED__)
+{
+
+  struct cls_struct_3byte_1 a1, a2;
+
+  a1 = *(struct cls_struct_3byte_1*)(args[0]);
+  a2 = *(struct cls_struct_3byte_1*)(args[1]);
+
+  *(cls_struct_3byte_1*)resp = cls_struct_3byte_fn1(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_3byte_1 g_dbl = { 15, 125 };
+  struct cls_struct_3byte_1 f_dbl = { 9, 19 };
+  struct cls_struct_3byte_1 res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_ushort;
+  cls_struct_fields[2] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_3byte_fn1), &res_dbl, args_dbl);
+  /* { dg-output "15 125 9 19: 24 144" } */
+  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 24 144" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn1, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_3byte_1(*)(cls_struct_3byte_1, cls_struct_3byte_1))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n15 125 9 19: 24 144" } */
+  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 24 144" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c
new file mode 100644
index 0000000..f3806d7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c
@@ -0,0 +1,98 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Especially with small structures which may fit in one
+		register. Depending on the ABI.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030902	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_4_1byte {
+  unsigned char a;
+  unsigned char b;
+  unsigned char c;
+  unsigned char d;
+} cls_struct_4_1byte;
+
+cls_struct_4_1byte cls_struct_4_1byte_fn(struct cls_struct_4_1byte a1,
+			    struct cls_struct_4_1byte a2)
+{
+  struct cls_struct_4_1byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+  result.d = a1.d + a2.d;
+
+  printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d,
+	 a2.a, a2.b, a2.c, a2.d,
+	 result.a, result.b, result.c, result.d);
+
+  return  result;
+}
+
+static void
+cls_struct_4_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		      void* userdata __UNUSED__)
+{
+
+  struct cls_struct_4_1byte a1, a2;
+
+  a1 = *(struct cls_struct_4_1byte*)(args[0]);
+  a2 = *(struct cls_struct_4_1byte*)(args[1]);
+
+  *(cls_struct_4_1byte*)resp = cls_struct_4_1byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[5];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_4_1byte g_dbl = { 12, 13, 14, 15 };
+  struct cls_struct_4_1byte f_dbl = { 178, 179, 180, 181 };
+  struct cls_struct_4_1byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = &ffi_type_uchar;
+  cls_struct_fields[4] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_4_1byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 13 14 15 178 179 180 181: 190 192 194 196" } */
+  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
+  /* { dg-output "\nres: 190 192 194 196" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4_1byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_4_1byte(*)(cls_struct_4_1byte, cls_struct_4_1byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 13 14 15 178 179 180 181: 190 192 194 196" } */
+  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
+  /* { dg-output "\nres: 190 192 194 196" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c
new file mode 100644
index 0000000..a1aba3c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c
@@ -0,0 +1,90 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+
+typedef struct cls_struct_4byte {
+  unsigned short a;
+  unsigned short b;
+} cls_struct_4byte;
+
+cls_struct_4byte cls_struct_4byte_fn(struct cls_struct_4byte a1,
+			    struct cls_struct_4byte a2)
+{
+  struct cls_struct_4byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+
+  printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
+
+  return  result;
+}
+
+static void
+cls_struct_4byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_4byte a1, a2;
+
+  a1 = *(struct cls_struct_4byte*)(args[0]);
+  a2 = *(struct cls_struct_4byte*)(args[1]);
+
+  *(cls_struct_4byte*)resp = cls_struct_4byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_4byte g_dbl = { 127, 120 };
+  struct cls_struct_4byte f_dbl = { 12, 128 };
+  struct cls_struct_4byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_ushort;
+  cls_struct_fields[1] = &ffi_type_ushort;
+  cls_struct_fields[2] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_4byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "127 120 12 128: 139 248" } */
+  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 139 248" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_4byte(*)(cls_struct_4byte, cls_struct_4byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n127 120 12 128: 139 248" } */
+  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 139 248" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c
new file mode 100644
index 0000000..2ceba3d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c
@@ -0,0 +1,109 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20050708	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_5byte {
+  unsigned char a;
+  unsigned char b;
+  unsigned char c;
+  unsigned char d;
+  unsigned char e;
+} cls_struct_5byte;
+
+cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1,
+			    struct cls_struct_5byte a2)
+{
+  struct cls_struct_5byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+  result.d = a1.d + a2.d;
+  result.e = a1.e + a2.e;
+
+  printf("%d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d\n",
+	 a1.a, a1.b, a1.c, a1.d, a1.e,
+	 a2.a, a2.b, a2.c, a2.d, a2.e,
+	 result.a, result.b, result.c, result.d, result.e);
+
+  return  result;
+}
+
+static void
+cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_5byte a1, a2;
+
+  a1 = *(struct cls_struct_5byte*)(args[0]);
+  a2 = *(struct cls_struct_5byte*)(args[1]);
+
+  *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[6];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_5byte g_dbl = { 127, 120, 1, 3, 4 };
+  struct cls_struct_5byte f_dbl = { 12, 128, 9, 3, 4 };
+  struct cls_struct_5byte res_dbl = { 0, 0, 0, 0, 0 };
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = &ffi_type_uchar;
+  cls_struct_fields[4] = &ffi_type_uchar;
+  cls_struct_fields[5] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */
+  printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
+	 res_dbl.d, res_dbl.e);
+  /* { dg-output "\nres: 139 248 10 6 8" } */
+
+  res_dbl.a = 0;
+  res_dbl.b = 0;
+  res_dbl.c = 0;
+  res_dbl.d = 0;
+  res_dbl.e = 0;
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n127 120 1 3 4 12 128 9 3 4: 139 248 10 6 8" } */
+  printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
+	 res_dbl.d, res_dbl.e);
+  /* { dg-output "\nres: 139 248 10 6 8" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c
new file mode 100644
index 0000000..61d595c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c
@@ -0,0 +1,98 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_5byte {
+  unsigned short a;
+  unsigned short b;
+  unsigned char c;
+} cls_struct_5byte;
+
+cls_struct_5byte cls_struct_5byte_fn(struct cls_struct_5byte a1,
+			    struct cls_struct_5byte a2)
+{
+  struct cls_struct_5byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c,
+	 a2.a, a2.b, a2.c,
+	 result.a, result.b, result.c);
+
+  return  result;
+}
+
+static void
+cls_struct_5byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_5byte a1, a2;
+
+  a1 = *(struct cls_struct_5byte*)(args[0]);
+  a2 = *(struct cls_struct_5byte*)(args[1]);
+
+  *(cls_struct_5byte*)resp = cls_struct_5byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_5byte g_dbl = { 127, 120, 1 };
+  struct cls_struct_5byte f_dbl = { 12, 128, 9 };
+  struct cls_struct_5byte res_dbl = { 0, 0, 0 };
+
+  cls_struct_fields[0] = &ffi_type_ushort;
+  cls_struct_fields[1] = &ffi_type_ushort;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_5byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "127 120 1 12 128 9: 139 248 10" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 139 248 10" } */
+
+  res_dbl.a = 0;
+  res_dbl.b = 0;
+  res_dbl.c = 0;
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_5byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_5byte(*)(cls_struct_5byte, cls_struct_5byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n127 120 1 12 128 9: 139 248 10" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 139 248 10" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c
new file mode 100644
index 0000000..576ebe0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c
@@ -0,0 +1,124 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check bigger struct which overlaps
+		the gp and fp register count on Darwin/AIX/ppc64.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_64byte {
+  double a;
+  double b;
+  double c;
+  double d;
+  double e;
+  double f;
+  double g;
+  double h;
+} cls_struct_64byte;
+
+cls_struct_64byte cls_struct_64byte_fn(struct cls_struct_64byte b0,
+			    struct cls_struct_64byte b1,
+			    struct cls_struct_64byte b2,
+			    struct cls_struct_64byte b3)
+{
+  struct cls_struct_64byte result;
+
+  result.a = b0.a + b1.a + b2.a + b3.a;
+  result.b = b0.b + b1.b + b2.b + b3.b;
+  result.c = b0.c + b1.c + b2.c + b3.c;
+  result.d = b0.d + b1.d + b2.d + b3.d;
+  result.e = b0.e + b1.e + b2.e + b3.e;
+  result.f = b0.f + b1.f + b2.f + b3.f;
+  result.g = b0.g + b1.g + b2.g + b3.g;
+  result.h = b0.h + b1.h + b2.h + b3.h;
+
+  printf("%g %g %g %g %g %g %g %g\n", result.a, result.b, result.c,
+	 result.d, result.e, result.f, result.g, result.h);
+
+  return result;
+}
+
+static void
+cls_struct_64byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		     void* userdata __UNUSED__)
+{
+  struct cls_struct_64byte b0, b1, b2, b3;
+
+  b0 = *(struct cls_struct_64byte*)(args[0]);
+  b1 = *(struct cls_struct_64byte*)(args[1]);
+  b2 = *(struct cls_struct_64byte*)(args[2]);
+  b3 = *(struct cls_struct_64byte*)(args[3]);
+
+  *(cls_struct_64byte*)resp = cls_struct_64byte_fn(b0, b1, b2, b3);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[9];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_64byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0 };
+  struct cls_struct_64byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0 };
+  struct cls_struct_64byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0 };
+  struct cls_struct_64byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0 };
+  struct cls_struct_64byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_double;
+  cls_struct_fields[1] = &ffi_type_double;
+  cls_struct_fields[2] = &ffi_type_double;
+  cls_struct_fields[3] = &ffi_type_double;
+  cls_struct_fields[4] = &ffi_type_double;
+  cls_struct_fields[5] = &ffi_type_double;
+  cls_struct_fields[6] = &ffi_type_double;
+  cls_struct_fields[7] = &ffi_type_double;
+  cls_struct_fields[8] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = &cls_struct_type;
+  dbl_arg_types[3] = &cls_struct_type;
+  dbl_arg_types[4] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = &g_dbl;
+  args_dbl[3] = &h_dbl;
+  args_dbl[4] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_64byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "22 15 17 25 6 13 19 18" } */
+  printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
+	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h);
+  /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_64byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_64byte(*)(cls_struct_64byte,
+				   cls_struct_64byte,
+				   cls_struct_64byte,
+				   cls_struct_64byte))
+	     (code))(e_dbl, f_dbl, g_dbl, h_dbl);
+  /* { dg-output "\n22 15 17 25 6 13 19 18" } */
+  printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
+	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h);
+  /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c
new file mode 100644
index 0000000..9f2eff6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c
@@ -0,0 +1,113 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20050708	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_6byte {
+  unsigned char a;
+  unsigned char b;
+  unsigned char c;
+  unsigned char d;
+  unsigned char e;
+  unsigned char f;
+} cls_struct_6byte;
+
+cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1,
+			    struct cls_struct_6byte a2)
+{
+  struct cls_struct_6byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+  result.d = a1.d + a2.d;
+  result.e = a1.e + a2.e;
+  result.f = a1.f + a2.f;
+
+  printf("%d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d\n",
+	 a1.a, a1.b, a1.c, a1.d, a1.e, a1.f,
+	 a2.a, a2.b, a2.c, a2.d, a2.e, a2.f,
+	 result.a, result.b, result.c, result.d, result.e, result.f);
+
+  return  result;
+}
+
+static void
+cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_6byte a1, a2;
+
+  a1 = *(struct cls_struct_6byte*)(args[0]);
+  a2 = *(struct cls_struct_6byte*)(args[1]);
+
+  *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[7];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_6byte g_dbl = { 127, 120, 1, 3, 4, 5 };
+  struct cls_struct_6byte f_dbl = { 12, 128, 9, 3, 4, 5 };
+  struct cls_struct_6byte res_dbl = { 0, 0, 0, 0, 0, 0 };
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = &ffi_type_uchar;
+  cls_struct_fields[4] = &ffi_type_uchar;
+  cls_struct_fields[5] = &ffi_type_uchar;
+  cls_struct_fields[6] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */
+  printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
+	 res_dbl.d, res_dbl.e, res_dbl.f);
+  /* { dg-output "\nres: 139 248 10 6 8 10" } */
+
+  res_dbl.a = 0;
+  res_dbl.b = 0;
+  res_dbl.c = 0;
+  res_dbl.d = 0;
+  res_dbl.e = 0;
+  res_dbl.f = 0;
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n127 120 1 3 4 5 12 128 9 3 4 5: 139 248 10 6 8 10" } */
+  printf("res: %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
+	 res_dbl.d, res_dbl.e, res_dbl.f);
+  /* { dg-output "\nres: 139 248 10 6 8 10" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c
new file mode 100644
index 0000000..73257b0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c
@@ -0,0 +1,99 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_6byte {
+  unsigned short a;
+  unsigned short b;
+  unsigned char c;
+  unsigned char d;
+} cls_struct_6byte;
+
+cls_struct_6byte cls_struct_6byte_fn(struct cls_struct_6byte a1,
+			    struct cls_struct_6byte a2)
+{
+  struct cls_struct_6byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+  result.d = a1.d + a2.d;
+
+  printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d,
+	 a2.a, a2.b, a2.c, a2.d,
+	 result.a, result.b, result.c, result.d);
+
+  return  result;
+}
+
+static void
+cls_struct_6byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_6byte a1, a2;
+
+  a1 = *(struct cls_struct_6byte*)(args[0]);
+  a2 = *(struct cls_struct_6byte*)(args[1]);
+
+  *(cls_struct_6byte*)resp = cls_struct_6byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[5];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_6byte g_dbl = { 127, 120, 1, 128 };
+  struct cls_struct_6byte f_dbl = { 12, 128, 9, 127 };
+  struct cls_struct_6byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_ushort;
+  cls_struct_fields[1] = &ffi_type_ushort;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = &ffi_type_uchar;
+  cls_struct_fields[4] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_6byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "127 120 1 128 12 128 9 127: 139 248 10 255" } */
+  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
+  /* { dg-output "\nres: 139 248 10 255" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_6byte(*)(cls_struct_6byte, cls_struct_6byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n127 120 1 128 12 128 9 127: 139 248 10 255" } */
+  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
+  /* { dg-output "\nres: 139 248 10 255" } */
+
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c
new file mode 100644
index 0000000..50d09c9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c
@@ -0,0 +1,117 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20050708	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_7byte {
+  unsigned char a;
+  unsigned char b;
+  unsigned char c;
+  unsigned char d;
+  unsigned char e;
+  unsigned char f;
+  unsigned char g;
+} cls_struct_7byte;
+
+cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1,
+			    struct cls_struct_7byte a2)
+{
+  struct cls_struct_7byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+  result.d = a1.d + a2.d;
+  result.e = a1.e + a2.e;
+  result.f = a1.f + a2.f;
+  result.g = a1.g + a2.g;
+
+  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d %d %d %d %d %d %d\n",
+	 a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
+	 a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
+	 result.a, result.b, result.c, result.d, result.e, result.f, result.g);
+
+  return  result;
+}
+
+static void
+cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_7byte a1, a2;
+
+  a1 = *(struct cls_struct_7byte*)(args[0]);
+  a2 = *(struct cls_struct_7byte*)(args[1]);
+
+  *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[8];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_7byte g_dbl = { 127, 120, 1, 3, 4, 5, 6 };
+  struct cls_struct_7byte f_dbl = { 12, 128, 9, 3, 4, 5, 6 };
+  struct cls_struct_7byte res_dbl = { 0, 0, 0, 0, 0, 0, 0 };
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = &ffi_type_uchar;
+  cls_struct_fields[4] = &ffi_type_uchar;
+  cls_struct_fields[5] = &ffi_type_uchar;
+  cls_struct_fields[6] = &ffi_type_uchar;
+  cls_struct_fields[7] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */
+  printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
+	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
+  /* { dg-output "\nres: 139 248 10 6 8 10 12" } */
+
+  res_dbl.a = 0;
+  res_dbl.b = 0;
+  res_dbl.c = 0;
+  res_dbl.d = 0;
+  res_dbl.e = 0;
+  res_dbl.f = 0;
+  res_dbl.g = 0;
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n127 120 1 3 4 5 6 12 128 9 3 4 5 6: 139 248 10 6 8 10 12" } */
+  printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
+	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
+  /* { dg-output "\nres: 139 248 10 6 8 10 12" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c
new file mode 100644
index 0000000..f5c0000
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c
@@ -0,0 +1,97 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_7byte {
+  unsigned short a;
+  unsigned short b;
+  unsigned char c;
+  unsigned short d;
+} cls_struct_7byte;
+
+cls_struct_7byte cls_struct_7byte_fn(struct cls_struct_7byte a1,
+			    struct cls_struct_7byte a2)
+{
+  struct cls_struct_7byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+  result.d = a1.d + a2.d;
+
+  printf("%d %d %d %d %d %d %d %d: %d %d %d %d\n", a1.a, a1.b, a1.c, a1.d,
+	 a2.a, a2.b, a2.c, a2.d,
+	 result.a, result.b, result.c, result.d);
+
+  return  result;
+}
+
+static void
+cls_struct_7byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_7byte a1, a2;
+
+  a1 = *(struct cls_struct_7byte*)(args[0]);
+  a2 = *(struct cls_struct_7byte*)(args[1]);
+
+  *(cls_struct_7byte*)resp = cls_struct_7byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[5];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_7byte g_dbl = { 127, 120, 1, 254 };
+  struct cls_struct_7byte f_dbl = { 12, 128, 9, 255 };
+  struct cls_struct_7byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_ushort;
+  cls_struct_fields[1] = &ffi_type_ushort;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = &ffi_type_ushort;
+  cls_struct_fields[4] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_7byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "127 120 1 254 12 128 9 255: 139 248 10 509" } */
+  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
+  /* { dg-output "\nres: 139 248 10 509" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_7byte(*)(cls_struct_7byte, cls_struct_7byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n127 120 1 254 12 128 9 255: 139 248 10 509" } */
+  printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
+  /* { dg-output "\nres: 139 248 10 509" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c
new file mode 100644
index 0000000..4aa99d1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c
@@ -0,0 +1,88 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Check overlapping.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_8byte {
+  int a;
+  float b;
+} cls_struct_8byte;
+
+cls_struct_8byte cls_struct_8byte_fn(struct cls_struct_8byte a1,
+			    struct cls_struct_8byte a2)
+{
+  struct cls_struct_8byte result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+
+  printf("%d %g %d %g: %d %g\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
+
+  return  result;
+}
+
+static void
+cls_struct_8byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_8byte a1, a2;
+
+  a1 = *(struct cls_struct_8byte*)(args[0]);
+  a2 = *(struct cls_struct_8byte*)(args[1]);
+
+  *(cls_struct_8byte*)resp = cls_struct_8byte_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_8byte g_dbl = { 1, 2.0 };
+  struct cls_struct_8byte f_dbl = { 4, 5.0 };
+  struct cls_struct_8byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_sint;
+  cls_struct_fields[1] = &ffi_type_float;
+  cls_struct_fields[2] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_8byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 2 4 5: 5 7" } */
+  printf("res: %d %g\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 5 7" } */
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_8byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_8byte(*)(cls_struct_8byte, cls_struct_8byte))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n1 2 4 5: 5 7" } */
+  printf("res: %d %g\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 5 7" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c
new file mode 100644
index 0000000..cc5e9d6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c
@@ -0,0 +1,90 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Darwin/AIX do double-word
+		alignment of the struct if the first element is a double.
+		Check that it does not here.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030914	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_9byte {
+  int a;
+  double b;
+} cls_struct_9byte;
+
+cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1,
+			    struct cls_struct_9byte b2)
+{
+  struct cls_struct_9byte result;
+
+  result.a = b1.a + b2.a;
+  result.b = b1.b + b2.b;
+
+  printf("%d %g %d %g: %d %g\n", b1.a, b1.b,  b2.a, b2.b,
+	 result.a, result.b);
+
+  return result;
+}
+
+static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp,
+				void** args, void* userdata __UNUSED__)
+{
+  struct cls_struct_9byte b1, b2;
+
+  b1 = *(struct cls_struct_9byte*)(args[0]);
+  b2 = *(struct cls_struct_9byte*)(args[1]);
+
+  *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[3];
+  ffi_type* cls_struct_fields[3];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[3];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_9byte h_dbl = { 7, 8.0};
+  struct cls_struct_9byte j_dbl = { 1, 9.0};
+  struct cls_struct_9byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_sint;
+  cls_struct_fields[1] = &ffi_type_double;
+  cls_struct_fields[2] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &h_dbl;
+  args_dbl[1] = &j_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "7 8 1 9: 8 17" } */
+  printf("res: %d %g\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 8 17" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl);
+  /* { dg-output "\n7 8 1 9: 8 17" } */
+  printf("res: %d %g\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 8 17" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c
new file mode 100644
index 0000000..5c0ba0d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c
@@ -0,0 +1,91 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Depending on the ABI. Darwin/AIX do double-word
+		alignment of the struct if the first element is a double.
+		Check that it does here.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030914	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_9byte {
+  double a;
+  int b;
+} cls_struct_9byte;
+
+cls_struct_9byte cls_struct_9byte_fn(struct cls_struct_9byte b1,
+			    struct cls_struct_9byte b2)
+{
+  struct cls_struct_9byte result;
+
+  result.a = b1.a + b2.a;
+  result.b = b1.b + b2.b;
+
+  printf("%g %d %g %d: %g %d\n", b1.a, b1.b,  b2.a, b2.b,
+	 result.a, result.b);
+
+  return result;
+}
+
+static void cls_struct_9byte_gn(ffi_cif* cif __UNUSED__, void* resp,
+				void** args, void* userdata __UNUSED__)
+{
+  struct cls_struct_9byte b1, b2;
+
+  b1 = *(struct cls_struct_9byte*)(args[0]);
+  b2 = *(struct cls_struct_9byte*)(args[1]);
+
+  *(cls_struct_9byte*)resp = cls_struct_9byte_fn(b1, b2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[3];
+  ffi_type* cls_struct_fields[3];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[3];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_9byte h_dbl = { 7.0, 8};
+  struct cls_struct_9byte j_dbl = { 1.0, 9};
+  struct cls_struct_9byte res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_double;
+  cls_struct_fields[1] = &ffi_type_sint;
+  cls_struct_fields[2] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &h_dbl;
+  args_dbl[1] = &j_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_9byte_fn), &res_dbl, args_dbl);
+  /* { dg-output "7 8 1 9: 8 17" } */
+  printf("res: %g %d\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 8 17" } */
+
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_9byte(*)(cls_struct_9byte, cls_struct_9byte))(code))(h_dbl, j_dbl);
+  /* { dg-output "\n7 8 1 9: 8 17" } */
+  printf("res: %g %d\n", res_dbl.a, res_dbl.b);
+  /* { dg-output "\nres: 8 17" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c
new file mode 100644
index 0000000..22b94d5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c
@@ -0,0 +1,93 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure alignment of double.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<hos@tamanegi.org> 20031203	 */
+
+
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  unsigned char a;
+  double b;
+  unsigned char c;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
+			    struct cls_struct_align a2)
+{
+  struct cls_struct_align result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
+
+  return  result;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_align a1, a2;
+
+  a1 = *(struct cls_struct_align*)(args[0]);
+  a2 = *(struct cls_struct_align*)(args[1]);
+
+  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_align g_dbl = { 12, 4951, 127 };
+  struct cls_struct_align f_dbl = { 1, 9320, 13 };
+  struct cls_struct_align res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_double;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c
new file mode 100644
index 0000000..62637f2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c
@@ -0,0 +1,91 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure alignment of float.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<hos@tamanegi.org> 20031203	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  unsigned char a;
+  float b;
+  unsigned char c;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
+			    struct cls_struct_align a2)
+{
+  struct cls_struct_align result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c);
+
+  return  result;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_align a1, a2;
+
+  a1 = *(struct cls_struct_align*)(args[0]);
+  a2 = *(struct cls_struct_align*)(args[1]);
+
+  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_align g_dbl = { 12, 4951, 127 };
+  struct cls_struct_align f_dbl = { 1, 9320, 13 };
+  struct cls_struct_align res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_float;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c
new file mode 100644
index 0000000..af38060
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c
@@ -0,0 +1,92 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure alignment of long double.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<hos@tamanegi.org> 20031203	 */
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  unsigned char a;
+  long double b;
+  unsigned char c;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
+			    struct cls_struct_align a2)
+{
+  struct cls_struct_align result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c);
+
+  return  result;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_align a1, a2;
+
+  a1 = *(struct cls_struct_align*)(args[0]);
+  a2 = *(struct cls_struct_align*)(args[1]);
+
+  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_align g_dbl = { 12, 4951, 127 };
+  struct cls_struct_align f_dbl = { 1, 9320, 13 };
+  struct cls_struct_align res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_longdouble;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c
new file mode 100644
index 0000000..a3732bd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c
@@ -0,0 +1,134 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure alignment of long double.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<hos@tamanegi.org> 20031203	 */
+
+/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
+/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
+/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
+/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
+
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  long double a;
+  long double b;
+  long double c;
+  long double d;
+  long double e;
+  long double f;
+  long double g;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(
+	cls_struct_align	a1,
+	cls_struct_align	a2)
+{
+	struct cls_struct_align r;
+
+	r.a = a1.a + a2.a;
+	r.b = a1.b + a2.b;
+	r.c = a1.c + a2.c;
+	r.d = a1.d + a2.d;
+	r.e = a1.e + a2.e;
+	r.f = a1.f + a2.f;
+	r.g = a1.g + a2.g;
+
+	printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: "
+		"%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n",
+		a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
+		a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
+		r.a, r.b, r.c, r.d, r.e, r.f, r.g);
+
+	return r;
+}
+
+cls_struct_align cls_struct_align_fn2(
+	cls_struct_align	a1)
+{
+	struct cls_struct_align r;
+
+	r.a = a1.a + 1;
+	r.b = a1.b + 1;
+	r.c = a1.c + 1;
+	r.d = a1.d + 1;
+	r.e = a1.e + 1;
+	r.f = a1.f + 1;
+	r.g = a1.g + 1;
+
+	printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg: "
+		"%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n",
+		a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
+		r.a, r.b, r.c, r.d, r.e, r.f, r.g);
+
+	return r;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, 
+		    void* userdata __UNUSED__)
+{
+	struct cls_struct_align a1, a2;
+
+	a1 = *(struct cls_struct_align*)(args[0]);
+	a2 = *(struct cls_struct_align*)(args[1]);
+
+	*(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+	ffi_cif cif;
+        void *code;
+	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	void* args_dbl[3];
+	ffi_type* cls_struct_fields[8];
+	ffi_type cls_struct_type;
+	ffi_type* dbl_arg_types[3];
+
+	cls_struct_type.size = 0;
+	cls_struct_type.alignment = 0;
+	cls_struct_type.type = FFI_TYPE_STRUCT;
+	cls_struct_type.elements = cls_struct_fields;
+
+	struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 };
+	struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 };
+	struct cls_struct_align res_dbl;
+
+	cls_struct_fields[0] = &ffi_type_longdouble;
+	cls_struct_fields[1] = &ffi_type_longdouble;
+	cls_struct_fields[2] = &ffi_type_longdouble;
+	cls_struct_fields[3] = &ffi_type_longdouble;
+	cls_struct_fields[4] = &ffi_type_longdouble;
+	cls_struct_fields[5] = &ffi_type_longdouble;
+	cls_struct_fields[6] = &ffi_type_longdouble;
+	cls_struct_fields[7] = NULL;
+
+	dbl_arg_types[0] = &cls_struct_type;
+	dbl_arg_types[1] = &cls_struct_type;
+	dbl_arg_types[2] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		dbl_arg_types) == FFI_OK);
+
+	args_dbl[0] = &g_dbl;
+	args_dbl[1] = &f_dbl;
+	args_dbl[2] = NULL;
+
+	ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+	/* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
+	printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b,
+		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
+	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+	res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+	/* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
+	printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b,
+		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
+	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c
new file mode 100644
index 0000000..63a0f76
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c
@@ -0,0 +1,117 @@
+/*	Area:			ffi_call, closure_call
+	Purpose:		Check structure alignment of long double.
+	Limitations:	none.
+	PR:				none.
+	Originator:		Blake Chaffin	6/18/2007
+*/
+
+/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
+/* { dg-do run { xfail strongarm*-*-* } } */
+/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
+/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
+
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  long double a;
+  long double b;
+  long double c;
+  long double d;
+  long double e;
+  double f;
+  long double g;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(
+	cls_struct_align	a1,
+	cls_struct_align	a2)
+{
+	struct cls_struct_align r;
+
+	r.a = a1.a + a2.a;
+	r.b = a1.b + a2.b;
+	r.c = a1.c + a2.c;
+	r.d = a1.d + a2.d;
+	r.e = a1.e + a2.e;
+	r.f = a1.f + a2.f;
+	r.g = a1.g + a2.g;
+
+	printf("%Lg %Lg %Lg %Lg %Lg %g %Lg %Lg %Lg %Lg %Lg %Lg %g %Lg: "
+		"%Lg %Lg %Lg %Lg %Lg %g %Lg\n",
+		a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
+		a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
+		r.a, r.b, r.c, r.d, r.e, r.f, r.g);
+
+	return r;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, 
+		    void* userdata __UNUSED__)
+{
+	struct cls_struct_align a1, a2;
+
+	a1 = *(struct cls_struct_align*)(args[0]);
+	a2 = *(struct cls_struct_align*)(args[1]);
+
+	*(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+	ffi_cif cif;
+        void *code;
+	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	void* args_dbl[3];
+	ffi_type* cls_struct_fields[8];
+	ffi_type cls_struct_type;
+	ffi_type* dbl_arg_types[3];
+
+	cls_struct_type.size = 0;
+	cls_struct_type.alignment = 0;
+	cls_struct_type.type = FFI_TYPE_STRUCT;
+	cls_struct_type.elements = cls_struct_fields;
+
+	struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 };
+	struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 };
+	struct cls_struct_align res_dbl;
+
+	cls_struct_fields[0] = &ffi_type_longdouble;
+	cls_struct_fields[1] = &ffi_type_longdouble;
+	cls_struct_fields[2] = &ffi_type_longdouble;
+	cls_struct_fields[3] = &ffi_type_longdouble;
+	cls_struct_fields[4] = &ffi_type_longdouble;
+	cls_struct_fields[5] = &ffi_type_double;
+	cls_struct_fields[6] = &ffi_type_longdouble;
+	cls_struct_fields[7] = NULL;
+
+	dbl_arg_types[0] = &cls_struct_type;
+	dbl_arg_types[1] = &cls_struct_type;
+	dbl_arg_types[2] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		dbl_arg_types) == FFI_OK);
+
+	args_dbl[0] = &g_dbl;
+	args_dbl[1] = &f_dbl;
+	args_dbl[2] = NULL;
+
+	ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+	/* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
+	printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b,
+		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
+	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+	res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+	/* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
+	printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b,
+		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
+	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
+
+  exit(0);
+}
+
+
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c
new file mode 100644
index 0000000..cbc4f95
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c
@@ -0,0 +1,95 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure alignment of pointer.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<hos@tamanegi.org> 20031203	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  unsigned char a;
+  void *b;
+  unsigned char c;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
+			    struct cls_struct_align a2)
+{
+  struct cls_struct_align result;
+
+  result.a = a1.a + a2.a;
+  result.b = (void *)((uintptr_t)a1.b + (uintptr_t)a2.b);
+  result.c = a1.c + a2.c;
+
+  printf("%d %" PRIuPTR " %d %d %" PRIuPTR " %d: %d %" PRIuPTR " %d\n", 
+         a1.a, (uintptr_t)a1.b, a1.c,
+	 a2.a, (uintptr_t)a2.b, a2.c,
+         result.a, (uintptr_t)result.b,
+	 result.c);
+
+  return result;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_align a1, a2;
+
+  a1 = *(struct cls_struct_align*)(args[0]);
+  a2 = *(struct cls_struct_align*)(args[1]);
+
+  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_align g_dbl = { 12, (void *)4951, 127 };
+  struct cls_struct_align f_dbl = { 1, (void *)9320, 13 };
+  struct cls_struct_align res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_pointer;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c
new file mode 100644
index 0000000..383ea41
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c
@@ -0,0 +1,91 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure alignment of sint16.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<hos@tamanegi.org> 20031203	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  unsigned char a;
+  signed short b;
+  unsigned char c;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
+			    struct cls_struct_align a2)
+{
+  struct cls_struct_align result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
+
+  return  result;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_align a1, a2;
+
+  a1 = *(struct cls_struct_align*)(args[0]);
+  a2 = *(struct cls_struct_align*)(args[1]);
+
+  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_align g_dbl = { 12, 4951, 127 };
+  struct cls_struct_align f_dbl = { 1, 9320, 13 };
+  struct cls_struct_align res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_sshort;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c
new file mode 100644
index 0000000..705d78c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c
@@ -0,0 +1,91 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure alignment of sint32.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<hos@tamanegi.org> 20031203	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  unsigned char a;
+  signed int b;
+  unsigned char c;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
+			    struct cls_struct_align a2)
+{
+  struct cls_struct_align result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
+
+  return  result;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_align a1, a2;
+
+  a1 = *(struct cls_struct_align*)(args[0]);
+  a2 = *(struct cls_struct_align*)(args[1]);
+
+  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_align g_dbl = { 12, 4951, 127 };
+  struct cls_struct_align f_dbl = { 1, 9320, 13 };
+  struct cls_struct_align res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_sint;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c
new file mode 100644
index 0000000..31d53af
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c
@@ -0,0 +1,92 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure alignment of sint64.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<hos@tamanegi.org> 20031203	 */
+
+/* { dg-do run } */
+/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  unsigned char a;
+  signed long long b;
+  unsigned char c;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
+			    struct cls_struct_align a2)
+{
+  struct cls_struct_align result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
+
+  return  result;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_align a1, a2;
+
+  a1 = *(struct cls_struct_align*)(args[0]);
+  a2 = *(struct cls_struct_align*)(args[1]);
+
+  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_align g_dbl = { 12, 4951, 127 };
+  struct cls_struct_align f_dbl = { 1, 9320, 13 };
+  struct cls_struct_align res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_sint64;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c
new file mode 100644
index 0000000..cb6b748
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c
@@ -0,0 +1,91 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure alignment of uint16.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<hos@tamanegi.org> 20031203	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  unsigned char a;
+  unsigned short b;
+  unsigned char c;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
+			    struct cls_struct_align a2)
+{
+  struct cls_struct_align result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
+
+  return  result;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_align a1, a2;
+
+  a1 = *(struct cls_struct_align*)(args[0]);
+  a2 = *(struct cls_struct_align*)(args[1]);
+
+  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_align g_dbl = { 12, 4951, 127 };
+  struct cls_struct_align f_dbl = { 1, 9320, 13 };
+  struct cls_struct_align res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_ushort;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c
new file mode 100644
index 0000000..e453d3e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c
@@ -0,0 +1,91 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure alignment of uint32.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<hos@tamanegi.org> 20031203	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  unsigned char a;
+  unsigned int b;
+  unsigned char c;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
+			    struct cls_struct_align a2)
+{
+  struct cls_struct_align result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
+
+  return  result;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_align a1, a2;
+
+  a1 = *(struct cls_struct_align*)(args[0]);
+  a2 = *(struct cls_struct_align*)(args[1]);
+
+  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_align g_dbl = { 12, 4951, 127 };
+  struct cls_struct_align f_dbl = { 1, 9320, 13 };
+  struct cls_struct_align res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_uint;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c
new file mode 100644
index 0000000..495c79f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c
@@ -0,0 +1,93 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure alignment of uint64.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<hos@tamanegi.org> 20031203	 */
+
+
+/* { dg-do run } */
+/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */
+#include "ffitest.h"
+
+typedef struct cls_struct_align {
+  unsigned char a;
+  unsigned long long b;
+  unsigned char c;
+} cls_struct_align;
+
+cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
+			    struct cls_struct_align a2)
+{
+  struct cls_struct_align result;
+
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+  printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
+
+  return  result;
+}
+
+static void
+cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		    void* userdata __UNUSED__)
+{
+
+  struct cls_struct_align a1, a2;
+
+  a1 = *(struct cls_struct_align*)(args[0]);
+  a2 = *(struct cls_struct_align*)(args[1]);
+
+  *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[4];
+  ffi_type cls_struct_type;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  struct cls_struct_align g_dbl = { 12, 4951, 127 };
+  struct cls_struct_align f_dbl = { 1, 9320, 13 };
+  struct cls_struct_align res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_uint64;
+  cls_struct_fields[2] = &ffi_type_uchar;
+  cls_struct_fields[3] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &g_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
+  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
+  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
+  printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
+  /* { dg-output "\nres: 13 14271 140" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c
new file mode 100644
index 0000000..660dabb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c
@@ -0,0 +1,66 @@
+/* Area:		ffi_call, closure_call
+   Purpose:		Check double arguments in structs.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin 6/23/2007	*/
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+
+typedef struct Dbls {
+	double x;
+	double y;
+} Dbls;
+
+void
+closure_test_fn(Dbls p)
+{
+	printf("%.1f %.1f\n", p.x, p.y);
+}
+
+void
+closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
+		void** args, void* userdata __UNUSED__)
+{
+	closure_test_fn(*(Dbls*)args[0]);
+}
+
+int main(int argc __UNUSED__, char** argv __UNUSED__)
+{
+	ffi_cif cif;
+
+        void *code;
+	ffi_closure*	pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	ffi_type*		cl_arg_types[1];
+
+	ffi_type	ts1_type;
+	ffi_type*	ts1_type_elements[4];
+
+	ts1_type.size = 0;
+	ts1_type.alignment = 0;
+	ts1_type.type = FFI_TYPE_STRUCT;
+	ts1_type.elements = ts1_type_elements;
+
+	ts1_type_elements[0] = &ffi_type_double;
+	ts1_type_elements[1] = &ffi_type_double;
+	ts1_type_elements[2] = NULL;
+
+	cl_arg_types[0] = &ts1_type;
+
+	Dbls arg = { 1.0, 2.0 };
+
+	/* Initialize the cif */
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+				 &ffi_type_void, cl_arg_types) == FFI_OK);
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK);
+
+	((void*(*)(Dbls))(code))(arg);
+	/* { dg-output "1.0 2.0\n" } */
+
+	closure_test_fn(arg);
+	/* { dg-output "1.0 2.0\n" } */
+
+	return 0;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c
new file mode 100644
index 0000000..84ad4cb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c
@@ -0,0 +1,43 @@
+/* Area:	closure_call
+   Purpose:	Check return value double.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+			      void* userdata __UNUSED__)
+ {
+   *(double *)resp = *(double *)args[0];
+
+   printf("%f: %f\n",*(double *)args[0],
+	  *(double *)resp);
+ }
+typedef double (*cls_ret_double)(double);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[2];
+  double res;
+
+  cl_arg_types[0] = &ffi_type_double;
+  cl_arg_types[1] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_double, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code)  == FFI_OK);
+
+  res = (*((cls_ret_double)code))(21474.789);
+  /* { dg-output "21474.789000: 21474.789000" } */
+  printf("res: %.6f\n", res);
+  /* { dg-output "\nres: 21474.789000" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c
new file mode 100644
index 0000000..e769caf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c
@@ -0,0 +1,60 @@
+/* Area:		ffi_call, closure_call
+   Purpose:		Test doubles passed in variable argument lists.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin 6/6/2007	 */
+
+/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
+/* { dg-output "" { xfail avr32*-*-* } } */
+/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */
+/* { dg-skip-if "" arm*-*-* { "-mfloat-abi=hard" } { "" } } */
+
+#include "ffitest.h"
+
+static void
+cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp, 
+		 void** args, void* userdata __UNUSED__)
+{
+	char*	format		= *(char**)args[0];
+	double	doubleValue	= *(double*)args[1];
+
+	*(ffi_arg*)resp = printf(format, doubleValue);
+}
+
+int main (void)
+{
+	ffi_cif cif;
+        void *code;
+	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	void* args[3];
+	ffi_type* arg_types[3];
+
+	char*	format		= "%.1f\n";
+	double	doubleArg	= 7;
+	ffi_arg	res			= 0;
+
+	arg_types[0] = &ffi_type_pointer;
+	arg_types[1] = &ffi_type_double;
+	arg_types[2] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint,
+		arg_types) == FFI_OK);
+
+	args[0] = &format;
+	args[1] = &doubleArg;
+	args[2] = NULL;
+
+	ffi_call(&cif, FFI_FN(printf), &res, args);
+	// { dg-output "7.0" }
+	printf("res: %d\n", (int) res);
+	// { dg-output "\nres: 4" }
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL, code) == FFI_OK);
+
+	res	= ((int(*)(char*, double))(code))(format, doubleArg);
+	// { dg-output "\n7.0" }
+	printf("res: %d\n", (int) res);
+	// { dg-output "\nres: 4" }
+
+	exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c
new file mode 100644
index 0000000..0090fed
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c
@@ -0,0 +1,42 @@
+/* Area:	closure_call
+   Purpose:	Check return value float.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void cls_ret_float_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+			     void* userdata __UNUSED__)
+ {
+   *(float *)resp = *(float *)args[0];
+
+   printf("%g: %g\n",*(float *)args[0],
+	  *(float *)resp);
+ }
+
+typedef float (*cls_ret_float)(float);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[2];
+  float res;
+
+  cl_arg_types[0] = &ffi_type_float;
+  cl_arg_types[1] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_float, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_float_fn, NULL, code)  == FFI_OK);
+  res = ((((cls_ret_float)code)(-2122.12)));
+  /* { dg-output "\\-2122.12: \\-2122.12" } */
+  printf("res: %.6f\n", res);
+  /* { dg-output "\nres: \-2122.120117" } */
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c
new file mode 100644
index 0000000..e6bac1f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c
@@ -0,0 +1,105 @@
+/* Area:		ffi_call, closure_call
+   Purpose:		Check long double arguments.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin	*/
+
+/* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
+/* { dg-do run { xfail arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
+/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
+
+#include "ffitest.h"
+
+long double cls_ldouble_fn(
+	long double	a1,
+	long double	a2,
+	long double	a3,
+	long double	a4,
+	long double	a5,
+	long double	a6,
+	long double	a7,
+	long double	a8)
+{
+	long double	r = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8;
+
+	printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n",
+		a1, a2, a3, a4, a5, a6, a7, a8, r);
+
+	return r;
+}
+
+static void
+cls_ldouble_gn(ffi_cif* cif __UNUSED__, void* resp, 
+	       void** args, void* userdata __UNUSED__)
+{
+	long double	a1	= *(long double*)args[0];
+	long double	a2	= *(long double*)args[1];
+	long double	a3	= *(long double*)args[2];
+	long double	a4	= *(long double*)args[3];
+	long double	a5	= *(long double*)args[4];
+	long double	a6	= *(long double*)args[5];
+	long double	a7	= *(long double*)args[6];
+	long double	a8	= *(long double*)args[7];
+
+	*(long double*)resp = cls_ldouble_fn(
+		a1, a2, a3, a4, a5, a6, a7, a8);
+}
+
+int main(void)
+{
+	ffi_cif	cif;
+        void* code;
+	ffi_closure*	pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	void*			args[9];
+	ffi_type*		arg_types[9];
+	long double		res	= 0;
+
+	long double	arg1	= 1;
+	long double	arg2	= 2;
+	long double	arg3	= 3;
+	long double	arg4	= 4;
+	long double	arg5	= 5;
+	long double	arg6	= 6;
+	long double	arg7	= 7;
+	long double	arg8	= 8;
+
+	arg_types[0] = &ffi_type_longdouble;
+	arg_types[1] = &ffi_type_longdouble;
+	arg_types[2] = &ffi_type_longdouble;
+	arg_types[3] = &ffi_type_longdouble;
+	arg_types[4] = &ffi_type_longdouble;
+	arg_types[5] = &ffi_type_longdouble;
+	arg_types[6] = &ffi_type_longdouble;
+	arg_types[7] = &ffi_type_longdouble;
+	arg_types[8] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 8, &ffi_type_longdouble,
+		arg_types) == FFI_OK);
+
+	args[0] = &arg1;
+	args[1] = &arg2;
+	args[2] = &arg3;
+	args[3] = &arg4;
+	args[4] = &arg5;
+	args[5] = &arg6;
+	args[6] = &arg7;
+	args[7] = &arg8;
+	args[8] = NULL;
+
+	ffi_call(&cif, FFI_FN(cls_ldouble_fn), &res, args);
+	/* { dg-output "1 2 3 4 5 6 7 8: 36" } */
+	printf("res: %Lg\n", res);
+	/* { dg-output "\nres: 36" } */
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ldouble_gn, NULL, code) == FFI_OK);
+
+	res = ((long double(*)(long double, long double, long double, long double,
+		long double, long double, long double, long double))(code))(arg1, arg2,
+		arg3, arg4, arg5, arg6, arg7, arg8);
+	/* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */
+	printf("res: %Lg\n", res);
+	/* { dg-output "\nres: 36" } */
+
+	return 0;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c
new file mode 100644
index 0000000..07780ed
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c
@@ -0,0 +1,60 @@
+/* Area:		ffi_call, closure_call
+   Purpose:		Test long doubles passed in variable argument lists.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin 6/6/2007	 */
+
+/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
+/* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */
+/* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */
+/* { dg-skip-if "" arm*-*-* { "-mfloat-abi=hard" } { "" } } */
+
+#include "ffitest.h"
+
+static void
+cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp, 
+		     void** args, void* userdata __UNUSED__)
+{
+	char*		format	= *(char**)args[0];
+	long double	ldValue	= *(long double*)args[1];
+
+	*(ffi_arg*)resp = printf(format, ldValue);
+}
+
+int main (void)
+{
+	ffi_cif cif;
+        void *code;
+	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	void* args[3];
+	ffi_type* arg_types[3];
+
+	char*		format	= "%.1Lf\n";
+	long double	ldArg	= 7;
+	ffi_arg		res		= 0;
+
+	arg_types[0] = &ffi_type_pointer;
+	arg_types[1] = &ffi_type_longdouble;
+	arg_types[2] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint,
+		arg_types) == FFI_OK);
+
+	args[0] = &format;
+	args[1] = &ldArg;
+	args[2] = NULL;
+
+	ffi_call(&cif, FFI_FN(printf), &res, args);
+	// { dg-output "7.0" }
+	printf("res: %d\n", (int) res);
+	// { dg-output "\nres: 4" }
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL, code) == FFI_OK);
+
+	res	= ((int(*)(char*, long double))(code))(format, ldArg);
+	// { dg-output "\n7.0" }
+	printf("res: %d\n", (int) res);
+	// { dg-output "\nres: 4" }
+
+	exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c
new file mode 100644
index 0000000..71df7b6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c
@@ -0,0 +1,74 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check passing of multiple signed char values.
+   Limitations:	none.
+   PR:		PR13221.
+   Originator:	<hos@tamanegi.org> 20031129  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+signed char test_func_fn(signed char a1, signed char a2)
+{
+  signed char result;
+
+  result = a1 + a2;
+
+  printf("%d %d: %d\n", a1, a2, result);
+
+  return result;
+
+}
+
+static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
+			 void *data __UNUSED__)
+{
+  signed char a1, a2;
+
+  a1 = *(signed char *)avals[0];
+  a2 = *(signed char *)avals[1];
+
+  *(ffi_arg *)rval = test_func_fn(a1, a2);
+
+}
+
+typedef signed char (*test_type)(signed char, signed char);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void * args_dbl[3];
+  ffi_type * cl_arg_types[3];
+  ffi_arg res_call;
+  signed char a, b, res_closure;
+
+  a = 2;
+  b = 125;
+
+  args_dbl[0] = &a;
+  args_dbl[1] = &b;
+  args_dbl[2] = NULL;
+
+  cl_arg_types[0] = &ffi_type_schar;
+  cl_arg_types[1] = &ffi_type_schar;
+  cl_arg_types[2] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
+		     &ffi_type_schar, cl_arg_types) == FFI_OK);
+
+  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
+  /* { dg-output "2 125: 127" } */
+  printf("res: %d\n", (signed char)res_call);
+  /* { dg-output "\nres: 127" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
+
+  res_closure = (*((test_type)code))(2, 125);
+  /* { dg-output "\n2 125: 127" } */
+  printf("res: %d\n", res_closure);
+  /* { dg-output "\nres: 127" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c
new file mode 100644
index 0000000..4c39153
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c
@@ -0,0 +1,74 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check passing of multiple signed short values.
+   Limitations:	none.
+   PR:		PR13221.
+   Originator:	<andreast@gcc.gnu.org> 20031129  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+signed short test_func_fn(signed short a1, signed short a2)
+{
+  signed short result;
+
+  result = a1 + a2;
+
+  printf("%d %d: %d\n", a1, a2, result);
+
+  return result;
+
+}
+
+static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
+			 void *data __UNUSED__)
+{
+  signed short a1, a2;
+
+  a1 = *(signed short *)avals[0];
+  a2 = *(signed short *)avals[1];
+
+  *(ffi_arg *)rval = test_func_fn(a1, a2);
+
+}
+
+typedef signed short (*test_type)(signed short, signed short);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void * args_dbl[3];
+  ffi_type * cl_arg_types[3];
+  ffi_arg res_call;
+  unsigned short a, b, res_closure;
+
+  a = 2;
+  b = 32765;
+
+  args_dbl[0] = &a;
+  args_dbl[1] = &b;
+  args_dbl[2] = NULL;
+
+  cl_arg_types[0] = &ffi_type_sshort;
+  cl_arg_types[1] = &ffi_type_sshort;
+  cl_arg_types[2] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
+		     &ffi_type_sshort, cl_arg_types) == FFI_OK);
+
+  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
+  /* { dg-output "2 32765: 32767" } */
+  printf("res: %d\n", (unsigned short)res_call);
+  /* { dg-output "\nres: 32767" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
+
+  res_closure = (*((test_type)code))(2, 32765);
+  /* { dg-output "\n2 32765: 32767" } */
+  printf("res: %d\n", res_closure);
+  /* { dg-output "\nres: 32767" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c
new file mode 100644
index 0000000..1c3aeb5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c
@@ -0,0 +1,86 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check passing of multiple signed short/char values.
+   Limitations:	none.
+   PR:		PR13221.
+   Originator:	<andreast@gcc.gnu.org> 20031129  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+signed short test_func_fn(signed char a1, signed short a2,
+			  signed char a3, signed short a4)
+{
+  signed short result;
+
+  result = a1 + a2 + a3 + a4;
+
+  printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result);
+
+  return result;
+
+}
+
+static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
+			 void *data __UNUSED__)
+{
+  signed char a1, a3;
+  signed short a2, a4;
+
+  a1 = *(signed char *)avals[0];
+  a2 = *(signed short *)avals[1];
+  a3 = *(signed char *)avals[2];
+  a4 = *(signed short *)avals[3];
+
+  *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4);
+
+}
+
+typedef signed short (*test_type)(signed char, signed short,
+				  signed char, signed short);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void * args_dbl[5];
+  ffi_type * cl_arg_types[5];
+  ffi_arg res_call;
+  signed char a, c;
+  signed short b, d, res_closure;
+
+  a = 1;
+  b = 32765;
+  c = 127;
+  d = -128;
+
+  args_dbl[0] = &a;
+  args_dbl[1] = &b;
+  args_dbl[2] = &c;
+  args_dbl[3] = &d;
+  args_dbl[4] = NULL;
+
+  cl_arg_types[0] = &ffi_type_schar;
+  cl_arg_types[1] = &ffi_type_sshort;
+  cl_arg_types[2] = &ffi_type_schar;
+  cl_arg_types[3] = &ffi_type_sshort;
+  cl_arg_types[4] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
+		     &ffi_type_sshort, cl_arg_types) == FFI_OK);
+
+  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
+  /* { dg-output "1 32765 127 -128: 32765" } */
+  printf("res: %d\n", (signed short)res_call);
+  /* { dg-output "\nres: 32765" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
+
+  res_closure = (*((test_type)code))(1, 32765, 127, -128);
+  /* { dg-output "\n1 32765 127 -128: 32765" } */
+  printf("res: %d\n", res_closure);
+  /* { dg-output "\nres: 32765" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c
new file mode 100644
index 0000000..009c02c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c
@@ -0,0 +1,91 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check passing of multiple unsigned char values.
+   Limitations:	none.
+   PR:		PR13221.
+   Originator:	<andreast@gcc.gnu.org> 20031129  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+unsigned char test_func_fn(unsigned char a1, unsigned char a2,
+			   unsigned char a3, unsigned char a4)
+{
+  unsigned char result;
+
+  result = a1 + a2 + a3 + a4;
+
+  printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result);
+
+  return result;
+
+}
+
+static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
+			 void *data __UNUSED__)
+{
+  unsigned char a1, a2, a3, a4;
+
+  a1 = *(unsigned char *)avals[0];
+  a2 = *(unsigned char *)avals[1];
+  a3 = *(unsigned char *)avals[2];
+  a4 = *(unsigned char *)avals[3];
+
+  *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4);
+
+}
+
+typedef unsigned char (*test_type)(unsigned char, unsigned char,
+				   unsigned char, unsigned char);
+
+void test_func(ffi_cif *cif __UNUSED__, void *rval __UNUSED__, void **avals,
+	       void *data __UNUSED__)
+{
+  printf("%d %d %d %d\n", *(unsigned char *)avals[0],
+	 *(unsigned char *)avals[1], *(unsigned char *)avals[2],
+	 *(unsigned char *)avals[3]);
+}
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void * args_dbl[5];
+  ffi_type * cl_arg_types[5];
+  ffi_arg res_call;
+  unsigned char a, b, c, d, res_closure;
+
+  a = 1;
+  b = 2;
+  c = 127;
+  d = 125;
+
+  args_dbl[0] = &a;
+  args_dbl[1] = &b;
+  args_dbl[2] = &c;
+  args_dbl[3] = &d;
+  args_dbl[4] = NULL;
+
+  cl_arg_types[0] = &ffi_type_uchar;
+  cl_arg_types[1] = &ffi_type_uchar;
+  cl_arg_types[2] = &ffi_type_uchar;
+  cl_arg_types[3] = &ffi_type_uchar;
+  cl_arg_types[4] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
+		     &ffi_type_uchar, cl_arg_types) == FFI_OK);
+
+  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
+  /* { dg-output "1 2 127 125: 255" } */
+  printf("res: %d\n", (unsigned char)res_call);
+  /* { dg-output "\nres: 255" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
+
+  res_closure = (*((test_type)code))(1, 2, 127, 125);
+  /* { dg-output "\n1 2 127 125: 255" } */
+  printf("res: %d\n", res_closure);
+  /* { dg-output "\nres: 255" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c
new file mode 100644
index 0000000..dd10ca7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c
@@ -0,0 +1,74 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check passing of multiple unsigned short values.
+   Limitations:	none.
+   PR:		PR13221.
+   Originator:	<andreast@gcc.gnu.org> 20031129  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+unsigned short test_func_fn(unsigned short a1, unsigned short a2)
+{
+  unsigned short result;
+
+  result = a1 + a2;
+
+  printf("%d %d: %d\n", a1, a2, result);
+
+  return result;
+
+}
+
+static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
+			 void *data __UNUSED__)
+{
+  unsigned short a1, a2;
+
+  a1 = *(unsigned short *)avals[0];
+  a2 = *(unsigned short *)avals[1];
+
+  *(ffi_arg *)rval = test_func_fn(a1, a2);
+
+}
+
+typedef unsigned short (*test_type)(unsigned short, unsigned short);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void * args_dbl[3];
+  ffi_type * cl_arg_types[3];
+  ffi_arg res_call;
+  unsigned short a, b, res_closure;
+
+  a = 2;
+  b = 32765;
+
+  args_dbl[0] = &a;
+  args_dbl[1] = &b;
+  args_dbl[2] = NULL;
+
+  cl_arg_types[0] = &ffi_type_ushort;
+  cl_arg_types[1] = &ffi_type_ushort;
+  cl_arg_types[2] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
+		     &ffi_type_ushort, cl_arg_types) == FFI_OK);
+
+  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
+  /* { dg-output "2 32765: 32767" } */
+  printf("res: %d\n", (unsigned short)res_call);
+  /* { dg-output "\nres: 32767" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
+
+  res_closure = (*((test_type)code))(2, 32765);
+  /* { dg-output "\n2 32765: 32767" } */
+  printf("res: %d\n", res_closure);
+  /* { dg-output "\nres: 32767" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c
new file mode 100644
index 0000000..2588e97
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c
@@ -0,0 +1,86 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check passing of multiple unsigned short/char values.
+   Limitations:	none.
+   PR:		PR13221.
+   Originator:	<andreast@gcc.gnu.org> 20031129  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+unsigned short test_func_fn(unsigned char a1, unsigned short a2,
+			    unsigned char a3, unsigned short a4)
+{
+  unsigned short result;
+
+  result = a1 + a2 + a3 + a4;
+
+  printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result);
+
+  return result;
+
+}
+
+static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
+			 void *data __UNUSED__)
+{
+  unsigned char a1, a3;
+  unsigned short a2, a4;
+
+  a1 = *(unsigned char *)avals[0];
+  a2 = *(unsigned short *)avals[1];
+  a3 = *(unsigned char *)avals[2];
+  a4 = *(unsigned short *)avals[3];
+
+  *(ffi_arg *)rval = test_func_fn(a1, a2, a3, a4);
+
+}
+
+typedef unsigned short (*test_type)(unsigned char, unsigned short,
+				   unsigned char, unsigned short);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void * args_dbl[5];
+  ffi_type * cl_arg_types[5];
+  ffi_arg res_call;
+  unsigned char a, c;
+  unsigned short b, d, res_closure;
+
+  a = 1;
+  b = 2;
+  c = 127;
+  d = 128;
+
+  args_dbl[0] = &a;
+  args_dbl[1] = &b;
+  args_dbl[2] = &c;
+  args_dbl[3] = &d;
+  args_dbl[4] = NULL;
+
+  cl_arg_types[0] = &ffi_type_uchar;
+  cl_arg_types[1] = &ffi_type_ushort;
+  cl_arg_types[2] = &ffi_type_uchar;
+  cl_arg_types[3] = &ffi_type_ushort;
+  cl_arg_types[4] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
+		     &ffi_type_ushort, cl_arg_types) == FFI_OK);
+
+  ffi_call(&cif, FFI_FN(test_func_fn), &res_call, args_dbl);
+  /* { dg-output "1 2 127 128: 258" } */
+  printf("res: %d\n", (unsigned short)res_call);
+  /* { dg-output "\nres: 258" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
+
+  res_closure = (*((test_type)code))(1, 2, 127, 128);
+  /* { dg-output "\n1 2 127 128: 258" } */
+  printf("res: %d\n", res_closure);
+  /* { dg-output "\nres: 258" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c
new file mode 100644
index 0000000..cf03993
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c
@@ -0,0 +1,74 @@
+/* Area:		ffi_call, closure_call
+   Purpose:		Check pointer arguments.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin 6/6/2007	*/
+
+/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
+#include "ffitest.h"
+
+void* cls_pointer_fn(void* a1, void* a2)
+{
+	void*	result	= (void*)((intptr_t)a1 + (intptr_t)a2);
+
+	printf("0x%08x 0x%08x: 0x%08x\n", 
+	       (unsigned int)(uintptr_t) a1,
+               (unsigned int)(uintptr_t) a2,
+               (unsigned int)(uintptr_t) result);
+
+	return result;
+}
+
+static void
+cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, 
+	       void** args, void* userdata __UNUSED__)
+{
+	void*	a1	= *(void**)(args[0]);
+	void*	a2	= *(void**)(args[1]);
+
+	*(void**)resp = cls_pointer_fn(a1, a2);
+}
+
+int main (void)
+{
+	ffi_cif	cif;
+        void *code;
+	ffi_closure*	pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	void*			args[3];
+//	ffi_type		cls_pointer_type;
+	ffi_type*		arg_types[3];
+
+/*	cls_pointer_type.size = sizeof(void*);
+	cls_pointer_type.alignment = 0;
+	cls_pointer_type.type = FFI_TYPE_POINTER;
+	cls_pointer_type.elements = NULL;*/
+
+	void*	arg1	= (void*)0x12345678;
+	void*	arg2	= (void*)0x89abcdef;
+	ffi_arg	res		= 0;
+
+	arg_types[0] = &ffi_type_pointer;
+	arg_types[1] = &ffi_type_pointer;
+	arg_types[2] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer,
+		arg_types) == FFI_OK);
+
+	args[0] = &arg1;
+	args[1] = &arg2;
+	args[2] = NULL;
+
+	ffi_call(&cif, FFI_FN(cls_pointer_fn), &res, args);
+	/* { dg-output "0x12345678 0x89abcdef: 0x9be02467" } */
+	printf("res: 0x%08x\n", (unsigned int) res);
+	/* { dg-output "\nres: 0x9be02467" } */
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK);
+
+	res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2);
+	/* { dg-output "\n0x12345678 0x89abcdef: 0x9be02467" } */
+	printf("res: 0x%08x\n", (unsigned int) res);
+	/* { dg-output "\nres: 0x9be02467" } */
+
+	exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c
new file mode 100644
index 0000000..d631cf8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c
@@ -0,0 +1,140 @@
+/* Area:		ffi_call, closure_call
+   Purpose:		Check pointer arguments across multiple hideous stack frames.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin 6/7/2007	*/
+
+/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
+#include "ffitest.h"
+
+static	long dummyVar;
+
+long dummy_func(
+	long double a1, char b1,
+	long double a2, char b2,
+	long double a3, char b3,
+	long double a4, char b4)
+{
+	return a1 + b1 + a2 + b2 + a3 + b3 + a4 + b4;
+}
+
+void* cls_pointer_fn2(void* a1, void* a2)
+{
+	long double	trample1	= (intptr_t)a1 + (intptr_t)a2;
+	char		trample2	= ((char*)&a1)[0] + ((char*)&a2)[0];
+	long double	trample3	= (intptr_t)trample1 + (intptr_t)a1;
+	char		trample4	= trample2 + ((char*)&a1)[1];
+	long double	trample5	= (intptr_t)trample3 + (intptr_t)a2;
+	char		trample6	= trample4 + ((char*)&a2)[1];
+	long double	trample7	= (intptr_t)trample5 + (intptr_t)trample1;
+	char		trample8	= trample6 + trample2;
+
+	dummyVar	= dummy_func(trample1, trample2, trample3, trample4,
+		trample5, trample6, trample7, trample8);
+
+	void*	result	= (void*)((intptr_t)a1 + (intptr_t)a2);
+
+	printf("0x%08x 0x%08x: 0x%08x\n", 
+	       (unsigned int)(uintptr_t) a1,
+               (unsigned int)(uintptr_t) a2,
+               (unsigned int)(uintptr_t) result);
+
+	return result;
+}
+
+void* cls_pointer_fn1(void* a1, void* a2)
+{
+	long double	trample1	= (intptr_t)a1 + (intptr_t)a2;
+	char		trample2	= ((char*)&a1)[0] + ((char*)&a2)[0];
+	long double	trample3	= (intptr_t)trample1 + (intptr_t)a1;
+	char		trample4	= trample2 + ((char*)&a1)[1];
+	long double	trample5	= (intptr_t)trample3 + (intptr_t)a2;
+	char		trample6	= trample4 + ((char*)&a2)[1];
+	long double	trample7	= (intptr_t)trample5 + (intptr_t)trample1;
+	char		trample8	= trample6 + trample2;
+
+	dummyVar	= dummy_func(trample1, trample2, trample3, trample4,
+		trample5, trample6, trample7, trample8);
+
+	void*	result	= (void*)((intptr_t)a1 + (intptr_t)a2);
+
+	printf("0x%08x 0x%08x: 0x%08x\n",
+               (unsigned int)(intptr_t) a1,
+               (unsigned int)(intptr_t) a2,
+               (unsigned int)(intptr_t) result);
+
+	result	= cls_pointer_fn2(result, a1);
+
+	return result;
+}
+
+static void
+cls_pointer_gn(ffi_cif* cif __UNUSED__, void* resp, 
+	       void** args, void* userdata __UNUSED__)
+{
+	void*	a1	= *(void**)(args[0]);
+	void*	a2	= *(void**)(args[1]);
+
+	long double	trample1	= (intptr_t)a1 + (intptr_t)a2;
+	char		trample2	= ((char*)&a1)[0] + ((char*)&a2)[0];
+	long double	trample3	= (intptr_t)trample1 + (intptr_t)a1;
+	char		trample4	= trample2 + ((char*)&a1)[1];
+	long double	trample5	= (intptr_t)trample3 + (intptr_t)a2;
+	char		trample6	= trample4 + ((char*)&a2)[1];
+	long double	trample7	= (intptr_t)trample5 + (intptr_t)trample1;
+	char		trample8	= trample6 + trample2;
+
+	dummyVar	= dummy_func(trample1, trample2, trample3, trample4,
+		trample5, trample6, trample7, trample8);
+
+	*(void**)resp = cls_pointer_fn1(a1, a2);
+}
+
+int main (void)
+{
+	ffi_cif	cif;
+        void *code;
+	ffi_closure*	pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	void*			args[3];
+//	ffi_type		cls_pointer_type;
+	ffi_type*		arg_types[3];
+
+/*	cls_pointer_type.size = sizeof(void*);
+	cls_pointer_type.alignment = 0;
+	cls_pointer_type.type = FFI_TYPE_POINTER;
+	cls_pointer_type.elements = NULL;*/
+
+	void*	arg1	= (void*)0x01234567;
+	void*	arg2	= (void*)0x89abcdef;
+	ffi_arg	res		= 0;
+
+	arg_types[0] = &ffi_type_pointer;
+	arg_types[1] = &ffi_type_pointer;
+	arg_types[2] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer,
+		arg_types) == FFI_OK);
+
+	args[0] = &arg1;
+	args[1] = &arg2;
+	args[2] = NULL;
+
+	printf("\n");
+	ffi_call(&cif, FFI_FN(cls_pointer_fn1), &res, args);
+
+	printf("res: 0x%08x\n", (unsigned int) res);
+	// { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" }
+	// { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" }
+	// { dg-output "\nres: 0x8bf258bd" }
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK);
+
+	res = (ffi_arg)(uintptr_t)((void*(*)(void*, void*))(code))(arg1, arg2);
+
+	printf("res: 0x%08x\n", (unsigned int) res);
+	// { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" }
+	// { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" }
+	// { dg-output "\nres: 0x8bf258bd" }
+
+	exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c
new file mode 100644
index 0000000..82986b1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c
@@ -0,0 +1,44 @@
+/* Area:	closure_call
+   Purpose:	Check return value schar.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20031108	 */
+
+
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void cls_ret_schar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+			     void* userdata __UNUSED__)
+{
+  *(ffi_arg*)resp = *(signed char *)args[0];
+  printf("%d: %d\n",*(signed char *)args[0],
+	 (int)*(ffi_arg *)(resp));
+}
+typedef signed char (*cls_ret_schar)(signed char);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[2];
+  signed char res;
+
+  cl_arg_types[0] = &ffi_type_schar;
+  cl_arg_types[1] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_schar, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_schar_fn, NULL, code)  == FFI_OK);
+
+  res = (*((cls_ret_schar)code))(127);
+  /* { dg-output "127: 127" } */
+  printf("res: %d\n", res);
+  /* { dg-output "\nres: 127" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c
new file mode 100644
index 0000000..c7e13b7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c
@@ -0,0 +1,42 @@
+/* Area:	closure_call
+   Purpose:	Check return value sint32.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20031108	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void cls_ret_sint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+			    void* userdata __UNUSED__)
+{
+  *(ffi_arg*)resp = *(signed int *)args[0];
+  printf("%d: %d\n",*(signed int *)args[0],
+	 (int)*(ffi_arg *)(resp));
+}
+typedef signed int (*cls_ret_sint)(signed int);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[2];
+  signed int res;
+
+  cl_arg_types[0] = &ffi_type_sint;
+  cl_arg_types[1] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sint_fn, NULL, code)  == FFI_OK);
+
+  res = (*((cls_ret_sint)code))(65534);
+  /* { dg-output "65534: 65534" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 65534" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c
new file mode 100644
index 0000000..846d57e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c
@@ -0,0 +1,42 @@
+/* Area:	closure_call
+   Purpose:	Check return value sshort.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20031108	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void cls_ret_sshort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+			      void* userdata __UNUSED__)
+{
+  *(ffi_arg*)resp = *(signed short *)args[0];
+  printf("%d: %d\n",*(signed short *)args[0],
+	 (int)*(ffi_arg *)(resp));
+}
+typedef signed short (*cls_ret_sshort)(signed short);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[2];
+  signed short res;
+
+  cl_arg_types[0] = &ffi_type_sshort;
+  cl_arg_types[1] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_sshort, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sshort_fn, NULL, code)  == FFI_OK);
+
+  res = (*((cls_ret_sshort)code))(255);
+  /* { dg-output "255: 255" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 255" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c
new file mode 100644
index 0000000..c1317e7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c
@@ -0,0 +1,42 @@
+/* Area:	closure_call
+   Purpose:	Check return value uchar.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void cls_ret_uchar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+			     void* userdata __UNUSED__)
+{
+  *(ffi_arg*)resp = *(unsigned char *)args[0];
+  printf("%d: %d\n",*(unsigned char *)args[0],
+	 (int)*(ffi_arg *)(resp));
+}
+typedef unsigned char (*cls_ret_uchar)(unsigned char);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[2];
+  unsigned char res;
+
+  cl_arg_types[0] = &ffi_type_uchar;
+  cl_arg_types[1] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_uchar, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uchar_fn, NULL, code)  == FFI_OK);
+
+  res = (*((cls_ret_uchar)code))(127);
+  /* { dg-output "127: 127" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 127" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c
new file mode 100644
index 0000000..885cff5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c
@@ -0,0 +1,43 @@
+/* Area:	closure_call
+   Purpose:	Check return value uint.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void cls_ret_uint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+			    void* userdata __UNUSED__)
+{
+  *(ffi_arg *)resp = *(unsigned int *)args[0];
+
+  printf("%d: %d\n",*(unsigned int *)args[0],
+	 (int)*(ffi_arg *)(resp));
+}
+typedef unsigned int (*cls_ret_uint)(unsigned int);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[2];
+  unsigned int res;
+
+  cl_arg_types[0] = &ffi_type_uint;
+  cl_arg_types[1] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_uint, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uint_fn, NULL, code)  == FFI_OK);
+
+  res = (*((cls_ret_uint)code))(2147483647);
+  /* { dg-output "2147483647: 2147483647" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 2147483647" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c
new file mode 100644
index 0000000..235ab44
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c
@@ -0,0 +1,47 @@
+/* Area:	closure_call
+   Purpose:	Check return value long long.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */
+#include "ffitest.h"
+
+static void cls_ret_ulonglong_fn(ffi_cif* cif __UNUSED__, void* resp,
+				 void** args, void* userdata __UNUSED__)
+{
+  *(unsigned long long *)resp=  *(unsigned long long *)args[0];
+
+  printf("%" PRIuLL ": %" PRIuLL "\n",*(unsigned long long *)args[0],
+	 *(unsigned long long *)(resp));
+}
+typedef unsigned long long (*cls_ret_ulonglong)(unsigned long long);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[2];
+  unsigned long long res;
+
+  cl_arg_types[0] = &ffi_type_uint64;
+  cl_arg_types[1] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_uint64, cl_arg_types) == FFI_OK);
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ulonglong_fn, NULL, code)  == FFI_OK);
+  res = (*((cls_ret_ulonglong)code))(214LL);
+  /* { dg-output "214: 214" } */
+  printf("res: %" PRIdLL "\n", res);
+  /* { dg-output "\nres: 214" } */
+
+  res = (*((cls_ret_ulonglong)code))(9223372035854775808LL);
+  /* { dg-output "\n9223372035854775808: 9223372035854775808" } */
+  printf("res: %" PRIdLL "\n", res);
+  /* { dg-output "\nres: 9223372035854775808" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c
new file mode 100644
index 0000000..a00100e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c
@@ -0,0 +1,43 @@
+/* Area:	closure_call
+   Purpose:	Check return value ushort.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static void cls_ret_ushort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+			      void* userdata __UNUSED__)
+{
+  *(ffi_arg*)resp = *(unsigned short *)args[0];
+
+  printf("%d: %d\n",*(unsigned short *)args[0],
+	 (int)*(ffi_arg *)(resp));
+}
+typedef unsigned short (*cls_ret_ushort)(unsigned short);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[2];
+  unsigned short res;
+
+  cl_arg_types[0] = &ffi_type_ushort;
+  cl_arg_types[1] = NULL;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_ushort, cl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ushort_fn, NULL, code)  == FFI_OK);
+
+  res = (*((cls_ret_ushort)code))(65535);
+  /* { dg-output "65535: 65535" } */
+  printf("res: %d\n",res);
+  /* { dg-output "\nres: 65535" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c
new file mode 100644
index 0000000..f5a7317
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c
@@ -0,0 +1,36 @@
+/* Area:		ffi_prep_cif, ffi_prep_closure
+   Purpose:		Test error return for bad ABIs.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin 6/6/2007	 */
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+
+static void
+dummy_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, 
+	 void** args __UNUSED__, void* userdata __UNUSED__)
+{}
+
+int main (void)
+{
+	ffi_cif cif;
+        void *code;
+	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	ffi_type* arg_types[1];
+
+	arg_types[0] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, 255, 0, &ffi_type_void,
+		arg_types) == FFI_BAD_ABI);
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void,
+		arg_types) == FFI_OK);
+
+	cif.abi= 255;
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, dummy_fn, NULL, code) == FFI_BAD_ABI);
+
+	exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c
new file mode 100644
index 0000000..2539273
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c
@@ -0,0 +1,26 @@
+/* Area:		ffi_prep_cif
+   Purpose:		Test error return for bad typedefs.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin 6/6/2007	 */
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+
+int main (void)
+{
+	ffi_cif cif;
+	ffi_type* arg_types[1];
+
+	arg_types[0] = NULL;
+
+	ffi_type	badType	= ffi_type_void;
+
+	badType.size = 0;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &badType,
+		arg_types) == FFI_BAD_TYPEDEF);
+
+	exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h
new file mode 100644
index 0000000..0e95e16
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h
@@ -0,0 +1,153 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <ffi.h>
+#include "fficonfig.h"
+
+#if defined HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+#if defined HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#define MAX_ARGS 256
+
+#define CHECK(x) !(x) ? abort() : 0
+
+/* Define __UNUSED__ that also other compilers than gcc can run the tests.  */
+#undef __UNUSED__
+#if defined(__GNUC__)
+#define __UNUSED__ __attribute__((__unused__))
+#else
+#define __UNUSED__
+#endif
+
+/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
+   file open.  */
+#ifdef HAVE_MMAP_ANON
+# undef HAVE_MMAP_DEV_ZERO
+
+# include <sys/mman.h>
+# ifndef MAP_FAILED
+#  define MAP_FAILED -1
+# endif
+# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
+#  define MAP_ANONYMOUS MAP_ANON
+# endif
+# define USING_MMAP
+
+#endif
+
+#ifdef HAVE_MMAP_DEV_ZERO
+
+# include <sys/mman.h>
+# ifndef MAP_FAILED
+#  define MAP_FAILED -1
+# endif
+# define USING_MMAP
+
+#endif
+
+/* MinGW kludge.  */
+#ifdef _WIN64
+#define PRIdLL "I64d"
+#define PRIuLL "I64u"
+#else
+#define PRIdLL "lld"
+#define PRIuLL "llu"
+#endif
+
+/* Tru64 UNIX kludge.  */
+#if defined(__alpha__) && defined(__osf__)
+/* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit.  */
+#undef PRIdLL
+#define PRIdLL "ld"
+#undef PRIuLL
+#define PRIuLL "lu"
+#define PRId8 "hd"
+#define PRIu8 "hu"
+#define PRId64 "ld"
+#define PRIu64 "lu"
+#define PRIuPTR "lu"
+#endif
+
+/* PA HP-UX kludge.  */
+#if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR)
+#define PRIuPTR "lu"
+#endif
+
+/* IRIX kludge.  */
+#if defined(__sgi)
+/* IRIX 6.5 <inttypes.h> provides all definitions, but only for C99
+   compilations.  */
+#define PRId8 "hhd"
+#define PRIu8 "hhu"
+#if (_MIPS_SZLONG == 32)
+#define PRId64 "lld"
+#define PRIu64 "llu"
+#endif
+/* This doesn't match <inttypes.h>, which always has "lld" here, but the
+   arguments are uint64_t, int64_t, which are unsigned long, long for
+   64-bit in <sgidefs.h>.  */
+#if (_MIPS_SZLONG == 64)
+#define PRId64 "ld"
+#define PRIu64 "lu"
+#endif
+/* This doesn't match <inttypes.h>, which has "u" here, but the arguments
+   are uintptr_t, which is always unsigned long.  */
+#define PRIuPTR "lu"
+#endif
+
+/* Solaris < 10 kludge.  */
+#if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR)
+#if defined(__arch64__) || defined (__x86_64__)
+#define PRIuPTR "lu"
+#else
+#define PRIuPTR "u"
+#endif
+#endif
+
+#ifdef USING_MMAP
+static inline void *
+allocate_mmap (size_t size)
+{
+  void *page;
+#if defined (HAVE_MMAP_DEV_ZERO)
+  static int dev_zero_fd = -1;
+#endif
+
+#ifdef HAVE_MMAP_DEV_ZERO
+  if (dev_zero_fd == -1)
+    {
+      dev_zero_fd = open ("/dev/zero", O_RDONLY);
+      if (dev_zero_fd == -1)
+	{
+	  perror ("open /dev/zero: %m");
+	  exit (1);
+	}
+    }
+#endif
+
+
+#ifdef HAVE_MMAP_ANON
+  page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
+	       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+#endif
+#ifdef HAVE_MMAP_DEV_ZERO
+  page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
+	       MAP_PRIVATE, dev_zero_fd, 0);
+#endif
+
+  if (page == (void *) MAP_FAILED)
+    {
+      perror ("virtual memory exhausted");
+      exit (1);
+    }
+
+  return page;
+}
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float.c
new file mode 100644
index 0000000..fbc272d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float.c
@@ -0,0 +1,59 @@
+/* Area:	ffi_call
+   Purpose:	Check return value float.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+
+static int floating(int a, float b, double c, long double d)
+{
+  int i;
+
+  i = (int) ((float)a/b + ((float)c/(float)d));
+
+  return i;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg rint;
+
+  float f;
+  signed int si1;
+  double d;
+  long double ld;
+
+  args[0] = &ffi_type_sint;
+  values[0] = &si1;
+  args[1] = &ffi_type_float;
+  values[1] = &f;
+  args[2] = &ffi_type_double;
+  values[2] = &d;
+  args[3] = &ffi_type_longdouble;
+  values[3] = &ld;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
+		     &ffi_type_sint, args) == FFI_OK);
+
+  si1 = 6;
+  f = 3.14159;
+  d = (double)1.0/(double)3.0;
+  ld = 2.71828182846L;
+
+  floating (si1, f, d, ld);
+
+  ffi_call(&cif, FFI_FN(floating), &rint, values);
+
+  printf ("%d vs %d\n", (int)rint, floating (si1, f, d, ld));
+
+  CHECK((int)rint == floating(si1, f, d, ld));
+
+  exit (0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float1.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float1.c
new file mode 100644
index 0000000..991d059
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float1.c
@@ -0,0 +1,58 @@
+/* Area:	ffi_call
+   Purpose:	Check return value double.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+#include "float.h"
+
+typedef union
+{
+  double d;
+  unsigned char c[sizeof (double)];
+} value_type;
+
+#define CANARY 0xba
+
+static double dblit(float f)
+{
+  return f/3.0;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  float f;
+  value_type result[2];
+  unsigned int i;
+
+  args[0] = &ffi_type_float;
+  values[0] = &f;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_double, args) == FFI_OK);
+
+  f = 3.14159;
+
+  /* Put a canary in the return array.  This is a regression test for
+     a buffer overrun.  */
+  memset(result[1].c, CANARY, sizeof (double));
+
+  ffi_call(&cif, FFI_FN(dblit), &result[0].d, values);
+
+  /* These are not always the same!! Check for a reasonable delta */
+
+  CHECK(result[0].d - dblit(f) < DBL_EPSILON);
+
+  /* Check the canary.  */
+  for (i = 0; i < sizeof (double); ++i)
+    CHECK(result[1].c[i] == CANARY);
+
+  exit(0);
+
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float2.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float2.c
new file mode 100644
index 0000000..a0b296c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float2.c
@@ -0,0 +1,58 @@
+/* Area:	ffi_call
+   Purpose:	Check return value long double.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-excess-errors "fails" { target x86_64-*-mingw* x86_64-*-cygwin* } } */
+/* { dg-do run { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
+
+#include "ffitest.h"
+#include "float.h"
+
+static long double ldblit(float f)
+{
+  return (long double) (((long double) f)/ (long double) 3.0);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  float f;
+  long double ld;
+
+  args[0] = &ffi_type_float;
+  values[0] = &f;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_longdouble, args) == FFI_OK);
+
+  f = 3.14159;
+
+#if 1
+  /* This is ifdef'd out for now. long double support under SunOS/gcc
+     is pretty much non-existent.  You'll get the odd bus error in library
+     routines like printf().  */
+  printf ("%Lf\n", ldblit(f));
+#endif
+  ld = 666;
+  ffi_call(&cif, FFI_FN(ldblit), &ld, values);
+
+#if 1
+  /* This is ifdef'd out for now. long double support under SunOS/gcc
+     is pretty much non-existent.  You'll get the odd bus error in library
+     routines like printf().  */
+  printf ("%Lf, %Lf, %Lf, %Lf\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON);
+#endif
+
+  /* These are not always the same!! Check for a reasonable delta */
+  if (ld - ldblit(f) < LDBL_EPSILON)
+    puts("long double return value tests ok!");
+  else
+    CHECK(0);
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float3.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float3.c
new file mode 100644
index 0000000..76bd5f2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float3.c
@@ -0,0 +1,72 @@
+/* Area:	ffi_call
+   Purpose:	Check float arguments with different orders.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+
+#include "ffitest.h"
+#include "float.h"
+
+static double floating_1(float a, double b, long double c)
+{
+  return (double) a + b + (double) c;
+}
+
+static double floating_2(long double a, double b, float c)
+{
+  return (double) a + b + (double) c;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  double rd;
+
+  float f;
+  double d;
+  long double ld;
+
+  args[0] = &ffi_type_float;
+  values[0] = &f;
+  args[1] = &ffi_type_double;
+  values[1] = &d;
+  args[2] = &ffi_type_longdouble;
+  values[2] = &ld;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
+		     &ffi_type_double, args) == FFI_OK);
+
+  f = 3.14159;
+  d = (double)1.0/(double)3.0;
+  ld = 2.71828182846L;
+
+  floating_1 (f, d, ld);
+
+  ffi_call(&cif, FFI_FN(floating_1), &rd, values);
+
+  CHECK(rd - floating_1(f, d, ld) < DBL_EPSILON);
+
+  args[0] = &ffi_type_longdouble;
+  values[0] = &ld;
+  args[1] = &ffi_type_double;
+  values[1] = &d;
+  args[2] = &ffi_type_float;
+  values[2] = &f;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
+		     &ffi_type_double, args) == FFI_OK);
+
+  floating_2 (ld, d, f);
+
+  ffi_call(&cif, FFI_FN(floating_2), &rd, values);
+
+  CHECK(rd - floating_2(ld, d, f) < DBL_EPSILON);
+
+  exit (0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float4.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float4.c
new file mode 100644
index 0000000..0dd6d85
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/float4.c
@@ -0,0 +1,62 @@
+/* Area:	ffi_call
+   Purpose:	Check denorm double value.
+   Limitations:	none.
+   PR:		PR26483.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+/* { dg-options "-mieee" { target alpha*-*-* } } */
+
+#include "ffitest.h"
+#include "float.h"
+
+typedef union
+{
+  double d;
+  unsigned char c[sizeof (double)];
+} value_type;
+
+#define CANARY 0xba
+
+static double dblit(double d)
+{
+  return d;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  double d;
+  value_type result[2];
+  unsigned int i;
+
+  args[0] = &ffi_type_double;
+  values[0] = &d;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_double, args) == FFI_OK);
+  
+  d = DBL_MIN / 2;
+  
+  /* Put a canary in the return array.  This is a regression test for
+     a buffer overrun.  */
+  memset(result[1].c, CANARY, sizeof (double));
+
+  ffi_call(&cif, FFI_FN(dblit), &result[0].d, values);
+  
+  /* The standard delta check doesn't work for denorms.  Since we didn't do
+     any arithmetic, we should get the original result back, and hence an
+     exact check should be OK here.  */
+ 
+  CHECK(result[0].d == dblit(d));
+
+  /* Check the canary.  */
+  for (i = 0; i < sizeof (double); ++i)
+    CHECK(result[1].c[i] == CANARY);
+
+  exit(0);
+
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c
new file mode 100644
index 0000000..e04e1d5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c
@@ -0,0 +1,342 @@
+/*	Area:			ffi_call, closure_call
+	Purpose:		Check large structure returns.
+	Limitations:	none.
+	PR:				none.
+	Originator:		Blake Chaffin	6/18/2007
+*/
+
+/* { dg-excess-errors "" { target x86_64-*-mingw* x86_64-*-cygwin* } } */
+/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
+/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
+/* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
+
+#include "ffitest.h"
+
+typedef	struct BigStruct{
+	uint8_t		a;
+	int8_t		b;
+	uint16_t	c;
+	int16_t		d;
+	uint32_t	e;
+	int32_t		f;
+	uint64_t	g;
+	int64_t		h;
+	float		i;
+	double		j;
+	long double	k;
+	char*		l;
+	uint8_t		m;
+	int8_t		n;
+	uint16_t	o;
+	int16_t		p;
+	uint32_t	q;
+	int32_t		r;
+	uint64_t	s;
+	int64_t		t;
+	float		u;
+	double		v;
+	long double	w;
+	char*		x;
+	uint8_t		y;
+	int8_t		z;
+	uint16_t	aa;
+	int16_t		bb;
+	uint32_t	cc;
+	int32_t		dd;
+	uint64_t	ee;
+	int64_t		ff;
+	float		gg;
+	double		hh;
+	long double	ii;
+	char*		jj;
+	uint8_t		kk;
+	int8_t		ll;
+	uint16_t	mm;
+	int16_t		nn;
+	uint32_t	oo;
+	int32_t		pp;
+	uint64_t	qq;
+	int64_t		rr;
+	float		ss;
+	double		tt;
+	long double	uu;
+	char*		vv;
+	uint8_t		ww;
+	int8_t		xx;
+} BigStruct;
+
+BigStruct
+test_large_fn(
+	uint8_t		ui8_1,
+	int8_t		si8_1,
+	uint16_t	ui16_1,
+	int16_t		si16_1,
+	uint32_t	ui32_1,
+	int32_t		si32_1,
+	uint64_t	ui64_1,
+	int64_t		si64_1,
+	float		f_1,
+	double		d_1,
+	long double	ld_1,
+	char*		p_1,
+	uint8_t		ui8_2,
+	int8_t		si8_2,
+	uint16_t	ui16_2,
+	int16_t		si16_2,
+	uint32_t	ui32_2,
+	int32_t		si32_2,
+	uint64_t	ui64_2,
+	int64_t		si64_2,
+	float		f_2,
+	double		d_2,
+	long double	ld_2,
+	char*		p_2,
+	uint8_t		ui8_3,
+	int8_t		si8_3,
+	uint16_t	ui16_3,
+	int16_t		si16_3,
+	uint32_t	ui32_3,
+	int32_t		si32_3,
+	uint64_t	ui64_3,
+	int64_t		si64_3,
+	float		f_3,
+	double		d_3,
+	long double	ld_3,
+	char*		p_3,
+	uint8_t		ui8_4,
+	int8_t		si8_4,
+	uint16_t	ui16_4,
+	int16_t		si16_4,
+	uint32_t	ui32_4,
+	int32_t		si32_4,
+	uint64_t	ui64_4,
+	int64_t		si64_4,
+	float		f_4,
+	double		d_4,
+	long double	ld_4,
+	char*		p_4,
+	uint8_t		ui8_5,
+	int8_t		si8_5)
+{
+	BigStruct	retVal	= {
+		ui8_1 + 1, si8_1 + 1, ui16_1 + 1, si16_1 + 1, ui32_1 + 1, si32_1 + 1,
+			ui64_1 + 1, si64_1 + 1, f_1 + 1, d_1 + 1, ld_1 + 1, (char*)((intptr_t)p_1 + 1), 
+		ui8_2 + 2, si8_2 + 2, ui16_2 + 2, si16_2 + 2, ui32_2 + 2, si32_2 + 2,
+			ui64_2 + 2, si64_2 + 2, f_2 + 2, d_2 + 2, ld_2 + 2, (char*)((intptr_t)p_2 + 2), 
+		ui8_3 + 3, si8_3 + 3, ui16_3 + 3, si16_3 + 3, ui32_3 + 3, si32_3 + 3,
+			ui64_3 + 3, si64_3 + 3, f_3 + 3, d_3 + 3, ld_3 + 3, (char*)((intptr_t)p_3 + 3), 
+		ui8_4 + 4, si8_4 + 4, ui16_4 + 4, si16_4 + 4, ui32_4 + 4, si32_4 + 4,
+			ui64_4 + 4, si64_4 + 4, f_4 + 4, d_4 + 4, ld_4 + 4, (char*)((intptr_t)p_4 + 4), 
+		ui8_5 + 5, si8_5 + 5};
+
+	printf("%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 ": "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
+	       ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, (unsigned long)p_1,
+		ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, (unsigned long)p_2,
+		ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, (unsigned long)p_3,
+		ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, (unsigned long)p_4, ui8_5, si8_5,
+		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
+	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
+		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
+	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
+		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
+	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
+		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
+	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
+
+	return	retVal;
+}
+
+static void
+cls_large_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
+{
+	uint8_t		ui8_1	= *(uint8_t*)args[0];
+	int8_t		si8_1	= *(int8_t*)args[1];
+	uint16_t	ui16_1	= *(uint16_t*)args[2];
+	int16_t		si16_1	= *(int16_t*)args[3];
+	uint32_t	ui32_1	= *(uint32_t*)args[4];
+	int32_t		si32_1	= *(int32_t*)args[5];
+	uint64_t	ui64_1	= *(uint64_t*)args[6];
+	int64_t		si64_1	= *(int64_t*)args[7];
+	float		f_1		= *(float*)args[8];
+	double		d_1		= *(double*)args[9];
+	long double	ld_1	= *(long double*)args[10];
+	char*		p_1		= *(char**)args[11];
+	uint8_t		ui8_2	= *(uint8_t*)args[12];
+	int8_t		si8_2	= *(int8_t*)args[13];
+	uint16_t	ui16_2	= *(uint16_t*)args[14];
+	int16_t		si16_2	= *(int16_t*)args[15];
+	uint32_t	ui32_2	= *(uint32_t*)args[16];
+	int32_t		si32_2	= *(int32_t*)args[17];
+	uint64_t	ui64_2	= *(uint64_t*)args[18];
+	int64_t		si64_2	= *(int64_t*)args[19];
+	float		f_2		= *(float*)args[20];
+	double		d_2		= *(double*)args[21];
+	long double	ld_2	= *(long double*)args[22];
+	char*		p_2		= *(char**)args[23];
+	uint8_t		ui8_3	= *(uint8_t*)args[24];
+	int8_t		si8_3	= *(int8_t*)args[25];
+	uint16_t	ui16_3	= *(uint16_t*)args[26];
+	int16_t		si16_3	= *(int16_t*)args[27];
+	uint32_t	ui32_3	= *(uint32_t*)args[28];
+	int32_t		si32_3	= *(int32_t*)args[29];
+	uint64_t	ui64_3	= *(uint64_t*)args[30];
+	int64_t		si64_3	= *(int64_t*)args[31];
+	float		f_3		= *(float*)args[32];
+	double		d_3		= *(double*)args[33];
+	long double	ld_3	= *(long double*)args[34];
+	char*		p_3		= *(char**)args[35];
+	uint8_t		ui8_4	= *(uint8_t*)args[36];
+	int8_t		si8_4	= *(int8_t*)args[37];
+	uint16_t	ui16_4	= *(uint16_t*)args[38];
+	int16_t		si16_4	= *(int16_t*)args[39];
+	uint32_t	ui32_4	= *(uint32_t*)args[40];
+	int32_t		si32_4	= *(int32_t*)args[41];
+	uint64_t	ui64_4	= *(uint64_t*)args[42];
+	int64_t		si64_4	= *(int64_t*)args[43];
+	float		f_4		= *(float*)args[44];
+	double		d_4		= *(double*)args[45];
+	long double	ld_4	= *(long double*)args[46];
+	char*		p_4		= *(char**)args[47];
+	uint8_t		ui8_5	= *(uint8_t*)args[48];
+	int8_t		si8_5	= *(int8_t*)args[49];
+
+	*(BigStruct*)resp = test_large_fn(
+		ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, p_1,
+		ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, p_2,
+		ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, p_3,
+		ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, p_4,
+		ui8_5, si8_5);
+}
+
+int
+main(int argc __UNUSED__, const char** argv __UNUSED__)
+{
+        void *code;
+	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+
+	ffi_cif		cif;
+	ffi_type*	argTypes[51];
+	void*		argValues[51];
+
+	ffi_type	ret_struct_type;
+	ffi_type*	st_fields[51];
+	BigStruct	retVal;
+
+	memset (&retVal, 0, sizeof(retVal));
+
+	ret_struct_type.size = 0;
+	ret_struct_type.alignment = 0;
+	ret_struct_type.type = FFI_TYPE_STRUCT;
+	ret_struct_type.elements = st_fields;
+
+	st_fields[0]	= st_fields[12]	= st_fields[24]	= st_fields[36]	= st_fields[48]	= &ffi_type_uint8;
+	st_fields[1]	= st_fields[13]	= st_fields[25]	= st_fields[37]	= st_fields[49]	= &ffi_type_sint8;
+	st_fields[2]	= st_fields[14]	= st_fields[26]	= st_fields[38]	= &ffi_type_uint16;
+	st_fields[3]	= st_fields[15]	= st_fields[27]	= st_fields[39]	= &ffi_type_sint16;
+	st_fields[4]	= st_fields[16]	= st_fields[28]	= st_fields[40]	= &ffi_type_uint32;
+	st_fields[5]	= st_fields[17]	= st_fields[29]	= st_fields[41]	= &ffi_type_sint32;
+	st_fields[6]	= st_fields[18]	= st_fields[30]	= st_fields[42]	= &ffi_type_uint64;
+	st_fields[7]	= st_fields[19]	= st_fields[31]	= st_fields[43]	= &ffi_type_sint64;
+	st_fields[8]	= st_fields[20]	= st_fields[32]	= st_fields[44]	= &ffi_type_float;
+	st_fields[9]	= st_fields[21]	= st_fields[33]	= st_fields[45]	= &ffi_type_double;
+	st_fields[10]	= st_fields[22]	= st_fields[34]	= st_fields[46]	= &ffi_type_longdouble;
+	st_fields[11]	= st_fields[23]	= st_fields[35]	= st_fields[47]	= &ffi_type_pointer;
+
+	st_fields[50] = NULL;
+
+	uint8_t		ui8		= 1;
+	int8_t		si8		= 2;
+	uint16_t	ui16	= 3;
+	int16_t		si16	= 4;
+	uint32_t	ui32	= 5;
+	int32_t		si32	= 6;
+	uint64_t	ui64	= 7;
+	int64_t		si64	= 8;
+	float		f		= 9;
+	double		d		= 10;
+	long double	ld		= 11;
+	char*		p		= (char*)0x12345678;
+
+	argTypes[0]		= argTypes[12]	= argTypes[24]	= argTypes[36]	= argTypes[48]	= &ffi_type_uint8;
+	argValues[0]	= argValues[12]	= argValues[24]	= argValues[36]	= argValues[48]	= &ui8;
+	argTypes[1]		= argTypes[13]	= argTypes[25]	= argTypes[37]	= argTypes[49]	= &ffi_type_sint8;
+	argValues[1]	= argValues[13]	= argValues[25]	= argValues[37]	= argValues[49]	= &si8;
+	argTypes[2]		= argTypes[14]	= argTypes[26]	= argTypes[38]	= &ffi_type_uint16;
+	argValues[2]	= argValues[14]	= argValues[26]	= argValues[38]	= &ui16;
+	argTypes[3]		= argTypes[15]	= argTypes[27]	= argTypes[39]	= &ffi_type_sint16;
+	argValues[3]	= argValues[15]	= argValues[27]	= argValues[39]	= &si16;
+	argTypes[4]		= argTypes[16]	= argTypes[28]	= argTypes[40]	= &ffi_type_uint32;
+	argValues[4]	= argValues[16]	= argValues[28]	= argValues[40]	= &ui32;
+	argTypes[5]		= argTypes[17]	= argTypes[29]	= argTypes[41]	= &ffi_type_sint32;
+	argValues[5]	= argValues[17]	= argValues[29]	= argValues[41]	= &si32;
+	argTypes[6]		= argTypes[18]	= argTypes[30]	= argTypes[42]	= &ffi_type_uint64;
+	argValues[6]	= argValues[18]	= argValues[30]	= argValues[42]	= &ui64;
+	argTypes[7]		= argTypes[19]	= argTypes[31]	= argTypes[43]	= &ffi_type_sint64;
+	argValues[7]	= argValues[19]	= argValues[31]	= argValues[43]	= &si64;
+	argTypes[8]		= argTypes[20]	= argTypes[32]	= argTypes[44]	= &ffi_type_float;
+	argValues[8]	= argValues[20]	= argValues[32]	= argValues[44]	= &f;
+	argTypes[9]		= argTypes[21]	= argTypes[33]	= argTypes[45]	= &ffi_type_double;
+	argValues[9]	= argValues[21]	= argValues[33]	= argValues[45]	= &d;
+	argTypes[10]	= argTypes[22]	= argTypes[34]	= argTypes[46]	= &ffi_type_longdouble;
+	argValues[10]	= argValues[22]	= argValues[34]	= argValues[46]	= &ld;
+	argTypes[11]	= argTypes[23]	= argTypes[35]	= argTypes[47]	= &ffi_type_pointer;
+	argValues[11]	= argValues[23]	= argValues[35]	= argValues[47]	= &p;
+
+	argTypes[50]	= NULL;
+	argValues[50]	= NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 50, &ret_struct_type, argTypes) == FFI_OK);
+
+	ffi_call(&cif, FFI_FN(test_large_fn), &retVal, argValues);
+	// { dg-output "1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" }
+	printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
+		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
+	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
+		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
+	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
+		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
+	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
+		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
+	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
+	// { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" }
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_large_fn, NULL, code) == FFI_OK);
+
+	retVal	= ((BigStruct(*)(
+		uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
+		uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
+		uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
+		uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, long double, char*,
+		uint8_t, int8_t))(code))(
+		ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
+		ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
+		ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
+		ui8, si8, ui16, si16, ui32, si32, ui64, si64, f, d, ld, p,
+		ui8, si8);
+	// { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2 3 4 5 6 7 8 9 10 11 0x12345678 1 2: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" }
+	printf("res: %" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
+		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
+		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
+	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
+		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
+	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
+		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
+	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
+		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
+	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
+	// { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" }
+
+    return 0;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many.c
new file mode 100644
index 0000000..4869ba9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many.c
@@ -0,0 +1,69 @@
+/* Area:	ffi_call
+   Purpose:	Check return value float, with many arguments
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+#include <float.h>
+
+static float many(float f1,
+		  float f2,
+		  float f3,
+		  float f4,
+		  float f5,
+		  float f6,
+		  float f7,
+		  float f8,
+		  float f9,
+		  float f10,
+		  float f11,
+		  float f12,
+		  float f13)
+{
+#if 0
+  printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n",
+	 (double) f1, (double) f2, (double) f3, (double) f4, (double) f5, 
+	 (double) f6, (double) f7, (double) f8, (double) f9, (double) f10,
+	 (double) f11, (double) f12, (double) f13);
+#endif
+
+  return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[13];
+  void *values[13];
+  float fa[13];
+  float f, ff;
+  int i;
+
+  for (i = 0; i < 13; i++)
+    {
+      args[i] = &ffi_type_float;
+      values[i] = &fa[i];
+      fa[i] = (float) i;
+    }
+
+    /* Initialize the cif */
+    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, 
+		       &ffi_type_float, args) == FFI_OK);
+
+    ffi_call(&cif, FFI_FN(many), &f, values);
+
+    ff =  many(fa[0], fa[1],
+	       fa[2], fa[3],
+	       fa[4], fa[5],
+	       fa[6], fa[7],
+	       fa[8], fa[9],
+	       fa[10],fa[11],fa[12]);
+
+    if (f - ff < FLT_EPSILON)
+      exit(0);
+    else
+      abort();
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c
new file mode 100644
index 0000000..1b26332
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/many_win32.c
@@ -0,0 +1,63 @@
+/* Area:	ffi_call
+   Purpose:	Check stdcall many call on X86_WIN32 systems.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
+
+#include "ffitest.h"
+#include <float.h>
+
+static float __attribute__((stdcall)) stdcall_many(float f1,
+						   float f2,
+						   float f3,
+						   float f4,
+						   float f5,
+						   float f6,
+						   float f7,
+						   float f8,
+						   float f9,
+						   float f10,
+						   float f11,
+						   float f12,
+						   float f13)
+{
+  return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[13];
+  void *values[13];
+  float fa[13];
+  float f, ff;
+  unsigned long ul;
+
+  for (ul = 0; ul < 13; ul++)
+    {
+      args[ul] = &ffi_type_float;
+      values[ul] = &fa[ul];
+	fa[ul] = (float) ul;
+    }
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 13,
+		     &ffi_type_float, args) == FFI_OK);
+
+  ff =  stdcall_many(fa[0], fa[1],
+		     fa[2], fa[3],
+		     fa[4], fa[5],
+		     fa[6], fa[7],
+		     fa[8], fa[9],
+		     fa[10], fa[11], fa[12]);
+
+  ffi_call(&cif, FFI_FN(stdcall_many), &f, values);
+
+  if (f - ff < FLT_EPSILON)
+    printf("stdcall many arg tests ok!\n");
+  else
+    CHECK(0);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/negint.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/negint.c
new file mode 100644
index 0000000..3168113
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/negint.c
@@ -0,0 +1,53 @@
+/* Area:	ffi_call
+   Purpose:	Check that negative integers are passed correctly.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+/* { dg-options -O2 } */
+
+#include "ffitest.h"
+
+static int checking(int a, short b, signed char c)
+{
+
+  return (a < 0 && b < 0 && c < 0);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg rint;
+
+  signed int si;
+  signed short ss;
+  signed char sc;
+
+  args[0] = &ffi_type_sint;
+  values[0] = &si;
+  args[1] = &ffi_type_sshort;
+  values[1] = &ss;
+  args[2] = &ffi_type_schar;
+  values[2] = &sc;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
+		     &ffi_type_sint, args) == FFI_OK);
+
+  si = -6;
+  ss = -12;
+  sc = -1;
+
+  checking (si, ss, sc);
+
+  ffi_call(&cif, FFI_FN(checking), &rint, values);
+
+  printf ("%d vs %d\n", (int)rint, checking (si, ss, sc));
+
+  CHECK(rint != 0);
+
+  exit (0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c
new file mode 100644
index 0000000..8aa527e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c
@@ -0,0 +1,152 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Contains structs as parameter of the struct itself.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_16byte1 {
+  double a;
+  float b;
+  int c;
+} cls_struct_16byte1;
+
+typedef struct cls_struct_16byte2 {
+  int ii;
+  double dd;
+  float ff;
+} cls_struct_16byte2;
+
+typedef struct cls_struct_combined {
+  cls_struct_16byte1 d;
+  cls_struct_16byte2 e;
+} cls_struct_combined;
+
+cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0,
+			    struct cls_struct_16byte2 b1,
+			    struct cls_struct_combined b2)
+{
+  struct cls_struct_combined result;
+
+  result.d.a = b0.a + b1.dd + b2.d.a;
+  result.d.b = b0.b + b1.ff + b2.d.b;
+  result.d.c = b0.c + b1.ii + b2.d.c;
+  result.e.ii = b0.c + b1.ii + b2.e.ii;
+  result.e.dd = b0.a + b1.dd + b2.e.dd;
+  result.e.ff = b0.b + b1.ff + b2.e.ff;
+
+  printf("%g %g %d %d %g %g %g %g %d %d %g %g: %g %g %d %d %g %g\n",
+	 b0.a, b0.b, b0.c,
+	 b1.ii, b1.dd, b1.ff,
+	 b2.d.a, b2.d.b, b2.d.c,
+	 b2.e.ii, b2.e.dd, b2.e.ff,
+	 result.d.a, result.d.b, result.d.c,
+	 result.e.ii, result.e.dd, result.e.ff);
+
+  return result;
+}
+
+static void
+cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		       void* userdata __UNUSED__)
+{
+  struct cls_struct_16byte1 b0;
+  struct cls_struct_16byte2 b1;
+  struct cls_struct_combined b2;
+
+  b0 = *(struct cls_struct_16byte1*)(args[0]);
+  b1 = *(struct cls_struct_16byte2*)(args[1]);
+  b2 = *(struct cls_struct_combined*)(args[2]);
+
+
+  *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[5];
+  ffi_type* cls_struct_fields1[5];
+  ffi_type* cls_struct_fields2[5];
+  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  cls_struct_type1.size = 0;
+  cls_struct_type1.alignment = 0;
+  cls_struct_type1.type = FFI_TYPE_STRUCT;
+  cls_struct_type1.elements = cls_struct_fields1;
+
+  cls_struct_type2.size = 0;
+  cls_struct_type2.alignment = 0;
+  cls_struct_type2.type = FFI_TYPE_STRUCT;
+  cls_struct_type2.elements = cls_struct_fields2;
+
+  struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6};
+  struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0};
+  struct cls_struct_combined g_dbl = {{4.0, 5.0, 6},
+				      {3, 1.0, 8.0}};
+  struct cls_struct_combined res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_double;
+  cls_struct_fields[1] = &ffi_type_float;
+  cls_struct_fields[2] = &ffi_type_sint;
+  cls_struct_fields[3] = NULL;
+
+  cls_struct_fields1[0] = &ffi_type_sint;
+  cls_struct_fields1[1] = &ffi_type_double;
+  cls_struct_fields1[2] = &ffi_type_float;
+  cls_struct_fields1[3] = NULL;
+
+  cls_struct_fields2[0] = &cls_struct_type;
+  cls_struct_fields2[1] = &cls_struct_type1;
+  cls_struct_fields2[2] = NULL;
+
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type1;
+  dbl_arg_types[2] = &cls_struct_type2;
+  dbl_arg_types[3] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type2,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = &g_dbl;
+  args_dbl[3] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl);
+  /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */
+  CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
+  CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
+  CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
+  CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
+  CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
+  CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1,
+				     cls_struct_16byte2,
+				     cls_struct_combined))
+	     (code))(e_dbl, f_dbl, g_dbl);
+  /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */
+  CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
+  CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
+  CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
+  CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
+  CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
+  CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c
new file mode 100644
index 0000000..2a9f515
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c
@@ -0,0 +1,161 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Contains structs as parameter of the struct itself.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_16byte1 {
+  double a;
+  float b;
+  int c;
+} cls_struct_16byte1;
+
+typedef struct cls_struct_16byte2 {
+  int ii;
+  double dd;
+  float ff;
+} cls_struct_16byte2;
+
+typedef struct cls_struct_combined {
+  cls_struct_16byte1 d;
+  cls_struct_16byte2 e;
+} cls_struct_combined;
+
+cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0,
+					   struct cls_struct_16byte2 b1,
+					   struct cls_struct_combined b2,
+					   struct cls_struct_16byte1 b3)
+{
+  struct cls_struct_combined result;
+
+  result.d.a = b0.a + b1.dd + b2.d.a;
+  result.d.b = b0.b + b1.ff + b2.d.b;
+  result.d.c = b0.c + b1.ii + b2.d.c;
+  result.e.ii = b0.c + b1.ii + b2.e.ii;
+  result.e.dd = b0.a + b1.dd + b2.e.dd;
+  result.e.ff = b0.b + b1.ff + b2.e.ff;
+
+  printf("%g %g %d %d %g %g %g %g %d %d %g %g %g %g %d: %g %g %d %d %g %g\n",
+	 b0.a, b0.b, b0.c,
+	 b1.ii, b1.dd, b1.ff,
+	 b2.d.a, b2.d.b, b2.d.c,
+	 b2.e.ii, b2.e.dd, b2.e.ff,
+	 b3.a, b3.b, b3.c,
+	 result.d.a, result.d.b, result.d.c,
+	 result.e.ii, result.e.dd, result.e.ff);
+
+  return result;
+}
+
+static void
+cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+		       void* userdata __UNUSED__)
+{
+  struct cls_struct_16byte1 b0;
+  struct cls_struct_16byte2 b1;
+  struct cls_struct_combined b2;
+  struct cls_struct_16byte1 b3;
+
+  b0 = *(struct cls_struct_16byte1*)(args[0]);
+  b1 = *(struct cls_struct_16byte2*)(args[1]);
+  b2 = *(struct cls_struct_combined*)(args[2]);
+  b3 = *(struct cls_struct_16byte1*)(args[3]);
+
+
+  *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2, b3);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[5];
+  ffi_type* cls_struct_fields[5];
+  ffi_type* cls_struct_fields1[5];
+  ffi_type* cls_struct_fields2[5];
+  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  cls_struct_type1.size = 0;
+  cls_struct_type1.alignment = 0;
+  cls_struct_type1.type = FFI_TYPE_STRUCT;
+  cls_struct_type1.elements = cls_struct_fields1;
+
+  cls_struct_type2.size = 0;
+  cls_struct_type2.alignment = 0;
+  cls_struct_type2.type = FFI_TYPE_STRUCT;
+  cls_struct_type2.elements = cls_struct_fields2;
+
+  struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6};
+  struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0};
+  struct cls_struct_combined g_dbl = {{4.0, 5.0, 6},
+				      {3, 1.0, 8.0}};
+  struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4};
+  struct cls_struct_combined res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_double;
+  cls_struct_fields[1] = &ffi_type_float;
+  cls_struct_fields[2] = &ffi_type_sint;
+  cls_struct_fields[3] = NULL;
+
+  cls_struct_fields1[0] = &ffi_type_sint;
+  cls_struct_fields1[1] = &ffi_type_double;
+  cls_struct_fields1[2] = &ffi_type_float;
+  cls_struct_fields1[3] = NULL;
+
+  cls_struct_fields2[0] = &cls_struct_type;
+  cls_struct_fields2[1] = &cls_struct_type1;
+  cls_struct_fields2[2] = NULL;
+
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type1;
+  dbl_arg_types[2] = &cls_struct_type2;
+  dbl_arg_types[3] = &cls_struct_type;
+  dbl_arg_types[4] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type2,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = &g_dbl;
+  args_dbl[3] = &h_dbl;
+  args_dbl[4] = NULL;
+
+  ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl);
+  /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */
+  CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
+  CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
+  CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
+  CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
+  CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
+  CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1,
+				     cls_struct_16byte2,
+				     cls_struct_combined,
+				     cls_struct_16byte1))
+	     (code))(e_dbl, f_dbl, g_dbl, h_dbl);
+  /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */
+  CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
+  CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
+  CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
+  CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
+  CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
+  CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
+  //  CHECK( 1 == 0);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c
new file mode 100644
index 0000000..d6a718b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c
@@ -0,0 +1,133 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Contains structs as parameter of the struct itself.
+		Sample taken from Alan Modras patch to src/prep_cif.c.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20051010	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct A {
+  unsigned long long a;
+  unsigned char b;
+} A;
+
+typedef struct B {
+  unsigned char y;
+  struct A x;
+  unsigned int z;
+} B;
+
+typedef struct C {
+  unsigned long long d;
+  unsigned char e;
+} C;
+
+static B B_fn(struct A b2, struct B b3, struct C b4)
+{
+  struct B result;
+
+  result.x.a = b2.a + b3.x.a + b3.z + b4.d;
+  result.x.b = b2.b + b3.x.b + b3.y + b4.e;
+  result.y = b2.b + b3.x.b + b4.e;
+
+  printf("%d %d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
+	 (int)b3.x.a, b3.x.b, b3.y, b3.z, (int)b4.d, b4.e,
+	 (int)result.x.a, result.x.b, result.y);
+
+  return result;
+}
+
+static void
+B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+     void* userdata __UNUSED__)
+{
+  struct A b0;
+  struct B b1;
+  struct C b2;
+
+  b0 = *(struct A*)(args[0]);
+  b1 = *(struct B*)(args[1]);
+  b2 = *(struct C*)(args[2]);
+
+  *(B*)resp = B_fn(b0, b1, b2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[4];
+  ffi_type* cls_struct_fields[3];
+  ffi_type* cls_struct_fields1[4];
+  ffi_type* cls_struct_fields2[3];
+  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
+  ffi_type* dbl_arg_types[4];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  cls_struct_type1.size = 0;
+  cls_struct_type1.alignment = 0;
+  cls_struct_type1.type = FFI_TYPE_STRUCT;
+  cls_struct_type1.elements = cls_struct_fields1;
+
+  cls_struct_type2.size = 0;
+  cls_struct_type2.alignment = 0;
+  cls_struct_type2.type = FFI_TYPE_STRUCT;
+  cls_struct_type2.elements = cls_struct_fields2;
+
+  struct A e_dbl = { 1LL, 7};
+  struct B f_dbl = { 99, {12LL , 127}, 255};
+  struct C g_dbl = { 2LL, 9};
+
+  struct B res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uint64;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = NULL;
+
+  cls_struct_fields1[0] = &ffi_type_uchar;
+  cls_struct_fields1[1] = &cls_struct_type;
+  cls_struct_fields1[2] = &ffi_type_uint;
+  cls_struct_fields1[3] = NULL;
+
+  cls_struct_fields2[0] = &ffi_type_uint64;
+  cls_struct_fields2[1] = &ffi_type_uchar;
+  cls_struct_fields2[2] = NULL;
+
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type1;
+  dbl_arg_types[2] = &cls_struct_type2;
+  dbl_arg_types[3] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = &g_dbl;
+  args_dbl[3] = NULL;
+
+  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 7 12 127 99 255 2 9: 270 242 143" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl);
+  /* { dg-output "\n1 7 12 127 99 255 2 9: 270 242 143" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + f_dbl.z + g_dbl.d));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c
new file mode 100644
index 0000000..de1584c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c
@@ -0,0 +1,110 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Contains structs as parameter of the struct itself.
+		Sample taken from Alan Modras patch to src/prep_cif.c.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030911	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct A {
+  unsigned long a;
+  unsigned char b;
+} A;
+
+typedef struct B {
+  struct A x;
+  unsigned char y;
+} B;
+
+B B_fn(struct A b0, struct B b1)
+{
+  struct B result;
+
+  result.x.a = b0.a + b1.x.a;
+  result.x.b = b0.b + b1.x.b + b1.y;
+  result.y = b0.b + b1.x.b;
+
+  printf("%lu %d %lu %d %d: %lu %d %d\n", b0.a, b0.b, b1.x.a, b1.x.b, b1.y,
+	 result.x.a, result.x.b, result.y);
+
+  return result;
+}
+
+static void
+B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+     void* userdata __UNUSED__)
+{
+  struct A b0;
+  struct B b1;
+
+  b0 = *(struct A*)(args[0]);
+  b1 = *(struct B*)(args[1]);
+
+  *(B*)resp = B_fn(b0, b1);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[3];
+  ffi_type* cls_struct_fields[3];
+  ffi_type* cls_struct_fields1[3];
+  ffi_type cls_struct_type, cls_struct_type1;
+  ffi_type* dbl_arg_types[3];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  cls_struct_type1.size = 0;
+  cls_struct_type1.alignment = 0;
+  cls_struct_type1.type = FFI_TYPE_STRUCT;
+  cls_struct_type1.elements = cls_struct_fields1;
+
+  struct A e_dbl = { 1, 7};
+  struct B f_dbl = {{12 , 127}, 99};
+
+  struct B res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_ulong;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = NULL;
+
+  cls_struct_fields1[0] = &cls_struct_type;
+  cls_struct_fields1[1] = &ffi_type_uchar;
+  cls_struct_fields1[2] = NULL;
+
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type1;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 7 12 127 99: 13 233 134" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl);
+  /* { dg-output "\n1 7 12 127 99: 13 233 134" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c
new file mode 100644
index 0000000..58aa853
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c
@@ -0,0 +1,111 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Contains structs as parameter of the struct itself.
+		Sample taken from Alan Modras patch to src/prep_cif.c.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030911	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct A {
+  unsigned long long a;
+  unsigned char b;
+} A;
+
+typedef struct B {
+  struct A x;
+  unsigned char y;
+} B;
+
+B B_fn(struct A b0, struct B b1)
+{
+  struct B result;
+
+  result.x.a = b0.a + b1.x.a;
+  result.x.b = b0.b + b1.x.b + b1.y;
+  result.y = b0.b + b1.x.b;
+
+  printf("%d %d %d %d %d: %d %d %d\n", (int)b0.a, b0.b,
+	 (int)b1.x.a, b1.x.b, b1.y,
+	 (int)result.x.a, result.x.b, result.y);
+
+  return result;
+}
+
+static void
+B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+     void* userdata __UNUSED__)
+{
+  struct A b0;
+  struct B b1;
+
+  b0 = *(struct A*)(args[0]);
+  b1 = *(struct B*)(args[1]);
+
+  *(B*)resp = B_fn(b0, b1);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[3];
+  ffi_type* cls_struct_fields[3];
+  ffi_type* cls_struct_fields1[3];
+  ffi_type cls_struct_type, cls_struct_type1;
+  ffi_type* dbl_arg_types[3];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  cls_struct_type1.size = 0;
+  cls_struct_type1.alignment = 0;
+  cls_struct_type1.type = FFI_TYPE_STRUCT;
+  cls_struct_type1.elements = cls_struct_fields1;
+
+  struct A e_dbl = { 1LL, 7};
+  struct B f_dbl = {{12LL , 127}, 99};
+
+  struct B res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uint64;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = NULL;
+
+  cls_struct_fields1[0] = &cls_struct_type;
+  cls_struct_fields1[1] = &ffi_type_uchar;
+  cls_struct_fields1[2] = NULL;
+
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type1;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 7 12 127 99: 13 233 134" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
+
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl);
+  /* { dg-output "\n1 7 12 127 99: 13 233 134" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c
new file mode 100644
index 0000000..98e491e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c
@@ -0,0 +1,111 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Contains structs as parameter of the struct itself.
+		Sample taken from Alan Modras patch to src/prep_cif.c.
+   Limitations:	none.
+   PR:		PR 25630.
+   Originator:	<andreast@gcc.gnu.org> 20051010	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct A {
+  double a;
+  unsigned char b;
+} A;
+
+typedef struct B {
+  struct A x;
+  unsigned char y;
+} B;
+
+static B B_fn(struct A b2, struct B b3)
+{
+  struct B result;
+
+  result.x.a = b2.a + b3.x.a;
+  result.x.b = b2.b + b3.x.b + b3.y;
+  result.y = b2.b + b3.x.b;
+
+  printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
+	 (int)b3.x.a, b3.x.b, b3.y,
+	 (int)result.x.a, result.x.b, result.y);
+
+  return result;
+}
+
+static void
+B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+     void* userdata __UNUSED__)
+{
+  struct A b0;
+  struct B b1;
+
+  b0 = *(struct A*)(args[0]);
+  b1 = *(struct B*)(args[1]);
+
+  *(B*)resp = B_fn(b0, b1);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[3];
+  ffi_type* cls_struct_fields[3];
+  ffi_type* cls_struct_fields1[3];
+  ffi_type cls_struct_type, cls_struct_type1;
+  ffi_type* dbl_arg_types[3];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  cls_struct_type1.size = 0;
+  cls_struct_type1.alignment = 0;
+  cls_struct_type1.type = FFI_TYPE_STRUCT;
+  cls_struct_type1.elements = cls_struct_fields1;
+
+  struct A e_dbl = { 1.0, 7};
+  struct B f_dbl = {{12.0 , 127}, 99};
+
+  struct B res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_double;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = NULL;
+
+  cls_struct_fields1[0] = &cls_struct_type;
+  cls_struct_fields1[1] = &ffi_type_uchar;
+  cls_struct_fields1[2] = NULL;
+
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type1;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 7 12 127 99: 13 233 134" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl);
+  /* { dg-output "\n1 7 12 127 99: 13 233 134" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c
new file mode 100644
index 0000000..d8e3537
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c
@@ -0,0 +1,112 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Contains structs as parameter of the struct itself.
+		Sample taken from Alan Modras patch to src/prep_cif.c.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20051010	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct A {
+  long double a;
+  unsigned char b;
+} A;
+
+typedef struct B {
+  struct A x;
+  unsigned char y;
+} B;
+
+static B B_fn(struct A b2, struct B b3)
+{
+  struct B result;
+
+  result.x.a = b2.a + b3.x.a;
+  result.x.b = b2.b + b3.x.b + b3.y;
+  result.y = b2.b + b3.x.b;
+
+  printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
+	 (int)b3.x.a, b3.x.b, b3.y,
+	 (int)result.x.a, result.x.b, result.y);
+
+  return result;
+}
+
+static void
+B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+     void* userdata __UNUSED__)
+{
+  struct A b0;
+  struct B b1;
+
+  b0 = *(struct A*)(args[0]);
+  b1 = *(struct B*)(args[1]);
+
+  *(B*)resp = B_fn(b0, b1);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[3];
+  ffi_type* cls_struct_fields[3];
+  ffi_type* cls_struct_fields1[3];
+  ffi_type cls_struct_type, cls_struct_type1;
+  ffi_type* dbl_arg_types[3];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  cls_struct_type1.size = 0;
+  cls_struct_type1.alignment = 0;
+  cls_struct_type1.type = FFI_TYPE_STRUCT;
+  cls_struct_type1.elements = cls_struct_fields1;
+
+  struct A e_dbl = { 1.0, 7};
+  struct B f_dbl = {{12.0 , 127}, 99};
+
+  struct B res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_longdouble;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = NULL;
+
+  cls_struct_fields1[0] = &cls_struct_type;
+  cls_struct_fields1[1] = &ffi_type_uchar;
+  cls_struct_fields1[2] = NULL;
+
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type1;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 7 12 127 99: 13 233 134" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
+
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl);
+  /* { dg-output "\n1 7 12 127 99: 13 233 134" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c
new file mode 100644
index 0000000..2f2b25a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c
@@ -0,0 +1,131 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Contains structs as parameter of the struct itself.
+		Sample taken from Alan Modras patch to src/prep_cif.c.
+   Limitations:	none.
+   PR:		PR 25630.
+   Originator:	<andreast@gcc.gnu.org> 20051010	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct A {
+  double a;
+  unsigned char b;
+} A;
+
+typedef struct B {
+  struct A x;
+  unsigned char y;
+} B;
+
+typedef struct C {
+  long d;
+  unsigned char e;
+} C;
+
+static B B_fn(struct A b2, struct B b3, struct C b4)
+{
+  struct B result;
+
+  result.x.a = b2.a + b3.x.a + b4.d;
+  result.x.b = b2.b + b3.x.b + b3.y + b4.e;
+  result.y = b2.b + b3.x.b + b4.e;
+
+  printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
+	 (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e,
+	 (int)result.x.a, result.x.b, result.y);
+
+  return result;
+}
+
+static void
+B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+     void* userdata __UNUSED__)
+{
+  struct A b0;
+  struct B b1;
+  struct C b2;
+
+  b0 = *(struct A*)(args[0]);
+  b1 = *(struct B*)(args[1]);
+  b2 = *(struct C*)(args[2]);
+
+  *(B*)resp = B_fn(b0, b1, b2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[4];
+  ffi_type* cls_struct_fields[3];
+  ffi_type* cls_struct_fields1[3];
+  ffi_type* cls_struct_fields2[3];
+  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
+  ffi_type* dbl_arg_types[4];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  cls_struct_type1.size = 0;
+  cls_struct_type1.alignment = 0;
+  cls_struct_type1.type = FFI_TYPE_STRUCT;
+  cls_struct_type1.elements = cls_struct_fields1;
+
+  cls_struct_type2.size = 0;
+  cls_struct_type2.alignment = 0;
+  cls_struct_type2.type = FFI_TYPE_STRUCT;
+  cls_struct_type2.elements = cls_struct_fields2;
+
+  struct A e_dbl = { 1.0, 7};
+  struct B f_dbl = {{12.0 , 127}, 99};
+  struct C g_dbl = { 2, 9};
+
+  struct B res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_double;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = NULL;
+
+  cls_struct_fields1[0] = &cls_struct_type;
+  cls_struct_fields1[1] = &ffi_type_uchar;
+  cls_struct_fields1[2] = NULL;
+
+  cls_struct_fields2[0] = &ffi_type_slong;
+  cls_struct_fields2[1] = &ffi_type_uchar;
+  cls_struct_fields2[2] = NULL;
+
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type1;
+  dbl_arg_types[2] = &cls_struct_type2;
+  dbl_arg_types[3] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = &g_dbl;
+  args_dbl[3] = NULL;
+
+  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl);
+  /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c
new file mode 100644
index 0000000..14c7023
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c
@@ -0,0 +1,111 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Contains structs as parameter of the struct itself.
+		Sample taken from Alan Modras patch to src/prep_cif.c.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20051010	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct A {
+  unsigned long long a;
+  unsigned char b;
+} A;
+
+typedef struct B {
+  struct A x;
+  unsigned char y;
+} B;
+
+static B B_fn(struct A b2, struct B b3)
+{
+  struct B result;
+
+  result.x.a = b2.a + b3.x.a;
+  result.x.b = b2.b + b3.x.b + b3.y;
+  result.y = b2.b + b3.x.b;
+
+  printf("%d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
+	 (int)b3.x.a, b3.x.b, b3.y,
+	 (int)result.x.a, result.x.b, result.y);
+
+  return result;
+}
+
+static void
+B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+     void* userdata __UNUSED__)
+{
+  struct A b0;
+  struct B b1;
+
+  b0 = *(struct A*)(args[0]);
+  b1 = *(struct B*)(args[1]);
+
+  *(B*)resp = B_fn(b0, b1);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[3];
+  ffi_type* cls_struct_fields[3];
+  ffi_type* cls_struct_fields1[3];
+  ffi_type cls_struct_type, cls_struct_type1;
+  ffi_type* dbl_arg_types[3];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  cls_struct_type1.size = 0;
+  cls_struct_type1.alignment = 0;
+  cls_struct_type1.type = FFI_TYPE_STRUCT;
+  cls_struct_type1.elements = cls_struct_fields1;
+
+  struct A e_dbl = { 1LL, 7};
+  struct B f_dbl = {{12.0 , 127}, 99};
+
+  struct B res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uint64;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = NULL;
+
+  cls_struct_fields1[0] = &cls_struct_type;
+  cls_struct_fields1[1] = &ffi_type_uchar;
+  cls_struct_fields1[2] = NULL;
+
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type1;
+  dbl_arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type1,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = NULL;
+
+  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 7 12 127 99: 13 233 134" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((B(*)(A, B))(code))(e_dbl, f_dbl);
+  /* { dg-output "\n1 7 12 127 99: 13 233 134" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b));
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c
new file mode 100644
index 0000000..bb77ead
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c
@@ -0,0 +1,131 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Contains structs as parameter of the struct itself.
+		Sample taken from Alan Modras patch to src/prep_cif.c.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20051010	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct A {
+  unsigned long long a;
+  unsigned char b;
+} A;
+
+typedef struct B {
+  struct A x;
+  unsigned char y;
+} B;
+
+typedef struct C {
+  unsigned long long d;
+  unsigned char e;
+} C;
+
+static B B_fn(struct A b2, struct B b3, struct C b4)
+{
+  struct B result;
+
+  result.x.a = b2.a + b3.x.a + b4.d;
+  result.x.b = b2.b + b3.x.b + b3.y + b4.e;
+  result.y = b2.b + b3.x.b + b4.e;
+
+  printf("%d %d %d %d %d %d %d: %d %d %d\n", (int)b2.a, b2.b,
+	 (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e,
+	 (int)result.x.a, result.x.b, result.y);
+
+  return result;
+}
+
+static void
+B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+     void* userdata __UNUSED__)
+{
+  struct A b0;
+  struct B b1;
+  struct C b2;
+
+  b0 = *(struct A*)(args[0]);
+  b1 = *(struct B*)(args[1]);
+  b2 = *(struct C*)(args[2]);
+
+  *(B*)resp = B_fn(b0, b1, b2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[4];
+  ffi_type* cls_struct_fields[3];
+  ffi_type* cls_struct_fields1[3];
+  ffi_type* cls_struct_fields2[3];
+  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
+  ffi_type* dbl_arg_types[4];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  cls_struct_type1.size = 0;
+  cls_struct_type1.alignment = 0;
+  cls_struct_type1.type = FFI_TYPE_STRUCT;
+  cls_struct_type1.elements = cls_struct_fields1;
+
+  cls_struct_type2.size = 0;
+  cls_struct_type2.alignment = 0;
+  cls_struct_type2.type = FFI_TYPE_STRUCT;
+  cls_struct_type2.elements = cls_struct_fields2;
+
+  struct A e_dbl = { 1LL, 7};
+  struct B f_dbl = {{12LL , 127}, 99};
+  struct C g_dbl = { 2LL, 9};
+
+  struct B res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uint64;
+  cls_struct_fields[1] = &ffi_type_uchar;
+  cls_struct_fields[2] = NULL;
+
+  cls_struct_fields1[0] = &cls_struct_type;
+  cls_struct_fields1[1] = &ffi_type_uchar;
+  cls_struct_fields1[2] = NULL;
+
+  cls_struct_fields2[0] = &ffi_type_uint64;
+  cls_struct_fields2[1] = &ffi_type_uchar;
+  cls_struct_fields2[2] = NULL;
+
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type1;
+  dbl_arg_types[2] = &cls_struct_type2;
+  dbl_arg_types[3] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = &g_dbl;
+  args_dbl[3] = NULL;
+
+  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl);
+  /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c
new file mode 100644
index 0000000..e9f541c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c
@@ -0,0 +1,131 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+		Contains structs as parameter of the struct itself.
+		Sample taken from Alan Modras patch to src/prep_cif.c.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20051010	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct A {
+  unsigned char a;
+  unsigned long long b;
+} A;
+
+typedef struct B {
+  struct A x;
+  unsigned char y;
+} B;
+
+typedef struct C {
+  unsigned long d;
+  unsigned char e;
+} C;
+
+static B B_fn(struct A b2, struct B b3, struct C b4)
+{
+  struct B result;
+
+  result.x.a = b2.a + b3.x.a + b4.d;
+  result.x.b = b2.b + b3.x.b + b3.y + b4.e;
+  result.y = b2.b + b3.x.b + b4.e;
+
+  printf("%d %d %d %d %d %d %d: %d %d %d\n", b2.a, (int)b2.b,
+	 b3.x.a, (int)b3.x.b, b3.y, (int)b4.d, b4.e,
+	 result.x.a, (int)result.x.b, result.y);
+
+  return result;
+}
+
+static void
+B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
+     void* userdata __UNUSED__)
+{
+  struct A b0;
+  struct B b1;
+  struct C b2;
+
+  b0 = *(struct A*)(args[0]);
+  b1 = *(struct B*)(args[1]);
+  b2 = *(struct C*)(args[2]);
+
+  *(B*)resp = B_fn(b0, b1, b2);
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args_dbl[4];
+  ffi_type* cls_struct_fields[3];
+  ffi_type* cls_struct_fields1[3];
+  ffi_type* cls_struct_fields2[3];
+  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
+  ffi_type* dbl_arg_types[4];
+
+  cls_struct_type.size = 0;
+  cls_struct_type.alignment = 0;
+  cls_struct_type.type = FFI_TYPE_STRUCT;
+  cls_struct_type.elements = cls_struct_fields;
+
+  cls_struct_type1.size = 0;
+  cls_struct_type1.alignment = 0;
+  cls_struct_type1.type = FFI_TYPE_STRUCT;
+  cls_struct_type1.elements = cls_struct_fields1;
+
+  cls_struct_type2.size = 0;
+  cls_struct_type2.alignment = 0;
+  cls_struct_type2.type = FFI_TYPE_STRUCT;
+  cls_struct_type2.elements = cls_struct_fields2;
+
+  struct A e_dbl = { 1, 7LL};
+  struct B f_dbl = {{12.0 , 127}, 99};
+  struct C g_dbl = { 2, 9};
+
+  struct B res_dbl;
+
+  cls_struct_fields[0] = &ffi_type_uchar;
+  cls_struct_fields[1] = &ffi_type_uint64;
+  cls_struct_fields[2] = NULL;
+
+  cls_struct_fields1[0] = &cls_struct_type;
+  cls_struct_fields1[1] = &ffi_type_uchar;
+  cls_struct_fields1[2] = NULL;
+
+  cls_struct_fields2[0] = &ffi_type_ulong;
+  cls_struct_fields2[1] = &ffi_type_uchar;
+  cls_struct_fields2[2] = NULL;
+
+
+  dbl_arg_types[0] = &cls_struct_type;
+  dbl_arg_types[1] = &cls_struct_type1;
+  dbl_arg_types[2] = &cls_struct_type2;
+  dbl_arg_types[3] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type1,
+		     dbl_arg_types) == FFI_OK);
+
+  args_dbl[0] = &e_dbl;
+  args_dbl[1] = &f_dbl;
+  args_dbl[2] = &g_dbl;
+  args_dbl[3] = NULL;
+
+  ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
+  /* { dg-output "1 7 12 127 99 2 9: 15 242 143" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
+
+  res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl);
+  /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */
+  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
+  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
+  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c
new file mode 100644
index 0000000..6a91555
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c
@@ -0,0 +1,90 @@
+/* Area:	ffi_call, closure_call
+   Purpose:	Check structure passing with different structure size.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20030828	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct my_ffi_struct {
+  double a;
+  double b;
+  double c;
+} my_ffi_struct;
+
+my_ffi_struct callee(struct my_ffi_struct a1, struct my_ffi_struct a2)
+{
+  struct my_ffi_struct result;
+  result.a = a1.a + a2.a;
+  result.b = a1.b + a2.b;
+  result.c = a1.c + a2.c;
+
+
+  printf("%g %g %g %g %g %g: %g %g %g\n", a1.a, a1.b, a1.c,
+	 a2.a, a2.b, a2.c, result.a, result.b, result.c);
+
+  return result;
+}
+
+void stub(ffi_cif* cif __UNUSED__, void* resp, void** args,
+	  void* userdata __UNUSED__)
+{
+  struct my_ffi_struct a1;
+  struct my_ffi_struct a2;
+
+  a1 = *(struct my_ffi_struct*)(args[0]);
+  a2 = *(struct my_ffi_struct*)(args[1]);
+
+  *(my_ffi_struct *)resp = callee(a1, a2);
+}
+
+
+int main(void)
+{
+  ffi_type* my_ffi_struct_fields[4];
+  ffi_type my_ffi_struct_type;
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  void* args[4];
+  ffi_type* arg_types[3];
+
+  struct my_ffi_struct g = { 1.0, 2.0, 3.0 };
+  struct my_ffi_struct f = { 1.0, 2.0, 3.0 };
+  struct my_ffi_struct res;
+
+  my_ffi_struct_type.size = 0;
+  my_ffi_struct_type.alignment = 0;
+  my_ffi_struct_type.type = FFI_TYPE_STRUCT;
+  my_ffi_struct_type.elements = my_ffi_struct_fields;
+
+  my_ffi_struct_fields[0] = &ffi_type_double;
+  my_ffi_struct_fields[1] = &ffi_type_double;
+  my_ffi_struct_fields[2] = &ffi_type_double;
+  my_ffi_struct_fields[3] = NULL;
+
+  arg_types[0] = &my_ffi_struct_type;
+  arg_types[1] = &my_ffi_struct_type;
+  arg_types[2] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &my_ffi_struct_type,
+		     arg_types) == FFI_OK);
+
+  args[0] = &g;
+  args[1] = &f;
+  args[2] = NULL;
+  ffi_call(&cif, FFI_FN(callee), &res, args);
+  /* { dg-output "1 2 3 1 2 3: 2 4 6" } */
+  printf("res: %g %g %g\n", res.a, res.b, res.c);
+  /* { dg-output "\nres: 2 4 6" } */
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, stub, NULL, code) == FFI_OK);
+
+  res = ((my_ffi_struct(*)(struct my_ffi_struct, struct my_ffi_struct))(code))(g, f);
+  /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */
+  printf("res: %g %g %g\n", res.a, res.b, res.c);
+  /* { dg-output "\nres: 2 4 6" } */
+
+  exit(0);;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c
new file mode 100644
index 0000000..4456161
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c
@@ -0,0 +1,59 @@
+/* Area:	ffi_call
+   Purpose:	Promotion test.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+static int promotion(signed char sc, signed short ss,
+		     unsigned char uc, unsigned short us)
+{
+  int r = (int) sc + (int) ss + (int) uc + (int) us;
+
+  return r;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg rint;
+  signed char sc;
+  unsigned char uc;
+  signed short ss;
+  unsigned short us;
+  unsigned long ul;
+
+  args[0] = &ffi_type_schar;
+  args[1] = &ffi_type_sshort;
+  args[2] = &ffi_type_uchar;
+  args[3] = &ffi_type_ushort;
+  values[0] = &sc;
+  values[1] = &ss;
+  values[2] = &uc;
+  values[3] = &us;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
+		     &ffi_type_sint, args) == FFI_OK);
+
+  us = 0;
+  ul = 0;
+
+  for (sc = (signed char) -127;
+       sc <= (signed char) 120; sc += 1)
+    for (ss = -30000; ss <= 30000; ss += 10000)
+      for (uc = (unsigned char) 0;
+	   uc <= (unsigned char) 200; uc += 20)
+	for (us = 0; us <= 60000; us += 10000)
+	  {
+	    ul++;
+	    ffi_call(&cif, FFI_FN(promotion), &rint, values);
+	    CHECK((int)rint == (signed char) sc + (signed short) ss +
+		  (unsigned char) uc + (unsigned short) us);
+	  }
+  printf("%lu promotion tests run\n", ul);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c
new file mode 100644
index 0000000..e29bd6c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c
@@ -0,0 +1,114 @@
+/* Area:	ffi_call
+   Purpose:	Check different structures.
+   Limitations:	none.
+   PR:		none.
+   Originator:	Ronald Oussoren <oussoren@cistron.nl> 20030824	*/
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct Point {
+	float x;
+	float y;
+} Point;
+
+typedef struct Size {
+	float h;
+	float w;
+} Size;
+
+typedef struct Rect {
+	Point o;
+	Size  s;
+} Rect;
+
+int doit(int o, char* s, Point p, Rect r, int last)
+{
+	printf("CALLED WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n",
+		o, s, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, last);
+	return 42;
+}
+
+
+int main(void)
+{
+	ffi_type point_type;
+	ffi_type size_type;
+	ffi_type rect_type;
+	ffi_cif cif;
+	ffi_type* arglist[6];
+	void* values[6];
+	int r;
+
+	/*
+	 *  First set up FFI types for the 3 struct types
+	 */
+
+	point_type.size = 0; /*sizeof(Point);*/
+	point_type.alignment = 0; /*__alignof__(Point);*/
+	point_type.type = FFI_TYPE_STRUCT;
+	point_type.elements = malloc(3 * sizeof(ffi_type*));
+	point_type.elements[0] = &ffi_type_float;
+	point_type.elements[1] = &ffi_type_float;
+	point_type.elements[2] = NULL;
+
+	size_type.size = 0;/* sizeof(Size);*/
+	size_type.alignment = 0;/* __alignof__(Size);*/
+	size_type.type = FFI_TYPE_STRUCT;
+	size_type.elements = malloc(3 * sizeof(ffi_type*));
+	size_type.elements[0] = &ffi_type_float;
+	size_type.elements[1] = &ffi_type_float;
+	size_type.elements[2] = NULL;
+
+	rect_type.size = 0;/*sizeof(Rect);*/
+	rect_type.alignment =0;/* __alignof__(Rect);*/
+	rect_type.type = FFI_TYPE_STRUCT;
+	rect_type.elements = malloc(3 * sizeof(ffi_type*));
+	rect_type.elements[0] = &point_type;
+	rect_type.elements[1] = &size_type;
+	rect_type.elements[2] = NULL;
+
+	/*
+	 * Create a CIF
+	 */
+	arglist[0] = &ffi_type_sint;
+	arglist[1] = &ffi_type_pointer;
+	arglist[2] = &point_type;
+	arglist[3] = &rect_type;
+	arglist[4] = &ffi_type_sint;
+	arglist[5] = NULL;
+
+	r = ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
+			5, &ffi_type_sint, arglist);
+	if (r != FFI_OK) {
+		abort();
+	}
+
+
+	/* And call the function through the CIF */
+
+	{
+	Point p = { 1.0, 2.0 };
+	Rect  r = { { 9.0, 10.0}, { -1.0, -2.0 } };
+	int   o = 0;
+	int   l = 42;
+	char* m = "myMethod";
+	ffi_arg result;
+
+	values[0] = &o;
+	values[1] = &m;
+	values[2] = &p;
+	values[3] = &r;
+	values[4] = &l;
+	values[5] = NULL;
+
+	printf("CALLING WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n",
+		o, m, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, l);
+
+	ffi_call(&cif, FFI_FN(doit), &result, values);
+
+	printf ("The result is %d\n", (int)result);
+
+	}
+	exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c
new file mode 100644
index 0000000..1aab403
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c
@@ -0,0 +1,35 @@
+/* Area:	ffi_call
+   Purpose:	Check return value double.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20050212  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static double return_dbl(double dbl)
+{
+  return 2 * dbl;
+}
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  double dbl, rdbl;
+
+  args[0] = &ffi_type_double;
+  values[0] = &dbl;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_double, args) == FFI_OK);
+
+  for (dbl = -127.3; dbl <  127; dbl++)
+    {
+      ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values);
+      printf ("%f vs %f\n", rdbl, return_dbl(dbl));
+      CHECK(rdbl == 2 * dbl);
+    }
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c
new file mode 100644
index 0000000..0ea5d50
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c
@@ -0,0 +1,43 @@
+/* Area:	ffi_call
+   Purpose:	Check return value double.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20050212  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static double return_dbl(double dbl1, float fl2, unsigned int in3, double dbl4)
+{
+  return dbl1 + fl2 + in3 + dbl4;
+}
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  double dbl1, dbl4, rdbl;
+  float fl2;
+  unsigned int in3;
+  args[0] = &ffi_type_double;
+  args[1] = &ffi_type_float;
+  args[2] = &ffi_type_uint;
+  args[3] = &ffi_type_double;
+  values[0] = &dbl1;
+  values[1] = &fl2;
+  values[2] = &in3;
+  values[3] = &dbl4;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
+		     &ffi_type_double, args) == FFI_OK);
+  dbl1 = 127.0;
+  fl2 = 128.0;
+  in3 = 255;
+  dbl4 = 512.7;
+
+  ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values);
+  printf ("%f vs %f\n", rdbl, return_dbl(dbl1, fl2, in3, dbl4));
+  CHECK(rdbl ==  dbl1 + fl2 + in3 + dbl4);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c
new file mode 100644
index 0000000..b3818f8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c
@@ -0,0 +1,42 @@
+/* Area:	ffi_call
+   Purpose:	Check return value double.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20050212  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static double return_dbl(double dbl1, double dbl2, unsigned int in3, double dbl4)
+{
+  return dbl1 + dbl2 + in3 + dbl4;
+}
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  double dbl1, dbl2, dbl4, rdbl;
+  unsigned int in3;
+  args[0] = &ffi_type_double;
+  args[1] = &ffi_type_double;
+  args[2] = &ffi_type_uint;
+  args[3] = &ffi_type_double;
+  values[0] = &dbl1;
+  values[1] = &dbl2;
+  values[2] = &in3;
+  values[3] = &dbl4;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
+		     &ffi_type_double, args) == FFI_OK);
+  dbl1 = 127.0;
+  dbl2 = 128.0;
+  in3 = 255;
+  dbl4 = 512.7;
+
+  ffi_call(&cif, FFI_FN(return_dbl), &rdbl, values);
+  printf ("%f vs %f\n", rdbl, return_dbl(dbl1, dbl2, in3, dbl4));
+  CHECK(rdbl ==  dbl1 + dbl2 + in3 + dbl4);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c
new file mode 100644
index 0000000..fb8a09e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c
@@ -0,0 +1,35 @@
+/* Area:	ffi_call
+   Purpose:	Check return value float.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20050212  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static float return_fl(float fl)
+{
+  return 2 * fl;
+}
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  float fl, rfl;
+
+  args[0] = &ffi_type_float;
+  values[0] = &fl;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_float, args) == FFI_OK);
+
+  for (fl = -127.0; fl <  127; fl++)
+    {
+      ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
+      printf ("%f vs %f\n", rfl, return_fl(fl));
+      CHECK(rfl ==  2 * fl);
+    }
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c
new file mode 100644
index 0000000..c3d92c2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c
@@ -0,0 +1,36 @@
+/* Area:	ffi_call
+   Purpose:	Check return value float.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20050212  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static float return_fl(float fl1, float fl2)
+{
+  return fl1 + fl2;
+}
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  float fl1, fl2, rfl;
+
+  args[0] = &ffi_type_float;
+  args[1] = &ffi_type_float;
+  values[0] = &fl1;
+  values[1] = &fl2;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
+		     &ffi_type_float, args) == FFI_OK);
+  fl1 = 127.0;
+  fl2 = 128.0;
+
+  ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
+  printf ("%f vs %f\n", rfl, return_fl(fl1, fl2));
+  CHECK(rfl ==  fl1 + fl2);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c
new file mode 100644
index 0000000..ddb976c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c
@@ -0,0 +1,49 @@
+/* Area:	ffi_call
+   Purpose:	Check return value float.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20050212  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+/* Use volatile float to avoid false negative on ix86.  See PR target/323.  */
+static float return_fl(float fl1, float fl2, float fl3, float fl4)
+{
+  volatile float sum;
+
+  sum = fl1 + fl2 + fl3 + fl4;
+  return sum;
+}
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  float fl1, fl2, fl3, fl4, rfl;
+  volatile float sum;
+
+  args[0] = &ffi_type_float;
+  args[1] = &ffi_type_float;
+  args[2] = &ffi_type_float;
+  args[3] = &ffi_type_float;
+  values[0] = &fl1;
+  values[1] = &fl2;
+  values[2] = &fl3;
+  values[3] = &fl4;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
+		     &ffi_type_float, args) == FFI_OK);
+  fl1 = 127.0;
+  fl2 = 128.0;
+  fl3 = 255.1;
+  fl4 = 512.7;
+
+  ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
+  printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, fl3, fl4));
+
+  sum = fl1 + fl2 + fl3 + fl4;
+  CHECK(rfl == sum);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c
new file mode 100644
index 0000000..c37877b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c
@@ -0,0 +1,42 @@
+/* Area:	ffi_call
+   Purpose:	Check return value float.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20050212  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static float return_fl(float fl1, float fl2, unsigned int in3, float fl4)
+{
+  return fl1 + fl2 + in3 + fl4;
+}
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  float fl1, fl2, fl4, rfl;
+  unsigned int in3;
+  args[0] = &ffi_type_float;
+  args[1] = &ffi_type_float;
+  args[2] = &ffi_type_uint;
+  args[3] = &ffi_type_float;
+  values[0] = &fl1;
+  values[1] = &fl2;
+  values[2] = &in3;
+  values[3] = &fl4;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
+		     &ffi_type_float, args) == FFI_OK);
+  fl1 = 127.0;
+  fl2 = 128.0;
+  in3 = 255;
+  fl4 = 512.7;
+
+  ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
+  printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, in3, fl4));
+  CHECK(rfl ==  fl1 + fl2 + in3 + fl4);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c
new file mode 100644
index 0000000..5c2fe65
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c
@@ -0,0 +1,34 @@
+/* Area:	ffi_call
+   Purpose:	Check return value long double.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<andreast@gcc.gnu.org> 20071113  */
+
+/* { dg-do run { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
+#include "ffitest.h"
+
+static long double return_ldl(long double ldl)
+{
+  return 2*ldl;
+}
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  long double ldl, rldl;
+
+  args[0] = &ffi_type_longdouble;
+  values[0] = &ldl;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_longdouble, args) == FFI_OK);
+
+  for (ldl = -127.0; ldl <  127.0; ldl++)
+    {
+      ffi_call(&cif, FFI_FN(return_ldl), &rldl, values);
+      CHECK(rldl ==  2 * ldl);
+    }
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c
new file mode 100644
index 0000000..ea4a1e4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c
@@ -0,0 +1,41 @@
+/* Area:	ffi_call
+   Purpose:	Check return value long long.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+static long long return_ll(long long ll)
+{
+  return ll;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  long long rlonglong;
+  long long ll;
+
+  args[0] = &ffi_type_sint64;
+  values[0] = &ll;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_sint64, args) == FFI_OK);
+
+  for (ll = 0LL; ll < 100LL; ll++)
+    {
+      ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
+      CHECK(rlonglong == ll);
+    }
+
+  for (ll = 55555555555000LL; ll < 55555555555100LL; ll++)
+    {
+      ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
+      CHECK(rlonglong == ll);
+    }
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c
new file mode 100644
index 0000000..593e8a3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c
@@ -0,0 +1,43 @@
+/* Area:	ffi_call
+   Purpose:	Check if long long are passed in the corresponding regs on ppc.
+   Limitations:	none.
+   PR:		20104.
+   Originator:	<andreast@gcc.gnu.org> 20050222  */
+
+/* { dg-do run } */
+/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */
+#include "ffitest.h"
+static long long return_ll(int ll0, long long ll1, int ll2)
+{
+  return ll0 + ll1 + ll2;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  long long rlonglong;
+  long long ll1;
+  unsigned ll0, ll2;
+
+  args[0] = &ffi_type_sint;
+  args[1] = &ffi_type_sint64;
+  args[2] = &ffi_type_sint;
+  values[0] = &ll0;
+  values[1] = &ll1;
+  values[2] = &ll2;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
+		     &ffi_type_sint64, args) == FFI_OK);
+
+  ll0 = 11111111;
+  ll1 = 11111111111000LL;
+  ll2 = 11111111;
+
+  ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
+  printf("res: %" PRIdLL ", %" PRIdLL "\n", rlonglong, ll0 + ll1 + ll2);
+  /* { dg-output "res: 11111133333222, 11111133333222" } */
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c
new file mode 100644
index 0000000..19608ee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c
@@ -0,0 +1,36 @@
+/* Area:	ffi_call
+   Purpose:	Check return value signed char.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static signed char return_sc(signed char sc)
+{
+  return sc;
+}
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg rint;
+  signed char sc;
+
+  args[0] = &ffi_type_schar;
+  values[0] = &sc;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_schar, args) == FFI_OK);
+
+  for (sc = (signed char) -127;
+       sc < (signed char) 127; sc++)
+    {
+      ffi_call(&cif, FFI_FN(return_sc), &rint, values);
+      CHECK(rint == (ffi_arg) sc);
+    }
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c
new file mode 100644
index 0000000..f0fd345
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c
@@ -0,0 +1,38 @@
+/* Area:	ffi_call
+   Purpose:	Check if long as return type is handled correctly.
+   Limitations:	none.
+   PR:		none.
+ */
+
+/* { dg-do run } */
+#include "ffitest.h"
+static long return_sl(long l1, long l2)
+{
+  return l1 - l2;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg res;
+  unsigned long l1, l2;
+
+  args[0] = &ffi_type_slong;
+  args[1] = &ffi_type_slong;
+  values[0] = &l1;
+  values[1] = &l2;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
+		     &ffi_type_slong, args) == FFI_OK);
+
+  l1 = 1073741823L;
+  l2 = 1073741824L;
+
+  ffi_call(&cif, FFI_FN(return_sl), &res, values);
+  printf("res: %ld, %ld\n", (long)res, l1 - l2);
+  /* { dg-output "res: -1, -1" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c
new file mode 100644
index 0000000..07c45de
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c
@@ -0,0 +1,38 @@
+/* Area:	ffi_call
+   Purpose:	Check return value unsigned char.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static unsigned char return_uc(unsigned char uc)
+{
+  return uc;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg rint;
+
+  unsigned char uc;
+
+  args[0] = &ffi_type_uchar;
+  values[0] = &uc;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+		     &ffi_type_uchar, args) == FFI_OK);
+
+  for (uc = (unsigned char) '\x00';
+       uc < (unsigned char) '\xff'; uc++)
+    {
+      ffi_call(&cif, FFI_FN(return_uc), &rint, values);
+      CHECK(rint == (signed int) uc);
+    }
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c
new file mode 100644
index 0000000..12b266f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c
@@ -0,0 +1,38 @@
+/* Area:	ffi_call
+   Purpose:	Check if unsigned long as return type is handled correctly.
+   Limitations:	none.
+   PR:		none.
+   Originator:	<kaffeetisch at gmx dot de> 20060724  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+static unsigned long return_ul(unsigned long ul1, unsigned long ul2)
+{
+  return ul1 + ul2;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg res;
+  unsigned long ul1, ul2;
+
+  args[0] = &ffi_type_ulong;
+  args[1] = &ffi_type_ulong;
+  values[0] = &ul1;
+  values[1] = &ul2;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2,
+		     &ffi_type_ulong, args) == FFI_OK);
+
+  ul1 = 1073741823L;
+  ul2 = 1073741824L;
+
+  ffi_call(&cif, FFI_FN(return_ul), &res, values);
+  printf("res: %lu, %lu\n", (unsigned long)res, ul1 + ul2);
+  /* { dg-output "res: 2147483647, 2147483647" } */
+
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c
new file mode 100644
index 0000000..23a93b9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c
@@ -0,0 +1,145 @@
+/* Area:		ffi_call, closure_call
+   Purpose:		Check structure returning with different structure size.
+				Depending on the ABI. Check bigger struct which overlaps
+				the gp and fp register count on Darwin/AIX/ppc64.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin	6/21/2007	*/
+
+/* { dg-do run { xfail strongarm*-*-* xscale*-*-*  } } */
+#include "ffitest.h"
+
+// 13 FPRs: 104 bytes
+// 14 FPRs: 112 bytes
+
+typedef struct struct_108byte {
+	double a;
+	double b;
+	double c;
+	double d;
+	double e;
+	double f;
+	double g;
+	double h;
+	double i;
+	double j;
+	double k;
+	double l;
+	double m;
+	int n;
+} struct_108byte;
+
+struct_108byte cls_struct_108byte_fn(
+	struct_108byte b0,
+	struct_108byte b1,
+	struct_108byte b2,
+	struct_108byte b3)
+{
+	struct_108byte	result;
+
+	result.a = b0.a + b1.a + b2.a + b3.a;
+	result.b = b0.b + b1.b + b2.b + b3.b;
+	result.c = b0.c + b1.c + b2.c + b3.c;
+	result.d = b0.d + b1.d + b2.d + b3.d;
+	result.e = b0.e + b1.e + b2.e + b3.e;
+	result.f = b0.f + b1.f + b2.f + b3.f;
+	result.g = b0.g + b1.g + b2.g + b3.g;
+	result.h = b0.h + b1.h + b2.h + b3.h;
+	result.i = b0.i + b1.i + b2.i + b3.i;
+	result.j = b0.j + b1.j + b2.j + b3.j;
+	result.k = b0.k + b1.k + b2.k + b3.k;
+	result.l = b0.l + b1.l + b2.l + b3.l;
+	result.m = b0.m + b1.m + b2.m + b3.m;
+	result.n = b0.n + b1.n + b2.n + b3.n;
+
+	printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c,
+		result.d, result.e, result.f, result.g, result.h, result.i,
+		result.j, result.k, result.l, result.m, result.n);
+
+	return result;
+}
+
+static void
+cls_struct_108byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
+{
+	struct_108byte	b0, b1, b2, b3;
+
+	b0 = *(struct_108byte*)(args[0]);
+	b1 = *(struct_108byte*)(args[1]);
+	b2 = *(struct_108byte*)(args[2]);
+	b3 = *(struct_108byte*)(args[3]);
+
+	*(struct_108byte*)resp = cls_struct_108byte_fn(b0, b1, b2, b3);
+}
+
+int main (void)
+{
+	ffi_cif cif;
+        void *code;
+	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	void* args_dbl[5];
+	ffi_type* cls_struct_fields[15];
+	ffi_type cls_struct_type;
+	ffi_type* dbl_arg_types[5];
+
+	cls_struct_type.size = 0;
+	cls_struct_type.alignment = 0;
+	cls_struct_type.type = FFI_TYPE_STRUCT;
+	cls_struct_type.elements = cls_struct_fields;
+
+	struct_108byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 7 };
+	struct_108byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 4 };
+	struct_108byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 3 };
+	struct_108byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 2 };
+	struct_108byte res_dbl;
+
+	cls_struct_fields[0] = &ffi_type_double;
+	cls_struct_fields[1] = &ffi_type_double;
+	cls_struct_fields[2] = &ffi_type_double;
+	cls_struct_fields[3] = &ffi_type_double;
+	cls_struct_fields[4] = &ffi_type_double;
+	cls_struct_fields[5] = &ffi_type_double;
+	cls_struct_fields[6] = &ffi_type_double;
+	cls_struct_fields[7] = &ffi_type_double;
+	cls_struct_fields[8] = &ffi_type_double;
+	cls_struct_fields[9] = &ffi_type_double;
+	cls_struct_fields[10] = &ffi_type_double;
+	cls_struct_fields[11] = &ffi_type_double;
+	cls_struct_fields[12] = &ffi_type_double;
+	cls_struct_fields[13] = &ffi_type_sint32;
+	cls_struct_fields[14] = NULL;
+
+	dbl_arg_types[0] = &cls_struct_type;
+	dbl_arg_types[1] = &cls_struct_type;
+	dbl_arg_types[2] = &cls_struct_type;
+	dbl_arg_types[3] = &cls_struct_type;
+	dbl_arg_types[4] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
+		dbl_arg_types) == FFI_OK);
+
+	args_dbl[0] = &e_dbl;
+	args_dbl[1] = &f_dbl;
+	args_dbl[2] = &g_dbl;
+	args_dbl[3] = &h_dbl;
+	args_dbl[4] = NULL;
+
+	ffi_call(&cif, FFI_FN(cls_struct_108byte_fn), &res_dbl, args_dbl);
+	/* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
+	printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
+		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
+		res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n);
+	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_108byte_gn, NULL, code) == FFI_OK);
+
+	res_dbl = ((struct_108byte(*)(struct_108byte, struct_108byte,
+		struct_108byte, struct_108byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
+	/* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
+	printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
+		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
+		res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n);
+	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
+
+	exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c
new file mode 100644
index 0000000..e2599d2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c
@@ -0,0 +1,148 @@
+/* Area:		ffi_call, closure_call
+   Purpose:		Check structure returning with different structure size.
+				Depending on the ABI. Check bigger struct which overlaps
+				the gp and fp register count on Darwin/AIX/ppc64.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin	6/21/2007	*/
+
+/* { dg-do run { xfail strongarm*-*-* xscale*-*-*  } } */
+#include "ffitest.h"
+
+// 13 FPRs: 104 bytes
+// 14 FPRs: 112 bytes
+
+typedef struct struct_116byte {
+	double a;
+	double b;
+	double c;
+	double d;
+	double e;
+	double f;
+	double g;
+	double h;
+	double i;
+	double j;
+	double k;
+	double l;
+	double m;
+	double n;
+	int o;
+} struct_116byte;
+
+struct_116byte cls_struct_116byte_fn(
+	struct_116byte b0,
+	struct_116byte b1,
+	struct_116byte b2,
+	struct_116byte b3)
+{
+	struct_116byte	result;
+
+	result.a = b0.a + b1.a + b2.a + b3.a;
+	result.b = b0.b + b1.b + b2.b + b3.b;
+	result.c = b0.c + b1.c + b2.c + b3.c;
+	result.d = b0.d + b1.d + b2.d + b3.d;
+	result.e = b0.e + b1.e + b2.e + b3.e;
+	result.f = b0.f + b1.f + b2.f + b3.f;
+	result.g = b0.g + b1.g + b2.g + b3.g;
+	result.h = b0.h + b1.h + b2.h + b3.h;
+	result.i = b0.i + b1.i + b2.i + b3.i;
+	result.j = b0.j + b1.j + b2.j + b3.j;
+	result.k = b0.k + b1.k + b2.k + b3.k;
+	result.l = b0.l + b1.l + b2.l + b3.l;
+	result.m = b0.m + b1.m + b2.m + b3.m;
+	result.n = b0.n + b1.n + b2.n + b3.n;
+	result.o = b0.o + b1.o + b2.o + b3.o;
+
+	printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c,
+		result.d, result.e, result.f, result.g, result.h, result.i,
+		result.j, result.k, result.l, result.m, result.n, result.o);
+
+	return result;
+}
+
+static void
+cls_struct_116byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
+{
+	struct_116byte	b0, b1, b2, b3;
+
+	b0 = *(struct_116byte*)(args[0]);
+	b1 = *(struct_116byte*)(args[1]);
+	b2 = *(struct_116byte*)(args[2]);
+	b3 = *(struct_116byte*)(args[3]);
+
+	*(struct_116byte*)resp = cls_struct_116byte_fn(b0, b1, b2, b3);
+}
+
+int main (void)
+{
+	ffi_cif cif;
+        void *code;
+	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	void* args_dbl[5];
+	ffi_type* cls_struct_fields[16];
+	ffi_type cls_struct_type;
+	ffi_type* dbl_arg_types[5];
+
+	cls_struct_type.size = 0;
+	cls_struct_type.alignment = 0;
+	cls_struct_type.type = FFI_TYPE_STRUCT;
+	cls_struct_type.elements = cls_struct_fields;
+
+	struct_116byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 7 };
+	struct_116byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 6.0, 4 };
+	struct_116byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 7.0, 3 };
+	struct_116byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 8.0, 2 };
+	struct_116byte res_dbl;
+
+	cls_struct_fields[0] = &ffi_type_double;
+	cls_struct_fields[1] = &ffi_type_double;
+	cls_struct_fields[2] = &ffi_type_double;
+	cls_struct_fields[3] = &ffi_type_double;
+	cls_struct_fields[4] = &ffi_type_double;
+	cls_struct_fields[5] = &ffi_type_double;
+	cls_struct_fields[6] = &ffi_type_double;
+	cls_struct_fields[7] = &ffi_type_double;
+	cls_struct_fields[8] = &ffi_type_double;
+	cls_struct_fields[9] = &ffi_type_double;
+	cls_struct_fields[10] = &ffi_type_double;
+	cls_struct_fields[11] = &ffi_type_double;
+	cls_struct_fields[12] = &ffi_type_double;
+	cls_struct_fields[13] = &ffi_type_double;
+	cls_struct_fields[14] = &ffi_type_sint32;
+	cls_struct_fields[15] = NULL;
+
+	dbl_arg_types[0] = &cls_struct_type;
+	dbl_arg_types[1] = &cls_struct_type;
+	dbl_arg_types[2] = &cls_struct_type;
+	dbl_arg_types[3] = &cls_struct_type;
+	dbl_arg_types[4] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
+		dbl_arg_types) == FFI_OK);
+
+	args_dbl[0] = &e_dbl;
+	args_dbl[1] = &f_dbl;
+	args_dbl[2] = &g_dbl;
+	args_dbl[3] = &h_dbl;
+	args_dbl[4] = NULL;
+
+	ffi_call(&cif, FFI_FN(cls_struct_116byte_fn), &res_dbl, args_dbl);
+	/* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
+	printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
+		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
+		res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o);
+	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_116byte_gn, NULL, code) == FFI_OK);
+
+	res_dbl = ((struct_116byte(*)(struct_116byte, struct_116byte,
+		struct_116byte, struct_116byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
+	/* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
+	printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
+		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
+		res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o);
+	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
+
+	exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c
new file mode 100644
index 0000000..1fc6a9e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c
@@ -0,0 +1,124 @@
+/* Area:		ffi_call, closure_call
+   Purpose:		Check structure returning with different structure size.
+				Depending on the ABI. Check bigger struct which overlaps
+				the gp and fp register count on Darwin/AIX/ppc64.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin	6/21/2007	*/
+
+/* { dg-do run { xfail strongarm*-*-* xscale*-*-*  } } */
+#include "ffitest.h"
+
+typedef struct struct_72byte {
+	double a;
+	double b;
+	double c;
+	double d;
+	double e;
+	double f;
+	double g;
+	double h;
+	double i;
+} struct_72byte;
+
+struct_72byte cls_struct_72byte_fn(
+	struct_72byte b0,
+	struct_72byte b1,
+	struct_72byte b2,
+	struct_72byte b3)
+{
+	struct_72byte	result;
+
+	result.a = b0.a + b1.a + b2.a + b3.a;
+	result.b = b0.b + b1.b + b2.b + b3.b;
+	result.c = b0.c + b1.c + b2.c + b3.c;
+	result.d = b0.d + b1.d + b2.d + b3.d;
+	result.e = b0.e + b1.e + b2.e + b3.e;
+	result.f = b0.f + b1.f + b2.f + b3.f;
+	result.g = b0.g + b1.g + b2.g + b3.g;
+	result.h = b0.h + b1.h + b2.h + b3.h;
+	result.i = b0.i + b1.i + b2.i + b3.i;
+
+	printf("%g %g %g %g %g %g %g %g %g\n", result.a, result.b, result.c,
+		result.d, result.e, result.f, result.g, result.h, result.i);
+
+	return result;
+}
+
+static void
+cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
+{
+	struct_72byte	b0, b1, b2, b3;
+
+	b0 = *(struct_72byte*)(args[0]);
+	b1 = *(struct_72byte*)(args[1]);
+	b2 = *(struct_72byte*)(args[2]);
+	b3 = *(struct_72byte*)(args[3]);
+
+	*(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3);
+}
+
+int main (void)
+{
+	ffi_cif cif;
+        void *code;
+	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	void* args_dbl[5];
+	ffi_type* cls_struct_fields[10];
+	ffi_type cls_struct_type;
+	ffi_type* dbl_arg_types[5];
+
+	cls_struct_type.size = 0;
+	cls_struct_type.alignment = 0;
+	cls_struct_type.type = FFI_TYPE_STRUCT;
+	cls_struct_type.elements = cls_struct_fields;
+
+	struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7.0 };
+	struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0 };
+	struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3.0 };
+	struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2.0 };
+	struct_72byte res_dbl;
+
+	cls_struct_fields[0] = &ffi_type_double;
+	cls_struct_fields[1] = &ffi_type_double;
+	cls_struct_fields[2] = &ffi_type_double;
+	cls_struct_fields[3] = &ffi_type_double;
+	cls_struct_fields[4] = &ffi_type_double;
+	cls_struct_fields[5] = &ffi_type_double;
+	cls_struct_fields[6] = &ffi_type_double;
+	cls_struct_fields[7] = &ffi_type_double;
+	cls_struct_fields[8] = &ffi_type_double;
+	cls_struct_fields[9] = NULL;
+
+	dbl_arg_types[0] = &cls_struct_type;
+	dbl_arg_types[1] = &cls_struct_type;
+	dbl_arg_types[2] = &cls_struct_type;
+	dbl_arg_types[3] = &cls_struct_type;
+	dbl_arg_types[4] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
+		dbl_arg_types) == FFI_OK);
+
+	args_dbl[0] = &e_dbl;
+	args_dbl[1] = &f_dbl;
+	args_dbl[2] = &g_dbl;
+	args_dbl[3] = &h_dbl;
+	args_dbl[4] = NULL;
+
+	ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl);
+	/* { dg-output "22 15 17 25 6 13 19 18 16" } */
+	printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
+		res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
+	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK);
+
+	res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte,
+		struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
+	/* { dg-output "\n22 15 17 25 6 13 19 18 16" } */
+	printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
+		res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
+	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
+
+	exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c
new file mode 100644
index 0000000..cb2f2fb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c
@@ -0,0 +1,125 @@
+/* Area:		ffi_call, closure_call
+   Purpose:		Check structure returning with different structure size.
+				Depending on the ABI. Check bigger struct which overlaps
+				the gp and fp register count on Darwin/AIX/ppc64.
+   Limitations:	none.
+   PR:			none.
+   Originator:	Blake Chaffin	6/21/2007	*/
+
+/* { dg-do run { xfail strongarm*-*-* xscale*-*-*  } } */
+/* { dg-options "-Wno-format" { target alpha*-dec-osf* } } */
+#include "ffitest.h"
+
+typedef struct struct_72byte {
+	double a;
+	double b;
+	double c;
+	double d;
+	double e;
+	double f;
+	double g;
+	double h;
+	long long i;
+} struct_72byte;
+
+struct_72byte cls_struct_72byte_fn(
+	struct_72byte b0,
+	struct_72byte b1,
+	struct_72byte b2,
+	struct_72byte b3)
+{
+	struct_72byte	result;
+
+	result.a = b0.a + b1.a + b2.a + b3.a;
+	result.b = b0.b + b1.b + b2.b + b3.b;
+	result.c = b0.c + b1.c + b2.c + b3.c;
+	result.d = b0.d + b1.d + b2.d + b3.d;
+	result.e = b0.e + b1.e + b2.e + b3.e;
+	result.f = b0.f + b1.f + b2.f + b3.f;
+	result.g = b0.g + b1.g + b2.g + b3.g;
+	result.h = b0.h + b1.h + b2.h + b3.h;
+	result.i = b0.i + b1.i + b2.i + b3.i;
+
+	printf("%g %g %g %g %g %g %g %g %" PRIdLL "\n", result.a, result.b, result.c,
+		result.d, result.e, result.f, result.g, result.h, result.i);
+
+	return result;
+}
+
+static void
+cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
+{
+	struct_72byte	b0, b1, b2, b3;
+
+	b0 = *(struct_72byte*)(args[0]);
+	b1 = *(struct_72byte*)(args[1]);
+	b2 = *(struct_72byte*)(args[2]);
+	b3 = *(struct_72byte*)(args[3]);
+
+	*(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3);
+}
+
+int main (void)
+{
+	ffi_cif cif;
+        void *code;
+	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+	void* args_dbl[5];
+	ffi_type* cls_struct_fields[10];
+	ffi_type cls_struct_type;
+	ffi_type* dbl_arg_types[5];
+
+	cls_struct_type.size = 0;
+	cls_struct_type.alignment = 0;
+	cls_struct_type.type = FFI_TYPE_STRUCT;
+	cls_struct_type.elements = cls_struct_fields;
+
+	struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7 };
+	struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4 };
+	struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3 };
+	struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2 };
+	struct_72byte res_dbl;
+
+	cls_struct_fields[0] = &ffi_type_double;
+	cls_struct_fields[1] = &ffi_type_double;
+	cls_struct_fields[2] = &ffi_type_double;
+	cls_struct_fields[3] = &ffi_type_double;
+	cls_struct_fields[4] = &ffi_type_double;
+	cls_struct_fields[5] = &ffi_type_double;
+	cls_struct_fields[6] = &ffi_type_double;
+	cls_struct_fields[7] = &ffi_type_double;
+	cls_struct_fields[8] = &ffi_type_sint64;
+	cls_struct_fields[9] = NULL;
+
+	dbl_arg_types[0] = &cls_struct_type;
+	dbl_arg_types[1] = &cls_struct_type;
+	dbl_arg_types[2] = &cls_struct_type;
+	dbl_arg_types[3] = &cls_struct_type;
+	dbl_arg_types[4] = NULL;
+
+	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
+		dbl_arg_types) == FFI_OK);
+
+	args_dbl[0] = &e_dbl;
+	args_dbl[1] = &f_dbl;
+	args_dbl[2] = &g_dbl;
+	args_dbl[3] = &h_dbl;
+	args_dbl[4] = NULL;
+
+	ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl);
+	/* { dg-output "22 15 17 25 6 13 19 18 16" } */
+	printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c,
+		res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
+	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
+
+	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK);
+
+	res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte,
+		struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
+	/* { dg-output "\n22 15 17 25 6 13 19 18 16" } */
+	printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c,
+		res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
+	/* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
+
+	exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c
new file mode 100644
index 0000000..3de45de
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c
@@ -0,0 +1,44 @@
+/* Area:	ffi_call
+   Purpose:	Check strlen function call.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+static size_t my_strlen(char *s)
+{
+  return (strlen(s));
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg rint;
+  char *s;
+
+  args[0] = &ffi_type_pointer;
+  values[0] = (void*) &s;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 
+		     &ffi_type_sint, args) == FFI_OK);
+  
+  s = "a";
+  ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
+  CHECK(rint == 1);
+  
+  s = "1234567";
+  ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
+  CHECK(rint == 7);
+  
+  s = "1234567890123456789012345";
+  ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
+  CHECK(rint == 25);
+  
+  exit (0);
+}
+  
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c
new file mode 100644
index 0000000..6fbcc87
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/strlen_win32.c
@@ -0,0 +1,44 @@
+/* Area:	ffi_call
+   Purpose:	Check stdcall strlen call on X86_WIN32 systems.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
+
+#include "ffitest.h"
+
+static size_t __attribute__((stdcall)) my_stdcall_strlen(char *s)
+{
+  return (strlen(s));
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg rint;
+  char *s;
+  args[0] = &ffi_type_pointer;
+  values[0] = (void*) &s;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 1,
+		       &ffi_type_sint, args) == FFI_OK);
+  
+  s = "a";
+  ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values);
+  CHECK(rint == 1);
+  
+  s = "1234567";
+  ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values);
+  CHECK(rint == 7);
+  
+  s = "1234567890123456789012345";
+  ffi_call(&cif, FFI_FN(my_stdcall_strlen), &rint, values);
+  CHECK(rint == 25);
+  
+  printf("stdcall strlen tests passed\n");
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c
new file mode 100644
index 0000000..ea76c85
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c
@@ -0,0 +1,65 @@
+/* Area:	ffi_call
+   Purpose:	Check structures.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct
+{
+  unsigned char uc;
+  double d;
+  unsigned int ui;
+} test_structure_1;
+
+static test_structure_1 struct1(test_structure_1 ts)
+{
+  ts.uc++;
+  ts.d--;
+  ts.ui++;
+
+  return ts;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_type ts1_type;
+  ffi_type *ts1_type_elements[4];
+  ts1_type.size = 0;
+  ts1_type.alignment = 0;
+  ts1_type.type = FFI_TYPE_STRUCT;
+  ts1_type.elements = ts1_type_elements;
+  ts1_type_elements[0] = &ffi_type_uchar;
+  ts1_type_elements[1] = &ffi_type_double;
+  ts1_type_elements[2] = &ffi_type_uint;
+  ts1_type_elements[3] = NULL;
+  
+  test_structure_1 ts1_arg;
+  /* This is a hack to get a properly aligned result buffer */
+  test_structure_1 *ts1_result = 
+    (test_structure_1 *) malloc (sizeof(test_structure_1));
+  
+  args[0] = &ts1_type;
+  values[0] = &ts1_arg;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 
+		     &ts1_type, args) == FFI_OK);
+  
+  ts1_arg.uc = '\x01';
+  ts1_arg.d = 3.14159;
+  ts1_arg.ui = 555;
+
+  ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
+  
+  CHECK(ts1_result->ui == 556);
+  CHECK(ts1_result->d == 3.14159 - 1);
+ 
+  free (ts1_result);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c
new file mode 100644
index 0000000..14bc9fd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c
@@ -0,0 +1,67 @@
+/* Area:	ffi_call
+   Purpose:	Check structures.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct
+{
+  double d1;
+  double d2;
+} test_structure_2;
+
+static test_structure_2 struct2(test_structure_2 ts)
+{
+  ts.d1--;
+  ts.d2--;
+
+  return ts;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  test_structure_2 ts2_arg;
+  ffi_type ts2_type;
+  ffi_type *ts2_type_elements[3];
+  ts2_type.size = 0;
+  ts2_type.alignment = 0;
+  ts2_type.type = FFI_TYPE_STRUCT;
+  ts2_type.elements = ts2_type_elements;
+  ts2_type_elements[0] = &ffi_type_double;
+  ts2_type_elements[1] = &ffi_type_double;
+  ts2_type_elements[2] = NULL;
+
+  
+  /* This is a hack to get a properly aligned result buffer */
+  test_structure_2 *ts2_result = 
+    (test_structure_2 *) malloc (sizeof(test_structure_2));
+  
+  args[0] = &ts2_type;
+  values[0] = &ts2_arg;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts2_type, args) == FFI_OK);
+  
+  ts2_arg.d1 = 5.55;
+  ts2_arg.d2 = 6.66;
+  
+  printf ("%g\n", ts2_arg.d1);
+  printf ("%g\n", ts2_arg.d2);
+  
+  ffi_call(&cif, FFI_FN(struct2), ts2_result, values);
+  
+  printf ("%g\n", ts2_result->d1);
+  printf ("%g\n", ts2_result->d2);
+  
+  CHECK(ts2_result->d1 == 5.55 - 1);
+  CHECK(ts2_result->d2 == 6.66 - 1);
+  
+  free (ts2_result);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c
new file mode 100644
index 0000000..e0bb09b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c
@@ -0,0 +1,59 @@
+/* Area:	ffi_call
+   Purpose:	Check structures.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct
+{
+  int si;
+} test_structure_3;
+
+static test_structure_3 struct3(test_structure_3 ts)
+{
+  ts.si = -(ts.si*2);
+
+  return ts;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  int compare_value;
+  ffi_type ts3_type;
+  ffi_type *ts3_type_elements[2];
+  ts3_type.size = 0;
+  ts3_type.alignment = 0;
+  ts3_type.type = FFI_TYPE_STRUCT;
+  ts3_type.elements = ts3_type_elements;
+  ts3_type_elements[0] = &ffi_type_sint;
+  ts3_type_elements[1] = NULL;
+
+  test_structure_3 ts3_arg;
+  test_structure_3 *ts3_result = 
+    (test_structure_3 *) malloc (sizeof(test_structure_3));
+  
+  args[0] = &ts3_type;
+  values[0] = &ts3_arg;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 
+		     &ts3_type, args) == FFI_OK);
+  
+  ts3_arg.si = -123;
+  compare_value = ts3_arg.si;
+  
+  ffi_call(&cif, FFI_FN(struct3), ts3_result, values);
+  
+  printf ("%d %d\n", ts3_result->si, -(compare_value*2));
+  
+  CHECK(ts3_result->si == -(compare_value*2));
+ 
+  free (ts3_result);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c
new file mode 100644
index 0000000..0ad0a83
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c
@@ -0,0 +1,63 @@
+/* Area:	ffi_call
+   Purpose:	Check structures.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct
+{
+  unsigned ui1;
+  unsigned ui2;
+  unsigned ui3;
+} test_structure_4;
+
+static test_structure_4 struct4(test_structure_4 ts)
+{
+  ts.ui3 = ts.ui1 * ts.ui2 * ts.ui3;
+
+  return ts;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_type ts4_type;
+  ffi_type *ts4_type_elements[4];  
+  ts4_type.size = 0;
+  ts4_type.alignment = 0;
+  ts4_type.type = FFI_TYPE_STRUCT;
+  test_structure_4 ts4_arg;
+  ts4_type.elements = ts4_type_elements;
+  ts4_type_elements[0] = &ffi_type_uint;
+  ts4_type_elements[1] = &ffi_type_uint;
+  ts4_type_elements[2] = &ffi_type_uint;
+  ts4_type_elements[3] = NULL;
+
+  
+  /* This is a hack to get a properly aligned result buffer */
+  test_structure_4 *ts4_result = 
+    (test_structure_4 *) malloc (sizeof(test_structure_4));
+  
+  args[0] = &ts4_type;
+  values[0] = &ts4_arg;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts4_type, args) == FFI_OK);
+  
+  ts4_arg.ui1 = 2;
+  ts4_arg.ui2 = 3;
+  ts4_arg.ui3 = 4;
+  
+  ffi_call (&cif, FFI_FN(struct4), ts4_result, values);
+  
+  CHECK(ts4_result->ui3 == 2U * 3U * 4U);
+ 
+  
+  free (ts4_result);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c
new file mode 100644
index 0000000..c03cc97
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c
@@ -0,0 +1,65 @@
+/* Area:	ffi_call
+   Purpose:	Check structures.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+typedef struct
+{
+  char c1;
+  char c2;
+} test_structure_5;
+
+static test_structure_5 struct5(test_structure_5 ts1, test_structure_5 ts2)
+{
+  ts1.c1 += ts2.c1;
+  ts1.c2 -= ts2.c2;
+  
+  return ts1;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_type ts5_type;
+  ffi_type *ts5_type_elements[3];
+  ts5_type.size = 0;
+  ts5_type.alignment = 0;
+  ts5_type.type = FFI_TYPE_STRUCT;
+  ts5_type.elements = ts5_type_elements;
+  ts5_type_elements[0] = &ffi_type_schar;
+  ts5_type_elements[1] = &ffi_type_schar;
+  ts5_type_elements[2] = NULL;
+
+  test_structure_5 ts5_arg1, ts5_arg2;
+  
+  /* This is a hack to get a properly aligned result buffer */
+  test_structure_5 *ts5_result = 
+    (test_structure_5 *) malloc (sizeof(test_structure_5));
+  
+  args[0] = &ts5_type;
+  args[1] = &ts5_type;
+  values[0] = &ts5_arg1;
+  values[1] = &ts5_arg2;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ts5_type, args) == FFI_OK);
+  
+  ts5_arg1.c1 = 2;
+  ts5_arg1.c2 = 6;
+  ts5_arg2.c1 = 5;
+  ts5_arg2.c2 = 3;
+  
+  ffi_call (&cif, FFI_FN(struct5), ts5_result, values);
+  
+  CHECK(ts5_result->c1 == 7); 
+  CHECK(ts5_result->c2 == 3);
+  
+  
+  free (ts5_result);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c
new file mode 100644
index 0000000..83db9af
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c
@@ -0,0 +1,64 @@
+/* Area:	ffi_call
+   Purpose:	Check structures.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+typedef struct
+{
+  float f;
+  double d;
+} test_structure_6;
+
+static test_structure_6 struct6 (test_structure_6 ts)
+{
+  ts.f += 1;
+  ts.d += 1;
+  
+  return ts;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_type ts6_type;
+  ffi_type *ts6_type_elements[3];
+  ts6_type.size = 0;
+  ts6_type.alignment = 0;
+  ts6_type.type = FFI_TYPE_STRUCT;
+  ts6_type.elements = ts6_type_elements;
+  ts6_type_elements[0] = &ffi_type_float;
+  ts6_type_elements[1] = &ffi_type_double;
+  ts6_type_elements[2] = NULL;
+
+
+  test_structure_6 ts6_arg;
+
+  /* This is a hack to get a properly aligned result buffer */
+  test_structure_6 *ts6_result = 
+    (test_structure_6 *) malloc (sizeof(test_structure_6));
+  
+  args[0] = &ts6_type;
+  values[0] = &ts6_arg;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts6_type, args) == FFI_OK);
+  
+  ts6_arg.f = 5.55f;
+  ts6_arg.d = 6.66;
+  
+  printf ("%g\n", ts6_arg.f);
+  printf ("%g\n", ts6_arg.d);
+
+  ffi_call(&cif, FFI_FN(struct6), ts6_result, values);
+    
+  CHECK(ts6_result->f == 5.55f + 1);
+  CHECK(ts6_result->d == 6.66 + 1);
+    
+  free (ts6_result);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c
new file mode 100644
index 0000000..58aac4c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c
@@ -0,0 +1,74 @@
+/* Area:	ffi_call
+   Purpose:	Check structures.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+typedef struct
+{
+  float f1;
+  float f2;
+  double d;
+} test_structure_7;
+
+static test_structure_7 struct7 (test_structure_7 ts)
+{
+  ts.f1 += 1;
+  ts.f2 += 1;
+  ts.d += 1;
+
+  return ts;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_type ts7_type;
+  ffi_type *ts7_type_elements[4];
+  ts7_type.size = 0;
+  ts7_type.alignment = 0;
+  ts7_type.type = FFI_TYPE_STRUCT;
+  ts7_type.elements = ts7_type_elements;
+  ts7_type_elements[0] = &ffi_type_float;
+  ts7_type_elements[1] = &ffi_type_float;
+  ts7_type_elements[2] = &ffi_type_double;
+  ts7_type_elements[3] = NULL;
+
+
+  test_structure_7 ts7_arg;
+  
+  /* This is a hack to get a properly aligned result buffer */
+  test_structure_7 *ts7_result = 
+    (test_structure_7 *) malloc (sizeof(test_structure_7));
+  
+  args[0] = &ts7_type;
+  values[0] = &ts7_arg;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts7_type, args) == FFI_OK);
+  
+  ts7_arg.f1 = 5.55f;
+  ts7_arg.f2 = 55.5f;
+  ts7_arg.d = 6.66;
+
+  printf ("%g\n", ts7_arg.f1);
+  printf ("%g\n", ts7_arg.f2);
+  printf ("%g\n", ts7_arg.d);
+  
+  ffi_call(&cif, FFI_FN(struct7), ts7_result, values);
+
+  printf ("%g\n", ts7_result->f1);
+  printf ("%g\n", ts7_result->f2);
+  printf ("%g\n", ts7_result->d);
+  
+  CHECK(ts7_result->f1 == 5.55f + 1);
+  CHECK(ts7_result->f2 == 55.5f + 1);
+  CHECK(ts7_result->d == 6.66 + 1);
+  
+  free (ts7_result);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c
new file mode 100644
index 0000000..c773ac7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c
@@ -0,0 +1,80 @@
+/* Area:	ffi_call
+   Purpose:	Check structures.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+typedef struct
+{
+  float f1;
+  float f2;
+  float f3;
+  float f4;
+} test_structure_8;
+
+static test_structure_8 struct8 (test_structure_8 ts)
+{
+  ts.f1 += 1;
+  ts.f2 += 1;
+  ts.f3 += 1;
+  ts.f4 += 1;
+
+  return ts;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_type ts8_type;
+  ffi_type *ts8_type_elements[5];
+  ts8_type.size = 0;
+  ts8_type.alignment = 0;
+  ts8_type.type = FFI_TYPE_STRUCT;
+  ts8_type.elements = ts8_type_elements;
+  ts8_type_elements[0] = &ffi_type_float;
+  ts8_type_elements[1] = &ffi_type_float;
+  ts8_type_elements[2] = &ffi_type_float;
+  ts8_type_elements[3] = &ffi_type_float;
+  ts8_type_elements[4] = NULL;
+
+  test_structure_8 ts8_arg;
+  
+  /* This is a hack to get a properly aligned result buffer */
+  test_structure_8 *ts8_result = 
+    (test_structure_8 *) malloc (sizeof(test_structure_8));
+  
+  args[0] = &ts8_type;
+  values[0] = &ts8_arg;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts8_type, args) == FFI_OK);
+  
+  ts8_arg.f1 = 5.55f;
+  ts8_arg.f2 = 55.5f;
+  ts8_arg.f3 = -5.55f;
+  ts8_arg.f4 = -55.5f;
+
+  printf ("%g\n", ts8_arg.f1);
+  printf ("%g\n", ts8_arg.f2);
+  printf ("%g\n", ts8_arg.f3);
+  printf ("%g\n", ts8_arg.f4);
+  
+  ffi_call(&cif, FFI_FN(struct8), ts8_result, values);
+
+  printf ("%g\n", ts8_result->f1);
+  printf ("%g\n", ts8_result->f2);
+  printf ("%g\n", ts8_result->f3);
+  printf ("%g\n", ts8_result->f4);
+  
+  CHECK(ts8_result->f1 == 5.55f + 1);
+  CHECK(ts8_result->f2 == 55.5f + 1);
+  CHECK(ts8_result->f3 == -5.55f + 1);
+  CHECK(ts8_result->f4 == -55.5f + 1);
+  
+  free (ts8_result);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c
new file mode 100644
index 0000000..f30091f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c
@@ -0,0 +1,67 @@
+/* Area:	ffi_call
+   Purpose:	Check structures.
+   Limitations:	none.
+   PR:		none.
+   Originator:	From the original ffitest.c  */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct
+{
+  float f;
+  int i;
+} test_structure_9;
+
+static test_structure_9 struct9 (test_structure_9 ts)
+{
+  ts.f += 1;
+  ts.i += 1;
+
+  return ts;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_type ts9_type;
+  ffi_type *ts9_type_elements[3];
+  ts9_type.size = 0;
+  ts9_type.alignment = 0;
+  ts9_type.type = FFI_TYPE_STRUCT;
+  ts9_type.elements = ts9_type_elements;
+  ts9_type_elements[0] = &ffi_type_float;
+  ts9_type_elements[1] = &ffi_type_sint;
+  ts9_type_elements[2] = NULL;
+
+  test_structure_9 ts9_arg;
+  
+  /* This is a hack to get a properly aligned result buffer */
+  test_structure_9 *ts9_result = 
+    (test_structure_9 *) malloc (sizeof(test_structure_9));
+  
+  args[0] = &ts9_type;
+  values[0] = &ts9_arg;
+  
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ts9_type, args) == FFI_OK);
+  
+  ts9_arg.f = 5.55f;
+  ts9_arg.i = 5;
+  
+  printf ("%g\n", ts9_arg.f);
+  printf ("%d\n", ts9_arg.i);
+  
+  ffi_call(&cif, FFI_FN(struct9), ts9_result, values);
+
+  printf ("%g\n", ts9_result->f);
+  printf ("%d\n", ts9_result->i);
+  
+  CHECK(ts9_result->f == 5.55f + 1);
+  CHECK(ts9_result->i == 5 + 1);
+
+  free (ts9_result);
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c
new file mode 100644
index 0000000..161cc89
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c
@@ -0,0 +1,70 @@
+/* Area:	closure_call
+   Purpose:	Check return value float.
+   Limitations:	none.
+   PR:		41908.
+   Originator:	<rfm@gnu.org> 20091102	 */
+
+/* { dg-do run } */
+#include "ffitest.h"
+
+typedef struct cls_struct_combined {
+  float a;
+  float b;
+  float c;
+  float d;
+} cls_struct_combined;
+
+void cls_struct_combined_fn(struct cls_struct_combined arg)
+{
+  printf("%g %g %g %g\n",
+	 arg.a, arg.b,
+	 arg.c, arg.d);
+  fflush(stdout);
+}
+
+static void
+cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
+        void** args, void* userdata __UNUSED__)
+{
+  struct cls_struct_combined a0;
+
+  a0 = *(struct cls_struct_combined*)(args[0]);
+
+  cls_struct_combined_fn(a0);
+}
+
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type* cls_struct_fields0[5];
+  ffi_type cls_struct_type0;
+  ffi_type* dbl_arg_types[5];
+
+  cls_struct_type0.size = 0;
+  cls_struct_type0.alignment = 0;
+  cls_struct_type0.type = FFI_TYPE_STRUCT;
+  cls_struct_type0.elements = cls_struct_fields0;
+
+  struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0};
+
+  cls_struct_fields0[0] = &ffi_type_float;
+  cls_struct_fields0[1] = &ffi_type_float;
+  cls_struct_fields0[2] = &ffi_type_float;
+  cls_struct_fields0[3] = &ffi_type_float;
+  cls_struct_fields0[4] = NULL;
+
+  dbl_arg_types[0] = &cls_struct_type0;
+  dbl_arg_types[1] = NULL;
+
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_void,
+		     dbl_arg_types) == FFI_OK);
+
+  CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK);
+
+  ((void(*)(cls_struct_combined)) (code))(g_dbl);
+  /* { dg-output "4 5 1 8" } */
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h
new file mode 100644
index 0000000..83f5442
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h
@@ -0,0 +1,96 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <ffi.h>
+#include "fficonfig.h"
+
+#define MAX_ARGS 256
+
+
+/* Define __UNUSED__ that also other compilers than gcc can run the tests.  */
+#undef __UNUSED__
+#if defined(__GNUC__)
+#define __UNUSED__ __attribute__((__unused__))
+#else
+#define __UNUSED__
+#endif
+
+#define CHECK(x) (!(x) ? abort() : (void)0)
+
+/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
+   file open.  */
+#ifdef HAVE_MMAP_ANON
+# undef HAVE_MMAP_DEV_ZERO
+
+# include <sys/mman.h>
+# ifndef MAP_FAILED
+#  define MAP_FAILED -1
+# endif
+# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
+#  define MAP_ANONYMOUS MAP_ANON
+# endif
+# define USING_MMAP
+
+#endif
+
+#ifdef HAVE_MMAP_DEV_ZERO
+
+# include <sys/mman.h>
+# ifndef MAP_FAILED
+#  define MAP_FAILED -1
+# endif
+# define USING_MMAP
+
+#endif
+
+
+/* MinGW kludge.  */
+#ifdef _WIN64
+#define PRIdLL "I64d"
+#define PRIuLL "I64u"
+#else
+#define PRIdLL "lld"
+#define PRIuLL "llu"
+#endif
+
+#ifdef USING_MMAP
+static inline void *
+allocate_mmap (size_t size)
+{
+  void *page;
+#if defined (HAVE_MMAP_DEV_ZERO)
+  static int dev_zero_fd = -1;
+#endif
+
+#ifdef HAVE_MMAP_DEV_ZERO
+  if (dev_zero_fd == -1)
+    {
+      dev_zero_fd = open ("/dev/zero", O_RDONLY);
+      if (dev_zero_fd == -1)
+	{
+	  perror ("open /dev/zero: %m");
+	  exit (1);
+	}
+    }
+#endif
+
+
+#ifdef HAVE_MMAP_ANON
+  page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
+	       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+#endif
+#ifdef HAVE_MMAP_DEV_ZERO
+  page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
+	       MAP_PRIVATE, dev_zero_fd, 0);
+#endif
+
+  if (page == (char *) MAP_FAILED)
+    {
+      perror ("virtual memory exhausted");
+      exit (1);
+    }
+
+  return page;
+}
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/special.exp b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/special.exp
new file mode 100644
index 0000000..74671b1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/special.exp
@@ -0,0 +1,35 @@
+# Copyright (C) 2003, 2006, 2009, 2010 Free Software Foundation, Inc.
+
+# 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; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+dg-init
+libffi-init
+
+global srcdir subdir
+
+global cxx_options
+
+set cxx_options " -shared-libgcc -lstdc++"
+
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O0 -W -Wall"
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O2"
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-O3"
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.cc]] $cxx_options "-Os"
+
+dg-finish
+
+# Local Variables:
+# tcl-indent-level:4
+# End:
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc
new file mode 100644
index 0000000..d7ffd4a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc
@@ -0,0 +1,124 @@
+/* Area:	ffi_closure, unwind info
+   Purpose:	Check if the unwind information is passed correctly.
+   Limitations:	none.
+   PR:		none.
+   Originator:	Jeff Sturm <jsturm@one-point.com>  */
+
+/* { dg-do run } */
+#include "ffitestcxx.h"
+
+#if defined HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+#if defined HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+void
+closure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
+		void** args __UNUSED__, void* userdata __UNUSED__)
+{
+  throw 9;
+}
+
+typedef void (*closure_test_type)();
+
+void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp,
+		      void** args, void* userdata __UNUSED__)
+ {
+    *(ffi_arg*)resp =
+      (int)*(float *)args[0] +(int)(*(float *)args[1]) +
+      (int)(*(float *)args[2]) + (int)*(float *)args[3] +
+      (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) +
+      (int)*(float *)args[6] + (int)(*(int *)args[7]) +
+      (int)(*(double*)args[8]) + (int)*(int *)args[9] +
+      (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
+      (int)*(int *)args[12] + (int)(*(int *)args[13]) +
+      (int)(*(int *)args[14]) + *(int *)args[15] + (int)(intptr_t)userdata;
+
+    printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
+	   (int)*(float *)args[0], (int)(*(float *)args[1]),
+	   (int)(*(float *)args[2]), (int)*(float *)args[3],
+	   (int)(*(signed short *)args[4]), (int)(*(float *)args[5]),
+	   (int)*(float *)args[6], (int)(*(int *)args[7]),
+	   (int)(*(double *)args[8]), (int)*(int *)args[9],
+	   (int)(*(int *)args[10]), (int)(*(float *)args[11]),
+	   (int)*(int *)args[12], (int)(*(int *)args[13]),
+	   (int)(*(int *)args[14]), *(int *)args[15],
+	   (int)(intptr_t)userdata, (int)*(ffi_arg*)resp);
+
+    throw (int)*(ffi_arg*)resp;
+}
+
+typedef int (*closure_test_type1)(float, float, float, float, signed short,
+				  float, float, int, double, int, int, float,
+				  int, int, int, int);
+
+int main (void)
+{
+  ffi_cif cif;
+  void *code;
+  ffi_closure *pcl = (ffi_closure *)ffi_closure_alloc(sizeof(ffi_closure), &code);
+  ffi_type * cl_arg_types[17];
+
+  {
+    cl_arg_types[1] = NULL;
+
+    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0,
+		       &ffi_type_void, cl_arg_types) == FFI_OK);
+    CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn, NULL, code) == FFI_OK);
+
+    try
+      {
+	(*((closure_test_type)(code)))();
+      } catch (int exception_code)
+      {
+	CHECK(exception_code == 9);
+      }
+
+    printf("part one OK\n");
+    /* { dg-output "part one OK" } */
+    }
+
+    {
+
+      cl_arg_types[0] = &ffi_type_float;
+      cl_arg_types[1] = &ffi_type_float;
+      cl_arg_types[2] = &ffi_type_float;
+      cl_arg_types[3] = &ffi_type_float;
+      cl_arg_types[4] = &ffi_type_sshort;
+      cl_arg_types[5] = &ffi_type_float;
+      cl_arg_types[6] = &ffi_type_float;
+      cl_arg_types[7] = &ffi_type_uint;
+      cl_arg_types[8] = &ffi_type_double;
+      cl_arg_types[9] = &ffi_type_uint;
+      cl_arg_types[10] = &ffi_type_uint;
+      cl_arg_types[11] = &ffi_type_float;
+      cl_arg_types[12] = &ffi_type_uint;
+      cl_arg_types[13] = &ffi_type_uint;
+      cl_arg_types[14] = &ffi_type_uint;
+      cl_arg_types[15] = &ffi_type_uint;
+      cl_arg_types[16] = NULL;
+
+      /* Initialize the cif */
+      CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
+			 &ffi_type_sint, cl_arg_types) == FFI_OK);
+
+      CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1,
+                                 (void *) 3 /* userdata */, code)  == FFI_OK);
+      try
+	{
+	  (*((closure_test_type1)code))
+	    (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13,
+	     19, 21, 1);
+	  /* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
+	} catch (int exception_code)
+	{
+	  CHECK(exception_code == 255);
+	}
+      printf("part two OK\n");
+      /* { dg-output "\npart two OK" } */
+    }
+    exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc
new file mode 100644
index 0000000..29739cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc
@@ -0,0 +1,53 @@
+/* Area:	ffi_call, unwind info
+   Purpose:	Check if the unwind information is passed correctly.
+   Limitations:	none.
+   PR:		none.
+   Originator:	Andreas Tobler <andreast@gcc.gnu.org> 20061213  */
+
+/* { dg-do run } */
+#include "ffitestcxx.h"
+
+static int checking(int a __UNUSED__, short b __UNUSED__,
+		    signed char c __UNUSED__)
+{
+  throw 9;
+}
+
+int main (void)
+{
+  ffi_cif cif;
+  ffi_type *args[MAX_ARGS];
+  void *values[MAX_ARGS];
+  ffi_arg rint;
+
+  signed int si;
+  signed short ss;
+  signed char sc;
+
+  args[0] = &ffi_type_sint;
+  values[0] = &si;
+  args[1] = &ffi_type_sshort;
+  values[1] = &ss;
+  args[2] = &ffi_type_schar;
+  values[2] = &sc;
+
+  /* Initialize the cif */
+  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
+		     &ffi_type_sint, args) == FFI_OK);
+
+  si = -6;
+  ss = -12;
+  sc = -1;
+  {
+    try
+      {
+	ffi_call(&cif, FFI_FN(checking), &rint, values);
+      } catch (int exception_code)
+      {
+	CHECK(exception_code == 9);
+      }
+    printf("part one OK\n");
+    /* { dg-output "part one OK" } */
+  }
+  exit(0);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/texinfo.tex b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/texinfo.tex
new file mode 100644
index 0000000..ff2c406
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/libffi/texinfo.tex
@@ -0,0 +1,7210 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2005-07-05.19}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software
+% Foundation, Inc.
+%
+% This texinfo.tex file 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 2, or (at
+% your option) any later version.
+%
+% This texinfo.tex file 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 texinfo.tex file; see the file COPYING.  If not, write
+% to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+% Boston, MA 02110-1301, USA.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction.  (This has been our intent since Texinfo was invented.)
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+%   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+%   ftp://tug.org/tex/texinfo.tex
+%     (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org.  Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem.  Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution.  For a simple
+% manual foo.texi, however, you can get away with this:
+%   tex foo.texi
+%   texindex foo.??
+%   tex foo.texi
+%   tex foo.texi
+%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+  \catcode`+=\active \catcode`\_=\active}
+
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\backChar  = `\\
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar   = `\.
+\chardef\exclamChar= `\!
+\chardef\plusChar  = `\+
+\chardef\questChar = `\?
+\chardef\semiChar  = `\;
+\chardef\underChar = `\_
+
+\chardef\spaceChar = `\ %
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode\spaceChar=\spacecat}
+
+{% for help with debugging.
+ % example usage: \expandafter\show\activebackslash
+ \catcode`\! = 0 \catcode`\\ = \active
+ !global!def!activebackslash{\}
+}
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+  ap-pen-dix bit-map bit-maps
+  data-base data-bases eshell fall-ing half-way long-est man-u-script
+  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+  spell-ing spell-ings
+  stand-alone strong-est time-stamp time-stamps which-ever white-space
+  wide-spread wrap-around
+}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line.  It should
+% surround any changed text.  This approach does *not* work if the
+% change spans more than two lines of output.  To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+  % \vadjust can only be used in horizontal mode.
+  \leavevmode
+  %
+  % Append this vertical mode material after the current line in the output.
+  \vadjust{%
+    % We want to insert a rule with the height and depth of the current
+    % leading; that is exactly what \strutbox is supposed to record.
+    \vskip-\baselineskip
+    %
+    % \vadjust-items are inserted at the left edge of the type.  So
+    % the \llap here moves out into the left-hand margin.
+    \llap{%
+      %
+      % For a thicker or thinner bar, change the `1pt'.
+      \vrule height\baselineskip width1pt
+      %
+      % This is the space between the bar and the text.
+      \hskip 12pt
+    }%
+  }%
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\undefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines16
+}%
+
+% add check for \lastpenalty to plain's definitions.  If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+  \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+  \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+  \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong  \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument.  Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+  %
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  %
+  % Do this outside of the \shipout so @code etc. will be expanded in
+  % the headline as they should be, not taken literally (outputting ''code).
+  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+  %
+  {%
+    % Have to do this stuff outside the \shipout because we want it to
+    % take effect in \write's, yet the group defined by the \vbox ends
+    % before the \shipout runs.
+    %
+    \indexdummies         % don't expand commands in the output.
+    \shipout\vbox{%
+      % Do this early so pdf references go to the beginning of the page.
+      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+      %
+      \ifcropmarks \vbox to \outervsize\bgroup
+        \hsize = \outerhsize
+        \vskip-\topandbottommargin
+        \vtop to0pt{%
+          \line{\ewtop\hfil\ewtop}%
+          \nointerlineskip
+          \line{%
+            \vbox{\moveleft\cornerthick\nstop}%
+            \hfill
+            \vbox{\moveright\cornerthick\nstop}%
+          }%
+          \vss}%
+        \vskip\topandbottommargin
+        \line\bgroup
+          \hfil % center the page within the outer (page) hsize.
+          \ifodd\pageno\hskip\bindingoffset\fi
+          \vbox\bgroup
+      \fi
+      %
+      \unvbox\headlinebox
+      \pagebody{#1}%
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingxxx.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 2\baselineskip
+        \unvbox\footlinebox
+      \fi
+      %
+      \ifcropmarks
+          \egroup % end of \vbox\bgroup
+        \hfil\egroup % end of (centering) \line\bgroup
+        \vskip\topandbottommargin plus1fill minus1fill
+        \boxmaxdepth = \cornerthick
+        \vbox to0pt{\vss
+          \line{%
+            \vbox{\moveleft\cornerthick\nsbot}%
+            \hfill
+            \vbox{\moveright\cornerthick\nsbot}%
+          }%
+          \nointerlineskip
+          \line{\ewbot\hfil\ewbot}%
+        }%
+      \egroup % \vbox from first cropmarks clause
+      \fi
+    }% end of \shipout\vbox
+  }% end of group with \indexdummies
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks.  Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.  The argument is the rest of
+% the input line (except we remove a trailing comment).  #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+  \def\next{#2}%
+  \begingroup
+    \obeylines
+    \spaceisspace
+    #1%
+    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+  \gdef\parseargline#1^^M{%
+    \endgroup % End of the group started in \parsearg.
+    \argremovecomment #1\comment\ArgTerm%
+  }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+%    @end itemize  @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+  \def\temp{#3}%
+  \ifx\temp\empty
+    % We cannot use \next here, as it holds the macro to run;
+    % thus we reuse \temp.
+    \let\temp\finishparsearg
+  \else
+    \let\temp\argcheckspaces
+  \fi
+  % Put the space token in:
+  \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \next.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
+
+% \parseargdef\foo{...}
+%	is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick.  --kasal, 16nov03
+
+\def\parseargdef#1{%
+  \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+  \def#2{\parsearg#1}%
+  \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+  \obeyspaces
+  \gdef\obeyedspace{ }
+
+  % Make each space character in the input produce a normal interword
+  % space in the output.  Don't allow a line break at this space, as this
+  % is used only in environments like @example, where each line of input
+  % should produce a line of output anyway.
+  %
+  \gdef\sepspaces{\obeyspaces\let =\tie}
+
+  % If an index command is used in an @example environment, any spaces
+  % therein should become regular spaces in the raw index file, not the
+  % expansion of \tie (\leavevmode \penalty \@M \ ).
+  \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex.  It's used like this:
+%
+%   \envdef\foo{...}
+%   \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo.  \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches.  The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group.  (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+  \def\temp{#1}%
+  \ifx\thisenv\temp
+  \else
+    \badenverr
+  \fi
+}
+
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
+  \errhelp = \EMsimple
+  \errmessage{This command can appear only \inenvironment\temp,
+    not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+  \ifx#1\empty
+    out of any environment%
+  \else
+    in environment \expandafter\string#1%
+  \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+  \if 1\csname iscond.#1\endcsname
+  \else
+    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+    \expandafter\checkenv\csname#1\endcsname
+    \csname E#1\endcsname
+    \endgroup
+  \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+  % Definitions to produce \{ and \} commands for indices,
+  % and @{ and @} for the aux/toc files.
+  \catcode`\{ = \other \catcode`\} = \other
+  \catcode`\[ = 1 \catcode`\] = 2
+  \catcode`\! = 0 \catcode`\\ = \other
+  !gdef!lbracecmd[\{]%
+  !gdef!rbracecmd[\}]%
+  !gdef!lbraceatcmd[@{]%
+  !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ptexi
+  \else\ifx\temp\jmacro \j
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence.  (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo.  Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+  L\kern-.36em
+  {\setbox0=\hbox{T}%
+   \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+  \kern-.15em
+  \TeX
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off  says whether to put extra space after punctuation.
+% 
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+  \def\temp{#1}%
+  \ifx\temp\onword \plainfrenchspacing
+  \else\ifx\temp\offword \plainnonfrenchspacing
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
+  \fi\fi
+}
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+  \ifnum\catcode`\^^M=\active \else
+    \errhelp = \groupinvalidhelp
+    \errmessage{@group invalid in context where filling is enabled}%
+  \fi
+  \startsavinginserts
+  %
+  \setbox\groupbox = \vtop\bgroup
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
+    % end-of-line in the output.  We don't want the end-of-line after
+    % the `@group' to put extra space in the output.  Since @group
+    % should appear on a line by itself (according to the Texinfo
+    % manual), we don't worry about eating any user text.
+    \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it.  Thus, space below is not quite equal to space
+% above.  But it's pretty close.
+\def\Egroup{%
+    % To get correct interline space between the last line of the group
+    % and the first line afterwards, we have to propagate \prevdepth.
+    \endgraf % Not \par, as it may have been set to \lisppar.
+    \global\dimen1 = \prevdepth
+  \egroup           % End the \vtop.
+  % \dimen0 is the vertical size of the group's box.
+  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+  % \dimen2 is how much space is left on the page (more or less).
+  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
+  % if the group doesn't fit on the current page, and it's a big big
+  % group, force a page break.
+  \ifdim \dimen0 > \dimen2
+    \ifdim \pagetotal < \vfilllimit\pageheight
+      \page
+    \fi
+  \fi
+  \box\groupbox
+  \prevdepth = \dimen1
+  \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+% Old definition--didn't work.
+%\parseargdef\need{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\parseargdef\need{%
+  % Ensure vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % If the @need value is less than one line space, it's useless.
+  \dimen0 = #1\mil
+  \dimen2 = \ht\strutbox
+  \advance\dimen2 by \dp\strutbox
+  \ifdim\dimen0 > \dimen2
+    %
+    % Do a \strut just to make the height of this box be normal, so the
+    % normal leading is inserted relative to the preceding line.
+    % And a page break here is fine.
+    \vtop to #1\mil{\strut\vfil}%
+    %
+    % TeX does not even consider page breaks if a penalty added to the
+    % main vertical list is 10000 or more.  But in order to see if the
+    % empty box we just added fits on the page, we must make it consider
+    % page breaks.  On the other hand, we don't want to actually break the
+    % page after the empty box.  So we use a penalty of 9999.
+    %
+    % There is an extremely small chance that TeX will actually break the
+    % page at this \penalty, if there are no other feasible breakpoints in
+    % sight.  (If the user is using lots of big @group commands, which
+    % almost-but-not-quite fill up a page, TeX will have a hard time doing
+    % good page breaking, for example.)  However, I could not construct an
+    % example where a page broke at this \penalty; if it happens in a real
+    % document, then we can reconsider our strategy.
+    \penalty9999
+    %
+    % Back up by the size of the box, whether we did a page break or not.
+    \kern -#1\mil
+    %
+    % Do not allow a page break right after this kern.
+    \nobreak
+  \fi
+}
+
+% @br   forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+  \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph.  For more general purposes, use the \margin insertion
+% class.  WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+  \nobreak
+  \kern-\strutdepth
+  \vtop to \strutdepth{%
+    \baselineskip=\strutdepth
+    \vss
+    % if you have multiple lines of stuff to put here, you'll need to
+    % make the vbox yourself of the appropriate size.
+    \ifx#1l%
+      \llap{\ignorespaces #2\hskip\inmarginspacing}%
+    \else
+      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+    \fi
+    \null
+  }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+  \setbox0 = \hbox{\ignorespaces #2}%
+  \ifdim\wd0 > 0pt
+    \def\lefttext{#1}%  have both texts
+    \def\righttext{#2}%
+  \else
+    \def\lefttext{#1}%  have only one text
+    \def\righttext{#1}%
+  \fi
+  %
+  \ifodd\pageno
+    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+  \else
+    \def\temp{\inleftmargin\lefttext}%
+  \fi
+  \temp
+}
+
+% @include file    insert text of that file as input.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+  \pushthisfilestack
+  \def\thisfile{#1}%
+  {%
+    \makevalueexpandable
+    \def\temp{\input #1 }%
+    \expandafter
+  }\temp
+  \popthisfilestack
+}
+\def\filenamecatcodes{%
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+  \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+  the stack of filenames is empty.}}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+  \ifhmode
+    \let\next\centerH
+  \else
+    \let\next\centerV
+  \fi
+  \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+  {%
+    \hfil\break
+    \advance\hsize by -\leftskip
+    \advance\hsize by -\rightskip
+    \line{#1}%
+    \break
+  }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
+
+% @sp n   outputs n lines of vertical space
+
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \defaultparindent = 0pt
+    \else
+      \defaultparindent = #1em
+    \fi
+  \fi
+  \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \lispnarrowing = 0pt
+    \else
+      \lispnarrowing = #1em
+    \fi
+  \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading.  If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\noneword
+    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+  \else\ifx\temp\insertword
+    \let\suppressfirstparagraphindent = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @firstparagraphindent option `\temp'}%
+  \fi\fi
+}
+
+% Here is how we actually suppress indentation.  Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+  \gdef\indent{%
+    \restorefirstparagraphindent
+    \indent
+  }%
+  \gdef\noindent{%
+    \restorefirstparagraphindent
+    \noindent
+  }%
+  \global\everypar = {%
+    \kern -\parindent
+    \restorefirstparagraphindent
+  }%
+}
+
+\gdef\restorefirstparagraphindent{%
+  \global \let \indent = \ptexindent
+  \global \let \noindent = \ptexnoindent
+  \global \everypar = {}%
+}
+
+
+% @asis just yields its argument.  Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+  \catcode\underChar = \active
+  \gdef\mathunderscore{%
+    \catcode\underChar=\active
+    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+  }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care.  Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+  \tex
+  \mathunderscore
+  \let\\ = \mathbackslash
+  \mathactive
+  $\finishmath
+}
+\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+  }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+  \leavevmode
+  \hbox to 1.5em{%
+    \hskip 0pt plus 0.25fil
+    .\hfil.\hfil.%
+    \hskip 0pt plus 0.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \dots
+  \spacefactor=\endofsentencespacefactor
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
+   \iflinks
+     \tryauxfile
+     % Open the new aux file.  TeX will close it automatically at exit.
+     \immediate\openout\auxfile=\jobname.aux
+   \fi % \openindices needs to do some work in any case.
+   \openindices
+   \let\setfilename=\comment % Ignore extra @setfilename cmds.
+   %
+   % If texinfo.cnf is present on the system, read it.
+   % Useful for site-wide @afourpaper, etc.
+   \openin 1 texinfo.cnf
+   \ifeof 1 \else \input texinfo.cnf \fi
+   \closein 1
+   %
+   \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+  \newindex{cp}%
+  \newcodeindex{fn}%
+  \newcodeindex{vr}%
+  \newcodeindex{tp}%
+  \newcodeindex{ky}%
+  \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set).  So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
+\ifx\pdfoutput\undefined
+\else
+  \ifx\pdfoutput\relax
+  \else
+    \ifcase\pdfoutput
+    \else
+      \pdftrue
+    \fi
+  \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets, to
+% for display in the outlines, and in other places.  Thus, we have to
+% double any backslashes.  Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e.  Not good.
+% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
+% (and related messages, the final outcome is that it is up to the TeX
+% user to double the backslashes and otherwise make the string valid, so
+% that's we do).
+
+% double active backslashes.
+% 
+{\catcode`\@=0 \catcode`\\=\active
+ @gdef@activebackslash{@catcode`@\=@active @otherbackslash}
+ @gdef@activebackslashdouble{%
+   @catcode@backChar=@active
+   @let\=@doublebackslash}
+}
+
+% To handle parens, we must adopt a different approach, since parens are
+% not active characters.  hyperref.dtx (which has the same problem as
+% us) handles it with this amazing macro to replace tokens.  I've
+% tinkered with it a little for texinfo, but it's definitely from there.
+% 
+% #1 is the tokens to replace.
+% #2 is the replacement.
+% #3 is the control sequence with the string.
+% 
+\def\HyPsdSubst#1#2#3{%
+  \def\HyPsdReplace##1#1##2\END{%
+    ##1%
+    \ifx\\##2\\%
+    \else
+      #2%
+      \HyReturnAfterFi{%
+        \HyPsdReplace##2\END
+      }%
+    \fi
+  }%
+  \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
+}
+\long\def\HyReturnAfterFi#1\fi{\fi#1}
+
+% #1 is a control sequence in which to do the replacements.
+\def\backslashparens#1{%
+  \xdef#1{#1}% redefine it as its expansion; the definition is simply
+             % \lastnode when called from \setref -> \pdfmkdest.
+  \HyPsdSubst{(}{\backslashlparen}{#1}%
+  \HyPsdSubst{)}{\backslashrparen}{#1}%
+}
+
+{\catcode\exclamChar = 0 \catcode\backChar = \other
+ !gdef!backslashlparen{\(}%
+ !gdef!backslashrparen{\)}%
+}
+
+\ifpdf
+  \input pdfcolor
+  \pdfcatalog{/PageMode /UseOutlines}%
+  \def\dopdfimage#1#2#3{%
+    \def\imagewidth{#2}%
+    \def\imageheight{#3}%
+    % without \immediate, pdftex seg faults when the same image is
+    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
+    \ifnum\pdftexversion < 14
+      \immediate\pdfimage
+    \else
+      \immediate\pdfximage
+    \fi
+      \ifx\empty\imagewidth\else width \imagewidth \fi
+      \ifx\empty\imageheight\else height \imageheight \fi
+      \ifnum\pdftexversion<13
+         #1.pdf%
+       \else
+         {#1.pdf}%
+       \fi
+    \ifnum\pdftexversion < 14 \else
+      \pdfrefximage \pdflastximage
+    \fi}
+  \def\pdfmkdest#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \atdummies
+    \activebackslashdouble
+    \def\pdfdestname{#1}%
+    \backslashparens\pdfdestname
+    \pdfdest name{\pdfdestname} xyz%
+  }}%
+  %
+  % used to mark target names; must be expandable.
+  \def\pdfmkpgn#1{#1}%
+  %
+  \let\linkcolor = \Blue  % was Cyan, but that seems light?
+  \def\endlink{\Black\pdfendlink}
+  % Adding outlines to PDF; macros for calculating structure of outlines
+  % come from Petr Olsak
+  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+    \else \csname#1\endcsname \fi}
+  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+    \advance\tempnum by 1
+    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+  %
+  % #1 is the section text, which is what will be displayed in the
+  % outline by the pdf viewer.  #2 is the pdf expression for the number
+  % of subentries (or empty, for subsubsections).  #3 is the node text,
+  % which might be empty if this toc entry had no corresponding node.
+  % #4 is the page number
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    % Generate a link to the node text if that exists; else, use the
+    % page number.  We could generate a destination for the section
+    % text in the case where a section has no node, but it doesn't
+    % seem worth the trouble, since most documents are normally structured.
+    \def\pdfoutlinedest{#3}%
+    \ifx\pdfoutlinedest\empty
+      \def\pdfoutlinedest{#4}%
+    \else
+      % Doubled backslashes in the name.
+      {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
+       \backslashparens\pdfoutlinedest}%
+    \fi
+    %
+    % Also double the backslashes in the display string.
+    {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
+     \backslashparens\pdfoutlinetext}%
+    %
+    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
+      % Thanh's hack / proper braces in bookmarks
+      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+      %
+      % Read toc silently, to get counts of subentries for \pdfoutline.
+      \def\numchapentry##1##2##3##4{%
+	\def\thischapnum{##2}%
+	\def\thissecnum{0}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsecentry##1##2##3##4{%
+	\advancenumber{chap\thischapnum}%
+	\def\thissecnum{##2}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsubsecentry##1##2##3##4{%
+	\advancenumber{sec\thissecnum}%
+	\def\thissubsecnum{##2}%
+      }%
+      \def\numsubsubsecentry##1##2##3##4{%
+	\advancenumber{subsec\thissubsecnum}%
+      }%
+      \def\thischapnum{0}%
+      \def\thissecnum{0}%
+      \def\thissubsecnum{0}%
+      %
+      % use \def rather than \let here because we redefine \chapentry et
+      % al. a second time, below.
+      \def\appentry{\numchapentry}%
+      \def\appsecentry{\numsecentry}%
+      \def\appsubsecentry{\numsubsecentry}%
+      \def\appsubsubsecentry{\numsubsubsecentry}%
+      \def\unnchapentry{\numchapentry}%
+      \def\unnsecentry{\numsecentry}%
+      \def\unnsubsecentry{\numsubsecentry}%
+      \def\unnsubsubsecentry{\numsubsubsecentry}%
+      \readdatafile{toc}%
+      %
+      % Read toc second time, this time actually producing the outlines.
+      % The `-' means take the \expnumber as the absolute number of
+      % subentries, which we calculated on our first read of the .toc above.
+      %
+      % We use the node names as the destinations.
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{% count is always zero
+        \dopdfoutline{##1}{}{##3}{##4}}%
+      %
+      % PDF outlines are displayed using system fonts, instead of
+      % document fonts.  Therefore we cannot use special characters,
+      % since the encoding is unknown.  For example, the eogonek from
+      % Latin 2 (0xea) gets translated to a | character.  Info from
+      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+      %
+      % xx to do this right, we have to translate 8-bit characters to
+      % their "best" equivalent, based on the @documentencoding.  Right
+      % now, I guess we'll just let the pdf reader have its way.
+      \indexnofonts
+      \setupdatafile
+      \activebackslash
+      \input \jobname.toc
+    \endgroup
+  }
+  %
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \ifx\p\space\else\addtokens{\filename}{\PP}%
+        \advance\filenamelength by 1
+      \fi
+    \fi
+    \nextsp}
+  \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+  \ifnum\pdftexversion < 14
+    \let \startlink \pdfannotlink
+  \else
+    \let \startlink \pdfstartlink
+  \fi
+  \def\pdfurl#1{%
+    \begingroup
+      \normalturnoffactive\def\@{@}%
+      \makevalueexpandable
+      \leavevmode\Red
+      \startlink attr{/Border [0 0 0]}%
+        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+    \endgroup}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+    \linkcolor #1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\linkcolor = \relax
+  \let\pdfmakeoutlines = \relax
+\fi  % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+  \csname ten#1\endcsname  % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+% Default leading.
+\newdimen\textleading  \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly.  There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+  \normalbaselineskip = #1\relax
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
+  \setbox\strutbox =\hbox{%
+    \vrule width0pt height\strutheightpercent\baselineskip
+                    depth \strutdepthpercent \baselineskip
+  }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx}               %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}
+\setfont\texttt\ttshape{10}{\mainmagstep}
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}
+\setfont\deftt\ttshape{10}{\magstep1}
+\setfont\defttsl\ttslshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}
+\setfont\reducedtt\ttshape{10}{1000}
+\setfont\reducedbf\bfshape{10}{1000}
+\setfont\reducedit\itshape{10}{1000}
+\setfont\reducedsl\slshape{10}{1000}
+\setfont\reducedsf\sfshape{10}{1000}
+\setfont\reducedsc\scshape{10}{1000}
+\setfont\reducedttsl\ttslshape{10}{1000}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.  Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+  \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE.  We do this because \STYLE needs to also set the
+% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower).  These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+  \let\tenttsl=\textttsl
+  \def\curfontsize{text}%
+  \def\lsize{reduced}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+  \let\tenttsl=\titlettsl
+  \def\curfontsize{title}%
+  \def\lsize{chap}\def\lllsize{subsec}%
+  \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+  \let\tenttsl=\chapttsl
+  \def\curfontsize{chap}%
+  \def\lsize{sec}\def\lllsize{text}%
+  \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+  \let\tenttsl=\secttsl
+  \def\curfontsize{sec}%
+  \def\lsize{subsec}\def\lllsize{reduced}%
+  \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+  \let\tenttsl=\ssecttsl
+  \def\curfontsize{ssec}%
+  \def\lsize{text}\def\lllsize{small}%
+  \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+  \let\tenttsl=\reducedttsl
+  \def\curfontsize{reduced}%
+  \def\lsize{small}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+  \let\tenttsl=\smallttsl
+  \def\curfontsize{small}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+  \let\tenttsl=\smallerttsl
+  \def\curfontsize{smaller}%
+  \def\lsize{smaller}\def\lllsize{smaller}%
+  \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts \rm
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bfshape{10}{\magstep1}  % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+                    \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl.  We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% @b, explicit bold.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph.  Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+  \def\plainfrenchspacing{%
+    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+    \def\endofsentencespacefactor{1000}% for @. and friends
+  }
+  \def\plainnonfrenchspacing{%
+    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+    \def\endofsentencespacefactor{3000}% for @. and friends
+  }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+\def\t#1{%
+  {\tt \rawbackslash \plainfrenchspacing #1}%
+  \null
+}
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+    \vbox{\hrule\kern-0.4pt
+     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+    \kern-0.4pt\hrule}%
+  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+  {%
+    % Change normal interword space to be same as for the current font.
+    \spaceskip = \fontdimen2\font
+    %
+    % Switch to typewriter.
+    \tt
+    %
+    % But `\ ' produces the large typewriter interword space.
+    \def\ {{\spaceskip = 0pt{} }}%
+    %
+    % Turn off hyphenation.
+    \nohyphenation
+    %
+    \rawbackslash
+    \plainfrenchspacing
+    #1%
+  }%
+  \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+%  -- rms.
+{
+  \catcode`\-=\active
+  \catcode`\_=\active
+  %
+  \global\def\code{\begingroup
+    \catcode`\-=\active  \catcode`\_=\active
+    \ifallowcodebreaks
+     \let-\codedash
+     \let_\codeunder
+    \else
+     \let-\realdash
+     \let_\realunder
+    \fi
+    \codex
+  }
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
+  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+  % will therefore expand the active definition of _, which is us
+  % (inside @code that is), therefore an endless loop.
+  \ifusingtt{\ifmmode
+               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+             \else\normalunderscore \fi
+             \discretionary{}{}{}}%
+            {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__.  This is undesirable in
+% some manuals, especially if they don't have long identifiers in
+% general.  @allowcodebreaks provides a way to control this.
+% 
+\newif\ifallowcodebreaks  \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\keywordtrue
+    \allowcodebreakstrue
+  \else\ifx\txiarg\keywordfalse
+    \allowcodebreaksfalse
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
+  \fi\fi
+}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+%   `example' (@kbd uses ttsl only inside of @example and friends),
+%   or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\worddistinct
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+  \else\ifx\txiarg\wordexample
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+  \else\ifx\txiarg\wordcode
+    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
+  \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself.  First (mandatory) arg is the url.  Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        \unhbox0             % PDF: 2nd arg given, show only it
+      \else
+        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+      \fi
+    \else
+      \code{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+  \def\email#1{\doemail#1,,\finish}
+  \def\doemail#1,#2,#3\finish{\begingroup
+    \unsepspaces
+    \pdfurl{mailto:#1}%
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+    \endlink
+  \endgroup}
+\else
+  \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font.  Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find.  We need it for
+% Polish suppressed-l.  --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}}              % roman font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+% 
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+  {\selectfonts\lsize #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+% 
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+  {\plainfrenchspacing #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+% 
+% Although only regular is the truly official Euro symbol, we ignore
+% that.  The Euro is designed to be slightly taller than the regular
+% font height.
+% 
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+% 
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+% 
+% Also doesn't work in math.  Do we need to do math with euro symbols?
+% Hope not.
+% 
+% 
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+  % We set the font at each command, rather than predefining it in
+  % \textfonts and the other font-switching commands, so that
+  % installations which never need the symbol don't have to have the
+  % font installed.
+  % 
+  % There is only one designed size (nominal 10pt), so we always scale
+  % that to the current nominal size.
+  % 
+  % By the way, simply using "at 1em" works for cmr10 and the like, but
+  % does not work for cmbx10 and other extended/shrunken fonts.
+  % 
+  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+  %
+  \ifx\curfontstyle\bfstylename 
+    % bold:
+    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+  \else 
+    % regular:
+    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+  \fi
+  \thiseurofont
+}
+
+% @registeredsymbol - R in a circle.  The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+               \hfil\crcr\Orb}}%
+    }$%
+}
+
+% Laurent Siebenmann reports \Orb undefined with:
+%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
+% so we'll define it if necessary.
+% 
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+        \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+  % Open one extra group, as we want to close it in the middle of \Etitlepage.
+  \begingroup
+    \parindent=0pt \textfonts
+    % Leave some space at the very top of the page.
+    \vglue\titlepagetopglue
+    % No rule at page bottom unless we print one at the top with @title.
+    \finishedtitlepagetrue
+    %
+    % Most title ``pages'' are actually two pages long, with space
+    % at the top of the second.  We don't want the ragged left on the second.
+    \let\oldpage = \page
+    \def\page{%
+      \iffinishedtitlepage\else
+	 \finishtitlepage
+      \fi
+      \let\page = \oldpage
+      \page
+      \null
+    }%
+}
+
+\def\Etitlepage{%
+    \iffinishedtitlepage\else
+	\finishtitlepage
+    \fi
+    % It is important to do the page break before ending the group,
+    % because the headline and footline are only empty inside the group.
+    % If we use the new definition of \page, we always get a blank page
+    % after the title page, which we certainly don't want.
+    \oldpage
+  \endgroup
+  %
+  % Need this before the \...aftertitlepage checks so that if they are
+  % in effect the toc pages will come out with page numbers.
+  \HEADINGSon
+  %
+  % If they want short, they certainly want long too.
+  \ifsetshortcontentsaftertitlepage
+    \shortcontents
+    \contents
+    \global\let\shortcontents = \relax
+    \global\let\contents = \relax
+  \fi
+  %
+  \ifsetcontentsaftertitlepage
+    \contents
+    \global\let\contents = \relax
+    \global\let\shortcontents = \relax
+  \fi
+}
+
+\def\finishtitlepage{%
+  \vskip4pt \hrule height 2pt width \hsize
+  \vskip\titlepagebottomglue
+  \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+		\let\tt=\authortt}
+
+\parseargdef\title{%
+  \checkenv\titlepage
+  \leftline{\titlefonts\rm #1}
+  % print a rule at the page bottom also.
+  \finishedtitlepagefalse
+  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+  \checkenv\titlepage
+  {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+  \def\temp{\quotation}%
+  \ifx\thisenv\temp
+    \def\quotationauthor{#1}% printed in \Equotation.
+  \else
+    \checkenv\titlepage
+    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+    {\authorfont \leftline{#1}}%
+  \fi
+}
+
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline    % headline on even pages
+\newtoks\oddheadline     % headline on odd pages
+\newtoks\evenfootline    % footline on even pages
+\newtoks\oddfootline     % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\pageheight by -\baselineskip
+  \global\advance\vsize by -\baselineskip
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{%
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+\fi
+
+% @settitle line...  specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemindicate{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  However, if
+    % what follows is an environment such as @example, there will be no
+    % \parskip glue; then the negative vskip we just inserted would
+    % cause the example and the item to crash together.  So we use this
+    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+    % \parskip glue after all.  Section titles are handled this way also.
+    % 
+    \penalty 10001
+    \endgroup
+    \itemxneedsnegativevskipfalse
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.
+    \noindent
+    % Do this with kerns and \unhbox so that if there is a footnote in
+    % the item text, it can migrate to the main vertical list and
+    % eventually be printed.
+    \nobreak\kern-\tableindent
+    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+    \unhbox0
+    \nobreak\kern\dimen0
+    \endgroup
+    \itemxneedsnegativevskiptrue
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+  \let\itemindex\gobble
+  \tablecheck{table}%
+}
+\envdef\ftable{%
+  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+  \tablecheck{ftable}%
+}
+\envdef\vtable{%
+  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+  \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+  \ifnum \the\catcode`\^^M=\active
+    \endgroup
+    \errmessage{This command won't work in this context; perhaps the problem is
+      that we are \inenvironment\thisenv}%
+    \def\next{\doignore{#1}}%
+  \else
+    \let\next\tablex
+  \fi
+  \next
+}
+\def\tablex#1{%
+  \def\itemindicate{#1}%
+  \parsearg\tabley
+}
+\def\tabley#1{%
+  {%
+    \makevalueexpandable
+    \edef\temp{\noexpand\tablez #1\space\space\space}%
+    \expandafter
+  }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+  \aboveenvbreak
+  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+  \ifnum 0#2>0 \tableindent=#2\mil \fi
+  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+  \itemmax=\tableindent
+  \advance \itemmax by -\itemmargin
+  \advance \leftskip by \tableindent
+  \exdentamount=\tableindent
+  \parindent = 0pt
+  \parskip = \smallskipamount
+  \ifdim \parskip=0pt \parskip=2pt \fi
+  \let\item = \internalBitem
+  \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+  \aboveenvbreak
+  \itemmax=\itemindent
+  \advance\itemmax by -\itemmargin
+  \advance\leftskip by \itemindent
+  \exdentamount=\itemindent
+  \parindent=0pt
+  \parskip=\smallskipamount
+  \ifdim\parskip=0pt \parskip=2pt \fi
+  \def\itemcontents{#1}%
+  % @itemize with no arg is equivalent to @itemize @bullet.
+  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+  \advance\itemno by 1  % for enumerations
+  {\let\par=\endgraf \smallbreak}% reasonable place to break
+  {%
+   % If the document has an @itemize directly after a section title, a
+   % \nobreak will be last on the list, and \sectionheading will have
+   % done a \vskip-\parskip.  In that case, we don't want to zero
+   % parskip, or the item text will crash with the heading.  On the
+   % other hand, when there is normal text preceding the item (as there
+   % usually is), we do want to zero parskip, or there would be too much
+   % space.  In that case, we won't have a \nobreak before.  At least
+   % that's the theory.
+   \ifnum\lastpenalty<10000 \parskip=0in \fi
+   \noindent
+   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+   \vadjust{\penalty 1200}}% not good to break after first line of item.
+  \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    %
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble.  Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+%   @multitable @columnfractions .25 .3 .45
+%   @item ...
+%
+%   Numbers following @columnfractions are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item
+%   first col stuff
+%   @tab
+%   second col stuff
+%   @tab
+%   third col
+%   @item first col stuff @tab second col stuff
+%   @tab Many paragraphs of text may be used in any column.
+%
+%         They will wrap at the width determined by the template.
+%   @item@tab@tab This will be in third column.
+%   @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+%                                                            to baseline.
+%   0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1.  We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+  \global\advance\colcount by 1
+  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+  \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+  \def\firstarg{#1}%
+  \ifx\firstarg\xendsetuptable
+    \let\go = \relax
+  \else
+    \ifx\firstarg\xcolumnfractions
+      \global\setpercenttrue
+    \else
+      \ifsetpercent
+         \let\go\pickupwholefraction
+      \else
+         \global\advance\colcount by 1
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
+         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \fi
+    \fi
+    \ifx\go\pickupwholefraction
+      % Put the argument back for the \pickupwholefraction call, so
+      % we'll always have a period there to be parsed.
+      \def\go{\pickupwholefraction#1}%
+    \else
+      \let\go = \setuptable
+    \fi%
+  \fi
+  \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry.  Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp.  But then the space in a template
+% line is not enough.  That is bad.  So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+%					--karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab  % insert after every tab.
+%
+\envdef\multitable{%
+  \vskip\parskip
+  \startsavinginserts
+  %
+  % @item within a multitable starts a normal row.
+  % We use \def instead of \let so that if one of the multitable entries
+  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+  % \endtemplate) expanding \doitemize.
+  \def\item{\crcr}%
+  %
+  \tolerance=9500
+  \hbadness=9500
+  \setmultitablespacing
+  \parskip=\multitableparskip
+  \parindent=\multitableparindent
+  \overfullrule=0pt
+  \global\colcount=0
+  %
+  \everycr = {%
+    \noalign{%
+      \global\everytab={}%
+      \global\colcount=0 % Reset the column counter.
+      % Check for saved footnotes, etc.
+      \checkinserts
+      % Keeps underfull box messages off when table breaks over pages.
+      %\filbreak
+	% Maybe so, but it also creates really weird page breaks when the
+	% table breaks over pages. Wouldn't \vfil be better?  Wait until the
+	% problem manifests itself, so it can be fixed for real --karl.
+    }%
+  }%
+  %
+  \parsearg\domultitable
+}
+\def\domultitable#1{%
+  % To parse everything between @multitable and @item:
+  \setuptable#1 \endsetuptable
+  %
+  % This preamble sets up a generic column definition, which will
+  % be used as many times as user calls for columns.
+  % \vtop will set a single line and will also let text wrap and
+  % continue for many paragraphs if desired.
+  \halign\bgroup &%
+    \global\advance\colcount by 1
+    \multistrut
+    \vtop{%
+      % Use the current \colcount to find the correct column width:
+      \hsize=\expandafter\csname col\the\colcount\endcsname
+      %
+      % In order to keep entries from bumping into each other
+      % we will add a \leftskip of \multitablecolspace to all columns after
+      % the first one.
+      %
+      % If a template has been used, we will add \multitablecolspace
+      % to the width of each template entry.
+      %
+      % If the user has set preamble in terms of percent of \hsize we will
+      % use that dimension as the width of the column, and the \leftskip
+      % will keep entries from bumping into each other.  Table will start at
+      % left margin and final column will justify at right margin.
+      %
+      % Make sure we don't inherit \rightskip from the outer environment.
+      \rightskip=0pt
+      \ifnum\colcount=1
+	% The first column will be indented with the surrounding text.
+	\advance\hsize by\leftskip
+      \else
+	\ifsetpercent \else
+	  % If user has not set preamble in terms of percent of \hsize
+	  % we will advance \hsize by \multitablecolspace.
+	  \advance\hsize by \multitablecolspace
+	\fi
+       % In either case we will make \leftskip=\multitablecolspace:
+      \leftskip=\multitablecolspace
+      \fi
+      % Ignoring space at the beginning and end avoids an occasional spurious
+      % blank line, when TeX decides to break the line at the space before the
+      % box from the multistrut, so the strut ends up on a line by itself.
+      % For example:
+      % @multitable @columnfractions .11 .89
+      % @item @code{#}
+      % @tab Legal holiday which is valid in major parts of the whole country.
+      % Is automatically provided with highlighting sequences respectively
+      % marking characters.
+      \noindent\ignorespaces##\unskip\multistrut
+    }\cr
+}
+\def\Emultitable{%
+  \crcr
+  \egroup % end the \halign
+  \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+  \def\multistrut{\strut}% just use the standard line spacing
+  %
+  % Compute \multitablelinespace (if not defined by user) for use in
+  % \multitableparskip calculation.  We used define \multistrut based on
+  % this, but (ironically) that caused the spacing to be off.
+  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%%        If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed.  They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested.  But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+  \expandafter\let\csname #1\endcsname = \relax
+  \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+  % Scan in ``verbatim'' mode:
+  \catcode`\@ = \other
+  \catcode`\{ = \other
+  \catcode`\} = \other
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \spaceisspace
+  %
+  % Count number of #1's that we've seen.
+  \doignorecount = 0
+  %
+  % Swallow text until we reach the matching `@end #1'.
+  \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+  \obeylines %
+  %
+  \gdef\dodoignore#1{%
+    % #1 contains the command name as a string, e.g., `ifinfo'.
+    %
+    % Define a command to find the next `@end #1', which must be on a line
+    % by itself.
+    \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}%
+    % And this command to find another #1 command, at the beginning of a
+    % line.  (Otherwise, we would consider a line `@c @ifset', for
+    % example, to count as an @ifset for nesting.)
+    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+    %
+    % And now expand that command.
+    \obeylines %
+    \doignoretext ^^M%
+  }%
+}
+
+\def\doignoreyyy#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty			% Nothing found.
+    \let\next\doignoretextzzz
+  \else					% Found a nested condition, ...
+    \advance\doignorecount by 1
+    \let\next\doignoretextyyy		% ..., look for another.
+    % If we're here, #1 ends with ^^M\ifinfo (for example).
+  \fi
+  \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+  \ifnum\doignorecount = 0	% We have just found the outermost @end.
+    \let\next\enddoignore
+  \else				% Still inside a nested condition.
+    \advance\doignorecount by -1
+    \let\next\doignoretext      % Look for the next @end.
+  \fi
+  \next
+}
+
+% Finish off ignored text.
+\def\enddoignore{\endgroup\ignorespaces}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  {%
+    \makevalueexpandable
+    \def\temp{#2}%
+    \edef\next{\gdef\makecsname{SET#1}}%
+    \ifx\temp\empty
+      \next{}%
+    \else
+      \setzzz#2\endsetzzz
+    \fi
+  }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+  {%
+    \makevalueexpandable
+    \global\expandafter\let\csname SET#1\endcsname=\relax
+  }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+  \catcode`\- = \active \catcode`\_ = \active
+  %
+  \gdef\makevalueexpandable{%
+    \let\value = \expandablevalue
+    % We don't want these characters active, ...
+    \catcode`\-=\other \catcode`\_=\other
+    % ..., but we might end up with active ones in the argument if
+    % we're called from @code, as @code{@value{foo-bar_}}, though.
+    % So \let them to their normal equivalents.
+    \let-\realdash \let_\normalunderscore
+  }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file.  This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+  {%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname SET#2\endcsname\relax
+      #1% If not set, redefine \next.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index.  The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
+    \noexpand\doindex{#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%
+    \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+  % Only do \closeout if we haven't already done it, else we'll end up
+  % closing the target index.
+  \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+    % The \closeout helps reduce unnecessary open files; the limit on the
+    % Acorn RISC OS is a mere 16 files.
+    \expandafter\closeout\csname#2indfile\endcsname
+    \expandafter\let\csname\donesynindex#2\endcsname = 1
+  \fi
+  % redefine \fooindfile:
+  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+  \expandafter\let\csname#2indfile\endcsname=\temp
+  % redefine \fooindex:
+  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+%  and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+  \escapechar = `\\     % use backslash in output files.
+  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+  \def\ {\realbackslash\space }%
+  % Need these in case \tex is in effect and \{ is a \delimiter again.
+  % But can't use \lbracecmd and \rbracecmd because texindex assumes
+  % braces and backslashes are used only as delimiters.
+  \let\{ = \mylbrace
+  \let\} = \myrbrace
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% For the aux and toc files, @ is the escape character.  So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files).  When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+  \def\@{@@}%
+  \def\ {@ }%
+  \let\{ = \lbraceatcmd
+  \let\} = \rbraceatcmd
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% Called from \indexdummies and \atdummies.
+%
+\def\commondummies{%
+  %
+  % \definedummyword defines \#1 as \string\#1\space, thus effectively
+  % preventing its expansion.  This is used only for control% words,
+  % not control letters, because the \space would be incorrect for
+  % control characters, but is needed to separate the control word
+  % from whatever follows.
+  %
+  % For control letters, we have \definedummyletter, which omits the
+  % space.
+  %
+  % These can be used both for control words that take an argument and
+  % those that do not.  If it is followed by {arg} in the input, then
+  % that will dutifully get written to the index (or wherever).
+  %
+  \def\definedummyword  ##1{\def##1{\string##1\space}}%
+  \def\definedummyletter##1{\def##1{\string##1}}%
+  \let\definedummyaccent\definedummyletter
+  %
+  \commondummiesnofonts
+  %
+  \definedummyletter\_%
+  %
+  % Non-English letters.
+  \definedummyword\AA
+  \definedummyword\AE
+  \definedummyword\L
+  \definedummyword\OE
+  \definedummyword\O
+  \definedummyword\aa
+  \definedummyword\ae
+  \definedummyword\l
+  \definedummyword\oe
+  \definedummyword\o
+  \definedummyword\ss
+  \definedummyword\exclamdown
+  \definedummyword\questiondown
+  \definedummyword\ordf
+  \definedummyword\ordm
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword\bf
+  \definedummyword\gtr
+  \definedummyword\hat
+  \definedummyword\less
+  \definedummyword\sf
+  \definedummyword\sl
+  \definedummyword\tclose
+  \definedummyword\tt
+  %
+  \definedummyword\LaTeX
+  \definedummyword\TeX
+  %
+  % Assorted special characters.
+  \definedummyword\bullet
+  \definedummyword\comma
+  \definedummyword\copyright
+  \definedummyword\registeredsymbol
+  \definedummyword\dots
+  \definedummyword\enddots
+  \definedummyword\equiv
+  \definedummyword\error
+  \definedummyword\euro
+  \definedummyword\expansion
+  \definedummyword\minus
+  \definedummyword\pounds
+  \definedummyword\point
+  \definedummyword\print
+  \definedummyword\result
+  %
+  % We want to disable all macros so that they are not expanded by \write.
+  \macrolist
+  %
+  \normalturnoffactive
+  %
+  % Handle some cases of @value -- where it does not contain any
+  % (non-fully-expandable) commands.
+  \makevalueexpandable
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+% Better have this without active chars.
+{
+  \catcode`\~=\other
+  \gdef\commondummiesnofonts{%
+    % Control letters and accents.
+    \definedummyletter\!%
+    \definedummyaccent\"%
+    \definedummyaccent\'%
+    \definedummyletter\*%
+    \definedummyaccent\,%
+    \definedummyletter\.%
+    \definedummyletter\/%
+    \definedummyletter\:%
+    \definedummyaccent\=%
+    \definedummyletter\?%
+    \definedummyaccent\^%
+    \definedummyaccent\`%
+    \definedummyaccent\~%
+    \definedummyword\u
+    \definedummyword\v
+    \definedummyword\H
+    \definedummyword\dotaccent
+    \definedummyword\ringaccent
+    \definedummyword\tieaccent
+    \definedummyword\ubaraccent
+    \definedummyword\udotaccent
+    \definedummyword\dotless
+    %
+    % Texinfo font commands.
+    \definedummyword\b
+    \definedummyword\i
+    \definedummyword\r
+    \definedummyword\sc
+    \definedummyword\t
+    %
+    % Commands that take arguments.
+    \definedummyword\acronym
+    \definedummyword\cite
+    \definedummyword\code
+    \definedummyword\command
+    \definedummyword\dfn
+    \definedummyword\emph
+    \definedummyword\env
+    \definedummyword\file
+    \definedummyword\kbd
+    \definedummyword\key
+    \definedummyword\math
+    \definedummyword\option
+    \definedummyword\samp
+    \definedummyword\strong
+    \definedummyword\tie
+    \definedummyword\uref
+    \definedummyword\url
+    \definedummyword\var
+    \definedummyword\verb
+    \definedummyword\w
+  }
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+  % Accent commands should become @asis.
+  \def\definedummyaccent##1{\let##1\asis}%
+  % We can just ignore other control letters.
+  \def\definedummyletter##1{\let##1\empty}%
+  % Hopefully, all control words can become @asis.
+  \let\definedummyword\definedummyaccent
+  %
+  \commondummiesnofonts
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  \def\ { }%
+  \def\@{@}%
+  % how to handle braces?
+  \def\_{\normalunderscore}%
+  %
+  % Non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\o{o}%
+  \def\ss{ss}%
+  \def\exclamdown{!}%
+  \def\questiondown{?}%
+  \def\ordf{a}%
+  \def\ordm{o}%
+  %
+  \def\LaTeX{LaTeX}%
+  \def\TeX{TeX}%
+  %
+  % Assorted special characters.
+  % (The following {} will end up in the sort string, but that's ok.)
+  \def\bullet{bullet}%
+  \def\comma{,}%
+  \def\copyright{copyright}%
+  \def\registeredsymbol{R}%
+  \def\dots{...}%
+  \def\enddots{...}%
+  \def\equiv{==}%
+  \def\error{error}%
+  \def\euro{euro}%
+  \def\expansion{==>}%
+  \def\minus{-}%
+  \def\pounds{pounds}%
+  \def\point{.}%
+  \def\print{-|}%
+  \def\result{=>}%
+  %
+  % We need to get rid of all macros, leaving only the arguments (if present).
+  % Of course this is not nearly correct, but it is the best we can do for now.
+  % makeinfo does not expand macros in the argument to @deffn, which ends up
+  % writing an index entry, and texindex isn't prepared for an index sort entry
+  % that starts with \.
+  % 
+  % Since macro invocations are followed by braces, we can just redefine them
+  % to take a single TeX argument.  The case of a macro invocation that
+  % goes to end-of-line is not handled.
+  % 
+  \macrolist
+}
+
+\let\indexbackslash=0  %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+  \iflinks
+  {%
+    % Store the main index entry text (including the third arg).
+    \toks0 = {#2}%
+    % If third arg is present, precede it with a space.
+    \def\thirdarg{#3}%
+    \ifx\thirdarg\empty \else
+      \toks0 = \expandafter{\the\toks0 \space #3}%
+    \fi
+    %
+    \edef\writeto{\csname#1indfile\endcsname}%
+    %
+    \ifvmode
+      \dosubindsanitize
+    \else
+      \dosubindwrite
+    \fi
+  }%
+  \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+  % Put the index entry in the margin if desired.
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+  \fi
+  %
+  % Remember, we are within a group.
+  \indexdummies % Must do this here, since \bf, etc expand at this stage
+  \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+      % so it will be output as is; and it will print as backslash.
+  %
+  % Process the index entry with all font commands turned off, to
+  % get the string to sort by.
+  {\indexnofonts
+   \edef\temp{\the\toks0}% need full expansion
+   \xdef\indexsorttmp{\temp}%
+  }%
+  %
+  % Set up the complete index entry, with both the sort key and
+  % the original text, including any font commands.  We write
+  % three arguments to \entry to the .?? file (four in the
+  % subentry case), texindex reduces to two when writing the .??s
+  % sorted result.
+  \edef\temp{%
+    \write\writeto{%
+      \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+  }%
+  \temp
+}
+
+% Take care of unwanted page breaks:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again.  Otherwise, the whatsit generated by the
+% \write will make \lastskip zero.  The result is that sequences
+% like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode.  We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip.  \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip.  The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+% ..., ready, GO:
+%
+\def\dosubindsanitize{%
+  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+  \skip0 = \lastskip
+  \edef\lastskipmacro{\the\lastskip}%
+  \count255 = \lastpenalty
+  %
+  % If \lastskip is nonzero, that means the last item was a
+  % skip.  And since a skip is discardable, that means this
+  % -\skip0 glue we're inserting is preceded by a
+  % non-discardable item, therefore it is not a potential
+  % breakpoint, therefore no \nobreak needed.
+  \ifx\lastskipmacro\zeroskipmacro
+  \else
+    \vskip-\skip0
+  \fi
+  %
+  \dosubindwrite
+  %
+  \ifx\lastskipmacro\zeroskipmacro
+    % If \lastskip was zero, perhaps the last item was a penalty, and
+    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
+    % to re-insert the same penalty (values >10000 are used for various
+    % signals); since we just inserted a non-discardable item, any
+    % following glue (such as a \parskip) would be a breakpoint.  For example:
+    % 
+    %   @deffn deffn-whatever
+    %   @vindex index-whatever
+    %   Description.
+    % would allow a break between the index-whatever whatsit
+    % and the "Description." paragraph.
+    \ifnum\count255>9999 \penalty\count255 \fi
+  \else
+    % On the other hand, if we had a nonzero \lastskip,
+    % this make-up glue would be preceded by a non-discardable item
+    % (the whatsit from the \write), so we must insert a \nobreak.
+    \nobreak\vskip\skip0
+  \fi
+}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+  \dobreak \chapheadingskip{10000}%
+  %
+  \smallfonts \rm
+  \tolerance = 9500
+  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+  %
+  % See if the index file exists and is nonempty.
+  % Change catcode of @ here so that if the index file contains
+  % \initial {@}
+  % as its first line, TeX doesn't complain about mismatched braces
+  % (because it thinks @} is a control sequence).
+  \catcode`\@ = 11
+  \openin 1 \jobname.#1s
+  \ifeof 1
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    \putwordIndexNonexistent
+  \else
+    %
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \temp
+    \ifeof 1
+      \putwordIndexIsEmpty
+    \else
+      % Index files are almost Texinfo source, but we use \ as the escape
+      % character.  It would be better to use @, but that's too big a change
+      % to make right now.
+      \def\indexbackslash{\backslashcurfont}%
+      \catcode`\\ = 0
+      \escapechar = `\\
+      \begindoublecolumns
+      \input \jobname.#1s
+      \enddoublecolumns
+    \fi
+  \fi
+  \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+  % Some minor font changes for the special characters.
+  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+  %
+  % Remove any glue we may have, we'll be inserting our own.
+  \removelastskip
+  %
+  % We like breaks before the index initials, so insert a bonus.
+  \nobreak
+  \vskip 0pt plus 3\baselineskip
+  \penalty 0
+  \vskip 0pt plus -3\baselineskip
+  %
+  % Typeset the initial.  Making this add up to a whole number of
+  % baselineskips increases the chance of the dots lining up from column
+  % to column.  It still won't often be perfect, because of the stretch
+  % we need before each entry, but it's better.
+  %
+  % No shrink because it confuses \balancecolumns.
+  \vskip 1.67\baselineskip plus .5\baselineskip
+  \leftline{\secbf #1}%
+  % Do our best not to break after the initial.
+  \nobreak
+  \vskip .33\baselineskip plus .1\baselineskip
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin.  It is used for index
+% and table of contents entries.  The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+%	\def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active.  This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+%                                 --kasal, 21nov03
+\def\entry{%
+  \begingroup
+    %
+    % Start a new paragraph if necessary, so our assignments below can't
+    % affect previous text.
+    \par
+    %
+    % Do not fill out the last line with white space.
+    \parfillskip = 0in
+    %
+    % No extra space above this paragraph.
+    \parskip = 0in
+    %
+    % Do not prefer a separate line ending with a hyphen to fewer lines.
+    \finalhyphendemerits = 0
+    %
+    % \hangindent is only relevant when the entry text and page number
+    % don't both fit on one line.  In that case, bob suggests starting the
+    % dots pretty far over on the line.  Unfortunately, a large
+    % indentation looks wrong when the entry text itself is broken across
+    % lines.  So we use a small indentation and put up with long leaders.
+    %
+    % \hangafter is reset to 1 (which is the value we want) at the start
+    % of each paragraph, so we need not do anything with that.
+    \hangindent = 2em
+    %
+    % When the entry text needs to be broken, just fill out the first line
+    % with blank space.
+    \rightskip = 0pt plus1fil
+    %
+    % A bit of stretch before each entry for the benefit of balancing
+    % columns.
+    \vskip 0pt plus1pt
+    %
+    % Swallow the left brace of the text (first parameter):
+    \afterassignment\doentry
+    \let\temp =
+}
+\def\doentry{%
+    \bgroup % Instead of the swallowed brace.
+      \noindent
+      \aftergroup\finishentry
+      % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+    % #1 is the page number.
+    %
+    % The following is kludged to not output a line of dots in the index if
+    % there are no page numbers.  The next person who breaks this will be
+    % cursed by a Unix daemon.
+    \def\tempa{{\rm }}%
+    \def\tempb{#1}%
+    \edef\tempc{\tempa}%
+    \edef\tempd{\tempb}%
+    \ifx\tempc\tempd
+      \ %
+    \else
+      %
+      % If we must, put the page number on a line of its own, and fill out
+      % this line with blank space.  (The \hfil is overwhelmed with the
+      % fill leaders glue in \indexdotfill if the page number does fit.)
+      \hfil\penalty50
+      \null\nobreak\indexdotfill % Have leaders before the page number.
+      %
+      % The `\ ' here is removed by the implicit \unskip that TeX does as
+      % part of (the primitive) \par.  Without it, a spurious underfull
+      % \hbox ensues.
+      \ifpdf
+	\pdfgettoks#1.%
+	\ \the\toksA
+      \else
+	\ #1%
+      \fi
+    \fi
+    \par
+  \endgroup
+}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+  \parfillskip=0in
+  \parskip=0in
+  \hangindent=1in
+  \hangafter=1
+  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+  \ifpdf
+    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+  \else
+    #2
+  \fi
+  \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+  % Grab any single-column material above us.
+  \output = {%
+    %
+    % Here is a possibility not foreseen in manmac: if we accumulate a
+    % whole lot of material, we might end up calling this \output
+    % routine twice in a row (see the doublecol-lose test, which is
+    % essentially a couple of indexes with @setchapternewpage off).  In
+    % that case we just ship out what is in \partialpage with the normal
+    % output routine.  Generally, \partialpage will be empty when this
+    % runs and this will be a no-op.  See the indexspread.tex test case.
+    \ifvoid\partialpage \else
+      \onepageout{\pagecontents\partialpage}%
+    \fi
+    %
+    \global\setbox\partialpage = \vbox{%
+      % Unvbox the main output page.
+      \unvbox\PAGE
+      \kern-\topskip \kern\baselineskip
+    }%
+  }%
+  \eject % run that output routine to set \partialpage
+  %
+  % Use the double-column output routine for subsequent pages.
+  \output = {\doublecolumnout}%
+  %
+  % Change the page size parameters.  We could do this once outside this
+  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+  % format, but then we repeat the same computation.  Repeating a couple
+  % of assignments once per index is clearly meaningless for the
+  % execution time, so we may as well do it in one place.
+  %
+  % First we halve the line length, less a little for the gutter between
+  % the columns.  We compute the gutter based on the line length, so it
+  % changes automatically with the paper format.  The magic constant
+  % below is chosen so that the gutter has the same value (well, +-<1pt)
+  % as it did when we hard-coded it.
+  %
+  % We put the result in a separate register, \doublecolumhsize, so we
+  % can restore it in \pagesofar, after \hsize itself has (potentially)
+  % been clobbered.
+  %
+  \doublecolumnhsize = \hsize
+    \advance\doublecolumnhsize by -.04154\hsize
+    \divide\doublecolumnhsize by 2
+  \hsize = \doublecolumnhsize
+  %
+  % Double the \vsize as well.  (We don't need a separate register here,
+  % since nobody clobbers \vsize.)
+  \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \dimen@ = \vsize
+  \divide\dimen@ by 2
+  \advance\dimen@ by -\ht\partialpage
+  %
+  % box0 will be the left-hand column, box2 the right.
+  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+  \onepageout\pagesofar
+  \unvbox255
+  \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+  \unvbox\partialpage
+  %
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize
+  \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+  \output = {%
+    % Split the last of the double-column material.  Leave it on the
+    % current page, no automatic page break.
+    \balancecolumns
+    %
+    % If we end up splitting too much material for the current page,
+    % though, there will be another page break right after this \output
+    % invocation ends.  Having called \balancecolumns once, we do not
+    % want to call it again.  Therefore, reset \output to its normal
+    % definition right away.  (We hope \balancecolumns will never be
+    % called on to balance too much material, but if it is, this makes
+    % the output somewhat more palatable.)
+    \global\output = {\onepageout{\pagecontents\PAGE}}%
+  }%
+  \eject
+  \endgroup % started in \begindoublecolumns
+  %
+  % \pagegoal was set to the doubled \vsize above, since we restarted
+  % the current page.  We're now back to normal single-column
+  % typesetting, so reset \pagegoal to the normal \vsize (after the
+  % \endgroup where \vsize got restored).
+  \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+  \dimen@ = \ht0
+  \advance\dimen@ by \topskip
+  \advance\dimen@ by-\baselineskip
+  \divide\dimen@ by 2 % target to split to
+  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+  \splittopskip = \topskip
+  % Loop until we get a decent breakpoint.
+  {%
+    \vbadness = 10000
+    \loop
+      \global\setbox3 = \copy0
+      \global\setbox1 = \vsplit3 to \dimen@
+    \ifdim\ht3>\dimen@
+      \global\advance\dimen@ by 1pt
+    \repeat
+  }%
+  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+  \setbox0=\vbox to\dimen@{\unvbox1}%
+  \setbox2=\vbox to\dimen@{\unvbox3}%
+  %
+  \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course.  But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number".  We avoid collisions with chapter
+% numbers by starting them at 10000.  (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno        \secno=0
+\newcount\subsecno     \subsecno=0
+\newcount\subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno  \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+  \ifnum\appendixno=`A A%
+  \else\ifnum\appendixno=`B B%
+  \else\ifnum\appendixno=`C C%
+  \else\ifnum\appendixno=`D D%
+  \else\ifnum\appendixno=`E E%
+  \else\ifnum\appendixno=`F F%
+  \else\ifnum\appendixno=`G G%
+  \else\ifnum\appendixno=`H H%
+  \else\ifnum\appendixno=`I I%
+  \else\ifnum\appendixno=`J J%
+  \else\ifnum\appendixno=`K K%
+  \else\ifnum\appendixno=`L L%
+  \else\ifnum\appendixno=`M M%
+  \else\ifnum\appendixno=`N N%
+  \else\ifnum\appendixno=`O O%
+  \else\ifnum\appendixno=`P P%
+  \else\ifnum\appendixno=`Q Q%
+  \else\ifnum\appendixno=`R R%
+  \else\ifnum\appendixno=`S S%
+  \else\ifnum\appendixno=`T T%
+  \else\ifnum\appendixno=`U U%
+  \else\ifnum\appendixno=`V V%
+  \else\ifnum\appendixno=`W W%
+  \else\ifnum\appendixno=`X X%
+  \else\ifnum\appendixno=`Y Y%
+  \else\ifnum\appendixno=`Z Z%
+  % The \the is necessary, despite appearances, because \appendixletter is
+  % expanded while writing the .toc file.  \char\appendixno is not
+  % expandable, thus it is written literally, thus all appendixes come out
+  % with the same letter (or @) in the toc without it.
+  \else\char\the\appendixno
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it.  @section does likewise.
+% However, they are not reliable, because we don't use marks.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+  % Compute the abs. sec. level:
+  \absseclevel=#2
+  \advance\absseclevel by \secbase
+  % Make sure \absseclevel doesn't fall outside the range:
+  \ifnum \absseclevel < 0
+    \absseclevel = 0
+  \else
+    \ifnum \absseclevel > 3
+      \absseclevel = 3
+    \fi
+  \fi
+  % The heading type:
+  \def\headtype{#1}%
+  \if \headtype U%
+    \ifnum \absseclevel < \unmlevel
+      \chardef\unmlevel = \absseclevel
+    \fi
+  \else
+    % Check for appendix sections:
+    \ifnum \absseclevel = 0
+      \edef\chapheadtype{\headtype}%
+    \else
+      \if \headtype A\if \chapheadtype N%
+	\errmessage{@appendix... within a non-appendix chapter}%
+      \fi\fi
+    \fi
+    % Check for numbered within unnumbered:
+    \ifnum \absseclevel > \unmlevel
+      \def\headtype{U}%
+    \else
+      \chardef\unmlevel = 3
+    \fi
+  \fi
+  % Now print the heading:
+  \if \headtype U%
+    \ifcase\absseclevel
+	\unnumberedzzz{#3}%
+    \or \unnumberedseczzz{#3}%
+    \or \unnumberedsubseczzz{#3}%
+    \or \unnumberedsubsubseczzz{#3}%
+    \fi
+  \else
+    \if \headtype A%
+      \ifcase\absseclevel
+	  \appendixzzz{#3}%
+      \or \appendixsectionzzz{#3}%
+      \or \appendixsubseczzz{#3}%
+      \or \appendixsubsubseczzz{#3}%
+      \fi
+    \else
+      \ifcase\absseclevel
+	  \chapterzzz{#3}%
+      \or \seczzz{#3}%
+      \or \numberedsubseczzz{#3}%
+      \or \numberedsubsubseczzz{#3}%
+      \fi
+    \fi
+  \fi
+  \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v.  By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+  % section resetting is \global in case the chapter is in a group, such
+  % as an @include file.
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\chapno by 1
+  %
+  % Used for \float.
+  \gdef\chaplevelprefix{\the\chapno.}%
+  \resetallfloatnos
+  %
+  \message{\putwordChapter\space \the\chapno}%
+  %
+  % Write the actual heading.
+  \chapmacro{#1}{Ynumbered}{\the\chapno}%
+  %
+  % So @section and the like are numbered underneath this chapter.
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\appendixno by 1
+  \gdef\chaplevelprefix{\appendixletter.}%
+  \resetallfloatnos
+  %
+  \def\appendixnum{\putwordAppendix\space \appendixletter}%
+  \message{\appendixnum}%
+  %
+  \chapmacro{#1}{Yappendix}{\appendixletter}%
+  %
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\unnumberedno by 1
+  %
+  % Since an unnumbered has no number, no prefix for figures.
+  \global\let\chaplevelprefix = \empty
+  \resetallfloatnos
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}%
+  \message{(\the\toks0)}%
+  %
+  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+  %
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+  % Well, we could do the following in a group, but that would break
+  % an assumption that \chapmacro is called at the outermost level.
+  % Thus we are safer this way:		--kasal, 24feb04
+  \let\centerparametersmaybe = \centerparameters
+  \unnmhead0{#1}%
+  \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynumbered}%
+                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+%       1) We use \vbox rather than the earlier \line to permit
+%          overlong headings to fold.
+%       2) \hyphenpenalty is set to 10000 because hyphenation in a
+%          heading is obnoxious; this forbids it.
+%       3) Likewise, headings look best if no \parindent is used, and
+%          if justification is not attempted.  Hence \raggedright.
+
+
+\def\majorheading{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}%
+  \bigskip \par\penalty 200\relax
+  \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
+  \pchapsepmacro
+  {%
+    \chapfonts \rm
+    %
+    % Have to define \thissection before calling \donoderef, because the
+    % xref code eventually uses it.  On the other hand, it has to be called
+    % after \pchapsepmacro, or the headline will change too soon.
+    \gdef\thissection{#1}%
+    \gdef\thischaptername{#1}%
+    %
+    % Only insert the separating space if we have a chapter/appendix
+    % number, and don't print the unnumbered ``number''.
+    \def\temptype{#2}%
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unnchap}%
+      \gdef\thischapter{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+      \def\toctype{omit}%
+      \gdef\thischapter{}%
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+      \def\toctype{app}%
+      % We don't substitute the actual chapter name into \thischapter
+      % because we don't want its macros evaluated now.  And we don't
+      % use \thissection because that changes with each section.
+      %
+      \xdef\thischapter{\putwordAppendix{} \appendixletter:
+                        \noexpand\thischaptername}%
+    \else
+      \setbox0 = \hbox{#3\enspace}%
+      \def\toctype{numchap}%
+      \xdef\thischapter{\putwordChapter{} \the\chapno:
+                        \noexpand\thischaptername}%
+    \fi\fi\fi
+    %
+    % Write the toc entry for this chapter.  Must come before the
+    % \donoderef, because we include the current node name in the toc
+    % entry, and \donoderef resets it to empty.
+    \writetocentry{\toctype}{#1}{#3}%
+    %
+    % For pdftex, we have to write out the node definition (aka, make
+    % the pdfdest) after any page break, but before the actual text has
+    % been typeset.  If the destination for the pdf outline is after the
+    % text, then jumping from the outline may wind up with the text not
+    % being visible, for instance under high magnification.
+    \donoderef{#2}%
+    %
+    % Typeset the actual heading.
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent=\wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
+  }%
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+  \advance\rightskip by 3\rightskip
+  \leftskip = \rightskip
+  \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt\raggedright
+                       \rm #1\hfill}}\bigskip \par\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt
+                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+\def\CHAPFopen{%
+  \global\let\chapmacro=\chfopen
+  \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.  These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\sectionheading#1#2#3#4{%
+  {%
+    % Switch to the right set of fonts.
+    \csname #2fonts\endcsname \rm
+    %
+    % Insert space above the heading.
+    \csname #2headingbreak\endcsname
+    %
+    % Only insert the space after the number if we have a section number.
+    \def\sectionlevel{#2}%
+    \def\temptype{#3}%
+    %
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unn}%
+      \gdef\thissection{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      % for @headings -- no section number, don't include in toc,
+      % and don't redefine \thissection.
+      \setbox0 = \hbox{}%
+      \def\toctype{omit}%
+      \let\sectionlevel=\empty
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{app}%
+      \gdef\thissection{#1}%
+    \else
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{num}%
+      \gdef\thissection{#1}%
+    \fi\fi\fi
+    %
+    % Write the toc entry (before \donoderef).  See comments in \chfplain.
+    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+    %
+    % Write the node reference (= pdf destination for pdftex).
+    % Again, see comments in \chfplain.
+    \donoderef{#3}%
+    %
+    % Output the actual section heading.
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent=\wd0  % zero if no section number
+          \unhbox0 #1}%
+  }%
+  % Add extra space after the heading -- half of whatever came above it.
+  % Don't allow stretch, though.
+  \kern .5 \csname #2headingskip\endcsname
+  %
+  % Do not let the kern be a potential breakpoint, as it would be if it
+  % was followed by glue.
+  \nobreak
+  %
+  % We'll almost certainly start a paragraph next, so don't let that
+  % glue accumulate.  (Not a breakpoint because it's preceded by a
+  % discardable item.)
+  \vskip-\parskip
+  % 
+  % This is purely so the last item on the list is a known \penalty >
+  % 10000.  This is so \startdefun can avoid allowing breakpoints after
+  % section headings.  Otherwise, it would insert a valid breakpoint between:
+  % 
+  %   @section sec-whatever
+  %   @deffn def-whatever
+  \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this.  The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything.  This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+  \edef\writetoctype{#1}%
+  \ifx\writetoctype\omitkeyword \else
+    \iftocfileopened\else
+      \immediate\openout\tocfile = \jobname.toc
+      \global\tocfileopenedtrue
+    \fi
+    %
+    \iflinks
+      {\atdummies
+       \edef\temp{%
+         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+       \temp
+      }
+    \fi
+  \fi
+  %
+  % Tell \shipout to create a pdf destination on each page, if we're
+  % writing pdf.  These are used in the table of contents.  We can't
+  % just write one on every page because the title pages are numbered
+  % 1 and 2 (the page numbers aren't printed), and so are the first
+  % two pages of the document.  Thus, we'd have two destinations named
+  % `1', and two named `2'.
+  \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care.  This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+% 
+\def\activecatcodes{%
+  \catcode`\"=\active
+  \catcode`\$=\active
+  \catcode`\<=\active
+  \catcode`\>=\active
+  \catcode`\\=\active
+  \catcode`\^=\active
+  \catcode`\_=\active
+  \catcode`\|=\active
+  \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+  \setupdatafile
+  \activecatcodes
+  \input \jobname.toc
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+  % If @setchapternewpage on, and @headings double, the contents should
+  % start on an odd page, unlike chapters.  Thus, we maintain
+  % \contentsalignmacro in parallel with \pagealignmacro.
+  % From: Torbjorn Granlund <tege@matematik.su.se>
+  \contentsalignmacro
+  \immediate\closeout\tocfile
+  %
+  % Don't need to put `Contents' or `Short Contents' in the headline.
+  % It is abundantly clear what they are.
+  \def\thischapter{}%
+  \chapmacro{#1}{Yomitfromtoc}{}%
+  %
+  \savepageno = \pageno
+  \begingroup                  % Set up to handle contents files properly.
+    \raggedbottom              % Worry more about breakpoints than the bottom.
+    \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+    %
+    % Roman numerals for page numbers.
+    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+  \startcontents{\putwordTOC}%
+    \openin 1 \jobname.toc
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+    \ifeof 1 \else
+      \pdfmakeoutlines
+    \fi
+    \closein 1
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+  \startcontents{\putwordShortTOC}%
+    %
+    \let\numchapentry = \shortchapentry
+    \let\appentry = \shortchapentry
+    \let\unnchapentry = \shortunnchapentry
+    % We want a true roman here for the page numbers.
+    \secfonts
+    \let\rm=\shortcontrm \let\bf=\shortcontbf
+    \let\sl=\shortcontsl \let\tt=\shortconttt
+    \rm
+    \hyphenpenalty = 10000
+    \advance\baselineskip by 1pt % Open it up a little.
+    \def\numsecentry##1##2##3##4{}
+    \let\appsecentry = \numsecentry
+    \let\unnsecentry = \numsecentry
+    \let\numsubsecentry = \numsecentry
+    \let\appsubsecentry = \numsecentry
+    \let\unnsubsecentry = \numsecentry
+    \let\numsubsubsecentry = \numsecentry
+    \let\appsubsubsecentry = \numsecentry
+    \let\unnsubsubsecentry = \numsecentry
+    \openin 1 \jobname.toc
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \closein 1
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  %
+  % We'd like to right-justify chapter numbers, but that looks strange
+  % with appendix letters.  And right-justifying numbers and
+  % left-justifying letters looks strange when there is less than 10
+  % chapters.  Have to read the whole toc once to know how many chapters
+  % there are before deciding ...
+  \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+  % We use M since it's probably the widest letter.
+  \setbox0 = \hbox{\putwordAppendix{} M}%
+  \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+   \begingroup
+     \chapentryfonts
+     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+   \endgroup
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+  \secentryfonts \leftskip=\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+  \subsecentryfonts \leftskip=2\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+  \subsubsecentryfonts \leftskip=3\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{%
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex    escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\envdef\tex{%
+  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+  \catcode `\%=14
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
+  \escapechar=`\\
+  %
+  \let\b=\ptexb
+  \let\bullet=\ptexbullet
+  \let\c=\ptexc
+  \let\,=\ptexcomma
+  \let\.=\ptexdot
+  \let\dots=\ptexdots
+  \let\equiv=\ptexequiv
+  \let\!=\ptexexclam
+  \let\i=\ptexi
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \let\{=\ptexlbrace
+  \let\+=\tabalign
+  \let\}=\ptexrbrace
+  \let\/=\ptexslash
+  \let\*=\ptexstar
+  \let\t=\ptext
+  \let\frenchspacing=\plainfrenchspacing
+  %
+  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+  \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty<10000 \penalty-50 \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+  \ifhmode\par\fi  % can't be in the midst of a paragraph.
+  \startsavinginserts
+  \lskip=\leftskip \rskip=\rightskip
+  \leftskip=0pt\rightskip=0pt % we want these *outside*.
+  \cartinner=\hsize \advance\cartinner by-\lskip
+  \advance\cartinner by-\rskip
+  \cartouter=\hsize
+  \advance\cartouter by 18.4pt	% allow for 3pt kerns on either
+				% side, and for 6pt waste from
+				% each corner char, and rule thickness
+  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+  % Flag to tell @lisp, etc., not to narrow margin.
+  \let\nonarrowing = t%
+  \vbox\bgroup
+      \baselineskip=0pt\parskip=0pt\lineskip=0pt
+      \carttop
+      \hbox\bgroup
+	  \hskip\lskip
+	  \vrule\kern3pt
+	  \vbox\bgroup
+	      \kern3pt
+	      \hsize=\cartinner
+	      \baselineskip=\normbskip
+	      \lineskip=\normlskip
+	      \parskip=\normpskip
+	      \vskip -\parskip
+	      \comment % For explanation, see the end of \def\group.
+}
+\def\Ecartouche{%
+              \ifhmode\par\fi
+	      \kern3pt
+	  \egroup
+	  \kern3pt\vrule
+	  \hskip\rskip
+      \egroup
+      \cartbot
+  \egroup
+  \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+  \aboveenvbreak
+  \hfuzz = 12pt % Don't be fussy
+  \sepspaces % Make spaces be word-separators rather than space tokens.
+  \let\par = \lisppar % don't ignore blank lines
+  \obeylines % each line of input is a line of output
+  \parskip = 0pt
+  \parindent = 0pt
+  \emergencystretch = 0pt % don't try to avoid overfull boxes
+  \ifx\nonarrowing\relax
+    \advance \leftskip by \lispnarrowing
+    \exdentamount=\lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+%    @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+  \ifx\SETdispenvsize\smallword
+    \smallexamplefonts \rm
+  \fi
+}
+\def\setsmalldispenv{%
+  \ifx\SETdispenvsize\nosmallword
+  \else
+    \smallexamplefonts \rm
+  \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+  \expandafter\let\csname E#1\endcsname \afterenvbreak
+  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+  \makedispenv{#1}{#3}
+  \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
+  \nonfillstart
+  \tt
+  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+  \gobble       % eat return
+}
+
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
+  \nonfillstart
+  \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \advance\leftskip by 0pt plus 1fill
+  \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.  We keep \parskip nonzero in general, since
+% we're doing normal filling.  So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\envdef\quotation{%
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \parindent=0pt
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \advance\rightskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+  \par
+  \ifx\quotationauthor\undefined\else
+    % indent a bit.
+    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+  \fi
+  {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty \else
+    {\bf #1: }%
+  \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+  \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+  \tt  % easiest (and conventionally used) font for verbatim
+  \def\par{\leavevmode\endgraf}%
+  \catcode`\`=\active
+  \tabeightspaces
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabexpand{%
+    \catcode`\^^I=\active
+    \def^^I{\leavevmode\egroup
+      \dimen0=\wd0 % the width so far, or since the previous tab
+      \divide\dimen0 by\tabw
+      \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+      \advance\dimen0 by\tabw  % advance to next multiple of \tabw
+      \wd0=\dimen0 \box0 \starttabbox
+    }%
+  }
+\endgroup
+\def\setupverbatim{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  % Easiest (and conventionally used) font for verbatim
+  \tt
+  \def\par{\leavevmode\egroup\box0\endgraf}%
+  \catcode`\`=\active
+  \tabexpand
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+  \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters.  Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+%    \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+  \catcode`\ =\active
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+  % We really want {...\end verbatim} in the body of the macro, but
+  % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+    \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+  {%
+    \makevalueexpandable
+    \setupverbatim
+    \input #1
+    \afterenvbreak
+  }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+  \begingroup
+    \parindent = 0pt  % paragraph indentation looks wrong on title page
+    \scanexp\copyingtext
+  \endgroup
+}
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+% Start the processing of @deffn:
+\def\startdefun{%
+  \ifnum\lastpenalty<10000
+    \medbreak
+  \else
+    % If there are two @def commands in a row, we'll have a \nobreak,
+    % which is there to keep the function description together with its
+    % header.  But if there's nothing but headers, we need to allow a
+    % break somewhere.  Check specifically for penalty 10002, inserted
+    % by \defargscommonending, instead of 10000, since the sectioning
+    % commands also insert a nobreak penalty, and we don't want to allow
+    % a break between a section heading and a defun.
+    % 
+    \ifnum\lastpenalty=10002 \penalty2000 \fi
+    %
+    % Similarly, after a section heading, do not allow a break.
+    % But do insert the glue.
+    \medskip  % preceded by discardable penalty, so not a breakpoint
+  \fi
+  %
+  \parindent=0in
+  \advance\leftskip by \defbodyindent
+  \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+  % First, check whether we are in the right environment:
+  \checkenv#1%
+  %
+  % As above, allow line break if we have multiple x headers in a row.
+  % It's not a great place, though.
+  \ifnum\lastpenalty=10002 \penalty3000 \fi
+  %
+  % And now, it's time to reuse the body of the original defun:
+  \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+  \begingroup
+    % call \deffnheader:
+    #1#2 \endheader
+    % common ending:
+    \interlinepenalty = 10000
+    \advance\rightskip by 0pt plus 1fil
+    \endgraf
+    \nobreak\vskip -\parskip
+    \penalty 10002  % signal to \startdefun and \dodefunx
+    % Some of the @defun-type tags do not enable magic parentheses,
+    % rendering the following check redundant.  But we don't optimize.
+    \checkparencounts
+  \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+  \expandafter\let\csname E#1\endcsname = \Edefun
+  \edef\temp{\noexpand\domakedefun
+    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+  \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+  \envdef#1{%
+    \startdefun
+    \parseargusing\activeparens{\printdefunline#3}%
+  }%
+  \def#2{\dodefunx#1}%
+  \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+  \dosubind{fn}{\code{#3}}{#1}%
+  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{fn}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{vr}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+  \doind{tp}{\code{#2}}%
+  \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \advance\leftskip by -\defbodyindent
+  %
+  % How we'll format the type name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \def\temp{#1}%
+  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+  %
+  % Figure out line sizes for the paragraph shape.
+  % The first line needs space for \box0; but if \rightskip is nonzero,
+  % we need only space for the part of \box0 which exceeds it:
+  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
+  % The continuations:
+  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
+  % (plain.tex says that \dimen1 should be used only as global.)
+  \parshape 2 0in \dimen0 \defargsindent \dimen2
+  %
+  % Put the type name to the right margin.
+  \noindent
+  \hbox to 0pt{%
+    \hfil\box0 \kern-\hsize
+    % \hsize has to be shortened this way:
+    \kern\leftskip
+    % Intentionally do not respect \rightskip, since we need the space.
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \exdentamount=\defbodyindent
+  {%
+    % defun fonts. We use typewriter by default (used to be bold) because:
+    % . we're printing identifiers, they should be in tt in principle.
+    % . in languages with many accents, such as Czech or French, it's
+    %   common to leave accents off identifiers.  The result looks ok in
+    %   tt, but exceedingly strange in rm.
+    % . we don't want -- and --- to be treated as ligatures.
+    % . this still does not fix the ?` and !` ligatures, but so far no
+    %   one has made identifiers using them :).
+    \df \tt
+    \def\temp{#2}% return value type
+    \ifx\temp\empty\else \tclose{\temp} \fi
+    #3% output function name
+  }%
+  {\rm\enskip}% hskip 0.5 em of \tenrm
+  %
+  \boldbrax
+  % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name.  This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable.  Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+  % use sl by default (not ttsl),
+  % tt for the names.
+  \df \sl \hyphenchar\font=0
+  %
+  % On the other hand, if an argument has two dashes (for instance), we
+  % want a way to get ttsl.  Let's try @var for that.
+  \let\var=\ttslanted
+  #1%
+  \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\[=\active \catcode`\]=\active
+  \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+  \activeparens
+  \global\let(=\lparen \global\let)=\rparen
+  \global\let[=\lbrack \global\let]=\rbrack
+  \global\let& = \&
+
+  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+  \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+  \ifampseen
+    % At the first level, print parens in roman,
+    % otherwise use the default font.
+    \ifnum \parencount=1 \rm \fi
+  \else
+    % The \sf parens (in \boldbrax) actually are a little bolder than
+    % the contained text.  This is especially needed for [ and ] .
+    \sf
+  \fi
+}
+\def\infirstlevel#1{%
+  \ifampseen
+    \ifnum\parencount=1
+      #1%
+    \fi
+  \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+  \global\advance\parencount by 1
+  {\parenfont(}%
+  \infirstlevel \bfafterword
+}
+\def\clnr{%
+  {\parenfont)}%
+  \infirstlevel \sl
+  \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+  \global\advance\brackcount by 1
+  {\bf[}%
+}
+\def\rbrb{%
+  {\bf]}%
+  \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+  \ifnum\parencount=0 \else \badparencount \fi
+  \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+\def\badparencount{%
+  \errmessage{Unbalanced parentheses in @def}%
+  \global\parencount=0
+}
+\def\badbrackcount{%
+  \errmessage{Unbalanced square braces in @def}%
+  \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+  \newwrite\macscribble
+  \def\scantokens#1{%
+    \toks0={#1}%
+    \immediate\openout\macscribble=\jobname.tmp
+    \immediate\write\macscribble{\the\toks0}%
+    \immediate\closeout\macscribble
+    \input \jobname.tmp
+  }
+\fi
+
+\def\scanmacro#1{%
+  \begingroup
+    \newlinechar`\^^M
+    \let\xeatspaces\eatspaces
+    % Undo catcode changes of \startcontents and \doprintindex
+    % When called from @insertcopying or (short)caption, we need active
+    % backslash to get it printed correctly.  Previously, we had
+    % \catcode`\\=\other instead.  We'll see whether a problem appears
+    % with macro expansion.				--kasal, 19aug04
+    \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+    % ... and \example
+    \spaceisspace
+    %
+    % Append \endinput to make sure that TeX does not see the ending newline.
+    %
+    % I've verified that it is necessary both for e-TeX and for ordinary TeX
+    %							--kasal, 29nov03
+    \scantokens{#1\endinput}%
+  \endgroup
+}
+
+\def\scanexp#1{%
+  \edef\temp{\noexpand\scanmacro{#1}}%
+  \temp
+}
+
+\newcount\paramno   % Count of parameters
+\newtoks\macname    % Macro name
+\newif\ifrecursive  % Is it recursive?
+
+% List of all defined macros in the form
+%    \definedummyword\macro1\definedummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+     \toks0 = \expandafter{\macrolist\definedummyword#1}%
+     \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+%   \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+% 
+\def\cslet#1#2{%
+  \expandafter\let
+  \csname#1\expandafter\endcsname
+  \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by  making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\scanctxt{%
+  \catcode`\"=\other
+  \catcode`\+=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\@=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\~=\other
+}
+
+\def\scanargctxt{%
+  \scanctxt
+  \catcode`\\=\other
+  \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{%
+  \scanctxt
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\^^M=\other
+  \usembodybackslash
+}
+
+\def\macroargctxt{%
+  \scanctxt
+  \catcode`\\=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+  \getargs{#1}%           now \macname is the macname and \argl the arglist
+  \ifx\argl\empty       % no arguments
+     \paramno=0%
+  \else
+     \expandafter\parsemargdef \argl;%
+  \fi
+  \if1\csname ismacro.\the\macname\endcsname
+     \message{Warning: redefining \the\macname}%
+  \else
+     \expandafter\ifx\csname \the\macname\endcsname \relax
+     \else \errmessage{Macro name \the\macname\space already defined}\fi
+     \global\cslet{macsave.\the\macname}{\the\macname}%
+     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+     \addtomacrolist{\the\macname}%
+  \fi
+  \begingroup \macrobodyctxt
+  \ifrecursive \expandafter\parsermacbody
+  \else \expandafter\parsemacbody
+  \fi}
+
+\parseargdef\unmacro{%
+  \if1\csname ismacro.#1\endcsname
+    \global\cslet{#1}{macsave.#1}%
+    \global\expandafter\let \csname ismacro.#1\endcsname=0%
+    % Remove the macro name from \macrolist:
+    \begingroup
+      \expandafter\let\csname#1\endcsname \relax
+      \let\definedummyword\unmacrodo
+      \xdef\macrolist{\macrolist}%
+    \endgroup
+  \else
+    \errmessage{Macro #1 not defined}%
+  \fi
+}
+
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+  \ifx #1\relax
+    % remove this
+  \else
+    \noexpand\definedummyword \noexpand#1%
+  \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list.  Set up \paramno and \paramlist
+% so \defmacro knows what to do.  Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX:  let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+  \if#1;\let\next=\relax
+  \else \let\next=\parsemargdefxxx
+    \advance\paramno by 1%
+    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+        {\xeatspaces{\hash\the\paramno}}%
+    \edef\paramlist{\paramlist\hash\the\paramno,}%
+  \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+  \let\hash=##% convert placeholders to macro parameter chars
+  \ifrecursive
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\scanmacro{\temp}}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+         \egroup\noexpand\scanmacro{\temp}}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+        \csname\the\macname xxx\endcsname
+          \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+    \fi
+  \else
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+        \egroup
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \expandafter\noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+      \csname\the\macname xxx\endcsname
+      \paramlist{%
+          \egroup
+          \noexpand\norecurse{\the\macname}%
+          \noexpand\scanmacro{\temp}\egroup}%
+    \fi
+  \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {.  If so it reads up to the closing }, if not, it reads the whole
+% line.  Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+  \ifx\nchar\bgroup\else
+    \expandafter\parsearg
+  \fi \next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign.  Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+  {%
+    \expandafter\let\obeyedspace=\empty
+    \addtomacrolist{#1}%
+    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+  }%
+  \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs    % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.  The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross,  ,  , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node.  #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+  \ifx\lastnode\empty\else
+    \setref{\lastnode}{#1}%
+    \global\let\lastnode=\empty
+  \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \thissection,
+%                 or the anchor name.
+% 2) NAME-snt   - section number and type, passed as the SNT arg, or
+%                 empty for anchors.
+% 3) NAME-pg    - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat.  In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof   - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+  \pdfmkdest{#1}%
+  \iflinks
+    {%
+      \atdummies  % preserve commands, but don't expand them
+      \edef\writexrdef##1##2{%
+	\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+	  ##1}{##2}}% these are parameters of \writexrdef
+      }%
+      \toks0 = \expandafter{\thissection}%
+      \immediate \writexrdef{title}{\the\toks0 }%
+      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+      \writexrdef{pg}{\folio}% will be written later, during \shipout
+    }%
+  \fi
+}
+
+% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual.  All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+  \unsepspaces
+  \def\printedmanual{\ignorespaces #5}%
+  \def\printedrefname{\ignorespaces #3}%
+  \setbox1=\hbox{\printedmanual\unskip}%
+  \setbox0=\hbox{\printedrefname\unskip}%
+  \ifdim \wd0 = 0pt
+    % No printed node name was explicitly given.
+    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+      % Use the node name inside the square brackets.
+      \def\printedrefname{\ignorespaces #1}%
+    \else
+      % Use the actual chapter/section title appear inside
+      % the square brackets.  Use the real section title if we have it.
+      \ifdim \wd1 > 0pt
+        % It is in another manual, so we don't have it.
+        \def\printedrefname{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We know the real title if we have the xref values.
+          \def\printedrefname{\refx{#1-title}{}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printedrefname{\ignorespaces #1}%
+        \fi%
+      \fi
+    \fi
+  \fi
+  %
+  % Make link in pdf output.
+  \ifpdf
+    \leavevmode
+    \getfilename{#4}%
+    {\turnoffactive
+     % See comments at \activebackslashdouble.
+     {\activebackslashdouble \xdef\pdfxrefdest{#1}%
+      \backslashparens\pdfxrefdest}%
+     %
+     \ifnum\filenamelength>0
+       \startlink attr{/Border [0 0 0]}%
+         goto file{\the\filename.pdf} name{\pdfxrefdest}%
+     \else
+       \startlink attr{/Border [0 0 0]}%
+         goto name{\pdfmkpgn{\pdfxrefdest}}%
+     \fi
+    }%
+    \linkcolor
+  \fi
+  %
+  % Float references are printed completely differently: "Figure 1.2"
+  % instead of "[somenode], p.3".  We distinguish them by the
+  % LABEL-title being set to a magic string.
+  {%
+    % Have to otherify everything special to allow the \csname to
+    % include an _ in the xref name, etc.
+    \indexnofonts
+    \turnoffactive
+    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+      \csname XR#1-title\endcsname
+  }%
+  \iffloat\Xthisreftitle
+    % If the user specified the print name (third arg) to the ref,
+    % print it instead of our usual "Figure 1.2".
+    \ifdim\wd0 = 0pt
+      \refx{#1-snt}%
+    \else
+      \printedrefname
+    \fi
+    %
+    % if the user also gave the printed manual name (fifth arg), append
+    % "in MANUALNAME".
+    \ifdim \wd1 > 0pt
+      \space \putwordin{} \cite{\printedmanual}%
+    \fi
+  \else
+    % node/anchor (non-float) references.
+    %
+    % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+    % insert empty discretionaries after hyphens, which means that it will
+    % not find a line break at a hyphen in a node names.  Since some manuals
+    % are best written with fairly long node names, containing hyphens, this
+    % is a loss.  Therefore, we give the text of the node name again, so it
+    % is as if TeX is seeing it for the first time.
+    \ifdim \wd1 > 0pt
+      \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+    \else
+      % _ (for example) has to be the character _ for the purposes of the
+      % control sequence corresponding to the node, but it has to expand
+      % into the usual \leavevmode...\vrule stuff for purposes of
+      % printing. So we \turnoffactive for the \refx-snt, back on for the
+      % printing, back off for the \refx-pg.
+      {\turnoffactive
+       % Only output a following space if the -snt ref is nonempty; for
+       % @unnumbered and @anchor, it won't be.
+       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+      }%
+      % output the `[mynode]' via a macro so it can be overridden.
+      \xrefprintnodename\printedrefname
+      %
+      % But we always want a comma and a space:
+      ,\space
+      %
+      % output the `page 3'.
+      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output.  It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents.  Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+\def\Yappendix{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+  {%
+    \indexnofonts
+    \otherbackslash
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname XR#1\endcsname
+  }%
+  \ifx\thisrefX\relax
+    % If not defined, say something at least.
+    \angleleft un\-de\-fined\angleright
+    \iflinks
+      \ifhavexrefs
+        \message{\linenumber Undefined cross reference `#1'.}%
+      \else
+        \ifwarnedxrefs\else
+          \global\warnedxrefstrue
+          \message{Cross reference values unknown; you must run TeX again.}%
+        \fi
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \thisrefX
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.  Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions).  But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+  \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
+  %
+  % Was that xref control sequence that we just defined for a float?
+  \expandafter\iffloat\csname XR#1\endcsname
+    % it was a float, and we have the (safe) float type in \iffloattype.
+    \expandafter\let\expandafter\floatlist
+      \csname floatlist\iffloattype\endcsname
+    %
+    % Is this the first time we've seen this float type?
+    \expandafter\ifx\floatlist\relax
+      \toks0 = {\do}% yes, so just \do
+    \else
+      % had it before, so preserve previous elements in list.
+      \toks0 = \expandafter{\floatlist\do}%
+    \fi
+    %
+    % Remember this xref in the control sequence \floatlistFLOATTYPE,
+    % for later use in \listoffloats.
+    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
+  \fi
+}
+
+% Read the last existing aux file, if any.  No error if none exists.
+%
+\def\tryauxfile{%
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \readdatafile{aux}%
+    \global\havexrefstrue
+  \fi
+  \closein 1
+}
+
+\def\setupdatafile{%
+  \catcode`\^^@=\other
+  \catcode`\^^A=\other
+  \catcode`\^^B=\other
+  \catcode`\^^C=\other
+  \catcode`\^^D=\other
+  \catcode`\^^E=\other
+  \catcode`\^^F=\other
+  \catcode`\^^G=\other
+  \catcode`\^^H=\other
+  \catcode`\^^K=\other
+  \catcode`\^^L=\other
+  \catcode`\^^N=\other
+  \catcode`\^^P=\other
+  \catcode`\^^Q=\other
+  \catcode`\^^R=\other
+  \catcode`\^^S=\other
+  \catcode`\^^T=\other
+  \catcode`\^^U=\other
+  \catcode`\^^V=\other
+  \catcode`\^^W=\other
+  \catcode`\^^X=\other
+  \catcode`\^^Z=\other
+  \catcode`\^^[=\other
+  \catcode`\^^\=\other
+  \catcode`\^^]=\other
+  \catcode`\^^^=\other
+  \catcode`\^^_=\other
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
+  % supported in the main text, it doesn't seem desirable.  Furthermore,
+  % that is not enough: for node names that actually contain a ^
+  % character, we would end up writing a line like this: 'xrdef {'hat
+  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+  % argument, and \hat is not an expandable control sequence.  It could
+  % all be worked out, but why?  Either we support ^^ or we don't.
+  %
+  % The other change necessary for this was to define \auxhat:
+  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+  % and then to call \auxhat in \setq.
+  %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
+  \catcode`\~=\other
+  \catcode`\[=\other
+  \catcode`\]=\other
+  \catcode`\"=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\$=\other
+  \catcode`\#=\other
+  \catcode`\&=\other
+  \catcode`\%=\other
+  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+  %
+  % This is to support \ in node names and titles, since the \
+  % characters end up in a \csname.  It's easier than
+  % leaving it active and making its active definition an actual \
+  % character.  What I don't understand is why it works in the *value*
+  % of the xrdef.  Seems like it should be a catcode12 \, and that
+  % should not typeset properly.  But it works, so I'm moving on for
+  % now.  --karl, 15jan04.
+  \catcode`\\=\other
+  %
+  % Make the characters 128-255 be printing characters.
+  {%
+    \count1=128
+    \def\loop{%
+      \catcode\count1=\other
+      \advance\count1 by 1
+      \ifnum \count1<256 \loop \fi
+    }%
+  }%
+  %
+  % @ is our escape character in .aux files, and we need braces.
+  \catcode`\{=1
+  \catcode`\}=2
+  \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+  \setupdatafile
+  \input\jobname.#1
+\endgroup}
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes.  Otherwise like plain.
+\gdef\footnote{%
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \global\advance\footnoteno by \@ne
+  \edef\thisfootno{$^{\the\footnoteno}$}%
+  %
+  % In case the footnote comes at the end of a sentence, preserve the
+  % extra spacing after we do the footnote number.
+  \let\@sf\empty
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+  %
+  % Remove inadvertent blank space before typesetting the footnote number.
+  \unskip
+  \thisfootno\@sf
+  \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter.  Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read.  --karl, 16nov96.
+%
+\gdef\dofootnote{%
+  \insert\footins\bgroup
+  % We want to typeset this text as a normal paragraph, even if the
+  % footnote reference occurs in (for example) a display environment.
+  % So reset some parameters.
+  \hsize=\pagewidth
+  \interlinepenalty\interfootnotelinepenalty
+  \splittopskip\ht\strutbox % top baseline for broken footnotes
+  \splitmaxdepth\dp\strutbox
+  \floatingpenalty\@MM
+  \leftskip\z@skip
+  \rightskip\z@skip
+  \spaceskip\z@skip
+  \xspaceskip\z@skip
+  \parindent\defaultparindent
+  %
+  \smallfonts \rm
+  %
+  % Because we use hanging indentation in footnotes, a @noindent appears
+  % to exdent this text, so make it be a no-op.  makeinfo does not use
+  % hanging indentation so @noindent can still be needed within footnote
+  % text after an @example or the like (not that this is good style).
+  \let\noindent = \relax
+  %
+  % Hang the footnote text off the number.  Use \everypar in case the
+  % footnote extends for more than one paragraph.
+  \everypar = {\hang}%
+  \textindent{\thisfootno}%
+  %
+  % Don't crash into the line above the footnote text.  Since this
+  % expands into a box, it must come within the paragraph, lest it
+  % provide a place where TeX can split the footnote.
+  \footstrut
+  \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished.  Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes.  --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+  \ifx \insert\ptexinsert
+    \let\insert\saveinsert
+  \else
+    \let\checkinserts\relax
+  \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+  \afterassignment\next
+  % swallow the left brace
+  \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+    {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
+  \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+  \next
+}
+\def\newsaveinsX #1{%
+  \csname newbox\endcsname #1%
+  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+    \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image.  We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front.  If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
+  \def\epsfannounce{\toks0 = }%
+  \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+  work.  It is also included in the Texinfo distribution, or you can get
+  it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+  \ifx\epsfbox\undefined
+    \ifwarnednoepsf \else
+      \errhelp = \noepsfhelp
+      \errmessage{epsf.tex not found, images will be ignored}%
+      \global\warnednoepsftrue
+    \fi
+  \else
+    \imagexxx #1,,,,,\finish
+  \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+  \catcode`\^^M = 5     % in case we're inside an example
+  \normalturnoffactive  % allow _ et al. in names
+  % If the image is by itself, center it.
+  \ifvmode
+    \imagevmodetrue
+    \nobreak\bigskip
+    % Usually we'll have text after the image which will insert
+    % \parskip glue, so insert it here too to equalize the space
+    % above and below.
+    \nobreak\vskip\parskip
+    \nobreak
+    \line\bgroup\hss
+  \fi
+  %
+  % Output the image.
+  \ifpdf
+    \dopdfimage{#1}{#2}{#3}%
+  \else
+    % \epsfbox itself resets \epsf?size at each figure.
+    \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+    \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+    \epsfbox{#1.eps}%
+  \fi
+  %
+  \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc.  We don't actually implement floating yet, we always include the
+% float "here".  But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label.  Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored.  It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+  \let\thiscaption=\empty
+  \let\thisshortcaption=\empty
+  %
+  % don't lose footnotes inside @float.
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
+  \startsavinginserts
+  %
+  % We can't be used inside a paragraph.
+  \par
+  %
+  \vtop\bgroup
+    \def\floattype{#1}%
+    \def\floatlabel{#2}%
+    \def\floatloc{#3}% we do nothing with this yet.
+    %
+    \ifx\floattype\empty
+      \let\safefloattype=\empty
+    \else
+      {%
+        % the floattype might have accents or other special characters,
+        % but we need to use it in a control sequence name.
+        \indexnofonts
+        \turnoffactive
+        \xdef\safefloattype{\floattype}%
+      }%
+    \fi
+    %
+    % If label is given but no type, we handle that as the empty type.
+    \ifx\floatlabel\empty \else
+      % We want each FLOATTYPE to be numbered separately (Figure 1,
+      % Table 1, Figure 2, ...).  (And if no label, no number.)
+      %
+      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+      \global\advance\floatno by 1
+      %
+      {%
+        % This magic value for \thissection is output by \setref as the
+        % XREFLABEL-title value.  \xrefX uses it to distinguish float
+        % labels (which have a completely different output format) from
+        % node and anchor labels.  And \xrdef uses it to construct the
+        % lists of floats.
+        %
+        \edef\thissection{\floatmagic=\safefloattype}%
+        \setref{\floatlabel}{Yfloat}%
+      }%
+    \fi
+    %
+    % start with \parskip glue, I guess.
+    \vskip\parskip
+    %
+    % Don't suppress indentation if a float happens to start a section.
+    \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption:    Foo 1.1
+% @float Foo & @caption{Cap}:     Foo: Cap
+% @float Foo & no caption:        Foo
+% @float ,lbl & Caption{Cap}:     1.1: Cap
+% @float ,lbl & no caption:       1.1
+% @float & @caption{Cap}:         Cap
+% @float & no caption:
+%
+\def\Efloat{%
+    \let\floatident = \empty
+    %
+    % In all cases, if we have a float type, it comes first.
+    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+    %
+    % If we have an xref label, the number comes next.
+    \ifx\floatlabel\empty \else
+      \ifx\floattype\empty \else % if also had float type, need tie first.
+        \appendtomacro\floatident{\tie}%
+      \fi
+      % the number.
+      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+    \fi
+    %
+    % Start the printed caption with what we've constructed in
+    % \floatident, but keep it separate; we need \floatident again.
+    \let\captionline = \floatident
+    %
+    \ifx\thiscaption\empty \else
+      \ifx\floatident\empty \else
+	\appendtomacro\captionline{: }% had ident, so need a colon between
+      \fi
+      %
+      % caption text.
+      \appendtomacro\captionline{\scanexp\thiscaption}%
+    \fi
+    %
+    % If we have anything to print, print it, with space before.
+    % Eventually this needs to become an \insert.
+    \ifx\captionline\empty \else
+      \vskip.5\parskip
+      \captionline
+      %
+      % Space below caption.
+      \vskip\parskip
+    \fi
+    %
+    % If have an xref label, write the list of floats info.  Do this
+    % after the caption, to avoid chance of it being a breakpoint.
+    \ifx\floatlabel\empty \else
+      % Write the text that goes in the lof to the aux file as
+      % \floatlabel-lof.  Besides \floatident, we include the short
+      % caption if specified, else the full caption if specified, else nothing.
+      {%
+        \atdummies
+        % since we read the caption text in the macro world, where ^^M
+        % is turned into a normal character, we have to scan it back, so
+        % we don't write the literal three characters "^^M" into the aux file.
+	\scanexp{%
+	  \xdef\noexpand\gtemp{%
+	    \ifx\thisshortcaption\empty
+	      \thiscaption
+	    \else
+	      \thisshortcaption
+	    \fi
+	  }%
+	}%
+        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+	  \ifx\gtemp\empty \else : \gtemp \fi}}%
+      }%
+    \fi
+  \egroup  % end of \vtop
+  %
+  % place the captured inserts
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
+  \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+  \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use.  Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+  \ifx#1\relax
+      % Haven't seen this figure type before.
+      \csname newcount\endcsname #1%
+      %
+      % Remember to reset this floatno at the next chap.
+      \expandafter\gdef\expandafter\resetallfloatnos
+        \expandafter{\resetallfloatnos #1=0 }%
+  \fi
+  \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref.  That is, the magic
+% \thissection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
+% (safe) float type for this float.  We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+  \def\temp{#1}%
+  \def\iffloattype{#2}%
+  \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+  \def\floattype{#1}% floattype
+  {%
+    % the floattype might have accents or other special characters,
+    % but we need to use it in a control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safefloattype{\floattype}%
+  }%
+  %
+  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+    \ifhavexrefs
+      % if the user said @listoffloats foo but never @float foo.
+      \message{\linenumber No `\safefloattype' floats to list.}%
+    \fi
+  \else
+    \begingroup
+      \leftskip=\tocindent  % indent these entries like a toc
+      \let\do=\listoffloatsdo
+      \csname floatlist\safefloattype\endcsname
+    \endgroup
+  \fi
+}
+
+% This is called on each entry in a list of floats.  We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file.  We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+  % Can't fully expand XR#1-lof because it can contain anything.  Just
+  % pass the control sequence.  On the other hand, XR#1-pg is just the
+  % page number, and we want to fully expand that so we can get a link
+  % in pdf output.
+  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+  %
+  % use the same \entry macro we use to generate the TOC and index.
+  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+  \writeentry
+}}
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename.  If done too late, it may not override everything
+% properly.  Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\parseargdef\documentlanguage{%
+  \tex % read txi-??.tex file in plain TeX.
+    % Read the file if it exists.
+    \openin 1 txi-#1.tex
+    \ifeof 1
+      \errhelp = \nolanghelp
+      \errmessage{Cannot read language file txi-#1.tex}%
+    \else
+      \input txi-#1.tex
+    \fi
+    \closein 1
+  \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty.  Maybe you need to install it?  In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+  \ifx\emergencystretch\thisisundefined
+    % Allow us to assign to \emergencystretch anyway.
+    \def\emergencystretch{\dimen0}%
+  \else
+    \emergencystretch = .15\hsize
+  \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+  \voffset = #3\relax
+  \topskip = #6\relax
+  \splittopskip = \topskip
+  %
+  \vsize = #1\relax
+  \advance\vsize by \topskip
+  \outervsize = \vsize
+  \advance\outervsize by 2\topandbottommargin
+  \pageheight = \vsize
+  %
+  \hsize = #2\relax
+  \outerhsize = \hsize
+  \advance\outerhsize by 0.5in
+  \pagewidth = \hsize
+  %
+  \normaloffset = #4\relax
+  \bindingoffset = #5\relax
+  %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+  \fi
+  %
+  \setleading{\textleading}
+  %
+  \parindent = \defaultparindent
+  \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % If page is nothing but text, make it come out even.
+  \internalpagesizes{46\baselineskip}{6in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+  \parskip = 2pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.5in}{5in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
+  %
+  \lispnarrowing = 0.3in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+  \parskip = 1.5pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.4in}{4.8in}%
+                    {-.2in}{-.4in}%
+                    {0pt}{14pt}%
+                    {9in}{6in}%
+  %
+  \lispnarrowing = 0.25in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{51\baselineskip}{160mm}
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
+  %
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.5pt
+  %
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \hfuzz = 1.2pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
+  \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+  \globaldefs = 1
+  %
+  \parskip = 3pt plus 2pt minus 1pt
+  \setleading{\textleading}%
+  %
+  \dimen0 = #1
+  \advance\dimen0 by \voffset
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font.  Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts.  But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+{\catcode`\\=\active
+ @gdef@rawbackslash{@let\=@backslashcurfont}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\backslashcurfont}}
+
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{%
+  @let"=@normaldoublequote
+  @let\=@realbackslash
+  @let~=@normaltilde
+  @let^=@normalcaret
+  @let_=@normalunderscore
+  @let|=@normalverticalbar
+  @let<=@normalless
+  @let>=@normalgreater
+  @let+=@normalplus
+  @let$=@normaldollar %$ font-lock fix
+  @unsepspaces
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.  (Thus, \ is not expandable when this is in
+% effect.)
+%
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also turn back on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+  @ifx\@eatinput @let\ = @normalbackslash @fi
+  @catcode`+=@active
+  @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+   arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/rbffi.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/rbffi.h
new file mode 100644
index 0000000..b6fe477
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/rbffi.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2008, 2009, Wayne Meissner
+ *
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
+ * 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.
+ *     * Neither the name of the Ruby FFI project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * 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 <COPYRIGHT HOLDER> 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.
+ */
+
+#ifndef RBFFI_RBFFI_H
+#define	RBFFI_RBFFI_H
+
+#include <ruby.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#define MAX_PARAMETERS (32)
+
+extern VALUE rbffi_FFIModule;
+    
+extern void rbffi_Type_Init(VALUE ffiModule);
+extern void rbffi_Buffer_Init(VALUE ffiModule);
+extern void rbffi_Invoker_Init(VALUE ffiModule);
+extern void rbffi_Variadic_Init(VALUE ffiModule);
+extern void rbffi_DataConverter_Init(VALUE ffiModule);
+extern VALUE rbffi_AbstractMemoryClass, rbffi_InvokerClass;
+extern int rbffi_type_size(VALUE type);
+extern void rbffi_Thread_Init(VALUE moduleFFI);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* RBFFI_RBFFI_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/rbffi_endian.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/rbffi_endian.h
new file mode 100644
index 0000000..ebb8420
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/rbffi_endian.h
@@ -0,0 +1,59 @@
+#ifndef JFFI_ENDIAN_H
+#define JFFI_ENDIAN_H
+
+#ifndef _MSC_VER
+#include <sys/param.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) || defined(__GLIBC__) || defined(__HAIKU__)
+# include <endian.h>
+# if !defined(LITTLE_ENDIAN) && defined(__LITTLE_ENDIAN)
+#  define LITTLE_ENDIAN __LITTLE_ENDIAN
+# endif
+# if !defined(BIG_ENDIAN) && defined(__BIG_ENDIAN)
+#  define BIG_ENDIAN __BIG_ENDIAN
+# endif
+# if !defined(BYTE_ORDER) && defined(__BYTE_ORDER)
+#  define BYTE_ORDER __BYTE_ORDER
+# endif
+#endif
+
+#ifdef __sun
+# include <sys/byteorder.h>
+# define LITTLE_ENDIAN 1234
+# define BIG_ENDIAN 4321
+# if defined(_BIG_ENDIAN)
+#  define BYTE_ORDER BIG_ENDIAN
+# elif defined(_LITTLE_ENDIAN)
+#  define BYTE_ORDER LITTLE_ENDIAN
+# else
+#  error "Cannot determine endian-ness"
+# endif
+#endif
+
+#if defined(_AIX) && !defined(BYTE_ORDER)
+# define LITTLE_ENDIAN 1234
+# define BIG_ENDIAN 4321
+# if defined(__BIG_ENDIAN__)
+#  define BYTE_ORDER BIG_ENDIAN
+# elif defined(__LITTLE_ENDIAN__)
+#  define BYTE_ORDER LITTLE_ENDIAN
+# else
+#  error "Cannot determine endian-ness"
+# endif
+#endif
+
+#if defined(_WIN32)
+# define LITTLE_ENDIAN 1234
+# define BIG_ENDIAN 4321
+# define BYTE_ORDER LITTLE_ENDIAN
+#endif
+
+#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN)
+#  error "Cannot determine the endian-ness of this platform"
+#endif
+
+#endif /* JFFI_ENDIAN_H */
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdbool.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdbool.h
new file mode 100644
index 0000000..9130a8b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdbool.h
@@ -0,0 +1,8 @@
+#ifndef FFI_STDBOOL_H
+#define FFI_STDBOOL_H
+
+typedef int bool;
+#define true 1
+#define false 0
+
+#endif /* FFI_STDBOOL_H */
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdint.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdint.h
new file mode 100644
index 0000000..6ce7457
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ext/ffi_c/win32/stdint.h
@@ -0,0 +1,201 @@
+/* stdint.h standard header */
+#if !defined(_MSC_VER) && !defined(INT8_MIN)
+#pragma once
+#ifndef _STDINT
+#define _STDINT
+#ifndef RC_INVOKED
+#include <yvals.h>
+
+/* NB: assumes
+	byte has 8 bits
+	long is 32 bits
+	pointer can convert to and from long long
+	long long is longest type
+ */
+
+_C_STD_BEGIN
+		/* TYPE DEFINITIONS */
+typedef signed char int8_t;
+typedef short int16_t;
+typedef int int32_t;
+
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+
+typedef signed char int_least8_t;
+typedef short int_least16_t;
+typedef int int_least32_t;
+
+typedef unsigned char uint_least8_t;
+typedef unsigned short uint_least16_t;
+typedef unsigned int uint_least32_t;
+
+typedef char int_fast8_t;
+typedef int int_fast16_t;
+typedef int int_fast32_t;
+
+typedef unsigned char uint_fast8_t;
+typedef unsigned int uint_fast16_t;
+typedef unsigned int uint_fast32_t;
+
+#ifndef _INTPTR_T_DEFINED
+ #define _INTPTR_T_DEFINED
+ #ifdef _WIN64
+typedef __int64 intptr_t;
+ #else /* _WIN64 */
+typedef _W64 int intptr_t;
+ #endif /* _WIN64 */
+#endif /* _INTPTR_T_DEFINED */
+
+#ifndef _UINTPTR_T_DEFINED
+ #define _UINTPTR_T_DEFINED
+ #ifdef _WIN64
+typedef unsigned __int64 uintptr_t;
+ #else /* _WIN64 */
+typedef _W64 unsigned int uintptr_t;
+ #endif /* _WIN64 */
+#endif /* _UINTPTR_T_DEFINED */
+
+typedef _Longlong int64_t;
+typedef _ULonglong uint64_t;
+
+typedef _Longlong int_least64_t;
+typedef _ULonglong uint_least64_t;
+
+typedef _Longlong int_fast64_t;
+typedef _ULonglong uint_fast64_t;
+
+typedef _Longlong intmax_t;
+typedef _ULonglong uintmax_t;
+
+		/* LIMIT MACROS */
+#define INT8_MIN	(-0x7f - _C2)
+#define INT16_MIN	(-0x7fff - _C2)
+#define INT32_MIN	(-0x7fffffff - _C2)
+
+#define INT8_MAX	0x7f
+#define INT16_MAX	0x7fff
+#define INT32_MAX	0x7fffffff
+#define UINT8_MAX	0xff
+#define UINT16_MAX	0xffff
+#define UINT32_MAX	0xffffffff
+
+#define INT_LEAST8_MIN		(-0x7f - _C2)
+#define INT_LEAST16_MIN		(-0x7fff - _C2)
+#define INT_LEAST32_MIN		(-0x7fffffff - _C2)
+
+#define INT_LEAST8_MAX		0x7f
+#define INT_LEAST16_MAX		0x7fff
+#define INT_LEAST32_MAX		0x7fffffff
+#define UINT_LEAST8_MAX		0xff
+#define UINT_LEAST16_MAX	0xffff
+#define UINT_LEAST32_MAX	0xffffffff
+
+#define INT_FAST8_MIN		(-0x7f - _C2)
+#define INT_FAST16_MIN		(-0x7fff - _C2)
+#define INT_FAST32_MIN		(-0x7fffffff - _C2)
+
+#define INT_FAST8_MAX		0x7f
+#define INT_FAST16_MAX		0x7fff
+#define INT_FAST32_MAX		0x7fffffff
+#define UINT_FAST8_MAX		0xff
+#define UINT_FAST16_MAX		0xffff
+#define UINT_FAST32_MAX		0xffffffff
+
+ #if _INTPTR == 0 || _INTPTR == 1
+#define INTPTR_MAX			0x7fffffff
+#define INTPTR_MIN			(-INTPTR_MAX - _C2)
+#define UINTPTR_MAX			0xffffffff
+
+ #else /* _INTPTR == 2 */
+#define INTPTR_MIN			(-_LLONG_MAX - _C2)
+#define INTPTR_MAX			_LLONG_MAX
+#define UINTPTR_MAX			_ULLONG_MAX
+#endif /* _INTPTR */
+
+#define INT8_C(x)	(x)
+#define INT16_C(x)	(x)
+#define INT32_C(x)	((x) + (INT32_MAX - INT32_MAX))
+
+#define UINT8_C(x)	(x)
+#define UINT16_C(x)	(x)
+#define UINT32_C(x)	((x) + (UINT32_MAX - UINT32_MAX))
+
+#ifdef _WIN64
+ #define PTRDIFF_MIN		INT64_MIN
+ #define PTRDIFF_MAX		INT64_MAX
+#else /* _WIN64 */
+ #define PTRDIFF_MIN		INT32_MIN
+ #define PTRDIFF_MAX		INT32_MAX
+#endif /* _WIN64 */
+
+#define SIG_ATOMIC_MIN	INT32_MIN
+#define SIG_ATOMIC_MAX	INT32_MAX
+
+#ifndef SIZE_MAX
+ #ifdef _WIN64
+  #define SIZE_MAX		UINT64_MAX
+ #else /* _WIN64 */
+  #define SIZE_MAX		UINT32_MAX
+ #endif /* _WIN64 */
+#endif /* SIZE_MAX */
+
+#define WCHAR_MIN	0x0000
+#define WCHAR_MAX	0xffff
+
+#define WINT_MIN	0x0000
+#define WINT_MAX	0xffff
+
+ #define INT64_MIN	(-0x7fffffffffffffff - _C2)
+ #define INT64_MAX	0x7fffffffffffffff
+ #define UINT64_MAX	0xffffffffffffffffU
+
+ #define INT_LEAST64_MIN	(-0x7fffffffffffffff - _C2)
+ #define INT_LEAST64_MAX	0x7fffffffffffffff
+ #define UINT_LEAST64_MAX	0xffffffffffffffffU
+
+ #define INT_FAST64_MIN		(-0x7fffffffffffffff - _C2)
+ #define INT_FAST64_MAX		0x7fffffffffffffff
+ #define UINT_FAST64_MAX	0xffffffffffffffffU
+
+ #define INTMAX_MIN		(-0x7fffffffffffffff - _C2)
+ #define INTMAX_MAX		0x7fffffffffffffff
+ #define UINTMAX_MAX	0xffffffffffffffffU
+
+#define INT64_C(x)		((x) + (INT64_MAX - INT64_MAX))
+#define UINT64_C(x)		((x) + (UINT64_MAX - UINT64_MAX))
+#define INTMAX_C(x)		INT64_C(x)
+#define UINTMAX_C(x)	UINT64_C(x)
+_C_STD_END
+#endif /* RC_INVOKED */
+#endif /* _STDINT */
+
+ #if defined(_STD_USING)
+using _CSTD int8_t; using _CSTD int16_t;
+using _CSTD int32_t; using _CSTD int64_t;
+
+using _CSTD uint8_t; using _CSTD uint16_t;
+using _CSTD uint32_t; using _CSTD uint64_t;
+
+using _CSTD int_least8_t; using _CSTD int_least16_t;
+using _CSTD int_least32_t;  using _CSTD int_least64_t;
+using _CSTD uint_least8_t; using _CSTD uint_least16_t;
+using _CSTD uint_least32_t; using _CSTD uint_least64_t;
+
+using _CSTD intmax_t; using _CSTD uintmax_t;
+
+using _CSTD uintptr_t;
+using _CSTD intptr_t;
+
+using _CSTD int_fast8_t; using _CSTD int_fast16_t;
+using _CSTD int_fast32_t; using _CSTD int_fast64_t;
+using _CSTD uint_fast8_t; using _CSTD uint_fast16_t;
+using _CSTD uint_fast32_t; using _CSTD uint_fast64_t;
+ #endif /* defined(_STD_USING) */
+
+/*
+ * Copyright (c) 1992-2009 by P.J. Plauger.  ALL RIGHTS RESERVED.
+ * Consult your license regarding permissions and restrictions.
+V5.20:0009 */
+#endif /* !defined(_MSC_VER) && !defined(INT8_MIN) */
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ffi.gemspec b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ffi.gemspec
new file mode 100644
index 0000000..b11893a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/ffi.gemspec
@@ -0,0 +1,23 @@
+require File.expand_path("../lib/#{File.basename(__FILE__, '.gemspec')}/version", __FILE__)
+
+Gem::Specification.new do |s|
+  s.name = 'ffi'
+  s.version = FFI::VERSION
+  s.author = 'Wayne Meissner'
+  s.email = 'wmeissner@gmail.com'
+  s.homepage = 'http://wiki.github.com/ffi/ffi'
+  s.summary = 'Ruby FFI'
+  s.description = 'Ruby FFI library'
+  s.files = %w(ffi.gemspec LICENSE COPYING README.md Rakefile) + Dir.glob("{ext,gen,lib,spec,libtest}/**/*").reject { |f| f =~ /(lib\/[12]\.[089]|\.s?[ao]$|\.bundle|\.dylib$)/ }
+  s.extensions << 'ext/ffi_c/extconf.rb'
+  s.has_rdoc = false
+  s.rdoc_options = %w[--exclude=ext/ffi_c/.*\.o$ --exclude=ffi_c\.(bundle|so)$]
+  s.license = 'BSD-3-Clause'
+  s.require_paths << 'ext/ffi_c'
+  s.required_ruby_version = '>= 1.8.7'
+  s.add_development_dependency 'rake', '~> 10.1'
+  s.add_development_dependency 'rake-compiler', '~> 1.0'
+  s.add_development_dependency 'rake-compiler-dock', '~> 0.6.0'
+  s.add_development_dependency 'rspec', '~> 2.14.1'
+  s.add_development_dependency 'rubygems-tasks', "~> 0.2.4"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/gen/Rakefile b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/gen/Rakefile
new file mode 100644
index 0000000..f71a1da
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/gen/Rakefile
@@ -0,0 +1,30 @@
+$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
+require 'fileutils'
+require 'ffi'
+require 'ffi/platform'
+require 'ffi/tools/types_generator'
+types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf'))
+
+logfile = File.join(File.dirname(__FILE__), 'log')
+
+file types_conf do |task|
+  options = {}
+  FileUtils.mkdir_p(File.dirname(task.name), { :mode => 0755 })
+  File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f|
+    f.puts FFI::TypesGenerator.generate(options)
+  end
+  File.open(logfile, 'w') do |log|
+    log.puts(types_conf)
+  end
+end
+
+task :default => types_conf do
+end
+
+task :clean do
+  File.readlines(logfile).each do |file|
+    file.strip!
+    rm_f file
+  end
+  rm_f logfile
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi.rb
new file mode 100644
index 0000000..361e53d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi.rb
@@ -0,0 +1,20 @@
+if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
+  Object.send(:remove_const, :FFI) if defined?(::FFI)
+  begin
+    require RUBY_VERSION.split('.')[0, 2].join('.') + '/ffi_c'
+  rescue Exception
+    require 'ffi_c'
+  end
+
+  require 'ffi/ffi'
+
+elsif defined?(RUBY_ENGINE)
+  # Remove the ffi gem dir from the load path, then reload the internal ffi implementation
+  $LOAD_PATH.delete(File.dirname(__FILE__))
+  $LOAD_PATH.delete(File.join(File.dirname(__FILE__), 'ffi'))
+  unless $LOADED_FEATURES.nil?
+    $LOADED_FEATURES.delete(__FILE__)
+    $LOADED_FEATURES.delete('ffi.rb')
+  end
+  require 'ffi.rb'
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/autopointer.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/autopointer.rb
new file mode 100644
index 0000000..889a3e3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/autopointer.rb
@@ -0,0 +1,203 @@
+#
+# Copyright (C) 2008-2010 Wayne Meissner
+# Copyright (C) 2008 Mike Dalessio
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.
+
+module FFI
+  class AutoPointer < Pointer
+    extend DataConverter
+
+    # @overload initialize(pointer, method)
+    #   @param pointer [Pointer]
+    #   @param method [Method]
+    #   @return [self]
+    #   The passed Method will be invoked at GC time.
+    # @overload initialize(pointer, proc)
+    #   @param pointer [Pointer]
+    #   @return [self]
+    #   The passed Proc will be invoked at GC time (SEE WARNING BELOW!)
+    #   @note WARNING: passing a proc _may_ cause your pointer to never be
+    #     GC'd, unless you're careful to avoid trapping a reference to the
+    #     pointer in the proc. See the test specs for examples.
+    # @overload initialize(pointer) { |p| ... }
+    #   @param pointer [Pointer]
+    #   @yieldparam [Pointer] p +pointer+ passed to the block
+    #   @return [self]
+    #   The passed block will be invoked at GC time.
+    #   @note
+    #     WARNING: passing a block will cause your pointer to never be GC'd.
+    #     This is bad.
+    # @overload initialize(pointer)
+    #   @param pointer [Pointer]
+    #   @return [self]
+    #   The pointer's release() class method will be invoked at GC time.
+    #
+    # @note The safest, and therefore preferred, calling
+    #  idiom is to pass a Method as the second parameter. Example usage:
+    #
+    #   class PointerHelper
+    #     def self.release(pointer)
+    #       ...
+    #     end
+    #   end
+    #
+    #   p = AutoPointer.new(other_pointer, PointerHelper.method(:release))
+    #
+    #  The above code will cause PointerHelper#release to be invoked at GC time.
+    #
+    # @note
+    #  The last calling idiom (only one parameter) is generally only
+    #  going to be useful if you subclass {AutoPointer}, and override
+    #  #release, which by default does nothing.
+    def initialize(ptr, proc=nil, &block)
+      super(ptr.type_size, ptr)
+      raise TypeError, "Invalid pointer" if ptr.nil? || !ptr.kind_of?(Pointer) \
+        || ptr.kind_of?(MemoryPointer) || ptr.kind_of?(AutoPointer)
+
+      @releaser = if proc
+                    if not proc.respond_to?(:call)
+                      raise RuntimeError.new("proc must be callable")
+                    end
+                    CallableReleaser.new(ptr, proc)
+
+                  else
+                    if not self.class.respond_to?(:release)
+                      raise RuntimeError.new("no release method defined")
+                    end
+                    DefaultReleaser.new(ptr, self.class)
+                  end
+
+      ObjectSpace.define_finalizer(self, @releaser)
+      self
+    end
+
+    # @return [nil]
+    # Free the pointer.
+    def free
+      @releaser.free
+    end
+
+    # @param [Boolean] autorelease
+    # @return [Boolean] +autorelease+
+    # Set +autorelease+ property. See {Pointer Autorelease section at Pointer}.
+    def autorelease=(autorelease)
+      @releaser.autorelease=(autorelease)
+    end
+
+    # @return [Boolean] +autorelease+
+    # Get +autorelease+ property. See {Pointer Autorelease section at Pointer}.
+    def autorelease?
+      @releaser.autorelease
+    end
+
+    # @abstract Base class for {AutoPointer}'s releasers.
+    #  
+    #  All subclasses of Releaser should define a +#release(ptr)+ method.
+    # A releaser is an object in charge of release an {AutoPointer}.
+    class Releaser
+      attr_accessor :autorelease
+
+      # @param [Pointer] ptr
+      # @param [#call] proc
+      # @return [nil]
+      # A new instance of Releaser.
+      def initialize(ptr, proc)
+        @ptr = ptr
+        @proc = proc
+        @autorelease = true
+      end
+
+      # @return [nil]
+      # Free pointer.
+      def free
+        if @ptr
+          release(@ptr)
+          @autorelease = false
+          @ptr = nil
+          @proc = nil
+        end
+      end
+
+      # @param args
+      # Release pointer if +autorelease+ is set.
+      def call(*args)
+        release(@ptr) if @autorelease && @ptr
+      end
+    end
+
+    # DefaultReleaser is a {Releaser} used when an {AutoPointer} is defined
+    # without Proc or Method. In this case, the pointer to release must be of
+    # a class derived from AutoPointer with a {release} class method.
+    class DefaultReleaser < Releaser
+      # @param [Pointer] ptr
+      # @return [nil]
+      # Release +ptr+ using the {release} class method of its class.
+      def release(ptr)
+        @proc.release(ptr)
+      end
+    end
+
+    # CallableReleaser is a {Releaser} used when an {AutoPointer} is defined with a
+    # Proc or a Method.
+    class CallableReleaser < Releaser
+      # Release +ptr+ by using Proc or Method defined at +ptr+
+      # {AutoPointer#initialize initialization}.
+      #
+      # @param [Pointer] ptr
+      # @return [nil]
+      def release(ptr)
+        @proc.call(ptr)
+      end
+    end
+
+    # Return native type of AutoPointer.
+    #
+    # Override {DataConverter#native_type}.
+    # @return [Type::POINTER]
+    # @raise {RuntimeError} if class does not implement a +#release+ method
+    def self.native_type
+      if not self.respond_to?(:release)
+        raise RuntimeError.new("no release method defined for #{self.inspect}")
+      end
+      Type::POINTER
+    end
+
+    # Create a new AutoPointer.
+    #
+    # Override {DataConverter#from_native}.
+    # @overload self.from_native(ptr, ctx)
+    #   @param [Pointer] ptr
+    #   @param ctx not used. Please set +nil+.
+    # @return [AutoPointer]
+    def self.from_native(val, ctx)
+      self.new(val)
+    end
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/buffer.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/buffer.rb
new file mode 100644
index 0000000..449e45b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/buffer.rb
@@ -0,0 +1,4 @@
+#
+# All the code from this file is now implemented in C.  This file remains
+# to satisfy any leftover require 'ffi/buffer' in user code
+#
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/callback.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/callback.rb
new file mode 100644
index 0000000..32d52f7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/callback.rb
@@ -0,0 +1,4 @@
+#
+# All the code from this file is now implemented in C.  This file remains
+# to satisfy any leftover require 'ffi/callback' in user code
+#
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/enum.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/enum.rb
new file mode 100644
index 0000000..846b836
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/enum.rb
@@ -0,0 +1,172 @@
+#
+# Copyright (C) 2009, 2010 Wayne Meissner
+# Copyright (C) 2009 Luc Heinrich
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.
+#
+
+module FFI
+
+  # An instance of this class permits to manage {Enum}s. In fact, Enums is a collection of {Enum}s.
+  class Enums
+
+    # @return [nil]
+    def initialize
+      @all_enums = Array.new
+      @tagged_enums = Hash.new
+      @symbol_map = Hash.new
+    end
+
+    # @param [Enum] enum
+    # Add an {Enum} to the collection.
+    def <<(enum)
+      @all_enums << enum
+      @tagged_enums[enum.tag] = enum unless enum.tag.nil?
+      @symbol_map.merge!(enum.symbol_map)
+    end
+
+    # @param query enum tag or part of an enum name
+    # @return [Enum]
+    # Find a {Enum} in collection.
+    def find(query)
+      if @tagged_enums.has_key?(query)
+        @tagged_enums[query]
+      else
+        @all_enums.detect { |enum| enum.symbols.include?(query) }
+      end
+    end
+
+    # @param symbol a symbol to find in merge symbol maps of all enums.
+    # @return a symbol
+    def __map_symbol(symbol)
+      @symbol_map[symbol]
+    end
+
+  end
+
+  # Represents a C enum.
+  #
+  # For a C enum:
+  #  enum fruits {
+  #    apple,
+  #    banana,
+  #    orange,
+  #    pineapple
+  #  };
+  # are defined this vocabulary:
+  # * a _symbol_ is a word from the enumeration (ie. _apple_, by example);
+  # * a _value_ is the value of a symbol in the enumeration (by example, apple has value _0_ and banana _1_).
+  class Enum
+    include DataConverter
+
+    attr_reader :tag
+    attr_reader :native_type
+
+    # @overload initialize(info, tag=nil)
+    #   @param [nil, Enumerable] info
+    #   @param [nil, Symbol] tag enum tag
+    # @overload initialize(native_type, info, tag=nil)
+    #   @param [FFI::Type] native_type Native type for new Enum
+    #   @param [nil, Enumerable] info symbols and values for new Enum
+    #   @param [nil, Symbol] tag name of new Enum
+    def initialize(*args)
+      @native_type = args.first.kind_of?(FFI::Type) ? args.shift : Type::INT
+      info, @tag = *args
+      @kv_map = Hash.new
+      unless info.nil?
+        last_cst = nil
+        value = 0
+        info.each do |i|
+          case i
+          when Symbol
+            raise ArgumentError, "duplicate enum key" if @kv_map.has_key?(i)
+            @kv_map[i] = value
+            last_cst = i
+            value += 1
+          when Integer
+            @kv_map[last_cst] = i
+            value = i+1
+          end
+        end
+      end
+      @vk_map = @kv_map.invert
+    end
+
+    # @return [Array] enum symbol names
+    def symbols
+      @kv_map.keys
+    end
+
+    # Get a symbol or a value from the enum.
+    # @overload [](query)
+    #  Get enum value from symbol.
+    #  @param [Symbol] query
+    #  @return [Integer]
+    # @overload [](query)
+    #  Get enum symbol from value.
+    #  @param [Integer] query
+    #  @return [Symbol]
+    def [](query)
+      case query
+      when Symbol
+        @kv_map[query]
+      when Integer
+        @vk_map[query]
+      end
+    end
+    alias find []
+
+    # Get the symbol map.
+    # @return [Hash]
+    def symbol_map
+      @kv_map
+    end
+
+    alias to_h symbol_map
+    alias to_hash symbol_map
+
+    # @param [Symbol, Integer, #to_int] val
+    # @param ctx unused
+    # @return [Integer] value of a enum symbol
+    def to_native(val, ctx)
+      @kv_map[val] || if val.is_a?(Integer)
+        val
+      elsif val.respond_to?(:to_int)
+        val.to_int
+      else
+        raise ArgumentError, "invalid enum value, #{val.inspect}"
+      end
+    end
+
+    # @param val
+    # @return symbol name if it exists for +val+.
+    def from_native(val, ctx)
+      @vk_map[val] || val
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/errno.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/errno.rb
new file mode 100644
index 0000000..de82d89
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/errno.rb
@@ -0,0 +1,43 @@
+#
+# Copyright (C) 2008-2010 Wayne Meissner
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.#
+
+module FFI
+  # @return (see FFI::LastError.error)
+  # @see FFI::LastError.error
+  def self.errno
+    FFI::LastError.error
+  end
+  # @param error (see FFI::LastError.error=)
+  # @return (see FFI::LastError.error=)
+  # @see FFI::LastError.error=
+  def self.errno=(error)
+    FFI::LastError.error = error
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/ffi.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/ffi.rb
new file mode 100644
index 0000000..11d451f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/ffi.rb
@@ -0,0 +1,44 @@
+#
+# Copyright (C) 2008-2010 JRuby project
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.
+
+require 'ffi/platform'
+require 'ffi/types'
+require 'ffi/library'
+require 'ffi/errno'
+require 'ffi/pointer'
+require 'ffi/memorypointer'
+require 'ffi/struct'
+require 'ffi/union'
+require 'ffi/managedstruct'
+require 'ffi/callback'
+require 'ffi/io'
+require 'ffi/autopointer'
+require 'ffi/variadic'
+require 'ffi/enum'
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/io.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/io.rb
new file mode 100644
index 0000000..7fa1cf7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/io.rb
@@ -0,0 +1,62 @@
+#
+# Copyright (C) 2008, 2009 Wayne Meissner
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.#
+
+module FFI
+  
+  # This module implements a couple of class methods to play with IO.
+  module IO
+    # @param [Integer] fd file decriptor
+    # @param [String] mode mode string
+    # @return [::IO]
+    # Synonym for IO::for_fd.
+    def self.for_fd(fd, mode = "r")
+      ::IO.for_fd(fd, mode)
+    end
+
+    # @param [#read] io io to read from
+    # @param [AbstractMemory] buf destination for data read from +io+
+    # @param [nil, Numeric] len maximul number of bytes to read from +io+. If +nil+, 
+    #  read until end of file.
+    # @return [Numeric] length really read, in bytes
+    #
+    # A version of IO#read that reads data from an IO and put then into a native buffer.
+    # 
+    # This will be optimized at some future time to eliminate the double copy.
+    #
+    def self.native_read(io, buf, len)
+      tmp = io.read(len)
+      return -1 unless tmp
+      buf.put_bytes(0, tmp)
+      tmp.length
+    end
+
+  end
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/library.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/library.rb
new file mode 100644
index 0000000..5d52edd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/library.rb
@@ -0,0 +1,538 @@
+#
+# Copyright (C) 2008-2010 Wayne Meissner
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.#
+
+module FFI
+  CURRENT_PROCESS = USE_THIS_PROCESS_AS_LIBRARY = Object.new
+
+  # @param [#to_s] lib library name
+  # @return [String] library name formatted for current platform
+  # Transform a generic library name to a platform library name
+  # @example
+  #  # Linux
+  #  FFI.map_library_name 'c'     # -> "libc.so.6"
+  #  FFI.map_library_name 'jpeg'  # -> "libjpeg.so"
+  #  # Windows
+  #  FFI.map_library_name 'c'     # -> "msvcrt.dll"
+  #  FFI.map_library_name 'jpeg'  # -> "jpeg.dll"
+  def self.map_library_name(lib)
+    # Mangle the library name to reflect the native library naming conventions
+    lib = lib.to_s unless lib.kind_of?(String)
+    lib = Library::LIBC if lib == 'c'
+
+    if lib && File.basename(lib) == lib
+      lib = Platform::LIBPREFIX + lib unless lib =~ /^#{Platform::LIBPREFIX}/
+      r = Platform::IS_GNU ? "\\.so($|\\.[1234567890]+)" : "\\.#{Platform::LIBSUFFIX}$"
+      lib += ".#{Platform::LIBSUFFIX}" unless lib =~ /#{r}/
+    end
+
+    lib
+  end
+
+  # Exception raised when a function is not found in libraries
+  class NotFoundError < LoadError
+    def initialize(function, *libraries)
+      super("Function '#{function}' not found in [#{libraries[0].nil? ? 'current process' : libraries.join(", ")}]")
+    end
+  end
+
+  # This module is the base to use native functions.
+  #
+  # A basic usage may be:
+  #  require 'ffi'
+  #  
+  #  module Hello
+  #    extend FFI::Library
+  #    ffi_lib FFI::Library::LIBC
+  #    attach_function 'puts', [ :string ], :int
+  #  end
+  #  
+  #  Hello.puts("Hello, World")
+  #
+  # 
+  module Library
+    CURRENT_PROCESS = FFI::CURRENT_PROCESS
+    LIBC = FFI::Platform::LIBC
+
+    # @param mod extended object
+    # @return [nil]
+    # @raise {RuntimeError} if +mod+ is not a Module
+    # Test if extended object is a Module. If not, raise RuntimeError.
+    def self.extended(mod)
+      raise RuntimeError.new("must only be extended by module") unless mod.kind_of?(Module)
+    end
+
+    
+    # @param [Array] names names of libraries to load
+    # @return [Array<DynamicLibrary>]
+    # @raise {LoadError} if a library cannot be opened
+    # Load native libraries.
+    def ffi_lib(*names)
+      raise LoadError.new("library names list must not be empty") if names.empty?
+
+      lib_flags = defined?(@ffi_lib_flags) ? @ffi_lib_flags : FFI::DynamicLibrary::RTLD_LAZY | FFI::DynamicLibrary::RTLD_LOCAL
+      ffi_libs = names.map do |name|
+
+        if name == FFI::CURRENT_PROCESS
+          FFI::DynamicLibrary.open(nil, FFI::DynamicLibrary::RTLD_LAZY | FFI::DynamicLibrary::RTLD_LOCAL)
+
+        else
+          libnames = (name.is_a?(::Array) ? name : [ name ]).map { |n| [ n, FFI.map_library_name(n) ].uniq }.flatten.compact
+          lib = nil
+          errors = {}
+
+          libnames.each do |libname|
+            begin
+              orig = libname
+              lib = FFI::DynamicLibrary.open(libname, lib_flags)
+              break if lib
+
+            rescue Exception => ex
+              ldscript = false
+              if ex.message =~ /(([^ \t()])+\.so([^ \t:()])*):([ \t])*(invalid ELF header|file too short|invalid file format)/
+                if File.read($1) =~ /(?:GROUP|INPUT) *\( *([^ \)]+)/
+                  libname = $1
+                  ldscript = true
+                end
+              end
+
+              if ldscript
+                retry
+              else
+                # TODO better library lookup logic
+                libname = libname.to_s
+                unless libname.start_with?("/")
+                  path = ['/usr/lib/','/usr/local/lib/'].find do |pth|
+                    File.exist?(pth + libname)
+                  end
+                  if path
+                    libname = path + libname
+                    retry
+                  end
+                end
+
+                libr = (orig == libname ? orig : "#{orig} #{libname}")
+                errors[libr] = ex
+              end
+            end
+          end
+
+          if lib.nil?
+            raise LoadError.new(errors.values.join(".\n"))
+          end
+
+          # return the found lib
+          lib
+        end
+      end
+
+      @ffi_libs = ffi_libs
+    end
+
+    # Set the calling convention for {#attach_function} and {#callback}
+    #
+    # @see http://en.wikipedia.org/wiki/Stdcall#stdcall
+    # @note +:stdcall+ is typically used for attaching Windows API functions
+    #
+    # @param [Symbol] convention one of +:default+, +:stdcall+
+    # @return [Symbol] the new calling convention
+    def ffi_convention(convention = nil)
+      @ffi_convention ||= :default
+      @ffi_convention = convention if convention
+      @ffi_convention
+    end
+
+    # @see #ffi_lib
+    # @return [Array<FFI::DynamicLibrary>] array of currently loaded FFI libraries
+    # @raise [LoadError] if no libraries have been loaded (using {#ffi_lib})
+    # Get FFI libraries loaded using {#ffi_lib}.
+    def ffi_libraries
+      raise LoadError.new("no library specified") if !defined?(@ffi_libs) || @ffi_libs.empty?
+      @ffi_libs
+    end
+
+    # Flags used in {#ffi_lib}.
+    #
+    # This map allows you to supply symbols to {#ffi_lib_flags} instead of
+    # the actual constants.
+    FlagsMap = {
+      :global => DynamicLibrary::RTLD_GLOBAL,
+      :local => DynamicLibrary::RTLD_LOCAL,
+      :lazy => DynamicLibrary::RTLD_LAZY,
+      :now => DynamicLibrary::RTLD_NOW
+    }
+
+    # Sets library flags for {#ffi_lib}.
+    #
+    # @example
+    #   ffi_lib_flags(:lazy, :local) # => 5
+    #
+    # @param [Symbol, …] flags (see {FlagsMap})
+    # @return [Fixnum] the new value
+    def ffi_lib_flags(*flags)
+      @ffi_lib_flags = flags.inject(0) { |result, f| result | FlagsMap[f] }
+    end
+
+
+    ##
+    # @overload attach_function(func, args, returns, options = {})
+    #  @example attach function without an explicit name
+    #    module Foo
+    #      extend FFI::Library
+    #      ffi_lib FFI::Library::LIBC
+    #      attach_function :malloc, [:size_t], :pointer
+    #    end
+    #    # now callable via Foo.malloc
+    # @overload attach_function(name, func, args, returns, options = {})
+    #  @example attach function with an explicit name
+    #    module Bar
+    #      extend FFI::Library
+    #      ffi_lib FFI::Library::LIBC
+    #      attach_function :c_malloc, :malloc, [:size_t], :pointer
+    #    end
+    #    # now callable via Bar.c_malloc
+    #
+    # Attach C function +func+ to this module.
+    #
+    #
+    # @param [#to_s] name name of ruby method to attach as
+    # @param [#to_s] func name of C function to attach
+    # @param [Array<Symbol>] args an array of types
+    # @param [Symbol] returns type of return value
+    # @option options [Boolean] :blocking (@blocking) set to true if the C function is a blocking call
+    # @option options [Symbol] :convention (:default) calling convention (see {#ffi_convention})
+    # @option options [FFI::Enums] :enums
+    # @option options [Hash] :type_map
+    #
+    # @return [FFI::VariadicInvoker]
+    #
+    # @raise [FFI::NotFoundError] if +func+ cannot be found in the attached libraries (see {#ffi_lib})
+    def attach_function(name, func, args, returns = nil, options = nil)
+      mname, a2, a3, a4, a5 = name, func, args, returns, options
+      cname, arg_types, ret_type, opts = (a4 && (a2.is_a?(String) || a2.is_a?(Symbol))) ? [ a2, a3, a4, a5 ] : [ mname.to_s, a2, a3, a4 ]
+
+      # Convert :foo to the native type
+      arg_types = arg_types.map { |e| find_type(e) }
+      options = {
+        :convention => ffi_convention,
+        :type_map => defined?(@ffi_typedefs) ? @ffi_typedefs : nil,
+        :blocking => defined?(@blocking) && @blocking,
+        :enums => defined?(@ffi_enums) ? @ffi_enums : nil,
+      }
+
+      @blocking = false
+      options.merge!(opts) if opts && opts.is_a?(Hash)
+
+      # Try to locate the function in any of the libraries
+      invokers = []
+      ffi_libraries.each do |lib|
+        if invokers.empty?
+          begin
+            function = nil
+            function_names(cname, arg_types).find do |fname|
+              function = lib.find_function(fname)
+            end
+            raise LoadError unless function
+
+            invokers << if arg_types.length > 0 && arg_types[arg_types.length - 1] == FFI::NativeType::VARARGS
+              VariadicInvoker.new(function, arg_types, find_type(ret_type), options)
+
+            else
+              Function.new(find_type(ret_type), arg_types, function, options)
+            end
+
+          rescue LoadError
+          end
+        end
+      end
+      invoker = invokers.compact.shift
+      raise FFI::NotFoundError.new(cname.to_s, ffi_libraries.map { |lib| lib.name }) unless invoker
+
+      invoker.attach(self, mname.to_s)
+      invoker
+    end
+
+    # @param [#to_s] name function name
+    # @param [Array] arg_types function's argument types
+    # @return [Array<String>]
+    # This function returns a list of possible names to lookup.
+    # @note Function names on windows may be decorated if they are using stdcall. See
+    #   * http://en.wikipedia.org/wiki/Name_mangling#C_name_decoration_in_Microsoft_Windows
+    #   * http://msdn.microsoft.com/en-us/library/zxk0tw93%28v=VS.100%29.aspx
+    #   * http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions#STDCALL
+    #   Note that decorated names can be overridden via def files.  Also note that the
+    #   windows api, although using, doesn't have decorated names.
+    def function_names(name, arg_types)
+      result = [name.to_s]
+      if ffi_convention == :stdcall
+        # Get the size of each parameter
+        size = arg_types.inject(0) do |mem, arg|
+          size = arg.size
+          # The size must be a multiple of 4
+          size += (4 - size) % 4
+          mem + size
+        end
+
+        result << "_#{name.to_s}@#{size}" # win32
+        result << "#{name.to_s}@#{size}" # win64
+      end
+      result
+    end
+
+    # @overload attach_variable(mname, cname, type)
+    #   @param [#to_s] mname name of ruby method to attach as
+    #   @param [#to_s] cname name of C variable to attach
+    #   @param [DataConverter, Struct, Symbol, Type] type C variable's type
+    #   @example
+    #     module Bar
+    #       extend FFI::Library
+    #       ffi_lib 'my_lib'
+    #       attach_variable :c_myvar, :myvar, :long
+    #     end
+    #     # now callable via Bar.c_myvar
+    # @overload attach_variable(cname, type)
+    #   @param [#to_s] mname name of ruby method to attach as
+    #   @param [DataConverter, Struct, Symbol, Type] type C variable's type
+    #   @example
+    #     module Bar
+    #       extend FFI::Library
+    #       ffi_lib 'my_lib'
+    #       attach_variable :myvar, :long
+    #     end
+    #     # now callable via Bar.myvar
+    # @return [DynamicLibrary::Symbol]
+    # @raise {FFI::NotFoundError} if +cname+ cannot be found in libraries
+    #
+    # Attach C variable +cname+ to this module.
+    def attach_variable(mname, a1, a2 = nil)
+      cname, type = a2 ? [ a1, a2 ] : [ mname.to_s, a1 ]
+      address = nil
+      ffi_libraries.each do |lib|
+        begin
+          address = lib.find_variable(cname.to_s)
+          break unless address.nil?
+        rescue LoadError
+        end
+      end
+
+      raise FFI::NotFoundError.new(cname, ffi_libraries) if address.nil? || address.null?
+      if type.is_a?(Class) && type < FFI::Struct
+        # If it is a global struct, just attach directly to the pointer
+        s = type.new(address)
+        self.module_eval <<-code, __FILE__, __LINE__
+          @@ffi_gvar_#{mname} = s
+          def self.#{mname}
+            @@ffi_gvar_#{mname}
+          end
+        code
+
+      else
+        sc = Class.new(FFI::Struct)
+        sc.layout :gvar, find_type(type)
+        s = sc.new(address)
+        #
+        # Attach to this module as mname/mname=
+        #
+        self.module_eval <<-code, __FILE__, __LINE__
+          @@ffi_gvar_#{mname} = s
+          def self.#{mname}
+            @@ffi_gvar_#{mname}[:gvar]
+          end
+          def self.#{mname}=(value)
+            @@ffi_gvar_#{mname}[:gvar] = value
+          end
+        code
+
+      end
+
+      address
+    end
+
+
+    # @overload callback(name, params, ret)
+    #   @param name callback name to add to type map
+    #   @param [Array] params array of parameters' types
+    #   @param [DataConverter, Struct, Symbol, Type] ret callback return type
+    # @overload callback(params, ret)
+    #   @param [Array] params array of parameters' types
+    #   @param [DataConverter, Struct, Symbol, Type] ret callback return type
+    # @return [FFI::CallbackInfo]
+    def callback(*args)
+      raise ArgumentError, "wrong number of arguments" if args.length < 2 || args.length > 3
+      name, params, ret = if args.length == 3
+        args
+      else
+        [ nil, args[0], args[1] ]
+      end
+
+      native_params = params.map { |e| find_type(e) }
+      raise ArgumentError, "callbacks cannot have variadic parameters" if native_params.include?(FFI::Type::VARARGS)
+      options = Hash.new
+      options[:convention] = ffi_convention
+      options[:enums] = @ffi_enums if defined?(@ffi_enums)
+      cb = FFI::CallbackInfo.new(find_type(ret), native_params, options)
+
+      # Add to the symbol -> type map (unless there was no name)
+      unless name.nil?
+        typedef cb, name
+      end
+
+      cb
+    end
+
+    # Register or get an already registered type definition.
+    #
+    # To register a new type definition, +old+ should be a {FFI::Type}. +add+
+    # is in this case the type definition.
+    #
+    # If +old+ is a {DataConverter}, a {Type::Mapped} is returned.
+    #
+    # If +old+ is +:enum+
+    # * and +add+ is an +Array+, a call to {#enum} is made with +add+ as single parameter;
+    # * in others cases, +info+ is used to create a named enum.
+    #
+    # If +old+ is a key for type map, #typedef get +old+ type definition.
+    #
+    # @param [DataConverter, Symbol, Type] old
+    # @param [Symbol] add
+    # @param [Symbol] info
+    # @return [FFI::Enum, FFI::Type]
+    def typedef(old, add, info=nil)
+      @ffi_typedefs = Hash.new unless defined?(@ffi_typedefs)
+
+      @ffi_typedefs[add] = if old.kind_of?(FFI::Type)
+        old
+
+      elsif @ffi_typedefs.has_key?(old)
+        @ffi_typedefs[old]
+
+      elsif old.is_a?(DataConverter)
+        FFI::Type::Mapped.new(old)
+
+      elsif old == :enum
+        if add.kind_of?(Array)
+          self.enum(add)
+        else
+          self.enum(info, add)
+        end
+
+      else
+        FFI.find_type(old)
+      end
+    end
+
+    # @overload enum(name, values)
+    #  Create a named enum.
+    #  @example
+    #   enum :foo, [:zero, :one, :two]  # named enum
+    #  @param [Symbol] name name for new enum
+    #  @param [Array] values values for enum
+    # @overload enum(*args)
+    #  Create an unnamed enum.
+    #  @example
+    #   enum :zero, :one, :two  # unnamed enum
+    #  @param args values for enum
+    # @overload enum(values)
+    #  Create an unnamed enum.
+    #  @example
+    #   enum [:zero, :one, :two]  # unnamed enum, equivalent to above example
+    #  @param [Array] values values for enum
+    # @overload enum(native_type, name, values)
+    #  Create a named enum and specify the native type.
+    #  @example
+    #   enum FFI::Type::UINT64, :foo, [:zero, :one, :two]  # named enum
+    #  @param [FFI::Type] native_type native type for new enum
+    #  @param [Symbol] name name for new enum
+    #  @param [Array] values values for enum
+    # @overload enum(native_type, *args)
+    #  Create an unnamed enum and specify the native type.
+    #  @example
+    #   enum FFI::Type::UINT64, :zero, :one, :two  # unnamed enum
+    #  @param [FFI::Type] native_type native type for new enum
+    #  @param args values for enum
+    # @overload enum(native_type, values)
+    #  Create an unnamed enum and specify the native type.
+    #  @example
+    #   enum Type::UINT64, [:zero, :one, :two]  # unnamed enum, equivalent to above example
+    #  @param [FFI::Type] native_type native type for new enum
+    #  @param [Array] values values for enum
+    # @return [FFI::Enum]
+    # Create a new {FFI::Enum}.
+    def enum(*args)
+      native_type = args.first.kind_of?(FFI::Type) ? args.shift : nil
+      name, values = if args[0].kind_of?(Symbol) && args[1].kind_of?(Array)
+        [ args[0], args[1] ]
+      elsif args[0].kind_of?(Array)
+        [ nil, args[0] ]
+      else
+        [ nil, args ]
+      end
+      @ffi_enums = FFI::Enums.new unless defined?(@ffi_enums)
+      @ffi_enums << (e = native_type ? FFI::Enum.new(native_type, values, name) : FFI::Enum.new(values, name))
+
+      # If called as enum :foo, [ :zero, :one, :two ], add a typedef alias
+      typedef(e, name) if name
+      e
+    end
+
+    # @param name
+    # @return [FFI::Enum]
+    # Find an enum by name.
+    def enum_type(name)
+      @ffi_enums.find(name) if defined?(@ffi_enums)
+    end
+
+    # @param symbol
+    # @return [FFI::Enum]
+    # Find an enum by a symbol it contains.
+    def enum_value(symbol)
+      @ffi_enums.__map_symbol(symbol)
+    end
+
+    # @param [DataConverter, Type, Struct, Symbol] t type to find
+    # @return [Type]
+    # Find a type definition.
+    def find_type(t)
+      if t.kind_of?(Type)
+        t
+
+      elsif defined?(@ffi_typedefs) && @ffi_typedefs.has_key?(t)
+        @ffi_typedefs[t]
+
+      elsif t.is_a?(Class) && t < Struct
+        Type::POINTER
+
+      elsif t.is_a?(DataConverter)
+        # Add a typedef so next time the converter is used, it hits the cache
+        typedef Type::Mapped.new(t), t
+
+      end || FFI.find_type(t)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/managedstruct.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/managedstruct.rb
new file mode 100644
index 0000000..0536280
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/managedstruct.rb
@@ -0,0 +1,84 @@
+# Copyright (C) 2008 Mike Dalessio
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.
+
+module FFI
+  #
+  # FFI::ManagedStruct allows custom garbage-collection of your FFI::Structs.
+  #
+  # The typical use case would be when interacting with a library
+  # that has a nontrivial memory management design, such as a linked
+  # list or a binary tree.
+  #
+  # When the {Struct} instance is garbage collected, FFI::ManagedStruct will
+  # invoke the class's release() method during object finalization.
+  #
+  # @example Example usage:
+  #  module MyLibrary
+  #    ffi_lib "libmylibrary"
+  #    attach_function :new_dlist, [], :pointer
+  #    attach_function :destroy_dlist, [:pointer], :void
+  #  end
+  #  
+  #  class DoublyLinkedList < FFI::ManagedStruct
+  #    @@@
+  #    struct do |s|
+  #      s.name 'struct dlist'
+  #      s.include 'dlist.h'
+  #      s.field :head, :pointer
+  #      s.field :tail, :pointer
+  #    end
+  #    @@@
+  #
+  #    def self.release ptr
+  #      MyLibrary.destroy_dlist(ptr)
+  #    end
+  #  end
+  #
+  #  begin
+  #    ptr = DoublyLinkedList.new(MyLibrary.new_dlist)
+  #    #  do something with the list
+  #  end
+  #  # struct is out of scope, and will be GC'd using DoublyLinkedList#release
+  #
+  #
+  class ManagedStruct < FFI::Struct
+
+    # @overload initialize(pointer)
+    #  @param [Pointer] pointer
+    #  Create a new ManagedStruct which will invoke the class method #release on 
+    # @overload initialize
+    # A new instance of FFI::ManagedStruct.
+    def initialize(pointer=nil)
+      raise NoMethodError, "release() not implemented for class #{self}" unless self.class.respond_to? :release
+      raise ArgumentError, "Must supply a pointer to memory for the Struct" unless pointer
+      super AutoPointer.new(pointer, self.class.method(:release))
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/memorypointer.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/memorypointer.rb
new file mode 100644
index 0000000..9f07bc6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/memorypointer.rb
@@ -0,0 +1 @@
+# This class is now implemented in C
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform.rb
new file mode 100644
index 0000000..7393459
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform.rb
@@ -0,0 +1,159 @@
+#
+# Copyright (C) 2008, 2009 Wayne Meissner
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.#
+
+require 'rbconfig'
+module FFI
+  class PlatformError < LoadError; end
+
+  # This module defines different constants and class methods to play with
+  # various platforms.
+  module Platform
+    OS = case RbConfig::CONFIG['host_os'].downcase
+    when /linux/
+      "linux"
+    when /darwin/
+      "darwin"
+    when /freebsd/
+      "freebsd"
+    when /netbsd/
+      "netbsd"
+    when /openbsd/
+      "openbsd"
+    when /sunos|solaris/
+      "solaris"
+    when /mingw|mswin/
+      "windows"
+    else
+      RbConfig::CONFIG['host_os'].downcase
+    end
+
+    ARCH = case CPU.downcase
+    when /amd64|x86_64/
+      "x86_64"
+    when /i?86|x86|i86pc/
+      "i386"
+    when /ppc64|powerpc64/
+      "powerpc64"
+    when /ppc|powerpc/
+      "powerpc"
+    else
+      case RbConfig::CONFIG['host_cpu']
+      when /^arm/
+        "arm"
+      else
+        RbConfig::CONFIG['host_cpu']
+      end
+    end
+
+    private
+    # @param [String) os
+    # @return [Boolean]
+    # Test if current OS is +os+.
+    def self.is_os(os)
+      OS == os
+    end
+
+    NAME = "#{ARCH}-#{OS}"
+    IS_GNU = defined?(GNU_LIBC)
+    IS_LINUX = is_os("linux")
+    IS_MAC = is_os("darwin")
+    IS_FREEBSD = is_os("freebsd")
+    IS_NETBSD = is_os("netbsd")
+    IS_OPENBSD = is_os("openbsd")
+    IS_SOLARIS = is_os("solaris")
+    IS_WINDOWS = is_os("windows")
+    IS_BSD = IS_MAC || IS_FREEBSD || IS_NETBSD || IS_OPENBSD
+    CONF_DIR = File.join(File.dirname(__FILE__), 'platform', NAME)
+
+    public
+
+    LIBPREFIX = case OS
+    when /windows/
+      ''
+    when /cygwin/
+      'cyg'
+    else
+      'lib'
+    end
+
+    LIBSUFFIX = case OS
+    when /darwin/
+      'dylib'
+    when /linux|bsd|solaris/
+      'so'
+    when /windows|cygwin/
+      'dll'
+    else
+      # Punt and just assume a sane unix (i.e. anything but AIX)
+      'so'
+    end
+
+    LIBC = if IS_WINDOWS
+      RbConfig::CONFIG['RUBY_SO_NAME'].split('-')[-2] + '.dll'
+    elsif IS_GNU
+      GNU_LIBC
+    elsif OS == 'cygwin'
+      "cygwin1.dll"
+    else
+      "#{LIBPREFIX}c.#{LIBSUFFIX}"
+    end
+
+    # Test if current OS is a *BSD (include MAC)
+    # @return [Boolean]
+    def self.bsd?
+      IS_BSD
+    end
+
+    # Test if current OS is Windows
+    # @return [Boolean]
+    def self.windows?
+      IS_WINDOWS
+    end
+
+    # Test if current OS is Mac OS
+    # @return [Boolean]
+    def self.mac?
+      IS_MAC
+    end
+
+    # Test if current OS is Solaris (Sun OS)
+    # @return [Boolean]
+    def self.solaris?
+      IS_SOLARIS
+    end
+
+    # Test if current OS is a unix OS
+    # @return [Boolean]
+    def self.unix?
+      !IS_WINDOWS
+    end
+  end
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/aarch64-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/aarch64-linux/types.conf
new file mode 100644
index 0000000..072c419
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/aarch64-linux/types.conf
@@ -0,0 +1,104 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long
+rbx.platform.typedef.__uint64_t = ulong
+rbx.platform.typedef.__quad_t = long
+rbx.platform.typedef.__u_quad_t = ulong
+rbx.platform.typedef.__dev_t = ulong
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.__blksize_t = int
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong
+rbx.platform.typedef.__fsword_t = long
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__syscall_slong_t = long
+rbx.platform.typedef.__syscall_ulong_t = ulong
+rbx.platform.typedef.__loff_t = long
+rbx.platform.typedef.*__qaddr_t = long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = long
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long
+rbx.platform.typedef.u_quad_t = ulong
+rbx.platform.typedef.loff_t = long
+rbx.platform.typedef.ino_t = ulong
+rbx.platform.typedef.dev_t = ulong
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blksize_t = int
+rbx.platform.typedef.blkcnt_t = long
+rbx.platform.typedef.fsblkcnt_t = ulong
+rbx.platform.typedef.fsfilcnt_t = ulong
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/arm-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/arm-linux/types.conf
new file mode 100644
index 0000000..e9a923b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/arm-linux/types.conf
@@ -0,0 +1,104 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__quad_t = long_long
+rbx.platform.typedef.__u_quad_t = ulong_long
+rbx.platform.typedef.__dev_t = ulong_long
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__in_addr_t = uint
+rbx.platform.typedef.__in_port_t = ushort
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong_long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long_long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong_long
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__swblk_t = long
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long_long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong_long
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong_long
+rbx.platform.typedef.__ssize_t = int
+rbx.platform.typedef.__loff_t = long_long
+rbx.platform.typedef.*__qaddr_t = long_long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.loff_t = long_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.dev_t = ulong_long
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-cygwin/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-cygwin/types.conf
new file mode 100644
index 0000000..cd3cc38
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-cygwin/types.conf
@@ -0,0 +1,3 @@
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ptrdiff_t = int
+rbx.platform.typedef.ssize_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-darwin/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-darwin/types.conf
new file mode 100644
index 0000000..6b9313e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-darwin/types.conf
@@ -0,0 +1,100 @@
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__darwin_intptr_t = long
+rbx.platform.typedef.__darwin_natural_t = uint
+rbx.platform.typedef.__darwin_ct_rune_t = int
+rbx.platform.typedef.__darwin_ptrdiff_t = int
+rbx.platform.typedef.__darwin_size_t = ulong
+rbx.platform.typedef.__darwin_wchar_t = int
+rbx.platform.typedef.__darwin_rune_t = int
+rbx.platform.typedef.__darwin_wint_t = int
+rbx.platform.typedef.__darwin_clock_t = ulong
+rbx.platform.typedef.__darwin_socklen_t = uint
+rbx.platform.typedef.__darwin_ssize_t = long
+rbx.platform.typedef.__darwin_time_t = long
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = int
+rbx.platform.typedef.intptr_t = long
+rbx.platform.typedef.uintptr_t = ulong
+rbx.platform.typedef.user_addr_t = ulong_long
+rbx.platform.typedef.user_size_t = ulong_long
+rbx.platform.typedef.user_ssize_t = long_long
+rbx.platform.typedef.user_long_t = long_long
+rbx.platform.typedef.user_ulong_t = ulong_long
+rbx.platform.typedef.user_time_t = long_long
+rbx.platform.typedef.syscall_arg_t = ulong_long
+rbx.platform.typedef.__darwin_blkcnt_t = long_long
+rbx.platform.typedef.__darwin_blksize_t = int
+rbx.platform.typedef.__darwin_dev_t = int
+rbx.platform.typedef.__darwin_fsblkcnt_t = uint
+rbx.platform.typedef.__darwin_fsfilcnt_t = uint
+rbx.platform.typedef.__darwin_gid_t = uint
+rbx.platform.typedef.__darwin_id_t = uint
+rbx.platform.typedef.__darwin_ino64_t = ulong_long
+rbx.platform.typedef.__darwin_ino_t = ulong_long
+rbx.platform.typedef.__darwin_mach_port_name_t = uint
+rbx.platform.typedef.__darwin_mach_port_t = uint
+rbx.platform.typedef.__darwin_mode_t = ushort
+rbx.platform.typedef.__darwin_off_t = long_long
+rbx.platform.typedef.__darwin_pid_t = int
+rbx.platform.typedef.__darwin_pthread_key_t = ulong
+rbx.platform.typedef.__darwin_sigset_t = uint
+rbx.platform.typedef.__darwin_suseconds_t = int
+rbx.platform.typedef.__darwin_uid_t = uint
+rbx.platform.typedef.__darwin_useconds_t = uint
+rbx.platform.typedef.__darwin_uuid_t[16] = uchar
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.qaddr_t = pointer
+rbx.platform.typedef.caddr_t = string
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.dev_t = int
+rbx.platform.typedef.fixpt_t = uint
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.blksize_t = int
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.ino64_t = ulong_long
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.mode_t = ushort
+rbx.platform.typedef.nlink_t = ushort
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.segsz_t = int
+rbx.platform.typedef.swblk_t = int
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.clock_t = ulong
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = int
+rbx.platform.typedef.fd_mask = int
+rbx.platform.typedef.pthread_key_t = ulong
+rbx.platform.typedef.fsblkcnt_t = uint
+rbx.platform.typedef.fsfilcnt_t = uint
+rbx.platform.typedef.sa_family_t = uchar
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.rlim_t = ulong_long
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-freebsd/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-freebsd/types.conf
new file mode 100644
index 0000000..3e7b20d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-freebsd/types.conf
@@ -0,0 +1,152 @@
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__clock_t = ulong
+rbx.platform.typedef.__cpumask_t = uint
+rbx.platform.typedef.__critical_t = int
+rbx.platform.typedef.__intfptr_t = int
+rbx.platform.typedef.__intmax_t = long_long
+rbx.platform.typedef.__intptr_t = int
+rbx.platform.typedef.__int_fast8_t = int
+rbx.platform.typedef.__int_fast16_t = int
+rbx.platform.typedef.__int_fast32_t = int
+rbx.platform.typedef.__int_fast64_t = long_long
+rbx.platform.typedef.__int_least8_t = char
+rbx.platform.typedef.__int_least16_t = short
+rbx.platform.typedef.__int_least32_t = int
+rbx.platform.typedef.__int_least64_t = long_long
+rbx.platform.typedef.__ptrdiff_t = int
+rbx.platform.typedef.__register_t = int
+rbx.platform.typedef.__segsz_t = int
+rbx.platform.typedef.__size_t = uint
+rbx.platform.typedef.__ssize_t = int
+rbx.platform.typedef.__time_t = int
+rbx.platform.typedef.__uintfptr_t = uint
+rbx.platform.typedef.__uintmax_t = ulong_long
+rbx.platform.typedef.__uintptr_t = uint
+rbx.platform.typedef.__uint_fast8_t = uint
+rbx.platform.typedef.__uint_fast16_t = uint
+rbx.platform.typedef.__uint_fast32_t = uint
+rbx.platform.typedef.__uint_fast64_t = ulong_long
+rbx.platform.typedef.__uint_least8_t = uchar
+rbx.platform.typedef.__uint_least16_t = ushort
+rbx.platform.typedef.__uint_least32_t = uint
+rbx.platform.typedef.__uint_least64_t = ulong_long
+rbx.platform.typedef.__u_register_t = uint
+rbx.platform.typedef.__vm_offset_t = uint
+rbx.platform.typedef.__vm_ooffset_t = long_long
+rbx.platform.typedef.__vm_paddr_t = uint
+rbx.platform.typedef.__vm_pindex_t = ulong_long
+rbx.platform.typedef.__vm_size_t = uint
+rbx.platform.typedef.__blksize_t = uint
+rbx.platform.typedef.__blkcnt_t = long_long
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__fflags_t = uint
+rbx.platform.typedef.__fsblkcnt_t = ulong_long
+rbx.platform.typedef.__fsfilcnt_t = ulong_long
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__id_t = long_long
+rbx.platform.typedef.__ino_t = uint
+rbx.platform.typedef.__key_t = long
+rbx.platform.typedef.__lwpid_t = int
+rbx.platform.typedef.__mode_t = ushort
+rbx.platform.typedef.__accmode_t = int
+rbx.platform.typedef.__nl_item = int
+rbx.platform.typedef.__nlink_t = ushort
+rbx.platform.typedef.__off_t = long_long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__rlim_t = long_long
+rbx.platform.typedef.__sa_family_t = uchar
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__cpuwhich_t = int
+rbx.platform.typedef.__cpulevel_t = int
+rbx.platform.typedef.__cpusetid_t = int
+rbx.platform.typedef.__ct_rune_t = int
+rbx.platform.typedef.__rune_t = int
+rbx.platform.typedef.__wchar_t = int
+rbx.platform.typedef.__wint_t = int
+rbx.platform.typedef.__wint_t = int
+rbx.platform.typedef.__dev_t = uint
+rbx.platform.typedef.__fixpt_t = uint
+rbx.platform.typedef.pthread_key_t = int
+rbx.platform.typedef.*) = pointer
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.intptr_t = int
+rbx.platform.typedef.uintptr_t = uint
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.qaddr_t = pointer
+rbx.platform.typedef.caddr_t = string
+rbx.platform.typedef.c_caddr_t = pointer
+rbx.platform.typedef.blksize_t = uint
+rbx.platform.typedef.cpuwhich_t = int
+rbx.platform.typedef.cpulevel_t = int
+rbx.platform.typedef.cpusetid_t = int
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.clock_t = ulong
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.cpumask_t = uint
+rbx.platform.typedef.critical_t = int
+rbx.platform.typedef.daddr_t = long_long
+rbx.platform.typedef.dev_t = uint
+rbx.platform.typedef.fflags_t = uint
+rbx.platform.typedef.fixpt_t = uint
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.id_t = long_long
+rbx.platform.typedef.ino_t = uint
+rbx.platform.typedef.key_t = long
+rbx.platform.typedef.lwpid_t = int
+rbx.platform.typedef.mode_t = ushort
+rbx.platform.typedef.accmode_t = int
+rbx.platform.typedef.nlink_t = ushort
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.register_t = int
+rbx.platform.typedef.rlim_t = long_long
+rbx.platform.typedef.segsz_t = int
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.time_t = int
+rbx.platform.typedef.u_register_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.vm_offset_t = uint
+rbx.platform.typedef.vm_ooffset_t = long_long
+rbx.platform.typedef.vm_paddr_t = uint
+rbx.platform.typedef.vm_pindex_t = ulong_long
+rbx.platform.typedef.vm_size_t = uint
+rbx.platform.typedef.__fd_mask = ulong
+rbx.platform.typedef.fd_mask = ulong
+rbx.platform.typedef.sa_family_t = uchar
+rbx.platform.typedef.socklen_t = uint
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-gnu/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-gnu/types.conf
new file mode 100644
index 0000000..f9169c2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-gnu/types.conf
@@ -0,0 +1,107 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__quad_t = long_long
+rbx.platform.typedef.__u_quad_t = ulong_long
+rbx.platform.typedef.__dev_t = uint
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong_long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long_long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__fsid_t = ulong_long
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong_long
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__swblk_t = long
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = int
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long_long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong_long
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong_long
+rbx.platform.typedef.__ssize_t = int
+rbx.platform.typedef.__loff_t = long_long
+rbx.platform.typedef.*__qaddr_t = long_long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.fsid_t = ulong_long
+rbx.platform.typedef.loff_t = long_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.dev_t = uint
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = int
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.__sigset_t = ulong
+rbx.platform.typedef.sigset_t = ulong
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.__pthread_t = int
+rbx.platform.typedef.pthread_t = int
+rbx.platform.typedef.__pthread_key = int
+rbx.platform.typedef.pthread_key_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = uchar
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-linux/types.conf
new file mode 100644
index 0000000..c46a134
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-linux/types.conf
@@ -0,0 +1,103 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__quad_t = long_long
+rbx.platform.typedef.__u_quad_t = ulong_long
+rbx.platform.typedef.__dev_t = ulong_long
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong_long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long_long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong_long
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__swblk_t = long
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long_long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong_long
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong_long
+rbx.platform.typedef.__ssize_t = int
+rbx.platform.typedef.__loff_t = long_long
+rbx.platform.typedef.*__qaddr_t = long_long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.loff_t = long_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.dev_t = ulong_long
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-netbsd/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-netbsd/types.conf
new file mode 100644
index 0000000..33bd12b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-netbsd/types.conf
@@ -0,0 +1,126 @@
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__int_least8_t = char
+rbx.platform.typedef.__uint_least8_t = uchar
+rbx.platform.typedef.__int_least16_t = short
+rbx.platform.typedef.__uint_least16_t = ushort
+rbx.platform.typedef.__int_least32_t = int
+rbx.platform.typedef.__uint_least32_t = uint
+rbx.platform.typedef.__int_least64_t = long_long
+rbx.platform.typedef.__uint_least64_t = ulong_long
+rbx.platform.typedef.__int_fast8_t = int
+rbx.platform.typedef.__uint_fast8_t = uint
+rbx.platform.typedef.__int_fast16_t = int
+rbx.platform.typedef.__uint_fast16_t = uint
+rbx.platform.typedef.__int_fast32_t = int
+rbx.platform.typedef.__uint_fast32_t = uint
+rbx.platform.typedef.__int_fast64_t = long_long
+rbx.platform.typedef.__uint_fast64_t = ulong_long
+rbx.platform.typedef.__intptr_t = long
+rbx.platform.typedef.__uintptr_t = ulong
+rbx.platform.typedef.__intmax_t = long_long
+rbx.platform.typedef.__uintmax_t = ulong_long
+rbx.platform.typedef.__register_t = int
+rbx.platform.typedef.__vaddr_t = ulong
+rbx.platform.typedef.__paddr_t = ulong
+rbx.platform.typedef.__vsize_t = ulong
+rbx.platform.typedef.__psize_t = ulong
+rbx.platform.typedef.__clock_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__off_t = long_long
+rbx.platform.typedef.__ptrdiff_t = long
+rbx.platform.typedef.__size_t = ulong
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__time_t = int
+rbx.platform.typedef.__timer_t = int
+rbx.platform.typedef.__wchar_t = int
+rbx.platform.typedef.__wint_t = int
+rbx.platform.typedef.__rune_t = int
+rbx.platform.typedef.__wctrans_t = pointer
+rbx.platform.typedef.__wctype_t = pointer
+rbx.platform.typedef.__cpuid_t = ulong
+rbx.platform.typedef.__dev_t = int
+rbx.platform.typedef.__fixpt_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__in_addr_t = uint
+rbx.platform.typedef.__in_port_t = ushort
+rbx.platform.typedef.__ino_t = uint
+rbx.platform.typedef.__key_t = long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__rlim_t = ulong_long
+rbx.platform.typedef.__sa_family_t = uchar
+rbx.platform.typedef.__segsz_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.__swblk_t = int
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = int
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.unchar = uchar
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.cpuid_t = ulong
+rbx.platform.typedef.register_t = int
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.qaddr_t = pointer
+rbx.platform.typedef.vaddr_t = ulong
+rbx.platform.typedef.paddr_t = ulong
+rbx.platform.typedef.vsize_t = ulong
+rbx.platform.typedef.psize_t = ulong
+rbx.platform.typedef.caddr_t = string
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.daddr32_t = int
+rbx.platform.typedef.daddr64_t = long_long
+rbx.platform.typedef.dev_t = int
+rbx.platform.typedef.fixpt_t = uint
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ino_t = uint
+rbx.platform.typedef.key_t = long
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.segsz_t = int
+rbx.platform.typedef.swblk_t = int
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = int
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.sa_family_t = uchar
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.clock_t = int
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.time_t = int
+rbx.platform.typedef.timer_t = int
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.__fd_mask = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-openbsd/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-openbsd/types.conf
new file mode 100644
index 0000000..c4df68a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-openbsd/types.conf
@@ -0,0 +1,128 @@
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__int_least8_t = char
+rbx.platform.typedef.__uint_least8_t = uchar
+rbx.platform.typedef.__int_least16_t = short
+rbx.platform.typedef.__uint_least16_t = ushort
+rbx.platform.typedef.__int_least32_t = int
+rbx.platform.typedef.__uint_least32_t = uint
+rbx.platform.typedef.__int_least64_t = long_long
+rbx.platform.typedef.__uint_least64_t = ulong_long
+rbx.platform.typedef.__int_fast8_t = int
+rbx.platform.typedef.__uint_fast8_t = uint
+rbx.platform.typedef.__int_fast16_t = int
+rbx.platform.typedef.__uint_fast16_t = uint
+rbx.platform.typedef.__int_fast32_t = int
+rbx.platform.typedef.__uint_fast32_t = uint
+rbx.platform.typedef.__int_fast64_t = long_long
+rbx.platform.typedef.__uint_fast64_t = ulong_long
+rbx.platform.typedef.__intptr_t = long
+rbx.platform.typedef.__uintptr_t = ulong
+rbx.platform.typedef.__intmax_t = long_long
+rbx.platform.typedef.__uintmax_t = ulong_long
+rbx.platform.typedef.__register_t = int
+rbx.platform.typedef.__vaddr_t = ulong
+rbx.platform.typedef.__paddr_t = ulong
+rbx.platform.typedef.__vsize_t = ulong
+rbx.platform.typedef.__psize_t = ulong
+rbx.platform.typedef.__clock_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__off_t = long_long
+rbx.platform.typedef.__ptrdiff_t = long
+rbx.platform.typedef.__size_t = ulong
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__time_t = int
+rbx.platform.typedef.__timer_t = int
+rbx.platform.typedef.__wchar_t = int
+rbx.platform.typedef.__wint_t = int
+rbx.platform.typedef.__rune_t = int
+rbx.platform.typedef.__wctrans_t = pointer
+rbx.platform.typedef.__wctype_t = pointer
+rbx.platform.typedef.__cpuid_t = ulong
+rbx.platform.typedef.__dev_t = int
+rbx.platform.typedef.__fixpt_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__in_addr_t = uint
+rbx.platform.typedef.__in_port_t = ushort
+rbx.platform.typedef.__ino_t = uint
+rbx.platform.typedef.__key_t = long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__rlim_t = ulong_long
+rbx.platform.typedef.__sa_family_t = uchar
+rbx.platform.typedef.__segsz_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.__swblk_t = int
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = int
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.unchar = uchar
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.cpuid_t = ulong
+rbx.platform.typedef.register_t = int
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.intptr_t = long
+rbx.platform.typedef.uintptr_t = ulong
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.qaddr_t = pointer
+rbx.platform.typedef.vaddr_t = ulong
+rbx.platform.typedef.paddr_t = ulong
+rbx.platform.typedef.vsize_t = ulong
+rbx.platform.typedef.psize_t = ulong
+rbx.platform.typedef.caddr_t = string
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.daddr32_t = int
+rbx.platform.typedef.daddr64_t = long_long
+rbx.platform.typedef.dev_t = int
+rbx.platform.typedef.fixpt_t = uint
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ino_t = uint
+rbx.platform.typedef.key_t = long
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.segsz_t = int
+rbx.platform.typedef.swblk_t = int
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = int
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.sa_family_t = uchar
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.clock_t = int
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.time_t = int
+rbx.platform.typedef.timer_t = int
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.__fd_mask = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-solaris/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-solaris/types.conf
new file mode 100644
index 0000000..a585100
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-solaris/types.conf
@@ -0,0 +1,122 @@
+rbx.platform.typedef.lock_t = uchar
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.intmax_t = long_long
+rbx.platform.typedef.uintmax_t = ulong_long
+rbx.platform.typedef.intptr_t = int
+rbx.platform.typedef.uintptr_t = uint
+rbx.platform.typedef.int_fast8_t = char
+rbx.platform.typedef.int_fast16_t = int
+rbx.platform.typedef.int_fast32_t = int
+rbx.platform.typedef.int_fast64_t = long_long
+rbx.platform.typedef.uint_fast8_t = uchar
+rbx.platform.typedef.uint_fast16_t = uint
+rbx.platform.typedef.uint_fast32_t = uint
+rbx.platform.typedef.uint_fast64_t = ulong_long
+rbx.platform.typedef.int_least8_t = char
+rbx.platform.typedef.int_least16_t = short
+rbx.platform.typedef.int_least32_t = int
+rbx.platform.typedef.int_least64_t = long_long
+rbx.platform.typedef.uint_least8_t = uchar
+rbx.platform.typedef.uint_least16_t = ushort
+rbx.platform.typedef.uint_least32_t = uint
+rbx.platform.typedef.uint_least64_t = ulong_long
+rbx.platform.typedef.longlong_t = long_long
+rbx.platform.typedef.u_longlong_t = ulong_long
+rbx.platform.typedef.t_scalar_t = long
+rbx.platform.typedef.t_uscalar_t = ulong
+rbx.platform.typedef.uchar_t = uchar
+rbx.platform.typedef.ushort_t = ushort
+rbx.platform.typedef.uint_t = uint
+rbx.platform.typedef.ulong_t = ulong
+rbx.platform.typedef.*caddr_t = char
+rbx.platform.typedef.daddr_t = long
+rbx.platform.typedef.cnt_t = short
+rbx.platform.typedef.ptrdiff_t = int
+rbx.platform.typedef.pfn_t = ulong
+rbx.platform.typedef.pgcnt_t = ulong
+rbx.platform.typedef.spgcnt_t = long
+rbx.platform.typedef.use_t = uchar
+rbx.platform.typedef.sysid_t = short
+rbx.platform.typedef.index_t = short
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.off64_t = long_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.ino64_t = ulong_long
+rbx.platform.typedef.blkcnt64_t = long_long
+rbx.platform.typedef.fsblkcnt64_t = ulong_long
+rbx.platform.typedef.fsfilcnt64_t = ulong_long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.pad64_t = long_long
+rbx.platform.typedef.upad64_t = ulong_long
+rbx.platform.typedef.offset_t = long_long
+rbx.platform.typedef.u_offset_t = ulong_long
+rbx.platform.typedef.len_t = ulong_long
+rbx.platform.typedef.diskaddr_t = ulong_long
+rbx.platform.typedef.k_fltset_t = uint
+rbx.platform.typedef.id_t = long
+rbx.platform.typedef.lgrp_id_t = long
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.major_t = ulong
+rbx.platform.typedef.minor_t = ulong
+rbx.platform.typedef.pri_t = short
+rbx.platform.typedef.cpu_flag_t = ushort
+rbx.platform.typedef.o_mode_t = ushort
+rbx.platform.typedef.o_dev_t = short
+rbx.platform.typedef.o_uid_t = ushort
+rbx.platform.typedef.o_gid_t = ushort
+rbx.platform.typedef.o_nlink_t = short
+rbx.platform.typedef.o_pid_t = short
+rbx.platform.typedef.o_ino_t = ushort
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.mode_t = ulong
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.datalink_id_t = uint
+rbx.platform.typedef.taskid_t = long
+rbx.platform.typedef.projid_t = long
+rbx.platform.typedef.poolid_t = long
+rbx.platform.typedef.zoneid_t = long
+rbx.platform.typedef.ctid_t = long
+rbx.platform.typedef.pthread_t = uint
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.dev_t = ulong
+rbx.platform.typedef.nlink_t = ulong
+rbx.platform.typedef.pid_t = long
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = int
+rbx.platform.typedef.unchar = uchar
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.hrtime_t = long_long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.fds_mask = long
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.nfds_t = ulong
+rbx.platform.typedef.disp_lock_t = uchar
+rbx.platform.typedef.model_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.ipaddr_t = uint
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.rlim64_t = ulong_long
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-windows/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-windows/types.conf
new file mode 100644
index 0000000..38168be
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/i386-windows/types.conf
@@ -0,0 +1,105 @@
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int_least16_t = short
+rbx.platform.typedef.__uint_least16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int_least32_t = int
+rbx.platform.typedef.__uint_least32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef._off_t = long
+rbx.platform.typedef._off64_t = long_long
+rbx.platform.typedef._ssize_t = int
+rbx.platform.typedef.wint_t = uint
+rbx.platform.typedef.ptrdiff_t = int
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__loff_t = long_long
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.clock_t = ulong
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.daddr_t = long
+rbx.platform.typedef.caddr_t = string
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.nlink_t = ushort
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.clockid_t = ulong
+rbx.platform.typedef.timer_t = ulong
+rbx.platform.typedef.useconds_t = ulong
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = long
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.uint32_t = ulong
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.int_least8_t = char
+rbx.platform.typedef.int_least16_t = short
+rbx.platform.typedef.int_least32_t = long
+rbx.platform.typedef.int_least64_t = long_long
+rbx.platform.typedef.uint_least8_t = uchar
+rbx.platform.typedef.uint_least16_t = ushort
+rbx.platform.typedef.uint_least32_t = ulong
+rbx.platform.typedef.uint_least64_t = ulong_long
+rbx.platform.typedef.int_fast8_t = char
+rbx.platform.typedef.int_fast16_t = long
+rbx.platform.typedef.int_fast32_t = long
+rbx.platform.typedef.int_fast64_t = long_long
+rbx.platform.typedef.uint_fast8_t = uchar
+rbx.platform.typedef.uint_fast16_t = ulong
+rbx.platform.typedef.uint_fast32_t = ulong
+rbx.platform.typedef.uint_fast64_t = ulong_long
+rbx.platform.typedef.intptr_t = long
+rbx.platform.typedef.uintptr_t = ulong
+rbx.platform.typedef.intmax_t = long_long
+rbx.platform.typedef.uintmax_t = ulong_long
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.loff_t = long_long
+rbx.platform.typedef.__dev16_t = short
+rbx.platform.typedef.__dev32_t = ulong
+rbx.platform.typedef.dev_t = ulong
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.__blkcnt32_t = long
+rbx.platform.typedef.__blkcnt64_t = long_long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong
+rbx.platform.typedef.fsfilcnt_t = ulong
+rbx.platform.typedef.__uid16_t = ushort
+rbx.platform.typedef.__uid32_t = ulong
+rbx.platform.typedef.uid_t = ulong
+rbx.platform.typedef.__gid16_t = ushort
+rbx.platform.typedef.__gid32_t = ulong
+rbx.platform.typedef.gid_t = ulong
+rbx.platform.typedef.__ino32_t = ulong
+rbx.platform.typedef.__ino64_t = ulong_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.id_t = ulong
+rbx.platform.typedef.key_t = long_long
+rbx.platform.typedef.vm_offset_t = ulong
+rbx.platform.typedef.vm_size_t = ulong
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = int
+rbx.platform.typedef.*addr_t = char
+rbx.platform.typedef.socklen_t = int
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.__ULong = ulong
+rbx.platform.typedef._fpos_t = long
+rbx.platform.typedef._fpos64_t = long_long
+rbx.platform.typedef.sigset_t = ulong
+rbx.platform.typedef.sig_atomic_t = int
+rbx.platform.typedef.rlim_t = ulong
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/ia64-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/ia64-linux/types.conf
new file mode 100644
index 0000000..70e44e8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/ia64-linux/types.conf
@@ -0,0 +1,104 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long
+rbx.platform.typedef.__uint64_t = ulong
+rbx.platform.typedef.__quad_t = long
+rbx.platform.typedef.__u_quad_t = ulong
+rbx.platform.typedef.__dev_t = ulong
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__in_addr_t = uint
+rbx.platform.typedef.__in_port_t = ushort
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = ulong
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__swblk_t = long
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__loff_t = long
+rbx.platform.typedef.*__qaddr_t = long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = long
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long
+rbx.platform.typedef.u_quad_t = ulong
+rbx.platform.typedef.loff_t = long
+rbx.platform.typedef.ino_t = ulong
+rbx.platform.typedef.dev_t = ulong
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = ulong
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.blkcnt_t = long
+rbx.platform.typedef.fsblkcnt_t = ulong
+rbx.platform.typedef.fsfilcnt_t = ulong
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/mips-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/mips-linux/types.conf
new file mode 100644
index 0000000..ad4ced0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/mips-linux/types.conf
@@ -0,0 +1,102 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__quad_t = long_long
+rbx.platform.typedef.__u_quad_t = ulong_long
+rbx.platform.typedef.__dev_t = ulong_long
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong_long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long_long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong_long
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__swblk_t = long
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long_long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong_long
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong_long
+rbx.platform.typedef.__ssize_t = int
+rbx.platform.typedef.__loff_t = long_long
+rbx.platform.typedef.*__qaddr_t = long_long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.loff_t = long_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.dev_t = ulong_long
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/mips64el-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/mips64el-linux/types.conf
new file mode 100644
index 0000000..3feb704
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/mips64el-linux/types.conf
@@ -0,0 +1,104 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long
+rbx.platform.typedef.__uint64_t = ulong
+rbx.platform.typedef.__quad_t = long
+rbx.platform.typedef.__u_quad_t = ulong
+rbx.platform.typedef.__dev_t = ulong
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = ulong
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong
+rbx.platform.typedef.__fsword_t = long
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__syscall_slong_t = long
+rbx.platform.typedef.__syscall_ulong_t = ulong
+rbx.platform.typedef.__loff_t = long
+rbx.platform.typedef.*__qaddr_t = long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = long
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long
+rbx.platform.typedef.u_quad_t = ulong
+rbx.platform.typedef.loff_t = long
+rbx.platform.typedef.ino_t = ulong
+rbx.platform.typedef.dev_t = ulong
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = ulong
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.blkcnt_t = long
+rbx.platform.typedef.fsblkcnt_t = ulong
+rbx.platform.typedef.fsfilcnt_t = ulong
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/mipsel-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/mipsel-linux/types.conf
new file mode 100644
index 0000000..ad4ced0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/mipsel-linux/types.conf
@@ -0,0 +1,102 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__quad_t = long_long
+rbx.platform.typedef.__u_quad_t = ulong_long
+rbx.platform.typedef.__dev_t = ulong_long
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong_long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long_long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong_long
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__swblk_t = long
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long_long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong_long
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong_long
+rbx.platform.typedef.__ssize_t = int
+rbx.platform.typedef.__loff_t = long_long
+rbx.platform.typedef.*__qaddr_t = long_long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.loff_t = long_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.dev_t = ulong_long
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-aix/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-aix/types.conf
new file mode 100644
index 0000000..30ee66b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-aix/types.conf
@@ -0,0 +1,180 @@
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.intmax_t = long_long
+rbx.platform.typedef.uintmax_t = ulong_long
+rbx.platform.typedef.intptr_t = long
+rbx.platform.typedef.uintptr_t = ulong
+rbx.platform.typedef.int_least8_t = char
+rbx.platform.typedef.int_least16_t = short
+rbx.platform.typedef.int_least32_t = int
+rbx.platform.typedef.int_least64_t = long_long
+rbx.platform.typedef.uint_least8_t = uchar
+rbx.platform.typedef.uint_least16_t = ushort
+rbx.platform.typedef.uint_least32_t = uint
+rbx.platform.typedef.uint_least64_t = ulong_long
+rbx.platform.typedef.int_fast8_t = char
+rbx.platform.typedef.int_fast16_t = short
+rbx.platform.typedef.int_fast32_t = int
+rbx.platform.typedef.uint_fast8_t = uchar
+rbx.platform.typedef.uint_fast16_t = ushort
+rbx.platform.typedef.uint_fast32_t = uint
+rbx.platform.typedef.int_fast64_t = long_long
+rbx.platform.typedef.uint_fast64_t = ulong_long
+rbx.platform.typedef.wchar_t = ushort
+rbx.platform.typedef.intfast_t = int
+rbx.platform.typedef.uintfast_t = uint
+rbx.platform.typedef.__long32_t = long
+rbx.platform.typedef.__ulong32_t = ulong
+rbx.platform.typedef.__long64_t = int
+rbx.platform.typedef.__ulong64_t = uint
+rbx.platform.typedef.int32long64_t = int
+rbx.platform.typedef.uint32long64_t = uint
+rbx.platform.typedef.long32int64_t = long
+rbx.platform.typedef.ulong32int64_t = ulong
+rbx.platform.typedef.int8 = char
+rbx.platform.typedef.int16 = short
+rbx.platform.typedef.int32 = int
+rbx.platform.typedef.int64 = long_long
+rbx.platform.typedef.u_int8 = uchar
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16 = ushort
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32 = uint
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64 = ulong_long
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.ptrdiff_t = long
+rbx.platform.typedef.wctype_t = uint
+rbx.platform.typedef.fpos_t = long
+rbx.platform.typedef.fpos64_t = long_long
+rbx.platform.typedef.time_t = int
+rbx.platform.typedef.clock_t = int
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.uchar_t = uchar
+rbx.platform.typedef.ushort_t = ushort
+rbx.platform.typedef.uint_t = uint
+rbx.platform.typedef.ulong_t = ulong
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.level_t = int
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.daddr32_t = int
+rbx.platform.typedef.daddr64_t = long_long
+rbx.platform.typedef.caddr_t = string
+rbx.platform.typedef.ino_t = uint
+rbx.platform.typedef.ino32_t = uint
+rbx.platform.typedef.ino64_t = ulong_long
+rbx.platform.typedef.cnt_t = short
+rbx.platform.typedef.dev_t = uint
+rbx.platform.typedef.dev32_t = uint
+rbx.platform.typedef.dev64_t = ulong_long
+rbx.platform.typedef.chan_t = int
+rbx.platform.typedef.time32_t = int
+rbx.platform.typedef.pid32_t = int
+rbx.platform.typedef.tid32_t = int
+rbx.platform.typedef.pid64_t = ulong_long
+rbx.platform.typedef.tid64_t = ulong_long
+rbx.platform.typedef.time64_t = long_long
+rbx.platform.typedef.__ptr32 = pointer
+rbx.platform.typedef.__cptr32 = string
+rbx.platform.typedef.soff_t = int
+rbx.platform.typedef.off_t = long
+rbx.platform.typedef.off64_t = long_long
+rbx.platform.typedef.paddr_t = long
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.timer_t = int
+rbx.platform.typedef.timer32_t = int
+rbx.platform.typedef.timer64_t = long_long
+rbx.platform.typedef.nlink_t = short
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mid_t = pointer
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.tid_t = int
+rbx.platform.typedef.slab_t[12] = char
+rbx.platform.typedef.mtyp_t = long
+rbx.platform.typedef.boolean_t = int
+rbx.platform.typedef.crid_t = int
+rbx.platform.typedef.blkcnt_t = int
+rbx.platform.typedef.blksize_t = int
+rbx.platform.typedef.blkcnt32_t = int
+rbx.platform.typedef.blksize32_t = int
+rbx.platform.typedef.blkcnt64_t = ulong_long
+rbx.platform.typedef.blksize64_t = ulong_long
+rbx.platform.typedef.fsblkcnt_t = ulong
+rbx.platform.typedef.fsfilcnt_t = ulong
+rbx.platform.typedef.wint_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = int
+rbx.platform.typedef.clockid_t = long_long
+rbx.platform.typedef.signal_t = int
+rbx.platform.typedef.pthread_t = uint
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.vmid_t = long
+rbx.platform.typedef.vmhandle_t = ulong
+rbx.platform.typedef.vmid32_t = int
+rbx.platform.typedef.vmhandle32_t = uint
+rbx.platform.typedef.kvmid_t = long
+rbx.platform.typedef.kvmhandle_t = ulong
+rbx.platform.typedef.vmid64_t = long_long
+rbx.platform.typedef.rpn64_t = long_long
+rbx.platform.typedef.cnt64_t = long_long
+rbx.platform.typedef.psize_t = long_long
+rbx.platform.typedef.vmidx_t = int
+rbx.platform.typedef.vmfkey_t = uint
+rbx.platform.typedef.vmprkey_t = uint
+rbx.platform.typedef.vmkey_t = int
+rbx.platform.typedef.vmhwkey_t = int
+rbx.platform.typedef.vpn_t = int
+rbx.platform.typedef.rpn_t = int
+rbx.platform.typedef.ptex_t = ulong
+rbx.platform.typedef.swhatx_t = ulong
+rbx.platform.typedef.esid_t = uint
+rbx.platform.typedef.aptx_t = ushort
+rbx.platform.typedef.pdtx_t = int
+rbx.platform.typedef.psx_t = short
+rbx.platform.typedef.pshift_t = ushort
+rbx.platform.typedef.sshift_t = ushort
+rbx.platform.typedef.unidx_t = int
+rbx.platform.typedef.snidx_t = int
+rbx.platform.typedef.vmnodeidx_t = int
+rbx.platform.typedef.kvpn_t = int
+rbx.platform.typedef.krpn_t = int
+rbx.platform.typedef.vmsize_t = int
+rbx.platform.typedef.vmm_lock_t = int
+rbx.platform.typedef.ureg_t = ulong
+rbx.platform.typedef.vmlpghandle_t = ulong
+rbx.platform.typedef.ext_t = int
+rbx.platform.typedef.va_list = string
+rbx.platform.typedef.__ptr64 = ulong_long
+rbx.platform.typedef.__cptr64 = ulong_long
+rbx.platform.typedef.UniChar = ushort
+rbx.platform.typedef.UTF32Char = uint
+rbx.platform.typedef.uchar = uchar
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.swblk_t = int
+rbx.platform.typedef.offset_t = long_long
+rbx.platform.typedef.ssize64_t = long_long
+rbx.platform.typedef.longlong_t = long_long
+rbx.platform.typedef.u_longlong_t = ulong_long
+rbx.platform.typedef.class_id_t = uint
+rbx.platform.typedef.liobn_t = uint
+rbx.platform.typedef.unit_addr_t = ulong_long
+rbx.platform.typedef.size64_t = ulong_long
+rbx.platform.typedef.socklen_t = ulong
+rbx.platform.typedef.sa_family_t = uchar
+rbx.platform.typedef.rlim_t = ulong
+rbx.platform.typedef.rlim64_t = ulong_long
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-darwin/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-darwin/types.conf
new file mode 100644
index 0000000..6b9313e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-darwin/types.conf
@@ -0,0 +1,100 @@
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__darwin_intptr_t = long
+rbx.platform.typedef.__darwin_natural_t = uint
+rbx.platform.typedef.__darwin_ct_rune_t = int
+rbx.platform.typedef.__darwin_ptrdiff_t = int
+rbx.platform.typedef.__darwin_size_t = ulong
+rbx.platform.typedef.__darwin_wchar_t = int
+rbx.platform.typedef.__darwin_rune_t = int
+rbx.platform.typedef.__darwin_wint_t = int
+rbx.platform.typedef.__darwin_clock_t = ulong
+rbx.platform.typedef.__darwin_socklen_t = uint
+rbx.platform.typedef.__darwin_ssize_t = long
+rbx.platform.typedef.__darwin_time_t = long
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = int
+rbx.platform.typedef.intptr_t = long
+rbx.platform.typedef.uintptr_t = ulong
+rbx.platform.typedef.user_addr_t = ulong_long
+rbx.platform.typedef.user_size_t = ulong_long
+rbx.platform.typedef.user_ssize_t = long_long
+rbx.platform.typedef.user_long_t = long_long
+rbx.platform.typedef.user_ulong_t = ulong_long
+rbx.platform.typedef.user_time_t = long_long
+rbx.platform.typedef.syscall_arg_t = ulong_long
+rbx.platform.typedef.__darwin_blkcnt_t = long_long
+rbx.platform.typedef.__darwin_blksize_t = int
+rbx.platform.typedef.__darwin_dev_t = int
+rbx.platform.typedef.__darwin_fsblkcnt_t = uint
+rbx.platform.typedef.__darwin_fsfilcnt_t = uint
+rbx.platform.typedef.__darwin_gid_t = uint
+rbx.platform.typedef.__darwin_id_t = uint
+rbx.platform.typedef.__darwin_ino64_t = ulong_long
+rbx.platform.typedef.__darwin_ino_t = ulong_long
+rbx.platform.typedef.__darwin_mach_port_name_t = uint
+rbx.platform.typedef.__darwin_mach_port_t = uint
+rbx.platform.typedef.__darwin_mode_t = ushort
+rbx.platform.typedef.__darwin_off_t = long_long
+rbx.platform.typedef.__darwin_pid_t = int
+rbx.platform.typedef.__darwin_pthread_key_t = ulong
+rbx.platform.typedef.__darwin_sigset_t = uint
+rbx.platform.typedef.__darwin_suseconds_t = int
+rbx.platform.typedef.__darwin_uid_t = uint
+rbx.platform.typedef.__darwin_useconds_t = uint
+rbx.platform.typedef.__darwin_uuid_t[16] = uchar
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.qaddr_t = pointer
+rbx.platform.typedef.caddr_t = string
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.dev_t = int
+rbx.platform.typedef.fixpt_t = uint
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.blksize_t = int
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.ino64_t = ulong_long
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.mode_t = ushort
+rbx.platform.typedef.nlink_t = ushort
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.segsz_t = int
+rbx.platform.typedef.swblk_t = int
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.clock_t = ulong
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = int
+rbx.platform.typedef.fd_mask = int
+rbx.platform.typedef.pthread_key_t = ulong
+rbx.platform.typedef.fsblkcnt_t = uint
+rbx.platform.typedef.fsfilcnt_t = uint
+rbx.platform.typedef.sa_family_t = uchar
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.rlim_t = ulong_long
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-linux/types.conf
new file mode 100644
index 0000000..76014cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc-linux/types.conf
@@ -0,0 +1,100 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__quad_t = long_long
+rbx.platform.typedef.__u_quad_t = ulong_long
+rbx.platform.typedef.__dev_t = ulong_long
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong_long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long_long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong_long
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__swblk_t = long
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long_long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong_long
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong_long
+rbx.platform.typedef.__ssize_t = int
+rbx.platform.typedef.__loff_t = long_long
+rbx.platform.typedef.*__qaddr_t = long_long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.loff_t = long_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.dev_t = ulong_long
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc64-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc64-linux/types.conf
new file mode 100644
index 0000000..3feb704
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/powerpc64-linux/types.conf
@@ -0,0 +1,104 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long
+rbx.platform.typedef.__uint64_t = ulong
+rbx.platform.typedef.__quad_t = long
+rbx.platform.typedef.__u_quad_t = ulong
+rbx.platform.typedef.__dev_t = ulong
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = ulong
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong
+rbx.platform.typedef.__fsword_t = long
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__syscall_slong_t = long
+rbx.platform.typedef.__syscall_ulong_t = ulong
+rbx.platform.typedef.__loff_t = long
+rbx.platform.typedef.*__qaddr_t = long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = long
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long
+rbx.platform.typedef.u_quad_t = ulong
+rbx.platform.typedef.loff_t = long
+rbx.platform.typedef.ino_t = ulong
+rbx.platform.typedef.dev_t = ulong
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = ulong
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.blkcnt_t = long
+rbx.platform.typedef.fsblkcnt_t = ulong
+rbx.platform.typedef.fsfilcnt_t = ulong
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/s390-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/s390-linux/types.conf
new file mode 100644
index 0000000..1cc79ee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/s390-linux/types.conf
@@ -0,0 +1,102 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__quad_t = long_long
+rbx.platform.typedef.__u_quad_t = ulong_long
+rbx.platform.typedef.__dev_t = ulong_long
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong_long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long_long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong_long
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__swblk_t = long
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long_long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong_long
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong_long
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__loff_t = long_long
+rbx.platform.typedef.*__qaddr_t = long_long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.loff_t = long_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.dev_t = ulong_long
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/s390x-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/s390x-linux/types.conf
new file mode 100644
index 0000000..f4c8cec
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/s390x-linux/types.conf
@@ -0,0 +1,102 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long
+rbx.platform.typedef.__uint64_t = ulong
+rbx.platform.typedef.__quad_t = long
+rbx.platform.typedef.__u_quad_t = ulong
+rbx.platform.typedef.__dev_t = ulong
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = ulong
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__swblk_t = long
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__loff_t = long
+rbx.platform.typedef.*__qaddr_t = long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = long
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long
+rbx.platform.typedef.u_quad_t = ulong
+rbx.platform.typedef.loff_t = long
+rbx.platform.typedef.ino_t = ulong
+rbx.platform.typedef.dev_t = ulong
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = ulong
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.blkcnt_t = long
+rbx.platform.typedef.fsblkcnt_t = ulong
+rbx.platform.typedef.fsfilcnt_t = ulong
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-linux/types.conf
new file mode 100644
index 0000000..1882298
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-linux/types.conf
@@ -0,0 +1,102 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__quad_t = long_long
+rbx.platform.typedef.__u_quad_t = ulong_long
+rbx.platform.typedef.__dev_t = ulong_long
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong_long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long_long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong_long
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = int
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__swblk_t = long
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.__blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long_long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong_long
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong_long
+rbx.platform.typedef.__ssize_t = int
+rbx.platform.typedef.__loff_t = long_long
+rbx.platform.typedef.*__qaddr_t = long_long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.loff_t = long_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.dev_t = ulong_long
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = int
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-solaris/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-solaris/types.conf
new file mode 100644
index 0000000..c03c144
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/sparc-solaris/types.conf
@@ -0,0 +1,128 @@
+rbx.platform.typedef.lock_t = uchar
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.intmax_t = long_long
+rbx.platform.typedef.uintmax_t = ulong_long
+rbx.platform.typedef.intptr_t = int
+rbx.platform.typedef.uintptr_t = uint
+rbx.platform.typedef.int_fast8_t = char
+rbx.platform.typedef.int_fast16_t = int
+rbx.platform.typedef.int_fast32_t = int
+rbx.platform.typedef.int_fast64_t = long_long
+rbx.platform.typedef.uint_fast8_t = uchar
+rbx.platform.typedef.uint_fast16_t = uint
+rbx.platform.typedef.uint_fast32_t = uint
+rbx.platform.typedef.uint_fast64_t = ulong_long
+rbx.platform.typedef.int_least8_t = char
+rbx.platform.typedef.int_least16_t = short
+rbx.platform.typedef.int_least32_t = int
+rbx.platform.typedef.int_least64_t = long_long
+rbx.platform.typedef.uint_least8_t = uchar
+rbx.platform.typedef.uint_least16_t = ushort
+rbx.platform.typedef.uint_least32_t = uint
+rbx.platform.typedef.uint_least64_t = ulong_long
+rbx.platform.typedef.longlong_t = long_long
+rbx.platform.typedef.u_longlong_t = ulong_long
+rbx.platform.typedef.t_scalar_t = long
+rbx.platform.typedef.t_uscalar_t = ulong
+rbx.platform.typedef.uchar_t = uchar
+rbx.platform.typedef.ushort_t = ushort
+rbx.platform.typedef.uint_t = uint
+rbx.platform.typedef.ulong_t = ulong
+rbx.platform.typedef.*caddr_t = char
+rbx.platform.typedef.daddr_t = long
+rbx.platform.typedef.cnt_t = short
+rbx.platform.typedef.ptrdiff_t = int
+rbx.platform.typedef.pfn_t = ulong
+rbx.platform.typedef.pgcnt_t = ulong
+rbx.platform.typedef.spgcnt_t = long
+rbx.platform.typedef.use_t = uchar
+rbx.platform.typedef.sysid_t = short
+rbx.platform.typedef.index_t = short
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.off64_t = long_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.ino64_t = ulong_long
+rbx.platform.typedef.blkcnt64_t = long_long
+rbx.platform.typedef.fsblkcnt64_t = ulong_long
+rbx.platform.typedef.fsfilcnt64_t = ulong_long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.pad64_t = long_long
+rbx.platform.typedef.upad64_t = ulong_long
+rbx.platform.typedef.offset_t = long_long
+rbx.platform.typedef.u_offset_t = ulong_long
+rbx.platform.typedef.len_t = ulong_long
+rbx.platform.typedef.diskaddr_t = ulong_long
+rbx.platform.typedef.k_fltset_t = uint
+rbx.platform.typedef.id_t = long
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.major_t = ulong
+rbx.platform.typedef.minor_t = ulong
+rbx.platform.typedef.pri_t = short
+rbx.platform.typedef.cpu_flag_t = ushort
+rbx.platform.typedef.o_mode_t = ushort
+rbx.platform.typedef.o_dev_t = short
+rbx.platform.typedef.o_uid_t = ushort
+rbx.platform.typedef.o_gid_t = ushort
+rbx.platform.typedef.o_nlink_t = short
+rbx.platform.typedef.o_pid_t = short
+rbx.platform.typedef.o_ino_t = ushort
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.mode_t = ulong
+rbx.platform.typedef.uid_t = long
+rbx.platform.typedef.gid_t = long
+rbx.platform.typedef.taskid_t = long
+rbx.platform.typedef.projid_t = long
+rbx.platform.typedef.poolid_t = long
+rbx.platform.typedef.zoneid_t = long
+rbx.platform.typedef.ctid_t = long
+rbx.platform.typedef.pthread_t = uint
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.dev_t = ulong
+rbx.platform.typedef.nlink_t = ulong
+rbx.platform.typedef.pid_t = long
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = int
+rbx.platform.typedef.unchar = uchar
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.hrtime_t = long_long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.fds_mask = long
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.Psocklen_t = pointer
+rbx.platform.typedef.disp_lock_t = uchar
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.rlim64_t = ulong_long
+rbx.platform.typedef.kid_t = int
+rbx.platform.typedef.int) = pointer
+rbx.platform.typedef.size_t) = pointer
+rbx.platform.typedef.int) = pointer
+rbx.platform.typedef.avl_index_t = uint
+rbx.platform.typedef.() = pointer
+rbx.platform.typedef.nfds_t = ulong
+rbx.platform.typedef.model_t = uint
+rbx.platform.typedef.ts_t = long_long
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.ipaddr_t = uint
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/sparcv9-solaris/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/sparcv9-solaris/types.conf
new file mode 100644
index 0000000..c03c144
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/sparcv9-solaris/types.conf
@@ -0,0 +1,128 @@
+rbx.platform.typedef.lock_t = uchar
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.intmax_t = long_long
+rbx.platform.typedef.uintmax_t = ulong_long
+rbx.platform.typedef.intptr_t = int
+rbx.platform.typedef.uintptr_t = uint
+rbx.platform.typedef.int_fast8_t = char
+rbx.platform.typedef.int_fast16_t = int
+rbx.platform.typedef.int_fast32_t = int
+rbx.platform.typedef.int_fast64_t = long_long
+rbx.platform.typedef.uint_fast8_t = uchar
+rbx.platform.typedef.uint_fast16_t = uint
+rbx.platform.typedef.uint_fast32_t = uint
+rbx.platform.typedef.uint_fast64_t = ulong_long
+rbx.platform.typedef.int_least8_t = char
+rbx.platform.typedef.int_least16_t = short
+rbx.platform.typedef.int_least32_t = int
+rbx.platform.typedef.int_least64_t = long_long
+rbx.platform.typedef.uint_least8_t = uchar
+rbx.platform.typedef.uint_least16_t = ushort
+rbx.platform.typedef.uint_least32_t = uint
+rbx.platform.typedef.uint_least64_t = ulong_long
+rbx.platform.typedef.longlong_t = long_long
+rbx.platform.typedef.u_longlong_t = ulong_long
+rbx.platform.typedef.t_scalar_t = long
+rbx.platform.typedef.t_uscalar_t = ulong
+rbx.platform.typedef.uchar_t = uchar
+rbx.platform.typedef.ushort_t = ushort
+rbx.platform.typedef.uint_t = uint
+rbx.platform.typedef.ulong_t = ulong
+rbx.platform.typedef.*caddr_t = char
+rbx.platform.typedef.daddr_t = long
+rbx.platform.typedef.cnt_t = short
+rbx.platform.typedef.ptrdiff_t = int
+rbx.platform.typedef.pfn_t = ulong
+rbx.platform.typedef.pgcnt_t = ulong
+rbx.platform.typedef.spgcnt_t = long
+rbx.platform.typedef.use_t = uchar
+rbx.platform.typedef.sysid_t = short
+rbx.platform.typedef.index_t = short
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.off64_t = long_long
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.ino64_t = ulong_long
+rbx.platform.typedef.blkcnt64_t = long_long
+rbx.platform.typedef.fsblkcnt64_t = ulong_long
+rbx.platform.typedef.fsfilcnt64_t = ulong_long
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.pad64_t = long_long
+rbx.platform.typedef.upad64_t = ulong_long
+rbx.platform.typedef.offset_t = long_long
+rbx.platform.typedef.u_offset_t = ulong_long
+rbx.platform.typedef.len_t = ulong_long
+rbx.platform.typedef.diskaddr_t = ulong_long
+rbx.platform.typedef.k_fltset_t = uint
+rbx.platform.typedef.id_t = long
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.major_t = ulong
+rbx.platform.typedef.minor_t = ulong
+rbx.platform.typedef.pri_t = short
+rbx.platform.typedef.cpu_flag_t = ushort
+rbx.platform.typedef.o_mode_t = ushort
+rbx.platform.typedef.o_dev_t = short
+rbx.platform.typedef.o_uid_t = ushort
+rbx.platform.typedef.o_gid_t = ushort
+rbx.platform.typedef.o_nlink_t = short
+rbx.platform.typedef.o_pid_t = short
+rbx.platform.typedef.o_ino_t = ushort
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.mode_t = ulong
+rbx.platform.typedef.uid_t = long
+rbx.platform.typedef.gid_t = long
+rbx.platform.typedef.taskid_t = long
+rbx.platform.typedef.projid_t = long
+rbx.platform.typedef.poolid_t = long
+rbx.platform.typedef.zoneid_t = long
+rbx.platform.typedef.ctid_t = long
+rbx.platform.typedef.pthread_t = uint
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.dev_t = ulong
+rbx.platform.typedef.nlink_t = ulong
+rbx.platform.typedef.pid_t = long
+rbx.platform.typedef.size_t = uint
+rbx.platform.typedef.ssize_t = int
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = int
+rbx.platform.typedef.unchar = uchar
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.hrtime_t = long_long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.fds_mask = long
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.Psocklen_t = pointer
+rbx.platform.typedef.disp_lock_t = uchar
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.rlim64_t = ulong_long
+rbx.platform.typedef.kid_t = int
+rbx.platform.typedef.int) = pointer
+rbx.platform.typedef.size_t) = pointer
+rbx.platform.typedef.int) = pointer
+rbx.platform.typedef.avl_index_t = uint
+rbx.platform.typedef.() = pointer
+rbx.platform.typedef.nfds_t = ulong
+rbx.platform.typedef.model_t = uint
+rbx.platform.typedef.ts_t = long_long
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.ipaddr_t = uint
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-cygwin/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-cygwin/types.conf
new file mode 100644
index 0000000..5dadc7f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-cygwin/types.conf
@@ -0,0 +1,3 @@
+rbx.platform.typedef.size_t = uint64
+rbx.platform.typedef.ptrdiff_t = int64
+rbx.platform.typedef.ssize_t = int64
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-darwin/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-darwin/types.conf
new file mode 100644
index 0000000..51637ee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-darwin/types.conf
@@ -0,0 +1,126 @@
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__darwin_intptr_t = long
+rbx.platform.typedef.__darwin_natural_t = uint
+rbx.platform.typedef.__darwin_ct_rune_t = int
+rbx.platform.typedef.__darwin_ptrdiff_t = long
+rbx.platform.typedef.__darwin_size_t = ulong
+rbx.platform.typedef.__darwin_wchar_t = int
+rbx.platform.typedef.__darwin_rune_t = int
+rbx.platform.typedef.__darwin_wint_t = int
+rbx.platform.typedef.__darwin_clock_t = ulong
+rbx.platform.typedef.__darwin_socklen_t = uint
+rbx.platform.typedef.__darwin_ssize_t = long
+rbx.platform.typedef.__darwin_time_t = long
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long_long
+rbx.platform.typedef.intptr_t = long
+rbx.platform.typedef.uintptr_t = ulong
+rbx.platform.typedef.user_addr_t = ulong_long
+rbx.platform.typedef.user_size_t = ulong_long
+rbx.platform.typedef.user_ssize_t = long_long
+rbx.platform.typedef.user_long_t = long_long
+rbx.platform.typedef.user_ulong_t = ulong_long
+rbx.platform.typedef.user_time_t = long_long
+rbx.platform.typedef.user_off_t = long_long
+rbx.platform.typedef.syscall_arg_t = ulong_long
+rbx.platform.typedef.__darwin_blkcnt_t = long_long
+rbx.platform.typedef.__darwin_blksize_t = int
+rbx.platform.typedef.__darwin_dev_t = int
+rbx.platform.typedef.__darwin_fsblkcnt_t = uint
+rbx.platform.typedef.__darwin_fsfilcnt_t = uint
+rbx.platform.typedef.__darwin_gid_t = uint
+rbx.platform.typedef.__darwin_id_t = uint
+rbx.platform.typedef.__darwin_ino64_t = ulong_long
+rbx.platform.typedef.__darwin_ino_t = ulong_long
+rbx.platform.typedef.__darwin_mach_port_name_t = uint
+rbx.platform.typedef.__darwin_mach_port_t = uint
+rbx.platform.typedef.__darwin_mode_t = ushort
+rbx.platform.typedef.__darwin_off_t = long_long
+rbx.platform.typedef.__darwin_pid_t = int
+rbx.platform.typedef.__darwin_sigset_t = uint
+rbx.platform.typedef.__darwin_suseconds_t = int
+rbx.platform.typedef.__darwin_uid_t = uint
+rbx.platform.typedef.__darwin_useconds_t = uint
+rbx.platform.typedef.__darwin_uuid_t[16] = uchar
+rbx.platform.typedef.__darwin_uuid_string_t[37] = char
+rbx.platform.typedef.__darwin_pthread_key_t = ulong
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.qaddr_t = pointer
+rbx.platform.typedef.caddr_t = string
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.dev_t = int
+rbx.platform.typedef.fixpt_t = uint
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.blksize_t = int
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.ino64_t = ulong_long
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.mode_t = ushort
+rbx.platform.typedef.nlink_t = ushort
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.segsz_t = int
+rbx.platform.typedef.swblk_t = int
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.clock_t = ulong
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = int
+rbx.platform.typedef.rsize_t = ulong
+rbx.platform.typedef.errno_t = int
+rbx.platform.typedef.fd_mask = int
+rbx.platform.typedef.pthread_key_t = ulong
+rbx.platform.typedef.fsblkcnt_t = uint
+rbx.platform.typedef.fsfilcnt_t = uint
+rbx.platform.typedef.sa_family_t = uchar
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.int_least8_t = char
+rbx.platform.typedef.int_least16_t = short
+rbx.platform.typedef.int_least32_t = int
+rbx.platform.typedef.int_least64_t = long_long
+rbx.platform.typedef.uint_least8_t = uchar
+rbx.platform.typedef.uint_least16_t = ushort
+rbx.platform.typedef.uint_least32_t = uint
+rbx.platform.typedef.uint_least64_t = ulong_long
+rbx.platform.typedef.int_fast8_t = char
+rbx.platform.typedef.int_fast16_t = short
+rbx.platform.typedef.int_fast32_t = int
+rbx.platform.typedef.int_fast64_t = long_long
+rbx.platform.typedef.uint_fast8_t = uchar
+rbx.platform.typedef.uint_fast16_t = ushort
+rbx.platform.typedef.uint_fast32_t = uint
+rbx.platform.typedef.uint_fast64_t = ulong_long
+rbx.platform.typedef.intmax_t = long
+rbx.platform.typedef.uintmax_t = ulong
+rbx.platform.typedef.rlim_t = ulong_long
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-freebsd/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-freebsd/types.conf
new file mode 100644
index 0000000..c4df68a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-freebsd/types.conf
@@ -0,0 +1,128 @@
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__int_least8_t = char
+rbx.platform.typedef.__uint_least8_t = uchar
+rbx.platform.typedef.__int_least16_t = short
+rbx.platform.typedef.__uint_least16_t = ushort
+rbx.platform.typedef.__int_least32_t = int
+rbx.platform.typedef.__uint_least32_t = uint
+rbx.platform.typedef.__int_least64_t = long_long
+rbx.platform.typedef.__uint_least64_t = ulong_long
+rbx.platform.typedef.__int_fast8_t = int
+rbx.platform.typedef.__uint_fast8_t = uint
+rbx.platform.typedef.__int_fast16_t = int
+rbx.platform.typedef.__uint_fast16_t = uint
+rbx.platform.typedef.__int_fast32_t = int
+rbx.platform.typedef.__uint_fast32_t = uint
+rbx.platform.typedef.__int_fast64_t = long_long
+rbx.platform.typedef.__uint_fast64_t = ulong_long
+rbx.platform.typedef.__intptr_t = long
+rbx.platform.typedef.__uintptr_t = ulong
+rbx.platform.typedef.__intmax_t = long_long
+rbx.platform.typedef.__uintmax_t = ulong_long
+rbx.platform.typedef.__register_t = int
+rbx.platform.typedef.__vaddr_t = ulong
+rbx.platform.typedef.__paddr_t = ulong
+rbx.platform.typedef.__vsize_t = ulong
+rbx.platform.typedef.__psize_t = ulong
+rbx.platform.typedef.__clock_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__off_t = long_long
+rbx.platform.typedef.__ptrdiff_t = long
+rbx.platform.typedef.__size_t = ulong
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__time_t = int
+rbx.platform.typedef.__timer_t = int
+rbx.platform.typedef.__wchar_t = int
+rbx.platform.typedef.__wint_t = int
+rbx.platform.typedef.__rune_t = int
+rbx.platform.typedef.__wctrans_t = pointer
+rbx.platform.typedef.__wctype_t = pointer
+rbx.platform.typedef.__cpuid_t = ulong
+rbx.platform.typedef.__dev_t = int
+rbx.platform.typedef.__fixpt_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__in_addr_t = uint
+rbx.platform.typedef.__in_port_t = ushort
+rbx.platform.typedef.__ino_t = uint
+rbx.platform.typedef.__key_t = long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__rlim_t = ulong_long
+rbx.platform.typedef.__sa_family_t = uchar
+rbx.platform.typedef.__segsz_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.__swblk_t = int
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = int
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.unchar = uchar
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.cpuid_t = ulong
+rbx.platform.typedef.register_t = int
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.intptr_t = long
+rbx.platform.typedef.uintptr_t = ulong
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.qaddr_t = pointer
+rbx.platform.typedef.vaddr_t = ulong
+rbx.platform.typedef.paddr_t = ulong
+rbx.platform.typedef.vsize_t = ulong
+rbx.platform.typedef.psize_t = ulong
+rbx.platform.typedef.caddr_t = string
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.daddr32_t = int
+rbx.platform.typedef.daddr64_t = long_long
+rbx.platform.typedef.dev_t = int
+rbx.platform.typedef.fixpt_t = uint
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ino_t = uint
+rbx.platform.typedef.key_t = long
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.segsz_t = int
+rbx.platform.typedef.swblk_t = int
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = int
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.sa_family_t = uchar
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.clock_t = int
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.time_t = int
+rbx.platform.typedef.timer_t = int
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.__fd_mask = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-linux/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-linux/types.conf
new file mode 100644
index 0000000..f319c0b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-linux/types.conf
@@ -0,0 +1,102 @@
+rbx.platform.typedef.__u_char = uchar
+rbx.platform.typedef.__u_short = ushort
+rbx.platform.typedef.__u_int = uint
+rbx.platform.typedef.__u_long = ulong
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long
+rbx.platform.typedef.__uint64_t = ulong
+rbx.platform.typedef.__quad_t = long
+rbx.platform.typedef.__u_quad_t = ulong
+rbx.platform.typedef.__dev_t = ulong
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__ino_t = ulong
+rbx.platform.typedef.__ino64_t = ulong
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = ulong
+rbx.platform.typedef.__off_t = long
+rbx.platform.typedef.__off64_t = long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__clock_t = long
+rbx.platform.typedef.__rlim_t = ulong
+rbx.platform.typedef.__rlim64_t = ulong
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__time_t = long
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__daddr_t = int
+rbx.platform.typedef.__swblk_t = long
+rbx.platform.typedef.__key_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__timer_t = pointer
+rbx.platform.typedef.blksize_t = long
+rbx.platform.typedef.__blkcnt_t = long
+rbx.platform.typedef.__blkcnt64_t = long
+rbx.platform.typedef.__fsblkcnt_t = ulong
+rbx.platform.typedef.__fsblkcnt64_t = ulong
+rbx.platform.typedef.__fsfilcnt_t = ulong
+rbx.platform.typedef.__fsfilcnt64_t = ulong
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__loff_t = long
+rbx.platform.typedef.*__qaddr_t = long
+rbx.platform.typedef.*__caddr_t = char
+rbx.platform.typedef.__intptr_t = long
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.quad_t = long
+rbx.platform.typedef.u_quad_t = ulong
+rbx.platform.typedef.loff_t = long
+rbx.platform.typedef.ino_t = ulong
+rbx.platform.typedef.dev_t = ulong
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = ulong
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.off_t = long
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = pointer
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.__sig_atomic_t = int
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.__fd_mask = long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.blkcnt_t = long
+rbx.platform.typedef.fsblkcnt_t = ulong
+rbx.platform.typedef.fsfilcnt_t = ulong
+rbx.platform.typedef.pthread_t = ulong
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.pthread_once_t = int
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.rlim_t = ulong
+rbx.platform.typedef.__rlimit_resource_t = int
+rbx.platform.typedef.__rusage_who_t = int
+rbx.platform.typedef.__priority_which_t = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-netbsd/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-netbsd/types.conf
new file mode 100644
index 0000000..c4df68a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-netbsd/types.conf
@@ -0,0 +1,128 @@
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__int_least8_t = char
+rbx.platform.typedef.__uint_least8_t = uchar
+rbx.platform.typedef.__int_least16_t = short
+rbx.platform.typedef.__uint_least16_t = ushort
+rbx.platform.typedef.__int_least32_t = int
+rbx.platform.typedef.__uint_least32_t = uint
+rbx.platform.typedef.__int_least64_t = long_long
+rbx.platform.typedef.__uint_least64_t = ulong_long
+rbx.platform.typedef.__int_fast8_t = int
+rbx.platform.typedef.__uint_fast8_t = uint
+rbx.platform.typedef.__int_fast16_t = int
+rbx.platform.typedef.__uint_fast16_t = uint
+rbx.platform.typedef.__int_fast32_t = int
+rbx.platform.typedef.__uint_fast32_t = uint
+rbx.platform.typedef.__int_fast64_t = long_long
+rbx.platform.typedef.__uint_fast64_t = ulong_long
+rbx.platform.typedef.__intptr_t = long
+rbx.platform.typedef.__uintptr_t = ulong
+rbx.platform.typedef.__intmax_t = long_long
+rbx.platform.typedef.__uintmax_t = ulong_long
+rbx.platform.typedef.__register_t = int
+rbx.platform.typedef.__vaddr_t = ulong
+rbx.platform.typedef.__paddr_t = ulong
+rbx.platform.typedef.__vsize_t = ulong
+rbx.platform.typedef.__psize_t = ulong
+rbx.platform.typedef.__clock_t = int
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__off_t = long_long
+rbx.platform.typedef.__ptrdiff_t = long
+rbx.platform.typedef.__size_t = ulong
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__time_t = int
+rbx.platform.typedef.__timer_t = int
+rbx.platform.typedef.__wchar_t = int
+rbx.platform.typedef.__wint_t = int
+rbx.platform.typedef.__rune_t = int
+rbx.platform.typedef.__wctrans_t = pointer
+rbx.platform.typedef.__wctype_t = pointer
+rbx.platform.typedef.__cpuid_t = ulong
+rbx.platform.typedef.__dev_t = int
+rbx.platform.typedef.__fixpt_t = uint
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__in_addr_t = uint
+rbx.platform.typedef.__in_port_t = ushort
+rbx.platform.typedef.__ino_t = uint
+rbx.platform.typedef.__key_t = long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__rlim_t = ulong_long
+rbx.platform.typedef.__sa_family_t = uchar
+rbx.platform.typedef.__segsz_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.__swblk_t = int
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.__suseconds_t = int
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.unchar = uchar
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.cpuid_t = ulong
+rbx.platform.typedef.register_t = int
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.intptr_t = long
+rbx.platform.typedef.uintptr_t = ulong
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.qaddr_t = pointer
+rbx.platform.typedef.vaddr_t = ulong
+rbx.platform.typedef.paddr_t = ulong
+rbx.platform.typedef.vsize_t = ulong
+rbx.platform.typedef.psize_t = ulong
+rbx.platform.typedef.caddr_t = string
+rbx.platform.typedef.daddr_t = int
+rbx.platform.typedef.daddr32_t = int
+rbx.platform.typedef.daddr64_t = long_long
+rbx.platform.typedef.dev_t = int
+rbx.platform.typedef.fixpt_t = uint
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ino_t = uint
+rbx.platform.typedef.key_t = long
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.segsz_t = int
+rbx.platform.typedef.swblk_t = int
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = int
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.sa_family_t = uchar
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.clock_t = int
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.time_t = int
+rbx.platform.typedef.timer_t = int
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.__fd_mask = int
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-openbsd/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-openbsd/types.conf
new file mode 100644
index 0000000..f8419bd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-openbsd/types.conf
@@ -0,0 +1,134 @@
+rbx.platform.typedef.__int8_t = char
+rbx.platform.typedef.__uint8_t = uchar
+rbx.platform.typedef.__int16_t = short
+rbx.platform.typedef.__uint16_t = ushort
+rbx.platform.typedef.__int32_t = int
+rbx.platform.typedef.__uint32_t = uint
+rbx.platform.typedef.__int64_t = long_long
+rbx.platform.typedef.__uint64_t = ulong_long
+rbx.platform.typedef.__int_least8_t = char
+rbx.platform.typedef.__uint_least8_t = uchar
+rbx.platform.typedef.__int_least16_t = short
+rbx.platform.typedef.__uint_least16_t = ushort
+rbx.platform.typedef.__int_least32_t = int
+rbx.platform.typedef.__uint_least32_t = uint
+rbx.platform.typedef.__int_least64_t = long_long
+rbx.platform.typedef.__uint_least64_t = ulong_long
+rbx.platform.typedef.__int_fast8_t = int
+rbx.platform.typedef.__uint_fast8_t = uint
+rbx.platform.typedef.__int_fast16_t = int
+rbx.platform.typedef.__uint_fast16_t = uint
+rbx.platform.typedef.__int_fast32_t = int
+rbx.platform.typedef.__uint_fast32_t = uint
+rbx.platform.typedef.__int_fast64_t = long_long
+rbx.platform.typedef.__uint_fast64_t = ulong_long
+rbx.platform.typedef.__intptr_t = long
+rbx.platform.typedef.__uintptr_t = ulong
+rbx.platform.typedef.__intmax_t = long_long
+rbx.platform.typedef.__uintmax_t = ulong_long
+rbx.platform.typedef.__register_t = long
+rbx.platform.typedef.__vaddr_t = ulong
+rbx.platform.typedef.__paddr_t = ulong
+rbx.platform.typedef.__vsize_t = ulong
+rbx.platform.typedef.__psize_t = ulong
+rbx.platform.typedef.__ptrdiff_t = long
+rbx.platform.typedef.__size_t = ulong
+rbx.platform.typedef.__ssize_t = long
+rbx.platform.typedef.__wchar_t = int
+rbx.platform.typedef.__wint_t = int
+rbx.platform.typedef.__rune_t = int
+rbx.platform.typedef.__wctrans_t = pointer
+rbx.platform.typedef.__wctype_t = pointer
+rbx.platform.typedef.__blkcnt_t = long_long
+rbx.platform.typedef.__blksize_t = int
+rbx.platform.typedef.__clock_t = long_long
+rbx.platform.typedef.__clockid_t = int
+rbx.platform.typedef.__cpuid_t = ulong
+rbx.platform.typedef.__dev_t = int
+rbx.platform.typedef.__fixpt_t = uint
+rbx.platform.typedef.__fsblkcnt_t = ulong_long
+rbx.platform.typedef.__fsfilcnt_t = ulong_long
+rbx.platform.typedef.__gid_t = uint
+rbx.platform.typedef.__id_t = uint
+rbx.platform.typedef.__in_addr_t = uint
+rbx.platform.typedef.__in_port_t = ushort
+rbx.platform.typedef.__ino_t = ulong_long
+rbx.platform.typedef.__key_t = long
+rbx.platform.typedef.__mode_t = uint
+rbx.platform.typedef.__nlink_t = uint
+rbx.platform.typedef.__off_t = long_long
+rbx.platform.typedef.__pid_t = int
+rbx.platform.typedef.__rlim_t = ulong_long
+rbx.platform.typedef.__sa_family_t = uchar
+rbx.platform.typedef.__segsz_t = int
+rbx.platform.typedef.__socklen_t = uint
+rbx.platform.typedef.__suseconds_t = long
+rbx.platform.typedef.__swblk_t = int
+rbx.platform.typedef.__time_t = long_long
+rbx.platform.typedef.__timer_t = int
+rbx.platform.typedef.__uid_t = uint
+rbx.platform.typedef.__useconds_t = uint
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.unchar = uchar
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.cpuid_t = ulong
+rbx.platform.typedef.register_t = long
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.int64_t = long_long
+rbx.platform.typedef.uint64_t = ulong_long
+rbx.platform.typedef.u_int8_t = uchar
+rbx.platform.typedef.u_int16_t = ushort
+rbx.platform.typedef.u_int32_t = uint
+rbx.platform.typedef.u_int64_t = ulong_long
+rbx.platform.typedef.quad_t = long_long
+rbx.platform.typedef.u_quad_t = ulong_long
+rbx.platform.typedef.qaddr_t = pointer
+rbx.platform.typedef.vaddr_t = ulong
+rbx.platform.typedef.paddr_t = ulong
+rbx.platform.typedef.vsize_t = ulong
+rbx.platform.typedef.psize_t = ulong
+rbx.platform.typedef.blkcnt_t = long_long
+rbx.platform.typedef.blksize_t = int
+rbx.platform.typedef.caddr_t = string
+rbx.platform.typedef.daddr32_t = int
+rbx.platform.typedef.daddr_t = long_long
+rbx.platform.typedef.dev_t = int
+rbx.platform.typedef.fixpt_t = uint
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.id_t = uint
+rbx.platform.typedef.ino_t = ulong_long
+rbx.platform.typedef.key_t = long
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.rlim_t = ulong_long
+rbx.platform.typedef.segsz_t = int
+rbx.platform.typedef.swblk_t = int
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.fsblkcnt_t = ulong_long
+rbx.platform.typedef.fsfilcnt_t = ulong_long
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.clock_t = long_long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.time_t = long_long
+rbx.platform.typedef.timer_t = int
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.__fd_mask = uint
+rbx.platform.typedef.sigset_t = uint
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.sa_family_t = uchar
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-solaris/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-solaris/types.conf
new file mode 100644
index 0000000..f461b7e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-solaris/types.conf
@@ -0,0 +1,122 @@
+rbx.platform.typedef.lock_t = uchar
+rbx.platform.typedef.int8_t = char
+rbx.platform.typedef.int16_t = short
+rbx.platform.typedef.int32_t = int
+rbx.platform.typedef.int64_t = long
+rbx.platform.typedef.uint8_t = uchar
+rbx.platform.typedef.uint16_t = ushort
+rbx.platform.typedef.uint32_t = uint
+rbx.platform.typedef.uint64_t = ulong
+rbx.platform.typedef.intmax_t = long
+rbx.platform.typedef.uintmax_t = ulong
+rbx.platform.typedef.intptr_t = long
+rbx.platform.typedef.uintptr_t = ulong
+rbx.platform.typedef.int_fast8_t = char
+rbx.platform.typedef.int_fast16_t = int
+rbx.platform.typedef.int_fast32_t = int
+rbx.platform.typedef.int_fast64_t = long
+rbx.platform.typedef.uint_fast8_t = uchar
+rbx.platform.typedef.uint_fast16_t = uint
+rbx.platform.typedef.uint_fast32_t = uint
+rbx.platform.typedef.uint_fast64_t = ulong
+rbx.platform.typedef.int_least8_t = char
+rbx.platform.typedef.int_least16_t = short
+rbx.platform.typedef.int_least32_t = int
+rbx.platform.typedef.int_least64_t = long
+rbx.platform.typedef.uint_least8_t = uchar
+rbx.platform.typedef.uint_least16_t = ushort
+rbx.platform.typedef.uint_least32_t = uint
+rbx.platform.typedef.uint_least64_t = ulong
+rbx.platform.typedef.longlong_t = long_long
+rbx.platform.typedef.u_longlong_t = ulong_long
+rbx.platform.typedef.t_scalar_t = int
+rbx.platform.typedef.t_uscalar_t = uint
+rbx.platform.typedef.uchar_t = uchar
+rbx.platform.typedef.ushort_t = ushort
+rbx.platform.typedef.uint_t = uint
+rbx.platform.typedef.ulong_t = ulong
+rbx.platform.typedef.*caddr_t = char
+rbx.platform.typedef.daddr_t = long
+rbx.platform.typedef.cnt_t = short
+rbx.platform.typedef.ptrdiff_t = long
+rbx.platform.typedef.pfn_t = ulong
+rbx.platform.typedef.pgcnt_t = ulong
+rbx.platform.typedef.spgcnt_t = long
+rbx.platform.typedef.use_t = uchar
+rbx.platform.typedef.sysid_t = short
+rbx.platform.typedef.index_t = short
+rbx.platform.typedef.off_t = long
+rbx.platform.typedef.off64_t = long
+rbx.platform.typedef.ino_t = ulong
+rbx.platform.typedef.blkcnt_t = long
+rbx.platform.typedef.fsblkcnt_t = ulong
+rbx.platform.typedef.fsfilcnt_t = ulong
+rbx.platform.typedef.ino64_t = ulong
+rbx.platform.typedef.blkcnt64_t = long
+rbx.platform.typedef.fsblkcnt64_t = ulong
+rbx.platform.typedef.fsfilcnt64_t = ulong
+rbx.platform.typedef.blksize_t = int
+rbx.platform.typedef.pad64_t = long
+rbx.platform.typedef.upad64_t = ulong
+rbx.platform.typedef.offset_t = long_long
+rbx.platform.typedef.u_offset_t = ulong_long
+rbx.platform.typedef.len_t = ulong_long
+rbx.platform.typedef.diskaddr_t = ulong_long
+rbx.platform.typedef.k_fltset_t = uint
+rbx.platform.typedef.id_t = int
+rbx.platform.typedef.lgrp_id_t = int
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef.suseconds_t = long
+rbx.platform.typedef.major_t = uint
+rbx.platform.typedef.minor_t = uint
+rbx.platform.typedef.pri_t = short
+rbx.platform.typedef.cpu_flag_t = ushort
+rbx.platform.typedef.o_mode_t = ushort
+rbx.platform.typedef.o_dev_t = short
+rbx.platform.typedef.o_uid_t = ushort
+rbx.platform.typedef.o_gid_t = ushort
+rbx.platform.typedef.o_nlink_t = short
+rbx.platform.typedef.o_pid_t = short
+rbx.platform.typedef.o_ino_t = ushort
+rbx.platform.typedef.key_t = int
+rbx.platform.typedef.mode_t = uint
+rbx.platform.typedef.uid_t = uint
+rbx.platform.typedef.gid_t = uint
+rbx.platform.typedef.datalink_id_t = uint
+rbx.platform.typedef.taskid_t = int
+rbx.platform.typedef.projid_t = int
+rbx.platform.typedef.poolid_t = int
+rbx.platform.typedef.zoneid_t = int
+rbx.platform.typedef.ctid_t = int
+rbx.platform.typedef.pthread_t = uint
+rbx.platform.typedef.pthread_key_t = uint
+rbx.platform.typedef.dev_t = ulong
+rbx.platform.typedef.nlink_t = uint
+rbx.platform.typedef.pid_t = int
+rbx.platform.typedef.size_t = ulong
+rbx.platform.typedef.ssize_t = long
+rbx.platform.typedef.time_t = long
+rbx.platform.typedef.clock_t = long
+rbx.platform.typedef.clockid_t = int
+rbx.platform.typedef.timer_t = int
+rbx.platform.typedef.unchar = uchar
+rbx.platform.typedef.ushort = ushort
+rbx.platform.typedef.uint = uint
+rbx.platform.typedef.ulong = ulong
+rbx.platform.typedef.u_char = uchar
+rbx.platform.typedef.u_short = ushort
+rbx.platform.typedef.u_int = uint
+rbx.platform.typedef.u_long = ulong
+rbx.platform.typedef.hrtime_t = long_long
+rbx.platform.typedef.fd_mask = long
+rbx.platform.typedef.fds_mask = long
+rbx.platform.typedef.sa_family_t = ushort
+rbx.platform.typedef.socklen_t = uint
+rbx.platform.typedef.nfds_t = ulong
+rbx.platform.typedef.disp_lock_t = uchar
+rbx.platform.typedef.model_t = uint
+rbx.platform.typedef.in_port_t = ushort
+rbx.platform.typedef.in_addr_t = uint
+rbx.platform.typedef.ipaddr_t = uint
+rbx.platform.typedef.rlim_t = ulong
+rbx.platform.typedef.rlim64_t = ulong_long
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-windows/types.conf b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-windows/types.conf
new file mode 100644
index 0000000..0909c19
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/platform/x86_64-windows/types.conf
@@ -0,0 +1,27 @@
+rbx.platform.typedef.size_t = ulong_long
+rbx.platform.typedef.ssize_t = long_long
+rbx.platform.typedef.intptr_t = long_long
+rbx.platform.typedef.uintptr_t = ulong_long
+rbx.platform.typedef.ptrdiff_t = long_long
+rbx.platform.typedef.wchar_t = ushort
+rbx.platform.typedef.wint_t = ushort
+rbx.platform.typedef.wctype_t = ushort
+rbx.platform.typedef.errno_t = int
+rbx.platform.typedef.__time32_t = long
+rbx.platform.typedef.__time64_t = long_long
+rbx.platform.typedef.time_t = long_long
+rbx.platform.typedef._ino_t = ushort
+rbx.platform.typedef.ino_t = ushort
+rbx.platform.typedef._dev_t = uint
+rbx.platform.typedef.dev_t = uint
+rbx.platform.typedef._pid_t = long_long
+rbx.platform.typedef.pid_t = long_long
+rbx.platform.typedef._mode_t = ushort
+rbx.platform.typedef.mode_t = ushort
+rbx.platform.typedef._off_t = long
+rbx.platform.typedef.off32_t = long
+rbx.platform.typedef._off64_t = long_long
+rbx.platform.typedef.off64_t = long_long
+rbx.platform.typedef.off_t = long_long
+rbx.platform.typedef.useconds_t = uint
+rbx.platform.typedef._sigset_t = ulong_long
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/pointer.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/pointer.rb
new file mode 100644
index 0000000..de4f91f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/pointer.rb
@@ -0,0 +1,160 @@
+#
+# Copyright (C) 2008, 2009 Wayne Meissner
+# Copyright (c) 2007, 2008 Evan Phoenix
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.
+#
+
+require 'ffi/platform'
+module FFI
+  class Pointer
+
+    # Pointer size
+    SIZE = Platform::ADDRESS_SIZE / 8
+
+    # Return the size of a pointer on the current platform, in bytes
+    # @return [Numeric]
+    def self.size
+      SIZE
+    end
+
+    # @param [nil,Numeric] len length of string to return
+    # @return [String]
+    # Read pointer's contents as a string, or the first +len+ bytes of the 
+    # equivalent string if +len+ is not +nil+.
+    def read_string(len=nil)
+      if len
+        get_bytes(0, len)
+      else
+        get_string(0)
+      end
+    end
+
+    # @param [Numeric] len length of string to return
+    # @return [String]
+    # Read the first +len+ bytes of pointer's contents as a string.
+    #
+    # Same as:
+    #  ptr.read_string(len)  # with len not nil
+    def read_string_length(len)
+      get_bytes(0, len)
+    end
+
+    # @return [String]
+    # Read pointer's contents as a string.
+    #
+    # Same as:
+    #  ptr.read_string  # with no len
+    def read_string_to_null
+      get_string(0)
+    end
+
+    # @param [String] str string to write
+    # @param [Numeric] len length of string to return
+    # @return [self]
+    # Write +len+ first bytes of +str+ in pointer's contents.
+    #
+    # Same as:
+    #  ptr.write_string(str, len)   # with len not nil
+    def write_string_length(str, len)
+      put_bytes(0, str, 0, len)
+    end
+
+    # @param [String] str string to write
+    # @param [Numeric] len length of string to return
+    # @return [self]
+    # Write +str+ in pointer's contents, or first +len+ bytes if 
+    # +len+ is not +nil+.
+    def write_string(str, len=nil)
+      len = str.bytesize unless len
+      # Write the string data without NUL termination
+      put_bytes(0, str, 0, len)
+    end
+
+    # @param [Type] type type of data to read from pointer's contents
+    # @param [Symbol] reader method to send to +self+ to read +type+
+    # @param [Numeric] length
+    # @return [Array]
+    # Read an array of +type+ of length +length+.
+    # @example
+    #  ptr.read_array_of_type(TYPE_UINT8, :get_uint8, 4) # -> [1, 2, 3, 4]
+    def read_array_of_type(type, reader, length)
+      ary = []
+      size = FFI.type_size(type)
+      tmp = self
+      length.times { |j|
+        ary << tmp.send(reader)
+        tmp += size unless j == length-1 # avoid OOB
+      }
+      ary
+    end
+
+    # @param [Type] type type of data to write to pointer's contents
+    # @param [Symbol] writer method to send to +self+ to write +type+
+    # @param [Array] ary
+    # @return [self]
+    # Write +ary+ in pointer's contents as +type+.
+    # @example
+    #  ptr.write_array_of_type(TYPE_UINT8, :put_uint8, [1, 2, 3 ,4])
+    def write_array_of_type(type, writer, ary)
+      size = FFI.type_size(type)
+      tmp = self
+      ary.each_with_index {|i, j|
+        tmp.send(writer, i)
+        tmp += size unless j == ary.length-1 # avoid OOB
+      }
+      self
+    end
+
+    # @return [self]
+    def to_ptr
+      self
+    end
+
+    # @param [Symbol,Type] type of data to read
+    # @return [Object]
+    # Read pointer's contents as +type+
+    #
+    # Same as:
+    #  ptr.get(type, 0)
+    def read(type)
+      get(type, 0)
+    end
+
+    # @param [Symbol,Type] type of data to read
+    # @param [Object] value to write
+    # @return [nil]
+    # Write +value+ of type +type+ to pointer's content
+    #
+    # Same as:
+    #  ptr.put(type, 0)
+    def write(type, value)
+      put(type, 0, value)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/struct.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/struct.rb
new file mode 100644
index 0000000..0896d35
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/struct.rb
@@ -0,0 +1,373 @@
+#
+# Copyright (C) 2008-2010 Wayne Meissner
+# Copyright (C) 2008, 2009 Andrea Fazzi
+# Copyright (C) 2008, 2009 Luc Heinrich
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.
+#
+
+require 'ffi/platform'
+require 'ffi/struct_layout_builder'
+
+module FFI
+
+  class StructLayout
+
+    # @return [Array<Array(Symbol, Numeric)>
+    # Get an array of tuples (field name, offset of the field).
+    def offsets
+      members.map { |m| [ m, self[m].offset ] }
+    end
+
+    # @return [Numeric]
+    # Get the offset of a field.
+    def offset_of(field_name)
+      self[field_name].offset
+    end
+
+    # An enum {Field} in a {StructLayout}.
+    class Enum < Field
+
+      # @param [AbstractMemory] ptr pointer on a {Struct}
+      # @return [Object]
+      # Get an object of type {#type} from memory pointed by +ptr+.
+      def get(ptr)
+        type.find(ptr.get_int(offset))
+      end
+
+      # @param [AbstractMemory] ptr pointer on a {Struct}
+      # @param  value
+      # @return [nil]
+      # Set +value+ into memory pointed by +ptr+.
+      def put(ptr, value)
+        ptr.put_int(offset, type.find(value))
+      end
+
+    end
+
+    class InnerStruct < Field
+      def get(ptr)
+        type.struct_class.new(ptr.slice(self.offset, self.size))
+      end
+
+     def put(ptr, value)
+       raise TypeError, "wrong value type (expected #{type.struct_class})" unless value.is_a?(type.struct_class)
+       ptr.slice(self.offset, self.size).__copy_from__(value.pointer, self.size)
+     end
+    end
+
+    class Mapped < Field
+      def initialize(name, offset, type, orig_field)
+        super(name, offset, type)
+        @orig_field = orig_field
+      end
+
+      def get(ptr)
+        type.from_native(@orig_field.get(ptr), nil)
+      end
+
+      def put(ptr, value)
+        @orig_field.put(ptr, type.to_native(value, nil))
+      end
+    end
+  end
+
+  
+  class Struct
+
+    # Get struct size
+    # @return [Numeric]
+    def size
+      self.class.size
+    end
+
+    # @return [Fixnum] Struct alignment
+    def alignment
+      self.class.alignment
+    end
+    alias_method :align, :alignment
+
+    # (see FFI::StructLayout#offset_of)
+    def offset_of(name)
+      self.class.offset_of(name)
+    end
+
+    # (see FFI::StructLayout#members)
+    def members
+      self.class.members
+    end
+
+    # @return [Array]
+    # Get array of values from Struct fields.
+    def values
+      members.map { |m| self[m] }
+    end
+
+    # (see FFI::StructLayout#offsets)
+    def offsets
+      self.class.offsets
+    end
+
+    # Clear the struct content.
+    # @return [self]
+    def clear
+      pointer.clear
+      self
+    end
+
+    # Get {Pointer} to struct content.
+    # @return [AbstractMemory]
+    def to_ptr
+      pointer
+    end
+
+    # Get struct size
+    # @return [Numeric]
+    def self.size
+      defined?(@layout) ? @layout.size : defined?(@size) ? @size : 0
+    end
+
+    # set struct size
+    # @param [Numeric] size
+    # @return [size]
+    def self.size=(size)
+      raise ArgumentError, "Size already set" if defined?(@size) || defined?(@layout)
+      @size = size
+    end
+
+    # @return (see Struct#alignment)
+    def self.alignment
+      @layout.alignment
+    end
+
+    # (see FFI::Type#members)
+    def self.members
+      @layout.members
+    end
+
+    # (see FFI::StructLayout#offsets)
+    def self.offsets
+      @layout.offsets
+    end
+
+    # (see FFI::StructLayout#offset_of)
+    def self.offset_of(name)
+      @layout.offset_of(name)
+    end
+
+    def self.in
+      ptr(:in)
+    end
+
+    def self.out
+      ptr(:out)
+    end
+
+    def self.ptr(flags = :inout)
+      @ref_data_type ||= Type::Mapped.new(StructByReference.new(self))
+    end
+
+    def self.val
+      @val_data_type ||= StructByValue.new(self)
+    end
+
+    def self.by_value
+      self.val
+    end
+
+    def self.by_ref(flags = :inout)
+      self.ptr(flags)
+    end
+
+    class ManagedStructConverter < StructByReference
+
+      # @param [Struct] struct_class
+      def initialize(struct_class)
+        super(struct_class)
+
+        raise NoMethodError, "release() not implemented for class #{struct_class}" unless struct_class.respond_to? :release
+        @method = struct_class.method(:release)
+      end
+
+      # @param [Pointer] ptr
+      # @param [nil] ctx
+      # @return [Struct]
+      def from_native(ptr, ctx)
+        struct_class.new(AutoPointer.new(ptr, @method))
+      end
+    end
+
+    def self.auto_ptr
+      @managed_type ||= Type::Mapped.new(ManagedStructConverter.new(self))
+    end
+
+
+    class << self
+      public
+
+      # @return [StructLayout]
+      # @overload layout
+      #  @return [StructLayout]
+      #  Get struct layout.
+      # @overload layout(*spec)
+      #  @param [Array<Symbol, Integer>,Array(Hash)] spec
+      #  @return [StructLayout]
+      #  Create struct layout from +spec+.
+      #  @example Creating a layout from an array +spec+
+      #    class MyStruct < Struct
+      #      layout :field1, :int,
+      #             :field2, :pointer,
+      #             :field3, :string
+      #    end
+      #  @example Creating a layout from an array +spec+ with offset
+      #    class MyStructWithOffset < Struct
+      #      layout :field1, :int,
+      #             :field2, :pointer, 6,  # set offset to 6 for this field
+      #             :field3, :string
+      #    end
+      #  @example Creating a layout from a hash +spec+ (Ruby 1.9 only)
+      #    class MyStructFromHash < Struct
+      #      layout :field1 => :int,
+      #             :field2 => :pointer,
+      #             :field3 => :string
+      #    end
+      #  @example Creating a layout with pointers to functions
+      #    class MyFunctionTable < Struct
+      #      layout :function1, callback([:int, :int], :int),
+      #             :function2, callback([:pointer], :void),
+      #             :field3, :string
+      #    end
+      #  @note Creating a layout from a hash +spec+ is supported only for Ruby 1.9.
+      def layout(*spec)
+        #raise RuntimeError, "struct layout already defined for #{self.inspect}" if defined?(@layout)
+        return @layout if spec.size == 0
+
+        builder = StructLayoutBuilder.new
+        builder.union = self < Union
+        builder.packed = @packed if defined?(@packed)
+        builder.alignment = @min_alignment if defined?(@min_alignment)
+
+        if spec[0].kind_of?(Hash)
+          hash_layout(builder, spec)
+        else
+          array_layout(builder, spec)
+        end
+        builder.size = @size if defined?(@size) && @size > builder.size
+        cspec = builder.build
+        @layout = cspec unless self == Struct
+        @size = cspec.size
+        return cspec
+      end
+
+
+      protected
+
+      def callback(params, ret)
+        mod = enclosing_module
+        FFI::CallbackInfo.new(find_type(ret, mod), params.map { |e| find_type(e, mod) })
+      end
+
+      def packed(packed = 1)
+        @packed = packed
+      end
+      alias :pack :packed
+      
+      def aligned(alignment = 1)
+        @min_alignment = alignment
+      end
+      alias :align :aligned
+
+      def enclosing_module
+        begin
+          mod = self.name.split("::")[0..-2].inject(Object) { |obj, c| obj.const_get(c) }
+          (mod < FFI::Library || mod < FFI::Struct || mod.respond_to?(:find_type)) ? mod : nil
+        rescue Exception
+          nil
+        end
+      end
+
+
+      def find_field_type(type, mod = enclosing_module)
+        if type.kind_of?(Class) && type < Struct
+          FFI::Type::Struct.new(type)
+
+        elsif type.kind_of?(Class) && type < FFI::StructLayout::Field
+          type
+
+        elsif type.kind_of?(::Array)
+          FFI::Type::Array.new(find_field_type(type[0]), type[1])
+
+        else
+          find_type(type, mod)
+        end
+      end
+
+      def find_type(type, mod = enclosing_module)
+        if mod
+          mod.find_type(type)
+        end || FFI.find_type(type)
+      end
+
+      private
+
+      # @param [StructLayoutBuilder] builder
+      # @param [Hash] spec
+      # @return [builder]
+      # @raise if Ruby 1.8
+      # Add hash +spec+ to +builder+.
+      def hash_layout(builder, spec)
+        raise "Ruby version not supported" if RUBY_VERSION =~ /^1\.8\..*/
+        spec[0].each do |name, type|
+          builder.add name, find_field_type(type), nil
+        end
+      end
+
+      # @param [StructLayoutBuilder] builder
+      # @param [Array<Symbol, Integer>] spec
+      # @return [builder]
+      # Add array +spec+ to +builder+.
+      def array_layout(builder, spec)
+        i = 0
+        while i < spec.size
+          name, type = spec[i, 2]
+          i += 2
+
+          # If the next param is a Integer, it specifies the offset
+          if spec[i].kind_of?(Integer)
+            offset = spec[i]
+            i += 1
+          else
+            offset = nil
+          end
+
+          builder.add name, find_field_type(type), offset
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/struct_layout_builder.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/struct_layout_builder.rb
new file mode 100644
index 0000000..4d6a464
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/struct_layout_builder.rb
@@ -0,0 +1,227 @@
+#
+# Copyright (C) 2008-2010 Wayne Meissner
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.
+#
+
+module FFI
+
+  # Build a {StructLayout struct layout}.
+  class StructLayoutBuilder
+    attr_reader :size
+    attr_reader :alignment
+
+    def initialize
+      @size = 0
+      @alignment = 1
+      @min_alignment = 1
+      @packed = false
+      @union = false
+      @fields = Array.new
+    end
+
+    # Set size attribute with +size+ only if +size+ is greater than attribute value.
+    # @param [Numeric] size
+    def size=(size)
+      @size = size if size > @size
+    end
+
+    # Set alignment attribute with +align+ only if it is greater than attribute value.
+    # @param [Numeric] align
+    def alignment=(align)
+      @alignment = align if align > @alignment
+      @min_alignment = align
+    end
+
+    # Set union attribute.
+    # Set to +true+ to build a {Union} instead of a {Struct}.
+    # @param [Boolean] is_union
+    # @return [is_union]
+    def union=(is_union)
+      @union = is_union
+    end
+
+    # Building a {Union} or a {Struct} ?
+    #
+    # @return [Boolean]
+    #
+    def union?
+      @union
+    end
+
+    # Set packed attribute
+    # @overload packed=(packed) Set alignment and packed attributes to
+    #   +packed+.
+    #
+    #   @param [Fixnum] packed
+    #
+    #   @return [packed]
+    # @overload packed=(packed) Set packed attribute.
+    #   @param packed
+    #
+    #   @return [0,1]
+    #
+    def packed=(packed)
+      if packed.is_a?(0.class)
+        @alignment = packed
+        @packed = packed
+      else
+        @packed = packed ? 1 : 0
+      end
+    end
+
+
+    # List of number types
+    NUMBER_TYPES = [
+      Type::INT8,
+      Type::UINT8,
+      Type::INT16,
+      Type::UINT16,
+      Type::INT32,
+      Type::UINT32,
+      Type::LONG,
+      Type::ULONG,
+      Type::INT64,
+      Type::UINT64,
+      Type::FLOAT32,
+      Type::FLOAT64,
+      Type::LONGDOUBLE,
+      Type::BOOL,
+    ]
+
+    # @param [String, Symbol] name name of the field
+    # @param [Array, DataConverter, Struct, StructLayout::Field, Symbol, Type] type type of the field
+    # @param [Numeric, nil] offset
+    # @return [self]
+    # Add a field to the builder.
+    # @note Setting +offset+ to +nil+ or +-1+ is equivalent to +0+.
+    def add(name, type, offset = nil)
+
+      if offset.nil? || offset == -1
+        offset = @union ? 0 : align(@size, @packed ? [ @packed, type.alignment ].min : [ @min_alignment, type.alignment ].max)
+      end
+
+      #
+      # If a FFI::Type type was passed in as the field arg, try and convert to a StructLayout::Field instance
+      #
+      field = type.is_a?(StructLayout::Field) ? type : field_for_type(name, offset, type)
+      @fields << field
+      @alignment = [ @alignment, field.alignment ].max unless @packed
+      @size = [ @size, field.size + (@union ? 0 : field.offset) ].max
+
+      return self
+    end
+
+    # @param (see #add)
+    # @return (see #add)
+    # Same as {#add}.
+    # @see #add
+    def add_field(name, type, offset = nil)
+      add(name, type, offset)
+    end
+
+    # @param (see #add)
+    # @return (see #add)
+    # Add a struct as a field to the builder.
+    def add_struct(name, type, offset = nil)
+      add(name, Type::Struct.new(type), offset)
+    end
+
+    # @param name (see #add)
+    # @param type (see #add)
+    # @param [Numeric] count array length
+    # @param offset (see #add)
+    # @return (see #add)
+    # Add an array as a field to the builder.
+    def add_array(name, type, count, offset = nil)
+      add(name, Type::Array.new(type, count), offset)
+    end
+
+    # @return [StructLayout]
+    # Build and return the struct layout.
+    def build
+      # Add tail padding if the struct is not packed
+      size = @packed ? @size : align(@size, @alignment)
+
+      layout = StructLayout.new(@fields, size, @alignment)
+      layout.__union! if @union
+      layout
+    end
+
+    private
+
+    # @param [Numeric] offset
+    # @param [Numeric] align
+    # @return [Numeric]
+    def align(offset, align)
+      align + ((offset - 1) & ~(align - 1));
+    end
+
+    # @param (see #add)
+    # @return [StructLayout::Field]
+    def field_for_type(name, offset, type)
+      field_class = case
+      when type.is_a?(Type::Function)
+        StructLayout::Function
+
+      when type.is_a?(Type::Struct)
+        StructLayout::InnerStruct
+
+      when type.is_a?(Type::Array)
+        StructLayout::Array
+
+      when type.is_a?(FFI::Enum)
+        StructLayout::Enum
+
+      when NUMBER_TYPES.include?(type)
+        StructLayout::Number
+
+      when type == Type::POINTER
+        StructLayout::Pointer
+
+      when type == Type::STRING
+        StructLayout::String
+
+      when type.is_a?(Class) && type < StructLayout::Field
+        type
+
+      when type.is_a?(DataConverter)
+        return StructLayout::Mapped.new(name, offset, Type::Mapped.new(type), field_for_type(name, offset, type.native_type))
+
+      when type.is_a?(Type::Mapped)
+        return StructLayout::Mapped.new(name, offset, type, field_for_type(name, offset, type.native_type))
+
+      else
+        raise TypeError, "invalid struct field type #{type.inspect}"
+      end
+
+      field_class.new(name, offset, type)
+    end
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/const_generator.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/const_generator.rb
new file mode 100644
index 0000000..dfc622e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/const_generator.rb
@@ -0,0 +1,229 @@
+require 'tempfile'
+require 'open3'
+
+module FFI
+
+  # ConstGenerator turns C constants into ruby values.
+  #
+  # @example a simple example for stdio
+  #  cg = FFI::ConstGenerator.new('stdio') do |gen|
+  #    gen.const(:SEEK_SET)
+  #    gen.const('SEEK_CUR')
+  #    gen.const('seek_end')   # this constant does not exist
+  #  end            # #calculate called automatically at the end of the block
+  #
+  #  cg['SEEK_SET'] # => 0
+  #  cg['SEEK_CUR'] # => 1
+  #  cg['seek_end'] # => nil
+  #  cg.to_ruby     # => "SEEK_SET = 0\nSEEK_CUR = 1\n# seek_end not available"
+  class ConstGenerator
+    @options = {}
+    attr_reader :constants
+
+    # Creates a new constant generator that uses +prefix+ as a name, and an
+    # options hash.
+    #
+    # The only option is +:required+, which if set to +true+ raises an error if a
+    # constant you have requested was not found.
+    # 
+    # @param [#to_s] prefix
+    # @param [Hash] options
+    # @return 
+    # @option options [Boolean] :required
+    # @overload initialize(prefix, options)
+    # @overload initialize(prefix, options) { |gen| ... }
+    #  @yieldparam [ConstGenerator] gen new generator is passed to the block
+    #  When passed a block, {#calculate} is automatically called at the end of
+    #  the block, otherwise you must call it yourself.
+    def initialize(prefix = nil, options = {})
+      @includes = ['stdio.h', 'stddef.h']
+      @constants = {}
+      @prefix = prefix
+
+      @required = options[:required]
+      @options = options
+
+      if block_given? then
+        yield self
+        calculate self.class.options.merge(options)
+      end
+    end
+    # Set class options
+    # These options are merged with {#initialize} options when it is called with a block.
+    # @param [Hash] options
+    # @return [Hash] class options
+    def self.options=(options)
+      @options = options
+    end
+    # Get class options.
+    # @return [Hash] class options
+    def self.options
+      @options
+    end
+    # @param [String] name
+    # @return constant value (converted if a +converter+ was defined).
+    # Access a constant by name.
+    def [](name)
+      @constants[name].converted_value
+    end
+
+    # Request the value for C constant +name+.
+    #
+    # @param [#to_s] name C constant name
+    # @param [String] format a printf format string to print the value out
+    # @param [String] cast a C cast for the value
+    # @param ruby_name alternate ruby name for {#to_ruby}
+    #
+    # @overload const(name, format=nil, cast='', ruby_name=nil, converter=nil)
+    #  +converter+ is a Method or a Proc.
+    #  @param [#call] converter convert the value from a string to the appropriate
+    #   type for {#to_ruby}.
+    # @overload const(name, format=nil, cast='', ruby_name=nil) { |value| ... }
+    #  Use a converter block. This block convert the value from a string to the 
+    #  appropriate type for {#to_ruby}.
+    #  @yieldparam value constant value
+    def const(name, format = nil, cast = '', ruby_name = nil, converter = nil,
+              &converter_proc)
+      format ||= '%d'
+      cast ||= ''
+
+      if converter_proc and converter then
+        raise ArgumentError, "Supply only converter or converter block"
+      end
+
+      converter = converter_proc if converter.nil?
+
+      const = Constant.new name, format, cast, ruby_name, converter
+      @constants[name.to_s] = const
+      return const
+    end
+
+    # Calculate constants values.
+    # @param [Hash] options
+    # @option options [String] :cppflags flags for C compiler
+    # @return [nil]
+    # @raise if a constant is missing and +:required+ was set to +true+ (see {#initialize})
+    def calculate(options = {})
+      binary = File.join Dir.tmpdir, "rb_const_gen_bin_#{Process.pid}"
+
+      Tempfile.open("#{@prefix}.const_generator") do |f|
+        @includes.each do |inc|
+          f.puts "#include <#{inc}>"
+        end
+        f.puts "\nint main(int argc, char **argv)\n{"
+
+        @constants.each_value do |const|
+          f.puts <<-EOF
+  #ifdef #{const.name}
+  printf("#{const.name} #{const.format}\\n", #{const.cast}#{const.name});
+  #endif
+          EOF
+        end
+
+        f.puts "\n\treturn 0;\n}"
+        f.flush
+
+        output = `gcc #{options[:cppflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -x c -Wall -Werror #{f.path} -o #{binary} 2>&1`
+
+        unless $?.success? then
+          output = output.split("\n").map { |l| "\t#{l}" }.join "\n"
+          raise "Compilation error generating constants #{@prefix}:\n#{output}"
+        end
+      end
+
+      output = `#{binary}`
+      File.unlink(binary + (FFI::Platform.windows? ? ".exe" : ""))
+      output.each_line do |line|
+        line =~ /^(\S+)\s(.*)$/
+        const = @constants[$1]
+        const.value = $2
+      end
+
+      missing_constants = @constants.select do |name, constant|
+        constant.value.nil?
+      end.map { |name,| name }
+
+      if @required and not missing_constants.empty? then
+        raise "Missing required constants for #{@prefix}: #{missing_constants.join ', '}"
+      end
+    end
+
+    # Dump constants to +io+.
+    # @param [#puts] io
+    # @return [nil]
+    def dump_constants(io)
+      @constants.each do |name, constant|
+        name = [@prefix, name].join '.' if @prefix
+        io.puts "#{name} = #{constant.converted_value}"
+      end
+    end
+
+    # Outputs values for discovered constants.  If the constant's value was
+    # not discovered it is not omitted.
+    # @return [String]
+    def to_ruby
+      @constants.sort_by { |name,| name }.map do |name, constant|
+        if constant.value.nil? then
+          "# #{name} not available"
+        else
+          constant.to_ruby
+        end
+      end.join "\n"
+    end
+
+    # Add additional C include file(s) to calculate constants from.
+    # @note +stdio.h+ and +stddef.h+ automatically included
+    # @param [List<String>, Array<String>] i include file(s)
+    # @return [Array<String>] array of include files
+    def include(*i)
+      @includes |= i.flatten
+    end
+
+  end
+
+  # This class hold constants for {ConstGenerator}
+  class ConstGenerator::Constant
+
+    attr_reader :name, :format, :cast
+    attr_accessor :value
+
+    # @param [#to_s] name
+    # @param [String] format a printf format string to print the value out
+    # @param [String] cast a C cast for the value
+    # @param ruby_name alternate ruby name for {#to_ruby}
+    # @param [#call] converter convert the value from a string to the appropriate
+    #  type for {#to_ruby}.
+    def initialize(name, format, cast, ruby_name = nil, converter=nil)
+      @name = name
+      @format = format
+      @cast = cast
+      @ruby_name = ruby_name
+      @converter = converter
+      @value = nil
+    end
+
+    # Return constant value (converted if a +converter+ was defined).
+    # @return constant value.
+    def converted_value
+      if @converter
+        @converter.call(@value)
+      else
+        @value
+      end
+    end
+
+    # get constant ruby name
+    # @return [String]
+    def ruby_name
+      @ruby_name || @name
+    end
+
+    # Get an evaluable string from constant.
+    # @return [String]
+    def to_ruby
+      "#{ruby_name} = #{converted_value}"
+    end
+
+  end  
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/generator.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/generator.rb
new file mode 100644
index 0000000..29b59e1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/generator.rb
@@ -0,0 +1,60 @@
+module FFI
+
+  # @private
+  class Generator
+
+    def initialize(ffi_name, rb_name, options = {})
+      @ffi_name = ffi_name
+      @rb_name = rb_name
+      @options = options
+      @name = File.basename rb_name, '.rb'
+
+      file = File.read @ffi_name
+
+      new_file = file.gsub(/^( *)@@@(.*?)@@@/m) do
+        @constants = []
+        @structs = []
+
+        indent = $1
+        original_lines = $2.count "\n"
+
+        instance_eval $2, @ffi_name, $`.count("\n")
+
+        new_lines = []
+        @constants.each { |c| new_lines << c.to_ruby }
+        @structs.each { |s| new_lines << s.generate_layout }
+
+        new_lines = new_lines.join("\n").split "\n" # expand multiline blocks
+        new_lines = new_lines.map { |line| indent + line }
+
+        padding = original_lines - new_lines.length
+        new_lines += [nil] * padding if padding >= 0
+
+        new_lines.join "\n"
+      end
+
+      open @rb_name, 'w' do |f|
+        f.puts "# This file is generated by rake. Do not edit."
+        f.puts
+        f.puts new_file
+      end
+    end
+
+    def constants(options = {}, &block)
+      @constants << FFI::ConstGenerator.new(@name, @options.merge(options), &block)
+    end
+
+    def struct(options = {}, &block)
+      @structs << FFI::StructGenerator.new(@name, @options.merge(options), &block)
+    end
+
+    ##
+    # Utility converter for constants
+
+    def to_s
+      proc { |obj| obj.to_s.inspect }
+    end
+
+  end
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/generator_task.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/generator_task.rb
new file mode 100644
index 0000000..9e39519
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/generator_task.rb
@@ -0,0 +1,36 @@
+begin
+  require 'ffi/struct_generator'
+  require 'ffi/const_generator'
+  require 'ffi/generator'
+rescue LoadError
+  # from Rakefile
+  require 'lib/ffi/struct_generator'
+  require 'lib/ffi/const_generator'
+  require 'lib/ffi/generator'
+end
+
+require 'rake'
+require 'rake/tasklib'
+require 'tempfile'
+
+##
+# Rake task that calculates C structs for FFI::Struct.
+
+# @private
+class FFI::Generator::Task < Rake::TaskLib
+
+  def initialize(rb_names)
+    task :clean do rm_f rb_names end
+
+    rb_names.each do |rb_name|
+      ffi_name = "#{rb_name}.ffi"
+
+      file rb_name => ffi_name do |t|
+        puts "Generating #{rb_name}..." if Rake.application.options.trace
+
+        FFI::Generator.new ffi_name, rb_name
+      end
+    end
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/struct_generator.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/struct_generator.rb
new file mode 100644
index 0000000..e892e65
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/struct_generator.rb
@@ -0,0 +1,194 @@
+require 'tempfile'
+
+module FFI
+
+  ##
+  # Generates an FFI Struct layout.
+  #
+  # Given the @@@ portion in:
+  #
+  #   module Zlib::ZStream < FFI::Struct
+  #     @@@
+  #     name "struct z_stream_s"
+  #     include "zlib.h"
+  #   
+  #     field :next_in,   :pointer
+  #     field :avail_in,  :uint
+  #     field :total_in,  :ulong
+  #   
+  #     # ...
+  #     @@@
+  #   end
+  #
+  # StructGenerator will create the layout:
+  #
+  #   layout :next_in, :pointer, 0,
+  #          :avail_in, :uint, 4,
+  #          :total_in, :ulong, 8,
+  #          # ...
+  #
+  # StructGenerator does its best to pad the layout it produces to preserve
+  # line numbers.  Place the struct definition as close to the top of the file
+  # for best results.
+
+  class StructGenerator
+    @options = {}
+    attr_accessor :size
+    attr_reader   :fields
+
+    def initialize(name, options = {})
+      @name = name
+      @struct_name = nil
+      @includes = []
+      @fields = []
+      @found = false
+      @size = nil
+
+      if block_given? then
+        yield self
+        calculate self.class.options.merge(options)
+      end
+    end
+    def self.options=(options)
+      @options = options
+    end
+    def self.options
+      @options
+    end
+    def calculate(options = {})
+      binary = File.join Dir.tmpdir, "rb_struct_gen_bin_#{Process.pid}"
+
+      raise "struct name not set" if @struct_name.nil?
+
+      Tempfile.open("#{@name}.struct_generator") do |f|
+        f.puts "#include <stdio.h>"
+
+        @includes.each do |inc|
+          f.puts "#include <#{inc}>"
+        end
+
+        f.puts "#include <stddef.h>\n\n"
+        f.puts "int main(int argc, char **argv)\n{"
+        f.puts "  #{@struct_name} s;"
+        f.puts %[  printf("sizeof(#{@struct_name}) %u\\n", (unsigned int) sizeof(#{@struct_name}));]
+
+        @fields.each do |field|
+          f.puts <<-EOF
+    printf("#{field.name} %u %u\\n", (unsigned int) offsetof(#{@struct_name}, #{field.name}),
+           (unsigned int) sizeof(s.#{field.name}));
+  EOF
+        end
+
+        f.puts "\n  return 0;\n}"
+        f.flush
+
+        output = `gcc #{options[:cppflags]} #{options[:cflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -x c -Wall -Werror #{f.path} -o #{binary} 2>&1`
+
+        unless $?.success? then
+          @found = false
+          output = output.split("\n").map { |l| "\t#{l}" }.join "\n"
+          raise "Compilation error generating struct #{@name} (#{@struct_name}):\n#{output}"
+        end
+      end
+      
+      output = `#{binary}`.split "\n"
+      File.unlink(binary + (FFI::Platform.windows? ? ".exe" : ""))
+      sizeof = output.shift
+      unless @size
+        m = /\s*sizeof\([^)]+\) (\d+)/.match sizeof
+        @size = m[1]
+      end
+
+      line_no = 0
+      output.each do |line|
+        md = line.match(/.+ (\d+) (\d+)/)
+        @fields[line_no].offset = md[1].to_i
+        @fields[line_no].size   = md[2].to_i
+
+        line_no += 1
+      end
+
+      @found = true
+    end
+
+    def field(name, type=nil)
+      field = Field.new(name, type)
+      @fields << field
+      return field
+    end
+
+    def found?
+      @found
+    end
+
+    def dump_config(io)
+      io.puts "rbx.platform.#{@name}.sizeof = #{@size}"
+
+      @fields.each { |field| io.puts field.to_config(@name) }
+    end
+
+    def generate_layout
+      buf = ""
+
+      @fields.each_with_index do |field, i|
+        if buf.empty?
+          buf << "layout :#{field.name}, :#{field.type}, #{field.offset}"
+        else
+          buf << "       :#{field.name}, :#{field.type}, #{field.offset}"
+        end
+
+        if i < @fields.length - 1
+          buf << ",\n"
+        end
+      end
+
+      buf
+    end
+
+    def get_field(name)
+      @fields.find { |f| name == f.name }
+    end
+
+    def include(i)
+      @includes << i
+    end
+
+    def name(n)
+      @struct_name = n
+    end
+
+  end
+
+  ##
+  # A field in a Struct.
+
+  class StructGenerator::Field
+
+    attr_reader :name
+    attr_reader :type
+    attr_reader :offset
+    attr_accessor :size
+
+    def initialize(name, type)
+      @name = name
+      @type = type
+      @offset = nil
+      @size = nil
+    end
+
+    def offset=(o)
+      @offset = o
+    end
+
+    def to_config(name)
+      buf = []
+      buf << "rbx.platform.#{name}.#{@name}.offset = #{@offset}"
+      buf << "rbx.platform.#{name}.#{@name}.size = #{@size}"
+      buf << "rbx.platform.#{name}.#{@name}.type = #{@type}" if @type
+      buf
+    end
+
+  end
+
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/types_generator.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/types_generator.rb
new file mode 100644
index 0000000..ff24ec5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/tools/types_generator.rb
@@ -0,0 +1,134 @@
+require 'tempfile'
+
+module FFI
+
+  # @private
+  class TypesGenerator
+
+    ##
+    # Maps different C types to the C type representations we use
+
+    TYPE_MAP = {
+               "char" => :char,
+        "signed char" => :char,
+      "__signed char" => :char,
+      "unsigned char" => :uchar,
+
+               "short"     => :short,
+        "signed short"     => :short,
+        "signed short int" => :short,
+      "unsigned short"     => :ushort,
+      "unsigned short int" => :ushort,
+
+               "int" => :int,
+        "signed int" => :int,
+      "unsigned int" => :uint,
+
+               "long" => :long,
+               "long int" => :long,
+        "signed long" => :long,
+        "signed long int" => :long,
+      "unsigned long" => :ulong,
+      "unsigned long int" => :ulong,
+      "long unsigned int" => :ulong,
+
+               "long long"     => :long_long,
+               "long long int" => :long_long,
+        "signed long long"     => :long_long,
+        "signed long long int" => :long_long,
+      "unsigned long long"     => :ulong_long,
+      "unsigned long long int" => :ulong_long,
+
+      "char *" => :string,
+      "void *" => :pointer,
+    }
+
+    def self.generate(options = {})
+      typedefs = nil
+      Tempfile.open 'ffi_types_generator' do |io|
+        io.puts <<-C
+#include <sys/types.h>
+#if !(defined(WIN32))
+#include <sys/socket.h>
+#include <sys/resource.h>
+#endif
+        C
+
+        io.close
+        cc = ENV['CC'] || 'gcc'
+        cmd = "#{cc} -E -x c #{options[:cppflags]} -D_DARWIN_USE_64_BIT_INODE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -c"
+        if options[:input]
+          typedefs = File.read(options[:input])
+        elsif options[:remote]
+          typedefs = `ssh #{options[:remote]} #{cmd} - < #{io.path}`
+        else
+          typedefs = `#{cmd} #{io.path}`
+        end
+      end
+
+      code = ""
+
+      typedefs.each_line do |type|
+        # We only care about single line typedef
+        next unless type =~ /typedef/
+        # Ignore unions or structs
+        next if type =~ /union|struct/
+
+        # strip off the starting typedef and ending ;
+        type.gsub!(/^(.*typedef\s*)/, "")
+        type.gsub!(/\s*;\s*$/, "")
+
+        parts = type.split(/\s+/)
+        def_type   = parts.join(" ")
+
+        # GCC does mapping with __attribute__ stuf, also see
+        # http://hal.cs.berkeley.edu/cil/cil016.html section 16.2.7.  Problem
+        # with this is that the __attribute__ stuff can either occur before or
+        # after the new type that is defined...
+        if type =~ /__attribute__/
+          if parts.last =~ /__QI__|__HI__|__SI__|__DI__|__word__/
+
+            # In this case, the new type is BEFORE __attribute__ we need to
+            # find the final_type as the type before the part that starts with
+            # __attribute__
+            final_type = ""
+            parts.each do |p|
+              break if p =~ /__attribute__/
+              final_type = p
+            end
+          else
+            final_type = parts.pop
+          end
+
+          def_type = case type
+                     when /__QI__/   then "char"
+                     when /__HI__/   then "short"
+                     when /__SI__/   then "int"
+                     when /__DI__/   then "long long"
+                     when /__word__/ then "long"
+                     else                 "int"
+                     end
+
+          def_type = "unsigned #{def_type}" if type =~ /unsigned/
+        else
+          final_type = parts.pop
+          def_type   = parts.join(" ")
+        end
+
+        if type = TYPE_MAP[def_type]
+          code << "rbx.platform.typedef.#{final_type} = #{type}\n"
+          TYPE_MAP[final_type] = TYPE_MAP[def_type]
+        else
+          # Fallback to an ordinary pointer if we don't know the type
+          if def_type =~ /\*/
+            code << "rbx.platform.typedef.#{final_type} = pointer\n"
+            TYPE_MAP[final_type] = :pointer
+          end
+        end
+      end
+
+      code
+    end
+  end
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/types.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/types.rb
new file mode 100644
index 0000000..ddad36e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/types.rb
@@ -0,0 +1,194 @@
+#
+# Copyright (C) 2008-2010 Wayne Meissner
+# Copyright (c) 2007, 2008 Evan Phoenix
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.
+#
+
+# see {file:README}
+module FFI
+
+  # @param [Type, DataConverter, Symbol] old type definition used by {FFI.find_type}
+  # @param [Symbol] add new type definition's name to add
+  # @return [Type]
+  # Add a definition type to type definitions.
+  def self.typedef(old, add)
+    TypeDefs[add] = self.find_type(old)
+  end
+
+  # (see FFI.typedef)
+  def self.add_typedef(old, add)
+    typedef old, add
+  end
+
+
+  # @param [Type, DataConverter, Symbol] name
+  # @param [Hash] type_map if nil, {FFI::TypeDefs} is used
+  # @return [Type]
+  # Find a type in +type_map+ ({FFI::TypeDefs}, by default) from
+  # a type objet, a type name (symbol). If +name+ is a {DataConverter},
+  # a new {Type::Mapped} is created.
+  def self.find_type(name, type_map = nil)
+    if name.is_a?(Type)
+      name
+
+    elsif type_map && type_map.has_key?(name)
+      type_map[name]
+
+    elsif TypeDefs.has_key?(name)
+      TypeDefs[name]
+
+    elsif name.is_a?(DataConverter)
+      (type_map || TypeDefs)[name] = Type::Mapped.new(name)
+    else
+      raise TypeError, "unable to resolve type '#{name}'"
+    end
+  end
+
+  # List of type definitions
+  TypeDefs.merge!({
+      # The C void type; only useful for function return types
+      :void => Type::VOID,
+
+      # C boolean type
+      :bool => Type::BOOL,
+
+      # C nul-terminated string
+      :string => Type::STRING,
+
+      # C signed char
+      :char => Type::CHAR,
+      # C unsigned char
+      :uchar => Type::UCHAR,
+
+      # C signed short
+      :short => Type::SHORT,
+      # C unsigned short
+      :ushort => Type::USHORT,
+
+      # C signed int
+      :int => Type::INT,
+      # C unsigned int
+      :uint => Type::UINT,
+
+      # C signed long
+      :long => Type::LONG,
+
+      # C unsigned long
+      :ulong => Type::ULONG,
+
+      # C signed long long integer
+      :long_long => Type::LONG_LONG,
+
+      # C unsigned long long integer
+      :ulong_long => Type::ULONG_LONG,
+
+      # C single precision float
+      :float => Type::FLOAT,
+
+      # C double precision float
+      :double => Type::DOUBLE,
+
+      # C long double
+      :long_double => Type::LONGDOUBLE,
+
+      # Native memory address
+      :pointer => Type::POINTER,
+
+      # 8 bit signed integer
+      :int8 => Type::INT8,
+      # 8 bit unsigned integer
+      :uint8 => Type::UINT8,
+
+      # 16 bit signed integer
+      :int16 => Type::INT16,
+      # 16 bit unsigned integer
+      :uint16 => Type::UINT16,
+
+      # 32 bit signed integer
+      :int32 => Type::INT32,
+      # 32 bit unsigned integer
+      :uint32 => Type::UINT32,
+
+      # 64 bit signed integer
+      :int64 => Type::INT64,
+      # 64 bit unsigned integer
+      :uint64 => Type::UINT64,
+
+      :buffer_in => Type::BUFFER_IN,
+      :buffer_out => Type::BUFFER_OUT,
+      :buffer_inout => Type::BUFFER_INOUT,
+
+      # Used in function prototypes to indicate the arguments are variadic
+      :varargs => Type::VARARGS,
+  })
+
+  # This will convert a pointer to a Ruby string (just like `:string`), but
+  # also allow to work with the pointer itself. This is useful when you want
+  # a Ruby string already containing a copy of the data, but also the pointer
+  # to the data for you to do something with it, like freeing it, in case the
+  # library handed the memory to off to the caller (Ruby-FFI).
+  #
+  # It's {typedef}'d as +:strptr+.
+  class StrPtrConverter
+    extend DataConverter
+    native_type Type::POINTER
+
+    # @param [Pointer] val
+    # @param ctx not used
+    # @return [Array(String, Pointer)]
+    # Returns a [ String, Pointer ] tuple so the C memory for the string can be freed
+    def self.from_native(val, ctx)
+      [ val.null? ? nil : val.get_string(0), val ]
+    end
+  end
+
+  typedef(StrPtrConverter, :strptr)
+
+  # @param type +type+ is an instance of class accepted by {FFI.find_type}
+  # @return [Numeric]
+  # Get +type+ size, in bytes.
+  def self.type_size(type)
+    find_type(type).size
+  end
+
+  # Load all the platform dependent types
+  begin
+    File.open(File.join(Platform::CONF_DIR, 'types.conf'), "r") do |f|
+      prefix = "rbx.platform.typedef."
+      f.each_line { |line|
+        if line.index(prefix) == 0
+          new_type, orig_type = line.chomp.slice(prefix.length..-1).split(/\s*=\s*/)
+          typedef(orig_type.to_sym, new_type.to_sym)
+        end
+      }
+    end
+    typedef :pointer, :caddr_t
+  rescue Errno::ENOENT
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/union.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/union.rb
new file mode 100644
index 0000000..38414ab
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/union.rb
@@ -0,0 +1,43 @@
+#
+# Copyright (C) 2009 Andrea Fazzi <andrea.fazzi@alcacoop.it>
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.
+#
+
+require 'ffi/struct'
+
+module FFI
+
+  class Union < FFI::Struct
+    def self.builder
+      b = StructLayoutBuilder.new
+      b.union = true
+      b
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/variadic.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/variadic.rb
new file mode 100644
index 0000000..2414055
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/variadic.rb
@@ -0,0 +1,78 @@
+#
+# Copyright (C) 2008, 2009 Wayne Meissner
+# Copyright (C) 2009 Luc Heinrich
+#
+# This file is part of ruby-ffi.
+#
+# 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.
+# * Neither the name of the Ruby FFI project nor the names of its contributors
+#   may be used to endorse or promote products derived from this software
+#   without specific prior written permission.
+#
+# 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 OWNER 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.
+#
+
+module FFI
+  class VariadicInvoker    
+    def init(arg_types, type_map)
+      @fixed = Array.new
+      @type_map = type_map
+      arg_types.each_with_index do |type, i|
+        @fixed << type unless type == Type::VARARGS
+      end
+    end
+
+
+    def call(*args, &block)
+      param_types = Array.new(@fixed)
+      param_values = Array.new
+      @fixed.each_with_index do |t, i|
+        param_values << args[i]
+      end
+      i = @fixed.length
+      while i < args.length
+        param_types << FFI.find_type(args[i], @type_map)
+        param_values << args[i + 1]
+        i += 2
+      end
+      invoke(param_types, param_values, &block)
+    end
+
+    #
+    # Attach the invoker to module +mod+ as +mname+
+    #
+    def attach(mod, mname)
+      invoker = self
+      params = "*args"
+      call = "call"
+      mod.module_eval <<-code
+      @@#{mname} = invoker
+      def self.#{mname}(#{params})
+        @@#{mname}.#{call}(#{params})
+      end
+      def #{mname}(#{params})
+        @@#{mname}.#{call}(#{params})
+      end
+      code
+      invoker
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/version.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/version.rb
new file mode 100644
index 0000000..4390b70
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi/version.rb
@@ -0,0 +1,4 @@
+module FFI
+  VERSION = '1.9.18'
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi_c.bundle b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi_c.bundle
new file mode 100755
index 0000000..70cea7e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/lib/ffi_c.bundle
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/Benchmark.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/Benchmark.c
new file mode 100644
index 0000000..55a7380
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/Benchmark.c
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+#include <sys/types.h>
+#include <stdint.h>
+
+void returnVoid() {
+    
+}
+
+void returnVoidI(int arg) {
+    
+}
+int returnInt() {
+    return 0;
+}
+
+int returnIntI(int arg) {
+    return arg;
+}
+
+typedef int8_t s8;
+typedef uint8_t u8;
+typedef int16_t s16;
+typedef uint16_t u16;
+typedef int32_t s32;
+typedef uint32_t u32;
+typedef int64_t s64;
+typedef uint64_t u64;
+typedef float f32;
+typedef double f64;
+typedef void v;
+typedef char* S;
+typedef void* P;
+
+#define B6(R, T1, T2, T3, T4, T5, T6) R bench_##T1##T2##T3##T4##T5##T6##_##R(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) {}
+#define B5(R, T1, T2, T3, T4, T5) R bench_##T1##T2##T3##T4##T5##_##R(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) {}
+#define B4(R, T1, T2, T3, T4) R bench_##T1##T2##T3##T4##_##R(T1 a1, T2 a2, T3 a3, T4 a4) {}
+#define B3(R, T1, T2, T3) R bench_##T1##T2##T3##_##R(T1 a1, T2 a2, T3 a3) {}
+#define B2(R, T1, T2) R bench_##T1##T2##_##R(T1 a1, T2 a2) {}
+#define B1(R, T1) R bench_##T1##_##R(T1 a1) {}
+#define BrV(T) B1(v, T); B2(v, T, T); B3(v, T, T, T); B4(v, T, T, T, T); B5(v, T, T, T, T, T); B6(v, T, T, T, T, T, T);
+BrV(u32);
+BrV(s32);
+BrV(s64);
+BrV(u64);
+BrV(f32);
+BrV(f64);
+BrV(S);
+BrV(P);
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/BoolTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/BoolTest.c
new file mode 100644
index 0000000..04cb6c6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/BoolTest.c
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner.
+ * Copyright (c) 2009 Aman Gupta.
+ *
+ * All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <stdbool.h>
+
+bool
+bool_return_true()
+{
+    return true;
+}
+
+bool
+bool_return_false()
+{
+    return false;
+}
+
+bool
+bool_return_val(bool value)
+{
+    return value;
+}
+
+bool
+bool_reverse_val(bool value)
+{
+    return value ? false : true;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/BufferTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/BufferTest.c
new file mode 100644
index 0000000..3e95ebc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/BufferTest.c
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+
+#define MEMSET(buf, value, size) do { \
+    int i; for (i = 0; i < size; ++i) buf[i] = value; \
+} while(0)
+#define MEMCPY(dst, src, size) do { \
+    int i; for (i = 0; i < size; ++i) dst[i] = src[i]; \
+} while(0)
+
+#define FILL(JTYPE, CTYPE) \
+void fill##JTYPE##Buffer(CTYPE* buf, CTYPE value, int size) { MEMSET(buf, value, size); }
+
+#define COPY(JTYPE, CTYPE) \
+void copy##JTYPE##Buffer(CTYPE* dst, CTYPE* src, int size) { MEMCPY(dst, src, size); }
+
+#define FUNC(JTYPE, CTYPE) \
+    FILL(JTYPE, CTYPE); \
+    COPY(JTYPE, CTYPE)
+            
+FUNC(Byte, char);
+FUNC(Short, short);
+FUNC(Int, int);
+FUNC(Long, long long);
+FUNC(Float, float);
+FUNC(Double, double);
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/ClosureTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/ClosureTest.c
new file mode 100644
index 0000000..dfeabde
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/ClosureTest.c
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <stdlib.h>
+#include <stdbool.h>
+#ifndef _WIN32
+# include <pthread.h>
+#else
+# include <windows.h>
+# include <process.h>
+#endif
+
+#define R(T, rtype) rtype testClosureVr##T(rtype (*closure)(void)) { \
+    return closure != NULL ? (*closure)() : (rtype) 0; \
+}
+
+#define P(T, ptype) void testClosure##T##rV(void (*closure)(ptype), ptype a1) { \
+    if (closure != NULL) (*closure)(a1); \
+}
+
+void testClosureVrV(void (*closure)(void))
+{
+    (*closure)();
+}
+
+R(Z, bool);
+R(B, char);
+R(S, short);
+R(I, int);
+R(L, long);
+R(J, long long);
+R(LL, long long);
+R(F, float);
+R(D, double);
+R(P, const void*);
+
+
+P(Z, bool);
+P(B, char);
+P(S, short);
+P(I, int);
+P(L, long);
+P(J, long long);
+P(LL, long long);
+P(F, float);
+P(D, double);
+P(P, const void*);
+P(UL, unsigned long);
+
+#if defined(_WIN32) && !defined(_WIN64)
+bool __stdcall testClosureStdcall(long *a1, void __stdcall(*closure)(void *, long), long a2) { \
+    void* sp_pre;
+    void* sp_post;
+
+    asm volatile (" movl %%esp,%0" : "=g" (sp_pre));
+    (*closure)(a1, a2);
+    asm volatile (" movl %%esp,%0" : "=g" (sp_post));
+
+    /* %esp before pushing parameters on the stack and after the call returns
+     * should be equal, if both sides respects the stdcall convention */
+    return sp_pre == sp_post;
+}
+#endif
+
+void testOptionalClosureBrV(void (*closure)(char), char a1)
+{
+    if (closure) {
+        (*closure)(a1);
+    }
+}
+
+
+struct ThreadVrV {
+    void (*closure)(void);
+    int count;
+};
+
+static void *
+threadVrV(void *arg)
+{
+    struct ThreadVrV* t = (struct ThreadVrV *) arg;
+    
+    int i;
+    for (i = 0; i < t->count; i++) {
+        (*t->closure)();
+    }
+    
+    return NULL;
+}
+
+void testThreadedClosureVrV(void (*closure)(void), int n)
+{
+	struct ThreadVrV arg = {closure, n};
+#ifndef _WIN32
+    pthread_t t;
+    pthread_create(&t, NULL, threadVrV, &arg);
+    pthread_join(t, NULL);
+#else
+    HANDLE hThread = (HANDLE) _beginthread((void (*)(void *))threadVrV, 0, &arg);
+    WaitForSingleObject(hThread, INFINITE);	
+#endif
+}
+
+struct s8f32s32 {
+    char s8;
+    float f32;
+    int s32;
+};
+
+// Takes a struct argument
+void testClosureTrV(void (*closure)(struct s8f32s32 s), struct s8f32s32* s)
+{
+    (*closure)(*s);
+}
+
+// Returns a struct value
+struct s8f32s32 testClosureVrT(struct s8f32s32 (*closure)())
+{
+    return (*closure)();
+}
+
+typedef int (*returnTypeClosure_t)(int) ;
+typedef returnTypeClosure_t (*lookupClosure_t)();
+
+int testReturnsClosure(lookupClosure_t lookup, int val)
+{
+    returnTypeClosure_t func = lookup ? (*lookup)() : NULL;
+    return func ? (*func)(val) : 0;
+}
+
+static int multiplyByTwo(int value)
+{
+    return value * 2;
+}
+
+returnTypeClosure_t testReturnsFunctionPointer()
+{
+    return multiplyByTwo;
+}
+
+typedef int (*argumentClosure_t)(int);
+typedef int (*withArgumentClosure_t)(argumentClosure_t, int);
+
+int testArgumentClosure(withArgumentClosure_t closure_with, argumentClosure_t closure_arg, int val)
+{
+    return (*closure_with)(closure_arg, val);
+}
+
+
+//
+// These macros produce functions of the form:
+// testClosureBIrV(void (*closure)(char, int), char a1, int a2) {}
+//
+#define C2_(J1, J2, N1, N2) \
+void testClosure##J1##J2##rV(void (*closure)(N1, N2), N1 a1, N2 a2) \
+{ \
+    if (closure != NULL) (*closure)(a1, a2); \
+}
+
+#define C2(J, N) \
+    C2_(B, J, char, N) \
+    C2_(S, J, short, N) \
+    C2_(I, J, int, N) \
+    C2_(LL, J, long long, N) \
+    C2_(F, J, float, N) \
+    C2_(D, J, double, N) \
+
+
+C2(B, char);
+C2(S, short);
+C2(I, int);
+C2(LL, long long);
+C2(F, float);
+C2(D, double);
+
+#define C3_(J1, J2, J3, N1, N2, N3) \
+void testClosure##J1##J2##J3##rV(void (*closure)(N1, N2, N3), N1 a1, N2 a2, N3 a3) \
+{ \
+    (*closure)(a1, a2, a3); \
+}
+
+
+#define C3(J, N) \
+    C3_(B, J, B, char, N, char) \
+    C3_(S, J, S, short, N, short) \
+    C3_(I, J, I, int, N, int) \
+    C3_(LL, J, LL, long long, N, long long) \
+    C3_(F, J, F, float, N, float) \
+    C3_(D, J, D, double, N, double) \
+
+C3(B, char);
+C3(S, short);
+C3(I, int);
+C3(LL, long long);
+C3(F, float);
+C3(D, double);
+C3_(B, S, I, char, short, int);
+C3_(B, S, LL, char, short, long long);
+C3_(LL, S, B, long long, short, char);
+C3_(LL, B, S, long long, char, short);
+
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/EnumTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/EnumTest.c
new file mode 100644
index 0000000..4bf8d23
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/EnumTest.c
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+#include <stdint.h>
+
+int test_untagged_enum(int val) {
+    return val;
+}
+
+int test_untagged_typedef_enum(int val) {
+    return val;
+}
+
+uint8_t test_untagged_nonint_enum(uint8_t val) {
+    return val;
+}
+
+uint16_t test_tagged_nonint_enum1(uint16_t val) {
+    return val;
+}
+
+uint32_t test_tagged_nonint_enum2(uint32_t val) {
+    return val;
+}
+
+uint64_t test_tagged_nonint_enum3(uint64_t val) {
+    return val;
+}
+
+typedef enum {c1, c2, c3, c4} enum_type1;
+enum_type1 test_tagged_typedef_enum1(enum_type1 val) {
+    return val;
+}
+
+typedef enum {c5 = 42, c6, c7, c8} enum_type2;
+enum_type2 test_tagged_typedef_enum2(enum_type2 val) {
+    return val;
+}
+
+typedef enum {c9 = 42, c10, c11 = 4242, c12} enum_type3;
+enum_type3 test_tagged_typedef_enum3(enum_type3 val) {
+    return val;
+}
+
+typedef enum {c13 = 42, c14 = 4242, c15 = 424242, c16 = 42424242} enum_type4;
+enum_type4 test_tagged_typedef_enum4(enum_type4 val) {
+    return val;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/FunctionTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/FunctionTest.c
new file mode 100644
index 0000000..8cde5f1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/FunctionTest.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#ifdef _WIN32
+#include <windows.h>
+#define sleep(x) Sleep((x)*1000)
+#endif
+
+#ifndef _WIN32
+#include <unistd.h>
+#include <pthread.h>
+#endif
+
+int testAdd(int a, int b)
+{
+    return a + b;
+};
+
+int testFunctionAdd(int a, int b, int (*f)(int, int))
+{
+    return f(a, b);
+};
+
+void testBlocking(int seconds) {
+    sleep(seconds);
+};
+
+struct async_data {
+    void (*fn)(int);
+    int value;
+};
+
+static void* asyncThreadCall(void *data)
+{
+    struct async_data* d = (struct async_data *) data;
+    if (d != NULL && d->fn != NULL) {
+        (*d->fn)(d->value);
+    }
+
+    return NULL;
+}
+
+void testAsyncCallback(void (*fn)(int), int value)
+{
+#ifndef _WIN32
+    pthread_t t;
+    struct async_data d;
+    d.fn = fn;
+    d.value = value;
+    pthread_create(&t, NULL, asyncThreadCall, &d);
+    pthread_join(t, NULL);
+#else
+    (*fn)(value);
+#endif
+} 
+
+#if defined(_WIN32) && !defined(_WIN64)
+struct StructUCDP {
+  unsigned char a1;
+  double a2;
+  void *a3;
+};
+
+void __stdcall testStdcallManyParams(long *a1, char a2, short int a3, int a4, __int64 a5,
+            struct StructUCDP a6, struct StructUCDP *a7, float a8, double a9) {
+}
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/GNUmakefile b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/GNUmakefile
new file mode 100644
index 0000000..a7ba9e6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/GNUmakefile
@@ -0,0 +1,149 @@
+# -*- makefile -*-
+
+ifeq ($(OS),)
+  BUILD_OS := $(shell uname -s | tr '[:upper:]' '[:lower:]')
+  OS := $(BUILD_OS)
+endif
+
+ifeq ($(CPU),)
+  CPU := $(shell uname -m | sed -e 's/i[345678]86/i386/')
+endif
+
+PLATFORM = $(CPU)-$(OS)
+
+ifeq ($(OS), sunos)
+  OS = solaris
+endif
+
+SRC_DIR = libtest
+BUILD_DIR ?= build
+TEST_BUILD_DIR = $(BUILD_DIR)/libtest
+# Set defaults to unix (linux/solaris/bsd)
+PREFIX = lib
+LIBEXT ?= so
+LIBNAME = $(PREFIX)test.$(LIBEXT)
+
+export MACOSX_DEPLOYMENT_TARGET=10.4
+
+CCACHE := $(strip $(realpath $(shell which ccache 2> /dev/null)))
+
+TEST_SRCS = $(wildcard $(SRC_DIR)/*.c)
+TEST_OBJS := $(patsubst $(SRC_DIR)/%.c, $(TEST_BUILD_DIR)/%.o, $(TEST_SRCS))
+
+#
+# Compiler/linker flags from:
+#   http://weblogs.java.net/blog/kellyohair/archive/2006/01/compilation_of_1.html
+JFLAGS = -fno-omit-frame-pointer -fno-strict-aliasing
+OFLAGS = -O2 $(JFLAGS)
+WFLAGS = -W -Wall -Wno-unused -Wno-parentheses
+PICFLAGS = -fPIC
+SOFLAGS = -shared
+LDFLAGS += $(SOFLAGS)
+
+IFLAGS = -I"$(BUILD_DIR)"
+CFLAGS = $(OFLAGS) $(WFLAGS) $(IFLAGS) $(PICFLAGS) -D_REENTRANT
+
+ifneq ($(strip $(findstring $(OS), win32, mingw, cygwin)),)
+  # For cygwin => win32-native builds, strip out cygwin deps
+  ifneq ($(findstring cygwin, $(BUILD_OS)),)
+    CC += -mno-cygwin -mwin32
+    LDFLAGS += -mno-cygwin -Wl,--add-stdcall-alias
+  endif
+  PICFLAGS=
+  LIBEXT=dll
+  CC = gcc
+endif
+
+ifeq ($(OS), darwin)
+  ifneq ($(findstring $(CPU),ppc),)
+    ARCHFLAGS += -arch ppc
+  endif
+  ifneq ($(findstring $(CPU),i386 x86_64),)
+    ARCHFLAGS += -arch i386 -arch x86_64
+  endif
+  CFLAGS += $(ARCHFLAGS) -DTARGET_RT_MAC_CFM=0
+  CFLAGS += -fno-common
+  LDFLAGS = $(ARCHFLAGS) -dynamiclib
+  # link against the universal libraries on ppc machines
+  LDFLAGS += -L$(MACSDK)/usr/lib
+  LIBEXT = dylib
+  FFI_CFLAGS += -isysroot $(MACSDK)
+  PICFLAGS =
+  SOFLAGS =
+endif
+
+ifeq ($(OS), linux)
+  SOFLAGS += -Wl,-soname,$(LIBNAME)
+endif
+
+ifeq ($(OS), solaris)
+  CC = /usr/sfw/bin/gcc -std=c99
+  LD = /usr/ccs/bin/ld
+  SOFLAGS = -shared -static-libgcc 
+endif
+
+ifeq ($(OS), aix)
+  LIBEXT = a
+  SOFLAGS = -shared -static-libgcc
+  PICFLAGS += -pthread
+endif
+
+ifneq ($(findstring bsd, $(OS)),)
+  SOFLAGS = -shared -static-libgcc
+  CFLAGS += -pthread
+  LDFLAGS += -pthread
+endif
+
+ifeq ($(CPU), i386)
+  MODEL = 32
+endif
+
+ifeq ($(CPU), sparcv9)
+  MODEL = 64
+endif
+
+ifeq ($(CPU), amd64)
+  MODEL = 64
+endif
+
+ifeq ($(CPU), x86_64)
+  MODEL = 64
+endif
+
+ifeq ($(CPU), ppc64)
+  MODEL = 64
+endif
+
+ifeq ($(CPU), powerpc64)
+  MODEL = 64
+endif
+
+MODELFLAG =
+ifneq ($(MODEL),)
+  MODELFLAG = -m$(MODEL)
+endif
+
+# On platforms (linux, solaris) that support both 32bit and 64bit, force building for one or the other
+ifneq ($(or $(findstring linux, $(OS)), $(findstring solaris, $(OS))),)
+  # Change the CC/LD instead of CFLAGS/LDFLAGS, incase other things in the flags
+  # makes the libffi build choke
+  CC += $(MODELFLAG)
+  LD += $(MODELFLAG)
+endif
+
+LIBTEST = $(BUILD_DIR)/$(LIBNAME)
+
+all:	$(LIBTEST)
+
+$(TEST_BUILD_DIR)/%.o : $(SRC_DIR)/%.c
+	@mkdir -p $(@D)
+	$(CCACHE) $(CC) $(CFLAGS) -c $< -o $@
+
+$(LIBTEST):  $(TEST_OBJS)
+	$(CC) -o $@ $(LDFLAGS) $(TEST_OBJS) -lm
+
+clean::
+	# nothing to do - ant will delete the build dir
+
+debug::
+	@echo "SRCS=$(TEST_SRCS)"
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/GlobalVariable.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/GlobalVariable.c
new file mode 100644
index 0000000..39c12a2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/GlobalVariable.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <sys/types.h>
+#include <stdint.h>
+
+typedef int8_t s8;
+typedef uint8_t u8;
+typedef int16_t s16;
+typedef uint16_t u16;
+typedef int32_t s32;
+typedef uint32_t u32;
+typedef int64_t s64;
+typedef uint64_t u64;
+typedef signed long sL;
+typedef unsigned long uL;
+typedef float f32;
+typedef double f64;
+#if !defined(__OpenBSD__)
+typedef unsigned long ulong;
+#endif
+typedef void* pointer;
+typedef void* P;
+
+#define GVAR(T) \
+    extern T gvar_##T; \
+    T gvar_##T = (T) -1; \
+    T gvar_##T##_get() { return gvar_##T; }; \
+    void gvar_##T##_set(T v) { gvar_##T = v; }
+
+GVAR(s8);
+GVAR(u8);
+GVAR(s16);
+GVAR(u16);
+GVAR(s32);
+GVAR(u32);
+GVAR(s64);
+GVAR(u64);
+GVAR(long);
+GVAR(ulong);
+GVAR(pointer);
+
+struct gstruct {
+    long data;
+};
+
+struct gstruct gvar_gstruct = { -1 };
+
+struct gstruct*
+gvar_gstruct_get(void)
+{
+    return &gvar_gstruct;
+}
+
+void
+gvar_gstruct_set(const struct gstruct* val)
+{ 
+    gvar_gstruct = *val;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/LastErrorTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/LastErrorTest.c
new file mode 100644
index 0000000..02ce4a8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/LastErrorTest.c
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#if defined(_WIN32) || defined(__WIN32__)
+# include <windows.h>
+#else
+# include <errno.h>
+#endif
+
+int setLastError(int error) {
+#if defined(_WIN32) || defined(__WIN32__)
+    SetLastError(error);
+#else
+    errno = error;
+#endif
+    return -1;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/NumberTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/NumberTest.c
new file mode 100644
index 0000000..3fa25a8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/NumberTest.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+
+#if defined(__sparc) && defined(__sun__)
+    #define fix_mem_access __asm("ta 6")
+#else
+    #define fix_mem_access
+#endif
+
+typedef int8_t s8;
+typedef uint8_t u8;
+typedef int16_t s16;
+typedef uint16_t u16;
+typedef int32_t s32;
+typedef uint32_t u32;
+typedef int64_t s64;
+typedef uint64_t u64;
+typedef signed long sL;
+typedef unsigned long uL;
+typedef float f32;
+typedef double f64;
+typedef long double f128;
+#if !defined(__OpenBSD__)
+typedef unsigned long ulong;
+#endif
+
+#define ADD(T) T add_##T(T arg1, T arg2) { return arg1 + arg2; }
+#define SUB(T) T sub_##T(T arg1, T arg2) { return arg1 - arg2; }
+#define MUL(T) T mul_##T(T arg1, T arg2) { return arg1 * arg2; }
+#define DIV(T) T div_##T(T arg1, T arg2) { return arg1 / arg2; }
+#define RET(T) T ret_##T(T arg1) { return arg1; }
+#define SET(T) static T T##_;void set_##T(T arg1) { T##_ = arg1; }
+#define GET(T) T get_##T() { return T##_; }
+typedef char* ptr;
+#define TEST(T) ADD(T) SUB(T) MUL(T) DIV(T) RET(T) SET(T) GET(T)
+TEST(s8);
+TEST(u8);
+TEST(s16);
+TEST(u16);
+TEST(s32);
+TEST(u32);
+TEST(s64);
+TEST(u64);
+TEST(float);
+TEST(double);
+TEST(long);
+TEST(ulong);
+TEST(f128);
+
+#define ADD2(R, T1, T2) R add_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 + arg2; }
+#define SUB2(R, T1, T2) R sub_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 - arg2; }
+#define MUL2(R, T1, T2) R mul_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 * arg2; }
+#define DIV2(R, T1, T2) R div_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 / arg2; }
+
+#define T2__(R, T1, T2) ADD2(R, T1, T2) SUB2(R, T1, T2) MUL2(R, T1, T2) DIV2(R, T1, T2)
+#define T2_(R, T1) \
+    T2__(R, T1, s8) T2__(R, T1, u8) \
+    T2__(R, T1, s16) T2__(R, T1, u16) \
+    T2__(R, T1, s32) T2__(R, T1, u32) \
+    T2__(R, T1, sL) T2__(R, T1, uL) \
+    T2__(R, T1, s64) T2__(R, T1, u64) \
+
+#define TEST2(R) \
+    T2_(R, s8) T2_(R, u8) T2_(R, s16) T2_(R, u16) T2_(R, s32) T2_(R, u32) \
+    T2_(R, sL) T2_(R, uL) T2_(R, s64) T2_(R, u64)
+
+#ifdef notyet
+TEST2(s32)
+TEST2(u32)
+TEST2(s64)
+TEST2(u64)
+#endif
+
+#define ADD3(R, T1, T2, T3) R add_##T1##T2##T3##_##R(T1 arg1, T2 arg2, T3 arg3) { return arg1 + arg2 + arg3; }
+#define pack_f32(buf, v) do { float f = v; memcpy((buf), &f, sizeof(f)); } while(0)
+#define pack_f64(buf, v) do { double f = v; memcpy((buf), &f, sizeof(f)); } while(0)
+#define pack_int(buf, v) do { *(buf) = v; } while(0)
+#define pack_s8 pack_int
+#define pack_u8 pack_int
+#define pack_s16 pack_int
+#define pack_u16 pack_int
+#define pack_s32 pack_int
+#define pack_u32 pack_int
+#define pack_s64 pack_int
+#define pack_u64 pack_int
+#define pack_sL pack_int
+#define pack_uL pack_int
+
+#define PACK3(R, T1, T2, T3) void pack_##T1##T2##T3##_##R(T1 arg1, T2 arg2, T3 arg3, R* r) { \
+    fix_mem_access; \
+    pack_##T1(&r[0], arg1); \
+    pack_##T2(&r[1], arg2); \
+    pack_##T3(&r[2], arg3); \
+}
+
+#define T3___(R, T1, T2, T3) PACK3(R, T1, T2, T3) /* SUB2(R, T1, T2) MUL2(R, T1, T2) DIV2(R, T1, T2) */
+#define T3__(R, T1, T2) \
+    T3___(R, T1, T2, s8) T3___(R, T1, T2, u8) \
+    T3___(R, T1, T2, s16) T3___(R, T1, T2, u16) \
+    T3___(R, T1, T2, s32) T3___(R, T1, T2, u32) \
+    T3___(R, T1, T2, sL) T3___(R, T1, T2, uL) \
+    T3___(R, T1, T2, s64) T3___(R, T1, T2, u64) \
+    T3___(R, T1, T2, f32) T3___(R, T1, T2, f64) \
+
+#define T3_(R, T1) \
+    T3__(R, T1, s8) T3__(R, T1, u8) \
+    T3__(R, T1, s16) T3__(R, T1, u16) \
+    T3__(R, T1, s32) T3__(R, T1, u32) \
+    T3__(R, T1, sL) T3__(R, T1, uL) \
+    T3__(R, T1, s64) T3__(R, T1, u64) \
+    T3__(R, T1, f32) T3__(R, T1, f64) \
+
+#define TEST3(R) \
+    T3_(R, s8) T3_(R, u8) T3_(R, s16) T3_(R, u16) T3_(R, s32) T3_(R, u32) \
+    T3_(R, sL) T3_(R, uL) T3_(R, s64) T3_(R, u64) T3_(R, f32) T3_(R, f64)
+
+TEST3(s64)
+
+void 
+foo6(intptr_t i1, intptr_t i2, intptr_t i3, intptr_t i4, intptr_t i5, intptr_t i6) { }
+
+void 
+foo5(intptr_t i1, intptr_t i2, intptr_t i3, intptr_t i4, intptr_t i5) { }
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/PointerTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/PointerTest.c
new file mode 100644
index 0000000..7237ab2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/PointerTest.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+typedef void* ptr;
+typedef void* pointer;
+#ifdef _WIN32
+typedef char* caddr_t;
+#endif
+
+#define RET(T) T ptr_ret_##T(void* arg1, int offset) { \
+    T tmp; memcpy(&tmp, (caddr_t) arg1 + offset, sizeof(tmp)); return tmp; \
+}
+#define SET(T) void ptr_set_##T(void* arg1, int offset, T value) { \
+    memcpy((caddr_t) arg1 + offset, &value, sizeof(value)); \
+}
+#define TEST(T) SET(T) RET(T)
+
+TEST(int8_t);
+TEST(int16_t);
+TEST(int32_t);
+TEST(int64_t);
+TEST(float);
+TEST(double);
+TEST(pointer);
+
+void*
+ptr_return_array_element(void **ptrArray, int arrayIndex) 
+{
+    return ptrArray[arrayIndex];
+}
+
+void
+ptr_set_array_element(void **ptrArray, int arrayIndex, void *value)
+{    
+    ptrArray[arrayIndex] = value;
+}
+
+void*
+ptr_malloc(int size) 
+{
+    return calloc(1, size);
+}
+void
+ptr_free(void* ptr)
+{
+    free(ptr);
+}
+
+void*
+ptr_from_address(uintptr_t addr)
+{
+    return (void *) addr;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/ReferenceTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/ReferenceTest.c
new file mode 100644
index 0000000..d1dd88b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/ReferenceTest.c
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <stdint.h>
+
+#define REF(T) void ref_##T(T arg, T* result) { *result = arg; }
+#define ADD(T) void ref_add_##T(T arg1, T arg2, T* result) { *result = arg1 + arg2; }
+#define SUB(T) void ref_sub_##T(T arg1, T arg2, T* result) { *result = arg1 - arg2; }
+#define MUL(T) void ref_mul_##T(T arg1, T arg2, T* result) { *result = arg1 * arg2; }
+#define DIV(T) void ref_div_##T(T arg1, T arg2, T* result) { *result = arg1 / arg2; }
+#define TEST(T) ADD(T) SUB(T) MUL(T) DIV(T) REF(T)
+
+TEST(int8_t);
+TEST(int16_t);
+TEST(int32_t);
+TEST(int64_t);
+TEST(float);
+TEST(double);
+
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/StringTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/StringTest.c
new file mode 100644
index 0000000..292242b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/StringTest.c
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <string.h>
+
+int 
+string_equals(const char* s1, const char* s2)
+{
+    return strcmp(s1, s2) == 0;
+}
+
+void 
+string_set(char* s1, const char* s2)
+{
+    strcpy(s1, s2);
+}
+void
+string_concat(char* dst, const char* src)
+{
+    strcat(dst, src);
+}
+void
+string_dummy(char* dummy)
+{
+}
+const char*
+string_null(void)
+{
+    return NULL;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/StructTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/StructTest.c
new file mode 100644
index 0000000..25683d3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/StructTest.c
@@ -0,0 +1,243 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner.
+ * Copyright (c) 2009 Andrea Fazzi <andrea.fazzi@alcacoop.it>.
+ *
+ * All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdarg.h>
+
+typedef char s8;
+typedef short s16;
+typedef int s32;
+typedef long long s64;
+typedef float f32;
+typedef double f64;
+
+typedef struct bugged_struct {
+  unsigned char visible;
+  unsigned int x;
+  unsigned int y;
+  short rx;
+  short ry;
+  unsigned char order;
+  unsigned char size;
+} bugged_struct_t;
+
+unsigned int
+bugged_struct_size() {
+    return sizeof(bugged_struct_t);
+}
+
+struct test1 {
+    char b;
+    short s;
+    int i;
+    long long j;
+    long l;
+    float f;
+    double d;
+    char string[32];
+};
+
+struct struct_with_array {
+    char c;
+    int a[5];
+};
+
+struct nested {
+    int i;
+};
+
+struct container {
+    char first;
+    struct nested s;
+};
+
+int
+struct_align_nested_struct(struct container* a) { return a->s.i; }
+
+void*
+struct_field_array(struct struct_with_array* s) { return &s->a; }
+
+struct container*
+struct_make_container_struct(int i)
+{
+    static struct container cs;
+    memset(&cs, 0, sizeof(cs));
+    cs.first = 1;
+    cs.s.i = i;
+    return &cs;
+}
+
+#define T(x, type) \
+    type struct_field_##type(struct test1* t) { return t->x; } \
+    struct type##_align { char first; type value; }; \
+    type struct_align_##type(struct type##_align* a) { return a->value; }
+
+T(b, s8);
+T(s, s16);
+T(i, s32);
+T(j, s64);
+T(f, f32);
+T(d, f64);
+T(l, long);
+
+void
+struct_set_string(struct test1* t, char* s)
+{
+    strcpy(t->string, s);
+}
+
+struct test1*
+struct_make_struct(char b, short s, int i, long long ll, float f, double d)
+{
+    static struct test1 t;
+    memset(&t, 0, sizeof(t));
+    t.b = b;
+    t.s = s;
+    t.i = i;
+    t.j = ll;
+    t.f = f;
+    t.d = d;
+    return &t;
+}
+
+typedef int (*add_cb)(int a1, int a2);
+typedef int (*sub_cb)(int a1, int a2);
+struct test2 {
+    add_cb  add_callback;
+    sub_cb  sub_callback;
+};
+
+int
+struct_call_add_cb(struct test2* t, int a1, int a2)
+{
+    return t->add_callback(a1, a2);
+}
+
+int
+struct_call_sub_cb(struct test2* t, int a1, int a2)
+{
+    return t->sub_callback(a1, a2);
+}
+
+
+struct struct_with_array*
+struct_make_struct_with_array(int a_0, int a_1, int a_2, int a_3, int a_4)
+{
+    static struct struct_with_array s;
+
+    memset(&s, 0, sizeof(s));
+
+    s.a[0] = a_0;
+    s.a[1] = a_1;
+    s.a[2] = a_2;
+    s.a[3] = a_3;
+    s.a[4] = a_4;
+
+    return &s;
+
+}
+
+struct s8s32 {
+    char s8;
+    int s32;
+};
+
+struct s8s32
+struct_return_s8s32()
+{
+    struct s8s32 s;
+    s.s8 = 0x7f;
+    s.s32 = 0x12345678;
+
+    return s;
+}
+
+struct s8s32
+struct_s8s32_set(char s8, int s32)
+{
+    struct s8s32 s;
+
+    s.s8 = s8;
+    s.s32 = s32;
+
+    return s;
+}
+
+int
+struct_s8s32_get_s8(struct s8s32 s)
+{
+    return s.s8;
+}
+
+int
+struct_s8s32_get_s32(struct s8s32 s)
+{
+    return s.s32;
+}
+
+struct s8s32
+struct_s8s32_ret_s8s32(struct s8s32 s)
+{
+    return s;
+}
+
+// Pass a struct and an int arg, ensure the int arg is passed correctly
+int
+struct_s8s32_s32_ret_s32(struct s8s32 s, int s32)
+{
+    return s32;
+}
+
+// Pass a struct and a long long arg, ensure the long long arg is passed correctly
+long long
+struct_s8s32_s64_ret_s64(struct s8s32 s, long long s64)
+{
+    return s64;
+}
+
+// Pass a struct and a long long arg, ensure the long long arg is passed correctly
+int
+struct_s32_ptr_s32_s8s32_ret_s32(int s32a, void *ptr, int s32b, struct s8s32 s)
+{
+    if (ptr != NULL) *(struct s8s32 *) ptr = s;
+    return s.s32;
+}
+
+// Pass a char *, copy into buffer length struct
+struct struct_string {
+    char *bytes;
+    int len;
+};
+
+struct struct_string
+struct_varargs_ret_struct_string(int len, ...)
+{
+    struct struct_string ss;
+    va_list vl;
+    char* cp = NULL;
+
+    va_start(vl, len);
+
+    ss.len = len;
+    ss.bytes = va_arg(vl, char *);
+    if (ss.bytes != NULL) {
+        cp = malloc(strlen(ss.bytes) + 1);
+        strcpy(cp, ss.bytes);
+        ss.bytes = cp;
+    }
+
+    va_end(vl);
+
+    return ss;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/UnionTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/UnionTest.c
new file mode 100644
index 0000000..0929a31
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/UnionTest.c
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+
+typedef char s8;
+typedef short s16;
+typedef int s32;
+typedef long long s64;
+typedef float f32;
+typedef double f64;
+
+typedef union union_test {
+    char b;
+    short s;
+    int i;
+    long long j;
+    long l;
+    float f;
+    double d;
+    s8 a[10];
+} union_test_t;
+
+#define T(x, type) \
+  type union_align_##type(union_test_t* u) { return u->x; } \
+  union_test_t* union_make_union_with_##type(type value) { static union_test_t u; u.x = value; return &u; }
+
+T(b, s8);
+T(s, s16);
+T(i, s32);
+T(j, s64);
+T(f, f32);
+T(d, f64);
+T(l, long);
+
+unsigned int union_size() { return sizeof(union_test_t); }
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/VariadicTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/VariadicTest.c
new file mode 100644
index 0000000..2f3d801
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/libtest/VariadicTest.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdarg.h>
+
+typedef int8_t s8;
+typedef uint8_t u8;
+typedef int16_t s16;
+typedef uint16_t u16;
+typedef int32_t s32;
+typedef uint32_t u32;
+typedef int64_t s64;
+typedef uint64_t u64;
+typedef signed long sL;
+typedef unsigned long uL;
+typedef float F;
+typedef double D;
+
+void pack_varargs(s64* buf, const char* fmt, ...)
+{
+    va_list ap;
+    int c;
+    double d;
+    va_start(ap, fmt);
+    while ((c = *fmt++)) {
+        switch (c) {
+            case 'c':
+            case 's':
+            case 'i':
+                *buf++ = va_arg(ap, s32);
+                break;
+            case 'l':
+                *buf++ = va_arg(ap, long);
+                break;
+            case 'j':
+                *buf++ = va_arg(ap, s64);
+                break;
+            case 'f':
+            case 'd':
+                d = va_arg(ap, double);
+                memcpy(buf++, &d, sizeof(d));
+                break;
+            case 'C':
+            case 'S':
+            case 'I':
+                *buf++ = va_arg(ap, u32);
+                break;
+            case 'L':
+                *buf++ = va_arg(ap, unsigned long);
+                break;
+        }
+    }
+    va_end(ap);
+}
+
+int pack_varargs2(s64* buf, int retval, const char* fmt, ...)
+{
+    va_list ap;
+    int c;
+    double d;
+    va_start(ap, fmt);
+    while ((c = *fmt++)) {
+        switch (c) {
+            case 'c':
+            case 's':
+            case 'i':
+                *buf++ = va_arg(ap, s32);
+                break;
+            case 'l':
+                *buf++ = va_arg(ap, long);
+                break;
+            case 'j':
+                *buf++ = va_arg(ap, s64);
+                break;
+            case 'f':
+            case 'd':
+                d = va_arg(ap, double);
+                memcpy(buf++, &d, sizeof(d));
+                break;
+            case 'C':
+            case 'S':
+            case 'I':
+                *buf++ = va_arg(ap, u32);
+                break;
+            case 'L':
+                *buf++ = va_arg(ap, unsigned long);
+                break;
+        }
+    }
+    va_end(ap);
+    return retval + 1;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/LICENSE.SPECS b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/LICENSE.SPECS
new file mode 100644
index 0000000..561dd8c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/LICENSE.SPECS
@@ -0,0 +1,22 @@
+Copyright (c) 2008-2014 Ruby-FFI contributors
+
+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/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/async_callback_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/async_callback_spec.rb
new file mode 100644
index 0000000..87950cc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/async_callback_spec.rb
@@ -0,0 +1,35 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "async callback" do
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    AsyncIntCallback = callback [ :int ], :void
+
+    @blocking = true
+    attach_function :testAsyncCallback, [ AsyncIntCallback, :int ], :void
+  end
+
+  it ":int (0x7fffffff) argument" do
+    v = 0xdeadbeef
+    called = false
+    cb = Proc.new {|i| v = i; called = true }
+    LibTest.testAsyncCallback(cb, 0x7fffffff) 
+    expect(called).to be true
+    expect(v).to eq(0x7fffffff)
+  end
+  
+  it "called a second time" do
+    v = 0xdeadbeef
+    called = false
+    cb = Proc.new {|i| v = i; called = true }
+    LibTest.testAsyncCallback(cb, 0x7fffffff) 
+    expect(called).to be true
+    expect(v).to eq(0x7fffffff)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/bool_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/bool_spec.rb
new file mode 100644
index 0000000..6cd1d6f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/bool_spec.rb
@@ -0,0 +1,32 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "Function with primitive boolean arguments and return values" do
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    attach_function :bool_return_true, [ ], :bool
+    attach_function :bool_return_false, [ ], :bool
+    attach_function :bool_return_val, [ :bool ], :bool
+    attach_function :bool_reverse_val, [ :bool ], :bool
+  end
+
+  it "bools" do
+    expect(LibTest.bool_return_true).to be true
+    expect(LibTest.bool_return_false).to be false
+
+    expect(LibTest.bool_return_val(true)).to be true
+    expect(LibTest.bool_return_val(false)).to be false
+
+    expect(LibTest.bool_reverse_val(true)).to be false
+    expect(LibTest.bool_reverse_val(false)).to be true
+  end
+
+  it "raise error on invalid types" do
+    expect { LibTest.bool_return_val(nil) }.to raise_error(::TypeError)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/buffer_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/buffer_spec.rb
new file mode 100644
index 0000000..5f22a62
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/buffer_spec.rb
@@ -0,0 +1,279 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "Buffer#total" do
+  [1,2,3].each do |i|
+    { :char => 1, :uchar => 1, :short => 2, :ushort => 2, :int => 4, 
+      :uint => 4, :long => FFI::Type::LONG.size, :ulong => FFI::Type::ULONG.size, 
+      :long_long => 8, :ulong_long => 8, :float => 4, :double => 8
+    }.each_pair do |t, s|
+
+      it "Buffer.alloc_in(#{t}, #{i}).total == #{i * s}" do
+        expect(FFI::Buffer.alloc_in(t, i).total).to eq(i * s)
+      end
+
+      it "Buffer.alloc_out(#{t}, #{i}).total == #{i * s}" do
+        expect(FFI::Buffer.alloc_out(t, i).total).to eq(i * s)
+      end
+
+      it "Buffer.alloc_inout(#{t}, #{i}).total == #{i * s}" do
+        expect(FFI::Buffer.alloc_inout(t, i).total).to eq(i * s)
+      end
+    end
+  end
+end
+
+describe "Buffer#put_char" do
+  bufsize = 4
+  (0..127).each do |i|
+    (0..bufsize-1).each do |offset|
+      it "put_char(#{offset}, #{i}).get_char(#{offset}) == #{i}" do
+        expect(FFI::Buffer.alloc_in(bufsize).put_char(offset, i).get_char(offset)).to eq(i)
+      end
+    end
+  end
+end
+
+describe "Buffer#put_uchar" do
+  bufsize = 4
+  (0..255).each do |i|
+    (0..bufsize-1).each do |offset|
+      it "Buffer.put_uchar(#{offset}, #{i}).get_uchar(#{offset}) == #{i}" do
+        expect(FFI::Buffer.alloc_in(bufsize).put_uchar(offset, i).get_uchar(offset)).to eq(i)
+      end
+    end
+  end 
+end
+
+describe "Buffer#put_short" do
+  bufsize = 4
+  [0, 1, 128, 32767].each do |i|
+    (0..bufsize-2).each do |offset|
+      it "put_short(#{offset}, #{i}).get_short(#{offset}) == #{i}" do
+        expect(FFI::Buffer.alloc_in(bufsize).put_short(offset, i).get_short(offset)).to eq(i)
+      end
+    end
+  end
+end
+
+describe "Buffer#put_ushort" do
+  bufsize = 4
+  [ 0, 1, 128, 32767, 65535, 0xfee1, 0xdead, 0xbeef, 0xcafe ].each do |i|
+    (0..bufsize-2).each do |offset|
+      it "put_ushort(#{offset}, #{i}).get_ushort(#{offset}) == #{i}" do
+        expect(FFI::Buffer.alloc_in(bufsize).put_ushort(offset, i).get_ushort(offset)).to eq(i)
+      end
+    end
+  end
+end
+
+describe "Buffer#put_int" do
+  bufsize = 8
+  [0, 1, 128, 32767, 0x7ffffff ].each do |i|
+    (0..bufsize-4).each do |offset|
+      it "put_int(#{offset}, #{i}).get_int(#{offset}) == #{i}" do
+        expect(FFI::Buffer.alloc_in(bufsize).put_int(offset, i).get_int(offset)).to eq(i)
+      end
+    end
+  end
+end
+
+describe "Buffer#put_uint" do
+  bufsize = 8
+  [ 0, 1, 128, 32767, 65535, 0xfee1dead, 0xcafebabe, 0xffffffff ].each do |i|
+    (0..bufsize-4).each do |offset|
+      it "put_uint(#{offset}, #{i}).get_uint(#{offset}) == #{i}" do
+        expect(FFI::Buffer.alloc_in(bufsize).put_uint(offset, i).get_uint(offset)).to eq(i)
+      end
+    end
+  end
+end
+
+describe "Buffer#put_long" do
+  bufsize = 16
+  [0, 1, 128, 32767, 0x7ffffff ].each do |i|
+    (0..bufsize-FFI::Type::LONG.size).each do |offset|
+      it "put_long(#{offset}, #{i}).get_long(#{offset}) == #{i}" do
+        expect(FFI::Buffer.alloc_in(bufsize).put_long(offset, i).get_long(offset)).to eq(i)
+      end
+    end
+  end
+end
+
+describe "Buffer#put_ulong" do
+  bufsize = 16
+  [ 0, 1, 128, 32767, 65535, 0xfee1dead, 0xcafebabe, 0xffffffff ].each do |i|
+    (0..bufsize-FFI::Type::LONG.size).each do |offset|
+      it "put_ulong(#{offset}, #{i}).get_ulong(#{offset}) == #{i}" do
+        expect(FFI::Buffer.alloc_in(bufsize).put_ulong(offset, i).get_ulong(offset)).to eq(i)
+      end
+    end
+  end
+end
+
+describe "Buffer#put_long_long" do
+  bufsize = 16
+  [0, 1, 128, 32767, 0x7ffffffffffffff ].each do |i|
+    (0..bufsize-8).each do |offset|
+      it "put_long_long(#{offset}, #{i}).get_long_long(#{offset}) == #{i}" do
+        expect(FFI::Buffer.alloc_in(bufsize).put_long_long(offset, i).get_long_long(offset)).to eq(i)
+      end
+    end
+  end
+end
+
+describe "Buffer#put_ulong_long" do
+  bufsize = 16
+  [ 0, 1, 128, 32767, 65535, 0xdeadcafebabe, 0x7fffffffffffffff ].each do |i|
+    (0..bufsize-8).each do |offset|
+      it "put_ulong_long(#{offset}, #{i}).get_ulong_long(#{offset}) == #{i}" do
+        expect(FFI::Buffer.alloc_in(bufsize).put_ulong_long(offset, i).get_ulong_long(offset)).to eq(i)
+      end
+    end
+  end
+end
+
+describe "Reading/Writing binary strings" do
+  it "Buffer#put_bytes" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    buf.put_bytes(0, str);
+    s2 = buf.get_bytes(0, 11);
+    expect(s2).to eq(str)
+  end
+
+  it "Buffer#put_bytes with index and length" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    buf.put_bytes(0, str, 5, 6);
+    s2 = buf.get_bytes(0, 6);
+    expect(s2).to eq(str[5..-1])
+  end
+
+  it "Buffer#put_bytes with only index" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    buf.put_bytes(0, str, 5);
+    s2 = buf.get_bytes(0, 6);
+    expect(s2).to eq(str[5..-1])
+  end
+
+  it "Buffer#put_bytes with index > str.length" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    expect { buf.put_bytes(0, str, 12); }.to raise_error
+  end
+
+  it "Buffer#put_bytes with length > str.length" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    expect { buf.put_bytes(0, str, 0, 12); }.to raise_error
+  end
+
+  it "Buffer#put_bytes with negative index" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    expect { buf.put_bytes(0, str, -1, 12); }.to raise_error
+  end
+
+  it "Buffer#write_bytes" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    buf.write_bytes(str)
+    s2 = buf.get_bytes(0, 11)
+    expect(s2).to eq(str)
+  end
+
+  it "Buffer#write_bytes with index and length" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    buf.write_bytes(str, 5, 6)
+    s2 = buf.get_bytes(0, 6)
+    expect(s2).to eq(str[5..-1])
+  end
+
+  it "Buffer#write_bytes with only index" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    buf.write_bytes(str, 5)
+    s2 = buf.get_bytes(0, 6)
+    expect(s2).to eq(str[5..-1])
+  end
+
+  it "Buffer#write_bytes with index > str.length" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    expect { buf.write_bytes(str, 12) }.to raise_error
+  end
+
+  it "Buffer#put_bytes with length > str.length" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    expect { buf.put_bytes(0, str, 0, 12) }.to raise_error
+  end
+
+  it "Buffer#write_bytes with negative index" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    expect { buf.write_bytes(str, -1, 12) }.to raise_error
+  end
+end
+
+describe "Reading/Writing ascii strings" do
+  it "Buffer#put_string with string containing zero byte" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    buf.put_string(0, str);
+    s2 = buf.get_bytes(0, 11);
+    expect(s2).to eq(str)
+  end
+
+  it "Buffer#get_string with string containing zero byte" do
+    str = "hello\0world"
+    buf = FFI::Buffer.new 1024
+    buf.put_bytes(0, str);
+    s2 = buf.get_string(0, 11);
+    expect(s2).to eq("hello")
+  end
+
+  it "Buffer#put_string without length should NUL terminate" do
+    str = "hello"
+    buf = FFI::Buffer.new 1024
+    buf.put_string(0, str);
+    s2 = buf.get_bytes(0, 6);
+    expect(s2).to eq("hello\0")
+  end
+end
+
+describe "Buffer#put_pointer" do
+  it "put_pointer(0, p).get_pointer(0) == p" do
+    p = FFI::MemoryPointer.new :ulong_long
+    p.put_uint(0, 0xdeadbeef)
+    buf = FFI::Buffer.alloc_inout 8
+    p2 = buf.put_pointer(0, p).get_pointer(0)
+    expect(p2).not_to be_nil
+    expect(p2).to eq(p)
+    expect(p2.get_uint(0)).to eq(0xdeadbeef)
+  end
+end
+
+describe "Buffer#size" do
+  it "should return size" do
+    buf = FFI::Buffer.new 14
+    expect(buf.size).to eq(14)
+  end
+end
+
+describe "Buffer#initialize" do
+  it "with block should execute block" do
+    block_executed = false
+    FFI::Buffer.new(:pointer) do |ptr|
+      block_executed = true
+    end
+    expect(block_executed).to be true
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/callback_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/callback_spec.rb
new file mode 100644
index 0000000..bc9b55a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/callback_spec.rb
@@ -0,0 +1,773 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "Callback" do
+#  module LibC
+#    extend FFI::Library
+#    callback :qsort_cmp, [ :pointer, :pointer ], :int
+#    attach_function :qsort, [ :pointer, :int, :int, :qsort_cmp ], :int
+#  end
+#  it "arguments get passed correctly" do
+#    p = MemoryPointer.new(:int, 2)
+#    p.put_array_of_int32(0, [ 1 , 2 ])
+#    args = []
+#    cmp = proc do |p1, p2| args.push(p1.get_int(0)); args.push(p2.get_int(0)); 0; end
+#    # this is a bit dodgey, as it relies on qsort passing the args in order
+#    LibC.qsort(p, 2, 4, cmp)
+#    args.should == [ 1, 2 ]
+#  end
+#
+#  it "Block can be substituted for Callback as last argument" do
+#    p = MemoryPointer.new(:int, 2)
+#    p.put_array_of_int32(0, [ 1 , 2 ])
+#    args = []
+#    # this is a bit dodgey, as it relies on qsort passing the args in order
+#    LibC.qsort(p, 2, 4) do |p1, p2|
+#      args.push(p1.get_int(0))
+#      args.push(p2.get_int(0))
+#      0
+#    end
+#    args.should == [ 1, 2 ]
+#  end
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    class S8F32S32 < FFI::Struct
+      layout :s8, :char, :f32, :float, :s32, :int
+    end
+
+    callback :cbVrS8, [ ], :char
+    callback :cbVrU8, [ ], :uchar
+    callback :cbVrS16, [ ], :short
+    callback :cbVrU16, [ ], :ushort
+    callback :cbVrS32, [ ], :int
+    callback :cbVrU32, [ ], :uint
+    callback :cbVrL, [ ], :long
+    callback :cbVrUL, [ ], :ulong
+    callback :cbVrS64, [ ], :long_long
+    callback :cbVrU64, [ ], :ulong_long
+    callback :cbVrP, [], :pointer
+    callback :cbVrZ, [], :bool
+    callback :cbCrV, [ :char ], :void
+    callback :cbSrV, [ :short ], :void
+    callback :cbIrV, [ :int ], :void
+    callback :cbLrV, [ :long ], :void
+    callback :cbULrV, [ :ulong ], :void
+    callback :cbLrV, [ :long_long ], :void
+    callback :cbVrT, [ ], S8F32S32.by_value
+    callback :cbTrV, [ S8F32S32.by_value ], :void
+    callback :cbYrV, [ S8F32S32.ptr ], :void
+    callback :cbVrY, [ ], S8F32S32.ptr
+
+    attach_function :testCallbackVrS8, :testClosureVrB, [ :cbVrS8 ], :char
+    attach_function :testCallbackVrU8, :testClosureVrB, [ :cbVrU8 ], :uchar
+    attach_function :testCallbackVrS16, :testClosureVrS, [ :cbVrS16 ], :short
+    attach_function :testCallbackVrU16, :testClosureVrS, [ :cbVrU16 ], :ushort
+    attach_function :testCallbackVrS32, :testClosureVrI, [ :cbVrS32 ], :int
+    attach_function :testCallbackVrU32, :testClosureVrI, [ :cbVrU32 ], :uint
+    attach_function :testCallbackVrL, :testClosureVrL, [ :cbVrL ], :long
+    attach_function :testCallbackVrZ, :testClosureVrZ, [ :cbVrZ ], :bool
+    attach_function :testCallbackVrUL, :testClosureVrL, [ :cbVrUL ], :ulong
+    attach_function :testCallbackVrS64, :testClosureVrLL, [ :cbVrS64 ], :long_long
+    attach_function :testCallbackVrU64, :testClosureVrLL, [ :cbVrU64 ], :ulong_long
+    attach_function :testCallbackVrP, :testClosureVrP, [ :cbVrP ], :pointer
+    attach_function :testCallbackVrY, :testClosureVrP, [ :cbVrY ], S8F32S32.ptr
+    attach_function :testCallbackVrT, :testClosureVrT, [ :cbVrT ], S8F32S32.by_value
+    attach_function :testCallbackTrV, :testClosureTrV, [ :cbTrV, S8F32S32.ptr ], :void
+    attach_variable :cbVrS8, :gvar_pointer, :cbVrS8
+    attach_variable :pVrS8, :gvar_pointer, :pointer
+    attach_function :testGVarCallbackVrS8, :testClosureVrB, [ :pointer ], :char
+    attach_function :testOptionalCallbackCrV, :testOptionalClosureBrV, [ :cbCrV, :char ], :void
+
+  end
+
+  it "returning :char (0)" do
+    expect(LibTest.testCallbackVrS8 { 0 }).to eq(0)
+  end
+
+  it "returning :char (127)" do
+    expect(LibTest.testCallbackVrS8 { 127 }).to eq(127)
+  end
+
+  it "returning :char (-128)" do
+    expect(LibTest.testCallbackVrS8 { -128 }).to eq(-128)
+  end
+  # test wrap around
+  it "returning :char (128)" do
+    expect(LibTest.testCallbackVrS8 { 128 }).to eq(-128)
+  end
+
+  it "returning :char (255)" do
+    expect(LibTest.testCallbackVrS8 { 0xff }).to eq(-1)
+  end
+
+  it "returning :uchar (0)" do
+    expect(LibTest.testCallbackVrU8 { 0 }).to eq(0)
+  end
+
+  it "returning :uchar (0xff)" do
+    expect(LibTest.testCallbackVrU8 { 0xff }).to eq(0xff)
+  end
+
+  it "returning :uchar (-1)" do
+    expect(LibTest.testCallbackVrU8 { -1 }).to eq(0xff)
+  end
+
+  it "returning :uchar (128)" do
+    expect(LibTest.testCallbackVrU8 { 128 }).to eq(128)
+  end
+
+  it "returning :uchar (-128)" do
+    expect(LibTest.testCallbackVrU8 { -128 }).to eq(128)
+  end
+
+  it "returning :short (0)" do
+    expect(LibTest.testCallbackVrS16 { 0 }).to eq(0)
+  end
+
+  it "returning :short (0x7fff)" do
+    expect(LibTest.testCallbackVrS16 { 0x7fff }).to eq(0x7fff)
+  end
+  # test wrap around
+  it "returning :short (0x8000)" do
+    expect(LibTest.testCallbackVrS16 { 0x8000 }).to eq(-0x8000)
+  end
+
+  it "returning :short (0xffff)" do
+    expect(LibTest.testCallbackVrS16 { 0xffff }).to eq(-1)
+  end
+
+  it "returning :ushort (0)" do
+    expect(LibTest.testCallbackVrU16 { 0 }).to eq(0)
+  end
+
+  it "returning :ushort (0x7fff)" do
+    expect(LibTest.testCallbackVrU16 { 0x7fff }).to eq(0x7fff)
+  end
+
+  it "returning :ushort (0x8000)" do
+    expect(LibTest.testCallbackVrU16 { 0x8000 }).to eq(0x8000)
+  end
+
+  it "returning :ushort (0xffff)" do
+    expect(LibTest.testCallbackVrU16 { 0xffff }).to eq(0xffff)
+  end
+
+  it "returning :ushort (-1)" do
+    expect(LibTest.testCallbackVrU16 { -1 }).to eq(0xffff)
+  end
+
+  it "returning :int (0)" do
+    expect(LibTest.testCallbackVrS32 { 0 }).to eq(0)
+  end
+
+  it "returning :int (0x7fffffff)" do
+    expect(LibTest.testCallbackVrS32 { 0x7fffffff }).to eq(0x7fffffff)
+  end
+  # test wrap around
+  it "returning :int (-0x80000000)" do
+    expect(LibTest.testCallbackVrS32 { -0x80000000 }).to eq(-0x80000000)
+  end
+
+  it "returning :int (-1)" do
+    expect(LibTest.testCallbackVrS32 { -1 }).to eq(-1)
+  end
+
+  it "returning :uint (0)" do
+    expect(LibTest.testCallbackVrU32 { 0 }).to eq(0)
+  end
+
+  it "returning :uint (0x7fffffff)" do
+    expect(LibTest.testCallbackVrU32 { 0x7fffffff }).to eq(0x7fffffff)
+  end
+  # test wrap around
+  it "returning :uint (0x80000000)" do
+    expect(LibTest.testCallbackVrU32 { 0x80000000 }).to eq(0x80000000)
+  end
+
+  it "returning :uint (0xffffffff)" do
+    expect(LibTest.testCallbackVrU32 { 0xffffffff }).to eq(0xffffffff)
+  end
+
+  it "returning :uint (-1)" do
+    expect(LibTest.testCallbackVrU32 { -1 }).to eq(0xffffffff)
+  end
+
+  it "returning :long (0)" do
+    expect(LibTest.testCallbackVrL { 0 }).to eq(0)
+  end
+
+  it "returning :long (0x7fffffff)" do
+    expect(LibTest.testCallbackVrL { 0x7fffffff }).to eq(0x7fffffff)
+  end
+  # test wrap around
+  it "returning :long (-0x80000000)" do
+    expect(LibTest.testCallbackVrL { -0x80000000 }).to eq(-0x80000000)
+  end
+
+  it "returning :long (-1)" do
+    expect(LibTest.testCallbackVrL { -1 }).to eq(-1)
+  end
+
+  it "returning :ulong (0)" do
+    expect(LibTest.testCallbackVrUL { 0 }).to eq(0)
+  end
+
+  it "returning :ulong (0x7fffffff)" do
+    expect(LibTest.testCallbackVrUL { 0x7fffffff }).to eq(0x7fffffff)
+  end
+  # test wrap around
+  it "returning :ulong (0x80000000)" do
+    expect(LibTest.testCallbackVrUL { 0x80000000 }).to eq(0x80000000)
+  end
+
+  it "returning :ulong (0xffffffff)" do
+    expect(LibTest.testCallbackVrUL { 0xffffffff }).to eq(0xffffffff)
+  end
+
+  it "Callback returning :ulong (-1)" do
+    if FFI::Platform::LONG_SIZE == 32
+      expect(LibTest.testCallbackVrUL { -1 }).to eq(0xffffffff)
+    else
+      expect(LibTest.testCallbackVrUL { -1 }).to eq(0xffffffffffffffff)
+    end
+  end
+
+  it "returning :long_long (0)" do
+    expect(LibTest.testCallbackVrS64 { 0 }).to eq(0)
+  end
+
+  it "returning :long_long (0x7fffffffffffffff)" do
+    expect(LibTest.testCallbackVrS64 { 0x7fffffffffffffff }).to eq(0x7fffffffffffffff)
+  end
+  # test wrap around
+  it "returning :long_long (-0x8000000000000000)" do
+    expect(LibTest.testCallbackVrS64 { -0x8000000000000000 }).to eq(-0x8000000000000000)
+  end
+
+  it "returning :long_long (-1)" do
+    expect(LibTest.testCallbackVrS64 { -1 }).to eq(-1)
+  end
+
+  it "returning bool" do
+    expect(LibTest.testCallbackVrZ { true }).to be true
+  end
+
+  it "returning :pointer (nil)" do
+    expect(LibTest.testCallbackVrP { nil }).to be_null
+  end
+
+  it "returning :pointer (MemoryPointer)" do
+    p = FFI::MemoryPointer.new :long
+    expect(LibTest.testCallbackVrP { p }).to eq(p)
+  end
+
+  it "returning struct by value" do
+    s = LibTest::S8F32S32.new
+    s[:s8] = 0x12
+    s[:s32] = 0x1eefbeef
+    s[:f32] = 1.234567
+    ret = LibTest.testCallbackVrT { s }
+    expect(ret[:s8]).to eq(s[:s8])
+    expect(ret[:f32]).to eq(s[:f32])
+    expect(ret[:s32]).to eq(s[:s32])
+
+  end
+
+  it "struct by value parameter" do
+    s = LibTest::S8F32S32.new
+    s[:s8] = 0x12
+    s[:s32] = 0x1eefbeef
+    s[:f32] = 1.234567
+    s2 = LibTest::S8F32S32.new
+
+    LibTest.testCallbackTrV(s) do |struct|
+      s2[:s8] = struct[:s8]
+      s2[:f32] = struct[:f32]
+      s2[:s32] = struct[:s32]
+    end
+
+    expect(s2[:s8]).to eql 0x12
+    expect(s2[:s32]).to eql 0x1eefbeef
+    expect(s2[:f32]).to be_within(0.0000001).of 1.234567
+  end
+
+  
+  it "global variable" do
+    proc = Proc.new { 0x1e }
+    LibTest.cbVrS8 = proc
+    expect(LibTest.testGVarCallbackVrS8(LibTest.pVrS8)).to eq(0x1e)
+  end
+
+  describe "When the callback is considered optional by the underlying library" do
+    it "should handle receiving 'nil' in place of the closure" do
+      expect(LibTest.testOptionalCallbackCrV(nil, 13)).to be_nil
+    end
+  end
+
+  describe 'when inlined' do
+    it 'could be anonymous' do
+      module LibTest
+        extend FFI::Library
+        ffi_lib TestLibrary::PATH
+        attach_function :testAnonymousCallbackVrS8, :testClosureVrB, [ callback([ ], :char) ], :char
+      end
+      expect(LibTest.testAnonymousCallbackVrS8 { 0 }).to eq(0)
+    end
+  end
+
+  describe "as return value" do
+
+    it "should not blow up when a callback is defined that returns a callback" do
+      expect(module LibTest
+        extend FFI::Library
+        ffi_lib TestLibrary::PATH
+        callback :cb_return_type_1, [ :short ], :short
+        callback :cb_lookup_1, [ :short ], :cb_return_type_1
+        attach_function :testReturnsCallback_1, :testReturnsClosure, [ :cb_lookup_1, :short ], :cb_return_type_1
+      end).to be_an_instance_of FFI::Function
+    end
+
+    it "should return a callback" do
+      module LibTest
+        extend FFI::Library
+        ffi_lib TestLibrary::PATH
+        callback :cb_return_type, [ :int ], :int
+        callback :cb_lookup, [ ], :cb_return_type
+        attach_function :testReturnsCallback, :testReturnsClosure, [ :cb_lookup, :int ], :int
+      end      
+
+      lookup_proc_called = false
+      return_proc_called = false
+
+      return_proc = Proc.new do |a|
+        return_proc_called = true
+        a * 2
+      end
+      lookup_proc = Proc.new do
+        lookup_proc_called = true
+        return_proc
+      end
+
+      val = LibTest.testReturnsCallback(lookup_proc, 0x1234)
+      expect(val).to eq(0x1234 * 2)
+      expect(lookup_proc_called).to be true
+      expect(return_proc_called).to be true
+    end
+
+    it "should return a method callback" do
+      module LibTest
+        extend FFI::Library
+        ffi_lib TestLibrary::PATH
+        callback :cb_return_type, [ :int ], :int
+        callback :cb_lookup, [ ], :cb_return_type
+        attach_function :testReturnsCallback_2, :testReturnsClosure, [ :cb_lookup, :int ], :int
+      end
+      module MethodCallback
+        def self.lookup
+          method(:perform)
+        end
+        def self.perform num
+          num * 2
+        end
+      end
+
+      expect(LibTest.testReturnsCallback_2(MethodCallback.method(:lookup), 0x1234)).to eq(0x2468)
+    end
+
+    it 'should not blow up when a callback takes a callback as argument' do
+      expect(module LibTest
+        extend FFI::Library
+        ffi_lib TestLibrary::PATH
+        callback :cb_argument, [ :int ], :int
+        callback :cb_with_cb_argument, [ :cb_argument, :int ], :int
+        attach_function :testCallbackAsArgument_2, :testArgumentClosure, [ :cb_with_cb_argument, :int ], :int
+      end).to be_an_instance_of FFI::Function
+    end
+    it 'should be able to use the callback argument' do
+      module LibTest
+        extend FFI::Library
+        ffi_lib TestLibrary::PATH
+        callback :cb_argument, [ :int ], :int
+        callback :cb_with_cb_argument, [ :cb_argument, :int ], :int
+        attach_function :testCallbackAsArgument, :testArgumentClosure, [ :cb_with_cb_argument, :cb_argument, :int ], :int
+      end   
+      callback_arg_called = false
+      callback_with_callback_arg_called = false
+      callback_arg = Proc.new do |val|
+        callback_arg_called = true
+        val * 2
+      end
+      callback_with_callback_arg = Proc.new do |cb, val|
+        callback_with_callback_arg_called = true
+        cb.call(val)
+      end
+      val = LibTest.testCallbackAsArgument(callback_with_callback_arg, callback_arg, 0xff1)
+      expect(val).to eq(0xff1 * 2)
+      expect(callback_arg_called).to be true
+      expect(callback_with_callback_arg_called).to be true
+    end
+    it 'function returns callable object' do
+      module LibTest
+        extend FFI::Library
+        ffi_lib TestLibrary::PATH
+        callback :funcptr, [ :int ], :int
+        attach_function :testReturnsFunctionPointer, [  ], :funcptr
+      end
+      f = LibTest.testReturnsFunctionPointer
+      expect(f.call(3)).to eq(6)
+    end
+  end
+
+end
+
+
+describe "Callback with " do
+  #
+  # Test callbacks that take an argument, returning void
+  #
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+
+    class S8F32S32 < FFI::Struct
+      layout :s8, :char, :f32, :float, :s32, :int
+    end
+
+    callback :cbS8rV, [ :char ], :void
+    callback :cbU8rV, [ :uchar ], :void
+    callback :cbS16rV, [ :short ], :void
+    callback :cbU16rV, [ :ushort ], :void
+
+    callback :cbZrV, [ :bool ], :void
+    callback :cbS32rV, [ :int ], :void
+    callback :cbU32rV, [ :uint ], :void
+
+    callback :cbLrV, [ :long ], :void
+    callback :cbULrV, [ :ulong ], :void
+    callback :cbArV, [ :string ], :void
+    callback :cbPrV, [ :pointer], :void
+    callback :cbYrV, [ S8F32S32.ptr ], :void
+
+    callback :cbS64rV, [ :long_long ], :void
+    attach_function :testCallbackCrV, :testClosureBrV, [ :cbS8rV, :char ], :void
+    attach_function :testCallbackU8rV, :testClosureBrV, [ :cbU8rV, :uchar ], :void
+    attach_function :testCallbackSrV, :testClosureSrV, [ :cbS16rV, :short ], :void
+    attach_function :testCallbackU16rV, :testClosureSrV, [ :cbU16rV, :ushort ], :void
+    attach_function :testCallbackZrV, :testClosureZrV, [ :cbZrV, :bool ], :void
+    attach_function :testCallbackIrV, :testClosureIrV, [ :cbS32rV, :int ], :void
+    attach_function :testCallbackU32rV, :testClosureIrV, [ :cbU32rV, :uint ], :void
+
+    attach_function :testCallbackLrV, :testClosureLrV, [ :cbLrV, :long ], :void
+    attach_function :testCallbackULrV, :testClosureULrV, [ :cbULrV, :ulong ], :void
+
+    attach_function :testCallbackLLrV, :testClosureLLrV, [ :cbS64rV, :long_long ], :void
+    attach_function :testCallbackArV, :testClosurePrV, [ :cbArV, :string ], :void
+    attach_function :testCallbackPrV, :testClosurePrV, [ :cbPrV, :pointer], :void
+    attach_function :testCallbackYrV, :testClosurePrV, [ :cbYrV, S8F32S32.in ], :void
+  end
+
+  it "function with Callback plus another arg should raise error if no arg given" do
+    expect { LibTest.testCallbackCrV { |*a| }}.to raise_error
+  end
+
+  it ":char (0) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackCrV(0) { |i| v = i }
+    expect(v).to eq(0)
+  end
+
+  it ":char (127) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackCrV(127) { |i| v = i }
+    expect(v).to eq(127)
+  end
+
+  it ":char (-128) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackCrV(-128) { |i| v = i }
+    expect(v).to eq(-128)
+  end
+
+  it ":char (-1) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackCrV(-1) { |i| v = i }
+    expect(v).to eq(-1)
+  end
+
+  it ":uchar (0) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU8rV(0) { |i| v = i }
+    expect(v).to eq(0)
+  end
+
+  it ":uchar (127) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU8rV(127) { |i| v = i }
+    expect(v).to eq(127)
+  end
+
+  it ":uchar (128) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU8rV(128) { |i| v = i }
+    expect(v).to eq(128)
+  end
+
+  it ":uchar (255) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU8rV(255) { |i| v = i }
+    expect(v).to eq(255)
+  end
+
+  it ":short (0) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackSrV(0) { |i| v = i }
+    expect(v).to eq(0)
+  end
+
+  it ":short (0x7fff) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackSrV(0x7fff) { |i| v = i }
+    expect(v).to eq(0x7fff)
+  end
+
+  it ":short (-0x8000) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackSrV(-0x8000) { |i| v = i }
+    expect(v).to eq(-0x8000)
+  end
+
+  it ":short (-1) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackSrV(-1) { |i| v = i }
+    expect(v).to eq(-1)
+  end
+
+  it ":ushort (0) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU16rV(0) { |i| v = i }
+    expect(v).to eq(0)
+  end
+
+  it ":ushort (0x7fff) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU16rV(0x7fff) { |i| v = i }
+    expect(v).to eq(0x7fff)
+  end
+
+  it ":ushort (0x8000) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU16rV(0x8000) { |i| v = i }
+    expect(v).to eq(0x8000)
+  end
+
+  it ":ushort (0xffff) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU16rV(0xffff) { |i| v = i }
+    expect(v).to eq(0xffff)
+  end
+
+  it ":bool (true) argument" do
+    v = false
+    LibTest.testCallbackZrV(true) { |i| v = i }
+    expect(v).to be true
+  end
+
+  it ":int (0) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackIrV(0) { |i| v = i }
+    expect(v).to eq(0)
+  end
+
+  it ":int (0x7fffffff) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackIrV(0x7fffffff) { |i| v = i }
+    expect(v).to eq(0x7fffffff)
+  end
+
+  it ":int (-0x80000000) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackIrV(-0x80000000) { |i| v = i }
+    expect(v).to eq(-0x80000000)
+  end
+
+  it ":int (-1) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackIrV(-1) { |i| v = i }
+    expect(v).to eq(-1)
+  end
+
+  it ":uint (0) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU32rV(0) { |i| v = i }
+    expect(v).to eq(0)
+  end
+
+  it ":uint (0x7fffffff) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU32rV(0x7fffffff) { |i| v = i }
+    expect(v).to eq(0x7fffffff)
+  end
+
+  it ":uint (0x80000000) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU32rV(0x80000000) { |i| v = i }
+    expect(v).to eq(0x80000000)
+  end
+
+  it ":uint (0xffffffff) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackU32rV(0xffffffff) { |i| v = i }
+    expect(v).to eq(0xffffffff)
+  end
+
+  it ":long (0) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackLrV(0) { |i| v = i }
+    expect(v).to eq(0)
+  end
+
+  it ":long (0x7fffffff) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackLrV(0x7fffffff) { |i| v = i }
+    expect(v).to eq(0x7fffffff)
+  end
+
+  it ":long (-0x80000000) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackLrV(-0x80000000) { |i| v = i }
+    expect(v).to eq(-0x80000000)
+  end
+
+  it ":long (-1) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackLrV(-1) { |i| v = i }
+    expect(v).to eq(-1)
+  end
+
+  it ":ulong (0) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackULrV(0) { |i| v = i }
+    expect(v).to eq(0)
+  end
+
+  it ":ulong (0x7fffffff) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackULrV(0x7fffffff) { |i| v = i }
+    expect(v).to eq(0x7fffffff)
+  end
+
+  it ":ulong (0x80000000) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackULrV(0x80000000) { |i| v = i }
+    expect(v).to eq(0x80000000)
+  end
+
+  it ":ulong (0xffffffff) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackULrV(0xffffffff) { |i| v = i }
+    expect(v).to eq(0xffffffff)
+  end
+
+  it ":long_long (0) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackLLrV(0) { |i| v = i }
+    expect(v).to eq(0)
+  end
+
+  it ":long_long (0x7fffffffffffffff) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackLLrV(0x7fffffffffffffff) { |i| v = i }
+    expect(v).to eq(0x7fffffffffffffff)
+  end
+
+  it ":long_long (-0x8000000000000000) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackLLrV(-0x8000000000000000) { |i| v = i }
+    expect(v).to eq(-0x8000000000000000)
+  end
+
+  it ":long_long (-1) argument" do
+    v = 0xdeadbeef
+    LibTest.testCallbackLLrV(-1) { |i| v = i }
+    expect(v).to eq(-1)
+  end
+
+  it ":string argument" do
+    v = nil
+    LibTest.testCallbackArV("Hello, World") { |i| v = i }
+    expect(v).to eq("Hello, World")
+  end
+
+  it ":string (nil) argument" do
+    v = "Hello, World"
+    LibTest.testCallbackArV(nil) { |i| v = i }
+    expect(v).to be_nil
+  end
+
+  it ":pointer argument" do
+    v = nil
+    magic = FFI::Pointer.new(0xdeadbeef)
+    LibTest.testCallbackPrV(magic) { |i| v = i }
+    expect(v).to eq(magic)
+  end
+
+  it ":pointer (nil) argument" do
+    v = "Hello, World"
+    LibTest.testCallbackPrV(nil) { |i| v = i }
+    expect(v).to eq(FFI::Pointer::NULL)
+  end
+
+  it "struct by reference argument" do
+    v = nil
+    magic = LibTest::S8F32S32.new
+    LibTest.testCallbackYrV(magic) { |i| v = i }
+    expect(v.class).to eq(magic.class)
+    expect(v.pointer).to eq(magic.pointer)
+  end
+
+  it "struct by reference argument with nil value" do
+    v = LibTest::S8F32S32.new
+    LibTest.testCallbackYrV(nil) { |i| v = i }
+    expect(v.is_a?(FFI::Struct)).to be true
+    expect(v.pointer).to eq(FFI::Pointer::NULL)
+  end
+
+  it "varargs parameters are rejected" do
+    expect {
+      Module.new do
+        extend FFI::Library
+        ffi_lib TestLibrary::PATH
+        callback :cbVrL, [ :varargs ], :long
+      end
+    }.to raise_error(ArgumentError)
+  end
+
+  #
+  # Test stdcall convention with function and callback.
+  # This is Windows 32-bit only.
+  #
+  if FFI::Platform::OS =~ /windows|cygwin/ && FFI::Platform::ARCH == 'i386'
+    module LibTestStdcall
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      ffi_convention :stdcall
+
+      callback :cbStdcall, [ :pointer, :long ], :void
+      attach_function :testCallbackStdcall, 'testClosureStdcall', [ :pointer, :cbStdcall, :long ], :bool
+    end
+
+    it "stdcall convention" do
+      v = 0xdeadbeef
+      po = FFI::MemoryPointer.new :long
+      pr = proc{|a,i| v = a,i; i }
+      res = LibTestStdcall.testCallbackStdcall(po, pr, 0x7fffffff)
+      expect(v).to eq([po, 0x7fffffff])
+      expect(res).to be true
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/custom_param_type.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/custom_param_type.rb
new file mode 100644
index 0000000..7d9216b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/custom_param_type.rb
@@ -0,0 +1,37 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "functions with custom parameter types" do
+  before :each do
+
+    Custom_enum = Class.new do
+      extend FFI::DataConverter
+      ToNativeMap= { :a => 1, :b => 2 }
+      FromNativeMap = { 1 => :a, 2 => :b }
+
+      def self.native_type
+        @native_type_called = true
+        FFI::Type::INT32
+      end
+
+      def self.to_native(val, ctx)
+        @to_native_called = true
+        ToNativeMap[val]
+      end
+
+      def self.from_native(val, ctx)
+        @from_native_called = true
+        FromNativeMap[val]
+      end
+      def self.native_type_called?; @native_type_called; end
+      def self.from_native_called?; @from_native_called; end
+      def self.to_native_called?; @to_native_called; end
+    end
+
+    # FIXME add tests
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/custom_type_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/custom_type_spec.rb
new file mode 100644
index 0000000..d9ce2c1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/custom_type_spec.rb
@@ -0,0 +1,74 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "functions with custom types" do
+  class Custom_enum
+    extend FFI::DataConverter
+    ToNativeMap= { :a => 1, :b => 2, :c => 3 }
+    FromNativeMap = { 1 => :a, 2 => :b, 3 => :c }
+
+    def self.native_type
+      @native_type_called = true
+      FFI::Type::INT32
+    end
+
+    def self.to_native(val, ctx)
+      @to_native_called = true
+      ToNativeMap[val]
+    end
+
+    def self.from_native(val, ctx)
+      @from_native_called = true
+      FromNativeMap[val]
+    end
+    def self.native_type_called?; @native_type_called; end
+    def self.from_native_called?; @from_native_called; end
+    def self.to_native_called?; @to_native_called; end
+  end
+
+  it "can attach with custom return type" do
+    expect do
+      Module.new do
+        extend FFI::Library
+        ffi_lib TestLibrary::PATH
+        attach_function :ret_s32, [ :int ], Custom_enum
+      end
+    end.not_to raise_error
+  end
+
+  it "should return object of correct type" do
+
+    m = Module.new do
+
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      attach_function :ret_s32, [ :int ], Custom_enum
+    end
+
+    expect(m.ret_s32(1).is_a?(Symbol)).to be true
+  end
+
+  it "from_native should be called for result" do
+    m = Module.new do
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      attach_function :ret_s32, [ :int ], Custom_enum
+    end
+    m.ret_s32(1)
+    expect(Custom_enum.from_native_called?).to be true
+  end
+
+  it "to_native should be called for parameter" do
+    m = Module.new do
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      attach_function :ret_s32, [ Custom_enum ], :int
+    end
+    m.ret_s32(:a)
+    expect(Custom_enum.to_native_called?).to be true
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/dup_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/dup_spec.rb
new file mode 100644
index 0000000..ae6e523
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/dup_spec.rb
@@ -0,0 +1,52 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "Pointer#dup" do 
+  it "clone should be independent" do
+    p1 = FFI::MemoryPointer.new(:char, 1024)
+    p1.put_string(0, "test123");
+    p2 = p1.dup
+    p1.put_string(0, "deadbeef")
+    
+    expect(p2.get_string(0)).to eq("test123")
+  end
+  
+  it "sliced pointer can be cloned" do
+    p1 = FFI::MemoryPointer.new(:char, 1024)
+    p1.put_string(0, "test123");
+    p2 = p1[1].dup
+    
+    # first char will be excised
+    expect(p2.get_string(0)).to eq("est123")
+    expect(p1.get_string(0)).to eq("test123")
+  end
+  
+  it "sliced pointer when cloned is independent" do
+    p1 = FFI::MemoryPointer.new(:char, 1024)
+    p1.put_string(0, "test123");
+    p2 = p1[1].dup
+    
+    p1.put_string(0, "deadbeef")
+    # first char will be excised
+    expect(p2.get_string(0)).to eq("est123")
+  end
+end
+
+
+describe "Struct#dup" do
+  it "clone should be independent" do
+    s = Class.new(FFI::Struct) do
+      layout :i, :int
+    end
+    s1 = s.new
+    s1[:i] = 0x12345
+    s2 = s1.dup
+    s1[:i] = 0x98765
+    expect(s2[:i]).to eq(0x12345)
+    expect(s1[:i]).to eq(0x98765)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/enum_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/enum_spec.rb
new file mode 100644
index 0000000..55ff13a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/enum_spec.rb
@@ -0,0 +1,423 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+module TestEnum0
+  extend FFI::Library
+end
+
+module TestEnum1
+  extend FFI::Library
+  ffi_lib TestLibrary::PATH
+
+  enum [:c1, :c2, :c3, :c4]
+  enum [:c5, 42, :c6, :c7, :c8]
+  enum [:c9, 42, :c10, :c11, 4242, :c12]
+  enum [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242]
+  
+  attach_function :test_untagged_enum, [:int], :int
+end
+
+module TestEnum3
+  extend FFI::Library
+  ffi_lib TestLibrary::PATH
+
+  enum :enum_type1, [:c1, :c2, :c3, :c4]
+  enum :enum_type2, [:c5, 42, :c6, :c7, :c8]
+  enum :enum_type3, [:c9, 42, :c10, :c11, 4242, :c12]
+  enum :enum_type4, [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242]
+
+  attach_function :test_tagged_typedef_enum1, [:enum_type1], :enum_type1
+  attach_function :test_tagged_typedef_enum2, [:enum_type2], :enum_type2
+  attach_function :test_tagged_typedef_enum3, [:enum_type3], :enum_type3
+  attach_function :test_tagged_typedef_enum4, [:enum_type4], :enum_type4
+end
+
+module TestEnum4
+  extend FFI::Library
+  ffi_lib TestLibrary::PATH
+
+  enum [:c1, :c2, :c3, :c4]
+  enum :enum_type1, [:c5, 0x42, :c6, :c7, :c8]
+  enum :enum_type2, [:c9, 0x42, :c10, :c11, 0x4242, :c12]
+  enum :enum_type3, [:c13, 0x42, :c14, 0x4242, :c15, 0x42424242, :c16, 0x4242424242424242]
+  enum FFI::Type::UINT16, :enum_type4, [:c17, 0x42, :c18, :c19, :c20]
+  enum FFI::Type::UINT32, :enum_type5, [:c21, 0x42, :c22, :c23, 0x4242, :c24]
+  enum FFI::Type::UINT64, :enum_type6, [:c25, 0x42, :c26, 0x4242, :c27, 0x42424242, :c28, 0x4242424242424242]
+  enum FFI::Type::UINT64, [:c29, 0x4242424242424242, :c30, :c31, :c32]
+
+  attach_function :test_untagged_nonint_enum, [:uint8],  :uint8
+  attach_function :test_tagged_nonint_enum1,  [:uint16], :uint16
+  attach_function :test_tagged_nonint_enum2,  [:uint32], :uint32
+  attach_function :test_tagged_nonint_enum3,  [:uint64], :uint64
+  attach_function :test_tagged_nonint_enum4, :test_tagged_nonint_enum1,  [:enum_type4], :enum_type4
+  attach_function :test_tagged_nonint_enum5, :test_tagged_nonint_enum2,  [:enum_type5], :enum_type5
+  attach_function :test_tagged_nonint_enum6, :test_tagged_nonint_enum3,  [:enum_type6], :enum_type6
+end
+
+describe "A library with no enum defined" do
+  it "returns nil when asked for an enum" do
+    expect(TestEnum0.enum_type(:foo)).to be_nil
+  end
+end
+
+describe "An untagged enum" do
+  it "constants can be used as function parameters and return value" do
+    expect(TestEnum1.test_untagged_enum(:c1)).to eq(0)
+    expect(TestEnum1.test_untagged_enum(:c2)).to eq(1)
+    expect(TestEnum1.test_untagged_enum(:c3)).to eq(2)
+    expect(TestEnum1.test_untagged_enum(:c4)).to eq(3)
+    expect(TestEnum1.test_untagged_enum(:c5)).to eq(42)
+    expect(TestEnum1.test_untagged_enum(:c6)).to eq(43)
+    expect(TestEnum1.test_untagged_enum(:c7)).to eq(44)
+    expect(TestEnum1.test_untagged_enum(:c8)).to eq(45)
+    expect(TestEnum1.test_untagged_enum(:c9)).to eq(42)
+    expect(TestEnum1.test_untagged_enum(:c10)).to eq(43)
+    expect(TestEnum1.test_untagged_enum(:c11)).to eq(4242)
+    expect(TestEnum1.test_untagged_enum(:c12)).to eq(4243)
+    expect(TestEnum1.test_untagged_enum(:c13)).to eq(42)
+    expect(TestEnum1.test_untagged_enum(:c14)).to eq(4242)
+    expect(TestEnum1.test_untagged_enum(:c15)).to eq(424242)
+    expect(TestEnum1.test_untagged_enum(:c16)).to eq(42424242)
+    expect(TestEnum4.test_untagged_nonint_enum(:c1)).to eq(0)
+    expect(TestEnum4.test_untagged_nonint_enum(:c2)).to eq(1)
+    expect(TestEnum4.test_untagged_nonint_enum(:c3)).to eq(2)
+    expect(TestEnum4.test_untagged_nonint_enum(:c4)).to eq(3)
+    expect(TestEnum4.test_tagged_nonint_enum3(:c29)).to eq(0x4242424242424242)
+    expect(TestEnum4.test_tagged_nonint_enum3(:c30)).to eq(0x4242424242424243)
+    expect(TestEnum4.test_tagged_nonint_enum3(:c31)).to eq(0x4242424242424244)
+    expect(TestEnum4.test_tagged_nonint_enum3(:c32)).to eq(0x4242424242424245)
+  end
+end
+
+describe "A tagged typedef enum" do
+  it "is accessible through its tag" do
+    expect(TestEnum3.enum_type(:enum_type1)).not_to be_nil
+    expect(TestEnum3.enum_type(:enum_type2)).not_to be_nil
+    expect(TestEnum3.enum_type(:enum_type3)).not_to be_nil
+    expect(TestEnum3.enum_type(:enum_type4)).not_to be_nil
+    expect(TestEnum4.enum_type(:enum_type1)).not_to be_nil
+    expect(TestEnum4.enum_type(:enum_type2)).not_to be_nil
+    expect(TestEnum4.enum_type(:enum_type3)).not_to be_nil
+    expect(TestEnum4.enum_type(:enum_type4)).not_to be_nil
+    expect(TestEnum4.enum_type(:enum_type5)).not_to be_nil
+    expect(TestEnum4.enum_type(:enum_type6)).not_to be_nil
+  end
+
+  it "contains enum constants" do
+    expect(TestEnum3.enum_type(:enum_type1).symbols.length).to eq(4)
+    expect(TestEnum3.enum_type(:enum_type2).symbols.length).to eq(4)
+    expect(TestEnum3.enum_type(:enum_type3).symbols.length).to eq(4)
+    expect(TestEnum3.enum_type(:enum_type4).symbols.length).to eq(4)
+    expect(TestEnum4.enum_type(:enum_type1).symbols.length).to eq(4)
+    expect(TestEnum4.enum_type(:enum_type2).symbols.length).to eq(4)
+    expect(TestEnum4.enum_type(:enum_type3).symbols.length).to eq(4)
+    expect(TestEnum4.enum_type(:enum_type4).symbols.length).to eq(4)
+    expect(TestEnum4.enum_type(:enum_type5).symbols.length).to eq(4)
+    expect(TestEnum4.enum_type(:enum_type6).symbols.length).to eq(4)
+  end
+
+  it "constants can be used as function parameters and return value" do
+    expect(TestEnum3.test_tagged_typedef_enum1(:c1)).to be :c1
+    expect(TestEnum3.test_tagged_typedef_enum1(:c2)).to be :c2
+    expect(TestEnum3.test_tagged_typedef_enum1(:c3)).to be :c3
+    expect(TestEnum3.test_tagged_typedef_enum1(:c4)).to be :c4
+    expect(TestEnum3.test_tagged_typedef_enum2(:c5)).to be :c5
+    expect(TestEnum3.test_tagged_typedef_enum2(:c6)).to be :c6
+    expect(TestEnum3.test_tagged_typedef_enum2(:c7)).to be :c7
+    expect(TestEnum3.test_tagged_typedef_enum2(:c8)).to be :c8
+    expect(TestEnum3.test_tagged_typedef_enum3(:c9)).to be :c9
+    expect(TestEnum3.test_tagged_typedef_enum3(:c10)).to be :c10
+    expect(TestEnum3.test_tagged_typedef_enum3(:c11)).to be :c11
+    expect(TestEnum3.test_tagged_typedef_enum3(:c12)).to be :c12
+    expect(TestEnum3.test_tagged_typedef_enum4(:c13)).to be :c13
+    expect(TestEnum3.test_tagged_typedef_enum4(:c14)).to be :c14
+    expect(TestEnum3.test_tagged_typedef_enum4(:c15)).to be :c15
+    expect(TestEnum3.test_tagged_typedef_enum4(:c16)).to be :c16
+    expect(TestEnum4.test_tagged_nonint_enum1(:c5)).to eq(0x42)
+    expect(TestEnum4.test_tagged_nonint_enum1(:c6)).to eq(0x43)
+    expect(TestEnum4.test_tagged_nonint_enum1(:c7)).to eq(0x44)
+    expect(TestEnum4.test_tagged_nonint_enum1(:c8)).to eq(0x45)
+    expect(TestEnum4.test_tagged_nonint_enum2(:c9)).to eq(0x42)
+    expect(TestEnum4.test_tagged_nonint_enum2(:c10)).to eq(0x43)
+    expect(TestEnum4.test_tagged_nonint_enum2(:c11)).to eq(0x4242)
+    expect(TestEnum4.test_tagged_nonint_enum2(:c12)).to eq(0x4243)
+    expect(TestEnum4.test_tagged_nonint_enum3(:c13)).to eq(0x42)
+    expect(TestEnum4.test_tagged_nonint_enum3(:c14)).to eq(0x4242)
+    expect(TestEnum4.test_tagged_nonint_enum3(:c15)).to eq(0x42424242)
+    expect(TestEnum4.test_tagged_nonint_enum3(:c16)).to eq(0x4242424242424242)
+    expect(TestEnum4.test_tagged_nonint_enum4(:c17)).to eq(:c17)
+    expect(TestEnum4.test_tagged_nonint_enum4(:c18)).to eq(:c18)
+    expect(TestEnum4.test_tagged_nonint_enum4(:c19)).to eq(:c19)
+    expect(TestEnum4.test_tagged_nonint_enum4(:c20)).to eq(:c20)
+    expect(TestEnum4.test_tagged_nonint_enum5(:c21)).to eq(:c21)
+    expect(TestEnum4.test_tagged_nonint_enum5(:c22)).to eq(:c22)
+    expect(TestEnum4.test_tagged_nonint_enum5(:c23)).to eq(:c23)
+    expect(TestEnum4.test_tagged_nonint_enum5(:c24)).to eq(:c24)
+    expect(TestEnum4.test_tagged_nonint_enum6(:c25)).to eq(:c25)
+    expect(TestEnum4.test_tagged_nonint_enum6(:c26)).to eq(:c26)
+    expect(TestEnum4.test_tagged_nonint_enum6(:c27)).to eq(:c27)
+    expect(TestEnum4.test_tagged_nonint_enum6(:c28)).to eq(:c28)
+  end
+
+  it "integers can be used instead of constants" do
+    expect(TestEnum3.test_tagged_typedef_enum1(0)).to be :c1
+    expect(TestEnum3.test_tagged_typedef_enum1(1)).to be :c2
+    expect(TestEnum3.test_tagged_typedef_enum1(2)).to be :c3
+    expect(TestEnum3.test_tagged_typedef_enum1(3)).to be :c4
+    expect(TestEnum3.test_tagged_typedef_enum2(42)).to be :c5
+    expect(TestEnum3.test_tagged_typedef_enum2(43)).to be :c6
+    expect(TestEnum3.test_tagged_typedef_enum2(44)).to be :c7
+    expect(TestEnum3.test_tagged_typedef_enum2(45)).to be :c8
+    expect(TestEnum3.test_tagged_typedef_enum3(42)).to be :c9
+    expect(TestEnum3.test_tagged_typedef_enum3(43)).to be :c10
+    expect(TestEnum3.test_tagged_typedef_enum3(4242)).to be :c11
+    expect(TestEnum3.test_tagged_typedef_enum3(4243)).to be :c12
+    expect(TestEnum3.test_tagged_typedef_enum4(42)).to be :c13
+    expect(TestEnum3.test_tagged_typedef_enum4(4242)).to be :c14
+    expect(TestEnum3.test_tagged_typedef_enum4(424242)).to be :c15
+    expect(TestEnum3.test_tagged_typedef_enum4(42424242)).to be :c16
+    expect(TestEnum4.test_tagged_nonint_enum4(0x42)).to eq(:c17)
+    expect(TestEnum4.test_tagged_nonint_enum4(0x43)).to eq(:c18)
+    expect(TestEnum4.test_tagged_nonint_enum4(0x44)).to eq(:c19)
+    expect(TestEnum4.test_tagged_nonint_enum4(0x45)).to eq(:c20)
+    expect(TestEnum4.test_tagged_nonint_enum5(0x42)).to eq(:c21)
+    expect(TestEnum4.test_tagged_nonint_enum5(0x43)).to eq(:c22)
+    expect(TestEnum4.test_tagged_nonint_enum5(0x4242)).to eq(:c23)
+    expect(TestEnum4.test_tagged_nonint_enum5(0x4243)).to eq(:c24)
+    expect(TestEnum4.test_tagged_nonint_enum6(0x42)).to eq(:c25)
+    expect(TestEnum4.test_tagged_nonint_enum6(0x4242)).to eq(:c26)
+    expect(TestEnum4.test_tagged_nonint_enum6(0x42424242)).to eq(:c27)
+    expect(TestEnum4.test_tagged_nonint_enum6(0x4242424242424242)).to eq(:c28)
+  end
+end
+
+describe "All enums" do
+  it "have autonumbered constants when defined with names only" do
+    expect(TestEnum1.enum_value(:c1)).to eq(0)
+    expect(TestEnum1.enum_value(:c2)).to eq(1)
+    expect(TestEnum1.enum_value(:c3)).to eq(2)
+    expect(TestEnum1.enum_value(:c4)).to eq(3)
+
+    expect(TestEnum3.enum_value(:c1)).to eq(0)
+    expect(TestEnum3.enum_value(:c2)).to eq(1)
+    expect(TestEnum3.enum_value(:c3)).to eq(2)
+    expect(TestEnum3.enum_value(:c4)).to eq(3)
+
+    expect(TestEnum4.enum_value(:c1)).to eq(0)
+    expect(TestEnum4.enum_value(:c2)).to eq(1)
+    expect(TestEnum4.enum_value(:c3)).to eq(2)
+    expect(TestEnum4.enum_value(:c4)).to eq(3)
+  end
+
+  it "can have an explicit first constant and autonumbered subsequent constants" do
+    expect(TestEnum1.enum_value(:c5)).to eq(42)
+    expect(TestEnum1.enum_value(:c6)).to eq(43)
+    expect(TestEnum1.enum_value(:c7)).to eq(44)
+    expect(TestEnum1.enum_value(:c8)).to eq(45)
+
+    expect(TestEnum3.enum_value(:c5)).to eq(42)
+    expect(TestEnum3.enum_value(:c6)).to eq(43)
+    expect(TestEnum3.enum_value(:c7)).to eq(44)
+    expect(TestEnum3.enum_value(:c8)).to eq(45)
+
+    expect(TestEnum4.enum_value(:c5)).to eq(0x42)
+    expect(TestEnum4.enum_value(:c6)).to eq(0x43)
+    expect(TestEnum4.enum_value(:c7)).to eq(0x44)
+    expect(TestEnum4.enum_value(:c8)).to eq(0x45)
+
+    expect(TestEnum4.enum_value(:c29)).to eq(0x4242424242424242)
+    expect(TestEnum4.enum_value(:c30)).to eq(0x4242424242424243)
+    expect(TestEnum4.enum_value(:c31)).to eq(0x4242424242424244)
+    expect(TestEnum4.enum_value(:c32)).to eq(0x4242424242424245)
+  end
+
+  it "can have a mix of explicit and autonumbered constants" do
+    expect(TestEnum1.enum_value(:c9)).to eq(42)
+    expect(TestEnum1.enum_value(:c10)).to eq(43)
+    expect(TestEnum1.enum_value(:c11)).to eq(4242)
+    expect(TestEnum1.enum_value(:c12)).to eq(4243)
+
+    expect(TestEnum3.enum_value(:c9)).to eq(42)
+    expect(TestEnum3.enum_value(:c10)).to eq(43)
+    expect(TestEnum3.enum_value(:c11)).to eq(4242)
+    expect(TestEnum3.enum_value(:c12)).to eq(4243)
+
+    expect(TestEnum4.enum_value(:c9)).to eq(0x42)
+    expect(TestEnum4.enum_value(:c10)).to eq(0x43)
+    expect(TestEnum4.enum_value(:c11)).to eq(0x4242)
+    expect(TestEnum4.enum_value(:c12)).to eq(0x4243)
+
+    expect(TestEnum4.enum_value(:c21)).to eq(0x42)
+    expect(TestEnum4.enum_value(:c22)).to eq(0x43)
+    expect(TestEnum4.enum_value(:c23)).to eq(0x4242)
+    expect(TestEnum4.enum_value(:c24)).to eq(0x4243)
+  end
+
+  it "can have all its constants explicitely valued" do
+    expect(TestEnum1.enum_value(:c13)).to eq(42)
+    expect(TestEnum1.enum_value(:c14)).to eq(4242)
+    expect(TestEnum1.enum_value(:c15)).to eq(424242)
+    expect(TestEnum1.enum_value(:c16)).to eq(42424242)
+    
+    expect(TestEnum3.enum_value(:c13)).to eq(42)
+    expect(TestEnum3.enum_value(:c14)).to eq(4242)
+    expect(TestEnum3.enum_value(:c15)).to eq(424242)
+    expect(TestEnum3.enum_value(:c16)).to eq(42424242)
+
+    expect(TestEnum4.enum_value(:c13)).to eq(0x42)
+    expect(TestEnum4.enum_value(:c14)).to eq(0x4242)
+    expect(TestEnum4.enum_value(:c15)).to eq(0x42424242)
+    expect(TestEnum4.enum_value(:c16)).to eq(0x4242424242424242)
+
+    expect(TestEnum4.enum_value(:c25)).to eq(0x42)
+    expect(TestEnum4.enum_value(:c26)).to eq(0x4242)
+    expect(TestEnum4.enum_value(:c27)).to eq(0x42424242)
+    expect(TestEnum4.enum_value(:c28)).to eq(0x4242424242424242)
+  end
+
+  it "return the constant corresponding to a specific value" do
+    enum = TestEnum3.enum_type(:enum_type1)
+    expect(enum[0]).to be :c1
+    expect(enum[1]).to be :c2
+    expect(enum[2]).to be :c3
+    expect(enum[3]).to be :c4
+
+    enum = TestEnum3.enum_type(:enum_type2)
+    expect(enum[42]).to be :c5
+    expect(enum[43]).to be :c6
+    expect(enum[44]).to be :c7
+    expect(enum[45]).to be :c8
+
+    enum = TestEnum3.enum_type(:enum_type3)
+    expect(enum[42]).to be :c9
+    expect(enum[43]).to be :c10
+    expect(enum[4242]).to be :c11
+    expect(enum[4243]).to be :c12
+
+    enum = TestEnum3.enum_type(:enum_type4)
+    expect(enum[42]).to be :c13
+    expect(enum[4242]).to be :c14
+    expect(enum[424242]).to be :c15
+    expect(enum[42424242]).to be :c16
+
+    enum = TestEnum4.enum_type(:enum_type1)
+    expect(enum[0x42]).to eq(:c5)
+    expect(enum[0x43]).to eq(:c6)
+    expect(enum[0x44]).to eq(:c7)
+    expect(enum[0x45]).to eq(:c8)
+
+    enum = TestEnum4.enum_type(:enum_type2)
+    expect(enum[0x42]).to eq(:c9)
+    expect(enum[0x43]).to eq(:c10)
+    expect(enum[0x4242]).to eq(:c11)
+    expect(enum[0x4243]).to eq(:c12)
+
+    enum = TestEnum4.enum_type(:enum_type3)
+    expect(enum[0x42]).to eq(:c13)
+    expect(enum[0x4242]).to eq(:c14)
+    expect(enum[0x42424242]).to eq(:c15)
+    expect(enum[0x4242424242424242]).to eq(:c16)
+
+    enum = TestEnum4.enum_type(:enum_type4)
+    expect(enum[0x42]).to eq(:c17)
+    expect(enum[0x43]).to eq(:c18)
+    expect(enum[0x44]).to eq(:c19)
+    expect(enum[0x45]).to eq(:c20)
+
+    enum = TestEnum4.enum_type(:enum_type5)
+    expect(enum[0x42]).to eq(:c21)
+    expect(enum[0x43]).to eq(:c22)
+    expect(enum[0x4242]).to eq(:c23)
+    expect(enum[0x4243]).to eq(:c24)
+
+    enum = TestEnum4.enum_type(:enum_type6)
+    expect(enum[0x42]).to eq(:c25)
+    expect(enum[0x4242]).to eq(:c26)
+    expect(enum[0x42424242]).to eq(:c27)
+    expect(enum[0x4242424242424242]).to eq(:c28)
+  end
+
+  it "return nil for values that don't have a symbol" do
+    enum = TestEnum3.enum_type(:enum_type1)
+    expect(enum[-1]).to be_nil
+    expect(enum[4]).to be_nil
+
+    enum = TestEnum3.enum_type(:enum_type2)
+    expect(enum[0]).to be_nil
+    expect(enum[41]).to be_nil
+    expect(enum[46]).to be_nil
+
+    enum = TestEnum3.enum_type(:enum_type3)
+    expect(enum[0]).to be_nil
+    expect(enum[41]).to be_nil
+    expect(enum[44]).to be_nil
+    expect(enum[4241]).to be_nil
+    expect(enum[4244]).to be_nil
+
+    enum = TestEnum3.enum_type(:enum_type4)
+    expect(enum[0]).to be_nil
+    expect(enum[41]).to be_nil
+    expect(enum[43]).to be_nil
+    expect(enum[4241]).to be_nil
+    expect(enum[4243]).to be_nil
+    expect(enum[424241]).to be_nil
+    expect(enum[424243]).to be_nil
+    expect(enum[42424241]).to be_nil
+    expect(enum[42424243]).to be_nil
+
+    enum = TestEnum4.enum_type(:enum_type1)
+    expect(enum[0x0]).to be_nil
+    expect(enum[0x41]).to be_nil
+    expect(enum[0x46]).to be_nil
+
+    enum = TestEnum4.enum_type(:enum_type2)
+    expect(enum[0x0]).to be_nil
+    expect(enum[0x41]).to be_nil
+    expect(enum[0x44]).to be_nil
+    expect(enum[0x4241]).to be_nil
+    expect(enum[0x4244]).to be_nil
+
+    enum = TestEnum4.enum_type(:enum_type3)
+    expect(enum[0x0]).to be_nil
+    expect(enum[0x41]).to be_nil
+    expect(enum[0x43]).to be_nil
+    expect(enum[0x4241]).to be_nil
+    expect(enum[0x4243]).to be_nil
+    expect(enum[0x42424241]).to be_nil
+    expect(enum[0x42424243]).to be_nil
+    expect(enum[0x4242424242424241]).to be_nil
+    expect(enum[0x4242424242424243]).to be_nil
+
+    enum = TestEnum4.enum_type(:enum_type4)
+    expect(enum[0x0]).to be_nil
+    expect(enum[0x41]).to be_nil
+    expect(enum[0x46]).to be_nil
+
+    enum = TestEnum4.enum_type(:enum_type5)
+    expect(enum[0x0]).to be_nil
+    expect(enum[0x41]).to be_nil
+    expect(enum[0x44]).to be_nil
+    expect(enum[0x4241]).to be_nil
+    expect(enum[0x4244]).to be_nil
+
+    enum = TestEnum4.enum_type(:enum_type6)
+    expect(enum[0x0]).to be_nil
+    expect(enum[0x41]).to be_nil
+    expect(enum[0x43]).to be_nil
+    expect(enum[0x4241]).to be_nil
+    expect(enum[0x4243]).to be_nil
+    expect(enum[0x42424241]).to be_nil
+    expect(enum[0x42424243]).to be_nil
+    expect(enum[0x4242424242424241]).to be_nil
+    expect(enum[0x4242424242424243]).to be_nil
+  end
+
+  it "duplicate enum keys rejected" do
+    expect { enum [ :a, 0xfee1dead, :b, 0xdeadbeef, :a, 0 ] }.to raise_error
+    expect { enum FFI::Type::UINT64, [ :a, 0xfee1dead, :b, 0xdeadbeef, :a, 0 ] }.to raise_error
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/errno_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/errno_spec.rb
new file mode 100644
index 0000000..61cbda2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/errno_spec.rb
@@ -0,0 +1,20 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "FFI.errno" do
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    attach_function :setLastError, [ :int ], :void
+  end
+
+  it "FFI.errno contains errno from last function" do
+    LibTest.setLastError(0)
+    LibTest.setLastError(0x12345678)
+    expect(FFI.errno).to eq(0x12345678)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/ffi_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/ffi_spec.rb
new file mode 100644
index 0000000..bb93f37
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/ffi_spec.rb
@@ -0,0 +1,28 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "FFI" do
+
+  describe ".map_library_name" do
+
+    let(:prefix) { FFI::Platform::LIBPREFIX }
+    let(:suffix) { FFI::Platform::LIBSUFFIX }
+
+    it "should add platform library extension if not present" do
+      expect(FFI.map_library_name("#{prefix}dummy")).to eq("#{prefix}dummy.#{suffix}")
+    end
+
+    it "should add platform library extension even if lib suffix is present in name" do
+      expect(FFI.map_library_name("#{prefix}dummy_with_#{suffix}")).to eq("#{prefix}dummy_with_#{suffix}.#{suffix}")
+    end
+
+    it "should return Platform::LIBC when called with 'c'" do
+      expect(FFI.map_library_name('c')).to eq(FFI::Library::LIBC)
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/Benchmark.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/Benchmark.c
new file mode 100644
index 0000000..55a7380
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/Benchmark.c
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+#include <sys/types.h>
+#include <stdint.h>
+
+void returnVoid() {
+    
+}
+
+void returnVoidI(int arg) {
+    
+}
+int returnInt() {
+    return 0;
+}
+
+int returnIntI(int arg) {
+    return arg;
+}
+
+typedef int8_t s8;
+typedef uint8_t u8;
+typedef int16_t s16;
+typedef uint16_t u16;
+typedef int32_t s32;
+typedef uint32_t u32;
+typedef int64_t s64;
+typedef uint64_t u64;
+typedef float f32;
+typedef double f64;
+typedef void v;
+typedef char* S;
+typedef void* P;
+
+#define B6(R, T1, T2, T3, T4, T5, T6) R bench_##T1##T2##T3##T4##T5##T6##_##R(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6) {}
+#define B5(R, T1, T2, T3, T4, T5) R bench_##T1##T2##T3##T4##T5##_##R(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) {}
+#define B4(R, T1, T2, T3, T4) R bench_##T1##T2##T3##T4##_##R(T1 a1, T2 a2, T3 a3, T4 a4) {}
+#define B3(R, T1, T2, T3) R bench_##T1##T2##T3##_##R(T1 a1, T2 a2, T3 a3) {}
+#define B2(R, T1, T2) R bench_##T1##T2##_##R(T1 a1, T2 a2) {}
+#define B1(R, T1) R bench_##T1##_##R(T1 a1) {}
+#define BrV(T) B1(v, T); B2(v, T, T); B3(v, T, T, T); B4(v, T, T, T, T); B5(v, T, T, T, T, T); B6(v, T, T, T, T, T, T);
+BrV(u32);
+BrV(s32);
+BrV(s64);
+BrV(u64);
+BrV(f32);
+BrV(f64);
+BrV(S);
+BrV(P);
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/BoolTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/BoolTest.c
new file mode 100644
index 0000000..04cb6c6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/BoolTest.c
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner.
+ * Copyright (c) 2009 Aman Gupta.
+ *
+ * All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <stdbool.h>
+
+bool
+bool_return_true()
+{
+    return true;
+}
+
+bool
+bool_return_false()
+{
+    return false;
+}
+
+bool
+bool_return_val(bool value)
+{
+    return value;
+}
+
+bool
+bool_reverse_val(bool value)
+{
+    return value ? false : true;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/BufferTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/BufferTest.c
new file mode 100644
index 0000000..3e95ebc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/BufferTest.c
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+
+#define MEMSET(buf, value, size) do { \
+    int i; for (i = 0; i < size; ++i) buf[i] = value; \
+} while(0)
+#define MEMCPY(dst, src, size) do { \
+    int i; for (i = 0; i < size; ++i) dst[i] = src[i]; \
+} while(0)
+
+#define FILL(JTYPE, CTYPE) \
+void fill##JTYPE##Buffer(CTYPE* buf, CTYPE value, int size) { MEMSET(buf, value, size); }
+
+#define COPY(JTYPE, CTYPE) \
+void copy##JTYPE##Buffer(CTYPE* dst, CTYPE* src, int size) { MEMCPY(dst, src, size); }
+
+#define FUNC(JTYPE, CTYPE) \
+    FILL(JTYPE, CTYPE); \
+    COPY(JTYPE, CTYPE)
+            
+FUNC(Byte, char);
+FUNC(Short, short);
+FUNC(Int, int);
+FUNC(Long, long long);
+FUNC(Float, float);
+FUNC(Double, double);
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/ClosureTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/ClosureTest.c
new file mode 100644
index 0000000..dfeabde
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/ClosureTest.c
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <stdlib.h>
+#include <stdbool.h>
+#ifndef _WIN32
+# include <pthread.h>
+#else
+# include <windows.h>
+# include <process.h>
+#endif
+
+#define R(T, rtype) rtype testClosureVr##T(rtype (*closure)(void)) { \
+    return closure != NULL ? (*closure)() : (rtype) 0; \
+}
+
+#define P(T, ptype) void testClosure##T##rV(void (*closure)(ptype), ptype a1) { \
+    if (closure != NULL) (*closure)(a1); \
+}
+
+void testClosureVrV(void (*closure)(void))
+{
+    (*closure)();
+}
+
+R(Z, bool);
+R(B, char);
+R(S, short);
+R(I, int);
+R(L, long);
+R(J, long long);
+R(LL, long long);
+R(F, float);
+R(D, double);
+R(P, const void*);
+
+
+P(Z, bool);
+P(B, char);
+P(S, short);
+P(I, int);
+P(L, long);
+P(J, long long);
+P(LL, long long);
+P(F, float);
+P(D, double);
+P(P, const void*);
+P(UL, unsigned long);
+
+#if defined(_WIN32) && !defined(_WIN64)
+bool __stdcall testClosureStdcall(long *a1, void __stdcall(*closure)(void *, long), long a2) { \
+    void* sp_pre;
+    void* sp_post;
+
+    asm volatile (" movl %%esp,%0" : "=g" (sp_pre));
+    (*closure)(a1, a2);
+    asm volatile (" movl %%esp,%0" : "=g" (sp_post));
+
+    /* %esp before pushing parameters on the stack and after the call returns
+     * should be equal, if both sides respects the stdcall convention */
+    return sp_pre == sp_post;
+}
+#endif
+
+void testOptionalClosureBrV(void (*closure)(char), char a1)
+{
+    if (closure) {
+        (*closure)(a1);
+    }
+}
+
+
+struct ThreadVrV {
+    void (*closure)(void);
+    int count;
+};
+
+static void *
+threadVrV(void *arg)
+{
+    struct ThreadVrV* t = (struct ThreadVrV *) arg;
+    
+    int i;
+    for (i = 0; i < t->count; i++) {
+        (*t->closure)();
+    }
+    
+    return NULL;
+}
+
+void testThreadedClosureVrV(void (*closure)(void), int n)
+{
+	struct ThreadVrV arg = {closure, n};
+#ifndef _WIN32
+    pthread_t t;
+    pthread_create(&t, NULL, threadVrV, &arg);
+    pthread_join(t, NULL);
+#else
+    HANDLE hThread = (HANDLE) _beginthread((void (*)(void *))threadVrV, 0, &arg);
+    WaitForSingleObject(hThread, INFINITE);	
+#endif
+}
+
+struct s8f32s32 {
+    char s8;
+    float f32;
+    int s32;
+};
+
+// Takes a struct argument
+void testClosureTrV(void (*closure)(struct s8f32s32 s), struct s8f32s32* s)
+{
+    (*closure)(*s);
+}
+
+// Returns a struct value
+struct s8f32s32 testClosureVrT(struct s8f32s32 (*closure)())
+{
+    return (*closure)();
+}
+
+typedef int (*returnTypeClosure_t)(int) ;
+typedef returnTypeClosure_t (*lookupClosure_t)();
+
+int testReturnsClosure(lookupClosure_t lookup, int val)
+{
+    returnTypeClosure_t func = lookup ? (*lookup)() : NULL;
+    return func ? (*func)(val) : 0;
+}
+
+static int multiplyByTwo(int value)
+{
+    return value * 2;
+}
+
+returnTypeClosure_t testReturnsFunctionPointer()
+{
+    return multiplyByTwo;
+}
+
+typedef int (*argumentClosure_t)(int);
+typedef int (*withArgumentClosure_t)(argumentClosure_t, int);
+
+int testArgumentClosure(withArgumentClosure_t closure_with, argumentClosure_t closure_arg, int val)
+{
+    return (*closure_with)(closure_arg, val);
+}
+
+
+//
+// These macros produce functions of the form:
+// testClosureBIrV(void (*closure)(char, int), char a1, int a2) {}
+//
+#define C2_(J1, J2, N1, N2) \
+void testClosure##J1##J2##rV(void (*closure)(N1, N2), N1 a1, N2 a2) \
+{ \
+    if (closure != NULL) (*closure)(a1, a2); \
+}
+
+#define C2(J, N) \
+    C2_(B, J, char, N) \
+    C2_(S, J, short, N) \
+    C2_(I, J, int, N) \
+    C2_(LL, J, long long, N) \
+    C2_(F, J, float, N) \
+    C2_(D, J, double, N) \
+
+
+C2(B, char);
+C2(S, short);
+C2(I, int);
+C2(LL, long long);
+C2(F, float);
+C2(D, double);
+
+#define C3_(J1, J2, J3, N1, N2, N3) \
+void testClosure##J1##J2##J3##rV(void (*closure)(N1, N2, N3), N1 a1, N2 a2, N3 a3) \
+{ \
+    (*closure)(a1, a2, a3); \
+}
+
+
+#define C3(J, N) \
+    C3_(B, J, B, char, N, char) \
+    C3_(S, J, S, short, N, short) \
+    C3_(I, J, I, int, N, int) \
+    C3_(LL, J, LL, long long, N, long long) \
+    C3_(F, J, F, float, N, float) \
+    C3_(D, J, D, double, N, double) \
+
+C3(B, char);
+C3(S, short);
+C3(I, int);
+C3(LL, long long);
+C3(F, float);
+C3(D, double);
+C3_(B, S, I, char, short, int);
+C3_(B, S, LL, char, short, long long);
+C3_(LL, S, B, long long, short, char);
+C3_(LL, B, S, long long, char, short);
+
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/EnumTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/EnumTest.c
new file mode 100644
index 0000000..4bf8d23
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/EnumTest.c
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+#include <stdint.h>
+
+int test_untagged_enum(int val) {
+    return val;
+}
+
+int test_untagged_typedef_enum(int val) {
+    return val;
+}
+
+uint8_t test_untagged_nonint_enum(uint8_t val) {
+    return val;
+}
+
+uint16_t test_tagged_nonint_enum1(uint16_t val) {
+    return val;
+}
+
+uint32_t test_tagged_nonint_enum2(uint32_t val) {
+    return val;
+}
+
+uint64_t test_tagged_nonint_enum3(uint64_t val) {
+    return val;
+}
+
+typedef enum {c1, c2, c3, c4} enum_type1;
+enum_type1 test_tagged_typedef_enum1(enum_type1 val) {
+    return val;
+}
+
+typedef enum {c5 = 42, c6, c7, c8} enum_type2;
+enum_type2 test_tagged_typedef_enum2(enum_type2 val) {
+    return val;
+}
+
+typedef enum {c9 = 42, c10, c11 = 4242, c12} enum_type3;
+enum_type3 test_tagged_typedef_enum3(enum_type3 val) {
+    return val;
+}
+
+typedef enum {c13 = 42, c14 = 4242, c15 = 424242, c16 = 42424242} enum_type4;
+enum_type4 test_tagged_typedef_enum4(enum_type4 val) {
+    return val;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/FunctionTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/FunctionTest.c
new file mode 100644
index 0000000..1dd9185
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/FunctionTest.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+#ifndef _WIN32
+#include <unistd.h>
+#include <pthread.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#endif
+
+#include "PipeHelper.h"
+
+int testAdd(int a, int b)
+{
+    return a + b;
+};
+
+int testFunctionAdd(int a, int b, int (*f)(int, int))
+{
+    return f(a, b);
+};
+
+struct testBlockingData {
+    FD_TYPE pipe1[2];
+    FD_TYPE pipe2[2];
+};
+
+struct testBlockingData *testBlockingOpen()
+{
+    struct testBlockingData *self = malloc(sizeof(struct testBlockingData));
+
+    if( pipeHelperCreatePipe(self->pipe1) == -1 ) return NULL;
+    if( pipeHelperCreatePipe(self->pipe2) == -1 ) return NULL;
+    return self;
+}
+
+char testBlockingWR(struct testBlockingData *self, char c) {
+    if( pipeHelperWriteChar(self->pipe1[1], c) != 1)
+        return 0;
+    return pipeHelperReadChar(self->pipe2[0], 10);
+}
+
+char testBlockingRW(struct testBlockingData *self, char c) {
+    char d = pipeHelperReadChar(self->pipe1[0], 10);
+    if( pipeHelperWriteChar(self->pipe2[1], c) != 1)
+        return 0;
+    return d;
+}
+
+void testBlockingClose(struct testBlockingData *self) {
+    pipeHelperClosePipe(self->pipe1[0]);
+    pipeHelperClosePipe(self->pipe1[1]);
+    pipeHelperClosePipe(self->pipe2[0]);
+    pipeHelperClosePipe(self->pipe2[1]);
+    free(self);
+}
+
+static int sum_varargs(va_list args) {
+    char sum = 0;
+    int arg;
+    while ((arg = va_arg(args, int)) != 0) {
+        sum += arg;
+    }
+    va_end(args);
+    return sum;
+}
+
+/* Write c to pipe1 and return the value read from pipe2, or 0 if there’s
+ * an error such as a timeout, or if c does not equal the sum of the
+ * zero-terminated list of char arguments. */
+char testBlockingWRva(struct testBlockingData *self, char c, ...) {
+    va_list args;
+    va_start(args, c);
+    if (sum_varargs(args) != c) {
+        return 0;
+    }
+
+    if( pipeHelperWriteChar(self->pipe1[1], c) != 1)
+        return 0;
+    return pipeHelperReadChar(self->pipe2[0], 10);
+}
+
+char testBlockingRWva(struct testBlockingData *self, char c, ...) {
+    va_list args;
+    va_start(args, c);
+    if (sum_varargs(args) != c) {
+        return 0;
+    }
+
+    char d = pipeHelperReadChar(self->pipe1[0], 10);
+    if( pipeHelperWriteChar(self->pipe2[1], c) != 1)
+        return 0;
+    return d;
+}
+
+struct async_data {
+    void (*fn)(int);
+    int value;
+};
+
+static void* asyncThreadCall(void *data)
+{
+    struct async_data* d = (struct async_data *) data;
+    if (d != NULL && d->fn != NULL) {
+        (*d->fn)(d->value);
+    }
+
+    return NULL;
+}
+
+void testAsyncCallback(void (*fn)(int), int value)
+{
+#ifndef _WIN32
+    pthread_t t;
+    struct async_data d;
+    d.fn = fn;
+    d.value = value;
+    pthread_create(&t, NULL, asyncThreadCall, &d);
+    pthread_join(t, NULL);
+#else
+    (*fn)(value);
+#endif
+}
+
+#if defined(_WIN32) && !defined(_WIN64)
+struct StructUCDP {
+  unsigned char a1;
+  double a2;
+  void *a3;
+};
+
+void __stdcall testStdcallManyParams(long *a1, char a2, short int a3, int a4, __int64 a5,
+            struct StructUCDP a6, struct StructUCDP *a7, float a8, double a9) {
+}
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/GNUmakefile b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/GNUmakefile
new file mode 100644
index 0000000..d730419
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/GNUmakefile
@@ -0,0 +1,149 @@
+# -*- makefile -*-
+
+ifeq ($(OS),)
+  BUILD_OS := $(shell uname -s | tr '[:upper:]' '[:lower:]')
+  OS := $(BUILD_OS)
+endif
+
+ifeq ($(CPU),)
+  CPU := $(shell uname -m | sed -e 's/i[345678]86/i386/')
+endif
+
+PLATFORM = $(CPU)-$(OS)
+
+ifeq ($(OS), sunos)
+  OS = solaris
+endif
+
+SRC_DIR = .
+BUILD_DIR ?= .
+TEST_BUILD_DIR = .
+# Set defaults to unix (linux/solaris/bsd)
+PREFIX = lib
+LIBEXT ?= so
+LIBNAME = $(PREFIX)test.$(LIBEXT)
+
+export MACOSX_DEPLOYMENT_TARGET=10.4
+
+CCACHE := $(strip $(realpath $(shell which ccache 2> /dev/null)))
+
+TEST_SRCS = $(wildcard $(SRC_DIR)/*.c)
+TEST_OBJS := $(patsubst $(SRC_DIR)/%.c, $(TEST_BUILD_DIR)/%.o, $(TEST_SRCS))
+
+#
+# Compiler/linker flags from:
+#   http://weblogs.java.net/blog/kellyohair/archive/2006/01/compilation_of_1.html
+JFLAGS = -fno-omit-frame-pointer -fno-strict-aliasing
+OFLAGS = -O2 $(JFLAGS)
+WFLAGS = -W -Wall -Wno-unused -Wno-parentheses
+PICFLAGS = -fPIC
+SOFLAGS = -shared
+LDFLAGS += $(SOFLAGS)
+
+IFLAGS = -I"$(BUILD_DIR)"
+CFLAGS = $(OFLAGS) $(WFLAGS) $(IFLAGS) $(PICFLAGS) -D_REENTRANT
+
+ifneq ($(strip $(findstring $(OS), win32, mingw, cygwin)),)
+  # For cygwin => win32-native builds, strip out cygwin deps
+  ifneq ($(findstring cygwin, $(BUILD_OS)),)
+    CC += -mno-cygwin -mwin32
+    LDFLAGS += -mno-cygwin -Wl,--add-stdcall-alias
+  endif
+  PICFLAGS=
+  LIBEXT=dll
+  CC = gcc
+endif
+
+ifeq ($(OS), darwin)
+  ifneq ($(findstring $(CPU),ppc),)
+    ARCHFLAGS += -arch ppc
+  endif
+  ifneq ($(findstring $(CPU),i386 x86_64),)
+    ARCHFLAGS += -arch i386 -arch x86_64
+  endif
+  CFLAGS += $(ARCHFLAGS) -DTARGET_RT_MAC_CFM=0
+  CFLAGS += -fno-common
+  LDFLAGS = $(ARCHFLAGS) -dynamiclib
+  # link against the universal libraries on ppc machines
+  LDFLAGS += -L$(MACSDK)/usr/lib
+  LIBEXT = dylib
+  FFI_CFLAGS += -isysroot $(MACSDK)
+  PICFLAGS =
+  SOFLAGS =
+endif
+
+ifeq ($(OS), linux)
+  SOFLAGS += -Wl,-soname,$(LIBNAME)
+endif
+
+ifeq ($(OS), solaris)
+  CC = /usr/sfw/bin/gcc -std=c99
+  LD = /usr/ccs/bin/ld
+  SOFLAGS = -shared -static-libgcc
+endif
+
+ifeq ($(OS), aix)
+  LIBEXT = a
+  SOFLAGS = -shared -static-libgcc
+  PICFLAGS += -pthread
+endif
+
+ifneq ($(findstring bsd, $(OS)),)
+  SOFLAGS = -shared -static-libgcc
+  CFLAGS += -pthread
+  LDFLAGS += -pthread
+endif
+
+ifeq ($(CPU), i386)
+  MODEL = 32
+endif
+
+ifeq ($(CPU), sparcv9)
+  MODEL = 64
+endif
+
+ifeq ($(CPU), amd64)
+  MODEL = 64
+endif
+
+ifeq ($(CPU), x86_64)
+  MODEL = 64
+endif
+
+ifeq ($(CPU), ppc64)
+  MODEL = 64
+endif
+
+ifeq ($(CPU), powerpc64)
+  MODEL = 64
+endif
+
+MODELFLAG =
+ifneq ($(MODEL),)
+  MODELFLAG = -m$(MODEL)
+endif
+
+# On platforms (linux, solaris) that support both 32bit and 64bit, force building for one or the other
+ifneq ($(or $(findstring linux, $(OS)), $(findstring solaris, $(OS))),)
+  # Change the CC/LD instead of CFLAGS/LDFLAGS, incase other things in the flags
+  # makes the libffi build choke
+  CC += $(MODELFLAG)
+  LD += $(MODELFLAG)
+endif
+
+LIBTEST = $(LIBNAME)
+
+all:	$(LIBTEST)
+
+$(TEST_BUILD_DIR)/%.o : $(SRC_DIR)/%.c
+	@mkdir -p $(@D)
+	$(CCACHE) $(CC) $(CFLAGS) -c $< -o $@
+
+$(LIBTEST):  $(TEST_OBJS)
+	$(CC) -o $@ $(LDFLAGS) $(TEST_OBJS) -lm
+
+clean::
+	# nothing to do - ant will delete the build dir
+
+debug::
+	@echo "SRCS=$(TEST_SRCS)"
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/GlobalVariable.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/GlobalVariable.c
new file mode 100644
index 0000000..39c12a2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/GlobalVariable.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <sys/types.h>
+#include <stdint.h>
+
+typedef int8_t s8;
+typedef uint8_t u8;
+typedef int16_t s16;
+typedef uint16_t u16;
+typedef int32_t s32;
+typedef uint32_t u32;
+typedef int64_t s64;
+typedef uint64_t u64;
+typedef signed long sL;
+typedef unsigned long uL;
+typedef float f32;
+typedef double f64;
+#if !defined(__OpenBSD__)
+typedef unsigned long ulong;
+#endif
+typedef void* pointer;
+typedef void* P;
+
+#define GVAR(T) \
+    extern T gvar_##T; \
+    T gvar_##T = (T) -1; \
+    T gvar_##T##_get() { return gvar_##T; }; \
+    void gvar_##T##_set(T v) { gvar_##T = v; }
+
+GVAR(s8);
+GVAR(u8);
+GVAR(s16);
+GVAR(u16);
+GVAR(s32);
+GVAR(u32);
+GVAR(s64);
+GVAR(u64);
+GVAR(long);
+GVAR(ulong);
+GVAR(pointer);
+
+struct gstruct {
+    long data;
+};
+
+struct gstruct gvar_gstruct = { -1 };
+
+struct gstruct*
+gvar_gstruct_get(void)
+{
+    return &gvar_gstruct;
+}
+
+void
+gvar_gstruct_set(const struct gstruct* val)
+{ 
+    gvar_gstruct = *val;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/LastErrorTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/LastErrorTest.c
new file mode 100644
index 0000000..02ce4a8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/LastErrorTest.c
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#if defined(_WIN32) || defined(__WIN32__)
+# include <windows.h>
+#else
+# include <errno.h>
+#endif
+
+int setLastError(int error) {
+#if defined(_WIN32) || defined(__WIN32__)
+    SetLastError(error);
+#else
+    errno = error;
+#endif
+    return -1;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/NumberTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/NumberTest.c
new file mode 100644
index 0000000..3fa25a8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/NumberTest.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+
+#if defined(__sparc) && defined(__sun__)
+    #define fix_mem_access __asm("ta 6")
+#else
+    #define fix_mem_access
+#endif
+
+typedef int8_t s8;
+typedef uint8_t u8;
+typedef int16_t s16;
+typedef uint16_t u16;
+typedef int32_t s32;
+typedef uint32_t u32;
+typedef int64_t s64;
+typedef uint64_t u64;
+typedef signed long sL;
+typedef unsigned long uL;
+typedef float f32;
+typedef double f64;
+typedef long double f128;
+#if !defined(__OpenBSD__)
+typedef unsigned long ulong;
+#endif
+
+#define ADD(T) T add_##T(T arg1, T arg2) { return arg1 + arg2; }
+#define SUB(T) T sub_##T(T arg1, T arg2) { return arg1 - arg2; }
+#define MUL(T) T mul_##T(T arg1, T arg2) { return arg1 * arg2; }
+#define DIV(T) T div_##T(T arg1, T arg2) { return arg1 / arg2; }
+#define RET(T) T ret_##T(T arg1) { return arg1; }
+#define SET(T) static T T##_;void set_##T(T arg1) { T##_ = arg1; }
+#define GET(T) T get_##T() { return T##_; }
+typedef char* ptr;
+#define TEST(T) ADD(T) SUB(T) MUL(T) DIV(T) RET(T) SET(T) GET(T)
+TEST(s8);
+TEST(u8);
+TEST(s16);
+TEST(u16);
+TEST(s32);
+TEST(u32);
+TEST(s64);
+TEST(u64);
+TEST(float);
+TEST(double);
+TEST(long);
+TEST(ulong);
+TEST(f128);
+
+#define ADD2(R, T1, T2) R add_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 + arg2; }
+#define SUB2(R, T1, T2) R sub_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 - arg2; }
+#define MUL2(R, T1, T2) R mul_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 * arg2; }
+#define DIV2(R, T1, T2) R div_##T1##T2##_##R(T1 arg1, T2 arg2) { return arg1 / arg2; }
+
+#define T2__(R, T1, T2) ADD2(R, T1, T2) SUB2(R, T1, T2) MUL2(R, T1, T2) DIV2(R, T1, T2)
+#define T2_(R, T1) \
+    T2__(R, T1, s8) T2__(R, T1, u8) \
+    T2__(R, T1, s16) T2__(R, T1, u16) \
+    T2__(R, T1, s32) T2__(R, T1, u32) \
+    T2__(R, T1, sL) T2__(R, T1, uL) \
+    T2__(R, T1, s64) T2__(R, T1, u64) \
+
+#define TEST2(R) \
+    T2_(R, s8) T2_(R, u8) T2_(R, s16) T2_(R, u16) T2_(R, s32) T2_(R, u32) \
+    T2_(R, sL) T2_(R, uL) T2_(R, s64) T2_(R, u64)
+
+#ifdef notyet
+TEST2(s32)
+TEST2(u32)
+TEST2(s64)
+TEST2(u64)
+#endif
+
+#define ADD3(R, T1, T2, T3) R add_##T1##T2##T3##_##R(T1 arg1, T2 arg2, T3 arg3) { return arg1 + arg2 + arg3; }
+#define pack_f32(buf, v) do { float f = v; memcpy((buf), &f, sizeof(f)); } while(0)
+#define pack_f64(buf, v) do { double f = v; memcpy((buf), &f, sizeof(f)); } while(0)
+#define pack_int(buf, v) do { *(buf) = v; } while(0)
+#define pack_s8 pack_int
+#define pack_u8 pack_int
+#define pack_s16 pack_int
+#define pack_u16 pack_int
+#define pack_s32 pack_int
+#define pack_u32 pack_int
+#define pack_s64 pack_int
+#define pack_u64 pack_int
+#define pack_sL pack_int
+#define pack_uL pack_int
+
+#define PACK3(R, T1, T2, T3) void pack_##T1##T2##T3##_##R(T1 arg1, T2 arg2, T3 arg3, R* r) { \
+    fix_mem_access; \
+    pack_##T1(&r[0], arg1); \
+    pack_##T2(&r[1], arg2); \
+    pack_##T3(&r[2], arg3); \
+}
+
+#define T3___(R, T1, T2, T3) PACK3(R, T1, T2, T3) /* SUB2(R, T1, T2) MUL2(R, T1, T2) DIV2(R, T1, T2) */
+#define T3__(R, T1, T2) \
+    T3___(R, T1, T2, s8) T3___(R, T1, T2, u8) \
+    T3___(R, T1, T2, s16) T3___(R, T1, T2, u16) \
+    T3___(R, T1, T2, s32) T3___(R, T1, T2, u32) \
+    T3___(R, T1, T2, sL) T3___(R, T1, T2, uL) \
+    T3___(R, T1, T2, s64) T3___(R, T1, T2, u64) \
+    T3___(R, T1, T2, f32) T3___(R, T1, T2, f64) \
+
+#define T3_(R, T1) \
+    T3__(R, T1, s8) T3__(R, T1, u8) \
+    T3__(R, T1, s16) T3__(R, T1, u16) \
+    T3__(R, T1, s32) T3__(R, T1, u32) \
+    T3__(R, T1, sL) T3__(R, T1, uL) \
+    T3__(R, T1, s64) T3__(R, T1, u64) \
+    T3__(R, T1, f32) T3__(R, T1, f64) \
+
+#define TEST3(R) \
+    T3_(R, s8) T3_(R, u8) T3_(R, s16) T3_(R, u16) T3_(R, s32) T3_(R, u32) \
+    T3_(R, sL) T3_(R, uL) T3_(R, s64) T3_(R, u64) T3_(R, f32) T3_(R, f64)
+
+TEST3(s64)
+
+void 
+foo6(intptr_t i1, intptr_t i2, intptr_t i3, intptr_t i4, intptr_t i5, intptr_t i6) { }
+
+void 
+foo5(intptr_t i1, intptr_t i2, intptr_t i3, intptr_t i4, intptr_t i5) { }
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelper.h b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelper.h
new file mode 100644
index 0000000..4a02111
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelper.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2015 Lars Kanis. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#ifndef PIPEHELPER_H
+#define PIPEHELPER_H
+
+#ifdef _WIN32
+#define FD_TYPE HANDLE
+#else
+#define FD_TYPE int
+#endif
+
+int pipeHelperCreatePipe(FD_TYPE pipefd[2]);
+char pipeHelperReadChar(FD_TYPE fd, int timeout);
+int pipeHelperWriteChar(FD_TYPE fd, char c);
+void pipeHelperClosePipe(FD_TYPE fd);
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperPosix.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperPosix.c
new file mode 100644
index 0000000..c1252b4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperPosix.c
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2015 Lars Kanis. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#ifndef _WIN32
+#include <unistd.h>
+#include <sys/time.h>
+#include "PipeHelper.h"
+
+int pipeHelperCreatePipe(FD_TYPE pipefd[2])
+{
+    return pipe(pipefd);
+}
+
+char pipeHelperReadChar(FD_TYPE fd, int timeout)
+{
+    char d;
+    struct timeval time = {timeout, 0}; // timeout after x seconds
+    fd_set read_fds;
+    FD_ZERO(&read_fds);
+    FD_SET(fd, &read_fds);
+
+    if(select(fd + 1, &read_fds, NULL, NULL, &time) <= 0)
+        return 0;
+
+    if( read(fd, &d, 1) != 1)
+        return 0;
+    return d;
+}
+
+int pipeHelperWriteChar(FD_TYPE fd, char c)
+{
+    return write(fd, &c, 1);
+}
+
+void pipeHelperClosePipe(FD_TYPE fd) {
+    close(fd);
+}
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperWindows.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperWindows.c
new file mode 100644
index 0000000..470bacc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PipeHelperWindows.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#ifdef _WIN32
+#include <windows.h>
+#include "PipeHelper.h"
+
+int pipeHelperCreatePipe(FD_TYPE pipefd[2])
+{
+    char name[ MAX_PATH ];
+    static int pipe_idx = 0;
+    sprintf( name, "\\\\.\\Pipe\\pipeHelper-%u-%i",
+             (unsigned int)GetCurrentProcessId(), pipe_idx++ );
+
+    pipefd[0] = CreateNamedPipe( name, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED,
+                         PIPE_TYPE_BYTE | PIPE_WAIT,
+                         1,             // Number of pipes
+                         5,         // Out buffer size
+                         5,         // In buffer size
+                         60 * 1000,    // Timeout in ms
+                         NULL );
+    if(pipefd[0] == INVALID_HANDLE_VALUE)
+        return -1;
+
+    pipefd[1] = CreateFile( name, GENERIC_WRITE, 0, NULL,
+                        OPEN_EXISTING,
+                        FILE_ATTRIBUTE_NORMAL,
+                        NULL);
+
+    if(pipefd[1] == INVALID_HANDLE_VALUE) {
+        CloseHandle( pipefd[0] );
+        return -1;
+    }
+    return 0;
+}
+
+char pipeHelperReadChar(FD_TYPE fd, int timeout)
+{
+    char d;
+    OVERLAPPED ovl;
+    ZeroMemory(&ovl, sizeof(ovl));
+    ovl.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+    if( ReadFile(fd, &d, 1, NULL, &ovl) == 0) {
+        DWORD recvd = 0;;
+        DWORD res = WaitForSingleObject(ovl.hEvent, timeout * 1000);
+        if( res != WAIT_OBJECT_0 ) {
+            CloseHandle(ovl.hEvent);
+            return 0;
+        }
+        if( GetOverlappedResult(fd, &ovl, &recvd, FALSE) == 0 ) {
+            CloseHandle(ovl.hEvent);
+            return 0;
+        }
+    }
+    CloseHandle(ovl.hEvent);
+    return d;
+}
+
+int pipeHelperWriteChar(FD_TYPE fd, char c)
+{
+    DWORD written;
+    return WriteFile(fd, &c, 1, &written, NULL) == 0 ? 0 : 1;
+}
+
+void pipeHelperClosePipe(FD_TYPE fd) {
+    CloseHandle(fd);
+}
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PointerTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PointerTest.c
new file mode 100644
index 0000000..7237ab2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/PointerTest.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+typedef void* ptr;
+typedef void* pointer;
+#ifdef _WIN32
+typedef char* caddr_t;
+#endif
+
+#define RET(T) T ptr_ret_##T(void* arg1, int offset) { \
+    T tmp; memcpy(&tmp, (caddr_t) arg1 + offset, sizeof(tmp)); return tmp; \
+}
+#define SET(T) void ptr_set_##T(void* arg1, int offset, T value) { \
+    memcpy((caddr_t) arg1 + offset, &value, sizeof(value)); \
+}
+#define TEST(T) SET(T) RET(T)
+
+TEST(int8_t);
+TEST(int16_t);
+TEST(int32_t);
+TEST(int64_t);
+TEST(float);
+TEST(double);
+TEST(pointer);
+
+void*
+ptr_return_array_element(void **ptrArray, int arrayIndex) 
+{
+    return ptrArray[arrayIndex];
+}
+
+void
+ptr_set_array_element(void **ptrArray, int arrayIndex, void *value)
+{    
+    ptrArray[arrayIndex] = value;
+}
+
+void*
+ptr_malloc(int size) 
+{
+    return calloc(1, size);
+}
+void
+ptr_free(void* ptr)
+{
+    free(ptr);
+}
+
+void*
+ptr_from_address(uintptr_t addr)
+{
+    return (void *) addr;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/ReferenceTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/ReferenceTest.c
new file mode 100644
index 0000000..d1dd88b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/ReferenceTest.c
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <stdint.h>
+
+#define REF(T) void ref_##T(T arg, T* result) { *result = arg; }
+#define ADD(T) void ref_add_##T(T arg1, T arg2, T* result) { *result = arg1 + arg2; }
+#define SUB(T) void ref_sub_##T(T arg1, T arg2, T* result) { *result = arg1 - arg2; }
+#define MUL(T) void ref_mul_##T(T arg1, T arg2, T* result) { *result = arg1 * arg2; }
+#define DIV(T) void ref_div_##T(T arg1, T arg2, T* result) { *result = arg1 / arg2; }
+#define TEST(T) ADD(T) SUB(T) MUL(T) DIV(T) REF(T)
+
+TEST(int8_t);
+TEST(int16_t);
+TEST(int32_t);
+TEST(int64_t);
+TEST(float);
+TEST(double);
+
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/StringTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/StringTest.c
new file mode 100644
index 0000000..292242b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/StringTest.c
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <string.h>
+
+int 
+string_equals(const char* s1, const char* s2)
+{
+    return strcmp(s1, s2) == 0;
+}
+
+void 
+string_set(char* s1, const char* s2)
+{
+    strcpy(s1, s2);
+}
+void
+string_concat(char* dst, const char* src)
+{
+    strcat(dst, src);
+}
+void
+string_dummy(char* dummy)
+{
+}
+const char*
+string_null(void)
+{
+    return NULL;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/StructTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/StructTest.c
new file mode 100644
index 0000000..25683d3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/StructTest.c
@@ -0,0 +1,243 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner.
+ * Copyright (c) 2009 Andrea Fazzi <andrea.fazzi@alcacoop.it>.
+ *
+ * All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdarg.h>
+
+typedef char s8;
+typedef short s16;
+typedef int s32;
+typedef long long s64;
+typedef float f32;
+typedef double f64;
+
+typedef struct bugged_struct {
+  unsigned char visible;
+  unsigned int x;
+  unsigned int y;
+  short rx;
+  short ry;
+  unsigned char order;
+  unsigned char size;
+} bugged_struct_t;
+
+unsigned int
+bugged_struct_size() {
+    return sizeof(bugged_struct_t);
+}
+
+struct test1 {
+    char b;
+    short s;
+    int i;
+    long long j;
+    long l;
+    float f;
+    double d;
+    char string[32];
+};
+
+struct struct_with_array {
+    char c;
+    int a[5];
+};
+
+struct nested {
+    int i;
+};
+
+struct container {
+    char first;
+    struct nested s;
+};
+
+int
+struct_align_nested_struct(struct container* a) { return a->s.i; }
+
+void*
+struct_field_array(struct struct_with_array* s) { return &s->a; }
+
+struct container*
+struct_make_container_struct(int i)
+{
+    static struct container cs;
+    memset(&cs, 0, sizeof(cs));
+    cs.first = 1;
+    cs.s.i = i;
+    return &cs;
+}
+
+#define T(x, type) \
+    type struct_field_##type(struct test1* t) { return t->x; } \
+    struct type##_align { char first; type value; }; \
+    type struct_align_##type(struct type##_align* a) { return a->value; }
+
+T(b, s8);
+T(s, s16);
+T(i, s32);
+T(j, s64);
+T(f, f32);
+T(d, f64);
+T(l, long);
+
+void
+struct_set_string(struct test1* t, char* s)
+{
+    strcpy(t->string, s);
+}
+
+struct test1*
+struct_make_struct(char b, short s, int i, long long ll, float f, double d)
+{
+    static struct test1 t;
+    memset(&t, 0, sizeof(t));
+    t.b = b;
+    t.s = s;
+    t.i = i;
+    t.j = ll;
+    t.f = f;
+    t.d = d;
+    return &t;
+}
+
+typedef int (*add_cb)(int a1, int a2);
+typedef int (*sub_cb)(int a1, int a2);
+struct test2 {
+    add_cb  add_callback;
+    sub_cb  sub_callback;
+};
+
+int
+struct_call_add_cb(struct test2* t, int a1, int a2)
+{
+    return t->add_callback(a1, a2);
+}
+
+int
+struct_call_sub_cb(struct test2* t, int a1, int a2)
+{
+    return t->sub_callback(a1, a2);
+}
+
+
+struct struct_with_array*
+struct_make_struct_with_array(int a_0, int a_1, int a_2, int a_3, int a_4)
+{
+    static struct struct_with_array s;
+
+    memset(&s, 0, sizeof(s));
+
+    s.a[0] = a_0;
+    s.a[1] = a_1;
+    s.a[2] = a_2;
+    s.a[3] = a_3;
+    s.a[4] = a_4;
+
+    return &s;
+
+}
+
+struct s8s32 {
+    char s8;
+    int s32;
+};
+
+struct s8s32
+struct_return_s8s32()
+{
+    struct s8s32 s;
+    s.s8 = 0x7f;
+    s.s32 = 0x12345678;
+
+    return s;
+}
+
+struct s8s32
+struct_s8s32_set(char s8, int s32)
+{
+    struct s8s32 s;
+
+    s.s8 = s8;
+    s.s32 = s32;
+
+    return s;
+}
+
+int
+struct_s8s32_get_s8(struct s8s32 s)
+{
+    return s.s8;
+}
+
+int
+struct_s8s32_get_s32(struct s8s32 s)
+{
+    return s.s32;
+}
+
+struct s8s32
+struct_s8s32_ret_s8s32(struct s8s32 s)
+{
+    return s;
+}
+
+// Pass a struct and an int arg, ensure the int arg is passed correctly
+int
+struct_s8s32_s32_ret_s32(struct s8s32 s, int s32)
+{
+    return s32;
+}
+
+// Pass a struct and a long long arg, ensure the long long arg is passed correctly
+long long
+struct_s8s32_s64_ret_s64(struct s8s32 s, long long s64)
+{
+    return s64;
+}
+
+// Pass a struct and a long long arg, ensure the long long arg is passed correctly
+int
+struct_s32_ptr_s32_s8s32_ret_s32(int s32a, void *ptr, int s32b, struct s8s32 s)
+{
+    if (ptr != NULL) *(struct s8s32 *) ptr = s;
+    return s.s32;
+}
+
+// Pass a char *, copy into buffer length struct
+struct struct_string {
+    char *bytes;
+    int len;
+};
+
+struct struct_string
+struct_varargs_ret_struct_string(int len, ...)
+{
+    struct struct_string ss;
+    va_list vl;
+    char* cp = NULL;
+
+    va_start(vl, len);
+
+    ss.len = len;
+    ss.bytes = va_arg(vl, char *);
+    if (ss.bytes != NULL) {
+        cp = malloc(strlen(ss.bytes) + 1);
+        strcpy(cp, ss.bytes);
+        ss.bytes = cp;
+    }
+
+    va_end(vl);
+
+    return ss;
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/UnionTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/UnionTest.c
new file mode 100644
index 0000000..0929a31
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/UnionTest.c
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+
+typedef char s8;
+typedef short s16;
+typedef int s32;
+typedef long long s64;
+typedef float f32;
+typedef double f64;
+
+typedef union union_test {
+    char b;
+    short s;
+    int i;
+    long long j;
+    long l;
+    float f;
+    double d;
+    s8 a[10];
+} union_test_t;
+
+#define T(x, type) \
+  type union_align_##type(union_test_t* u) { return u->x; } \
+  union_test_t* union_make_union_with_##type(type value) { static union_test_t u; u.x = value; return &u; }
+
+T(b, s8);
+T(s, s16);
+T(i, s32);
+T(j, s64);
+T(f, f32);
+T(d, f64);
+T(l, long);
+
+unsigned int union_size() { return sizeof(union_test_t); }
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/VariadicTest.c b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/VariadicTest.c
new file mode 100644
index 0000000..2f3d801
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/VariadicTest.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdarg.h>
+
+typedef int8_t s8;
+typedef uint8_t u8;
+typedef int16_t s16;
+typedef uint16_t u16;
+typedef int32_t s32;
+typedef uint32_t u32;
+typedef int64_t s64;
+typedef uint64_t u64;
+typedef signed long sL;
+typedef unsigned long uL;
+typedef float F;
+typedef double D;
+
+void pack_varargs(s64* buf, const char* fmt, ...)
+{
+    va_list ap;
+    int c;
+    double d;
+    va_start(ap, fmt);
+    while ((c = *fmt++)) {
+        switch (c) {
+            case 'c':
+            case 's':
+            case 'i':
+                *buf++ = va_arg(ap, s32);
+                break;
+            case 'l':
+                *buf++ = va_arg(ap, long);
+                break;
+            case 'j':
+                *buf++ = va_arg(ap, s64);
+                break;
+            case 'f':
+            case 'd':
+                d = va_arg(ap, double);
+                memcpy(buf++, &d, sizeof(d));
+                break;
+            case 'C':
+            case 'S':
+            case 'I':
+                *buf++ = va_arg(ap, u32);
+                break;
+            case 'L':
+                *buf++ = va_arg(ap, unsigned long);
+                break;
+        }
+    }
+    va_end(ap);
+}
+
+int pack_varargs2(s64* buf, int retval, const char* fmt, ...)
+{
+    va_list ap;
+    int c;
+    double d;
+    va_start(ap, fmt);
+    while ((c = *fmt++)) {
+        switch (c) {
+            case 'c':
+            case 's':
+            case 'i':
+                *buf++ = va_arg(ap, s32);
+                break;
+            case 'l':
+                *buf++ = va_arg(ap, long);
+                break;
+            case 'j':
+                *buf++ = va_arg(ap, s64);
+                break;
+            case 'f':
+            case 'd':
+                d = va_arg(ap, double);
+                memcpy(buf++, &d, sizeof(d));
+                break;
+            case 'C':
+            case 'S':
+            case 'I':
+                *buf++ = va_arg(ap, u32);
+                break;
+            case 'L':
+                *buf++ = va_arg(ap, unsigned long);
+                break;
+        }
+    }
+    va_end(ap);
+    return retval + 1;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/classes.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/classes.rb
new file mode 100644
index 0000000..581768c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/fixtures/classes.rb
@@ -0,0 +1,438 @@
+module FFISpecs
+  #
+  # Callback fixtures
+  #
+  module LibTest
+    callback :cbVrS8, [ ], :char
+    callback :cbVrU8, [ ], :uchar
+    callback :cbVrS16, [ ], :short
+    callback :cbVrU16, [ ], :ushort
+    callback :cbVrS32, [ ], :int
+    callback :cbVrU32, [ ], :uint
+    callback :cbVrL, [ ], :long
+    callback :cbVrUL, [ ], :ulong
+    callback :cbVrS64, [ ], :long_long
+    callback :cbVrU64, [ ], :ulong_long
+    callback :cbVrP, [], :pointer
+    callback :cbCrV, [ :char ], :void
+    callback :cbSrV, [ :short ], :void
+    callback :cbIrV, [ :int ], :void
+    callback :cbLrV, [ :long ], :void
+    callback :cbULrV, [ :ulong ], :void
+    callback :cbLrV, [ :long_long ], :void
+
+    attach_function :testCallbackVrS8, :testClosureVrB, [ :cbVrS8 ], :char
+    attach_function :testCallbackVrU8, :testClosureVrB, [ :cbVrU8 ], :uchar
+    attach_function :testCallbackVrS16, :testClosureVrS, [ :cbVrS16 ], :short
+    attach_function :testCallbackVrU16, :testClosureVrS, [ :cbVrU16 ], :ushort
+    attach_function :testCallbackVrS32, :testClosureVrI, [ :cbVrS32 ], :int
+    attach_function :testCallbackVrU32, :testClosureVrI, [ :cbVrU32 ], :uint
+    attach_function :testCallbackVrL, :testClosureVrL, [ :cbVrL ], :long
+    attach_function :testCallbackVrUL, :testClosureVrL, [ :cbVrUL ], :ulong
+    attach_function :testCallbackVrS64, :testClosureVrLL, [ :cbVrS64 ], :long_long
+    attach_function :testCallbackVrU64, :testClosureVrLL, [ :cbVrU64 ], :ulong_long
+    attach_function :testCallbackVrP, :testClosureVrP, [ :cbVrP ], :pointer
+    attach_function :testCallbackCrV, :testClosureBrV, [ :cbCrV, :char ], :void
+    attach_variable :cbVrS8, :gvar_pointer, :cbVrS8
+    attach_variable :pVrS8, :gvar_pointer, :pointer
+    attach_function :testGVarCallbackVrS8, :testClosureVrB, [ :pointer ], :char
+    attach_function :testOptionalCallbackCrV, :testOptionalClosureBrV, [ :cbCrV, :char ], :void
+
+    attach_function :testCallbackVrS8, :testClosureVrB, [ callback([ ], :char) ], :char
+
+    callback :cb_return_type, [ :int ], :int
+    callback :cb_lookup, [ ], :cb_return_type
+    attach_function :testReturnsCallback, :testReturnsClosure, [ :cb_lookup, :int ], :int
+
+    callback :funcptr, [ :int ], :int
+    attach_function :testReturnsFunctionPointer, [  ], :funcptr
+
+    callback :cbS8rV, [ :char ], :void
+    callback :cbU8rV, [ :uchar ], :void
+    callback :cbS16rV, [ :short ], :void
+    callback :cbU16rV, [ :ushort ], :void
+
+    callback :cbS32rV, [ :int ], :void
+    callback :cbU32rV, [ :uint ], :void
+
+    callback :cbLrV, [ :long ], :void
+    callback :cbULrV, [ :ulong ], :void
+
+    callback :cbS64rV, [ :long_long ], :void
+    attach_function :testCallbackCrV, :testClosureBrV, [ :cbS8rV, :char ], :void
+    attach_function :testCallbackU8rV, :testClosureBrV, [ :cbU8rV, :uchar ], :void
+    attach_function :testCallbackSrV, :testClosureSrV, [ :cbS16rV, :short ], :void
+    attach_function :testCallbackU16rV, :testClosureSrV, [ :cbU16rV, :ushort ], :void
+    attach_function :testCallbackIrV, :testClosureIrV, [ :cbS32rV, :int ], :void
+    attach_function :testCallbackU32rV, :testClosureIrV, [ :cbU32rV, :uint ], :void
+
+    attach_function :testCallbackLrV, :testClosureLrV, [ :cbLrV, :long ], :void
+    attach_function :testCallbackULrV, :testClosureULrV, [ :cbULrV, :ulong ], :void
+
+    attach_function :testCallbackLLrV, :testClosureLLrV, [ :cbS64rV, :long_long ], :void
+  end
+
+  #
+  # Enum fixtures
+  #
+  module TestEnum0
+    extend FFI::Library
+  end
+
+  module TestEnum1
+    extend FFI::Library
+    ffi_lib LIBRARY
+
+    enum [:c1, :c2, :c3, :c4]
+    enum [:c5, 42, :c6, :c7, :c8]
+    enum [:c9, 42, :c10, :c11, 4242, :c12]
+    enum [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242]
+
+    attach_function :test_untagged_enum, [:int], :int
+  end
+
+  module TestEnum3
+    extend FFI::Library
+    ffi_lib LIBRARY
+
+    enum :enum_type1, [:c1, :c2, :c3, :c4]
+    enum :enum_type2, [:c5, 42, :c6, :c7, :c8]
+    enum :enum_type3, [:c9, 42, :c10, :c11, 4242, :c12]
+    enum :enum_type4, [:c13, 42, :c14, 4242, :c15, 424242, :c16, 42424242]
+
+    attach_function :test_tagged_typedef_enum1, [:enum_type1], :enum_type1
+    attach_function :test_tagged_typedef_enum2, [:enum_type2], :enum_type2
+    attach_function :test_tagged_typedef_enum3, [:enum_type3], :enum_type3
+    attach_function :test_tagged_typedef_enum4, [:enum_type4], :enum_type4
+  end
+
+  #
+  # Errno fixtures
+  #
+  module LibTest
+    attach_function :setLastError, [ :int ], :void
+  end
+
+  #
+  # ManagedStruct fixtures
+  #
+  module LibTest
+    attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
+  end
+
+  class NoRelease < ManagedStruct
+    layout :i, :int
+  end
+
+  class WhatClassAmI < ManagedStruct
+    layout :i, :int
+    def self.release; end
+  end
+
+  class PleaseReleaseMe < ManagedStruct
+    layout :i, :int
+    @@count = 0
+    def self.release
+      @@count += 1
+    end
+    def self.wait_gc(count)
+      loop = 5
+      while loop > 0 && @@count < count
+        loop -= 1
+        if RUBY_PLATFORM =~ /java/
+          require 'java'
+          java.lang.System.gc
+        else
+          GC.start
+        end
+        sleep 0.05 if @@count < count
+      end
+    end
+  end
+
+  #
+  # Number fixtures
+  #
+  module LibTest
+    attach_function :ret_s8, [ :char ], :char
+    attach_function :ret_u8, [ :uchar ], :uchar
+    attach_function :ret_s16, [ :short ], :short
+    attach_function :ret_u16, [ :ushort ], :ushort
+    attach_function :ret_s32, [ :int ], :int
+    attach_function :ret_u32, [ :uint ], :uint
+    attach_function :ret_s64, [ :long_long ], :long_long
+    attach_function :ret_u64, [ :ulong_long ], :ulong_long
+    attach_function :ret_long, [ :long ], :long
+    attach_function :ret_ulong, [ :ulong ], :ulong
+    attach_function :set_s8, [ :char ], :void
+    attach_function :get_s8, [ ], :char
+    attach_function :set_float, [ :float ], :void
+    attach_function :get_float, [ ], :float
+    attach_function :set_double, [ :double ], :void
+    attach_function :get_double, [ ], :double
+  end
+
+  PACK_VALUES = {
+    's8' => [ 0x12  ],
+    'u8' => [ 0x34  ],
+    's16' => [ 0x5678 ],
+    'u16' => [ 0x9abc ],
+    's32' => [ 0x7654321f ],
+    'u32' => [ 0xfee1babe ],
+    'sL' => [ 0x1f2e3d4c ],
+    'uL' => [ 0xf7e8d9ca ],
+    's64' => [ 0x1eafdeadbeefa1b2 ],
+    #'f32' => [ 1.234567 ], # TODO: Why is this disabled?
+    'f64' => [ 9.87654321 ]
+  }
+
+  TYPE_MAP = {
+    's8' => :char, 'u8' => :uchar, 's16' => :short, 'u16' => :ushort,
+    's32' => :int, 'u32' => :uint, 's64' => :long_long, 'u64' => :ulong_long,
+    'sL' => :long, 'uL' => :ulong, 'f32' => :float, 'f64' => :double
+  }
+  TYPES = TYPE_MAP.keys
+
+  module LibTest
+    [ 's32', 'u32', 's64', 'u64' ].each do |rt|
+      TYPES.each do |t1|
+        TYPES.each do |t2|
+          TYPES.each do |t3|
+            begin
+              attach_function "pack_#{t1}#{t2}#{t3}_#{rt}",
+                [ TYPE_MAP[t1], TYPE_MAP[t2], TYPE_MAP[t3], :buffer_out ], :void
+            rescue FFI::NotFoundError
+            end
+          end
+        end
+      end
+    end
+  end
+
+  #
+  # Pointer fixtures
+  #
+  module LibTest
+    attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int
+    attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
+    attach_function :ptr_set_pointer, [ :pointer, :int, :pointer ], :void
+  end
+
+  class ToPtrTest
+    def initialize(ptr)
+      @ptr = ptr
+    end
+    def to_ptr
+      @ptr
+    end
+  end
+
+  require 'delegate'
+  class PointerDelegate < DelegateClass(FFI::Pointer)
+    def initialize(ptr)
+      super
+      @ptr = ptr
+    end
+    def to_ptr
+      @ptr
+    end
+  end
+
+  class AutoPointerTestHelper
+    @@count = 0
+    def self.release
+      @@count += 1 if @@count > 0
+    end
+    def self.reset
+      @@count = 0
+    end
+    def self.gc_everything(count)
+      loop = 5
+      while @@count < count && loop > 0
+        loop -= 1
+        if RUBY_PLATFORM =~ /java/
+          require "java"
+          java.lang.System.gc
+        else
+          GC.start
+        end
+        sleep 0.05 unless @@count == count
+      end
+      @@count = 0
+    end
+    def self.finalizer
+      self.method(:release).to_proc
+    end
+  end
+
+  #
+  # String fixtures
+  #
+  module LibTest
+    attach_function :ptr_ret_pointer, [ :pointer, :int], :string
+    attach_function :string_equals, [ :string, :string ], :int
+    attach_function :string_dummy, [ :string ], :void
+  end
+
+  #
+  # Struct initialize fixtures
+  #
+  class StructWithInitialize < FFI::Struct
+    layout :string, :string
+    attr_accessor :magic
+    def initialize
+      super
+      self.magic = 42
+    end
+  end
+
+  #
+  # Struct fixtures
+  #
+  StructTypes = {
+    's8' => :char,
+    's16' => :short,
+    's32' => :int,
+    's64' => :long_long,
+    'long' => :long,
+    'f32' => :float,
+    'f64' => :double
+  }
+
+  module LibTest
+    attach_function :ptr_ret_pointer, [ :pointer, :int], :string
+    attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int
+    attach_function :ptr_from_address, [ :ulong ], :pointer
+    attach_function :string_equals, [ :string, :string ], :int
+    [ 's8', 's16', 's32', 's64', 'f32', 'f64', 'long' ].each do |t|
+      attach_function "struct_align_#{t}", [ :pointer ], StructTypes[t]
+    end
+  end
+
+  class PointerMember < FFI::Struct
+    layout :pointer, :pointer
+  end
+
+  class StringMember < FFI::Struct
+    layout :string, :string
+  end
+
+  module CallbackMember
+    extend FFI::Library
+    ffi_lib LIBRARY
+    callback :add, [ :int, :int ], :int
+    callback :sub, [ :int, :int ], :int
+
+    class TestStruct < FFI::Struct
+      layout :add, :add,
+        :sub, :sub
+    end
+
+    attach_function :struct_call_add_cb, [TestStruct, :int, :int], :int
+    attach_function :struct_call_sub_cb, [TestStruct, :int, :int], :int
+  end
+
+  module LibTest
+    class NestedStruct < FFI::Struct
+      layout :i, :int
+    end
+
+    class ContainerStruct < FFI::Struct
+      layout :first, :char, :ns, NestedStruct
+    end
+
+    attach_function :struct_align_nested_struct, [ :pointer ], :int
+    attach_function :struct_make_container_struct, [ :int ], :pointer
+
+    class StructWithArray < FFI::Struct
+      layout :first, :char, :a, [:int, 5]
+    end
+
+    attach_function :struct_make_struct_with_array, [:int, :int, :int, :int, :int], :pointer
+    attach_function :struct_field_array, [:pointer], :pointer
+
+    class BuggedStruct < FFI::Struct
+      layout :visible, :uchar,
+              :x, :uint,
+              :y, :uint,
+              :rx, :short,
+              :ry, :short,
+              :order, :uchar,
+              :size, :uchar
+    end
+
+    attach_function :bugged_struct_size, [], :uint
+  end
+
+  module StructCustomTypedef
+    extend FFI::Library
+    ffi_lib LIBRARY
+    typedef :uint, :fubar3_t
+
+    class S < FFI::Struct
+      layout :a, :fubar3_t
+    end
+  end
+
+  #
+  # Union fixtures
+  #
+  module LibTest
+    Types = {
+      's8' => [:char, :c, 1],
+      's16' => [:short, :s, 0xff0],
+      's32' => [:int, :i, 0xff00],
+      's64' => [:long_long, :j, 0xffff00],
+      'long' => [:long, :l, 0xffff],
+      'f32' => [:float, :f, 1.0001],
+      'f64' => [:double, :d, 1.000000001]
+    }
+
+    class TestUnion < FFI::Union
+      layout( :a, [:char, 10],
+              :i, :int,
+              :f, :float,
+              :d, :double,
+              :s, :short,
+              :l, :long,
+              :j, :long_long,
+              :c, :char )
+    end
+
+    Types.keys.each do |k|
+      attach_function "union_align_#{k}", [ :pointer ], Types[k][0]
+      attach_function "union_make_union_with_#{k}", [ Types[k][0] ], :pointer
+    end
+
+    attach_function :union_size, [], :uint
+  end
+
+  #
+  # Variadic fixtures
+  #
+  module LibTest
+    attach_function :pack_varargs, [ :buffer_out, :string, :varargs ], :void
+  end
+
+  module Varargs
+    PACK_VALUES = {
+      'c' => [ 0x12  ],
+      'C' => [ 0x34  ],
+      's' => [ 0x5678 ],
+      'S' => [ 0x9abc ],
+      'i' => [ 0x7654321f ],
+      'I' => [ 0xfee1babe ],
+      'l' => [ 0x1f2e3d4c ],
+      'L' => [ 0xf7e8d9ca ],
+      'j' => [ 0x1eafdeadbeefa1b2 ],
+      'f' => [ 1.23456789 ],
+      'd' => [ 9.87654321 ]
+    }
+
+    TYPE_MAP = {
+      'c' => :char, 'C' => :uchar, 's' => :short, 'S' => :ushort,
+      'i' => :int, 'I' => :uint, 'j' => :long_long, 'J' => :ulong_long,
+      'l' => :long, 'L' => :ulong, 'f' => :float, 'd' => :double
+    }
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/function_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/function_spec.rb
new file mode 100644
index 0000000..dd4d2ea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/function_spec.rb
@@ -0,0 +1,97 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe FFI::Function do
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    attach_function :testFunctionAdd, [:int, :int, :pointer], :int
+  end
+  before do
+    @libtest = FFI::DynamicLibrary.open(TestLibrary::PATH,
+                                        FFI::DynamicLibrary::RTLD_LAZY | FFI::DynamicLibrary::RTLD_GLOBAL)
+  end
+
+  it 'is initialized with a signature and a block' do
+    fn = FFI::Function.new(:int, []) { 5 }
+    expect(fn.call).to eql 5
+  end
+
+  it 'raises an error when passing a wrong signature' do
+    expect { FFI::Function.new([], :int).new { } }.to raise_error TypeError
+  end
+
+  it 'returns a native pointer' do
+    expect(FFI::Function.new(:int, []) { }).to be_a_kind_of FFI::Pointer
+  end
+
+  it 'can be used as callback from C passing to it a block' do
+    function_add = FFI::Function.new(:int, [:int, :int]) { |a, b| a + b }
+    expect(LibTest.testFunctionAdd(10, 10, function_add)).to eq(20)
+  end
+
+  it 'can be used as callback from C passing to it a Proc object' do
+    function_add = FFI::Function.new(:int, [:int, :int], Proc.new { |a, b| a + b })
+    expect(LibTest.testFunctionAdd(10, 10, function_add)).to eq(20)
+  end
+
+  it 'can be used to wrap an existing function pointer' do
+    expect(FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd')).call(10, 10)).to eq(20)
+  end
+
+  it 'can be attached to a module' do
+    module Foo; end
+    fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
+    fp.attach(Foo, 'add')
+    expect(Foo.add(10, 10)).to eq(20)
+  end
+
+  it 'can be used to extend an object' do
+    fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
+    foo = Object.new
+    class << foo
+      def singleton_class
+        class << self; self; end
+      end
+    end
+    fp.attach(foo.singleton_class, 'add')
+    expect(foo.add(10, 10)).to eq(20)
+  end
+
+  it 'can wrap a blocking function' do
+    fpOpen = FFI::Function.new(:pointer, [ ], @libtest.find_function('testBlockingOpen'))
+    fpRW = FFI::Function.new(:char, [ :pointer, :char ], @libtest.find_function('testBlockingRW'), :blocking => true)
+    fpWR = FFI::Function.new(:char, [ :pointer, :char ], @libtest.find_function('testBlockingWR'), :blocking => true)
+    fpClose = FFI::Function.new(:void, [ :pointer ], @libtest.find_function('testBlockingClose'))
+    handle = fpOpen.call
+    expect(handle).not_to be_null
+    begin
+      thWR = Thread.new { fpWR.call(handle, 63) }
+      thRW = Thread.new { fpRW.call(handle, 64) }
+      expect(thWR.value).to eq(64)
+      expect(thRW.value).to eq(63)
+    ensure
+      fpClose.call(handle)
+    end
+  end
+
+  it 'autorelease flag is set to true by default' do
+    fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
+    expect(fp.autorelease?).to be true
+  end
+
+  it 'can explicity free itself' do
+    fp = FFI::Function.new(:int, []) { }
+    fp.free
+    expect { fp.free }.to raise_error RuntimeError
+  end
+
+  it 'can\'t explicity free itself if not previously allocated' do
+    fp = FFI::Function.new(:int, [:int, :int], @libtest.find_function('testAdd'))
+    expect { fp.free }.to raise_error RuntimeError
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/io_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/io_spec.rb
new file mode 100644
index 0000000..22c238a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/io_spec.rb
@@ -0,0 +1,16 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+if false # disabled for #390
+  describe "FFI::IO.for_fd" do
+    it "produces an IO wrapping the specified file descriptor" do
+      expect do
+        FFI::IO.for_fd(2, "r")
+      end.to_not raise_error
+    end
+  end
+end
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/library_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/library_spec.rb
new file mode 100644
index 0000000..c4900d3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/library_spec.rb
@@ -0,0 +1,286 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "Library" do
+  describe ".enum_value" do
+    m = Module.new do
+      extend FFI::Library
+      enum :something, [:one, :two]
+    end
+
+    it "should return a value for a valid key" do
+      expect(m.enum_value(:one)).to eq(0)
+      expect(m.enum_value(:two)).to eq(1)
+    end
+
+    it "should return nil for an invalid key" do
+      expect(m.enum_value(:three)).to be nil
+    end
+  end
+
+  describe "#ffi_convention" do
+    it "defaults to :default" do
+      m = Module.new do
+        extend FFI::Library
+      end
+      expect(m.ffi_convention).to eq(:default)
+    end
+
+    it "should be settable" do
+      m = Module.new do
+        extend FFI::Library
+      end
+
+      expect(m.ffi_convention).to eq(:default)
+      m.ffi_convention :stdcall
+      expect(m.ffi_convention).to eq(:stdcall)
+    end
+  end
+
+  if FFI::Platform::OS =~ /windows|cygwin/ && FFI::Platform::ARCH == 'i386'
+    module LibTestStdcall
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      ffi_convention :stdcall
+
+      class StructUCDP < FFI::Struct
+        layout :a1, :uchar,
+          :a2, :double,
+          :a3, :pointer
+      end
+
+      attach_function :testStdcallManyParams, [ :pointer, :int8, :int16, :int32, :int64,
+              StructUCDP.by_value, StructUCDP.by_ref, :float, :double ], :void
+    end
+
+    it "adds stdcall decoration: testStdcallManyParams@64" do
+      s = LibTestStdcall::StructUCDP.new
+      po = FFI::MemoryPointer.new :long
+      LibTestStdcall.testStdcallManyParams po, 1, 2, 3, 4, s, s, 1.0, 2.0
+    end
+  end
+
+  describe "ffi_lib" do
+    it "empty name list should raise error" do
+      expect {
+        Module.new do |m|
+          m.extend FFI::Library
+          ffi_lib
+        end
+      }.to raise_error(LoadError)
+    end
+    
+  end
+
+  unless RbConfig::CONFIG['target_os'] =~ /mswin|mingw/
+    it "attach_function with no library specified" do
+      expect {
+        Module.new do |m|
+          m.extend FFI::Library
+          attach_function :getpid, [ ], :uint
+        end
+      }.to raise_error
+    end
+
+    it "attach_function :getpid from this process" do
+      expect {
+        expect(Module.new do |m|
+          m.extend FFI::Library
+          ffi_lib FFI::Library::CURRENT_PROCESS
+          attach_function :getpid, [ ], :uint
+        end.getpid).to eq(Process.pid)
+      }.not_to raise_error
+    end
+
+    it "loads library using symbol" do
+      expect {
+        expect(Module.new do |m|
+          m.extend FFI::Library
+          ffi_lib :c
+          attach_function :getpid, [ ], :uint
+        end.getpid).to eq(Process.pid)
+      }.not_to raise_error
+    end
+
+    it "attach_function :getpid from [ 'c', 'libc.so.6'] " do
+      expect {
+        expect(Module.new do |m|
+          m.extend FFI::Library
+          ffi_lib [ 'c', 'libc.so.6' ]
+          attach_function :getpid, [ ], :uint
+        end.getpid).to eq(Process.pid)
+      }.not_to raise_error
+    end
+
+    it "attach_function :getpid from [ 'libc.so.6', 'c' ] " do
+      expect {
+        expect(Module.new do |m|
+          m.extend FFI::Library
+          ffi_lib [ 'libc.so.6', 'c' ]
+          attach_function :getpid, [ ], :uint
+        end.getpid).to eq(Process.pid)
+      }.not_to raise_error
+    end
+
+    it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef', nil, 'c' ] " do
+      expect {
+        expect(Module.new do |m|
+          m.extend FFI::Library
+          ffi_lib [ 'libfubar.so.0xdeadbeef', nil, 'c' ]
+          attach_function :getpid, [ ], :uint
+        end.getpid).to eq(Process.pid)
+      }.not_to raise_error
+    end
+
+    it "attach_function :getpid from [ 'libfubar.so.0xdeadbeef' ] " do
+      expect {
+        expect(Module.new do |m|
+          m.extend FFI::Library
+          ffi_lib 'libfubar.so.0xdeadbeef'
+          attach_function :getpid, [ ], :uint
+        end.getpid).to eq(Process.pid)
+      }.to raise_error(LoadError)
+    end
+
+    it "attach_function :bool_return_true from [ File.expand_path(#{TestLibrary::PATH.inspect}) ]" do
+      mod = Module.new do |m|
+        m.extend FFI::Library
+        ffi_lib File.expand_path(TestLibrary::PATH)
+        attach_function :bool_return_true, [ ], :bool
+      end
+      expect(mod.bool_return_true).to be true
+    end
+  end
+
+  def gvar_lib(name, type)
+    Module.new do |m|
+      m.extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      attach_variable :gvar, "gvar_#{name}", type
+      attach_function :get, "gvar_#{name}_get", [], type
+      attach_function :set, "gvar_#{name}_set", [ type ], :void
+    end
+  end
+
+  def gvar_test(name, type, val)
+    lib = gvar_lib(name, type)
+    lib.set(val)
+    expect(lib.gvar).to eq(val)
+    lib.set(0)
+    lib.gvar = val
+    expect(lib.get).to eq(val)
+  end
+
+  [ 0, 127, -128, -1 ].each do |i|
+    it ":char variable" do
+      gvar_test("s8", :char, i)
+    end
+  end
+
+  [ 0, 0x7f, 0x80, 0xff ].each do |i|
+    it ":uchar variable" do
+      gvar_test("u8", :uchar, i)
+    end
+  end
+
+  [ 0, 0x7fff, -0x8000, -1 ].each do |i|
+    it ":short variable" do
+      gvar_test("s16", :short, i)
+    end
+  end
+
+  [ 0, 0x7fff, 0x8000, 0xffff ].each do |i|
+    it ":ushort variable" do
+      gvar_test("u16", :ushort, i)
+    end
+  end
+
+  [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
+    it ":int variable" do
+      gvar_test("s32", :int, i)
+    end
+  end
+
+  [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
+    it ":uint variable" do
+      gvar_test("u32", :uint, i)
+    end
+  end
+
+  [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
+    it ":long_long variable" do
+      gvar_test("s64", :long_long, i)
+    end
+  end
+
+  [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
+    it ":ulong_long variable" do
+      gvar_test("u64", :ulong_long, i)
+    end
+  end
+
+  if FFI::Platform::LONG_SIZE == 32
+    [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
+      it ":long variable" do
+        gvar_test("long", :long, i)
+      end
+    end
+
+    [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
+      it ":ulong variable" do
+        gvar_test("ulong", :ulong, i)
+      end
+    end
+  else
+    [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
+      it ":long variable" do
+        gvar_test("long", :long, i)
+      end
+    end
+
+    [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
+      it ":ulong variable" do
+        gvar_test("ulong", :ulong, i)
+      end
+    end
+  end
+
+  it "Pointer variable" do
+    lib = gvar_lib("pointer", :pointer)
+    val = FFI::MemoryPointer.new :long
+    lib.set(val)
+    expect(lib.gvar).to eq(val)
+    lib.set(nil)
+    lib.gvar = val
+    expect(lib.get).to eq(val)
+  end
+
+  [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
+    it "structure" do
+      class GlobalStruct < FFI::Struct
+        layout :data, :long
+      end
+
+      lib = Module.new do |m|
+        m.extend FFI::Library
+        ffi_lib TestLibrary::PATH
+        attach_variable :gvar, "gvar_gstruct", GlobalStruct
+        attach_function :get, "gvar_gstruct_get", [], GlobalStruct
+        attach_function :set, "gvar_gstruct_set", [ GlobalStruct ], :void
+      end
+
+      val = GlobalStruct.new
+      val[:data] = i
+      lib.set(val)
+      expect(lib.gvar[:data]).to eq(i)
+      val[:data] = 0
+      lib.gvar[:data] = i
+      val = GlobalStruct.new(lib.get)
+      expect(val[:data]).to eq(i)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/long_double.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/long_double.rb
new file mode 100644
index 0000000..b16613b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/long_double.rb
@@ -0,0 +1,30 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+require 'bigdecimal'
+
+describe ":long_double arguments and return values" do
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    attach_function :add_f128, [ :long_double, :long_double ], :long_double
+    attach_function :ret_f128, [ :long_double ], :long_double
+  end
+
+  it "returns first parameter" do
+    expect(LibTest.ret_f128(0.1)).to be_within(0.01).of(0.1)
+  end
+
+  it "returns first parameter with high precision" do
+    ld =        BigDecimal.new("1.234567890123456789")
+    tolerance = BigDecimal.new("0.0000000000000000001")
+    expect(LibTest.ret_f128(ld)).to be_within(tolerance).of(ld)
+  end
+
+  it "add two long double numbers" do
+    expect(LibTest.add_f128(0.1, 0.2)).to be_within(0.01).of(0.3)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/managed_struct_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/managed_struct_spec.rb
new file mode 100644
index 0000000..f11c67a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/managed_struct_spec.rb
@@ -0,0 +1,68 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "Managed Struct" do
+  include FFI
+  module ManagedStructTestLib
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
+  end
+
+  it "should raise an error if release() is not defined" do
+    class NoRelease < FFI::ManagedStruct ; layout :i, :int; end
+    expect { NoRelease.new(ManagedStructTestLib.ptr_from_address(0x12345678)) }.to raise_error(NoMethodError)
+  end
+
+  it "should be the right class" do
+    class WhatClassAmI < FFI::ManagedStruct
+      layout :i, :int
+      def self.release
+      end
+    end    
+
+    expect(WhatClassAmI.new(ManagedStructTestLib.ptr_from_address(0x12345678)).class).to eq(WhatClassAmI)
+  end
+
+  it "should build with self reference" do
+    class ClassWithSelfRef < FFI::ManagedStruct
+      layout :data, self.ptr
+      def self.release
+      end
+    end
+
+    expect(ClassWithSelfRef.new(ManagedStructTestLib.ptr_from_address(0x12345678)).class).to eq(ClassWithSelfRef)
+  end
+
+  # see #427
+  it "should release memory properly", :broken => true do
+    class PleaseReleaseMe < FFI::ManagedStruct
+      layout :i, :int
+      @@count = 0
+      def self.release
+        @@count += 1
+      end
+      def self.wait_gc(count)
+        loop = 5
+        while loop > 0 && @@count < count
+          loop -= 1
+          TestLibrary.force_gc
+          sleep 0.05 if @@count < count
+        end
+      end
+    end
+
+    loop_count = 30
+    wiggle_room = 5
+
+    expect(PleaseReleaseMe).to receive(:release).at_least(loop_count-wiggle_room).times
+    loop_count.times do
+      PleaseReleaseMe.new(ManagedStructTestLib.ptr_from_address(0x12345678))
+    end
+    PleaseReleaseMe.wait_gc loop_count
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/memorypointer_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/memorypointer_spec.rb
new file mode 100644
index 0000000..d819f35
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/memorypointer_spec.rb
@@ -0,0 +1,78 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+MemoryPointer = FFI::MemoryPointer
+
+describe "MemoryPointer#total" do
+  it "MemoryPointer.new(:char, 1).total == 1" do
+    expect(MemoryPointer.new(:char, 1).total).to eq 1
+  end
+
+  it "MemoryPointer.new(:short, 1).total == 2" do
+    expect(MemoryPointer.new(:short, 1).total).to eq 2
+  end
+
+  it "MemoryPointer.new(:int, 1).total == 4" do
+    expect(MemoryPointer.new(:int, 1).total).to eq 4
+  end
+
+  it "MemoryPointer.new(:long_long, 1).total == 8" do
+    expect(MemoryPointer.new(:long_long, 1).total).to eq 8
+  end
+
+  it "MemoryPointer.new(1024).total == 1024" do
+    expect(MemoryPointer.new(1024).total).to eq 1024
+  end
+end
+describe "MemoryPointer#read_array_of_long" do
+  it "foo" do
+    ptr = MemoryPointer.new(:long, 1024)
+    ptr[0].write_long 1234
+    ptr[1].write_long 5678
+    l = ptr.read_array_of_long(2)
+    expect(l[0]).to eq 1234
+    expect(l[1]).to eq 5678
+  end
+end
+describe "MemoryPointer argument" do
+  module Ptr
+    extend FFI::Library
+    ffi_lib FFI::Platform::LIBC
+    attach_function :memset, [ :pointer, :int, :ulong ], :pointer
+    attach_function :memcpy, [ :pointer, :pointer, :ulong ], :pointer
+  end
+
+  it "Pointer passed correctly" do
+    p = MemoryPointer.new :int, 1
+    ret = Ptr.memset(p, 0, p.total)
+    expect(ret).to eq p
+  end
+
+  it "Data passed to native function" do
+    p = MemoryPointer.new :int, 1
+    p2 = MemoryPointer.new :int, 1
+    p2.put_int(0, 0x5eadbeef)
+    Ptr.memcpy(p, p2, p.total)
+    expect(p.get_int(0)).to eq p2.get_int(0)
+    expect(p2.get_int(0)).not_to eql 0
+  end
+end
+describe "MemoryPointer return value" do
+  module Stdio
+    extend FFI::Library
+    ffi_lib FFI::Platform::LIBC
+    attach_function :fopen, [ :string, :string ], :pointer
+    attach_function :fclose, [ :pointer ], :int
+    attach_function :fwrite, [ :pointer, :ulong, :ulong, :string ], :ulong
+  end
+
+  it "fopen returns non-nil" do
+    fp = Stdio.fopen("/dev/null", "w")
+    expect(fp).to_not be_nil
+    expect(Stdio.fclose(fp)).to  eq 0 unless fp.nil? or fp.null? 
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/number_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/number_spec.rb
new file mode 100644
index 0000000..acb9562
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/number_spec.rb
@@ -0,0 +1,247 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "Function with primitive integer arguments" do
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    attach_function :ret_s8, [ :char ], :char
+    attach_function :ret_u8, [ :uchar ], :uchar
+    attach_function :ret_s16, [ :short ], :short
+    attach_function :ret_u16, [ :ushort ], :ushort
+    attach_function :ret_s32, [ :int ], :int
+    attach_function :ret_u32, [ :uint ], :uint
+    attach_function :ret_s64, [ :long_long ], :long_long
+    attach_function :ret_u64, [ :ulong_long ], :ulong_long
+    attach_function :ret_long, [ :long ], :long
+    attach_function :ret_ulong, [ :ulong ], :ulong
+    attach_function :set_s8, [ :char ], :void
+    attach_function :get_s8, [ ], :char
+    attach_function :set_float, [ :float ], :void
+    attach_function :get_float, [ ], :float
+    attach_function :set_double, [ :double ], :void
+    attach_function :get_double, [ ], :double
+  end
+
+  it "int8.size" do
+    expect(FFI::TYPE_INT8.size).to eq(1)
+  end
+
+  it "uint8.size" do
+    expect(FFI::TYPE_UINT8.size).to eq(1)
+  end
+
+  it "int16.size" do
+    expect(FFI::TYPE_INT16.size).to eq(2)
+  end
+
+  it "uint16.size" do
+    expect(FFI::TYPE_UINT16.size).to eq(2)
+  end
+
+  it "int32.size" do
+    expect(FFI::TYPE_INT32.size).to eq(4)
+  end
+
+  it "uint32.size" do
+    expect(FFI::TYPE_UINT32.size).to eq(4)
+  end
+
+  it "int64.size" do
+    expect(FFI::TYPE_INT64.size).to eq(8)
+  end
+
+  it "uint64.size" do
+    expect(FFI::TYPE_UINT64.size).to eq(8)
+  end
+
+  it "float.size" do
+    expect(FFI::TYPE_FLOAT32.size).to eq(4)
+  end
+
+  it "double.size" do
+    expect(FFI::TYPE_FLOAT64.size).to eq(8)
+  end
+  [ 0, 127, -128, -1 ].each do |i|
+    it ":char call(:char (#{i}))" do
+      expect(LibTest.ret_s8(i)).to eq(i)
+    end
+  end
+  [ 0, 0x7f, 0x80, 0xff ].each do |i|
+    it ":uchar call(:uchar (#{i}))" do
+      expect(LibTest.ret_u8(i)).to eq(i)
+    end
+  end
+  [ 0, 0x7fff, -0x8000, -1 ].each do |i|
+    it ":short call(:short (#{i}))" do
+      expect(LibTest.ret_s16(i)).to eq(i)
+    end
+  end
+  [ 0, 0x7fff, 0x8000, 0xffff ].each do |i|
+    it ":ushort call(:ushort (#{i}))" do
+      expect(LibTest.ret_u16(i)).to eq(i)
+    end
+  end
+  [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
+    it ":int call(:int (#{i}))" do
+      expect(LibTest.ret_s32(i)).to eq(i)
+    end
+  end
+  [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
+    it ":uint call(:uint (#{i}))" do
+      expect(LibTest.ret_u32(i)).to eq(i)
+    end
+  end
+  [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
+    it ":long_long call(:long_long (#{i}))" do
+      expect(LibTest.ret_s64(i)).to eq(i)
+    end
+  end
+  [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
+    it ":ulong_long call(:ulong_long (#{i}))" do
+      expect(LibTest.ret_u64(i)).to eq(i)
+    end
+  end
+  if FFI::Platform::LONG_SIZE == 32
+    [ 0, 0x7fffffff, -0x80000000, -1 ].each do |i|
+      it ":long call(:long (#{i}))" do
+        expect(LibTest.ret_long(i)).to eq(i)
+      end
+    end
+    [ 0, 0x7fffffff, 0x80000000, 0xffffffff ].each do |i|
+      it ":ulong call(:ulong (#{i}))" do
+        expect(LibTest.ret_ulong(i)).to eq(i)
+      end
+    end
+  else
+    [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ].each do |i|
+      it ":long call(:long (#{i}))" do
+        expect(LibTest.ret_long(i)).to eq(i)
+      end
+    end
+    [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ].each do |i|
+      it ":ulong call(:ulong (#{i}))" do
+        expect(LibTest.ret_ulong(i)).to eq(i)
+      end
+    end
+    [ 0.0, 0.1, 1.1, 1.23 ].each do |f|
+      it ":float call(:double (#{f}))" do
+        LibTest.set_float(f)
+        expect((LibTest.get_float - f).abs).to be < 0.001
+      end
+    end
+    [ 0.0, 0.1, 1.1, 1.23 ].each do |f|
+      it ":double call(:double (#{f}))" do
+        LibTest.set_double(f)
+        expect((LibTest.get_double - f).abs).to be < 0.001
+      end
+    end
+  end
+end
+describe "Integer parameter range checking" do
+  [ 128, -129 ].each do |i|
+    it ":char call(:char (#{i}))" do
+      expect { expect(LibTest.ret_int8_t(i)).to eq(i) }.to raise_error
+    end
+  end
+  [ -1, 256 ].each do |i|
+    it ":uchar call(:uchar (#{i}))" do
+      expect { expect(LibTest.ret_u_int8_t(i)).to eq(i) }.to raise_error
+    end
+  end
+  [ 0x8000, -0x8001 ].each do |i|
+    it ":short call(:short (#{i}))" do
+      expect { expect(LibTest.ret_int16_t(i)).to eq(i) }.to raise_error
+    end
+  end
+  [ -1, 0x10000 ].each do |i|
+    it ":ushort call(:ushort (#{i}))" do
+      expect { expect(LibTest.ret_u_int16_t(i)).to eq(i) }.to raise_error
+    end
+  end
+  [ 0x80000000, -0x80000001 ].each do |i|
+    it ":int call(:int (#{i}))" do
+      expect { expect(LibTest.ret_int32_t(i)).to eq(i) }.to raise_error
+    end
+  end
+  [ -1, 0x100000000 ].each do |i|
+    it ":ushort call(:ushort (#{i}))" do
+      expect { expect(LibTest.ret_u_int32_t(i)).to eq(i) }.to raise_error
+    end
+  end
+end
+describe "Three different size Integer arguments" do
+  TYPE_MAP = {
+    's8' => :char, 'u8' => :uchar, 's16' => :short, 'u16' => :ushort,
+    's32' => :int, 'u32' => :uint, 's64' => :long_long, 'u64' => :ulong_long,
+    'sL' => :long, 'uL' => :ulong, 'f32' => :float, 'f64' => :double
+  }
+  TYPES = TYPE_MAP.keys
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    
+    
+    [ 's32', 'u32', 's64', 'u64' ].each do |rt|
+      TYPES.each do |t1|
+        TYPES.each do |t2|
+          TYPES.each do |t3|
+            begin
+              attach_function "pack_#{t1}#{t2}#{t3}_#{rt}",
+                [ TYPE_MAP[t1], TYPE_MAP[t2], TYPE_MAP[t3], :buffer_out ], :void
+            rescue FFI::NotFoundError
+            end
+          end
+        end
+      end
+    end
+  end
+
+  PACK_VALUES = {
+    's8' => [ 0x12  ],
+    'u8' => [ 0x34  ],
+    's16' => [ 0x5678 ],
+    'u16' => [ 0x9abc ],
+    's32' => [ 0x7654321f ],
+    'u32' => [ 0xfee1babe ],
+    'sL' => [ 0x1f2e3d4c ],
+    'uL' => [ 0xf7e8d9ca ],
+    's64' => [ 0x1eafdeadbeefa1b2 ],
+#    'f32' => [ 1.234567 ],
+    'f64' => [ 9.87654321 ]
+  }
+
+  def verify(p, off, t, v)
+    if t == 'f32'
+      expect(p.get_float32(off)).to eq(v)
+    elsif t == 'f64'
+      expect(p.get_float64(off)).to eq(v)
+    else
+      expect(p.get_int64(off)).to eq(v)
+    end
+  end
+
+  PACK_VALUES.keys.each do |t1|
+    PACK_VALUES.keys.each do |t2|
+      PACK_VALUES.keys.each do |t3|
+        PACK_VALUES[t1].each do |v1|
+          PACK_VALUES[t2].each do |v2|
+            PACK_VALUES[t3].each do |v3|
+              it "call(#{TYPE_MAP[t1]} (#{v1}), #{TYPE_MAP[t2]} (#{v2}), #{TYPE_MAP[t3]} (#{v3}))" do
+                p = FFI::Buffer.new :long_long, 3
+                LibTest.send("pack_#{t1}#{t2}#{t3}_s64", v1, v2, v3, p)
+                verify(p, 0, t1, v1)
+                verify(p, 8, t2, v2)
+                verify(p, 16, t3, v3)
+              end
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/platform_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/platform_spec.rb
new file mode 100644
index 0000000..7c56719
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/platform_spec.rb
@@ -0,0 +1,114 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "FFI::Platform::LIBSUFFIX" do
+  case OS
+  when "linux"
+    it "returns 'so'" do
+      expect(FFI::Platform::LIBSUFFIX).to eq('so')
+    end
+  when "windows"
+    it "returns 'dll'" do
+      expect(FFI::Platform::LIBSUFFIX).to eq('dll')
+    end
+  when "darwin"
+    it "returns 'dylib'" do
+      expect(FFI::Platform::LIBSUFFIX).to eq('dylib')
+    end
+  end
+end
+
+describe "FFI::Platform::IS_WINDOWS" do
+  case OS
+  when "linux"
+    it "returns false" do
+      expect(FFI::Platform::IS_WINDOWS).to be false
+    end
+  when "windows"
+    it "returns true" do
+      expect(FFI::Platform::IS_WINDOWS).to be true
+    end
+  when "darwin"
+    it "returns false" do
+      expect(FFI::Platform::IS_WINDOWS).to be false
+    end
+  end
+end
+
+describe "FFI::Platform::ARCH" do
+  it "returns the architecture type" do
+    expect(FFI::Platform::ARCH).to eq(CPU)
+  end
+end
+
+describe "FFI::Platform::OS" do
+  case OS
+  when "linux"
+    it "returns 'linux' as a string" do
+      expect(FFI::Platform::OS).to eq('linux')
+    end
+  when "windows"
+    it "returns 'windows' as a string" do
+      expect(FFI::Platform::OS).to eq('windows')
+    end
+  when "darwin"
+    it "returns 'darwin' as a string" do
+      expect(FFI::Platform::OS).to eq('darwin')
+    end
+  end
+end
+
+describe "FFI::Platform.windows?" do
+  case OS
+  when "linux"
+    it "returns false" do
+      expect(FFI::Platform.windows?).to be false
+    end
+  when "windows"
+    it "returns true" do
+      expect(FFI::Platform.windows?).to be true
+    end
+  when "darwin"
+    it "returns false" do
+      expect(FFI::Platform.windows?).to be false
+    end
+  end
+end
+
+describe "FFI::Platform.mac?" do
+  case OS
+  when "linux"
+    it "returns false" do
+      expect(FFI::Platform.mac?).to be false
+    end
+  when "windows"
+    it "returns false" do
+      expect(FFI::Platform.mac?).to be false
+    end
+  when "darwin"
+    it "returns true" do
+      expect(FFI::Platform.mac?).to be true
+    end
+  end
+end
+
+describe "FFI::Platform.unix?" do
+  case OS
+  when "linux"
+    it "returns true" do
+      expect(FFI::Platform.unix?).to be true
+    end
+  when "windows"
+    it "returns false" do
+      expect(FFI::Platform.unix?).to be false
+    end
+  when "darwin"
+    it "returns true" do
+      expect(FFI::Platform.unix?).to be true
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/pointer_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/pointer_spec.rb
new file mode 100644
index 0000000..bc981e6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/pointer_spec.rb
@@ -0,0 +1,285 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+require 'delegate'
+
+module PointerTestLib
+  extend FFI::Library
+  ffi_lib TestLibrary::PATH
+  begin
+    attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int
+  rescue FFI::NotFoundError
+    # NetBSD uses #define instead of typedef for these
+    attach_function :ptr_ret_int32_t, :ptr_ret___int32_t, [ :pointer, :int ], :int
+  end
+  attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], :pointer
+  attach_function :ptr_set_pointer, [ :pointer, :int, :pointer ], :void
+  attach_function :ptr_ret_pointer, [ :pointer, :int ], :pointer
+end
+describe "Pointer" do
+  include FFI
+  class ToPtrTest
+    def initialize(ptr)
+      @ptr = ptr
+    end
+    def to_ptr
+      @ptr
+    end
+  end
+
+  it "Any object implementing #to_ptr can be passed as a :pointer parameter" do
+    memory = FFI::MemoryPointer.new :long_long
+    magic = 0x12345678
+    memory.put_int32(0, magic)
+    tp = ToPtrTest.new(memory)
+    expect(PointerTestLib.ptr_ret_int32_t(tp, 0)).to eq(magic)
+  end
+  class PointerDelegate < DelegateClass(FFI::Pointer)
+    def initialize(ptr)
+      @ptr = ptr
+    end
+    def to_ptr
+      @ptr
+    end
+  end
+
+  it "A DelegateClass(Pointer) can be passed as a :pointer parameter" do
+    memory = FFI::MemoryPointer.new :long_long
+    magic = 0x12345678
+    memory.put_int32(0, magic)
+    ptr = PointerDelegate.new(memory)
+    expect(PointerTestLib.ptr_ret_int32_t(ptr, 0)).to eq(magic)
+  end
+
+  it "Fixnum cannot be used as a Pointer argument" do
+    expect { PointerTestLib.ptr_ret_int32(0, 0) }.to raise_error
+  end
+
+  it "Bignum cannot be used as a Pointer argument" do
+    expect { PointerTestLib.ptr_ret_int32(0xfee1deadbeefcafebabe, 0) }.to raise_error
+  end
+
+  it "#to_ptr" do
+    memory = FFI::MemoryPointer.new :pointer
+    expect(memory.to_ptr).to eq(memory)
+
+    expect(FFI::Pointer::NULL.to_ptr).to eq(FFI::Pointer::NULL)
+  end
+
+  describe "pointer type methods" do
+
+    it "#read_pointer" do
+      memory = FFI::MemoryPointer.new :pointer
+      PointerTestLib.ptr_set_pointer(memory, 0, PointerTestLib.ptr_from_address(0xdeadbeef))
+      expect(memory.read_pointer.address).to eq(0xdeadbeef)
+    end
+
+    it "#write_pointer" do
+      memory = FFI::MemoryPointer.new :pointer
+      memory.write_pointer(PointerTestLib.ptr_from_address(0xdeadbeef))
+      expect(PointerTestLib.ptr_ret_pointer(memory, 0).address).to eq(0xdeadbeef)
+    end
+
+    it "#read_array_of_pointer" do
+      values = [0x12345678, 0xfeedf00d, 0xdeadbeef]
+      memory = FFI::MemoryPointer.new :pointer, values.size
+      values.each_with_index do |address, j|
+        PointerTestLib.ptr_set_pointer(memory, j * FFI.type_size(:pointer), PointerTestLib.ptr_from_address(address))
+      end
+      array = memory.read_array_of_pointer(values.size)
+      values.each_with_index do |address, j|
+        expect(array[j].address).to eq(address)
+      end
+    end
+    
+  end
+
+  describe 'NULL' do
+    it 'should be obtained using Pointer::NULL constant' do
+      null_ptr = FFI::Pointer::NULL
+      expect(null_ptr).to be_null
+    end
+    it 'should be obtained passing address 0 to constructor' do
+      expect(FFI::Pointer.new(0)).to be_null
+    end
+    it 'should raise an error when attempting read/write operations on it' do
+      null_ptr = FFI::Pointer::NULL
+      expect { null_ptr.read_int }.to raise_error(FFI::NullPointerError)
+      expect { null_ptr.write_int(0xff1) }.to raise_error(FFI::NullPointerError)
+    end
+    it 'returns true when compared with nil' do
+      expect((FFI::Pointer::NULL == nil)).to be true
+    end
+  end
+
+  it "Pointer.size returns sizeof pointer on platform" do
+    expect(FFI::Pointer.size).to eq((FFI::Platform::ADDRESS_SIZE / 8))
+  end
+
+  describe "#slice" do
+    before(:each) do
+      @mptr = FFI::MemoryPointer.new(:char, 12)
+      @mptr.put_uint(0, 0x12345678)
+      @mptr.put_uint(4, 0xdeadbeef)
+    end
+
+    it "contents of sliced pointer matches original pointer at offset" do
+      expect(@mptr.slice(4, 4).get_uint(0)).to eq(0xdeadbeef)
+    end
+
+    it "modifying sliced pointer is reflected in original pointer" do
+      @mptr.slice(4, 4).put_uint(0, 0xfee1dead)
+      expect(@mptr.get_uint(4)).to eq(0xfee1dead)
+    end
+
+    it "access beyond bounds should raise IndexError" do
+      expect { @mptr.slice(4, 4).get_int(4) }.to raise_error(IndexError)
+    end
+  end
+
+  describe "#type_size" do
+    it "should be same as FFI.type_size(type)" do
+      expect(FFI::MemoryPointer.new(:int, 1).type_size).to eq(FFI.type_size(:int))
+    end
+  end
+end
+
+describe "AutoPointer" do
+  loop_count = 30
+  wiggle_room = 5 # GC rarely cleans up all objects. we can get most of them, and that's enough to determine if the basic functionality is working.
+  magic = 0x12345678
+
+  class AutoPointerTestHelper
+    @@count = 0
+    def self.release
+      @@count += 1 if @@count > 0
+    end
+    def self.reset
+      @@count = 0
+    end
+    def self.gc_everything(count)
+      loop = 5
+      while @@count < count && loop > 0
+        loop -= 1
+        TestLibrary.force_gc
+        sleep 0.05 unless @@count == count
+      end
+      @@count = 0
+    end
+    def self.finalizer
+      self.method(:release).to_proc
+    end
+  end
+  class AutoPointerSubclass < FFI::AutoPointer
+    def self.release(ptr); end
+  end
+
+  # see #427
+  it "cleanup via default release method", :broken => true do
+    expect(AutoPointerSubclass).to receive(:release).at_least(loop_count-wiggle_room).times
+    AutoPointerTestHelper.reset
+    loop_count.times do
+      # note that if we called
+      # AutoPointerTestHelper.method(:release).to_proc inline, we'd
+      # have a reference to the pointer and it would never get GC'd.
+      AutoPointerSubclass.new(PointerTestLib.ptr_from_address(magic))
+    end
+    AutoPointerTestHelper.gc_everything loop_count
+  end
+
+  # see #427
+  it "cleanup when passed a proc", :broken => true do
+    #  NOTE: passing a proc is touchy, because it's so easy to create a memory leak.
+    #
+    #  specifically, if we made an inline call to
+    #
+    #      AutoPointerTestHelper.method(:release).to_proc
+    #
+    #  we'd have a reference to the pointer and it would
+    #  never get GC'd.
+    expect(AutoPointerTestHelper).to receive(:release).at_least(loop_count-wiggle_room).times
+    AutoPointerTestHelper.reset
+    loop_count.times do
+      FFI::AutoPointer.new(PointerTestLib.ptr_from_address(magic),
+                           AutoPointerTestHelper.finalizer)
+    end
+    AutoPointerTestHelper.gc_everything loop_count
+  end
+
+  # see #427
+  it "cleanup when passed a method", :broken => true do
+    expect(AutoPointerTestHelper).to receive(:release).at_least(loop_count-wiggle_room).times
+    AutoPointerTestHelper.reset
+    loop_count.times do
+      FFI::AutoPointer.new(PointerTestLib.ptr_from_address(magic),
+                           AutoPointerTestHelper.method(:release))
+    end
+    AutoPointerTestHelper.gc_everything loop_count
+  end
+
+  it "can be used as the return type of a function" do
+    expect do
+      Module.new do
+        extend FFI::Library
+        ffi_lib TestLibrary::PATH
+        class CustomAutoPointer < FFI::AutoPointer
+          def self.release(ptr); end
+        end
+        attach_function :ptr_from_address, [ FFI::Platform::ADDRESS_SIZE == 32 ? :uint : :ulong_long ], CustomAutoPointer
+      end
+    end.not_to raise_error
+  end
+
+  describe "#new" do
+    it "MemoryPointer argument raises TypeError" do
+      expect { FFI::AutoPointer.new(FFI::MemoryPointer.new(:int))}.to raise_error(::TypeError)
+    end
+    it "AutoPointer argument raises TypeError" do
+      expect { AutoPointerSubclass.new(AutoPointerSubclass.new(PointerTestLib.ptr_from_address(0))) }.to raise_error(::TypeError)
+    end
+    it "Buffer argument raises TypeError" do
+      expect { FFI::AutoPointer.new(FFI::Buffer.new(:int))}.to raise_error(::TypeError)
+    end
+
+  end
+
+  describe "#autorelease?" do
+    ptr_class = Class.new(FFI::AutoPointer) do
+      def self.release(ptr); end
+    end
+
+    it "should be true by default" do
+      expect(ptr_class.new(FFI::Pointer.new(0xdeadbeef)).autorelease?).to be true
+    end
+
+    it "should return false when autorelease=(false)" do
+      ptr = ptr_class.new(FFI::Pointer.new(0xdeadbeef))
+      ptr.autorelease = false
+      expect(ptr.autorelease?).to be false
+    end
+  end
+
+  describe "#type_size" do
+    ptr_class = Class.new(FFI::AutoPointer) do
+      def self.release(ptr); end
+    end
+
+    it "type_size of AutoPointer should match wrapped Pointer" do
+      aptr = ptr_class.new(FFI::Pointer.new(:int, 0xdeadbeef))
+      expect(aptr.type_size).to eq(FFI.type_size(:int))
+    end
+    
+    it "[] offset should match wrapped Pointer" do
+      mptr = FFI::MemoryPointer.new(:int, 1024)
+      aptr = ptr_class.new(FFI::Pointer.new(:int, mptr))
+      aptr[0].write_uint(0xfee1dead)
+      aptr[1].write_uint(0xcafebabe)
+      expect(mptr[0].read_uint).to eq(0xfee1dead)
+      expect(mptr[1].read_uint).to eq(0xcafebabe)
+    end
+  end
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/attach_function_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/attach_function_spec.rb
new file mode 100644
index 0000000..7593662
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/attach_function_spec.rb
@@ -0,0 +1,34 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+unless FFI::Platform.windows?
+  class Timeval < FFI::Struct
+    layout :tv_sec, :ulong, 0, :tv_usec, :ulong, 4
+  end
+
+  module LibC
+    extend FFI::Library
+    ffi_lib FFI::Library::LIBC
+
+    attach_function :gettimeofday, [:pointer, :pointer], :int
+  end
+
+  describe FFI::Library, "#attach_function" do
+    it "correctly returns a value for gettimeofday" do
+      t = Timeval.new
+      time = LibC.gettimeofday(t.pointer, nil)
+      expect(time).to be_kind_of(Integer)
+    end
+
+    it "correctly populates a struct for gettimeofday" do
+      t = Timeval.new
+      LibC.gettimeofday(t.pointer, nil)
+      expect(t[:tv_sec]).to be_kind_of(Numeric)
+      expect(t[:tv_usec]).to be_kind_of(Numeric)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/memory_pointer_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/memory_pointer_spec.rb
new file mode 100644
index 0000000..a869d8c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/memory_pointer_spec.rb
@@ -0,0 +1,194 @@
+# coding: utf-8
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+module CTest
+  extend FFI::Library
+  ffi_lib FFI::Library::LIBC
+
+  attach_function :strcat, [:pointer, :pointer], :pointer
+end
+
+describe "MemoryPointer" do
+  it "makes a pointer from a string" do
+    m = FFI::MemoryPointer.from_string("FFI is Awesome")
+    expect(m.total).to eq(15)
+    expect(m.type_size).to eq(1)
+  end
+
+  it "does not make a pointer from non-strings" do
+    expect { FFI::MemoryPointer.from_string(nil) }.to raise_error(TypeError)
+  end
+
+  it "makes a pointer from a string with multibyte characters" do
+    m = FFI::MemoryPointer.from_string("ぱんだ")
+    expect(m.total).to eq(10)
+    expect(m.type_size).to eq(1)
+  end
+
+  it "reads back a string" do
+    m = FFI::MemoryPointer.from_string("FFI is Awesome")
+    expect(m.read_string).to eq("FFI is Awesome")
+  end
+  
+  it "makes a pointer for a certain number of bytes" do
+    m = FFI::MemoryPointer.new(8)
+    m.write_array_of_int([1,2])
+    expect(m.read_array_of_int(2)).to eq([1,2])
+  end
+
+  it "allows access to an element of the pointer (as an array)" do
+    m = FFI::MemoryPointer.new(:int, 2)
+    m.write_array_of_int([1,2])
+    expect(m[0].read_int).to eq(1)
+    expect(m[1].read_int).to eq(2)
+  end
+  
+  it "allows writing as an int" do
+    m = FFI::MemoryPointer.new(:int)
+    m.write_int(1)
+    expect(m.read_int).to eq(1)
+    expect(m.read :int).to eq(1)
+    expect(m.read FFI::Type::INT).to eq(1)
+  end
+
+  it "allows writing as a sized int" do
+    m = FFI::MemoryPointer.new(:uint32)
+    m.write_uint32(1)
+    expect(m.read_uint32).to eq(1)
+    expect(m.read :uint32).to eq(1)
+    expect(m.read FFI::Type::UINT32).to eq(1)
+
+    m = FFI::MemoryPointer.new(:uint32)
+    m.write :uint32, 1
+    expect(m.read :uint32).to eq(1)
+
+    m = FFI::MemoryPointer.new(:int64)
+    m.write_int64(1)
+    expect(m.read_int64).to eq(1)
+    expect(m.read :int64).to eq(1)
+    expect(m.read FFI::Type::INT64).to eq(1)
+
+    m = FFI::MemoryPointer.new(:int64)
+    m.write :int64, 1
+    expect(m.read :int64).to eq(1)
+  end
+
+  it "allows writing as a long" do
+    m = FFI::MemoryPointer.new(:long)
+    m.write_long(10)
+    expect(m.read_long).to eq(10)
+    expect(m.read :long).to eq(10)
+    expect(m.read FFI::Type::LONG).to eq(10)
+
+    m.write :long, 10
+    expect(m.read :long).to eq(10)
+  end
+
+  it "allows writing as a size_t" do
+    m = FFI::MemoryPointer.new(:size_t)
+    m.write(:size_t, 10)
+    expect(m.read :size_t).to eq(10)
+  end
+
+  it "allows writing as a bool" do
+    m = FFI::MemoryPointer.new(:bool)
+    m.write(:bool, true)
+    expect(m.read :bool).to eq(true)
+    expect(m.read FFI::Type::BOOL).to eq(true)
+
+    m.write(:bool, false)
+    expect(m.read :bool).to eq(false)
+    expect(m.read FFI::Type::BOOL).to eq(false)
+  end
+
+  it "allows writing a custom typedef" do
+    FFI.typedef :uint, :fubar_t
+    FFI.typedef :size_t, :fubar2_t
+
+    m = FFI::MemoryPointer.new(:fubar_t)
+    m.write(:fubar_t, 10)
+    expect(m.read :fubar_t).to eq(10)
+
+    m = FFI::MemoryPointer.new(:fubar2_t)
+    m.write(:fubar2_t, 10)
+    expect(m.read :fubar2_t).to eq(10)
+  end
+
+  it "raises an error if you try to read an undefined type" do
+    m = FFI::MemoryPointer.new(:long)
+    expect { m.read(:undefined_type) }.to raise_error(ArgumentError)
+  end
+  
+  it "raises an error if you try putting a long into a pointer of size 1" do
+    m = FFI::MemoryPointer.new(1)
+    expect { m.write_long(10) }.to raise_error
+  end
+  
+  it "raises an error if you try putting an int into a pointer of size 1" do
+    m = FFI::MemoryPointer.new(1)
+    expect { m.write_int(10) }.to raise_error
+  end
+#  it "does not raise IndexError for opaque pointers" do
+#    m = FFI::MemoryPointer.new(8)
+#    p2 = FFI::MemoryPointer.new(1024)
+#    m.write_long(p2.address)
+#    p = m.read_pointer
+#    lambda { p.write_int(10) }.should_not raise_error
+#  end
+  
+  it "makes a pointer for a certain type" do
+    m = FFI::MemoryPointer.new(:int)
+    m.write_int(10)
+    expect(m.read_int).to eq(10)
+  end
+  
+  it "makes a memory pointer for a number of a certain type" do
+    m = FFI::MemoryPointer.new(:int, 2)
+    m.write_array_of_int([1,2])
+    expect(m.read_array_of_int(2)).to eq([1,2])
+  end
+  
+  it "makes a pointer for an object responding to #size" do
+    m = FFI::MemoryPointer.new(Struct.new(:size).new(8))
+    m.write_array_of_int([1,2])
+    expect(m.read_array_of_int(2)).to eq([1,2])
+  end
+
+  it "makes a pointer for a number of an object responding to #size" do
+    m = FFI::MemoryPointer.new(Struct.new(:size).new(4), 2)
+    m.write_array_of_int([1,2])
+    expect(m.read_array_of_int(2)).to eq([1,2])
+  end  
+
+  it "MemoryPointer#address returns correct value" do
+    m = FFI::MemoryPointer.new(:long_long)
+    magic = 0x12345678
+    m.write_long(magic)
+    expect(m.read_pointer.address).to eq(magic)
+  end
+
+  it "MemoryPointer#null? returns true for zero value" do
+    m = FFI::MemoryPointer.new(:long_long)
+    m.write_long(0)    
+    expect(m.read_pointer.null?).to be true
+  end
+
+  it "MemoryPointer#null? returns false for non-zero value" do
+    m = FFI::MemoryPointer.new(:long_long)
+    m.write_long(0x12345678)
+    expect(m.read_pointer.null?).to be false
+  end
+  
+  it "initialize with block should execute block" do
+    block_executed = false
+    FFI::MemoryPointer.new(:pointer) do |ptr|
+      block_executed = true
+    end
+    expect(block_executed).to be true
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/spec_helper.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/spec_helper.rb
new file mode 100644
index 0000000..6e009d8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/spec_helper.rb
@@ -0,0 +1,6 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "../spec_helper"))
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/struct_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/struct_spec.rb
new file mode 100644
index 0000000..a7ed85b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/rbx/struct_spec.rb
@@ -0,0 +1,18 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+class Timeval < FFI::Struct
+  layout :tv_sec, :ulong, 0, :tv_usec, :ulong, 4  
+end
+
+describe FFI::Struct do
+  it "allows setting fields" do
+    t = Timeval.new
+    t[:tv_sec] = 12
+    expect(t[:tv_sec]).to eq(12)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/spec_helper.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/spec_helper.rb
new file mode 100644
index 0000000..0c173e4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/spec_helper.rb
@@ -0,0 +1,93 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require 'rbconfig'
+require 'fileutils'
+require 'ffi'
+
+RSpec.configure do |c|
+  c.filter_run_excluding :broken => true
+end
+
+CPU = case RbConfig::CONFIG['host_cpu'].downcase
+  when /i[3456]86/
+    # Darwin always reports i686, even when running in 64bit mode
+    if RbConfig::CONFIG['host_os'] =~ /darwin/ && 0xfee1deadbeef.is_a?(Fixnum)
+      "x86_64"
+    else
+      "i386"
+    end
+
+  when /amd64|x86_64/
+    "x86_64"
+
+  when /ppc64|powerpc64/
+    "powerpc64"
+
+  when /ppc|powerpc/
+    "powerpc"
+
+  when /^arm/
+    "arm"
+
+  else
+    RbConfig::CONFIG['host_cpu']
+  end
+
+OS = case RbConfig::CONFIG['host_os'].downcase
+  when /linux/
+    "linux"
+  when /darwin/
+    "darwin"
+  when /freebsd/
+    "freebsd"
+  when /openbsd/
+    "openbsd"
+  when /sunos|solaris/
+    "solaris"
+  when /mswin|mingw/
+    "win32"
+  else
+    RbConfig::CONFIG['host_os'].downcase
+  end
+
+def compile_library(path, lib)
+
+  dir = File.expand_path(path, File.dirname(__FILE__))
+  lib = "#{dir}/#{lib}"
+  if !File.exist?(lib)
+    output = nil
+    FileUtils.cd(dir) do
+      output = system(*%{#{system('which gmake >/dev/null') && 'gmake' || 'make'} CPU=#{CPU} OS=#{OS} }.tap{|x| puts x.inspect})
+    end
+
+    if $?.exitstatus != 0
+      puts "ERROR:\n#{output}"
+      raise "Unable to compile \"#{lib}\""
+    end
+  end
+
+  lib
+end
+
+require "ffi"
+
+module TestLibrary
+  PATH = compile_library("fixtures", "libtest.#{FFI::Platform::LIBSUFFIX}")
+
+  def self.force_gc
+    if RUBY_PLATFORM =~ /java/
+      java.lang.System.gc
+    elsif defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
+      GC.run(true)
+    else
+      GC.start
+    end
+  end
+end
+module LibTest
+  extend FFI::Library
+  ffi_lib TestLibrary::PATH
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/string_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/string_spec.rb
new file mode 100644
index 0000000..fac11f0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/string_spec.rb
@@ -0,0 +1,118 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+describe "String tests" do
+  include FFI
+  module StrLibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    attach_function :ptr_ret_pointer, [ :pointer, :int], :string
+    attach_function :string_equals, [ :string, :string ], :int
+    attach_function :string_dummy, [ :string ], :void
+    attach_function :string_null, [ ], :string
+  end
+
+  it "MemoryPointer#get_string returns a tainted string" do
+    mp = FFI::MemoryPointer.new 1024
+    mp.put_string(0, "test\0")
+    str = mp.get_string(0)
+    expect(str.tainted?).to be true
+  end
+
+  it "String returned by a method is tainted" do
+    mp = FFI::MemoryPointer.new :pointer
+    sp = FFI::MemoryPointer.new 1024
+    sp.put_string(0, "test")
+    mp.put_pointer(0, sp)
+    str = StrLibTest.ptr_ret_pointer(mp, 0)
+    expect(str).to eq("test")
+    expect(str).to be_tainted
+  end
+
+  it "Poison null byte raises error" do
+    s = "123\0abc"
+    expect { StrLibTest.string_equals(s, s) }.to raise_error
+  end
+
+  it "Tainted String parameter should throw a SecurityError" do
+    $SAFE = 1
+    str = "test"
+    str.taint
+    begin
+      expect(LibTest.string_equals(str, str)).to be false
+    rescue SecurityError
+    end
+  end if false
+  it "casts nil as NULL pointer" do
+    expect(StrLibTest.string_dummy(nil)).to be_nil
+  end
+
+  it "return nil for NULL char*" do
+    expect(StrLibTest.string_null).to be_nil
+  end
+
+  it "reads an array of strings until encountering a NULL pointer" do
+    strings = ["foo", "bar", "baz", "testing", "ffi"]
+    ptrary = FFI::MemoryPointer.new(:pointer, 6)
+    ary = strings.inject([]) do |a, str|
+      f = FFI::MemoryPointer.new(1024)
+      f.put_string(0, str)
+      a << f
+    end
+    ary.insert(3, nil)
+    ptrary.write_array_of_pointer(ary)
+    expect(ptrary.get_array_of_string(0)).to eq(["foo", "bar", "baz"])
+  end
+
+  it "reads an array of strings of the size specified, substituting nil when a pointer is NULL" do
+    strings = ["foo", "bar", "baz", "testing", "ffi"]
+    ptrary = FFI::MemoryPointer.new(:pointer, 6)
+    ary = strings.inject([]) do |a, str|
+      f = FFI::MemoryPointer.new(1024)
+      f.put_string(0, str)
+      a << f
+    end
+    ary.insert(2, nil)
+    ptrary.write_array_of_pointer(ary)
+    expect(ptrary.get_array_of_string(0, 4)).to eq(["foo", "bar", nil, "baz"])
+  end
+
+  it "reads an array of strings, taking a memory offset parameter" do
+    strings = ["foo", "bar", "baz", "testing", "ffi"]
+    ptrary = FFI::MemoryPointer.new(:pointer, 5)
+    ary = strings.inject([]) do |a, str|
+      f = FFI::MemoryPointer.new(1024)
+      f.put_string(0, str)
+      a << f
+    end
+    ptrary.write_array_of_pointer(ary)
+    expect(ptrary.get_array_of_string(2 * FFI.type_size(:pointer), 3)).to eq(["baz", "testing", "ffi"])
+  end
+
+  it "raises an IndexError when trying to read an array of strings out of bounds" do
+    strings = ["foo", "bar", "baz", "testing", "ffi"]
+    ptrary = FFI::MemoryPointer.new(:pointer, 5)
+    ary = strings.inject([]) do |a, str|
+      f = FFI::MemoryPointer.new(1024)
+      f.put_string(0, str)
+      a << f
+    end
+    ptrary.write_array_of_pointer(ary)
+    expect { ptrary.get_array_of_string(0, 6) }.to raise_error
+  end
+
+  it "raises an IndexError when trying to read an array of strings using a negative offset" do
+    strings = ["foo", "bar", "baz", "testing", "ffi"]
+    ptrary = FFI::MemoryPointer.new(:pointer, 5)
+    ary = strings.inject([]) do |a, str|
+      f = FFI::MemoryPointer.new(1024)
+      f.put_string(0, str)
+      a << f
+    end
+    ptrary.write_array_of_pointer(ary)
+    expect { ptrary.get_array_of_string(-1) }.to raise_error
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/strptr_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/strptr_spec.rb
new file mode 100644
index 0000000..a6400f4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/strptr_spec.rb
@@ -0,0 +1,50 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "functions returning :strptr" do
+
+  it "can attach function with :strptr return type" do
+    expect do
+      Module.new do
+        extend FFI::Library
+        ffi_lib FFI::Library::LIBC
+        if !FFI::Platform.windows?
+          attach_function :strdup, [ :string ], :strptr
+        else
+          attach_function :_strdup, [ :string ], :strptr
+        end
+      end
+    end.not_to raise_error
+  end
+
+  module StrPtr
+    extend FFI::Library
+    ffi_lib FFI::Library::LIBC
+    attach_function :free, [ :pointer ], :void
+    if !FFI::Platform.windows?
+      attach_function :strdup, [ :string ], :strptr
+    else
+      attach_function :strdup, :_strdup, [ :string ], :strptr
+    end
+  end
+
+  it "should return [ String, Pointer ]" do
+    result = StrPtr.strdup("test")
+    expect(result[0].is_a?(String)).to be true
+    expect(result[1].is_a?(FFI::Pointer)).to be true
+  end
+
+  it "should return the correct value" do
+    result = StrPtr.strdup("test")
+    expect(result[0]).to eq("test")
+  end
+
+  it "should return non-NULL pointer" do
+    result = StrPtr.strdup("test")
+    expect(result[1]).not_to be_null
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_by_ref_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_by_ref_spec.rb
new file mode 100644
index 0000000..0858423
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_by_ref_spec.rb
@@ -0,0 +1,43 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe FFI::Struct, ' by_ref' do
+  before :all do
+    @struct_class = struct_class = Class.new(FFI::Struct) do
+      layout :a, :pointer
+    end
+
+    @api = Module.new do
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      fn = FFI::Type::POINTER.size == FFI::Type::LONG.size ? :ret_ulong : :ret_u64
+      attach_function :struct_test, fn, [ struct_class.by_ref ], :pointer
+    end
+  end
+
+  it "should accept instances of exact struct class" do
+    s = @struct_class.new
+    expect(@api.struct_test(s)).to eq(s.pointer)
+  end
+
+  it "should accept nil" do
+    expect(@api.struct_test(nil)).to be_null
+  end
+
+  it "should reject other types" do
+    expect { expect(@api.struct_test('test')).to be_nil }.to raise_error(TypeError)
+  end
+
+  it "should reject instances of other struct classes" do
+    other_class = Class.new(FFI::Struct) do
+      layout :a, :pointer
+    end
+
+    expect { @api.struct_test(other_class.new) }.to raise_error(TypeError)
+  end
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_callback_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_callback_spec.rb
new file mode 100644
index 0000000..7cab301
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_callback_spec.rb
@@ -0,0 +1,69 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe FFI::Struct, ' with inline callback functions' do
+  it 'should be able to define inline callback field' do
+    expect(module CallbackMember1
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      DUMMY_CB = callback :dummy_cb, [ :int ], :int
+      class TestStruct < FFI::Struct
+        layout \
+          :add, callback([ :int, :int ], :int),
+          :sub, callback([ :int, :int ], :int),
+          :cb_with_cb_parameter, callback([ DUMMY_CB, :int ], :int)
+      end
+      attach_function :struct_call_add_cb, [TestStruct, :int, :int], :int
+      attach_function :struct_call_sub_cb, [TestStruct, :int, :int], :int
+    end).to be_an_instance_of FFI::Function
+  end
+
+  it 'should take methods as callbacks' do
+    module CallbackMember2
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      class TestStruct < FFI::Struct
+        layout \
+          :add, callback([ :int, :int ], :int),
+          :sub, callback([ :int, :int ], :int)
+      end
+      attach_function :struct_call_add_cb, [TestStruct, :int, :int], :int
+      attach_function :struct_call_sub_cb, [TestStruct, :int, :int], :int
+    end
+    module StructCallbacks
+      def self.add a, b
+        a+b
+      end
+    end
+
+    ts = CallbackMember2::TestStruct.new
+    ts[:add] = StructCallbacks.method(:add)
+
+    expect(CallbackMember2.struct_call_add_cb(ts, 1, 2)).to eq(3)
+  end
+
+  it 'should return callable object from []' do
+    module CallbackMember3
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      class TestStruct < FFI::Struct
+        layout \
+          :add, callback([ :int, :int ], :int),
+          :sub, callback([ :int, :int ], :int)
+      end
+      attach_function :struct_call_add_cb, [TestStruct, :int, :int], :int
+      attach_function :struct_call_sub_cb, [TestStruct, :int, :int], :int
+    end
+
+    s = CallbackMember3::TestStruct.new
+    add = Proc.new { |a,b| a+b}
+    s[:add] = add
+    fn = s[:add]
+    expect(fn.respond_to?(:call)).to be true
+    expect(fn.call(1, 2)).to eq(3)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_initialize_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_initialize_spec.rb
new file mode 100644
index 0000000..beb2477
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_initialize_spec.rb
@@ -0,0 +1,35 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe FFI::Struct, ' with an initialize function' do
+  it "should call the initialize function" do
+    class StructWithInitialize < FFI::Struct
+      layout :string, :string
+      attr_accessor :magic
+      def initialize
+        super
+        self.magic = 42
+      end
+    end
+    expect(StructWithInitialize.new.magic).to eq(42)
+  end
+end
+
+describe FFI::ManagedStruct, ' with an initialize function' do
+  it "should call the initialize function" do
+    class ManagedStructWithInitialize < FFI::ManagedStruct
+      layout :string, :string
+      attr_accessor :magic
+      def initialize
+        super FFI::MemoryPointer.new(:pointer).put_int(0, 0x1234).get_pointer(0)
+        self.magic = 42
+      end
+      def self.release;end
+    end
+    expect(ManagedStructWithInitialize.new.magic).to eq(42)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_packed_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_packed_spec.rb
new file mode 100644
index 0000000..8132be7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_packed_spec.rb
@@ -0,0 +1,50 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe FFI::Struct do
+  it "packed :char followed by :int should have size of 5" do
+    expect(Class.new(FFI::Struct) do
+      packed
+      layout :c, :char, :i, :int
+    end.size).to eq(5)
+  end
+
+  it "packed :char followed by :int should have alignment of 1" do
+    expect(Class.new(FFI::Struct) do
+      packed
+      layout :c, :char, :i, :int
+    end.alignment).to eq(1)
+  end
+
+  it "packed(2) :char followed by :int should have size of 6" do
+    expect(Class.new(FFI::Struct) do
+      packed 2
+      layout :c, :char, :i, :int
+    end.size).to eq(6)
+  end
+
+  it "packed(2)  :char followed by :int should have alignment of 2" do
+    expect(Class.new(FFI::Struct) do
+      packed 2
+      layout :c, :char, :i, :int
+    end.alignment).to eq(2)
+  end
+
+  it "packed :short followed by int should have size of 6" do
+    expect(Class.new(FFI::Struct) do
+      packed
+      layout :s, :short, :i, :int
+    end.size).to eq(6)
+  end
+
+  it "packed :short followed by int should have alignment of 1" do
+    expect(Class.new(FFI::Struct) do
+      packed
+      layout :s, :short, :i, :int
+    end.alignment).to eq(1)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_spec.rb
new file mode 100644
index 0000000..9110d92
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/struct_spec.rb
@@ -0,0 +1,886 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "Struct aligns fields correctly" do
+  it "char, followed by an int" do
+    pending("not supported in 1.8") if RUBY_VERSION =~ /^1\.8\..*/
+    class CIStruct < FFI::Struct
+      layout :c => :char, :i => :int
+    end
+    expect(CIStruct.size).to eq(8)
+  end
+
+  it "short, followed by an int" do
+    pending("not supported in 1.8") if RUBY_VERSION =~ /^1\.8\..*/
+    class SIStruct < FFI::Struct
+      layout :s => :short, :i => :int
+    end
+    expect(SIStruct.size).to eq(8)
+  end
+
+  it "int, followed by an int" do
+    pending("not supported in 1.8") if RUBY_VERSION =~ /^1\.8\..*/
+    class IIStruct < FFI::Struct
+      layout :i1 => :int, :i => :int
+    end
+    expect(IIStruct.size).to eq(8)
+  end
+
+  it "long long, followed by an int" do
+    pending("not supported in 1.8") if RUBY_VERSION =~ /^1\.8\..*/
+    class LLIStruct < FFI::Struct
+      layout :l => :long_long, :i => :int
+    end
+    expect(LLIStruct.size).to eq(FFI::TYPE_UINT64.alignment == 4 ? 12 : 16)
+  end
+end
+
+describe "Struct tests" do
+  StructTypes = {
+    's8' => :char,
+    's16' => :short,
+    's32' => :int,
+    's64' => :long_long,
+    'long' => :long,
+    'f32' => :float,
+    'f64' => :double
+  }
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    attach_function :ptr_ret_pointer, [ :pointer, :int], :string
+    begin
+      attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int
+    rescue FFI::NotFoundError
+      # NetBSD uses #define instead of typedef for these
+      attach_function :ptr_ret_int32_t, :ptr_ret___int32_t, [ :pointer, :int ], :int
+    end
+    attach_function :ptr_from_address, [ :ulong ], :pointer
+    attach_function :string_equals, [ :string, :string ], :int
+    [ 's8', 's16', 's32', 's64', 'f32', 'f64', 'long' ].each do |t|
+      attach_function "struct_align_#{t}", [ :pointer ], StructTypes[t]
+    end
+  end
+  class PointerMember < FFI::Struct
+    layout :pointer, :pointer
+  end
+  class StringMember < FFI::Struct
+    layout :string, :string
+  end
+
+  it "Struct#[:pointer]" do
+    magic = 0x12345678
+    mp = FFI::MemoryPointer.new :long
+    mp.put_long(0, magic)
+    smp = FFI::MemoryPointer.new :pointer
+    smp.put_pointer(0, mp)
+    s = PointerMember.new smp
+    expect(s[:pointer]).to eq(mp)
+  end
+
+  it "Struct#[:pointer].nil? for NULL value" do
+    magic = 0x12345678
+    mp = FFI::MemoryPointer.new :long
+    mp.put_long(0, magic)
+    smp = FFI::MemoryPointer.new :pointer
+    smp.put_pointer(0, nil)
+    s = PointerMember.new smp
+    expect(s[:pointer].null?).to be true
+  end
+
+  it "Struct#[:pointer]=" do
+    magic = 0x12345678
+    mp = FFI::MemoryPointer.new :long
+    mp.put_long(0, magic)
+    smp = FFI::MemoryPointer.new :pointer
+    s = PointerMember.new smp
+    s[:pointer] = mp
+    expect(smp.get_pointer(0)).to eq(mp)
+  end
+
+  it "Struct#[:pointer]=struct" do
+    smp = FFI::MemoryPointer.new :pointer
+    s = PointerMember.new smp
+    expect { s[:pointer] = s }.not_to raise_error Exception
+    expect { s[:pointer].nil? }.not_to raise_error Exception
+  end
+
+  it "Struct#[:pointer]=nil" do
+    smp = FFI::MemoryPointer.new :pointer
+    s = PointerMember.new smp
+    s[:pointer] = nil
+    expect(smp.get_pointer(0)).to be_null
+  end
+
+  it "Struct#[:string]" do
+    magic = "test"
+    mp = FFI::MemoryPointer.new 1024
+    mp.put_string(0, magic)
+    smp = FFI::MemoryPointer.new :pointer
+    smp.put_pointer(0, mp)
+    s = StringMember.new smp
+    expect(s[:string]).to eq(magic)
+  end
+
+  it "Struct#[:string].nil? for NULL value" do
+    smp = FFI::MemoryPointer.new :pointer
+    smp.put_pointer(0, nil)
+    s = StringMember.new smp
+    expect(s[:string]).to be_nil
+  end
+
+  it "Struct#layout works with :name, :type pairs" do
+    class PairLayout < FFI::Struct
+      layout :a, :int, :b, :long_long
+    end
+    ll_off = (FFI::TYPE_UINT64.alignment == 4 ? 4 : 8)
+    expect(PairLayout.size).to eq((ll_off + 8))
+    mp = FFI::MemoryPointer.new(PairLayout.size)
+    s = PairLayout.new mp
+    s[:a] = 0x12345678
+    expect(mp.get_int(0)).to eq(0x12345678)
+    s[:b] = 0xfee1deadbeef
+    expect(mp.get_int64(ll_off)).to eq(0xfee1deadbeef)
+  end
+
+  it "Struct#layout works with :name, :type, offset tuples" do
+    class PairLayout < FFI::Struct
+      layout :a, :int, 0, :b, :long_long, 4
+    end
+    expect(PairLayout.size).to eq((FFI::TYPE_UINT64.alignment == 4 ? 12 : 16))
+    mp = FFI::MemoryPointer.new(PairLayout.size)
+    s = PairLayout.new mp
+    s[:a] = 0x12345678
+    expect(mp.get_int(0)).to eq(0x12345678)
+    s[:b] = 0xfee1deadbeef
+    expect(mp.get_int64(4)).to eq(0xfee1deadbeef)
+  end
+
+  it "Struct#layout works with mixed :name,:type and :name,:type,offset" do
+    class MixedLayout < FFI::Struct
+      layout :a, :int, :b, :long_long, 4
+    end
+    expect(MixedLayout.size).to eq((FFI::TYPE_UINT64.alignment == 4 ? 12 : 16))
+    mp = FFI::MemoryPointer.new(MixedLayout.size)
+    s = MixedLayout.new mp
+    s[:a] = 0x12345678
+    expect(mp.get_int(0)).to eq(0x12345678)
+    s[:b] = 0xfee1deadbeef
+    expect(mp.get_int64(4)).to eq(0xfee1deadbeef)
+  end
+
+  rb_maj, rb_min = RUBY_VERSION.split('.')
+  if rb_maj.to_i >= 1 && rb_min.to_i >= 9 || RUBY_PLATFORM =~ /java/
+    it "Struct#layout withs with a hash of :name => type" do
+      class HashLayout < FFI::Struct
+        layout :a => :int, :b => :long_long
+      end
+      ll_off = (FFI::TYPE_UINT64.alignment == 4 ? 4 : 8)
+      expect(HashLayout.size).to eq(ll_off + 8)
+      mp = FFI::MemoryPointer.new(HashLayout.size)
+      s = HashLayout.new mp
+      s[:a] = 0x12345678
+      expect(mp.get_int(0)).to eq(0x12345678)
+      s[:b] = 0xfee1deadbeef
+      expect(mp.get_int64(ll_off)).to eq(0xfee1deadbeef)
+    end
+  end
+
+  it "subclass overrides initialize without calling super" do
+    class InitializeWithoutSuper < FFI::Struct
+      layout :a, :int, :b, :long_long, :d, [:double, 2]
+
+      def initialize(a, b)
+        self[:a] = a
+        self[:b] = b
+        self[:d][0] = 1.2
+        self[:d][1] = 3.4
+      end
+
+    end
+    s = InitializeWithoutSuper.new(0x1eefbeef, 0xdeadcafebabe)
+    expect(s[:a]).to eq(0x1eefbeef)
+    expect(s[:b]).to eq(0xdeadcafebabe)
+  end
+
+  it "Can use Struct subclass as parameter type" do
+    expect(module StructParam
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      class TestStruct < FFI::Struct
+        layout :c, :char
+      end
+      attach_function :struct_field_s8, [ TestStruct.in ], :char
+    end).to be_an_instance_of FFI::Function
+  end
+
+  it "Can use Struct subclass as IN parameter type" do
+    expect(module StructParam2
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      class TestStruct < FFI::Struct
+        layout :c, :char
+      end
+      attach_function :struct_field_s8, [ TestStruct.in ], :char
+    end).to be_an_instance_of FFI::Function
+  end
+
+  it "Can use Struct subclass as OUT parameter type" do
+    expect(module StructParam3
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      class TestStruct < FFI::Struct
+        layout :c, :char
+      end
+      attach_function :struct_field_s8, [ TestStruct.out ], :char
+    end).to be_an_instance_of FFI::Function
+  end
+
+  it "can be passed directly as a :pointer parameter" do
+    class TestStruct < FFI::Struct
+      layout :i, :int
+    end
+    s = TestStruct.new
+    s[:i] = 0x12
+    expect(LibTest.ptr_ret_int32_t(s, 0)).to eq(0x12)
+  end
+
+  it ":char member aligned correctly" do
+    class AlignChar < FFI::Struct
+      layout :c, :char, :v, :char
+    end
+    s = AlignChar.new
+    s[:v] = 0x12
+    expect(LibTest.struct_align_s8(s.pointer)).to eq(0x12)
+  end
+
+  it ":short member aligned correctly" do
+    class AlignShort < FFI::Struct
+      layout :c, :char, :v, :short
+    end
+    s = AlignShort.alloc_in
+    s[:v] = 0x1234
+    expect(LibTest.struct_align_s16(s.pointer)).to eq(0x1234)
+  end
+
+  it ":int member aligned correctly" do
+    class AlignInt < FFI::Struct
+      layout :c, :char, :v, :int
+    end
+    s = AlignInt.alloc_in
+    s[:v] = 0x12345678
+    expect(LibTest.struct_align_s32(s.pointer)).to eq(0x12345678)
+  end
+
+  it ":long_long member aligned correctly" do
+    class AlignLongLong < FFI::Struct
+      layout :c, :char, :v, :long_long
+    end
+    s = AlignLongLong.alloc_in
+    s[:v] = 0x123456789abcdef0
+    expect(LibTest.struct_align_s64(s.pointer)).to eq(0x123456789abcdef0)
+  end
+
+  it ":long member aligned correctly" do
+    class AlignLong < FFI::Struct
+      layout :c, :char, :v, :long
+    end
+    s = AlignLong.alloc_in
+    s[:v] = 0x12345678
+    expect(LibTest.struct_align_long(s.pointer)).to eq(0x12345678)
+  end
+
+  it ":float member aligned correctly" do
+    class AlignFloat < FFI::Struct
+      layout :c, :char, :v, :float
+    end
+    s = AlignFloat.alloc_in
+    s[:v] = 1.23456
+    expect((LibTest.struct_align_f32(s.pointer) - 1.23456).abs).to be < 0.00001
+  end
+
+  it ":double member aligned correctly" do
+    class AlignDouble < FFI::Struct
+      layout :c, :char, :v, :double
+    end
+    s = AlignDouble.alloc_in
+    s[:v] = 1.23456789
+    expect((LibTest.struct_align_f64(s.pointer) - 1.23456789).abs).to be < 0.00000001
+  end
+
+  it ":ulong, :pointer struct" do
+    class ULPStruct < FFI::Struct
+      layout :ul, :ulong, :p, :pointer
+    end
+    s = ULPStruct.alloc_in
+    s[:ul] = 0xdeadbeef
+    s[:p] = LibTest.ptr_from_address(0x12345678)
+    expect(s.pointer.get_ulong(0)).to eq(0xdeadbeef)
+  end
+  def test_num_field(type, v)
+    klass = Class.new(FFI::Struct)
+    klass.layout :v, type, :dummy, :long
+
+    s = klass.new
+    s[:v] = v
+    expect(s.pointer.send("get_#{type.to_s}", 0)).to eq(v)
+    s.pointer.send("put_#{type.to_s}", 0, 0)
+    expect(s[:v]).to eq(0)
+  end
+  def self.int_field_test(type, values)
+    values.each do |v|
+      it "#{type} field r/w (#{v.to_s(16)})" do
+        test_num_field(type, v)
+      end
+    end
+  end
+  int_field_test(:char, [ 0, 127, -128, -1 ])
+  int_field_test(:uchar, [ 0, 0x7f, 0x80, 0xff ])
+  int_field_test(:short, [ 0, 0x7fff, -0x8000, -1 ])
+  int_field_test(:ushort, [ 0, 0x7fff, 0x8000, 0xffff ])
+  int_field_test(:int, [ 0, 0x7fffffff, -0x80000000, -1 ])
+  int_field_test(:uint, [ 0, 0x7fffffff, 0x80000000, 0xffffffff ])
+  int_field_test(:long_long, [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ])
+  int_field_test(:ulong_long, [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ])
+  if FFI::Platform::LONG_SIZE == 32
+    int_field_test(:long, [ 0, 0x7fffffff, -0x80000000, -1 ])
+    int_field_test(:ulong, [ 0, 0x7fffffff, 0x80000000, 0xffffffff ])
+  else
+    int_field_test(:long, [ 0, 0x7fffffffffffffff, -0x8000000000000000, -1 ])
+    int_field_test(:ulong, [ 0, 0x7fffffffffffffff, 0x8000000000000000, 0xffffffffffffffff ])
+  end
+
+  it ":float field r/w" do
+    klass = Class.new(FFI::Struct)
+    klass.layout :v, :float, :dummy, :long
+
+    s = klass.new
+    value = 1.23456
+    s[:v] = value
+    expect((s.pointer.get_float(0) - value).abs).to be < 0.0001
+  end
+
+  it ":double field r/w" do
+    klass = Class.new(FFI::Struct)
+    klass.layout :v, :double, :dummy, :long
+
+    s = klass.new
+    value = 1.23456
+    s[:v] = value
+    expect((s.pointer.get_double(0) - value).abs).to be < 0.0001
+  end
+  module EnumFields
+    extend FFI::Library
+    TestEnum = enum :test_enum, [:c1, 10, :c2, 20, :c3, 30, :c4, 40]
+    class TestStruct < FFI::Struct
+      layout :a, :int, :c, :test_enum,
+        :d, [ TestEnum, TestEnum.symbols.length ]
+    end
+  end
+
+  it ":enum field r/w" do
+    s = EnumFields::TestStruct.new
+    s[:c] = :c3
+
+    expect(s.pointer.get_uint(FFI::Type::INT32.size)).to eq(30)
+    expect(s[:c]).to eq(:c3)
+  end
+
+  it "array of :enum field" do
+    s = EnumFields::TestStruct.new
+    EnumFields::TestEnum.symbols.each_with_index do |val, i|
+      s[:d][i] = val
+    end
+
+    EnumFields::TestEnum.symbols.each_with_index do |val, i|
+      expect(s.pointer.get_uint(FFI::Type::INT32.size * (2 + i))).to eq(EnumFields::TestEnum[val])
+    end
+
+    s[:d].each_with_index do |val, i|
+      expect(val).to eq(EnumFields::TestEnum.symbols[i])
+    end
+  end
+
+  module CallbackMember
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    callback :add, [ :int, :int ], :int
+    callback :sub, [ :int, :int ], :int
+    class TestStruct < FFI::Struct
+      layout :add, :add,
+        :sub, :sub
+    end
+    attach_function :struct_call_add_cb, [TestStruct.in, :int, :int], :int
+    attach_function :struct_call_sub_cb, [TestStruct.in, :int, :int], :int
+  end
+
+  it "Can have CallbackInfo struct field" do
+      s = CallbackMember::TestStruct.new
+      add_proc = lambda { |a, b| a+b }
+      sub_proc = lambda { |a, b| a-b }
+      s[:add] = add_proc
+      s[:sub] = sub_proc
+      expect(CallbackMember.struct_call_add_cb(s, 40, 2)).to eq(42)
+      expect(CallbackMember.struct_call_sub_cb(s, 44, 2)).to eq(42)
+  end
+
+  it "Can return its members as a list" do
+    class TestStruct < FFI::Struct
+      layout :a, :int, :b, :int, :c, :int
+    end
+    expect(TestStruct.members).to include(:a, :b, :c)
+  end
+
+  it "Can return its instance members and values as lists" do
+    class TestStruct < FFI::Struct
+      layout :a, :int, :b, :int, :c, :int
+    end
+    s = TestStruct.new
+    expect(s.members).to include(:a, :b, :c)
+    s[:a] = 1
+    s[:b] = 2
+    s[:c] = 3
+    expect(s.values).to include(1, 2, 3)
+  end
+
+  it 'should return an ordered field/offset pairs array' do
+    class TestStruct < FFI::Struct
+      layout :a, :int, :b, :int, :c, :int
+    end
+    s = TestStruct.new
+    expect(s.offsets).to eq([[:a, 0], [:b, 4], [:c, 8]])
+    expect(TestStruct.offsets).to eq([[:a, 0], [:b, 4], [:c, 8]])
+  end
+
+  it "Struct#offset_of returns offset of field within struct" do
+    class TestStruct < FFI::Struct
+      layout :a, :int, :b, :int, :c, :int
+    end
+    expect(TestStruct.offset_of(:a)).to eq(0)
+    expect(TestStruct.offset_of(:b)).to eq(4)
+    expect(TestStruct.offset_of(:c)).to eq(8)
+  end
+end
+
+describe FFI::Struct, ".layout" do
+  module FFISpecs
+    module LibTest
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      begin
+        attach_function :ptr_ret_int32_t, [ :pointer, :int ], :int
+      rescue FFI::NotFoundError
+        # NetBSD uses #define instead of typedef for these
+        attach_function :ptr_ret_int32_t, :ptr_ret___int32_t, [ :pointer, :int ], :int
+      end
+    end
+  end
+
+  describe "when derived class is not assigned to any constant" do
+    it "resolves a built-in type" do
+      klass = Class.new FFI::Struct
+      klass.layout :number, :int
+
+      instance = klass.new
+      instance[:number] = 0xA1
+      expect(FFISpecs::LibTest.ptr_ret_int32_t(instance, 0)).to eq(0xA1)
+    end
+  end
+
+  describe "when derived class is assigned to a constant" do
+    it "resolves a built-in type" do
+      class FFISpecs::TestStruct < FFI::Struct
+        layout :number, :int
+      end
+
+      instance = FFISpecs::TestStruct.new
+      instance[:number] = 0xA1
+      expect(FFISpecs::LibTest.ptr_ret_int32_t(instance, 0)).to eq(0xA1)
+    end
+
+    it "resolves a type from the enclosing module" do
+      module FFISpecs::LibTest
+        typedef :uint, :custom_int
+
+        class TestStruct < FFI::Struct
+          layout :number, :custom_int
+        end
+      end
+
+      instance = FFISpecs::LibTest::TestStruct.new
+      instance[:number] = 0xA1
+      expect(FFISpecs::LibTest.ptr_ret_int32_t(instance, 0)).to eq(0xA1)
+    end
+  end
+end
+
+describe FFI::Struct, ' with a nested struct field'  do
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    class NestedStruct < FFI::Struct
+      layout :i, :int
+    end
+    class ContainerStruct < FFI::Struct
+      layout :first, :char, :ns, NestedStruct
+    end
+    attach_function :struct_align_nested_struct, [ :pointer ], :int
+    attach_function :struct_make_container_struct, [ :int ], :pointer
+  end
+  before do
+    @cs = LibTest::ContainerStruct.new
+  end
+
+  it 'should align correctly nested struct field' do
+    @cs[:ns][:i] = 123
+    expect(LibTest.struct_align_nested_struct(@cs.to_ptr)).to eq(123)
+  end
+
+  it 'should correctly calculate Container size (in bytes)' do
+    expect(LibTest::ContainerStruct.size).to eq(8)
+  end
+
+  it 'should return a Struct object when the field is accessed' do
+    expect(@cs[:ns].is_a?(FFI::Struct)).to be true
+  end
+
+  it 'should read a value from memory' do
+    @cs = LibTest::ContainerStruct.new(LibTest.struct_make_container_struct(123))
+    expect(@cs[:ns][:i]).to eq(123)
+  end
+
+  it 'should write a value to memory' do
+    @cs = LibTest::ContainerStruct.new(LibTest.struct_make_container_struct(123))
+    @cs[:ns][:i] = 456
+    expect(LibTest.struct_align_nested_struct(@cs.to_ptr)).to eq(456)
+  end
+
+  it 'should be able to assign struct instance to nested field' do
+    cs = LibTest::ContainerStruct.new(LibTest.struct_make_container_struct(123))
+    ns = LibTest::NestedStruct.new
+    ns[:i] = 567
+    cs[:ns] = ns
+    expect(cs[:ns][:i]).to eq(567)
+    expect(LibTest.struct_align_nested_struct(cs.to_ptr)).to eq(567)
+  end
+end
+
+describe FFI::Struct, ' with a nested array of structs'  do
+  module InlineArrayOfStructs
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    class NestedStruct < FFI::Struct
+      layout :i, :int
+    end
+    class ContainerStruct < FFI::Struct
+      layout :first, :char, :ns, [ NestedStruct, 1 ]
+    end
+    attach_function :struct_align_nested_struct, [ :pointer ], :int
+    attach_function :struct_make_container_struct, [ :int ], :pointer
+  end
+
+  before do
+    @cs = InlineArrayOfStructs::ContainerStruct.new
+  end
+
+  it 'should align correctly nested struct field' do
+    @cs[:ns][0][:i] = 123
+    expect(InlineArrayOfStructs.struct_align_nested_struct(@cs.to_ptr)).to eq(123)
+  end
+
+  it 'should correctly calculate Container size (in bytes)' do
+    expect(InlineArrayOfStructs::ContainerStruct.size).to eq(8)
+  end
+
+  it 'should return a Struct object when the field is accessed' do
+    expect(@cs[:ns][0].is_a?(FFI::Struct)).to be true
+  end
+
+  it 'should read a value from memory' do
+    @cs = InlineArrayOfStructs::ContainerStruct.new(InlineArrayOfStructs.struct_make_container_struct(123))
+    expect(@cs[:ns][0][:i]).to eq(123)
+  end
+
+  it 'should write a value to memory' do
+    @cs = InlineArrayOfStructs::ContainerStruct.new(InlineArrayOfStructs.struct_make_container_struct(123))
+    @cs[:ns][0][:i] = 456
+    expect(InlineArrayOfStructs.struct_align_nested_struct(@cs.to_ptr)).to eq(456)
+  end
+
+  it 'should support Enumerable#each' do
+    @cs = InlineArrayOfStructs::ContainerStruct.new(InlineArrayOfStructs.struct_make_container_struct(123))
+    ints = []
+    @cs[:ns].each { |s| ints << s[:i] }
+    expect(ints[0]).to eq(123)
+  end
+end
+
+describe FFI::Struct, ' by value'  do
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+
+    class S8S32 < FFI::Struct
+      layout :s8, :char, :s32, :int
+    end
+
+    class StructString < FFI::Struct
+      layout :bytes, :string, :len, :int
+    end
+
+    attach_function :struct_return_s8s32, [ ], S8S32.by_value
+    attach_function :struct_s8s32_set, [ :char, :int ], S8S32.by_value
+    attach_function :struct_s8s32_get_s8, [ S8S32.by_value ], :char
+    attach_function :struct_s8s32_get_s32, [ S8S32.by_value ], :int
+    attach_function :struct_s8s32_s32_ret_s32, [ S8S32.by_value, :int ], :int
+    attach_function :struct_s8s32_s64_ret_s64, [ S8S32.by_value, :long_long ], :long_long
+    attach_function :struct_s8s32_ret_s8s32, [ S8S32.by_value ], S8S32.by_value
+    attach_function :struct_s32_ptr_s32_s8s32_ret_s32, [ :int, :pointer, :int, S8S32.by_value ], :int
+    attach_function :struct_varargs_ret_struct_string, [ :int, :varargs ], StructString.by_value
+  end
+
+  it 'return using pre-set values' do
+    s = LibTest.struct_return_s8s32
+    expect(s[:s8]).to eq(0x7f)
+    expect(s[:s32]).to eq(0x12345678)
+  end
+
+  it 'return using passed in values' do
+    s = LibTest.struct_s8s32_set(123, 456789)
+    expect(s[:s8]).to eq(123)
+    expect(s[:s32]).to eq(456789)
+  end
+
+  it 'parameter' do
+    s = LibTest::S8S32.new
+    s[:s8] = 0x12
+    s[:s32] = 0x34567890
+    expect(LibTest.struct_s8s32_get_s8(s)).to eq(0x12)
+    expect(LibTest.struct_s8s32_get_s32(s)).to eq(0x34567890)
+  end
+
+  it 'parameter with following s32' do
+    s = LibTest::S8S32.new
+    s[:s8] = 0x12
+    s[:s32] = 0x34567890
+
+    expect(LibTest.struct_s8s32_s32_ret_s32(s, 0x1eefdead)).to eq(0x1eefdead)
+  end
+
+  # it 'parameter with following s64' do
+  #   s = LibTest::S8S64.new
+  #   s[:s8] = 0x12
+  #   s[:s64] = 0x34567890
+  #
+  #
+  #   LibTest.struct_s8s64_s64_ret_s64(s, 0x1eefdead1eefdead).should == 0x1eefdead1eefdead
+  # end
+
+  it 'parameter with preceding s32,ptr,s32' do
+    s = LibTest::S8S32.new
+    s[:s8] = 0x12
+    s[:s32] = 0x34567890
+    out = LibTest::S8S32.new
+    expect(LibTest.struct_s32_ptr_s32_s8s32_ret_s32(0x1000000, out, 0x1eafbeef, s)).to eq(0x34567890)
+    expect(out[:s8]).to eq(s[:s8])
+    expect(out[:s32]).to eq(s[:s32])
+  end
+
+  it 'parameter with preceding s32,string,s32' do
+    s = LibTest::S8S32.new
+    s[:s8] = 0x12
+    s[:s32] = 0x34567890
+    out = 0.chr * 32
+    expect(LibTest.struct_s32_ptr_s32_s8s32_ret_s32(0x1000000, out, 0x1eafbeef, s)).to eq(0x34567890)
+  end
+
+  it 'parameter, returning struct by value' do
+    s = LibTest::S8S32.new
+    s[:s8] = 0x12
+    s[:s32] = 0x34567890
+
+    ret = LibTest.struct_s8s32_ret_s8s32(s)
+    expect(ret[:s8]).to eq(s[:s8])
+    expect(ret[:s32]).to eq(s[:s32])
+  end
+
+  it 'varargs returning a struct' do
+    string = "test"
+    s = LibTest.struct_varargs_ret_struct_string(4, :string, string)
+    expect(s[:len]).to eq(string.length)
+    expect(s[:bytes]).to eq(string)
+  end
+end
+
+describe FFI::Struct, ' with an array field'  do
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    class StructWithArray < FFI::Struct
+      layout :first, :char, :a, [:int, 5]
+    end
+    attach_function :struct_make_struct_with_array, [:int, :int, :int, :int, :int], :pointer
+    attach_function :struct_field_array, [:pointer], :pointer
+  end
+  before do
+    @s = LibTest::StructWithArray.new
+  end
+
+  it 'should correctly calculate StructWithArray size (in bytes)' do
+    expect(LibTest::StructWithArray.size).to eq(24)
+  end
+
+  it 'should read values from memory' do
+    @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4))
+    expect(@s[:a].to_a).to eq([0, 1, 2, 3, 4])
+  end
+#  it 'should cache array object for successive calls' do
+#    @s[:a].object_id.should == @s[:a].object_id
+#  end
+
+  it 'should return the number of elements in the array field' do
+    @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4))
+    expect(@s[:a].size).to eq(5)
+  end
+
+  it 'should allow iteration through the array elements' do
+    @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4))
+    @s[:a].each_with_index { |elem, i| expect(elem).to eq(i) }
+  end
+
+  it 'should return the pointer to the array' do
+    @s = LibTest::StructWithArray.new(LibTest.struct_make_struct_with_array(0, 1, 2, 3, 4))
+    expect(@s[:a].to_ptr).to eq(LibTest::struct_field_array(@s.to_ptr))
+  end
+end
+
+describe 'BuggedStruct' do
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    class BuggedStruct < FFI::Struct
+      layout :visible, :uchar,
+              :x, :uint,
+              :y, :uint,
+              :rx, :short,
+              :ry, :short,
+              :order, :uchar,
+              :size, :uchar
+    end
+    attach_function :bugged_struct_size, [], :uint
+  end
+
+  it 'should return its correct size' do
+    expect(LibTest::BuggedStruct.size).to eq(LibTest.bugged_struct_size)
+  end
+
+  it "offsets within struct should be correct" do
+    expect(LibTest::BuggedStruct.offset_of(:visible)).to eq(0)
+    expect(LibTest::BuggedStruct.offset_of(:x)).to eq(4)
+    expect(LibTest::BuggedStruct.offset_of(:y)).to eq(8)
+    expect(LibTest::BuggedStruct.offset_of(:rx)).to eq(12)
+    expect(LibTest::BuggedStruct.offset_of(:ry)).to eq(14)
+    expect(LibTest::BuggedStruct.offset_of(:order)).to eq(16)
+    expect(LibTest::BuggedStruct.offset_of(:size)).to eq(17)
+  end
+
+  it 'should return correct field/offset pairs' do
+    expect(LibTest::BuggedStruct.offsets.sort do |a, b|
+      a[1] <=> b[1]
+    end).to eq([[:visible, 0], [:x, 4], [:y, 8], [:rx, 12], [:ry, 14], [:order, 16], [:size, 17]])
+  end
+end
+
+describe "Struct allocation" do
+  it "MemoryPointer.new(Struct, 2)" do
+    class S < FFI::Struct
+      layout :i, :uint
+    end
+    p = FFI::MemoryPointer.new(S, 2)
+    expect(p.total).to eq(8)
+    expect(p.type_size).to eq(4)
+    p.put_uint(4, 0xdeadbeef)
+    expect(S.new(p[1])[:i]).to eq(0xdeadbeef)
+    expect(p[1].address).to eq((p[0].address + 4))
+  end
+
+  it "Buffer.new(Struct, 2)" do
+    class S < FFI::Struct
+      layout :i, :uint
+    end
+    p = FFI::Buffer.new(S, 2)
+    expect(p.total).to eq(8)
+    expect(p.type_size).to eq(4)
+    p.put_uint(4, 0xdeadbeef)
+    expect(S.new(p[1])[:i]).to eq(0xdeadbeef)
+  end
+
+  it "null? should be true when initialized with NULL pointer" do
+    class S < FFI::Struct
+      layout :i, :uint
+    end
+    expect(S.new(FFI::Pointer::NULL)).to be_null
+  end
+
+  it "null? should be false when initialized with non-NULL pointer" do
+    class S < FFI::Struct
+      layout :i, :uint
+    end
+    expect(S.new(FFI::MemoryPointer.new(S))).not_to be_null
+  end
+
+  it "supports :bool as a struct member" do
+    expect do
+      c = Class.new(FFI::Struct) do
+        layout :b, :bool
+      end
+      struct = c.new
+      struct[:b] = ! struct[:b]
+    end.not_to raise_error Exception
+  end
+
+end
+
+describe "variable-length arrays" do
+  it "zero length array should be accepted as last field" do
+    expect {
+      Class.new(FFI::Struct) do
+        layout :count, :int, :data, [ :char, 0 ]
+      end
+    }.not_to raise_error Exception
+  end
+
+  it "zero length array before last element should raise error" do
+    expect {
+      Class.new(FFI::Struct) do
+        layout :data, [ :char, 0 ], :count, :int
+      end
+    }.to raise_error
+  end
+
+  it "can access elements of array" do
+    struct_class = Class.new(FFI::Struct) do
+      layout :count, :int, :data, [ :long, 0 ]
+    end
+    s = struct_class.new(FFI::MemoryPointer.new(1024))
+    s[:data][0] = 0x1eadbeef
+    s[:data][1] = 0x12345678
+    expect(s[:data][0]).to eq(0x1eadbeef)
+    expect(s[:data][1]).to eq(0x12345678)
+  end
+
+  it "non-variable length array is bounds checked" do
+    struct_class = Class.new(FFI::Struct) do
+      layout :count, :int, :data, [ :long, 1 ]
+    end
+    s = struct_class.new(FFI::MemoryPointer.new(1024))
+    s[:data][0] = 0x1eadbeef
+    expect { s[:data][1] = 0x12345678 }.to raise_error
+    expect(s[:data][0]).to eq(0x1eadbeef)
+    expect { expect(s[:data][1]).to == 0x12345678 }.to raise_error
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/typedef_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/typedef_spec.rb
new file mode 100644
index 0000000..d73247f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/typedef_spec.rb
@@ -0,0 +1,91 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+describe "Custom type definitions" do
+  it "attach_function with custom typedef" do
+    module CustomTypedef
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      typedef :uint, :fubar_t
+      attach_function :ret_u32, [ :fubar_t ], :fubar_t
+    end
+    expect(CustomTypedef.ret_u32(0x12345678)).to eq(0x12345678)
+  end
+
+  it "variadic invoker with custom typedef" do
+    module VariadicCustomTypedef
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      typedef :uint, :fubar_t
+      attach_function :pack_varargs, [ :buffer_out, :string, :varargs ], :void
+    end
+    buf = FFI::Buffer.new :uint, 10
+    VariadicCustomTypedef.pack_varargs(buf, "i", :fubar_t, 0x12345678)
+    expect(buf.get_int64(0)).to eq(0x12345678)
+  end
+
+  it "Callback with custom typedef parameter" do
+    module CallbackCustomTypedef
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      typedef :uint, :fubar3_t
+      callback :cbIrV, [ :fubar3_t ], :void
+      attach_function :testCallbackU32rV, :testClosureIrV, [ :cbIrV, :fubar3_t ], :void
+    end
+    i = 0
+    CallbackCustomTypedef.testCallbackU32rV(0xdeadbeef) { |v| i = v }
+    expect(i).to eq(0xdeadbeef)
+  end
+    module StructCustomTypedef
+      extend FFI::Library
+      ffi_lib TestLibrary::PATH
+      typedef :uint, :fubar3_t
+      class S < FFI::Struct
+        layout :a, :fubar3_t
+      end
+    end
+
+  it "Struct with custom typedef field" do
+    s = StructCustomTypedef::S.new
+    s[:a] = 0x12345678
+    expect(s.pointer.get_uint(0)).to eq(0x12345678)
+  end
+
+  it "attach_function after a typedef should not reject normal types" do
+    expect do
+      Module.new do
+        extend FFI::Library
+        # enum() will insert a custom typedef called :foo for the enum
+        enum :foo, [ :a, :b ]
+        typedef :int, :bar
+        
+        ffi_lib TestLibrary::PATH
+        begin
+          attach_function :ptr_ret_int32_t, [ :string, :foo ], :bar
+        rescue FFI::NotFoundError
+          # NetBSD uses #define instead of typedef for these
+          attach_function :ptr_ret_int32_t, :ptr_ret___int32_t, [ :string, :foo ], :bar
+        end
+      end
+    end.not_to raise_error
+  end
+
+  it "detects the correct type for size_t" do
+    expect do
+      Module.new do
+        extend FFI::Library
+        ffi_lib "c"
+        if FFI::Platform.windows?
+          # _read() is a function of msvcrt.dll
+          attach_function :_read, [:int, :pointer, :uint], :int
+        else
+          # read(2) is a standard UNIX function
+          attach_function :read, [:int, :pointer, :size_t], :ssize_t
+        end
+      end
+    end.not_to raise_error
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/union_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/union_spec.rb
new file mode 100644
index 0000000..45bf7ec
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/union_spec.rb
@@ -0,0 +1,67 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+module LibTest
+  Types = {
+    's8' => [:char, :c, 1],
+    's16' => [:short, :s, 0xff0], 
+    's32' => [:int, :i, 0xff00],
+    's64' => [:long_long, :j, 0xffff00],
+    'long' => [:long, :l, 0xffff],
+    'f32' => [:float, :f, 1.0001],
+    'f64' => [:double, :d, 1.000000001]
+  }
+  class TestUnion < FFI::Union
+    layout( :a, [:char, 10], 
+            :i, :int, 
+            :f, :float,
+            :d, :double,
+            :s, :short,
+            :l, :long,
+            :j, :long_long,
+            :c, :char )
+  end
+  Types.keys.each do |k| 
+    attach_function "union_align_#{k}", [ :pointer ], Types[k][0]
+    attach_function "union_make_union_with_#{k}", [ Types[k][0] ], :pointer
+  end
+  attach_function :union_size, [], :uint
+end
+
+describe 'Union' do
+  before do
+    @u = LibTest::TestUnion.new
+  end
+
+  it 'should place all the fields at offset 0' do
+    expect(LibTest::TestUnion.members.all? { |m| LibTest::TestUnion.offset_of(m) == 0 }).to be true
+  end
+  LibTest::Types.each do |k, type|
+    it "should correctly align/write a #{type[0]} value" do
+      @u[type[1]] = type[2]
+      if k == 'f32' or k == 'f64'
+        expect((@u[type[1]] - LibTest.send("union_align_#{k}", @u.to_ptr)).abs).to be < 0.00001
+      else
+        expect(@u[type[1]]).to eq(LibTest.send("union_align_#{k}", @u.to_ptr))
+      end
+    end
+  end
+  LibTest::Types.each do |k, type|
+    it "should read a #{type[0]} value from memory" do
+      @u = LibTest::TestUnion.new(LibTest.send("union_make_union_with_#{k}", type[2]))
+      if k == 'f32' or k == 'f64'
+        expect((@u[type[1]] - type[2]).abs).to be < 0.00001
+      else
+        expect(@u[type[1]]).to eq(type[2])
+      end
+    end
+  end
+
+  it 'should return a size equals to the size of the biggest field' do
+    expect(LibTest::TestUnion.size).to eq(LibTest.union_size)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/variadic_spec.rb b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/variadic_spec.rb
new file mode 100644
index 0000000..0c7292e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/ffi/variadic_spec.rb
@@ -0,0 +1,132 @@
+#
+# This file is part of ruby-ffi.
+# For licensing, see LICENSE.SPECS
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "spec_helper"))
+
+describe "Function with variadic arguments" do
+  module LibTest
+    extend FFI::Library
+    ffi_lib TestLibrary::PATH
+    enum :enum_type1, [:c1, :c2]
+    enum :enum_type2, [:c3, 42, :c4]
+    attach_function :pack_varargs, [ :buffer_out, :string, :varargs ], :void
+    attach_function :pack_varargs2, [ :buffer_out, :enum_type1, :string, :varargs ], :enum_type1
+
+    attach_function :testBlockingOpen, [ ], :pointer
+    attach_function :testBlockingRWva, [ :pointer, :char, :varargs ], :char, :blocking => true
+    attach_function :testBlockingWRva, [ :pointer, :char, :varargs ], :char, :blocking => true
+    attach_function :testBlockingClose, [ :pointer ], :void
+  end
+
+  it "takes enum arguments" do
+    buf = FFI::Buffer.new :long_long, 2
+    LibTest.pack_varargs(buf, "ii", :int, :c3, :int, :c4)
+    expect(buf.get_int64(0)).to eq(42)
+    expect(buf.get_int64(8)).to eq(43)
+  end
+
+  it "returns symbols for enums" do
+    buf = FFI::Buffer.new :long_long, 2
+    expect(LibTest.pack_varargs2(buf, :c1, "ii", :int, :c3, :int, :c4)).to eq(:c2)
+  end
+
+  it 'can wrap a blocking function with varargs' do
+    pending("not supported in 1.8") if RUBY_VERSION =~ /^1\.8\..*/
+    handle = LibTest.testBlockingOpen
+    expect(handle).not_to be_null
+    begin
+      thWR = Thread.new { LibTest.testBlockingWRva(handle, 63, :int, 40, :int, 23, :int, 0) }
+      thRW = Thread.new { LibTest.testBlockingRWva(handle, 64, :int, 40, :int, 24, :int, 0) }
+      expect(thWR.value).to eq(64)
+      expect(thRW.value).to eq(63)
+    ensure
+      LibTest.testBlockingClose(handle)
+    end
+  end
+
+  [ 0, 127, -128, -1 ].each do |i|
+    it "call variadic with (:char (#{i})) argument" do
+      buf = FFI::Buffer.new :long_long
+      LibTest.pack_varargs(buf, "c", :char, i)
+      expect(buf.get_int64(0)).to eq(i)
+    end
+  end
+
+  [ 0, 0x7f, 0x80, 0xff ].each do |i|
+    it "call variadic with (:uchar (#{i})) argument" do
+      buf = FFI::Buffer.new :long_long
+      LibTest.pack_varargs(buf, "C", :uchar, i)
+      expect(buf.get_int64(0)).to eq(i)
+    end
+  end
+
+  [ 0, 1.234567, 9.87654321 ].each do |v|
+    it "call variadic with (:float (#{v})) argument" do
+      buf = FFI::Buffer.new :long_long
+      LibTest.pack_varargs(buf, "f", :float, v.to_f)
+      expect(buf.get_float64(0)).to eq(v)
+    end
+  end
+
+  [ 0, 1.234567, 9.87654321 ].each do |v|
+    it "call variadic with (:double (#{v})) argument" do
+      buf = FFI::Buffer.new :long_long
+      LibTest.pack_varargs(buf, "f", :double, v.to_f)
+      expect(buf.get_float64(0)).to eq(v)
+    end
+  end
+
+  module Varargs
+    PACK_VALUES = {
+      'c' => [ 0x12  ],
+      'C' => [ 0x34  ],
+      's' => [ 0x5678 ],
+      'S' => [ 0x9abc ],
+      'i' => [ 0x7654321f ],
+      'I' => [ 0xfee1babe ],
+      'l' => [ 0x1f2e3d4c ],
+      'L' => [ 0xf7e8d9ca ],
+      'j' => [ 0x1eafdeadbeefa1b2 ],
+      'f' => [ 1.23456789 ],
+      'd' => [ 9.87654321 ]
+    }
+
+    TYPE_MAP = {
+      'c' => :char, 'C' => :uchar, 's' => :short, 'S' => :ushort,
+      'i' => :int, 'I' => :uint, 'j' => :long_long, 'J' => :ulong_long,
+      'l' => :long, 'L' => :ulong, 'f' => :float, 'd' => :double
+    }
+  end
+
+  def verify(p, off, v)
+    if v.kind_of?(Float)
+      expect(p.get_float64(off)).to eq(v)
+    else
+      expect(p.get_int64(off)).to eq(v)
+    end
+  end
+
+  Varargs::PACK_VALUES.keys.each do |t1|
+    Varargs::PACK_VALUES.keys.each do |t2|
+      Varargs::PACK_VALUES.keys.each do |t3|
+        Varargs::PACK_VALUES[t1].each do |v1|
+          Varargs::PACK_VALUES[t2].each do |v2|
+            Varargs::PACK_VALUES[t3].each do |v3|
+              fmt = "#{t1}#{t2}#{t3}"
+              params = [ Varargs::TYPE_MAP[t1], v1, Varargs::TYPE_MAP[t2], v2, Varargs::TYPE_MAP[t3], v3 ]
+              it "call(#{fmt}, #{params.join(',')})" do
+                buf = FFI::Buffer.new :long_long, 3
+                LibTest.pack_varargs(buf, fmt, *params)
+                verify(buf, 0, v1)
+                verify(buf, 8, v2)
+                verify(buf, 16, v3)
+              end
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/spec.opts b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/spec.opts
new file mode 100644
index 0000000..60a0245
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/ffi-1.9.18/spec/spec.opts
@@ -0,0 +1,4 @@
+--color
+-w
+--format
+documentation
diff --git a/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/Gemfile b/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/Gemfile
new file mode 100644
index 0000000..ea587c7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/Gemfile
@@ -0,0 +1,24 @@
+# ----------------------------------------------------------------------------
+# Frozen-string-literal: true
+# Copyright: 2015-2016 Jordon Bedwell - MIT License
+# Encoding: utf-8
+# ----------------------------------------------------------------------------
+
+source "https://rubygems.org"
+gem "rake", :require => false
+gemspec
+
+group :test do
+  gem "rspec-helpers", :require => false
+  gem "codeclimate-test-reporter", :require => false
+  gem "luna-rspec-formatters", :require => false
+  gem "rspec", :require => false
+end
+
+group :development do
+  gem "luna-rubocop-formatters", :require => false
+  gem "rubocop", :github => "bbatsov/rubocop", :require => false
+  gem "pry", {
+    :require => false
+  }
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/LICENSE b/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/LICENSE
new file mode 100644
index 0000000..e603a78
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015-2016 Jordon Bedwell
+
+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/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/Rakefile b/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/Rakefile
new file mode 100644
index 0000000..1c929e5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/Rakefile
@@ -0,0 +1,13 @@
+# ----------------------------------------------------------------------------
+# Frozen-string-literal: true
+# Copyright: 2015-2016 Jordon Bedwell - MIT License
+# Encoding: utf-8
+# ----------------------------------------------------------------------------
+
+$LOAD_PATH.unshift(File.expand_path("../lib", __FILE__))
+require "luna/rubocop/rake/task"
+require "rspec/core/rake_task"
+
+task :default => [:spec]
+RSpec::Core::RakeTask.new :spec
+task :test => :spec
diff --git a/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb b/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb
new file mode 100644
index 0000000..fc694cf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb
@@ -0,0 +1,202 @@
+# ----------------------------------------------------------------------------
+# Frozen-string-literal: true
+# Copyright: 2015-2016 Jordon Bedwell - MIT License
+# Encoding: utf-8
+# ----------------------------------------------------------------------------
+
+require "forwardable/extended/version"
+require "forwardable"
+
+module Forwardable
+  module Extended
+
+    # ------------------------------------------------------------------------
+    # Make our methods private on the class, there is no reason for public.
+    # ------------------------------------------------------------------------
+
+    def self.extended(klass)
+      instance_methods.each do |method|
+        klass.private_class_method(
+          method
+        )
+      end
+    end
+
+    # ------------------------------------------------------------------------
+    # Delegate using a Rails-like interface.
+    # ------------------------------------------------------------------------
+
+    def rb_delegate(method, to: nil, alias_of: method, **kwd)
+      raise ArgumentError, "to must be provided" unless to
+      def_delegator(
+        to, alias_of, method, **kwd
+      )
+    end
+
+    # ------------------------------------------------------------------------
+    # Delegate a method to a hash and key.
+    # ------------------------------------------------------------------------
+
+    def def_hash_delegator(hash, method, key: method, **kwd)
+      prefix, suffix, wrap = prepare_delegate(**kwd)
+
+      if suffix
+        method = method.to_s.gsub(
+          /\?$/, ""
+        )
+      end
+
+      class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 9
+        def #{method}#{suffix}(*args)
+          #{wrap}(
+            #{prefix}#{hash}[#{key.inspect}]
+          )
+
+        rescue Exception
+          if !Forwardable.debug && $@ && $@.respond_to?(:delete_if)
+            $@.delete_if do |source|
+              source =~ %r"#{Regexp.escape(__FILE__)}"o
+            end
+          end
+
+          raise
+        end
+      STR
+    end
+
+    # ------------------------------------------------------------------------
+    # Delegate a method to an instance variable.
+    # ------------------------------------------------------------------------
+
+    def def_ivar_delegator(ivar, alias_ = ivar, **kwd)
+      prefix, suffix, wrap = prepare_delegate(**kwd)
+
+      if suffix
+        alias_ = alias_.to_s.gsub(
+          /\?$/, ""
+        )
+      end
+
+      class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 9
+        def #{alias_.to_s.gsub(/\A@/, "")}#{suffix}
+          #{wrap}(
+            #{prefix}#{ivar}
+          )
+
+        rescue Exception
+          if !Forwardable.debug && $@ && $@.respond_to?(:delete_if)
+            $@.delete_if do |source|
+              source =~ %r"#{Regexp.escape(__FILE__)}"o
+            end
+          end
+
+          raise
+        end
+      STR
+    end
+
+    # ------------------------------------------------------------------------
+    # Like def_delegator but allows you to send args and do other stuff.
+    # ------------------------------------------------------------------------
+
+    def def_modern_delegator(accessor, method, alias_ = method, args: \
+        { :before => [], :after => [] }, **kwd)
+
+      prefix, suffix, wrap = prepare_delegate(**kwd)
+      args = { :before => args } unless args.is_a?(Hash)
+      b = [args[:before]].flatten.compact.map(&:to_s).join(", ")
+      a = [args[ :after]].flatten.compact.map(&:to_s).join(", ")
+      b = b + ", " unless args[:before].nil? || args[:before].empty?
+      a = ", " + a unless args[ :after].nil? || args[ :after].empty?
+      alias_ = alias_.to_s.gsub(/\?$/, "") if suffix
+
+      class_eval delegate_debug(<<-STR), __FILE__, __LINE__ - 10
+        def #{alias_}#{suffix}(*args, &block)
+          #{wrap}(#{prefix}#{accessor}.send(
+            #{method.inspect}, #{b}*args#{a}, &block
+          ))
+
+        rescue Exception
+          if !Forwardable.debug && $@ && $@.respond_to?(:delete_if)
+            $@.delete_if do |source|
+              source =~ %r"#{Regexp.escape(__FILE__)}"o
+            end
+          end
+
+          raise
+        end
+      STR
+    end
+
+    # ------------------------------------------------------------------------
+    # Wraps around traditional delegation and modern delegation.
+    # ------------------------------------------------------------------------
+
+    def def_delegator(accessor, method, alias_ = method, **kwd)
+      kwd, alias_ = alias_, method if alias_.is_a?(Hash) && !kwd.any?
+
+      if alias_.is_a?(Hash) || !kwd.any?
+        Forwardable.instance_method(:def_delegator).bind(self) \
+          .call(accessor, method, alias_)
+
+      elsif !kwd[:type]
+        def_modern_delegator(
+          accessor, method, alias_, **kwd
+        )
+
+      else
+        raise ArgumentError, "Alias not supported." if alias_ != method
+        send("def_#{kwd[:type]}_delegator", accessor, method, **kwd.tap do |obj|
+          obj.delete(:type)
+        end)
+      end
+    end
+
+    # ------------------------------------------------------------------------
+    # Create multiple delegates at once.
+    # ------------------------------------------------------------------------
+
+    def def_delegators(accessor, *methods)
+      kwd = methods.shift if methods.first.is_a?(Hash)
+      kwd = methods.pop   if methods. last.is_a?(Hash)
+      kwd = {} unless kwd
+
+      methods.each do |method|
+        def_delegator accessor, method, **kwd
+      end
+    end
+
+    # ------------------------------------------------------------------------
+    # Prepares a delegate and it's few arguments.
+    # ------------------------------------------------------------------------
+
+    private
+    def prepare_delegate(wrap: nil, bool: false)
+      prefix = (bool == :reverse ? "!!!" : "!!") if bool
+      wrap   = "self.class.new" if wrap.is_a?(TrueClass)
+      suffix = "?" if bool
+
+      return [
+        prefix, suffix, wrap
+      ]
+    end
+
+    # ------------------------------------------------------------------------
+
+    private
+    def delegate_debug(str)
+      if Forwardable.debug && !Forwardable.debug.is_a?(TrueClass)
+        then Forwardable.debug.debug(
+          str
+        )
+
+      elsif Forwardable.debug
+        $stdout.puts(
+          "\n# ------\n\n", str
+        )
+      end
+
+      str
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb b/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb
new file mode 100644
index 0000000..0639375
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb
@@ -0,0 +1,9 @@
+# Frozen-string-literal: true
+# Copyright: 2015-2016 Jordon Bedwell - MIT License
+# Encoding: utf-8
+
+module Forwardable
+  module Extended
+    VERSION = "2.6.0"
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/.rubocop.yml b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/.rubocop.yml
new file mode 100644
index 0000000..e5b26bc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/.rubocop.yml
@@ -0,0 +1,153 @@
+---
+AllCops:
+  TargetRubyVersion: 2.0
+  Include:
+    - lib/**/*.rb
+  Exclude:
+    - bin/**/*
+    - exe/**/*
+    - benchmark/**/*
+    - script/**/*
+    - vendor/**/*
+Layout/AlignArray:
+  Enabled: false
+Layout/AlignHash:
+  EnforcedHashRocketStyle: table
+Layout/AlignParameters:
+  Enabled: false
+Layout/EmptyLinesAroundAccessModifier:
+  Enabled: false
+Layout/EmptyLinesAroundModuleBody:
+  Enabled: false
+Layout/EndOfLine:
+  EnforcedStyle: lf
+Layout/ExtraSpacing:
+  AllowForAlignment: true
+Layout/FirstParameterIndentation:
+  EnforcedStyle: consistent
+Layout/IndentationWidth:
+  Severity: error
+Layout/IndentArray:
+  EnforcedStyle: consistent
+Layout/IndentHash:
+  EnforcedStyle: consistent
+Layout/IndentHeredoc:
+  Enabled: false
+Layout/MultilineMethodCallIndentation:
+  EnforcedStyle: indented
+Layout/MultilineOperationIndentation:
+  EnforcedStyle: indented
+Layout/SpaceAroundOperators:
+  Enabled: true
+Layout/SpaceInsideBrackets:
+  Enabled: false
+Lint/EndAlignment:
+  Severity: error
+Lint/UnreachableCode:
+  Severity: error
+Lint/UselessAccessModifier:
+  Enabled: false
+Metrics/AbcSize:
+  Max: 21
+Metrics/BlockLength:
+  Exclude:
+    - test/**/*.rb
+    - lib/jekyll/configuration.rb
+    - rake/*.rake
+    - jekyll.gemspec
+Metrics/ClassLength:
+  Exclude:
+    - !ruby/regexp /features\/.*.rb$/
+    - !ruby/regexp /test\/.*.rb$/
+  Max: 300
+Metrics/CyclomaticComplexity:
+  Max: 9
+Metrics/LineLength:
+  Exclude:
+    - !ruby/regexp /features\/.*.rb/
+    - Rakefile
+    - rake/*.rake
+    - Gemfile
+    - jekyll.gemspec
+  Max: 90
+  Severity: warning
+Metrics/MethodLength:
+  CountComments: false
+  Max: 20
+  Severity: error
+Metrics/ModuleLength:
+  Max: 240
+Metrics/ParameterLists:
+  Max: 4
+Metrics/PerceivedComplexity:
+  Max: 8
+Security/MarshalLoad:
+  Exclude:
+    - !ruby/regexp /test\/.*.rb$/
+    - lib/jekyll/regenerator.rb
+Security/YAMLLoad:
+  Exclude:
+    - !ruby/regexp /features\/.*.rb/
+    - !ruby/regexp /test\/.*.rb$/
+Style/Alias:
+  Enabled: false
+Style/AndOr:
+  Severity: error
+Style/Attr:
+  Enabled: false
+Style/BracesAroundHashParameters:
+  Enabled: false
+Style/ClassAndModuleChildren:
+  Enabled: false
+Style/Documentation:
+  Enabled: false
+  Exclude:
+    - !ruby/regexp /features\/.*.rb$/
+Style/DoubleNegation:
+  Enabled: false
+Style/FileName:
+  Enabled: false
+Style/GuardClause:
+  Enabled: false
+Style/HashSyntax:
+  EnforcedStyle: hash_rockets
+  Severity: error
+Style/IfUnlessModifier:
+  Enabled: false
+Style/InverseMethods:
+  Enabled: false
+Style/ModuleFunction:
+  Enabled: false
+Style/MultilineTernaryOperator:
+  Severity: error
+Style/PercentLiteralDelimiters:
+  PreferredDelimiters:
+    "%q": "{}"
+    "%Q": "{}"
+    "%r": "!!"
+    "%s": "()"
+    "%w": "()"
+    "%W": "()"
+    "%x": "()"
+Style/RedundantReturn:
+  Enabled: false
+Style/RedundantSelf:
+  Enabled: false
+Style/RegexpLiteral:
+  EnforcedStyle: percent_r
+Style/RescueModifier:
+  Enabled: false
+Style/SignalException:
+  EnforcedStyle: only_raise
+Style/SingleLineMethods:
+  Enabled: false
+Style/StringLiterals:
+  EnforcedStyle: double_quotes
+Style/StringLiteralsInInterpolation:
+  EnforcedStyle: double_quotes
+Style/SymbolArray:
+  Enabled: false
+Style/TrailingCommaInLiteral:
+  EnforcedStyleForMultiline: consistent_comma
+Style/UnneededCapitalW:
+  Enabled: false
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/LICENSE b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/LICENSE
new file mode 100644
index 0000000..e177b1b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2008-2017 Tom Preston-Werner and Jekyll contributors
+
+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/bundle/ruby/2.4.0/gems/jekyll-3.5.2/README.markdown b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/README.markdown
new file mode 100644
index 0000000..9718f24
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/README.markdown
@@ -0,0 +1,59 @@
+# [Jekyll](https://jekyllrb.com/)
+
+[![Gem Version](https://img.shields.io/gem/v/jekyll.svg)][ruby-gems]
+[![Linux Build Status](https://img.shields.io/travis/jekyll/jekyll/master.svg?label=Linux%20build)][travis]
+[![Windows Build status](https://img.shields.io/appveyor/ci/jekyll/jekyll/master.svg?label=Windows%20build)][appveyor]
+[![Test Coverage](https://img.shields.io/codeclimate/coverage/github/jekyll/jekyll.svg)][coverage]
+[![Code Climate](https://img.shields.io/codeclimate/github/jekyll/jekyll.svg)][codeclimate]
+[![Dependency Status](https://img.shields.io/gemnasium/jekyll/jekyll.svg)][gemnasium]
+[![Security](https://hakiri.io/github/jekyll/jekyll/master.svg)][hakiri]
+
+[ruby-gems]: https://rubygems.org/gems/jekyll
+[gemnasium]: https://gemnasium.com/jekyll/jekyll
+[codeclimate]: https://codeclimate.com/github/jekyll/jekyll
+[coverage]: https://codeclimate.com/github/jekyll/jekyll/coverage
+[hakiri]: https://hakiri.io/github/jekyll/jekyll/master
+[travis]: https://travis-ci.org/jekyll/jekyll
+[appveyor]: https://ci.appveyor.com/project/jekyll/jekyll/branch/master
+
+Jekyll is a simple, blog-aware, static site generator perfect for personal, project, or organization sites. Think of it like a file-based CMS, without all the complexity. Jekyll takes your content, renders Markdown and Liquid templates, and spits out a complete, static website ready to be served by Apache, Nginx or another web server. Jekyll is the engine behind [GitHub Pages](https://pages.github.com), which you can use to host sites right from your GitHub repositories.
+
+## Philosophy
+
+Jekyll does what you tell it to do — no more, no less. It doesn't try to outsmart users by making bold assumptions, nor does it burden them with needless complexity and configuration. Put simply, Jekyll gets out of your way and allows you to concentrate on what truly matters: your content.
+
+## Having trouble with OS X/macOS?
+
+See: https://jekyllrb.com/docs/troubleshooting/
+
+## Getting Started
+
+* [Install](https://jekyllrb.com/docs/installation/) the gem
+* Read up about its [Usage](https://jekyllrb.com/docs/usage/) and [Configuration](https://jekyllrb.com/docs/configuration/)
+* Take a gander at some existing [Sites](https://wiki.github.com/jekyll/jekyll/sites)
+* [Fork](https://github.com/jekyll/jekyll/fork) and [Contribute](https://jekyllrb.com/docs/contributing/) your own modifications
+* Have questions? Check out our official forum community [Jekyll Talk](https://talk.jekyllrb.com/) or [`#jekyll` on irc.freenode.net](https://botbot.me/freenode/jekyll/)
+
+## Code of Conduct
+
+In order to have a more open and welcoming community, Jekyll adheres to a
+[code of conduct](CONDUCT.markdown) adapted from the Ruby on Rails code of
+conduct.
+
+Please adhere to this code of conduct in any interactions you have in the
+Jekyll community. It is strictly enforced on all official Jekyll
+repositories, websites, and resources. If you encounter someone violating
+these terms, please let a maintainer ([@parkr](https://github.com/parkr), [@envygeeks](https://github.com/envygeeks), [@mattr-](https://github.com/mattr-), or [@alfredxing](https://github.com/alfredxing)) know and we will address it as soon as possible.
+
+## Diving In
+
+* [Migrate](http://import.jekyllrb.com/docs/home/) from your previous system
+* Learn how the [YAML Front Matter](https://jekyllrb.com/docs/frontmatter/) works
+* Put information on your site with [Variables](https://jekyllrb.com/docs/variables/)
+* Customize the [Permalinks](https://jekyllrb.com/docs/permalinks/) your posts are generated with
+* Use the built-in [Liquid Extensions](https://jekyllrb.com/docs/templates/) to make your life easier
+* Use custom [Plugins](https://jekyllrb.com/docs/plugins/) to generate content specific to your site
+
+## License
+
+See the [LICENSE](https://github.com/jekyll/jekyll/blob/master/LICENSE) file.
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/exe/jekyll b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/exe/jekyll
new file mode 100755
index 0000000..f0f41c9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/exe/jekyll
@@ -0,0 +1,55 @@
+#!/usr/bin/env ruby
+STDOUT.sync = true
+
+$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
+
+require "jekyll"
+require "mercenary"
+
+Jekyll::PluginManager.require_from_bundler
+
+Jekyll::Deprecator.process(ARGV)
+
+Mercenary.program(:jekyll) do |p|
+  p.version Jekyll::VERSION
+  p.description "Jekyll is a blog-aware, static site generator in Ruby"
+  p.syntax "jekyll <subcommand> [options]"
+
+  p.option "source", "-s", "--source [DIR]", "Source directory (defaults to ./)"
+  p.option "destination", "-d", "--destination [DIR]",
+    "Destination directory (defaults to ./_site)"
+  p.option "safe", "--safe", "Safe mode (defaults to false)"
+  p.option "plugins_dir", "-p", "--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]", Array,
+    "Plugins directory (defaults to ./_plugins)"
+  p.option "layouts_dir", "--layouts DIR", String,
+    "Layouts directory (defaults to ./_layouts)"
+  p.option "profile", "--profile", "Generate a Liquid rendering profile"
+
+  Jekyll::External.require_if_present(Jekyll::External.blessed_gems) do |g, ver_constraint|
+    cmd = g.split("-").last
+    p.command(cmd.to_sym) do |c|
+      c.syntax cmd
+      c.action do
+        Jekyll.logger.abort_with "You must install the '#{g}' gem" \
+          " version #{ver_constraint} to use the 'jekyll #{cmd}' command."
+      end
+    end
+  end
+
+  Jekyll::Command.subclasses.each { |c| c.init_with_program(p) }
+
+  p.action do |args, _|
+    if args.empty?
+      Jekyll.logger.error "A subcommand is required."
+      puts p
+      abort
+    else
+      subcommand = args.first
+      unless p.has_command? subcommand
+        Jekyll.logger.abort_with "fatal: 'jekyll #{args.first}' could not" \
+          " be found. You may need to install the jekyll-#{args.first} gem" \
+          " or a related gem to be able to use this subcommand."
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll.rb
new file mode 100644
index 0000000..25bbaa0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll.rb
@@ -0,0 +1,192 @@
+$LOAD_PATH.unshift File.dirname(__FILE__) # For use/testing when no gem is installed
+
+# Require all of the Ruby files in the given directory.
+#
+# path - The String relative path from here to the directory.
+#
+# Returns nothing.
+def require_all(path)
+  glob = File.join(File.dirname(__FILE__), path, "*.rb")
+  Dir[glob].sort.each do |f|
+    require f
+  end
+end
+
+# rubygems
+require "rubygems"
+
+# stdlib
+require "pathutil"
+require "forwardable"
+require "fileutils"
+require "time"
+require "English"
+require "pathname"
+require "logger"
+require "set"
+
+# 3rd party
+require "safe_yaml/load"
+require "liquid"
+require "kramdown"
+require "colorator"
+
+SafeYAML::OPTIONS[:suppress_warnings] = true
+
+module Jekyll
+  # internal requires
+  autoload :Cleaner,             "jekyll/cleaner"
+  autoload :Collection,          "jekyll/collection"
+  autoload :Configuration,       "jekyll/configuration"
+  autoload :Convertible,         "jekyll/convertible"
+  autoload :Deprecator,          "jekyll/deprecator"
+  autoload :Document,            "jekyll/document"
+  autoload :EntryFilter,         "jekyll/entry_filter"
+  autoload :Errors,              "jekyll/errors"
+  autoload :Excerpt,             "jekyll/excerpt"
+  autoload :External,            "jekyll/external"
+  autoload :FrontmatterDefaults, "jekyll/frontmatter_defaults"
+  autoload :Hooks,               "jekyll/hooks"
+  autoload :Layout,              "jekyll/layout"
+  autoload :CollectionReader,    "jekyll/readers/collection_reader"
+  autoload :DataReader,          "jekyll/readers/data_reader"
+  autoload :LayoutReader,        "jekyll/readers/layout_reader"
+  autoload :PostReader,          "jekyll/readers/post_reader"
+  autoload :PageReader,          "jekyll/readers/page_reader"
+  autoload :StaticFileReader,    "jekyll/readers/static_file_reader"
+  autoload :ThemeAssetsReader,   "jekyll/readers/theme_assets_reader"
+  autoload :LogAdapter,          "jekyll/log_adapter"
+  autoload :Page,                "jekyll/page"
+  autoload :PluginManager,       "jekyll/plugin_manager"
+  autoload :Publisher,           "jekyll/publisher"
+  autoload :Reader,              "jekyll/reader"
+  autoload :Regenerator,         "jekyll/regenerator"
+  autoload :RelatedPosts,        "jekyll/related_posts"
+  autoload :Renderer,            "jekyll/renderer"
+  autoload :LiquidRenderer,      "jekyll/liquid_renderer"
+  autoload :Site,                "jekyll/site"
+  autoload :StaticFile,          "jekyll/static_file"
+  autoload :Stevenson,           "jekyll/stevenson"
+  autoload :Theme,               "jekyll/theme"
+  autoload :ThemeBuilder,        "jekyll/theme_builder"
+  autoload :URL,                 "jekyll/url"
+  autoload :Utils,               "jekyll/utils"
+  autoload :VERSION,             "jekyll/version"
+
+  # extensions
+  require "jekyll/plugin"
+  require "jekyll/converter"
+  require "jekyll/generator"
+  require "jekyll/command"
+  require "jekyll/liquid_extensions"
+  require "jekyll/filters"
+
+  class << self
+    # Public: Tells you which Jekyll environment you are building in so you can skip tasks
+    # if you need to.  This is useful when doing expensive compression tasks on css and
+    # images and allows you to skip that when working in development.
+
+    def env
+      ENV["JEKYLL_ENV"] || "development"
+    end
+
+    # Public: Generate a Jekyll configuration Hash by merging the default
+    # options with anything in _config.yml, and adding the given options on top.
+    #
+    # override - A Hash of config directives that override any options in both
+    #            the defaults and the config file.
+    #            See Jekyll::Configuration::DEFAULTS for a
+    #            list of option names and their defaults.
+    #
+    # Returns the final configuration Hash.
+    def configuration(override = {})
+      config = Configuration.new
+      override = Configuration[override].stringify_keys
+      unless override.delete("skip_config_files")
+        config = config.read_config_files(config.config_files(override))
+      end
+
+      # Merge DEFAULTS < _config.yml < override
+      Configuration.from(Utils.deep_merge_hashes(config, override)).tap do |obj|
+        set_timezone(obj["timezone"]) if obj["timezone"]
+      end
+    end
+
+    # Public: Set the TZ environment variable to use the timezone specified
+    #
+    # timezone - the IANA Time Zone
+    #
+    # Returns nothing
+    # rubocop:disable Style/AccessorMethodName
+    def set_timezone(timezone)
+      ENV["TZ"] = if Utils::Platforms.really_windows?
+                    Utils::WinTZ.calculate(timezone)
+                  else
+                    timezone
+                  end
+    end
+    # rubocop:enable Style/AccessorMethodName
+
+    # Public: Fetch the logger instance for this Jekyll process.
+    #
+    # Returns the LogAdapter instance.
+    def logger
+      @logger ||= LogAdapter.new(Stevenson.new, (ENV["JEKYLL_LOG_LEVEL"] || :info).to_sym)
+    end
+
+    # Public: Set the log writer.
+    #         New log writer must respond to the same methods
+    #         as Ruby's interal Logger.
+    #
+    # writer - the new Logger-compatible log transport
+    #
+    # Returns the new logger.
+    def logger=(writer)
+      @logger = LogAdapter.new(writer, (ENV["JEKYLL_LOG_LEVEL"] || :info).to_sym)
+    end
+
+    # Public: An array of sites
+    #
+    # Returns the Jekyll sites created.
+    def sites
+      @sites ||= []
+    end
+
+    # Public: Ensures the questionable path is prefixed with the base directory
+    #         and prepends the questionable path with the base directory if false.
+    #
+    # base_directory - the directory with which to prefix the questionable path
+    # questionable_path - the path we're unsure about, and want prefixed
+    #
+    # Returns the sanitized path.
+    def sanitized_path(base_directory, questionable_path)
+      return base_directory if base_directory.eql?(questionable_path)
+
+      questionable_path.insert(0, "/") if questionable_path.start_with?("~")
+      clean_path = File.expand_path(questionable_path, "/")
+
+      return clean_path if clean_path.eql?(base_directory)
+
+      if clean_path.start_with?(base_directory.sub(%r!\z!, "/"))
+        clean_path
+      else
+        clean_path.sub!(%r!\A\w:/!, "/")
+        File.join(base_directory, clean_path)
+      end
+    end
+
+    # Conditional optimizations
+    Jekyll::External.require_if_present("liquid-c")
+  end
+end
+
+require "jekyll/drops/drop"
+require "jekyll/drops/document_drop"
+require_all "jekyll/commands"
+require_all "jekyll/converters"
+require_all "jekyll/converters/markdown"
+require_all "jekyll/drops"
+require_all "jekyll/generators"
+require_all "jekyll/tags"
+
+require "jekyll-sass-converter"
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/cleaner.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/cleaner.rb
new file mode 100644
index 0000000..db8a918
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/cleaner.rb
@@ -0,0 +1,108 @@
+require "set"
+
+module Jekyll
+  # Handles the cleanup of a site's destination before it is built.
+  class Cleaner
+    HIDDEN_FILE_REGEX = %r!\/\.{1,2}$!
+    attr_reader :site
+
+    def initialize(site)
+      @site = site
+    end
+
+    # Cleans up the site's destination directory
+    def cleanup!
+      FileUtils.rm_rf(obsolete_files)
+      FileUtils.rm_rf(metadata_file) unless @site.incremental?
+    end
+
+    private
+
+    # Private: The list of files and directories to be deleted during cleanup process
+    #
+    # Returns an Array of the file and directory paths
+    def obsolete_files
+      (existing_files - new_files - new_dirs + replaced_files).to_a
+    end
+
+    # Private: The metadata file storing dependency tree and build history
+    #
+    # Returns an Array with the metdata file as the only item
+    def metadata_file
+      [site.regenerator.metadata_file]
+    end
+
+    # Private: The list of existing files, apart from those included in
+    # keep_files and hidden files.
+    #
+    # Returns a Set with the file paths
+    def existing_files
+      files = Set.new
+      regex = keep_file_regex
+      dirs = keep_dirs
+
+      Utils.safe_glob(site.in_dest_dir, ["**", "*"], File::FNM_DOTMATCH).each do |file|
+        next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file)
+        files << file
+      end
+
+      files
+    end
+
+    # Private: The list of files to be created when site is built.
+    #
+    # Returns a Set with the file paths
+    def new_files
+      files = Set.new
+      site.each_site_file { |item| files << item.destination(site.dest) }
+      files
+    end
+
+    # Private: The list of directories to be created when site is built.
+    # These are the parent directories of the files in #new_files.
+    #
+    # Returns a Set with the directory paths
+    def new_dirs
+      new_files.map { |file| parent_dirs(file) }.flatten.to_set
+    end
+
+    # Private: The list of parent directories of a given file
+    #
+    # Returns an Array with the directory paths
+    def parent_dirs(file)
+      parent_dir = File.dirname(file)
+      if parent_dir == site.dest
+        []
+      else
+        [parent_dir] + parent_dirs(parent_dir)
+      end
+    end
+
+    # Private: The list of existing files that will be replaced by a directory
+    # during build
+    #
+    # Returns a Set with the file paths
+    def replaced_files
+      new_dirs.select { |dir| File.file?(dir) }.to_set
+    end
+
+    # Private: The list of directories that need to be kept because they are
+    # parent directories of files specified in keep_files
+    #
+    # Returns a Set with the directory paths
+    def keep_dirs
+      site.keep_files.map { |file| parent_dirs(site.in_dest_dir(file)) }.flatten.to_set
+    end
+
+    # Private: Creates a regular expression from the config's keep_files array
+    #
+    # Examples
+    #   ['.git','.svn'] with site.dest "/myblog/_site" creates
+    #   the following regex: /\A\/myblog\/_site\/(\.git|\/.svn)/
+    #
+    # Returns the regular expression
+    def keep_file_regex
+      %r!\A#{Regexp.quote(site.dest)}\/(#{Regexp.union(site.keep_files).source})!
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/collection.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/collection.rb
new file mode 100644
index 0000000..f839915
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/collection.rb
@@ -0,0 +1,228 @@
+module Jekyll
+  class Collection
+    attr_reader :site, :label, :metadata
+    attr_writer :docs
+
+    # Create a new Collection.
+    #
+    # site - the site to which this collection belongs.
+    # label - the name of the collection
+    #
+    # Returns nothing.
+    def initialize(site, label)
+      @site     = site
+      @label    = sanitize_label(label)
+      @metadata = extract_metadata
+    end
+
+    # Fetch the Documents in this collection.
+    # Defaults to an empty array if no documents have been read in.
+    #
+    # Returns an array of Jekyll::Document objects.
+    def docs
+      @docs ||= []
+    end
+
+    # Override of normal respond_to? to match method_missing's logic for
+    # looking in @data.
+    def respond_to_missing?(method, include_private = false)
+      docs.respond_to?(method.to_sym, include_private) || super
+    end
+
+    # Override of method_missing to check in @data for the key.
+    def method_missing(method, *args, &blck)
+      if docs.respond_to?(method.to_sym)
+        Jekyll.logger.warn "Deprecation:",
+          "#{label}.#{method} should be changed to #{label}.docs.#{method}."
+        Jekyll.logger.warn "", "Called by #{caller(0..0)}."
+        docs.public_send(method.to_sym, *args, &blck)
+      else
+        super
+      end
+    end
+
+    # Fetch the static files in this collection.
+    # Defaults to an empty array if no static files have been read in.
+    #
+    # Returns an array of Jekyll::StaticFile objects.
+    def files
+      @files ||= []
+    end
+
+    # Read the allowed documents into the collection's array of docs.
+    #
+    # Returns the sorted array of docs.
+    def read
+      filtered_entries.each do |file_path|
+        full_path = collection_dir(file_path)
+        next if File.directory?(full_path)
+        if Utils.has_yaml_header? full_path
+          read_document(full_path)
+        else
+          read_static_file(file_path, full_path)
+        end
+      end
+      docs.sort!
+    end
+
+    # All the entries in this collection.
+    #
+    # Returns an Array of file paths to the documents in this collection
+    #   relative to the collection's directory
+    def entries
+      return [] unless exists?
+      @entries ||=
+        Utils.safe_glob(collection_dir, ["**", "*"], File::FNM_DOTMATCH).map do |entry|
+          entry["#{collection_dir}/"] = ""
+          entry
+        end
+    end
+
+    # Filtered version of the entries in this collection.
+    # See `Jekyll::EntryFilter#filter` for more information.
+    #
+    # Returns a list of filtered entry paths.
+    def filtered_entries
+      return [] unless exists?
+      @filtered_entries ||=
+        Dir.chdir(directory) do
+          entry_filter.filter(entries).reject do |f|
+            path = collection_dir(f)
+            File.directory?(path) || entry_filter.symlink?(f)
+          end
+        end
+    end
+
+    # The directory for this Collection, relative to the site source.
+    #
+    # Returns a String containing the directory name where the collection
+    #   is stored on the filesystem.
+    def relative_directory
+      @relative_directory ||= "_#{label}"
+    end
+
+    # The full path to the directory containing the collection.
+    #
+    # Returns a String containing th directory name where the collection
+    #   is stored on the filesystem.
+    def directory
+      @directory ||= site.in_source_dir(relative_directory)
+    end
+
+    # The full path to the directory containing the collection, with
+    #   optional subpaths.
+    #
+    # *files - (optional) any other path pieces relative to the
+    #           directory to append to the path
+    #
+    # Returns a String containing th directory name where the collection
+    #   is stored on the filesystem.
+    def collection_dir(*files)
+      return directory if files.empty?
+      site.in_source_dir(relative_directory, *files)
+    end
+
+    # Checks whether the directory "exists" for this collection.
+    # The directory must exist on the filesystem and must not be a symlink
+    #   if in safe mode.
+    #
+    # Returns false if the directory doesn't exist or if it's a symlink
+    #   and we're in safe mode.
+    def exists?
+      File.directory?(directory) && !entry_filter.symlink?(directory)
+    end
+
+    # The entry filter for this collection.
+    # Creates an instance of Jekyll::EntryFilter.
+    #
+    # Returns the instance of Jekyll::EntryFilter for this collection.
+    def entry_filter
+      @entry_filter ||= Jekyll::EntryFilter.new(site, relative_directory)
+    end
+
+    # An inspect string.
+    #
+    # Returns the inspect string
+    def inspect
+      "#<Jekyll::Collection @label=#{label} docs=#{docs}>"
+    end
+
+    # Produce a sanitized label name
+    # Label names may not contain anything but alphanumeric characters,
+    #   underscores, and hyphens.
+    #
+    # label - the possibly-unsafe label
+    #
+    # Returns a sanitized version of the label.
+    def sanitize_label(label)
+      label.gsub(%r![^a-z0-9_\-\.]!i, "")
+    end
+
+    # Produce a representation of this Collection for use in Liquid.
+    # Exposes two attributes:
+    #   - label
+    #   - docs
+    #
+    # Returns a representation of this collection for use in Liquid.
+    def to_liquid
+      Drops::CollectionDrop.new self
+    end
+
+    # Whether the collection's documents ought to be written as individual
+    #   files in the output.
+    #
+    # Returns true if the 'write' metadata is true, false otherwise.
+    def write?
+      !!metadata.fetch("output", false)
+    end
+
+    # The URL template to render collection's documents at.
+    #
+    # Returns the URL template to render collection's documents at.
+    def url_template
+      @url_template ||= metadata.fetch("permalink") do
+        Utils.add_permalink_suffix("/:collection/:path", site.permalink_style)
+      end
+    end
+
+    # Extract options for this collection from the site configuration.
+    #
+    # Returns the metadata for this collection
+    def extract_metadata
+      if site.config["collections"].is_a?(Hash)
+        site.config["collections"][label] || {}
+      else
+        {}
+      end
+    end
+
+    private
+
+    def read_document(full_path)
+      doc = Jekyll::Document.new(full_path, :site => site, :collection => self)
+      doc.read
+      if site.publisher.publish?(doc) || !write?
+        docs << doc
+      else
+        Jekyll.logger.debug "Skipped From Publishing:", doc.relative_path
+      end
+    end
+
+    private
+
+    def read_static_file(file_path, full_path)
+      relative_dir = Jekyll.sanitized_path(
+        relative_directory,
+        File.dirname(file_path)
+      ).chomp("/.")
+
+      files << StaticFile.new(
+        site,
+        site.source,
+        relative_dir,
+        File.basename(full_path),
+        self
+      )
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/command.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/command.rb
new file mode 100644
index 0000000..f9f243d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/command.rb
@@ -0,0 +1,76 @@
+module Jekyll
+  class Command
+    class << self
+      # A list of subclasses of Jekyll::Command
+      def subclasses
+        @subclasses ||= []
+      end
+
+      # Keep a list of subclasses of Jekyll::Command every time it's inherited
+      # Called automatically.
+      #
+      # base - the subclass
+      #
+      # Returns nothing
+      def inherited(base)
+        subclasses << base
+        super(base)
+      end
+
+      # Run Site#process and catch errors
+      #
+      # site - the Jekyll::Site object
+      #
+      # Returns nothing
+      def process_site(site)
+        site.process
+      rescue Jekyll::Errors::FatalException => e
+        Jekyll.logger.error "ERROR:", "YOUR SITE COULD NOT BE BUILT:"
+        Jekyll.logger.error "", "------------------------------------"
+        Jekyll.logger.error "", e.message
+        exit(1)
+      end
+
+      # Create a full Jekyll configuration with the options passed in as overrides
+      #
+      # options - the configuration overrides
+      #
+      # Returns a full Jekyll configuration
+      def configuration_from_options(options)
+        return options if options.is_a?(Jekyll::Configuration)
+        Jekyll.configuration(options)
+      end
+
+      # Add common options to a command for building configuration
+      #
+      # c - the Jekyll::Command to add these options to
+      #
+      # Returns nothing
+      # rubocop:disable Metrics/MethodLength
+      def add_build_options(c)
+        c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]",
+          Array, "Custom configuration file"
+        c.option "destination", "-d", "--destination DESTINATION",
+          "The current folder will be generated into DESTINATION"
+        c.option "source", "-s", "--source SOURCE", "Custom source directory"
+        c.option "future", "--future", "Publishes posts with a future date"
+        c.option "limit_posts", "--limit_posts MAX_POSTS", Integer,
+          "Limits the number of posts to parse and publish"
+        c.option "watch", "-w", "--[no-]watch", "Watch for changes and rebuild"
+        c.option "baseurl", "-b", "--baseurl URL",
+          "Serve the website from the given base URL"
+        c.option "force_polling", "--force_polling", "Force watch to use polling"
+        c.option "lsi", "--lsi", "Use LSI for improved related posts"
+        c.option "show_drafts", "-D", "--drafts", "Render posts in the _drafts folder"
+        c.option "unpublished", "--unpublished",
+          "Render posts that were marked as unpublished"
+        c.option "quiet", "-q", "--quiet", "Silence output."
+        c.option "verbose", "-V", "--verbose", "Print verbose output."
+        c.option "incremental", "-I", "--incremental", "Enable incremental rebuild."
+        c.option "strict_front_matter", "--strict_front_matter",
+          "Fail if errors are present in front matter"
+      end
+      # rubocop:enable Metrics/MethodLength
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/build.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/build.rb
new file mode 100644
index 0000000..3cea607
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/build.rb
@@ -0,0 +1,100 @@
+module Jekyll
+  module Commands
+    class Build < Command
+      class << self
+        # Create the Mercenary command for the Jekyll CLI for this Command
+        def init_with_program(prog)
+          prog.command(:build) do |c|
+            c.syntax      "build [options]"
+            c.description "Build your site"
+            c.alias :b
+
+            add_build_options(c)
+
+            c.action do |_, options|
+              options["serving"] = false
+              Jekyll::Commands::Build.process(options)
+            end
+          end
+        end
+
+        # Build your jekyll site
+        # Continuously watch if `watch` is set to true in the config.
+        def process(options)
+          # Adjust verbosity quickly
+          Jekyll.logger.adjust_verbosity(options)
+
+          options = configuration_from_options(options)
+          site = Jekyll::Site.new(options)
+
+          if options.fetch("skip_initial_build", false)
+            Jekyll.logger.warn "Build Warning:", "Skipping the initial build." \
+                        " This may result in an out-of-date site."
+          else
+            build(site, options)
+          end
+
+          if options.fetch("detach", false)
+            Jekyll.logger.info "Auto-regeneration:",
+              "disabled when running server detached."
+          elsif options.fetch("watch", false)
+            watch(site, options)
+          else
+            Jekyll.logger.info "Auto-regeneration:", "disabled. Use --watch to enable."
+          end
+        end
+
+        # Build your Jekyll site.
+        #
+        # site - the Jekyll::Site instance to build
+        # options - A Hash of options passed to the command
+        #
+        # Returns nothing.
+        def build(site, options)
+          t = Time.now
+          source      = options["source"]
+          destination = options["destination"]
+          incremental = options["incremental"]
+          Jekyll.logger.info "Source:", source
+          Jekyll.logger.info "Destination:", destination
+          Jekyll.logger.info "Incremental build:",
+            (incremental ? "enabled" : "disabled. Enable with --incremental")
+          Jekyll.logger.info "Generating..."
+          process_site(site)
+          Jekyll.logger.info "", "done in #{(Time.now - t).round(3)} seconds."
+        end
+
+        # Private: Watch for file changes and rebuild the site.
+        #
+        # site - A Jekyll::Site instance
+        # options - A Hash of options passed to the command
+        #
+        # Returns nothing.
+        def watch(site, options)
+          # Warn Windows users that they might need to upgrade.
+          if Utils::Platforms.bash_on_windows?
+            Jekyll.logger.warn "",
+              "Auto-regeneration may not work on some Windows versions."
+            Jekyll.logger.warn "",
+              "Please see: https://github.com/Microsoft/BashOnWindows/issues/216"
+            Jekyll.logger.warn "",
+              "If it does not work, please upgrade Bash on Windows or "\
+                "run Jekyll with --no-watch."
+          end
+
+          External.require_with_graceful_fail "jekyll-watch"
+          watch_method = Jekyll::Watcher.method(:watch)
+          if watch_method.parameters.size == 1
+            watch_method.call(
+              options
+            )
+          else
+            watch_method.call(
+              options, site
+            )
+          end
+        end
+      end # end of class << self
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/clean.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/clean.rb
new file mode 100644
index 0000000..3a44d59
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/clean.rb
@@ -0,0 +1,41 @@
+module Jekyll
+  module Commands
+    class Clean < Command
+      class << self
+        def init_with_program(prog)
+          prog.command(:clean) do |c|
+            c.syntax "clean [subcommand]"
+            c.description "Clean the site " \
+                  "(removes site output and metadata file) without building."
+
+            add_build_options(c)
+
+            c.action do |_, options|
+              Jekyll::Commands::Clean.process(options)
+            end
+          end
+        end
+
+        def process(options)
+          options = configuration_from_options(options)
+          destination = options["destination"]
+          metadata_file = File.join(options["source"], ".jekyll-metadata")
+          sass_cache = File.join(options["source"], ".sass-cache")
+
+          remove(destination, :checker_func => :directory?)
+          remove(metadata_file, :checker_func => :file?)
+          remove(sass_cache, :checker_func => :directory?)
+        end
+
+        def remove(filename, checker_func: :file?)
+          if File.public_send(checker_func, filename)
+            Jekyll.logger.info "Cleaner:", "Removing #{filename}..."
+            FileUtils.rm_rf(filename)
+          else
+            Jekyll.logger.info "Cleaner:", "Nothing to do for #{filename}."
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/doctor.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/doctor.rb
new file mode 100644
index 0000000..59004c9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/doctor.rb
@@ -0,0 +1,116 @@
+module Jekyll
+  module Commands
+    class Doctor < Command
+      class << self
+        def init_with_program(prog)
+          prog.command(:doctor) do |c|
+            c.syntax "doctor"
+            c.description "Search site and print specific deprecation warnings"
+            c.alias(:hyde)
+
+            c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", Array,
+                            "Custom configuration file"
+
+            c.action do |_, options|
+              Jekyll::Commands::Doctor.process(options)
+            end
+          end
+        end
+
+        def process(options)
+          site = Jekyll::Site.new(configuration_from_options(options))
+          site.reset
+          site.read
+          site.generate
+
+          if healthy?(site)
+            Jekyll.logger.info "Your test results", "are in. Everything looks fine."
+          else
+            abort
+          end
+        end
+
+        def healthy?(site)
+          [
+            fsnotify_buggy?(site),
+            !deprecated_relative_permalinks(site),
+            !conflicting_urls(site),
+            !urls_only_differ_by_case(site),
+          ].all?
+        end
+
+        def deprecated_relative_permalinks(site)
+          if site.config["relative_permalinks"]
+            Jekyll::Deprecator.deprecation_message "Your site still uses relative" \
+                                " permalinks, which was removed in" \
+                                " Jekyll v3.0.0."
+            return true
+          end
+        end
+
+        def conflicting_urls(site)
+          conflicting_urls = false
+          urls = {}
+          urls = collect_urls(urls, site.pages, site.dest)
+          urls = collect_urls(urls, site.posts.docs, site.dest)
+          urls.each do |url, paths|
+            next unless paths.size > 1
+            conflicting_urls = true
+            Jekyll.logger.warn "Conflict:", "The URL '#{url}' is the destination" \
+              " for the following pages: #{paths.join(", ")}"
+          end
+          conflicting_urls
+        end
+
+        def fsnotify_buggy?(_site)
+          return true unless Utils::Platforms.osx?
+          if Dir.pwd != `pwd`.strip
+            Jekyll.logger.error "  " + <<-STR.strip.gsub(%r!\n\s+!, "\n  ")
+              We have detected that there might be trouble using fsevent on your
+              operating system, you can read https://github.com/thibaudgg/rb-fsevent/wiki/no-fsevents-fired-(OSX-bug)
+              for possible work arounds or you can work around it immediately
+              with `--force-polling`.
+            STR
+
+            false
+          end
+
+          true
+        end
+
+        def urls_only_differ_by_case(site)
+          urls_only_differ_by_case = false
+          urls = case_insensitive_urls(site.pages + site.docs_to_write, site.dest)
+          urls.each do |_case_insensitive_url, real_urls|
+            next unless real_urls.uniq.size > 1
+            urls_only_differ_by_case = true
+            Jekyll.logger.warn "Warning:", "The following URLs only differ" \
+              " by case. On a case-insensitive file system one of the URLs" \
+              " will be overwritten by the other: #{real_urls.join(", ")}"
+          end
+          urls_only_differ_by_case
+        end
+
+        private
+        def collect_urls(urls, things, destination)
+          things.each do |thing|
+            dest = thing.destination(destination)
+            if urls[dest]
+              urls[dest] << thing.path
+            else
+              urls[dest] = [thing.path]
+            end
+          end
+          urls
+        end
+
+        def case_insensitive_urls(things, destination)
+          things.each_with_object({}) do |thing, memo|
+            dest = thing.destination(destination)
+            (memo[dest.downcase] ||= []) << dest
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/help.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/help.rb
new file mode 100644
index 0000000..b4f136b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/help.rb
@@ -0,0 +1,32 @@
+module Jekyll
+  module Commands
+    class Help < Command
+      class << self
+        def init_with_program(prog)
+          prog.command(:help) do |c|
+            c.syntax "help [subcommand]"
+            c.description "Show the help message, optionally for a given subcommand."
+
+            c.action do |args, _|
+              cmd = (args.first || "").to_sym
+              if args.empty?
+                puts prog
+              elsif prog.has_command? cmd
+                puts prog.commands[cmd]
+              else
+                invalid_command(prog, cmd)
+                abort
+              end
+            end
+          end
+        end
+
+        def invalid_command(prog, cmd)
+          Jekyll.logger.error "Error:",
+                "Hmm... we don't know what the '#{cmd}' command is."
+          Jekyll.logger.info  "Valid commands:", prog.commands.keys.join(", ")
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/new.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/new.rb
new file mode 100644
index 0000000..ce1d5e7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/new.rb
@@ -0,0 +1,150 @@
+require "erb"
+
+module Jekyll
+  module Commands
+    class New < Command
+      class << self
+        def init_with_program(prog)
+          prog.command(:new) do |c|
+            c.syntax "new PATH"
+            c.description "Creates a new Jekyll site scaffold in PATH"
+
+            c.option "force", "--force", "Force creation even if PATH already exists"
+            c.option "blank", "--blank", "Creates scaffolding but with empty files"
+            c.option "skip-bundle", "--skip-bundle", "Skip 'bundle install'"
+
+            c.action do |args, options|
+              Jekyll::Commands::New.process(args, options)
+            end
+          end
+        end
+
+        def process(args, options = {})
+          raise ArgumentError, "You must specify a path." if args.empty?
+
+          new_blog_path = File.expand_path(args.join(" "), Dir.pwd)
+          FileUtils.mkdir_p new_blog_path
+          if preserve_source_location?(new_blog_path, options)
+            Jekyll.logger.abort_with "Conflict:",
+                      "#{new_blog_path} exists and is not empty."
+          end
+
+          if options["blank"]
+            create_blank_site new_blog_path
+          else
+            create_site new_blog_path
+          end
+
+          after_install(new_blog_path, options)
+        end
+
+        def create_blank_site(path)
+          Dir.chdir(path) do
+            FileUtils.mkdir(%w(_layouts _posts _drafts))
+            FileUtils.touch("index.html")
+          end
+        end
+
+        def scaffold_post_content
+          ERB.new(File.read(File.expand_path(scaffold_path, site_template))).result
+        end
+
+        # Internal: Gets the filename of the sample post to be created
+        #
+        # Returns the filename of the sample post, as a String
+        def initialized_post_name
+          "_posts/#{Time.now.strftime("%Y-%m-%d")}-welcome-to-jekyll.markdown"
+        end
+
+        private
+
+        def gemfile_contents
+          <<-RUBY
+source "https://rubygems.org"
+
+# Hello! This is where you manage which Jekyll version is used to run.
+# When you want to use a different version, change it below, save the
+# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
+#
+#     bundle exec jekyll serve
+#
+# This will help ensure the proper Jekyll version is running.
+# Happy Jekylling!
+gem "jekyll", "#{Jekyll::VERSION}"
+
+# This is the default theme for new Jekyll sites. You may change this to anything you like.
+gem "minima", "~> 2.0"
+
+# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
+# uncomment the line below. To upgrade, run `bundle update github-pages`.
+# gem "github-pages", group: :jekyll_plugins
+
+# If you have any plugins, put them here!
+group :jekyll_plugins do
+   gem "jekyll-feed", "~> 0.6"
+end
+
+# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
+gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
+
+RUBY
+        end
+
+        def create_site(new_blog_path)
+          create_sample_files new_blog_path
+
+          File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f|
+            f.write(scaffold_post_content)
+          end
+
+          File.open(File.expand_path("Gemfile", new_blog_path), "w") do |f|
+            f.write(gemfile_contents)
+          end
+        end
+
+        def preserve_source_location?(path, options)
+          !options["force"] && !Dir["#{path}/**/*"].empty?
+        end
+
+        def create_sample_files(path)
+          FileUtils.cp_r site_template + "/.", path
+          FileUtils.chmod_R "u+w", path
+          FileUtils.rm File.expand_path(scaffold_path, path)
+        end
+
+        def site_template
+          File.expand_path("../../site_template", File.dirname(__FILE__))
+        end
+
+        def scaffold_path
+          "_posts/0000-00-00-welcome-to-jekyll.markdown.erb"
+        end
+
+        # After a new blog has been created, print a success notification and
+        # then automatically execute bundle install from within the new blog dir
+        # unless the user opts to generate a blank blog or skip 'bundle install'.
+
+        def after_install(path, options = {})
+          unless options["blank"] || options["skip-bundle"]
+            bundle_install path
+          end
+
+          Jekyll.logger.info "New jekyll site installed in #{path.cyan}."
+          Jekyll.logger.info "Bundle install skipped." if options["skip-bundle"]
+        end
+
+        def bundle_install(path)
+          Jekyll::External.require_with_graceful_fail "bundler"
+          Jekyll.logger.info "Running bundle install in #{path.cyan}..."
+          Dir.chdir(path) do
+            process, output = Jekyll::Utils::Exec.run("bundle", "install")
+            output.to_s.each_line do |line|
+              Jekyll.logger.info("Bundler:".green, line.strip) unless line.to_s.empty?
+            end
+            raise SystemExit unless process.success?
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/new_theme.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/new_theme.rb
new file mode 100644
index 0000000..65125d5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/new_theme.rb
@@ -0,0 +1,38 @@
+require "erb"
+
+class Jekyll::Commands::NewTheme < Jekyll::Command
+  class << self
+    def init_with_program(prog)
+      prog.command(:"new-theme") do |c|
+        c.syntax "new-theme NAME"
+        c.description "Creates a new Jekyll theme scaffold"
+        c.option "code_of_conduct", \
+          "-c", "--code-of-conduct", \
+          "Include a Code of Conduct. (defaults to false)"
+
+        c.action do |args, opts|
+          Jekyll::Commands::NewTheme.process(args, opts)
+        end
+      end
+    end
+
+    # rubocop:disable Metrics/AbcSize
+    def process(args, opts)
+      if !args || args.empty?
+        raise Jekyll::Errors::InvalidThemeName, "You must specify a theme name."
+      end
+
+      new_theme_name = args.join("_")
+      theme = Jekyll::ThemeBuilder.new(new_theme_name, opts)
+      if theme.path.exist?
+        Jekyll.logger.abort_with "Conflict:", "#{theme.path} already exists."
+      end
+
+      theme.create!
+      Jekyll.logger.info "Your new Jekyll theme, #{theme.name.cyan}," \
+        " is ready for you in #{theme.path.to_s.cyan}!"
+      Jekyll.logger.info "For help getting started, read #{theme.path}/README.md."
+    end
+    # rubocop:enable Metrics/AbcSize
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/serve.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/serve.rb
new file mode 100644
index 0000000..50a85fa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/serve.rb
@@ -0,0 +1,243 @@
+module Jekyll
+  module Commands
+    class Serve < Command
+      class << self
+        COMMAND_OPTIONS = {
+          "ssl_cert"           => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."],
+          "host"               => ["host", "-H", "--host [HOST]", "Host to bind to"],
+          "open_url"           => ["-o", "--open-url", "Launch your site in a browser"],
+          "detach"             => ["-B", "--detach", "Run the server in the background"],
+          "ssl_key"            => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."],
+          "port"               => ["-P", "--port [PORT]", "Port to listen on"],
+          "show_dir_listing"   => ["--show-dir-listing",
+            "Show a directory listing instead of loading your index file.",],
+          "skip_initial_build" => ["skip_initial_build", "--skip-initial-build",
+            "Skips the initial site build which occurs before the server is started.",],
+        }.freeze
+
+        #
+
+        def init_with_program(prog)
+          prog.command(:serve) do |cmd|
+            cmd.description "Serve your site locally"
+            cmd.syntax "serve [options]"
+            cmd.alias :server
+            cmd.alias :s
+
+            add_build_options(cmd)
+            COMMAND_OPTIONS.each do |key, val|
+              cmd.option key, *val
+            end
+
+            cmd.action do |_, opts|
+              opts["serving"] = true
+              opts["watch"  ] = true unless opts.key?("watch")
+
+              config = configuration_from_options(opts)
+              if Jekyll.env == "development"
+                config["url"] = default_url(config)
+              end
+              [Build, Serve].each { |klass| klass.process(config) }
+            end
+          end
+        end
+
+        #
+
+        def process(opts)
+          opts = configuration_from_options(opts)
+          destination = opts["destination"]
+          setup(destination)
+
+          start_up_webrick(opts, destination)
+        end
+
+        # Do a base pre-setup of WEBRick so that everything is in place
+        # when we get ready to party, checking for an setting up an error page
+        # and making sure our destination exists.
+
+        private
+        def setup(destination)
+          require_relative "serve/servlet"
+
+          FileUtils.mkdir_p(destination)
+          if File.exist?(File.join(destination, "404.html"))
+            WEBrick::HTTPResponse.class_eval do
+              def create_error_page
+                @header["Content-Type"] = "text/html; charset=UTF-8"
+                @body = IO.read(File.join(@config[:DocumentRoot], "404.html"))
+              end
+            end
+          end
+        end
+
+        #
+
+        private
+        def webrick_opts(opts)
+          opts = {
+            :JekyllOptions      => opts,
+            :DoNotReverseLookup => true,
+            :MimeTypes          => mime_types,
+            :DocumentRoot       => opts["destination"],
+            :StartCallback      => start_callback(opts["detach"]),
+            :BindAddress        => opts["host"],
+            :Port               => opts["port"],
+            :DirectoryIndex     => %W(
+              index.htm
+              index.html
+              index.rhtml
+              index.cgi
+              index.xml
+            ),
+          }
+
+          opts[:DirectoryIndex] = [] if opts[:JekyllOptions]["show_dir_listing"]
+
+          enable_ssl(opts)
+          enable_logging(opts)
+          opts
+        end
+
+        #
+
+        private
+        def start_up_webrick(opts, destination)
+          server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") }
+          server.mount(opts["baseurl"].to_s, Servlet, destination, file_handler_opts)
+          Jekyll.logger.info "Server address:", server_address(server, opts)
+          launch_browser server, opts if opts["open_url"]
+          boot_or_detach server, opts
+        end
+
+        # Recreate NondisclosureName under utf-8 circumstance
+
+        private
+        def file_handler_opts
+          WEBrick::Config::FileHandler.merge({
+            :FancyIndexing     => true,
+            :NondisclosureName => [
+              ".ht*", "~*",
+            ],
+          })
+        end
+
+        #
+
+        private
+        def server_address(server, options = {})
+          format_url(
+            server.config[:SSLEnable],
+            server.config[:BindAddress],
+            server.config[:Port],
+            options["baseurl"]
+          )
+        end
+
+        private
+        def format_url(ssl_enabled, address, port, baseurl = nil)
+          format("%<prefix>s://%<address>s:%<port>i%<baseurl>s", {
+            :prefix  => ssl_enabled ? "https" : "http",
+            :address => address,
+            :port    => port,
+            :baseurl => baseurl ? "#{baseurl}/" : "",
+          })
+        end
+
+        #
+
+        private
+        def default_url(opts)
+          config = configuration_from_options(opts)
+          format_url(
+            config["ssl_cert"] && config["ssl_key"],
+            config["host"] == "127.0.0.1" ? "localhost" : config["host"],
+            config["port"]
+          )
+        end
+
+        #
+
+        private
+        def launch_browser(server, opts)
+          address = server_address(server, opts)
+          return system "start", address if Utils::Platforms.windows?
+          return system "xdg-open", address if Utils::Platforms.linux?
+          return system "open", address if Utils::Platforms.osx?
+          Jekyll.logger.error "Refusing to launch browser; " \
+            "Platform launcher unknown."
+        end
+
+        # Keep in our area with a thread or detach the server as requested
+        # by the user.  This method determines what we do based on what you
+        # ask us to do.
+
+        private
+        def boot_or_detach(server, opts)
+          if opts["detach"]
+            pid = Process.fork do
+              server.start
+            end
+
+            Process.detach(pid)
+            Jekyll.logger.info "Server detached with pid '#{pid}'.", \
+              "Run `pkill -f jekyll' or `kill -9 #{pid}' to stop the server."
+          else
+            t = Thread.new { server.start }
+            trap("INT") { server.shutdown }
+            t.join
+          end
+        end
+
+        # Make the stack verbose if the user requests it.
+
+        private
+        def enable_logging(opts)
+          opts[:AccessLog] = []
+          level = WEBrick::Log.const_get(opts[:JekyllOptions]["verbose"] ? :DEBUG : :WARN)
+          opts[:Logger] = WEBrick::Log.new($stdout, level)
+        end
+
+        # Add SSL to the stack if the user triggers --enable-ssl and they
+        # provide both types of certificates commonly needed.  Raise if they
+        # forget to add one of the certificates.
+
+        private
+        # rubocop:disable Metrics/AbcSize
+        def enable_ssl(opts)
+          return if !opts[:JekyllOptions]["ssl_cert"] && !opts[:JekyllOptions]["ssl_key"]
+          if !opts[:JekyllOptions]["ssl_cert"] || !opts[:JekyllOptions]["ssl_key"]
+            # rubocop:disable Style/RedundantException
+            raise RuntimeError, "--ssl-cert or --ssl-key missing."
+          end
+          require "openssl"
+          require "webrick/https"
+          source_key = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], \
+                    opts[:JekyllOptions]["ssl_key" ])
+          source_certificate = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], \
+                    opts[:JekyllOptions]["ssl_cert"])
+          opts[:SSLCertificate] =
+            OpenSSL::X509::Certificate.new(File.read(source_certificate))
+          opts[:SSLPrivateKey ] = OpenSSL::PKey::RSA.new(File.read(source_key))
+          opts[:SSLEnable] = true
+        end
+
+        private
+
+        def start_callback(detached)
+          unless detached
+            proc do
+              Jekyll.logger.info("Server running...", "press ctrl-c to stop.")
+            end
+          end
+        end
+
+        private
+        def mime_types
+          file = File.expand_path("../mime.types", File.dirname(__FILE__))
+          WEBrick::HTTPUtils.load_mime_types(file)
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/serve/servlet.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/serve/servlet.rb
new file mode 100644
index 0000000..3ae5cf3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/commands/serve/servlet.rb
@@ -0,0 +1,60 @@
+require "webrick"
+
+module Jekyll
+  module Commands
+    class Serve
+      class Servlet < WEBrick::HTTPServlet::FileHandler
+        DEFAULTS = {
+          "Cache-Control" => "private, max-age=0, proxy-revalidate, " \
+            "no-store, no-cache, must-revalidate",
+        }.freeze
+
+        def initialize(server, root, callbacks)
+          # So we can access them easily.
+          @jekyll_opts = server.config[:JekyllOptions]
+          set_defaults
+          super
+        end
+
+        # Add the ability to tap file.html the same way that Nginx does on our
+        # Docker images (or on GitHub Pages.) The difference is that we might end
+        # up with a different preference on which comes first.
+
+        def search_file(req, res, basename)
+          # /file.* > /file/index.html > /file.html
+          super || super(req, res, "#{basename}.html")
+        end
+
+        # rubocop:disable Style/MethodName
+        def do_GET(req, res)
+          rtn = super
+          validate_and_ensure_charset(req, res)
+          res.header.merge!(@headers)
+          rtn
+        end
+
+        #
+
+        private
+        def validate_and_ensure_charset(_req, res)
+          key = res.header.keys.grep(%r!content-type!i).first
+          typ = res.header[key]
+
+          unless typ =~ %r!;\s*charset=!
+            res.header[key] = "#{typ}; charset=#{@jekyll_opts["encoding"]}"
+          end
+        end
+
+        #
+
+        private
+        def set_defaults
+          hash_ = @jekyll_opts.fetch("webrick", {}).fetch("headers", {})
+          DEFAULTS.each_with_object(@headers = hash_) do |(key, val), hash|
+            hash[key] = val unless hash.key?(key)
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/configuration.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/configuration.rb
new file mode 100644
index 0000000..ec8e2a2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/configuration.rb
@@ -0,0 +1,410 @@
+# encoding: UTF-8
+
+module Jekyll
+  class Configuration < Hash
+    # Default options. Overridden by values in _config.yml.
+    # Strings rather than symbols are used for compatibility with YAML.
+    DEFAULTS = Configuration[{
+      # Where things are
+      "source"              => Dir.pwd,
+      "destination"         => File.join(Dir.pwd, "_site"),
+      "plugins_dir"         => "_plugins",
+      "layouts_dir"         => "_layouts",
+      "data_dir"            => "_data",
+      "includes_dir"        => "_includes",
+      "collections"         => {},
+
+      # Handling Reading
+      "safe"                => false,
+      "include"             => [".htaccess"],
+      "exclude"             => %w(
+        Gemfile Gemfile.lock node_modules vendor/bundle/ vendor/cache/ vendor/gems/
+        vendor/ruby/
+      ),
+      "keep_files"          => [".git", ".svn"],
+      "encoding"            => "utf-8",
+      "markdown_ext"        => "markdown,mkdown,mkdn,mkd,md",
+      "strict_front_matter" => false,
+
+      # Filtering Content
+      "show_drafts"         => nil,
+      "limit_posts"         => 0,
+      "future"              => false,
+      "unpublished"         => false,
+
+      # Plugins
+      "whitelist"           => [],
+      "plugins"             => [],
+
+      # Conversion
+      "markdown"            => "kramdown",
+      "highlighter"         => "rouge",
+      "lsi"                 => false,
+      "excerpt_separator"   => "\n\n",
+      "incremental"         => false,
+
+      # Serving
+      "detach"              => false, # default to not detaching the server
+      "port"                => "4000",
+      "host"                => "127.0.0.1",
+      "baseurl"             => nil, # this mounts at /, i.e. no subdirectory
+      "show_dir_listing"    => false,
+
+      # Output Configuration
+      "permalink"           => "date",
+      "paginate_path"       => "/page:num",
+      "timezone"            => nil, # use the local timezone
+
+      "quiet"               => false,
+      "verbose"             => false,
+      "defaults"            => [],
+
+      "liquid"              => {
+        "error_mode" => "warn",
+      },
+
+      "rdiscount"           => {
+        "extensions" => [],
+      },
+
+      "redcarpet"           => {
+        "extensions" => [],
+      },
+
+      "kramdown"            => {
+        "auto_ids"      => true,
+        "toc_levels"    => "1..6",
+        "entity_output" => "as_char",
+        "smart_quotes"  => "lsquo,rsquo,ldquo,rdquo",
+        "input"         => "GFM",
+        "hard_wrap"     => false,
+        "footnote_nr"   => 1,
+      },
+    }.map { |k, v| [k, v.freeze] }].freeze
+
+    class << self
+      # Static: Produce a Configuration ready for use in a Site.
+      # It takes the input, fills in the defaults where values do not
+      # exist, and patches common issues including migrating options for
+      # backwards compatiblity. Except where a key or value is being fixed,
+      # the user configuration will override the defaults.
+      #
+      # user_config - a Hash or Configuration of overrides.
+      #
+      # Returns a Configuration filled with defaults and fixed for common
+      # problems and backwards-compatibility.
+      def from(user_config)
+        Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys)
+          .fix_common_issues.add_default_collections
+      end
+    end
+
+    # Public: Turn all keys into string
+    #
+    # Return a copy of the hash where all its keys are strings
+    def stringify_keys
+      reduce({}) { |hsh, (k, v)| hsh.merge(k.to_s => v) }
+    end
+
+    def get_config_value_with_override(config_key, override)
+      override[config_key] || self[config_key] || DEFAULTS[config_key]
+    end
+
+    # Public: Directory of the Jekyll source folder
+    #
+    # override - the command-line options hash
+    #
+    # Returns the path to the Jekyll source directory
+    def source(override)
+      get_config_value_with_override("source", override)
+    end
+
+    def quiet(override = {})
+      get_config_value_with_override("quiet", override)
+    end
+    alias_method :quiet?, :quiet
+
+    def verbose(override = {})
+      get_config_value_with_override("verbose", override)
+    end
+    alias_method :verbose?, :verbose
+
+    def safe_load_file(filename)
+      case File.extname(filename)
+      when %r!\.toml!i
+        Jekyll::External.require_with_graceful_fail("toml") unless defined?(TOML)
+        TOML.load_file(filename)
+      when %r!\.ya?ml!i
+        SafeYAML.load_file(filename) || {}
+      else
+        raise ArgumentError, "No parser for '#{filename}' is available.
+          Use a .y(a)ml or .toml file instead."
+      end
+    end
+
+    # Public: Generate list of configuration files from the override
+    #
+    # override - the command-line options hash
+    #
+    # Returns an Array of config files
+    def config_files(override)
+      # Adjust verbosity quickly
+      Jekyll.logger.adjust_verbosity(
+        :quiet   => quiet?(override),
+        :verbose => verbose?(override)
+      )
+
+      # Get configuration from <source>/_config.yml or <source>/<config_file>
+      config_files = override.delete("config")
+      if config_files.to_s.empty?
+        default = %w(yml yaml).find(-> { "yml" }) do |ext|
+          File.exist?(Jekyll.sanitized_path(source(override), "_config.#{ext}"))
+        end
+        config_files = Jekyll.sanitized_path(source(override), "_config.#{default}")
+        @default_config_file = true
+      end
+      config_files = [config_files] unless config_files.is_a? Array
+      config_files
+    end
+
+    # Public: Read configuration and return merged Hash
+    #
+    # file - the path to the YAML file to be read in
+    #
+    # Returns this configuration, overridden by the values in the file
+    def read_config_file(file)
+      next_config = safe_load_file(file)
+      check_config_is_hash!(next_config, file)
+      Jekyll.logger.info "Configuration file:", file
+      next_config
+    rescue SystemCallError
+      if @default_config_file ||= nil
+        Jekyll.logger.warn "Configuration file:", "none"
+        {}
+      else
+        Jekyll.logger.error "Fatal:", "The configuration file '#{file}'
+          could not be found."
+        raise LoadError, "The Configuration file '#{file}' could not be found."
+      end
+    end
+
+    # Public: Read in a list of configuration files and merge with this hash
+    #
+    # files - the list of configuration file paths
+    #
+    # Returns the full configuration, with the defaults overridden by the values in the
+    # configuration files
+    def read_config_files(files)
+      configuration = clone
+
+      begin
+        files.each do |config_file|
+          next if config_file.nil? || config_file.empty?
+          new_config = read_config_file(config_file)
+          configuration = Utils.deep_merge_hashes(configuration, new_config)
+        end
+      rescue ArgumentError => err
+        Jekyll.logger.warn "WARNING:", "Error reading configuration. " \
+                     "Using defaults (and options)."
+        $stderr.puts err
+      end
+
+      configuration.fix_common_issues.backwards_compatibilize.add_default_collections
+    end
+
+    # Public: Split a CSV string into an array containing its values
+    #
+    # csv - the string of comma-separated values
+    #
+    # Returns an array of the values contained in the CSV
+    def csv_to_array(csv)
+      csv.split(",").map(&:strip)
+    end
+
+    # Public: Ensure the proper options are set in the configuration to allow for
+    # backwards-compatibility with Jekyll pre-1.0
+    #
+    # Returns the backwards-compatible configuration
+    def backwards_compatibilize
+      config = clone
+      # Provide backwards-compatibility
+      check_auto(config)
+      check_server(config)
+      check_plugins(config)
+
+      renamed_key "server_port", "port", config
+      renamed_key "gems", "plugins", config
+      renamed_key "layouts", "layouts_dir", config
+      renamed_key "data_source", "data_dir", config
+
+      check_pygments(config)
+      check_include_exclude(config)
+      check_coderay(config)
+      check_maruku(config)
+
+      config
+    end
+
+    def fix_common_issues
+      config = clone
+
+      if config.key?("paginate") && (!config["paginate"].is_a?(Integer) ||
+             config["paginate"] < 1)
+
+        Jekyll.logger.warn "Config Warning:", "The `paginate` key must be a positive" \
+          " integer or nil. It's currently set to '#{config["paginate"].inspect}'."
+        config["paginate"] = nil
+      end
+
+      config
+    end
+
+    def add_default_collections
+      config = clone
+
+      # It defaults to `{}`, so this is only if someone sets it to null manually.
+      return config if config["collections"].nil?
+
+      # Ensure we have a hash.
+      if config["collections"].is_a?(Array)
+        config["collections"] = Hash[config["collections"].map { |c| [c, {}] }]
+      end
+
+      config["collections"] = Utils.deep_merge_hashes(
+        { "posts" => {} }, config["collections"]
+      ).tap do |collections|
+        collections["posts"]["output"] = true
+        if config["permalink"]
+          collections["posts"]["permalink"] ||= style_to_permalink(config["permalink"])
+        end
+      end
+
+      config
+    end
+
+    def renamed_key(old, new, config, _ = nil)
+      if config.key?(old)
+        Jekyll::Deprecator.deprecation_message "The '#{old}' configuration" \
+          " option has been renamed to '#{new}'. Please update your config" \
+          " file accordingly."
+        config[new] = config.delete(old)
+      end
+    end
+
+    private
+    def style_to_permalink(permalink_style)
+      case permalink_style.to_sym
+      when :pretty
+        "/:categories/:year/:month/:day/:title/"
+      when :none
+        "/:categories/:title:output_ext"
+      when :date
+        "/:categories/:year/:month/:day/:title:output_ext"
+      when :ordinal
+        "/:categories/:year/:y_day/:title:output_ext"
+      else
+        permalink_style.to_s
+      end
+    end
+
+    # Private: Checks if a given config is a hash
+    #
+    # extracted_config - the value to check
+    # file - the file from which the config was extracted
+    #
+    # Raises an ArgumentError if given config is not a hash
+    private
+    def check_config_is_hash!(extracted_config, file)
+      unless extracted_config.is_a?(Hash)
+        raise ArgumentError, "Configuration file: (INVALID) #{file}".yellow
+      end
+    end
+
+    private
+    def check_auto(config)
+      if config.key?("auto") || config.key?("watch")
+        Jekyll::Deprecator.deprecation_message "Auto-regeneration can no longer" \
+                            " be set from your configuration file(s). Use the" \
+                            " --[no-]watch/-w command-line option instead."
+        config.delete("auto")
+        config.delete("watch")
+      end
+    end
+
+    private
+    def check_server(config)
+      if config.key?("server")
+        Jekyll::Deprecator.deprecation_message "The 'server' configuration option" \
+                            " is no longer accepted. Use the 'jekyll serve'" \
+                            " subcommand to serve your site with WEBrick."
+        config.delete("server")
+      end
+    end
+
+    private
+    def check_pygments(config)
+      if config.key?("pygments")
+        Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" \
+                            " has been renamed to 'highlighter'. Please update your" \
+                            " config file accordingly. The allowed values are 'rouge', " \
+                            "'pygments' or null."
+
+        config["highlighter"] = "pygments" if config["pygments"]
+        config.delete("pygments")
+      end
+    end
+
+    private
+    def check_include_exclude(config)
+      %w(include exclude).each do |option|
+        if config[option].is_a?(String)
+          Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" \
+            " must now be specified as an array, but you specified" \
+            " a string. For now, we've treated the string you provided" \
+            " as a list of comma-separated values."
+          config[option] = csv_to_array(config[option])
+        end
+        config[option].map!(&:to_s) if config[option]
+      end
+    end
+
+    private
+    def check_coderay(config)
+      if (config["kramdown"] || {}).key?("use_coderay")
+        Jekyll::Deprecator.deprecation_message "Please change 'use_coderay'" \
+          " to 'enable_coderay' in your configuration file."
+        config["kramdown"]["use_coderay"] = config["kramdown"].delete("enable_coderay")
+      end
+    end
+
+    private
+    def check_maruku(config)
+      if config.fetch("markdown", "kramdown").to_s.casecmp("maruku").zero?
+        Jekyll.logger.abort_with "Error:", "You're using the 'maruku' " \
+          "Markdown processor, which has been removed as of 3.0.0. " \
+          "We recommend you switch to Kramdown. To do this, replace " \
+          "`markdown: maruku` with `markdown: kramdown` in your " \
+          "`_config.yml` file."
+      end
+    end
+
+    # Private: Checks if the `plugins` config is a String
+    #
+    # config - the config hash
+    #
+    # Raises a Jekyll::Errors::InvalidConfigurationError if the config `plugins`
+    # is a string
+    private
+    def check_plugins(config)
+      if config.key?("plugins") && config["plugins"].is_a?(String)
+        Jekyll.logger.error "Configuration Error:", "You specified the" \
+          " `plugins` config in your configuration file as a string, please" \
+          " use an array instead. If you wanted to set the directory of your" \
+          " plugins, use the config key `plugins_dir` instead."
+        raise Jekyll::Errors::InvalidConfigurationError,
+          "'plugins' should not be a string, but was: " \
+          "#{config["plugins"].inspect}. Use 'plugins_dir' instead."
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converter.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converter.rb
new file mode 100644
index 0000000..b7fa009
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converter.rb
@@ -0,0 +1,52 @@
+module Jekyll
+  class Converter < Plugin
+    # Public: Get or set the highlighter prefix. When an argument is specified,
+    # the prefix will be set. If no argument is specified, the current prefix
+    # will be returned.
+    #
+    # highlighter_prefix - The String prefix (default: nil).
+    #
+    # Returns the String prefix.
+    def self.highlighter_prefix(highlighter_prefix = nil)
+      unless defined?(@highlighter_prefix) && highlighter_prefix.nil?
+        @highlighter_prefix = highlighter_prefix
+      end
+      @highlighter_prefix
+    end
+
+    # Public: Get or set the highlighter suffix. When an argument is specified,
+    # the suffix will be set. If no argument is specified, the current suffix
+    # will be returned.
+    #
+    # highlighter_suffix - The String suffix (default: nil).
+    #
+    # Returns the String suffix.
+    def self.highlighter_suffix(highlighter_suffix = nil)
+      unless defined?(@highlighter_suffix) && highlighter_suffix.nil?
+        @highlighter_suffix = highlighter_suffix
+      end
+      @highlighter_suffix
+    end
+
+    # Initialize the converter.
+    #
+    # Returns an initialized Converter.
+    def initialize(config = {})
+      @config = config
+    end
+
+    # Get the highlighter prefix.
+    #
+    # Returns the String prefix.
+    def highlighter_prefix
+      self.class.highlighter_prefix
+    end
+
+    # Get the highlighter suffix.
+    #
+    # Returns the String suffix.
+    def highlighter_suffix
+      self.class.highlighter_suffix
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/identity.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/identity.rb
new file mode 100644
index 0000000..9574769
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/identity.rb
@@ -0,0 +1,21 @@
+module Jekyll
+  module Converters
+    class Identity < Converter
+      safe true
+
+      priority :lowest
+
+      def matches(_ext)
+        true
+      end
+
+      def output_ext(ext)
+        ext
+      end
+
+      def convert(content)
+        content
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown.rb
new file mode 100644
index 0000000..c718d53
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown.rb
@@ -0,0 +1,102 @@
+module Jekyll
+  module Converters
+    class Markdown < Converter
+      highlighter_prefix "\n"
+      highlighter_suffix "\n"
+      safe true
+
+      def setup
+        return if @setup ||= false
+        unless (@parser = get_processor)
+          Jekyll.logger.error "Invalid Markdown processor given:", @config["markdown"]
+          if @config["safe"]
+            Jekyll.logger.info "", "Custom processors are not loaded in safe mode"
+          end
+          Jekyll.logger.error(
+            "",
+            "Available processors are: #{valid_processors.join(", ")}"
+          )
+          raise Errors::FatalException, "Bailing out; invalid Markdown processor."
+        end
+
+        @setup = true
+      end
+
+      # Rubocop does not allow reader methods to have names starting with `get_`
+      # To ensure compatibility, this check has been disabled on this method
+      #
+      # rubocop:disable Style/AccessorMethodName
+      def get_processor
+        case @config["markdown"].downcase
+        when "redcarpet" then return RedcarpetParser.new(@config)
+        when "kramdown"  then return KramdownParser.new(@config)
+        when "rdiscount" then return RDiscountParser.new(@config)
+        else
+          custom_processor
+        end
+      end
+      # rubocop:enable Style/AccessorMethodName
+
+      # Public: Provides you with a list of processors, the ones we
+      # support internally and the ones that you have provided to us (if you
+      # are not in safe mode.)
+
+      def valid_processors
+        %W(rdiscount kramdown redcarpet) + third_party_processors
+      end
+
+      # Public: A list of processors that you provide via plugins.
+      # This is really only available if you are not in safe mode, if you are
+      # in safe mode (re: GitHub) then there will be none.
+
+      def third_party_processors
+        self.class.constants - \
+          %w(KramdownParser RDiscountParser RedcarpetParser PRIORITIES).map(
+            &:to_sym
+          )
+      end
+
+      def extname_list
+        @extname_list ||= @config["markdown_ext"].split(",").map do |e|
+          ".#{e.downcase}"
+        end
+      end
+
+      def matches(ext)
+        extname_list.include?(ext.downcase)
+      end
+
+      def output_ext(_ext)
+        ".html"
+      end
+
+      def convert(content)
+        setup
+        @parser.convert(content)
+      end
+
+      private
+      def custom_processor
+        converter_name = @config["markdown"]
+        if custom_class_allowed?(converter_name)
+          self.class.const_get(converter_name).new(@config)
+        end
+      end
+
+      # Private: Determine whether a class name is an allowed custom
+      #   markdown class name.
+      #
+      # parser_name - the name of the parser class
+      #
+      # Returns true if the parser name contains only alphanumeric
+      # characters and is defined within Jekyll::Converters::Markdown
+
+      private
+      def custom_class_allowed?(parser_name)
+        parser_name !~ %r![^A-Za-z0-9_]! && self.class.constants.include?(
+          parser_name.to_sym
+        )
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown/kramdown_parser.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown/kramdown_parser.rb
new file mode 100644
index 0000000..d1f93c6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown/kramdown_parser.rb
@@ -0,0 +1,121 @@
+# Frozen-string-literal: true
+# Encoding: utf-8
+
+module Jekyll
+  module Converters
+    class Markdown
+      class KramdownParser
+        CODERAY_DEFAULTS = {
+          "css"               => "style",
+          "bold_every"        => 10,
+          "line_numbers"      => "inline",
+          "line_number_start" => 1,
+          "tab_width"         => 4,
+          "wrap"              => "div",
+        }.freeze
+
+        def initialize(config)
+          Jekyll::External.require_with_graceful_fail "kramdown"
+          @main_fallback_highlighter = config["highlighter"] || "rouge"
+          @config = config["kramdown"] || {}
+          @highlighter = nil
+          setup
+        end
+
+        # Setup and normalize the configuration:
+        #   * Create Kramdown if it doesn't exist.
+        #   * Set syntax_highlighter, detecting enable_coderay and merging
+        #       highlighter if none.
+        #   * Merge kramdown[coderay] into syntax_highlighter_opts stripping coderay_.
+        #   * Make sure `syntax_highlighter_opts` exists.
+
+        def setup
+          @config["syntax_highlighter"] ||= highlighter
+          @config["syntax_highlighter_opts"] ||= {}
+          @config["coderay"] ||= {} # XXX: Legacy.
+          modernize_coderay_config
+          make_accessible
+        end
+
+        def convert(content)
+          Kramdown::Document.new(content, @config).to_html
+        end
+
+        private
+        def make_accessible(hash = @config)
+          hash.keys.each do |key|
+            hash[key.to_sym] = hash[key]
+            make_accessible(hash[key]) if hash[key].is_a?(Hash)
+          end
+        end
+
+        # config[kramdown][syntax_higlighter] >
+        #   config[kramdown][enable_coderay] >
+        #   config[highlighter]
+        # Where `enable_coderay` is now deprecated because Kramdown
+        # supports Rouge now too.
+
+        private
+        def highlighter
+          return @highlighter if @highlighter
+
+          if @config["syntax_highlighter"]
+            return @highlighter = @config[
+              "syntax_highlighter"
+            ]
+          end
+
+          @highlighter = begin
+            if @config.key?("enable_coderay") && @config["enable_coderay"]
+              Jekyll::Deprecator.deprecation_message(
+                "You are using 'enable_coderay', " \
+                "use syntax_highlighter: coderay in your configuration file."
+              )
+
+              "coderay"
+            else
+              @main_fallback_highlighter
+            end
+          end
+        end
+
+        private
+        def strip_coderay_prefix(hash)
+          hash.each_with_object({}) do |(key, val), hsh|
+            cleaned_key = key.to_s.gsub(%r!\Acoderay_!, "")
+
+            if key != cleaned_key
+              Jekyll::Deprecator.deprecation_message(
+                "You are using '#{key}'. Normalizing to #{cleaned_key}."
+              )
+            end
+
+            hsh[cleaned_key] = val
+          end
+        end
+
+        # If our highlighter is CodeRay we go in to merge the CodeRay defaults
+        # with your "coderay" key if it's there, deprecating it in the
+        # process of you using it.
+
+        private
+        def modernize_coderay_config
+          unless @config["coderay"].empty?
+            Jekyll::Deprecator.deprecation_message(
+              "You are using 'kramdown.coderay' in your configuration, " \
+              "please use 'syntax_highlighter_opts' instead."
+            )
+
+            @config["syntax_highlighter_opts"] = begin
+              strip_coderay_prefix(
+                @config["syntax_highlighter_opts"] \
+                  .merge(CODERAY_DEFAULTS) \
+                  .merge(@config["coderay"])
+              )
+            end
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown/rdiscount_parser.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown/rdiscount_parser.rb
new file mode 100644
index 0000000..f1679e7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown/rdiscount_parser.rb
@@ -0,0 +1,33 @@
+module Jekyll
+  module Converters
+    class Markdown
+      class RDiscountParser
+        def initialize(config)
+          Jekyll::External.require_with_graceful_fail "rdiscount"
+          @config = config
+          @rdiscount_extensions = @config["rdiscount"]["extensions"].map(&:to_sym)
+        end
+
+        def convert(content)
+          rd = RDiscount.new(content, *@rdiscount_extensions)
+          html = rd.to_html
+          if @config["rdiscount"]["toc_token"]
+            html = replace_generated_toc(rd, html, @config["rdiscount"]["toc_token"])
+          end
+          html
+        end
+
+        private
+        def replace_generated_toc(rd, html, toc_token)
+          if rd.generate_toc && html.include?(toc_token)
+            utf8_toc = rd.toc_content
+            utf8_toc.force_encoding("utf-8") if utf8_toc.respond_to?(:force_encoding)
+            html.gsub(toc_token, utf8_toc)
+          else
+            html
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown/redcarpet_parser.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown/redcarpet_parser.rb
new file mode 100644
index 0000000..aa170fe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/markdown/redcarpet_parser.rb
@@ -0,0 +1,108 @@
+class Jekyll::Converters::Markdown::RedcarpetParser
+  module CommonMethods
+    def add_code_tags(code, lang)
+      code = code.to_s
+      code = code.sub(
+        %r!<pre>!,
+        "<pre><code class=\"language-#{lang}\" data-lang=\"#{lang}\">"
+      )
+      code = code.sub(%r!</pre>!, "</code></pre>")
+      code
+    end
+  end
+
+  module WithPygments
+    include CommonMethods
+    def block_code(code, lang)
+      Jekyll::External.require_with_graceful_fail("pygments")
+      lang = lang && lang.split.first || "text"
+      add_code_tags(
+        Pygments.highlight(
+          code,
+          {
+            :lexer   => lang,
+            :options => { :encoding => "utf-8" },
+          }
+        ),
+        lang
+      )
+    end
+  end
+
+  module WithoutHighlighting
+    require "cgi"
+
+    include CommonMethods
+
+    def code_wrap(code)
+      "<figure class=\"highlight\"><pre>#{CGI.escapeHTML(code)}</pre></figure>"
+    end
+
+    def block_code(code, lang)
+      lang = lang && lang.split.first || "text"
+      add_code_tags(code_wrap(code), lang)
+    end
+  end
+
+  module WithRouge
+    def block_code(code, lang)
+      code = "<pre>#{super}</pre>"
+
+      output = "<div class=\"highlight\">"
+      output << add_code_tags(code, lang)
+      output << "</div>"
+    end
+
+    protected
+    def rouge_formatter(_lexer)
+      Rouge::Formatters::HTML.new(:wrap => false)
+    end
+  end
+
+  def initialize(config)
+    Jekyll::External.require_with_graceful_fail("redcarpet")
+    @config = config
+    @redcarpet_extensions = {}
+    @config["redcarpet"]["extensions"].each do |e|
+      @redcarpet_extensions[e.to_sym] = true
+    end
+
+    @renderer ||= class_with_proper_highlighter(@config["highlighter"])
+  end
+
+  def class_with_proper_highlighter(highlighter)
+    Class.new(Redcarpet::Render::HTML) do
+      case highlighter
+      when "pygments"
+        include WithPygments
+      when "rouge"
+        Jekyll::External.require_with_graceful_fail(%w(
+          rouge rouge/plugins/redcarpet
+        ))
+
+        unless Gem::Version.new(Rouge.version) > Gem::Version.new("1.3.0")
+          abort "Please install Rouge 1.3.0 or greater and try running Jekyll again."
+        end
+
+        include Rouge::Plugins::Redcarpet
+        include CommonMethods
+        include WithRouge
+      else
+        include WithoutHighlighting
+      end
+    end
+  end
+
+  def convert(content)
+    @redcarpet_extensions[:fenced_code_blocks] = \
+      !@redcarpet_extensions[:no_fenced_code_blocks]
+    if @redcarpet_extensions[:smart]
+      @renderer.send :include, Redcarpet::Render::SmartyPants
+    end
+    markdown = Redcarpet::Markdown.new(
+      @renderer.new(@redcarpet_extensions),
+      @redcarpet_extensions
+    )
+    markdown.render(content)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/smartypants.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/smartypants.rb
new file mode 100644
index 0000000..d1bc810
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/converters/smartypants.rb
@@ -0,0 +1,34 @@
+class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown
+  def initialize(source, options)
+    super
+    @block_parsers = [:block_html]
+    @span_parsers =  [:smart_quotes, :html_entity, :typographic_syms, :span_html]
+  end
+end
+
+module Jekyll
+  module Converters
+    class SmartyPants < Converter
+      safe true
+      priority :low
+
+      def initialize(config)
+        Jekyll::External.require_with_graceful_fail "kramdown"
+        @config = config["kramdown"].dup || {}
+        @config[:input] = :SmartyPants
+      end
+
+      def matches(_)
+        false
+      end
+
+      def output_ext(_)
+        nil
+      end
+
+      def convert(content)
+        Kramdown::Document.new(content, @config).to_html.chomp
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/convertible.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/convertible.rb
new file mode 100644
index 0000000..74125f0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/convertible.rb
@@ -0,0 +1,251 @@
+# encoding: UTF-8
+
+require "set"
+
+# Convertible provides methods for converting a pagelike item
+# from a certain type of markup into actual content
+#
+# Requires
+#   self.site -> Jekyll::Site
+#   self.content
+#   self.content=
+#   self.data=
+#   self.ext=
+#   self.output=
+#   self.name
+#   self.path
+#   self.type -> :page, :post or :draft
+
+module Jekyll
+  module Convertible
+    # Returns the contents as a String.
+    def to_s
+      content || ""
+    end
+
+    # Whether the file is published or not, as indicated in YAML front-matter
+    def published?
+      !(data.key?("published") && data["published"] == false)
+    end
+
+    # Read the YAML frontmatter.
+    #
+    # base - The String path to the dir containing the file.
+    # name - The String filename of the file.
+    # opts - optional parameter to File.read, default at site configs
+    #
+    # Returns nothing.
+    # rubocop:disable Metrics/AbcSize
+    def read_yaml(base, name, opts = {})
+      filename = File.join(base, name)
+
+      begin
+        self.content = File.read(@path || site.in_source_dir(base, name),
+                                 Utils.merged_file_read_opts(site, opts))
+        if content =~ Document::YAML_FRONT_MATTER_REGEXP
+          self.content = $POSTMATCH
+          self.data = SafeYAML.load(Regexp.last_match(1))
+        end
+      rescue SyntaxError => e
+        Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}"
+        raise e if self.site.config["strict_front_matter"]
+      rescue => e
+        Jekyll.logger.warn "Error reading file #{filename}: #{e.message}"
+        raise e if self.site.config["strict_front_matter"]
+      end
+
+      self.data ||= {}
+
+      validate_data! filename
+      validate_permalink! filename
+
+      self.data
+    end
+    # rubocop:enable Metrics/AbcSize
+
+    def validate_data!(filename)
+      unless self.data.is_a?(Hash)
+        raise Errors::InvalidYAMLFrontMatterError,
+          "Invalid YAML front matter in #{filename}"
+      end
+    end
+
+    def validate_permalink!(filename)
+      if self.data["permalink"] && self.data["permalink"].to_s.empty?
+        raise Errors::InvalidPermalinkError, "Invalid permalink in #{filename}"
+      end
+    end
+
+    # Transform the contents based on the content type.
+    #
+    # Returns the transformed contents.
+    def transform
+      _renderer.convert(content)
+    end
+
+    # Determine the extension depending on content_type.
+    #
+    # Returns the String extension for the output file.
+    #   e.g. ".html" for an HTML output file.
+    def output_ext
+      _renderer.output_ext
+    end
+
+    # Determine which converter to use based on this convertible's
+    # extension.
+    #
+    # Returns the Converter instance.
+    def converters
+      _renderer.converters
+    end
+
+    # Render Liquid in the content
+    #
+    # content - the raw Liquid content to render
+    # payload - the payload for Liquid
+    # info    - the info for Liquid
+    #
+    # Returns the converted content
+    def render_liquid(content, payload, info, path)
+      _renderer.render_liquid(content, payload, info, path)
+    end
+    # rubocop: enable RescueException
+
+    # Convert this Convertible's data to a Hash suitable for use by Liquid.
+    #
+    # Returns the Hash representation of this Convertible.
+    def to_liquid(attrs = nil)
+      further_data = Hash[(attrs || self.class::ATTRIBUTES_FOR_LIQUID).map do |attribute|
+        [attribute, send(attribute)]
+      end]
+
+      defaults = site.frontmatter_defaults.all(relative_path, type)
+      Utils.deep_merge_hashes defaults, Utils.deep_merge_hashes(data, further_data)
+    end
+
+    # The type of a document,
+    #   i.e., its classname downcase'd and to_sym'd.
+    #
+    # Returns the type of self.
+    def type
+      if is_a?(Page)
+        :pages
+      end
+    end
+
+    # returns the owner symbol for hook triggering
+    def hook_owner
+      if is_a?(Page)
+        :pages
+      end
+    end
+
+    # Determine whether the document is an asset file.
+    # Asset files include CoffeeScript files and Sass/SCSS files.
+    #
+    # Returns true if the extname belongs to the set of extensions
+    #   that asset files use.
+    def asset_file?
+      sass_file? || coffeescript_file?
+    end
+
+    # Determine whether the document is a Sass file.
+    #
+    # Returns true if extname == .sass or .scss, false otherwise.
+    def sass_file?
+      %w(.sass .scss).include?(ext)
+    end
+
+    # Determine whether the document is a CoffeeScript file.
+    #
+    # Returns true if extname == .coffee, false otherwise.
+    def coffeescript_file?
+      ext == ".coffee"
+    end
+
+    # Determine whether the file should be rendered with Liquid.
+    #
+    # Always returns true.
+    def render_with_liquid?
+      true
+    end
+
+    # Determine whether the file should be placed into layouts.
+    #
+    # Returns false if the document is an asset file.
+    def place_in_layout?
+      !asset_file?
+    end
+
+    # Checks if the layout specified in the document actually exists
+    #
+    # layout - the layout to check
+    #
+    # Returns true if the layout is invalid, false if otherwise
+    def invalid_layout?(layout)
+      !data["layout"].nil? && layout.nil? && !(self.is_a? Jekyll::Excerpt)
+    end
+
+    # Recursively render layouts
+    #
+    # layouts - a list of the layouts
+    # payload - the payload for Liquid
+    # info    - the info for Liquid
+    #
+    # Returns nothing
+    def render_all_layouts(layouts, payload, info)
+      _renderer.layouts = layouts
+      self.output = _renderer.place_in_layouts(output, payload, info)
+    ensure
+      @_renderer = nil # this will allow the modifications above to disappear
+    end
+
+    # Add any necessary layouts to this convertible document.
+    #
+    # payload - The site payload Drop or Hash.
+    # layouts - A Hash of {"name" => "layout"}.
+    #
+    # Returns nothing.
+    def do_layout(payload, layouts)
+      self.output = _renderer.tap do |renderer|
+        renderer.layouts = layouts
+        renderer.payload = payload
+      end.run
+
+      Jekyll.logger.debug "Post-Render Hooks:", self.relative_path
+      Jekyll::Hooks.trigger hook_owner, :post_render, self
+    ensure
+      @_renderer = nil # this will allow the modifications above to disappear
+    end
+
+    # Write the generated page file to the destination directory.
+    #
+    # dest - The String path to the destination dir.
+    #
+    # Returns nothing.
+    def write(dest)
+      path = destination(dest)
+      FileUtils.mkdir_p(File.dirname(path))
+      File.write(path, output, :mode => "wb")
+      Jekyll::Hooks.trigger hook_owner, :post_write, self
+    end
+
+    # Accessor for data properties by Liquid.
+    #
+    # property - The String name of the property to retrieve.
+    #
+    # Returns the String value or nil if the property isn't included.
+    def [](property)
+      if self.class::ATTRIBUTES_FOR_LIQUID.include?(property)
+        send(property)
+      else
+        data[property]
+      end
+    end
+
+    private
+    def _renderer
+      @_renderer ||= Jekyll::Renderer.new(site, self)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/deprecator.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/deprecator.rb
new file mode 100644
index 0000000..e5574bd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/deprecator.rb
@@ -0,0 +1,51 @@
+module Jekyll
+  module Deprecator
+    extend self
+
+    def process(args)
+      arg_is_present? args, "--server", "The --server command has been replaced by the \
+                          'serve' subcommand."
+      arg_is_present? args, "--serve", "The --server command has been replaced by the \
+                          'serve' subcommand."
+      arg_is_present? args, "--no-server", "To build Jekyll without launching a server, \
+                          use the 'build' subcommand."
+      arg_is_present? args, "--auto", "The switch '--auto' has been replaced with \
+                          '--watch'."
+      arg_is_present? args, "--no-auto", "To disable auto-replication, simply leave off \
+                          the '--watch' switch."
+      arg_is_present? args, "--pygments", "The 'pygments'settings has been removed in \
+                          favour of 'highlighter'."
+      arg_is_present? args, "--paginate", "The 'paginate' setting can only be set in \
+                          your config files."
+      arg_is_present? args, "--url", "The 'url' setting can only be set in your \
+                          config files."
+      no_subcommand(args)
+    end
+
+    def no_subcommand(args)
+      unless args.empty? ||
+          args.first !~ %r(!/^--/!) || %w(--help --version).include?(args.first)
+        deprecation_message "Jekyll now uses subcommands instead of just switches. \
+                          Run `jekyll help` to find out more."
+        abort
+      end
+    end
+
+    def arg_is_present?(args, deprecated_argument, message)
+      if args.include?(deprecated_argument)
+        deprecation_message(message)
+      end
+    end
+
+    def deprecation_message(message)
+      Jekyll.logger.warn "Deprecation:", message
+    end
+
+    def defaults_deprecate_type(old, current)
+      Jekyll.logger.warn "Defaults:", "The '#{old}' type has become '#{current}'."
+      Jekyll.logger.warn "Defaults:", "Please update your front-matter defaults to use \
+                        'type: #{current}'."
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/document.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/document.rb
new file mode 100644
index 0000000..180f54f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/document.rb
@@ -0,0 +1,507 @@
+# encoding: UTF-8
+
+module Jekyll
+  class Document
+    include Comparable
+    extend Forwardable
+
+    attr_reader :path, :site, :extname, :collection
+    attr_accessor :content, :output
+
+    def_delegator :self, :read_post_data, :post_read
+
+    YAML_FRONT_MATTER_REGEXP = %r!\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)!m
+    DATELESS_FILENAME_MATCHER = %r!^(?:.+/)*(.*)(\.[^.]+)$!
+    DATE_FILENAME_MATCHER = %r!^(?:.+/)*(\d{2,4}-\d{1,2}-\d{1,2})-(.*)(\.[^.]+)$!
+
+    # Create a new Document.
+    #
+    # path - the path to the file
+    # relations - a hash with keys :site and :collection, the values of which
+    #             are the Jekyll::Site and Jekyll::Collection to which this
+    #             Document belong.
+    #
+    # Returns nothing.
+    def initialize(path, relations = {})
+      @site = relations[:site]
+      @path = path
+      @extname = File.extname(path)
+      @collection = relations[:collection]
+      @has_yaml_header = nil
+
+      if draft?
+        categories_from_path("_drafts")
+      else
+        categories_from_path(collection.relative_directory)
+      end
+
+      data.default_proc = proc do |_, key|
+        site.frontmatter_defaults.find(relative_path, collection.label, key)
+      end
+
+      trigger_hooks(:post_init)
+    end
+
+    # Fetch the Document's data.
+    #
+    # Returns a Hash containing the data. An empty hash is returned if
+    #   no data was read.
+    def data
+      @data ||= {}
+    end
+
+    # Merge some data in with this document's data.
+    #
+    # Returns the merged data.
+    def merge_data!(other, source: "YAML front matter")
+      merge_categories!(other)
+      Utils.deep_merge_hashes!(data, other)
+      merge_date!(source)
+      data
+    end
+
+    def date
+      data["date"] ||= (draft? ? source_file_mtime : site.time)
+    end
+
+    def source_file_mtime
+      @source_file_mtime ||= File.mtime(path)
+    end
+
+    # Returns whether the document is a draft. This is only the case if
+    # the document is in the 'posts' collection but in a different
+    # directory than '_posts'.
+    #
+    # Returns whether the document is a draft.
+    def draft?
+      data["draft"] ||= relative_path.index(collection.relative_directory).nil? &&
+        collection.label == "posts"
+    end
+
+    # The path to the document, relative to the site source.
+    #
+    # Returns a String path which represents the relative path
+    #   from the site source to this document
+    def relative_path
+      @relative_path ||= Pathutil.new(path).relative_path_from(site.source).to_s
+    end
+
+    # The output extension of the document.
+    #
+    # Returns the output extension
+    def output_ext
+      Jekyll::Renderer.new(site, self).output_ext
+    end
+
+    # The base filename of the document, without the file extname.
+    #
+    # Returns the basename without the file extname.
+    def basename_without_ext
+      @basename_without_ext ||= File.basename(path, ".*")
+    end
+
+    # The base filename of the document.
+    #
+    # Returns the base filename of the document.
+    def basename
+      @basename ||= File.basename(path)
+    end
+
+    # Produces a "cleaned" relative path.
+    # The "cleaned" relative path is the relative path without the extname
+    #   and with the collection's directory removed as well.
+    # This method is useful when building the URL of the document.
+    #
+    # Examples:
+    #   When relative_path is "_methods/site/generate.md":
+    #     cleaned_relative_path
+    #     # => "/site/generate"
+    #
+    # Returns the cleaned relative path of the document.
+    def cleaned_relative_path
+      @cleaned_relative_path ||=
+        relative_path[0..-extname.length - 1].sub(collection.relative_directory, "")
+    end
+
+    # Determine whether the document is a YAML file.
+    #
+    # Returns true if the extname is either .yml or .yaml, false otherwise.
+    def yaml_file?
+      %w(.yaml .yml).include?(extname)
+    end
+
+    # Determine whether the document is an asset file.
+    # Asset files include CoffeeScript files and Sass/SCSS files.
+    #
+    # Returns true if the extname belongs to the set of extensions
+    #   that asset files use.
+    def asset_file?
+      sass_file? || coffeescript_file?
+    end
+
+    # Determine whether the document is a Sass file.
+    #
+    # Returns true if extname == .sass or .scss, false otherwise.
+    def sass_file?
+      %w(.sass .scss).include?(extname)
+    end
+
+    # Determine whether the document is a CoffeeScript file.
+    #
+    # Returns true if extname == .coffee, false otherwise.
+    def coffeescript_file?
+      extname == ".coffee"
+    end
+
+    # Determine whether the file should be rendered with Liquid.
+    #
+    # Returns false if the document is either an asset file or a yaml file,
+    #   true otherwise.
+    def render_with_liquid?
+      !(coffeescript_file? || yaml_file?)
+    end
+
+    # Determine whether the file should be rendered with a layout.
+    #
+    # Returns true if the Front Matter specifies that `layout` is set to `none`.
+    def no_layout?
+      data["layout"] == "none"
+    end
+
+    # Determine whether the file should be placed into layouts.
+    #
+    # Returns false if the document is set to `layouts: none`, or is either an
+    #   asset file or a yaml file. Returns true otherwise.
+    def place_in_layout?
+      !(asset_file? || yaml_file? || no_layout?)
+    end
+
+    # The URL template where the document would be accessible.
+    #
+    # Returns the URL template for the document.
+    def url_template
+      collection.url_template
+    end
+
+    # Construct a Hash of key-value pairs which contain a mapping between
+    #   a key in the URL template and the corresponding value for this document.
+    #
+    # Returns the Hash of key-value pairs for replacement in the URL.
+    def url_placeholders
+      @url_placeholders ||= Drops::UrlDrop.new(self)
+    end
+
+    # The permalink for this Document.
+    # Permalink is set via the data Hash.
+    #
+    # Returns the permalink or nil if no permalink was set in the data.
+    def permalink
+      data && data.is_a?(Hash) && data["permalink"]
+    end
+
+    # The computed URL for the document. See `Jekyll::URL#to_s` for more details.
+    #
+    # Returns the computed URL for the document.
+    def url
+      @url ||= URL.new({
+        :template     => url_template,
+        :placeholders => url_placeholders,
+        :permalink    => permalink,
+      }).to_s
+    end
+
+    def [](key)
+      data[key]
+    end
+
+    # The full path to the output file.
+    #
+    # base_directory - the base path of the output directory
+    #
+    # Returns the full path to the output file of this document.
+    def destination(base_directory)
+      dest = site.in_dest_dir(base_directory)
+      path = site.in_dest_dir(dest, URL.unescape_path(url))
+      if url.end_with? "/"
+        path = File.join(path, "index.html")
+      else
+        path << output_ext unless path.end_with? output_ext
+      end
+      path
+    end
+
+    # Write the generated Document file to the destination directory.
+    #
+    # dest - The String path to the destination dir.
+    #
+    # Returns nothing.
+    def write(dest)
+      path = destination(dest)
+      FileUtils.mkdir_p(File.dirname(path))
+      File.write(path, output, :mode => "wb")
+
+      trigger_hooks(:post_write)
+    end
+
+    # Whether the file is published or not, as indicated in YAML front-matter
+    #
+    # Returns 'false' if the 'published' key is specified in the
+    # YAML front-matter and is 'false'. Otherwise returns 'true'.
+    def published?
+      !(data.key?("published") && data["published"] == false)
+    end
+
+    # Read in the file and assign the content and data based on the file contents.
+    # Merge the frontmatter of the file with the frontmatter default
+    # values
+    #
+    # Returns nothing.
+    def read(opts = {})
+      Jekyll.logger.debug "Reading:", relative_path
+
+      if yaml_file?
+        @data = SafeYAML.load_file(path)
+      else
+        begin
+          merge_defaults
+          read_content(opts)
+          read_post_data
+        rescue => e
+          handle_read_error(e)
+        end
+      end
+    end
+
+    # Create a Liquid-understandable version of this Document.
+    #
+    # Returns a Hash representing this Document's data.
+    def to_liquid
+      @to_liquid ||= Drops::DocumentDrop.new(self)
+    end
+
+    # The inspect string for this document.
+    # Includes the relative path and the collection label.
+    #
+    # Returns the inspect string for this document.
+    def inspect
+      "#<Jekyll::Document #{relative_path} collection=#{collection.label}>"
+    end
+
+    # The string representation for this document.
+    #
+    # Returns the content of the document
+    def to_s
+      output || content || "NO CONTENT"
+    end
+
+    # Compare this document against another document.
+    # Comparison is a comparison between the 2 paths of the documents.
+    #
+    # Returns -1, 0, +1 or nil depending on whether this doc's path is less than,
+    #   equal or greater than the other doc's path. See String#<=> for more details.
+    def <=>(other)
+      return nil unless other.respond_to?(:data)
+      cmp = data["date"] <=> other.data["date"]
+      cmp = path <=> other.path if cmp.nil? || cmp.zero?
+      cmp
+    end
+
+    # Determine whether this document should be written.
+    # Based on the Collection to which it belongs.
+    #
+    # True if the document has a collection and if that collection's #write?
+    #   method returns true, otherwise false.
+    def write?
+      collection && collection.write?
+    end
+
+    # The Document excerpt_separator, from the YAML Front-Matter or site
+    # default excerpt_separator value
+    #
+    # Returns the document excerpt_separator
+    def excerpt_separator
+      (data["excerpt_separator"] || site.config["excerpt_separator"]).to_s
+    end
+
+    # Whether to generate an excerpt
+    #
+    # Returns true if the excerpt separator is configured.
+    def generate_excerpt?
+      !excerpt_separator.empty?
+    end
+
+    def next_doc
+      pos = collection.docs.index { |post| post.equal?(self) }
+      if pos && pos < collection.docs.length - 1
+        collection.docs[pos + 1]
+      end
+    end
+
+    def previous_doc
+      pos = collection.docs.index { |post| post.equal?(self) }
+      if pos && pos > 0
+        collection.docs[pos - 1]
+      end
+    end
+
+    def trigger_hooks(hook_name, *args)
+      Jekyll::Hooks.trigger collection.label.to_sym, hook_name, self, *args if collection
+      Jekyll::Hooks.trigger :documents, hook_name, self, *args
+    end
+
+    def id
+      @id ||= File.join(File.dirname(url), (data["slug"] || basename_without_ext).to_s)
+    end
+
+    # Calculate related posts.
+    #
+    # Returns an Array of related Posts.
+    def related_posts
+      Jekyll::RelatedPosts.new(self).build
+    end
+
+    # Override of normal respond_to? to match method_missing's logic for
+    # looking in @data.
+    def respond_to?(method, include_private = false)
+      data.key?(method.to_s) || super
+    end
+
+    # Override of method_missing to check in @data for the key.
+    def method_missing(method, *args, &blck)
+      if data.key?(method.to_s)
+        Jekyll::Deprecator.deprecation_message "Document##{method} is now a key "\
+                           "in the #data hash."
+        Jekyll::Deprecator.deprecation_message "Called by #{caller(0..0)}."
+        data[method.to_s]
+      else
+        super
+      end
+    end
+
+    def respond_to_missing?(method, *)
+      data.key?(method.to_s) || super
+    end
+
+    # Add superdirectories of the special_dir to categories.
+    # In the case of es/_posts, 'es' is added as a category.
+    # In the case of _posts/es, 'es' is NOT added as a category.
+    #
+    # Returns nothing.
+    def categories_from_path(special_dir)
+      superdirs = relative_path.sub(%r!#{special_dir}(.*)!, "")
+        .split(File::SEPARATOR)
+        .reject do |c|
+        c.empty? || c == special_dir || c == basename
+      end
+      merge_data!({ "categories" => superdirs }, :source => "file path")
+    end
+
+    def populate_categories
+      merge_data!({
+        "categories" => (
+        Array(data["categories"]) + Utils.pluralized_array_from_hash(
+          data,
+          "category",
+          "categories"
+        )
+        ).map(&:to_s).flatten.uniq,
+      })
+    end
+
+    def populate_tags
+      merge_data!({
+        "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten,
+      })
+    end
+
+    private
+    def merge_categories!(other)
+      if other.key?("categories") && !other["categories"].nil?
+        if other["categories"].is_a?(String)
+          other["categories"] = other["categories"].split(%r!\s+!).map(&:strip)
+        end
+        other["categories"] = (data["categories"] || []) | other["categories"]
+      end
+    end
+
+    private
+    def merge_date!(source)
+      if data.key?("date") && !data["date"].is_a?(Time)
+        data["date"] = Utils.parse_date(
+          data["date"].to_s,
+          "Document '#{relative_path}' does not have a valid date in the #{source}."
+        )
+      end
+    end
+
+    private
+    def merge_defaults
+      defaults = @site.frontmatter_defaults.all(
+        relative_path,
+        collection.label.to_sym
+      )
+      merge_data!(defaults, :source => "front matter defaults") unless defaults.empty?
+    end
+
+    private
+    def read_content(opts)
+      self.content = File.read(path, Utils.merged_file_read_opts(site, opts))
+      if content =~ YAML_FRONT_MATTER_REGEXP
+        self.content = $POSTMATCH
+        data_file = SafeYAML.load(Regexp.last_match(1))
+        merge_data!(data_file, :source => "YAML front matter") if data_file
+      end
+    end
+
+    private
+    def read_post_data
+      populate_title
+      populate_categories
+      populate_tags
+      generate_excerpt
+    end
+
+    private
+    def handle_read_error(error)
+      if error.is_a? SyntaxError
+        Jekyll.logger.error "Error:", "YAML Exception reading #{path}: #{error.message}"
+      else
+        Jekyll.logger.error "Error:", "could not read file #{path}: #{error.message}"
+      end
+
+      if site.config["strict_front_matter"] || error.is_a?(Jekyll::Errors::FatalException)
+        raise error
+      end
+    end
+
+    private
+    def populate_title
+      if relative_path =~ DATE_FILENAME_MATCHER
+        date, slug, ext = Regexp.last_match.captures
+        modify_date(date)
+      elsif relative_path =~ DATELESS_FILENAME_MATCHER
+        slug, ext = Regexp.last_match.captures
+      end
+
+      # Try to ensure the user gets a title.
+      data["title"] ||= Utils.titleize_slug(slug)
+      # Only overwrite slug & ext if they aren't specified.
+      data["slug"]  ||= slug
+      data["ext"]   ||= ext
+    end
+
+    private
+    def modify_date(date)
+      if !data["date"] || data["date"].to_i == site.time.to_i
+        merge_data!({ "date" => date }, :source => "filename")
+      end
+    end
+
+    private
+    def generate_excerpt
+      if generate_excerpt?
+        data["excerpt"] ||= Jekyll::Excerpt.new(self)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/collection_drop.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/collection_drop.rb
new file mode 100644
index 0000000..5f5025b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/collection_drop.rb
@@ -0,0 +1,22 @@
+# encoding: UTF-8
+
+module Jekyll
+  module Drops
+    class CollectionDrop < Drop
+      extend Forwardable
+
+      mutable false
+
+      def_delegator :@obj, :write?, :output
+      def_delegators :@obj, :label, :docs, :files, :directory,
+                            :relative_directory
+
+      def to_s
+        docs.to_s
+      end
+
+      private
+      def_delegator :@obj, :metadata, :fallback_data
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/document_drop.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/document_drop.rb
new file mode 100644
index 0000000..ed85182
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/document_drop.rb
@@ -0,0 +1,69 @@
+# encoding: UTF-8
+
+module Jekyll
+  module Drops
+    class DocumentDrop < Drop
+      extend Forwardable
+
+      NESTED_OBJECT_FIELD_BLACKLIST = %w(
+        content output excerpt next previous
+      ).freeze
+
+      mutable false
+
+      def_delegator :@obj, :relative_path, :path
+      def_delegators :@obj, :id, :output, :content, :to_s, :relative_path, :url
+
+      def collection
+        @obj.collection.label
+      end
+
+      def excerpt
+        fallback_data["excerpt"].to_s
+      end
+
+      def <=>(other)
+        return nil unless other.is_a? DocumentDrop
+        cmp = self["date"] <=> other["date"]
+        cmp = self["path"] <=> other["path"] if cmp.nil? || cmp.zero?
+        cmp
+      end
+
+      def previous
+        @obj.previous_doc.to_liquid
+      end
+
+      def next
+        @obj.next_doc.to_liquid
+      end
+
+      # Generate a Hash for use in generating JSON.
+      # This is useful if fields need to be cleared before the JSON can generate.
+      #
+      # state - the JSON::State object which determines the state of current processing.
+      #
+      # Returns a Hash ready for JSON generation.
+      def hash_for_json(state = nil)
+        to_h.tap do |hash|
+          if state && state.depth >= 2
+            hash["previous"] = collapse_document(hash["previous"]) if hash["previous"]
+            hash["next"]     = collapse_document(hash["next"]) if hash["next"]
+          end
+        end
+      end
+
+      # Generate a Hash which breaks the recursive chain.
+      # Certain fields which are normally available are omitted.
+      #
+      # Returns a Hash with only non-recursive fields present.
+      def collapse_document(doc)
+        doc.keys.each_with_object({}) do |(key, _), result|
+          result[key] = doc[key] unless NESTED_OBJECT_FIELD_BLACKLIST.include?(key)
+        end
+      end
+
+      private
+      def_delegator :@obj, :data, :fallback_data
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/drop.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/drop.rb
new file mode 100644
index 0000000..40d5c3c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/drop.rb
@@ -0,0 +1,215 @@
+# encoding: UTF-8
+
+module Jekyll
+  module Drops
+    class Drop < Liquid::Drop
+      include Enumerable
+
+      NON_CONTENT_METHODS = [:fallback_data, :collapse_document].freeze
+
+      # Get or set whether the drop class is mutable.
+      # Mutability determines whether or not pre-defined fields may be
+      # overwritten.
+      #
+      # is_mutable - Boolean set mutability of the class (default: nil)
+      #
+      # Returns the mutability of the class
+      def self.mutable(is_mutable = nil)
+        @is_mutable = if is_mutable
+                        is_mutable
+                      else
+                        false
+                      end
+      end
+
+      def self.mutable?
+        @is_mutable
+      end
+
+      # Create a new Drop
+      #
+      # obj - the Jekyll Site, Collection, or Document required by the
+      # drop.
+      #
+      # Returns nothing
+      def initialize(obj)
+        @obj = obj
+        @mutations = {} # only if mutable: true
+      end
+
+      # Access a method in the Drop or a field in the underlying hash data.
+      # If mutable, checks the mutations first. Then checks the methods,
+      # and finally check the underlying hash (e.g. document front matter)
+      # if all the previous places didn't match.
+      #
+      # key - the string key whose value to fetch
+      #
+      # Returns the value for the given key, or nil if none exists
+      def [](key)
+        if self.class.mutable? && @mutations.key?(key)
+          @mutations[key]
+        elsif self.class.invokable? key
+          public_send key
+        else
+          fallback_data[key]
+        end
+      end
+
+      # Set a field in the Drop. If mutable, sets in the mutations and
+      # returns. If not mutable, checks first if it's trying to override a
+      # Drop method and raises a DropMutationException if so. If not
+      # mutable and the key is not a method on the Drop, then it sets the
+      # key to the value in the underlying hash (e.g. document front
+      # matter)
+      #
+      # key - the String key whose value to set
+      # val - the Object to set the key's value to
+      #
+      # Returns the value the key was set to unless the Drop is not mutable
+      # and the key matches a method in which case it raises a
+      # DropMutationException.
+      def []=(key, val)
+        if respond_to?("#{key}=")
+          public_send("#{key}=", val)
+        elsif respond_to?(key.to_s)
+          if self.class.mutable?
+            @mutations[key] = val
+          else
+            raise Errors::DropMutationException, "Key #{key} cannot be set in the drop."
+          end
+        else
+          fallback_data[key] = val
+        end
+      end
+
+      # Generates a list of strings which correspond to content getter
+      # methods.
+      #
+      # Returns an Array of strings which represent method-specific keys.
+      def content_methods
+        @content_methods ||= (
+          self.class.instance_methods \
+            - Jekyll::Drops::Drop.instance_methods \
+            - NON_CONTENT_METHODS
+        ).map(&:to_s).reject do |method|
+          method.end_with?("=")
+        end
+      end
+
+      # Check if key exists in Drop
+      #
+      # key - the string key whose value to fetch
+      #
+      # Returns true if the given key is present
+      def key?(key)
+        if self.class.mutable
+          @mutations.key?(key)
+        else
+          !key.nil? && (respond_to?(key) || fallback_data.key?(key))
+        end
+      end
+
+      # Generates a list of keys with user content as their values.
+      # This gathers up the Drop methods and keys of the mutations and
+      # underlying data hashes and performs a set union to ensure a list
+      # of unique keys for the Drop.
+      #
+      # Returns an Array of unique keys for content for the Drop.
+      def keys
+        (content_methods |
+          @mutations.keys |
+          fallback_data.keys).flatten
+      end
+
+      # Generate a Hash representation of the Drop by resolving each key's
+      # value. It includes Drop methods, mutations, and the underlying object's
+      # data. See the documentation for Drop#keys for more.
+      #
+      # Returns a Hash with all the keys and values resolved.
+      def to_h
+        keys.each_with_object({}) do |(key, _), result|
+          result[key] = self[key]
+        end
+      end
+      alias_method :to_hash, :to_h
+
+      # Inspect the drop's keys and values through a JSON representation
+      # of its keys and values.
+      #
+      # Returns a pretty generation of the hash representation of the Drop.
+      def inspect
+        require "json"
+        JSON.pretty_generate to_h
+      end
+
+      # Generate a Hash for use in generating JSON.
+      # This is useful if fields need to be cleared before the JSON can generate.
+      #
+      # Returns a Hash ready for JSON generation.
+      def hash_for_json(*)
+        to_h
+      end
+
+      # Generate a JSON representation of the Drop.
+      #
+      # state - the JSON::State object which determines the state of current processing.
+      #
+      # Returns a JSON representation of the Drop in a String.
+      def to_json(state = nil)
+        require "json"
+        JSON.generate(hash_for_json(state), state)
+      end
+
+      # Collects all the keys and passes each to the block in turn.
+      #
+      # block - a block which accepts one argument, the key
+      #
+      # Returns nothing.
+      def each_key(&block)
+        keys.each(&block)
+      end
+
+      def each
+        each_key.each do |key|
+          yield key, self[key]
+        end
+      end
+
+      def merge(other, &block)
+        self.dup.tap do |me|
+          if block.nil?
+            me.merge!(other)
+          else
+            me.merge!(other, block)
+          end
+        end
+      end
+
+      def merge!(other)
+        other.each_key do |key|
+          if block_given?
+            self[key] = yield key, self[key], other[key]
+          else
+            if Utils.mergable?(self[key]) && Utils.mergable?(other[key])
+              self[key] = Utils.deep_merge_hashes(self[key], other[key])
+              next
+            end
+
+            self[key] = other[key] unless other[key].nil?
+          end
+        end
+      end
+
+      # Imitate Hash.fetch method in Drop
+      #
+      # Returns value if key is present in Drop, otherwise returns default value
+      # KeyError is raised if key is not present and no default value given
+      def fetch(key, default = nil, &block)
+        return self[key] if key?(key)
+        raise KeyError, %(key not found: "#{key}") if default.nil? && block.nil?
+        return yield(key) unless block.nil?
+        return default unless default.nil?
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/excerpt_drop.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/excerpt_drop.rb
new file mode 100644
index 0000000..5d61aeb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/excerpt_drop.rb
@@ -0,0 +1,15 @@
+# encoding: UTF-8
+
+module Jekyll
+  module Drops
+    class ExcerptDrop < DocumentDrop
+      def layout
+        @obj.doc.data["layout"]
+      end
+
+      def excerpt
+        nil
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/jekyll_drop.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/jekyll_drop.rb
new file mode 100644
index 0000000..e3d2eb3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/jekyll_drop.rb
@@ -0,0 +1,33 @@
+# encoding: UTF-8
+
+module Jekyll
+  module Drops
+    class JekyllDrop < Liquid::Drop
+      class << self
+        def global
+          @global ||= JekyllDrop.new
+        end
+      end
+
+      def version
+        Jekyll::VERSION
+      end
+
+      def environment
+        Jekyll.env
+      end
+
+      def to_h
+        @to_h ||= {
+          "version"     => version,
+          "environment" => environment,
+        }
+      end
+
+      def to_json(state = nil)
+        require "json"
+        JSON.generate(to_h, state)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/site_drop.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/site_drop.rb
new file mode 100644
index 0000000..97b4180
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/site_drop.rb
@@ -0,0 +1,44 @@
+# encoding: UTF-8
+
+module Jekyll
+  module Drops
+    class SiteDrop < Drop
+      extend Forwardable
+
+      mutable false
+
+      def_delegator  :@obj, :site_data, :data
+      def_delegators :@obj, :time, :pages, :static_files, :documents,
+                            :tags, :categories
+
+      def [](key)
+        if @obj.collections.key?(key) && key != "posts"
+          @obj.collections[key].docs
+        else
+          super(key)
+        end
+      end
+
+      def key?(key)
+        (@obj.collections.key?(key) && key != "posts") || super
+      end
+
+      def posts
+        @site_posts ||= @obj.posts.docs.sort { |a, b| b <=> a }
+      end
+
+      def html_pages
+        @site_html_pages ||= @obj.pages.select do |page|
+          page.html? || page.url.end_with?("/")
+        end
+      end
+
+      def collections
+        @site_collections ||= @obj.collections.values.sort_by(&:label).map(&:to_liquid)
+      end
+
+      private
+      def_delegator :@obj, :config, :fallback_data
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/static_file_drop.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/static_file_drop.rb
new file mode 100644
index 0000000..e0af2f0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/static_file_drop.rb
@@ -0,0 +1,11 @@
+module Jekyll
+  module Drops
+    class StaticFileDrop < Drop
+      extend Forwardable
+      def_delegators :@obj, :name, :extname, :modified_time, :basename
+      def_delegator :@obj, :relative_path, :path
+      def_delegator :@obj, :data, :fallback_data
+      def_delegator :@obj, :type, :collection
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/unified_payload_drop.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/unified_payload_drop.rb
new file mode 100644
index 0000000..b642bda
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/unified_payload_drop.rb
@@ -0,0 +1,25 @@
+# encoding: UTF-8
+
+module Jekyll
+  module Drops
+    class UnifiedPayloadDrop < Drop
+      mutable true
+
+      attr_accessor :page, :layout, :content, :paginator
+      attr_accessor :highlighter_prefix, :highlighter_suffix
+
+      def jekyll
+        JekyllDrop.global
+      end
+
+      def site
+        @site_drop ||= SiteDrop.new(@obj)
+      end
+
+      private
+      def fallback_data
+        @fallback_data ||= {}
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/url_drop.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/url_drop.rb
new file mode 100644
index 0000000..5c97190
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/drops/url_drop.rb
@@ -0,0 +1,88 @@
+# encoding: UTF-8
+
+module Jekyll
+  module Drops
+    class UrlDrop < Drop
+      extend Forwardable
+
+      mutable false
+
+      def_delegator :@obj, :cleaned_relative_path, :path
+      def_delegator :@obj, :output_ext, :output_ext
+
+      def collection
+        @obj.collection.label
+      end
+
+      def name
+        Utils.slugify(@obj.basename_without_ext)
+      end
+
+      def title
+        Utils.slugify(@obj.data["slug"], :mode => "pretty", :cased => true) ||
+          Utils.slugify(@obj.basename_without_ext, :mode => "pretty", :cased => true)
+      end
+
+      def slug
+        Utils.slugify(@obj.data["slug"]) || Utils.slugify(@obj.basename_without_ext)
+      end
+
+      def categories
+        category_set = Set.new
+        Array(@obj.data["categories"]).each do |category|
+          category_set << category.to_s.downcase
+        end
+        category_set.to_a.join("/")
+      end
+
+      def year
+        @obj.date.strftime("%Y")
+      end
+
+      def month
+        @obj.date.strftime("%m")
+      end
+
+      def day
+        @obj.date.strftime("%d")
+      end
+
+      def hour
+        @obj.date.strftime("%H")
+      end
+
+      def minute
+        @obj.date.strftime("%M")
+      end
+
+      def second
+        @obj.date.strftime("%S")
+      end
+
+      def i_day
+        @obj.date.strftime("%-d")
+      end
+
+      def i_month
+        @obj.date.strftime("%-m")
+      end
+
+      def short_month
+        @obj.date.strftime("%b")
+      end
+
+      def short_year
+        @obj.date.strftime("%y")
+      end
+
+      def y_day
+        @obj.date.strftime("%j")
+      end
+
+      private
+      def fallback_data
+        {}
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/entry_filter.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/entry_filter.rb
new file mode 100644
index 0000000..f442503
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/entry_filter.rb
@@ -0,0 +1,121 @@
+module Jekyll
+  class EntryFilter
+    attr_reader :site
+    SPECIAL_LEADING_CHARACTERS = [
+      ".", "_", "#", "~",
+    ].freeze
+
+    def initialize(site, base_directory = nil)
+      @site = site
+      @base_directory = derive_base_directory(
+        @site, base_directory.to_s.dup
+      )
+    end
+
+    def base_directory
+      @base_directory.to_s
+    end
+
+    def derive_base_directory(site, base_dir)
+      base_dir[site.source] = "" if base_dir.start_with?(site.source)
+      base_dir
+    end
+
+    def relative_to_source(entry)
+      File.join(
+        base_directory, entry
+      )
+    end
+
+    def filter(entries)
+      entries.reject do |e|
+        unless included?(e)
+          special?(e) || backup?(e) || excluded?(e) || symlink?(e)
+        end
+      end
+    end
+
+    def included?(entry)
+      glob_include?(site.include, entry) ||
+        glob_include?(site.include, File.basename(entry))
+    end
+
+    def special?(entry)
+      SPECIAL_LEADING_CHARACTERS.include?(entry[0..0]) ||
+        SPECIAL_LEADING_CHARACTERS.include?(File.basename(entry)[0..0])
+    end
+
+    def backup?(entry)
+      entry[-1..-1] == "~"
+    end
+
+    def excluded?(entry)
+      glob_include?(site.exclude, relative_to_source(entry)).tap do |excluded|
+        if excluded
+          Jekyll.logger.debug(
+            "EntryFilter:",
+            "excluded #{relative_to_source(entry)}"
+          )
+        end
+      end
+    end
+
+    # --
+    # Check if a file is a symlink.
+    # NOTE: This can be converted to allowing even in safe,
+    #   since we use Pathutil#in_path? now.
+    # --
+    def symlink?(entry)
+      site.safe && File.symlink?(entry) && symlink_outside_site_source?(entry)
+    end
+
+    # --
+    # NOTE: Pathutil#in_path? gets the realpath.
+    # @param [<Anything>] entry the entry you want to validate.
+    # Check if a path is outside of our given root.
+    # --
+    def symlink_outside_site_source?(entry)
+      !Pathutil.new(entry).in_path?(
+        site.in_source_dir
+      )
+    end
+
+    # --
+    # Check if an entry matches a specific pattern and return true,false.
+    # Returns true if path matches against any glob pattern.
+    # --
+    def glob_include?(enum, e)
+      entry = Pathutil.new(site.in_source_dir).join(e)
+      enum.any? do |exp|
+        # Users who send a Regexp knows what they want to
+        # exclude, so let them send a Regexp to exclude files,
+        # we will not bother caring if it works or not, it's
+        # on them at this point.
+
+        if exp.is_a?(Regexp)
+          entry =~ exp
+
+        else
+          item = Pathutil.new(site.in_source_dir).join(exp)
+
+          # If it's a directory they want to exclude, AKA
+          # ends with a "/" then we will go on to check and
+          # see if the entry falls within that path and
+          # exclude it if that's the case.
+
+          if e.end_with?("/")
+            entry.in_path?(
+              item
+            )
+
+          else
+            File.fnmatch?(item, entry) ||
+              entry.to_path.start_with?(
+                item
+              )
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/errors.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/errors.rb
new file mode 100644
index 0000000..95aa04b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/errors.rb
@@ -0,0 +1,18 @@
+module Jekyll
+  module Errors
+    FatalException = Class.new(::RuntimeError)
+
+    InvalidThemeName = Class.new(FatalException)
+
+    DropMutationException       = Class.new(FatalException)
+    InvalidPermalinkError       = Class.new(FatalException)
+    InvalidYAMLFrontMatterError = Class.new(FatalException)
+    MissingDependencyException  = Class.new(FatalException)
+
+    InvalidDateError            = Class.new(FatalException)
+    InvalidPostNameError        = Class.new(FatalException)
+    PostURLError                = Class.new(FatalException)
+    InvalidURLError             = Class.new(FatalException)
+    InvalidConfigurationError   = Class.new(FatalException)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/excerpt.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/excerpt.rb
new file mode 100644
index 0000000..61344e7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/excerpt.rb
@@ -0,0 +1,124 @@
+module Jekyll
+  class Excerpt
+    extend Forwardable
+
+    attr_accessor :doc
+    attr_accessor :content, :ext
+    attr_writer   :output
+
+    def_delegators :@doc, :site, :name, :ext, :relative_path, :extname,
+                          :render_with_liquid?, :collection, :related_posts,
+                          :url, :next_doc, :previous_doc
+
+    # Initialize this Excerpt instance.
+    #
+    # doc - The Document.
+    #
+    # Returns the new Excerpt.
+    def initialize(doc)
+      self.doc = doc
+      self.content = extract_excerpt(doc.content)
+    end
+
+    # Fetch YAML front-matter data from related doc, without layout key
+    #
+    # Returns Hash of doc data
+    def data
+      @data ||= doc.data.dup
+      @data.delete("layout")
+      @data.delete("excerpt")
+      @data
+    end
+
+    def trigger_hooks(*); end
+
+    # 'Path' of the excerpt.
+    #
+    # Returns the path for the doc this excerpt belongs to with #excerpt appended
+    def path
+      File.join(doc.path, "#excerpt")
+    end
+
+    # Check if excerpt includes a string
+    #
+    # Returns true if the string passed in
+    def include?(something)
+      (output && output.include?(something)) || content.include?(something)
+    end
+
+    # The UID for this doc (useful in feeds).
+    # e.g. /2008/11/05/my-awesome-doc
+    #
+    # Returns the String UID.
+    def id
+      "#{doc.id}#excerpt"
+    end
+
+    def to_s
+      output || content
+    end
+
+    def to_liquid
+      Jekyll::Drops::ExcerptDrop.new(self)
+    end
+
+    # Returns the shorthand String identifier of this doc.
+    def inspect
+      "<Excerpt: #{self.id}>"
+    end
+
+    def output
+      @output ||= Renderer.new(doc.site, self, site.site_payload).run
+    end
+
+    def place_in_layout?
+      false
+    end
+
+    protected
+
+    # Internal: Extract excerpt from the content
+    #
+    # By default excerpt is your first paragraph of a doc: everything before
+    # the first two new lines:
+    #
+    #     ---
+    #     title: Example
+    #     ---
+    #
+    #     First paragraph with [link][1].
+    #
+    #     Second paragraph.
+    #
+    #     [1]: http://example.com/
+    #
+    # This is fairly good option for Markdown and Textile files. But might cause
+    # problems for HTML docs (which is quite unusual for Jekyll). If default
+    # excerpt delimiter is not good for you, you might want to set your own via
+    # configuration option `excerpt_separator`. For example, following is a good
+    # alternative for HTML docs:
+    #
+    #     # file: _config.yml
+    #     excerpt_separator: "<!-- more -->"
+    #
+    # Notice that all markdown-style link references will be appended to the
+    # excerpt. So the example doc above will have this excerpt source:
+    #
+    #     First paragraph with [link][1].
+    #
+    #     [1]: http://example.com/
+    #
+    # Excerpts are rendered same time as content is rendered.
+    #
+    # Returns excerpt String
+    def extract_excerpt(doc_content)
+      head, _, tail = doc_content.to_s.partition(doc.excerpt_separator)
+
+      if tail.empty?
+        head
+      else
+        "" << head << "\n\n" << tail.scan(%r!^ {0,3}\[[^\]]+\]:.+$!).join("\n")
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/external.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/external.rb
new file mode 100644
index 0000000..bdefc79
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/external.rb
@@ -0,0 +1,72 @@
+module Jekyll
+  module External
+    class << self
+      #
+      # Gems that, if installed, should be loaded.
+      # Usually contain subcommands.
+      #
+      def blessed_gems
+        %w(
+          jekyll-docs
+          jekyll-import
+        )
+      end
+
+      #
+      # Require a gem or file if it's present, otherwise silently fail.
+      #
+      # names - a string gem name or array of gem names
+      #
+      def require_if_present(names)
+        Array(names).each do |name|
+          begin
+            require name
+          rescue LoadError
+            Jekyll.logger.debug "Couldn't load #{name}. Skipping."
+            yield(name, version_constraint(name)) if block_given?
+            false
+          end
+        end
+      end
+
+      #
+      # The version constraint required to activate a given gem.
+      # Usually the gem version requirement is "> 0," because any version
+      # will do. In the case of jekyll-docs, however, we require the exact
+      # same version as Jekyll.
+      #
+      # Returns a String version constraint in a parseable form for
+      # RubyGems.
+      def version_constraint(gem_name)
+        return "= #{Jekyll::VERSION}" if gem_name.to_s.eql?("jekyll-docs")
+        "> 0"
+      end
+
+      #
+      # Require a gem or gems. If it's not present, show a very nice error
+      # message that explains everything and is much more helpful than the
+      # normal LoadError.
+      #
+      # names - a string gem name or array of gem names
+      #
+      def require_with_graceful_fail(names)
+        Array(names).each do |name|
+          begin
+            Jekyll.logger.debug "Requiring:", name.to_s
+            require name
+          rescue LoadError => e
+            Jekyll.logger.error "Dependency Error:", <<-MSG
+Yikes! It looks like you don't have #{name} or one of its dependencies installed.
+In order to use Jekyll as currently configured, you'll need to install this gem.
+
+The full error message from Ruby is: '#{e.message}'
+
+If you run into trouble, you can find helpful resources at https://jekyllrb.com/help/!
+            MSG
+            raise Jekyll::Errors::MissingDependencyException, name
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/filters.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/filters.rb
new file mode 100644
index 0000000..e15cf7c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/filters.rb
@@ -0,0 +1,421 @@
+require "addressable/uri"
+require "json"
+require "date"
+require "liquid"
+
+require_all "jekyll/filters"
+
+module Jekyll
+  module Filters
+    include URLFilters
+    include GroupingFilters
+
+    # Convert a Markdown string into HTML output.
+    #
+    # input - The Markdown String to convert.
+    #
+    # Returns the HTML formatted String.
+    def markdownify(input)
+      site = @context.registers[:site]
+      converter = site.find_converter_instance(Jekyll::Converters::Markdown)
+      converter.convert(input.to_s)
+    end
+
+    # Convert quotes into smart quotes.
+    #
+    # input - The String to convert.
+    #
+    # Returns the smart-quotified String.
+    def smartify(input)
+      site = @context.registers[:site]
+      converter = site.find_converter_instance(Jekyll::Converters::SmartyPants)
+      converter.convert(input.to_s)
+    end
+
+    # Convert a Sass string into CSS output.
+    #
+    # input - The Sass String to convert.
+    #
+    # Returns the CSS formatted String.
+    def sassify(input)
+      site = @context.registers[:site]
+      converter = site.find_converter_instance(Jekyll::Converters::Sass)
+      converter.convert(input)
+    end
+
+    # Convert a Scss string into CSS output.
+    #
+    # input - The Scss String to convert.
+    #
+    # Returns the CSS formatted String.
+    def scssify(input)
+      site = @context.registers[:site]
+      converter = site.find_converter_instance(Jekyll::Converters::Scss)
+      converter.convert(input)
+    end
+
+    # Slugify a filename or title.
+    #
+    # input - The filename or title to slugify.
+    # mode - how string is slugified
+    #
+    # Returns the given filename or title as a lowercase URL String.
+    # See Utils.slugify for more detail.
+    def slugify(input, mode = nil)
+      Utils.slugify(input, :mode => mode)
+    end
+
+    # Format a date in short format e.g. "27 Jan 2011".
+    #
+    # date - the Time to format.
+    #
+    # Returns the formatting String.
+    def date_to_string(date)
+      time(date).strftime("%d %b %Y")
+    end
+
+    # Format a date in long format e.g. "27 January 2011".
+    #
+    # date - The Time to format.
+    #
+    # Returns the formatted String.
+    def date_to_long_string(date)
+      return date if date.to_s.empty?
+      time(date).strftime("%d %B %Y")
+    end
+
+    # Format a date for use in XML.
+    #
+    # date - The Time to format.
+    #
+    # Examples
+    #
+    #   date_to_xmlschema(Time.now)
+    #   # => "2011-04-24T20:34:46+08:00"
+    #
+    # Returns the formatted String.
+    def date_to_xmlschema(date)
+      return date if date.to_s.empty?
+      time(date).xmlschema
+    end
+
+    # Format a date according to RFC-822
+    #
+    # date - The Time to format.
+    #
+    # Examples
+    #
+    #   date_to_rfc822(Time.now)
+    #   # => "Sun, 24 Apr 2011 12:34:46 +0000"
+    #
+    # Returns the formatted String.
+    def date_to_rfc822(date)
+      return date if date.to_s.empty?
+      time(date).rfc822
+    end
+
+    # XML escape a string for use. Replaces any special characters with
+    # appropriate HTML entity replacements.
+    #
+    # input - The String to escape.
+    #
+    # Examples
+    #
+    #   xml_escape('foo "bar" <baz>')
+    #   # => "foo &quot;bar&quot; &lt;baz&gt;"
+    #
+    # Returns the escaped String.
+    def xml_escape(input)
+      input.to_s.encode(:xml => :attr).gsub(%r!\A"|"\Z!, "")
+    end
+
+    # CGI escape a string for use in a URL. Replaces any special characters
+    # with appropriate %XX replacements.
+    #
+    # input - The String to escape.
+    #
+    # Examples
+    #
+    #   cgi_escape('foo,bar;baz?')
+    #   # => "foo%2Cbar%3Bbaz%3F"
+    #
+    # Returns the escaped String.
+    def cgi_escape(input)
+      CGI.escape(input)
+    end
+
+    # URI escape a string.
+    #
+    # input - The String to escape.
+    #
+    # Examples
+    #
+    #   uri_escape('foo, bar \\baz?')
+    #   # => "foo,%20bar%20%5Cbaz?"
+    #
+    # Returns the escaped String.
+    def uri_escape(input)
+      Addressable::URI.normalize_component(input)
+    end
+
+    # Replace any whitespace in the input string with a single space
+    #
+    # input - The String on which to operate.
+    #
+    # Returns the formatted String
+    def normalize_whitespace(input)
+      input.to_s.gsub(%r!\s+!, " ").strip
+    end
+
+    # Count the number of words in the input string.
+    #
+    # input - The String on which to operate.
+    #
+    # Returns the Integer word count.
+    def number_of_words(input)
+      input.split.length
+    end
+
+    # Join an array of things into a string by separating with commas and the
+    # word "and" for the last one.
+    #
+    # array - The Array of Strings to join.
+    # connector - Word used to connect the last 2 items in the array
+    #
+    # Examples
+    #
+    #   array_to_sentence_string(["apples", "oranges", "grapes"])
+    #   # => "apples, oranges, and grapes"
+    #
+    # Returns the formatted String.
+    def array_to_sentence_string(array, connector = "and")
+      case array.length
+      when 0
+        ""
+      when 1
+        array[0].to_s
+      when 2
+        "#{array[0]} #{connector} #{array[1]}"
+      else
+        "#{array[0...-1].join(", ")}, #{connector} #{array[-1]}"
+      end
+    end
+
+    # Convert the input into json string
+    #
+    # input - The Array or Hash to be converted
+    #
+    # Returns the converted json string
+    def jsonify(input)
+      as_liquid(input).to_json
+    end
+
+    # Filter an array of objects
+    #
+    # input - the object array
+    # property - property within each object to filter by
+    # value - desired value
+    #
+    # Returns the filtered array of objects
+    def where(input, property, value)
+      return input unless input.respond_to?(:select)
+      input = input.values if input.is_a?(Hash)
+      input.select do |object|
+        Array(item_property(object, property)).map(&:to_s).include?(value.to_s)
+      end || []
+    end
+
+    # Filters an array of objects against an expression
+    #
+    # input - the object array
+    # variable - the variable to assign each item to in the expression
+    # expression - a Liquid comparison expression passed in as a string
+    #
+    # Returns the filtered array of objects
+    def where_exp(input, variable, expression)
+      return input unless input.respond_to?(:select)
+      input = input.values if input.is_a?(Hash) # FIXME
+
+      condition = parse_condition(expression)
+      @context.stack do
+        input.select do |object|
+          @context[variable] = object
+          condition.evaluate(@context)
+        end
+      end || []
+    end
+
+    # Convert the input into integer
+    #
+    # input - the object string
+    #
+    # Returns the integer value
+    def to_integer(input)
+      return 1 if input == true
+      return 0 if input == false
+      input.to_i
+    end
+
+    # Sort an array of objects
+    #
+    # input - the object array
+    # property - property within each object to filter by
+    # nils ('first' | 'last') - nils appear before or after non-nil values
+    #
+    # Returns the filtered array of objects
+    def sort(input, property = nil, nils = "first")
+      if input.nil?
+        raise ArgumentError, "Cannot sort a null object."
+      end
+      if property.nil?
+        input.sort
+      else
+        if nils == "first"
+          order = - 1
+        elsif nils == "last"
+          order = + 1
+        else
+          raise ArgumentError, "Invalid nils order: " \
+            "'#{nils}' is not a valid nils order. It must be 'first' or 'last'."
+        end
+
+        sort_input(input, property, order)
+      end
+    end
+
+    def pop(array, num = 1)
+      return array unless array.is_a?(Array)
+      num = Liquid::Utils.to_integer(num)
+      new_ary = array.dup
+      new_ary.pop(num)
+      new_ary
+    end
+
+    def push(array, input)
+      return array unless array.is_a?(Array)
+      new_ary = array.dup
+      new_ary.push(input)
+      new_ary
+    end
+
+    def shift(array, num = 1)
+      return array unless array.is_a?(Array)
+      num = Liquid::Utils.to_integer(num)
+      new_ary = array.dup
+      new_ary.shift(num)
+      new_ary
+    end
+
+    def unshift(array, input)
+      return array unless array.is_a?(Array)
+      new_ary = array.dup
+      new_ary.unshift(input)
+      new_ary
+    end
+
+    def sample(input, num = 1)
+      return input unless input.respond_to?(:sample)
+      num = Liquid::Utils.to_integer(num) rescue 1
+      if num == 1
+        input.sample
+      else
+        input.sample(num)
+      end
+    end
+
+    # Convert an object into its String representation for debugging
+    #
+    # input - The Object to be converted
+    #
+    # Returns a String representation of the object.
+    def inspect(input)
+      xml_escape(input.inspect)
+    end
+
+    private
+    def sort_input(input, property, order)
+      input.sort do |apple, orange|
+        apple_property = item_property(apple, property)
+        orange_property = item_property(orange, property)
+
+        if !apple_property.nil? && orange_property.nil?
+          - order
+        elsif apple_property.nil? && !orange_property.nil?
+          + order
+        else
+          apple_property <=> orange_property
+        end
+      end
+    end
+
+    private
+    def time(input)
+      date = Liquid::Utils.to_date(input)
+      unless date.respond_to?(:to_time)
+        raise Errors::InvalidDateError,
+          "Invalid Date: '#{input.inspect}' is not a valid datetime."
+      end
+      date.to_time.dup.localtime
+    end
+
+    private
+    def item_property(item, property)
+      if item.respond_to?(:to_liquid)
+        property.to_s.split(".").reduce(item.to_liquid) do |subvalue, attribute|
+          subvalue[attribute]
+        end
+      elsif item.respond_to?(:data)
+        item.data[property.to_s]
+      else
+        item[property.to_s]
+      end
+    end
+
+    private
+    def as_liquid(item)
+      case item
+      when Hash
+        pairs = item.map { |k, v| as_liquid([k, v]) }
+        Hash[pairs]
+      when Array
+        item.map { |i| as_liquid(i) }
+      else
+        if item.respond_to?(:to_liquid)
+          liquidated = item.to_liquid
+          # prevent infinite recursion for simple types (which return `self`)
+          if liquidated == item
+            item
+          else
+            as_liquid(liquidated)
+          end
+        else
+          item
+        end
+      end
+    end
+
+    # Parse a string to a Liquid Condition
+    private
+    def parse_condition(exp)
+      parser = Liquid::Parser.new(exp)
+      left_expr = parser.expression
+      operator = parser.consume?(:comparison)
+      condition =
+        if operator
+          Liquid::Condition.new(Liquid::Expression.parse(left_expr),
+                                operator,
+                                Liquid::Expression.parse(parser.expression))
+        else
+          Liquid::Condition.new(Liquid::Expression.parse(left_expr))
+        end
+      parser.consume(:end_of_string)
+
+      condition
+    end
+
+  end
+end
+
+Liquid::Template.register_filter(
+  Jekyll::Filters
+)
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/filters/grouping_filters.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/filters/grouping_filters.rb
new file mode 100644
index 0000000..c102925
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/filters/grouping_filters.rb
@@ -0,0 +1,63 @@
+module Jekyll
+  module Filters
+    module GroupingFilters
+      # Group an array of items by a property
+      #
+      # input - the inputted Enumerable
+      # property - the property
+      #
+      # Returns an array of Hashes, each looking something like this:
+      #  {"name"  => "larry"
+      #   "items" => [...] } # all the items where `property` == "larry"
+      def group_by(input, property)
+        if groupable?(input)
+          groups = input.group_by { |item| item_property(item, property).to_s }
+          grouped_array(groups)
+        else
+          input
+        end
+      end
+
+      # Group an array of items by an expression
+      #
+      # input - the object array
+      # variable - the variable to assign each item to in the expression
+      # expression -a Liquid comparison expression passed in as a string
+      #
+      # Returns the filtered array of objects
+      def group_by_exp(input, variable, expression)
+        return input unless groupable?(input)
+
+        parsed_expr = parse_expression(expression)
+        @context.stack do
+          groups = input.group_by do |item|
+            @context[variable] = item
+            parsed_expr.render(@context)
+          end
+          grouped_array(groups)
+        end
+      end
+
+      private
+      def parse_expression(str)
+        Liquid::Variable.new(str, Liquid::ParseContext.new)
+      end
+
+      private
+      def groupable?(element)
+        element.respond_to?(:group_by)
+      end
+
+      private
+      def grouped_array(groups)
+        groups.each_with_object([]) do |item, array|
+          array << {
+            "name"  => item.first,
+            "items" => item.last,
+            "size"  => item.last.size,
+          }
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/filters/url_filters.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/filters/url_filters.rb
new file mode 100644
index 0000000..2715183
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/filters/url_filters.rb
@@ -0,0 +1,58 @@
+require "addressable/uri"
+
+module Jekyll
+  module Filters
+    module URLFilters
+      # Produces an absolute URL based on site.url and site.baseurl.
+      #
+      # input - the URL to make absolute.
+      #
+      # Returns the absolute URL as a String.
+      def absolute_url(input)
+        return if input.nil?
+        return input if Addressable::URI.parse(input.to_s).absolute?
+        site = @context.registers[:site]
+        return relative_url(input).to_s if site.config["url"].nil?
+        Addressable::URI.parse(
+          site.config["url"].to_s + relative_url(input)
+        ).normalize.to_s
+      end
+
+      # Produces a URL relative to the domain root based on site.baseurl.
+      #
+      # input - the URL to make relative to the domain root
+      #
+      # Returns a URL relative to the domain root as a String.
+      def relative_url(input)
+        return if input.nil?
+        parts = [sanitized_baseurl, input]
+        Addressable::URI.parse(
+          parts.compact.map { |part| ensure_leading_slash(part.to_s) }.join
+        ).normalize.to_s
+      end
+
+      # Strips trailing `/index.html` from URLs to create pretty permalinks
+      #
+      # input - the URL with a possible `/index.html`
+      #
+      # Returns a URL with the trailing `/index.html` removed
+      def strip_index(input)
+        return if input.nil? || input.to_s.empty?
+        input.sub(%r!/index\.html?$!, "/")
+      end
+
+      private
+
+      def sanitized_baseurl
+        site = @context.registers[:site]
+        site.config["baseurl"].to_s.chomp("/")
+      end
+
+      def ensure_leading_slash(input)
+        return input if input.nil? || input.empty? || input.start_with?("/")
+        "/#{input}"
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/frontmatter_defaults.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/frontmatter_defaults.rb
new file mode 100644
index 0000000..7cbfa35
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/frontmatter_defaults.rb
@@ -0,0 +1,195 @@
+module Jekyll
+  # This class handles custom defaults for YAML frontmatter settings.
+  # These are set in _config.yml and apply both to internal use (e.g. layout)
+  # and the data available to liquid.
+  #
+  # It is exposed via the frontmatter_defaults method on the site class.
+  class FrontmatterDefaults
+    # Initializes a new instance.
+    def initialize(site)
+      @site = site
+    end
+
+    def update_deprecated_types(set)
+      return set unless set.key?("scope") && set["scope"].key?("type")
+
+      set["scope"]["type"] =
+        case set["scope"]["type"]
+        when "page"
+          Deprecator.defaults_deprecate_type("page", "pages")
+          "pages"
+        when "post"
+          Deprecator.defaults_deprecate_type("post", "posts")
+          "posts"
+        when "draft"
+          Deprecator.defaults_deprecate_type("draft", "drafts")
+          "drafts"
+        else
+          set["scope"]["type"]
+        end
+
+      set
+    end
+
+    def ensure_time!(set)
+      return set unless set.key?("values") && set["values"].key?("date")
+      return set if set["values"]["date"].is_a?(Time)
+      set["values"]["date"] = Utils.parse_date(
+        set["values"]["date"],
+        "An invalid date format was found in a front-matter default set: #{set}"
+      )
+      set
+    end
+
+    # Finds a default value for a given setting, filtered by path and type
+    #
+    # path - the path (relative to the source) of the page,
+    # post or :draft the default is used in
+    # type - a symbol indicating whether a :page,
+    # a :post or a :draft calls this method
+    #
+    # Returns the default value or nil if none was found
+    def find(path, type, setting)
+      value = nil
+      old_scope = nil
+
+      matching_sets(path, type).each do |set|
+        if set["values"].key?(setting) && has_precedence?(old_scope, set["scope"])
+          value = set["values"][setting]
+          old_scope = set["scope"]
+        end
+      end
+      value
+    end
+
+    # Collects a hash with all default values for a page or post
+    #
+    # path - the relative path of the page or post
+    # type - a symbol indicating the type (:post, :page or :draft)
+    #
+    # Returns a hash with all default values (an empty hash if there are none)
+    def all(path, type)
+      defaults = {}
+      old_scope = nil
+      matching_sets(path, type).each do |set|
+        if has_precedence?(old_scope, set["scope"])
+          defaults = Utils.deep_merge_hashes(defaults, set["values"])
+          old_scope = set["scope"]
+        else
+          defaults = Utils.deep_merge_hashes(set["values"], defaults)
+        end
+      end
+      defaults
+    end
+
+    private
+
+    # Checks if a given default setting scope matches the given path and type
+    #
+    # scope - the hash indicating the scope, as defined in _config.yml
+    # path - the path to check for
+    # type - the type (:post, :page or :draft) to check for
+    #
+    # Returns true if the scope applies to the given path and type
+    def applies?(scope, path, type)
+      applies_path?(scope, path) && applies_type?(scope, type)
+    end
+
+    def applies_path?(scope, path)
+      return true if !scope.key?("path") || scope["path"].empty?
+
+      scope_path = Pathname.new(scope["path"])
+      Pathname.new(sanitize_path(path)).ascend do |ascended_path|
+        if ascended_path.to_s == scope_path.to_s
+          return true
+        end
+      end
+    end
+
+    # Determines whether the scope applies to type.
+    # The scope applies to the type if:
+    #   1. no 'type' is specified
+    #   2. the 'type' in the scope is the same as the type asked about
+    #
+    # scope - the Hash defaults set being asked about application
+    # type  - the type of the document being processed / asked about
+    #         its defaults.
+    #
+    # Returns true if either of the above conditions are satisfied,
+    #   otherwise returns false
+    def applies_type?(scope, type)
+      !scope.key?("type") || scope["type"].eql?(type.to_s)
+    end
+
+    # Checks if a given set of default values is valid
+    #
+    # set - the default value hash, as defined in _config.yml
+    #
+    # Returns true if the set is valid and can be used in this class
+    def valid?(set)
+      set.is_a?(Hash) && set["values"].is_a?(Hash)
+    end
+
+    # Determines if a new scope has precedence over an old one
+    #
+    # old_scope - the old scope hash, or nil if there's none
+    # new_scope - the new scope hash
+    #
+    # Returns true if the new scope has precedence over the older
+    # rubocop: disable PredicateName
+    def has_precedence?(old_scope, new_scope)
+      return true if old_scope.nil?
+
+      new_path = sanitize_path(new_scope["path"])
+      old_path = sanitize_path(old_scope["path"])
+
+      if new_path.length != old_path.length
+        new_path.length >= old_path.length
+      elsif new_scope.key?("type")
+        true
+      else
+        !old_scope.key? "type"
+      end
+    end
+    # rubocop: enable PredicateName
+
+    # Collects a list of sets that match the given path and type
+    #
+    # Returns an array of hashes
+    def matching_sets(path, type)
+      valid_sets.select do |set|
+        !set.key?("scope") || applies?(set["scope"], path, type)
+      end
+    end
+
+    # Returns a list of valid sets
+    #
+    # This is not cached to allow plugins to modify the configuration
+    # and have their changes take effect
+    #
+    # Returns an array of hashes
+    def valid_sets
+      sets = @site.config["defaults"]
+      return [] unless sets.is_a?(Array)
+
+      sets.map do |set|
+        if valid?(set)
+          ensure_time!(update_deprecated_types(set))
+        else
+          Jekyll.logger.warn "Defaults:", "An invalid front-matter default set was found:"
+          Jekyll.logger.warn set.to_s
+          nil
+        end
+      end.compact
+    end
+
+    # Sanitizes the given path by removing a leading and adding a trailing slash
+    def sanitize_path(path)
+      if path.nil? || path.empty?
+        ""
+      else
+        path.gsub(%r!\A/|(?<=[^/])\z!, "".freeze)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/generator.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/generator.rb
new file mode 100644
index 0000000..bf7c0f1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/generator.rb
@@ -0,0 +1,3 @@
+module Jekyll
+  Generator = Class.new(Plugin)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/hooks.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/hooks.rb
new file mode 100644
index 0000000..241dce3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/hooks.rb
@@ -0,0 +1,102 @@
+module Jekyll
+  module Hooks
+    DEFAULT_PRIORITY = 20
+
+    # compatibility layer for octopress-hooks users
+    PRIORITY_MAP = {
+      :low    => 10,
+      :normal => 20,
+      :high   => 30,
+    }.freeze
+
+    # initial empty hooks
+    @registry = {
+      :site      => {
+        :after_init  => [],
+        :after_reset => [],
+        :post_read   => [],
+        :pre_render  => [],
+        :post_render => [],
+        :post_write  => [],
+      },
+      :pages     => {
+        :post_init   => [],
+        :pre_render  => [],
+        :post_render => [],
+        :post_write  => [],
+      },
+      :posts     => {
+        :post_init   => [],
+        :pre_render  => [],
+        :post_render => [],
+        :post_write  => [],
+      },
+      :documents => {
+        :post_init   => [],
+        :pre_render  => [],
+        :post_render => [],
+        :post_write  => [],
+      },
+    }
+
+    # map of all hooks and their priorities
+    @hook_priority = {}
+
+    NotAvailable = Class.new(RuntimeError)
+    Uncallable = Class.new(RuntimeError)
+
+    # register hook(s) to be called later, public API
+    def self.register(owners, event, priority: DEFAULT_PRIORITY, &block)
+      Array(owners).each do |owner|
+        register_one(owner, event, priority_value(priority), &block)
+      end
+    end
+
+    # Ensure the priority is a Fixnum
+    def self.priority_value(priority)
+      return priority if priority.is_a?(Integer)
+      PRIORITY_MAP[priority] || DEFAULT_PRIORITY
+    end
+
+    # register a single hook to be called later, internal API
+    def self.register_one(owner, event, priority, &block)
+      @registry[owner] ||= {
+        :post_init   => [],
+        :pre_render  => [],
+        :post_render => [],
+        :post_write  => [],
+      }
+
+      unless @registry[owner][event]
+        raise NotAvailable, "Invalid hook. #{owner} supports only the " \
+          "following hooks #{@registry[owner].keys.inspect}"
+      end
+
+      unless block.respond_to? :call
+        raise Uncallable, "Hooks must respond to :call"
+      end
+
+      insert_hook owner, event, priority, &block
+    end
+
+    def self.insert_hook(owner, event, priority, &block)
+      @hook_priority[block] = [-priority, @hook_priority.size]
+      @registry[owner][event] << block
+    end
+
+    # interface for Jekyll core components to trigger hooks
+    def self.trigger(owner, event, *args)
+      # proceed only if there are hooks to call
+      return unless @registry[owner]
+      return unless @registry[owner][event]
+
+      # hooks to call for this owner and event
+      hooks = @registry[owner][event]
+
+      # sort and call hooks according to priority and load order
+      hooks.sort_by { |h| @hook_priority[h] }.each do |hook|
+        hook.call(*args)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/layout.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/layout.rb
new file mode 100644
index 0000000..3a08ad0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/layout.rb
@@ -0,0 +1,60 @@
+module Jekyll
+  class Layout
+    include Convertible
+
+    # Gets the Site object.
+    attr_reader :site
+
+    # Gets the name of this layout.
+    attr_reader :name
+
+    # Gets the path to this layout.
+    attr_reader :path
+
+    # Gets the path to this layout relative to its base
+    attr_reader :relative_path
+
+    # Gets/Sets the extension of this layout.
+    attr_accessor :ext
+
+    # Gets/Sets the Hash that holds the metadata for this layout.
+    attr_accessor :data
+
+    # Gets/Sets the content of this layout.
+    attr_accessor :content
+
+    # Initialize a new Layout.
+    #
+    # site - The Site.
+    # base - The String path to the source.
+    # name - The String filename of the post file.
+    def initialize(site, base, name)
+      @site = site
+      @base = base
+      @name = name
+
+      if site.theme && site.theme.layouts_path.eql?(base)
+        @base_dir = site.theme.root
+        @path = site.in_theme_dir(base, name)
+      else
+        @base_dir = site.source
+        @path = site.in_source_dir(base, name)
+      end
+      @relative_path = @path.sub(@base_dir, "")
+
+      self.data = {}
+
+      process(name)
+      read_yaml(base, name)
+    end
+
+    # Extract information from the layout filename.
+    #
+    # name - The String filename of the layout file.
+    #
+    # Returns nothing.
+    def process(name)
+      self.ext = File.extname(name)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_extensions.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_extensions.rb
new file mode 100644
index 0000000..5ba7dd8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_extensions.rb
@@ -0,0 +1,22 @@
+module Jekyll
+  module LiquidExtensions
+
+    # Lookup a Liquid variable in the given context.
+    #
+    # context  - the Liquid context in question.
+    # variable - the variable name, as a string.
+    #
+    # Returns the value of the variable in the context
+    #   or the variable name if not found.
+    def lookup_variable(context, variable)
+      lookup = context
+
+      variable.split(".").each do |value|
+        lookup = lookup[value]
+      end
+
+      lookup || variable
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_renderer.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_renderer.rb
new file mode 100644
index 0000000..919930e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_renderer.rb
@@ -0,0 +1,50 @@
+require "jekyll/liquid_renderer/file"
+require "jekyll/liquid_renderer/table"
+
+module Jekyll
+  class LiquidRenderer
+    def initialize(site)
+      @site = site
+      Liquid::Template.error_mode = @site.config["liquid"]["error_mode"].to_sym
+      reset
+    end
+
+    def reset
+      @stats = {}
+    end
+
+    def file(filename)
+      filename = @site.in_source_dir(filename).sub(
+        %r!\A#{Regexp.escape(@site.source)}/!,
+        ""
+      )
+
+      LiquidRenderer::File.new(self, filename).tap do
+        @stats[filename] ||= {}
+        @stats[filename][:count] ||= 0
+        @stats[filename][:count] += 1
+      end
+    end
+
+    def increment_bytes(filename, bytes)
+      @stats[filename][:bytes] ||= 0
+      @stats[filename][:bytes] += bytes
+    end
+
+    def increment_time(filename, time)
+      @stats[filename][:time] ||= 0.0
+      @stats[filename][:time] += time
+    end
+
+    def stats_table(n = 50)
+      LiquidRenderer::Table.new(@stats).to_s(n)
+    end
+
+    def self.format_error(e, path)
+      if e.is_a? Tags::IncludeTagError
+        return "#{e.message} in #{e.path}, included in #{path}"
+      end
+      "#{e.message} in #{path}"
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_renderer/file.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_renderer/file.rb
new file mode 100644
index 0000000..eec8c7b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_renderer/file.rb
@@ -0,0 +1,54 @@
+module Jekyll
+  class LiquidRenderer
+    class File
+      def initialize(renderer, filename)
+        @renderer = renderer
+        @filename = filename
+      end
+
+      def parse(content)
+        measure_time do
+          @template = Liquid::Template.parse(content, :line_numbers => true)
+        end
+
+        self
+      end
+
+      def render(*args)
+        measure_time do
+          measure_bytes do
+            @template.render(*args)
+          end
+        end
+      end
+
+      def render!(*args)
+        measure_time do
+          measure_bytes do
+            @template.render!(*args)
+          end
+        end
+      end
+
+      def warnings
+        @template.warnings
+      end
+
+      private
+
+      def measure_bytes
+        yield.tap do |str|
+          @renderer.increment_bytes(@filename, str.bytesize)
+        end
+      end
+
+      def measure_time
+        before = Time.now
+        yield
+      ensure
+        after = Time.now
+        @renderer.increment_time(@filename, after - before)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_renderer/table.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_renderer/table.rb
new file mode 100644
index 0000000..aab7fdf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/liquid_renderer/table.rb
@@ -0,0 +1,94 @@
+module Jekyll
+  class LiquidRenderer::Table
+    def initialize(stats)
+      @stats = stats
+    end
+
+    def to_s(n = 50)
+      data = data_for_table(n)
+      widths = table_widths(data)
+      generate_table(data, widths)
+    end
+
+    private
+
+    def generate_table(data, widths)
+      str = "\n"
+
+      table_head = data.shift
+      str << generate_row(table_head, widths)
+      str << generate_table_head_border(table_head, widths)
+
+      data.each do |row_data|
+        str << generate_row(row_data, widths)
+      end
+
+      str << "\n"
+      str
+    end
+
+    def generate_table_head_border(row_data, widths)
+      str = ""
+
+      row_data.each_index do |cell_index|
+        str << "-" * widths[cell_index]
+        str << "-+-" unless cell_index == row_data.length - 1
+      end
+
+      str << "\n"
+      str
+    end
+
+    def generate_row(row_data, widths)
+      str = ""
+
+      row_data.each_with_index do |cell_data, cell_index|
+        str << if cell_index.zero?
+                 cell_data.ljust(widths[cell_index], " ")
+               else
+                 cell_data.rjust(widths[cell_index], " ")
+               end
+
+        str << " | " unless cell_index == row_data.length - 1
+      end
+
+      str << "\n"
+      str
+    end
+
+    def table_widths(data)
+      widths = []
+
+      data.each do |row|
+        row.each_with_index do |cell, index|
+          widths[index] = [ cell.length, widths[index] ].compact.max
+        end
+      end
+
+      widths
+    end
+
+    def data_for_table(n)
+      sorted = @stats.sort_by { |_, file_stats| -file_stats[:time] }
+      sorted = sorted.slice(0, n)
+
+      table = [%w(Filename Count Bytes Time)]
+
+      sorted.each do |filename, file_stats|
+        row = []
+        row << filename
+        row << file_stats[:count].to_s
+        row << format_bytes(file_stats[:bytes])
+        row << format("%.3f", file_stats[:time])
+        table << row
+      end
+
+      table
+    end
+
+    def format_bytes(bytes)
+      bytes /= 1024.0
+      format("%.2fK", bytes)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/log_adapter.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/log_adapter.rb
new file mode 100644
index 0000000..965f329
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/log_adapter.rb
@@ -0,0 +1,115 @@
+module Jekyll
+  class LogAdapter
+    attr_reader :writer, :messages
+
+    LOG_LEVELS = {
+      :debug => ::Logger::DEBUG,
+      :info  => ::Logger::INFO,
+      :warn  => ::Logger::WARN,
+      :error => ::Logger::ERROR,
+    }.freeze
+
+    # Public: Create a new instance of a log writer
+    #
+    # writer - Logger compatible instance
+    # log_level - (optional, symbol) the log level
+    #
+    # Returns nothing
+    def initialize(writer, level = :info)
+      @messages = []
+      @writer = writer
+      self.log_level = level
+    end
+
+    # Public: Set the log level on the writer
+    #
+    # level - (symbol) the log level
+    #
+    # Returns nothing
+    def log_level=(level)
+      writer.level = LOG_LEVELS.fetch(level)
+    end
+
+    def adjust_verbosity(options = {})
+      # Quiet always wins.
+      if options[:quiet]
+        self.log_level = :error
+      elsif options[:verbose]
+        self.log_level = :debug
+      end
+      debug "Logging at level:", LOG_LEVELS.key(writer.level).to_s
+    end
+
+    # Public: Print a debug message
+    #
+    # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
+    # message - the message detail
+    #
+    # Returns nothing
+    def debug(topic, message = nil)
+      writer.debug(message(topic, message))
+    end
+
+    # Public: Print a message
+    #
+    # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
+    # message - the message detail
+    #
+    # Returns nothing
+    def info(topic, message = nil)
+      writer.info(message(topic, message))
+    end
+
+    # Public: Print a message
+    #
+    # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
+    # message - the message detail
+    #
+    # Returns nothing
+    def warn(topic, message = nil)
+      writer.warn(message(topic, message))
+    end
+
+    # Public: Print an error message
+    #
+    # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
+    # message - the message detail
+    #
+    # Returns nothing
+    def error(topic, message = nil)
+      writer.error(message(topic, message))
+    end
+
+    # Public: Print an error message and immediately abort the process
+    #
+    # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
+    # message - the message detail (can be omitted)
+    #
+    # Returns nothing
+    def abort_with(topic, message = nil)
+      error(topic, message)
+      abort
+    end
+
+    # Internal: Build a topic method
+    #
+    # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
+    # message - the message detail
+    #
+    # Returns the formatted message
+    def message(topic, message)
+      msg = formatted_topic(topic) + message.to_s.gsub(%r!\s+!, " ")
+      messages << msg
+      msg
+    end
+
+    # Internal: Format the topic
+    #
+    # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
+    #
+    # Returns the formatted topic statement
+    def formatted_topic(topic)
+      "#{topic} ".rjust(20)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/mime.types b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/mime.types
new file mode 100644
index 0000000..15828b9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/mime.types
@@ -0,0 +1,800 @@
+# Woah there. Do not edit this file directly.
+# This file is generated automatically by script/vendor-mimes.
+
+application/andrew-inset                                                  ez
+application/applixware                                                    aw
+application/atom+xml                                                      atom
+application/atomcat+xml                                                   atomcat
+application/atomsvc+xml                                                   atomsvc
+application/bdoc                                                          bdoc
+application/ccxml+xml                                                     ccxml
+application/cdmi-capability                                               cdmia
+application/cdmi-container                                                cdmic
+application/cdmi-domain                                                   cdmid
+application/cdmi-object                                                   cdmio
+application/cdmi-queue                                                    cdmiq
+application/cu-seeme                                                      cu
+application/dash+xml                                                      mdp
+application/davmount+xml                                                  davmount
+application/docbook+xml                                                   dbk
+application/dssc+der                                                      dssc
+application/dssc+xml                                                      xdssc
+application/ecmascript                                                    ecma
+application/emma+xml                                                      emma
+application/epub+zip                                                      epub
+application/exi                                                           exi
+application/font-tdpfr                                                    pfr
+application/font-woff                                                     woff
+application/font-woff2                                                    woff2
+application/gml+xml                                                       gml
+application/gpx+xml                                                       gpx
+application/gxf                                                           gxf
+application/hyperstudio                                                   stk
+application/inkml+xml                                                     ink inkml
+application/ipfix                                                         ipfix
+application/java-archive                                                  jar war ear
+application/java-serialized-object                                        ser
+application/java-vm                                                       class
+application/javascript                                                    js
+application/json                                                          json map
+application/json5                                                         json5
+application/jsonml+json                                                   jsonml
+application/ld+json                                                       jsonld
+application/lost+xml                                                      lostxml
+application/mac-binhex40                                                  hqx
+application/mac-compactpro                                                cpt
+application/mads+xml                                                      mads
+application/manifest+json                                                 webmanifest
+application/marc                                                          mrc
+application/marcxml+xml                                                   mrcx
+application/mathematica                                                   ma nb mb
+application/mathml+xml                                                    mathml
+application/mbox                                                          mbox
+application/mediaservercontrol+xml                                        mscml
+application/metalink+xml                                                  metalink
+application/metalink4+xml                                                 meta4
+application/mets+xml                                                      mets
+application/mods+xml                                                      mods
+application/mp21                                                          m21 mp21
+application/mp4                                                           mp4s m4p
+application/msword                                                        doc dot
+application/mxf                                                           mxf
+application/octet-stream                                                  bin dms lrf mar so dist distz pkg bpk dump elc deploy exe dll deb dmg iso img msi msp msm buffer
+application/oda                                                           oda
+application/oebps-package+xml                                             opf
+application/ogg                                                           ogx
+application/omdoc+xml                                                     omdoc
+application/onenote                                                       onetoc onetoc2 onetmp onepkg
+application/oxps                                                          oxps
+application/patch-ops-error+xml                                           xer
+application/pdf                                                           pdf
+application/pgp-encrypted                                                 pgp
+application/pgp-signature                                                 asc sig
+application/pics-rules                                                    prf
+application/pkcs10                                                        p10
+application/pkcs7-mime                                                    p7m p7c
+application/pkcs7-signature                                               p7s
+application/pkcs8                                                         p8
+application/pkix-attr-cert                                                ac
+application/pkix-cert                                                     cer
+application/pkix-crl                                                      crl
+application/pkix-pkipath                                                  pkipath
+application/pkixcmp                                                       pki
+application/pls+xml                                                       pls
+application/postscript                                                    ai eps ps
+application/prs.cww                                                       cww
+application/pskc+xml                                                      pskcxml
+application/rdf+xml                                                       rdf
+application/reginfo+xml                                                   rif
+application/relax-ng-compact-syntax                                       rnc
+application/resource-lists+xml                                            rl
+application/resource-lists-diff+xml                                       rld
+application/rls-services+xml                                              rs
+application/rpki-ghostbusters                                             gbr
+application/rpki-manifest                                                 mft
+application/rpki-roa                                                      roa
+application/rsd+xml                                                       rsd
+application/rss+xml                                                       rss
+application/rtf                                                           rtf
+application/sbml+xml                                                      sbml
+application/scvp-cv-request                                               scq
+application/scvp-cv-response                                              scs
+application/scvp-vp-request                                               spq
+application/scvp-vp-response                                              spp
+application/sdp                                                           sdp
+application/set-payment-initiation                                        setpay
+application/set-registration-initiation                                   setreg
+application/shf+xml                                                       shf
+application/smil+xml                                                      smi smil
+application/sparql-query                                                  rq
+application/sparql-results+xml                                            srx
+application/srgs                                                          gram
+application/srgs+xml                                                      grxml
+application/sru+xml                                                       sru
+application/ssdl+xml                                                      ssdl
+application/ssml+xml                                                      ssml
+application/tei+xml                                                       tei teicorpus
+application/thraud+xml                                                    tfi
+application/timestamped-data                                              tsd
+application/vnd.3gpp.pic-bw-large                                         plb
+application/vnd.3gpp.pic-bw-small                                         psb
+application/vnd.3gpp.pic-bw-var                                           pvb
+application/vnd.3gpp2.tcap                                                tcap
+application/vnd.3m.post-it-notes                                          pwn
+application/vnd.accpac.simply.aso                                         aso
+application/vnd.accpac.simply.imp                                         imp
+application/vnd.acucobol                                                  acu
+application/vnd.acucorp                                                   atc acutc
+application/vnd.adobe.air-application-installer-package+zip               air
+application/vnd.adobe.formscentral.fcdt                                   fcdt
+application/vnd.adobe.fxp                                                 fxp fxpl
+application/vnd.adobe.xdp+xml                                             xdp
+application/vnd.adobe.xfdf                                                xfdf
+application/vnd.ahead.space                                               ahead
+application/vnd.airzip.filesecure.azf                                     azf
+application/vnd.airzip.filesecure.azs                                     azs
+application/vnd.amazon.ebook                                              azw
+application/vnd.americandynamics.acc                                      acc
+application/vnd.amiga.ami                                                 ami
+application/vnd.android.package-archive                                   apk
+application/vnd.anser-web-certificate-issue-initiation                    cii
+application/vnd.anser-web-funds-transfer-initiation                       fti
+application/vnd.antix.game-component                                      atx
+application/vnd.apple.installer+xml                                       mpkg
+application/vnd.apple.mpegurl                                             m3u8
+application/vnd.aristanetworks.swi                                        swi
+application/vnd.astraea-software.iota                                     iota
+application/vnd.audiograph                                                aep
+application/vnd.blueice.multipass                                         mpm
+application/vnd.bmi                                                       bmi
+application/vnd.businessobjects                                           rep
+application/vnd.chemdraw+xml                                              cdxml
+application/vnd.chipnuts.karaoke-mmd                                      mmd
+application/vnd.cinderella                                                cdy
+application/vnd.claymore                                                  cla
+application/vnd.cloanto.rp9                                               rp9
+application/vnd.clonk.c4group                                             c4g c4d c4f c4p c4u
+application/vnd.cluetrust.cartomobile-config                              c11amc
+application/vnd.cluetrust.cartomobile-config-pkg                          c11amz
+application/vnd.commonspace                                               csp
+application/vnd.contact.cmsg                                              cdbcmsg
+application/vnd.cosmocaller                                               cmc
+application/vnd.crick.clicker                                             clkx
+application/vnd.crick.clicker.keyboard                                    clkk
+application/vnd.crick.clicker.palette                                     clkp
+application/vnd.crick.clicker.template                                    clkt
+application/vnd.crick.clicker.wordbank                                    clkw
+application/vnd.criticaltools.wbs+xml                                     wbs
+application/vnd.ctc-posml                                                 pml
+application/vnd.cups-ppd                                                  ppd
+application/vnd.curl.car                                                  car
+application/vnd.curl.pcurl                                                pcurl
+application/vnd.dart                                                      dart
+application/vnd.data-vision.rdz                                           rdz
+application/vnd.dece.data                                                 uvf uvvf uvd uvvd
+application/vnd.dece.ttml+xml                                             uvt uvvt
+application/vnd.dece.unspecified                                          uvx uvvx
+application/vnd.dece.zip                                                  uvz uvvz
+application/vnd.denovo.fcselayout-link                                    fe_launch
+application/vnd.dna                                                       dna
+application/vnd.dolby.mlp                                                 mlp
+application/vnd.dpgraph                                                   dpg
+application/vnd.dreamfactory                                              dfac
+application/vnd.ds-keypoint                                               kpxx
+application/vnd.dvb.ait                                                   ait
+application/vnd.dvb.service                                               svc
+application/vnd.dynageo                                                   geo
+application/vnd.ecowin.chart                                              mag
+application/vnd.enliven                                                   nml
+application/vnd.epson.esf                                                 esf
+application/vnd.epson.msf                                                 msf
+application/vnd.epson.quickanime                                          qam
+application/vnd.epson.salt                                                slt
+application/vnd.epson.ssf                                                 ssf
+application/vnd.eszigno3+xml                                              es3 et3
+application/vnd.ezpix-album                                               ez2
+application/vnd.ezpix-package                                             ez3
+application/vnd.fdf                                                       fdf
+application/vnd.fdsn.mseed                                                mseed
+application/vnd.fdsn.seed                                                 seed dataless
+application/vnd.flographit                                                gph
+application/vnd.fluxtime.clip                                             ftc
+application/vnd.framemaker                                                fm frame maker book
+application/vnd.frogans.fnc                                               fnc
+application/vnd.frogans.ltf                                               ltf
+application/vnd.fsc.weblaunch                                             fsc
+application/vnd.fujitsu.oasys                                             oas
+application/vnd.fujitsu.oasys2                                            oa2
+application/vnd.fujitsu.oasys3                                            oa3
+application/vnd.fujitsu.oasysgp                                           fg5
+application/vnd.fujitsu.oasysprs                                          bh2
+application/vnd.fujixerox.ddd                                             ddd
+application/vnd.fujixerox.docuworks                                       xdw
+application/vnd.fujixerox.docuworks.binder                                xbd
+application/vnd.fuzzysheet                                                fzs
+application/vnd.genomatix.tuxedo                                          txd
+application/vnd.geogebra.file                                             ggb
+application/vnd.geogebra.tool                                             ggt
+application/vnd.geometry-explorer                                         gex gre
+application/vnd.geonext                                                   gxt
+application/vnd.geoplan                                                   g2w
+application/vnd.geospace                                                  g3w
+application/vnd.gmx                                                       gmx
+application/vnd.google-earth.kml+xml                                      kml
+application/vnd.google-earth.kmz                                          kmz
+application/vnd.grafeq                                                    gqf gqs
+application/vnd.groove-account                                            gac
+application/vnd.groove-help                                               ghf
+application/vnd.groove-identity-message                                   gim
+application/vnd.groove-injector                                           grv
+application/vnd.groove-tool-message                                       gtm
+application/vnd.groove-tool-template                                      tpl
+application/vnd.groove-vcard                                              vcg
+application/vnd.hal+xml                                                   hal
+application/vnd.handheld-entertainment+xml                                zmm
+application/vnd.hbci                                                      hbci
+application/vnd.hhe.lesson-player                                         les
+application/vnd.hp-hpgl                                                   hpgl
+application/vnd.hp-hpid                                                   hpid
+application/vnd.hp-hps                                                    hps
+application/vnd.hp-jlyt                                                   jlt
+application/vnd.hp-pcl                                                    pcl
+application/vnd.hp-pclxl                                                  pclxl
+application/vnd.hydrostatix.sof-data                                      sfd-hdstx
+application/vnd.ibm.minipay                                               mpy
+application/vnd.ibm.modcap                                                afp listafp list3820
+application/vnd.ibm.rights-management                                     irm
+application/vnd.ibm.secure-container                                      sc
+application/vnd.iccprofile                                                icc icm
+application/vnd.igloader                                                  igl
+application/vnd.immervision-ivp                                           ivp
+application/vnd.immervision-ivu                                           ivu
+application/vnd.insors.igm                                                igm
+application/vnd.intercon.formnet                                          xpw xpx
+application/vnd.intergeo                                                  i2g
+application/vnd.intu.qbo                                                  qbo
+application/vnd.intu.qfx                                                  qfx
+application/vnd.ipunplugged.rcprofile                                     rcprofile
+application/vnd.irepository.package+xml                                   irp
+application/vnd.is-xpr                                                    xpr
+application/vnd.isac.fcs                                                  fcs
+application/vnd.jam                                                       jam
+application/vnd.jcp.javame.midlet-rms                                     rms
+application/vnd.jisp                                                      jisp
+application/vnd.joost.joda-archive                                        joda
+application/vnd.kahootz                                                   ktz ktr
+application/vnd.kde.karbon                                                karbon
+application/vnd.kde.kchart                                                chrt
+application/vnd.kde.kformula                                              kfo
+application/vnd.kde.kivio                                                 flw
+application/vnd.kde.kontour                                               kon
+application/vnd.kde.kpresenter                                            kpr kpt
+application/vnd.kde.kspread                                               ksp
+application/vnd.kde.kword                                                 kwd kwt
+application/vnd.kenameaapp                                                htke
+application/vnd.kidspiration                                              kia
+application/vnd.kinar                                                     kne knp
+application/vnd.koan                                                      skp skd skt skm
+application/vnd.kodak-descriptor                                          sse
+application/vnd.las.las+xml                                               lasxml
+application/vnd.llamagraphics.life-balance.desktop                        lbd
+application/vnd.llamagraphics.life-balance.exchange+xml                   lbe
+application/vnd.lotus-1-2-3                                               123
+application/vnd.lotus-approach                                            apr
+application/vnd.lotus-freelance                                           pre
+application/vnd.lotus-notes                                               nsf
+application/vnd.lotus-organizer                                           org
+application/vnd.lotus-screencam                                           scm
+application/vnd.lotus-wordpro                                             lwp
+application/vnd.macports.portpkg                                          portpkg
+application/vnd.mcd                                                       mcd
+application/vnd.medcalcdata                                               mc1
+application/vnd.mediastation.cdkey                                        cdkey
+application/vnd.mfer                                                      mwf
+application/vnd.mfmp                                                      mfm
+application/vnd.micrografx.flo                                            flo
+application/vnd.micrografx.igx                                            igx
+application/vnd.mif                                                       mif
+application/vnd.mobius.daf                                                daf
+application/vnd.mobius.dis                                                dis
+application/vnd.mobius.mbk                                                mbk
+application/vnd.mobius.mqy                                                mqy
+application/vnd.mobius.msl                                                msl
+application/vnd.mobius.plc                                                plc
+application/vnd.mobius.txf                                                txf
+application/vnd.mophun.application                                        mpn
+application/vnd.mophun.certificate                                        mpc
+application/vnd.mozilla.xul+xml                                           xul
+application/vnd.ms-artgalry                                               cil
+application/vnd.ms-cab-compressed                                         cab
+application/vnd.ms-excel                                                  xls xlm xla xlc xlt xlw
+application/vnd.ms-excel.addin.macroenabled.12                            xlam
+application/vnd.ms-excel.sheet.binary.macroenabled.12                     xlsb
+application/vnd.ms-excel.sheet.macroenabled.12                            xlsm
+application/vnd.ms-excel.template.macroenabled.12                         xltm
+application/vnd.ms-fontobject                                             eot
+application/vnd.ms-htmlhelp                                               chm
+application/vnd.ms-ims                                                    ims
+application/vnd.ms-lrm                                                    lrm
+application/vnd.ms-officetheme                                            thmx
+application/vnd.ms-pki.seccat                                             cat
+application/vnd.ms-pki.stl                                                stl
+application/vnd.ms-powerpoint                                             ppt pps pot
+application/vnd.ms-powerpoint.addin.macroenabled.12                       ppam
+application/vnd.ms-powerpoint.presentation.macroenabled.12                pptm
+application/vnd.ms-powerpoint.slide.macroenabled.12                       sldm
+application/vnd.ms-powerpoint.slideshow.macroenabled.12                   ppsm
+application/vnd.ms-powerpoint.template.macroenabled.12                    potm
+application/vnd.ms-project                                                mpp mpt
+application/vnd.ms-word.document.macroenabled.12                          docm
+application/vnd.ms-word.template.macroenabled.12                          dotm
+application/vnd.ms-works                                                  wps wks wcm wdb
+application/vnd.ms-wpl                                                    wpl
+application/vnd.ms-xpsdocument                                            xps
+application/vnd.mseq                                                      mseq
+application/vnd.musician                                                  mus
+application/vnd.muvee.style                                               msty
+application/vnd.mynfc                                                     taglet
+application/vnd.neurolanguage.nlu                                         nlu
+application/vnd.nitf                                                      ntf nitf
+application/vnd.noblenet-directory                                        nnd
+application/vnd.noblenet-sealer                                           nns
+application/vnd.noblenet-web                                              nnw
+application/vnd.nokia.n-gage.data                                         ngdat
+application/vnd.nokia.n-gage.symbian.install                              n-gage
+application/vnd.nokia.radio-preset                                        rpst
+application/vnd.nokia.radio-presets                                       rpss
+application/vnd.novadigm.edm                                              edm
+application/vnd.novadigm.edx                                              edx
+application/vnd.novadigm.ext                                              ext
+application/vnd.oasis.opendocument.chart                                  odc
+application/vnd.oasis.opendocument.chart-template                         otc
+application/vnd.oasis.opendocument.database                               odb
+application/vnd.oasis.opendocument.formula                                odf
+application/vnd.oasis.opendocument.formula-template                       odft
+application/vnd.oasis.opendocument.graphics                               odg
+application/vnd.oasis.opendocument.graphics-template                      otg
+application/vnd.oasis.opendocument.image                                  odi
+application/vnd.oasis.opendocument.image-template                         oti
+application/vnd.oasis.opendocument.presentation                           odp
+application/vnd.oasis.opendocument.presentation-template                  otp
+application/vnd.oasis.opendocument.spreadsheet                            ods
+application/vnd.oasis.opendocument.spreadsheet-template                   ots
+application/vnd.oasis.opendocument.text                                   odt
+application/vnd.oasis.opendocument.text-master                            odm
+application/vnd.oasis.opendocument.text-template                          ott
+application/vnd.oasis.opendocument.text-web                               oth
+application/vnd.olpc-sugar                                                xo
+application/vnd.oma.dd2+xml                                               dd2
+application/vnd.openofficeorg.extension                                   oxt
+application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
+application/vnd.openxmlformats-officedocument.presentationml.slide        sldx
+application/vnd.openxmlformats-officedocument.presentationml.slideshow    ppsx
+application/vnd.openxmlformats-officedocument.presentationml.template     potx
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet         xlsx
+application/vnd.openxmlformats-officedocument.spreadsheetml.template      xltx
+application/vnd.openxmlformats-officedocument.wordprocessingml.document   docx
+application/vnd.openxmlformats-officedocument.wordprocessingml.template   dotx
+application/vnd.osgeo.mapguide.package                                    mgp
+application/vnd.osgi.dp                                                   dp
+application/vnd.osgi.subsystem                                            esa
+application/vnd.palm                                                      pdb pqa oprc
+application/vnd.pawaafile                                                 paw
+application/vnd.pg.format                                                 str
+application/vnd.pg.osasli                                                 ei6
+application/vnd.picsel                                                    efif
+application/vnd.pmi.widget                                                wg
+application/vnd.pocketlearn                                               plf
+application/vnd.powerbuilder6                                             pbd
+application/vnd.previewsystems.box                                        box
+application/vnd.proteus.magazine                                          mgz
+application/vnd.publishare-delta-tree                                     qps
+application/vnd.pvi.ptid1                                                 ptid
+application/vnd.quark.quarkxpress                                         qxd qxt qwd qwt qxl qxb
+application/vnd.realvnc.bed                                               bed
+application/vnd.recordare.musicxml                                        mxl
+application/vnd.recordare.musicxml+xml                                    musicxml
+application/vnd.rig.cryptonote                                            cryptonote
+application/vnd.rim.cod                                                   cod
+application/vnd.rn-realmedia                                              rm
+application/vnd.rn-realmedia-vbr                                          rmvb
+application/vnd.route66.link66+xml                                        link66
+application/vnd.sailingtracker.track                                      st
+application/vnd.seemail                                                   see
+application/vnd.sema                                                      sema
+application/vnd.semd                                                      semd
+application/vnd.semf                                                      semf
+application/vnd.shana.informed.formdata                                   ifm
+application/vnd.shana.informed.formtemplate                               itp
+application/vnd.shana.informed.interchange                                iif
+application/vnd.shana.informed.package                                    ipk
+application/vnd.simtech-mindmapper                                        twd twds
+application/vnd.smaf                                                      mmf
+application/vnd.smart.teacher                                             teacher
+application/vnd.solent.sdkm+xml                                           sdkm sdkd
+application/vnd.spotfire.dxp                                              dxp
+application/vnd.spotfire.sfs                                              sfs
+application/vnd.stardivision.calc                                         sdc
+application/vnd.stardivision.draw                                         sda
+application/vnd.stardivision.impress                                      sdd
+application/vnd.stardivision.math                                         smf
+application/vnd.stardivision.writer                                       sdw vor
+application/vnd.stardivision.writer-global                                sgl
+application/vnd.stepmania.package                                         smzip
+application/vnd.stepmania.stepchart                                       sm
+application/vnd.sun.xml.calc                                              sxc
+application/vnd.sun.xml.calc.template                                     stc
+application/vnd.sun.xml.draw                                              sxd
+application/vnd.sun.xml.draw.template                                     std
+application/vnd.sun.xml.impress                                           sxi
+application/vnd.sun.xml.impress.template                                  sti
+application/vnd.sun.xml.math                                              sxm
+application/vnd.sun.xml.writer                                            sxw
+application/vnd.sun.xml.writer.global                                     sxg
+application/vnd.sun.xml.writer.template                                   stw
+application/vnd.sus-calendar                                              sus susp
+application/vnd.svd                                                       svd
+application/vnd.symbian.install                                           sis sisx
+application/vnd.syncml+xml                                                xsm
+application/vnd.syncml.dm+wbxml                                           bdm
+application/vnd.syncml.dm+xml                                             xdm
+application/vnd.tao.intent-module-archive                                 tao
+application/vnd.tcpdump.pcap                                              pcap cap dmp
+application/vnd.tmobile-livetv                                            tmo
+application/vnd.trid.tpt                                                  tpt
+application/vnd.triscape.mxs                                              mxs
+application/vnd.trueapp                                                   tra
+application/vnd.ufdl                                                      ufd ufdl
+application/vnd.uiq.theme                                                 utz
+application/vnd.umajin                                                    umj
+application/vnd.unity                                                     unityweb
+application/vnd.uoml+xml                                                  uoml
+application/vnd.vcx                                                       vcx
+application/vnd.visio                                                     vsd vst vss vsw
+application/vnd.visionary                                                 vis
+application/vnd.vsf                                                       vsf
+application/vnd.wap.wbxml                                                 wbxml
+application/vnd.wap.wmlc                                                  wmlc
+application/vnd.wap.wmlscriptc                                            wmlsc
+application/vnd.webturbo                                                  wtb
+application/vnd.wolfram.player                                            nbp
+application/vnd.wordperfect                                               wpd
+application/vnd.wqd                                                       wqd
+application/vnd.wt.stf                                                    stf
+application/vnd.xara                                                      xar
+application/vnd.xfdl                                                      xfdl
+application/vnd.yamaha.hv-dic                                             hvd
+application/vnd.yamaha.hv-script                                          hvs
+application/vnd.yamaha.hv-voice                                           hvp
+application/vnd.yamaha.openscoreformat                                    osf
+application/vnd.yamaha.openscoreformat.osfpvg+xml                         osfpvg
+application/vnd.yamaha.smaf-audio                                         saf
+application/vnd.yamaha.smaf-phrase                                        spf
+application/vnd.yellowriver-custom-menu                                   cmp
+application/vnd.zul                                                       zir zirz
+application/vnd.zzazz.deck+xml                                            zaz
+application/voicexml+xml                                                  vxml
+application/widget                                                        wgt
+application/winhlp                                                        hlp
+application/wsdl+xml                                                      wsdl
+application/wspolicy+xml                                                  wspolicy
+application/x-7z-compressed                                               7z
+application/x-abiword                                                     abw
+application/x-ace-compressed                                              ace
+application/x-authorware-bin                                              aab x32 u32 vox
+application/x-authorware-map                                              aam
+application/x-authorware-seg                                              aas
+application/x-bcpio                                                       bcpio
+application/x-bittorrent                                                  torrent
+application/x-blorb                                                       blb blorb
+application/x-bzip                                                        bz
+application/x-bzip2                                                       bz2 boz
+application/x-cbr                                                         cbr cba cbt cbz cb7
+application/x-cdlink                                                      vcd
+application/x-cfs-compressed                                              cfs
+application/x-chat                                                        chat
+application/x-chess-pgn                                                   pgn
+application/x-chrome-extension                                            crx
+application/x-cocoa                                                       cco
+application/x-conference                                                  nsc
+application/x-cpio                                                        cpio
+application/x-csh                                                         csh
+application/x-debian-package                                              udeb
+application/x-dgc-compressed                                              dgc
+application/x-director                                                    dir dcr dxr cst cct cxt w3d fgd swa
+application/x-doom                                                        wad
+application/x-dtbncx+xml                                                  ncx
+application/x-dtbook+xml                                                  dtb
+application/x-dtbresource+xml                                             res
+application/x-dvi                                                         dvi
+application/x-envoy                                                       evy
+application/x-eva                                                         eva
+application/x-font-bdf                                                    bdf
+application/x-font-ghostscript                                            gsf
+application/x-font-linux-psf                                              psf
+application/x-font-otf                                                    otf
+application/x-font-pcf                                                    pcf
+application/x-font-snf                                                    snf
+application/x-font-ttf                                                    ttf ttc
+application/x-font-type1                                                  pfa pfb pfm afm
+application/x-freearc                                                     arc
+application/x-futuresplash                                                spl
+application/x-gca-compressed                                              gca
+application/x-glulx                                                       ulx
+application/x-gnumeric                                                    gnumeric
+application/x-gramps-xml                                                  gramps
+application/x-gtar                                                        gtar
+application/x-hdf                                                         hdf
+application/x-httpd-php                                                   php
+application/x-install-instructions                                        install
+application/x-java-archive-diff                                           jardiff
+application/x-java-jnlp-file                                              jnlp
+application/x-latex                                                       latex
+application/x-lua-bytecode                                                luac
+application/x-lzh-compressed                                              lzh lha
+application/x-makeself                                                    run
+application/x-mie                                                         mie
+application/x-mobipocket-ebook                                            prc mobi
+application/x-ms-application                                              application
+application/x-ms-shortcut                                                 lnk
+application/x-ms-wmd                                                      wmd
+application/x-ms-wmz                                                      wmz
+application/x-ms-xbap                                                     xbap
+application/x-msaccess                                                    mdb
+application/x-msbinder                                                    obd
+application/x-mscardfile                                                  crd
+application/x-msclip                                                      clp
+application/x-msdownload                                                  com bat
+application/x-msmediaview                                                 mvb m13 m14
+application/x-msmetafile                                                  wmf emf emz
+application/x-msmoney                                                     mny
+application/x-mspublisher                                                 pub
+application/x-msschedule                                                  scd
+application/x-msterminal                                                  trm
+application/x-mswrite                                                     wri
+application/x-netcdf                                                      nc cdf
+application/x-ns-proxy-autoconfig                                         pac
+application/x-nzb                                                         nzb
+application/x-perl                                                        pl pm
+application/x-pkcs12                                                      p12 pfx
+application/x-pkcs7-certificates                                          p7b spc
+application/x-pkcs7-certreqresp                                           p7r
+application/x-rar-compressed                                              rar
+application/x-redhat-package-manager                                      rpm
+application/x-research-info-systems                                       ris
+application/x-sea                                                         sea
+application/x-sh                                                          sh
+application/x-shar                                                        shar
+application/x-shockwave-flash                                             swf
+application/x-silverlight-app                                             xap
+application/x-sql                                                         sql
+application/x-stuffit                                                     sit
+application/x-stuffitx                                                    sitx
+application/x-subrip                                                      srt
+application/x-sv4cpio                                                     sv4cpio
+application/x-sv4crc                                                      sv4crc
+application/x-t3vm-image                                                  t3
+application/x-tads                                                        gam
+application/x-tar                                                         tar
+application/x-tcl                                                         tcl tk
+application/x-tex                                                         tex
+application/x-tex-tfm                                                     tfm
+application/x-texinfo                                                     texinfo texi
+application/x-tgif                                                        obj
+application/x-ustar                                                       ustar
+application/x-wais-source                                                 src
+application/x-web-app-manifest+json                                       webapp
+application/x-x509-ca-cert                                                der crt pem
+application/x-xfig                                                        fig
+application/x-xliff+xml                                                   xlf
+application/x-xpinstall                                                   xpi
+application/x-xz                                                          xz
+application/x-zmachine                                                    z1 z2 z3 z4 z5 z6 z7 z8
+application/xaml+xml                                                      xaml
+application/xcap-diff+xml                                                 xdf
+application/xenc+xml                                                      xenc
+application/xhtml+xml                                                     xhtml xht
+application/xml                                                           xml xsl xsd
+application/xml-dtd                                                       dtd
+application/xop+xml                                                       xop
+application/xproc+xml                                                     xpl
+application/xslt+xml                                                      xslt
+application/xspf+xml                                                      xspf
+application/xv+xml                                                        mxml xhvml xvml xvm
+application/yang                                                          yang
+application/yin+xml                                                       yin
+application/zip                                                           zip
+audio/adpcm                                                               adp
+audio/basic                                                               au snd
+audio/midi                                                                mid midi kar rmi
+audio/mp4                                                                 mp4a m4a
+audio/mpeg                                                                mpga mp2 mp2a mp3 m2a m3a
+audio/ogg                                                                 oga ogg spx
+audio/s3m                                                                 s3m
+audio/silk                                                                sil
+audio/vnd.dece.audio                                                      uva uvva
+audio/vnd.digital-winds                                                   eol
+audio/vnd.dra                                                             dra
+audio/vnd.dts                                                             dts
+audio/vnd.dts.hd                                                          dtshd
+audio/vnd.lucent.voice                                                    lvp
+audio/vnd.ms-playready.media.pya                                          pya
+audio/vnd.nuera.ecelp4800                                                 ecelp4800
+audio/vnd.nuera.ecelp7470                                                 ecelp7470
+audio/vnd.nuera.ecelp9600                                                 ecelp9600
+audio/vnd.rip                                                             rip
+audio/wav                                                                 wav
+audio/webm                                                                weba
+audio/x-aac                                                               aac
+audio/x-aiff                                                              aif aiff aifc
+audio/x-caf                                                               caf
+audio/x-flac                                                              flac
+audio/x-matroska                                                          mka
+audio/x-mpegurl                                                           m3u
+audio/x-ms-wax                                                            wax
+audio/x-ms-wma                                                            wma
+audio/x-pn-realaudio                                                      ram ra
+audio/x-pn-realaudio-plugin                                               rmp
+audio/xm                                                                  xm
+chemical/x-cdx                                                            cdx
+chemical/x-cif                                                            cif
+chemical/x-cmdf                                                           cmdf
+chemical/x-cml                                                            cml
+chemical/x-csml                                                           csml
+chemical/x-xyz                                                            xyz
+image/bmp                                                                 bmp
+image/cgm                                                                 cgm
+image/g3fax                                                               g3
+image/gif                                                                 gif
+image/ief                                                                 ief
+image/jpeg                                                                jpeg jpg jpe
+image/ktx                                                                 ktx
+image/png                                                                 png
+image/prs.btif                                                            btif
+image/sgi                                                                 sgi
+image/svg+xml                                                             svg svgz
+image/tiff                                                                tiff tif
+image/vnd.adobe.photoshop                                                 psd
+image/vnd.dece.graphic                                                    uvi uvvi uvg uvvg
+image/vnd.djvu                                                            djvu djv
+image/vnd.dvb.subtitle                                                    sub
+image/vnd.dwg                                                             dwg
+image/vnd.dxf                                                             dxf
+image/vnd.fastbidsheet                                                    fbs
+image/vnd.fpx                                                             fpx
+image/vnd.fst                                                             fst
+image/vnd.fujixerox.edmics-mmr                                            mmr
+image/vnd.fujixerox.edmics-rlc                                            rlc
+image/vnd.ms-modi                                                         mdi
+image/vnd.ms-photo                                                        wdp
+image/vnd.net-fpx                                                         npx
+image/vnd.wap.wbmp                                                        wbmp
+image/vnd.xiff                                                            xif
+image/webp                                                                webp
+image/x-3ds                                                               3ds
+image/x-cmu-raster                                                        ras
+image/x-cmx                                                               cmx
+image/x-freehand                                                          fh fhc fh4 fh5 fh7
+image/x-icon                                                              ico
+image/x-jng                                                               jng
+image/x-mrsid-image                                                       sid
+image/x-pcx                                                               pcx
+image/x-pict                                                              pic pct
+image/x-portable-anymap                                                   pnm
+image/x-portable-bitmap                                                   pbm
+image/x-portable-graymap                                                  pgm
+image/x-portable-pixmap                                                   ppm
+image/x-rgb                                                               rgb
+image/x-tga                                                               tga
+image/x-xbitmap                                                           xbm
+image/x-xpixmap                                                           xpm
+image/x-xwindowdump                                                       xwd
+message/rfc822                                                            eml mime
+model/iges                                                                igs iges
+model/mesh                                                                msh mesh silo
+model/vnd.collada+xml                                                     dae
+model/vnd.dwf                                                             dwf
+model/vnd.gdl                                                             gdl
+model/vnd.gtw                                                             gtw
+model/vnd.mts                                                             mts
+model/vnd.vtu                                                             vtu
+model/vrml                                                                wrl vrml
+model/x3d+binary                                                          x3db x3dbz
+model/x3d+vrml                                                            x3dv x3dvz
+model/x3d+xml                                                             x3d x3dz
+text/cache-manifest                                                       appcache manifest
+text/calendar                                                             ics ifb
+text/coffeescript                                                         coffee litcoffee
+text/css                                                                  css
+text/csv                                                                  csv
+text/hjson                                                                hjson
+text/html                                                                 html htm shtml
+text/jade                                                                 jade
+text/jsx                                                                  jsx
+text/less                                                                 less
+text/mathml                                                               mml
+text/n3                                                                   n3
+text/plain                                                                txt text conf def list log in ini
+text/prs.lines.tag                                                        dsc
+text/richtext                                                             rtx
+text/sgml                                                                 sgml sgm
+text/stylus                                                               stylus styl
+text/tab-separated-values                                                 tsv
+text/troff                                                                t tr roff man me ms
+text/turtle                                                               ttl
+text/uri-list                                                             uri uris urls
+text/vcard                                                                vcard
+text/vnd.curl                                                             curl
+text/vnd.curl.dcurl                                                       dcurl
+text/vnd.curl.mcurl                                                       mcurl
+text/vnd.curl.scurl                                                       scurl
+text/vnd.fly                                                              fly
+text/vnd.fmi.flexstor                                                     flx
+text/vnd.graphviz                                                         gv
+text/vnd.in3d.3dml                                                        3dml
+text/vnd.in3d.spot                                                        spot
+text/vnd.sun.j2me.app-descriptor                                          jad
+text/vnd.wap.wml                                                          wml
+text/vnd.wap.wmlscript                                                    wmls
+text/vtt                                                                  vtt
+text/x-asm                                                                s asm
+text/x-c                                                                  c cc cxx cpp h hh dic
+text/x-component                                                          htc
+text/x-fortran                                                            f for f77 f90
+text/x-handlebars-template                                                hbs
+text/x-java-source                                                        java
+text/x-lua                                                                lua
+text/x-markdown                                                           markdown md mkd
+text/x-nfo                                                                nfo
+text/x-opml                                                               opml
+text/x-pascal                                                             p pas
+text/x-processing                                                         pde
+text/x-sass                                                               sass
+text/x-scss                                                               scss
+text/x-setext                                                             etx
+text/x-sfv                                                                sfv
+text/x-uuencode                                                           uu
+text/x-vcalendar                                                          vcs
+text/x-vcard                                                              vcf
+text/yaml                                                                 yaml yml
+video/3gpp                                                                3gp 3gpp
+video/3gpp2                                                               3g2
+video/h261                                                                h261
+video/h263                                                                h263
+video/h264                                                                h264
+video/jpeg                                                                jpgv
+video/jpm                                                                 jpm jpgm
+video/mj2                                                                 mj2 mjp2
+video/mp2t                                                                ts
+video/mp4                                                                 mp4 mp4v mpg4
+video/mpeg                                                                mpeg mpg mpe m1v m2v
+video/ogg                                                                 ogv
+video/quicktime                                                           qt mov
+video/vnd.dece.hd                                                         uvh uvvh
+video/vnd.dece.mobile                                                     uvm uvvm
+video/vnd.dece.pd                                                         uvp uvvp
+video/vnd.dece.sd                                                         uvs uvvs
+video/vnd.dece.video                                                      uvv uvvv
+video/vnd.dvb.file                                                        dvb
+video/vnd.fvt                                                             fvt
+video/vnd.mpegurl                                                         mxu m4u
+video/vnd.ms-playready.media.pyv                                          pyv
+video/vnd.uvvu.mp4                                                        uvu uvvu
+video/vnd.vivo                                                            viv
+video/webm                                                                webm
+video/x-f4v                                                               f4v
+video/x-fli                                                               fli
+video/x-flv                                                               flv
+video/x-m4v                                                               m4v
+video/x-matroska                                                          mkv mk3d mks
+video/x-mng                                                               mng
+video/x-ms-asf                                                            asf asx
+video/x-ms-vob                                                            vob
+video/x-ms-wm                                                             wm
+video/x-ms-wmv                                                            wmv
+video/x-ms-wmx                                                            wmx
+video/x-ms-wvx                                                            wvx
+video/x-msvideo                                                           avi
+video/x-sgi-movie                                                         movie
+video/x-smv                                                               smv
+x-conference/x-cooltalk                                                   ice
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/page.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/page.rb
new file mode 100644
index 0000000..02c6cfa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/page.rb
@@ -0,0 +1,185 @@
+module Jekyll
+  class Page
+    include Convertible
+
+    attr_writer :dir
+    attr_accessor :site, :pager
+    attr_accessor :name, :ext, :basename
+    attr_accessor :data, :content, :output
+
+    alias_method :extname, :ext
+
+    FORWARD_SLASH = "/".freeze
+
+    # Attributes for Liquid templates
+    ATTRIBUTES_FOR_LIQUID = %w(
+      content
+      dir
+      name
+      path
+      url
+    ).freeze
+
+    # A set of extensions that are considered HTML or HTML-like so we
+    # should not alter them,  this includes .xhtml through XHTM5.
+
+    HTML_EXTENSIONS = %w(
+      .html
+      .xhtml
+      .htm
+    ).freeze
+
+    # Initialize a new Page.
+    #
+    # site - The Site object.
+    # base - The String path to the source.
+    # dir  - The String path between the source and the file.
+    # name - The String filename of the file.
+    def initialize(site, base, dir, name)
+      @site = site
+      @base = base
+      @dir  = dir
+      @name = name
+      @path = if site.in_theme_dir(base) == base # we're in a theme
+                site.in_theme_dir(base, dir, name)
+              else
+                site.in_source_dir(base, dir, name)
+              end
+
+      process(name)
+      read_yaml(File.join(base, dir), name)
+
+      data.default_proc = proc do |_, key|
+        site.frontmatter_defaults.find(File.join(dir, name), type, key)
+      end
+
+      Jekyll::Hooks.trigger :pages, :post_init, self
+    end
+
+    # The generated directory into which the page will be placed
+    # upon generation. This is derived from the permalink or, if
+    # permalink is absent, will be '/'
+    #
+    # Returns the String destination directory.
+    def dir
+      if url.end_with?(FORWARD_SLASH)
+        url
+      else
+        url_dir = File.dirname(url)
+        url_dir.end_with?(FORWARD_SLASH) ? url_dir : "#{url_dir}/"
+      end
+    end
+
+    # The full path and filename of the post. Defined in the YAML of the post
+    # body.
+    #
+    # Returns the String permalink or nil if none has been set.
+    def permalink
+      data.nil? ? nil : data["permalink"]
+    end
+
+    # The template of the permalink.
+    #
+    # Returns the template String.
+    def template
+      if !html?
+        "/:path/:basename:output_ext"
+      elsif index?
+        "/:path/"
+      else
+        Utils.add_permalink_suffix("/:path/:basename", site.permalink_style)
+      end
+    end
+
+    # The generated relative url of this page. e.g. /about.html.
+    #
+    # Returns the String url.
+    def url
+      @url ||= URL.new({
+        :template     => template,
+        :placeholders => url_placeholders,
+        :permalink    => permalink,
+      }).to_s
+    end
+
+    # Returns a hash of URL placeholder names (as symbols) mapping to the
+    # desired placeholder replacements. For details see "url.rb"
+    def url_placeholders
+      {
+        :path       => @dir,
+        :basename   => basename,
+        :output_ext => output_ext,
+      }
+    end
+
+    # Extract information from the page filename.
+    #
+    # name - The String filename of the page file.
+    #
+    # Returns nothing.
+    def process(name)
+      self.ext = File.extname(name)
+      self.basename = name[0..-ext.length - 1]
+    end
+
+    # Add any necessary layouts to this post
+    #
+    # layouts      - The Hash of {"name" => "layout"}.
+    # site_payload - The site payload Hash.
+    #
+    # Returns String rendered page.
+    def render(layouts, site_payload)
+      site_payload["page"] = to_liquid
+      site_payload["paginator"] = pager.to_liquid
+
+      do_layout(site_payload, layouts)
+    end
+
+    # The path to the source file
+    #
+    # Returns the path to the source file
+    def path
+      data.fetch("path") { relative_path }
+    end
+
+    # The path to the page source file, relative to the site source
+    def relative_path
+      File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).sub(%r!\A\/!, "")
+    end
+
+    # Obtain destination path.
+    #
+    # dest - The String path to the destination dir.
+    #
+    # Returns the destination file path String.
+    def destination(dest)
+      path = site.in_dest_dir(dest, URL.unescape_path(url))
+      path = File.join(path, "index") if url.end_with?("/")
+      path << output_ext unless path.end_with? output_ext
+      path
+    end
+
+    # Returns the object as a debug String.
+    def inspect
+      "#<Jekyll:Page @name=#{name.inspect}>"
+    end
+
+    # Returns the Boolean of whether this Page is HTML or not.
+    def html?
+      HTML_EXTENSIONS.include?(output_ext)
+    end
+
+    # Returns the Boolean of whether this Page is an index file or not.
+    def index?
+      basename == "index"
+    end
+
+    def trigger_hooks(hook_name, *args)
+      Jekyll::Hooks.trigger :pages, hook_name, self, *args
+    end
+
+    def write?
+      true
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/plugin.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/plugin.rb
new file mode 100644
index 0000000..b6e5023
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/plugin.rb
@@ -0,0 +1,96 @@
+module Jekyll
+  class Plugin
+    PRIORITIES = {
+      :low     => -10,
+      :highest => 100,
+      :lowest  => -100,
+      :normal  => 0,
+      :high    => 10,
+    }.freeze
+
+    #
+
+    def self.inherited(const)
+      return catch_inheritance(const) do |const_|
+        catch_inheritance(const_)
+      end
+    end
+
+    #
+
+    def self.catch_inheritance(const)
+      const.define_singleton_method :inherited do |const_|
+        (@children ||= Set.new).add const_
+        if block_given?
+          yield const_
+        end
+      end
+    end
+
+    #
+
+    def self.descendants
+      @children ||= Set.new
+      out = @children.map(&:descendants)
+      out << self unless superclass == Plugin
+      Set.new(out).flatten
+    end
+
+    # Get or set the priority of this plugin. When called without an
+    # argument it returns the priority. When an argument is given, it will
+    # set the priority.
+    #
+    # priority - The Symbol priority (default: nil). Valid options are:
+    #            :lowest, :low, :normal, :high, :highest
+    #
+    # Returns the Symbol priority.
+    def self.priority(priority = nil)
+      @priority ||= nil
+      if priority && PRIORITIES.key?(priority)
+        @priority = priority
+      end
+      @priority || :normal
+    end
+
+    # Get or set the safety of this plugin. When called without an argument
+    # it returns the safety. When an argument is given, it will set the
+    # safety.
+    #
+    # safe - The Boolean safety (default: nil).
+    #
+    # Returns the safety Boolean.
+    def self.safe(safe = nil)
+      unless defined?(@safe) && safe.nil?
+        @safe = safe
+      end
+      @safe || false
+    end
+
+    # Spaceship is priority [higher -> lower]
+    #
+    # other - The class to be compared.
+    #
+    # Returns -1, 0, 1.
+    def self.<=>(other)
+      PRIORITIES[other.priority] <=> PRIORITIES[self.priority]
+    end
+
+    # Spaceship is priority [higher -> lower]
+    #
+    # other - The class to be compared.
+    #
+    # Returns -1, 0, 1.
+    def <=>(other)
+      self.class <=> other.class
+    end
+
+    # Initialize a new plugin. This should be overridden by the subclass.
+    #
+    # config - The Hash of configuration options.
+    #
+    # Returns a new instance.
+    def initialize(config = {})
+      # no-op for default
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/plugin_manager.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/plugin_manager.rb
new file mode 100644
index 0000000..979004d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/plugin_manager.rb
@@ -0,0 +1,111 @@
+module Jekyll
+  class PluginManager
+    attr_reader :site
+
+    # Create an instance of this class.
+    #
+    # site - the instance of Jekyll::Site we're concerned with
+    #
+    # Returns nothing
+    def initialize(site)
+      @site = site
+    end
+
+    # Require all the plugins which are allowed.
+    #
+    # Returns nothing
+    def conscientious_require
+      require_theme_deps if site.theme
+      require_plugin_files
+      require_gems
+      deprecation_checks
+    end
+
+    # Require each of the gem plugins specified.
+    #
+    # Returns nothing.
+    def require_gems
+      Jekyll::External.require_with_graceful_fail(
+        site.gems.select { |plugin| plugin_allowed?(plugin) }
+      )
+    end
+
+    # Require each of the runtime_dependencies specified by the theme's gemspec.
+    #
+    # Returns false only if no dependencies have been specified, otherwise nothing.
+    def require_theme_deps
+      return false unless site.theme.runtime_dependencies
+      site.theme.runtime_dependencies.each do |dep|
+        next if dep.name == "jekyll"
+        External.require_with_graceful_fail(dep.name) if plugin_allowed?(dep.name)
+      end
+    end
+
+    def self.require_from_bundler
+      if !ENV["JEKYLL_NO_BUNDLER_REQUIRE"] && File.file?("Gemfile")
+        require "bundler"
+
+        Bundler.setup
+        required_gems = Bundler.require(:jekyll_plugins)
+        message = "Required #{required_gems.map(&:name).join(", ")}"
+        Jekyll.logger.debug("PluginManager:", message)
+        ENV["JEKYLL_NO_BUNDLER_REQUIRE"] = "true"
+
+        true
+      else
+        false
+      end
+    end
+
+    # Check whether a gem plugin is allowed to be used during this build.
+    #
+    # plugin_name - the name of the plugin
+    #
+    # Returns true if the plugin name is in the whitelist or if the site is not
+    #   in safe mode.
+    def plugin_allowed?(plugin_name)
+      !site.safe || whitelist.include?(plugin_name)
+    end
+
+    # Build an array of allowed plugin gem names.
+    #
+    # Returns an array of strings, each string being the name of a gem name
+    #   that is allowed to be used.
+    def whitelist
+      @whitelist ||= Array[site.config["whitelist"]].flatten
+    end
+
+    # Require all .rb files if safe mode is off
+    #
+    # Returns nothing.
+    def require_plugin_files
+      unless site.safe
+        plugins_path.each do |plugin_search_path|
+          plugin_files = Utils.safe_glob(plugin_search_path, File.join("**", "*.rb"))
+          Jekyll::External.require_with_graceful_fail(plugin_files)
+        end
+      end
+    end
+
+    # Public: Setup the plugin search path
+    #
+    # Returns an Array of plugin search paths
+    def plugins_path
+      if site.config["plugins_dir"].eql? Jekyll::Configuration::DEFAULTS["plugins_dir"]
+        [site.in_source_dir(site.config["plugins_dir"])]
+      else
+        Array(site.config["plugins_dir"]).map { |d| File.expand_path(d) }
+      end
+    end
+
+    def deprecation_checks
+      pagination_included = (site.config["plugins"] || []).include?("jekyll-paginate") ||
+        defined?(Jekyll::Paginate)
+      if site.config["paginate"] && !pagination_included
+        Jekyll::Deprecator.deprecation_message "You appear to have pagination " \
+          "turned on, but you haven't included the `jekyll-paginate` gem. " \
+          "Ensure you have `plugins: [jekyll-paginate]` in your configuration file."
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/publisher.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/publisher.rb
new file mode 100644
index 0000000..0b67b8c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/publisher.rb
@@ -0,0 +1,21 @@
+module Jekyll
+  class Publisher
+    def initialize(site)
+      @site = site
+    end
+
+    def publish?(thing)
+      can_be_published?(thing) && !hidden_in_the_future?(thing)
+    end
+
+    def hidden_in_the_future?(thing)
+      thing.respond_to?(:date) && !@site.future && thing.date.to_i > @site.time.to_i
+    end
+
+    private
+
+    def can_be_published?(thing)
+      thing.data.fetch("published", true) || @site.unpublished
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/reader.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/reader.rb
new file mode 100644
index 0000000..903e36d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/reader.rb
@@ -0,0 +1,134 @@
+# encoding: UTF-8
+
+require "csv"
+
+module Jekyll
+  class Reader
+    attr_reader :site
+
+    def initialize(site)
+      @site = site
+    end
+
+    # Read Site data from disk and load it into internal data structures.
+    #
+    # Returns nothing.
+    def read
+      @site.layouts = LayoutReader.new(site).read
+      read_directories
+      sort_files!
+      @site.data = DataReader.new(site).read(site.config["data_dir"])
+      CollectionReader.new(site).read
+      ThemeAssetsReader.new(site).read
+    end
+
+    # Sorts posts, pages, and static files.
+    def sort_files!
+      site.collections.values.each { |c| c.docs.sort! }
+      site.pages.sort_by!(&:name)
+      site.static_files.sort_by!(&:relative_path)
+    end
+
+    # Recursively traverse directories to find pages and static files
+    # that will become part of the site according to the rules in
+    # filter_entries.
+    #
+    # dir - The String relative path of the directory to read. Default: ''.
+    #
+    # Returns nothing.
+    def read_directories(dir = "")
+      base = site.in_source_dir(dir)
+
+      return unless File.directory?(base)
+
+      dot = Dir.chdir(base) { filter_entries(Dir.entries("."), base) }
+      dot_dirs = dot.select { |file| File.directory?(@site.in_source_dir(base, file)) }
+      dot_files = (dot - dot_dirs)
+      dot_pages = dot_files.select do |file|
+        Utils.has_yaml_header?(@site.in_source_dir(base, file))
+      end
+      dot_static_files = dot_files - dot_pages
+
+      retrieve_posts(dir)
+      retrieve_dirs(base, dir, dot_dirs)
+      retrieve_pages(dir, dot_pages)
+      retrieve_static_files(dir, dot_static_files)
+    end
+
+    # Retrieves all the posts(posts/drafts) from the given directory
+    # and add them to the site and sort them.
+    #
+    # dir - The String representing the directory to retrieve the posts from.
+    #
+    # Returns nothing.
+    def retrieve_posts(dir)
+      site.posts.docs.concat(PostReader.new(site).read_posts(dir))
+      site.posts.docs.concat(PostReader.new(site).read_drafts(dir)) if site.show_drafts
+    end
+
+    # Recursively traverse directories with the read_directories function.
+    #
+    # base - The String representing the site's base directory.
+    # dir - The String representing the directory to traverse down.
+    # dot_dirs - The Array of subdirectories in the dir.
+    #
+    # Returns nothing.
+    def retrieve_dirs(_base, dir, dot_dirs)
+      dot_dirs.each do |file|
+        dir_path = site.in_source_dir(dir, file)
+        rel_path = File.join(dir, file)
+        unless @site.dest.sub(%r!/$!, "") == dir_path
+          @site.reader.read_directories(rel_path)
+        end
+      end
+    end
+
+    # Retrieve all the pages from the current directory,
+    # add them to the site and sort them.
+    #
+    # dir - The String representing the directory retrieve the pages from.
+    # dot_pages - The Array of pages in the dir.
+    #
+    # Returns nothing.
+    def retrieve_pages(dir, dot_pages)
+      site.pages.concat(PageReader.new(site, dir).read(dot_pages))
+    end
+
+    # Retrieve all the static files from the current directory,
+    # add them to the site and sort them.
+    #
+    # dir - The directory retrieve the static files from.
+    # dot_static_files - The static files in the dir.
+    #
+    # Returns nothing.
+    def retrieve_static_files(dir, dot_static_files)
+      site.static_files.concat(StaticFileReader.new(site, dir).read(dot_static_files))
+    end
+
+    # Filter out any files/directories that are hidden or backup files (start
+    # with "." or "#" or end with "~"), or contain site content (start with "_"),
+    # or are excluded in the site configuration, unless they are web server
+    # files such as '.htaccess'.
+    #
+    # entries - The Array of String file/directory entries to filter.
+    # base_directory - The string representing the optional base directory.
+    #
+    # Returns the Array of filtered entries.
+    def filter_entries(entries, base_directory = nil)
+      EntryFilter.new(site, base_directory).filter(entries)
+    end
+
+    # Read the entries from a particular directory for processing
+    #
+    # dir - The String representing the relative path of the directory to read.
+    # subfolder - The String representing the directory to read.
+    #
+    # Returns the list of entries to process
+    def get_entries(dir, subfolder)
+      base = site.in_source_dir(dir, subfolder)
+      return [] unless File.exist?(base)
+      entries = Dir.chdir(base) { filter_entries(Dir["**/*"], base) }
+      entries.delete_if { |e| File.directory?(site.in_source_dir(base, e)) }
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/collection_reader.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/collection_reader.rb
new file mode 100644
index 0000000..062be42
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/collection_reader.rb
@@ -0,0 +1,20 @@
+module Jekyll
+  class CollectionReader
+    SPECIAL_COLLECTIONS = %w(posts data).freeze
+
+    attr_reader :site, :content
+    def initialize(site)
+      @site = site
+      @content = {}
+    end
+
+    # Read in all collections specified in the configuration
+    #
+    # Returns nothing.
+    def read
+      site.collections.each do |_, collection|
+        collection.read unless SPECIAL_COLLECTIONS.include?(collection.label)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/data_reader.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/data_reader.rb
new file mode 100644
index 0000000..63db7c6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/data_reader.rb
@@ -0,0 +1,75 @@
+module Jekyll
+  class DataReader
+    attr_reader :site, :content
+    def initialize(site)
+      @site = site
+      @content = {}
+      @entry_filter = EntryFilter.new(site)
+    end
+
+    # Read all the files in <dir> and adds them to @content
+    #
+    # dir - The String relative path of the directory to read.
+    #
+    # Returns @content, a Hash of the .yaml, .yml,
+    # .json, and .csv files in the base directory
+    def read(dir)
+      base = site.in_source_dir(dir)
+      read_data_to(base, @content)
+      @content
+    end
+
+    # Read and parse all .yaml, .yml, .json, .csv and .tsv
+    # files under <dir> and add them to the <data> variable.
+    #
+    # dir - The string absolute path of the directory to read.
+    # data - The variable to which data will be added.
+    #
+    # Returns nothing
+    def read_data_to(dir, data)
+      return unless File.directory?(dir) && !@entry_filter.symlink?(dir)
+
+      entries = Dir.chdir(dir) do
+        Dir["*.{yaml,yml,json,csv,tsv}"] + Dir["*"].select { |fn| File.directory?(fn) }
+      end
+
+      entries.each do |entry|
+        path = @site.in_source_dir(dir, entry)
+        next if @entry_filter.symlink?(path)
+
+        if File.directory?(path)
+          read_data_to(path, data[sanitize_filename(entry)] = {})
+        else
+          key = sanitize_filename(File.basename(entry, ".*"))
+          data[key] = read_data_file(path)
+        end
+      end
+    end
+
+    # Determines how to read a data file.
+    #
+    # Returns the contents of the data file.
+    def read_data_file(path)
+      case File.extname(path).downcase
+      when ".csv"
+        CSV.read(path, {
+          :headers  => true,
+          :encoding => site.config["encoding"],
+        }).map(&:to_hash)
+      when ".tsv"
+        CSV.read(path, {
+          :col_sep  => "\t",
+          :headers  => true,
+          :encoding => site.config["encoding"],
+        }).map(&:to_hash)
+      else
+        SafeYAML.load_file(path)
+      end
+    end
+
+    def sanitize_filename(name)
+      name.gsub!(%r![^\w\s-]+|(?<=^|\b\s)\s+(?=$|\s?\b)!, "".freeze)
+      name.gsub(%r!\s+!, "_")
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/layout_reader.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/layout_reader.rb
new file mode 100644
index 0000000..985491c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/layout_reader.rb
@@ -0,0 +1,69 @@
+module Jekyll
+  class LayoutReader
+    attr_reader :site
+    def initialize(site)
+      @site = site
+      @layouts = {}
+    end
+
+    def read
+      layout_entries.each do |layout_file|
+        @layouts[layout_name(layout_file)] = \
+          Layout.new(site, layout_directory, layout_file)
+      end
+
+      theme_layout_entries.each do |layout_file|
+        @layouts[layout_name(layout_file)] ||= \
+          Layout.new(site, theme_layout_directory, layout_file)
+      end
+
+      @layouts
+    end
+
+    def layout_directory
+      @layout_directory ||= (layout_directory_in_cwd || layout_directory_inside_source)
+    end
+
+    def theme_layout_directory
+      @theme_layout_directory ||= site.theme.layouts_path if site.theme
+    end
+
+    private
+
+    def layout_entries
+      entries_in layout_directory
+    end
+
+    def theme_layout_entries
+      theme_layout_directory ? entries_in(theme_layout_directory) : []
+    end
+
+    def entries_in(dir)
+      entries = []
+      within(dir) do
+        entries = EntryFilter.new(site).filter(Dir["**/*.*"])
+      end
+      entries
+    end
+
+    def layout_name(file)
+      file.split(".")[0..-2].join(".")
+    end
+
+    def within(directory)
+      return unless File.exist?(directory)
+      Dir.chdir(directory) { yield }
+    end
+
+    def layout_directory_inside_source
+      site.in_source_dir(site.config["layouts_dir"])
+    end
+
+    def layout_directory_in_cwd
+      dir = Jekyll.sanitized_path(Dir.pwd, site.config["layouts_dir"])
+      if File.directory?(dir) && !site.safe
+        dir
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/page_reader.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/page_reader.rb
new file mode 100644
index 0000000..507c609
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/page_reader.rb
@@ -0,0 +1,23 @@
+module Jekyll
+  class PageReader
+    attr_reader :site, :dir, :unfiltered_content
+    def initialize(site, dir)
+      @site = site
+      @dir = dir
+      @unfiltered_content = []
+    end
+
+    # Read all the files in <source>/<dir>/ for Yaml header and create a new Page
+    # object for each file.
+    #
+    # dir - The String relative path of the directory to read.
+    #
+    # Returns an array of static pages.
+    def read(files)
+      files.map do |page|
+        @unfiltered_content << Page.new(@site, @site.source, @dir, page)
+      end
+      @unfiltered_content.select { |page| site.publisher.publish?(page) }
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/post_reader.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/post_reader.rb
new file mode 100644
index 0000000..7068887
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/post_reader.rb
@@ -0,0 +1,65 @@
+module Jekyll
+  class PostReader
+    attr_reader :site, :unfiltered_content
+    def initialize(site)
+      @site = site
+    end
+
+    # Read all the files in <source>/<dir>/_drafts and create a new
+    # Document object with each one.
+    #
+    # dir - The String relative path of the directory to read.
+    #
+    # Returns nothing.
+    def read_drafts(dir)
+      read_publishable(dir, "_drafts", Document::DATELESS_FILENAME_MATCHER)
+    end
+
+    # Read all the files in <source>/<dir>/_posts and create a new Document
+    # object with each one.
+    #
+    # dir - The String relative path of the directory to read.
+    #
+    # Returns nothing.
+    def read_posts(dir)
+      read_publishable(dir, "_posts", Document::DATE_FILENAME_MATCHER)
+    end
+
+    # Read all the files in <source>/<dir>/<magic_dir> and create a new
+    # Document object with each one insofar as it matches the regexp matcher.
+    #
+    # dir - The String relative path of the directory to read.
+    #
+    # Returns nothing.
+    def read_publishable(dir, magic_dir, matcher)
+      read_content(dir, magic_dir, matcher).tap { |docs| docs.each(&:read) }
+        .select do |doc|
+          site.publisher.publish?(doc).tap do |will_publish|
+            if !will_publish && site.publisher.hidden_in_the_future?(doc)
+              Jekyll.logger.debug "Skipping:", "#{doc.relative_path} has a future date"
+            end
+          end
+        end
+    end
+
+    # Read all the content files from <source>/<dir>/magic_dir
+    #   and return them with the type klass.
+    #
+    # dir - The String relative path of the directory to read.
+    # magic_dir - The String relative directory to <dir>,
+    #   looks for content here.
+    # klass - The return type of the content.
+    #
+    # Returns klass type of content files
+    def read_content(dir, magic_dir, matcher)
+      @site.reader.get_entries(dir, magic_dir).map do |entry|
+        next unless entry =~ matcher
+        path = @site.in_source_dir(File.join(dir, magic_dir, entry))
+        Document.new(path, {
+          :site       => @site,
+          :collection => @site.posts,
+        })
+      end.reject(&:nil?)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/static_file_reader.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/static_file_reader.rb
new file mode 100644
index 0000000..1d43d69
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/static_file_reader.rb
@@ -0,0 +1,23 @@
+module Jekyll
+  class StaticFileReader
+    attr_reader :site, :dir, :unfiltered_content
+    def initialize(site, dir)
+      @site = site
+      @dir = dir
+      @unfiltered_content = []
+    end
+
+    # Read all the files in <source>/<dir>/ for Yaml header and create a new Page
+    # object for each file.
+    #
+    # dir - The String relative path of the directory to read.
+    #
+    # Returns an array of static files.
+    def read(files)
+      files.map do |file|
+        @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file)
+      end
+      @unfiltered_content
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/theme_assets_reader.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/theme_assets_reader.rb
new file mode 100644
index 0000000..80a6547
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/readers/theme_assets_reader.rb
@@ -0,0 +1,47 @@
+module Jekyll
+  class ThemeAssetsReader
+    attr_reader :site
+    def initialize(site)
+      @site = site
+    end
+
+    def read
+      return unless site.theme && site.theme.assets_path
+
+      Find.find(site.theme.assets_path) do |path|
+        next if File.directory?(path)
+        if File.symlink?(path)
+          Jekyll.logger.warn "Theme reader:", "Ignored symlinked asset: #{path}"
+        else
+          read_theme_asset(path)
+        end
+      end
+    end
+
+    private
+    def read_theme_asset(path)
+      base = site.theme.root
+      dir = File.dirname(path.sub("#{site.theme.root}/", ""))
+      name = File.basename(path)
+
+      if Utils.has_yaml_header?(path)
+        append_unless_exists site.pages,
+          Jekyll::Page.new(site, base, dir, name)
+      else
+        append_unless_exists site.static_files,
+          Jekyll::StaticFile.new(site, base, "/#{dir}", name)
+      end
+    end
+
+    def append_unless_exists(haystack, new_item)
+      if haystack.any? { |file| file.relative_path == new_item.relative_path }
+        Jekyll.logger.debug "Theme:",
+          "Ignoring #{new_item.relative_path} in theme due to existing file " \
+          "with that path in site."
+        return
+      end
+
+      haystack << new_item
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/regenerator.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/regenerator.rb
new file mode 100644
index 0000000..09ff309
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/regenerator.rb
@@ -0,0 +1,199 @@
+module Jekyll
+  class Regenerator
+    attr_reader :site, :metadata, :cache
+    attr_accessor :disabled
+    private :disabled, :disabled=
+
+    def initialize(site)
+      @site = site
+
+      # Read metadata from file
+      read_metadata
+
+      # Initialize cache to an empty hash
+      clear_cache
+    end
+
+    # Checks if a renderable object needs to be regenerated
+    #
+    # Returns a boolean.
+    def regenerate?(document)
+      case document
+      when Page
+        regenerate_page?(document)
+      when Document
+        regenerate_document?(document)
+      else
+        source_path = document.respond_to?(:path) ? document.path : nil
+        dest_path = if document.respond_to?(:destination)
+                      document.destination(@site.dest)
+                    end
+        source_modified_or_dest_missing?(source_path, dest_path)
+      end
+    end
+
+    # Add a path to the metadata
+    #
+    # Returns true, also on failure.
+    def add(path)
+      return true unless File.exist?(path)
+
+      metadata[path] = {
+        "mtime" => File.mtime(path),
+        "deps"  => [],
+      }
+      cache[path] = true
+    end
+
+    # Force a path to regenerate
+    #
+    # Returns true.
+    def force(path)
+      cache[path] = true
+    end
+
+    # Clear the metadata and cache
+    #
+    # Returns nothing
+    def clear
+      @metadata = {}
+      clear_cache
+    end
+
+    # Clear just the cache
+    #
+    # Returns nothing
+    def clear_cache
+      @cache = {}
+    end
+
+    # Checks if the source has been modified or the
+    # destination is missing
+    #
+    # returns a boolean
+    def source_modified_or_dest_missing?(source_path, dest_path)
+      modified?(source_path) || (dest_path && !File.exist?(dest_path))
+    end
+
+    # Checks if a path's (or one of its dependencies)
+    # mtime has changed
+    #
+    # Returns a boolean.
+    def modified?(path)
+      return true if disabled?
+
+      # objects that don't have a path are always regenerated
+      return true if path.nil?
+
+      # Check for path in cache
+      if cache.key? path
+        return cache[path]
+      end
+
+      if metadata[path]
+        # If we have seen this file before,
+        # check if it or one of its dependencies has been modified
+        existing_file_modified?(path)
+      else
+        # If we have not seen this file before, add it to the metadata and regenerate it
+        add(path)
+      end
+    end
+
+    # Add a dependency of a path
+    #
+    # Returns nothing.
+    def add_dependency(path, dependency)
+      return if metadata[path].nil? || disabled
+
+      unless metadata[path]["deps"].include? dependency
+        metadata[path]["deps"] << dependency
+        add(dependency) unless metadata.include?(dependency)
+      end
+      regenerate? dependency
+    end
+
+    # Write the metadata to disk
+    #
+    # Returns nothing.
+    def write_metadata
+      unless disabled?
+        File.binwrite(metadata_file, Marshal.dump(metadata))
+      end
+    end
+
+    # Produce the absolute path of the metadata file
+    #
+    # Returns the String path of the file.
+    def metadata_file
+      site.in_source_dir(".jekyll-metadata")
+    end
+
+    # Check if metadata has been disabled
+    #
+    # Returns a Boolean (true for disabled, false for enabled).
+    def disabled?
+      self.disabled = !site.incremental? if disabled.nil?
+      disabled
+    end
+
+    private
+
+    # Read metadata from the metadata file, if no file is found,
+    # initialize with an empty hash
+    #
+    # Returns the read metadata.
+    def read_metadata
+      @metadata =
+        if !disabled? && File.file?(metadata_file)
+          content = File.binread(metadata_file)
+
+          begin
+            Marshal.load(content)
+          rescue TypeError
+            SafeYAML.load(content)
+          rescue ArgumentError => e
+            Jekyll.logger.warn("Failed to load #{metadata_file}: #{e}")
+            {}
+          end
+        else
+          {}
+        end
+    end
+
+    private
+    def regenerate_page?(document)
+      document.asset_file? || document.data["regenerate"] ||
+        source_modified_or_dest_missing?(
+          site.in_source_dir(document.relative_path), document.destination(@site.dest)
+        )
+    end
+
+    private
+    def regenerate_document?(document)
+      !document.write? || document.data["regenerate"] ||
+        source_modified_or_dest_missing?(
+          document.path, document.destination(@site.dest)
+        )
+    end
+
+    private
+    def existing_file_modified?(path)
+      # If one of this file dependencies have been modified,
+      # set the regeneration bit for both the dependency and the file to true
+      metadata[path]["deps"].each do |dependency|
+        if modified?(dependency)
+          return cache[dependency] = cache[path] = true
+        end
+      end
+
+      if File.exist?(path) && metadata[path]["mtime"].eql?(File.mtime(path))
+        # If this file has not been modified, set the regeneration bit to false
+        cache[path] = false
+      else
+        # If it has been modified, set it to true
+        add(path)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/related_posts.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/related_posts.rb
new file mode 100644
index 0000000..3526a73
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/related_posts.rb
@@ -0,0 +1,50 @@
+module Jekyll
+  class RelatedPosts
+    class << self
+      attr_accessor :lsi
+    end
+
+    attr_reader :post, :site
+
+    def initialize(post)
+      @post = post
+      @site = post.site
+      Jekyll::External.require_with_graceful_fail("classifier-reborn") if site.lsi
+    end
+
+    def build
+      return [] unless site.posts.docs.size > 1
+
+      if site.lsi
+        build_index
+        lsi_related_posts
+      else
+        most_recent_posts
+      end
+    end
+
+    def build_index
+      self.class.lsi ||= begin
+        lsi = ClassifierReborn::LSI.new(:auto_rebuild => false)
+        Jekyll.logger.info("Populating LSI...")
+
+        site.posts.docs.each do |x|
+          lsi.add_item(x)
+        end
+
+        Jekyll.logger.info("Rebuilding index...")
+        lsi.build_index
+        Jekyll.logger.info("")
+        lsi
+      end
+    end
+
+    def lsi_related_posts
+      self.class.lsi.find_related(post, 11)
+    end
+
+    def most_recent_posts
+      @most_recent_posts ||= (site.posts.docs.reverse - [post]).first(10)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/renderer.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/renderer.rb
new file mode 100644
index 0000000..b0f544e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/renderer.rb
@@ -0,0 +1,269 @@
+# encoding: UTF-8
+
+module Jekyll
+  class Renderer
+    attr_reader :document, :site
+    attr_writer :layouts, :payload
+
+    def initialize(site, document, site_payload = nil)
+      @site     = site
+      @document = document
+      @payload  = site_payload
+    end
+
+    # Fetches the payload used in Liquid rendering.
+    # It can be written with #payload=(new_payload)
+    # Falls back to site.site_payload if no payload is set.
+    #
+    # Returns a Jekyll::Drops::UnifiedPayloadDrop
+    def payload
+      @payload ||= site.site_payload
+    end
+
+    # The list of layouts registered for this Renderer.
+    # It can be written with #layouts=(new_layouts)
+    # Falls back to site.layouts if no layouts are registered.
+    #
+    # Returns a Hash of String => Jekyll::Layout identified
+    # as basename without the extension name.
+    def layouts
+      @layouts || site.layouts
+    end
+
+    # Determine which converters to use based on this document's
+    # extension.
+    #
+    # Returns Array of Converter instances.
+    def converters
+      @converters ||= site.converters.select { |c| c.matches(document.extname) }.sort
+    end
+
+    # Determine the extname the outputted file should have
+    #
+    # Returns String the output extname including the leading period.
+    def output_ext
+      @output_ext ||= (permalink_ext || converter_output_ext)
+    end
+
+    # Prepare payload and render the document
+    #
+    # Returns String rendered document output
+    def run
+      Jekyll.logger.debug "Rendering:", document.relative_path
+
+      assign_pages!
+      assign_related_posts!
+      assign_highlighter_options!
+      assign_layout_data!
+
+      Jekyll.logger.debug "Pre-Render Hooks:", document.relative_path
+      document.trigger_hooks(:pre_render, payload)
+
+      render_document
+    end
+
+    # Render the document.
+    #
+    # Returns String rendered document output
+    # rubocop: disable AbcSize
+    def render_document
+      info = {
+        :registers => { :site => site, :page => payload["page"] },
+      }
+      output = document.content
+      if document.render_with_liquid?
+        Jekyll.logger.debug "Rendering Liquid:", document.relative_path
+        output = render_liquid(output, payload, info, document.path)
+      end
+
+      Jekyll.logger.debug "Rendering Markup:", document.relative_path
+      output = convert(output)
+      document.content = output
+
+      if document.place_in_layout?
+        Jekyll.logger.debug "Rendering Layout:", document.relative_path
+        output = place_in_layouts(output, payload, info)
+      end
+
+      output
+    end
+    # rubocop: enable AbcSize
+
+    # Convert the document using the converters which match this renderer's document.
+    #
+    # Returns String the converted content.
+    def convert(content)
+      converters.reduce(content) do |output, converter|
+        begin
+          converter.convert output
+        rescue => e
+          Jekyll.logger.error "Conversion error:",
+            "#{converter.class} encountered an error while "\
+            "converting '#{document.relative_path}':"
+          Jekyll.logger.error("", e.to_s)
+          raise e
+        end
+      end
+    end
+
+    # Render the given content with the payload and info
+    #
+    # content -
+    # payload -
+    # info    -
+    # path    - (optional) the path to the file, for use in ex
+    #
+    # Returns String the content, rendered by Liquid.
+    def render_liquid(content, payload, info, path = nil)
+      template = site.liquid_renderer.file(path).parse(content)
+      template.warnings.each do |e|
+        Jekyll.logger.warn "Liquid Warning:",
+          LiquidRenderer.format_error(e, path || document.relative_path)
+      end
+      template.render!(payload, info)
+    # rubocop: disable RescueException
+    rescue Exception => e
+      Jekyll.logger.error "Liquid Exception:",
+        LiquidRenderer.format_error(e, path || document.relative_path)
+      raise e
+    end
+    # rubocop: enable RescueException
+
+    # Checks if the layout specified in the document actually exists
+    #
+    # layout - the layout to check
+    #
+    # Returns Boolean true if the layout is invalid, false if otherwise
+    def invalid_layout?(layout)
+      !document.data["layout"].nil? && layout.nil? && !(document.is_a? Jekyll::Excerpt)
+    end
+
+    # Render layouts and place document content inside.
+    #
+    # Returns String rendered content
+    def place_in_layouts(content, payload, info)
+      output = content.dup
+      layout = layouts[document.data["layout"]]
+      validate_layout(layout)
+
+      used = Set.new([layout])
+
+      # Reset the payload layout data to ensure it starts fresh for each page.
+      payload["layout"] = nil
+
+      while layout
+        output = render_layout(output, layout, info)
+        add_regenerator_dependencies(layout)
+
+        if (layout = site.layouts[layout.data["layout"]])
+          break if used.include?(layout)
+          used << layout
+        end
+      end
+      output
+    end
+
+    # Checks if the layout specified in the document actually exists
+    #
+    # layout - the layout to check
+    # Returns nothing
+    private
+    def validate_layout(layout)
+      return unless invalid_layout?(layout)
+      Jekyll.logger.warn(
+        "Build Warning:",
+        "Layout '#{document.data["layout"]}' requested "\
+        "in #{document.relative_path} does not exist."
+      )
+    end
+
+    # Render layout content into document.output
+    #
+    # Returns String rendered content
+    private
+    def render_layout(output, layout, info)
+      payload["content"] = output
+      payload["layout"]  = Utils.deep_merge_hashes(layout.data, payload["layout"] || {})
+
+      render_liquid(
+        layout.content,
+        payload,
+        info,
+        layout.relative_path
+      )
+    end
+
+    private
+    def add_regenerator_dependencies(layout)
+      return unless document.write?
+      site.regenerator.add_dependency(
+        site.in_source_dir(document.path),
+        site.in_source_dir(layout.path)
+      )
+    end
+
+    # Set page content to payload and assign pager if document has one.
+    #
+    # Returns nothing
+    private
+    def assign_pages!
+      payload["page"] = document.to_liquid
+      payload["paginator"] = if document.respond_to?(:pager)
+                               document.pager.to_liquid
+                             end
+    end
+
+    # Set related posts to payload if document is a post.
+    #
+    # Returns nothing
+    private
+    def assign_related_posts!
+      if document.is_a?(Document) && document.collection.label == "posts"
+        payload["site"]["related_posts"] = document.related_posts
+      else
+        payload["site"]["related_posts"] = nil
+      end
+    end
+
+    # Set highlighter prefix and suffix
+    #
+    # Returns nothing
+    private
+    def assign_highlighter_options!
+      payload["highlighter_prefix"] = converters.first.highlighter_prefix
+      payload["highlighter_suffix"] = converters.first.highlighter_suffix
+    end
+
+    private
+    def assign_layout_data!
+      layout = layouts[document.data["layout"]]
+      if layout
+        payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {})
+      end
+    end
+
+    private
+    def permalink_ext
+      if document.permalink && !document.permalink.end_with?("/")
+        permalink_ext = File.extname(document.permalink)
+        permalink_ext unless permalink_ext.empty?
+      end
+    end
+
+    private
+    def converter_output_ext
+      if output_exts.size == 1
+        output_exts.last
+      else
+        output_exts[-2]
+      end
+    end
+
+    private
+    def output_exts
+      @output_exts ||= converters.map do |c|
+        c.output_ext(document.extname)
+      end.compact
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/site.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/site.rb
new file mode 100644
index 0000000..6476027
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/site.rb
@@ -0,0 +1,473 @@
+# encoding: UTF-8
+
+require "csv"
+
+module Jekyll
+  class Site
+    attr_reader   :source, :dest, :config
+    attr_accessor :layouts, :pages, :static_files, :drafts,
+                  :exclude, :include, :lsi, :highlighter, :permalink_style,
+                  :time, :future, :unpublished, :safe, :plugins, :limit_posts,
+                  :show_drafts, :keep_files, :baseurl, :data, :file_read_opts,
+                  :gems, :plugin_manager, :theme
+
+    attr_accessor :converters, :generators, :reader
+    attr_reader   :regenerator, :liquid_renderer, :includes_load_paths
+
+    # Public: Initialize a new Site.
+    #
+    # config - A Hash containing site configuration details.
+    def initialize(config)
+      # Source and destination may not be changed after the site has been created.
+      @source          = File.expand_path(config["source"]).freeze
+      @dest            = File.expand_path(config["destination"]).freeze
+
+      self.config = config
+
+      @reader          = Reader.new(self)
+      @regenerator     = Regenerator.new(self)
+      @liquid_renderer = LiquidRenderer.new(self)
+
+      Jekyll.sites << self
+
+      reset
+      setup
+
+      Jekyll::Hooks.trigger :site, :after_init, self
+    end
+
+    # Public: Set the site's configuration. This handles side-effects caused by
+    # changing values in the configuration.
+    #
+    # config - a Jekyll::Configuration, containing the new configuration.
+    #
+    # Returns the new configuration.
+    def config=(config)
+      @config = config.clone
+
+      %w(safe lsi highlighter baseurl exclude include future unpublished
+        show_drafts limit_posts keep_files).each do |opt|
+        self.send("#{opt}=", config[opt])
+      end
+
+      # keep using `gems` to avoid breaking change
+      self.gems = config["plugins"]
+
+      configure_plugins
+      configure_theme
+      configure_include_paths
+      configure_file_read_opts
+
+      self.permalink_style = config["permalink"].to_sym
+
+      @config
+    end
+
+    # Public: Read, process, and write this Site to output.
+    #
+    # Returns nothing.
+    def process
+      reset
+      read
+      generate
+      render
+      cleanup
+      write
+      print_stats
+    end
+
+    def print_stats
+      if @config["profile"]
+        puts @liquid_renderer.stats_table
+      end
+    end
+
+    # Reset Site details.
+    #
+    # Returns nothing
+    def reset
+      if config["time"]
+        self.time = Utils.parse_date(config["time"].to_s, "Invalid time in _config.yml.")
+      else
+        self.time = Time.now
+      end
+      self.layouts = {}
+      self.pages = []
+      self.static_files = []
+      self.data = {}
+      @collections = nil
+      @regenerator.clear_cache
+      @liquid_renderer.reset
+
+      if limit_posts < 0
+        raise ArgumentError, "limit_posts must be a non-negative number"
+      end
+
+      Jekyll::Hooks.trigger :site, :after_reset, self
+    end
+
+    # Load necessary libraries, plugins, converters, and generators.
+    #
+    # Returns nothing.
+    def setup
+      ensure_not_in_dest
+
+      plugin_manager.conscientious_require
+
+      self.converters = instantiate_subclasses(Jekyll::Converter)
+      self.generators = instantiate_subclasses(Jekyll::Generator)
+    end
+
+    # Check that the destination dir isn't the source dir or a directory
+    # parent to the source dir.
+    def ensure_not_in_dest
+      dest_pathname = Pathname.new(dest)
+      Pathname.new(source).ascend do |path|
+        if path == dest_pathname
+          raise(
+            Errors::FatalException,
+            "Destination directory cannot be or contain the Source directory."
+          )
+        end
+      end
+    end
+
+    # The list of collections and their corresponding Jekyll::Collection instances.
+    # If config['collections'] is set, a new instance is created
+    # for each item in the collection, a new hash is returned otherwise.
+    #
+    # Returns a Hash containing collection name-to-instance pairs.
+    def collections
+      @collections ||= Hash[collection_names.map do |coll|
+        [coll, Jekyll::Collection.new(self, coll)]
+      end]
+    end
+
+    # The list of collection names.
+    #
+    # Returns an array of collection names from the configuration,
+    #   or an empty array if the `collections` key is not set.
+    def collection_names
+      case config["collections"]
+      when Hash
+        config["collections"].keys
+      when Array
+        config["collections"]
+      when nil
+        []
+      else
+        raise ArgumentError, "Your `collections` key must be a hash or an array."
+      end
+    end
+
+    # Read Site data from disk and load it into internal data structures.
+    #
+    # Returns nothing.
+    def read
+      reader.read
+      limit_posts!
+      Jekyll::Hooks.trigger :site, :post_read, self
+    end
+
+    # Run each of the Generators.
+    #
+    # Returns nothing.
+    def generate
+      generators.each do |generator|
+        start = Time.now
+        generator.generate(self)
+        Jekyll.logger.debug "Generating:",
+          "#{generator.class} finished in #{Time.now - start} seconds."
+      end
+    end
+
+    # Render the site to the destination.
+    #
+    # Returns nothing.
+    def render
+      relative_permalinks_are_deprecated
+
+      payload = site_payload
+
+      Jekyll::Hooks.trigger :site, :pre_render, self, payload
+
+      render_docs(payload)
+      render_pages(payload)
+
+      Jekyll::Hooks.trigger :site, :post_render, self, payload
+    end
+
+    # Remove orphaned files and empty directories in destination.
+    #
+    # Returns nothing.
+    def cleanup
+      site_cleaner.cleanup!
+    end
+
+    # Write static files, pages, and posts.
+    #
+    # Returns nothing.
+    def write
+      each_site_file do |item|
+        item.write(dest) if regenerator.regenerate?(item)
+      end
+      regenerator.write_metadata
+      Jekyll::Hooks.trigger :site, :post_write, self
+    end
+
+    def posts
+      collections["posts"] ||= Collection.new(self, "posts")
+    end
+
+    # Construct a Hash of Posts indexed by the specified Post attribute.
+    #
+    # post_attr - The String name of the Post attribute.
+    #
+    # Examples
+    #
+    #   post_attr_hash('categories')
+    #   # => { 'tech' => [<Post A>, <Post B>],
+    #   #      'ruby' => [<Post B>] }
+    #
+    # Returns the Hash: { attr => posts } where
+    #   attr  - One of the values for the requested attribute.
+    #   posts - The Array of Posts with the given attr value.
+    def post_attr_hash(post_attr)
+      # Build a hash map based on the specified post attribute ( post attr =>
+      # array of posts ) then sort each array in reverse order.
+      hash = Hash.new { |h, key| h[key] = [] }
+      posts.docs.each do |p|
+        p.data[post_attr].each { |t| hash[t] << p } if p.data[post_attr]
+      end
+      hash.values.each { |posts| posts.sort!.reverse! }
+      hash
+    end
+
+    def tags
+      post_attr_hash("tags")
+    end
+
+    def categories
+      post_attr_hash("categories")
+    end
+
+    # Prepare site data for site payload. The method maintains backward compatibility
+    # if the key 'data' is already used in _config.yml.
+    #
+    # Returns the Hash to be hooked to site.data.
+    def site_data
+      config["data"] || data
+    end
+
+    # The Hash payload containing site-wide data.
+    #
+    # Returns the Hash: { "site" => data } where data is a Hash with keys:
+    #   "time"       - The Time as specified in the configuration or the
+    #                  current time if none was specified.
+    #   "posts"      - The Array of Posts, sorted chronologically by post date
+    #                  and then title.
+    #   "pages"      - The Array of all Pages.
+    #   "html_pages" - The Array of HTML Pages.
+    #   "categories" - The Hash of category values and Posts.
+    #                  See Site#post_attr_hash for type info.
+    #   "tags"       - The Hash of tag values and Posts.
+    #                  See Site#post_attr_hash for type info.
+    def site_payload
+      Drops::UnifiedPayloadDrop.new self
+    end
+    alias_method :to_liquid, :site_payload
+
+    # Get the implementation class for the given Converter.
+    # Returns the Converter instance implementing the given Converter.
+    # klass - The Class of the Converter to fetch.
+
+    def find_converter_instance(klass)
+      converters.find { |klass_| klass_.instance_of?(klass) } || \
+        raise("No Converters found for #{klass}")
+    end
+
+    # klass - class or module containing the subclasses.
+    # Returns array of instances of subclasses of parameter.
+    # Create array of instances of the subclasses of the class or module
+    # passed in as argument.
+
+    def instantiate_subclasses(klass)
+      klass.descendants.select { |c| !safe || c.safe }.sort.map do |c|
+        c.new(config)
+      end
+    end
+
+    # Warns the user if permanent links are relative to the parent
+    # directory. As this is a deprecated function of Jekyll.
+    #
+    # Returns
+    def relative_permalinks_are_deprecated
+      if config["relative_permalinks"]
+        Jekyll.logger.abort_with "Since v3.0, permalinks for pages" \
+                                " in subfolders must be relative to the" \
+                                " site source directory, not the parent" \
+                                " directory. Check https://jekyllrb.com/docs/upgrading/"\
+                                " for more info."
+      end
+    end
+
+    # Get the to be written documents
+    #
+    # Returns an Array of Documents which should be written
+    def docs_to_write
+      documents.select(&:write?)
+    end
+
+    # Get all the documents
+    #
+    # Returns an Array of all Documents
+    def documents
+      collections.reduce(Set.new) do |docs, (_, collection)|
+        docs + collection.docs + collection.files
+      end.to_a
+    end
+
+    def each_site_file
+      %w(pages static_files docs_to_write).each do |type|
+        send(type).each do |item|
+          yield item
+        end
+      end
+    end
+
+    # Returns the FrontmatterDefaults or creates a new FrontmatterDefaults
+    # if it doesn't already exist.
+    #
+    # Returns The FrontmatterDefaults
+    def frontmatter_defaults
+      @frontmatter_defaults ||= FrontmatterDefaults.new(self)
+    end
+
+    # Whether to perform a full rebuild without incremental regeneration
+    #
+    # Returns a Boolean: true for a full rebuild, false for normal build
+    def incremental?(override = {})
+      override["incremental"] || config["incremental"]
+    end
+
+    # Returns the publisher or creates a new publisher if it doesn't
+    # already exist.
+    #
+    # Returns The Publisher
+    def publisher
+      @publisher ||= Publisher.new(self)
+    end
+
+    # Public: Prefix a given path with the source directory.
+    #
+    # paths - (optional) path elements to a file or directory within the
+    #         source directory
+    #
+    # Returns a path which is prefixed with the source directory.
+    def in_source_dir(*paths)
+      paths.reduce(source) do |base, path|
+        Jekyll.sanitized_path(base, path)
+      end
+    end
+
+    # Public: Prefix a given path with the theme directory.
+    #
+    # paths - (optional) path elements to a file or directory within the
+    #         theme directory
+    #
+    # Returns a path which is prefixed with the theme root directory.
+    def in_theme_dir(*paths)
+      return nil unless theme
+      paths.reduce(theme.root) do |base, path|
+        Jekyll.sanitized_path(base, path)
+      end
+    end
+
+    # Public: Prefix a given path with the destination directory.
+    #
+    # paths - (optional) path elements to a file or directory within the
+    #         destination directory
+    #
+    # Returns a path which is prefixed with the destination directory.
+    def in_dest_dir(*paths)
+      paths.reduce(dest) do |base, path|
+        Jekyll.sanitized_path(base, path)
+      end
+    end
+
+    # Limits the current posts; removes the posts which exceed the limit_posts
+    #
+    # Returns nothing
+    private
+    def limit_posts!
+      if limit_posts > 0
+        limit = posts.docs.length < limit_posts ? posts.docs.length : limit_posts
+        self.posts.docs = posts.docs[-limit, limit]
+      end
+    end
+
+    # Returns the Cleaner or creates a new Cleaner if it doesn't
+    # already exist.
+    #
+    # Returns The Cleaner
+    private
+    def site_cleaner
+      @site_cleaner ||= Cleaner.new(self)
+    end
+
+    private
+    def configure_plugins
+      self.plugin_manager = Jekyll::PluginManager.new(self)
+      self.plugins        = plugin_manager.plugins_path
+    end
+
+    private
+    def configure_theme
+      self.theme = nil
+      return if config["theme"].nil?
+
+      self.theme =
+        if config["theme"].is_a?(String)
+          Jekyll::Theme.new(config["theme"])
+        else
+          Jekyll.logger.warn "Theme:", "value of 'theme' in config should be " \
+          "String to use gem-based themes, but got #{config["theme"].class}"
+          nil
+        end
+    end
+
+    private
+    def configure_include_paths
+      @includes_load_paths = Array(in_source_dir(config["includes_dir"].to_s))
+      @includes_load_paths << theme.includes_path if theme && theme.includes_path
+    end
+
+    private
+    def configure_file_read_opts
+      self.file_read_opts = {}
+      self.file_read_opts[:encoding] = config["encoding"] if config["encoding"]
+    end
+
+    private
+    def render_docs(payload)
+      collections.each do |_, collection|
+        collection.docs.each do |document|
+          if regenerator.regenerate?(document)
+            document.output = Jekyll::Renderer.new(self, document, payload).run
+            document.trigger_hooks(:post_render)
+          end
+        end
+      end
+    end
+
+    private
+    def render_pages(payload)
+      pages.flatten.each do |page|
+        if regenerator.regenerate?(page)
+          page.output = Jekyll::Renderer.new(self, page, payload).run
+          page.trigger_hooks(:post_render)
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/static_file.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/static_file.rb
new file mode 100644
index 0000000..18bcec8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/static_file.rb
@@ -0,0 +1,160 @@
+module Jekyll
+  class StaticFile
+    extend Forwardable
+
+    attr_reader :relative_path, :extname, :name, :data
+
+    def_delegator :to_liquid, :to_json, :to_json
+
+    class << self
+      # The cache of last modification times [path] -> mtime.
+      def mtimes
+        @mtimes ||= {}
+      end
+
+      def reset_cache
+        @mtimes = nil
+      end
+    end
+
+    # Initialize a new StaticFile.
+    #
+    # site - The Site.
+    # base - The String path to the <source>.
+    # dir  - The String path between <source> and the file.
+    # name - The String filename of the file.
+    # rubocop: disable ParameterLists
+    def initialize(site, base, dir, name, collection = nil)
+      @site = site
+      @base = base
+      @dir  = dir
+      @name = name
+      @collection = collection
+      @relative_path = File.join(*[@dir, @name].compact)
+      @extname = File.extname(@name)
+      @data = @site.frontmatter_defaults.all(relative_path, type)
+    end
+    # rubocop: enable ParameterLists
+
+    # Returns source file path.
+    def path
+      File.join(*[@base, @dir, @name].compact)
+    end
+
+    # Obtain destination path.
+    #
+    # dest - The String path to the destination dir.
+    #
+    # Returns destination file path.
+    def destination(dest)
+      @site.in_dest_dir(*[dest, destination_rel_dir, @name].compact)
+    end
+
+    def destination_rel_dir
+      if @collection
+        File.dirname(url)
+      else
+        @dir
+      end
+    end
+
+    def modified_time
+      @modified_time ||= File.stat(path).mtime
+    end
+
+    # Returns last modification time for this file.
+    def mtime
+      modified_time.to_i
+    end
+
+    # Is source path modified?
+    #
+    # Returns true if modified since last write.
+    def modified?
+      self.class.mtimes[path] != mtime
+    end
+
+    # Whether to write the file to the filesystem
+    #
+    # Returns true unless the defaults for the destination path from
+    # _config.yml contain `published: false`.
+    def write?
+      defaults.fetch("published", true)
+    end
+
+    # Write the static file to the destination directory (if modified).
+    #
+    # dest - The String path to the destination dir.
+    #
+    # Returns false if the file was not modified since last time (no-op).
+    def write(dest)
+      dest_path = destination(dest)
+
+      return false if File.exist?(dest_path) && !modified?
+      self.class.mtimes[path] = mtime
+
+      FileUtils.mkdir_p(File.dirname(dest_path))
+      FileUtils.rm(dest_path) if File.exist?(dest_path)
+      copy_file(dest_path)
+
+      true
+    end
+
+    def to_liquid
+      @to_liquid ||= Drops::StaticFileDrop.new(self)
+    end
+
+    def basename
+      File.basename(name, extname)
+    end
+
+    def placeholders
+      {
+        :collection => @collection.label,
+        :path       => relative_path[
+          @collection.relative_directory.size..relative_path.size],
+        :output_ext => "",
+        :name       => "",
+        :title      => "",
+      }
+    end
+
+    # Applies a similar URL-building technique as Jekyll::Document that takes
+    # the collection's URL template into account. The default URL template can
+    # be overriden in the collection's configuration in _config.yml.
+    def url
+      @url ||= if @collection.nil?
+                 relative_path
+               else
+                 ::Jekyll::URL.new({
+                   :template     => @collection.url_template,
+                   :placeholders => placeholders,
+                 })
+               end.to_s.gsub(%r!/$!, "")
+    end
+
+    # Returns the type of the collection if present, nil otherwise.
+    def type
+      @type ||= @collection.nil? ? nil : @collection.label.to_sym
+    end
+
+    # Returns the front matter defaults defined for the file's URL and/or type
+    # as defined in _config.yml.
+    def defaults
+      @defaults ||= @site.frontmatter_defaults.all url, type
+    end
+
+    private
+    def copy_file(dest_path)
+      if @site.safe || Jekyll.env == "production"
+        FileUtils.cp(path, dest_path)
+      else
+        FileUtils.copy_entry(path, dest_path)
+      end
+
+      unless File.symlink?(dest_path)
+        File.utime(self.class.mtimes[path], self.class.mtimes[path], dest_path)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/stevenson.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/stevenson.rb
new file mode 100644
index 0000000..bf20b22
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/stevenson.rb
@@ -0,0 +1,59 @@
+module Jekyll
+  class Stevenson < ::Logger
+    def initialize
+      @progname = nil
+      @level = DEBUG
+      @default_formatter = Formatter.new
+      @logdev = $stdout
+      @formatter = proc do |_, _, _, msg|
+        msg.to_s
+      end
+    end
+
+    def add(severity, message = nil, progname = nil)
+      severity ||= UNKNOWN
+      @logdev = logdevice(severity)
+
+      if @logdev.nil? || severity < @level
+        return true
+      end
+      progname ||= @progname
+      if message.nil?
+        if block_given?
+          message = yield
+        else
+          message = progname
+          progname = @progname
+        end
+      end
+      @logdev.puts(
+        format_message(format_severity(severity), Time.now, progname, message)
+      )
+      true
+    end
+
+    # Log a +WARN+ message
+    def warn(progname = nil, &block)
+      add(WARN, nil, progname.yellow, &block)
+    end
+
+    # Log an +ERROR+ message
+    def error(progname = nil, &block)
+      add(ERROR, nil, progname.red, &block)
+    end
+
+    def close
+      # No LogDevice in use
+    end
+
+    private
+
+    def logdevice(severity)
+      if severity > INFO
+        $stderr
+      else
+        $stdout
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/highlight.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/highlight.rb
new file mode 100644
index 0000000..86b9171
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/highlight.rb
@@ -0,0 +1,137 @@
+module Jekyll
+  module Tags
+    class HighlightBlock < Liquid::Block
+      include Liquid::StandardFilters
+
+      # The regular expression syntax checker. Start with the language specifier.
+      # Follow that by zero or more space separated options that take one of three
+      # forms: name, name=value, or name="<quoted list>"
+      #
+      # <quoted list> is a space-separated list of numbers
+      SYNTAX = %r!^([a-zA-Z0-9.+#_-]+)((\s+\w+(=(\w+|"([0-9]+\s)*[0-9]+"))?)*)$!
+
+      def initialize(tag_name, markup, tokens)
+        super
+        if markup.strip =~ SYNTAX
+          @lang = Regexp.last_match(1).downcase
+          @highlight_options = parse_options(Regexp.last_match(2))
+        else
+          raise SyntaxError, <<-eos
+Syntax Error in tag 'highlight' while parsing the following markup:
+
+  #{markup}
+
+Valid syntax: highlight <lang> [linenos]
+eos
+        end
+      end
+
+      def render(context)
+        prefix = context["highlighter_prefix"] || ""
+        suffix = context["highlighter_suffix"] || ""
+        code = super.to_s.gsub(%r!\A(\n|\r)+|(\n|\r)+\z!, "")
+
+        is_safe = !!context.registers[:site].safe
+
+        output =
+          case context.registers[:site].highlighter
+          when "pygments"
+            render_pygments(code, is_safe)
+          when "rouge"
+            render_rouge(code)
+          else
+            render_codehighlighter(code)
+          end
+
+        rendered_output = add_code_tag(output)
+        prefix + rendered_output + suffix
+      end
+
+      def sanitized_opts(opts, is_safe)
+        if is_safe
+          Hash[[
+            [:startinline, opts.fetch(:startinline, nil)],
+            [:hl_lines,    opts.fetch(:hl_lines, nil)],
+            [:linenos,     opts.fetch(:linenos, nil)],
+            [:encoding,    opts.fetch(:encoding, "utf-8")],
+            [:cssclass,    opts.fetch(:cssclass, nil)],
+          ].reject { |f| f.last.nil? }]
+        else
+          opts
+        end
+      end
+
+      private
+
+      def parse_options(input)
+        options = {}
+        unless input.empty?
+          # Split along 3 possible forms -- key="<quoted list>", key=value, or key
+          input.scan(%r!(?:\w="[^"]*"|\w=\w|\w)+!) do |opt|
+            key, value = opt.split("=")
+            # If a quoted list, convert to array
+            if value && value.include?("\"")
+              value.delete!('"')
+              value = value.split
+            end
+            options[key.to_sym] = value || true
+          end
+        end
+        if options.key?(:linenos) && options[:linenos] == true
+          options[:linenos] = "inline"
+        end
+        options
+      end
+
+      def render_pygments(code, is_safe)
+        Jekyll::External.require_with_graceful_fail("pygments")
+
+        highlighted_code = Pygments.highlight(
+          code,
+          :lexer   => @lang,
+          :options => sanitized_opts(@highlight_options, is_safe)
+        )
+
+        if highlighted_code.nil?
+          Jekyll.logger.error <<eos
+There was an error highlighting your code:
+
+#{code}
+
+While attempting to convert the above code, Pygments.rb returned an unacceptable value.
+This is usually a timeout problem solved by running `jekyll build` again.
+eos
+          raise ArgumentError, "Pygments.rb returned an unacceptable value "\
+          "when attempting to highlight some code."
+        end
+
+        highlighted_code.sub('<div class="highlight"><pre>', "").sub("</pre></div>", "")
+      end
+
+      def render_rouge(code)
+        Jekyll::External.require_with_graceful_fail("rouge")
+        formatter = Rouge::Formatters::HTML.new(
+          :line_numbers => @highlight_options[:linenos],
+          :wrap         => false
+        )
+        lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText
+        formatter.format(lexer.lex(code))
+      end
+
+      def render_codehighlighter(code)
+        h(code).strip
+      end
+
+      def add_code_tag(code)
+        code_attributes = [
+          "class=\"language-#{@lang.to_s.tr("+", "-")}\"",
+          "data-lang=\"#{@lang}\"",
+        ].join(" ")
+        "<figure class=\"highlight\"><pre><code #{code_attributes}>"\
+        "#{code.chomp}</code></pre></figure>"
+      end
+    end
+  end
+end
+
+Liquid::Template.register_tag("highlight", Jekyll::Tags::HighlightBlock)
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/include.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/include.rb
new file mode 100644
index 0000000..0884304
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/include.rb
@@ -0,0 +1,207 @@
+# encoding: UTF-8
+
+module Jekyll
+  module Tags
+    class IncludeTagError < StandardError
+      attr_accessor :path
+
+      def initialize(msg, path)
+        super(msg)
+        @path = path
+      end
+    end
+
+    class IncludeTag < Liquid::Tag
+      VALID_SYNTAX = %r!
+        ([\w-]+)\s*=\s*
+        (?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))
+      !x
+      VARIABLE_SYNTAX = %r!
+        (?<variable>[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+)
+        (?<params>.*)
+      !x
+
+      def initialize(tag_name, markup, tokens)
+        super
+        matched = markup.strip.match(VARIABLE_SYNTAX)
+        if matched
+          @file = matched["variable"].strip
+          @params = matched["params"].strip
+        else
+          @file, @params = markup.strip.split(%r!\s+!, 2)
+        end
+        validate_params if @params
+        @tag_name = tag_name
+      end
+
+      def syntax_example
+        "{% #{@tag_name} file.ext param='value' param2='value' %}"
+      end
+
+      def parse_params(context)
+        params = {}
+        markup = @params
+
+        while (match = VALID_SYNTAX.match(markup))
+          markup = markup[match.end(0)..-1]
+
+          value = if match[2]
+                    match[2].gsub(%r!\\"!, '"')
+                  elsif match[3]
+                    match[3].gsub(%r!\\'!, "'")
+                  elsif match[4]
+                    context[match[4]]
+                  end
+
+          params[match[1]] = value
+        end
+        params
+      end
+
+      def validate_file_name(file)
+        if file !~ %r!^[a-zA-Z0-9_/\.-]+$! || file =~ %r!\./! || file =~ %r!/\.!
+          raise ArgumentError, <<-eos
+Invalid syntax for include tag. File contains invalid characters or sequences:
+
+  #{file}
+
+Valid syntax:
+
+  #{syntax_example}
+
+eos
+        end
+      end
+
+      def validate_params
+        full_valid_syntax = %r!\A\s*(?:#{VALID_SYNTAX}(?=\s|\z)\s*)*\z!
+        unless @params =~ full_valid_syntax
+          raise ArgumentError, <<-eos
+Invalid syntax for include tag:
+
+  #{@params}
+
+Valid syntax:
+
+  #{syntax_example}
+
+eos
+        end
+      end
+
+      # Grab file read opts in the context
+      def file_read_opts(context)
+        context.registers[:site].file_read_opts
+      end
+
+      # Render the variable if required
+      def render_variable(context)
+        if @file.match(VARIABLE_SYNTAX)
+          partial = context.registers[:site]
+            .liquid_renderer
+            .file("(variable)")
+            .parse(@file)
+          partial.render!(context)
+        end
+      end
+
+      def tag_includes_dirs(context)
+        context.registers[:site].includes_load_paths.freeze
+      end
+
+      def locate_include_file(context, file, safe)
+        includes_dirs = tag_includes_dirs(context)
+        includes_dirs.each do |dir|
+          path = File.join(dir.to_s, file.to_s)
+          return path if valid_include_file?(path, dir.to_s, safe)
+        end
+        raise IOError, "Could not locate the included file '#{file}' in any of "\
+          "#{includes_dirs}. Ensure it exists in one of those directories and, "\
+          "if it is a symlink, does not point outside your site source."
+      end
+
+      def render(context)
+        site = context.registers[:site]
+
+        file = render_variable(context) || @file
+        validate_file_name(file)
+
+        path = locate_include_file(context, file, site.safe)
+        return unless path
+
+        add_include_to_dependency(site, path, context)
+
+        partial = load_cached_partial(path, context)
+
+        context.stack do
+          context["include"] = parse_params(context) if @params
+          partial.render!(context)
+        end
+      end
+
+      def add_include_to_dependency(site, path, context)
+        if context.registers[:page] && context.registers[:page].key?("path")
+          site.regenerator.add_dependency(
+            site.in_source_dir(context.registers[:page]["path"]),
+            path
+          )
+        end
+      end
+
+      def load_cached_partial(path, context)
+        context.registers[:cached_partials] ||= {}
+        cached_partial = context.registers[:cached_partials]
+
+        if cached_partial.key?(path)
+          cached_partial[path]
+        else
+          unparsed_file = context.registers[:site]
+            .liquid_renderer
+            .file(path)
+          begin
+            cached_partial[path] = unparsed_file.parse(read_file(path, context))
+          rescue Liquid::SyntaxError => ex
+            raise IncludeTagError.new(ex.message, path)
+          end
+        end
+      end
+
+      def valid_include_file?(path, dir, safe)
+        !outside_site_source?(path, dir, safe) && File.file?(path)
+      end
+
+      def outside_site_source?(path, dir, safe)
+        safe && !realpath_prefixed_with?(path, dir)
+      end
+
+      def realpath_prefixed_with?(path, dir)
+        File.exist?(path) && File.realpath(path).start_with?(dir)
+      rescue
+        false
+      end
+
+      # This method allows to modify the file content by inheriting from the class.
+      def read_file(file, context)
+        File.read(file, file_read_opts(context))
+      end
+    end
+
+    class IncludeRelativeTag < IncludeTag
+      def tag_includes_dirs(context)
+        Array(page_path(context)).freeze
+      end
+
+      def page_path(context)
+        if context.registers[:page].nil?
+          context.registers[:site].source
+        else
+          current_doc_dir = File.dirname(context.registers[:page]["path"])
+          context.registers[:site].in_source_dir current_doc_dir
+        end
+      end
+    end
+  end
+end
+
+Liquid::Template.register_tag("include", Jekyll::Tags::IncludeTag)
+Liquid::Template.register_tag("include_relative", Jekyll::Tags::IncludeRelativeTag)
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/link.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/link.rb
new file mode 100644
index 0000000..a076c41
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/link.rb
@@ -0,0 +1,35 @@
+module Jekyll
+  module Tags
+    class Link < Liquid::Tag
+      class << self
+        def tag_name
+          self.name.split("::").last.downcase
+        end
+      end
+
+      def initialize(tag_name, relative_path, tokens)
+        super
+
+        @relative_path = relative_path.strip
+      end
+
+      def render(context)
+        site = context.registers[:site]
+
+        site.each_site_file do |item|
+          return item.url if item.relative_path == @relative_path
+          # This takes care of the case for static files that have a leading /
+          return item.url if item.relative_path == "/#{@relative_path}"
+        end
+
+        raise ArgumentError, <<eos
+Could not find document '#{@relative_path}' in tag '#{self.class.tag_name}'.
+
+Make sure the document exists and the path is correct.
+eos
+      end
+    end
+  end
+end
+
+Liquid::Template.register_tag(Jekyll::Tags::Link.tag_name, Jekyll::Tags::Link)
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/post_url.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/post_url.rb
new file mode 100644
index 0000000..f7e52f4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/tags/post_url.rb
@@ -0,0 +1,101 @@
+module Jekyll
+  module Tags
+    class PostComparer
+      MATCHER = %r!^(.+/)*(\d+-\d+-\d+)-(.*)$!
+
+      attr_reader :path, :date, :slug, :name
+
+      def initialize(name)
+        @name = name
+
+        all, @path, @date, @slug = *name.sub(%r!^/!, "").match(MATCHER)
+        unless all
+          raise Jekyll::Errors::InvalidPostNameError,
+            "'#{name}' does not contain valid date and/or title."
+        end
+
+        escaped_slug = Regexp.escape(slug)
+        @name_regex = %r!^_posts/#{path}#{date}-#{escaped_slug}\.[^.]+|
+          ^#{path}_posts/?#{date}-#{escaped_slug}\.[^.]+!x
+      end
+
+      def post_date
+        @post_date ||= Utils.parse_date(date,
+          "\"#{date}\" does not contain valid date and/or title.")
+      end
+
+      def ==(other)
+        other.relative_path.match(@name_regex)
+      end
+
+      def deprecated_equality(other)
+        slug == post_slug(other) &&
+          post_date.year  == other.date.year &&
+          post_date.month == other.date.month &&
+          post_date.day   == other.date.day
+      end
+
+      private
+      # Construct the directory-aware post slug for a Jekyll::Post
+      #
+      # other - the Jekyll::Post
+      #
+      # Returns the post slug with the subdirectory (relative to _posts)
+      def post_slug(other)
+        path = other.basename.split("/")[0...-1].join("/")
+        if path.nil? || path == ""
+          other.data["slug"]
+        else
+          path + "/" + other.data["slug"]
+        end
+      end
+    end
+
+    class PostUrl < Liquid::Tag
+      def initialize(tag_name, post, tokens)
+        super
+        @orig_post = post.strip
+        begin
+          @post = PostComparer.new(@orig_post)
+        rescue => e
+          raise Jekyll::Errors::PostURLError, <<-eos
+Could not parse name of post "#{@orig_post}" in tag 'post_url'.
+
+Make sure the post exists and the name is correct.
+
+#{e.class}: #{e.message}
+eos
+        end
+      end
+
+      def render(context)
+        site = context.registers[:site]
+
+        site.posts.docs.each do |p|
+          return p.url if @post == p
+        end
+
+        # New matching method did not match, fall back to old method
+        # with deprecation warning if this matches
+
+        site.posts.docs.each do |p|
+          next unless @post.deprecated_equality p
+          Jekyll::Deprecator.deprecation_message "A call to "\
+            "'{% post_url #{@post.name} %}' did not match " \
+            "a post using the new matching method of checking name " \
+            "(path-date-slug) equality. Please make sure that you " \
+            "change this tag to match the post's name exactly."
+          return p.url
+        end
+
+        raise Jekyll::Errors::PostURLError, <<-eos
+Could not find post "#{@orig_post}" in tag 'post_url'.
+
+Make sure the post exists and the name is correct.
+eos
+      end
+    end
+  end
+end
+
+Liquid::Template.register_tag("post_url", Jekyll::Tags::PostUrl)
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/theme.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/theme.rb
new file mode 100644
index 0000000..045c91a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/theme.rb
@@ -0,0 +1,66 @@
+module Jekyll
+  class Theme
+    extend Forwardable
+    attr_reader :name
+    def_delegator :gemspec, :version, :version
+
+    def initialize(name)
+      @name = name.downcase.strip
+      configure_sass
+    end
+
+    def root
+      # Must use File.realpath to resolve symlinks created by rbenv
+      # Otherwise, Jekyll.sanitized path with prepend the unresolved root
+      @root ||= File.realpath(gemspec.full_gem_path)
+    rescue Errno::ENOENT, Errno::EACCES, Errno::ELOOP
+      nil
+    end
+
+    def includes_path
+      path_for "_includes".freeze
+    end
+
+    def layouts_path
+      path_for "_layouts".freeze
+    end
+
+    def sass_path
+      path_for "_sass".freeze
+    end
+
+    def assets_path
+      path_for "assets".freeze
+    end
+
+    def configure_sass
+      return unless sass_path
+      require "sass"
+      Sass.load_paths << sass_path
+    end
+
+    def runtime_dependencies
+      gemspec.runtime_dependencies
+    end
+
+    private
+
+    def path_for(folder)
+      path = realpath_for(folder)
+      path if path && File.directory?(path)
+    end
+
+    def realpath_for(folder)
+      File.realpath(Jekyll.sanitized_path(root, folder.to_s))
+    rescue Errno::ENOENT, Errno::EACCES, Errno::ELOOP
+      nil
+    end
+
+    def gemspec
+      @gemspec ||= Gem::Specification.find_by_name(name)
+    rescue Gem::LoadError
+      raise Jekyll::Errors::MissingDependencyException,
+        "The #{name} theme could not be found."
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/theme_builder.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/theme_builder.rb
new file mode 100644
index 0000000..f1c97e3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/theme_builder.rb
@@ -0,0 +1,117 @@
+class Jekyll::ThemeBuilder
+  SCAFFOLD_DIRECTORIES = %w(
+    assets _layouts _includes _sass
+  ).freeze
+
+  attr_reader :name, :path, :code_of_conduct
+
+  def initialize(theme_name, opts)
+    @name = theme_name.to_s.tr(" ", "_").gsub(%r!_+!, "_")
+    @path = Pathname.new(File.expand_path(name, Dir.pwd))
+    @code_of_conduct = !!opts["code_of_conduct"]
+  end
+
+  def create!
+    create_directories
+    create_starter_files
+    create_gemspec
+    create_accessories
+    initialize_git_repo
+  end
+
+  private
+
+  def root
+    @root ||= Pathname.new(File.expand_path("../", __dir__))
+  end
+
+  def template_file(filename)
+    [
+      root.join("theme_template", "#{filename}.erb"),
+      root.join("theme_template", filename.to_s),
+    ].find(&:exist?)
+  end
+
+  def template(filename)
+    erb.render(template_file(filename).read)
+  end
+
+  def erb
+    @erb ||= ERBRenderer.new(self)
+  end
+
+  def mkdir_p(directories)
+    Array(directories).each do |directory|
+      full_path = path.join(directory)
+      Jekyll.logger.info "create", full_path.to_s
+      FileUtils.mkdir_p(full_path)
+    end
+  end
+
+  def write_file(filename, contents)
+    full_path = path.join(filename)
+    Jekyll.logger.info "create", full_path.to_s
+    File.write(full_path, contents)
+  end
+
+  def create_directories
+    mkdir_p(SCAFFOLD_DIRECTORIES)
+  end
+
+  def create_starter_files
+    %w(page post default).each do |layout|
+      write_file("_layouts/#{layout}.html", template("_layouts/#{layout}.html"))
+    end
+  end
+
+  def create_gemspec
+    write_file("Gemfile", template("Gemfile"))
+    write_file("#{name}.gemspec", template("theme.gemspec"))
+  end
+
+  def create_accessories
+    accessories = %w(README.md LICENSE.txt)
+    accessories << "CODE_OF_CONDUCT.md" if code_of_conduct
+    accessories.each do |filename|
+      write_file(filename, template(filename))
+    end
+  end
+
+  def initialize_git_repo
+    Jekyll.logger.info "initialize", path.join(".git").to_s
+    Dir.chdir(path.to_s) { `git init` }
+    write_file(".gitignore", template("gitignore"))
+  end
+
+  def user_name
+    @user_name ||= `git config user.name`.chomp
+  end
+
+  def user_email
+    @user_email ||= `git config user.email`.chomp
+  end
+
+  class ERBRenderer
+    extend Forwardable
+
+    def_delegator :@theme_builder, :name, :theme_name
+    def_delegator :@theme_builder, :user_name, :user_name
+    def_delegator :@theme_builder, :user_email, :user_email
+
+    def initialize(theme_builder)
+      @theme_builder = theme_builder
+    end
+
+    def jekyll_version_with_minor
+      Jekyll::VERSION.split(".").take(2).join(".")
+    end
+
+    def theme_directories
+      SCAFFOLD_DIRECTORIES
+    end
+
+    def render(contents)
+      ERB.new(contents).result binding
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/url.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/url.rb
new file mode 100644
index 0000000..8f3047d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/url.rb
@@ -0,0 +1,159 @@
+require "addressable/uri"
+
+# Public: Methods that generate a URL for a resource such as a Post or a Page.
+#
+# Examples
+#
+#   URL.new({
+#     :template => /:categories/:title.html",
+#     :placeholders => {:categories => "ruby", :title => "something"}
+#   }).to_s
+#
+module Jekyll
+  class URL
+    # options - One of :permalink or :template must be supplied.
+    #           :template     - The String used as template for URL generation,
+    #                           for example "/:path/:basename:output_ext", where
+    #                           a placeholder is prefixed with a colon.
+    #           :placeholders - A hash containing the placeholders which will be
+    #                           replaced when used inside the template. E.g.
+    #                           { "year" => Time.now.strftime("%Y") } would replace
+    #                           the placeholder ":year" with the current year.
+    #           :permalink    - If supplied, no URL will be generated from the
+    #                           template. Instead, the given permalink will be
+    #                           used as URL.
+    def initialize(options)
+      @template     = options[:template]
+      @placeholders = options[:placeholders] || {}
+      @permalink    = options[:permalink]
+
+      if (@template || @permalink).nil?
+        raise ArgumentError, "One of :template or :permalink must be supplied."
+      end
+    end
+
+    # The generated relative URL of the resource
+    #
+    # Returns the String URL
+    def to_s
+      sanitize_url(generated_permalink || generated_url)
+    end
+
+    # Generates a URL from the permalink
+    #
+    # Returns the _unsanitized String URL
+    def generated_permalink
+      (@generated_permalink ||= generate_url(@permalink)) if @permalink
+    end
+
+    # Generates a URL from the template
+    #
+    # Returns the unsanitized String URL
+    def generated_url
+      @generated_url ||= generate_url(@template)
+    end
+
+    # Internal: Generate the URL by replacing all placeholders with their
+    # respective values in the given template
+    #
+    # Returns the unsanitized String URL
+    def generate_url(template)
+      if @placeholders.is_a? Drops::UrlDrop
+        generate_url_from_drop(template)
+      else
+        generate_url_from_hash(template)
+      end
+    end
+
+    def generate_url_from_hash(template)
+      @placeholders.inject(template) do |result, token|
+        break result if result.index(":").nil?
+        if token.last.nil?
+          # Remove leading "/" to avoid generating urls with `//`
+          result.gsub(%r!/:#{token.first}!, "")
+        else
+          result.gsub(%r!:#{token.first}!, self.class.escape_path(token.last))
+        end
+      end
+    end
+
+    # We include underscores in keys to allow for 'i_month' and so forth.
+    # This poses a problem for keys which are followed by an underscore
+    # but the underscore is not part of the key, e.g. '/:month_:day'.
+    # That should be :month and :day, but our key extraction regexp isn't
+    # smart enough to know that so we have to make it an explicit
+    # possibility.
+    def possible_keys(key)
+      if key.end_with?("_")
+        [key, key.chomp("_")]
+      else
+        [key]
+      end
+    end
+
+    def generate_url_from_drop(template)
+      template.gsub(%r!:([a-z_]+)!) do |match|
+        pool = possible_keys(match.sub(":".freeze, "".freeze))
+
+        winner = pool.find { |key| @placeholders.key?(key) }
+        if winner.nil?
+          raise NoMethodError,
+            "The URL template doesn't have #{pool.join(" or ")} keys. "\
+              "Check your permalink template!"
+        end
+
+        value = @placeholders[winner]
+        value = "" if value.nil?
+        replacement = self.class.escape_path(value)
+
+        match.sub(":#{winner}", replacement)
+      end.gsub(%r!//!, "/".freeze)
+    end
+
+    # Returns a sanitized String URL, stripping "../../" and multiples of "/",
+    # as well as the beginning "/" so we can enforce and ensure it.
+
+    def sanitize_url(str)
+      "/" + str.gsub(%r!/{2,}!, "/").gsub(%r!\.+/|\A/+!, "")
+    end
+
+    # Escapes a path to be a valid URL path segment
+    #
+    # path - The path to be escaped.
+    #
+    # Examples:
+    #
+    #   URL.escape_path("/a b")
+    #   # => "/a%20b"
+    #
+    # Returns the escaped path.
+    def self.escape_path(path)
+      # Because URI.escape doesn't escape "?", "[" and "]" by default,
+      # specify unsafe string (except unreserved, sub-delims, ":", "@" and "/").
+      #
+      # URI path segment is defined in RFC 3986 as follows:
+      #   segment       = *pchar
+      #   pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
+      #   unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
+      #   pct-encoded   = "%" HEXDIG HEXDIG
+      #   sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
+      #                 / "*" / "+" / "," / ";" / "="
+      path = Addressable::URI.encode(path)
+      path.encode("utf-8").sub("#", "%23")
+    end
+
+    # Unescapes a URL path segment
+    #
+    # path - The path to be unescaped.
+    #
+    # Examples:
+    #
+    #   URL.unescape_path("/a%20b")
+    #   # => "/a b"
+    #
+    # Returns the unescaped path.
+    def self.unescape_path(path)
+      Addressable::URI.unencode(path.encode("utf-8"))
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils.rb
new file mode 100644
index 0000000..3f91a2b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils.rb
@@ -0,0 +1,331 @@
+
+module Jekyll
+  module Utils
+    extend self
+    autoload :Ansi, "jekyll/utils/ansi"
+    autoload :Exec, "jekyll/utils/exec"
+    autoload :Platforms, "jekyll/utils/platforms"
+    autoload :WinTZ, "jekyll/utils/win_tz"
+
+    # Constants for use in #slugify
+    SLUGIFY_MODES = %w(raw default pretty ascii).freeze
+    SLUGIFY_RAW_REGEXP = Regexp.new('\\s+').freeze
+    SLUGIFY_DEFAULT_REGEXP = Regexp.new("[^[:alnum:]]+").freeze
+    SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze
+    SLUGIFY_ASCII_REGEXP = Regexp.new("[^[A-Za-z0-9]]+").freeze
+
+    # Takes an indented string and removes the preceding spaces on each line
+
+    def strip_heredoc(str)
+      str.gsub(%r!^[ \t]{#{(str.scan(%r!^[ \t]*(?=\S)!).min || "").size}}!, "")
+    end
+
+    # Takes a slug and turns it into a simple title.
+
+    def titleize_slug(slug)
+      slug.split("-").map!(&:capitalize).join(" ")
+    end
+
+    # Non-destructive version of deep_merge_hashes! See that method.
+    #
+    # Returns the merged hashes.
+    def deep_merge_hashes(master_hash, other_hash)
+      deep_merge_hashes!(master_hash.dup, other_hash)
+    end
+
+    # Merges a master hash with another hash, recursively.
+    #
+    # master_hash - the "parent" hash whose values will be overridden
+    # other_hash  - the other hash whose values will be persisted after the merge
+    #
+    # This code was lovingly stolen from some random gem:
+    # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
+    #
+    # Thanks to whoever made it.
+    def deep_merge_hashes!(target, overwrite)
+      merge_values(target, overwrite)
+      merge_default_proc(target, overwrite)
+      duplicate_frozen_values(target)
+
+      target
+    end
+
+    def mergable?(value)
+      value.is_a?(Hash) || value.is_a?(Drops::Drop)
+    end
+
+    def duplicable?(obj)
+      case obj
+      when nil, false, true, Symbol, Numeric
+        false
+      else
+        true
+      end
+    end
+
+    # Read array from the supplied hash favouring the singular key
+    # and then the plural key, and handling any nil entries.
+    #
+    # hash - the hash to read from
+    # singular_key - the singular key
+    # plural_key - the plural key
+    #
+    # Returns an array
+    def pluralized_array_from_hash(hash, singular_key, plural_key)
+      [].tap do |array|
+        value = value_from_singular_key(hash, singular_key)
+        value ||= value_from_plural_key(hash, plural_key)
+        array << value
+      end.flatten.compact
+    end
+
+    def value_from_singular_key(hash, key)
+      hash[key] if hash.key?(key) || (hash.default_proc && hash[key])
+    end
+
+    def value_from_plural_key(hash, key)
+      if hash.key?(key) || (hash.default_proc && hash[key])
+        val = hash[key]
+        case val
+        when String
+          val.split
+        when Array
+          val.compact
+        end
+      end
+    end
+
+    def transform_keys(hash)
+      result = {}
+      hash.each_key do |key|
+        result[yield(key)] = hash[key]
+      end
+      result
+    end
+
+    # Apply #to_sym to all keys in the hash
+    #
+    # hash - the hash to which to apply this transformation
+    #
+    # Returns a new hash with symbolized keys
+    def symbolize_hash_keys(hash)
+      transform_keys(hash) { |key| key.to_sym rescue key }
+    end
+
+    # Apply #to_s to all keys in the Hash
+    #
+    # hash - the hash to which to apply this transformation
+    #
+    # Returns a new hash with stringified keys
+    def stringify_hash_keys(hash)
+      transform_keys(hash) { |key| key.to_s rescue key }
+    end
+
+    # Parse a date/time and throw an error if invalid
+    #
+    # input - the date/time to parse
+    # msg - (optional) the error message to show the user
+    #
+    # Returns the parsed date if successful, throws a FatalException
+    # if not
+    def parse_date(input, msg = "Input could not be parsed.")
+      Time.parse(input).localtime
+    rescue ArgumentError
+      raise Errors::InvalidDateError, "Invalid date '#{input}': #{msg}"
+    end
+
+    # Determines whether a given file has
+    #
+    # Returns true if the YAML front matter is present.
+    # rubocop: disable PredicateName
+    def has_yaml_header?(file)
+      !!(File.open(file, "rb", &:readline) =~ %r!\A---\s*\r?\n!)
+    rescue EOFError
+      false
+    end
+    # rubocop: enable PredicateName
+
+    # Slugify a filename or title.
+    #
+    # string - the filename or title to slugify
+    # mode - how string is slugified
+    # cased - whether to replace all uppercase letters with their
+    # lowercase counterparts
+    #
+    # When mode is "none", return the given string.
+    #
+    # When mode is "raw", return the given string,
+    # with every sequence of spaces characters replaced with a hyphen.
+    #
+    # When mode is "default" or nil, non-alphabetic characters are
+    # replaced with a hyphen too.
+    #
+    # When mode is "pretty", some non-alphabetic characters (._~!$&'()+,;=@)
+    # are not replaced with hyphen.
+    #
+    # When mode is "ascii", some everything else except ASCII characters
+    # a-z (lowercase), A-Z (uppercase) and 0-9 (numbers) are not replaced with hyphen.
+    #
+    # If cased is true, all uppercase letters in the result string are
+    # replaced with their lowercase counterparts.
+    #
+    # Examples:
+    #   slugify("The _config.yml file")
+    #   # => "the-config-yml-file"
+    #
+    #   slugify("The _config.yml file", "pretty")
+    #   # => "the-_config.yml-file"
+    #
+    #   slugify("The _config.yml file", "pretty", true)
+    #   # => "The-_config.yml file"
+    #
+    #   slugify("The _config.yml file", "ascii")
+    #   # => "the-config.yml-file"
+    #
+    # Returns the slugified string.
+    def slugify(string, mode: nil, cased: false)
+      mode ||= "default"
+      return nil if string.nil?
+
+      unless SLUGIFY_MODES.include?(mode)
+        return cased ? string : string.downcase
+      end
+
+      # Replace each character sequence with a hyphen
+      re =
+        case mode
+        when "raw"
+          SLUGIFY_RAW_REGEXP
+        when "default"
+          SLUGIFY_DEFAULT_REGEXP
+        when "pretty"
+          # "._~!$&'()+,;=@" is human readable (not URI-escaped) in URL
+          # and is allowed in both extN and NTFS.
+          SLUGIFY_PRETTY_REGEXP
+        when "ascii"
+          # For web servers not being able to handle Unicode, the safe
+          # method is to ditch anything else but latin letters and numeric
+          # digits.
+          SLUGIFY_ASCII_REGEXP
+        end
+
+      # Strip according to the mode
+      slug = string.gsub(re, "-")
+
+      # Remove leading/trailing hyphen
+      slug.gsub!(%r!^\-|\-$!i, "")
+
+      slug.downcase! unless cased
+      slug
+    end
+
+    # Add an appropriate suffix to template so that it matches the specified
+    # permalink style.
+    #
+    # template - permalink template without trailing slash or file extension
+    # permalink_style - permalink style, either built-in or custom
+    #
+    # The returned permalink template will use the same ending style as
+    # specified in permalink_style.  For example, if permalink_style contains a
+    # trailing slash (or is :pretty, which indirectly has a trailing slash),
+    # then so will the returned template.  If permalink_style has a trailing
+    # ":output_ext" (or is :none, :date, or :ordinal) then so will the returned
+    # template.  Otherwise, template will be returned without modification.
+    #
+    # Examples:
+    #   add_permalink_suffix("/:basename", :pretty)
+    #   # => "/:basename/"
+    #
+    #   add_permalink_suffix("/:basename", :date)
+    #   # => "/:basename:output_ext"
+    #
+    #   add_permalink_suffix("/:basename", "/:year/:month/:title/")
+    #   # => "/:basename/"
+    #
+    #   add_permalink_suffix("/:basename", "/:year/:month/:title")
+    #   # => "/:basename"
+    #
+    # Returns the updated permalink template
+    def add_permalink_suffix(template, permalink_style)
+      case permalink_style
+      when :pretty
+        template << "/"
+      when :date, :ordinal, :none
+        template << ":output_ext"
+      else
+        template << "/" if permalink_style.to_s.end_with?("/")
+        template << ":output_ext" if permalink_style.to_s.end_with?(":output_ext")
+      end
+      template
+    end
+
+    # Work the same way as Dir.glob but seperating the input into two parts
+    # ('dir' + '/' + 'pattern') to make sure the first part('dir') does not act
+    # as a pattern.
+    #
+    # For example, Dir.glob("path[/*") always returns an empty array,
+    # because the method fails to find the closing pattern to '[' which is ']'
+    #
+    # Examples:
+    #   safe_glob("path[", "*")
+    #   # => ["path[/file1", "path[/file2"]
+    #
+    #   safe_glob("path", "*", File::FNM_DOTMATCH)
+    #   # => ["path/.", "path/..", "path/file1"]
+    #
+    #   safe_glob("path", ["**", "*"])
+    #   # => ["path[/file1", "path[/folder/file2"]
+    #
+    # dir      - the dir where glob will be executed under
+    #           (the dir will be included to each result)
+    # patterns - the patterns (or the pattern) which will be applied under the dir
+    # flags    - the flags which will be applied to the pattern
+    #
+    # Returns matched pathes
+    def safe_glob(dir, patterns, flags = 0)
+      return [] unless Dir.exist?(dir)
+      pattern = File.join(Array(patterns))
+      return [dir] if pattern.empty?
+      Dir.chdir(dir) do
+        Dir.glob(pattern, flags).map { |f| File.join(dir, f) }
+      end
+    end
+
+    # Returns merged option hash for File.read of self.site (if exists)
+    # and a given param
+    def merged_file_read_opts(site, opts)
+      merged = (site ? site.file_read_opts : {}).merge(opts)
+      if merged["encoding"] && !merged["encoding"].start_with?("bom|")
+        merged["encoding"].insert(0, "bom|")
+      end
+      merged
+    end
+
+    private
+    def merge_values(target, overwrite)
+      target.merge!(overwrite) do |_key, old_val, new_val|
+        if new_val.nil?
+          old_val
+        elsif mergable?(old_val) && mergable?(new_val)
+          deep_merge_hashes(old_val, new_val)
+        else
+          new_val
+        end
+      end
+    end
+
+    private
+    def merge_default_proc(target, overwrite)
+      if target.is_a?(Hash) && overwrite.is_a?(Hash) && target.default_proc.nil?
+        target.default_proc = overwrite.default_proc
+      end
+    end
+
+    private
+    def duplicate_frozen_values(target)
+      target.each do |key, val|
+        target[key] = val.dup if val.frozen? && duplicable?(val)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/ansi.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/ansi.rb
new file mode 100644
index 0000000..8bdd232
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/ansi.rb
@@ -0,0 +1,59 @@
+# Frozen-string-literal: true
+# Copyright: 2015 Jekyll - MIT License
+# Encoding: utf-8
+
+module Jekyll
+  module Utils
+    module Ansi
+      extend self
+
+      ESCAPE = format("%c", 27)
+      MATCH = %r!#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m!ix
+      COLORS = {
+        :red     => 31,
+        :green   => 32,
+        :black   => 30,
+        :magenta => 35,
+        :yellow  => 33,
+        :white   => 37,
+        :blue    => 34,
+        :cyan    => 36,
+      }.freeze
+
+      # Strip ANSI from the current string.  It also strips cursor stuff,
+      # well some of it, and it also strips some other stuff that a lot of
+      # the other ANSI strippers don't.
+
+      def strip(str)
+        str.gsub MATCH, ""
+      end
+
+      #
+
+      def has?(str)
+        !!(str =~ MATCH)
+      end
+
+      # Reset the color back to the default color so that you do not leak any
+      # colors when you move onto the next line. This is probably normally
+      # used as part of a wrapper so that we don't leak colors.
+
+      def reset(str = "")
+        @ansi_reset ||= format("%c[0m", 27)
+        "#{@ansi_reset}#{str}"
+      end
+
+      # SEE: `self::COLORS` for a list of methods.  They are mostly
+      # standard base colors supported by pretty much any xterm-color, we do
+      # not need more than the base colors so we do not include them.
+      # Actually... if I'm honest we don't even need most of the
+      # base colors.
+
+      COLORS.each do |color, num|
+        define_method color do |str|
+          "#{format("%c", 27)}[#{num}m#{str}#{reset}"
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/exec.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/exec.rb
new file mode 100644
index 0000000..33403db
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/exec.rb
@@ -0,0 +1,25 @@
+require "open3"
+
+module Jekyll
+  module Utils
+    module Exec
+      extend self
+
+      # Runs a program in a sub-shell.
+      #
+      # *args - a list of strings containing the program name and arguments
+      #
+      # Returns a Process::Status and a String of output in an array in
+      # that order.
+      def run(*args)
+        stdin, stdout, stderr, process = Open3.popen3(*args)
+        out = stdout.read.strip
+        err = stderr.read.strip
+
+        [stdin, stdout, stderr].each(&:close)
+        [process.value, out + err]
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/platforms.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/platforms.rb
new file mode 100644
index 0000000..f66ef79
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/platforms.rb
@@ -0,0 +1,80 @@
+module Jekyll
+  module Utils
+    module Platforms
+      extend self
+
+      # Provides jruby? and mri? which respectively detect these two types of
+      # tested Engines we support, in the future we might probably support the
+      # other one that everyone used to talk about.
+
+      { :jruby? => "jruby", :mri? => "ruby" }.each do |k, v|
+        define_method k do
+          ::RUBY_ENGINE == v
+        end
+      end
+
+      # --
+      # Allows you to detect "real" Windows, or what we would consider
+      # "real" Windows.  That is, that we can pass the basic test and the
+      # /proc/version returns nothing to us.
+      # --
+
+      def vanilla_windows?
+        RbConfig::CONFIG["host_os"] =~ %r!mswin|mingw|cygwin!i && \
+          !proc_version
+      end
+
+      # --
+      # XXX: Remove in 4.0
+      # --
+
+      alias_method :really_windows?, \
+        :vanilla_windows?
+
+      #
+
+      def bash_on_windows?
+        RbConfig::CONFIG["host_os"] =~ %r!linux! && \
+          proc_version =~ %r!microsoft!i
+      end
+
+      #
+
+      def windows?
+        vanilla_windows? || bash_on_windows?
+      end
+
+      #
+
+      def linux?
+        RbConfig::CONFIG["host_os"] =~ %r!linux! && \
+          proc_version !~ %r!microsoft!i
+      end
+
+      # Provides windows?, linux?, osx?, unix? so that we can detect
+      # platforms. This is mostly useful for `jekyll doctor` and for testing
+      # where we kick off certain tests based on the platform.
+
+      { :osx? => %r!darwin|mac os!, :unix? => %r!solaris|bsd! }.each do |k, v|
+        define_method k do
+          !!(
+            RbConfig::CONFIG["host_os"] =~ v
+          )
+        end
+      end
+
+      #
+
+      private
+      def proc_version
+        @cached_proc_version ||= begin
+          Pathutil.new(
+            "/proc/version"
+          ).read
+        rescue Errno::ENOENT
+          nil
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/win_tz.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/win_tz.rb
new file mode 100644
index 0000000..06a1042
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/utils/win_tz.rb
@@ -0,0 +1,73 @@
+module Jekyll
+  module Utils
+    module WinTZ
+      extend self
+
+      # Public: Calculate the Timezone for Windows when the config file has a defined
+      #         'timezone' key.
+      #
+      # timezone - the IANA Time Zone specified in "_config.yml"
+      #
+      # Returns a string that ultimately re-defines ENV["TZ"] in Windows
+      def calculate(timezone)
+        External.require_with_graceful_fail("tzinfo")
+        tz = TZInfo::Timezone.get(timezone)
+        difference = Time.now.to_i - tz.now.to_i
+        #
+        # POSIX style definition reverses the offset sign.
+        #   e.g. Eastern Standard Time (EST) that is 5Hrs. to the 'west' of Prime Meridian
+        #   is denoted as:
+        #     EST+5 (or) EST+05:00
+        # Reference: http://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
+        sign = difference < 0 ? "-" : "+"
+        offset = sign == "-" ? "+" : "-" unless difference.zero?
+        #
+        # convert the difference (in seconds) to hours, as a rational number, and perform
+        # a modulo operation on it.
+        modulo = modulo_of(rational_hour(difference))
+        #
+        # Format the hour as a two-digit number.
+        # Establish the minutes based on modulo expression.
+        hh = format("%02d", absolute_hour(difference).ceil)
+        mm = modulo.zero? ? "00" : "30"
+
+        Jekyll.logger.debug "Timezone:", "#{timezone} #{offset}#{hh}:#{mm}"
+        #
+        # Note: The 3-letter-word below doesn't have a particular significance.
+        "WTZ#{sign}#{hh}:#{mm}"
+      end
+
+      private
+
+      # Private: Convert given seconds to an hour as a rational number.
+      #
+      # seconds - supplied as an integer, it is converted to a rational number.
+      # 3600 - no. of seconds in an hour.
+      #
+      # Returns a rational number.
+      def rational_hour(seconds)
+        seconds.to_r / 3600
+      end
+
+      # Private: Convert given seconds to an hour as an absolute number.
+      #
+      # seconds - supplied as an integer, it is converted to its absolute.
+      # 3600 - no. of seconds in an hour.
+      #
+      # Returns an integer.
+      def absolute_hour(seconds)
+        seconds.abs / 3600
+      end
+
+      # Private: Perform a modulo operation on a given fraction.
+      #
+      # fraction - supplied as a rational number, its numerator is divided
+      #            by its denominator and the remainder returned.
+      #
+      # Returns an integer.
+      def modulo_of(fraction)
+        fraction.numerator % fraction.denominator
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/version.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/version.rb
new file mode 100644
index 0000000..89cbd5a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/jekyll/version.rb
@@ -0,0 +1,3 @@
+module Jekyll
+  VERSION = "3.5.2".freeze
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/.gitignore b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/.gitignore
new file mode 100644
index 0000000..45c1505
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/.gitignore
@@ -0,0 +1,3 @@
+_site
+.sass-cache
+.jekyll-metadata
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/404.html b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/404.html
new file mode 100644
index 0000000..c472b4e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/404.html
@@ -0,0 +1,24 @@
+---
+layout: default
+---
+
+<style type="text/css" media="screen">
+  .container {
+    margin: 10px auto;
+    max-width: 600px;
+    text-align: center;
+  }
+  h1 {
+    margin: 30px 0;
+    font-size: 4em;
+    line-height: 1;
+    letter-spacing: -1px;
+  }
+</style>
+
+<div class="container">
+  <h1>404</h1>
+
+  <p><strong>Page not found :(</strong></p>
+  <p>The requested page could not be found.</p>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/_config.yml b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/_config.yml
new file mode 100644
index 0000000..5cea6d2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/_config.yml
@@ -0,0 +1,43 @@
+# Welcome to Jekyll!
+#
+# This config file is meant for settings that affect your whole blog, values
+# which you are expected to set up once and rarely edit after that. If you find
+# yourself editing this file very often, consider using Jekyll's data files
+# feature for the data you need to update frequently.
+#
+# For technical reasons, this file is *NOT* reloaded automatically when you use
+# 'bundle exec jekyll serve'. If you change this file, please restart the server process.
+
+# Site settings
+# These are used to personalize your new site. If you look in the HTML files,
+# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
+# You can create any custom variable you would like, and they will be accessible
+# in the templates via {{ site.myvariable }}.
+title: Your awesome title
+email: your-email@example.com
+description: > # this means to ignore newlines until "baseurl:"
+  Write an awesome description for your new site here. You can edit this
+  line in _config.yml. It will appear in your document head meta (for
+  Google search results) and in your feed.xml site description.
+baseurl: "" # the subpath of your site, e.g. /blog
+url: "" # the base hostname & protocol for your site, e.g. http://example.com
+twitter_username: jekyllrb
+github_username:  jekyll
+
+# Build settings
+markdown: kramdown
+theme: minima
+plugins:
+  - jekyll-feed
+
+# Exclude from processing.
+# The following items will not be processed, by default. Create a custom list
+# to override the default setting.
+# exclude:
+#   - Gemfile
+#   - Gemfile.lock
+#   - node_modules
+#   - vendor/bundle/
+#   - vendor/cache/
+#   - vendor/gems/
+#   - vendor/ruby/
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb
new file mode 100644
index 0000000..8d8f7c1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb
@@ -0,0 +1,25 @@
+---
+layout: post
+title:  "Welcome to Jekyll!"
+date:   <%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %>
+categories: jekyll update
+---
+You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated.
+
+To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.
+
+Jekyll also offers powerful support for code snippets:
+
+{% highlight ruby %}
+def print_hi(name)
+  puts "Hi, #{name}"
+end
+print_hi('Tom')
+#=> prints 'Hi, Tom' to STDOUT.
+{% endhighlight %}
+
+Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk].
+
+[jekyll-docs]: https://jekyllrb.com/docs/home
+[jekyll-gh]:   https://github.com/jekyll/jekyll
+[jekyll-talk]: https://talk.jekyllrb.com/
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/about.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/about.md
new file mode 100644
index 0000000..8b4e0b2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/about.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: About
+permalink: /about/
+---
+
+This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](https://jekyllrb.com/)
+
+You can find the source code for Minima at GitHub:
+[jekyll][jekyll-organization] /
+[minima](https://github.com/jekyll/minima)
+
+You can find the source code for Jekyll at GitHub:
+[jekyll][jekyll-organization] /
+[jekyll](https://github.com/jekyll/jekyll)
+
+
+[jekyll-organization]: https://github.com/jekyll
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/index.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/index.md
new file mode 100644
index 0000000..1eb5d67
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/site_template/index.md
@@ -0,0 +1,6 @@
+---
+# You don't need to edit this file, it's empty on purpose.
+# Edit theme's home layout instead if you wanna make some changes
+# See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults
+layout: home
+---
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/CODE_OF_CONDUCT.md.erb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/CODE_OF_CONDUCT.md.erb
new file mode 100644
index 0000000..2b2c773
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/CODE_OF_CONDUCT.md.erb
@@ -0,0 +1,74 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level of experience,
+nationality, personal appearance, race, religion, or sexual identity and
+orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+  address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at <%= user_email %>. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/Gemfile b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/Gemfile
new file mode 100644
index 0000000..3be9c3c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/Gemfile
@@ -0,0 +1,2 @@
+source "https://rubygems.org"
+gemspec
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/LICENSE.txt.erb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/LICENSE.txt.erb
new file mode 100644
index 0000000..38a0eb4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/LICENSE.txt.erb
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) <%= Time.now.year %> <%= user_name %>
+
+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/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/README.md.erb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/README.md.erb
new file mode 100644
index 0000000..9eca48c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/README.md.erb
@@ -0,0 +1,48 @@
+# <%= theme_name %>
+
+Welcome to your new Jekyll theme! In this directory, you'll find the files you need to be able to package up your theme into a gem. Put your layouts in `_layouts`, your includes in `_includes` and your sass in `_sass`. To experiment with this code, add some sample content and run `bundle exec jekyll serve` – this directory is setup just like a Jekyll site!
+
+TODO: Delete this and the text above, and describe your gem
+
+## Installation
+
+Add this line to your Jekyll site's `Gemfile`:
+
+```ruby
+gem <%= theme_name.inspect %>
+```
+
+And add this line to your Jekyll site's `_config.yml`:
+
+```yaml
+theme: <%= theme_name %>
+```
+
+And then execute:
+
+    $ bundle
+
+Or install it yourself as:
+
+    $ gem install <%= theme_name %>
+
+## Usage
+
+TODO: Write usage instructions here. Describe your available layouts, includes, and/or sass.
+
+## Contributing
+
+Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/hello. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
+
+## Development
+
+To set up your environment to develop this theme, run `bundle install`.
+
+Your theme is setup just like a normal Jekyll site! To test your theme, run `bundle exec jekyll serve` and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme. Add pages, documents, data, etc. like normal to test your theme's contents. As you make modifications to your theme and to your content, your site will regenerate and you should see the changes in the browser after a refresh, just like normal.
+
+When your theme is released, only the files in `_layouts`, `_includes`, and `_sass` tracked with Git will be released.
+
+## License
+
+The theme is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/_layouts/default.html b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/_layouts/default.html
new file mode 100644
index 0000000..cddd070
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/_layouts/default.html
@@ -0,0 +1 @@
+{{ content }}
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/_layouts/page.html b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/_layouts/page.html
new file mode 100644
index 0000000..5e71126
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/_layouts/page.html
@@ -0,0 +1,5 @@
+---
+layout: default
+---
+
+{{ content }}
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/_layouts/post.html b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/_layouts/post.html
new file mode 100644
index 0000000..5e71126
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/_layouts/post.html
@@ -0,0 +1,5 @@
+---
+layout: default
+---
+
+{{ content }}
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/_config.yml.erb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/_config.yml.erb
new file mode 100644
index 0000000..82e8d42
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/_config.yml.erb
@@ -0,0 +1 @@
+theme: <%= theme_name %>
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/_post.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/_post.md
new file mode 100644
index 0000000..145b21d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/_post.md
@@ -0,0 +1,12 @@
+---
+layout: post
+---
+
+Eos eu docendi tractatos sapientem, brute option menandri in vix, quando vivendo accommodare te ius. Nec melius fastidii constituam id, viderer theophrastus ad sit, hinc semper periculis cum id. Noluisse postulant assentior est in, no choro sadipscing repudiandae vix. Vis in euismod delenit dignissim. Ex quod nostrum sit, suas decore animal id ius, nobis solet detracto quo te.
+
+{% comment %}
+Might you have an include in your theme? Why not try it here!
+{% include my-themes-great-include.html %}
+{% endcomment %}
+
+No laudem altera adolescens has, volumus lucilius eum no. Eam ei nulla audiam efficiantur. Suas affert per no, ei tale nibh sea. Sea ne magna harum, in denique scriptorem sea, cetero alienum tibique ei eos. Labores persequeris referrentur eos ei.
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/index.html b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/index.html
new file mode 100644
index 0000000..b688538
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/index.html
@@ -0,0 +1,14 @@
+---
+layout: page
+---
+
+Lorem ipsum dolor sit amet, quo id prima corrumpit pertinacia, id ius dolor dolores, an veri pertinax explicari mea. Agam solum et qui, his id ludus graeco adipiscing. Duis theophrastus nam in, at his vidisse atomorum. Tantas gloriatur scripserit ne eos. Est wisi tempor habemus at, ei graeco dissentiet eos. Ne usu aliquip sanctus conceptam, te vis ignota animal, modus latine contentiones ius te.
+
+{% for post in site.posts %}
+<h2><a href="{{ post.url }}">{{ post.title }}</a></h2>
+<blockquote>{{ post.excerpt }}</blockquote>
+{% endfor %}
+
+Te falli veritus sea, at molestiae scribentur deterruisset vix, et mea zril phaedrum vulputate. No cum dicit consulatu. Ut has nostro noluisse expetendis, te pro quaeque disputando, eu sed summo omnes. Eos at tale aperiam, usu cu propriae quaestio constituto, sed aperiam erroribus temporibus an.
+
+Quo eu liber mediocritatem, vix an delectus eleifend, iuvaret suscipit ei vel. Partem invenire per an, mea postulant dissentias eu, ius tantas audire nominavi eu. Dicunt tritani veritus ex vis, mei in case sententiae. At exerci democritum nam, cu lobortis iracundia mei. Alia eligendi consectetuer eu sed, paulo docendi noluisse sit ex.
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/style.scss b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/style.scss
new file mode 100644
index 0000000..7388f52
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/example/style.scss
@@ -0,0 +1,7 @@
+---
+---
+
+// Here, you can test out the Sass/SCSS that you include in your theme.
+// Simply `@import` the necessary file(s) to get the proper styles on the site.
+// E.g.:
+//   @import "a-file-from-my-theme";
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/gitignore.erb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/gitignore.erb
new file mode 100644
index 0000000..867d379
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/gitignore.erb
@@ -0,0 +1,5 @@
+*.gem
+.bundle
+.sass-cache
+_site
+Gemfile.lock
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/theme.gemspec.erb b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/theme.gemspec.erb
new file mode 100644
index 0000000..44c8feb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-3.5.2/lib/theme_template/theme.gemspec.erb
@@ -0,0 +1,19 @@
+# coding: utf-8
+
+Gem::Specification.new do |spec|
+  spec.name          = <%= theme_name.inspect %>
+  spec.version       = "0.1.0"
+  spec.authors       = [<%= user_name.inspect %>]
+  spec.email         = [<%= user_email.inspect %>]
+
+  spec.summary       = %q{TODO: Write a short summary, because Rubygems requires one.}
+  spec.homepage      = "TODO: Put your gem's website or public repo URL here."
+  spec.license       = "MIT"
+
+  spec.files         = `git ls-files -z`.split("\x0").select { |f| f.match(%r{^(<%= theme_directories.join("|") %>|LICENSE|README)}i) }
+
+  spec.add_runtime_dependency "jekyll", "~> <%= jekyll_version_with_minor %>"
+
+  spec.add_development_dependency "bundler", "~> 1.12"
+  spec.add_development_dependency "rake", "~> 10.0"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.gitignore b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.gitignore
new file mode 100644
index 0000000..73a290d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.gitignore
@@ -0,0 +1,20 @@
+/vendor
+/.bundle/
+/.yardoc
+/Gemfile.lock
+/_yardoc/
+/coverage/
+/doc/
+/pkg/
+/spec/reports/
+/tmp/
+*.bundle
+*.so
+*.o
+*.a
+mkmf.log
+*.gem
+Gemfile.lock
+spec/dest
+.bundle
+spec/fixtures/.jekyll-metadata
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.rspec b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.rspec
new file mode 100644
index 0000000..5f16476
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.rspec
@@ -0,0 +1,2 @@
+--color
+--format progress
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.rubocop.yml b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.rubocop.yml
new file mode 100644
index 0000000..22a5680
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.rubocop.yml
@@ -0,0 +1,29 @@
+inherit_gem:
+  jekyll: .rubocop.yml
+
+AllCops:
+  TargetRubyVersion: 2.0
+  Include:
+    - lib/*.rb
+
+  Exclude:
+    - .rubocop.yml
+    - .codeclimate.yml
+    - .travis.yml
+    - .gitignore
+    - .rspec
+
+    - Gemfile.lock
+    - CHANGELOG.md
+    - readme.md
+    - README.md
+    - Readme.md
+    - ReadMe.md
+    - COPYING
+    - LICENSE
+
+    - test/**/*
+    - vendor/**/*
+    - features/**/*
+    - script/**/*
+    - spec/**/*
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.travis.yml b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.travis.yml
new file mode 100644
index 0000000..1540c00
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/.travis.yml
@@ -0,0 +1,20 @@
+language: ruby
+rvm:
+- 2.2
+env:
+  global:
+  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
+cache: bundler
+sudo: false
+before_script: bundle update
+script: "./script/cibuild"
+notifications:
+  email: false
+deploy:
+  provider: rubygems
+  api_key:
+    secure: qz0q6ur0kGo03jjLdoAak6WcEAwxX2r9LG3DVrhOrcfoFipkuW+uwR0et4tpK8uFrz0P9y7eTIKOb0XCXeIsIXWj6R5benpRGr2U8m9A+tE/jxviBFUaxaokte0lqWiX1fEyhRmW3zvcdLQ47Vd2EwTNaq6ZmPulmEe9gS0rBQghyclakGlZ17LI7oGgiNL9SQ335Yqa1qJklTHYHbodWQ3Z07v7VN2jxqi3WH6NacT5gUGp5iCNCLLa8+jpKr4uONNIoy6/geAWdqtvgGUE8oTjIWDoJarrknJpqfx9Rd0KLDzkyneAigHDYPW60QtrE6GGpK/+TF1pF4DzdK2EgTWqGFnZf8ehfnxmtHVl2Xq/DPr6hS8Q/f+ut4ioMzBQxPD0hfh8/EOMYKsO8mOuOlYTiZXC7iuGyvFUOl2hnBgWA99t+I0NNB06qFp3ZxIjolEc3zjzc9f1a5HUXlEut5V8nqvCwbctNiTVpT8ZEWlsQlyRUnr9cIMUTEfLgQ+v6DnvAJBMO1EILq6liB5qfutjNhzhlREt7P/ZdppGsAzWpgt0q2PafqVoPe62WR3+/8Lj2ErMr034xSSqZVNcBS0mbdvW6k3jaABo1VJ4XuHm6/yDuemWzWb7kdG9/14+IIJMW1VuaWcmnCnB6gxjkCW3Dm2ftYiN7Rfn3AUz/nU=
+  gem: jekyll-feed
+  on:
+    tags: true
+    repo: jekyll/jekyll-feed
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/Gemfile b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/Gemfile
new file mode 100644
index 0000000..9df5048
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/Gemfile
@@ -0,0 +1,6 @@
+source 'https://rubygems.org'
+gemspec
+
+if ENV["JEKYLL_VERSION"]
+  gem "jekyll", "~> #{ENV["JEKYLL_VERSION"]}"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/History.markdown b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/History.markdown
new file mode 100644
index 0000000..e3622ca
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/History.markdown
@@ -0,0 +1,98 @@
+## HEAD
+
+### Documentation
+
+  * Use `https` in more places. (#165)
+
+### Minor Enhancements
+
+  * fix <entry> template for posts with post.lang defined (#168)
+
+## 0.9.1 / 2017-02-17
+
+### Minor Enhancements
+
+  * Update feed.xml (#162)
+
+## 0.9.0 / 2017-02-16
+
+### Minor Enhancements
+
+  * Use absolute_url to generate the feed_meta url (#150)
+  * Make feed stylesheet optional (#149)
+  * Use new `normalize_whitespace` filter (#143)
+  * Feed entries must contain <author> (#152)
+  * Remove trailing slash from feed ID (#159)
+
+### Development Fixes
+
+  * Simplify minify regular expression (#141)
+  * Namespace as JekyllFeed (#151)
+  * rubocop -a (#160)
+
+### Bug Fixes
+
+  * Filter out drafts before limit (#154)
+
+## 0.8.0 / 2016-10-06
+
+  * Use filters to clean up Liquid template (#134)
+
+### Minor Enhancements
+
+  * Don't set @site.config["time"] on feed generation (#138)
+
+### pedantry
+
+  * Appease Rubocop (#139)
+
+## 0.7.2 / 2016-10-06
+
+  * Support `image.path` when `post.image` is an object (#137)
+
+## 0.7.1 / 2016-09-26
+
+  * Assign `url_base` before first usage (#133)
+
+## 0.7.0 / 2016-09-06
+
+  * Use type="html" to skirt around double escaping problem (#127)
+
+## 0.6.0 / 2016-07-08
+
+  * Cleanup `post_author` logic (#113)
+  * Add XML stylesheet example with XSLT (#119)
+  * DRY up and add more doc (#120)
+  * Use smartify filter (#117)
+
+## 0.5.1 / 2016-04-18
+
+  * Fix mangling of whitespace when `site.lang` is set (#110)
+
+## 0.5.0 / 2016-04-13
+
+  * Consolidate regexps for stripping whitespace (#82)
+  * Only test against Jekyll 3 (#99)
+  * Think about how i18n might work (#75)
+  * Find author by reference (#106)
+  * Drop support for Jekyll 2 (#105)
+  * Add support for post image (#104)
+
+### Minor Enhancements
+
+  * Use Module#method_defined? (#83)
+  * Use site.title for meta tag if available (#100)
+
+### Development Fixes
+
+  * Do not require [**jekyll-last-modified-at**](https://github.com/gjtorikian/jekyll-last-modified-at) in tests (#87)
+  * Add Rubocop (#81)
+  * Correct typo in tests (#102)
+  * Simplify testing feed_meta tag (#101)
+  * Quiet known warnings in tests (#103)
+
+## 0.4.0 / 2015-12-30
+
+  * Feed uses `site.title`, or `site.name` if `title` doesn't exist (#72)
+  * Replace newlines with spaces in `title` and `summary` elements (#67)
+  * Properly render post content with Jekyll (#73)
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/LICENSE.txt b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/LICENSE.txt
new file mode 100644
index 0000000..2c17689
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2015 Ben Balter
+
+MIT License
+
+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/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/README.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/README.md
new file mode 100644
index 0000000..ed75c2b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/README.md
@@ -0,0 +1,139 @@
+# Jekyll Feed plugin
+
+A Jekyll plugin to generate an Atom (RSS-like) feed of your Jekyll posts
+
+[![Build Status](https://travis-ci.org/jekyll/jekyll-feed.svg)](https://travis-ci.org/jekyll/jekyll-feed) [![Gem Version](https://badge.fury.io/rb/jekyll-feed.svg)](https://badge.fury.io/rb/jekyll-feed)
+
+## Installation
+
+Add this line to your site's Gemfile:
+
+```ruby
+gem 'jekyll-feed'
+```
+
+And then add this line to your site's `_config.yml`:
+
+```yml
+gems:
+  - jekyll-feed
+```
+
+## Usage
+
+The plugin will automatically generate an Atom feed at `/feed.xml`.
+
+### Optional configuration options
+
+The plugin will automatically use any of the following configuration variables, if they are present in your site's `_config.yml` file.
+
+* `title` or `name` - The title of the site, e.g., "My awesome site"
+* `description` - A longer description of what your site is about, e.g., "Where I blog about Jekyll and other awesome things"
+* `url` - The URL to your site, e.g., `http://example.com`. If none is provided, the plugin will try to use `site.github.url`.
+* `author` - Global author information (see below)
+
+### Already have a feed path?
+
+Do you already have an existing feed someplace other than `/feed.xml`, but are on a host like GitHub Pages that doesn't support machine-friendly redirects? If you simply swap out `jekyll-feed` for your existing template, your existing subscribers won't continue to get updates. Instead, you can specify a non-default path via your site's config.
+
+```yml
+feed:
+  path: atom.xml
+```
+
+To note, you shouldn't have to do this unless you already have a feed you're using, and you can't or wish not to redirect existing subscribers.
+
+### Optional front matter
+
+The plugin will use the following post metadata, automatically generated by Jekyll, which you can override via a post's YAML front matter:
+
+* `date`
+* `title`
+* `excerpt`
+* `id`
+* `category`
+* `tags`
+
+Additionally, the plugin will use the following values, if present in a post's YAML front matter:
+
+* `image` - URL of an image that is representative of the post (can also be passed as `image.path`)
+
+* `author` - The author of the post, e.g., "Dr. Jekyll". If none is given, feed readers will look to the feed author as defined in `_config.yml`. Like the feed author, this can also be an object or a reference to an author in `_data/authors.yml` (see below).
+
+### Author information
+
+*TL;DR: In most cases, put `author: [your name]` in the document's front matter, for sites with multiple authors. If you need something more complicated, read on.*
+
+There are several ways to convey author-specific information. Author information is found in the following order of priority:
+
+1. An `author` object, in the documents's front matter, e.g.:
+
+  ```yml
+  author:
+    twitter: benbalter
+  ```
+
+2. An `author` object, in the site's `_config.yml`, e.g.:
+
+  ```yml
+  author:
+    twitter: benbalter
+  ```
+
+3. `site.data.authors[author]`, if an author is specified in the document's front matter, and a corresponding key exists in `site.data.authors`. E.g., you have the following in the document's front matter:
+
+  ```yml
+  author: benbalter
+  ```
+
+  And you have the following in `_data/authors.yml`:
+
+  ```yml
+  benbalter:
+    picture: /img/benbalter.png
+    twitter: jekyllrb
+
+  potus:
+    picture: /img/potus.png
+    twitter: whitehouse
+  ```
+
+  In the above example, the author `benbalter`'s Twitter handle will be resolved to `@jekyllrb`. This allows you to centralize author information in a single `_data/authors` file for site with many authors that require more than just the author's username.
+
+  *Pro-tip: If `authors` is present in the document's front matter as an array (and `author` is not), the plugin will use the first author listed.*
+
+4. An author in the document's front matter (the simplest way), e.g.:
+
+  ```yml
+  author: benbalter
+  ```
+
+5. An author in the site's `_config.yml`, e.g.:
+
+  ```yml
+  author: benbalter
+  ```
+
+### Meta tags
+
+The plugin exposes a helper tag to expose the appropriate meta tags to support automated discovery of your feed. Simply place `{% feed_meta %}` someplace in your template's `<head>` section, to output the necessary metadata.
+
+### SmartyPants
+
+The plugin uses [Jekyll's `smartify` filter](https://jekyllrb.com/docs/templates/) for processing the site title and post titles. This will translate plain ASCII punctuation into "smart" typographic punctuation. This will not render or strip any Markdown you may be using in a title.
+
+### Custom styling
+
+Want to style what your feed looks like in the browser? Simply add an XSLT at `/feed.xslt.xml` and Jekyll Feed will link to the stylesheet.
+
+## Why Atom, and not RSS?
+
+Great question. In short, Atom is a better format. Think of it like RSS 3.0. For more information, see [this discussion on why we chose Atom over RSS 2.0](https://github.com/jekyll/jekyll-rss-feed/issues/2).
+
+## Contributing
+
+1. Fork it (https://github.com/jekyll/jekyll-feed/fork)
+2. Create your feature branch (`git checkout -b my-new-feature`)
+3. Commit your changes (`git commit -am 'Add some feature'`)
+4. Push to the branch (`git push origin my-new-feature`)
+5. Create a new Pull Request
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/Rakefile b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/Rakefile
new file mode 100644
index 0000000..8754e40
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/Rakefile
@@ -0,0 +1,6 @@
+require "bundler/gem_tasks"
+require 'rspec/core/rake_task'
+
+RSpec::Core::RakeTask.new(:spec)
+
+task :default => :spec
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/jekyll-feed.gemspec b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/jekyll-feed.gemspec
new file mode 100644
index 0000000..b74dfd8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/jekyll-feed.gemspec
@@ -0,0 +1,25 @@
+# coding: utf-8
+
+Gem::Specification.new do |spec|
+  spec.name          = "jekyll-feed"
+  spec.version       = "0.9.2"
+  spec.authors       = ["Ben Balter"]
+  spec.email         = ["ben.balter@github.com"]
+  spec.summary       = "A Jekyll plugin to generate an Atom feed of your Jekyll posts"
+  spec.homepage      = "https://github.com/jekyll/jekyll-feed"
+  spec.license       = "MIT"
+
+  spec.files         = `git ls-files -z`.split("\x0")
+  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
+  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
+  spec.require_paths = ["lib"]
+
+  spec.add_dependency "jekyll", "~> 3.3"
+
+  spec.add_development_dependency "bundler", "~> 1.6"
+  spec.add_development_dependency "rake", "~> 10.0"
+  spec.add_development_dependency "rspec", "~> 3.0"
+  spec.add_development_dependency "typhoeus", "~> 0.7"
+  spec.add_development_dependency "nokogiri", "~> 1.6"
+  spec.add_development_dependency "rubocop"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed.rb
new file mode 100644
index 0000000..4413767
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed.rb
@@ -0,0 +1,10 @@
+require "jekyll"
+require "fileutils"
+require "jekyll-feed/generator"
+
+module JekyllFeed
+  autoload :MetaTag,          "jekyll-feed/meta-tag"
+  autoload :PageWithoutAFile, "jekyll-feed/page-without-a-file.rb"
+end
+
+Liquid::Template.register_tag "feed_meta", JekyllFeed::MetaTag
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/feed.xml b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/feed.xml
new file mode 100644
index 0000000..6f4770e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/feed.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+{% if page.xsl %}
+  <?xml-stylesheet type="text/xml" href="{{ '/feed.xslt.xml' | absolute_url }}"?>
+{% endif %}
+<feed xmlns="http://www.w3.org/2005/Atom" {% if site.lang %}xml:lang="{{ site.lang }}"{% endif %}>
+  <generator uri="https://jekyllrb.com/" version="{{ jekyll.version }}">Jekyll</generator>
+  <link href="{{ page.url | absolute_url }}" rel="self" type="application/atom+xml" />
+  <link href="{{ '/' | absolute_url }}" rel="alternate" type="text/html" {% if site.lang %}hreflang="{{ site.lang }}" {% endif %}/>
+  <updated>{{ site.time | date_to_xmlschema }}</updated>
+  <id>{{ '/' | absolute_url | xml_escape }}</id>
+
+  {% if site.title %}
+    <title type="html">{{ site.title | smartify | xml_escape }}</title>
+  {% elsif site.name %}
+    <title type="html">{{ site.name | smartify | xml_escape }}</title>
+  {% endif %}
+
+  {% if site.description %}
+    <subtitle>{{ site.description | xml_escape }}</subtitle>
+  {% endif %}
+
+  {% if site.author %}
+    <author>
+        <name>{{ site.author.name | default: site.author | xml_escape }}</name>
+      {% if site.author.email %}
+        <email>{{ site.author.email | xml_escape }}</email>
+      {% endif %}
+      {% if site.author.uri %}
+        <uri>{{ site.author.uri | xml_escape }}</uri>
+      {% endif %}
+    </author>
+  {% endif %}
+
+  {% assign posts = site.posts | where_exp: "post", "post.draft != true" %}
+  {% for post in posts limit: 10 %}
+    <entry{% if post.lang %}{{" "}}xml:lang="{{ post.lang }}"{% endif %}>
+      <title type="html">{{ post.title | smartify | strip_html | normalize_whitespace | xml_escape }}</title>
+      <link href="{{ post.url | absolute_url }}" rel="alternate" type="text/html" title="{{ post.title | xml_escape }}" />
+      <published>{{ post.date | date_to_xmlschema }}</published>
+      <updated>{{ post.last_modified_at | default: post.date | date_to_xmlschema }}</updated>
+      <id>{{ post.id | absolute_url | xml_escape }}</id>
+      <content type="html" xml:base="{{ post.url | absolute_url | xml_escape }}">{{ post.content | strip | xml_escape }}</content>
+
+      {% assign post_author = post.author | default: post.authors[0] | default: site.author %}
+      {% assign post_author = site.data.authors[post_author] | default: post_author %}
+      {% assign post_author_email = post_author.email | default: nil %}
+      {% assign post_author_uri = post_author.uri | default: nil %}
+      {% assign post_author_name = post_author.name | default: post_author %}
+
+      <author>
+          <name>{{ post_author_name | default: "" | xml_escape }}</name>
+        {% if post_author_email %}
+          <email>{{ post_author_email | xml_escape }}</email>
+        {% endif %}
+        {% if post_author_uri %}
+          <uri>{{ post_author_uri | xml_escape }}</uri>
+        {% endif %}
+      </author>
+
+      {% if post.category %}
+        <category term="{{ post.category | xml_escape }}" />
+      {% endif %}
+
+      {% for tag in post.tags %}
+        <category term="{{ tag | xml_escape }}" />
+      {% endfor %}
+
+      {% if post.excerpt and post.excerpt != empty %}
+        <summary type="html">{{ post.excerpt | strip_html | normalize_whitespace | xml_escape }}</summary>
+      {% endif %}
+
+      {% assign post_image = post.image.path | default: post.image %}
+      {% if post_image %}
+        {% unless post_image contains "://" %}
+          {% assign post_image = post_image | absolute_url | xml_escape  %}
+        {% endunless %}
+        <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="{{ post_image }}" />
+      {% endif %}
+    </entry>
+  {% endfor %}
+</feed>
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/generator.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/generator.rb
new file mode 100644
index 0000000..0ff34ed
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/generator.rb
@@ -0,0 +1,55 @@
+module JekyllFeed
+  class Generator < Jekyll::Generator
+    safe true
+    priority :lowest
+
+    # Main plugin action, called by Jekyll-core
+    def generate(site)
+      @site = site
+      return if file_exists?(feed_path)
+      @site.pages << content_for_file(feed_path, feed_source_path)
+    end
+
+    private
+
+    # Matches all whitespace that follows
+    #   1. A '>', which closes an XML tag or
+    #   2. A '}', which closes a Liquid tag
+    # We will strip all of this whitespace to minify the template
+    MINIFY_REGEX = %r!(?<=>|})\s+!
+
+    # Path to feed from config, or feed.xml for default
+    def feed_path
+      if @site.config["feed"] && @site.config["feed"]["path"]
+        @site.config["feed"]["path"]
+      else
+        "feed.xml"
+      end
+    end
+
+    # Path to feed.xml template file
+    def feed_source_path
+      File.expand_path "./feed.xml", File.dirname(__FILE__)
+    end
+
+    # Checks if a file already exists in the site source
+    def file_exists?(file_path)
+      if @site.respond_to?(:in_source_dir)
+        File.exist? @site.in_source_dir(file_path)
+      else
+        File.exist? Jekyll.sanitized_path(@site.source, file_path)
+      end
+    end
+
+    # Generates contents for a file
+    def content_for_file(file_path, file_source_path)
+      file = PageWithoutAFile.new(@site, File.dirname(__FILE__), "", file_path)
+      file.content = File.read(file_source_path).gsub(MINIFY_REGEX, "")
+      file.data["layout"] = nil
+      file.data["sitemap"] = false
+      file.data["xsl"] = file_exists?("feed.xslt.xml")
+      file.output
+      file
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/meta-tag.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/meta-tag.rb
new file mode 100644
index 0000000..9769b7d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/meta-tag.rb
@@ -0,0 +1,39 @@
+module JekyllFeed
+  class MetaTag < Liquid::Tag
+    # Use Jekyll's native relative_url filter
+    include Jekyll::Filters::URLFilters
+
+    def render(context)
+      @context = context
+      attrs    = attributes.map { |k, v| %(#{k}="#{v}") }.join(" ")
+      "<link #{attrs} />"
+    end
+
+    private
+
+    def config
+      @context.registers[:site].config
+    end
+
+    def attributes
+      {
+        :type  => "application/atom+xml",
+        :rel   => "alternate",
+        :href  => absolute_url(path),
+        :title => title,
+      }.keep_if { |_, v| v }
+    end
+
+    def path
+      if config["feed"] && config["feed"]["path"]
+        config["feed"]["path"]
+      else
+        "feed.xml"
+      end
+    end
+
+    def title
+      config["title"] || config["name"]
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/page-without-a-file.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/page-without-a-file.rb
new file mode 100644
index 0000000..27556b9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/page-without-a-file.rb
@@ -0,0 +1,7 @@
+module JekyllFeed
+  class PageWithoutAFile < Jekyll::Page
+    def read_yaml(*)
+      @data ||= {}
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/script/bootstrap b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/script/bootstrap
new file mode 100755
index 0000000..8a09d8a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/script/bootstrap
@@ -0,0 +1,3 @@
+#! /bin/bash
+
+bundle install
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/script/cibuild b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/script/cibuild
new file mode 100755
index 0000000..5b4c0f3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/script/cibuild
@@ -0,0 +1,7 @@
+#! /bin/bash
+
+set -e
+
+bundle exec rspec
+bundle exec rubocop -S -D
+bundle exec rake build
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/script/release b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/script/release
new file mode 100755
index 0000000..a9c226f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/script/release
@@ -0,0 +1,7 @@
+#!/bin/sh
+# Tag and push a release.
+
+set -e
+
+script/cibuild
+bundle exec rake release
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_config.yml b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_config.yml
new file mode 100644
index 0000000..32bccc5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_config.yml
@@ -0,0 +1,9 @@
+timezone: UTC
+
+defaults:
+  -
+    scope:
+      path: ""
+      type: page
+    values:
+      layout: some_default
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_data/authors.yml b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_data/authors.yml
new file mode 100644
index 0000000..78a6ff9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_data/authors.yml
@@ -0,0 +1,5 @@
+garthdb:
+  name: Garth
+  twitter: garthdb
+  uri: "http://garthdb.com"
+  email: example@mail.com
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_drafts/2015-01-12-a-draft.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_drafts/2015-01-12-a-draft.md
new file mode 100644
index 0000000..bf78910
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_drafts/2015-01-12-a-draft.md
@@ -0,0 +1,4 @@
+---
+---
+
+This is a draft.
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_layouts/some_default.html b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_layouts/some_default.html
new file mode 100644
index 0000000..6041172
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_layouts/some_default.html
@@ -0,0 +1,11 @@
+---
+---
+<html>
+  <head>
+    {% feed_meta %}
+  </head>
+  <body>
+THIS IS MY LAYOUT
+{{ content }}
+  </body>
+</html>
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2013-12-12-dec-the-second.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2013-12-12-dec-the-second.md
new file mode 100644
index 0000000..22604a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2013-12-12-dec-the-second.md
@@ -0,0 +1,6 @@
+---
+excerpt: "Foo"
+image: "/image.png"
+---
+
+# December the twelfth, actually.
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-02-march-the-second.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-02-march-the-second.md
new file mode 100644
index 0000000..76a8fc9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-02-march-the-second.md
@@ -0,0 +1,5 @@
+---
+image: "https://cdn.example.org/absolute.png"
+---
+
+March the second!
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-04-march-the-fourth.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-04-march-the-fourth.md
new file mode 100644
index 0000000..216c372
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-04-march-the-fourth.md
@@ -0,0 +1,8 @@
+---
+tags:
+ - '"/><VADER>'
+image:
+  path: "/object-image.png"
+---
+
+March the fourth!
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md
new file mode 100644
index 0000000..f032a1b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md
@@ -0,0 +1,5 @@
+---
+last_modified_at: 2015-05-12T13:27:59+00:00
+---
+
+Please don't modify this file. It's modified time is important.
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-02-12-strip-newlines.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-02-12-strip-newlines.md
new file mode 100644
index 0000000..7d7a373
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-02-12-strip-newlines.md
@@ -0,0 +1,6 @@
+---
+title:
+    The plugin
+    will properly
+    strip newlines.
+---
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-liquid.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-liquid.md
new file mode 100644
index 0000000..81aaeae
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-liquid.md
@@ -0,0 +1,7 @@
+---
+---
+
+{% capture liquidstring %}
+Liquid is not rendered.
+{% endcapture %}
+{{ liquidstring | replace:'not ','' }}
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-pre.html b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-pre.html
new file mode 100644
index 0000000..42b54b5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-pre.html
@@ -0,0 +1,8 @@
+---
+author: Pat
+lang: en
+---
+
+<pre>Line 1
+Line 2
+Line 3</pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-18-author-detail.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-18-author-detail.md
new file mode 100644
index 0000000..c4c42bd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-18-author-detail.md
@@ -0,0 +1,9 @@
+---
+excerpt: ""
+author:
+  name: Ben
+  uri: "http://ben.balter.com"
+  email: ben@example.com
+---
+
+# December the twelfth, actually.
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html
new file mode 100644
index 0000000..a845151
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html
@@ -0,0 +1,2 @@
+---
+---
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2016-04-25-author-reference.md b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2016-04-25-author-reference.md
new file mode 100644
index 0000000..f9a0f0c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2016-04-25-author-reference.md
@@ -0,0 +1,6 @@
+---
+excerpt: ""
+author: garthdb
+---
+
+# April the twenty-fifth?
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/feed.xslt.xml b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/feed.xslt.xml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/fixtures/feed.xslt.xml
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/jekyll-feed_spec.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/jekyll-feed_spec.rb
new file mode 100644
index 0000000..98ae904
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/jekyll-feed_spec.rb
@@ -0,0 +1,285 @@
+require 'spec_helper'
+
+describe(JekyllFeed) do
+  let(:overrides) { Hash.new }
+  let(:config) do
+    Jekyll.configuration(Jekyll::Utils.deep_merge_hashes({
+      "full_rebuild" => true,
+      "source"      => source_dir,
+      "destination" => dest_dir,
+      "show_drafts" => true,
+      "url"         => "http://example.org",
+      "name"       => "My awesome site",
+      "author"      => {
+        "name"        => "Dr. Jekyll"
+      },
+      "collections" => {
+        "my_collection" => { "output" => true },
+        "other_things"  => { "output" => false }
+      }
+    }, overrides))
+  end
+  let(:site)     { Jekyll::Site.new(config) }
+  let(:contents) { File.read(dest_dir("feed.xml")) }
+  let(:context)  { make_context(site: site) }
+  let(:feed_meta) { Liquid::Template.parse("{% feed_meta %}").render!(context, {}) }
+  before(:each) do
+    site.process
+  end
+
+  it "has no layout" do
+    expect(contents).not_to match(/\ATHIS IS MY LAYOUT/)
+  end
+
+  it "creates a feed.xml file" do
+    expect(Pathname.new(dest_dir("feed.xml"))).to exist
+  end
+
+
+  it "doesn't have multiple new lines or trailing whitespace" do
+    expect(contents).to_not match /\s+\n/
+    expect(contents).to_not match /\n{2,}/
+  end
+
+  it "puts all the posts in the feed.xml file" do
+    expect(contents).to match /http:\/\/example\.org\/2014\/03\/04\/march-the-fourth\.html/
+    expect(contents).to match /http:\/\/example\.org\/2014\/03\/02\/march-the-second\.html/
+    expect(contents).to match /http:\/\/example\.org\/2013\/12\/12\/dec-the-second\.html/
+    expect(contents).to match "http://example.org/2015/08/08/stuck-in-the-middle.html"
+    expect(contents).to_not match /http:\/\/example\.org\/2016\/02\/09\/a-draft\.html/
+  end
+
+  it "does not include assets or any static files that aren't .html" do
+    expect(contents).not_to match /http:\/\/example\.org\/images\/hubot\.png/
+    expect(contents).not_to match /http:\/\/example\.org\/feeds\/atom\.xml/
+  end
+
+  it "preserves linebreaks in preformatted text in posts" do
+    expect(contents).to match /Line 1\nLine 2\nLine 3/
+  end
+
+  it "supports post author name as an object" do
+    expect(contents).to match /<author>\s*<name>Ben<\/name>\s*<email>ben@example.com<\/email>\s*<uri>http:\/\/ben.balter.com<\/uri>\s*<\/author>/
+  end
+
+  it "supports post author name as a string" do
+    expect(contents).to match /<author>\s*<name>Pat<\/name>\s*<\/author>/
+  end
+
+  it "does not output author tag no author is provided" do
+    expect(contents).not_to match /<author>\s*<name><\/name>\s*<\/author>/
+  end
+
+  it "does use author reference with data from _data/authors.yml" do
+    expect(contents).to match /<author>\s*<name>Garth<\/name>\s*<email>example@mail.com<\/email>\s*<uri>http:\/\/garthdb.com<\/uri>\s*<\/author>/
+  end
+
+  it "converts markdown posts to HTML" do
+    expect(contents).to match /&lt;p&gt;March the second!&lt;\/p&gt;/
+  end
+
+  it "uses last_modified_at where available" do
+    expect(contents).to match /<updated>2015-05-12T13:27:59\+00:00<\/updated>/
+  end
+
+  it "replaces newlines in posts to spaces" do
+    expect(contents).to match %r!<title type="html">The plugin will properly strip newlines.</title>!
+  end
+
+  it "renders Liquid inside posts" do
+    expect(contents).to match /Liquid is rendered\./
+    expect(contents).not_to match /Liquid is not rendered\./
+  end
+
+  it "includes the item image" do
+    expect(contents).to include('<media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://example.org/image.png" />')
+    expect(contents).to include('<media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://cdn.example.org/absolute.png" />')
+    expect(contents).to include('<media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://example.org/object-image.png" />')
+  end
+
+  context "parsing" do
+    let(:feed) { RSS::Parser.parse(contents) }
+
+    it "outputs an RSS feed" do
+      expect(feed.feed_type).to eql("atom")
+      expect(feed.feed_version).to eql("1.0")
+      expect(feed.encoding).to eql("UTF-8")
+    end
+
+    it "outputs the link" do
+      expect(feed.link.href).to eql("http://example.org/feed.xml")
+    end
+
+    it "outputs the generator" do
+      expect(feed.generator.content).to eql("Jekyll")
+      expect(feed.generator.version).to eql(Jekyll::VERSION)
+    end
+
+    it "includes the items" do
+      expect(feed.items.count).to eql(10)
+    end
+
+    it "includes item contents" do
+      post = feed.items.last
+      expect(post.title.content).to eql("Dec The Second")
+      expect(post.link.href).to eql("http://example.org/2013/12/12/dec-the-second.html")
+      expect(post.published.content).to eql(Time.parse("2013-12-12"))
+    end
+
+    it "includes the item's excerpt" do
+      post = feed.items.last
+      expect(post.summary.content).to eql("Foo")
+    end
+
+    it "doesn't include the item's excerpt if blank" do
+      post = feed.items.first
+      expect(post.summary).to be_nil
+    end
+
+    context "with site.title set" do
+      let(:site_title) { "My Site Title" }
+      let(:overrides) { {"title" => site_title} }
+
+      it "uses site.title for the title" do
+        expect(feed.title.content).to eql(site_title)
+      end
+    end
+
+    context "with site.name set" do
+      let(:site_name) { "My Site Name" }
+      let(:overrides) { {"name" => site_name} }
+
+      it "uses site.name for the title" do
+        expect(feed.title.content).to eql(site_name)
+      end
+    end
+
+    context "with site.name and site.title set" do
+      let(:site_title) { "My Site Title" }
+      let(:site_name) { "My Site Name" }
+      let(:overrides) { {"title" => site_title, "name" => site_name} }
+
+      it "uses site.title for the title, dropping site.name" do
+        expect(feed.title.content).to eql(site_title)
+      end
+    end
+  end
+
+  context "smartify" do
+    let(:site_title) { "Pat's Site" }
+    let(:overrides) { { "title" => site_title } }
+    let(:feed) { RSS::Parser.parse(contents) }
+
+    it "processes site title with SmartyPants" do
+      expect(feed.title.content).to eql("Pat’s Site")
+    end
+  end
+
+  context "validation" do
+    it "validates" do
+      # See https://validator.w3.org/docs/api.html
+      url = "https://validator.w3.org/feed/check.cgi?output=soap12"
+      response = Typhoeus.post(url, body: { rawdata: contents }, accept_encoding: "gzip")
+      pending "Something went wrong with the W3 validator" unless response.success?
+      result  = Nokogiri::XML(response.body)
+      result.remove_namespaces!
+
+      result.css("warning").each do |warning|
+        # Quiet a warning that results from us passing the feed as a string
+        next if warning.css("text").text =~ /Self reference doesn't match document location/
+
+        # Quiet expected warning that results from blank summary test case
+        next if warning.css("text").text =~ /(content|summary) should not be blank/
+
+        # Quiet expected warning about multiple posts with same updated time
+        next if warning.css("text").text =~ /Two entries with the same value for atom:updated/
+
+        warn "Validation warning: #{warning.css("text").text} on line #{warning.css("line").text} column #{warning.css("column").text}"
+      end
+
+      errors = result.css("error").map do |error|
+        "Validation error: #{error.css("text").text} on line #{error.css("line").text} column #{error.css("column").text}"
+      end
+
+      expect(result.css("validity").text).to eql("true"), errors.join("\n")
+    end
+  end
+
+  context "with a baseurl" do
+    let(:overrides) do
+      { "baseurl" => "/bass" }
+    end
+
+    it "correctly adds the baseurl to the posts" do
+      expect(contents).to match /http:\/\/example\.org\/bass\/2014\/03\/04\/march-the-fourth\.html/
+      expect(contents).to match /http:\/\/example\.org\/bass\/2014\/03\/02\/march-the-second\.html/
+      expect(contents).to match /http:\/\/example\.org\/bass\/2013\/12\/12\/dec-the-second\.html/
+    end
+
+    it "renders the feed meta" do
+      expected = 'href="http://example.org/bass/feed.xml"'
+      expect(feed_meta).to include(expected)
+    end
+  end
+
+  context "feed meta" do
+    it "renders the feed meta" do
+      expected = '<link type="application/atom+xml" rel="alternate" href="http://example.org/feed.xml" title="My awesome site" />'
+      expect(feed_meta).to eql(expected)
+    end
+
+    context "with a blank site name" do
+      let(:config) do
+        Jekyll.configuration({
+          "source"      => source_dir,
+          "destination" => dest_dir,
+          "url"         => "http://example.org"
+        })
+      end
+
+      it "does not output blank title" do
+        expect(feed_meta).not_to include('title=')
+      end
+    end
+  end
+
+  context "changing the feed path" do
+    let(:overrides) do
+      {
+        "feed" => {
+          "path" => "atom.xml"
+        }
+      }
+    end
+
+    it "should write to atom.xml" do
+      expect(Pathname.new(dest_dir("atom.xml"))).to exist
+    end
+
+    it "renders the feed meta with custom feed path" do
+      expected = 'href="http://example.org/atom.xml"'
+      expect(feed_meta).to include(expected)
+    end
+  end
+
+  context "feed stylesheet" do
+    it "includes the stylesheet" do
+      expect(contents).to include('<?xml-stylesheet type="text/xml" href="http://example.org/feed.xslt.xml"?>')
+    end
+  end
+
+  context "with site.lang set" do
+    let(:overrides) { { "lang" => "en-US" } }
+
+    it "should set the language" do
+      expect(contents).to match %r{type="text/html" hreflang="en-US" />}
+    end
+  end
+
+  context "with post.lang set"do
+    it "should set the language for that entry" do
+      expect(contents).to match %r{<entry xml:lang="en">}
+      expect(contents).to match %r{<entry>}
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/spec_helper.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/spec_helper.rb
new file mode 100644
index 0000000..b926bd7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-feed-0.9.2/spec/spec_helper.rb
@@ -0,0 +1,28 @@
+require 'jekyll'
+require 'typhoeus'
+require 'nokogiri'
+require 'rss'
+require File.expand_path('../lib/jekyll-feed', File.dirname(__FILE__))
+
+Jekyll.logger.log_level = :error
+
+RSpec.configure do |config|
+  config.run_all_when_everything_filtered = true
+  config.filter_run :focus
+  config.order = 'random'
+
+  SOURCE_DIR = File.expand_path("../fixtures", __FILE__)
+  DEST_DIR   = File.expand_path("../dest",     __FILE__)
+
+  def source_dir(*files)
+    File.join(SOURCE_DIR, *files)
+  end
+
+  def dest_dir(*files)
+    File.join(DEST_DIR, *files)
+  end
+
+  def make_context(registers = {})
+    Liquid::Context.new({}, {}, { site: site }.merge(registers))
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll-sass-converter.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll-sass-converter.rb
new file mode 100644
index 0000000..4e51c67
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll-sass-converter.rb
@@ -0,0 +1,6 @@
+require "jekyll-sass-converter/version"
+require "jekyll/converters/scss"
+require "jekyll/converters/sass"
+
+module JekyllSassConverter
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll-sass-converter/version.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll-sass-converter/version.rb
new file mode 100644
index 0000000..8fdff68
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll-sass-converter/version.rb
@@ -0,0 +1,3 @@
+module JekyllSassConverter
+  VERSION = "1.5.0"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll/converters/sass.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll/converters/sass.rb
new file mode 100644
index 0000000..815fbaa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll/converters/sass.rb
@@ -0,0 +1,20 @@
+require 'sass'
+require 'jekyll/utils'
+require 'jekyll/converters/scss'
+
+module Jekyll
+  module Converters
+    class Sass < Scss
+      safe true
+      priority :low
+
+      def matches(ext)
+        ext =~ /^\.sass$/i
+      end
+
+      def syntax
+        :sass
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll/converters/scss.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll/converters/scss.rb
new file mode 100644
index 0000000..98d3c95
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-sass-converter-1.5.0/lib/jekyll/converters/scss.rb
@@ -0,0 +1,132 @@
+# encoding: utf-8
+
+require 'sass'
+require 'jekyll/utils'
+
+module Jekyll
+  module Converters
+    class Scss < Converter
+      BYTE_ORDER_MARK = /^\xEF\xBB\xBF/
+      SyntaxError = Class.new(ArgumentError)
+
+      safe true
+      priority :low
+
+      ALLOWED_STYLES = %w(nested expanded compact compressed).freeze
+
+      def matches(ext)
+        ext =~ /^\.scss$/i
+      end
+
+      def output_ext(ext)
+        ".css"
+      end
+
+      def safe?
+        !!@config["safe"]
+      end
+
+      def jekyll_sass_configuration
+        options = @config["sass"] || {}
+        unless options["style"].nil?
+          options["style"] = options["style"].to_s.gsub(/\A:/, '').to_sym
+        end
+        options
+      end
+
+      def sass_build_configuration_options(overrides)
+        if safe?
+          {
+            :load_paths => sass_load_paths,
+            :syntax     => syntax,
+            :style      => sass_style,
+            :cache      => false
+          }
+        else
+          Jekyll::Utils.symbolize_hash_keys(
+            Jekyll::Utils.deep_merge_hashes(
+              jekyll_sass_configuration,
+              overrides
+            )
+          )
+        end
+      end
+
+      def syntax
+        :scss
+      end
+
+      def sass_dir
+        return "_sass" if jekyll_sass_configuration["sass_dir"].to_s.empty?
+        jekyll_sass_configuration["sass_dir"]
+      end
+
+      def sass_style
+        style = jekyll_sass_configuration.fetch("style", :compact)
+        ALLOWED_STYLES.include?(style.to_s) ? style.to_sym : :compact
+      end
+
+      def user_sass_load_paths
+        Array(jekyll_sass_configuration["load_paths"])
+      end
+
+      def sass_dir_relative_to_site_source
+        Jekyll.sanitized_path(site_source, sass_dir)
+      end
+
+      def sass_load_paths
+        paths = user_sass_load_paths + [sass_dir_relative_to_site_source]
+
+        if safe?
+          # Sanitize paths to prevent any attack vectors (.e.g. `/**/*`)
+          paths.map! { |path| Jekyll.sanitized_path(site_source, path) }
+        end
+
+        # Expand file globs (e.g. `node_modules/*/node_modules` )
+        Dir.chdir(site_source) do
+          paths = paths.map { |path| Dir.glob(path) }.flatten.uniq
+
+          paths.map! do |path|
+            if safe?
+              # Sanitize again in case globbing was able to do something crazy.
+              Jekyll.sanitized_path(site_source, path)
+            else
+              File.expand_path(path)
+            end
+          end
+        end
+
+        paths.select { |path| File.directory?(path) }
+      end
+
+      def allow_caching?
+        !safe?
+      end
+
+      def add_charset?
+        !!jekyll_sass_configuration["add_charset"]
+      end
+
+      def sass_configs
+        sass_build_configuration_options({
+          "syntax"     => syntax,
+          "cache"      => allow_caching?,
+          "load_paths" => sass_load_paths
+        })
+      end
+
+      def convert(content)
+        output = ::Sass.compile(content, sass_configs)
+        replacement = add_charset? ? '@charset "UTF-8";' : ''
+        output.sub(BYTE_ORDER_MARK, replacement)
+      rescue ::Sass::SyntaxError => e
+        raise SyntaxError.new("#{e.to_s} on line #{e.sass_line}")
+      end
+
+      private
+      def site_source
+        @site_source ||= File.expand_path(@config["source"]).freeze
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-watch-1.5.0/lib/jekyll-watch.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-watch-1.5.0/lib/jekyll-watch.rb
new file mode 100644
index 0000000..e6c85f1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-watch-1.5.0/lib/jekyll-watch.rb
@@ -0,0 +1,2 @@
+require_relative "jekyll/watcher"
+require_relative "jekyll/commands/watch"
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-watch-1.5.0/lib/jekyll/commands/watch.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-watch-1.5.0/lib/jekyll/commands/watch.rb
new file mode 100644
index 0000000..361d8a5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-watch-1.5.0/lib/jekyll/commands/watch.rb
@@ -0,0 +1,28 @@
+module Jekyll
+  module Commands
+    module Watch
+      extend self
+
+      def init_with_program(prog)
+      end
+
+      # Build your jekyll site
+      # Continuously watch if `watch` is set to true in the config.
+      def process(options)
+        Jekyll.logger.log_level = :error if options['quiet']
+        watch(site, options) if options['watch']
+      end
+
+      # Watch for file changes and rebuild the site.
+      #
+      # site - A Jekyll::Site instance
+      # options - A Hash of options passed to the command
+      #
+      # Returns nothing.
+      def watch(_site, options)
+        Jekyll::Watcher.watch(options)
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/jekyll-watch-1.5.0/lib/jekyll/watcher.rb b/vendor/bundle/ruby/2.4.0/gems/jekyll-watch-1.5.0/lib/jekyll/watcher.rb
new file mode 100644
index 0000000..2f3fb16
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/jekyll-watch-1.5.0/lib/jekyll/watcher.rb
@@ -0,0 +1,116 @@
+require 'listen'
+
+module Jekyll
+  module Watcher
+    extend self
+
+    # Public: Continuously watch for file changes and rebuild the site
+    # whenever a change is detected.
+    #
+    # If the optional site argument is populated, that site instance will be
+    # reused and the options Hash ignored. Otherwise, a new site instance will
+    # be instantiated from the options Hash and used.
+    #
+    # options - A Hash containing the site configuration
+    # site    - The current site instance (populated starting with Jekyll 3.2)
+    #           (optional, default: nil)
+    #
+    # Returns nothing.
+    def watch(options, site = nil)
+      ENV["LISTEN_GEM_DEBUGGING"] ||= "1" if options['verbose']
+
+      site ||= Jekyll::Site.new(options)
+      listener = build_listener(site, options)
+      listener.start
+
+      Jekyll.logger.info "Auto-regeneration:", "enabled for '#{options["source"]}'"
+
+      unless options['serving']
+        trap("INT") do
+          listener.stop
+          puts "     Halting auto-regeneration."
+          exit 0
+        end
+
+        sleep_forever
+      end
+    rescue ThreadError
+      # You pressed Ctrl-C, oh my!
+    end
+
+    # TODO: shouldn't be public API
+    def build_listener(site, options)
+      Listen.to(
+        options['source'],
+        :ignore => listen_ignore_paths(options),
+        :force_polling => options['force_polling'],
+        &(listen_handler(site))
+      )
+    end
+
+    def listen_handler(site)
+      proc do |modified, added, removed|
+        t = Time.now
+        c = modified + added + removed
+        n = c.length
+        print Jekyll.logger.message("Regenerating:",
+          "#{n} file(s) changed at #{t.strftime("%Y-%m-%d %H:%M:%S")} ")
+        begin
+          site.process
+          puts "...done in #{Time.now - t} seconds."
+        rescue => e
+          puts "...error:"
+          Jekyll.logger.warn "Error:", e.message
+          Jekyll.logger.warn "Error:", "Run jekyll build --trace for more information."
+        end
+      end
+    end
+
+    def custom_excludes(options)
+      Array(options['exclude']).map { |e| Jekyll.sanitized_path(options['source'], e) }
+    end
+
+    def config_files(options)
+      %w(yml yaml toml).map do |ext|
+        Jekyll.sanitized_path(options['source'], "_config.#{ext}")
+      end
+    end
+
+    def to_exclude(options)
+      [
+        config_files(options),
+        options['destination'],
+        custom_excludes(options)
+      ].flatten
+    end
+
+    # Paths to ignore for the watch option
+    #
+    # options - A Hash of options passed to the command
+    #
+    # Returns a list of relative paths from source that should be ignored
+    def listen_ignore_paths(options)
+      source       = Pathname.new(options['source']).expand_path
+      paths        = to_exclude(options)
+
+      paths.map do |p|
+        absolute_path = Pathname.new(p).expand_path
+        next unless absolute_path.exist?
+        begin
+          relative_path = absolute_path.relative_path_from(source).to_s
+          unless relative_path.start_with?('../')
+            path_to_ignore = Regexp.new(Regexp.escape(relative_path))
+            Jekyll.logger.debug "Watcher:", "Ignoring #{path_to_ignore}"
+            path_to_ignore
+          end
+        rescue ArgumentError
+          # Could not find a relative path
+        end
+      end.compact + [/\.jekyll\-metadata/]
+    end
+
+    def sleep_forever
+      loop { sleep 1000 }
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/AUTHORS b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/AUTHORS
new file mode 100644
index 0000000..0583596
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/AUTHORS
@@ -0,0 +1 @@
+The author of kramdown is Thomas Leitner <t_leitner@gmx.at>.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/CONTRIBUTERS b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/CONTRIBUTERS
new file mode 100644
index 0000000..2ee3887
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/CONTRIBUTERS
@@ -0,0 +1,54 @@
+  Count Name
+======= ====
+    847 Thomas Leitner <t_leitner@gmx.at>
+      6 Gioele Barabucci <gioele@svario.it>
+      4 Ted Pak <powerpak006@gmail.com>
+      4 Shuanglei Tao <tsl0922@gmail.com>
+      4 Arne Brasseur <arne@arnebrasseur.net>
+      3 Henning Perl <perl@fast-sicher.de>
+      3 gettalong <t_leitner@gmx.at>
+      3 Brandur <brandur@mutelight.org>
+      3 Ben Armston <ben.armston@googlemail.com>
+      3 Alex Marandon <contact@alexmarandon.com>
+      2 Tom Thorogood <me+github@tomthorogood.co.uk>
+      2 Parker Moore <parkrmoore@gmail.com>
+      2 Nathanael Jones <nathanael.jones@gmail.com>
+      2 Max Meyer <dev@fedux.org>
+      2 Jo Hund <jhund@clearcove.ca>
+      2 Bran <m.versum@gmail.com>
+      1 winniehell <git@winniehell.de>
+      1 William <suttonwilliamd@gmail.com>
+      1 utenmiki <utenmiki@gmail.com>
+      1 Trevor Wennblom <trevor@well.com>
+      1 tomykaira <tomykaira@gmail.com>
+      1 Tim Blair <tim@bla.ir>
+      1 Tim Besard <tim.besard@gmail.com>
+      1 Tim Bates <tim@rumpuslabs.com>
+      1 Sun Yaozhu <yzyzsun@gmail.com>
+      1 Simon Lydell <simon.lydell@gmail.com>
+      1 Shusaku NAKAZATO <cu393uc@gmail.com>
+      1 Sebastian Boehm <sebastian@sometimesfood.org>
+      1 Postmodern <postmodern.mod3@gmail.com>
+      1 Pete Michaud <michaudp@gmail.com>
+      1 myqlarson <myqlarson@gmail.com>
+      1 Michal Till <michal.till@gmail.com>
+      1 Matt Hickford <matt.hickford@gmail.com>
+      1 Martyn Chamberlin <martyn@perfectioncoding.com>
+      1 Marek Tuchowski <marek@tuchowski.com.pl>
+      1 Marcus Stollsteimer <sto.mar@web.de>
+      1 Luca Barbato <luca.barbato@gmail.com>
+      1 l3kn <hello@l3kn.de>
+      1 Jonathan Hooper <jonathan.hooper@gsa.gov>
+      1 John Croisant <jacius@gmail.com>
+      1 Joe Fiorini <joe@faithfulgeek.org>
+      1 Jens Kraemer <jk@jkraemer.net>
+      1 Hirofumi Wakasugi <baenej@gmail.com>
+      1 Hector Correa <hector@hectorcorrea.com>
+      1 Florian Klampfer <f.klampfer@gmail.com>
+      1 Floreal Morandat florealm@gmail.com <florealm@gmail.com>
+      1 Diego Galeota <diegobg123@gmail.com>
+      1 Damien Pollet <damien.pollet@gmail.com>
+      1 Christopher Jefferson <caj21@st-andrews.ac.uk>
+      1 Cédric Boutillier <cedric.boutillier@gmail.com>
+      1 Alex Tomlins <alex.tomlins@digital.cabinet-office.gov.uk>
+      1 Alexey Vasiliev <le0pard@users.noreply.github.com>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/COPYING b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/COPYING
new file mode 100644
index 0000000..1c29282
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/COPYING
@@ -0,0 +1,30 @@
+kramdown - fast, pure-Ruby Markdown-superset converter
+Copyright (C) 2009-2013 Thomas Leitner <t_leitner@gmx.at>
+
+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.
+
+
+Some test cases and the benchmark files are based on test cases from
+the MDTest test suite:
+
+    MDTest
+    Copyright (c) 2007 Michel Fortin
+    <http://www.michelf.com/>
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/README.md b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/README.md
new file mode 100644
index 0000000..139bf06
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/README.md
@@ -0,0 +1,71 @@
+# kramdown
+
+## Readme first!
+
+kramdown was originally licensed under the GPL until the 1.0.0 release. However, due to the many
+requests it is now released under the MIT license and therefore can easily be used in commercial
+projects, too.
+
+However, if you use kramdown in a commercial setting, please consider **contributing back any
+changes** for the benefit of the community and/or
+[**becoming a patron**](https://www.patreon.com/gettalong) - thanks!
+
+
+## Introduction
+
+kramdown is a fast, pure Ruby Markdown superset converter, using a strict syntax definition and
+supporting several common extensions.
+
+The syntax definition for the kramdown syntax can be found in **doc/syntax.page** (or online at
+<http://kramdown.gettalong.org/syntax.html>) and a quick reference is available in
+**doc/quickref.page** or online at <http://kramdown.gettalong.org/quickref.html>.
+
+The kramdown library is mainly written to support the kramdown-to-HTML conversion chain. However,
+due to its flexibility (by creating an internal AST) it supports other input and output formats as
+well. Here is a list of the supported formats:
+
+* input formats: kramdown (a Markdown superset), Markdown, GFM, HTML
+* output formats: HTML, kramdown, LaTeX (and therefore PDF), PDF via Prawn
+
+All the documentation on the available input and output formats is available in the **doc/**
+directory and online at <http://kramdown.gettalong.org>.
+
+Starting from version 1.0.0 kramdown is using a versioning scheme with major, minor and patch parts
+in the version number where the major number changes on backwards-incompatible changes, the minor
+number on the introduction of new features and the patch number on everything else.
+
+For information about changes between versions, have a look at
+<http://kramdown.gettalong.org/news.html> or the commit history!
+
+
+## Usage
+
+kramdown has a very simple API, so using kramdown is as easy as
+
+```ruby
+require 'kramdown'
+
+Kramdown::Document.new(text).to_html
+```
+
+For detailed information have a look at the API documentation of the `Kramdown::Document` class.
+
+The full API documentation is available at <http://kramdown.gettalong.org/rdoc/>, other sites with an
+API documentation for kramdown probably don't provide the complete documentation!
+
+There are also some third-party libraries that extend the functionality of kramdown -- see the
+kramdown Wiki at <https://github.com/gettalong/kramdown/wiki>.
+
+
+## Development
+
+Just clone the git repository as described in **doc/installation.page** and you are good to go. You
+probably want to install `rake` so that you can use the provided rake tasks.
+
+If you want to run the tests, the development dependencies are needed as well as some additional
+programs like `tidy` and `latex`. See the `.travis.yml` file for more information.
+
+
+## License
+
+MIT - see the **COPYING** file.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/Rakefile b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/Rakefile
new file mode 100644
index 0000000..080525b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/Rakefile
@@ -0,0 +1,272 @@
+# -*- ruby -*-
+
+# load all optional developer libraries
+begin
+  require 'rubygems'
+  require 'rubygems/package_task'
+rescue LoadError
+end
+
+begin
+  require 'webgen/page'
+rescue LoadError
+end
+
+begin
+  gem 'rdoc' if RUBY_VERSION >= '1.9'
+  require 'rdoc/task'
+  require 'rdoc/rdoc'
+
+  class RDoc::RDoc
+
+    alias :old_parse_files :parse_files
+
+    def parse_files(options)
+      file_info = old_parse_files(options)
+      require 'kramdown/options'
+
+      # Add options documentation to Kramdown::Options module
+      opt_module = @store.all_classes_and_modules.find {|m| m.full_name == 'Kramdown::Options'}
+      opt_defs = Kramdown::Options.definitions.sort.collect do |n, definition|
+        desc = definition.desc.split(/\n/).map {|l| "    #{l}"}
+        desc[-2] = []
+        desc = desc.join("\n")
+        "[<tt>#{n}</tt> (type: #{definition.type}, default: #{definition.default.inspect})]\n#{desc}\n\n"
+      end
+      opt_module.comment.text += "\n== Available Options\n\n" << opt_defs.join("\n\n")
+
+      file_info
+    end
+
+  end
+
+rescue LoadError
+end
+
+begin
+  require 'rcov/rcovtask'
+rescue LoadError
+end
+
+require 'fileutils'
+require 'rake/clean'
+require 'rake/testtask'
+require 'rake/packagetask'
+require 'erb'
+
+$:.unshift('lib')
+require 'kramdown'
+
+# End user tasks ################################################################
+
+task :default => :test
+
+desc "Install using setup.rb"
+task :install do
+  ruby "setup.rb config"
+  ruby "setup.rb setup"
+  ruby "setup.rb install"
+end
+
+task :clobber do
+  ruby "setup.rb clean"
+end
+
+if defined?(Webgen)
+  desc "Generate the HTML documentation"
+  task :htmldoc do
+    ruby "-Ilib -S webgen"
+  end
+  CLOBBER << "htmldoc/"
+  CLOBBER << "webgen-tmp"
+end
+
+if defined? RDoc::Task
+  rd = RDoc::Task.new do |rdoc|
+    rdoc.rdoc_dir = 'htmldoc/rdoc'
+    rdoc.title = 'kramdown'
+    rdoc.main = 'lib/kramdown/document.rb'
+    rdoc.rdoc_files.include('lib')
+  end
+end
+
+if defined?(Webgen) && defined?(RDoc::Task)
+  desc "Build the whole user documentation"
+  task :doc => [:rdoc, 'htmldoc']
+end
+
+tt = Rake::TestTask.new do |test|
+  test.warning = false
+  test.libs << 'test'
+  test.test_files = FileList['test/test_*.rb']
+end
+
+# Release tasks and development tasks ############################################
+
+namespace :dev do
+
+  SUMMARY = 'kramdown is a fast, pure-Ruby Markdown-superset converter.'
+  DESCRIPTION = <<EOF
+kramdown is yet-another-markdown-parser but fast, pure Ruby,
+using a strict syntax definition and supporting several common extensions.
+EOF
+
+  begin
+    REL_PAGE = Webgen::Page.from_data(File.read('doc/news/release_' + Kramdown::VERSION.split('.').join('_') + '.page'))
+  rescue
+    puts 'NO RELEASE NOTES/CHANGES FILE'
+  end
+
+  PKG_FILES = FileList.new([
+                            'Rakefile',
+                            'setup.rb',
+                            'COPYING', 'README.md', 'AUTHORS',
+                            'VERSION', 'CONTRIBUTERS',
+                            'bin/*',
+                            'benchmark/*',
+                            'lib/**/*.rb',
+                            'man/man1/kramdown.1',
+                            'data/**/*',
+                            'doc/**',
+                            'test/**/*'
+                           ])
+
+  CLOBBER << "VERSION"
+  file 'VERSION' do
+    puts "Generating VERSION file"
+    File.open('VERSION', 'w+') {|file| file.write(Kramdown::VERSION + "\n")}
+  end
+
+  CLOBBER << 'CONTRIBUTERS'
+  file 'CONTRIBUTERS' do
+    puts "Generating CONTRIBUTERS file"
+    `echo "  Count Name" > CONTRIBUTERS`
+    `echo "======= ====" >> CONTRIBUTERS`
+    `git log | grep ^Author: | sed 's/^Author: //' | sort | uniq -c | sort -nr >> CONTRIBUTERS`
+  end
+
+  CLOBBER << "man/man1/kramdown.1"
+  file 'man/man1/kramdown.1' => ['man/man1/kramdown.1.erb'] do
+    puts "Generating kramdown man page"
+    File.open('man/man1/kramdown.1', 'w+') do |file|
+      data = ERB.new(File.read('man/man1/kramdown.1.erb')).result(binding)
+      file.write(Kramdown::Document.new(data).to_man)
+    end
+  end
+
+  Rake::PackageTask.new('kramdown', Kramdown::VERSION) do |pkg|
+    pkg.need_tar = true
+    pkg.need_zip = true
+    pkg.package_files = PKG_FILES
+  end
+
+  if defined? Gem
+    spec = Gem::Specification.new do |s|
+
+      #### Basic information
+      s.name = 'kramdown'
+      s.version = Kramdown::VERSION
+      s.summary = SUMMARY
+      s.description = DESCRIPTION
+      s.license = 'MIT'
+
+      #### Dependencies, requirements and files
+      s.files = PKG_FILES.to_a
+
+      s.require_path = 'lib'
+      s.executables = ['kramdown']
+      s.default_executable = 'kramdown'
+      s.add_development_dependency 'minitest', '~> 5.0'
+      s.add_development_dependency 'coderay', '~> 1.0.0'
+      s.add_development_dependency 'rouge', '~> 1.8'
+      s.add_development_dependency 'stringex', '~> 1.5.1'
+      s.add_development_dependency 'prawn', '~> 2.0'
+      s.add_development_dependency 'prawn-table', '~> 0.2.2'
+      s.add_development_dependency 'ritex', '~> 1.0'
+      s.add_development_dependency 'itextomml', '~> 1.5'
+
+      #### Documentation
+
+      s.has_rdoc = true
+      s.rdoc_options = ['--main', 'lib/kramdown/document.rb']
+
+      #### Author and project details
+
+      s.author = 'Thomas Leitner'
+      s.email = 't_leitner@gmx.at'
+      s.homepage = "http://kramdown.gettalong.org"
+    end
+
+
+    task :gemspec => [ 'CONTRIBUTERS', 'VERSION', 'man/man1/kramdown.1'] do
+      print "Generating Gemspec\n"
+      contents = spec.to_ruby
+      File.open("kramdown.gemspec", 'w+') {|f| f.puts(contents)}
+    end
+
+    Gem::PackageTask.new(spec) do |pkg|
+      pkg.need_zip = true
+      pkg.need_tar = true
+    end
+
+  end
+
+  if defined?(Webgen) && defined?(Gem) && defined?(Rake::RDocTask)
+    desc 'Release Kramdown version ' + Kramdown::VERSION
+    task :release => [:clobber, :package, :publish_files, :publish_website]
+  end
+
+  if defined?(Gem)
+    desc "Upload the release to Rubygems"
+    task :publish_files => [:package] do
+      sh "gem push pkg/kramdown-#{Kramdown::VERSION}.gem"
+      puts 'done'
+    end
+  end
+
+  desc "Upload the website"
+  task :publish_website => ['doc'] do
+    puts "Transfer manually!!!"
+    # sh "rsync -avc --delete --exclude 'MathJax' --exclude 'robots.txt'  htmldoc/ gettalong@rubyforge.org:/var/www/gforge-projects/kramdown/"
+  end
+
+
+  if defined? Rcov
+    Rcov::RcovTask.new do |rcov|
+      rcov.libs << 'test'
+    end
+  end
+
+  CODING_LINE = "# -*- coding: utf-8 -*-\n"
+  COPYRIGHT=<<EOF
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+EOF
+
+  desc "Insert/Update copyright notice"
+  task :update_copyright do
+    inserted = false
+    Dir["lib/**/*.rb", "test/**/*.rb"].each do |file|
+      if !File.read(file).start_with?(CODING_LINE + COPYRIGHT)
+        inserted = true
+        puts "Updating file #{file}"
+        old = File.read(file)
+        if !old.gsub!(/\A#{Regexp.escape(CODING_LINE)}#\n#--.*?\n#\+\+\n#\n/m, CODING_LINE + COPYRIGHT)
+          old.gsub!(/\A(#{Regexp.escape(CODING_LINE)})?/, CODING_LINE + COPYRIGHT + "\n")
+        end
+        File.open(file, 'w+') {|f| f.puts(old)}
+      end
+    end
+    puts "Look through the above mentioned files and correct all problems" if inserted
+  end
+
+end
+
+task :gemspec => ['dev:gemspec']
+
+task :clobber => ['dev:clobber']
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/VERSION b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/VERSION
new file mode 100644
index 0000000..850e742
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/VERSION
@@ -0,0 +1 @@
+1.14.0
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/benchmark.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/benchmark.rb
new file mode 100644
index 0000000..bad86af
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/benchmark.rb
@@ -0,0 +1,43 @@
+require 'benchmark'
+require 'stringio'
+
+require 'kramdown'
+require 'bluecloth'
+require 'maruku'
+require 'maruku/version'
+require 'rdiscount'
+require 'bluefeather'
+require 'redcarpet'
+
+module MaRuKu::Errors
+  def tell_user(s)
+  end
+end
+
+
+RUNS=20
+
+FILES=['mdsyntax.text', 'mdbasics.text']
+
+puts "Running tests on #{Time.now.strftime("%Y-%m-%d")} under #{RUBY_DESCRIPTION}"
+
+FILES.each do |file|
+  data = File.read(File.join(File.dirname(__FILE__), file))
+  puts
+  puts "Test using file #{file} and #{RUNS} runs"
+  results = Benchmark.bmbm do |b|
+    b.report("kramdown #{Kramdown::VERSION}") { RUNS.times { Kramdown::Document.new(data).to_html } }
+    b.report("Maruku #{MaRuKu::Version}") { RUNS.times { Maruku.new(data, :on_error => :ignore).to_html } }
+    b.report("BlueFeather #{BlueFeather::VERSION}") { RUNS.times { BlueFeather.parse(data) } }
+    b.report("BlueCloth #{BlueCloth::VERSION}") { RUNS.times { BlueCloth.new(data).to_html } }
+    b.report("RDiscount #{RDiscount::VERSION}") { RUNS.times { RDiscount.new(data).to_html } }
+    b.report("redcarpet #{Redcarpet::VERSION}") { RUNS.times { Redcarpet::Markdown.new(Redcarpet::Render::HTML).render(data) } }
+  end
+
+  puts
+  puts "Real time of X divided by real time of kramdown"
+  kd = results.shift.real
+  %w[Maruku BlueFeather BlueCloth RDiscount redcarpet].each do |name|
+    puts name.ljust(19) << (results.shift.real/kd).round(4).to_s
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/benchmark.sh b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/benchmark.sh
new file mode 100755
index 0000000..3fe600c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/benchmark.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+
+source ~/.profile
+
+RUBY_VERSIONS=`rvm list strings | sort`
+KD_VERSIONS="`git tag | sort -V` master"
+OTHERS=false
+AVERAGE=1
+MASTER_AS=master
+
+while getopts "r:k:om:a:" optname; do
+    case "$optname" in
+        "r")
+            RUBY_VERSIONS="$OPTARG"
+            ;;
+        "k")
+            KD_VERSIONS="$OPTARG"
+            ;;
+        "o")
+            OTHERS=true
+            ;;
+        "m")
+            MASTER_AS="$OPTARG"
+            ;;
+        "a")
+            AVERAGE="$OPTARG"
+            ;;
+        "?")
+            echo "Unknown option $OPTARG"
+            exit 1
+            ;;
+        ":")
+            echo "No argument value for option $OPTARG"
+            exit 1
+            ;;
+        *)
+            echo "Unknown error while processing options"
+            exit 1
+            ;;
+    esac
+done
+
+TMPDIR=/tmp/kramdown-benchmark
+
+rm -rf $TMPDIR
+mkdir -p $TMPDIR
+cp benchmark/md* $TMPDIR
+cp benchmark/generate_data.rb $TMPDIR
+git clone .git ${TMPDIR}/kramdown
+cd ${TMPDIR}/kramdown
+
+for RUBY_VERSION in $RUBY_VERSIONS; do
+  rvm use $RUBY_VERSION
+  echo "Creating benchmark data for $(ruby -v)"
+
+    for KD_VERSION in $KD_VERSIONS; do
+        echo "Using kramdown version $KD_VERSION"
+        git co $KD_VERSION 2>/dev/null
+        if [ -z $MASTER_AS -o $KD_VERSION != master ]; then
+            VNUM=${KD_VERSION}
+        else
+            VNUM=$MASTER_AS
+        fi
+        ruby -I${TMPDIR}/kramdown/lib ../generate_data.rb -k ${VNUM} -a ${AVERAGE} >/dev/null
+    done
+
+    if [ $OTHERS = "true" ]; then
+        ruby -rubygems -I${TMPDIR}/kramdown/lib ../generate_data.rb -o >/dev/null
+    fi
+done
+
+cd ${TMPDIR}
+rvm default
+ruby generate_data.rb -g
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/generate_data.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/generate_data.rb
new file mode 100644
index 0000000..762ebc3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/generate_data.rb
@@ -0,0 +1,119 @@
+require 'benchmark'
+require 'optparse'
+require 'fileutils'
+
+require 'kramdown'
+
+options = {:others => false, :average => 1}
+OptionParser.new do |opts|
+  opts.on("-a AVG", "--average AVG", Integer, "Average times over the specified number of runs") {|v| options[:average] = v }
+  opts.on("-o", "--[no-]others", "Generate data for other parsers") {|v| options[:others] = v}
+  opts.on("-g", "--[no-]graph", "Generate graph") {|v| options[:graph] = v}
+  opts.on("-k VERSION", "--kramdown VERSION", String, "Add benchmark data for kramdown version VERSION") {|v| options[:kramdown] = v}
+end.parse!
+
+THISRUBY = (self.class.const_defined?(:RUBY_DESCRIPTION) ? RUBY_DESCRIPTION.scan(/^.*?(?=\s*\()/).first.sub(/\s/, '-') : "ruby-#{RUBY_VERSION}") + '-' + RUBY_PATCHLEVEL.to_s
+
+Dir.chdir(File.dirname(__FILE__))
+BMDATA = File.read('mdbasics.text')
+MULTIPLIER = (0..5).map {|i| 2**i}
+
+if options[:others]
+  require 'maruku'
+  require 'maruku/version'
+  begin
+    require 'rdiscount'
+  rescue LoadError
+  end
+  #require 'bluefeather'
+
+  module MaRuKu::Errors
+    def tell_user(s)
+    end
+  end
+
+  bmdata = {}
+  labels = []
+  MULTIPLIER.each do |i|
+    $stderr.puts "Generating benchmark data for other parsers, multiplier #{i}"
+    mddata = BMDATA*i
+    labels = []
+    bmdata[i] = Benchmark::bmbm do |x|
+      labels << "Maruku #{MaRuKu::Version}"
+      x.report { Maruku.new(mddata, :on_error => :ignore).to_html }
+      if self.class.const_defined?(:BlueFeather)
+        labels << "BlueFeather #{BlueFeather::VERSION}"
+        x.report { BlueFeather.parse(mddata) }
+      end
+      if self.class.const_defined?(:RDiscount)
+        labels << "RDiscount #{RDiscount::VERSION}"
+        x.report { RDiscount.new(mddata).to_html }
+      end
+    end
+  end
+  File.open("static-#{THISRUBY}.dat", 'w+') do |f|
+    f.puts "# " + labels.join(" || ")
+    format_str = "%5d" + " %10.5f"*bmdata[MULTIPLIER.first].size
+    bmdata.sort.each do |m,v|
+      f.puts format_str % [m, *v.map {|tms| tms.real}]
+    end
+  end
+end
+
+if options[:kramdown]
+  kramdown = "kramdown-#{THISRUBY}.dat"
+  data = if File.exist?(kramdown)
+           lines = File.readlines(kramdown).map {|l| l.chomp}
+           lines.first << " || "
+           lines
+         else
+           ["#      ", *MULTIPLIER.map {|m| "%3d" % m}]
+         end
+  data.first << "#{options[:kramdown]}".rjust(10)
+
+  times = []
+  options[:average].times do
+    MULTIPLIER.each_with_index do |m, i|
+      $stderr.puts "Generating benchmark data for kramdown version #{options[:kramdown]}, multiplier #{m}"
+      mddata = BMDATA*m
+      begin
+        (times[i] ||= []) << Benchmark::bmbm {|x| x.report { Kramdown::Document.new(mddata).to_html } }.first.real
+      rescue
+        $stderr.puts $!.message
+        (times[i] ||= []) << 0
+      end
+    end
+  end
+  times.each_with_index {|t,i| data[i+1] << "%14.5f" % (t.inject(0) {|sum,v| sum+v}/3.0)}
+  File.open(kramdown, 'w+') do |f|
+    data.each {|l| f.puts l}
+  end
+end
+
+if options[:graph]
+  Dir['kramdown-*.dat'].each do |kramdown_name|
+    theruby = kramdown_name.sub(/^kramdown-/, '').sub(/\.dat$/, '')
+    graph_name = "graph-#{theruby}.png"
+    static_name = "static-#{theruby}.dat"
+    kramdown_names = File.readlines(kramdown_name).first.chomp[1..-1].split(/\s*\|\|\s*/)
+    static_names = (File.exist?(static_name) ? File.readlines(static_name).first.chomp[1..-1].split(/\s*\|\|\s*/) : [])
+    File.open("gnuplot.dat", "w+") do |f|
+      f.puts <<EOF
+set title "Execution Time Performance for #{theruby}"
+set xlabel "File Multiplier (i.e. n times mdbasic.text)"
+set ylabel "Execution Time in secondes"
+set key left top
+set grid
+set terminal png
+set output "#{graph_name}"
+EOF
+      f.print "plot "
+      i, j = 1, 1
+      f.puts((kramdown_names.map {|n| i += 1; "\"#{kramdown_name}\" using 1:#{i} with lp title \"#{n}\""} +
+              static_names.map {|n| j += 1; n =~ /bluefeather/i ? nil : "\"#{static_name}\" using 1:#{j} with lp title \"#{n}\""}.compact
+             ).join(", "))
+    end
+    `gnuplot gnuplot.dat`
+    FileUtils.rm("gnuplot.dat")
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/mdbasics.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/mdbasics.text
new file mode 100644
index 0000000..486055c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/mdbasics.text
@@ -0,0 +1,306 @@
+Markdown: Basics
+================
+
+<ul id="ProjectSubmenu">
+    <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li>
+    <li><a class="selected" title="Markdown Basics">Basics</a></li>
+    <li><a href="/projects/markdown/syntax" title="Markdown Syntax Documentation">Syntax</a></li>
+    <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li>
+    <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li>
+</ul>
+
+
+Getting the Gist of Markdown's Formatting Syntax
+------------------------------------------------
+
+This page offers a brief overview of what it's like to use Markdown.
+The [syntax page] [s] provides complete, detailed documentation for
+every feature, but Markdown should be very easy to pick up simply by
+looking at a few examples of it in action. The examples on this page
+are written in a before/after style, showing example syntax and the
+HTML output produced by Markdown.
+
+It's also helpful to simply try Markdown out; the [Dingus] [d] is a
+web application that allows you type your own Markdown-formatted text
+and translate it to XHTML.
+
+**Note:** This document is itself written using Markdown; you
+can [see the source for it by adding '.text' to the URL] [src].
+
+  [s]: /projects/markdown/syntax  "Markdown Syntax"
+  [d]: /projects/markdown/dingus  "Markdown Dingus"
+  [src]: /projects/markdown/basics.text
+
+
+## Paragraphs, Headers, Blockquotes ##
+
+A paragraph is simply one or more consecutive lines of text, separated
+by one or more blank lines. (A blank line is any line that looks like a
+blank line -- a line containing nothing spaces or tabs is considered
+blank.) Normal paragraphs should not be intended with spaces or tabs.
+
+Markdown offers two styles of headers: *Setext* and *atx*.
+Setext-style headers for `<h1>` and `<h2>` are created by
+"underlining" with equal signs (`=`) and hyphens (`-`), respectively.
+To create an atx-style header, you put 1-6 hash marks (`#`) at the
+beginning of the line -- the number of hashes equals the resulting
+HTML header level.
+
+Blockquotes are indicated using email-style '`>`' angle brackets.
+
+Markdown:
+
+    A First Level Header
+    ====================
+    
+    A Second Level Header
+    ---------------------
+
+    Now is the time for all good men to come to
+    the aid of their country. This is just a
+    regular paragraph.
+
+    The quick brown fox jumped over the lazy
+    dog's back.
+    
+    ### Header 3
+
+    > This is a blockquote.
+    > 
+    > This is the second paragraph in the blockquote.
+    >
+    > ## This is an H2 in a blockquote
+
+
+Output:
+
+    <h1>A First Level Header</h1>
+    
+    <h2>A Second Level Header</h2>
+    
+    <p>Now is the time for all good men to come to
+    the aid of their country. This is just a
+    regular paragraph.</p>
+    
+    <p>The quick brown fox jumped over the lazy
+    dog's back.</p>
+    
+    <h3>Header 3</h3>
+    
+    <blockquote>
+        <p>This is a blockquote.</p>
+        
+        <p>This is the second paragraph in the blockquote.</p>
+        
+        <h2>This is an H2 in a blockquote</h2>
+    </blockquote>
+
+
+
+### Phrase Emphasis ###
+
+Markdown uses asterisks and underscores to indicate spans of emphasis.
+
+Markdown:
+
+    Some of these words *are emphasized*.
+    Some of these words _are emphasized also_.
+    
+    Use two asterisks for **strong emphasis**.
+    Or, if you prefer, __use two underscores instead__.
+
+Output:
+
+    <p>Some of these words <em>are emphasized</em>.
+    Some of these words <em>are emphasized also</em>.</p>
+    
+    <p>Use two asterisks for <strong>strong emphasis</strong>.
+    Or, if you prefer, <strong>use two underscores instead</strong>.</p>
+   
+
+
+## Lists ##
+
+Unordered (bulleted) lists use asterisks, pluses, and hyphens (`*`,
+`+`, and `-`) as list markers. These three markers are
+interchangable; this:
+
+    *   Candy.
+    *   Gum.
+    *   Booze.
+
+this:
+
+    +   Candy.
+    +   Gum.
+    +   Booze.
+
+and this:
+
+    -   Candy.
+    -   Gum.
+    -   Booze.
+
+all produce the same output:
+
+    <ul>
+    <li>Candy.</li>
+    <li>Gum.</li>
+    <li>Booze.</li>
+    </ul>
+
+Ordered (numbered) lists use regular numbers, followed by periods, as
+list markers:
+
+    1.  Red
+    2.  Green
+    3.  Blue
+
+Output:
+
+    <ol>
+    <li>Red</li>
+    <li>Green</li>
+    <li>Blue</li>
+    </ol>
+
+If you put blank lines between items, you'll get `<p>` tags for the
+list item text. You can create multi-paragraph list items by indenting
+the paragraphs by 4 spaces or 1 tab:
+
+    *   A list item.
+    
+        With multiple paragraphs.
+
+    *   Another item in the list.
+
+Output:
+
+    <ul>
+    <li><p>A list item.</p>
+    <p>With multiple paragraphs.</p></li>
+    <li><p>Another item in the list.</p></li>
+    </ul>
+    
+
+
+### Links ###
+
+Markdown supports two styles for creating links: *inline* and
+*reference*. With both styles, you use square brackets to delimit the
+text you want to turn into a link.
+
+Inline-style links use parentheses immediately after the link text.
+For example:
+
+    This is an [example link](http://example.com/).
+
+Output:
+
+    <p>This is an <a href="http://example.com/">
+    example link</a>.</p>
+
+Optionally, you may include a title attribute in the parentheses:
+
+    This is an [example link](http://example.com/ "With a Title").
+
+Output:
+
+    <p>This is an <a href="http://example.com/" title="With a Title">
+    example link</a>.</p>
+
+Reference-style links allow you to refer to your links by names, which
+you define elsewhere in your document:
+
+    I get 10 times more traffic from [Google][1] than from
+    [Yahoo][2] or [MSN][3].
+
+    [1]: http://google.com/        "Google"
+    [2]: http://search.yahoo.com/  "Yahoo Search"
+    [3]: http://search.msn.com/    "MSN Search"
+
+Output:
+
+    <p>I get 10 times more traffic from <a href="http://google.com/"
+    title="Google">Google</a> than from <a href="http://search.yahoo.com/"
+    title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/"
+    title="MSN Search">MSN</a>.</p>
+
+The title attribute is optional. Link names may contain letters,
+numbers and spaces, but are *not* case sensitive:
+
+    I start my morning with a cup of coffee and
+    [The New York Times][NY Times].
+
+    [ny times]: http://www.nytimes.com/
+
+Output:
+
+    <p>I start my morning with a cup of coffee and
+    <a href="http://www.nytimes.com/">The New York Times</a>.</p>
+
+
+### Images ###
+
+Image syntax is very much like link syntax.
+
+Inline (titles are optional):
+
+    ![alt text](/path/to/img.jpg "Title")
+
+Reference-style:
+
+    ![alt text][id]
+
+    [id]: /path/to/img.jpg "Title"
+
+Both of the above examples produce the same output:
+
+    <img src="/path/to/img.jpg" alt="alt text" title="Title" />
+
+
+
+### Code ###
+
+In a regular paragraph, you can create code span by wrapping text in
+backtick quotes. Any ampersands (`&`) and angle brackets (`<` or
+`>`) will automatically be translated into HTML entities. This makes
+it easy to use Markdown to write about HTML example code:
+
+    I strongly recommend against using any `<blink>` tags.
+
+    I wish SmartyPants used named entities like `&mdash;`
+    instead of decimal-encoded entites like `&#8212;`.
+
+Output:
+
+    <p>I strongly recommend against using any
+    <code>&lt;blink&gt;</code> tags.</p>
+    
+    <p>I wish SmartyPants used named entities like
+    <code>&amp;mdash;</code> instead of decimal-encoded
+    entites like <code>&amp;#8212;</code>.</p>
+
+
+To specify an entire block of pre-formatted code, indent every line of
+the block by 4 spaces or 1 tab. Just like with code spans, `&`, `<`,
+and `>` characters will be escaped automatically.
+
+Markdown:
+
+    If you want your page to validate under XHTML 1.0 Strict,
+    you've got to put paragraph tags in your blockquotes:
+
+        <blockquote>
+            <p>For example.</p>
+        </blockquote>
+
+Output:
+
+    <p>If you want your page to validate under XHTML 1.0 Strict,
+    you've got to put paragraph tags in your blockquotes:</p>
+    
+    <pre><code>&lt;blockquote&gt;
+        &lt;p&gt;For example.&lt;/p&gt;
+    &lt;/blockquote&gt;
+    </code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/mdsyntax.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/mdsyntax.text
new file mode 100644
index 0000000..57360a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/mdsyntax.text
@@ -0,0 +1,888 @@
+Markdown: Syntax
+================
+
+<ul id="ProjectSubmenu">
+    <li><a href="/projects/markdown/" title="Markdown Project Page">Main</a></li>
+    <li><a href="/projects/markdown/basics" title="Markdown Basics">Basics</a></li>
+    <li><a class="selected" title="Markdown Syntax Documentation">Syntax</a></li>
+    <li><a href="/projects/markdown/license" title="Pricing and License Information">License</a></li>
+    <li><a href="/projects/markdown/dingus" title="Online Markdown Web Form">Dingus</a></li>
+</ul>
+
+
+*   [Overview](#overview)
+    *   [Philosophy](#philosophy)
+    *   [Inline HTML](#html)
+    *   [Automatic Escaping for Special Characters](#autoescape)
+*   [Block Elements](#block)
+    *   [Paragraphs and Line Breaks](#p)
+    *   [Headers](#header)
+    *   [Blockquotes](#blockquote)
+    *   [Lists](#list)
+    *   [Code Blocks](#precode)
+    *   [Horizontal Rules](#hr)
+*   [Span Elements](#span)
+    *   [Links](#link)
+    *   [Emphasis](#em)
+    *   [Code](#code)
+    *   [Images](#img)
+*   [Miscellaneous](#misc)
+    *   [Backslash Escapes](#backslash)
+    *   [Automatic Links](#autolink)
+
+
+**Note:** This document is itself written using Markdown; you
+can [see the source for it by adding '.text' to the URL][src].
+
+  [src]: /projects/markdown/syntax.text
+
+* * *
+
+<h2 id="overview">Overview</h2>
+
+<h3 id="philosophy">Philosophy</h3>
+
+Markdown is intended to be as easy-to-read and easy-to-write as is feasible.
+
+Readability, however, is emphasized above all else. A Markdown-formatted
+document should be publishable as-is, as plain text, without looking
+like it's been marked up with tags or formatting instructions. While
+Markdown's syntax has been influenced by several existing text-to-HTML
+filters -- including [Setext] [1], [atx] [2], [Textile] [3], [reStructuredText] [4],
+[Grutatext] [5], and [EtText] [6] -- the single biggest source of
+inspiration for Markdown's syntax is the format of plain text email.
+
+  [1]: http://docutils.sourceforge.net/mirror/setext.html
+  [2]: http://www.aaronsw.com/2002/atx/
+  [3]: http://textism.com/tools/textile/
+  [4]: http://docutils.sourceforge.net/rst.html
+  [5]: http://www.triptico.com/software/grutatxt.html
+  [6]: http://ettext.taint.org/doc/
+
+To this end, Markdown's syntax is comprised entirely of punctuation
+characters, which punctuation characters have been carefully chosen so
+as to look like what they mean. E.g., asterisks around a word actually
+look like \*emphasis\*. Markdown lists look like, well, lists. Even
+blockquotes look like quoted passages of text, assuming you've ever
+used email.
+
+
+
+<h3 id="html">Inline HTML</h3>
+
+Markdown's syntax is intended for one purpose: to be used as a
+format for *writing* for the web.
+
+Markdown is not a replacement for HTML, or even close to it. Its
+syntax is very small, corresponding only to a very small subset of
+HTML tags. The idea is *not* to create a syntax that makes it easier
+to insert HTML tags. In my opinion, HTML tags are already easy to
+insert. The idea for Markdown is to make it easy to read, write, and
+edit prose. HTML is a *publishing* format; Markdown is a *writing*
+format. Thus, Markdown's formatting syntax only addresses issues that
+can be conveyed in plain text.
+
+For any markup that is not covered by Markdown's syntax, you simply
+use HTML itself. There's no need to preface it or delimit it to
+indicate that you're switching from Markdown to HTML; you just use
+the tags.
+
+The only restrictions are that block-level HTML elements -- e.g. `<div>`,
+`<table>`, `<pre>`, `<p>`, etc. -- must be separated from surrounding
+content by blank lines, and the start and end tags of the block should
+not be indented with tabs or spaces. Markdown is smart enough not
+to add extra (unwanted) `<p>` tags around HTML block-level tags.
+
+For example, to add an HTML table to a Markdown article:
+
+    This is a regular paragraph.
+
+    <table>
+        <tr>
+            <td>Foo</td>
+        </tr>
+    </table>
+
+    This is another regular paragraph.
+
+Note that Markdown formatting syntax is not processed within block-level
+HTML tags. E.g., you can't use Markdown-style `*emphasis*` inside an
+HTML block.
+
+Span-level HTML tags -- e.g. `<span>`, `<cite>`, or `<del>` -- can be
+used anywhere in a Markdown paragraph, list item, or header. If you
+want, you can even use HTML tags instead of Markdown formatting; e.g. if
+you'd prefer to use HTML `<a>` or `<img>` tags instead of Markdown's
+link or image syntax, go right ahead.
+
+Unlike block-level HTML tags, Markdown syntax *is* processed within
+span-level tags.
+
+
+<h3 id="autoescape">Automatic Escaping for Special Characters</h3>
+
+In HTML, there are two characters that demand special treatment: `<`
+and `&`. Left angle brackets are used to start tags; ampersands are
+used to denote HTML entities. If you want to use them as literal
+characters, you must escape them as entities, e.g. `&lt;`, and
+`&amp;`.
+
+Ampersands in particular are bedeviling for web writers. If you want to
+write about 'AT&T', you need to write '`AT&amp;T`'. You even need to
+escape ampersands within URLs. Thus, if you want to link to:
+
+    http://images.google.com/images?num=30&q=larry+bird
+
+you need to encode the URL as:
+
+    http://images.google.com/images?num=30&amp;q=larry+bird
+
+in your anchor tag `href` attribute. Needless to say, this is easy to
+forget, and is probably the single most common source of HTML validation
+errors in otherwise well-marked-up web sites.
+
+Markdown allows you to use these characters naturally, taking care of
+all the necessary escaping for you. If you use an ampersand as part of
+an HTML entity, it remains unchanged; otherwise it will be translated
+into `&amp;`.
+
+So, if you want to include a copyright symbol in your article, you can write:
+
+    &copy;
+
+and Markdown will leave it alone. But if you write:
+
+    AT&T
+
+Markdown will translate it to:
+
+    AT&amp;T
+
+Similarly, because Markdown supports [inline HTML](#html), if you use
+angle brackets as delimiters for HTML tags, Markdown will treat them as
+such. But if you write:
+
+    4 < 5
+
+Markdown will translate it to:
+
+    4 &lt; 5
+
+However, inside Markdown code spans and blocks, angle brackets and
+ampersands are *always* encoded automatically. This makes it easy to use
+Markdown to write about HTML code. (As opposed to raw HTML, which is a
+terrible format for writing about HTML syntax, because every single `<`
+and `&` in your example code needs to be escaped.)
+
+
+* * *
+
+
+<h2 id="block">Block Elements</h2>
+
+
+<h3 id="p">Paragraphs and Line Breaks</h3>
+
+A paragraph is simply one or more consecutive lines of text, separated
+by one or more blank lines. (A blank line is any line that looks like a
+blank line -- a line containing nothing but spaces or tabs is considered
+blank.) Normal paragraphs should not be intended with spaces or tabs.
+
+The implication of the "one or more consecutive lines of text" rule is
+that Markdown supports "hard-wrapped" text paragraphs. This differs
+significantly from most other text-to-HTML formatters (including Movable
+Type's "Convert Line Breaks" option) which translate every line break
+character in a paragraph into a `<br />` tag.
+
+When you *do* want to insert a `<br />` break tag using Markdown, you
+end a line with two or more spaces, then type return.
+
+Yes, this takes a tad more effort to create a `<br />`, but a simplistic
+"every line break is a `<br />`" rule wouldn't work for Markdown.
+Markdown's email-style [blockquoting][bq] and multi-paragraph [list items][l]
+work best -- and look better -- when you format them with hard breaks.
+
+  [bq]: #blockquote
+  [l]:  #list
+
+
+
+<h3 id="header">Headers</h3>
+
+Markdown supports two styles of headers, [Setext] [1] and [atx] [2].
+
+Setext-style headers are "underlined" using equal signs (for first-level
+headers) and dashes (for second-level headers). For example:
+
+    This is an H1
+    =============
+
+    This is an H2
+    -------------
+
+Any number of underlining `=`'s or `-`'s will work.
+
+Atx-style headers use 1-6 hash characters at the start of the line,
+corresponding to header levels 1-6. For example:
+
+    # This is an H1
+
+    ## This is an H2
+
+    ###### This is an H6
+
+Optionally, you may "close" atx-style headers. This is purely
+cosmetic -- you can use this if you think it looks better. The
+closing hashes don't even need to match the number of hashes
+used to open the header. (The number of opening hashes
+determines the header level.) :
+
+    # This is an H1 #
+
+    ## This is an H2 ##
+
+    ### This is an H3 ######
+
+
+<h3 id="blockquote">Blockquotes</h3>
+
+Markdown uses email-style `>` characters for blockquoting. If you're
+familiar with quoting passages of text in an email message, then you
+know how to create a blockquote in Markdown. It looks best if you hard
+wrap the text and put a `>` before every line:
+
+    > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
+    > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
+    > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
+    > 
+    > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
+    > id sem consectetuer libero luctus adipiscing.
+
+Markdown allows you to be lazy and only put the `>` before the first
+line of a hard-wrapped paragraph:
+
+    > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
+    consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
+    Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
+
+    > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
+    id sem consectetuer libero luctus adipiscing.
+
+Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by
+adding additional levels of `>`:
+
+    > This is the first level of quoting.
+    >
+    > > This is nested blockquote.
+    >
+    > Back to the first level.
+
+Blockquotes can contain other Markdown elements, including headers, lists,
+and code blocks:
+
+	> ## This is a header.
+	> 
+	> 1.   This is the first list item.
+	> 2.   This is the second list item.
+	> 
+	> Here's some example code:
+	> 
+	>     return shell_exec("echo $input | $markdown_script");
+
+Any decent text editor should make email-style quoting easy. For
+example, with BBEdit, you can make a selection and choose Increase
+Quote Level from the Text menu.
+
+
+<h3 id="list">Lists</h3>
+
+Markdown supports ordered (numbered) and unordered (bulleted) lists.
+
+Unordered lists use asterisks, pluses, and hyphens -- interchangably
+-- as list markers:
+
+    *   Red
+    *   Green
+    *   Blue
+
+is equivalent to:
+
+    +   Red
+    +   Green
+    +   Blue
+
+and:
+
+    -   Red
+    -   Green
+    -   Blue
+
+Ordered lists use numbers followed by periods:
+
+    1.  Bird
+    2.  McHale
+    3.  Parish
+
+It's important to note that the actual numbers you use to mark the
+list have no effect on the HTML output Markdown produces. The HTML
+Markdown produces from the above list is:
+
+    <ol>
+    <li>Bird</li>
+    <li>McHale</li>
+    <li>Parish</li>
+    </ol>
+
+If you instead wrote the list in Markdown like this:
+
+    1.  Bird
+    1.  McHale
+    1.  Parish
+
+or even:
+
+    3. Bird
+    1. McHale
+    8. Parish
+
+you'd get the exact same HTML output. The point is, if you want to,
+you can use ordinal numbers in your ordered Markdown lists, so that
+the numbers in your source match the numbers in your published HTML.
+But if you want to be lazy, you don't have to.
+
+If you do use lazy list numbering, however, you should still start the
+list with the number 1. At some point in the future, Markdown may support
+starting ordered lists at an arbitrary number.
+
+List markers typically start at the left margin, but may be indented by
+up to three spaces. List markers must be followed by one or more spaces
+or a tab.
+
+To make lists look nice, you can wrap items with hanging indents:
+
+    *   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+        Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
+        viverra nec, fringilla in, laoreet vitae, risus.
+    *   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
+        Suspendisse id sem consectetuer libero luctus adipiscing.
+
+But if you want to be lazy, you don't have to:
+
+    *   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
+    viverra nec, fringilla in, laoreet vitae, risus.
+    *   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
+    Suspendisse id sem consectetuer libero luctus adipiscing.
+
+If list items are separated by blank lines, Markdown will wrap the
+items in `<p>` tags in the HTML output. For example, this input:
+
+    *   Bird
+    *   Magic
+
+will turn into:
+
+    <ul>
+    <li>Bird</li>
+    <li>Magic</li>
+    </ul>
+
+But this:
+
+    *   Bird
+
+    *   Magic
+
+will turn into:
+
+    <ul>
+    <li><p>Bird</p></li>
+    <li><p>Magic</p></li>
+    </ul>
+
+List items may consist of multiple paragraphs. Each subsequent
+paragraph in a list item must be intended by either 4 spaces
+or one tab:
+
+    1.  This is a list item with two paragraphs. Lorem ipsum dolor
+        sit amet, consectetuer adipiscing elit. Aliquam hendrerit
+        mi posuere lectus.
+
+        Vestibulum enim wisi, viverra nec, fringilla in, laoreet
+        vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
+        sit amet velit.
+
+    2.  Suspendisse id sem consectetuer libero luctus adipiscing.
+
+It looks nice if you indent every line of the subsequent
+paragraphs, but here again, Markdown will allow you to be
+lazy:
+
+    *   This is a list item with two paragraphs.
+
+        This is the second paragraph in the list item. You're
+    only required to indent the first line. Lorem ipsum dolor
+    sit amet, consectetuer adipiscing elit.
+
+    *   Another item in the same list.
+
+To put a blockquote within a list item, the blockquote's `>`
+delimiters need to be indented:
+
+    *   A list item with a blockquote:
+
+        > This is a blockquote
+        > inside a list item.
+
+To put a code block within a list item, the code block needs
+to be indented *twice* -- 8 spaces or two tabs:
+
+    *   A list item with a code block:
+
+            <code goes here>
+
+
+It's worth noting that it's possible to trigger an ordered list by
+accident, by writing something like this:
+
+    1986. What a great season.
+
+In other words, a *number-period-space* sequence at the beginning of a
+line. To avoid this, you can backslash-escape the period:
+
+    1986\. What a great season.
+
+
+
+<h3 id="precode">Code Blocks</h3>
+
+Pre-formatted code blocks are used for writing about programming or
+markup source code. Rather than forming normal paragraphs, the lines
+of a code block are interpreted literally. Markdown wraps a code block
+in both `<pre>` and `<code>` tags.
+
+To produce a code block in Markdown, simply indent every line of the
+block by at least 4 spaces or 1 tab. For example, given this input:
+
+    This is a normal paragraph:
+
+        This is a code block.
+
+Markdown will generate:
+
+    <p>This is a normal paragraph:</p>
+
+    <pre><code>This is a code block.
+    </code></pre>
+
+One level of indentation -- 4 spaces or 1 tab -- is removed from each
+line of the code block. For example, this:
+
+    Here is an example of AppleScript:
+
+        tell application "Foo"
+            beep
+        end tell
+
+will turn into:
+
+    <p>Here is an example of AppleScript:</p>
+
+    <pre><code>tell application "Foo"
+        beep
+    end tell
+    </code></pre>
+
+A code block continues until it reaches a line that is not indented
+(or the end of the article).
+
+Within a code block, ampersands (`&`) and angle brackets (`<` and `>`)
+are automatically converted into HTML entities. This makes it very
+easy to include example HTML source code using Markdown -- just paste
+it and indent it, and Markdown will handle the hassle of encoding the
+ampersands and angle brackets. For example, this:
+
+        <div class="footer">
+            &copy; 2004 Foo Corporation
+        </div>
+
+will turn into:
+
+    <pre><code>&lt;div class="footer"&gt;
+        &amp;copy; 2004 Foo Corporation
+    &lt;/div&gt;
+    </code></pre>
+
+Regular Markdown syntax is not processed within code blocks. E.g.,
+asterisks are just literal asterisks within a code block. This means
+it's also easy to use Markdown to write about Markdown's own syntax.
+
+
+
+<h3 id="hr">Horizontal Rules</h3>
+
+You can produce a horizontal rule tag (`<hr />`) by placing three or
+more hyphens, asterisks, or underscores on a line by themselves. If you
+wish, you may use spaces between the hyphens or asterisks. Each of the
+following lines will produce a horizontal rule:
+
+    * * *
+
+    ***
+
+    *****
+	
+    - - -
+
+    ---------------------------------------
+
+	_ _ _
+
+
+* * *
+
+<h2 id="span">Span Elements</h2>
+
+<h3 id="link">Links</h3>
+
+Markdown supports two style of links: *inline* and *reference*.
+
+In both styles, the link text is delimited by [square brackets].
+
+To create an inline link, use a set of regular parentheses immediately
+after the link text's closing square bracket. Inside the parentheses,
+put the URL where you want the link to point, along with an *optional*
+title for the link, surrounded in quotes. For example:
+
+    This is [an example](http://example.com/ "Title") inline link.
+
+    [This link](http://example.net/) has no title attribute.
+
+Will produce:
+
+    <p>This is <a href="http://example.com/" title="Title">
+    an example</a> inline link.</p>
+
+    <p><a href="http://example.net/">This link</a> has no
+    title attribute.</p>
+
+If you're referring to a local resource on the same server, you can
+use relative paths:
+
+    See my [About](/about/) page for details.
+
+Reference-style links use a second set of square brackets, inside
+which you place a label of your choosing to identify the link:
+
+    This is [an example][id] reference-style link.
+
+You can optionally use a space to separate the sets of brackets:
+
+    This is [an example] [id] reference-style link.
+
+Then, anywhere in the document, you define your link label like this,
+on a line by itself:
+
+    [id]: http://example.com/  "Optional Title Here"
+
+That is:
+
+*   Square brackets containing the link identifier (optionally
+    indented from the left margin using up to three spaces);
+*   followed by a colon;
+*   followed by one or more spaces (or tabs);
+*   followed by the URL for the link;
+*   optionally followed by a title attribute for the link, enclosed
+    in double or single quotes.
+
+The link URL may, optionally, be surrounded by angle brackets:
+
+    [id]: <http://example.com/>  "Optional Title Here"
+
+You can put the title attribute on the next line and use extra spaces
+or tabs for padding, which tends to look better with longer URLs:
+
+    [id]: http://example.com/longish/path/to/resource/here
+        "Optional Title Here"
+
+Link definitions are only used for creating links during Markdown
+processing, and are stripped from your document in the HTML output.
+
+Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are *not* case sensitive. E.g. these two links:
+
+	[link text][a]
+	[link text][A]
+
+are equivalent.
+
+The *implicit link name* shortcut allows you to omit the name of the
+link, in which case the link text itself is used as the name.
+Just use an empty set of square brackets -- e.g., to link the word
+"Google" to the google.com web site, you could simply write:
+
+	[Google][]
+
+And then define the link:
+
+	[Google]: http://google.com/
+
+Because link names may contain spaces, this shortcut even works for
+multiple words in the link text:
+
+	Visit [Daring Fireball][] for more information.
+
+And then define the link:
+	
+	[Daring Fireball]: http://daringfireball.net/
+
+Link definitions can be placed anywhere in your Markdown document. I
+tend to put them immediately after each paragraph in which they're
+used, but if you want, you can put them all at the end of your
+document, sort of like footnotes.
+
+Here's an example of reference links in action:
+
+    I get 10 times more traffic from [Google] [1] than from
+    [Yahoo] [2] or [MSN] [3].
+
+      [1]: http://google.com/        "Google"
+      [2]: http://search.yahoo.com/  "Yahoo Search"
+      [3]: http://search.msn.com/    "MSN Search"
+
+Using the implicit link name shortcut, you could instead write:
+
+    I get 10 times more traffic from [Google][] than from
+    [Yahoo][] or [MSN][].
+
+      [google]: http://google.com/        "Google"
+      [yahoo]:  http://search.yahoo.com/  "Yahoo Search"
+      [msn]:    http://search.msn.com/    "MSN Search"
+
+Both of the above examples will produce the following HTML output:
+
+    <p>I get 10 times more traffic from <a href="http://google.com/"
+    title="Google">Google</a> than from
+    <a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a>
+    or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p>
+
+For comparison, here is the same paragraph written using
+Markdown's inline link style:
+
+    I get 10 times more traffic from [Google](http://google.com/ "Google")
+    than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or
+    [MSN](http://search.msn.com/ "MSN Search").
+
+The point of reference-style links is not that they're easier to
+write. The point is that with reference-style links, your document
+source is vastly more readable. Compare the above examples: using
+reference-style links, the paragraph itself is only 81 characters
+long; with inline-style links, it's 176 characters; and as raw HTML,
+it's 234 characters. In the raw HTML, there's more markup than there
+is text.
+
+With Markdown's reference-style links, a source document much more
+closely resembles the final output, as rendered in a browser. By
+allowing you to move the markup-related metadata out of the paragraph,
+you can add links without interrupting the narrative flow of your
+prose.
+
+
+<h3 id="em">Emphasis</h3>
+
+Markdown treats asterisks (`*`) and underscores (`_`) as indicators of
+emphasis. Text wrapped with one `*` or `_` will be wrapped with an
+HTML `<em>` tag; double `*`'s or `_`'s will be wrapped with an HTML
+`<strong>` tag. E.g., this input:
+
+    *single asterisks*
+
+    _single underscores_
+
+    **double asterisks**
+
+    __double underscores__
+
+will produce:
+
+    <em>single asterisks</em>
+
+    <em>single underscores</em>
+
+    <strong>double asterisks</strong>
+
+    <strong>double underscores</strong>
+
+You can use whichever style you prefer; the lone restriction is that
+the same character must be used to open and close an emphasis span.
+
+Emphasis can be used in the middle of a word:
+
+    un*fucking*believable
+
+But if you surround an `*` or `_` with spaces, it'll be treated as a
+literal asterisk or underscore.
+
+To produce a literal asterisk or underscore at a position where it
+would otherwise be used as an emphasis delimiter, you can backslash
+escape it:
+
+    \*this text is surrounded by literal asterisks\*
+
+
+
+<h3 id="code">Code</h3>
+
+To indicate a span of code, wrap it with backtick quotes (`` ` ``).
+Unlike a pre-formatted code block, a code span indicates code within a
+normal paragraph. For example:
+
+    Use the `printf()` function.
+
+will produce:
+
+    <p>Use the <code>printf()</code> function.</p>
+
+To include a literal backtick character within a code span, you can use
+multiple backticks as the opening and closing delimiters:
+
+    ``There is a literal backtick (`) here.``
+
+which will produce this:
+
+    <p><code>There is a literal backtick (`) here.</code></p>
+
+The backtick delimiters surrounding a code span may include spaces --
+one after the opening, one before the closing. This allows you to place
+literal backtick characters at the beginning or end of a code span:
+
+	A single backtick in a code span: `` ` ``
+	
+	A backtick-delimited string in a code span: `` `foo` ``
+
+will produce:
+
+	<p>A single backtick in a code span: <code>`</code></p>
+	
+	<p>A backtick-delimited string in a code span: <code>`foo`</code></p>
+
+With a code span, ampersands and angle brackets are encoded as HTML
+entities automatically, which makes it easy to include example HTML
+tags. Markdown will turn this:
+
+    Please don't use any `<blink>` tags.
+
+into:
+
+    <p>Please don't use any <code>&lt;blink&gt;</code> tags.</p>
+
+You can write this:
+
+    `&#8212;` is the decimal-encoded equivalent of `&mdash;`.
+
+to produce:
+
+    <p><code>&amp;#8212;</code> is the decimal-encoded
+    equivalent of <code>&amp;mdash;</code>.</p>
+
+
+
+<h3 id="img">Images</h3>
+
+Admittedly, it's fairly difficult to devise a "natural" syntax for
+placing images into a plain text document format.
+
+Markdown uses an image syntax that is intended to resemble the syntax
+for links, allowing for two styles: *inline* and *reference*.
+
+Inline image syntax looks like this:
+
+    ![Alt text](/path/to/img.jpg)
+
+    ![Alt text](/path/to/img.jpg "Optional title")
+
+That is:
+
+*   An exclamation mark: `!`;
+*   followed by a set of square brackets, containing the `alt`
+    attribute text for the image;
+*   followed by a set of parentheses, containing the URL or path to
+    the image, and an optional `title` attribute enclosed in double
+    or single quotes.
+
+Reference-style image syntax looks like this:
+
+    ![Alt text][id]
+
+Where "id" is the name of a defined image reference. Image references
+are defined using syntax identical to link references:
+
+    [id]: url/to/image  "Optional title attribute"
+
+As of this writing, Markdown has no syntax for specifying the
+dimensions of an image; if this is important to you, you can simply
+use regular HTML `<img>` tags.
+
+
+* * *
+
+
+<h2 id="misc">Miscellaneous</h2>
+
+<h3 id="autolink">Automatic Links</h3>
+
+Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:
+
+    <http://example.com/>
+    
+Markdown will turn this into:
+
+    <a href="http://example.com/">http://example.com/</a>
+
+Automatic links for email addresses work similarly, except that
+Markdown will also perform a bit of randomized decimal and hex
+entity-encoding to help obscure your address from address-harvesting
+spambots. For example, Markdown will turn this:
+
+    <address@example.com>
+
+into something like this:
+
+    <a href="&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65;
+    &#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;
+    &#109;">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61;
+    &#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a>
+
+which will render in a browser as a clickable link to "address@example.com".
+
+(This sort of entity-encoding trick will indeed fool many, if not
+most, address-harvesting bots, but it definitely won't fool all of
+them. It's better than nothing, but an address published in this way
+will probably eventually start receiving spam.)
+
+
+
+<h3 id="backslash">Backslash Escapes</h3>
+
+Markdown allows you to use backslash escapes to generate literal
+characters which would otherwise have special meaning in Markdown's
+formatting syntax. For example, if you wanted to surround a word with
+literal asterisks (instead of an HTML `<em>` tag), you can backslashes
+before the asterisks, like this:
+
+    \*literal asterisks\*
+
+Markdown provides backslash escapes for the following characters:
+
+    \   backslash
+    `   backtick
+    *   asterisk
+    _   underscore
+    {}  curly braces
+    []  square brackets
+    ()  parentheses
+    #   hash mark
+	+	plus sign
+	-	minus sign (hyphen)
+    .   dot
+    !   exclamation mark
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/testing.sh b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/testing.sh
new file mode 100755
index 0000000..683afc8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/testing.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+source ~/.profile
+
+COMMAND="$@"
+if [[ -z "$COMMAND" ]]; then COMMAND="rake test"; fi
+
+for VERSION in `rvm list strings | sort`; do
+	rvm $VERSION
+	echo $(ruby -v)
+	RUBYOPT=-rubygems $COMMAND
+done
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/timing.sh b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/timing.sh
new file mode 100755
index 0000000..fc009a3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/benchmark/timing.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+source ~/.bashrc
+
+for VERSION in `rvm list strings | sort`; do
+	rvm $VERSION
+	echo $(ruby -v)
+	ruby -Ilib bin/kramdown < benchmark/mdsyntax.text 2>/dev/null >/dev/null
+	time ruby -Ilib bin/kramdown < benchmark/mdsyntax.text 2>/dev/null >/dev/null
+done
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/bin/kramdown b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/bin/kramdown
new file mode 100755
index 0000000..823b26a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/bin/kramdown
@@ -0,0 +1,69 @@
+#!/usr/bin/env ruby
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2015 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'optparse'
+require 'kramdown'
+
+options = {}
+format = ['html']
+OptionParser.new do |opts|
+  opts.banner = "Usage: kramdown [options] [FILE FILE ...]"
+  opts.summary_indent = ' '*4
+
+  opts.separator ""
+  opts.separator "Command line options:"
+  opts.separator ""
+
+  opts.on("-i", "--input ARG", "Specify the input format: kramdown (default), " \
+          "html, GFM or markdown") {|v| options[:input] = v}
+  opts.on("-o", "--output ARG", Array, "Specify one or more output formats separated by commas: " \
+          "html (default),", "kramdown, latex, pdf, man or remove_html_tags") {|v| format = v}
+
+  opts.on("-v", "--version", "Show the version of kramdown") do
+    puts Kramdown::VERSION
+    exit
+  end
+  opts.on("-h", "--help", "Show the help") do
+    puts opts.summarize('', 5, 72)
+    exit
+  end
+
+  opts.separator ""
+  opts.separator "kramdown options:"
+  opts.separator ""
+
+  Kramdown::Options.definitions.sort.each do |n, definition|
+    no = n.to_s.tr('_', '-')
+    if definition.type == Kramdown::Options::Boolean
+      opts.on("--[no-]#{no}") {|v| options[n] = Kramdown::Options.parse(n, v)}
+    else
+      type = definition.type
+      type = String if type == Symbol || type == Object
+      opts.on("--#{no} ARG", type) {|v| options[n] = Kramdown::Options.parse(n, v)}
+    end
+
+    definition.desc.split(/\n/).each do |line|
+      opts.separator opts.summary_indent + ' '*6 + line
+    end
+    opts.separator ''
+  end
+
+end.parse!
+
+begin
+  doc = Kramdown::Document.new(ARGF.read, options)
+  result = ''
+  format.each {|f| result = doc.send("to_#{f}")}
+  puts result
+  doc.warnings.each {|warn| $stderr.puts "Warning: #{warn}"}
+rescue Kramdown::Error => e
+  $stderr.puts "Error: #{e.message}"
+  exit(1)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/data/kramdown/document.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/data/kramdown/document.html
new file mode 100644
index 0000000..731d0ea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/data/kramdown/document.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <% if @converter.root.options[:encoding] %>
+    <meta http-equiv="Content-type" content="text/html;charset=<%= @converter.root.options[:encoding] %>">
+    <% end %>
+<%
+extend ::Kramdown::Utils::Html
+title = ''
+h = @converter.root.children.find {|c| c.type == :header}
+if h
+  collector = lambda {|c| c.children.collect {|cc| cc.type == :text ? escape_html(cc.value, :text) : collector.call(cc)}.join('')}
+  title = collector.call(h)
+end
+%>
+    <title><%= title %></title>
+    <meta name="generator" content="kramdown <%= ::Kramdown::VERSION %>" />
+  </head>
+  <body>
+  <%= @body %>
+  </body>
+</html>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/data/kramdown/document.latex b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/data/kramdown/document.latex
new file mode 100644
index 0000000..acdf346
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/data/kramdown/document.latex
@@ -0,0 +1,50 @@
+<%
+encmap = {
+  'UTF-8' => 'utf8x',
+  'US-ASCII' => 'ascii',
+  'ISO-8859-1' => 'latin1',
+  'ISO-8859-2' => 'latin2',
+  'ISO-8859-3' => 'latin3',
+  'ISO-8859-4' => 'latin4',
+  'ISO-8859-5' => 'latin5',
+  'ISO-8859-9' => 'latin9',
+  'ISO-8859-10' => 'latin10',
+  'CP850' => 'cp850',
+  'CP852' => 'cp852',
+  'CP858' => 'cp858',
+  'CP437' => 'cp437',
+  'CP865' => 'cp865',
+  'CP1250' => 'cp120',
+  'CP1252' => 'cp1252',
+  'CP1257' => 'cp1257'
+}
+%>
+\documentclass{scrartcl}
+<% if RUBY_VERSION >= '1.9' %>
+\usepackage[<%= encmap[@body.encoding.name] %>]{inputenc}
+<% else %>
+\usepackage[mathletters]{ucs}
+\usepackage[utf8x]{inputenc}
+<% end %>
+\usepackage[T1]{fontenc}
+\usepackage{listings}
+<% @converter.data[:packages].each {|pkg| %>\usepackage{<%= pkg %>}
+<% } %>
+\usepackage{hyperref}
+
+<% if @converter.data[:packages].include?('fancyvrb') %>
+\VerbatimFootnotes
+<% end %>
+
+<% if @converter.data[:packages].include?('acronym') %>
+<%   @converter.root.options[:abbrev_defs].each_pair do |k,v| %>\acrodef{<%= @converter.normalize_abbreviation_key(k) %>}[<%= k %>]{<%= @converter.escape(v) %>}
+<%   end %>
+<% end %>
+
+\setcounter{footnote}{<%= @converter.options[:footnote_nr] - 1 %>}
+
+\hypersetup{colorlinks=true,urlcolor=blue}
+
+\begin{document}
+<%= @body %>
+\end{document}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/_design.scss b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/_design.scss
new file mode 100644
index 0000000..1a42fe3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/_design.scss
@@ -0,0 +1,441 @@
+/*  Based on the Less Framework 4
+    http://lessframework.com
+    by Joni Korpi
+    License: http://opensource.org/licenses/mit-license.php */
+
+
+/***** Variables for easy customization *****/
+
+/* the baseline height in px */
+$baseline-height: 24;
+
+/* The overlay color for the background image */
+$bg-grad-color: rgba(255,255,128,0.1);
+
+/* The font size of the logo in px */
+$logo-size: 36;
+
+/* Color settings */
+$link-color: #1666A3;
+
+
+
+/*  Resets
+    ------  */
+
+html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6,
+p, blockquote, pre, a, abbr, address, cite, code, del, dfn, em,
+img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, hr,
+dl, dt, dd, ol, ul, li, fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, figure, figcaption, hgroup,
+menu, footer, header, nav, section, summary, time, mark, audio, video {
+    margin: 0;
+    padding: 0;
+    border: 0;
+}
+
+article, aside, canvas, figure, figure img, figcaption, hgroup,
+footer, header, nav, section, audio, video {
+    display: block;
+}
+
+a img {border: 0;}
+
+
+
+/*  Typography presets
+    ------------------  */
+
+.gigantic {
+    font-size: 59px;
+    line-height: 72px;
+}
+
+.huge {
+    font-size: 36px;
+    line-height: 48px;
+}
+
+.large {
+    font-size: 23px;
+    line-height: 24px;
+}
+
+.bigger {
+    font-size: 18px;
+    line-height: 24px;
+}
+
+.big {
+    font-size: 14px;
+    line-height: 24px;
+}
+
+body {
+    font: 14px/24px 'Palatino Linotype', 'Book Antiqua', Palatino, serif;
+}
+
+.small, small {
+    font-size: 12px;
+    line-height: 24px;
+}
+
+*:target::after {
+    content: " ☜";
+}
+
+
+/* Typographics grid overlay */
+
+.grid{
+    background-image: -moz-linear-gradient(top, rgba(0,0,0,0) 95%, rgba(0,0,0,0.3) 100%); /* FF3.6+ */
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(95%,rgba(0,0,0,0)), color-stop(100%,rgba(0,0,0,0.3))); /* Chrome,Safari4+ */
+    background-image: -webkit-linear-gradient(top, rgba(0,0,0,0) 95%,rgba(0,0,0,0.3) 100%); /* Chrome10+,Safari5.1+ */
+    background-image: -o-linear-gradient(top, rgba(0,0,0,0) 95%, rgba(0,0,0,0.3) 100%); /* Opera11.10+ */
+    background-image: -ms-linear-gradient(top, rgba(0,0,0,0) 95%,rgba(0,0,0,0.3) 100%); /* IE10+ */
+    background-image: linear-gradient(top, rgba(0,0,0,0.3) 95%,rgba(0,0,0,0.3) 100%); /* W3C */
+
+    -webkit-background-size: 100% #{$baseline-height}px;
+         -o-background-size: 100% #{$baseline-height}px;
+            background-size: 100% #{$baseline-height}px;
+}
+
+
+/* Basic mixins */
+
+@mixin background {
+    background-image: -moz-linear-gradient($bg-grad-color, $bg-grad-color), url('bg.png');
+    background-image: -webkit-linear-gradient($bg-grad-color, $bg-grad-color), url('bg.png');
+    background-image: -o-linear-gradient($bg-grad-color, $bg-grad-color), url('bg.png');
+    background-image: -ms-linear-gradient($bg-grad-color, $bg-grad-color), url('bg.png');
+    background-image: linear-gradient($bg-grad-color, $bg-grad-color), url('bg.png');
+}
+
+@mixin typography($size: big) {
+    h3, h4, h5, h6, p, ul, ol, dl, pre, blockquote, table {
+        margin-top: 24px;
+        margin-bottom: 24px;
+    }
+
+    @if $size == big {
+        h1 { @extend .huge }
+        h2 { @extend .large }
+        h3 { @extend .bigger }
+        h4,h5,h6 { @extend .big }
+    } @else {
+        h1 { @extend .large }
+        h2 { @extend .bigger }
+        h3,h4,h5,h6 { @extend .big }
+    }
+
+    h1, h2, h3, h4, h5, h6 {
+        font-weight: normal;
+        padding-left: 48px;
+        margin-left: -48px;
+        margin-top: 36px;
+        margin-bottom: -12px;
+    }
+
+    ul, ol, dd {
+        padding-left: 24px;
+    }
+
+    ul ul, ul ol, ol ul, ol ol {
+        margin-top: 0;
+        margin-bottom: 0;
+    }
+
+    pre {
+        padding-left: 12px;
+        padding-right: 12px;
+        border: 1px solid #ccc;
+        font-family: "Bitstream Vera Sans Mono", Consolas, monospace;
+    }
+
+    dt {
+        font-weight: bold;
+    }
+
+    a {
+        color: $link-color;
+        text-decoration: underline;
+    }
+
+    a:hover, a:link {
+        color: $link-color / 2;
+    }
+}
+
+/*      Default Layout: 992px.
+        Gutters: 24px.
+        Outer margins: 48px.
+        Leftover space for scrollbars @1024px: 32px.
+        -------------------------------------------------------------------------------
+        cols    1     2      3      4      5      6      7      8      9      10
+        px      68    160    252    344    436    528    620    712    804    896    */
+
+body {
+    width: 992px;
+    margin: 0 auto 48px;
+    color: rgb(60,60,60);
+    -webkit-text-size-adjust: 100%; /* Stops Mobile Safari from auto-adjusting font-sizes */
+    @include background;
+}
+
+body > header {
+    position: relative;
+    padding: 12px;
+    font-family: Verdana;
+    color: #eee;
+    -moz-box-shadow:     0 0 24px rgba(0,0,0,0.6);
+    -webkit-box-shadow:  0 0 24px rgba(0,0,0,0.6);
+    box-shadow:          0 0 24px rgba(0,0,0,0.6);
+    z-index: 1;
+}
+
+#logo {
+    font-size: #{$logo-size}px;
+    line-height:  #{$baseline-height * (floor($logo-size / $baseline-height) + 1)}px;
+    margin: 12px;
+    text-shadow: 0px 2px 5px rgba(0, 0, 0, 0.5);
+
+    a {
+        color: #eee;
+        text-decoration: none;
+
+        &:hover {
+            color: #fff;
+        }
+    }
+
+}
+
+#slogan {
+    font-size: 100%;
+    margin: 12px;
+    text-shadow: 0px 2px 5px rgba(0, 0, 0, 0.5);
+}
+
+nav {
+    position: absolute;
+    bottom: 0px;
+    right: 0px;
+    background-color: rgba(255,255,255,0.1);
+
+    li {
+        display: inline-block;
+    }
+
+    ul {
+        margin: 0;
+        padding: 0;
+    }
+
+    a, span {
+        display: block;
+        padding: 12px;
+        color: #ccc;
+        text-decoration: none;
+    }
+
+    span {
+        background-color: rgba(255,255,255,0.3);
+    }
+
+    a:hover {
+        background-color: rgba(255,255,255,0.3);
+    }
+
+}
+
+#wrapper {
+    clear: both;
+    position: relative;
+    background-color: white;
+    -moz-box-shadow:     0 0 24px rgba(0,0,0,0.6);
+    -webkit-box-shadow:  0 0 24px rgba(0,0,0,0.6);
+    box-shadow:          0 0 24px rgba(0,0,0,0.6);
+}
+
+aside {
+    float: right;
+    right: 0;
+    background-color: white;
+    width: 252px;
+    padding: 24px;
+
+    @include typography(small);
+
+    h1, h2, h3, h4, h5, h6 {
+        padding-left: 48px;
+        margin-left: -48px;
+    }
+}
+
+
+aside.banner {
+    @include background;
+    position: relative;
+    width: inherit;
+    margin: 0;
+    float: none;
+    padding: 24px;
+    border: 10px solid rgba(255,255,255,0.1);
+    color: #ccc;
+    font-size: 36px;
+    line-height: 48px;
+
+    a {
+        color: #ccc;
+        text-decoration: underline;
+    }
+
+    a:hover {
+        background-color: rgba(255,255,255,0.3);
+    }
+
+    p {
+        margin: 0;
+    }
+
+    p + p {
+        margin-top: 24px;
+    }
+}
+
+#content {
+    width: 620px;
+    padding: 24px 48px;
+
+    @include typography(big);
+}
+
+footer {
+   background-color: rgba(255,255,255,0.1);
+   min-height: 24px;
+   color: #eee;
+}
+
+
+/*      Tablet Layout: 768px.
+        Gutters: 24px.
+        Outer margins: 28px.
+        Inherits styles from: Default Layout.
+        -----------------------------------------------------------------
+        cols    1     2      3      4      5      6      7      8
+        px      68    160    252    344    436    528    620    712    */
+
+@media only screen and (min-width: 768px) and (max-width: 1005px) {
+
+    body {
+        width: 716px;
+    }
+
+    body > header {
+        padding: 0;
+    }
+
+    aside {
+        position: static;
+        float: right;
+    }
+
+    nav {
+        position: relative;
+        margin-top: 12px;
+    }
+}
+
+
+
+/*      Mobile Layout: 320px.
+        Gutters: 24px.
+        Outer margins: 34px.
+        Inherits styles from: Default Layout.
+        ---------------------------------------------
+        cols    1     2      3
+        px      68    160    252    */
+
+@media only screen and (max-width: 767px) {
+
+    body {
+        width: 320px;
+    }
+
+    body > header {
+        padding: 0;
+    }
+
+    nav {
+        position: relative;
+        margin-top: 12px;
+    }
+
+    aside {
+        position: relative;
+    }
+
+    #content, aside {
+        width: 296px;
+        padding: 24px 12px;
+    }
+
+    #content {
+        h1, h2, h3, h4, h5, h6 {
+            padding-left: 12px;
+            margin-left: -12px;
+        }
+    }
+
+}
+
+
+
+/*      Wide Mobile Layout: 480px.
+        Gutters: 24px.
+        Outer margins: 22px.
+        Inherits styles from: Default Layout, Mobile Layout.
+        ------------------------------------------------------------
+        cols    1     2      3      4      5
+        px      68    160    252    344    436    */
+
+@media only screen and (min-width: 480px) and (max-width: 767px) {
+
+    body {
+        width: 90%;
+    }
+
+    aside {
+        position: relative;
+    }
+
+    #content, aside {
+        width: inherit;
+        padding: 24px 48px;
+    }
+
+    #content {
+        h1, h2, h3, h4, h5, h6 {
+            padding-left: 48px;
+            margin-left: -48px;
+        }
+    }
+
+}
+
+
+/*  Retina media query.
+    Overrides styles for devices with a
+    device-pixel-ratio of 2+, such as iPhone 4.
+    -----------------------------------------------    */
+
+@media
+only screen and (-webkit-min-device-pixel-ratio: 2),
+only screen and (min-device-pixel-ratio: 2) {
+
+    body {
+
+    }
+
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/bg.png b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/bg.png
new file mode 100644
index 0000000..b4df134
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/bg.png
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/default.scss b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/default.scss
new file mode 100644
index 0000000..f76dca4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/default.scss
@@ -0,0 +1,217 @@
+@import 'design';
+
+a:hover {
+    background-color: rgba(0,0,0,0.1);
+}
+
+aside.banner {
+    font-size: 18px;
+    line-height: 27px;
+}
+
+aside a {
+    text-decoration: none;
+
+    &:hover, &:link {
+        text-decoration: underline;
+    }
+
+}
+
+#content {
+    blockquote.information {
+        border-left: 12px solid #080;
+        background-color: #bfb;
+        padding: 12px 12px 12px 0;
+        margin-left: -48px;
+        padding-left: 48px;
+    }
+
+    blockquote.markdown-difference {
+        border-left: 12px solid #dc0;
+        background-color: #ffa;
+        padding: 12px 12px 12px 0;
+        margin-left: -48px;
+        padding-left: 48px;
+
+        &:before {
+            content: "Difference to Standard Markdown";
+            display: block;
+            font-weight: bold;
+        }
+    }
+
+    blockquote pre {
+        border: none;
+    }
+
+    table {
+        border-collapse: collapse;
+        margin-left: auto;
+        margin-right: auto;
+        width: 100%;
+
+        td, th {
+            padding: 3px 5px;
+        }
+        th {
+            background-color: #080;
+            color: white;
+        }
+    }
+
+    pre.show-whitespaces .ws-space {
+        background-color: #f44;
+    }
+    pre.show-whitespaces .ws-space-l {
+        background-color: #f22;
+    }
+    pre.show-whitespaces .ws-space-r {
+        background-color: #f00;
+    }
+    pre.show-whitespaces .ws-tab {
+        background-color: #ff4;
+    }
+    pre.show-whitespaces .ws-tab-l {
+        background-color: #ff2;
+    }
+    pre.show-whitespaces .ws-tab-r {
+        background-color: #ff0;
+    }
+    pre.show-whitespaces.ws-lr .ws-tab {
+        background-color: inherit;
+    }
+    pre.show-whitespaces.ws-lr .ws-space {
+        background-color: inherit;
+        opacity: 0;
+    }
+
+    table.kdexample td {
+        vertical-align: top;
+    }
+
+    table.kdexample pre {
+        margin: 5px 0px;
+    }
+
+    .kdexample:hover .kdexample-after-source {
+        display: block;
+    }
+
+    .kdexample-after-source {
+        display: none;
+        background-color: #ffffee;
+        border: 2px solid #e6e8e9;
+        margin: 0 10px;
+        padding: 5px;
+    }
+
+    .kdexample-after-live {
+        background-color: #eeffee;
+        border: 2px solid #e6e8e9;
+        margin: 5px 0px 12px;
+        padding: 5px;
+    }
+
+    div.kdsyntaxlink {
+        float: right;
+        position: relative;
+        top: -17px;
+        padding: 5px;
+        border: 1px solid #e6e8e9;
+        margin-right: 10px;
+        margin-left: 10px;
+
+        a {
+            text-decoration: none;
+        }
+    }
+}
+
+.news-item {
+    border-top: 2px solid #ddd;
+    margin-top: 46px;
+}
+
+.news-date {
+    float: right;
+    margin-top: 2px;
+    font-size: small;
+    color: #888;
+}
+
+footer {
+    clear: both;
+    font-size: 92%;
+    text-align: left;
+
+    a {
+        color: #898989;
+
+        &:hover {
+            text-decoration: none;
+            color: #666;
+        }
+    }
+}
+
+/* common rules */
+acronym {
+    cursor: help;
+    border-bottom: 1px solid #777;
+}
+
+.float-left {
+    float: left;
+}
+
+.float-right {
+    float: right;
+}
+
+.a-left, tr.a-left td {
+    text-align: left;
+}
+
+.a-center, tr.a-center td {
+    text-align: center;
+}
+
+.a-right, tr.a-right td {
+    text-align: right;
+}
+
+.clear {
+    clear: both;
+}
+
+.inline-important {
+    font-weight: bold;
+    display: block;
+    text-align: center;
+}
+
+
+.patreon, .patreon:hover {
+    border-radius: 50px;
+    padding: 5px 10px;
+    margin: 0 5px;
+    display: inline-block;
+    text-decoration: none !important;
+    background-color: #e6461a !important;
+    box-shadow: 0px 0px 5px 5px #e6461a;
+    color: white !important;
+    font-weight: bold;
+
+    &:hover {
+      box-shadow: 0px 0px 0px 5px #e6461a;
+    }
+}
+
+#call-to-arms {
+  text-align: center;
+  margin: 40px 0 10px;
+  background-color: rgba(255, 255, 255, 0.18);
+  padding: 30px;
+  border-radius: 100px;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/default.template b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/default.template
new file mode 100644
index 0000000..d7e9a3f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/default.template
@@ -0,0 +1,62 @@
+<!doctype html>
+<html xml:lang="{lang:}" lang="{lang:}">
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+    <meta name="author" content="Thomas Leitner" />
+    <meta name="copyright" content="2009-2016 Thomas Leitner" />
+    <meta name="description" content="kramdown is a fast, pure-Ruby Markdown-superset converter" />
+    <meta name="keywords" content="ruby, kramdown, markdown, text markup" />
+    <link href="{relocatable: default.css}" type="text/css" rel="stylesheet" media="screen,projection" />
+    <link href="{relocatable: news.atom}" type="application/atom+xml" rel="alternate" />
+    <script src="//kramdown.gettalong.org/MathJax/MathJax.js" type="text/javascript"></script>
+    <title>{title:} | kramdown</title>
+  </head>
+  <body>
+    <header>
+      <hgroup>
+        <h1 id="logo"><a href="{relocatable: /}" title="Homepage">kramdown</a></h1>
+        <h2 id="slogan">fast, pure-Ruby Markdown-superset converter</h2>
+      </hgroup>
+
+      <nav>
+        {menu: {options: {mi: {in_menu: true}, sort: sort_info, flatten: true}}}
+      </nav>
+    </header>
+
+    <div id="wrapper">
+      <% if context.content_node.blocks.has_key?('intro') %>
+      <aside class="banner">
+        <webgen:block name="intro" node="first" />
+      </aside>
+      <% end %>
+
+      <aside>
+        <webgen:block name="sidebar" node="first" notfound="ignore" />
+
+        <webgen:block name="content" chain="sidebar.template" />
+      </aside>
+
+      <div id="content">
+        <webgen:block name="content" node="first" />
+      </div>
+      <div style="clear:both"></div>
+    </div>
+
+    <footer>
+      <div class="float-left">Copyright © 2009-2016 Thomas Leitner</div>
+      <div class="float-right">Generated by <a href="http://webgen.gettalong.org">webgen</a></div>
+    </footer>
+
+    <!-- Start of StatCounter Code for Default Guide -->
+    <script type="text/javascript">
+      var sc_project=4267845;
+      var sc_invisible=1;
+      var sc_security="41321455";
+      var scJsHost = (("https:" == document.location.protocol) ? "https://secure." : "http://www.");
+      document.write("<sc"+"ript type='text/javascript' src='" + scJsHost + "statcounter.com/counter/counter.js'></" + "script>");
+     </script>
+     <noscript><div class="statcounter"><a title="website statistics" href="http://statcounter.com/" target="_blank"><img class="statcounter" src="//c.statcounter.com/4267845/0/41321455/1/" alt="website statistics" /></a></div></noscript>
+     <!-- End of StatCounter Code for Default Guide -->
+
+  </body>
+</html>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/documentation.page b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/documentation.page
new file mode 100644
index 0000000..ebafaaf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/documentation.page
@@ -0,0 +1,84 @@
+---
+title: Documentation
+in_menu: true
+sort_info: 7
+---
+# kramdown Documentation
+
+## Overview
+
+kramdown is first and foremost a library for converting text written in a superset of Markdown to
+HTML. However, due to its modular architecture it is able to support additional input and output
+formats. The following input and output formats are currently supported:
+
+* Input: [kramdown](parser/kramdown.html) (a superset of Markdown),
+  [Markdown](parser/markdown.html), [Github Flavored Markdown](parser/gfm.html), [HTML](parser/html.html)
+
+* Output: [HTML](converter/html.html), [LaTeX](converter/latex.html),
+  [kramdown](converter/kramdown.html), [RemoveHtmlTags](converter/remove_html_tags.html) (a special
+  converter which removes HTML tags, normally used in conjunction with the LaTeX or kramdown
+  converters)
+
+The [kramdown syntax page](syntax.html) describes in detail what is supported and how it differs
+from standard Markdown.
+
+For all available options have a look at the [options documentation](options.html) or have a look at
+a parser/converter page to see which options they support!
+
+
+## Usage
+
+{:ruby: .language-ruby}
+
+The kramdown package provides two ways for using it:
+
+* **As a library**
+
+  kramdown uses basically the same API as [RedCloth], [BlueCloth] and [Maruku]:
+
+      require 'kramdown'
+
+      puts Kramdown::Document.new(text).to_html
+  {:ruby}
+
+  The second parameter to the `new` call is an options hash for (de)activating certain features. For
+  example, to disable automatic header ID generation, you can do the following:
+
+      puts Kramdown::Document.new(text, :auto_ids => false).to_html
+  {:ruby}
+
+  The default parser used is `kramdown`, however, you can select a different one with the `:input`
+  option:
+
+      puts Kramdown::Document.new(text, :input => 'html').to_latex
+  {:ruby}
+
+  You can also reuse the created document object to produce multiple outputs:
+
+      doc = Kramdown::Document.new(text, :input => 'html')
+      puts doc.to_html
+      puts doc.to_latex
+  {:ruby}
+
+  More information on how to use or extend kramdown can be found in the [API
+  documentation](rdoc/index.html)!
+
+* **As an application**
+
+  Together with the library files a binary called `kramdown` is shipped which can be used to convert
+  text in any supported input format to any supported output format. It either reads from the files
+  specified as the command line arguments or from the standard input. For example:
+
+      kramdown path/to/kramdown/doc/syntax.page
+
+  The input and output formats as well as all available kramdown options are supported through
+  command line switches.
+
+
+## Tests
+
+kramdown uses various test suites to verify the correct working of the parsers and converters. For
+more information, have a look at the [tests document](tests.html).
+
+
+{include_file: doc/links.markdown}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/documentation.template b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/documentation.template
new file mode 100644
index 0000000..0e6cdc4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/documentation.template
@@ -0,0 +1,34 @@
+--- name:sidebar pipeline:erb,tags,kramdown
+<div style="text-align: right">
+<a href="https://www.patreon.com/bePatron?u=4908963" class="patreon">Become a Patron!</a>
+</div>
+
+<h1>Documentation</h1>
+
+* Parsers
+  * [kramdown](parser/kramdown.html)
+  * [Markdown](parser/markdown.html)
+  * [GFM](parser/gfm.html)
+  * [HTML](parser/html.html)
+* Converters
+  * [HTML](converter/html.html)
+  * [LaTeX](converter/latex.html)
+  * [man](converter/man.html)
+  * [kramdown](converter/kramdown.html)
+  * [RemoveHtmlTags](converter/remove_html_tags.html)
+* Syntax Highlighters
+  * [Coderay](syntax_highlighter/coderay.html)
+  * [Rouge](syntax_highlighter/rouge.html)
+* Math Engines
+  * [MathJax](math_engine/mathjax.html)
+  * [Ritex](math_engine/ritex.html)
+  * [itex2MML](math_engine/itex2mml.html)
+  * [Mathjax-Node](math_engine/mathjaxnode.html)
+* [Configuration Options](options.html)
+* [Tests](tests.html)
+
+<% if context.node.children.first && context.node.children.first.children.length > 1 %>
+<h1>Contents</h1>
+<% end %>
+
+{menu: {options: {descendants: true, levels: [3,6]}}}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/index.page b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/index.page
new file mode 100644
index 0000000..5124447
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/index.page
@@ -0,0 +1,113 @@
+---
+title: Home
+in_menu: true
+sort_info: 1
+---
+## Overview
+
+If you want to get started with kramdown, have a look at the [installation page](installation.html)
+to see how you can install it on your system. Then look through the
+[documentation](documentation.html) for finding information about how to actually use kramdown and
+its parsers/converters. The [quick reference](quickref.html) provides a overview of the syntax -- if
+you need a more detailed description of the superset of Markdown which kramdown supports the [syntax
+page](syntax.html) is the place to go!
+
+{tikz::
+path: overview.png
+img_attr: {style: 'background:transparent'}
+content_processor.tikz.libraries: [mindmap, trees, arrows]
+content_processor.tikz.transparent: true
+content_processor.tikz.resolution: 300 100
+content_processor.tikz.opts: |
+  mindmap, concept color=black, text=white,
+  root concept/.append style={font=\Large},
+  level 1 concept/.append style={font=\Large, minimum size=2.6cm},
+  level 2 concept/.append style={font=\Large},
+}
+\node[concept, font=\Large] (lib) {kramdown's internal representation}
+  child[concept color=orange, grow=120, ->] {node[concept] (i-kramdown) {kramdown}}
+  child[concept color=orange, grow=160] {node[concept] (i-html) {HTML}}
+  child[concept color=orange, grow=200] {node[concept] (i-gfm) {GFM}}
+  child[concept color=orange, grow=240] {node[concept] (i-markdown) {Markdown}}
+  child[concept color=green!50!black, grow=60] {node[concept] (o-html) {HTML}}
+  child[concept color=green!50!black, grow=20] {node[concept] (o-kramdown) {kramdown}}
+  child[concept color=green!50!black, grow=-20] {
+    node[concept] (o-latex) {\LaTeX}
+    child[grow=0] {
+      node[concept] (o-latex-pdf) {PDF}
+    }
+  }
+  child[concept color=green!50!black, grow=-60] {node[concept] (o-pdf) {PDF}}
+;
+\draw [dash pattern=on 0pt off 2pt,line width=5pt,arrows=-angle 60,shorten >=15pt,shorten <=10pt,color=orange]
+   (i-kramdown) edge(lib)
+   (i-markdown) edge(lib)
+   (i-html) edge (lib)
+   (i-gfm) edge (lib);
+\draw [dash pattern=on 0pt off 2pt,line width=5pt,arrows=-angle 60,shorten >=10pt,shorten <=15pt,color=green!50!black]
+   (lib) edge(o-html)
+   (lib) edge (o-kramdown)
+   (lib) edge (o-latex)
+   (lib) edge (o-pdf);
+{tikz}
+{: style="text-align: center"}
+
+
+## Bugs, Forums, Mailing Lists
+
+If you have found a bug, you should [report it here][bug_report]. Also, there is the [kramdown-users
+google group][ml] available if you have any questions!
+
+[bug_report]: http://github.com/gettalong/kramdown/issues
+[ml]: https://groups.google.com/forum/#!forum/kramdown-users
+
+
+## Thanks
+
+kramdown would not be possible without the prior work of many other people. I want to thank everyone
+involved with making Markdown such a nice markup language and especially the developers of other
+Markdown implementations because kramdown borrowed many ideas from existing packages.
+
+
+## Author
+
+* Thomas Leitner
+* e-Mail: <mailto:t_leitner@gmx.at>
+
+[PHP Markdown Extra]: http://michelf.com/projects/php-markdown/extra/
+[Maruku]: http://maruku.rubyforge.org
+[BlueFeather]: http://ruby.morphball.net/bluefeather/index_en.html
+
+--- intro
+<div markdown="1" itemscope="" itemtype="http://schema.org/SoftwareApplication">
+<meta itemprop="applicationCategory" content="Markdown library, Markdown converter" />
+<meta itemprop="operatingSystem" content="Linux, Windows, Mac OS X" />
+<div itemprop="author" itemscope="" itemtype="http://schema.org/Person">
+<meta itemprop="name" content="Thomas Leitner" />
+<meta itemprop="email" content="t_leitner@gmx.at" />
+</div>
+
+**kramdown**{:itemprop="name"} (sic, not Kramdown or KramDown, just kramdown) is a *free*
+[MIT](https://github.com/gettalong/kramdown/blob/master/COPYING){:itemprop="license"}-licensed
+[Ruby](http://www.ruby-lang.org) library for parsing and converting a superset of Markdown. It is
+completely written in Ruby, supports standard Markdown (with some minor modifications) and various
+extensions that have been made popular by the [PHP Markdown Extra] package and [Maruku].
+{:itemprop="description"}
+
+It is probably the fastest pure-Ruby Markdown converter available (September 2014), being about 3x
+faster than [Maruku] and about 4.5x faster than [BlueFeather].
+
+Version **1.14.0**{:itemprop="softwareVersion"} released on
+**2017-06-26**{:itemprop="datePublished"}, [more news](news.html)
+{: style="text-align: center; font-size: 80%"}
+
+</div>
+
+<div id="call-to-arms">
+Support kramdown development and <a href="https://www.patreon.com/bePatron?u=4908963" class="patreon">become a patron</a>!
+</div>
+
+
+[PHP Markdown Extra]: http://michelf.com/projects/php-markdown/extra/
+[Maruku]: http://maruku.rubyforge.org
+[BlueFeather]: http://ruby.morphball.net/bluefeather/index_en.html
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/installation.page b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/installation.page
new file mode 100644
index 0000000..ca694de
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/installation.page
@@ -0,0 +1,86 @@
+---
+title: Installation
+in_menu: true
+sort_info: 5
+---
+# Download & Installation
+
+## Dependencies
+
+Since kramdown is written in Ruby, you just need the [Ruby interpreter](http://www.ruby-lang.org),
+version 1.8.5, 1.8.6, 1.8.7, 1.9.2, 1.9.3 or 2.x. There are no other dependencies.
+
+
+## Compatibility Notes
+
+kramdown should work on any platform which supports Ruby. It has been successfully tested on the
+following platforms:
+
+* Linux with Ruby 1.8.7, 1.9.3, 2.x, jruby 1.7.19 and jruby 9.0.0.0.
+
+See the platform specific installation notes for more information!
+
+
+## Platform Specific Installation Instructions
+
+### Linux
+
+There are a variety of Linux distributions out there with different package management systems. So
+we will focus on instructions for Ubuntu 15.04 here (which should probably also work for any newer
+Ubuntu version or any recent Debian based distribution).
+
+After running the following commands, kramdown is installed and ready to use:
+
+    sudo apt-get install ruby
+    sudo gem install kramdown
+
+
+### Mac OS X
+
+Mac OS X Snow Leopard comes with Ruby and Rubygems preinstalled. So installing kramdown is as easy
+as running:
+
+    sudo gem install kramdown
+
+
+### Windows
+
+You need to install Ruby first. This can easily be done by using the [RubyInstaller] - just download
+the installation binary and run it. After that open a command shell (select `Start -> Run...`, then
+enter `cmd` and click on `Ok`) and type in the following:
+
+    gem install kramdown
+
+[RubyInstaller]: http://rubyinstaller.org
+
+
+## Generic Installation Instructions
+
+
+### Using Rubygems
+
+If you are using Rubygems, installing the latest version of kramdown is as simple as executing
+
+    gem install kramdown
+
+
+### Manual Installation
+
+The latest version of kramdown can always be downloaded as `.tar.gz` or `.zip` via the [Github
+releases page][ghreleases]. After the download the package needs to be decompressed and then you can
+install kramdown using the included `setup.rb` installation method:
+
+    $ ruby setup.rb config
+    $ ruby setup.rb setup
+    $ ruby setup.rb install
+
+[ghreleases]: https://github.com/gettalong/kramdown/releases
+
+
+### Using the repository version
+
+kramdown uses git as its versioning system and kramdown's repository is hosted on GitHub. The
+repository always contains a clean state of the current development version of kramdown. To check
+out kramdown use the following command:
+
+     git clone git://github.com/gettalong/kramdown.git
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/links.markdown b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/links.markdown
new file mode 100644
index 0000000..6baa05a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/links.markdown
@@ -0,0 +1,6 @@
+[Maruku]: http://maruku.rubyforge.org
+[PHP Markdown Extra]: http://michelf.com/projects/php-markdown/extra/
+[Pandoc]: http://johnmacfarlane.net/pandoc/
+[MathJax]: http://www.mathjax.org
+[BlueCloth]: http://deveiate.org/projects/BlueCloth
+[RedCloth]: http://redcloth.org/
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/metainfo b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/metainfo
new file mode 100644
index 0000000..efce601
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/metainfo
@@ -0,0 +1,3 @@
+--- alcn
+[converter/*.html, parser/*.html, documentation.en.html, options.en.html, tests.en.html]:
+  template: ../documentation.template
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/news.feed b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/news.feed
new file mode 100644
index 0000000..65e511f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/news.feed
@@ -0,0 +1,9 @@
+---
+title: kramdown News
+description: kramdown - a fast, pure Ruby Markdown-superset converter
+author: Thomas Leitner
+author_url: http://kramdown.gettalong.org
+entries: {alcn: news/*.html, sort: sort_info, reverse: true, limit: 10}
+versions:
+  atom:
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/news.page b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/news.page
new file mode 100644
index 0000000..b0f7f42
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/news.page
@@ -0,0 +1,29 @@
+---
+title: News
+in_menu: false
+sort_info: 30
+--- pipeline:tags,blocks,fragments
+
+<h1>News</h1>
+
+<a href="{relocatable: news.atom}">Atom-Feed</a>
+
+<webgen:block name="newsdata" node="current" />
+
+--- name:newsdata pipeline:erb
+<%
+opts = {:alcn => '/news/*.html', :sort => 'sort_info', :reverse => true, :flatten => true}
+context.website.ext.item_tracker.add(context.dest_node, :nodes, :node_finder_option_set,
+  {:opts => opts, :ref_alcn => context.node.alcn}, :content)
+context.website.ext.node_finder.find(opts, context.node).each do |node|
+ # context.options['contentprocessor.kramdown.options'] = {:auto_id_prefix => node.lcn.tr('.', '-')}
+%>
+
+<div class='news-item'>
+<div class="news-date float-right">
+  Published on <%= node['created_at'].strftime("%A, %d %B %Y") %>
+</div>
+<%= context.render_block(:name => 'content', :chain => [node]) %>
+</div>
+
+<% end %>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/options.page b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/options.page
new file mode 100644
index 0000000..6b8bb48
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/options.page
@@ -0,0 +1,49 @@
+---
+title: Options
+---
+## Options
+
+The behaviour of kramdown can be adjusted via the available options.
+
+Options can be specified in multiple ways:
+
+On the command line
+: The `kramdown` binary allows setting any option by using command line switches.
+
+  For example, the following command will disable automatic header ID generation and defines the
+  first footnote number as 5:
+
+  ~~~
+  $ kramdown --no-auto-ids --footnote-nr 5
+  ~~~
+
+  As you can see all underscores in option names have to be replaced with dashes. The built-in help
+  of the binary as well as the man-page show all available options.
+
+Within a kramdown document
+: By using the special extension syntax, it is possible to set options within a document.
+
+  Using the above example, the options would be set like this within a document:
+
+  ~~~
+  {::options auto_ids="false" footnote_nr="5" /}
+  ~~~
+
+Using Ruby code
+
+: If you are using kramdown as a library, you can pass any options as second parameter to the
+  `Kramdown::Document.new` method.
+
+  Again, using the above example you would initalize the kramdown document class as follows:
+
+  ~~~ ruby
+  Kramdown::Document.new(source_text, \{auto_ids: false, footnote_nr: 5})
+  ~~~
+
+
+## Available Options
+
+Below is a list of all currently available options. Have a look at the documentation of a converter
+or parser to see directly which options they support!
+
+{options: {items: all}}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/quickref.page b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/quickref.page
new file mode 100644
index 0000000..eeeacfb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/quickref.page
@@ -0,0 +1,603 @@
+---
+title: Quick Reference
+in_menu: true
+sort_info: 9
+--- name:sidebar
+<div style="text-align: right">
+<a href="https://www.patreon.com/bePatron?u=4908963" class="patreon">Become a Patron!</a>
+</div>
+
+<h1>Contents</h1>
+
+{menu: {options: {descendants: true, levels: [2,6]}}}
+--- name:content
+# Quick Reference
+
+Below are examples of all available structural elements that can be used in a kramdown text. Since
+the kramdown syntax is a superset of the Markdown syntax, only a small part of the available syntax
+is not available in standard Markdown syntax. Note, that only the most basic syntax information is
+given. However, a link to the detailed syntax for each element is provided (which also details the
+differences to the standard Markdown syntax). The quick reference is for version **<%=
+::Kramdown::VERSION %>** of the syntax documentation.
+
+kramdown has two main classes of elements: block and span-level elements. Block-level elements are
+used to create paragraphs, headers, lists and so on whereas span-level elements are used to markup
+text phrases as emphasized, as a link and so on.
+
+All examples below feature the kramdown source, the converted HTML source (shown when hovering over
+the kramdown source) and the output as it appears in the browser. This looks like this:
+
+<table class="kdexample">
+<tr>
+<td><pre class="kdexample-before"><code>kramdown example code</code></pre></td>
+<td><pre class="kdexample-after-source"><code>Example code converted to HTML</code></pre>
+<div class="kdexample-after-live" style="clear:none">
+Live browser view of example code
+</div>
+</td>
+</tr>
+</table>
+
+
+# Block-level Elements - Main Structural Elements
+
+## Paragraphs
+
+{kdlink: {oid: paragraphs, part: "paragraphs"}}
+
+Consecutive lines of text are considered to be one paragraph. As with other block level elements you
+have to add a blank line to separate it from the following block-level element:
+
+{kdexample::}
+The first paragraph.
+
+Another paragraph
+{kdexample}
+
+Explicit line breaks in a paragraph can be made by using two spaces or two backslashes at the end of a line:
+
+{kdexample::}
+This is a paragraph  
+which contains a hard line break.
+{kdexample}
+
+
+## Headers
+
+{kdlink: {oid: headers, part: "headers"}}
+
+kramdown supports Setext style headers and atx style headers. A header must always be preceded by a
+blank line except at the beginning of the document:
+
+
+{kdexample::}
+First level header
+==================
+
+Second level header
+-------------------
+{kdexample}
+
+{kdexample::}
+# H1 header
+
+## H2 header
+
+### H3 header
+
+#### H4 header
+
+##### H5 header
+
+###### H6 header
+{kdexample}
+
+If you set the option `auto_ids` to `false` (for example, by using the `options` extension, see
+[Extensions](#extensions)), then the automatic header ID generation is turned off:
+
+{kdexample::}
+{::options auto_ids="false" /}
+
+# A header without an ID
+{kdexample}
+
+
+## Blockquotes
+
+{kdlink: {oid: blockquotes, part: "blockquotes"}}
+
+A blockquote is started using the `>` marker followed by an optional space; all following lines that
+are also started with the blockquote marker belong to the blockquote. You can use any block-level
+elements inside a blockquote:
+
+{kdexample::}
+> A sample blockquote.
+>
+> >Nested blockquotes are
+> >also possible.
+>
+> ## Headers work too
+> This is the outer quote again.
+{kdexample}
+
+You may also be lazy with the `>` markers as long as there is no blank line:
+
+{kdexample::}
+> This is a blockquote
+continued on this
+and this line.
+
+But this is a separate paragraph.
+{kdexample}
+
+## Code Blocks
+
+{kdlink: {oid: code-blocks, part: "code blocks"}}
+
+kramdown supports two different code block styles. One uses lines indented with either four spaces
+or one tab whereas the other uses lines with tilde characters as delimiters -- therefore the content
+does not need to be indented:
+
+{kdexample::}
+    This is a sample code block.
+
+    Continued here.
+{kdexample}
+
+{kdexample::}
+~~~~~~
+This is also a code block.
+~~~
+Ending lines must have at least as
+many tildes as the starting line.
+~~~~~~~~~~~~
+{kdexample}
+
+The following is a code block with a language specified:
+
+{kdexample::}
+~~~ ruby
+def what?
+  42
+end
+~~~
+{kdexample}
+
+
+## Horizontal Rules
+
+{kdlink: {oid: horizontal-rules, part: "horizontal rules"}}
+
+It is easy to insert a horizontal rule in kramdown: just use three or more asterisks, dashes or
+underscores, optionally separated by spaces or tabs, on an otherwise blank line:
+
+{kdexample::}
+* * *
+
+\---
+
+  _  _  _  _
+
+---------------
+{kdexample}
+
+
+## Lists
+
+{kdlink: {oid: lists, part: "lists"}}
+
+kramdown supports ordered and unordered lists. Ordered lists are started by using a number followed
+by a period, a space and then the list item text. The content of a list item consists of block-level
+elements. All lines which have the same indent as the text of the line with the list marker belong
+to the list item:
+
+{kdexample::}
+1. This is a list item
+2. And another item
+2. And the third one
+   with additional text
+{kdexample}
+
+As with block quotes, you may be lazy when using the list item marker:
+
+{kdexample::}
+* A list item
+with additional text
+{kdexample}
+
+As the content consists of block-level elements you can do things like the following:
+
+{kdexample::}
+1.  This is a list item
+
+    > with a blockquote
+
+    # And a header
+
+2.  Followed by another item
+{kdexample}
+
+Nested lists are also easy to create:
+
+{kdexample::}
+1. Item one
+   1. sub item one
+   2. sub item two
+   3. sub item three
+2. Item two
+{kdexample}
+
+Lists can occur directly after other block-level elements, however, there has to be at least one
+blank line if you want to follow a paragraph with a list:
+
+{kdexample::}
+This is a paragraph.
+1. This is NOT a list.
+
+1. This is a list!
+{kdexample}
+
+Unordered lists are started by using an asterisk, a dash or a plus sign (they can be mixed) and a
+space. Apart from that unordered lists follow the same rules as ordered lists:
+
+{kdexample::}
+* Item one
++ Item two
+- Item three
+{kdexample}
+
+## Definition Lists
+
+{kdlink: {oid: definition-lists, part: "definition lists"}}
+
+A definition list works similar to a normal list and is used to associate definitions with terms.
+Definition lists are started when a normal paragraph is followed by a line starting with a colon and
+then the definition text. One term can have many definitions and multiple terms can have the same
+definition. Each line of the preceding paragraph is assumed to contain one term, for example:
+
+{kdexample::}
+term
+: definition
+: another definition
+
+another term
+and another term
+: and a definition for the term
+{kdexample}
+
+If you insert a blank line before a definition (note: there must only be one blank line between the
+terms and the first definition), the definition will be wrapped in a paragraph:
+
+{kdexample::}
+term
+
+: definition
+: definition
+{kdexample}
+
+Each term can be styled using span-level elements and each definition is parsed as block-level
+elements, i.e. you can use any block-level in a definition. Just use the same indent for the lines
+following the definition line:
+
+{kdexample::}
+This *is* a term
+
+: This will be a para
+
+  > a blockquote
+
+  # A header
+{kdexample}
+
+
+## Tables
+
+{kdlink: {oid: tables, part: "tables"}}
+
+kramdown supports a syntax for creating simple tables. A line starting with a pipe character (`|`)
+starts a table row. However, if the pipe characters is immediately followed by a dash (`-`), a
+separator line is created. Separator lines are used to split the table header from the table body
+(and optionally align the table columns) and to split the table body into multiple parts. If the
+pipe character is followed by an equal sign (`=`), the tables rows below it are part of the table
+footer.
+
+{kdexample::}
+| A simple | table |
+| with multiple | lines|
+{kdexample}
+
+{kdexample::}
+| Header1 | Header2 | Header3 |
+|:--------|:-------:|--------:|
+| cell1   | cell2   | cell3   |
+| cell4   | cell5   | cell6   |
+|----
+| cell1   | cell2   | cell3   |
+| cell4   | cell5   | cell6   |
+|=====
+| Foot1   | Foot2   | Foot3
+{: rules="groups"}
+{kdexample}
+
+
+## HTML elements
+
+{kdlink: {oid: html-blocks, part: "HTML blocks"}}
+
+kramdown allows you to use block-level HTML tags (`div`, `p`, `pre`, ...) to markup whole blocks of
+text -- just start a line with a block-level HTML tag. kramdown syntax is normally not processed
+inside an HTML tag but this can be changed with the `parse_block_html` option. If this options is
+set to `true`, then the content of a block-level HTML tag is parsed by kramdown either as block
+level or span-level text, depending on the tag:
+
+{kdexample::}
+<div style="float: right">
+Something that stays right and is not wrapped in a para.
+</div>
+
+{::options parse_block_html="true" /}
+
+<div>
+This is wrapped in a para.
+</div>
+<p>
+This can contain only *span* level elements.
+</p>
+{kdexample}
+
+
+## Block Attributes
+
+{kdlink: {oid: block-ials, part: "block IALs"}}
+{kdlink: {oid: attribute-list-definitions, part: "ALDs"}}
+
+You can assign any attribute to a block-level element. Just directly follow the block with a *block
+inline attribute list* (or short: block IAL). A block IAL consists of a left curly brace, followed
+by a colon, the attribute definitions and a right curly brace. Here is a simple example which sets the
+`title` attribute of a block quote:
+
+{kdexample::}
+> A nice blockquote
+{: title="Blockquote title"}
+{kdexample}
+
+As one often wants to set one or more CSS classes on an element, there is an easy shortcut:
+
+{kdexample::}
+> A nice blockquote
+{: .class1 .class2}
+{kdexample}
+
+A shortcut for setting the ID is also provided. Just prefix the ID with a hash symbol:
+
+{kdexample::}
+> A nice blockquote
+{: #with-an-id}
+{kdexample}
+
+Sometimes one wants to use the same attributes for many elements. kramdown allows you to define the
+attributes in one place with an *attribute list definition* (or short: ALD) and just reference this
+definition in a block IAL. An ALD has the same structure as a block IAL but the colon has to be
+replace with a colon, the reference name and another colon. By just using the reference name as-is
+in a block IAL, one can include the attributes of the referenced ALD:
+
+{kdexample::}
+{:refdef: .c1 #id .c2 title="title"}
+paragraph
+{: refdef}
+{kdexample}
+
+The order in a block IAL or ALD is important because later defined attributes overwrite (with the
+exception of the shortcut for CSS classes) prior defined attributes:
+
+{kdexample::}
+{:refdef: .c1 #id .c2 title="title"}
+paragraph
+{: refdef .c3 title="t" #para}
+{kdexample}
+
+
+## Extensions
+
+{kdlink: {oid: extensions, part: "extensions"}}
+
+kramdown provides some less used functionality through a common syntax. This will allow the easy
+addition of other extensions if need arises. Currently, there are extensions for ignoring text (i.e.
+treating text as comment), for inserting arbitrary text as-is into the output and for setting
+kramdown options.
+
+Here is an example that shows how to insert comments into text:
+
+{kdexample::}
+This is a paragraph
+{::comment}
+This is a comment which is
+completely ignored.
+{:/comment}
+... paragraph continues here.
+
+Extensions can also be used
+inline {::nomarkdown}**see**{:/}!
+{kdexample}
+
+As one can see from the above example, the syntax for extensions is nearly identical to that of
+ALDs. However, there is no trailing colon after the extension name and the extension end tag needs a
+slash between the colon and the extension name. One can also use the short form of the end tag, i.e.
+`{:/}`. Attribute definitions can be specified on the start tag by separating them with a space from
+the extension name. Also, if the extension does not have a body, there needs to be a slash right
+before the closing brace:
+
+{kdexample::}
+{::options auto_ids="false" /}
+
+# Header without id
+{kdexample}
+
+
+
+
+# Span-Level Elements - Text Modifiers
+
+## Emphasis
+
+{kdlink: {oid: emphasis, part: "emphasis"}}
+
+Emphasis can be added to text by surrounding the text with either asterisks or underscores:
+
+{kdexample::}
+This is *emphasized*,
+_this_ too!
+{kdexample}
+
+Strong emphasis can be done by doubling the delimiters:
+
+{kdexample::}
+This is **strong**,
+__this__ too!
+{kdexample}
+
+The form with the asterisks can also be used to markup parts of words:
+
+{kdexample::}
+This w**ork**s as expected!
+{kdexample}
+
+
+## Links and Images
+
+{kdlink: {oid: links-and-images, part: "links and images"}}
+
+A simple link can be created by surrounding the text with square brackets and the link URL with
+parentheses:
+
+{kdexample::}
+A [link](http://kramdown.gettalong.org)
+to the kramdown homepage.
+{kdexample}
+
+You can also add title information to the link:
+
+{kdexample::}
+A [link](http://kramdown.gettalong.org "hp")
+to the homepage.
+{kdexample}
+
+There is another way to create links which does not interrupt the text flow. The URL and title are
+defined using a reference name and this reference name is then used in square brackets instead of
+the link URL:
+
+{kdexample::}
+A [link][kramdown hp]
+to the homepage.
+
+[kramdown hp]: http://kramdown.gettalong.org "hp"
+{kdexample}
+
+If the link text itself is the reference name, the second set of square brackets can be omitted:
+
+{kdexample::}
+A link to the [kramdown hp].
+
+[kramdown hp]: http://kramdown.gettalong.org "hp"
+{kdexample}
+
+Images can be created in a similar way: just use an exclamation mark before the square brackets. The
+link text will become the alternative text of the image and the link URL specifies the image source:
+
+{kdexample::}
+An image: ![gras](img/image.jpg)
+{kdexample}
+
+
+## Inline Code
+
+{kdlink: {oid: code-spans, part: "code spans"}}
+
+Text phrases can be easily marked up as code by surrounding them with backticks:
+
+{kdexample::}
+Use `Kramdown::Document.new(text).to_html`
+to convert the `text` in kramdown
+syntax to HTML.
+{kdexample}
+
+If you want to use literal backticks in your code, just use two or more backticks as delimiters. The
+space right after the beginning delimiter and the one right before the closing delimiter are ignored:
+
+{kdexample::}
+Use backticks to markup code,
+e.g. `` `code` ``.
+{kdexample}
+
+
+## Footnotes
+
+{kdlink: {oid: footnotes, part: "footnotes"}}
+
+Footnotes can easily be used in kramdown. Just set a footnote marker (consists of square brackets
+with a caret and the footnote name inside) in the text and somewhere else the footnote definition (which
+basically looks like a reference link definition):
+
+{kdexample::}
+This is a text with a
+footnote[^1].
+
+[^1]: And here is the definition.
+{kdexample}
+
+The footnote definition can contain any block-level element, all lines following a footnote
+definition indented with four spaces or one tab belong to the definition:
+
+{kdexample::}
+This is a text with a
+footnote[^2].
+
+[^2]:
+    And here is the definition.
+
+    > With a quote!
+{kdexample}
+
+As can be seen above the footnote name is only used for the anchors and the numbering is done
+automatically in document order.  Repeated footnote markers will link to the same footnote
+definition.
+
+
+## Abbreviations
+
+{kdlink: {oid: abbreviations, part: "abbreviations"}}
+
+Abbreviations will work out of the box once you add an abbreviation definition. So you can just
+write the text and add the definitions later on.
+
+{kdexample::}
+This is an HTML
+example.
+
+*[HTML]: Hyper Text Markup Language
+{kdexample}
+
+
+## HTML Elements
+
+{kdlink: {oid: html-spans, part: "HTML spans"}}
+
+HTML is not only supported on the block-level but also on the span-level:
+
+{kdexample::}
+This is <span style="color: red">written in
+red</span>.
+{kdexample}
+
+
+## Inline Attributes
+
+{kdlink: {oid: span-ials, part: "span IALs"}}
+
+As with a block-level element you can assign any attribute to a span-level elements using a *span
+inline attribute list* (or short: span IAL). A span IAL has the same syntax as a block IAL and must
+immediately follow the span-level element:
+
+{kdexample::}
+This is *red*{: style="color: red"}.
+{kdexample}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/sidebar.template b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/sidebar.template
new file mode 100644
index 0000000..20f3533
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/sidebar.template
@@ -0,0 +1,25 @@
+<h2>Support kramdown</h2>
+
+<p>If you like kramdown and would like to support it, you are welcome to make a small
+donation (Patreon, PayPal or Pledgie) -- it will surely be appreciated! Thanks!</p>
+
+<div style="text-align: center">
+
+<a href="https://www.patreon.com/bePatron?u=4908963" class="patreon">Become a Patron!</a>
+
+<form style="margin-top: 15px" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
+<input type="hidden" name="cmd" value="_s-xclick">
+<input type="hidden" name="hosted_button_id" value="99HUWKWPMUHWG">
+<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
+<img alt="" border="0" src="https://www.paypalobjects.com/de_DE/i/scr/pixel.gif" width="1" height="1">
+</form>
+
+<a href='https://pledgie.com/campaigns/16657'><img alt='Click here to lend your support to: kramdown and make a donation at pledgie.com !' src='https://pledgie.com/campaigns/16657.png?skin_name=chrome' border='0' ></a>
+
+</div>
+
+<h2>Sponsors</h2>
+
+<p>GROSSWEBER provides <a href="http://grossweber.com/b/kramdown" target="_blank">software
+development consulting and training services</a>. <em>We like to work on open source. We use it heavily.
+We love kramdown!</em></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/sitemap.sitemap b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/sitemap.sitemap
new file mode 100644
index 0000000..1f19756
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/sitemap.sitemap
@@ -0,0 +1,5 @@
+---
+entries:
+  alcn: /**/*.html
+default_change_freq: monthly
+---
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/syntax.page b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/syntax.page
new file mode 100644
index 0000000..fa3c442
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/syntax.page
@@ -0,0 +1,1795 @@
+---
+title: Syntax
+in_menu: true
+sort_info: 10
+--- name:sidebar
+<div style="text-align: right">
+<a href="https://www.patreon.com/bePatron?u=4908963" class="patreon">Become a Patron!</a>
+</div>
+
+<h1>Contents</h1>
+
+{menu: {options: {descendants: true, levels: [2,6]}}}
+--- name:content
+
+# kramdown Syntax
+
+This is version **<%= ::Kramdown::VERSION %>** of the syntax documentation.
+
+The kramdown syntax is based on the Markdown syntax and has been enhanced with features that are
+found in other Markdown implementations like [Maruku], [PHP Markdown Extra] and [Pandoc]. However,
+it strives to provide a strict syntax with definite rules and therefore isn't completely compatible
+with Markdown. Nonetheless, most Markdown documents should work fine when parsed with kramdown. All
+places where the kramdown syntax differs from the Markdown syntax are highlighted.
+
+Following is the complete syntax definition for all elements kramdown supports. Together with the
+documentation on the available converters, it is clearly specified what you will get when a kramdown
+document is converted.
+
+
+## Source Text Formatting
+
+A kramdown document may be in any encoding, for example ASCII, UTF-8 or ISO-8859-1, and the output
+will have the same encoding as the source.
+
+The document consists of two types of elements, block-level elements and span-level elements:
+
+* Block-level elements define the main structure of the content, for example, what part of the text
+  should be a paragraph, a list, a blockquote and so on.
+
+* Span-level elements mark up small text parts as, for example, emphasized text or a link.
+
+Thus span-level elements can only occur inside block-level elements or other span-level elements.
+
+You will often find references to the "first column" or "first character" of a line in a block-level
+element descriptions. Such a reference is always to be taken relative to the current indentation
+level because some block-level elements open up a new indentation level (e.g. blockquotes). The
+beginning of a kramdown document opens up the default indentation level which begins at the first
+column of the text.
+
+
+### Line Wrapping
+
+Some lightweight markup syntax don't work well in environments where lines are hard-wrapped. For
+example, this is the case with many email programs. Therefore kramdown allows content like
+paragraphs or blockquotes to be hard-wrapped, i.e. broken across lines. This is sometimes referred
+to as "lazy syntax" since the indentation or line prefix required for the first line of content is
+not required for the consecutive lines.
+
+Block-level elements that support line wrapping always end when one of the following conditions is
+met:
+
+* a [blank line](#blank-lines), an [EOB marker line](#eob-marker), a [block IAL](#block-ials) or the
+  end of the document (i.e. a [block boundary](#block-boundaries)),
+
+*  or an [HTML block](#html-blocks).
+
+Line wrapping is allowed throughout a kramdown document but there are some block-level elements that
+do *not* support being hard-wrapped:
+
+[headers](#headers)
+
+: This is not an issue in most situations since headers normally fit on one line. If a header text
+  gets too long for one line, you need to use HTML syntax instead.
+
+[fenced code blocks](#fenced-code-blocks)
+
+: The delimiting lines of a fenced code block do not support hard-wrapping. Since everything between
+  the delimiting lines is taken as is, the content of a fenced code block does also not support
+  hard-wrapping.
+
+[definition list terms](#definition-lists)
+
+: Each definition term has to appear on a separate line. Hard-wrapping would therefore introduce
+  additional definition terms. The definitions themselves, however, do support hard-wrapping.
+
+[tables](#tables)
+
+: Since each line of a kramdown table describes one table row or a separator, it is not possible to
+  hard-wrap tables.
+
+**Note** that it is **NOT** recommended to use lazy syntax to write a kramdown document. The
+flexibility that the kramdown syntax offers due to the issue of line wrapping hinders readability
+and should therefore not be used.
+
+
+### Usage of Tabs
+
+kramdown assumes that tab stops are set at multiples of four. This is especially important when
+using tabs for indentation in lists. Also, tabs may only be used at the beginning of a line when
+indenting text and must not be preceded by spaces. Otherwise the results may be unexpected.
+
+
+### Automatic and Manual Escaping
+
+Depending on the output format, there are often characters that need special treatment. For example,
+when converting a kramdown document to HTML one needs to take care of the characters `<`, `>` and
+`&`. To ease working with these special characters, they are automatically and correctly escaped
+depending on the output format.
+
+This means, for example, that you can just use `<`, `>` and `&` in a kramdown document and need not
+think about when to use their HTML entity counterparts. However, if you *do use* HTML entities or
+HTML tags which use one of the characters, the result will be correct nonetheless!
+
+Since kramdown also uses some characters to mark-up the text, there needs to be a way to escape
+these special characters so that they can have their normal meaning. This can be done by using
+backslash escapes. For example, you can use a literal back tick like this:
+
+    This \`is not a code\` span!
+
+Following is a list of all the characters (character sequences) that can be escaped:
+
+    \         backslash
+    .         period
+    *         asterisk
+    _         underscore
+    +         plus
+    -         minus
+    =         equal sign
+    `         back tick
+    ()[]{}<>  left and right parens/brackets/braces/angle brackets
+    #         hash
+    !         bang
+    <<        left guillemet
+    >>        right guillemet
+    :         colon
+    |         pipe
+    "         double quote
+    '         single quote
+    $         dollar sign
+
+
+## Block Boundaries
+
+Some block-level elements have to start and/or end on so called block boundaries, as stated in their
+documentation. There are two cases where block boundaries come into play:
+
+* If a block-level element has to start on a block boundary, it has to be preceded by either a
+  [blank line](#blank-lines), an [EOB marker](#eob-marker), a [block IAL](#block-ials) or it has to
+  be the first element.
+
+* If a block-level element has to end on a block boundary, it has to be followed by either a [blank
+  line](#blank-lines), an [EOB marker](#eob-marker), a [block IAL](#block-ials) or it has to be the
+  last element.
+
+
+
+# Structural Elements
+
+All structural elements are block-level elements and they are used to structure the content. They
+can mark up some text as, for example, a simple paragraph, a quote or as a list item.
+
+
+## Blank lines
+
+Any line that just contains white space characters such as spaces and tabs is considered a blank
+line by kramdown. One or more consecutive blank lines are handled as one empty blank line. Blank
+lines are used to separate block-level elements from each other and in this case they don't have
+semantic meaning. However, there are some cases where blank lines do have a semantic meaning:
+
+* When used in headers -- see the [headers section](#headers)
+* When used in code blocks -- see the [code blocks section](#code-blocks)
+* When used in lists -- see the [lists section](#lists)
+* When used in math blocks -- see the [math blocks section](#math-blocks)
+* When used for elements that have to start/end on [block boundaries](#block-boundaries)
+
+
+## Paragraphs
+
+Paragraphs are the most used block-level elements. One or more consecutive lines of text are
+interpreted as one paragraph. The first line of a paragraph may be indented up to three spaces, the
+other lines can have any amount of indentation because paragraphs support [line
+wrapping](#line-wrapping). In addition to the rules outlined in the section about line wrapping, a
+paragraph ends when a [definition list line](#definition-lists) is encountered.
+
+You can separate two consecutive paragraphs from each other by using one or more blank lines. Notice
+that a line break in the source does not mean a line break in the output (due to the [lazy
+syntax](#line-wrapping))!. If you want to have an explicit line break (i.e. a `<br />` tag) you need
+to end a line with two or more spaces or two backslashes! Note, however, that a line break on the
+last text line of a paragraph is not possible and will be ignored. Leading and trailing spaces will
+be stripped from the paragraph text.
+
+The following gives you an example of how paragraphs look like:
+
+    This para line starts at the first column. However,
+          the following lines can be indented any number of spaces/tabs.
+       The para continues here.
+
+      This is another paragraph, not connected to the above one. But  
+    with a hard line break. \\
+    And another one.
+{: .show-whitespaces .ws-lr}
+
+
+## Headers
+
+kramdown supports so called Setext style and atx style headers. Both forms can be used inside a
+single document.
+
+### Setext Style
+
+Setext style headers have to start on a [block boundary](#block-boundaries) with a line of text (the
+header text) and a line with only equal signs (for a first level header) or dashes (for a second
+level header). The header text may be indented up to three spaces but any leading or trailing spaces
+are stripped from the header text. The amount of equal signs or dashes is not significant, just one
+is enough but more may look better. The equal signs or dashes have to begin at the first column. For
+example:
+
+    First level header
+    ==================
+
+    Second level header
+    ------
+
+       Other first level header
+    =
+
+Since Setext headers start on block boundaries, this means in most situations that they have to be
+preceded by a blank line. However, blank lines are not necessary after a Setext header:
+
+    This is a normal
+    paragraph.
+
+    And A Header
+    ------------
+    And a paragraph
+
+    > This is a blockquote.
+
+    And A Header
+    ------------
+
+However, it is generally a good idea to also use a blank line after a Setext header because it looks
+more appropriate and eases reading of the document.
+
+> The original Markdown syntax allows one to omit the blank line before a Setext header. However,
+> this leads to ambiguities and makes reading the document harder than necessary. Therefore it is
+> not allowed in a kramdown document.
+{: .markdown-difference}
+
+An edge case worth mentioning is the following:
+
+    header
+    ---
+    para
+
+One might ask if this represents two paragraphs separated by a [horizontal rule](#horizontal-rules)
+or a second level header and a paragraph. As suggested by the wording in the example, the latter is
+the case. The general rule is that Setext headers are processed before horizontal rules.
+
+### atx Style
+
+atx style headers have to start on a [block boundary](#block-boundaries) with a line that contains
+one or more hash characters and then the header text. No spaces are allowed before the hash
+characters. The number of hash characters specifies the heading level: one hash character gives you
+a first level heading, two a second level heading and so on until the maximum of six hash characters
+for a sixth level heading. You may optionally use any number of hashes at the end of the line to
+close the header. Any leading or trailing spaces are stripped from the header text. For example:
+
+    # First level header
+
+    ### Third level header    ###
+
+    ## Second level header ######
+
+> Again, the original Markdown syntax allows one to omit the blank line before an atx style header.
+{: .markdown-difference}
+
+
+### Specifying a Header ID
+
+kramdown supports a nice way for explicitly setting the header ID which is taken from [PHP Markdown
+Extra] and [Maruku]: If you follow the header text with an opening curly bracket (separated from the
+text with a least one space), a hash, the ID and a closing curly bracket, the ID is set on the
+header. If you use the trailing hash feature of atx style headers, the header ID has to go after the
+trailing hashes. For example:
+
+    Hello        {#id}
+    -----
+
+    # Hello      {#id}
+
+    # Hello #    {#id}
+
+> This additional syntax is not part of standard Markdown.
+{: .markdown-difference}
+
+
+## Blockquotes
+
+A blockquote is started using the `>` marker followed by an optional space and the content of the
+blockquote. The marker itself may be indented up to three spaces. All following lines, whether they
+are started with the blockquote marker or just contain text, belong to the blockquote because
+blockquotes support [line wrapping](#line-wrapping).
+
+The contents of a blockquote are block-level elements. This means that if you are just using text as
+content that it will be wrapped in a paragraph. For example, the following gives you one blockquote
+with two paragraphs in it:
+
+    > This is a blockquote.
+    >     on multiple lines
+    that may be lazy.
+    >
+    > This is the second paragraph.
+
+Since the contents of a blockquote are block-level elements, you can nest blockquotes and use other
+block-level elements (this is also the reason why blockquotes need to support line wrapping):
+
+    > This is a paragraph.
+    >
+    > > A nested blockquote.
+    >
+    > ## Headers work
+    >
+    > * lists too
+    >
+    > and all other block-level elements
+
+Note that the first space character after the `>` marker does *not* count when counting spaces for
+the indentation of the block-level elements inside the blockquote! So [code blocks](#code-blocks)
+will have to be indented with five spaces or one space and one tab, like this:
+
+    > A code block:
+    >
+    >     ruby -e 'puts :works'
+
+[Line wrapping](#line-wrapping) allows one to be lazy but hinders readability and should therefore
+be avoided, especially with blockquotes. Here is an example of using blockquotes with line wrapping:
+
+    > This is a paragraph inside
+    a blockquote.
+    >
+    > > This is a nested paragraph
+    that continues here
+    > and here
+    > > and here
+
+
+## Code Blocks
+
+Code blocks can be used to represent verbatim text like markup, HTML or a program fragment because
+no syntax is parsed within a code block.
+
+### Standard Code Blocks
+
+A code block can be started by using four spaces or one tab and then the text of the code block. All
+following lines containing text, whether they adhere to this syntax or not, belong to the code block
+because code blocks support [line wrapping](#line-wrapping)). A wrapped code line is automatically
+appended to the preceding code line by substituting the line break with a space character. The
+indentation (four spaces or one tab) is stripped from each line of the code block.
+
+> The original Markdown syntax does not allow line wrapping in code blocks.
+{: .markdown-difference}
+
+Note that consecutive code blocks that are only separate by [blank lines](#blank-lines) are merged
+together into one code block:
+
+        Here comes some code
+
+        This text belongs to the same code block.
+
+If you want to have one code block directly after another one, you need to use an [EOB
+marker](#eob-marker) to separate the two:
+
+        Here comes some code
+    ^
+        This one is separate.
+
+### Fenced Code Blocks
+
+> This alternative syntax is not part of the original Markdown syntax. The idea and syntax comes
+> from the [PHP Markdown Extra] package.
+{: .markdown-difference}
+
+kramdown also supports an alternative syntax for code blocks which does not use indented blocks but
+delimiting lines. The starting line needs to begin with three or more tilde characters (`~`) and the
+closing line needs to have at least the number of tildes the starting line has. Everything between
+is taken literally as with the other syntax but there is no need for indenting the text. For
+example:
+
+    ~~~~~~~~
+    Here comes some code.
+    ~~~~~~~~
+
+If you need lines of tildes in such a code block, just start the code block with more tildes. For
+example:
+
+    ~~~~~~~~~~~~
+    ~~~~~~~
+    code with tildes
+    ~~~~~~~~
+    ~~~~~~~~~~~~~~~~~~
+
+This type of code block is especially useful for copy-pasted code since you don't need to indent the
+code.
+
+### Language of Code Blocks
+
+You can tell kramdown the language of a code block by using an [IAL](#inline-attribute-lists):
+
+    ~~~
+    def what?
+      42
+    end
+    ~~~
+    {: .language-ruby}
+
+The specially named class `language-ruby` tells kramdown that this code block is written in the Ruby
+language. Such information can be used, for example, by converters to do syntax highlighting on the
+code block.
+
+Fenced code blocks provide an easier way to specify the language, namely by appending the language
+of the code block to the end of the starting line:
+
+    ~~~ ruby
+    def what?
+      42
+    end
+    ~~~
+
+
+## Lists
+
+kramdown provides syntax elements for creating ordered and unordered lists as well as definition
+lists.
+
+### Ordered and Unordered lists
+
+Both ordered and unordered lists follow the same rules.
+
+A list is started with a list marker (in case of unordered lists one of `+`, `-` or `*` -- you can
+mix them -- and in case of ordered lists a number followed by a period) followed by one tab or at
+least one space, optionally followed by an [IAL](#inline-attribute-lists) that should be applied to
+the list item and then the first part of the content of the list item. The leading tabs or spaces
+are stripped away from this first line of content to allow for a nice alignment with the following
+content of a list item (see below). All following list items with the same marker type (unordered or
+ordered) are put into the same list. The numbers used for ordered lists are irrelevant, an ordered
+list always starts at 1.
+
+The following gives you an unordered list and an ordered list:
+
+    * kram
+    + down
+    - now
+
+    1. kram
+    2. down
+    3. now
+
+> The original Markdown syntax allows the markers of ordered and unordered lists to be mixed, the
+> first marker specifying the list type (ordered or unordered). This is not allowed in kramdown. As
+> stated, the above example will give you two lists (an unordered and an ordered) in kramdown and
+> only one unordered list in Markdown.
+{: .markdown-difference}
+
+The first list marker in a list may be indented up to three spaces. The column number of the first
+non-space character which appears after the list item marker on the same line specifies the
+indentation that has to be used for the following lines of content of the list item. If there is no
+such character, the indentation that needs to be used is four spaces or one tab. Indented lines may
+be followed by lines containing text with any amount of indentation due to [line
+wrapping](#line-wrapping). Note, however, that in addition to the rules outlined in the section
+about line wrapping, a list item also ends when a line with another list item marker is encountered
+-- see the next paragraph.
+
+The indentation is stripped from the content and the content (note that the content naturally also
+contains the content of the line with the item marker) is processed as text containing block-level
+elements. All other list markers in the list may be indented up to three spaces or the number of
+spaces used for the indentation of the last list item minus one, whichever number is smaller. For
+example:
+
+    * This is the first line. Since the first non-space characters appears in
+      column 3, all other indented lines have to be indented 2 spaces.
+    However, one could be lazy and not indent a line but this is not
+    recommended.
+    *       This is the another item of the list. It uses a different number
+       of spaces for indentation which is okay but should generally be avoided.
+       * The list item marker is indented 3 spaces which is allowed but should
+         also be avoided and starts the third list item. Note that the lazy
+         line in the second list item may make you believe that this is a
+         sub-list which it isn't! So avoid being lazy!
+
+So, while the above is possible and creates one list with three items, it is not advised to use
+different (marker and list content) indents for same level list items as well as lazy indentation!
+It is much better to write such a list in the following way:
+
+    * This is the first list item bla blabla blabla blabla blabla blabla
+      blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla
+      blabla blabla blabla bla
+    * This is the another item of the list. bla blabla blabla blabla blabla
+      blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla
+
+> The original Markdown syntax also allows you to indent the marker, however, the behaviour of what
+> happens with the list items is not clearly specified and may surprise you.
+>
+> Also, Markdown uses a fixed number of spaces/tabs to indent the lines that belong to a list item!
+{: .markdown-difference}
+
+Unordered and ordered lists work the same way in regard to the indentation:
+
+    * list 1 item 1
+     * list 1 item 2 (indent 1 space)
+      * list 1 item 3 (indent 2 spaces)
+       * list 1 item 4  (indent 3 spaces)
+        * lazy text belonging to above item 4
+
+^
+
+    1. list 1 item 1
+     2. list 1 item 2 (indent 1 space)
+      3. list 1 item 3 (indent 2 spaces)
+       4. list 1 item 4  (indent 3 spaces)
+        5. lazy text belonging to above item 4
+
+^
+
+    * list 1 item 1
+      * nested list item 1
+      * nested list item 2
+    * list 1 item 2
+      * nested list item 1
+
+^
+
+    1. list 1 item 1
+       1. nested list item 1
+       2. nested list item 2
+    10. list 1 item 2
+        1. nested list item 1
+
+^
+
+    1. text for this list item
+       further text (indent 3 spaces)
+
+    10. text for this list item
+        further text (indent 4 spaces)
+
+When using tabs for indenting the content of a list item, remember that tab stops occur at multiples
+of four for kramdown. Tabs are correctly converted to spaces for calculating the indentation. For
+example:
+
+    *   Using a tab to indent this line, the tab only counts as three spaces
+        and therefore the overall indentation is four spaces.
+
+       1.   The tab after the marker counts here as three spaces. Since the
+            indentation of the marker is three spaces and the marker itself
+            takes two characters, the overall indentation needed for the
+            following lines is eight spaces or two tabs.
+
+It is clear that you might get unexpected results if you mix tabs and spaces or if you don't have
+the tab stops set to multiples of four in your editor! Therefore this should be avoided!
+
+The content of a list item is made up of either text or block-level elements. Simple list items only
+contain text like in the above examples. They are not even wrapped in a paragraph tag. If the first
+list text is followed by one or more blank lines, it will be wrapped in a paragraph tag:
+
+    * kram
+
+    * down
+    * now
+
+In the above example, the first list item text will be wrapped in a paragraph tag since it is
+followed by a blank line whereas the second list item contains just text. There is obviously a
+problem for doing this with the last list item when it contains only text. You can circumvent this
+by leaving a blank line after the last list item and using an EOB marker:
+
+    * Not wrapped in a paragraph
+    * Wrapped in a paragraph due to the following blank line.
+
+    * Also wrapped in a paragraph due to the
+      following blank line and the EOB marker.
+
+    ^
+
+The text of the last list item is also wrapped in a paragraph tag if *all* other list items contain
+a proper paragraph as first element. This makes the following use case work like expected, i.e.
+*all* the list items are wrapped in paragraphs:
+
+    * First list item
+
+    * Second list item
+
+    * Last list item
+
+> The original Markdown syntax page specifies that list items which are separated by one or more
+> blank lines are wrapped in paragraph tags. This means that the first text will also be wrapped in
+> a paragraph if you have block-level elements in a list which are separated by blank lines. The
+> above rule is easy to remember and lets you exactly specify when the first list text should be
+> wrapped in a paragraph. The idea for the above rule comes from the [Pandoc] package.
+{: .markdown-difference}
+
+As seen in the examples above, blank lines between list items are allowed.
+
+Since the content of a list item can contain block-level elements, you can do the following:
+
+    *   First item
+
+        A second paragraph
+
+        * nested list
+
+        > blockquote
+
+    *   Second item
+
+However, there is a problem when you want to have a code block immediately after a list item. You
+can use an EOB marker to circumvent this problem:
+
+    *   This is a list item.
+
+        The second para of the list item.
+    ^
+        A code block following the list item.
+
+You can have any block-level element as first element in a list item. However, as described above,
+the leading tabs or spaces of the line with the list item marker are stripped away. This leads to a
+problem when you want to have a code block as first element. The solution to this problem is the
+following construct:
+
+    * 
+            This is a code block (indentation needs to be 4(1)+4(1)
+            spaces (tabs)).
+{: .show-whitespaces .ws-lr}
+
+Note that the list marker needs to be followed with at least one space or tab! Otherwise the line is
+not recognized as the start of a list item but interpreted as a paragraph containing the list
+marker.
+
+If you want to have one list directly after another one (both with the same list type, i.e. ordered
+or unordered), you need to use an EOB marker to separate the two:
+
+    * List one
+    ^
+    * List two
+
+Since paragraphs support [line wrapping](#line-wrapping), it would usually not be possible to create
+compact nested list, i.e. a list where the text is not wrapped in paragraphs because there is no
+blank line but a sub list after it:
+
+    *   This is just text.
+        * this is a sub list item
+          * this is a sub sub list item
+    * This is just text,
+        spanning two lines
+      * this is a nested list item.
+
+However, this is an often used syntax and is therefore support by kramdown.
+
+If you want to start a paragraph with something that looks like a list item marker, you need to
+escape it. This is done by escaping the period in an ordered list or the list item marker in an
+unordered list:
+
+    1984\. It was great
+    \- others say that, too!
+
+As mentioned at the beginning, an optional IAL for applying attributes to a list item can be used
+after the list item marker:
+
+    * {:.cls} This item has the class "cls".
+      Here continues the above paragraph.
+
+    * This is a normal list item.
+
+
+### Definition Lists
+
+> This syntax feature is not part of the original Markdown syntax. The idea and syntax comes from
+> the [PHP Markdown Extra] package.
+{: .markdown-difference}
+
+Definition lists allow you to assign one or more definitions to one or more terms.
+
+A definition list is started when a normal paragraph is followed by a line with a definition marker
+(a colon which may be optionally indented up to three spaces), then at least one tab or one space,
+optionally followed by an [IAL](#inline-attribute-lists) that should be applied to the list item and
+then the first part of the definition. The line with the definition marker may optionally be
+separated from the preceding paragraph by a blank line. The leading tabs or spaces are stripped away
+from this first line of the definition to allow for a nice alignment with the following definition
+content. Each line of the preceding paragraph is taken to be a term and the lines separately parsed
+as span-level elements. Each such term may optionally start with an [IAL](#inline-attribute-lists)
+that should be applied to the term.
+
+The following is a simple definition list:
+
+    kramdown
+    : A Markdown-superset converter
+
+    Maruku
+    :     Another Markdown-superset converter
+
+The column number of the first non-space character which appears after a definition marker on the
+same line specifies the indentation that has to be used for the following lines of the definition.
+If there is no such character, the indentation that needs to be used is four spaces or one tab.
+Indented lines may be followed by lines containing text with any amount of indentation due to [line
+wrapping](#line-wrapping). Note, however, that in addition to the rules outlined in the section
+about line wrapping, a list item also ends when a line with another definition marker is encountered.
+
+The indentation is stripped from the definition and it (note that the definition naturally also
+contains the content of the line with the definition marker) is processed as text containing block
+level elements. If there is more than one definition, all other definition markers for the term may
+be indented up to three spaces or the number of spaces used for the indentation of the last
+definition minus one, whichever number is smaller. For example:
+
+    definition term 1
+    definition term 2
+    : This is the first line. Since the first non-space characters appears in
+    column 3, all other lines have to be indented 2 spaces (or lazy syntax may
+      be used after an indented line). This tells kramdown that the lines
+      belong to the definition.
+    :       This is the another definition for the same term. It uses a
+            different number of spaces for indentation which is okay but
+            should generally be avoided.
+       : The definition marker is indented 3 spaces which is allowed but
+         should also be avoided.
+
+So, while the above is possible and creates a definition list with two terms and three definitions
+for them, it is not advised to use different (definition marker and definition) indents in the same
+definition list as well as lazy indentation!
+
+The definition for a term is made up of text and/or block-level elements. If a definition is *not*
+preceded by a blank line, the first part of the definition will just be text if it would be a
+paragraph otherwise:
+
+    definition term
+    : This definition will just be text because it would normally be a
+      paragraph and the there is no preceding blank line.
+
+      > although the definition contains other block-level elements
+
+    : This definition *will* be a paragraph since it is preceded by a
+      blank line.
+
+The rules about having any block-level element as first element in a list item also apply to a
+definition.
+
+As mentioned at the beginning, an optional IAL for applying attributes to a term or a definition can
+be used:
+
+    {:#term} Term with id="term"
+    : {:.cls} Definition with class "cls"
+
+    {:#term1} First term
+    {:#term2} Second term
+    : {:.cls} Definition
+
+
+## Tables
+
+> This syntax feature is not part of the original Markdown syntax. The syntax is based on the one
+> from the [PHP Markdown Extra] package.
+{: .markdown-difference}
+
+Sometimes one wants to include simple tabular data in a kramdown document for which using a
+full-blown HTML table is just too much. kramdown supports this with a simple syntax for ASCII
+tables.
+
+Tables can be created with or without a leading pipe character: If the first line of a table
+contains a pipe character at the start of the line (optionally indented up to three spaces), then
+all leading pipe characters (i.e. pipe characters that are only preceded by whitespace) are ignored
+on all table lines. Otherwise they are not ignored and count when dividing a table line into table
+cells.
+
+There are four different line types that can be used in a table:
+
+* *Table rows* define the content of a table.
+
+  A table row is any line that contains at least one pipe character and is not identified as any
+  other type of table line! The table row is divided into individual table cells by pipe characters.
+  An optional trailing pipe character is ignored. Note that literal pipe characters need to be
+  escaped *except* if they occur in code spans or HTML `<code>` elements!
+
+  Header rows, footer rows and normal rows are all done using these table rows. Table cells can only
+  contain a single line of text, no multi-line text is supported. The text of a table cell is parsed
+  as span-level elements.
+
+  Here are some example table rows:
+
+      | First cell|Second cell|Third cell
+      | First | Second | Third |
+
+      First | Second | | Fourth |
+
+* *Separator lines* are used to split the table body into multiple body parts.
+
+  A separator line is any line that contains only pipes, dashes, pluses, colons and spaces/tabs and
+  which contains at least one dash and one pipe character. The pipe and plus characters can be used
+  to visually separate columns although this is not needed. Multiple separator lines after another
+  are treated as one separator line.
+
+  Here are some example separator lines:
+
+      |----+----|
+      +----|----+
+      |---------|
+      |-
+      | :-----: |
+      -|-
+
+* The first separator line after at least one table row is treated specially, namely as *header
+  separator line*. It is used to demarcate header rows from normal table rows and/or to set column
+  alignments. All table rows above the header separator line are considered to be header rows.
+
+  The header separator line can be specially formatted to contain column alignment definitions: An
+  alignment definition consists of an optional space/tab followed by an optional colon, one or more
+  dashes, an optional colon and another optional space/tab. The colons of an alignment definition
+  are used to set the alignment of a column: if there are no colons, the column uses the default
+  alignment, if there is a colon only before the dashes, the column is left aligned, if there are
+  colons before and after the dashes, the column is center aligned and if there is only a colon
+  after the dashes, the column is right aligned. Each alignment definition sets the alignment for
+  one column, the first alignment definition for the first column, the second alignment definition
+  for the second column and so on.
+
+  Here are some example header separator lines with alignment definitions:
+
+      |---+---+---|
+      + :-: |:------| ---:|
+      | :-: :- -: -
+      :-: | :-
+
+* A *footer separator line* is used to demarcate footer rows from normal table rows. All table rows
+  below the footer separator line are considered to be footer rows.
+
+  A footer separator line is like a normal separator line except that dashes are replaced by equal
+  signs. A footer separator line may only appear once in a table. If multiple footer separator lines
+  are used in one table, only the last is treated as footer separator line, all others are treated
+  as normal separator lines. Normal separator lines that are used after the footer separator line
+  are ignored.
+
+  Here are some example footer separator lines:
+
+      |====+====|
+      +====|====+
+      |=========|
+      |=
+
+Trailing spaces or tabs are ignored in all cases. To simplify table creation and maintenance,
+header, footer and normal separator lines need not specify the same number of columns as table rows;
+even `|-` and `|=` are a valid separators.
+
+Given the above components, a table is specified by
+
+* an optional separator line,
+* optionally followed by zero, one or more table rows followed by a header separator line,
+* one or more table rows, optionally interspersed with separator lines,
+* optionally followed by a footer separator line and zero, one or more table rows and
+* an optional trailing separator line.
+
+Also note
+
+* that the first line of a table must not have more than three spaces of indentation before the
+  first non-space character,
+* that each line of a table needs to have at least one not escaped pipe character so that kramdown
+  recognizes it as a line belonging to the table and
+* that tables have to start and end on [block boundaries](#block-boundaries)!
+
+> The table syntax differs from the one used in [PHP Markdown Extra] as follows:
+>
+> * kramdown tables do not need to have a table header.
+> * kramdown tables can be structured using separator lines.
+> * kramdown tables can contain a table footer.
+> * kramdown tables need to be separated from other block-level elements.
+{: .markdown-difference}
+
+Here is an example for a kramdown table with a table header row, two table bodies and a table footer
+row:
+
+    |-----------------+------------+-----------------+----------------|
+    | Default aligned |Left aligned| Center aligned  | Right aligned  |
+    |-----------------|:-----------|:---------------:|---------------:|
+    | First body part |Second cell | Third cell      | fourth cell    |
+    | Second line     |foo         | **strong**      | baz            |
+    | Third line      |quux        | baz             | bar            |
+    |-----------------+------------+-----------------+----------------|
+    | Second body     |            |                 |                |
+    | 2 line          |            |                 |                |
+    |=================+============+=================+================|
+    | Footer row      |            |                 |                |
+    |-----------------+------------+-----------------+----------------|
+
+The above example table is rather time-consuming to create without the help of an ASCII table
+editor. However, the table syntax is flexible and the above table could also be written like this:
+
+    |---
+    | Default aligned | Left aligned | Center aligned | Right aligned
+    |-|:-|:-:|-:
+    | First body part | Second cell | Third cell | fourth cell
+    | Second line |foo | **strong** | baz
+    | Third line |quux | baz | bar
+    |---
+    | Second body
+    | 2 line
+    |===
+    | Footer row
+
+
+## Horizontal Rules
+
+A horizontal rule for visually separating content is created by using three or more asterisks,
+dashes or underscores (these may not be mixed on a line), optionally separated by spaces or tabs, on
+an otherwise blank line. The first asterisk, dash or underscore may optionally be indented up to
+three spaces. The following examples show different possibilities to create a horizontal rule:
+
+    * * *
+
+    ---
+
+      _  _  _  _
+
+    ---------------
+
+
+## Math Blocks
+
+> This syntax feature is not part of the original Markdown syntax. The idea comes from the [Maruku]
+> and [Pandoc] packages.
+{: .markdown-difference}
+
+kramdown has built-in support for block and span-level mathematics written in LaTeX.
+
+A math block needs to start and end on [block boundaries](#block-boundaries). It is started using
+two dollar signs, optionally indented up to three spaces. The math block continues until the next
+two dollar signs (which may be on the same line or on one of the next lines) that appear at the end
+of a line, i.e. they may only be followed by whitespace characters. The content of a math block has
+to be valid LaTeX math. It is always wrapped inside a `\begin{displaymath}...\end{displaymath}`
+enviroment except if it begins with a `\begin` statement.
+
+The following kramdown fragment
+
+    $$
+    \begin{align*}
+      & \phi(x,y) = \phi \left(\sum_{i=1}^n x_ie_i, \sum_{j=1}^n y_je_j \right)
+      = \sum_{i=1}^n \sum_{j=1}^n x_i y_j \phi(e_i, e_j) = \\
+      & (x_1, \ldots, x_n) \left( \begin{array}{ccc}
+          \phi(e_1, e_1) & \cdots & \phi(e_1, e_n) \\
+          \vdots & \ddots & \vdots \\
+          \phi(e_n, e_1) & \cdots & \phi(e_n, e_n)
+        \end{array} \right)
+      \left( \begin{array}{c}
+          y_1 \\
+          \vdots \\
+          y_n
+        \end{array} \right)
+    \end{align*}
+    $$
+
+renders (using Javascript library [MathJax](http://www.mathjax.org/)) as
+
+$$
+\begin{align*}
+  & \phi(x,y) = \phi \left(\sum_{i=1}^n x_ie_i, \sum_{j=1}^n y_je_j \right)
+  = \sum_{i=1}^n \sum_{j=1}^n x_i y_j \phi(e_i, e_j) = \\
+  & (x_1, \ldots, x_n) \left( \begin{array}{ccc}
+      \phi(e_1, e_1) & \cdots & \phi(e_1, e_n) \\
+      \vdots & \ddots & \vdots \\
+      \phi(e_n, e_1) & \cdots & \phi(e_n, e_n)
+    \end{array} \right)
+  \left( \begin{array}{c}
+      y_1 \\
+      \vdots \\
+      y_n
+    \end{array} \right)
+\end{align*}
+$$
+
+Using inline math is also easy: just surround your math content with two dollar signs, like with a
+math block. If you don't want to start an inline math statement, just escape the dollar signs and
+they will be treated as simple dollar signs.
+
+> **Note** that LaTeX code that uses the pipe symbol `|` in inline math statements may lead to a
+> line being recognized as a table line. This problem can be avoided by using the `\vert` command
+> instead of `|`!
+{:.information}
+
+If you have a paragraph that looks like a math block but should actually be a paragraph with just an
+inline math statement, you need to escape the first dollar sign:
+
+    The following is a math block:
+
+    $$ 5 + 5 $$
+
+    But next comes a paragraph with an inline math statement:
+
+    \$$ 5 + 5 $$
+
+If you don't even want the inline math statement, escape the first two dollar signs:
+
+    \$\$ 5 + 5 $$
+
+## HTML Blocks
+
+> The original Markdown syntax specifies that an HTML block must start at the left margin, i.e. no
+> indentation is allowed. Also, the HTML block has to be surrounded by blank lines. Both
+> restrictions are lifted for kramdown documents. Additionally, the original syntax does not allow
+> you to use Markdown syntax in HTML blocks which is allowed with kramdown.
+{: .markdown-difference}
+
+An HTML block is potentially started if a line is encountered that begins with a non-span-level HTML
+tag or a general XML tag (opening or closing) which may be indented up to three spaces.
+
+The following HTML tags count as span-level HTML tags and *won't* start an HTML block if found at
+the beginning of an HTML block line:
+
+    a abbr acronym b big bdo br button cite code del dfn em i img input
+    ins kbd label option q rb rbc rp rt rtc ruby samp select small span
+    strong sub sup textarea tt var
+
+Further parsing of a found start tag depends on the tag and in which of three possible ways its
+content is parsed:
+
+* Parse as raw HTML block: If the HTML/XML tag content should be handled as raw HTML, then only
+  HTML/XML tags are parsed from this point onwards and text is handled as raw, unparsed text until
+  the matching end tag is found or until the end of the document. Each found tag will be parsed as
+  raw HTML again. However, if a tag has a `markdown` attribute, this attribute controls parsing of
+  this one tag (see below).
+
+  Note that the parser basically supports only correct XHTML! However, there are some exceptions.
+  For example, attributes without values (i.e. boolean attributes) are also supported and elements
+  without content like `<hr />` can be written as `<hr>`. If an invalid closing tag is found, it is
+  ignored.
+
+* Parse as block-level elements: If the HTML/XML tag content should be parsed as text containing
+  block-level elements, the remaining text on the line will be parsed by the block-level parser as
+  if it appears on a separate line (**Caution**: This also means that if the line consists of the
+  start tag, text and the end tag, the end tag will not be found!). All following lines are parsed
+  as block-level elements until an HTML block line with the matching end tag is found or until the
+  end of the document.
+
+* Parse as span-level elements: If the HTML/XML tag content should be parsed as text containing span
+  level elements, then all text until the *next* matching end tag or until the end of the document
+  will be the content of the tag and will later be parsed by the span-level parser. This also means
+  that if the matching end tag is inside what appears to be a code span, it is still used!
+
+If there is text after an end tag, it will be parsed as if it appears on a separate line except when
+inside a raw HTML block.
+
+Also, if an invalid closing tag is found, it is ignored.
+
+Note that all HTML tag and attribute names are converted to lowercase!
+
+By default, kramdown parses all block HTML tags and all XML tags as raw HTML blocks. However, this
+can be configured with the `parse_block_html`. If this is set to `true`, then syntax parsing in HTML
+blocks is globally enabled. It is also possible to enable/disable syntax parsing on a tag per tag
+basis using the `markdown` attribute:
+
+* If an HTML tag has an attribute `markdown="0"`, then the tag is parsed as raw HTML block.
+
+* If an HTML tag has an attribute `markdown="1"`, then the default mechanism for parsing syntax in
+  this tag is used.
+
+* If an HTML tag has an attribute `markdown="block"`, then the content of the tag is parsed as block
+  level elements.
+
+* If an HTML tag has an attribute `markdown="span"`, then the content of the tag is parsed as span
+  level elements.
+
+The following list shows which HTML tags are parsed in which mode by default when `markdown="1"` is
+applied or `parse_block_html` is `true`:
+
+Parse as raw HTML
+: 
+        script style math option textarea pre code kbd samp var
+
+    Also, all general XML tags are parsed as raw HTML blocks.
+
+Parse as block-level elements
+: 
+        applet button blockquote body colgroup dd div dl fieldset form iframe li
+        map noscript object ol table tbody thead tfoot tr td ul
+
+Parse as span-level elements
+: 
+        a abbr acronym address b bdo big cite caption code del dfn dt em
+        h1 h2 h3 h4 h5 h6 i ins kbd label legend optgroup p pre q rb rbc
+        rp rt rtc ruby samp select small span strong sub sup th tt var
+
+> Remember that all span-level HTML tags like `a` or `b` do not start a HTML block! However, the
+> above lists also include span-level HTML tags in the case the `markdown` attribute is used on a
+> tag inside a raw HTML block.
+
+Here is a simple example input and its HTML output with `parse_block_html` set to `false`:
+
+    This is a para.
+    <div>
+    Something in here.
+    </div>
+    Other para.
+^
+    <p>This is a para.</p>
+    <div>
+    Something in here.
+    </div>
+    <p>Other para.</p>
+
+As one can see the content of the `div` tag will be parsed as raw HTML block and left alone.
+However, if the `markdown="1"` attribute was used on the `div` tag, the content would be parsed as
+block-level elements and therefore converted to a paragraph.
+
+You can also use several HTML tags at once:
+
+    <div id="content"><div id="layers"><div id="layer1">
+    This is some text in the `layer1` div.
+    </div>
+    This is some text in the `layers` div.
+    </div></div>
+    This is a para outside the HTML block.
+
+However, remember that if the content of a tag is parsed as block-level elements, the content that
+appears after a start/end tag but on the same line, is processed as if it appears on a new line:
+
+    <div markdown="1">This is the first part of a para,
+    which is continued here.
+    </div>
+
+    <p markdown="1">This works without problems because it is parsed as
+    span-level elements</p>
+
+    <div markdown="1">The end tag is not found because
+    this line is parsed as a paragraph</div>
+
+Since setting `parse_block_html` to `true` can lead to some not wanted behaviour, it is generally
+better to selectively enable or disable block/span-level elements parsing by using the `markdown`
+attribute!
+
+Unclosed block-level HTML tags are correctly closed at the end of the document to ensure correct
+nesting and invalidly used end tags are removed from the output:
+
+    This is a para.
+    <div markdown="1">
+    Another para.
+    </p>
+^
+    <p>This is a para.</p>
+    <div>
+      <p>Another para.</p>
+    </div>
+
+The parsing of processing instructions and XML comments is also supported. The content of both, PIs
+and XML comments, may span multiple lines. The start of a PI/XML comment may only appear at the
+beginning of a line, optionally indented up to three spaces. If there is text after the end of a PI
+or XML comment, it will be parsed as if it appears on a separate line. kramdown syntax in PIs/XML
+comments is not processed:
+
+    This is a para.
+    <!-- a *comment* -->
+    <? a processing `instruction`
+       spanning multiple lines
+    ?> First part of para,
+    continues here.
+
+
+
+# Text Markup
+
+These elements are all span-level elements and used inside block-level elements to markup text
+fragments. For example, one can easily create links or apply emphasis to certain text parts.
+
+Note that empty span-level elements are not converted to empty HTML tags but are copied as-is to the
+output.
+
+
+
+## Links and Images
+
+Three types of links are supported: automatic links, inline links and reference links.
+
+### Automatic Links
+
+This is the easiest one to create: Just surround a web address or an email address with angle
+brackets and the address will be turned into a proper link. The address will be used as link target
+and as link text. For example:
+
+    Information can be found on the <http://example.com> homepage.
+    You can also mail me: <me.example@example.com>
+
+It is not possible to specify a different link text using automatic links -- use the other link
+types for this!
+
+
+### Inline Links
+
+As the wording suggests, inline links provide all information inline in the text flow. Reference
+style links only provide the link text in the text flow and everything else is defined
+elsewhere. This also allows you to reuse link definitions.
+
+An inline style link can be created by surrounding the link text with square brackets, followed
+immediately by the link URL (and an optional title in single or double quotes preceded by at least
+one space) in normal parentheses. For example:
+
+    This is [a link](http://rubyforge.org) to a page.
+    A [link](../test "local URI") can also have a title.
+    And [spaces](link with spaces.html)!
+
+Notes:
+
+* The link text is treated like normal span-level text and therefore is parsed and converted.
+  However, if you use square brackets within the link text, you have to either properly nest them or
+  to escape them. It is not possible to create nested links!
+
+  The link text may also be omitted, e.g. for creating link anchors.
+
+* The link URL has to contain properly nested parentheses if no title is specified, or the link URL
+  must be contained in angle brackets (incorrectly nested parentheses are allowed).
+
+* The link title may not contain its delimiters and may not be empty.
+
+* Additional link attributes can be added by using a [span IAL](#span-ials) after the inline link,
+  for example:
+
+      This is a [link](http://example.com){:hreflang="de"}
+
+### Reference Links
+
+To create a reference style link, you need to surround the link text with square brackets (as with
+inline links), followed by optional spaces/tabs/line breaks and then optionally followed with
+another set of square brackets with the link identifier in them. A link identifier may not contain a
+closing bracket and, when specified in a link definition, newline characters; it is also not case
+sensitive, line breaks and tabs are converted to spaces and multiple spaces are compressed into one.
+For example:
+
+    This is a [reference style link][linkid] to a page. And [this]
+    [linkid] is also a link. As is [this][] and [THIS].
+
+If you don't specify a link identifier (i.e. only use empty square brackets) or completely omit the
+second pair of square brackets, the link text is converted to a valid link identifier by removing
+all invalid characters and inserting spaces for line breaks. If there is a link definition found for
+the link identifier, a link will be created. Otherwise the text is not converted to a link.
+
+As with inline links, additional link attributes can be added by using a [span IAL](#span-ials)
+after the reference link.
+
+### Link Definitions
+
+The link definition can be put anywhere in the document. It does not appear in the output. A link
+definition looks like this:
+
+    [linkid]: http://www.example.com/ "Optional Title"
+
+> Link definitions are, despite being described here, non-content block-level elements.
+{: .information}
+
+The link definition has the following structure:
+
+* The link identifier in square brackets, optionally indented up to three spaces,
+* then a colon and one or more optional spaces/tabs,
+* then the link URL which must contain at least one non-space character, or a left angle bracket,
+  the link URL and a right angle bracket,
+* then optionally the title in single or double quotes, separated from the link URL by one or more
+  spaces or on the next line by itself indented any number of spaces/tabs.
+
+> The original Markdown syntax also allowed the title to be specified in parenthesis. This is not
+> allowed for consistency with the inline title.
+{: .markdown-difference}
+
+If you have some text that looks like a link definition but should really be a link and some text,
+you can escape the colon after the link identifier:
+
+    The next paragraph contains a link and some text.
+
+    [Room 100]\: There you should find everything you need!
+
+    [Room 100]: link_to_room_100.html
+
+Although link definitions are non-content block-level elements, [block IALs](#block-ials) can be
+used on them to specify additional attributes for the links:
+
+    [linkid]: http://example.com
+    {:hreflang="de"}
+
+### Images
+
+Images can be specified via a syntax that is similar to the one used by links. The difference is
+that you have to use an exclamation mark before the first square bracket and that the link text of a
+normal link becomes the alternative text of the image link. As with normal links, image links can be
+written inline or reference style. For example:
+
+    Here comes a ![smiley](../images/smiley.png)! And here
+    ![too](../images/other.png 'Title text'). Or ![here].
+    With empty alt text ![](see.jpg)
+
+The link definition for images is exactly the same as the link definition for normal links. Since
+additional attributes can be added via span and block IALs, it is possible, for example, to specify
+image width and height:
+
+    Here is an inline ![smiley](smiley.png){:height="36px" width="36px"}.
+
+    And here is a referenced ![smile]
+
+    [smile]: smile.png
+    {: height="36px" width="36px"}
+
+## Emphasis
+
+kramdown supports two types of emphasis: light and strong emphasis. Text parts that are surrounded
+with single asterisks `*` or underscores `_` are treated as text with light emphasis, text parts
+surrounded with two asterisks or underscores are treated as text with strong emphasis. Surrounded
+means that the starting delimiter must not be followed by a space and that the stopping delimiter
+must not be preceded by a space.
+
+Here is an example for text with light and strong emphasis:
+
+    *some text*
+    _some text_
+    **some text**
+    __some text__
+
+The asterisk form is also allowed within a single word:
+
+    This is un*believe*able! This d_oe_s not work!
+
+Text can be marked up with both light and strong emphasis, possibly using different delimiters.
+However, it is not possible to nest strong within strong or light within light emphasized text:
+
+    This is a ***text with light and strong emphasis***.
+    This **is _emphasized_ as well**.
+    This *does _not_ work*.
+    This **does __not__ work either**.
+
+If one or two asterisks or underscores are surrounded by spaces, they are treated literally. If you
+want to force the literal meaning of an asterisk or an underscore you can backslash-escape it:
+
+    This is a * literal asterisk.
+    These are ** two literal asterisk.
+    As \*are\* these!
+
+
+## Code Spans
+
+This is the span-level equivalent of the [code block](#code-blocks) element. You can markup a text
+part as code span by surrounding it with backticks `` ` ``. For example:
+
+    Use `<html>` tags for this.
+
+Note that all special characters in a code span are treated correctly. For example, when a code span
+is converted to HTML, the characters `<`, `>` and `&` are substituted by their respective HTML
+counterparts.
+
+To include a literal backtick in a code span, you need to use two or more backticks as delimiters.
+You can insert one optional space after the starting and before the ending delimiter (these spaces
+are not used in the output). For example:
+
+    Here is a literal `` ` `` backtick.
+    And here is ``  `some`  `` text (note the two spaces so that one is left
+    in the output!).
+
+A single backtick surrounded by spaces is treated as literal backtick. If you want to force the
+literal meaning of a backtick you can backslash-escape it:
+
+    This is a ` literal backtick.
+    As \`are\` these!
+
+As with [code blocks](#language-of-code-blocks) you can set the language of a code span by using an
+[IAL](#inline-attribute-lists):
+
+    This is a Ruby code fragment `x = Class.new`{:.language-ruby}
+
+
+## HTML Spans
+
+HTML tags cannot only be used on the block-level but also on the span-level. Span-level HTML tags
+can only be used inside one block-level element, it is not possible to use a start tag in one block
+level element and the end tag in another. Note that only correct XHTML is supported! This means that
+you have to use, for example, `<br />` instead of `<br>` (although kramdown tries to fix such errors
+if possible).
+
+By default, kramdown parses kramdown syntax inside span HTML tags. However, this behaviour can be
+configured with the `parse_span_html` option. If this is set to `true`, then syntax parsing in HTML
+spans is enabled, if it is set to `false`, parsing is disabled. It is also possible to
+enable/disable syntax parsing on a tag per tag basis using the `markdown` attribute:
+
+* If an HTML tag has an attribute `markdown="0"`, then no parsing (except parsing of HTML span tags)
+  is done inside that HTML tag.
+
+* If an HTML tag has an attribute `markdown="1"`, then the content of the tag is parsed as span
+  level elements.
+
+* If an HTML tag has an attribute `markdown="block"`, then a warning is issued because HTML spans
+  cannot contain block-level elements and the attribute is ignored.
+
+* If an HTML tag has an attribute `markdown="span"`, then the content of the tag is parsed as span
+  level elements.
+
+The content of a span-level HTML tag is normally parsed as span-level elements. Note, however, that
+some tags like `<script>` are not parsed, i.e. their content is not modified.
+
+Processing instructions and XML comments can also be used (their content is not parsed). However, as
+with HTML tags the start and the end have to appear in the same block-level element.
+
+Span-level PIs and span-level XML comments as well as general span-level HTML and XML tags have to
+be preceded by at least one non whitespace character on the same line so that kramdown correctly
+recognizes them as span-level element and not as block-level element. However, all span HTML tags,
+i.e. `a`, `em`, `b`, ..., (opening or closing) can appear at the start of a line.
+
+Unclosed span-level HTML tags are correctly closed at the end of the span-level text to ensure
+correct nesting and invalidly used end tags or block HTML tags are removed from the output:
+
+    This is </invalid>.
+
+    This <span>is automatically closed.
+^
+    <p>This is .</p>
+
+    <p>This <span>is automatically closed.</span></p>
+
+Also note that one or more consecutive new line characters in an HTML span tag are replaced by a
+single space, for example:
+
+    Link: <a href="some
+    link">text</a>
+^
+    <p>Link: <a href="some link">text</a></p>
+
+
+## Footnotes
+
+> This syntax feature is not part of the original Markdown syntax. The idea and syntax comes from
+> the [PHP Markdown Extra] package.
+{: .markdown-difference}
+
+Footnotes in kramdown are similar to reference style links and link definitions. You need to place
+the footnote marker in the correct position in the text and the actual footnote content can be
+defined anywhere in the document.
+
+More exactly, a footnote marker can be created by placing the footnote name in square brackets.
+The footnote name has to start with a caret (`^`), followed by a word character or a digit and then
+optionally followed by other word characters, digits or dashes. For example:
+
+    This is some text.[^1]. Other text.[^footnote].
+
+Footnote markers with the same name will link to the same footnote definition. The actual naming of
+a footnote does not matter since the numbering of footnotes is controlled via the position of the
+footnote markers in the document (the first found footnote marker will get the number 1, the second 
+new footnote marker the number 2 and so on). If there is a footnote definition found for the
+identifier, a footnote will be created. Otherwise the footnote marker is not converted to a footnote
+link. Also note that all attributes set via a span IAL are ignored for a footnote marker!
+
+A footnote definition is used to define the content of a footnote and has the following structure:
+
+* The footnote name in square brackets, optionally indented up to three spaces,
+* then a colon and one or more optional spaces,
+* then the text of the footnote
+* and optionally more text on the following lines which have to follow the syntax for [standard code
+  blocks](#standard-code-blocks) (the leading four spaces/one tab are naturally stripped from the
+  text)
+
+> Footnote definitions are, despite being described here, non-content block-level elements.
+{: .information}
+
+The whole footnote content is treated like block-level text and can therefore contain any valid
+block-level element (also, any block-level element can be the first element). If you want to have a
+code block as first element, note that all leading spaces/tabs on the first line are stripped away.
+Here are some example footnote definitions:
+
+    [^1]: Some *crazy* footnote definition.
+
+    [^footnote]:
+        > Blockquotes can be in a footnote.
+
+            as well as code blocks
+
+        or, naturally, simple paragraphs.
+
+    [^other-note]:       no code block here (spaces are stripped away)
+
+    [^codeblock-note]:
+            this is now a code block (8 spaces indentation)
+
+It does not matter where you put a footnote definition in a kramdown document; the content of all
+referenced footnote definitions will be placed at the end of the kramdown document. Not referenced
+footnote definitions are ignored. If more than one footnote definitions have the same footnote name,
+all footnote definitions but the last are ignored.
+
+Although footnote definitions are non-content block-level elements, [block IALs](#block-ials) can be
+used on them to attach attributes. How these attributes are used depends on the converter.
+
+## Abbreviations
+
+> This syntax feature is not part of the original Markdown syntax. The idea and syntax comes from
+> the [PHP Markdown Extra] package.
+{: .markdown-difference}
+
+kramdown provides a syntax to assign the full phrase to an abbreviation. When writing the text, you
+don't need to do anything special. However, once you add abbreviation definitions, the
+abbreviations in the text get marked up automatically. Abbreviations can consist of any character
+except a closing bracket.
+
+An abbreviation definition is used to define the full phrase for an abbreviation and has the
+following structure:
+
+* An asterisk and the abbreviation in square brackets, optionally indented up to three
+  spaces,
+* then a colon and the full phrase of the abbreviation on one line (leading and trailing spaces are
+  stripped from the full phrase).
+
+Later abbreviation definitions for the same abbreviation override prior ones and it does not matter
+where you put an abbreviation definition in a kramdown document. Empty definitions are also allowed.
+
+Although abbreviation definitions are non-content block-level elements, [block IALs](#block-ials)
+can be used on them to specify additional attributes.
+
+Here are some examples:
+
+    This is some text not written in HTML but in another language!
+
+    *[another language]: It's called Markdown
+
+    *[HTML]: HyperTextMarkupLanguage
+    {:.mega-big}
+
+> Abbreviation definitions are, despite being described here, non-content block-level elements.
+{: .information}
+
+
+## Typographic Symbols
+
+> The original Markdown syntax does not support these transformations.
+{: .markdown-difference}
+
+kramdown converts the following plain ASCII character into their corresponding typographic symbols:
+
+* `---` will become an em-dash (like this ---)
+* `--` will become an en-dash (like this --)
+* `...` will become an ellipsis (like this ...)
+* `<<` will become a left guillemet (like this <<) -- an optional following space will become a
+  non-breakable space
+* `>>` will become a right guillemet (like this >>) -- an optional leading space will become a
+  non-breakable space
+
+The parser also replaces normal single `'` and double quotes `"` with "fancy quotes". There *may* be
+times when kramdown falsely replace the quotes. If this is the case, just \'escape\" the quotes and
+they won't be replaced with fancy ones.
+
+
+
+# Non-content elements
+
+This section describes the non-content elements that are used in kramdown documents, i.e. elements
+that don't provide content for the document but have other uses such as separating block-level
+elements or attaching attributes to elements.
+
+Three non-content block-level elements are not described here because they fit better where they
+are:
+
+* [link definitions](#link-definitions)
+* [footnote definitions](#footnotes)
+* [abbreviation definition](#abbreviations)
+
+
+## End-Of-Block Marker    {#eob-marker}
+
+> The EOB marker is not part of the standard Markdown syntax.
+{: .markdown-difference}
+
+The End-Of-Block (EOB) marker -- a `^` as first character on an otherwise empty line -- is a block
+level element that can be used to specify the end of a block-level element even if the block-level
+element, after which it is used, would continue otherwise. If there is no block-level element to
+end, the EOB marker is simply ignored.
+
+You won't find an EOB marker in most kramdown documents but sometimes it is necessary to use it to
+achieve the wanted results which would be impossible otherwise. However, it should only be used when
+absolutely necessary!
+
+For example, the following gives you one list with two items:
+
+    * list item one
+
+    * list item two
+
+By using an EOB marker, you can make two lists with one item each:
+
+    * list one
+    ^
+    * list two
+
+
+## Attribute List Definitions
+
+> This syntax feature is not part of the original Markdown syntax. The idea and syntax comes from
+> the [Maruku] package.
+{: .markdown-difference}
+
+This is an implementation of [Maruku]'s feature for adding attributes to block and span-level
+elements (the naming is also taken from Maruku). This block-level element is used to define
+attributes which can be referenced later. The [Block Inline Attribute List](#block-ials) is used to
+attach attributes to a block-level element and the [Span Inline Attribute List](#span-ials) is used
+to attach attributes to a span-level element.
+
+Following are some examples of attribute list definitions (ALDs) and afterwards comes the syntax
+explanation:
+
+    {:ref-name: #myid .my-class}
+    {:other: ref-name #id-of-other title="hallo you"}
+    {:test: key="value \" with quote" and other='quote brace \}'}
+
+An ALD line has the following structure:
+
+* a left brace, optionally preceded by up to three spaces,
+* followed by a colon, the reference name and another colon,
+* followed by attribute definitions (allowed characters are backslash-escaped closing braces or any
+  character except a not escaped closing brace),
+* followed by a closing brace and optional spaces until the end of the line.
+
+The reference name needs to start with a word character or a digit, optionally followed by other
+word characters, digits or dashes.
+
+There are four different types of attribute definitions which have to be separated by one or more
+spaces:
+
+references
+
+: This must be a valid reference name. It is used to reference an other ALD so that the attributes
+  of the other ALD are also included in this one. The reference name is ignored when collecting the
+  attributes if no attribute definition list with this reference name exists. For example, a simple
+  reference looks like `id`.
+
+key-value pairs
+
+: A key-value pair is defined by a key name, which must follow the rules for reference names, then
+  an equal sign and then the value in single or double quotes. If you need to use the value
+  delimiter (a single or a double quote) inside the value, you need to escape it with a backslash.
+  Key-value pairs can be used to specify arbitrary attributes for block or span-level elements. For
+  example, a key-value pair looks like `key1="bef \"quoted\" aft"` or `title='This is a title'`.
+
+ID name
+
+: An ID name is defined by using a hash and then the identifier name which needs to start with an
+  ASCII alphabetic character (A-Z or a-z), optionally followed by other ASCII characters, digits,
+  dashes or colons. This is a short hand for the key-value pair `id="IDNAME"` since this is often
+  used. The ID name specifies the unique ID of a block or span-level element. For example, an ID
+  name looks like `#myid`.
+
+class names
+
+: A class name is defined by using a dot and then the class name which may contain any character
+  except whitespace, the dot character and the hash character.
+
+  This is (almost, but not quite) a short hand for the key-value pair `class="class-name"`. Almost
+  because it actually means that the class name should be appended to the current value of the
+  `class` attribute. The following ALDs are all equivalent:
+
+      {:id: .cls1 .cls2}
+      {:id: class="cls1" .cls2}
+      {:id: class="something" class="cls1" .cls2}
+      {:id: class="cls1 cls2"}
+
+As can be seen from the example of the class names, attributes that are defined earlier are
+overwritten by ones with the same name defined later.
+
+> Also, everything in the attribute definitions part that does not match one of the above four types
+> is ignored.
+{:.information}
+
+If there is more than one ALD with the same reference name, the attribute definitions of all the
+ALDs are processed like they are defined in one ALD.
+
+
+## Inline Attribute Lists
+
+These elements are used to attach attributes to another element.
+
+### Block Inline Attribute Lists   {#block-ials}
+
+> This syntax feature is not part of the original Markdown syntax. The idea and syntax comes from
+> the [Maruku] package.
+{: .markdown-difference}
+
+This block-level element is used to attach attributes to another block-level element. A block inline
+attribute list (block IAL) has the same structure as an [ALD](#attribute-list-definitions) except
+that the colon/reference name/colon part is replaced by a colon. A block IAL (or two or more block
+IALs) has to be put directly before or after the block-level element to which the attributes should
+be attached. If a block IAL is directly after *and* before a block-level element, it is applied to
+preceding element. The block IAL is ignored in all other cases, for example, when the block IAL is
+surrounded by blank lines.
+
+Key-value pairs of an IAL take precedence over equally named key-value pairs in referenced ALDs.
+
+Here are some examples for block IALs:
+
+    A simple paragraph with an ID attribute.
+    {: #para-one}
+
+    > A blockquote with a title
+    {:title="The blockquote title"}
+    {: #myid}
+
+    {:.ruby}
+        Some code here
+
+### Span Inline Attribute Lists      {#span-ials}
+
+> This syntax feature is not part of the original Markdown syntax. The idea and syntax comes from
+> the [Maruku] package.
+{: .markdown-difference}
+
+This is a version of the [block inline attribute list](#block-ials) for span-level elements. It has
+the same structure as the block IAL except that leading and trailing spaces are not allowed. A span
+IAL (or two or more span IALs) has to be put directly after the span-level element to which it
+should be applied, no additional character is allowed between, otherwise it is ignored and only
+removed from the output.
+
+Here are some examples for span IALs:
+
+    This *is*{:.underline} some `code`{:#id}{:.class}.
+    A [link](test.html){:rel='something'} and some **tools**{:.tools}.
+
+The special span IAL `{::}` contains no attributes but doesn't generate a warning either. It can be
+used to separate consecutive elements that would be falsely parsed if not separated. Here is an use
+case:
+
+    This *is italic*{::}*marked*{:.special} text
+
+
+## Extensions
+
+> This syntax feature is not part of the original Markdown syntax.
+{: .markdown-difference}
+
+Extensions provide additional functionality but use the same syntax for it. They are available as
+block as well as span-level elements.
+
+The syntax for an extension is very similar to the syntax of [ALDs](#attribute-list-definitions).
+Here are some examples of how to specify extensions and afterwards is the syntax definition:
+
+    {::comment}
+    This text is completely ignored by kramdown - a comment in the text.
+    {:/comment}
+
+    Do you see {::comment}this text{:/comment}?
+    {::comment}some other comment{:/}
+
+    {::options key="val" /}
+
+An extension can be specified with or without a body. Therefore there exist a start and an end tag
+for extensions. The start tag has the following structure:
+
+* a left brace,
+* followed by two colons and the extension name,
+* optionally followed by a space and attribute definitions (allowed characters are backslash-escaped
+  closing braces or any character except a not escaped closing brace -- same as with ALDs),
+* followed by a slash and a right brace (in case the extension has no body) or only a right
+  brace (in case the extension has a body).
+
+The stop tag has the following structure:
+
+* a left brace,
+* followed by a colon and a slash,
+* optionally followed by the extension name,
+* followed by a right brace.
+
+A stop tag is only needed if the extension has a body!
+
+The above syntax can be used as is for span-level extensions. The starting and ending lines for block-level
+extensions are defined as:
+
+* The starting line consists of the extension start tag, optionally preceded by up to three spaces,
+  and followed by optional spaces until the end of the line.
+* The ending line consists of the extension stop tag, optionally preceded by up to three spaces,
+  and followed by optional spaces until the end of the line.
+
+If no end tag can be found for an extension start tag, the start tag is treated as if it has no
+body. If an invalid extension stop tag is found, it is ignored. If an invalid extension name is
+specified the extension (and the eventually specified body) are ignored.
+
+The following extensions can be used with kramdown:
+
+`comment`
+
+: Treat the body text as a comment which does not show in the output.
+
+`nomarkdown`
+
+: Don't process the body with kramdown but output it as-is. The attribute `type` specifies which
+  converters should output the body: if the attribute is missing, all converters should output it.
+  Otherwise the attribute value has to be a space separated list of converter names and these
+  converters should output the body.
+
+`options`
+
+: Should be used without a body since the body is ignored. Is used for setting the global options
+  for the kramdown processor (for example, to disable automatic header ID generation). Note that
+  options that are used by the parser are immediately effective whereas all other options are not!
+  This means, for example, that it is not possible to set converter options only for some part of a
+  kramdown document.
+
+
+
+{include_file: doc/links.markdown}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/tests.page b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/tests.page
new file mode 100644
index 0000000..0813c3b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/tests.page
@@ -0,0 +1,104 @@
+---
+title: Tests and Benchmark
+---
+# Tests and Benchmark
+
+## Tests
+
+There exist several test suites for testing the correctness of a Markdown implementation. The
+original [Markdown Test Suite] is the standard which one needs to test against. The [PHP Markdown
+suite][MDTest] contains the original test suite and several more tests (some specifically geared
+towards the extension of the PHP Markdown Extra package). I have used the latter test tool to
+roughly verify that kramdown is able to parse standard Markdown. However, since the syntax used by
+kramdown varies slightly from standard Markdown most of the tests fail - which is fine. When looking
+at the differences one can see that the failures result from these differences.
+
+Besides using the above mentioned test suite kramdown comes with its own set of tests which is used
+to verify that the implementation matches the kramdown specification.
+
+If you believe you have found a bug in the implementation, please follow these steps:
+
+* Check the [syntax page](syntax.html) and see if the behaviour is not intended.
+
+* If the behaviour is not intended and it seems that kramdown should parse some text in another
+  fashion, please open a [bug report] and attach two files: one with the text and one with the HTML
+  conversion you think is correct.
+
+[bug report]: http://github.com/gettalong/kramdown/issues
+
+
+## Benchmark
+
+kramdown comes with a small benchmark to test how fast it is in regard to four other Ruby Markdown
+implementations: Maruku, BlueFeather, BlueCloth, RDiscount and Redcarpet. The first two are written
+using only Ruby, the latter three are written in C and need to be compiled.
+
+As one can see below, kramdown is currently (September 2014) ~3x faster than Maruku, ~4.5x faster
+than BlueFeather but ~30x slower than RDiscount and ~150x slower than Redcarpet:
+
+<pre><code>
+Running tests on 2014-09-16 under ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
+
+Test using file mdsyntax.text and 20 runs
+Rehearsal ----------------------------------------------------
+kramdown 1.4.2     0.900000   0.010000   0.910000 (  0.914992)
+Maruku 0.7.1       2.360000   0.040000   2.400000 (  2.403571)
+BlueFeather 0.41   3.760000   0.010000   3.770000 (  3.776421)
+BlueCloth 2.2.0    0.050000   0.000000   0.050000 (  0.050221)
+RDiscount 2.1.7    0.020000   0.000000   0.020000 (  0.024180)
+redcarpet 3.1.2    0.010000   0.000000   0.010000 (  0.004579)
+------------------------------------------- total: 7.160000sec
+
+                       user     system      total        real
+kramdown 1.4.2     0.830000   0.000000   0.830000 (  0.834144)
+Maruku 0.7.1       2.250000   0.030000   2.280000 (  2.286579)
+BlueFeather 0.41   3.680000   0.010000   3.690000 (  3.693769)
+BlueCloth 2.2.0    0.050000   0.000000   0.050000 (  0.044831)
+RDiscount 2.1.7    0.020000   0.000000   0.020000 (  0.022847)
+redcarpet 3.1.2    0.010000   0.000000   0.010000 (  0.004601)
+
+Real time of X divided by real time of kramdown
+Maruku             2.7412
+BlueFeather        4.4282
+BlueCloth          0.0537
+RDiscount          0.0274
+redcarpet          0.0055
+
+Test using file mdbasics.text and 20 runs
+Rehearsal ----------------------------------------------------
+kramdown 1.4.2     0.150000   0.000000   0.150000 (  0.149989)
+Maruku 0.7.1       0.580000   0.010000   0.590000 (  0.584910)
+BlueFeather 0.41   0.780000   0.000000   0.780000 (  0.788740)
+BlueCloth 2.2.0    0.020000   0.000000   0.020000 (  0.014700)
+RDiscount 2.1.7    0.000000   0.000000   0.000000 (  0.007692)
+redcarpet 3.1.2    0.010000   0.000000   0.010000 (  0.002064)
+------------------------------------------- total: 1.550000sec
+
+                       user     system      total        real
+kramdown 1.4.2     0.150000   0.000000   0.150000 (  0.151586)
+Maruku 0.7.1       0.520000   0.000000   0.520000 (  0.525707)
+BlueFeather 0.41   0.770000   0.010000   0.780000 (  0.763559)
+BlueCloth 2.2.0    0.020000   0.000000   0.020000 (  0.015509)
+RDiscount 2.1.7    0.010000   0.000000   0.010000 (  0.006545)
+redcarpet 3.1.2    0.000000   0.000000   0.000000 (  0.001475)
+
+Real time of X divided by real time of kramdown
+Maruku             3.468
+BlueFeather        5.0371
+BlueCloth          0.1023
+RDiscount          0.0432
+redcarpet          0.0097
+</code></pre>
+
+And here are some graphs which show the execution times of the various kramdown releases on
+different Ruby interpreters:
+
+![ruby 1.8.7p302]({relocatable: img/graph-ruby-1.8.7-302.png})
+![ruby 1.9.3p448]({relocatable: img/graph-ruby-1.9.3p448-448.png})
+![ruby 2.0.0p247]({relocatable: img/graph-ruby-2.0.0p247-247.png})
+![ruby 2.1.2p95]({relocatable: img/graph-ruby-2.1.2p95-95.png})
+![jruby 1.7.15]({relocatable: img/graph-jruby-1.7.15-392.png})
+![rubinius 2.2.10]({relocatable: img/graph-rubinius-2.2.10-0.png})
+
+[Markdown Test Suite]: http://daringfireball.net/projects/downloads/MarkdownTest_1.0.zip
+[MDTest]: http://www.michelf.com/docs/projets/mdtest-1.0.zip
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/virtual b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/virtual
new file mode 100644
index 0000000..d316420
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/doc/virtual
@@ -0,0 +1,14 @@
+rdoc/index.html:
+  title: API Documentation
+
+/options.en.html#option-syntax-highlighter:
+  dest_path: options.html#option-syntax-highlighter
+
+/options.en.html#option-syntax-highlighter-opts:
+  dest_path: options.html#option-syntax-highlighter-opts
+
+/options.en.html#option-math-engine:
+  dest_path: options.html#option-math-engine
+
+/options.en.html#option-math-engine-opts:
+  dest_path: options.html#option-math-engine-opts
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown.rb
new file mode 100644
index 0000000..5b6348e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown.rb
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/document'
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/compatibility.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/compatibility.rb
new file mode 100644
index 0000000..7f0f304
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/compatibility.rb
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+# All the code in this file is backported from Ruby 1.8.7 sothat kramdown works under 1.8.5
+#
+# :stopdoc:
+
+require 'rbconfig'
+
+if RUBY_VERSION <= '1.8.6'
+  require 'rexml/parsers/baseparser'
+  module REXML
+    module Parsers
+      class BaseParser
+        UNAME_STR= "(?:#{NCNAME_STR}:)?#{NCNAME_STR}" unless const_defined?(:UNAME_STR)
+      end
+    end
+  end
+
+  if !String.instance_methods.include?("start_with?")
+
+    class String
+      def start_with?(str)
+        self[0, str.length] == str
+      end
+      def end_with?(str)
+        self[-str.length, str.length] == str
+      end
+    end
+
+  end
+
+end
+
+if !Symbol.instance_methods.include?("<=>")
+
+  class Symbol
+    def <=>(other)
+      self.to_s <=> other.to_s
+    end
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter.rb
new file mode 100644
index 0000000..5fa8f14
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter.rb
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/utils'
+
+module Kramdown
+
+  # This module contains all available converters, i.e. classes that take a root Element and convert
+  # it to a specific output format. The result is normally a string. For example, the
+  # Converter::Html module converts an element tree into valid HTML.
+  #
+  # Converters use the Base class for common functionality (like applying a template to the output)
+  # \- see its API documentation for how to create a custom converter class.
+  module Converter
+
+    autoload :Base, 'kramdown/converter/base'
+    autoload :Html, 'kramdown/converter/html'
+    autoload :Latex, 'kramdown/converter/latex'
+    autoload :Kramdown, 'kramdown/converter/kramdown'
+    autoload :Toc, 'kramdown/converter/toc'
+    autoload :RemoveHtmlTags, 'kramdown/converter/remove_html_tags'
+    autoload :Pdf, 'kramdown/converter/pdf'
+    autoload :HashAST, 'kramdown/converter/hash_ast'
+    autoload :HashAst, 'kramdown/converter/hash_ast'
+    autoload :Man, 'kramdown/converter/man'
+
+    extend ::Kramdown::Utils::Configurable
+
+    configurable(:syntax_highlighter)
+
+    ['Minted', "Coderay", "Rouge"].each do |klass_name|
+      kn_down = klass_name.downcase.intern
+      add_syntax_highlighter(kn_down) do |converter, text, lang, type, opts|
+        require "kramdown/converter/syntax_highlighter/#{kn_down}"
+        klass = ::Kramdown::Utils.deep_const_get("::Kramdown::Converter::SyntaxHighlighter::#{klass_name}")
+        if !klass.const_defined?(:AVAILABLE) || klass::AVAILABLE
+          add_syntax_highlighter(kn_down, klass)
+        else
+          add_syntax_highlighter(kn_down) {|*args| nil}
+        end
+        syntax_highlighter(kn_down).call(converter, text, lang, type, opts)
+      end
+    end
+
+    configurable(:math_engine)
+
+    ['Mathjax', "MathjaxNode", "Ritex", "Itex2MML"].each do |klass_name|
+      kn_down = klass_name.downcase.intern
+      add_math_engine(kn_down) do |converter, el, opts|
+        require "kramdown/converter/math_engine/#{kn_down}"
+        klass = ::Kramdown::Utils.deep_const_get("::Kramdown::Converter::MathEngine::#{klass_name}")
+        if !klass.const_defined?(:AVAILABLE) || klass::AVAILABLE
+          add_math_engine(kn_down, klass)
+        else
+          add_math_engine(kn_down) {|*args| nil}
+        end
+        math_engine(kn_down).call(converter, el, opts)
+      end
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/base.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/base.rb
new file mode 100644
index 0000000..ee172e6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/base.rb
@@ -0,0 +1,267 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'erb'
+require 'kramdown/utils'
+require 'kramdown/document'
+
+module Kramdown
+
+  module Converter
+
+    # == \Base class for converters
+    #
+    # This class serves as base class for all converters. It provides methods that can/should be
+    # used by all converters (like #generate_id) as well as common functionality that is
+    # automatically applied to the result (for example, embedding the output into a template).
+    #
+    # A converter object is used as a throw-away object, i.e. it is only used for storing the needed
+    # state information during conversion. Therefore one can't instantiate a converter object
+    # directly but only use the Base::convert method.
+    #
+    # == Implementing a converter
+    #
+    # Implementing a new converter is rather easy: just derive a new class from this class and put
+    # it in the Kramdown::Converter module (the latter is only needed if auto-detection should work
+    # properly). Then you need to implement the #convert method which has to contain the conversion
+    # code for converting an element and has to return the conversion result.
+    #
+    # The actual transformation of the document tree can be done in any way. However, writing one
+    # method per element type is a straight forward way to do it - this is how the Html and Latex
+    # converters do the transformation.
+    #
+    # Have a look at the Base::convert method for additional information!
+    class Base
+
+      # Can be used by a converter for storing arbitrary information during the conversion process.
+      attr_reader :data
+
+      # The hash with the conversion options.
+      attr_reader :options
+
+      # The root element that is converted.
+      attr_reader :root
+
+      # The warnings array.
+      attr_reader :warnings
+
+      # Initialize the converter with the given +root+ element and +options+ hash.
+      def initialize(root, options)
+        @options = options
+        @root = root
+        @data = {}
+        @warnings = []
+      end
+      private_class_method(:new, :allocate)
+
+      # Returns whether the template should be applied before the conversion of the tree.
+      #
+      # Defaults to false.
+      def apply_template_before?
+        false
+      end
+
+      # Returns whether the template should be applied after the conversion of the tree.
+      #
+      # Defaults to true.
+      def apply_template_after?
+        true
+      end
+
+      # Convert the element tree +tree+ and return the resulting conversion object (normally a
+      # string) and an array with warning messages. The parameter +options+ specifies the conversion
+      # options that should be used.
+      #
+      # Initializes a new instance of the calling class and then calls the #convert method with
+      # +tree+ as parameter.
+      #
+      # If the +template+ option is specified and non-empty, the template is evaluate with ERB
+      # before and/or after the tree conversion depending on the result of #apply_template_before?
+      # and #apply_template_after?. If the template is evaluated before, an empty string is used for
+      # the body; if evaluated after, the result is used as body. See ::apply_template.
+      #
+      # The template resolution is done in the following way (for the converter ConverterName):
+      #
+      # 1. Look in the current working directory for the template.
+      #
+      # 2. Append +.converter_name+ (e.g. +.html+) to the template name and look for the resulting
+      #    file in the current working directory (the form +.convertername+ is deprecated).
+      #
+      # 3. Append +.converter_name+ to the template name and look for it in the kramdown data
+      #    directory (the form +.convertername+ is deprecated).
+      #
+      # 4. Check if the template name starts with 'string://' and if so, strip this prefix away and
+      #    use the rest as template.
+      def self.convert(tree, options = {})
+        converter = new(tree, ::Kramdown::Options.merge(options.merge(tree.options[:options] || {})))
+
+        apply_template(converter, '') if !converter.options[:template].empty? && converter.apply_template_before?
+        result = converter.convert(tree)
+        result.encode!(tree.options[:encoding]) if result.respond_to?(:encode!) && result.encoding != Encoding::BINARY
+        result = apply_template(converter, result) if !converter.options[:template].empty? && converter.apply_template_after?
+
+        [result, converter.warnings]
+      end
+
+      # Convert the element +el+ and return the resulting object.
+      #
+      # This is the only method that has to be implemented by sub-classes!
+      def convert(el)
+        raise NotImplementedError
+      end
+
+      # Apply the +template+ using +body+ as the body string.
+      #
+      # The template is evaluated using ERB and the body is available in the @body instance variable
+      # and the converter object in the @converter instance variable.
+      def self.apply_template(converter, body) # :nodoc:
+        erb = ERB.new(get_template(converter.options[:template]))
+        obj = Object.new
+        obj.instance_variable_set(:@converter, converter)
+        obj.instance_variable_set(:@body, body)
+        erb.result(obj.instance_eval{binding})
+      end
+
+      # Return the template specified by +template+.
+      def self.get_template(template)
+        #DEPRECATED: use content of #get_template_new in 2.0
+        format_ext = '.' + self.name.split(/::/).last.downcase
+        shipped = File.join(::Kramdown.data_dir, template + format_ext)
+        if File.exist?(template)
+          File.read(template)
+        elsif File.exist?(template + format_ext)
+          File.read(template + format_ext)
+        elsif File.exist?(shipped)
+          File.read(shipped)
+        elsif template.start_with?('string://')
+          template.sub(/\Astring:\/\//, '')
+        else
+          get_template_new(template)
+        end
+      end
+
+      def self.get_template_new(template) # :nodoc:
+        format_ext = '.' + ::Kramdown::Utils.snake_case(self.name.split(/::/).last)
+        shipped = File.join(::Kramdown.data_dir, template + format_ext)
+        if File.exist?(template)
+          File.read(template)
+        elsif File.exist?(template + format_ext)
+          File.read(template + format_ext)
+        elsif File.exist?(shipped)
+          File.read(shipped)
+        elsif template.start_with?('string://')
+          template.sub(/\Astring:\/\//, '')
+        else
+          raise "The specified template file #{template} does not exist"
+        end
+      end
+
+      # Add the given warning +text+ to the warning array.
+      def warning(text)
+        @warnings << text
+      end
+
+      # Return +true+ if the header element +el+ should be used for the table of contents (as
+      # specified by the +toc_levels+ option).
+      def in_toc?(el)
+        @options[:toc_levels].include?(el.options[:level]) && (el.attr['class'] || '') !~ /\bno_toc\b/
+      end
+
+      # Return the output header level given a level.
+      #
+      # Uses the +header_offset+ option for adjusting the header level.
+      def output_header_level(level)
+        [[level + @options[:header_offset], 6].min, 1].max
+      end
+
+      # Extract the code block/span language from the attributes.
+      def extract_code_language(attr)
+        if attr['class'] && attr['class'] =~ /\blanguage-\S+/
+          attr['class'].scan(/\blanguage-(\S+)/).first.first
+        end
+      end
+
+      # See #extract_code_language
+      #
+      # *Warning*: This version will modify the given attributes if a language is present.
+      def extract_code_language!(attr)
+        lang = extract_code_language(attr)
+        attr['class'] = attr['class'].sub(/\blanguage-\S+/, '').strip if lang
+        attr.delete('class') if lang && attr['class'].empty?
+        lang
+      end
+
+      # Highlight the given +text+ in the language +lang+ with the syntax highlighter configured
+      # through the option 'syntax_highlighter'.
+      def highlight_code(text, lang, type, opts = {})
+        return nil unless @options[:syntax_highlighter]
+
+        highlighter = ::Kramdown::Converter.syntax_highlighter(@options[:syntax_highlighter])
+        if highlighter
+          highlighter.call(self, text, lang, type, opts)
+        else
+          warning("The configured syntax highlighter #{@options[:syntax_highlighter]} is not available.")
+          nil
+        end
+      end
+
+      # Format the given math element with the math engine configured through the option
+      # 'math_engine'.
+      def format_math(el, opts = {})
+        return nil unless @options[:math_engine]
+
+        engine = ::Kramdown::Converter.math_engine(@options[:math_engine])
+        if engine
+          engine.call(self, el, opts)
+        else
+          warning("The configured math engine #{@options[:math_engine]} is not available.")
+          nil
+        end
+      end
+
+      # Generate an unique alpha-numeric ID from the the string +str+ for use as a header ID.
+      #
+      # Uses the option +auto_id_prefix+: the value of this option is prepended to every generated
+      # ID.
+      def generate_id(str)
+        str = ::Kramdown::Utils::Unidecoder.decode(str) if @options[:transliterated_header_ids]
+        gen_id = basic_generate_id(str)
+        gen_id = 'section' if gen_id.length == 0
+        @used_ids ||= {}
+        if @used_ids.has_key?(gen_id)
+          gen_id += '-' << (@used_ids[gen_id] += 1).to_s
+        else
+          @used_ids[gen_id] = 0
+        end
+        @options[:auto_id_prefix] + gen_id
+      end
+
+      # The basic version of the ID generator, without any special provisions for empty or unique
+      # IDs.
+      def basic_generate_id(str)
+        gen_id = str.gsub(/^[^a-zA-Z]+/, '')
+        gen_id.tr!('^a-zA-Z0-9 -', '')
+        gen_id.tr!(' ', '-')
+        gen_id.downcase!
+        gen_id
+      end
+
+      SMART_QUOTE_INDICES = {:lsquo => 0, :rsquo => 1, :ldquo => 2, :rdquo => 3} # :nodoc:
+
+      # Return the entity that represents the given smart_quote element.
+      def smart_quote_entity(el)
+        res = @options[:smart_quotes][SMART_QUOTE_INDICES[el.value]]
+        ::Kramdown::Utils::Entities.entity(res)
+      end
+
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/hash_ast.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/hash_ast.rb
new file mode 100644
index 0000000..fca004d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/hash_ast.rb
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser'
+require 'kramdown/converter'
+require 'kramdown/utils'
+
+module Kramdown
+
+  module Converter
+
+    # Converts a Kramdown::Document to a nested hash for further processing or debug output.
+    class HashAST < Base
+
+      def convert(el)
+        hash = {:type => el.type}
+        hash[:attr] = el.attr unless el.attr.empty?
+        hash[:value] = el.value unless el.value.nil?
+        hash[:options] = el.options unless el.options.empty?
+        unless el.children.empty?
+          hash[:children] = []
+          el.children.each {|child| hash[:children] << convert(child)}
+        end
+        hash
+      end
+
+    end
+
+    HashAst = HashAST
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/html.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/html.rb
new file mode 100644
index 0000000..27608bb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/html.rb
@@ -0,0 +1,471 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser'
+require 'kramdown/converter'
+require 'kramdown/utils'
+
+module Kramdown
+
+  module Converter
+
+    # Converts a Kramdown::Document to HTML.
+    #
+    # You can customize the HTML converter by sub-classing it and overriding the +convert_NAME+
+    # methods. Each such method takes the following parameters:
+    #
+    # [+el+] The element of type +NAME+ to be converted.
+    #
+    # [+indent+] A number representing the current amount of spaces for indent (only used for
+    #            block-level elements).
+    #
+    # The return value of such a method has to be a string containing the element +el+ formatted as
+    # HTML element.
+    class Html < Base
+
+      include ::Kramdown::Utils::Html
+      include ::Kramdown::Parser::Html::Constants
+
+      # The amount of indentation used when nesting HTML tags.
+      attr_accessor :indent
+
+      # Initialize the HTML converter with the given Kramdown document +doc+.
+      def initialize(root, options)
+        super
+        @footnote_counter = @footnote_start = @options[:footnote_nr]
+        @footnotes = []
+        @footnotes_by_name = {}
+        @footnote_location = nil
+        @toc = []
+        @toc_code = nil
+        @indent = 2
+        @stack = []
+      end
+
+      # The mapping of element type to conversion method.
+      DISPATCHER = Hash.new {|h,k| h[k] = "convert_#{k}"}
+
+      # Dispatch the conversion of the element +el+ to a +convert_TYPE+ method using the +type+ of
+      # the element.
+      def convert(el, indent = -@indent)
+        send(DISPATCHER[el.type], el, indent)
+      end
+
+      # Return the converted content of the children of +el+ as a string. The parameter +indent+ has
+      # to be the amount of indentation used for the element +el+.
+      #
+      # Pushes +el+ onto the @stack before converting the child elements and pops it from the stack
+      # afterwards.
+      def inner(el, indent)
+        result = ''
+        indent += @indent
+        @stack.push(el)
+        el.children.each do |inner_el|
+          result << send(DISPATCHER[inner_el.type], inner_el, indent)
+        end
+        @stack.pop
+        result
+      end
+
+      def convert_blank(el, indent)
+        "\n"
+      end
+
+      def convert_text(el, indent)
+        escape_html(el.value, :text)
+      end
+
+      def convert_p(el, indent)
+        if el.options[:transparent]
+          inner(el, indent)
+        else
+          format_as_block_html(el.type, el.attr, inner(el, indent), indent)
+        end
+      end
+
+      def convert_codeblock(el, indent)
+        attr = el.attr.dup
+        lang = extract_code_language!(attr)
+        hl_opts = {}
+        highlighted_code = highlight_code(el.value, el.options[:lang] || lang, :block, hl_opts)
+
+        if highlighted_code
+          add_syntax_highlighter_to_class_attr(attr, lang || hl_opts[:default_lang])
+          "#{' '*indent}<div#{html_attributes(attr)}>#{highlighted_code}#{' '*indent}</div>\n"
+        else
+          result = escape_html(el.value)
+          result.chomp!
+          if el.attr['class'].to_s =~ /\bshow-whitespaces\b/
+            result.gsub!(/(?:(^[ \t]+)|([ \t]+$)|([ \t]+))/) do |m|
+              suffix = ($1 ? '-l' : ($2 ? '-r' : ''))
+              m.scan(/./).map do |c|
+                case c
+                when "\t" then "<span class=\"ws-tab#{suffix}\">\t</span>"
+                when " " then "<span class=\"ws-space#{suffix}\">&#8901;</span>"
+                end
+              end.join('')
+            end
+          end
+          code_attr = {}
+          code_attr['class'] = "language-#{lang}" if lang
+          "#{' '*indent}<pre#{html_attributes(attr)}><code#{html_attributes(code_attr)}>#{result}\n</code></pre>\n"
+        end
+      end
+
+      def convert_blockquote(el, indent)
+        format_as_indented_block_html(el.type, el.attr, inner(el, indent), indent)
+      end
+
+      def convert_header(el, indent)
+        attr = el.attr.dup
+        if @options[:auto_ids] && !attr['id']
+          attr['id'] = generate_id(el.options[:raw_text])
+        end
+        @toc << [el.options[:level], attr['id'], el.children] if attr['id'] && in_toc?(el)
+        level = output_header_level(el.options[:level])
+        format_as_block_html("h#{level}", attr, inner(el, indent), indent)
+      end
+
+      def convert_hr(el, indent)
+        "#{' '*indent}<hr#{html_attributes(el.attr)} />\n"
+      end
+
+      def convert_ul(el, indent)
+        if !@toc_code && (el.options[:ial][:refs].include?('toc') rescue nil)
+          @toc_code = [el.type, el.attr, (0..128).to_a.map{|a| rand(36).to_s(36)}.join]
+          @toc_code.last
+        elsif !@footnote_location && el.options[:ial] && (el.options[:ial][:refs] || []).include?('footnotes')
+          @footnote_location = (0..128).to_a.map{|a| rand(36).to_s(36)}.join
+        else
+          format_as_indented_block_html(el.type, el.attr, inner(el, indent), indent)
+        end
+      end
+      alias :convert_ol :convert_ul
+
+      def convert_dl(el, indent)
+        format_as_indented_block_html(el.type, el.attr, inner(el, indent), indent)
+      end
+
+      def convert_li(el, indent)
+        output = ' '*indent << "<#{el.type}" << html_attributes(el.attr) << ">"
+        res = inner(el, indent)
+        if el.children.empty? || (el.children.first.type == :p && el.children.first.options[:transparent])
+          output << res << (res =~ /\n\Z/ ? ' '*indent : '')
+        else
+          output << "\n" << res << ' '*indent
+        end
+        output << "</#{el.type}>\n"
+      end
+      alias :convert_dd :convert_li
+
+      def convert_dt(el, indent)
+        attr = el.attr.dup
+        @stack.last.options[:ial][:refs].each do |ref|
+          if ref =~ /\Aauto_ids(?:-([\w-]+))?/
+            attr['id'] = ($1 ? $1 : '') << basic_generate_id(el.options[:raw_text])
+            break
+          end
+        end if !attr['id'] && @stack.last.options[:ial] && @stack.last.options[:ial][:refs]
+        format_as_block_html(el.type, attr, inner(el, indent), indent)
+      end
+
+      def convert_html_element(el, indent)
+        res = inner(el, indent)
+        if el.options[:category] == :span
+          "<#{el.value}#{html_attributes(el.attr)}" << (res.empty? && HTML_ELEMENTS_WITHOUT_BODY.include?(el.value) ? " />" : ">#{res}</#{el.value}>")
+        else
+          output = ''
+          output << ' '*indent if @stack.last.type != :html_element || @stack.last.options[:content_model] != :raw
+          output << "<#{el.value}#{html_attributes(el.attr)}"
+          if el.options[:is_closed] && el.options[:content_model] == :raw
+            output << " />"
+          elsif !res.empty? && el.options[:content_model] != :block
+            output << ">#{res}</#{el.value}>"
+          elsif !res.empty?
+            output << ">\n#{res.chomp}\n"  << ' '*indent << "</#{el.value}>"
+          elsif HTML_ELEMENTS_WITHOUT_BODY.include?(el.value)
+            output << " />"
+          else
+            output << "></#{el.value}>"
+          end
+          output << "\n" if @stack.last.type != :html_element || @stack.last.options[:content_model] != :raw
+          output
+        end
+      end
+
+      def convert_xml_comment(el, indent)
+        if el.options[:category] == :block && (@stack.last.type != :html_element || @stack.last.options[:content_model] != :raw)
+          ' '*indent << el.value << "\n"
+        else
+          el.value
+        end
+      end
+      alias :convert_xml_pi :convert_xml_comment
+
+      def convert_table(el, indent)
+        format_as_indented_block_html(el.type, el.attr, inner(el, indent), indent)
+      end
+      alias :convert_thead :convert_table
+      alias :convert_tbody :convert_table
+      alias :convert_tfoot :convert_table
+      alias :convert_tr  :convert_table
+
+      ENTITY_NBSP = ::Kramdown::Utils::Entities.entity('nbsp') # :nodoc:
+
+      def convert_td(el, indent)
+        res = inner(el, indent)
+        type = (@stack[-2].type == :thead ? :th : :td)
+        attr = el.attr
+        alignment = @stack[-3].options[:alignment][@stack.last.children.index(el)]
+        if alignment != :default
+          attr = el.attr.dup
+          attr['style'] = (attr.has_key?('style') ? "#{attr['style']}; ": '') << "text-align: #{alignment}"
+        end
+        format_as_block_html(type, attr, res.empty? ? entity_to_str(ENTITY_NBSP) : res, indent)
+      end
+
+      def convert_comment(el, indent)
+        if el.options[:category] == :block
+          "#{' '*indent}<!-- #{el.value} -->\n"
+        else
+          "<!-- #{el.value} -->"
+        end
+      end
+
+      def convert_br(el, indent)
+        "<br />"
+      end
+
+      def convert_a(el, indent)
+        format_as_span_html(el.type, el.attr, inner(el, indent))
+      end
+
+      def convert_img(el, indent)
+        "<img#{html_attributes(el.attr)} />"
+      end
+
+      def convert_codespan(el, indent)
+        attr = el.attr.dup
+        lang = extract_code_language(attr)
+        hl_opts = {}
+        result = highlight_code(el.value, lang, :span, hl_opts)
+        if result
+          add_syntax_highlighter_to_class_attr(attr, hl_opts[:default_lang])
+        else
+          result = escape_html(el.value)
+        end
+
+        format_as_span_html('code', attr, result)
+      end
+
+      def convert_footnote(el, indent)
+        repeat = ''
+        if (footnote = @footnotes_by_name[el.options[:name]])
+          number = footnote[2]
+          repeat = ":#{footnote[3] += 1}"
+        else
+          number = @footnote_counter
+          @footnote_counter += 1
+          @footnotes << [el.options[:name], el.value, number, 0]
+          @footnotes_by_name[el.options[:name]] = @footnotes.last
+        end
+        "<sup id=\"fnref:#{el.options[:name]}#{repeat}\"><a href=\"#fn:#{el.options[:name]}\" class=\"footnote\">#{number}</a></sup>"
+      end
+
+      def convert_raw(el, indent)
+        if !el.options[:type] || el.options[:type].empty? || el.options[:type].include?('html')
+          el.value + (el.options[:category] == :block ? "\n" : '')
+        else
+          ''
+        end
+      end
+
+      def convert_em(el, indent)
+        format_as_span_html(el.type, el.attr, inner(el, indent))
+      end
+      alias :convert_strong :convert_em
+
+      def convert_entity(el, indent)
+        entity_to_str(el.value, el.options[:original])
+      end
+
+      TYPOGRAPHIC_SYMS = {
+        :mdash => [::Kramdown::Utils::Entities.entity('mdash')],
+        :ndash => [::Kramdown::Utils::Entities.entity('ndash')],
+        :hellip => [::Kramdown::Utils::Entities.entity('hellip')],
+        :laquo_space => [::Kramdown::Utils::Entities.entity('laquo'), ::Kramdown::Utils::Entities.entity('nbsp')],
+        :raquo_space => [::Kramdown::Utils::Entities.entity('nbsp'), ::Kramdown::Utils::Entities.entity('raquo')],
+        :laquo => [::Kramdown::Utils::Entities.entity('laquo')],
+        :raquo => [::Kramdown::Utils::Entities.entity('raquo')]
+      } # :nodoc:
+      def convert_typographic_sym(el, indent)
+        TYPOGRAPHIC_SYMS[el.value].map {|e| entity_to_str(e)}.join('')
+      end
+
+      def convert_smart_quote(el, indent)
+        entity_to_str(smart_quote_entity(el))
+      end
+
+      def convert_math(el, indent)
+        if (result = format_math(el, :indent => indent))
+          result
+        else
+          attr = el.attr.dup
+          (attr['class'] = (attr['class'] || '') << " kdmath").lstrip!
+          if el.options[:category] == :block
+            format_as_block_html('div', attr, "$$\n#{el.value}\n$$", indent)
+          else
+            format_as_span_html('span', attr, "$#{el.value}$")
+          end
+        end
+      end
+
+      def convert_abbreviation(el, indent)
+        title = @root.options[:abbrev_defs][el.value]
+        attr = @root.options[:abbrev_attr][el.value].dup
+        attr['title'] = title unless title.empty?
+        format_as_span_html("abbr", attr, el.value)
+      end
+
+      def convert_root(el, indent)
+        result = inner(el, indent)
+        if @footnote_location
+          result.sub!(/#{@footnote_location}/, footnote_content.gsub(/\\/, "\\\\\\\\"))
+        else
+          result << footnote_content
+        end
+        if @toc_code
+          toc_tree = generate_toc_tree(@toc, @toc_code[0], @toc_code[1] || {})
+          text = if toc_tree.children.size > 0
+                   convert(toc_tree, 0)
+                 else
+                   ''
+                 end
+          result.sub!(/#{@toc_code.last}/, text.gsub(/\\/, "\\\\\\\\"))
+        end
+        result
+      end
+
+      # Format the given element as span HTML.
+      def format_as_span_html(name, attr, body)
+        "<#{name}#{html_attributes(attr)}>#{body}</#{name}>"
+      end
+
+      # Format the given element as block HTML.
+      def format_as_block_html(name, attr, body, indent)
+        "#{' '*indent}<#{name}#{html_attributes(attr)}>#{body}</#{name}>\n"
+      end
+
+      # Format the given element as block HTML with a newline after the start tag and indentation
+      # before the end tag.
+      def format_as_indented_block_html(name, attr, body, indent)
+        "#{' '*indent}<#{name}#{html_attributes(attr)}>\n#{body}#{' '*indent}</#{name}>\n"
+      end
+
+      # Add the syntax highlighter name to the 'class' attribute of the given attribute hash. And
+      # overwrites or add a "language-LANG" part using the +lang+ parameter if +lang+ is not nil.
+      def add_syntax_highlighter_to_class_attr(attr, lang = nil)
+        (attr['class'] = (attr['class'] || '') + " highlighter-#{@options[:syntax_highlighter]}").lstrip!
+        attr['class'].sub!(/\blanguage-\S+|(^)/) { "language-#{lang}#{$1 ? ' ' : ''}" } if lang
+      end
+
+      # Generate and return an element tree for the table of contents.
+      def generate_toc_tree(toc, type, attr)
+        sections = Element.new(type, nil, attr)
+        sections.attr['id'] ||= 'markdown-toc'
+        stack = []
+        toc.each do |level, id, children|
+          li = Element.new(:li, nil, nil, {:level => level})
+          li.children << Element.new(:p, nil, nil, {:transparent => true})
+          a = Element.new(:a, nil)
+          a.attr['href'] = "##{id}"
+          a.attr['id'] = "#{sections.attr['id']}-#{id}"
+          a.children.concat(remove_footnotes(Marshal.load(Marshal.dump(children))))
+          li.children.last.children << a
+          li.children << Element.new(type)
+
+          success = false
+          while !success
+            if stack.empty?
+              sections.children << li
+              stack << li
+              success = true
+            elsif stack.last.options[:level] < li.options[:level]
+              stack.last.children.last.children << li
+              stack << li
+              success = true
+            else
+              item = stack.pop
+              item.children.pop unless item.children.last.children.size > 0
+            end
+          end
+        end
+        while !stack.empty?
+          item = stack.pop
+          item.children.pop unless item.children.last.children.size > 0
+        end
+        sections
+      end
+
+      # Remove all footnotes from the given elements.
+      def remove_footnotes(elements)
+        elements.delete_if do |c|
+          remove_footnotes(c.children)
+          c.type == :footnote
+        end
+      end
+
+      # Obfuscate the +text+ by using HTML entities.
+      def obfuscate(text)
+        result = ""
+        text.each_byte do |b|
+          result << (b > 128 ? b.chr : "&#%03d;" % b)
+        end
+        result.force_encoding(text.encoding) if result.respond_to?(:force_encoding)
+        result
+      end
+
+      FOOTNOTE_BACKLINK_FMT = "%s<a href=\"#fnref:%s\" class=\"reversefootnote\">%s</a>"
+
+      # Return a HTML ordered list with the footnote content for the used footnotes.
+      def footnote_content
+        ol = Element.new(:ol)
+        ol.attr['start'] = @footnote_start if @footnote_start != 1
+        i = 0
+        backlink_text = escape_html(@options[:footnote_backlink], :text)
+        while i < @footnotes.length
+          name, data, _, repeat = *@footnotes[i]
+          li = Element.new(:li, nil, {'id' => "fn:#{name}"})
+          li.children = Marshal.load(Marshal.dump(data.children))
+
+          if li.children.last.type == :p
+            para = li.children.last
+            insert_space = true
+          else
+            li.children << (para = Element.new(:p))
+            insert_space = false
+          end
+
+          unless @options[:footnote_backlink].empty?
+            para.children << Element.new(:raw, FOOTNOTE_BACKLINK_FMT % [insert_space ? '&nbsp;' : '', name, backlink_text])
+            (1..repeat).each do |index|
+              para.children << Element.new(:raw, FOOTNOTE_BACKLINK_FMT % ["&nbsp;", "#{name}:#{index}", "#{backlink_text}<sup>#{index+1}</sup>"])
+            end
+          end
+
+          ol.children << Element.new(:raw, convert(li, 4))
+          i += 1
+        end
+        (ol.children.empty? ? '' : format_as_indented_block_html('div', {:class => "footnotes"}, convert(ol, 2), 0))
+      end
+
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/kramdown.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/kramdown.rb
new file mode 100644
index 0000000..775e059
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/kramdown.rb
@@ -0,0 +1,437 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/converter'
+require 'kramdown/utils'
+
+module Kramdown
+
+  module Converter
+
+    # Converts an element tree to the kramdown format.
+    class Kramdown < Base
+
+      # :stopdoc:
+
+      include ::Kramdown::Utils::Html
+
+      def initialize(root, options)
+        super
+        @linkrefs = []
+        @footnotes = []
+        @abbrevs = []
+        @stack = []
+      end
+
+      def convert(el, opts = {:indent => 0})
+        res = send("convert_#{el.type}", el, opts)
+        if ![:html_element, :li, :dt, :dd, :td].include?(el.type) && (ial = ial_for_element(el))
+          res << ial
+          res << "\n\n" if Element.category(el) == :block
+        elsif [:ul, :dl, :ol, :codeblock].include?(el.type) && opts[:next] &&
+            ([el.type, :codeblock].include?(opts[:next].type) ||
+             (opts[:next].type == :blank && opts[:nnext] && [el.type, :codeblock].include?(opts[:nnext].type)))
+          res << "^\n\n"
+        elsif Element.category(el) == :block &&
+            ![:li, :dd, :dt, :td, :th, :tr, :thead, :tbody, :tfoot, :blank].include?(el.type) &&
+            (el.type != :html_element || @stack.last.type != :html_element) &&
+            (el.type != :p || !el.options[:transparent])
+          res << "\n"
+        end
+        res
+      end
+
+      def inner(el, opts = {:indent => 0})
+        @stack.push(el)
+        result = ''
+        el.children.each_with_index do |inner_el, index|
+          options = opts.dup
+          options[:index] = index
+          options[:prev] = (index == 0 ? nil : el.children[index-1])
+          options[:pprev] = (index <= 1 ? nil : el.children[index-2])
+          options[:next] = (index == el.children.length - 1 ? nil : el.children[index+1])
+          options[:nnext] = (index >= el.children.length - 2 ? nil : el.children[index+2])
+          result << convert(inner_el, options)
+        end
+        @stack.pop
+        result
+      end
+
+      def convert_blank(el, opts)
+        ""
+      end
+
+      ESCAPED_CHAR_RE = /(\$\$|[\\*_`\[\]\{"'|])|^[ ]{0,3}(:)/
+
+      def convert_text(el, opts)
+        if opts[:raw_text]
+          el.value
+        else
+          el.value.gsub(/\A\n/) do
+            opts[:prev] && opts[:prev].type == :br ? '' : "\n"
+          end.gsub(/\s+/, ' ').gsub(ESCAPED_CHAR_RE) { "\\#{$1 || $2}" }
+        end
+      end
+
+      def convert_p(el, opts)
+        w = @options[:line_width] - opts[:indent].to_s.to_i
+        first, second, *rest = inner(el, opts).strip.gsub(/(.{1,#{w}})( +|$\n?)/, "\\1\n").split(/\n/)
+        first.gsub!(/^(?:(#|>)|(\d+)\.|([+-]\s))/) { $1 || $3 ? "\\#{$1 || $3}" : "#{$2}\\."} if first
+        second.gsub!(/^([=-]+\s*?)$/, "\\\1") if second
+        res = [first, second, *rest].compact.join("\n") + "\n"
+        if el.children.length == 1 && el.children.first.type == :math
+          res = "\\#{res}"
+        elsif res.start_with?('\$$') && res.end_with?("\\$$\n")
+          res.sub!(/^\\\$\$/, '\$\$')
+        end
+        res
+      end
+
+
+      def convert_codeblock(el, opts)
+        el.value.split(/\n/).map {|l| l.empty? ? "    " : "    #{l}"}.join("\n") + "\n"
+      end
+
+      def convert_blockquote(el, opts)
+        opts[:indent] += 2
+        inner(el, opts).chomp.split(/\n/).map {|l| "> #{l}"}.join("\n") << "\n"
+      end
+
+      def convert_header(el, opts)
+        res = ''
+        res << "#{'#' * output_header_level(el.options[:level])} #{inner(el, opts)}"
+        res[-1, 1] = "\\#" if res[-1] == ?#
+        res << "   {##{el.attr['id']}}" if el.attr['id'] && !el.attr['id'].strip.empty?
+        res << "\n"
+      end
+
+      def convert_hr(el, opts)
+        "* * *\n"
+      end
+
+      def convert_ul(el, opts)
+        inner(el, opts).sub(/\n+\Z/, "\n")
+      end
+      alias :convert_ol :convert_ul
+      alias :convert_dl :convert_ul
+
+      def convert_li(el, opts)
+        sym, width = if @stack.last.type == :ul
+                       ['* ', el.children.first && el.children.first.type == :codeblock ? 4 : 2]
+                     else
+                       ["#{opts[:index] + 1}.".ljust(4), 4]
+                     end
+        if ial = ial_for_element(el)
+          sym << ial << " "
+        end
+
+        opts[:indent] += width
+        text = inner(el, opts)
+        newlines = text.scan(/\n*\Z/).first
+        first, *last = text.split(/\n/)
+        last = last.map {|l| " "*width + l}.join("\n")
+        text = (first.nil? ? "\n" : first + (last.empty? ? "" : "\n") + last + newlines)
+        if el.children.first && el.children.first.type == :p && !el.children.first.options[:transparent]
+          res = "#{sym}#{text}"
+          res << "^\n" if el.children.size == 1 && @stack.last.children.last == el &&
+            (@stack.last.children.any? {|c| c.children.first.type != :p} || @stack.last.children.size == 1)
+          res
+        elsif el.children.first && el.children.first.type == :codeblock
+          "#{sym}\n    #{text}"
+        else
+          "#{sym}#{text}"
+        end
+      end
+
+      def convert_dd(el, opts)
+        sym, width = ": ", (el.children.first && el.children.first.type == :codeblock ? 4 : 2)
+        if ial = ial_for_element(el)
+          sym << ial << " "
+        end
+
+        opts[:indent] += width
+        text = inner(el, opts)
+        newlines = text.scan(/\n*\Z/).first
+        first, *last = text.split(/\n/)
+        last = last.map {|l| " "*width + l}.join("\n")
+        text = first.to_s + (last.empty? ? "" : "\n") + last + newlines
+        text.chomp! if text =~ /\n\n\Z/ && opts[:next] && opts[:next].type == :dd
+        text << "\n" if (text !~ /\n\n\Z/ && opts[:next] && opts[:next].type == :dt)
+        text << "\n" if el.children.empty?
+        if el.children.first && el.children.first.type == :p && !el.children.first.options[:transparent]
+          "\n#{sym}#{text}"
+        elsif el.children.first && el.children.first.type == :codeblock
+          "#{sym}\n    #{text}"
+        else
+          "#{sym}#{text}"
+        end
+      end
+
+      def convert_dt(el, opts)
+        result = ''
+        if ial = ial_for_element(el)
+          result << ial << " "
+        end
+        result << inner(el, opts) << "\n"
+      end
+
+      HTML_TAGS_WITH_BODY=['div', 'script', 'iframe', 'textarea']
+
+      def convert_html_element(el, opts)
+        markdown_attr = el.options[:category] == :block && el.children.any? do |c|
+          c.type != :html_element && (c.type != :p || !c.options[:transparent]) && Element.category(c) == :block
+        end
+        opts[:force_raw_text] = true if %w{script pre code}.include?(el.value)
+        opts[:raw_text] = opts[:force_raw_text] || opts[:block_raw_text] || (el.options[:category] != :span && !markdown_attr)
+        opts[:block_raw_text] = true if el.options[:category] == :block && opts[:raw_text]
+        res = inner(el, opts)
+        if el.options[:category] == :span
+          "<#{el.value}#{html_attributes(el.attr)}" << (!res.empty? || HTML_TAGS_WITH_BODY.include?(el.value) ? ">#{res}</#{el.value}>" : " />")
+        else
+          output = ''
+          attr = el.attr.dup
+          attr['markdown'] = '1' if markdown_attr
+          output << "<#{el.value}#{html_attributes(attr)}"
+          if !res.empty? && el.options[:content_model] != :block
+            output << ">#{res}</#{el.value}>"
+          elsif !res.empty?
+            output << ">\n#{res}"  <<  "</#{el.value}>"
+          elsif HTML_TAGS_WITH_BODY.include?(el.value)
+            output << "></#{el.value}>"
+          else
+            output << " />"
+          end
+          output << "\n" if @stack.last.type != :html_element || @stack.last.options[:content_model] != :raw
+          output
+        end
+      end
+
+      def convert_xml_comment(el, opts)
+        if el.options[:category] == :block && (@stack.last.type != :html_element || @stack.last.options[:content_model] != :raw)
+          el.value + "\n"
+        else
+          el.value.dup
+        end
+      end
+      alias :convert_xml_pi :convert_xml_comment
+
+      def convert_table(el, opts)
+        opts[:alignment] = el.options[:alignment]
+        inner(el, opts)
+      end
+
+      def convert_thead(el, opts)
+        rows = inner(el, opts)
+        if opts[:alignment].all? {|a| a == :default}
+          "#{rows}|" << "-"*10 << "\n"
+        else
+          "#{rows}| " << opts[:alignment].map do |a|
+            case a
+            when :left then ":-"
+            when :right then "-:"
+            when :center then ":-:"
+            when :default then "-"
+            end
+          end.join(' ') << "\n"
+        end
+      end
+
+      def convert_tbody(el, opts)
+        res = ''
+        res << inner(el, opts)
+        res << '|' << '-'*10 << "\n" if opts[:next] && opts[:next].type == :tbody
+        res
+      end
+
+      def convert_tfoot(el, opts)
+        "|" << "="*10 << "\n#{inner(el, opts)}"
+      end
+
+      def convert_tr(el, opts)
+        "| " << el.children.map {|c| convert(c, opts)}.join(" | ") << " |\n"
+      end
+
+      def convert_td(el, opts)
+        inner(el, opts)
+      end
+
+      def convert_comment(el, opts)
+        if el.options[:category] == :block
+          "{::comment}\n#{el.value}\n{:/}\n"
+        else
+          "{::comment}#{el.value}{:/}"
+        end
+      end
+
+      def convert_br(el, opts)
+        "  \n"
+      end
+
+      def convert_a(el, opts)
+        if el.attr['href'].empty?
+          "[#{inner(el, opts)}]()"
+        elsif el.attr['href'] =~ /^(?:http|ftp)/ || el.attr['href'].count("()") > 0
+          index = if link_el = @linkrefs.find {|c| c.attr['href'] == el.attr['href']}
+                    @linkrefs.index(link_el) + 1
+                  else
+                    @linkrefs << el
+                    @linkrefs.size
+                  end
+          "[#{inner(el, opts)}][#{index}]"
+        else
+          title = parse_title(el.attr['title'])
+          "[#{inner(el, opts)}](#{el.attr['href']}#{title})"
+        end
+      end
+
+      def convert_img(el, opts)
+        alt_text = el.attr['alt'].to_s.gsub(ESCAPED_CHAR_RE) { $1 ? "\\#{$1}" : $2 }
+        if el.attr['src'].empty?
+          "![#{alt_text}]()"
+        else
+          title = parse_title(el.attr['title'])
+          link = if el.attr['src'].count("()") > 0
+                   "<#{el.attr['src']}>"
+                 else
+                   el.attr['src']
+                 end
+          "![#{alt_text}](#{link}#{title})"
+        end
+      end
+
+      def convert_codespan(el, opts)
+        delim = (el.value.scan(/`+/).max || '') + '`'
+        "#{delim}#{' ' if delim.size > 1}#{el.value}#{' ' if delim.size > 1}#{delim}"
+      end
+
+      def convert_footnote(el, opts)
+        @footnotes << [el.options[:name], el.value]
+        "[^#{el.options[:name]}]"
+      end
+
+      def convert_raw(el, opts)
+        attr = (el.options[:type] || []).join(' ')
+        attr = " type=\"#{attr}\"" if attr.length > 0
+        if @stack.last.type == :html_element
+          el.value
+        elsif el.options[:category] == :block
+          "{::nomarkdown#{attr}}\n#{el.value}\n{:/}\n"
+        else
+          "{::nomarkdown#{attr}}#{el.value}{:/}"
+        end
+      end
+
+      def convert_em(el, opts)
+        "*#{inner(el, opts)}*" +
+          (opts[:next] && [:em, :strong].include?(opts[:next].type) && !ial_for_element(el) ? '{::}' : '')
+      end
+
+      def convert_strong(el, opts)
+        "**#{inner(el, opts)}**" +
+          (opts[:next] && [:em, :strong].include?(opts[:next].type) && !ial_for_element(el) ? '{::}' : '')
+      end
+
+      def convert_entity(el, opts)
+        entity_to_str(el.value, el.options[:original])
+      end
+
+      TYPOGRAPHIC_SYMS = {
+        :mdash => '---', :ndash => '--', :hellip => '...',
+        :laquo_space => '<< ', :raquo_space => ' >>',
+        :laquo => '<<', :raquo => '>>'
+      }
+      def convert_typographic_sym(el, opts)
+        TYPOGRAPHIC_SYMS[el.value]
+      end
+
+      def convert_smart_quote(el, opts)
+        el.value.to_s =~ /[rl]dquo/ ? "\"" : "'"
+      end
+
+      def convert_math(el, opts)
+        "$$#{el.value}$$" + (el.options[:category] == :block ? "\n" : '')
+      end
+
+      def convert_abbreviation(el, opts)
+        el.value
+      end
+
+      def convert_root(el, opts)
+        res = inner(el, opts)
+        res << create_link_defs
+        res << create_footnote_defs
+        res << create_abbrev_defs
+        res
+      end
+
+      def create_link_defs
+        res = ''
+        res << "\n\n" if @linkrefs.size > 0
+        @linkrefs.each_with_index do |el, i|
+          title = parse_title(el.attr['title'])
+          res << "[#{i+1}]: #{el.attr['href']}#{title}\n"
+        end
+        res
+      end
+
+      def create_footnote_defs
+        res = ''
+        @footnotes.each do |name, data|
+          res << "[^#{name}]:\n"
+          res << inner(data).chomp.split(/\n/).map {|l| "    #{l}"}.join("\n") + "\n\n"
+        end
+        res
+      end
+
+      def create_abbrev_defs
+        return '' unless @root.options[:abbrev_defs]
+        res = ''
+        @root.options[:abbrev_defs].each do |name, text|
+          res << "*[#{name}]: #{text}\n"
+          res << ial_for_element(Element.new(:unused, nil, @root.options[:abbrev_attr][name])).to_s << "\n\n"
+        end
+        res
+      end
+
+      # Return the IAL containing the attributes of the element +el+.
+      def ial_for_element(el)
+        res = el.attr.map do |k,v|
+          next if [:img, :a].include?(el.type) && ['href', 'src', 'alt', 'title'].include?(k)
+          next if el.type == :header && k == 'id' && !v.strip.empty?
+          if v.nil?
+            ''
+          elsif k == 'class' && !v.empty? && !v.index(/[\.#]/)
+            " " + v.split(/\s+/).map {|w| ".#{w}"}.join(" ")
+          elsif k == 'id' && !v.strip.empty?
+            " ##{v}"
+          else
+            " #{k}=\"#{v.to_s}\""
+          end
+        end.compact.join('')
+        res = "toc" << (res.strip.empty? ? '' : " #{res}") if (el.type == :ul || el.type == :ol) &&
+          (el.options[:ial][:refs].include?('toc') rescue nil)
+        res = "footnotes" << (res.strip.empty? ? '' : " #{res}") if (el.type == :ul || el.type == :ol) &&
+          (el.options[:ial][:refs].include?('footnotes') rescue nil)
+        if el.type == :dl && el.options[:ial] && el.options[:ial][:refs]
+          auto_ids = el.options[:ial][:refs].select {|ref| ref =~ /\Aauto_ids/}.join(" ")
+          res = auto_ids << (res.strip.empty? ? '' : " #{res}") unless auto_ids.empty?
+        end
+        res.strip.empty? ? nil : "{:#{res}}"
+      end
+
+      def parse_title(attr)
+        attr.to_s.empty? ? '' : ' "' + attr.gsub(/"/, '&quot;') + '"'
+      end
+
+      # :startdoc:
+
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/latex.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/latex.rb
new file mode 100644
index 0000000..30817d8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/latex.rb
@@ -0,0 +1,613 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'set'
+require 'kramdown/converter'
+
+module Kramdown
+
+  module Converter
+
+    # Converts an element tree to LaTeX.
+    #
+    # This converter uses ideas from other Markdown-to-LaTeX converters like Pandoc and Maruku.
+    #
+    # You can customize this converter by sub-classing it and overriding the +convert_NAME+ methods.
+    # Each such method takes the following parameters:
+    #
+    # [+el+] The element of type +NAME+ to be converted.
+    #
+    # [+opts+] A hash containing processing options that are passed down from parent elements. The
+    #          key :parent is always set and contains the parent element as value.
+    #
+    # The return value of such a method has to be a string containing the element +el+ formatted
+    # correctly as LaTeX markup.
+    class Latex < Base
+
+      # Initialize the LaTeX converter with the +root+ element and the conversion +options+.
+      def initialize(root, options)
+        super
+        @data[:packages] = Set.new
+      end
+
+      # Dispatch the conversion of the element +el+ to a +convert_TYPE+ method using the +type+ of
+      # the element.
+      def convert(el, opts = {})
+        send("convert_#{el.type}", el, opts)
+      end
+
+      # Return the converted content of the children of +el+ as a string.
+      def inner(el, opts)
+        result = ''
+        options = opts.dup.merge(:parent => el)
+        el.children.each_with_index do |inner_el, index|
+          options[:index] = index
+          options[:result] = result
+          result << send("convert_#{inner_el.type}", inner_el, options)
+        end
+        result
+      end
+
+      def convert_root(el, opts)
+        inner(el, opts)
+      end
+
+      def convert_blank(el, opts)
+        opts[:result] =~ /\n\n\Z|\A\Z/ ? "" : "\n"
+      end
+
+      def convert_text(el, opts)
+        escape(el.value)
+      end
+
+      def convert_p(el, opts)
+        if el.children.size == 1 && el.children.first.type == :img && !(img = convert_img(el.children.first, opts)).empty?
+          convert_standalone_image(el, opts, img)
+        else
+          "#{latex_link_target(el)}#{inner(el, opts)}\n\n"
+        end
+      end
+
+      # Helper method used by +convert_p+ to convert a paragraph that only contains a single :img
+      # element.
+      def convert_standalone_image(el, opts, img)
+        attrs = attribute_list(el)
+        "\\begin{figure}#{attrs}\n\\begin{center}\n#{img}\n\\end{center}\n\\caption{#{escape(el.children.first.attr['alt'])}}\n#{latex_link_target(el, true)}\n\\end{figure}#{attrs}\n"
+      end
+
+      def convert_codeblock(el, opts)
+        show_whitespace = el.attr['class'].to_s =~ /\bshow-whitespaces\b/
+        lang = extract_code_language(el.attr)
+
+        if @options[:syntax_highlighter] == :minted &&
+            (highlighted_code = highlight_code(el.value, lang, :block))
+          @data[:packages] << 'minted'
+          "#{latex_link_target(el)}#{highlighted_code}\n"
+        elsif show_whitespace || lang
+          options = []
+          options << "showspaces=%s,showtabs=%s" % (show_whitespace ? ['true', 'true'] : ['false', 'false'])
+          options << "language=#{lang}" if lang
+          options << "basicstyle=\\ttfamily\\footnotesize,columns=fixed,frame=tlbr"
+          id = el.attr['id']
+          options << "label=#{id}" if id
+          attrs = attribute_list(el)
+          "#{latex_link_target(el)}\\begin{lstlisting}[#{options.join(',')}]\n#{el.value}\n\\end{lstlisting}#{attrs}\n"
+        else
+          "#{latex_link_target(el)}\\begin{verbatim}#{el.value}\\end{verbatim}\n"
+        end
+      end
+
+      def convert_blockquote(el, opts)
+        latex_environment(el.children.size > 1 ? 'quotation' : 'quote', el, inner(el, opts))
+      end
+
+      def convert_header(el, opts)
+        type = @options[:latex_headers][output_header_level(el.options[:level]) - 1]
+        if ((id = el.attr['id']) ||
+            (@options[:auto_ids] && (id = generate_id(el.options[:raw_text])))) && in_toc?(el)
+          "\\#{type}{#{inner(el, opts)}}\\hypertarget{#{id}}{}\\label{#{id}}\n\n"
+        else
+          "\\#{type}*{#{inner(el, opts)}}\n\n"
+        end
+      end
+
+      def convert_hr(el, opts)
+        attrs = attribute_list(el)
+        "#{latex_link_target(el)}\\begin{center}#{attrs}\n\\rule{3in}{0.4pt}\n\\end{center}#{attrs}\n"
+      end
+
+      def convert_ul(el, opts)
+        if !@data[:has_toc] && (el.options[:ial][:refs].include?('toc') rescue nil)
+          @data[:has_toc] = true
+          '\tableofcontents'
+        else
+          latex_environment(el.type == :ul ? 'itemize' : 'enumerate', el, inner(el, opts))
+        end
+      end
+      alias :convert_ol :convert_ul
+
+      def convert_dl(el, opts)
+        latex_environment('description', el, inner(el, opts))
+      end
+
+      def convert_li(el, opts)
+        "\\item #{latex_link_target(el, true)}#{inner(el, opts).sub(/\n+\Z/, '')}\n"
+      end
+
+      def convert_dt(el, opts)
+        "\\item[#{inner(el, opts)}] "
+      end
+
+      def convert_dd(el, opts)
+        "#{latex_link_target(el)}#{inner(el, opts)}\n\n"
+      end
+
+      def convert_html_element(el, opts)
+        if el.value == 'i' || el.value == 'em'
+          "\\emph{#{inner(el, opts)}}"
+        elsif el.value == 'b' || el.value == 'strong'
+          "\\textbf{#{inner(el, opts)}}"
+        else
+          warning("Can't convert HTML element")
+          ''
+        end
+      end
+
+      def convert_xml_comment(el, opts)
+        el.value.split(/\n/).map {|l| "% #{l}"}.join("\n") + "\n"
+      end
+
+      def convert_xml_pi(el, opts)
+        warning("Can't convert XML PI")
+        ''
+      end
+
+      TABLE_ALIGNMENT_CHAR = {:default => 'l', :left => 'l', :center => 'c', :right => 'r'} # :nodoc:
+
+      def convert_table(el, opts)
+        @data[:packages] << 'longtable'
+        align = el.options[:alignment].map {|a| TABLE_ALIGNMENT_CHAR[a]}.join('|')
+        attrs = attribute_list(el)
+        "#{latex_link_target(el)}\\begin{longtable}{|#{align}|}#{attrs}\n\\hline\n#{inner(el, opts)}\\hline\n\\end{longtable}#{attrs}\n\n"
+      end
+
+      def convert_thead(el, opts)
+        "#{inner(el, opts)}\\hline\n"
+      end
+
+      def convert_tbody(el, opts)
+        inner(el, opts)
+      end
+
+      def convert_tfoot(el, opts)
+        "\\hline \\hline \n#{inner(el, opts)}"
+      end
+
+      def convert_tr(el, opts)
+        el.children.map {|c| send("convert_#{c.type}", c, opts)}.join(' & ') << "\\\\\n"
+      end
+
+      def convert_td(el, opts)
+        inner(el, opts)
+      end
+
+      def convert_comment(el, opts)
+        el.value.split(/\n/).map {|l| "% #{l}"}.join("\n") << "\n"
+      end
+
+      def convert_br(el, opts)
+        res = "\\newline"
+        res << "\n" if (c = opts[:parent].children[opts[:index]+1]) && (c.type != :text || c.value !~ /^\s*\n/)
+        res
+      end
+
+      def convert_a(el, opts)
+        url = el.attr['href']
+        if url.start_with?('#')
+          "\\hyperlink{#{escape(url[1..-1])}}{#{inner(el, opts)}}"
+        else
+          "\\href{#{escape(url)}}{#{inner(el, opts)}}"
+        end
+      end
+
+      def convert_img(el, opts)
+        line = el.options[:location]
+        if el.attr['src'] =~ /^(https?|ftps?):\/\//
+          warning("Cannot include non-local image#{line ? " (line #{line})" : ''}")
+          ''
+        elsif !el.attr['src'].empty?
+          @data[:packages] << 'graphicx'
+          "#{latex_link_target(el)}\\includegraphics{#{el.attr['src']}}"
+        else
+          warning("Cannot include image with empty path#{line ? " (line #{line})" : ''}")
+          ''
+        end
+      end
+
+      def convert_codespan(el, opts)
+        lang = extract_code_language(el.attr)
+        if @options[:syntax_highlighter] == :minted &&
+            (highlighted_code = highlight_code(el.value, lang, :span))
+          @data[:packages] << 'minted'
+          "#{latex_link_target(el)}#{highlighted_code}"
+        else
+          "\\texttt{#{latex_link_target(el)}#{escape(el.value)}}"
+        end
+      end
+
+      def convert_footnote(el, opts)
+        @data[:packages] << 'fancyvrb'
+        "\\footnote{#{inner(el.value, opts).rstrip}}"
+      end
+
+      def convert_raw(el, opts)
+        if !el.options[:type] || el.options[:type].empty? || el.options[:type].include?('latex')
+          el.value + (el.options[:category] == :block ? "\n" : '')
+        else
+          ''
+        end
+      end
+
+      def convert_em(el, opts)
+        "\\emph{#{latex_link_target(el)}#{inner(el, opts)}}"
+      end
+
+      def convert_strong(el, opts)
+        "\\textbf{#{latex_link_target(el)}#{inner(el, opts)}}"
+      end
+
+      # Inspired by Maruku: entity conversion table based on the one from htmltolatex
+      # (http://sourceforge.net/projects/htmltolatex/), with some small adjustments/additions
+      ENTITY_CONV_TABLE = {
+        913 => ['$A$'],
+        914 => ['$B$'],
+        915 => ['$\Gamma$'],
+        916 => ['$\Delta$'],
+        917 => ['$E$'],
+        918 => ['$Z$'],
+        919 => ['$H$'],
+        920 => ['$\Theta$'],
+        921 => ['$I$'],
+        922 => ['$K$'],
+        923 => ['$\Lambda$'],
+        924 => ['$M$'],
+        925 => ['$N$'],
+        926 => ['$\Xi$'],
+        927 => ['$O$'],
+        928 => ['$\Pi$'],
+        929 => ['$P$'],
+        931 => ['$\Sigma$'],
+        932 => ['$T$'],
+        933 => ['$Y$'],
+        934 => ['$\Phi$'],
+        935 => ['$X$'],
+        936 => ['$\Psi$'],
+        937 => ['$\Omega$'],
+        945 => ['$\alpha$'],
+        946 => ['$\beta$'],
+        947 => ['$\gamma$'],
+        948 => ['$\delta$'],
+        949 => ['$\epsilon$'],
+        950 => ['$\zeta$'],
+        951 => ['$\eta$'],
+        952 => ['$\theta$'],
+        953 => ['$\iota$'],
+        954 => ['$\kappa$'],
+        955 => ['$\lambda$'],
+        956 => ['$\mu$'],
+        957 => ['$\nu$'],
+        958 => ['$\xi$'],
+        959 => ['$o$'],
+        960 => ['$\pi$'],
+        961 => ['$\rho$'],
+        963 => ['$\sigma$'],
+        964 => ['$\tau$'],
+        965 => ['$\upsilon$'],
+        966 => ['$\phi$'],
+        967 => ['$\chi$'],
+        968 => ['$\psi$'],
+        969 => ['$\omega$'],
+        962 => ['$\varsigma$'],
+        977 => ['$\vartheta$'],
+        982 => ['$\varpi$'],
+        8230 => ['\ldots'],
+        8242 => ['$\prime$'],
+        8254 => ['-'],
+        8260 => ['/'],
+        8472 => ['$\wp$'],
+        8465 => ['$\Im$'],
+        8476 => ['$\Re$'],
+        8501 => ['$\aleph$'],
+        8226 => ['$\bullet$'],
+        8482 => ['$^{\rm TM}$'],
+        8592 => ['$\leftarrow$'],
+        8594 => ['$\rightarrow$'],
+        8593 => ['$\uparrow$'],
+        8595 => ['$\downarrow$'],
+        8596 => ['$\leftrightarrow$'],
+        8629 => ['$\hookleftarrow$'],
+        8657 => ['$\Uparrow$'],
+        8659 => ['$\Downarrow$'],
+        8656 => ['$\Leftarrow$'],
+        8658 => ['$\Rightarrow$'],
+        8660 => ['$\Leftrightarrow$'],
+        8704 => ['$\forall$'],
+        8706 => ['$\partial$'],
+        8707 => ['$\exists$'],
+        8709 => ['$\emptyset$'],
+        8711 => ['$\nabla$'],
+        8712 => ['$\in$'],
+        8715 => ['$\ni$'],
+        8713 => ['$\notin$'],
+        8721 => ['$\sum$'],
+        8719 => ['$\prod$'],
+        8722 => ['$-$'],
+        8727 => ['$\ast$'],
+        8730 => ['$\surd$'],
+        8733 => ['$\propto$'],
+        8734 => ['$\infty$'],
+        8736 => ['$\angle$'],
+        8743 => ['$\wedge$'],
+        8744 => ['$\vee$'],
+        8745 => ['$\cup$'],
+        8746 => ['$\cap$'],
+        8747 => ['$\int$'],
+        8756 => ['$\therefore$', 'amssymb'],
+        8764 => ['$\sim$'],
+        8776 => ['$\approx$'],
+        8773 => ['$\cong$'],
+        8800 => ['$\neq$'],
+        8801 => ['$\equiv$'],
+        8804 => ['$\leq$'],
+        8805 => ['$\geq$'],
+        8834 => ['$\subset$'],
+        8835 => ['$\supset$'],
+        8838 => ['$\subseteq$'],
+        8839 => ['$\supseteq$'],
+        8836 => ['$\nsubset$', 'amssymb'],
+        8853 => ['$\oplus$'],
+        8855 => ['$\otimes$'],
+        8869 => ['$\perp$'],
+        8901 => ['$\cdot$'],
+        8968 => ['$\rceil$'],
+        8969 => ['$\lceil$'],
+        8970 => ['$\lfloor$'],
+        8971 => ['$\rfloor$'],
+        9001 => ['$\rangle$'],
+        9002 => ['$\langle$'],
+        9674 => ['$\lozenge$', 'amssymb'],
+        9824 => ['$\spadesuit$'],
+        9827 => ['$\clubsuit$'],
+        9829 => ['$\heartsuit$'],
+        9830 => ['$\diamondsuit$'],
+        38 => ['\&'],
+        34 => ['"'],
+        39 => ['\''],
+        169 => ['\copyright'],
+        60 => ['\textless'],
+        62 => ['\textgreater'],
+        338 => ['\OE'],
+        339 => ['\oe'],
+        352 => ['\v{S}'],
+        353 => ['\v{s}'],
+        376 => ['\"Y'],
+        710 => ['\textasciicircum'],
+        732 => ['\textasciitilde'],
+        8211 => ['--'],
+        8212 => ['---'],
+        8216 => ['`'],
+        8217 => ['\''],
+        8220 => ['``'],
+        8221 => ['\'\''],
+        8224 => ['\dag'],
+        8225 => ['\ddag'],
+        8240 => ['\permil', 'wasysym'],
+        8364 => ['\euro', 'eurosym'],
+        8249 => ['\guilsinglleft'],
+        8250 => ['\guilsinglright'],
+        8218 => ['\quotesinglbase', 'mathcomp'],
+        8222 => ['\quotedblbase', 'mathcomp'],
+        402 => ['\textflorin', 'mathcomp'],
+        381 => ['\v{Z}'],
+        382 => ['\v{z}'],
+        160 => ['~'],
+        161 => ['\textexclamdown'],
+        163 => ['\pounds'],
+        164 => ['\currency', 'wasysym'],
+        165 => ['\textyen', 'textcomp'],
+        166 => ['\brokenvert', 'wasysym'],
+        167 => ['\S'],
+        171 => ['\guillemotleft'],
+        187 => ['\guillemotright'],
+        174 => ['\textregistered'],
+        170 => ['\textordfeminine'],
+        172 => ['$\neg$'],
+        173 => ['\-'],
+        176 => ['$\degree$', 'mathabx'],
+        177 => ['$\pm$'],
+        180 => ['\''],
+        181 => ['$\mu$'],
+        182 => ['\P'],
+        183 => ['$\cdot$'],
+        186 => ['\textordmasculine'],
+        162 => ['\cent', 'wasysym'],
+        185 => ['$^1$'],
+        178 => ['$^2$'],
+        179 => ['$^3$'],
+        189 => ['$\frac{1}{2}$'],
+        188 => ['$\frac{1}{4}$'],
+        190 => ['$\frac{3}{4}'],
+        192 => ['\`A'],
+        193 => ['\\\'A'],
+        194 => ['\^A'],
+        195 => ['\~A'],
+        196 => ['\"A'],
+        197 => ['\AA'],
+        198 => ['\AE'],
+        199 => ['\cC'],
+        200 => ['\`E'],
+        201 => ['\\\'E'],
+        202 => ['\^E'],
+        203 => ['\"E'],
+        204 => ['\`I'],
+        205 => ['\\\'I'],
+        206 => ['\^I'],
+        207 => ['\"I'],
+        208 => ['$\eth$', 'amssymb'],
+        209 => ['\~N'],
+        210 => ['\`O'],
+        211 => ['\\\'O'],
+        212 => ['\^O'],
+        213 => ['\~O'],
+        214 => ['\"O'],
+        215 => ['$\times$'],
+        216 => ['\O'],
+        217 => ['\`U'],
+        218 => ['\\\'U'],
+        219 => ['\^U'],
+        220 => ['\"U'],
+        221 => ['\\\'Y'],
+        222 => ['\Thorn', 'wasysym'],
+        223 => ['\ss'],
+        224 => ['\`a'],
+        225 => ['\\\'a'],
+        226 => ['\^a'],
+        227 => ['\~a'],
+        228 => ['\"a'],
+        229 => ['\aa'],
+        230 => ['\ae'],
+        231 => ['\cc'],
+        232 => ['\`e'],
+        233 => ['\\\'e'],
+        234 => ['\^e'],
+        235 => ['\"e'],
+        236 => ['\`i'],
+        237 => ['\\\'i'],
+        238 => ['\^i'],
+        239 => ['\"i'],
+        240 => ['$\eth$'],
+        241 => ['\~n'],
+        242 => ['\`o'],
+        243 => ['\\\'o'],
+        244 => ['\^o'],
+        245 => ['\~o'],
+        246 => ['\"o'],
+        247 => ['$\divide$'],
+        248 => ['\o'],
+        249 => ['\`u'],
+        250 => ['\\\'u'],
+        251 => ['\^u'],
+        252 => ['\"u'],
+        253 => ['\\\'y'],
+        254 => ['\thorn', 'wasysym'],
+        255 => ['\"y'],
+        8201 => ['\thinspace'],
+        8194 => ['\hskip .5em\relax'],
+        8195 => ['\quad'],
+      } # :nodoc:
+      ENTITY_CONV_TABLE.each {|k,v| ENTITY_CONV_TABLE[k][0].insert(-1, '{}')}
+
+      def entity_to_latex(entity)
+        text, package = ENTITY_CONV_TABLE[entity.code_point]
+        if text
+          @data[:packages] << package if package
+          text
+        else
+          warning("Couldn't find entity with code #{entity.code_point} in substitution table!")
+          ''
+        end
+      end
+
+      def convert_entity(el, opts)
+        entity_to_latex(el.value)
+      end
+
+      TYPOGRAPHIC_SYMS = {
+        :mdash => '---', :ndash => '--', :hellip => '\ldots{}',
+        :laquo_space => '\guillemotleft{}~', :raquo_space => '~\guillemotright{}',
+        :laquo => '\guillemotleft{}', :raquo => '\guillemotright{}'
+      } # :nodoc:
+      def convert_typographic_sym(el, opts)
+        TYPOGRAPHIC_SYMS[el.value]
+      end
+
+      def convert_smart_quote(el, opts)
+        res = entity_to_latex(smart_quote_entity(el)).chomp('{}')
+        res << "{}" if ((nel = opts[:parent].children[opts[:index]+1]) && nel.type == :smart_quote) || res =~ /\w$/
+        res
+      end
+
+      def convert_math(el, opts)
+        @data[:packages] += %w[amssymb amsmath amsthm amsfonts]
+        if el.options[:category] == :block
+          if el.value =~ /\A\s*\\begin\{/
+            el.value
+          else
+            latex_environment('displaymath', el, el.value)
+          end
+        else
+          "$#{el.value}$"
+        end
+      end
+
+      def convert_abbreviation(el, opts)
+        @data[:packages] += %w[acronym]
+        "\\ac{#{normalize_abbreviation_key(el.value)}}"
+      end
+
+      # Normalize the abbreviation key so that it only contains allowed ASCII character
+      def normalize_abbreviation_key(key)
+        key.gsub(/\W/) {|m| m.unpack('H*').first}
+      end
+
+      # Wrap the +text+ inside a LaTeX environment of type +type+. The element +el+ is passed on to
+      # the method #attribute_list -- the resulting string is appended to both the \\begin and the
+      # \\end lines of the LaTeX environment for easier post-processing of LaTeX environments.
+      def latex_environment(type, el, text)
+        attrs = attribute_list(el)
+        "\\begin{#{type}}#{latex_link_target(el)}#{attrs}\n#{text.rstrip}\n\\end{#{type}}#{attrs}\n"
+      end
+
+      # Return a string containing a valid \hypertarget command if the element has an ID defined, or
+      # +nil+ otherwise. If the parameter +add_label+ is +true+, a \label command will also be used
+      # additionally to the \hypertarget command.
+      def latex_link_target(el, add_label = false)
+        if (id = el.attr['id'])
+          "\\hypertarget{#{id}}{}" << (add_label ? "\\label{#{id}}" : '')
+        else
+          nil
+        end
+      end
+
+      # Return a LaTeX comment containing all attributes as 'key="value"' pairs.
+      def attribute_list(el)
+        attrs = el.attr.map {|k,v| v.nil? ? '' : " #{k}=\"#{v.to_s}\""}.compact.sort.join('')
+        attrs = "   % #{attrs}" if !attrs.empty?
+        attrs
+      end
+
+      ESCAPE_MAP = {
+        "^"  => "\\^{}",
+        "\\" => "\\textbackslash{}",
+        "~"  => "\\ensuremath{\\sim}",
+        "|"  => "\\textbar{}",
+        "<"  => "\\textless{}",
+        ">"  => "\\textgreater{}"
+      }.merge(Hash[*("{}$%&_#".scan(/./).map {|c| [c, "\\#{c}"]}.flatten)]) # :nodoc:
+      ESCAPE_RE = Regexp.union(*ESCAPE_MAP.collect {|k,v| k}) # :nodoc:
+
+      # Escape the special LaTeX characters in the string +str+.
+      def escape(str)
+        str.gsub(ESCAPE_RE) {|m| ESCAPE_MAP[m]}
+      end
+
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/man.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/man.rb
new file mode 100644
index 0000000..885f56e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/man.rb
@@ -0,0 +1,303 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/converter'
+
+module Kramdown
+
+  module Converter
+
+    # Converts a Kramdown::Document to a manpage in groff format. See man(7), groff_man(7) and
+    # man-pages(7) for information regarding the output.
+    class Man < Base
+
+      def convert(el, opts = {:indent => 0, :result => ''}) #:nodoc:
+        send("convert_#{el.type}", el, opts)
+      end
+
+      private
+
+      def inner(el, opts, use = :all)
+        arr = el.children.reject {|e| e.type == :blank}
+        arr.each_with_index do |inner_el, index|
+          next if use == :rest && index == 0
+          break if use == :first && index > 0
+          options = opts.dup
+          options[:parent] = el
+          options[:index] = index
+          options[:prev] = (index == 0 ? nil : arr[index - 1])
+          options[:next] = (index == arr.length - 1 ? nil : arr[index + 1])
+          convert(inner_el, options)
+        end
+      end
+
+      def convert_root(el, opts)
+        @title_done = false
+        opts[:result] = ".\\\" generated by kramdown\n"
+        inner(el, opts)
+        opts[:result]
+      end
+
+      def convert_blank(*)
+      end
+      alias :convert_hr :convert_blank
+      alias :convert_xml_pi :convert_blank
+
+      def convert_p(el, opts)
+        if (opts[:index] != 0 && opts[:prev].type != :header) ||
+            (opts[:parent].type == :blockquote && opts[:index] == 0)
+          opts[:result] << macro("P")
+        end
+        inner(el, opts)
+        newline(opts[:result])
+      end
+
+      def convert_header(el, opts)
+        return unless opts[:parent].type == :root
+        case el.options[:level]
+        when 1
+          unless @title_done
+            @title_done = true
+            data = el.options[:raw_text].scan(/([^(]+)\s*\((\d\w*)\)(?:\s*-+\s*(.*))?/).first ||
+              el.options[:raw_text].scan(/([^\s]+)\s*(?:-*\s+)?()(.*)/).first
+            return unless data && data[0]
+            name = data[0]
+            section = (data[1].to_s.empty? ? el.attr['data-section'] || '7' : data[1])
+            description = (data[2].to_s.empty? ? nil : " - #{data[2]}")
+            date = el.attr['data-date'] ? quote(el.attr['data-date']) : nil
+            extra = (el.attr['data-extra'] ? quote(escape(el.attr['data-extra'].to_s)) : nil)
+            opts[:result] << macro("TH", quote(escape(name.upcase)), quote(section), date, extra)
+            if description
+              opts[:result] << macro("SH", "NAME") << escape("#{name}#{description}") << "\n"
+            end
+          end
+        when 2
+          opts[:result] << macro("SH", quote(escape(el.options[:raw_text])))
+        when 3
+          opts[:result] << macro("SS", quote(escape(el.options[:raw_text])))
+        else
+          warning("Header levels greater than three are not supported")
+        end
+      end
+
+      def convert_codeblock(el, opts)
+        opts[:result] << macro("sp") << macro("RS", 4) << macro("EX")
+        opts[:result] << newline(escape(el.value, true))
+        opts[:result] << macro("EE") << macro("RE")
+      end
+
+      def convert_blockquote(el, opts)
+        opts[:result] << macro("RS")
+        inner(el, opts)
+        opts[:result] << macro("RE")
+      end
+
+      def convert_ul(el, opts)
+        compact = (el.attr['class'] =~ /\bcompact\b/)
+        opts[:result] << macro("sp") << macro("PD", 0) if compact
+        inner(el, opts)
+        opts[:result] << macro("PD") if compact
+      end
+      alias :convert_dl :convert_ul
+      alias :convert_ol :convert_ul
+
+      def convert_li(el, opts)
+        sym = (opts[:parent].type == :ul ? '\(bu' : "#{opts[:index] + 1}.")
+        opts[:result] << macro("IP", sym, 4)
+        inner(el, opts, :first)
+        if el.children.size > 1
+          opts[:result] << macro("RS")
+          inner(el, opts, :rest)
+          opts[:result] << macro("RE")
+        end
+      end
+
+      def convert_dt(el, opts)
+        opts[:result] << macro(opts[:prev] && opts[:prev].type == :dt ? "TQ" : "TP")
+        inner(el, opts)
+        opts[:result] << "\n"
+      end
+
+      def convert_dd(el, opts)
+        inner(el, opts, :first)
+        if el.children.size > 1
+          opts[:result] << macro("RS")
+          inner(el, opts, :rest)
+          opts[:result] << macro("RE")
+        end
+        opts[:result] << macro("sp") if opts[:next] && opts[:next].type == :dd
+      end
+
+      TABLE_CELL_ALIGNMENT = {:left => 'l', :center => 'c', :right => 'r', :default => 'l'}
+
+      def convert_table(el, opts)
+        opts[:alignment] = el.options[:alignment].map {|a| TABLE_CELL_ALIGNMENT[a]}
+        table_options = ["box"]
+        table_options << "center" if el.attr['class'] =~ /\bcenter\b/
+        opts[:result] << macro("TS") << "#{table_options.join(" ")} ;\n"
+        inner(el, opts)
+        opts[:result] << macro("TE") << macro("sp")
+      end
+
+      def convert_thead(el, opts)
+        opts[:result] << opts[:alignment].map {|a| "#{a}b"}.join(' ') << " .\n"
+        inner(el, opts)
+        opts[:result] << "=\n"
+      end
+
+      def convert_tbody(el, opts)
+        opts[:result] << ".T&\n" if opts[:index] != 0
+        opts[:result] << opts[:alignment].join(' ') << " .\n"
+        inner(el, opts)
+        opts[:result] << (opts[:next].type == :tfoot ? "=\n" : "_\n") if opts[:next]
+      end
+
+      def convert_tfoot(el, opts)
+        inner(el, opts)
+      end
+
+      def convert_tr(el, opts)
+        inner(el, opts)
+        opts[:result] << "\n"
+      end
+
+      def convert_td(el, opts)
+        result = opts[:result]
+        opts[:result] = ''
+        inner(el, opts)
+        if opts[:result] =~ /\n/
+          warning("Table cells using links are not supported")
+          result << "\t"
+        else
+          result << opts[:result] << "\t"
+        end
+      end
+
+      def convert_html_element(*)
+        warning("HTML elements are not supported")
+      end
+
+      def convert_xml_comment(el, opts)
+        newline(opts[:result]) << ".\"#{escape(el.value, true).rstrip.gsub(/\n/, "\n.\"")}\n"
+      end
+      alias :convert_comment :convert_xml_comment
+
+
+      def convert_a(el, opts)
+        if el.children.size == 1 && el.children[0].type == :text &&
+            el.attr['href'] == el.children[0].value
+          newline(opts[:result]) << macro("UR", escape(el.attr['href'])) << macro("UE")
+        elsif el.attr['href'].start_with?('mailto:')
+          newline(opts[:result]) << macro("MT", escape(el.attr['href'].sub(/^mailto:/, ''))) <<
+            macro("UE")
+        else
+          newline(opts[:result]) << macro("UR", escape(el.attr['href']))
+          inner(el, opts)
+          newline(opts[:result]) << macro("UE")
+        end
+      end
+
+      def convert_img(el, opts)
+        warning("Images are not supported")
+      end
+
+      def convert_em(el, opts)
+        opts[:result] << '\fI'
+        inner(el, opts)
+        opts[:result] << '\fP'
+      end
+
+      def convert_strong(el, opts)
+        opts[:result] << '\fB'
+        inner(el, opts)
+        opts[:result] << '\fP'
+      end
+
+      def convert_codespan(el, opts)
+        opts[:result] << "\\fB#{escape(el.value)}\\fP"
+      end
+
+      def convert_br(el, opts)
+        newline(opts[:result]) << macro("br")
+      end
+
+      def convert_abbreviation(el, opts)
+        opts[:result] << escape(el.value)
+      end
+
+      def convert_math(el, opts)
+        if el.options[:category] == :block
+          convert_codeblock(el, opts)
+        else
+          convert_codespan(el, opts)
+        end
+      end
+
+      def convert_footnote(*)
+        warning("Footnotes are not supported")
+      end
+
+      def convert_raw(*)
+        warning("Raw content is not supported")
+      end
+
+
+
+      def convert_text(el, opts)
+        text = escape(el.value)
+        text.lstrip! if opts[:result][-1] == ?\n
+        opts[:result] << text
+      end
+
+      def convert_entity(el, opts)
+        opts[:result] << unicode_char(el.value.code_point)
+      end
+
+      def convert_smart_quote(el, opts)
+        opts[:result] << unicode_char(::Kramdown::Utils::Entities.entity(el.value.to_s).code_point)
+      end
+
+      TYPOGRAPHIC_SYMS_MAP = {
+        :mdash => '\(em', :ndash => '\(em', :hellip => '\.\.\.',
+        :laquo_space => '\[Fo]', :raquo_space => '\[Fc]', :laquo => '\[Fo]', :raquo => '\[Fc]'
+      }
+
+      def convert_typographic_sym(el, opts)
+        opts[:result] << TYPOGRAPHIC_SYMS_MAP[el.value]
+      end
+
+      def macro(name, *args)
+        ".#{[name, *args].compact.join(' ')}\n"
+      end
+
+      def newline(text)
+        text << "\n" unless text[-1] == ?\n
+        text
+      end
+
+      def quote(text)
+        "\"#{text.gsub(/"/, '\\"')}\""
+      end
+
+      def escape(text, preserve_whitespace = false)
+        text = (preserve_whitespace ? text.dup : text.gsub(/\s+/, ' '))
+        text.gsub!('\\', "\\e")
+        text.gsub!(/^\./, '\\\\&.')
+        text.gsub!(/[.'-]/) {|m| "\\#{m}"}
+        text
+      end
+
+      def unicode_char(codepoint)
+        "\\[u#{codepoint.to_s(16).rjust(4, '0')}]"
+      end
+
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/itex2mml.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/itex2mml.rb
new file mode 100644
index 0000000..2a00acc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/itex2mml.rb
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown::Converter::MathEngine
+
+  # Uses the Itex2MML library for converting math formulas to MathML.
+  module Itex2MML
+
+    begin
+      require 'itextomml'
+
+      # Itex2MML is available if this constant is +true+.
+      AVAILABLE = true
+    rescue LoadError
+      AVAILABLE = false  # :nodoc:
+    end
+
+    def self.call(converter, el, opts)
+      type = el.options[:category]
+      parser = ::Itex2MML::Parser.new
+      result = (type == :block ? parser.block_filter(el.value) : parser.inline_filter(el.value))
+
+      attr = el.attr.dup
+      attr.delete('xmlns')
+      attr.delete('display')
+      result.insert("<math".length, converter.html_attributes(attr))
+
+      (type == :block ? "#{' '*opts[:indent]}#{result}\n" : result)
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/mathjax.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/mathjax.rb
new file mode 100644
index 0000000..cc9111b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/mathjax.rb
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown::Converter::MathEngine
+
+  # Uses the MathJax javascript library for displaying math.
+  #
+  # Note that the javascript library itself is not include or linked, this has to be done
+  # separately. Only the math content is marked up correctly.
+  module Mathjax
+
+    def self.call(converter, el, opts)
+      type = el.options[:category]
+      text = (el.value =~ /<|&/ ? "% <![CDATA[\n#{el.value} %]]>" : el.value)
+      text.gsub!(/<\/?script>?/, '')
+
+      preview = preview_string(converter, el, opts)
+
+      attr = {:type => "math/tex#{type == :block ? '; mode=display' : ''}"}
+      if type == :block
+        preview << converter.format_as_block_html('script', attr, text, opts[:indent])
+      else
+        preview << converter.format_as_span_html('script', attr, text)
+      end
+    end
+
+    def self.preview_string(converter, el, opts)
+      preview = converter.options[:math_engine_opts][:preview]
+      return '' unless preview
+
+      preview = (preview == true ? converter.escape_html(el.value) : preview.to_s)
+
+      preview_as_code = converter.options[:math_engine_opts][:preview_as_code]
+
+      if el.options[:category] == :block
+        if preview_as_code
+          converter.format_as_block_html('pre', {'class' => 'MathJax_Preview'},
+                                         converter.format_as_span_html('code', {}, preview),
+                                         opts[:indent])
+        else
+          converter.format_as_block_html('div', {'class' => 'MathJax_Preview'}, preview,
+                                         opts[:indent])
+        end
+      else
+        converter.format_as_span_html(preview_as_code ? 'code' : 'span',
+                                      {'class' => 'MathJax_Preview'}, preview)
+      end
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/mathjaxnode.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/mathjaxnode.rb
new file mode 100644
index 0000000..b70dfa9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/mathjaxnode.rb
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown::Converter::MathEngine
+
+  # Uses the mathjax-node library for converting math formulas to MathML.
+  module MathjaxNode
+
+    # MathjaxNode is available if this constant is +true+.
+    AVAILABLE = RUBY_VERSION >= '1.9' && begin
+      %x{node --version}[1..-2] >= '4.0'
+    rescue
+      begin
+        %x{nodejs --version}[1..-2] >= '4.0'
+      rescue
+        false
+      end
+    end && begin
+      npm = %x{npm --global --depth=1 list mathjax-node 2>&1}
+
+      unless /mathjax-node@/ === npm.lines.drop(1).join("\n")
+        npm = %x{npm --depth=1 list mathjax-node 2>&1}
+      end
+
+      T2MPATH = File.join(npm.lines.first.strip, "node_modules/mathjax-node/bin/tex2mml")
+      /mathjax-node@/ === npm.lines.drop(1).join("\n") && File.exist?(T2MPATH)
+    rescue
+      false
+    end
+
+    def self.call(converter, el, opts)
+      type = el.options[:category]
+
+      cmd = [T2MPATH]
+      cmd << "--inline" unless type == :block
+      cmd << "--semantics" if converter.options[:math_engine_opts][:semantics] == true
+      cmd << "--notexhints" if converter.options[:math_engine_opts][:texhints] == false
+      result = IO.popen(cmd << el.value).read.strip
+
+      attr = el.attr.dup
+      attr.delete('xmlns')
+      attr.delete('display')
+      result.insert("<math".length, converter.html_attributes(attr))
+
+      (type == :block ? "#{' '*opts[:indent]}#{result}\n" : result)
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/ritex.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/ritex.rb
new file mode 100644
index 0000000..c7b4aa0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/math_engine/ritex.rb
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown::Converter::MathEngine
+
+  # Uses the Ritex library for converting math formulas to MathML.
+  module Ritex
+
+    begin
+      require 'ritex'
+
+      # Ritex is available if this constant is +true+.
+      AVAILABLE = true
+    rescue LoadError
+      AVAILABLE = false  # :nodoc:
+    end
+
+    def self.call(converter, el, opts)
+      type = el.options[:category]
+      result = ::Ritex::Parser.new.parse(el.value, :display => (type == :block))
+
+      attr = el.attr.dup
+      attr.delete('xmlns')
+      attr.delete('display')
+      result.insert("<math".length, converter.html_attributes(attr))
+
+      (type == :block ? "#{' '*opts[:indent]}#{result}\n" : result)
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/pdf.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/pdf.rb
new file mode 100644
index 0000000..4da9c85
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/pdf.rb
@@ -0,0 +1,625 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'prawn'
+require 'prawn/table'
+require 'kramdown/converter'
+require 'kramdown/utils'
+require 'open-uri'
+
+module Kramdown
+
+  module Converter
+
+    # Converts an element tree to a PDF using the prawn PDF library.
+    #
+    # This basic version provides a nice starting point for customizations but can also be used
+    # directly.
+    #
+    # There can be the following two methods for each element type: render_TYPE(el, opts) and
+    # TYPE_options(el, opts) where +el+ is a kramdown element and +opts+ an hash with rendering
+    # options.
+    #
+    # The render_TYPE(el, opts) is used for rendering the specific element. If the element is a span
+    # element, it should return a hash or an array of hashes that can be used by the #formatted_text
+    # method of Prawn::Document. This method can then be used in block elements to actually render
+    # the span elements.
+    #
+    # The rendering options are passed from the parent to its child elements. This allows one to
+    # define general options at the top of the tree (the root element) that can later be changed or
+    # amended.
+    #
+    #
+    # Currently supports the conversion of all elements except those of the following types:
+    #
+    #   :html_element, :img, :footnote
+    #
+    #
+    class Pdf < Base
+
+      include Prawn::Measurements
+
+      def initialize(root, options)
+        super
+        @stack = []
+        @dests = {}
+      end
+
+      # PDF templates are applied before conversion. They should contain code to augment the
+      # converter object (i.e. to override the methods).
+      def apply_template_before?
+        true
+      end
+
+      # Returns +false+.
+      def apply_template_after?
+        false
+      end
+
+      DISPATCHER_RENDER = Hash.new {|h,k| h[k] = "render_#{k}"} #:nodoc:
+      DISPATCHER_OPTIONS = Hash.new {|h,k| h[k] = "#{k}_options"} #:nodoc:
+
+      # Invoke the special rendering method for the given element +el+.
+      #
+      # A PDF destination is also added at the current location if th element has an ID or if the
+      # element is of type :header and the :auto_ids option is set.
+      def convert(el, opts = {})
+        id = el.attr['id']
+        id = generate_id(el.options[:raw_text]) if !id && @options[:auto_ids] && el.type == :header
+        if !id.to_s.empty? && !@dests.has_key?(id)
+          @pdf.add_dest(id, @pdf.dest_xyz(0, @pdf.y))
+          @dests[id] = @pdf.dest_xyz(0, @pdf.y)
+        end
+        send(DISPATCHER_RENDER[el.type], el, opts)
+      end
+
+      protected
+
+      # Render the children of this element with the given options and return the results as array.
+      #
+      # Each time a child is rendered, the +TYPE_options+ method is invoked (if it exists) to get
+      # the specific options for the element with which the given options are updated.
+      def inner(el, opts)
+        @stack.push([el, opts])
+        result = el.children.map do |inner_el|
+          options = opts.dup
+          options.update(send(DISPATCHER_OPTIONS[inner_el.type], inner_el, options))
+          convert(inner_el, options)
+        end.flatten.compact
+        @stack.pop
+        result
+      end
+
+
+      # ----------------------------
+      # :section: Element rendering methods
+      # ----------------------------
+
+
+      def root_options(root, opts)
+        {:font => 'Times-Roman', :size => 12, :leading => 2}
+      end
+
+      def render_root(root, opts)
+        @pdf = setup_document(root)
+        inner(root, root_options(root, opts))
+        create_outline(root)
+        finish_document(root)
+        @pdf.render
+      end
+
+      def header_options(el, opts)
+        size = opts[:size] * 1.15**(6 - el.options[:level])
+        {
+          :font => "Helvetica", :styles => (opts[:styles] || []) + [:bold],
+          :size => size, :bottom_padding => opts[:size], :top_padding => opts[:size]
+        }
+      end
+
+      def render_header(el, opts)
+        render_padded_and_formatted_text(el, opts)
+      end
+
+      def p_options(el, opts)
+        bpad = (el.options[:transparent] ? opts[:leading] : opts[:size])
+        {:align => :justify, :bottom_padding => bpad}
+      end
+
+      def render_p(el, opts)
+        if el.children.size == 1 && el.children.first.type == :img
+          render_standalone_image(el, opts)
+        else
+          render_padded_and_formatted_text(el, opts)
+        end
+      end
+
+      def render_standalone_image(el, opts)
+        img = el.children.first
+        line = img.options[:location]
+
+        if img.attr['src'].empty?
+          warning("Rendering an image without a source is not possible#{line ? " (line #{line})" : ''}")
+          return nil
+        elsif img.attr['src'] !~ /\.jpe?g$|\.png$/
+          warning("Cannot render images other than JPEG or PNG, got #{img.attr['src']}#{line ? " on line #{line}" : ''}")
+          return nil
+        end
+
+        img_dirs = (@options[:image_directories] || ['.']).dup
+        begin
+          img_path = File.join(img_dirs.shift, img.attr['src'])
+          image_obj, image_info = @pdf.build_image_object(open(img_path))
+        rescue
+          img_dirs.empty? ? raise : retry
+        end
+
+        options = {:position => :center}
+        if img.attr['height'] && img.attr['height'] =~ /px$/
+          options[:height] = img.attr['height'].to_i / (@options[:image_dpi] || 150.0) * 72
+        elsif img.attr['width'] && img.attr['width'] =~ /px$/
+          options[:width] = img.attr['width'].to_i / (@options[:image_dpi] || 150.0) * 72
+        else
+          options[:scale] =[(@pdf.bounds.width - mm2pt(20)) / image_info.width.to_f, 1].min
+        end
+
+        if img.attr['class'] =~ /\bright\b/
+          options[:position] = :right
+          @pdf.float { @pdf.embed_image(image_obj, image_info, options) }
+        else
+          with_block_padding(el, opts) do
+            @pdf.embed_image(image_obj, image_info, options)
+          end
+        end
+      end
+
+      def blockquote_options(el, opts)
+        {:styles => [:italic]}
+      end
+
+      def render_blockquote(el, opts)
+        @pdf.indent(mm2pt(10), mm2pt(10)) { inner(el, opts) }
+      end
+
+      def ul_options(el, opts)
+        {:bottom_padding => opts[:size]}
+      end
+
+      def render_ul(el, opts)
+        with_block_padding(el, opts) do
+          el.children.each do |li|
+            @pdf.float { @pdf.formatted_text([text_hash("•", opts)]) }
+            @pdf.indent(mm2pt(6)) { convert(li, opts) }
+          end
+        end
+      end
+
+      def ol_options(el, opts)
+        {:bottom_padding => opts[:size]}
+      end
+
+      def render_ol(el, opts)
+        with_block_padding(el, opts) do
+          el.children.each_with_index do |li, index|
+            @pdf.float { @pdf.formatted_text([text_hash("#{index+1}.", opts)]) }
+            @pdf.indent(mm2pt(6)) { convert(li, opts) }
+          end
+        end
+      end
+
+      def li_options(el, opts)
+        {}
+      end
+
+      def render_li(el, opts)
+        inner(el, opts)
+      end
+
+      def dl_options(el, opts)
+        {}
+      end
+
+      def render_dl(el, opts)
+        inner(el, opts)
+      end
+
+      def dt_options(el, opts)
+        {:styles => (opts[:styles] || []) + [:bold], :bottom_padding => 0}
+      end
+
+      def render_dt(el, opts)
+        render_padded_and_formatted_text(el, opts)
+      end
+
+      def dd_options(el, opts)
+        {}
+      end
+
+      def render_dd(el, opts)
+        @pdf.indent(mm2pt(10)) { inner(el, opts) }
+      end
+
+      def math_options(el, opts)
+        {}
+      end
+
+      def render_math(el, opts)
+        if el.options[:category] == :block
+          @pdf.formatted_text([{:text => el.value}], block_hash(opts))
+        else
+          {:text => el.value}
+        end
+      end
+
+      def hr_options(el, opts)
+        {:top_padding => opts[:size], :bottom_padding => opts[:size]}
+      end
+
+      def render_hr(el, opts)
+        with_block_padding(el, opts) do
+          @pdf.stroke_horizontal_line(@pdf.bounds.left + mm2pt(5), @pdf.bounds.right - mm2pt(5))
+        end
+      end
+
+      def codeblock_options(el, opts)
+        {
+          :font => 'Courier', :color => '880000',
+          :bottom_padding => opts[:size]
+        }
+      end
+
+      def render_codeblock(el, opts)
+        with_block_padding(el, opts) do
+          @pdf.formatted_text([text_hash(el.value, opts, false)], block_hash(opts))
+        end
+      end
+
+      def table_options(el, opts)
+        {:bottom_padding => opts[:size]}
+      end
+
+      def render_table(el, opts)
+        data = []
+        el.children.each do |container|
+          container.children.each do |row|
+            data << []
+            row.children.each do |cell|
+              if cell.children.any? {|child| child.options[:category] == :block}
+                line = el.options[:location]
+                warning("Can't render tables with cells containing block elements#{line ? " (line #{line})" : ''}")
+                return
+              end
+              cell_data = inner(cell, opts)
+              data.last << cell_data.map {|c| c[:text]}.join('')
+            end
+          end
+        end
+        with_block_padding(el, opts) do
+          @pdf.table(data, :width => @pdf.bounds.right) do
+            el.options[:alignment].each_with_index do |alignment, index|
+              columns(index).align = alignment unless alignment == :default
+            end
+          end
+        end
+      end
+
+
+
+      def text_options(el, opts)
+        {}
+      end
+
+      def render_text(el, opts)
+        text_hash(el.value.to_s, opts)
+      end
+
+      def em_options(el, opts)
+        if opts[:styles] && opts[:styles].include?(:italic)
+          {:styles => opts[:styles].reject {|i| i == :italic}}
+        else
+          {:styles => (opts[:styles] || []) << :italic}
+        end
+      end
+
+      def strong_options(el, opts)
+        {:styles => (opts[:styles] || []) + [:bold]}
+      end
+
+      def a_options(el, opts)
+        hash = {:color => '000088'}
+        if el.attr['href'].start_with?('#')
+          hash[:anchor] = el.attr['href'].sub(/\A#/, '')
+        else
+          hash[:link] = el.attr['href']
+        end
+        hash
+      end
+
+      def render_em(el, opts)
+        inner(el, opts)
+      end
+      alias_method :render_strong, :render_em
+      alias_method :render_a, :render_em
+
+      def codespan_options(el, opts)
+        {:font => 'Courier', :color => '880000'}
+      end
+
+      def render_codespan(el, opts)
+        text_hash(el.value, opts)
+      end
+
+      def br_options(el, opts)
+        {}
+      end
+
+      def render_br(el, opts)
+        text_hash("\n", opts, false)
+      end
+
+      def smart_quote_options(el, opts)
+        {}
+      end
+
+      def render_smart_quote(el, opts)
+        text_hash(smart_quote_entity(el).char, opts)
+      end
+
+      def typographic_sym_options(el, opts)
+        {}
+      end
+
+      def render_typographic_sym(el, opts)
+        str = if el.value == :laquo_space
+                ::Kramdown::Utils::Entities.entity('laquo').char +
+                  ::Kramdown::Utils::Entities.entity('nbsp').char
+              elsif el.value == :raquo_space
+                ::Kramdown::Utils::Entities.entity('raquo').char +
+                  ::Kramdown::Utils::Entities.entity('nbsp').char
+              else
+                ::Kramdown::Utils::Entities.entity(el.value.to_s).char
+              end
+        text_hash(str, opts)
+      end
+
+      def entity_options(el, opts)
+        {}
+      end
+
+      def render_entity(el, opts)
+        text_hash(el.value.char, opts)
+      end
+
+      def abbreviation_options(el, opts)
+        {}
+      end
+
+      def render_abbreviation(el, opts)
+        text_hash(el.value, opts)
+      end
+
+      def img_options(el, opts)
+        {}
+      end
+
+      def render_img(el, *args) #:nodoc:
+        line = el.options[:location]
+        warning("Rendering span images is not supported for PDF converter#{line ? " (line #{line})" : ''}")
+        nil
+      end
+
+
+
+      def xml_comment_options(el, opts) #:nodoc:
+        {}
+      end
+      alias_method :xml_pi_options, :xml_comment_options
+      alias_method :comment_options, :xml_comment_options
+      alias_method :blank_options, :xml_comment_options
+      alias_method :footnote_options, :xml_comment_options
+      alias_method :raw_options, :xml_comment_options
+      alias_method :html_element_options, :xml_comment_options
+
+      def render_xml_comment(el, opts) #:nodoc:
+        # noop
+      end
+      alias_method :render_xml_pi, :render_xml_comment
+      alias_method :render_comment, :render_xml_comment
+      alias_method :render_blank, :render_xml_comment
+
+      def render_footnote(el, *args) #:nodoc:
+        line = el.options[:location]
+        warning("Rendering #{el.type} not supported for PDF converter#{line ? " (line #{line})" : ''}")
+        nil
+      end
+      alias_method :render_raw, :render_footnote
+      alias_method :render_html_element, :render_footnote
+
+
+      # ----------------------------
+      # :section: Organizational methods
+      #
+      # These methods are used, for example, to up the needed Prawn::Document instance or to create
+      # a PDF outline.
+      # ----------------------------
+
+
+      # This module gets mixed into the Prawn::Document instance.
+      module PrawnDocumentExtension
+
+        # Extension for the formatted box class to recognize images and move text around them.
+        module CustomBox
+
+          def available_width
+            return super unless @document.respond_to?(:converter) && @document.converter
+
+            @document.image_floats.each do |pn, x, y, w, h|
+              next if @document.page_number != pn
+              if @at[1] + @baseline_y <= y - @document.bounds.absolute_bottom &&
+                  (@at[1] + @baseline_y + @arranger.max_line_height + @leading >= y - h - @document.bounds.absolute_bottom)
+                return @width - w
+              end
+            end
+
+            return super
+          end
+
+        end
+
+        Prawn::Text::Formatted::Box.extensions << CustomBox
+
+        # Access the converter instance from within Prawn
+        attr_accessor :converter
+
+        def image_floats
+          @image_floats ||= []
+        end
+
+        # Override image embedding method for adding image positions to #image_floats.
+        def embed_image(pdf_obj, info, options)
+          # find where the image will be placed and how big it will be
+          w,h = info.calc_image_dimensions(options)
+
+          if options[:at]
+            x,y = map_to_absolute(options[:at])
+          else
+            x,y = image_position(w,h,options)
+            move_text_position h
+          end
+
+          #--> This part is new
+          if options[:position] == :right
+            image_floats << [page_number, x - 15, y, w + 15, h + 15]
+          end
+
+          # add a reference to the image object to the current page
+          # resource list and give it a label
+          label = "I#{next_image_id}"
+          state.page.xobjects.merge!(label => pdf_obj)
+
+          # add the image to the current page
+          instruct = "\nq\n%.3f 0 0 %.3f %.3f %.3f cm\n/%s Do\nQ"
+          add_content instruct % [ w, h, x, y - h, label ]
+        end
+
+      end
+
+
+      # Return a hash with options that are suitable for Prawn::Document.new.
+      #
+      # Used in #setup_document.
+      def document_options(root)
+        {
+          :page_size => 'A4', :page_layout => :portrait, :margin => mm2pt(20),
+          :info => {
+            :Creator => 'kramdown PDF converter',
+            :CreationDate => Time.now
+          },
+          :compress => true, :optimize_objects => true
+        }
+      end
+
+      # Create a Prawn::Document object and return it.
+      #
+      # Can be used to define repeatable content or register fonts.
+      #
+      # Used in #render_root.
+      def setup_document(root)
+        doc = Prawn::Document.new(document_options(root))
+        doc.extend(PrawnDocumentExtension)
+        doc.converter = self
+        doc
+      end
+
+      #
+      #
+      # Used in #render_root.
+      def finish_document(root)
+        # no op
+      end
+
+      # Create the PDF outline from the header elements in the TOC.
+      def create_outline(root)
+        toc = ::Kramdown::Converter::Toc.convert(root).first
+
+        text_of_header = lambda do |el|
+          if el.type == :text
+            el.value
+          else
+            el.children.map {|c| text_of_header.call(c)}.join('')
+          end
+        end
+
+        add_section = lambda do |item, parent|
+          text = text_of_header.call(item.value)
+          destination = @dests[item.attr[:id]]
+          if !parent
+            @pdf.outline.page(:title => text, :destination => destination)
+          else
+            @pdf.outline.add_subsection_to(parent) do
+              @pdf.outline.page(:title => text, :destination => destination)
+            end
+          end
+          item.children.each {|c| add_section.call(c, text)}
+        end
+
+        toc.children.each do |item|
+          add_section.call(item, nil)
+        end
+      end
+
+
+      # ----------------------------
+      # :section: Helper methods
+      # ----------------------------
+
+
+      # Move the prawn document cursor down before and/or after yielding the given block.
+      #
+      # The :top_padding and :bottom_padding options are used for determinig the padding amount.
+      def with_block_padding(el, opts)
+        @pdf.move_down(opts[:top_padding]) if opts.has_key?(:top_padding)
+        yield
+        @pdf.move_down(opts[:bottom_padding]) if opts.has_key?(:bottom_padding)
+      end
+
+      # Render the children of the given element as formatted text and respect the top/bottom
+      # padding (see #with_block_padding).
+      def render_padded_and_formatted_text(el, opts)
+        with_block_padding(el, opts) { @pdf.formatted_text(inner(el, opts), block_hash(opts)) }
+      end
+
+      # Helper function that returns a hash with valid "formatted text" options.
+      #
+      # The +text+ parameter is used as value for the :text key and if +squeeze_whitespace+ is
+      # +true+, all whitespace is converted into spaces.
+      def text_hash(text, opts, squeeze_whitespace = true)
+        text = text.gsub(/\s+/, ' ') if squeeze_whitespace
+        hash = {:text => text}
+        [:styles, :size, :character_spacing, :font, :color, :link,
+         :anchor, :draw_text_callback, :callback].each do |key|
+          hash[key] = opts[key] if opts.has_key?(key)
+        end
+        hash
+      end
+
+      # Helper function that returns a hash with valid options for the prawn #text_box extracted
+      # from the given options.
+      def block_hash(opts)
+        hash = {}
+        [:align, :valign, :mode, :final_gap, :leading, :fallback_fonts,
+         :direction, :indent_paragraphs].each do |key|
+          hash[key] = opts[key] if opts.has_key?(key)
+        end
+        hash
+      end
+
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/remove_html_tags.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/remove_html_tags.rb
new file mode 100644
index 0000000..79c3e1d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/remove_html_tags.rb
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/converter'
+
+module Kramdown
+
+  module Converter
+
+    # Removes all block (and optionally span) level HTML tags from the element tree.
+    #
+    # This converter can be used on parsed HTML documents to get an element tree that will only
+    # contain native kramdown elements.
+    #
+    # *Note* that the returned element tree may not be fully conformant (i.e. the content models of
+    # *some elements may be violated)!
+    #
+    # This converter modifies the given tree in-place and returns it.
+    class RemoveHtmlTags < Base
+
+      def initialize(root, options)
+        super
+        @options[:template] = ''
+      end
+
+      def convert(el)
+        children = el.children.dup
+        index = 0
+        while index < children.length
+          if [:xml_pi].include?(children[index].type) ||
+              (children[index].type == :html_element && %w[style script].include?(children[index].value))
+            children[index..index] = []
+          elsif children[index].type == :html_element &&
+            ((@options[:remove_block_html_tags] && children[index].options[:category] == :block) ||
+             (@options[:remove_span_html_tags] && children[index].options[:category] == :span))
+            children[index..index] = children[index].children
+          else
+            convert(children[index])
+            index += 1
+          end
+        end
+        el.children = children
+        el
+      end
+
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter.rb
new file mode 100644
index 0000000..151fea8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter.rb
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Converter
+
+    # == Container for Syntax Highlighters
+    #
+    # This module serves as container for the syntax highlighters that can be used together with
+    # kramdown.
+    #
+    # A syntax highlighter should not store any data itself but should use the provided converter
+    # object to do so (See Kramdown::Converter::Base#data).
+    #
+    # == Implementing a Syntax Highlighter
+    #
+    # Implementing a new syntax highlighter is easy because it is just an object that needs to
+    # respond to #call.
+    #
+    # The method #call needs to take the following arguments:
+    #
+    # converter:: This argument contains the converter object that calls the syntax highlighter. It
+    #             can be used, for example, to store data in Kramdown::Converter::Base#data for one
+    #             conversion run.
+    #
+    # text:: The raw text that should be highlighted.
+    #
+    # lang:: The language that the text should be highlighted for (e.g. ruby, python, ...).
+    #
+    # type:: The type of text, either :span for span-level code or :block for a codeblock.
+    #
+    # opts:: A Hash with options that may be passed from the converter.
+    #
+    # The return value of the method should be the highlighted text, suitable for the given
+    # converter (e.g. HTML for the HTML converter).
+    #
+    # == Special Implementation Details
+    #
+    # HTML converter:: If the syntax highlighter is used with a HTML converter, it should return
+    #                  :block type text correctly wrapped (i.e. normally inside a pre-tag, but may
+    #                  also be a table-tag or just a div-tag) but :span type text *without* a
+    #                  code-tag!
+    #
+    #                  Also, a syntax highlighter should store the default highlighting language for
+    #                  the invocation in the +opts+ hash under the key :default_lang.
+    module SyntaxHighlighter
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter/coderay.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter/coderay.rb
new file mode 100644
index 0000000..aca32f3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter/coderay.rb
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown::Converter::SyntaxHighlighter
+
+  # Uses Coderay to highlight code blocks and code spans.
+  module Coderay
+
+    begin
+      require 'coderay'
+
+      # Highlighting via coderay is available if this constant is +true+.
+      AVAILABLE = true
+    rescue LoadError
+      AVAILABLE = false  # :nodoc:
+    end
+
+    def self.call(converter, text, lang, type, call_opts)
+      return nil unless converter.options[:enable_coderay]
+
+      if type == :span && lang
+        ::CodeRay.scan(text, lang.to_sym).html(options(converter, :span)).chomp
+      elsif type == :block && (lang || options(converter, :default_lang))
+        lang ||= call_opts[:default_lang] = options(converter, :default_lang)
+        ::CodeRay.scan(text, lang.to_s.gsub(/-/, '_').to_sym).html(options(converter, :block)).chomp << "\n"
+      else
+        nil
+      end
+    rescue
+      converter.warning("There was an error using CodeRay: #{$!.message}")
+      nil
+    end
+
+    def self.options(converter, type)
+      prepare_options(converter)
+      converter.data[:syntax_highlighter_coderay][type]
+    end
+
+    def self.prepare_options(converter)
+      return if converter.data.key?(:syntax_highlighter_coderay)
+
+      cache = converter.data[:syntax_highlighter_coderay] = {}
+
+      opts = converter.options[:syntax_highlighter_opts].dup
+      span_opts = (opts.delete(:span) || {}).dup
+      block_opts = (opts.delete(:block) || {}).dup
+      [span_opts, block_opts].each do |hash|
+        hash.keys.each do |k|
+          hash[k.kind_of?(String) ? Kramdown::Options.str_to_sym(k) : k] = hash.delete(k)
+        end
+      end
+
+      cache[:default_lang] = converter.options[:coderay_default_lang] || opts.delete(:default_lang)
+      cache[:span] = {
+        :css => converter.options[:coderay_css]
+      }.update(opts).update(span_opts).update(:wrap => :span)
+      cache[:block] = {
+        :wrap => converter.options[:coderay_wrap],
+        :line_numbers => converter.options[:coderay_line_numbers],
+        :line_number_start => converter.options[:coderay_line_number_start],
+        :tab_width => converter.options[:coderay_tab_width],
+        :bold_every => converter.options[:coderay_bold_every],
+        :css => converter.options[:coderay_css]
+      }.update(opts).update(block_opts)
+
+      [:css, :wrap, :line_numbers].each do |key|
+        [:block, :span].each do |type|
+          cache[type][key] = cache[type][key].to_sym if cache[type][key].kind_of?(String)
+        end
+      end
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter/minted.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter/minted.rb
new file mode 100644
index 0000000..c9cd2fb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter/minted.rb
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown::Converter::SyntaxHighlighter
+
+  # Uses Minted to highlight code blocks and code spans.
+  module Minted
+
+    def self.call(converter, text, lang, type, _opts)
+      opts = converter.options[:syntax_highlighter_opts]
+
+      # Fallback to default language
+      lang ||= opts[:default_lang]
+
+      options = []
+      options << "breaklines" if opts[:wrap]
+      options << "linenos" if opts[:line_numbers]
+      options << "frame=#{opts[:frame]}" if opts[:frame]
+
+      if lang && type == :block
+        "\\begin{minted}[#{options.join(',')}]{#{lang}}\n#{text}\n\\end{minted}"
+      elsif lang && type == :span
+        "\\mintinline{#{lang}}{#{text}}"
+      else
+        nil
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter/rouge.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter/rouge.rb
new file mode 100644
index 0000000..0997aba
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/syntax_highlighter/rouge.rb
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown::Converter::SyntaxHighlighter
+
+  # Uses Rouge which is CSS-compatible to Pygments to highlight code blocks and code spans.
+  module Rouge
+
+    begin
+      require 'rouge'
+
+      # Highlighting via Rouge is available if this constant is +true+.
+      AVAILABLE = true
+
+      begin
+        # Rouge::Formatters::HTMLLegacy is available on Rouge 2.0 or later
+        FORMATTER_CLASS = ::Rouge::Formatters::HTMLLegacy
+      rescue NameError
+        # Fallbacks to Rouge 1.x formatter if Rouge::Formatters::HTMLLegacy is not available
+        FORMATTER_CLASS = ::Rouge::Formatters::HTML
+      end
+    rescue LoadError, SyntaxError
+      AVAILABLE = false  # :nodoc:
+    end
+
+    def self.call(converter, text, lang, type, call_opts)
+      opts = options(converter, type)
+      call_opts[:default_lang] = opts[:default_lang]
+      lexer = ::Rouge::Lexer.find_fancy(lang || opts[:default_lang], text)
+      return nil if opts[:disable] || !lexer
+      opts[:css_class] ||= 'highlight' # For backward compatibility when using Rouge 2.0
+      formatter = (opts.fetch(:formatter, FORMATTER_CLASS)).new(opts)
+      formatter.format(lexer.lex(text))
+    end
+
+    def self.options(converter, type)
+      prepare_options(converter)
+      converter.data[:syntax_highlighter_rouge][type]
+    end
+
+    def self.prepare_options(converter)
+      return if converter.data.key?(:syntax_highlighter_rouge)
+
+      cache = converter.data[:syntax_highlighter_rouge] = {}
+
+      opts = converter.options[:syntax_highlighter_opts].dup
+      span_opts = (opts.delete(:span) || {}).dup
+      block_opts = (opts.delete(:block) || {}).dup
+      [span_opts, block_opts].each do |hash|
+        hash.keys.each do |k|
+          hash[k.kind_of?(String) ? Kramdown::Options.str_to_sym(k) : k] = hash.delete(k)
+        end
+      end
+
+      cache[:span] = opts.merge(span_opts).update(:wrap => false)
+      cache[:block] = opts.merge(block_opts)
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/toc.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/toc.rb
new file mode 100644
index 0000000..2987ff3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/converter/toc.rb
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/converter'
+
+module Kramdown
+
+  module Converter
+
+    # Converts a Kramdown::Document to an element tree that represents the table of contents.
+    #
+    # The returned tree consists of Element objects of type :toc where the root element is just used
+    # as container object. Each :toc element contains as value the wrapped :header element and under
+    # the attribute key :id the header ID that should be used (note that this ID may not exist in
+    # the wrapped element).
+    #
+    # Since the TOC tree consists of special :toc elements, one cannot directly feed this tree to
+    # other converters!
+    class Toc < Base
+
+      def initialize(root, options)
+        super
+        @toc = Element.new(:toc)
+        @stack = []
+        @options[:template] = ''
+      end
+
+      def convert(el)
+        if el.type == :header && in_toc?(el)
+          attr = el.attr.dup
+          attr['id'] = generate_id(el.options[:raw_text]) if @options[:auto_ids] && !attr['id']
+          add_to_toc(el, attr['id']) if attr['id']
+        else
+          el.children.each {|child| convert(child)}
+        end
+        @toc
+      end
+
+      private
+
+      def add_to_toc(el, id)
+        toc_element = Element.new(:toc, el, :id => id)
+
+        success = false
+        while !success
+          if @stack.empty?
+            @toc.children << toc_element
+            @stack << toc_element
+            success = true
+          elsif @stack.last.value.options[:level] < el.options[:level]
+            @stack.last.children << toc_element
+            @stack << toc_element
+            success = true
+          else
+            @stack.pop
+          end
+        end
+      end
+
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/document.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/document.rb
new file mode 100644
index 0000000..83c0b3b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/document.rb
@@ -0,0 +1,144 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+# = kramdown
+#
+# kramdown is fast, pure Ruby Markdown superset converter, using a strict syntax definition and
+# supporting several common extensions.
+#
+# The kramdown library is mainly written to support the kramdown-to-HTML conversion chain. However,
+# due to its flexibility it supports other input and output formats as well. Here is a list of the
+# supported formats:
+#
+# * input formats: kramdown (a Markdown superset), Markdown, GFM, HTML
+# * output formats: HTML, kramdown, LaTeX (and therefore PDF), PDF via Prawn
+#
+# All the documentation on the available input and output formats is available at
+# http://kramdown.gettalong.org.
+#
+# == Usage
+#
+# kramdown has a simple API, so using kramdown is as easy as
+#
+#     require 'kramdown'
+#
+#     Kramdown::Document.new(text).to_html
+#
+# For detailed information have a look at the *\Kramdown::Document* class.
+#
+# == License
+#
+# MIT - see the COPYING file.
+
+
+require 'kramdown/compatibility'
+
+require 'kramdown/version'
+require 'kramdown/element'
+require 'kramdown/error'
+require 'kramdown/parser'
+require 'kramdown/converter'
+require 'kramdown/options'
+require 'kramdown/utils'
+
+module Kramdown
+
+  # Return the data directory for kramdown.
+  def self.data_dir
+    unless defined?(@@data_dir)
+      require 'rbconfig'
+      @@data_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data', 'kramdown'))
+      @@data_dir = File.expand_path(File.join(RbConfig::CONFIG["datadir"], "kramdown")) if !File.exists?(@@data_dir)
+      raise "kramdown data directory not found! This is a bug, please report it!" unless File.directory?(@@data_dir)
+    end
+    @@data_dir
+  end
+
+
+  # The main interface to kramdown.
+  #
+  # This class provides a one-stop-shop for using kramdown to convert text into various output
+  # formats. Use it like this:
+  #
+  #   require 'kramdown'
+  #   doc = Kramdown::Document.new('This *is* some kramdown text')
+  #   puts doc.to_html
+  #
+  # The #to_html method is a shortcut for using the Converter::Html class. See #method_missing for
+  # more information.
+  #
+  # The second argument to the ::new method is an options hash for customizing the behaviour of the
+  # used parser and the converter. See ::new for more information!
+  class Document
+
+    # The root Element of the element tree. It is immediately available after the ::new method has
+    # been called.
+    attr_accessor :root
+
+    # The options hash which holds the options for parsing/converting the Kramdown document.
+    attr_reader :options
+
+    # An array of warning messages. It is filled with warnings during the parsing phase (i.e. in
+    # ::new) and the conversion phase.
+    attr_reader :warnings
+
+
+    # Create a new Kramdown document from the string +source+ and use the provided +options+. The
+    # options that can be used are defined in the Options module.
+    #
+    # The special options key :input can be used to select the parser that should parse the
+    # +source+. It has to be the name of a class in the Kramdown::Parser module. For example, to
+    # select the kramdown parser, one would set the :input key to +Kramdown+. If this key is not
+    # set, it defaults to +Kramdown+.
+    #
+    # The +source+ is immediately parsed by the selected parser so that the root element is
+    # immediately available and the output can be generated.
+    def initialize(source, options = {})
+      @options = Options.merge(options).freeze
+      parser = (@options[:input] || 'kramdown').to_s
+      parser = parser[0..0].upcase + parser[1..-1]
+      try_require('parser', parser)
+      if Parser.const_defined?(parser)
+        @root, @warnings = Parser.const_get(parser).parse(source, @options)
+      else
+        raise Kramdown::Error.new("kramdown has no parser to handle the specified input format: #{@options[:input]}")
+      end
+    end
+
+    # Check if a method is invoked that begins with +to_+ and if so, try to instantiate a converter
+    # class (i.e. a class in the Kramdown::Converter module) and use it for converting the document.
+    #
+    # For example, +to_html+ would instantiate the Kramdown::Converter::Html class.
+    def method_missing(id, *attr, &block)
+      if id.to_s =~ /^to_(\w+)$/ && (name = Utils.camelize($1)) &&
+          try_require('converter', name) && Converter.const_defined?(name)
+        output, warnings = Converter.const_get(name).convert(@root, @options)
+        @warnings.concat(warnings)
+        output
+      else
+        super
+      end
+    end
+
+    def inspect #:nodoc:
+      "<KD:Document: options=#{@options.inspect} root=#{@root.inspect} warnings=#{@warnings.inspect}>"
+    end
+
+    # Try requiring a parser or converter class and don't raise an error if the file is not found.
+    def try_require(type, name)
+      require("kramdown/#{type}/#{Utils.snake_case(name)}")
+      true
+    rescue LoadError
+      true
+    end
+    protected :try_require
+
+  end
+
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/element.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/element.rb
new file mode 100644
index 0000000..64463b7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/element.rb
@@ -0,0 +1,522 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+
+  # Represents all elements in the element tree.
+  #
+  # kramdown only uses this one class for representing all available elements in an element tree
+  # (paragraphs, headers, emphasis, ...). The type of element can be set via the #type accessor.
+  #
+  # Following is a description of all supported element types.
+  #
+  # Note that the option :location may contain the start line number of an element in the source
+  # document.
+  #
+  # == Structural Elements
+  #
+  # === :root
+  #
+  # [Category] None
+  # [Usage context] As the root element of a document
+  # [Content model] Block-level elements
+  #
+  # Represents the root of a kramdown document.
+  #
+  # The root element contains the following option keys:
+  #
+  # :encoding:: When running on Ruby 1.9 this key has to be set to the encoding used for the text
+  #             parts of the kramdown document.
+  #
+  # :abbrev_defs:: This key may be used to store the mapping of abbreviation to abbreviation
+  #                definition.
+  #
+  # :abbrev_attr:: This key may be used to store the mapping of abbreviation to abbreviation
+  #                attributes.
+  #
+  # :options:: This key may be used to store options that were set during parsing of the document.
+  #
+  #
+  # === :blank
+  #
+  # [Category] Block-level element
+  # [Usage context] Where block-level elements are expected
+  # [Content model] Empty
+  #
+  # Represents one or more blank lines. It is not allowed to have two or more consecutive blank
+  # elements.
+  #
+  # The +value+ field may contain the original content of the blank lines.
+  #
+  #
+  # === :p
+  #
+  # [Category] Block-level element
+  # [Usage context] Where block-level elements are expected
+  # [Content model] Span-level elements
+  #
+  # Represents a paragraph.
+  #
+  # If the option :transparent is +true+, this element just represents a block of text. I.e. this
+  # element just functions as a container for span-level elements.
+  #
+  #
+  # === :header
+  #
+  # [Category] Block-level element
+  # [Usage context] Where block-level elements are expected
+  # [Content model] Span-level elements
+  #
+  # Represents a header.
+  #
+  # The option :level specifies the header level and has to contain a number between 1 and \6. The
+  # option :raw_text has to contain the raw header text.
+  #
+  #
+  # === :blockquote
+  #
+  # [Category] Block-level element
+  # [Usage context] Where block-level elements are expected
+  # [Content model] Block-level elements
+  #
+  # Represents a blockquote.
+  #
+  #
+  # === :codeblock
+  #
+  # [Category] Block-level element
+  # [Usage context] Where block-level elements are expected
+  # [Content model] Empty
+  #
+  # Represents a code block, i.e. a block of text that should be used as-is.
+  #
+  # The +value+ field has to contain the content of the code block.
+  #
+  # The option :lang specifies a highlighting language with possible HTML style options (e.g.
+  # php?start_inline=1) and should be used instead of a possibly also available language embedded in
+  # a class name of the form 'language-LANG'.
+  #
+  #
+  # === :ul
+  #
+  # [Category] Block-level element
+  # [Usage context] Where block-level elements are expected
+  # [Content model] One or more :li elements
+  #
+  # Represents an unordered list.
+  #
+  #
+  # === :ol
+  #
+  # [Category] Block-level element
+  # [Usage context] Where block-level elements are expected
+  # [Content model] One or more :li elements
+  #
+  # Represents an ordered list.
+  #
+  #
+  # === :li
+  #
+  # [Category] Block-level element
+  # [Usage context] Inside :ol and :ul elements
+  # [Content model] Block-level elements
+  #
+  # Represents a list item of an ordered or unordered list.
+  #
+  # Note that the first child of a list item must not be a :blank element!
+  #
+  #
+  # === :dl
+  #
+  # [Category] Block-level element
+  # [Usage context] Where block-level elements are expected
+  # [Content model] One or more groups each consisting of one or more :dt elements followed by one
+  #                 or more :dd elements.
+  #
+  # Represents a definition list which contains groups consisting of terms and definitions for them.
+  #
+  #
+  # === :dt
+  #
+  # [Category] Block-level element
+  # [Usage context] Before :dt or :dd elements inside a :dl elment
+  # [Content model] Span-level elements
+  #
+  # Represents the term part of a term-definition group in a definition list.
+  #
+  #
+  # === :dd
+  #
+  # [Category] Block-level element
+  # [Usage context] After :dt or :dd elements inside a :dl elment
+  # [Content model] Block-level elements
+  #
+  # Represents the definition part of a term-definition group in a definition list.
+  #
+  #
+  # === :hr
+  #
+  # [Category] Block-level element
+  # [Usage context] Where block-level elements are expected
+  # [Content model] None
+  #
+  # Represents a horizontal line.
+  #
+  #
+  # === :table
+  #
+  # [Category] Block-level element
+  # [Usage context] Where block-level elements are expected
+  # [Content model] Zero or one :thead elements, one or more :tbody elements, zero or one :tfoot
+  #                 elements
+  #
+  # Represents a table. Each table row (i.e. :tr element) of the table has to contain the same
+  # number of :td elements.
+  #
+  # The option :alignment has to be an array containing the alignment values, exactly one for each
+  # column of the table. The possible alignment values are :left, :center, :right and :default.
+  #
+  #
+  # === :thead
+  #
+  # [Category] None
+  # [Usage context] As first element inside a :table element
+  # [Content model] One or more :tr elements
+  #
+  # Represents the table header.
+  #
+  #
+  # === :tbody
+  #
+  # [Category] None
+  # [Usage context] After a :thead element but before a :tfoot element inside a :table element
+  # [Content model] One or more :tr elements
+  #
+  # Represents a table body.
+  #
+  #
+  # === :tfoot
+  #
+  # [Category] None
+  # [Usage context] As last element inside a :table element
+  # [Content model] One or more :tr elements
+  #
+  # Represents the table footer.
+  #
+  #
+  # === :tr
+  #
+  # [Category] None
+  # [Usage context] Inside :thead, :tbody and :tfoot elements
+  # [Content model] One or more :td elements
+  #
+  # Represents a table row.
+  #
+  #
+  # === :td
+  #
+  # [Category] Block-level element
+  # [Usage context] Inside :tr elements
+  # [Content model] As child of :thead/:tr span-level elements, as child of :tbody/:tr and
+  #                 :tfoot/:tr block-level elements
+  #
+  # Represents a table cell.
+  #
+  #
+  # === :math
+  #
+  # [Category] Block/span-level element
+  # [Usage context] Where block/span-level elements are expected
+  # [Content model] None
+  #
+  # Represents mathematical text that is written in LaTeX.
+  #
+  # The +value+ field has to contain the actual mathematical text.
+  #
+  # The option :category has to be set to either :span or :block depending on the context where the
+  # element is used.
+  #
+  #
+  # == Text Markup Elements
+  #
+  # === :text
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] None
+  #
+  # Represents text.
+  #
+  # The +value+ field has to contain the text itself.
+  #
+  #
+  # === :br
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] None
+  #
+  # Represents a hard line break.
+  #
+  #
+  # === :a
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] Span-level elements
+  #
+  # Represents a link to an URL.
+  #
+  # The attribute +href+ has to be set to the URL to which the link points. The attribute +title+
+  # optionally contains the title of the link.
+  #
+  #
+  # === :img
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] None
+  #
+  # Represents an image.
+  #
+  # The attribute +src+ has to be set to the URL of the image. The attribute +alt+ has to contain a
+  # text description of the image. The attribute +title+ optionally contains the title of the image.
+  #
+  #
+  # === :codespan
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] None
+  #
+  # Represents verbatim text.
+  #
+  # The +value+ field has to contain the content of the code span.
+  #
+  #
+  # === :footnote
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] None
+  #
+  # Represents a footnote marker.
+  #
+  # The +value+ field has to contain an element whose children are the content of the footnote. The
+  # option :name has to contain a valid and unique footnote name. A valid footnote name consists of
+  # a word character or a digit and then optionally followed by other word characters, digits or
+  # dashes.
+  #
+  #
+  # === :em
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] Span-level elements
+  #
+  # Represents emphasis of its contents.
+  #
+  #
+  # === :strong
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] Span-level elements
+  #
+  # Represents strong importance for its contents.
+  #
+  #
+  # === :entity
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] None
+  #
+  # Represents an HTML entity.
+  #
+  # The +value+ field has to contain an instance of Kramdown::Utils::Entities::Entity. The option
+  # :original can be used to store the original representation of the entity.
+  #
+  #
+  # === :typographic_sym
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] None
+  #
+  # Represents a typographic symbol.
+  #
+  # The +value+ field needs to contain a Symbol representing the specific typographic symbol from
+  # the following list:
+  #
+  # :mdash:: An mdash character (---)
+  # :ndash:: An ndash character (--)
+  # :hellip:: An ellipsis (...)
+  # :laquo:: A left guillemet (<<)
+  # :raquo:: A right guillemet (>>)
+  # :laquo_space:: A left guillemet with a space (<< )
+  # :raquo_space:: A right guillemet with a space ( >>)
+  #
+  #
+  # === :smart_quote
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] None
+  #
+  # Represents a quotation character.
+  #
+  # The +value+ field needs to contain a Symbol representing the specific quotation character:
+  #
+  # :lsquo:: Left single quote
+  # :rsquo:: Right single quote
+  # :ldquo:: Left double quote
+  # :rdquo:: Right double quote
+  #
+  #
+  # === :abbreviation
+  #
+  # [Category] Span-level element
+  # [Usage context] Where span-level elements are expected
+  # [Content model] None
+  #
+  # Represents a text part that is an abbreviation.
+  #
+  # The +value+ field has to contain the text part that is the abbreviation. The definition of the
+  # abbreviation is stored in the :root element of the document.
+  #
+  #
+  # == Other Elements
+  #
+  # === :html_element
+  #
+  # [Category] Block/span-level element
+  # [Usage context] Where block/span-level elements or raw HTML elements are expected
+  # [Content model] Depends on the element
+  #
+  # Represents an HTML element.
+  #
+  # The +value+ field has to contain the name of the HTML element the element is representing.
+  #
+  # The option :category has to be set to either :span or :block depending on the whether the
+  # element is a block-level or a span-level element. The option :content_model has to be set to the
+  # content model for the element (either :block if it contains block-level elements, :span if it
+  # contains span-level elements or :raw if it contains raw content).
+  #
+  #
+  # === :xml_comment
+  #
+  # [Category] Block/span-level element
+  # [Usage context] Where block/span-level elements are expected or in raw HTML elements
+  # [Content model] None
+  #
+  # Represents an XML/HTML comment.
+  #
+  # The +value+ field has to contain the whole XML/HTML comment including the delimiters.
+  #
+  # The option :category has to be set to either :span or :block depending on the context where the
+  # element is used.
+  #
+  #
+  # === :xml_pi
+  #
+  # [Category] Block/span-level element
+  # [Usage context] Where block/span-level elements are expected or in raw HTML elements
+  # [Content model] None
+  #
+  # Represents an XML/HTML processing instruction.
+  #
+  # The +value+ field has to contain the whole XML/HTML processing instruction including the
+  # delimiters.
+  #
+  # The option :category has to be set to either :span or :block depending on the context where the
+  # element is used.
+  #
+  #
+  # === :comment
+  #
+  # [Category] Block/span-level element
+  # [Usage context] Where block/span-level elements are expected
+  # [Content model] None
+  #
+  # Represents a comment.
+  #
+  # The +value+ field has to contain the comment.
+  #
+  # The option :category has to be set to either :span or :block depending on the context where the
+  # element is used. If it is set to :span, then no blank lines are allowed in the comment.
+  #
+  #
+  # === :raw
+  #
+  # [Category] Block/span-level element
+  # [Usage context] Where block/span-level elements are expected
+  # [Content model] None
+  #
+  # Represents a raw string that should not be modified. For example, the element could contain some
+  # HTML code that should be output as-is without modification and escaping.
+  #
+  # The +value+ field has to contain the actual raw text.
+  #
+  # The option :category has to be set to either :span or :block depending on the context where the
+  # element is used. If it is set to :span, then no blank lines are allowed in the raw text.
+  #
+  # The option :type can be set to an array of strings to define for which converters the raw string
+  # is valid.
+  #
+  class Element
+
+    # A symbol representing the element type. For example, :p or :blockquote.
+    attr_accessor :type
+
+    # The value of the element. The interpretation of this field depends on the type of the element.
+    # Many elements don't use this field.
+    attr_accessor :value
+
+    # The child elements of this element.
+    attr_accessor :children
+
+
+    # Create a new Element object of type +type+. The optional parameters +value+, +attr+ and
+    # +options+ can also be set in this constructor for convenience.
+    def initialize(type, value = nil, attr = nil, options = nil)
+      @type, @value, @attr, @options = type, value, (Utils::OrderedHash.new.merge!(attr) if attr), options
+      @children = []
+    end
+
+    # The attributes of the element. Uses an Utils::OrderedHash to retain the insertion order.
+    def attr
+      @attr ||= Utils::OrderedHash.new
+    end
+
+    # The options hash for the element. It is used for storing arbitray options.
+    def options
+      @options ||= {}
+    end
+
+    def inspect #:nodoc:
+      "<kd:#{@type}#{@value.nil? ? '' : ' ' + @value.inspect} #{@attr.inspect}#{options.empty? ? '' : ' ' + @options.inspect}#{@children.empty? ? '' : ' ' + @children.inspect}>"
+    end
+
+    CATEGORY = {} # :nodoc:
+    [:blank, :p, :header, :blockquote, :codeblock, :ul, :ol, :li, :dl, :dt, :dd, :table, :td, :hr].each {|b| CATEGORY[b] = :block}
+    [:text, :a, :br, :img, :codespan, :footnote, :em, :strong, :entity, :typographic_sym,
+     :smart_quote, :abbreviation].each {|b| CATEGORY[b] = :span}
+
+    # Return the category of +el+ which can be :block, :span or +nil+.
+    #
+    # Most elements have a fixed category, however, some elements can either appear in a block-level
+    # or a span-level context. These elements need to have the option :category correctly set.
+    def self.category(el)
+      CATEGORY[el.type] || el.options[:category]
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/error.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/error.rb
new file mode 100644
index 0000000..94e65b2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/error.rb
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+
+  # This error is raised when an error condition is encountered.
+  #
+  # *Note* that this error is only raised by the support framework for the parsers and converters.
+  class Error < RuntimeError; end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/options.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/options.rb
new file mode 100644
index 0000000..adeceeb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/options.rb
@@ -0,0 +1,627 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'yaml'
+
+module Kramdown
+
+  # This module defines all options that are used by parsers and/or converters as well as providing
+  # methods to deal with the options.
+  module Options
+
+    # Helper class introducing a boolean type for specifying boolean values (+true+ and +false+) as
+    # option types.
+    class Boolean
+
+      # Return +true+ if +other+ is either +true+ or +false+
+      def self.===(other)
+        FalseClass === other || TrueClass === other
+      end
+
+    end
+
+    # ----------------------------
+    # :section: Option definitions
+    #
+    # This sections describes the methods that can be used on the Options module.
+    # ----------------------------
+
+    # Struct class for storing the definition of an option.
+    Definition = Struct.new(:name, :type, :default, :desc, :validator)
+
+    # Allowed option types.
+    ALLOWED_TYPES = [String, Integer, Float, Symbol, Boolean, Object]
+
+    @options = {}
+
+    # Define a new option called +name+ (a Symbol) with the given +type+ (String, Integer, Float,
+    # Symbol, Boolean, Object), default value +default+ and the description +desc+. If a block is
+    # specified, it should validate the value and either raise an error or return a valid value.
+    #
+    # The type 'Object' should only be used for complex types for which none of the other types
+    # suffices. A block needs to be specified when using type 'Object' and it has to cope with
+    # a value given as string and as the opaque type.
+    def self.define(name, type, default, desc, &block)
+      name = name.to_sym
+      raise ArgumentError, "Option name #{name} is already used" if @options.has_key?(name)
+      raise ArgumentError, "Invalid option type #{type} specified" if !ALLOWED_TYPES.include?(type)
+      raise ArgumentError, "Invalid type for default value" if !(type === default) && !default.nil?
+      raise ArgumentError, "Missing validator block" if type == Object && block.nil?
+      @options[name] = Definition.new(name, type, default, desc, block)
+    end
+
+    # Return all option definitions.
+    def self.definitions
+      @options
+    end
+
+    # Return +true+ if an option called +name+ is defined.
+    def self.defined?(name)
+      @options.has_key?(name.to_sym)
+    end
+
+    # Return a Hash with the default values for all options.
+    def self.defaults
+      temp = {}
+      @options.each {|n, o| temp[o.name] = o.default}
+      temp
+    end
+
+    # Merge the #defaults Hash with the *parsed* options from the given Hash, i.e. only valid option
+    # names are considered and their value is run through the #parse method.
+    def self.merge(hash)
+      temp = defaults
+      hash.each do |k,v|
+        k = k.to_sym
+        @options.has_key?(k) ? temp[k] = parse(k, v) : temp[k] = v
+      end
+      temp
+    end
+
+    # Parse the given value +data+ as if it was a value for the option +name+ and return the parsed
+    # value with the correct type.
+    #
+    # If +data+ already has the correct type, it is just returned. Otherwise it is converted to a
+    # String and then to the correct type.
+    def self.parse(name, data)
+      name = name.to_sym
+      raise ArgumentError, "No option named #{name} defined" if !@options.has_key?(name)
+      if !(@options[name].type === data)
+        data = data.to_s
+        data = if @options[name].type == String
+                 data
+               elsif @options[name].type == Integer
+                 Integer(data) rescue raise Kramdown::Error, "Invalid integer value for option '#{name}': '#{data}'"
+               elsif @options[name].type == Float
+                 Float(data) rescue raise Kramdown::Error, "Invalid float value for option '#{name}': '#{data}'"
+               elsif @options[name].type == Symbol
+                 str_to_sym(data)
+               elsif @options[name].type == Boolean
+                 data.downcase.strip != 'false' && !data.empty?
+               end
+      end
+      data = @options[name].validator[data] if @options[name].validator
+      data
+    end
+
+    # Converts the given String +data+ into a Symbol or +nil+ with the
+    # following provisions:
+    #
+    # - A leading colon is stripped from the string.
+    # - An empty value or a value equal to "nil" results in +nil+.
+    def self.str_to_sym(data)
+      data = data.strip
+      data = data[1..-1] if data[0] == ?:
+      (data.empty? || data == 'nil' ? nil : data.to_sym)
+    end
+
+    # ----------------------------
+    # :section: Option Validators
+    #
+    # This sections contains all pre-defined option validators.
+    # ----------------------------
+
+    # Ensures that the option value +val+ for the option called +name+ is a valid array. The
+    # parameter +val+ can be
+    #
+    # - a comma separated string which is split into an array of values
+    # - or an array.
+    #
+    # Optionally, the array is checked for the correct size.
+    def self.simple_array_validator(val, name, size = nil)
+      if String === val
+        val = val.split(/,/)
+      elsif !(Array === val)
+        raise Kramdown::Error, "Invalid type #{val.class} for option #{name}"
+      end
+      if size && val.size != size
+        raise Kramdown::Error, "Option #{name} needs exactly #{size} values"
+      end
+      val
+    end
+
+    # Ensures that the option value +val+ for the option called +name+ is a valid hash. The
+    # parameter +val+ can be
+    #
+    # - a hash in YAML format
+    # - or a Ruby Hash object.
+    def self.simple_hash_validator(val, name)
+      if String === val
+        begin
+          val = YAML.load(val)
+        rescue RuntimeError, ArgumentError, SyntaxError
+          raise Kramdown::Error, "Invalid YAML value for option #{name}"
+        end
+      end
+      raise Kramdown::Error, "Invalid type #{val.class} for option #{name}" if !(Hash === val)
+      val
+    end
+
+    # ----------------------------
+    # :section: Option Definitions
+    #
+    # This sections contains all option definitions that are used by the included
+    # parsers/converters.
+    # ----------------------------
+
+    define(:template, String, '', <<EOF)
+The name of an ERB template file that should be used to wrap the output
+or the ERB template itself.
+
+This is used to wrap the output in an environment so that the output can
+be used as a stand-alone document. For example, an HTML template would
+provide the needed header and body tags so that the whole output is a
+valid HTML file. If no template is specified, the output will be just
+the converted text.
+
+When resolving the template file, the given template name is used first.
+If such a file is not found, the converter extension (the same as the
+converter name) is appended. If the file still cannot be found, the
+templates name is interpreted as a template name that is provided by
+kramdown (without the converter extension). If the file is still not
+found, the template name is checked if it starts with 'string://' and if
+it does, this prefix is removed and the rest is used as template
+content.
+
+kramdown provides a default template named 'document' for each converter.
+
+Default: ''
+Used by: all converters
+EOF
+
+    define(:auto_ids, Boolean, true, <<EOF)
+Use automatic header ID generation
+
+If this option is `true`, ID values for all headers are automatically
+generated if no ID is explicitly specified.
+
+Default: true
+Used by: HTML/Latex converter
+EOF
+
+    define(:auto_id_stripping, Boolean, false, <<EOF)
+Strip all formatting from header text for automatic ID generation
+
+If this option is `true`, only the text elements of a header are used
+for generating the ID later (in contrast to just using the raw header
+text line).
+
+This option will be removed in version 2.0 because this will be the
+default then.
+
+Default: false
+Used by: kramdown parser
+EOF
+
+    define(:auto_id_prefix, String, '', <<EOF)
+Prefix used for automatically generated header IDs
+
+This option can be used to set a prefix for the automatically generated
+header IDs so that there is no conflict when rendering multiple kramdown
+documents into one output file separately. The prefix should only
+contain characters that are valid in an ID!
+
+Default: ''
+Used by: HTML/Latex converter
+EOF
+
+    define(:transliterated_header_ids, Boolean, false, <<EOF)
+Transliterate the header text before generating the ID
+
+Only ASCII characters are used in headers IDs. This is not good for
+languages with many non-ASCII characters. By enabling this option
+the header text is transliterated to ASCII as good as possible so that
+the resulting header ID is more useful.
+
+The stringex library needs to be installed for this feature to work!
+
+Default: false
+Used by: HTML/Latex converter
+EOF
+
+    define(:parse_block_html, Boolean, false, <<EOF)
+Process kramdown syntax in block HTML tags
+
+If this option is `true`, the kramdown parser processes the content of
+block HTML tags as text containing block-level elements. Since this is
+not wanted normally, the default is `false`. It is normally better to
+selectively enable kramdown processing via the markdown attribute.
+
+Default: false
+Used by: kramdown parser
+EOF
+
+    define(:parse_span_html, Boolean, true, <<EOF)
+Process kramdown syntax in span HTML tags
+
+If this option is `true`, the kramdown parser processes the content of
+span HTML tags as text containing span-level elements.
+
+Default: true
+Used by: kramdown parser
+EOF
+
+    define(:html_to_native, Boolean, false, <<EOF)
+Convert HTML elements to native elements
+
+If this option is `true`, the parser converts HTML elements to native
+elements. For example, when parsing `<em>hallo</em>` the emphasis tag
+would normally be converted to an `:html` element with tag type `:em`.
+If `html_to_native` is `true`, then the emphasis would be converted to a
+native `:em` element.
+
+This is useful for converters that cannot deal with HTML elements.
+
+Default: false
+Used by: kramdown parser
+EOF
+
+    define(:link_defs, Object, {}, <<EOF) do |val|
+Pre-defines link definitions
+
+This option can be used to pre-define link definitions. The value needs
+to be a Hash where the keys are the link identifiers and the values are
+two element Arrays with the link URL and the link title.
+
+If the value is a String, it has to contain a valid YAML hash and the
+hash has to follow the above guidelines.
+
+Default: {}
+Used by: kramdown parser
+EOF
+      val = simple_hash_validator(val, :link_defs)
+      val.each do |k,v|
+        if !(Array === v) || v.size > 2 || v.size < 1
+          raise Kramdown::Error, "Invalid structure for hash value of option #{name}"
+        end
+        v << nil if v.size == 1
+      end
+      val
+    end
+
+    define(:footnote_nr, Integer, 1, <<EOF)
+The number of the first footnote
+
+This option can be used to specify the number that is used for the first
+footnote.
+
+Default: 1
+Used by: HTML converter
+EOF
+
+    define(:enable_coderay, Boolean, true, <<EOF)
+Use coderay for syntax highlighting
+
+If this option is `true`, coderay is used by the HTML converter for
+syntax highlighting the content of code spans and code blocks.
+
+Default: true
+Used by: HTML converter
+EOF
+
+    define(:coderay_wrap, Symbol, :div, <<EOF)
+Defines how the highlighted code should be wrapped
+
+The possible values are :span, :div or nil.
+
+Default: :div
+Used by: HTML converter
+EOF
+
+    define(:coderay_line_numbers, Symbol, :inline, <<EOF)
+Defines how and if line numbers should be shown
+
+The possible values are :table, :inline or nil. If this option is
+nil, no line numbers are shown.
+
+Default: :inline
+Used by: HTML converter
+EOF
+
+    define(:coderay_line_number_start, Integer, 1, <<EOF)
+The start value for the line numbers
+
+Default: 1
+Used by: HTML converter
+EOF
+
+    define(:coderay_tab_width, Integer, 8, <<EOF)
+The tab width used in highlighted code
+
+Used by: HTML converter
+EOF
+
+    define(:coderay_bold_every, Object, 10, <<EOF) do |val|
+Defines how often a line number should be made bold
+
+Can either be an integer or false (to turn off bold line numbers
+completely).
+
+Default: 10
+Used by: HTML converter
+EOF
+      if val == false || val.to_s == 'false'
+        false
+      else
+        Integer(val.to_s) rescue raise Kramdown::Error, "Invalid value for option 'coderay_bold_every'"
+      end
+end
+
+    define(:coderay_css, Symbol, :style, <<EOF)
+Defines how the highlighted code gets styled
+
+Possible values are :class (CSS classes are applied to the code
+elements, one must supply the needed CSS file) or :style (default CSS
+styles are directly applied to the code elements).
+
+Default: style
+Used by: HTML converter
+EOF
+
+    define(:coderay_default_lang, Symbol, nil, <<EOF)
+Sets the default language for highlighting code blocks
+
+If no language is set for a code block, the default language is used
+instead. The value has to be one of the languages supported by coderay
+or nil if no default language should be used.
+
+Default: nil
+Used by: HTML converter
+EOF
+
+    define(:entity_output, Symbol, :as_char, <<EOF)
+Defines how entities are output
+
+The possible values are :as_input (entities are output in the same
+form as found in the input), :numeric (entities are output in numeric
+form), :symbolic (entities are output in symbolic form if possible) or
+:as_char (entities are output as characters if possible, only available
+on Ruby 1.9).
+
+Default: :as_char
+Used by: HTML converter, kramdown converter
+EOF
+
+    define(:toc_levels, Object, (1..6).to_a, <<EOF) do |val|
+Defines the levels that are used for the table of contents
+
+The individual levels can be specified by separating them with commas
+(e.g. 1,2,3) or by using the range syntax (e.g. 1..3). Only the
+specified levels are used for the table of contents.
+
+Default: 1..6
+Used by: HTML/Latex converter
+EOF
+      case val
+      when String
+        if val =~ /^(\d)\.\.(\d)$/
+          val = Range.new($1.to_i, $2.to_i).to_a
+        elsif val =~ /^\d(?:,\d)*$/
+          val = val.split(/,/).map {|s| s.to_i}.uniq
+        else
+          raise Kramdown::Error, "Invalid syntax for option toc_levels"
+        end
+      when Array, Range
+        val = val.map {|s| s.to_i}.uniq
+      else
+        raise Kramdown::Error, "Invalid type #{val.class} for option toc_levels"
+      end
+      if val.any? {|i| !(1..6).include?(i)}
+        raise Kramdown::Error, "Level numbers for option toc_levels have to be integers from 1 to 6"
+      end
+      val
+    end
+
+    define(:line_width, Integer, 72, <<EOF)
+Defines the line width to be used when outputting a document
+
+Default: 72
+Used by: kramdown converter
+EOF
+
+    define(:latex_headers, Object, %w{section subsection subsubsection paragraph subparagraph subparagraph}, <<EOF) do |val|
+Defines the LaTeX commands for different header levels
+
+The commands for the header levels one to six can be specified by
+separating them with commas.
+
+Default: section,subsection,subsubsection,paragraph,subparagraph,subparagraph
+Used by: Latex converter
+EOF
+      simple_array_validator(val, :latex_headers, 6)
+    end
+
+    define(:smart_quotes, Object, %w{lsquo rsquo ldquo rdquo}, <<EOF) do |val|
+Defines the HTML entity names or code points for smart quote output
+
+The entities identified by entity name or code point that should be
+used for, in order, a left single quote, a right single quote, a left
+double and a right double quote are specified by separating them with
+commas.
+
+Default: lsquo,rsquo,ldquo,rdquo
+Used by: HTML/Latex converter
+EOF
+      val = simple_array_validator(val, :smart_quotes, 4)
+      val.map! {|v| Integer(v) rescue v}
+      val
+    end
+
+    define(:remove_block_html_tags, Boolean, true, <<EOF)
+Remove block HTML tags
+
+If this option is `true`, the RemoveHtmlTags converter removes
+block HTML tags.
+
+Default: true
+Used by: RemoveHtmlTags converter
+EOF
+
+    define(:remove_span_html_tags, Boolean, false, <<EOF)
+Remove span HTML tags
+
+If this option is `true`, the RemoveHtmlTags converter removes
+span HTML tags.
+
+Default: false
+Used by: RemoveHtmlTags converter
+EOF
+
+    define(:header_offset, Integer, 0, <<EOF)
+Sets the output offset for headers
+
+If this option is c (may also be negative) then a header with level n
+will be output as a header with level c+n. If c+n is lower than 1,
+level 1 will be used. If c+n is greater than 6, level 6 will be used.
+
+Default: 0
+Used by: HTML converter, Kramdown converter, Latex converter
+EOF
+
+    define(:hard_wrap, Boolean, true, <<EOF)
+Interprets line breaks literally
+
+Insert HTML `<br />` tags inside paragraphs where the original Markdown
+document had newlines (by default, Markdown ignores these newlines).
+
+Default: true
+Used by: GFM parser
+EOF
+
+    define(:syntax_highlighter, Symbol, :coderay, <<EOF)
+Set the syntax highlighter
+
+Specifies the syntax highlighter that should be used for highlighting
+code blocks and spans. If this option is set to +nil+, no syntax
+highlighting is done.
+
+Options for the syntax highlighter can be set with the
+syntax_highlighter_opts configuration option.
+
+Default: coderay
+Used by: HTML/Latex converter
+EOF
+
+    define(:syntax_highlighter_opts, Object, {}, <<EOF) do |val|
+Set the syntax highlighter options
+
+Specifies options for the syntax highlighter set via the
+syntax_highlighter configuration option.
+
+The value needs to be a hash with key-value pairs that are understood by
+the used syntax highlighter.
+
+Default: {}
+Used by: HTML/Latex converter
+EOF
+      val = simple_hash_validator(val, :syntax_highlighter_opts)
+      val.keys.each do |k|
+        val[k.kind_of?(String) ? str_to_sym(k) : k] = val.delete(k)
+      end
+      val
+    end
+
+    define(:math_engine, Symbol, :mathjax, <<EOF)
+Set the math engine
+
+Specifies the math engine that should be used for converting math
+blocks/spans. If this option is set to +nil+, no math engine is used and
+the math blocks/spans are output as is.
+
+Options for the selected math engine can be set with the
+math_engine_opts configuration option.
+
+Default: mathjax
+Used by: HTML converter
+EOF
+
+    define(:math_engine_opts, Object, {}, <<EOF) do |val|
+Set the math engine options
+
+Specifies options for the math engine set via the math_engine
+configuration option.
+
+The value needs to be a hash with key-value pairs that are understood by
+the used math engine.
+
+Default: {}
+Used by: HTML converter
+EOF
+      val = simple_hash_validator(val, :math_engine_opts)
+      val.keys.each do |k|
+        val[k.kind_of?(String) ? str_to_sym(k) : k] = val.delete(k)
+      end
+      val
+    end
+
+    define(:footnote_backlink, String, '&#8617;', <<EOF)
+Defines the text that should be used for the footnote backlinks
+
+The footnote backlink is just text, so any special HTML characters will
+be escaped.
+
+If the footnote backlint text is an empty string, no footnote backlinks
+will be generated.
+
+Default: '&8617;'
+Used by: HTML converter
+EOF
+
+    define(:gfm_quirks, Object, [:paragraph_end], <<EOF) do |val|
+Enables a set of GFM specific quirks
+
+The way how GFM is transformed on Github often differs from the way
+kramdown does things. Many of these differences are negligible but
+others are not.
+
+This option allows one to enable/disable certain GFM quirks, i.e. ways
+in which GFM parsing differs from kramdown parsing.
+
+The value has to be a list of quirk names that should be enabled,
+separated by commas. Possible names are:
+
+* paragraph_end
+
+  Disables the kramdown restriction that at least one blank line has to
+  be used after a paragraph before a new block element can be started.
+
+  Note that if this quirk is used, lazy line wrapping does not fully
+  work anymore!
+
+Default: paragraph_end
+Used by: GFM parser
+EOF
+      val = simple_array_validator(val, :gfm_quirks)
+      val.map! {|v| str_to_sym(v.to_s)}
+      val
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser.rb
new file mode 100644
index 0000000..59a9946
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser.rb
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+
+  # This module contains all available parsers. A parser takes an input string and converts the
+  # string to an element tree.
+  #
+  # New parsers should be derived from the Base class which provides common functionality - see its
+  # API documentation for how to create a custom converter class.
+  module Parser
+
+    autoload :Base, 'kramdown/parser/base'
+    autoload :Kramdown, 'kramdown/parser/kramdown'
+    autoload :Html, 'kramdown/parser/html'
+    autoload :Markdown, 'kramdown/parser/markdown'
+    autoload :GFM, 'kramdown/parser/gfm'
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/base.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/base.rb
new file mode 100644
index 0000000..4044aa2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/base.rb
@@ -0,0 +1,134 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/utils'
+require 'kramdown/parser'
+
+module Kramdown
+
+  module Parser
+
+    # == \Base class for parsers
+    #
+    # This class serves as base class for parsers. It provides common methods that can/should be
+    # used by all parsers, especially by those using StringScanner(Kramdown) for parsing.
+    #
+    # A parser object is used as a throw-away object, i.e. it is only used for storing the needed
+    # state information during parsing. Therefore one can't instantiate a parser object directly but
+    # only use the Base::parse method.
+    #
+    # == Implementing a parser
+    #
+    # Implementing a new parser is rather easy: just derive a new class from this class and put it
+    # in the Kramdown::Parser module -- the latter is needed so that the auto-detection of the new
+    # parser works correctly. Then you need to implement the +#parse+ method which has to contain
+    # the parsing code.
+    #
+    # Have a look at the Base::parse, Base::new and Base#parse methods for additional information!
+    class Base
+
+      # The hash with the parsing options.
+      attr_reader :options
+
+      # The array with the parser warnings.
+      attr_reader :warnings
+
+      # The original source string.
+      attr_reader :source
+
+      # The root element of element tree that is created from the source string.
+      attr_reader :root
+
+      # Initialize the parser object with the +source+ string and the parsing +options+.
+      #
+      # The @root element, the @warnings array and @text_type (specifies the default type for newly
+      # created text nodes) are automatically initialized.
+      def initialize(source, options)
+        @source = source
+        @options = Kramdown::Options.merge(options)
+        @root = Element.new(:root, nil, nil, :encoding => (source.encoding rescue nil), :location => 1,
+                            :options => {}, :abbrev_defs => {}, :abbrev_attr => {})
+        @warnings = []
+        @text_type = :text
+      end
+      private_class_method(:new, :allocate)
+
+      # Parse the +source+ string into an element tree, possibly using the parsing +options+, and
+      # return the root element of the element tree and an array with warning messages.
+      #
+      # Initializes a new instance of the calling class and then calls the +#parse+ method that must
+      # be implemented by each subclass.
+      def self.parse(source, options = {})
+        parser = new(source, options)
+        parser.parse
+        [parser.root, parser.warnings]
+      end
+
+      # Parse the source string into an element tree.
+      #
+      # The parsing code should parse the source provided in @source and build an element tree the
+      # root of which should be @root.
+      #
+      # This is the only method that has to be implemented by sub-classes!
+      def parse
+        raise NotImplementedError
+      end
+
+      # Add the given warning +text+ to the warning array.
+      def warning(text)
+        @warnings << text
+        #TODO: add position information
+      end
+
+      # Modify the string +source+ to be usable by the parser (unifies line ending characters to
+      # +\n+ and makes sure +source+ ends with a new line character).
+      def adapt_source(source)
+        if source.respond_to?(:encode)
+          if !source.valid_encoding?
+            raise "The source text contains invalid characters for the used encoding #{source.encoding}"
+          end
+          source = source.encode('UTF-8')
+        end
+        source.gsub(/\r\n?/, "\n").chomp + "\n"
+      end
+
+      # This helper method adds the given +text+ either to the last element in the +tree+ if it is a
+      # +type+ element or creates a new text element with the given +type+.
+      def add_text(text, tree = @tree, type = @text_type)
+        last = tree.children.last
+        if last && last.type == type
+          last.value << text
+        elsif !text.empty?
+          tree.children << Element.new(type, text, nil, :location => (last && last.options[:location] || tree.options[:location]))
+        end
+      end
+
+      # Extract the part of the StringScanner +strscan+ backed string specified by the +range+. This
+      # method works correctly under Ruby 1.8 and Ruby 1.9.
+      def extract_string(range, strscan)
+        result = nil
+        if strscan.string.respond_to?(:encoding)
+          begin
+            enc = strscan.string.encoding
+            strscan.string.force_encoding('ASCII-8BIT')
+            result = strscan.string[range].force_encoding(enc)
+          ensure
+            strscan.string.force_encoding(enc)
+          end
+        else
+          result = strscan.string[range]
+        end
+        result
+      end
+
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/gfm.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/gfm.rb
new file mode 100644
index 0000000..0299273
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/gfm.rb
@@ -0,0 +1,168 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+
+require 'kramdown/parser'
+
+module Kramdown
+  module Parser
+    class GFM < Kramdown::Parser::Kramdown
+
+      def initialize(source, options)
+        super
+        @options[:auto_id_stripping] = true
+        @id_counter = Hash.new(-1)
+
+        @span_parsers.delete(:line_break) if @options[:hard_wrap]
+        if @options[:gfm_quirks].include?(:paragraph_end)
+          atx_header_parser = :atx_header_gfm_quirk
+          @paragraph_end = self.class::PARAGRAPH_END_GFM
+        else
+          atx_header_parser = :atx_header_gfm
+          @paragraph_end = self.class::PARAGRAPH_END
+        end
+
+        {:codeblock_fenced => :codeblock_fenced_gfm,
+          :atx_header => atx_header_parser}.each do |current, replacement|
+          i = @block_parsers.index(current)
+          @block_parsers.delete(current)
+          @block_parsers.insert(i, replacement)
+        end
+
+        i = @span_parsers.index(:escaped_chars)
+        @span_parsers[i] = :escaped_chars_gfm if i
+        @span_parsers << :strikethrough_gfm
+      end
+
+      def parse
+        super
+        update_elements(@root)
+      end
+
+      def update_elements(element)
+        element.children.map! do |child|
+          if child.type == :text && @options[:hard_wrap] && child.value =~ /\n/
+            children = []
+            lines = child.value.split(/\n/, -1)
+            omit_trailing_br = (Kramdown::Element.category(element) == :block && element.children[-1] == child &&
+                                lines[-1].empty?)
+            lines.each_with_index do |line, index|
+              new_element_options = { :location => child.options[:location] + index }
+
+              children << Element.new(:text, (index > 0 ? "\n#{line}" : line), nil, new_element_options)
+              children << Element.new(:br, nil, nil, new_element_options) if index < lines.size - 2 ||
+                (index == lines.size - 2 && !omit_trailing_br)
+            end
+            children
+          elsif child.type == :html_element
+            child
+          elsif child.type == :header && @options[:auto_ids] && !child.attr.has_key?('id')
+            child.attr['id'] = generate_gfm_header_id(child.options[:raw_text])
+            child
+          else
+            update_elements(child)
+            child
+          end
+        end.flatten!
+      end
+
+      # Update the raw text for automatic ID generation.
+      def update_raw_text(item)
+        raw_text = ''
+
+        append_text = lambda do |child|
+          if child.type == :text || child.type == :codespan || child.type ==:math
+            raw_text << child.value
+          elsif child.type == :entity
+            raw_text << child.value.char
+          elsif child.type == :smart_quote
+            raw_text << ::Kramdown::Utils::Entities.entity(child.value.to_s).char
+          elsif child.type == :typographic_sym
+            if child.value == :laquo_space
+              raw_text << "« "
+            elsif child.value == :raquo_space
+              raw_text << " »"
+            else
+              raw_text << ::Kramdown::Utils::Entities.entity(child.value.to_s).char
+            end
+          else
+            child.children.each {|c| append_text.call(c)}
+          end
+        end
+
+        append_text.call(item)
+        item.options[:raw_text] = raw_text
+      end
+
+      NON_WORD_RE = (RUBY_VERSION > "1.9" ? /[^\p{Word}\- \t]/ : /[^\w\- \t]/)
+
+      def generate_gfm_header_id(text)
+        result = text.downcase
+        result.gsub!(NON_WORD_RE, '')
+        result.tr!(" \t", '-')
+        @id_counter[result] += 1
+        result << (@id_counter[result] > 0 ? "-#{@id_counter[result]}" : '')
+        @options[:auto_id_prefix] + result
+      end
+
+      ATX_HEADER_START = /^\#{1,6}\s/
+      define_parser(:atx_header_gfm, ATX_HEADER_START, nil, 'parse_atx_header')
+      define_parser(:atx_header_gfm_quirk, ATX_HEADER_START)
+
+      # Copied from kramdown/parser/kramdown/header.rb, removed the first line
+      def parse_atx_header_gfm_quirk
+        start_line_number = @src.current_line_number
+        @src.check(ATX_HEADER_MATCH)
+        level, text, id = @src[1], @src[2].to_s.strip, @src[3]
+        return false if text.empty?
+
+        @src.pos += @src.matched_size
+        el = new_block_el(:header, nil, nil, :level => level.length, :raw_text => text, :location => start_line_number)
+        add_text(text, el)
+        el.attr['id'] = id if id
+        @tree.children << el
+        true
+      end
+
+      FENCED_CODEBLOCK_START = /^[ ]{0,3}[~`]{3,}/
+      FENCED_CODEBLOCK_MATCH = /^[ ]{0,3}(([~`]){3,})\s*?((\S+?)(?:\?\S*)?)?\s*?\n(.*?)^[ ]{0,3}\1\2*\s*?\n/m
+      define_parser(:codeblock_fenced_gfm, FENCED_CODEBLOCK_START, nil, 'parse_codeblock_fenced')
+
+      STRIKETHROUGH_DELIM = /~~/
+      STRIKETHROUGH_MATCH = /#{STRIKETHROUGH_DELIM}[^\s~](.*?)[^\s~]#{STRIKETHROUGH_DELIM}/m
+      define_parser(:strikethrough_gfm, STRIKETHROUGH_MATCH, '~~')
+
+      def parse_strikethrough_gfm
+        line_number = @src.current_line_number
+
+        @src.pos += @src.matched_size
+        el = Element.new(:html_element, 'del', {}, :category => :span, :line => line_number)
+        @tree.children << el
+
+        env = save_env
+        reset_env(:src => Kramdown::Utils::StringScanner.new(@src.matched[2..-3], line_number),
+                  :text_type => :text)
+        parse_spans(el)
+        restore_env(env)
+
+        el
+      end
+
+      ESCAPED_CHARS_GFM = /\\([\\.*_+`<>()\[\]{}#!:\|"'\$=\-~])/
+      define_parser(:escaped_chars_gfm, ESCAPED_CHARS_GFM, '\\\\', :parse_escaped_chars)
+
+      PARAGRAPH_END_GFM = /#{LAZY_END}|#{LIST_START}|#{ATX_HEADER_START}|#{DEFINITION_LIST_START}|#{BLOCKQUOTE_START}|#{FENCED_CODEBLOCK_START}/
+
+      def paragraph_end
+        @paragraph_end
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/html.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/html.rb
new file mode 100644
index 0000000..8a10a3c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/html.rb
@@ -0,0 +1,600 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'rexml/parsers/baseparser'
+require 'strscan'
+require 'kramdown/utils'
+require 'kramdown/parser'
+
+module Kramdown
+
+  module Parser
+
+    # Used for parsing a HTML document.
+    #
+    # The parsing code is in the Parser module that can also be used by other parsers.
+    class Html < Base
+
+      # Contains all constants that are used when parsing.
+      module Constants
+
+        #:stopdoc:
+        # The following regexps are based on the ones used by REXML, with some slight modifications.
+        HTML_DOCTYPE_RE = /<!DOCTYPE.*?>/im
+        HTML_COMMENT_RE = /<!--(.*?)-->/m
+        HTML_INSTRUCTION_RE = /<\?(.*?)\?>/m
+        HTML_ATTRIBUTE_RE = /\s*(#{REXML::Parsers::BaseParser::UNAME_STR})(?:\s*=\s*(["'])(.*?)\2)?/m
+        HTML_TAG_RE = /<((?>#{REXML::Parsers::BaseParser::UNAME_STR}))\s*((?>\s+#{REXML::Parsers::BaseParser::UNAME_STR}(?:\s*=\s*(["']).*?\3)?)*)\s*(\/)?>/m
+        HTML_TAG_CLOSE_RE = /<\/(#{REXML::Parsers::BaseParser::UNAME_STR})\s*>/m
+        HTML_ENTITY_RE = /&([\w:][\-\w\.:]*);|&#(\d+);|&\#x([0-9a-fA-F]+);/
+
+        HTML_CONTENT_MODEL_BLOCK = %w{address applet article aside blockquote body
+             dd details div dl fieldset figure figcaption footer form header hgroup iframe li main
+             map menu nav noscript object section summary td}
+        HTML_CONTENT_MODEL_SPAN  = %w{a abbr acronym b bdo big button cite caption del dfn dt em
+             h1 h2 h3 h4 h5 h6 i ins label legend optgroup p q rb rbc
+             rp rt rtc ruby select small span strong sub sup th tt}
+        HTML_CONTENT_MODEL_RAW   = %w{script style math option textarea pre code kbd samp var}
+        # The following elements are also parsed as raw since they need child elements that cannot
+        # be expressed using kramdown syntax: colgroup table tbody thead tfoot tr ul ol
+
+        HTML_CONTENT_MODEL = Hash.new {|h,k| h[k] = :raw}
+        HTML_CONTENT_MODEL_BLOCK.each {|i| HTML_CONTENT_MODEL[i] = :block}
+        HTML_CONTENT_MODEL_SPAN.each {|i| HTML_CONTENT_MODEL[i] = :span}
+        HTML_CONTENT_MODEL_RAW.each {|i| HTML_CONTENT_MODEL[i] = :raw}
+
+        # Some HTML elements like script belong to both categories (i.e. are valid in block and
+        # span HTML) and don't appear therefore!
+        # script, textarea
+        HTML_SPAN_ELEMENTS = %w{a abbr acronym b big bdo br button cite code del dfn em i img input
+                              ins kbd label mark option q rb rbc rp rt rtc ruby samp select small span
+                              strong sub sup tt u var}
+        HTML_BLOCK_ELEMENTS = %w{address article aside applet body blockquote caption col colgroup dd div dl dt fieldset
+                               figcaption footer form h1 h2 h3 h4 h5 h6 header hgroup hr html head iframe legend menu
+                               li main map nav ol optgroup p pre section summary table tbody td th thead tfoot tr ul}
+        HTML_ELEMENTS_WITHOUT_BODY = %w{area base br col command embed hr img input keygen link meta param source track wbr}
+
+        HTML_ELEMENT = Hash.new(false)
+        (HTML_SPAN_ELEMENTS + HTML_BLOCK_ELEMENTS + HTML_ELEMENTS_WITHOUT_BODY +
+         HTML_CONTENT_MODEL.keys).each do |a|
+          HTML_ELEMENT[a] = true
+        end
+      end
+
+
+      # Contains the parsing methods. This module can be mixed into any parser to get HTML parsing
+      # functionality. The only thing that must be provided by the class are instance variable
+      # @stack for storing the needed state and @src (instance of StringScanner) for the actual
+      # parsing.
+      module Parser
+
+        include Constants
+
+        # Process the HTML start tag that has already be scanned/checked via @src.
+        #
+        # Does the common processing steps and then yields to the caller for further processing
+        # (first parameter is the created element; the second parameter is +true+ if the HTML
+        # element is already closed, ie. contains no body; the third parameter specifies whether the
+        # body - and the end tag - need to be handled in case closed=false).
+        def handle_html_start_tag(line = nil) # :yields: el, closed, handle_body
+          name = @src[1]
+          name.downcase! if HTML_ELEMENT[name.downcase]
+          closed = !@src[4].nil?
+          attrs = parse_html_attributes(@src[2], line, HTML_ELEMENT[name])
+
+          el = Element.new(:html_element, name, attrs, :category => :block)
+          el.options[:location] = line if line
+          @tree.children << el
+
+          if !closed && HTML_ELEMENTS_WITHOUT_BODY.include?(el.value)
+            closed = true
+          end
+          if name == 'script' || name == 'style'
+            handle_raw_html_tag(name)
+            yield(el, false, false)
+          else
+            yield(el, closed, true)
+          end
+        end
+
+        # Parses the given string for HTML attributes and returns the resulting hash.
+        #
+        # If the optional +line+ parameter is supplied, it is used in warning messages.
+        #
+        # If the optional +in_html_tag+ parameter is set to +false+, attributes are not modified to
+        # contain only lowercase letters.
+        def parse_html_attributes(str, line = nil, in_html_tag = true)
+          attrs = Utils::OrderedHash.new
+          str.scan(HTML_ATTRIBUTE_RE).each do |attr, sep, val|
+            attr.downcase! if in_html_tag
+            if attrs.has_key?(attr)
+              warning("Duplicate HTML attribute '#{attr}' on line #{line || '?'} - overwriting previous one")
+            end
+            attrs[attr] = val || ""
+          end
+          attrs
+        end
+
+        # Handle the raw HTML tag at the current position.
+        def handle_raw_html_tag(name)
+          curpos = @src.pos
+          if @src.scan_until(/(?=<\/#{name}\s*>)/mi)
+            add_text(extract_string(curpos...@src.pos, @src), @tree.children.last, :raw)
+            @src.scan(HTML_TAG_CLOSE_RE)
+          else
+            add_text(@src.rest, @tree.children.last, :raw)
+            @src.terminate
+            warning("Found no end tag for '#{name}' - auto-closing it")
+          end
+        end
+
+        HTML_RAW_START = /(?=<(#{REXML::Parsers::BaseParser::UNAME_STR}|\/|!--|\?))/ # :nodoc:
+
+        # Parse raw HTML from the current source position, storing the found elements in +el+.
+        # Parsing continues until one of the following criteria are fulfilled:
+        #
+        # - The end of the document is reached.
+        # - The matching end tag for the element +el+ is found (only used if +el+ is an HTML
+        #   element).
+        #
+        # When an HTML start tag is found, processing is deferred to #handle_html_start_tag,
+        # providing the block given to this method.
+        def parse_raw_html(el, &block)
+          @stack.push(@tree)
+          @tree = el
+
+          done = false
+          while !@src.eos? && !done
+            if result = @src.scan_until(HTML_RAW_START)
+              add_text(result, @tree, :text)
+              line = @src.current_line_number
+              if result = @src.scan(HTML_COMMENT_RE)
+                @tree.children << Element.new(:xml_comment, result, nil, :category => :block, :location => line)
+              elsif result = @src.scan(HTML_INSTRUCTION_RE)
+                @tree.children << Element.new(:xml_pi, result, nil, :category => :block, :location => line)
+              elsif @src.scan(HTML_TAG_RE)
+                if method(:handle_html_start_tag).arity.abs >= 1
+                  handle_html_start_tag(line, &block)
+                else
+                  handle_html_start_tag(&block) # DEPRECATED: method needs to accept line number in 2.0
+                end
+              elsif @src.scan(HTML_TAG_CLOSE_RE)
+                if @tree.value == (HTML_ELEMENT[@tree.value] ? @src[1].downcase : @src[1])
+                  done = true
+                else
+                  add_text(@src.matched, @tree, :text)
+                  warning("Found invalidly used HTML closing tag for '#{@src[1]}' on line #{line} - ignoring it")
+                end
+              else
+                add_text(@src.getch, @tree, :text)
+              end
+            else
+              add_text(@src.rest, @tree, :text)
+              @src.terminate
+              warning("Found no end tag for '#{@tree.value}' on line #{@tree.options[:location]} - auto-closing it") if @tree.type == :html_element
+              done = true
+            end
+          end
+
+          @tree = @stack.pop
+        end
+
+      end
+
+
+      # Converts HTML elements to native elements if possible.
+      class ElementConverter
+
+        # :stopdoc:
+
+        include Constants
+        include ::Kramdown::Utils::Entities
+
+        REMOVE_TEXT_CHILDREN =  %w{html head hgroup ol ul dl table colgroup tbody thead tfoot tr select optgroup}
+        WRAP_TEXT_CHILDREN = %w{body section nav article aside header footer address div li dd blockquote figure
+                                figcaption fieldset form}
+        REMOVE_WHITESPACE_CHILDREN = %w{body section nav article aside header footer address
+                                        div li dd blockquote figure figcaption td th fieldset form}
+        STRIP_WHITESPACE = %w{address article aside blockquote body caption dd div dl dt fieldset figcaption form footer
+                              header h1 h2 h3 h4 h5 h6 legend li nav p section td th}
+        SIMPLE_ELEMENTS = %w{em strong blockquote hr br img p thead tbody tfoot tr td th ul ol dl li dl dt dd}
+
+        def initialize(root)
+          @root = root
+        end
+
+        def self.convert(root, el = root)
+          new(root).process(el)
+        end
+
+        # Convert the element +el+ and its children.
+        def process(el, do_conversion = true, preserve_text = false, parent = nil)
+          case el.type
+          when :xml_comment, :xml_pi
+            ptype = if parent.nil?
+                      'div'
+                    else
+                      case parent.type
+                      when :html_element then parent.value
+                      when :code_span then 'code'
+                      when :code_block then 'pre'
+                      when :header then 'h1'
+                      else parent.type.to_s
+                      end
+                    end
+            el.options.replace({:category => (HTML_CONTENT_MODEL[ptype] == :span ? :span : :block)})
+            return
+          when :html_element
+          when :root
+            el.children.each {|c| process(c)}
+            remove_whitespace_children(el)
+            return
+          else return
+          end
+
+          mname = "convert_#{el.value}"
+          if do_conversion && self.class.method_defined?(mname)
+            send(mname, el)
+          else
+            type = el.value
+            remove_text_children(el) if do_conversion && REMOVE_TEXT_CHILDREN.include?(type)
+
+            if do_conversion && SIMPLE_ELEMENTS.include?(type)
+              set_basics(el, type.intern)
+              process_children(el, do_conversion, preserve_text)
+            else
+              process_html_element(el, do_conversion, preserve_text)
+            end
+
+            if do_conversion
+              strip_whitespace(el) if STRIP_WHITESPACE.include?(type)
+              remove_whitespace_children(el) if REMOVE_WHITESPACE_CHILDREN.include?(type)
+              wrap_text_children(el) if WRAP_TEXT_CHILDREN.include?(type)
+            end
+          end
+        end
+
+        def process_children(el, do_conversion = true, preserve_text = false)
+          el.children.map! do |c|
+            if c.type == :text
+              process_text(c.value, preserve_text || !do_conversion)
+            else
+              process(c, do_conversion, preserve_text, el)
+              c
+            end
+          end.flatten!
+        end
+
+        # Process the HTML text +raw+: compress whitespace (if +preserve+ is +false+) and convert
+        # entities in entity elements.
+        def process_text(raw, preserve = false)
+          raw.gsub!(/\s+/, ' ') unless preserve
+          src = Kramdown::Utils::StringScanner.new(raw)
+          result = []
+          while !src.eos?
+            if tmp = src.scan_until(/(?=#{HTML_ENTITY_RE})/)
+              result << Element.new(:text, tmp)
+              src.scan(HTML_ENTITY_RE)
+              val = src[1] || (src[2] && src[2].to_i) || src[3].hex
+              result << if %w{lsquo rsquo ldquo rdquo}.include?(val)
+                          Element.new(:smart_quote, val.intern)
+                        elsif %w{mdash ndash hellip laquo raquo}.include?(val)
+                          Element.new(:typographic_sym, val.intern)
+                        else
+                          begin
+                            Element.new(:entity, entity(val), nil, :original => src.matched)
+                          rescue ::Kramdown::Error
+                            src.pos -= src.matched_size - 1
+                            Element.new(:entity, ::Kramdown::Utils::Entities.entity('amp'))
+                          end
+                        end
+            else
+              result << Element.new(:text, src.rest)
+              src.terminate
+            end
+          end
+          result
+        end
+
+        def process_html_element(el, do_conversion = true, preserve_text = false)
+          el.options.replace(:category => HTML_SPAN_ELEMENTS.include?(el.value) ? :span : :block,
+                             :content_model => (do_conversion ? HTML_CONTENT_MODEL[el.value] : :raw))
+          process_children(el, do_conversion, preserve_text)
+        end
+
+        def remove_text_children(el)
+          el.children.delete_if {|c| c.type == :text}
+        end
+
+        def wrap_text_children(el)
+          tmp = []
+          last_is_p = false
+          el.children.each do |c|
+            if Element.category(c) != :block || c.type == :text
+              if !last_is_p
+                tmp << Element.new(:p, nil, nil, :transparent => true)
+                last_is_p = true
+              end
+              tmp.last.children << c
+              tmp
+            else
+              tmp << c
+              last_is_p = false
+            end
+          end
+          el.children = tmp
+        end
+
+        def strip_whitespace(el)
+          return if el.children.empty?
+          if el.children.first.type == :text
+            el.children.first.value.lstrip!
+          end
+          if el.children.last.type == :text
+            el.children.last.value.rstrip!
+          end
+        end
+
+        def remove_whitespace_children(el)
+          i = -1
+          el.children = el.children.reject do |c|
+            i += 1
+            c.type == :text && c.value.strip.empty? &&
+              (i == 0 || i == el.children.length - 1 || (Element.category(el.children[i-1]) == :block &&
+                                                         Element.category(el.children[i+1]) == :block))
+          end
+        end
+
+        def set_basics(el, type, opts = {})
+          el.type = type
+          el.options.replace(opts)
+          el.value = nil
+        end
+
+        def extract_text(el, raw)
+          raw << el.value.to_s if el.type == :text
+          el.children.each {|c| extract_text(c, raw)}
+        end
+
+        def convert_textarea(el)
+          process_html_element(el, true, true)
+        end
+
+        def convert_a(el)
+          if el.attr['href']
+            set_basics(el, :a)
+            process_children(el)
+          else
+            process_html_element(el, false)
+          end
+        end
+
+        EMPHASIS_TYPE_MAP = {'em' => :em, 'i' => :em, 'strong' => :strong, 'b' => :strong}
+        def convert_em(el)
+          text = ''
+          extract_text(el, text)
+          if text =~ /\A\s/ || text =~ /\s\z/
+            process_html_element(el, false)
+          else
+            set_basics(el, EMPHASIS_TYPE_MAP[el.value])
+            process_children(el)
+          end
+        end
+        %w{b strong i}.each do |i|
+          alias_method("convert_#{i}".to_sym, :convert_em)
+        end
+
+        def convert_h1(el)
+          set_basics(el, :header, :level => el.value[1..1].to_i)
+          extract_text(el, el.options[:raw_text] = '')
+          process_children(el)
+        end
+        %w{h2 h3 h4 h5 h6}.each do |i|
+          alias_method("convert_#{i}".to_sym, :convert_h1)
+        end
+
+        def convert_code(el)
+          raw = ''
+          extract_text(el, raw)
+          result = process_text(raw, true)
+          begin
+            str = result.inject('') do |mem, c|
+              if c.type == :text
+                mem << c.value
+              elsif c.type == :entity
+                if [60, 62, 34, 38].include?(c.value.code_point)
+                  mem << c.value.code_point.chr
+                else
+                  mem << c.value.char
+                end
+              elsif c.type == :smart_quote || c.type == :typographic_sym
+                mem << entity(c.value.to_s).char
+              else
+                raise "Bug - please report"
+              end
+            end
+            result.clear
+            result << Element.new(:text, str)
+          rescue
+          end
+          if result.length > 1 || result.first.type != :text
+            process_html_element(el, false, true)
+          else
+            if el.value == 'code'
+              set_basics(el, :codespan)
+              el.attr['class'].gsub!(/\s+\bhighlighter-\w+\b|\bhighlighter-\w+\b\s*/, '') if el.attr['class']
+            else
+              set_basics(el, :codeblock)
+              if el.children.size == 1 && el.children.first.value == 'code'
+                value = (el.children.first.attr['class'] || '').scan(/\blanguage-\S+/).first
+                el.attr['class'] = "#{value} #{el.attr['class']}".rstrip if value
+              end
+            end
+            el.value = result.first.value
+            el.children.clear
+          end
+        end
+        alias :convert_pre :convert_code
+
+        def convert_table(el)
+          if !is_simple_table?(el)
+            process_html_element(el, false)
+            return
+          end
+          remove_text_children(el)
+          process_children(el)
+          set_basics(el, :table)
+
+          calc_alignment = lambda do |c|
+            if c.type == :tr
+              el.options[:alignment] = c.children.map do |td|
+                if td.attr['style']
+                  td.attr['style'].slice!(/(?:;\s*)?text-align:\s+(center|left|right)/)
+                  td.attr.delete('style') if td.attr['style'].strip.empty?
+                  $1 ? $1.to_sym : :default
+                else
+                  :default
+                end
+              end
+            else
+              c.children.each {|cc| calc_alignment.call(cc)}
+            end
+          end
+          calc_alignment.call(el)
+          el.children.delete_if {|c| c.type == :html_element}
+
+          change_th_type = lambda do |c|
+            if c.type == :th
+              c.type = :td
+            else
+              c.children.each {|cc| change_th_type.call(cc)}
+            end
+          end
+          change_th_type.call(el)
+
+          if el.children.first.type == :tr
+            tbody = Element.new(:tbody)
+            tbody.children = el.children
+            el.children = [tbody]
+          end
+        end
+
+        def is_simple_table?(el)
+          only_phrasing_content = lambda do |c|
+            c.children.all? do |cc|
+              (cc.type == :text || !HTML_BLOCK_ELEMENTS.include?(cc.value)) && only_phrasing_content.call(cc)
+            end
+          end
+          check_cells = Proc.new do |c|
+            if c.value == 'th' || c.value == 'td'
+              return false if !only_phrasing_content.call(c)
+            else
+              c.children.each {|cc| check_cells.call(cc)}
+            end
+          end
+          check_cells.call(el)
+
+          nr_cells = 0
+          check_nr_cells = lambda do |t|
+            if t.value == 'tr'
+              count = t.children.select {|cc| cc.value == 'th' || cc.value == 'td'}.length
+              if count != nr_cells
+                if nr_cells == 0
+                  nr_cells = count
+                else
+                  nr_cells = -1
+                  break
+                end
+              end
+            else
+              t.children.each {|cc| check_nr_cells.call(cc)}
+            end
+          end
+          check_nr_cells.call(el)
+          return false if nr_cells == -1
+
+          alignment = nil
+          check_alignment = Proc.new do |t|
+            if t.value == 'tr'
+              cur_alignment = t.children.select {|cc| cc.value == 'th' || cc.value == 'td'}.map do |cell|
+                md = /text-align:\s+(center|left|right|justify|inherit)/.match(cell.attr['style'].to_s)
+                return false if md && (md[1] == 'justify' || md[1] == 'inherit')
+                md.nil? ? :default : md[1]
+              end
+              alignment = cur_alignment if alignment.nil?
+              return false if alignment != cur_alignment
+            else
+              t.children.each {|cc| check_alignment.call(cc)}
+            end
+          end
+          check_alignment.call(el)
+
+          check_rows = lambda do |t, type|
+            t.children.all? {|r| (r.value == 'tr' || r.type == :text) && r.children.all? {|c| c.value == type || c.type == :text}}
+          end
+          check_rows.call(el, 'td') ||
+            (el.children.all? do |t|
+               t.type == :text || (t.value == 'thead' && check_rows.call(t, 'th')) ||
+                 ((t.value == 'tfoot' || t.value == 'tbody') && check_rows.call(t, 'td'))
+             end && el.children.any? {|t| t.value == 'tbody'})
+        end
+
+        def convert_script(el)
+          if !is_math_tag?(el)
+            process_html_element(el)
+          else
+            handle_math_tag(el)
+          end
+        end
+
+        def is_math_tag?(el)
+          el.attr['type'].to_s =~ /\bmath\/tex\b/
+        end
+
+        def handle_math_tag(el)
+          set_basics(el, :math, :category => (el.attr['type'] =~ /mode=display/ ? :block : :span))
+          el.value = el.children.shift.value.sub(/\A(?:%\s*)?<!\[CDATA\[\n?(.*?)(?:\s%)?\]\]>\z/m, '\1')
+          el.attr.delete('type')
+        end
+
+      end
+
+      include Parser
+
+      # Parse the source string provided on initialization as HTML document.
+      def parse
+        @stack, @tree = [], @root
+        @src = Kramdown::Utils::StringScanner.new(adapt_source(source))
+
+        while true
+          if result = @src.scan(/\s*#{HTML_INSTRUCTION_RE}/)
+            @tree.children << Element.new(:xml_pi, result.strip, nil, :category => :block)
+          elsif result = @src.scan(/\s*#{HTML_DOCTYPE_RE}/)
+            # ignore the doctype
+          elsif result = @src.scan(/\s*#{HTML_COMMENT_RE}/)
+            @tree.children << Element.new(:xml_comment, result.strip, nil, :category => :block)
+          else
+            break
+          end
+        end
+
+        tag_handler = lambda do |c, closed, handle_body|
+          parse_raw_html(c, &tag_handler) if !closed && handle_body
+        end
+        parse_raw_html(@tree, &tag_handler)
+
+        ElementConverter.convert(@tree)
+      end
+
+    end
+
+  end
+
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown.rb
new file mode 100644
index 0000000..4668e6d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown.rb
@@ -0,0 +1,368 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'strscan'
+require 'stringio'
+require 'kramdown/parser'
+
+#TODO: use [[:alpha:]] in all regexp to allow parsing of international values in 1.9.1
+#NOTE: use @src.pre_match only before other check/match?/... operations, otherwise the content is changed
+
+module Kramdown
+
+  module Parser
+
+    # Used for parsing a document in kramdown format.
+    #
+    # If you want to extend the functionality of the parser, you need to do the following:
+    #
+    # * Create a new subclass
+    # * add the needed parser methods
+    # * modify the @block_parsers and @span_parsers variables and add the names of your parser
+    #   methods
+    #
+    # Here is a small example for an extended parser class that parses ERB style tags as raw text if
+    # they are used as span-level elements (an equivalent block-level parser should probably also be
+    # made to handle the block case):
+    #
+    #   require 'kramdown/parser/kramdown'
+    #
+    #   class Kramdown::Parser::ERBKramdown < Kramdown::Parser::Kramdown
+    #
+    #      def initialize(source, options)
+    #        super
+    #        @span_parsers.unshift(:erb_tags)
+    #      end
+    #
+    #      ERB_TAGS_START = /<%.*?%>/
+    #
+    #      def parse_erb_tags
+    #        @src.pos += @src.matched_size
+    #        @tree.children << Element.new(:raw, @src.matched)
+    #      end
+    #      define_parser(:erb_tags, ERB_TAGS_START, '<%')
+    #
+    #   end
+    #
+    # The new parser can be used like this:
+    #
+    #   require 'kramdown/document'
+    #   # require the file with the above parser class
+    #
+    #   Kramdown::Document.new(input_text, :input => 'ERBKramdown').to_html
+    #
+    class Kramdown < Base
+
+      include ::Kramdown
+
+      # Create a new Kramdown parser object with the given +options+.
+      def initialize(source, options)
+        super
+
+        reset_env
+
+        @alds = {}
+        @footnotes = {}
+        @link_defs = {}
+        update_link_definitions(@options[:link_defs])
+
+        @block_parsers = [:blank_line, :codeblock, :codeblock_fenced, :blockquote, :atx_header,
+                          :horizontal_rule, :list, :definition_list, :block_html, :setext_header,
+                          :block_math, :table, :footnote_definition, :link_definition, :abbrev_definition,
+                          :block_extensions, :eob_marker, :paragraph]
+        @span_parsers =  [:emphasis, :codespan, :autolink, :span_html, :footnote_marker, :link, :smart_quotes, :inline_math,
+                         :span_extensions, :html_entity, :typographic_syms, :line_break, :escaped_chars]
+
+      end
+      private_class_method(:new, :allocate)
+
+
+      # The source string provided on initialization is parsed into the @root element.
+      def parse
+        configure_parser
+        parse_blocks(@root, adapt_source(source))
+        update_tree(@root)
+        correct_abbreviations_attributes
+        replace_abbreviations(@root)
+        @footnotes.each {|name,data| update_tree(data[:content])}
+        @footnotes.each do |name, data|
+          next if data.key?(:marker)
+          line = data[:content].options[:location]
+          warning("Footnote definition for '#{name}' on line #{line} is unreferenced - ignoring")
+        end
+      end
+
+      #######
+      protected
+      #######
+
+      # :doc:
+      #
+      # Update the parser specific link definitions with the data from +link_defs+ (the value of the
+      # :link_defs option).
+      #
+      # The parameter +link_defs+ is a hash where the keys are possibly unnormalized link IDs and
+      # the values are two element arrays consisting of the link target and a title (can be +nil+).
+      def update_link_definitions(link_defs)
+        link_defs.each {|k,v| @link_defs[normalize_link_id(k)] = v}
+      end
+
+      # Adapt the object to allow parsing like specified in the options.
+      def configure_parser
+        @parsers = {}
+        (@block_parsers + @span_parsers).each do |name|
+          if self.class.has_parser?(name)
+            @parsers[name] = self.class.parser(name)
+          else
+            raise Kramdown::Error, "Unknown parser: #{name}"
+          end
+        end
+        @span_start, @span_start_re = span_parser_regexps
+      end
+
+      # Create the needed span parser regexps.
+      def span_parser_regexps(parsers = @span_parsers)
+        span_start = /#{parsers.map {|name| @parsers[name].span_start}.join('|')}/
+        [span_start, /(?=#{span_start})/]
+      end
+
+      # Parse all block-level elements in +text+ into the element +el+.
+      def parse_blocks(el, text = nil)
+        @stack.push([@tree, @src, @block_ial])
+        @tree, @block_ial = el, nil
+        @src = (text.nil? ? @src : ::Kramdown::Utils::StringScanner.new(text, el.options[:location]))
+
+        status = catch(:stop_block_parsing) do
+          while !@src.eos?
+            @block_parsers.any? do |name|
+              if @src.check(@parsers[name].start_re)
+                send(@parsers[name].method)
+              else
+                false
+              end
+            end || begin
+              warning('Warning: this should not occur - no block parser handled the line')
+              add_text(@src.scan(/.*\n/))
+            end
+          end
+        end
+
+        @tree, @src, @block_ial = *@stack.pop
+        status
+      end
+
+      # Update the tree by parsing all :+raw_text+ elements with the span-level parser (resets the
+      # environment) and by updating the attributes from the IALs.
+      def update_tree(element)
+        last_blank = nil
+        element.children.map! do |child|
+          if child.type == :raw_text
+            last_blank = nil
+            reset_env(:src => ::Kramdown::Utils::StringScanner.new(child.value, element.options[:location]),
+                      :text_type => :text)
+            parse_spans(child)
+            child.children
+          elsif child.type == :eob
+            update_attr_with_ial(child.attr, child.options[:ial]) if child.options[:ial]
+            []
+          elsif child.type == :blank
+            if last_blank
+              last_blank.value << child.value
+              []
+            else
+              last_blank = child
+              child
+            end
+          else
+            last_blank = nil
+            update_tree(child)
+            update_attr_with_ial(child.attr, child.options[:ial]) if child.options[:ial]
+            # DEPRECATED: option auto_id_stripping will be removed in 2.0 because then this will be
+            # the default behaviour
+            if child.type == :dt || (child.type == :header && @options[:auto_id_stripping])
+              update_raw_text(child)
+            end
+            child
+          end
+        end.flatten!
+      end
+
+      # Parse all span-level elements in the source string of @src into +el+.
+      #
+      # If the parameter +stop_re+ (a regexp) is used, parsing is immediately stopped if the regexp
+      # matches and if no block is given or if a block is given and it returns +true+.
+      #
+      # The parameter +parsers+ can be used to specify the (span-level) parsing methods that should
+      # be used for parsing.
+      #
+      # The parameter +text_type+ specifies the type which should be used for created text nodes.
+      def parse_spans(el, stop_re = nil, parsers = nil, text_type = @text_type)
+        @stack.push([@tree, @text_type]) unless @tree.nil?
+        @tree, @text_type = el, text_type
+
+        span_start = @span_start
+        span_start_re = @span_start_re
+        span_start, span_start_re = span_parser_regexps(parsers) if parsers
+        parsers = parsers || @span_parsers
+
+        used_re = (stop_re.nil? ? span_start_re : /(?=#{Regexp.union(stop_re, span_start)})/)
+        stop_re_found = false
+        while !@src.eos? && !stop_re_found
+          if result = @src.scan_until(used_re)
+            add_text(result)
+            if stop_re && @src.check(stop_re)
+              stop_re_found = (block_given? ? yield : true)
+            end
+            processed = parsers.any? do |name|
+              if @src.check(@parsers[name].start_re)
+                send(@parsers[name].method)
+                true
+              else
+                false
+              end
+            end unless stop_re_found
+            add_text(@src.getch) if !processed && !stop_re_found
+          else
+            (add_text(@src.rest); @src.terminate) unless stop_re
+            break
+          end
+        end
+
+        @tree, @text_type = @stack.pop
+
+        stop_re_found
+      end
+
+      # Reset the current parsing environment. The parameter +env+ can be used to set initial
+      # values for one or more environment variables.
+      def reset_env(opts = {})
+        opts = {:text_type => :raw_text, :stack => []}.merge(opts)
+        @src = opts[:src]
+        @tree = opts[:tree]
+        @block_ial = opts[:block_ial]
+        @stack = opts[:stack]
+        @text_type = opts[:text_type]
+      end
+
+      # Return the current parsing environment.
+      def save_env
+        [@src, @tree, @block_ial, @stack,  @text_type]
+      end
+
+      # Restore the current parsing environment.
+      def restore_env(env)
+        @src, @tree, @block_ial, @stack,  @text_type = *env
+      end
+
+      # Update the given attributes hash +attr+ with the information from the inline attribute list
+      # +ial+ and all referenced ALDs.
+      def update_attr_with_ial(attr, ial)
+        ial[:refs].each do |ref|
+          update_attr_with_ial(attr, ref) if ref = @alds[ref]
+        end if ial[:refs]
+        ial.each do |k,v|
+          if k == IAL_CLASS_ATTR
+            attr[k] = (attr[k] || '') << " #{v}"
+            attr[k].lstrip!
+          elsif k.kind_of?(String)
+            attr[k] = v
+          end
+        end
+      end
+
+      # Update the raw text for automatic ID generation.
+      def update_raw_text(item)
+        raw_text = ''
+
+        append_text = lambda do |child|
+          if child.type == :text
+            raw_text << child.value
+          else
+            child.children.each {|c| append_text.call(c)}
+          end
+        end
+
+        append_text.call(item)
+        item.options[:raw_text] = raw_text
+      end
+
+      # Create a new block-level element, taking care of applying a preceding block IAL if it
+      # exists. This method should always be used for creating a block-level element!
+      def new_block_el(*args)
+        el = Element.new(*args)
+        if @block_ial
+          el.options[:ial] = @block_ial
+          @block_ial = nil
+        end
+        el
+      end
+
+      @@parsers = {}
+
+      # Struct class holding all the needed data for one block/span-level parser method.
+      Data = Struct.new(:name, :start_re, :span_start, :method)
+
+      # Add a parser method
+      #
+      # * with the given +name+,
+      # * using +start_re+ as start regexp
+      # * and, for span parsers, +span_start+ as a String that can be used in a regexp and
+      #   which identifies the starting character(s)
+      #
+      # to the registry. The method name is automatically derived from the +name+ or can explicitly
+      # be set by using the +meth_name+ parameter.
+      def self.define_parser(name, start_re, span_start = nil, meth_name = "parse_#{name}")
+        raise "A parser with the name #{name} already exists!" if @@parsers.has_key?(name)
+        @@parsers[name] = Data.new(name, start_re, span_start, meth_name)
+      end
+
+      # Return the Data structure for the parser +name+.
+      def self.parser(name = nil)
+        @@parsers[name]
+      end
+
+      # Return +true+ if there is a parser called +name+.
+      def self.has_parser?(name)
+        @@parsers.has_key?(name)
+      end
+
+      # Regexp for matching indentation (one tab or four spaces)
+      INDENT = /^(?:\t| {4})/
+      # Regexp for matching the optional space (zero or up to three spaces)
+      OPT_SPACE = / {0,3}/
+
+      require 'kramdown/parser/kramdown/blank_line'
+      require 'kramdown/parser/kramdown/eob'
+      require 'kramdown/parser/kramdown/paragraph'
+      require 'kramdown/parser/kramdown/header'
+      require 'kramdown/parser/kramdown/blockquote'
+      require 'kramdown/parser/kramdown/table'
+      require 'kramdown/parser/kramdown/codeblock'
+      require 'kramdown/parser/kramdown/horizontal_rule'
+      require 'kramdown/parser/kramdown/list'
+      require 'kramdown/parser/kramdown/link'
+      require 'kramdown/parser/kramdown/extensions'
+      require 'kramdown/parser/kramdown/footnote'
+      require 'kramdown/parser/kramdown/html'
+      require 'kramdown/parser/kramdown/escaped_chars'
+      require 'kramdown/parser/kramdown/html_entity'
+      require 'kramdown/parser/kramdown/line_break'
+      require 'kramdown/parser/kramdown/typographic_symbol'
+      require 'kramdown/parser/kramdown/autolink'
+      require 'kramdown/parser/kramdown/codespan'
+      require 'kramdown/parser/kramdown/emphasis'
+      require 'kramdown/parser/kramdown/smart_quotes'
+      require 'kramdown/parser/kramdown/math'
+      require 'kramdown/parser/kramdown/abbreviation'
+
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/abbreviation.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/abbreviation.rb
new file mode 100644
index 0000000..8c404a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/abbreviation.rb
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      ABBREV_DEFINITION_START = /^#{OPT_SPACE}\*\[(.+?)\]:(.*?)\n/
+
+      # Parse the link definition at the current location.
+      def parse_abbrev_definition
+        start_line_number = @src.current_line_number
+        @src.pos += @src.matched_size
+        abbrev_id, abbrev_text = @src[1], @src[2]
+        abbrev_text.strip!
+        warning("Duplicate abbreviation ID '#{abbrev_id}' on line #{start_line_number} - overwriting") if @root.options[:abbrev_defs][abbrev_id]
+        @tree.children << new_block_el(:eob, :abbrev_def)
+        @root.options[:abbrev_defs][abbrev_id] = abbrev_text
+        @root.options[:abbrev_attr][abbrev_id] = @tree.children.last
+        true
+      end
+      define_parser(:abbrev_definition, ABBREV_DEFINITION_START)
+
+      # Correct abbreviation attributes.
+      def correct_abbreviations_attributes
+        @root.options[:abbrev_attr].keys.each do |k|
+          @root.options[:abbrev_attr][k] = @root.options[:abbrev_attr][k].attr
+        end
+      end
+
+      # Replace the abbreviation text with elements.
+      def replace_abbreviations(el, regexps = nil)
+        return if @root.options[:abbrev_defs].empty?
+        if !regexps
+          sorted_abbrevs = @root.options[:abbrev_defs].keys.sort {|a,b| b.length <=> a.length}
+          regexps = [Regexp.union(*sorted_abbrevs.map {|k| /#{Regexp.escape(k)}/})]
+          regexps << /(?=(?:\W|^)#{regexps.first}(?!\w))/ # regexp should only match on word boundaries
+        end
+        el.children.map! do |child|
+          if child.type == :text
+            if child.value =~ regexps.first
+              result = []
+              strscan = Kramdown::Utils::StringScanner.new(child.value, child.options[:location])
+              text_lineno = strscan.current_line_number
+              while temp = strscan.scan_until(regexps.last)
+                abbr_lineno = strscan.current_line_number
+                abbr = strscan.scan(regexps.first) # begin of line case of abbr with \W char as first one
+                if abbr.nil?
+                  temp << strscan.scan(/\W|^/)
+                  abbr = strscan.scan(regexps.first)
+                end
+                result << Element.new(:text, temp, nil, :location => text_lineno)
+                result << Element.new(:abbreviation, abbr, nil, :location => abbr_lineno)
+                text_lineno = strscan.current_line_number
+              end
+              result << Element.new(:text, strscan.rest, nil, :location => text_lineno)
+            else
+              child
+            end
+          else
+            replace_abbreviations(child, regexps)
+            child
+          end
+        end.flatten!
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/autolink.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/autolink.rb
new file mode 100644
index 0000000..5f7a407
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/autolink.rb
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      if RUBY_VERSION == '1.8.5'
+        ACHARS = '\w\x80-\xFF'
+      elsif RUBY_VERSION < '1.9.0'
+        ACHARS = '\w'
+      else
+        ACHARS = '[[:alnum:]]_'
+      end
+      AUTOLINK_START_STR = "<((mailto|https?|ftps?):.+?|[-.#{ACHARS}]+@[-#{ACHARS}]+(?:\.[-#{ACHARS}]+)*\.[a-z]+)>"
+      AUTOLINK_START = /#{AUTOLINK_START_STR}/u
+
+      # Parse the autolink at the current location.
+      def parse_autolink
+        start_line_number = @src.current_line_number
+        @src.pos += @src.matched_size
+        href = (@src[2].nil? ? "mailto:#{@src[1]}" : @src[1])
+        el = Element.new(:a, nil, {'href' => href}, :location => start_line_number)
+        add_text(@src[1].sub(/^mailto:/, ''), el)
+        @tree.children << el
+      end
+      define_parser(:autolink, AUTOLINK_START, '<')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/blank_line.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/blank_line.rb
new file mode 100644
index 0000000..2bc07d7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/blank_line.rb
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      BLANK_LINE = /(?>^\s*\n)+/
+
+      # Parse the blank line at the current postition.
+      def parse_blank_line
+        @src.pos += @src.matched_size
+        if @tree.children.last && @tree.children.last.type == :blank
+          @tree.children.last.value << @src.matched
+        else
+          @tree.children << new_block_el(:blank, @src.matched)
+        end
+        true
+      end
+      define_parser(:blank_line, BLANK_LINE)
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/block_boundary.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/block_boundary.rb
new file mode 100644
index 0000000..85d8e99
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/block_boundary.rb
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/kramdown/extensions'
+require 'kramdown/parser/kramdown/blank_line'
+require 'kramdown/parser/kramdown/eob'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      BLOCK_BOUNDARY = /#{BLANK_LINE}|#{EOB_MARKER}|#{IAL_BLOCK_START}|\Z/
+
+      # Return +true+ if we are after a block boundary.
+      def after_block_boundary?
+        !@tree.children.last || @tree.children.last.type == :blank ||
+          (@tree.children.last.type == :eob && @tree.children.last.value.nil?) || @block_ial
+      end
+
+      # Return +true+ if we are before a block boundary.
+      def before_block_boundary?
+        @src.check(self.class::BLOCK_BOUNDARY)
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/blockquote.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/blockquote.rb
new file mode 100644
index 0000000..c683083
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/blockquote.rb
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/kramdown/blank_line'
+require 'kramdown/parser/kramdown/extensions'
+require 'kramdown/parser/kramdown/eob'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      BLOCKQUOTE_START = /^#{OPT_SPACE}> ?/
+
+      # Parse the blockquote at the current location.
+      def parse_blockquote
+        start_line_number = @src.current_line_number
+        result = @src.scan(PARAGRAPH_MATCH)
+        while !@src.match?(self.class::LAZY_END)
+          result << @src.scan(PARAGRAPH_MATCH)
+        end
+        result.gsub!(BLOCKQUOTE_START, '')
+
+        el = new_block_el(:blockquote, nil, nil, :location => start_line_number)
+        @tree.children << el
+        parse_blocks(el, result)
+        true
+      end
+      define_parser(:blockquote, BLOCKQUOTE_START)
+
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/codeblock.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/codeblock.rb
new file mode 100644
index 0000000..6524680
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/codeblock.rb
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/kramdown/blank_line'
+require 'kramdown/parser/kramdown/extensions'
+require 'kramdown/parser/kramdown/eob'
+require 'kramdown/parser/kramdown/paragraph'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      CODEBLOCK_START = INDENT
+      CODEBLOCK_MATCH = /(?:#{BLANK_LINE}?(?:#{INDENT}[ \t]*\S.*\n)+(?:(?!#{IAL_BLOCK_START}|#{EOB_MARKER}|^#{OPT_SPACE}#{LAZY_END_HTML_STOP}|^#{OPT_SPACE}#{LAZY_END_HTML_START})^[ \t]*\S.*\n)*)*/
+
+      # Parse the indented codeblock at the current location.
+      def parse_codeblock
+        start_line_number = @src.current_line_number
+        data = @src.scan(self.class::CODEBLOCK_MATCH)
+        data.gsub!(/\n( {0,3}\S)/, ' \\1')
+        data.gsub!(INDENT, '')
+        @tree.children << new_block_el(:codeblock, data, nil, :location => start_line_number)
+        true
+      end
+      define_parser(:codeblock, CODEBLOCK_START)
+
+
+      FENCED_CODEBLOCK_START = /^~{3,}/
+      FENCED_CODEBLOCK_MATCH = /^((~){3,})\s*?((\S+?)(?:\?\S*)?)?\s*?\n(.*?)^\1\2*\s*?\n/m
+
+      # Parse the fenced codeblock at the current location.
+      def parse_codeblock_fenced
+        if @src.check(self.class::FENCED_CODEBLOCK_MATCH)
+          start_line_number = @src.current_line_number
+          @src.pos += @src.matched_size
+          el = new_block_el(:codeblock, @src[5], nil, :location => start_line_number)
+          lang = @src[3].to_s.strip
+          unless lang.empty?
+            el.options[:lang] = lang
+            el.attr['class'] = "language-#{@src[4]}"
+          end
+          @tree.children << el
+          true
+        else
+          false
+        end
+      end
+      define_parser(:codeblock_fenced, FENCED_CODEBLOCK_START)
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/codespan.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/codespan.rb
new file mode 100644
index 0000000..3178787
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/codespan.rb
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      CODESPAN_DELIMITER = /`+/
+
+      # Parse the codespan at the current scanner location.
+      def parse_codespan
+        start_line_number = @src.current_line_number
+        result = @src.scan(CODESPAN_DELIMITER)
+        simple = (result.length == 1)
+        saved_pos = @src.save_pos
+
+        if simple && @src.pre_match =~ /\s\Z/ && @src.match?(/\s/)
+          add_text(result)
+          return
+        end
+
+        if text = @src.scan_until(/#{result}/)
+          text.sub!(/#{result}\Z/, '')
+          if !simple
+            text = text[1..-1] if text[0..0] == ' '
+            text = text[0..-2] if text[-1..-1] == ' '
+          end
+          @tree.children << Element.new(:codespan, text, nil, :location => start_line_number)
+        else
+          @src.revert_pos(saved_pos)
+          add_text(result)
+        end
+      end
+      define_parser(:codespan, CODESPAN_DELIMITER, '`')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/emphasis.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/emphasis.rb
new file mode 100644
index 0000000..a5fcae3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/emphasis.rb
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      EMPHASIS_START = /(?:\*\*?|__?)/
+
+      # Parse the emphasis at the current location.
+      def parse_emphasis
+        start_line_number = @src.current_line_number
+        saved_pos = @src.save_pos
+
+        result = @src.scan(EMPHASIS_START)
+        element = (result.length == 2 ? :strong : :em)
+        type = result[0..0]
+
+        if (type == '_' && @src.pre_match =~ /[[:alpha:]-]\z/) || @src.check(/\s/) ||
+            @tree.type == element || @stack.any? {|el, _| el.type == element}
+          add_text(result)
+          return
+        end
+
+        sub_parse = lambda do |delim, elem|
+          el = Element.new(elem, nil, nil, :location => start_line_number)
+          stop_re = /#{Regexp.escape(delim)}/
+          found = parse_spans(el, stop_re) do
+            (@src.pre_match[-1, 1] !~ /\s/) &&
+              (elem != :em || !@src.match?(/#{Regexp.escape(delim*2)}(?!#{Regexp.escape(delim)})/)) &&
+              (type != '_' || !@src.match?(/#{Regexp.escape(delim)}[[:alnum:]]/)) && el.children.size > 0
+          end
+          [found, el, stop_re]
+        end
+
+        found, el, stop_re = sub_parse.call(result, element)
+        if !found && element == :strong && @tree.type != :em
+          @src.revert_pos(saved_pos)
+          @src.pos += 1
+          found, el, stop_re = sub_parse.call(type, :em)
+        end
+        if found
+          @src.scan(stop_re)
+          @tree.children << el
+        else
+          @src.revert_pos(saved_pos)
+          @src.pos += result.length
+          add_text(result)
+        end
+      end
+      define_parser(:emphasis, EMPHASIS_START, '\*|_')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/eob.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/eob.rb
new file mode 100644
index 0000000..b0c5f4c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/eob.rb
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      EOB_MARKER = /^\^\s*?\n/
+
+      # Parse the EOB marker at the current location.
+      def parse_eob_marker
+        @src.pos += @src.matched_size
+        @tree.children << new_block_el(:eob)
+        true
+      end
+      define_parser(:eob_marker, EOB_MARKER)
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/escaped_chars.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/escaped_chars.rb
new file mode 100644
index 0000000..1eae45d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/escaped_chars.rb
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      ESCAPED_CHARS = /\\([\\.*_+`<>()\[\]{}#!:|"'\$=-])/
+
+      # Parse the backslash-escaped character at the current location.
+      def parse_escaped_chars
+        @src.pos += @src.matched_size
+        add_text(@src[1])
+      end
+      define_parser(:escaped_chars, ESCAPED_CHARS, '\\\\')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/extensions.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/extensions.rb
new file mode 100644
index 0000000..85053be
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/extensions.rb
@@ -0,0 +1,203 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      IAL_CLASS_ATTR = 'class'
+
+      # Parse the string +str+ and extract all attributes and add all found attributes to the hash
+      # +opts+.
+      def parse_attribute_list(str, opts)
+        return if str.strip.empty? || str.strip == ':'
+        attrs = str.scan(ALD_TYPE_ANY)
+        attrs.each do |key, sep, val, ref, id_and_or_class, _, _|
+          if ref
+            (opts[:refs] ||= []) << ref
+          elsif id_and_or_class
+            id_and_or_class.scan(ALD_TYPE_ID_OR_CLASS).each do |id_attr, class_attr|
+              if class_attr
+                opts[IAL_CLASS_ATTR] = (opts[IAL_CLASS_ATTR] || '') << " #{class_attr}"
+                opts[IAL_CLASS_ATTR].lstrip!
+              else
+                opts['id'] = id_attr
+              end
+            end
+          else
+            val.gsub!(/\\(\}|#{sep})/, "\\1")
+            opts[key] = val
+          end
+        end
+        warning("No or invalid attributes found in IAL/ALD content: #{str}") if attrs.length == 0
+      end
+
+      # Update the +ial+ with the information from the inline attribute list +opts+.
+      def update_ial_with_ial(ial, opts)
+        (ial[:refs] ||= []) << opts[:refs]
+        opts.each do |k,v|
+          if k == IAL_CLASS_ATTR
+            ial[k] = (ial[k] || '') << " #{v}"
+            ial[k].lstrip!
+          elsif k.kind_of?(String)
+            ial[k] = v
+          end
+        end
+      end
+
+      # Parse the generic extension at the current point. The parameter +type+ can either be :block
+      # or :span depending whether we parse a block or span extension tag.
+      def parse_extension_start_tag(type)
+        saved_pos = @src.save_pos
+        start_line_number = @src.current_line_number
+        @src.pos += @src.matched_size
+
+        error_block = lambda do |msg|
+          warning(msg)
+          @src.revert_pos(saved_pos)
+          add_text(@src.getch) if type == :span
+          false
+        end
+
+        if @src[4] || @src.matched == '{:/}'
+          name = (@src[4] ? "for '#{@src[4]}' " : '')
+          return error_block.call("Invalid extension stop tag #{name} found on line #{start_line_number} - ignoring it")
+        end
+
+        ext = @src[1]
+        opts = {}
+        body = nil
+        parse_attribute_list(@src[2] || '', opts)
+
+        if !@src[3]
+          stop_re = (type == :block ? /#{EXT_BLOCK_STOP_STR % ext}/ : /#{EXT_STOP_STR % ext}/)
+          if result = @src.scan_until(stop_re)
+            body = result.sub!(stop_re, '')
+            body.chomp! if type == :block
+          else
+            return error_block.call("No stop tag for extension '#{ext}' found on line #{start_line_number} - ignoring it")
+          end
+        end
+
+        if !handle_extension(ext, opts, body, type, start_line_number)
+          error_block.call("Invalid extension with name '#{ext}' specified on line #{start_line_number} - ignoring it")
+        else
+          true
+        end
+      end
+
+      def handle_extension(name, opts, body, type, line_no = nil)
+        case name
+        when 'comment'
+          @tree.children << Element.new(:comment, body, nil, :category => type, :location => line_no) if body.kind_of?(String)
+          true
+        when 'nomarkdown'
+          @tree.children << Element.new(:raw, body, nil, :category => type, :location => line_no, :type => opts['type'].to_s.split(/\s+/)) if body.kind_of?(String)
+          true
+        when 'options'
+          opts.select do |k,v|
+            k = k.to_sym
+            if Kramdown::Options.defined?(k)
+              begin
+                val = Kramdown::Options.parse(k, v)
+                @options[k] = val
+                (@root.options[:options] ||= {})[k] = val
+              rescue
+              end
+              false
+            else
+              true
+            end
+          end.each do |k,v|
+            warning("Unknown kramdown option '#{k}'")
+          end
+          @tree.children << new_block_el(:eob, :extension) if type == :block
+          true
+        else
+          false
+        end
+      end
+
+
+      ALD_ID_CHARS = /[\w-]/
+      ALD_ANY_CHARS = /\\\}|[^\}]/
+      ALD_ID_NAME = /\w#{ALD_ID_CHARS}*/
+      ALD_CLASS_NAME = /[^\s\.#]+/
+      ALD_TYPE_KEY_VALUE_PAIR = /(#{ALD_ID_NAME})=("|')((?:\\\}|\\\2|[^\}\2])*?)\2/
+      ALD_TYPE_CLASS_NAME = /\.(#{ALD_CLASS_NAME})/
+      ALD_TYPE_ID_NAME = /#([A-Za-z][\w:-]*)/
+      ALD_TYPE_ID_OR_CLASS = /#{ALD_TYPE_ID_NAME}|#{ALD_TYPE_CLASS_NAME}/
+      ALD_TYPE_ID_OR_CLASS_MULTI = /((?:#{ALD_TYPE_ID_NAME}|#{ALD_TYPE_CLASS_NAME})+)/
+      ALD_TYPE_REF = /(#{ALD_ID_NAME})/
+      ALD_TYPE_ANY = /(?:\A|\s)(?:#{ALD_TYPE_KEY_VALUE_PAIR}|#{ALD_TYPE_REF}|#{ALD_TYPE_ID_OR_CLASS_MULTI})(?=\s|\Z)/
+      ALD_START = /^#{OPT_SPACE}\{:(#{ALD_ID_NAME}):(#{ALD_ANY_CHARS}+)\}\s*?\n/
+
+      EXT_STOP_STR = "\\{:/(%s)?\\}"
+      EXT_START_STR = "\\{::(\\w+)(?:\\s(#{ALD_ANY_CHARS}*?)|)(\\/)?\\}"
+      EXT_BLOCK_START = /^#{OPT_SPACE}(?:#{EXT_START_STR}|#{EXT_STOP_STR % ALD_ID_NAME})\s*?\n/
+      EXT_BLOCK_STOP_STR = "^#{OPT_SPACE}#{EXT_STOP_STR}\s*?\n"
+
+      IAL_BLOCK = /\{:(?!:|\/)(#{ALD_ANY_CHARS}+)\}\s*?\n/
+      IAL_BLOCK_START = /^#{OPT_SPACE}#{IAL_BLOCK}/
+
+      BLOCK_EXTENSIONS_START = /^#{OPT_SPACE}\{:/
+
+      # Parse one of the block extensions (ALD, block IAL or generic extension) at the current
+      # location.
+      def parse_block_extensions
+        if @src.scan(ALD_START)
+          parse_attribute_list(@src[2], @alds[@src[1]] ||= Utils::OrderedHash.new)
+          @tree.children << new_block_el(:eob, :ald)
+          true
+        elsif @src.check(EXT_BLOCK_START)
+          parse_extension_start_tag(:block)
+        elsif @src.scan(IAL_BLOCK_START)
+          if @tree.children.last && @tree.children.last.type != :blank &&
+              (@tree.children.last.type != :eob || [:link_def, :abbrev_def, :footnote_def].include?(@tree.children.last.value))
+            parse_attribute_list(@src[1], @tree.children.last.options[:ial] ||= Utils::OrderedHash.new)
+            @tree.children << new_block_el(:eob, :ial) unless @src.check(IAL_BLOCK_START)
+          else
+            parse_attribute_list(@src[1], @block_ial ||= Utils::OrderedHash.new)
+          end
+          true
+        else
+          false
+        end
+      end
+      define_parser(:block_extensions, BLOCK_EXTENSIONS_START)
+
+
+      EXT_SPAN_START = /#{EXT_START_STR}|#{EXT_STOP_STR % ALD_ID_NAME}/
+      IAL_SPAN_START = /\{:(#{ALD_ANY_CHARS}+)\}/
+      SPAN_EXTENSIONS_START = /\{:/
+
+      # Parse the extension span at the current location.
+      def parse_span_extensions
+        if @src.check(EXT_SPAN_START)
+          parse_extension_start_tag(:span)
+        elsif @src.check(IAL_SPAN_START)
+          if @tree.children.last && @tree.children.last.type != :text
+            @src.pos += @src.matched_size
+            attr = Utils::OrderedHash.new
+            parse_attribute_list(@src[1], attr)
+            update_ial_with_ial(@tree.children.last.options[:ial] ||= Utils::OrderedHash.new, attr)
+            update_attr_with_ial(@tree.children.last.attr, attr)
+          else
+            warning("Found span IAL after text - ignoring it")
+            add_text(@src.getch)
+          end
+        else
+          add_text(@src.getch)
+        end
+      end
+      define_parser(:span_extensions, SPAN_EXTENSIONS_START, '\{:')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/footnote.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/footnote.rb
new file mode 100644
index 0000000..b12d815
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/footnote.rb
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/kramdown/extensions'
+require 'kramdown/parser/kramdown/blank_line'
+require 'kramdown/parser/kramdown/codeblock'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      FOOTNOTE_DEFINITION_START = /^#{OPT_SPACE}\[\^(#{ALD_ID_NAME})\]:\s*?(.*?\n#{CODEBLOCK_MATCH})/
+
+      # Parse the foot note definition at the current location.
+      def parse_footnote_definition
+        start_line_number = @src.current_line_number
+        @src.pos += @src.matched_size
+
+        el = Element.new(:footnote_def, nil, nil, :location => start_line_number)
+        parse_blocks(el, @src[2].gsub(INDENT, ''))
+        warning("Duplicate footnote name '#{@src[1]}' on line #{start_line_number} - overwriting") if @footnotes[@src[1]]
+        @tree.children << new_block_el(:eob, :footnote_def)
+        (@footnotes[@src[1]] = {})[:content] = el
+        @footnotes[@src[1]][:eob] = @tree.children.last
+        true
+      end
+      define_parser(:footnote_definition, FOOTNOTE_DEFINITION_START)
+
+
+      FOOTNOTE_MARKER_START = /\[\^(#{ALD_ID_NAME})\]/
+
+      # Parse the footnote marker at the current location.
+      def parse_footnote_marker
+        start_line_number = @src.current_line_number
+        @src.pos += @src.matched_size
+        fn_def = @footnotes[@src[1]]
+        if fn_def
+          if fn_def[:eob]
+            update_attr_with_ial(fn_def[:eob].attr, fn_def[:eob].options[:ial] || {})
+            fn_def[:attr] = fn_def[:eob].attr
+            fn_def[:options] = fn_def[:eob].options
+            fn_def.delete(:eob)
+          end
+          fn_def[:marker] ||= []
+          fn_def[:marker].push(Element.new(:footnote, fn_def[:content], fn_def[:attr],
+                                           fn_def[:options].merge(:name => @src[1], :location => start_line_number)))
+          @tree.children << fn_def[:marker].last
+        else
+          warning("Footnote definition for '#{@src[1]}' not found on line #{start_line_number}")
+          add_text(@src.matched)
+        end
+      end
+      define_parser(:footnote_marker, FOOTNOTE_MARKER_START, '\[')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/header.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/header.rb
new file mode 100644
index 0000000..aa882dd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/header.rb
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/kramdown/block_boundary'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      HEADER_ID=/(?:[ \t]+\{#([A-Za-z][\w:-]*)\})?/
+      SETEXT_HEADER_START = /^(#{OPT_SPACE}[^ \t].*?)#{HEADER_ID}[ \t]*?\n(-|=)+\s*?\n/
+
+      # Parse the Setext header at the current location.
+      def parse_setext_header
+        return false if !after_block_boundary?
+
+        start_line_number = @src.current_line_number
+        @src.pos += @src.matched_size
+        text, id, level = @src[1], @src[2], @src[3]
+        text.strip!
+        el = new_block_el(:header, nil, nil, :level => (level == '-' ? 2 : 1), :raw_text => text, :location => start_line_number)
+        add_text(text, el)
+        el.attr['id'] = id if id
+        @tree.children << el
+        true
+      end
+      define_parser(:setext_header, SETEXT_HEADER_START)
+
+
+      ATX_HEADER_START = /^\#{1,6}/
+      ATX_HEADER_MATCH = /^(\#{1,6})(.+?(?:\\#)?)\s*?#*#{HEADER_ID}\s*?\n/
+
+      # Parse the Atx header at the current location.
+      def parse_atx_header
+        return false if !after_block_boundary?
+
+        start_line_number = @src.current_line_number
+        @src.check(ATX_HEADER_MATCH)
+        level, text, id = @src[1], @src[2].to_s.strip, @src[3]
+        return false if text.empty?
+
+        @src.pos += @src.matched_size
+        el = new_block_el(:header, nil, nil, :level => level.length, :raw_text => text, :location => start_line_number)
+        add_text(text, el)
+        el.attr['id'] = id if id
+        @tree.children << el
+        true
+      end
+      define_parser(:atx_header, ATX_HEADER_START)
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/horizontal_rule.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/horizontal_rule.rb
new file mode 100644
index 0000000..66701e1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/horizontal_rule.rb
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      HR_START = /^#{OPT_SPACE}(\*|-|_)[ \t]*\1[ \t]*\1(\1|[ \t])*\n/
+
+      # Parse the horizontal rule at the current location.
+      def parse_horizontal_rule
+        start_line_number = @src.current_line_number
+        @src.pos += @src.matched_size
+        @tree.children << new_block_el(:hr, nil, nil, :location => start_line_number)
+        true
+      end
+      define_parser(:horizontal_rule, HR_START)
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/html.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/html.rb
new file mode 100644
index 0000000..a526b4e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/html.rb
@@ -0,0 +1,163 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/html'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      include Kramdown::Parser::Html::Parser
+
+      # Mapping of markdown attribute value to content model. I.e. :raw when "0", :default when "1"
+      # (use default content model for the HTML element), :span when "span", :block when block and
+      # for everything else +nil+ is returned.
+      HTML_MARKDOWN_ATTR_MAP = {"0" => :raw, "1" => :default, "span" => :span, "block" => :block}
+
+      TRAILING_WHITESPACE = /[ \t]*\n/
+
+      def handle_kramdown_html_tag(el, closed, handle_body)
+        if @block_ial
+          el.options[:ial] = @block_ial
+          @block_ial = nil
+        end
+
+        content_model = if @tree.type != :html_element || @tree.options[:content_model] != :raw
+                          (@options[:parse_block_html] ? HTML_CONTENT_MODEL[el.value] : :raw)
+                        else
+                          :raw
+                        end
+        if val = HTML_MARKDOWN_ATTR_MAP[el.attr.delete('markdown')]
+          content_model = (val == :default ? HTML_CONTENT_MODEL[el.value] : val)
+        end
+
+        @src.scan(TRAILING_WHITESPACE) if content_model == :block
+        el.options[:content_model] = content_model
+        el.options[:is_closed] = closed
+
+        if !closed && handle_body
+          if content_model == :block
+            if !parse_blocks(el)
+              warning("Found no end tag for '#{el.value}' (line #{el.options[:location]}) - auto-closing it")
+            end
+          elsif content_model == :span
+            curpos = @src.pos
+            if @src.scan_until(/(?=<\/#{el.value}\s*>)/mi)
+              add_text(extract_string(curpos...@src.pos, @src), el)
+              @src.scan(HTML_TAG_CLOSE_RE)
+            else
+              add_text(@src.rest, el)
+              @src.terminate
+              warning("Found no end tag for '#{el.value}' (line #{el.options[:location]}) - auto-closing it")
+            end
+          else
+            parse_raw_html(el, &method(:handle_kramdown_html_tag))
+          end
+          @src.scan(TRAILING_WHITESPACE) unless (@tree.type == :html_element && @tree.options[:content_model] == :raw)
+        end
+      end
+
+
+      HTML_BLOCK_START = /^#{OPT_SPACE}<(#{REXML::Parsers::BaseParser::UNAME_STR}|\?|!--|\/)/
+
+      # Parse the HTML at the current position as block-level HTML.
+      def parse_block_html
+        line = @src.current_line_number
+        if result = @src.scan(HTML_COMMENT_RE)
+          @tree.children << Element.new(:xml_comment, result, nil, :category => :block, :location => line)
+          @src.scan(TRAILING_WHITESPACE)
+          true
+        elsif result = @src.scan(HTML_INSTRUCTION_RE)
+          @tree.children << Element.new(:xml_pi, result, nil, :category => :block, :location => line)
+          @src.scan(TRAILING_WHITESPACE)
+          true
+        else
+          if result = @src.check(/^#{OPT_SPACE}#{HTML_TAG_RE}/) && !HTML_SPAN_ELEMENTS.include?(@src[1].downcase)
+            @src.pos += @src.matched_size
+            handle_html_start_tag(line, &method(:handle_kramdown_html_tag))
+            Kramdown::Parser::Html::ElementConverter.convert(@root, @tree.children.last) if @options[:html_to_native]
+            true
+          elsif result = @src.check(/^#{OPT_SPACE}#{HTML_TAG_CLOSE_RE}/) && !HTML_SPAN_ELEMENTS.include?(@src[1].downcase)
+            name = @src[1].downcase
+
+            if @tree.type == :html_element && @tree.value == name
+              @src.pos += @src.matched_size
+              throw :stop_block_parsing, :found
+            else
+              false
+            end
+          else
+            false
+          end
+        end
+      end
+      define_parser(:block_html, HTML_BLOCK_START)
+
+
+      HTML_SPAN_START = /<(#{REXML::Parsers::BaseParser::UNAME_STR}|\?|!--|\/)/
+
+      # Parse the HTML at the current position as span-level HTML.
+      def parse_span_html
+        line = @src.current_line_number
+        if result = @src.scan(HTML_COMMENT_RE)
+          @tree.children << Element.new(:xml_comment, result, nil, :category => :span, :location => line)
+        elsif result = @src.scan(HTML_INSTRUCTION_RE)
+          @tree.children << Element.new(:xml_pi, result, nil, :category => :span, :location => line)
+        elsif result = @src.scan(HTML_TAG_CLOSE_RE)
+          warning("Found invalidly used HTML closing tag for '#{@src[1]}' on line #{line}")
+          add_text(result)
+        elsif result = @src.scan(HTML_TAG_RE)
+          tag_name = @src[1]
+          tag_name.downcase! if HTML_ELEMENT[tag_name.downcase]
+          if HTML_BLOCK_ELEMENTS.include?(tag_name)
+            warning("Found block HTML tag '#{tag_name}' in span-level text on line #{line}")
+            add_text(result)
+            return
+          end
+
+          attrs = parse_html_attributes(@src[2], line, HTML_ELEMENT[tag_name])
+          attrs.each {|name, value| value.gsub!(/\n+/, ' ')}
+
+          do_parsing = (HTML_CONTENT_MODEL[tag_name] == :raw || @tree.options[:content_model] == :raw ? false : @options[:parse_span_html])
+          if val = HTML_MARKDOWN_ATTR_MAP[attrs.delete('markdown')]
+            if val == :block
+              warning("Cannot use block-level parsing in span-level HTML tag (line #{line}) - using default mode")
+            elsif val == :span
+              do_parsing = true
+            elsif val == :default
+              do_parsing = HTML_CONTENT_MODEL[tag_name] != :raw
+            elsif val == :raw
+              do_parsing = false
+            end
+          end
+
+          el = Element.new(:html_element, tag_name, attrs, :category => :span, :location => line,
+                           :content_model => (do_parsing ? :span : :raw), :is_closed => !!@src[4])
+          @tree.children << el
+          stop_re = /<\/#{Regexp.escape(tag_name)}\s*>/
+          stop_re = Regexp.new(stop_re.source, Regexp::IGNORECASE) if HTML_ELEMENT[tag_name]
+          if !@src[4] && !HTML_ELEMENTS_WITHOUT_BODY.include?(el.value)
+            if parse_spans(el, stop_re, (do_parsing ? nil : [:span_html]))
+              @src.scan(stop_re)
+            else
+              warning("Found no end tag for '#{el.value}' (line #{line}) - auto-closing it")
+              add_text(@src.rest, el)
+              @src.terminate
+            end
+          end
+          Kramdown::Parser::Html::ElementConverter.convert(@root, el) if @options[:html_to_native]
+        else
+          add_text(@src.getch)
+        end
+      end
+      define_parser(:span_html, HTML_SPAN_START, '<')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/html_entity.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/html_entity.rb
new file mode 100644
index 0000000..8f3bc86
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/html_entity.rb
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/html'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      # Parse the HTML entity at the current location.
+      def parse_html_entity
+        start_line_number = @src.current_line_number
+        @src.pos += @src.matched_size
+        begin
+          @tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity(@src[1] || (@src[2] && @src[2].to_i) || @src[3].hex),
+                                        nil, :original => @src.matched, :location => start_line_number)
+        rescue ::Kramdown::Error
+          @tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity('amp'),
+                                        nil, :location => start_line_number)
+          add_text(@src.matched[1..-1])
+        end
+      end
+      define_parser(:html_entity, Kramdown::Parser::Html::Constants::HTML_ENTITY_RE, '&')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/line_break.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/line_break.rb
new file mode 100644
index 0000000..ae22988
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/line_break.rb
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      LINE_BREAK = /(  |\\\\)(?=\n)/
+
+      # Parse the line break at the current location.
+      def parse_line_break
+        @tree.children << Element.new(:br, nil, nil, :location => @src.current_line_number)
+        @src.pos += @src.matched_size
+      end
+      define_parser(:line_break, LINE_BREAK, '(  |\\\\)(?=\n)')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/link.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/link.rb
new file mode 100644
index 0000000..4ba5c66
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/link.rb
@@ -0,0 +1,143 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/kramdown/escaped_chars'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      # Normalize the link identifier.
+      def normalize_link_id(id)
+        id.gsub(/[\s]+/, ' ').downcase
+      end
+
+      LINK_DEFINITION_START = /^#{OPT_SPACE}\[([^\n\]]+)\]:[ \t]*(?:<(.*?)>|([^\n]*?\S[^\n]*?))(?:(?:[ \t]*?\n|[ \t]+?)[ \t]*?(["'])(.+?)\4)?[ \t]*?\n/
+
+      # Parse the link definition at the current location.
+      def parse_link_definition
+        return false if @src[3].to_s =~ /[ \t]+["']/
+        @src.pos += @src.matched_size
+        link_id, link_url, link_title = normalize_link_id(@src[1]), @src[2] || @src[3], @src[5]
+        warning("Duplicate link ID '#{link_id}' on line #{@src.current_line_number} - overwriting") if @link_defs[link_id]
+        @tree.children << new_block_el(:eob, :link_def)
+        @link_defs[link_id] = [link_url, link_title, @tree.children.last]
+        true
+      end
+      define_parser(:link_definition, LINK_DEFINITION_START)
+
+
+      # This helper methods adds the approriate attributes to the element +el+ of type +a+ or +img+
+      # and the element itself to the @tree.
+      def add_link(el, href, title, alt_text = nil, ial = nil)
+        el.options[:ial] = ial
+        update_attr_with_ial(el.attr, ial) if ial
+        if el.type == :a
+          el.attr['href'] = href
+        else
+          el.attr['src'] = href
+          el.attr['alt'] = alt_text
+          el.children.clear
+        end
+        el.attr['title'] = title if title
+        @tree.children << el
+      end
+
+      LINK_BRACKET_STOP_RE = /(\])|!?\[/
+      LINK_PAREN_STOP_RE = /(\()|(\))|\s(?=['"])/
+      LINK_INLINE_ID_RE = /\s*?\[([^\]]+)?\]/
+      LINK_INLINE_TITLE_RE = /\s*?(["'])(.+?)\1\s*?\)/m
+      LINK_START = /!?\[(?=[^^])/
+
+      # Parse the link at the current scanner position. This method is used to parse normal links as
+      # well as image links.
+      def parse_link
+        start_line_number = @src.current_line_number
+        result = @src.scan(LINK_START)
+        cur_pos = @src.pos
+        saved_pos = @src.save_pos
+
+        link_type = (result =~ /^!/ ? :img : :a)
+
+        # no nested links allowed
+        if link_type == :a && (@tree.type == :img || @tree.type == :a || @stack.any? {|t,s| t && (t.type == :img || t.type == :a)})
+          add_text(result)
+          return
+        end
+        el = Element.new(link_type, nil, nil, :location => start_line_number)
+
+        count = 1
+        found = parse_spans(el, LINK_BRACKET_STOP_RE) do
+          count = count + (@src[1] ? -1 : 1)
+          count - el.children.select {|c| c.type == :img}.size == 0
+        end
+        unless found
+          @src.revert_pos(saved_pos)
+          add_text(result)
+          return
+        end
+        alt_text = extract_string(cur_pos...@src.pos, @src).gsub(ESCAPED_CHARS, '\1')
+        @src.scan(LINK_BRACKET_STOP_RE)
+
+        # reference style link or no link url
+        if @src.scan(LINK_INLINE_ID_RE) || !@src.check(/\(/)
+          link_id = normalize_link_id(@src[1] || alt_text)
+          if @link_defs.has_key?(link_id)
+            add_link(el, @link_defs[link_id][0], @link_defs[link_id][1], alt_text,
+                     @link_defs[link_id][2] && @link_defs[link_id][2].options[:ial])
+          else
+            warning("No link definition for link ID '#{link_id}' found on line #{start_line_number}")
+            @src.revert_pos(saved_pos)
+            add_text(result)
+          end
+          return
+        end
+
+        # link url in parentheses
+        if @src.scan(/\(<(.*?)>/)
+          link_url = @src[1]
+          if @src.scan(/\)/)
+            add_link(el, link_url, nil, alt_text)
+            return
+          end
+        else
+          link_url = ''
+          nr_of_brackets = 0
+          while temp = @src.scan_until(LINK_PAREN_STOP_RE)
+            link_url << temp
+            if @src[2]
+              nr_of_brackets -= 1
+              break if nr_of_brackets == 0
+            elsif @src[1]
+              nr_of_brackets += 1
+            else
+              break
+            end
+          end
+          link_url = link_url[1..-2]
+          link_url.strip!
+
+          if nr_of_brackets == 0
+            add_link(el, link_url, nil, alt_text)
+            return
+          end
+        end
+
+        if @src.scan(LINK_INLINE_TITLE_RE)
+          add_link(el, link_url, @src[2], alt_text)
+        else
+          @src.revert_pos(saved_pos)
+          add_text(result)
+        end
+      end
+      define_parser(:link, LINK_START, '!?\[')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/list.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/list.rb
new file mode 100644
index 0000000..c97b400
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/list.rb
@@ -0,0 +1,255 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/kramdown/blank_line'
+require 'kramdown/parser/kramdown/eob'
+require 'kramdown/parser/kramdown/horizontal_rule'
+require 'kramdown/parser/kramdown/extensions'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      LIST_ITEM_IAL = /^\s*(?:\{:(?!(?:#{ALD_ID_NAME})?:|\/)(#{ALD_ANY_CHARS}+)\})\s*/
+      LIST_ITEM_IAL_CHECK = /^#{LIST_ITEM_IAL}?\s*\n/
+
+      PARSE_FIRST_LIST_LINE_REGEXP_CACHE = Hash.new do |h, indentation|
+        indent_re = /^ {#{indentation}}/
+        content_re = /^(?:(?:\t| {4}){#{indentation / 4}} {#{indentation % 4}}|(?:\t| {4}){#{indentation / 4 + 1}}).*\S.*\n/
+        lazy_re = /(?!^ {0,#{[indentation, 3].min}}(?:#{IAL_BLOCK}|#{LAZY_END_HTML_STOP}|#{LAZY_END_HTML_START})).*\S.*\n/
+
+        h[indentation] = [content_re, lazy_re, indent_re]
+      end
+
+      # Used for parsing the first line of a list item or a definition, i.e. the line with list item
+      # marker or the definition marker.
+      def parse_first_list_line(indentation, content)
+        if content =~ self.class::LIST_ITEM_IAL_CHECK
+          indentation = 4
+        else
+          while content =~ /^ *\t/
+            temp = content.scan(/^ */).first.length + indentation
+            content.sub!(/^( *)(\t+)/) {$1 << " "*(4 - (temp % 4) + ($2.length - 1)*4)}
+          end
+          indentation += content[/^ */].length
+        end
+        content.sub!(/^\s*/, '')
+
+        [content, indentation, *PARSE_FIRST_LIST_LINE_REGEXP_CACHE[indentation]]
+      end
+
+
+      LIST_START_UL = /^(#{OPT_SPACE}[+*-])([\t| ].*?\n)/
+      LIST_START_OL = /^(#{OPT_SPACE}\d+\.)([\t| ].*?\n)/
+      LIST_START = /#{LIST_START_UL}|#{LIST_START_OL}/
+
+      # Parse the ordered or unordered list at the current location.
+      def parse_list
+        start_line_number = @src.current_line_number
+        type, list_start_re = (@src.check(LIST_START_UL) ? [:ul, LIST_START_UL] : [:ol, LIST_START_OL])
+        list = new_block_el(type, nil, nil, :location => start_line_number)
+
+        item = nil
+        content_re, lazy_re, indent_re = nil
+        eob_found = false
+        nested_list_found = false
+        last_is_blank = false
+        while !@src.eos?
+          start_line_number = @src.current_line_number
+          if last_is_blank && @src.check(HR_START)
+            break
+          elsif @src.scan(EOB_MARKER)
+            eob_found = true
+            break
+          elsif @src.scan(list_start_re)
+            item = Element.new(:li, nil, nil, :location => start_line_number)
+            item.value, indentation, content_re, lazy_re, indent_re = parse_first_list_line(@src[1].length, @src[2])
+            list.children << item
+
+            item.value.sub!(self.class::LIST_ITEM_IAL) do |match|
+              parse_attribute_list($1, item.options[:ial] ||= {})
+              ''
+            end
+
+            list_start_re = (type == :ul ? /^( {0,#{[3, indentation - 1].min}}[+*-])([\t| ].*?\n)/ :
+                             /^( {0,#{[3, indentation - 1].min}}\d+\.)([\t| ].*?\n)/)
+            nested_list_found = (item.value =~ LIST_START)
+            last_is_blank = false
+            item.value = [item.value]
+          elsif (result = @src.scan(content_re)) || (!last_is_blank && (result = @src.scan(lazy_re)))
+            result.sub!(/^(\t+)/) { " " * 4 * $1.length }
+            indentation_found = result.sub!(indent_re, '')
+            if !nested_list_found && indentation_found && result =~ LIST_START
+              item.value << ''
+              nested_list_found = true
+            elsif nested_list_found && !indentation_found && result =~ LIST_START
+              result = " " * (indentation + 4) << result
+            end
+            item.value.last << result
+            last_is_blank = false
+          elsif result = @src.scan(BLANK_LINE)
+            nested_list_found = true
+            last_is_blank = true
+            item.value.last << result
+          else
+            break
+          end
+        end
+
+        @tree.children << list
+
+        last = nil
+        list.children.each do |it|
+          temp = Element.new(:temp, nil, nil, :location => it.options[:location])
+
+          env = save_env
+          location = it.options[:location]
+          it.value.each do |val|
+            @src = ::Kramdown::Utils::StringScanner.new(val, location)
+            parse_blocks(temp)
+            location = @src.current_line_number
+          end
+          restore_env(env)
+
+          it.children = temp.children
+          it.value = nil
+          next if it.children.size == 0
+
+          # Handle the case where an EOB marker is inserted by a block IAL for the first paragraph
+          it.children.delete_at(1) if it.children.first.type == :p &&
+            it.children.length >= 2 && it.children[1].type == :eob && it.children.first.options[:ial]
+
+          if it.children.first.type == :p &&
+              (it.children.length < 2 || it.children[1].type != :blank ||
+               (it == list.children.last && it.children.length == 2 && !eob_found)) &&
+              (list.children.last != it || list.children.size == 1 ||
+               list.children[0..-2].any? {|cit| !cit.children.first || cit.children.first.type != :p || cit.children.first.options[:transparent]})
+            it.children.first.children.first.value << "\n" if it.children.size > 1 && it.children[1].type != :blank
+            it.children.first.options[:transparent] = true
+          end
+
+          if it.children.last.type == :blank
+            last = it.children.pop
+          else
+            last = nil
+          end
+        end
+
+        @tree.children << last if !last.nil? && !eob_found
+
+        true
+      end
+      define_parser(:list, LIST_START)
+
+
+      DEFINITION_LIST_START = /^(#{OPT_SPACE}:)([\t| ].*?\n)/
+
+      # Parse the ordered or unordered list at the current location.
+      def parse_definition_list
+        children = @tree.children
+        if !children.last || (children.length == 1 && children.last.type != :p ) ||
+            (children.length >= 2 && children[-1].type != :p && (children[-1].type != :blank || children[-1].value != "\n" || children[-2].type != :p))
+          return false
+        end
+
+        first_as_para = false
+        deflist = new_block_el(:dl)
+        para = @tree.children.pop
+        if para.type == :blank
+          para = @tree.children.pop
+          first_as_para = true
+        end
+        deflist.options[:location] = para.options[:location] # take location from preceding para which is the first definition term
+        para.children.first.value.split(/\n/).each do |term|
+          el = Element.new(:dt, nil, nil, :location => @src.current_line_number)
+          term.sub!(self.class::LIST_ITEM_IAL) do
+            parse_attribute_list($1, el.options[:ial] ||= {})
+            ''
+          end
+          el.options[:raw_text] = term
+          el.children << Element.new(:raw_text, term)
+          deflist.children << el
+        end
+        deflist.options[:ial] = para.options[:ial]
+
+        item = nil
+        content_re, lazy_re, indent_re = nil
+        def_start_re = DEFINITION_LIST_START
+        last_is_blank = false
+        while !@src.eos?
+          start_line_number = @src.current_line_number
+          if @src.scan(def_start_re)
+            item = Element.new(:dd, nil, nil, :location => start_line_number)
+            item.options[:first_as_para] = first_as_para
+            item.value, indentation, content_re, lazy_re, indent_re = parse_first_list_line(@src[1].length, @src[2])
+            deflist.children << item
+
+            item.value.sub!(self.class::LIST_ITEM_IAL) do |match|
+              parse_attribute_list($1, item.options[:ial] ||= {})
+              ''
+            end
+
+            def_start_re = /^( {0,#{[3, indentation - 1].min}}:)([\t| ].*?\n)/
+            first_as_para = false
+            last_is_blank = false
+          elsif @src.check(EOB_MARKER)
+            break
+          elsif (result = @src.scan(content_re)) || (!last_is_blank && (result = @src.scan(lazy_re)))
+            result.sub!(/^(\t+)/) { " "*($1 ? 4*$1.length : 0) }
+            result.sub!(indent_re, '')
+            item.value << result
+            first_as_para = false
+            last_is_blank = false
+          elsif result = @src.scan(BLANK_LINE)
+            first_as_para = true
+            item.value << result
+            last_is_blank = true
+          else
+            break
+          end
+        end
+
+        last = nil
+        deflist.children.each do |it|
+          next if it.type == :dt
+
+          parse_blocks(it, it.value)
+          it.value = nil
+          next if it.children.size == 0
+
+          if it.children.last.type == :blank
+            last = it.children.pop
+          else
+            last = nil
+          end
+
+          if it.children.first && it.children.first.type == :p && !it.options.delete(:first_as_para)
+            it.children.first.children.first.value << "\n" if it.children.size > 1
+            it.children.first.options[:transparent] = true
+          end
+        end
+
+        if @tree.children.length >= 1 && @tree.children.last.type == :dl
+          @tree.children[-1].children.concat(deflist.children)
+        elsif @tree.children.length >= 2 && @tree.children[-1].type == :blank && @tree.children[-2].type == :dl
+          @tree.children.pop
+          @tree.children[-1].children.concat(deflist.children)
+        else
+          @tree.children << deflist
+        end
+
+        @tree.children << last if !last.nil?
+
+        true
+      end
+      define_parser(:definition_list, DEFINITION_LIST_START)
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/math.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/math.rb
new file mode 100644
index 0000000..b45c498
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/math.rb
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/kramdown/block_boundary'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      BLOCK_MATH_START = /^#{OPT_SPACE}(\\)?\$\$(.*?)\$\$(\s*?\n)?/m
+
+      # Parse the math block at the current location.
+      def parse_block_math
+        start_line_number = @src.current_line_number
+        if !after_block_boundary?
+          return false
+        elsif @src[1]
+          @src.scan(/^#{OPT_SPACE}\\/) if @src[3]
+          return false
+        end
+
+        saved_pos = @src.save_pos
+        @src.pos += @src.matched_size
+        data = @src[2].strip
+        if before_block_boundary?
+          @tree.children << new_block_el(:math, data, nil, :category => :block, :location => start_line_number)
+          true
+        else
+          @src.revert_pos(saved_pos)
+          false
+        end
+      end
+      define_parser(:block_math, BLOCK_MATH_START)
+
+
+      INLINE_MATH_START = /\$\$(.*?)\$\$/m
+
+      # Parse the inline math at the current location.
+      def parse_inline_math
+        start_line_number = @src.current_line_number
+        @src.pos += @src.matched_size
+        @tree.children << Element.new(:math, @src[1].strip, nil, :category => :span, :location => start_line_number)
+      end
+      define_parser(:inline_math, INLINE_MATH_START, '\$')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/paragraph.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/paragraph.rb
new file mode 100644
index 0000000..765e2f5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/paragraph.rb
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/kramdown/blank_line'
+require 'kramdown/parser/kramdown/extensions'
+require 'kramdown/parser/kramdown/eob'
+require 'kramdown/parser/kramdown/list'
+require 'kramdown/parser/kramdown/html'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      LAZY_END_HTML_SPAN_ELEMENTS = HTML_SPAN_ELEMENTS + %w{script}
+      LAZY_END_HTML_START = /<(?>(?!(?:#{LAZY_END_HTML_SPAN_ELEMENTS.join('|')})\b)#{REXML::Parsers::BaseParser::UNAME_STR})/
+      LAZY_END_HTML_STOP = /<\/(?!(?:#{LAZY_END_HTML_SPAN_ELEMENTS.join('|')})\b)#{REXML::Parsers::BaseParser::UNAME_STR}\s*>/m
+
+      LAZY_END = /#{BLANK_LINE}|#{IAL_BLOCK_START}|#{EOB_MARKER}|^#{OPT_SPACE}#{LAZY_END_HTML_STOP}|^#{OPT_SPACE}#{LAZY_END_HTML_START}|\Z/
+
+      PARAGRAPH_START = /^#{OPT_SPACE}[^ \t].*?\n/
+      PARAGRAPH_MATCH = /^.*?\n/
+      PARAGRAPH_END = /#{LAZY_END}|#{DEFINITION_LIST_START}/
+
+      # Parse the paragraph at the current location.
+      def parse_paragraph
+        start_line_number = @src.current_line_number
+        result = @src.scan(PARAGRAPH_MATCH)
+        while !@src.match?(paragraph_end)
+          result << @src.scan(PARAGRAPH_MATCH)
+        end
+        result.rstrip!
+        if @tree.children.last && @tree.children.last.type == :p
+          @tree.children.last.children.first.value << "\n" << result
+        else
+          @tree.children << new_block_el(:p, nil, nil, :location => start_line_number)
+          result.lstrip!
+          add_text(result, @tree.children.last)
+        end
+        true
+      end
+      define_parser(:paragraph, PARAGRAPH_START)
+
+      def paragraph_end
+        self.class::PARAGRAPH_END
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/smart_quotes.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/smart_quotes.rb
new file mode 100644
index 0000000..731f039
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/smart_quotes.rb
@@ -0,0 +1,174 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+#--
+# Parts of this file are based on code from RubyPants:
+#
+# = RubyPants -- SmartyPants ported to Ruby
+#
+# Ported by Christian Neukirchen <mailto:chneukirchen@gmail.com>
+#   Copyright (C) 2004 Christian Neukirchen
+#
+# Incooporates ideas, comments and documentation by Chad Miller
+#   Copyright (C) 2004 Chad Miller
+#
+# Original SmartyPants by John Gruber
+#   Copyright (C) 2003 John Gruber
+#
+#
+# = RubyPants -- SmartyPants ported to Ruby
+#
+#
+# [snip]
+#
+# == Authors
+#
+# John Gruber did all of the hard work of writing this software in
+# Perl for Movable Type and almost all of this useful documentation.
+# Chad Miller ported it to Python to use with Pyblosxom.
+#
+# Christian Neukirchen provided the Ruby port, as a general-purpose
+# library that follows the *Cloth API.
+#
+#
+# == Copyright and License
+#
+# === SmartyPants license:
+#
+# Copyright (c) 2003 John Gruber
+# (http://daringfireball.net)
+# 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.
+#
+# * Neither the name "SmartyPants" nor the names of its contributors
+#   may be used to endorse or promote products derived from this
+#   software without specific prior written permission.
+#
+# 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 owner 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.
+#
+# === RubyPants license
+#
+# RubyPants is a derivative work of SmartyPants and smartypants.py.
+#
+# 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 owner 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.
+#
+# == Links
+#
+# John Gruber:: http://daringfireball.net
+# SmartyPants:: http://daringfireball.net/projects/smartypants
+#
+# Chad Miller:: http://web.chad.org
+#
+# Christian Neukirchen:: http://kronavita.de/chris
+#
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      SQ_PUNCT = '[!"#\$\%\'()*+,\-.\/:;<=>?\@\[\\\\\]\^_`{|}~]'
+      SQ_CLOSE = %![^\ \\\\\t\r\n\\[{(-]!
+
+      SQ_RULES = [
+                  [/("|')(?=[_*]{1,2}\S)/, [:lquote1]],
+                  [/("|')(?=#{SQ_PUNCT}(?!\.\.)\B)/, [:rquote1]],
+                  # Special case for double sets of quotes, e.g.:
+                  #   <p>He said, "'Quoted' words in a larger quote."</p>
+                  [/(\s?)"'(?=\w)/, [1, :ldquo, :lsquo]],
+                  [/(\s?)'"(?=\w)/, [1, :lsquo, :ldquo]],
+                  # Special case for decade abbreviations (the '80s):
+                  [/(\s?)'(?=\d\ds)/, [1, :rsquo]],
+
+                  # Get most opening single/double quotes:
+                  [/(\s)('|")(?=\w)/, [1, :lquote2]],
+                  # Single/double closing quotes:
+                  [/(#{SQ_CLOSE})('|")/, [1, :rquote2]],
+                  # Special case for e.g. "<i>Custer</i>'s Last Stand."
+                  [/("|')(?=\s|s\b|$)/, [:rquote1]],
+                  # Any remaining single quotes should be opening ones:
+                  [/(.?)'/m, [1, :lsquo]],
+                  [/(.?)"/m, [1, :ldquo]],
+                 ] #'"
+
+      SQ_SUBSTS = {
+        [:rquote1, '"'] => :rdquo,
+        [:rquote1, "'"] => :rsquo,
+        [:rquote2, '"'] => :rdquo,
+        [:rquote2, "'"] => :rsquo,
+        [:lquote1, '"'] => :ldquo,
+        [:lquote1, "'"] => :lsquo,
+        [:lquote2, '"'] => :ldquo,
+        [:lquote2, "'"] => :lsquo,
+      }
+      SMART_QUOTES_RE = /[^\\]?["']/
+
+      # Parse the smart quotes at current location.
+      def parse_smart_quotes
+        start_line_number = @src.current_line_number
+        substs = SQ_RULES.find {|reg, subst| @src.scan(reg)}[1]
+        substs.each do |subst|
+          if subst.kind_of?(Integer)
+            add_text(@src[subst])
+          else
+            val = SQ_SUBSTS[[subst, @src[subst.to_s[-1,1].to_i]]] || subst
+            @tree.children << Element.new(:smart_quote, val, nil, :location => start_line_number)
+          end
+        end
+      end
+      define_parser(:smart_quotes, SMART_QUOTES_RE, '[^\\\\]?["\']')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/table.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/table.rb
new file mode 100644
index 0000000..06e37f1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/table.rb
@@ -0,0 +1,173 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser/kramdown/block_boundary'
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      TABLE_SEP_LINE = /^([+|: \t-]*?-[+|: \t-]*?)[ \t]*\n/
+      TABLE_HSEP_ALIGN = /[ \t]?(:?)-+(:?)[ \t]?/
+      TABLE_FSEP_LINE = /^[+|: \t=]*?=[+|: \t=]*?[ \t]*\n/
+      TABLE_ROW_LINE = /^(.*?)[ \t]*\n/
+      TABLE_PIPE_CHECK = /(?:\||.*?[^\\\n]\|)/
+      TABLE_LINE = /#{TABLE_PIPE_CHECK}.*?\n/
+      TABLE_START = /^#{OPT_SPACE}(?=\S)#{TABLE_LINE}/
+
+      # Parse the table at the current location.
+      def parse_table
+        return false if !after_block_boundary?
+
+        saved_pos = @src.save_pos
+        orig_pos = @src.pos
+        table = new_block_el(:table, nil, nil, :alignment => [], :location => @src.current_line_number)
+        leading_pipe = (@src.check(TABLE_LINE) =~ /^\s*\|/)
+        @src.scan(TABLE_SEP_LINE)
+
+        rows = []
+        has_footer = false
+        columns = 0
+
+        add_container = lambda do |type, force|
+          if !has_footer || type != :tbody || force
+            cont = Element.new(type)
+            cont.children, rows = rows, []
+            table.children << cont
+          end
+        end
+
+        while !@src.eos?
+          break if !@src.check(TABLE_LINE)
+          if @src.scan(TABLE_SEP_LINE)
+            if rows.empty?
+              # nothing to do, ignoring multiple consecutive separator lines
+            elsif table.options[:alignment].empty? && !has_footer
+              add_container.call(:thead, false)
+              table.options[:alignment] = @src[1].scan(TABLE_HSEP_ALIGN).map do |left, right|
+                (left.empty? && right.empty? && :default) || (right.empty? && :left) || (left.empty? && :right) || :center
+              end
+            else # treat as normal separator line
+              add_container.call(:tbody, false)
+            end
+          elsif @src.scan(TABLE_FSEP_LINE)
+            add_container.call(:tbody, true) if !rows.empty?
+            has_footer = true
+          elsif @src.scan(TABLE_ROW_LINE)
+            trow = Element.new(:tr)
+
+            # parse possible code spans on the line and correctly split the line into cells
+            env = save_env
+            cells = []
+            @src[1].split(/(<code.*?>.*?<\/code>)/).each_with_index do |str, i|
+              if i % 2 == 1
+                (cells.empty? ? cells : cells.last) << str
+              else
+                reset_env(:src => Kramdown::Utils::StringScanner.new(str, @src.current_line_number))
+                root = Element.new(:root)
+                parse_spans(root, nil, [:codespan])
+
+                root.children.each do |c|
+                  if c.type == :raw_text
+                    # Only on Ruby 1.9: f, *l = c.value.split(/(?<!\\)\|/).map {|t| t.gsub(/\\\|/, '|')}
+                    f, *l = c.value.split(/\\\|/, -1).map {|t| t.split(/\|/, -1)}.inject([]) do |memo, t|
+                      memo.last << "|#{t.shift}" if memo.size > 0
+                      memo.concat(t)
+                    end
+                    (cells.empty? ? cells : cells.last) << f
+                    cells.concat(l)
+                  else
+                    delim = (c.value.scan(/`+/).max || '') + '`'
+                    tmp = "#{delim}#{' ' if delim.size > 1}#{c.value}#{' ' if delim.size > 1}#{delim}"
+                    (cells.empty? ? cells : cells.last) << tmp
+                  end
+                end
+              end
+            end
+            restore_env(env)
+
+            cells.shift if leading_pipe && cells.first.strip.empty?
+            cells.pop if cells.last.strip.empty?
+            cells.each do |cell_text|
+              tcell = Element.new(:td)
+              tcell.children << Element.new(:raw_text, cell_text.strip)
+              trow.children << tcell
+            end
+            columns = [columns, cells.length].max
+            rows << trow
+          else
+            break
+          end
+        end
+
+        if !before_block_boundary?
+          @src.revert_pos(saved_pos)
+          return false
+        end
+
+        # Parse all lines of the table with the code span parser
+        env = save_env
+        l_src = ::Kramdown::Utils::StringScanner.new(extract_string(orig_pos...(@src.pos-1), @src),
+                                                     @src.current_line_number)
+        reset_env(:src => l_src)
+        root = Element.new(:root)
+        parse_spans(root, nil, [:codespan, :span_html])
+        restore_env(env)
+
+        # Check if each line has at least one unescaped pipe that is not inside a code span/code
+        # HTML element
+        # Note: It doesn't matter that we parse *all* span HTML elements because the row splitting
+        # algorithm above only takes <code> elements into account!
+        pipe_on_line = false
+        while (c = root.children.shift)
+          lines = c.value.split(/\n/)
+          if c.type == :codespan
+            if lines.size > 2 || (lines.size == 2 && !pipe_on_line)
+              break
+            elsif lines.size == 2 && pipe_on_line
+              pipe_on_line = false
+            end
+          else
+            break if lines.size > 1 && !pipe_on_line && lines.first !~ /^#{TABLE_PIPE_CHECK}/
+            pipe_on_line = (lines.size > 1 ? false : pipe_on_line) || (lines.last =~ /^#{TABLE_PIPE_CHECK}/)
+          end
+        end
+        @src.revert_pos(saved_pos) and return false if !pipe_on_line
+
+        add_container.call(has_footer ? :tfoot : :tbody, false) if !rows.empty?
+
+        if !table.children.any? {|el| el.type == :tbody}
+          warning("Found table without body on line #{table.options[:location]} - ignoring it")
+          @src.revert_pos(saved_pos)
+          return false
+        end
+
+        # adjust all table rows to have equal number of columns, same for alignment defs
+        table.children.each do |kind|
+          kind.children.each do |row|
+            (columns - row.children.length).times do
+              row.children << Element.new(:td)
+            end
+          end
+        end
+        if table.options[:alignment].length > columns
+          table.options[:alignment] = table.options[:alignment][0...columns]
+        else
+          table.options[:alignment] += [:default] * (columns - table.options[:alignment].length)
+        end
+
+        @tree.children << table
+
+        true
+      end
+      define_parser(:table, TABLE_START)
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/typographic_symbol.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/typographic_symbol.rb
new file mode 100644
index 0000000..59a5ee4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/kramdown/typographic_symbol.rb
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Parser
+    class Kramdown
+
+      TYPOGRAPHIC_SYMS = [['---', :mdash], ['--', :ndash], ['...', :hellip],
+                          ['\\<<', '&lt;&lt;'], ['\\>>', '&gt;&gt;'],
+                          ['<< ', :laquo_space], [' >>', :raquo_space],
+                          ['<<', :laquo], ['>>', :raquo]]
+      TYPOGRAPHIC_SYMS_SUBST = Hash[*TYPOGRAPHIC_SYMS.flatten]
+      TYPOGRAPHIC_SYMS_RE = /#{TYPOGRAPHIC_SYMS.map {|k,v| Regexp.escape(k)}.join('|')}/
+
+      # Parse the typographic symbols at the current location.
+      def parse_typographic_syms
+        start_line_number = @src.current_line_number
+        @src.pos += @src.matched_size
+        val = TYPOGRAPHIC_SYMS_SUBST[@src.matched]
+        if val.kind_of?(Symbol)
+          @tree.children << Element.new(:typographic_sym, val, nil, :location => start_line_number)
+        elsif @src.matched == '\\<<'
+          @tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity('lt'),
+                                        nil, :location => start_line_number)
+          @tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity('lt'),
+                                        nil, :location => start_line_number)
+        else
+          @tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity('gt'),
+                                        nil, :location => start_line_number)
+          @tree.children << Element.new(:entity, ::Kramdown::Utils::Entities.entity('gt'),
+                                        nil, :location => start_line_number)
+        end
+      end
+      define_parser(:typographic_syms, TYPOGRAPHIC_SYMS_RE, '--|\\.\\.\\.|(?:\\\\| )?(?:<<|>>)')
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/markdown.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/markdown.rb
new file mode 100644
index 0000000..111faf7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/parser/markdown.rb
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'kramdown/parser'
+
+module Kramdown
+
+  module Parser
+
+    # Used for parsing a document in Markdown format.
+    #
+    # This parser is based on the kramdown parser and removes the parser methods for the additional
+    # non-Markdown features. However, since some things are handled differently by the kramdown
+    # parser methods (like deciding when a list item contains just text), this parser differs from
+    # real Markdown parsers in some respects.
+    #
+    # Note, though, that the parser basically fails just one of the Markdown test cases (some others
+    # also fail but those failures are negligible).
+    class Markdown < Kramdown
+
+      # Array with all the parsing methods that should be removed from the standard kramdown parser.
+      EXTENDED = [:codeblock_fenced, :table, :definition_list, :footnote_definition, :abbrev_definition, :block_math,
+                  :block_extensions,
+                  :footnote_marker, :smart_quotes, :inline_math, :span_extensions, :typographic_syms]
+
+      def initialize(source, options) # :nodoc:
+        super
+        @block_parsers.delete_if {|i| EXTENDED.include?(i)}
+        @span_parsers.delete_if {|i| EXTENDED.include?(i)}
+      end
+
+      # :stopdoc:
+
+      BLOCK_BOUNDARY = /#{BLANK_LINE}|#{EOB_MARKER}|\Z/
+      LAZY_END = /#{BLANK_LINE}|#{EOB_MARKER}|^#{OPT_SPACE}#{LAZY_END_HTML_STOP}|^#{OPT_SPACE}#{LAZY_END_HTML_START}|\Z/
+      CODEBLOCK_MATCH = /(?:#{BLANK_LINE}?(?:#{INDENT}[ \t]*\S.*\n)+)*/
+      PARAGRAPH_END = LAZY_END
+
+      IAL_RAND_CHARS = (('a'..'z').to_a + ('0'..'9').to_a)
+      IAL_RAND_STRING = (1..20).collect {|a| IAL_RAND_CHARS[rand(IAL_RAND_CHARS.size)]}.join
+      LIST_ITEM_IAL = /^\s*(#{IAL_RAND_STRING})?\s*\n/
+      IAL_SPAN_START = LIST_ITEM_IAL
+
+      # :startdoc:
+
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils.rb
new file mode 100644
index 0000000..d253e48
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils.rb
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+
+  # == \Utils Module
+  #
+  # This module contains utility class/modules/methods that can be used by both parsers and
+  # converters.
+  module Utils
+
+    autoload :Entities, 'kramdown/utils/entities'
+    autoload :Html, 'kramdown/utils/html'
+    autoload :OrderedHash, 'kramdown/utils/ordered_hash'
+    autoload :Unidecoder, 'kramdown/utils/unidecoder'
+    autoload :StringScanner, 'kramdown/utils/string_scanner'
+    autoload :Configurable, 'kramdown/utils/configurable'
+
+    # Treat +name+ as if it were snake cased (e.g. snake_case) and camelize it (e.g. SnakeCase).
+    def self.camelize(name)
+      name.split('_').inject('') {|s,x| s << x[0..0].upcase << x[1..-1] }
+    end
+
+    # Treat +name+ as if it were camelized (e.g. CamelizedName) and snake-case it (e.g. camelized_name).
+    def self.snake_case(name)
+      name = name.dup
+      name.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
+      name.gsub!(/([a-z])([A-Z])/,'\1_\2')
+      name.downcase!
+      name
+    end
+
+    if RUBY_VERSION < '2.0'
+
+      # Resolve the recursive constant +str+.
+      def self.deep_const_get(str)
+        names = str.split(/::/)
+        names.shift if names.first.empty?
+        names.inject(::Object) {|mod, s| mod.const_get(s)}
+      end
+
+    else
+
+      def self.deep_const_get(str)
+        ::Object.const_get(str)
+      end
+
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/configurable.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/configurable.rb
new file mode 100644
index 0000000..581b840
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/configurable.rb
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+  module Utils
+
+    # Methods for registering configurable extensions.
+    module Configurable
+
+      # Create a new configurable extension called +name+.
+      #
+      # Three methods will be defined on the calling object which allow to use this configurable
+      # extension:
+      #
+      # configurables:: Returns a hash of hashes that is used to store all configurables of the
+      #                 object.
+      #
+      # <name>(ext_name):: Return the configured extension +ext_name+.
+      #
+      # add_<name>(ext_name, data=nil, &block):: Define an extension +ext_name+ by specifying either
+      #                                          the data as argument or by using a block.
+      def configurable(name)
+        singleton_class = (class << self; self; end)
+        singleton_class.send(:define_method, :configurables) do
+          @_configurables ||= Hash.new {|h, k| h[k] = {}}
+        end unless respond_to?(:configurables)
+        singleton_class.send(:define_method, name) do |data|
+          configurables[name][data]
+        end
+        singleton_class.send(:define_method, "add_#{name}".intern) do |data, *args, &block|
+          configurables[name][data] = args.first || block
+        end
+      end
+
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/entities.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/entities.rb
new file mode 100644
index 0000000..77f1f0d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/entities.rb
@@ -0,0 +1,347 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+
+  module Utils
+
+    # Provides convenience methods for handling named and numeric entities.
+    module Entities
+
+      # Represents an entity that has a +code_point+ and +name+.
+      class Entity < Struct.new(:code_point, :name)
+
+        # Return the UTF8 representation of the entity.
+        def char
+          [code_point].pack('U*') rescue nil
+        end
+
+      end
+
+      # Array of arrays. Each sub-array specifies a code point and the associated name.
+      #
+      # This table is not used directly -- Entity objects are automatically created from it and put
+      # into a Hash map when this file is loaded.
+      ENTITY_TABLE = [
+                      [913, 'Alpha'],
+                      [914, 'Beta'],
+                      [915, 'Gamma'],
+                      [916, 'Delta'],
+                      [917, 'Epsilon'],
+                      [918, 'Zeta'],
+                      [919, 'Eta'],
+                      [920, 'Theta'],
+                      [921, 'Iota'],
+                      [922, 'Kappa'],
+                      [923, 'Lambda'],
+                      [924, 'Mu'],
+                      [925, 'Nu'],
+                      [926, 'Xi'],
+                      [927, 'Omicron'],
+                      [928, 'Pi'],
+                      [929, 'Rho'],
+                      [931, 'Sigma'],
+                      [932, 'Tau'],
+                      [933, 'Upsilon'],
+                      [934, 'Phi'],
+                      [935, 'Chi'],
+                      [936, 'Psi'],
+                      [937, 'Omega'],
+                      [945, 'alpha'],
+                      [946, 'beta'],
+                      [947, 'gamma'],
+                      [948, 'delta'],
+                      [949, 'epsilon'],
+                      [950, 'zeta'],
+                      [951, 'eta'],
+                      [952, 'theta'],
+                      [953, 'iota'],
+                      [954, 'kappa'],
+                      [955, 'lambda'],
+                      [956, 'mu'],
+                      [957, 'nu'],
+                      [958, 'xi'],
+                      [959, 'omicron'],
+                      [960, 'pi'],
+                      [961, 'rho'],
+                      [963, 'sigma'],
+                      [964, 'tau'],
+                      [965, 'upsilon'],
+                      [966, 'phi'],
+                      [967, 'chi'],
+                      [968, 'psi'],
+                      [969, 'omega'],
+                      [962, 'sigmaf'],
+                      [977, 'thetasym'],
+                      [978, 'upsih'],
+                      [982, 'piv'],
+                      [8204, 'zwnj'],
+                      [8205, 'zwj'],
+                      [8206, 'lrm'],
+                      [8207, 'rlm'],
+                      [8230, 'hellip'],
+                      [8242, 'prime'],
+                      [8243, 'Prime'],
+                      [8254, 'oline'],
+                      [8260, 'frasl'],
+                      [8472, 'weierp'],
+                      [8465, 'image'],
+                      [8476, 'real'],
+                      [8501, 'alefsym'],
+                      [8226, 'bull'],
+                      [8482, 'trade'],
+                      [8592, 'larr'],
+                      [8594, 'rarr'],
+                      [8593, 'uarr'],
+                      [8595, 'darr'],
+                      [8596, 'harr'],
+                      [8629, 'crarr'],
+                      [8657, 'uArr'],
+                      [8659, 'dArr'],
+                      [8656, 'lArr'],
+                      [8658, 'rArr'],
+                      [8660, 'hArr'],
+                      [8704, 'forall'],
+                      [8706, 'part'],
+                      [8707, 'exist'],
+                      [8709, 'empty'],
+                      [8711, 'nabla'],
+                      [8712, 'isin'],
+                      [8715, 'ni'],
+                      [8713, 'notin'],
+                      [8721, 'sum'],
+                      [8719, 'prod'],
+                      [8722, 'minus'],
+                      [8727, 'lowast'],
+                      [8730, 'radic'],
+                      [8733, 'prop'],
+                      [8734, 'infin'],
+                      [8736, 'ang'],
+                      [8743, 'and'],
+                      [8744, 'or'],
+                      [8745, 'cup'],
+                      [8746, 'cap'],
+                      [8747, 'int'],
+                      [8756, 'there4'],
+                      [8764, 'sim'],
+                      [8776, 'asymp'],
+                      [8773, 'cong'],
+                      [8800, 'ne'],
+                      [8801, 'equiv'],
+                      [8804, 'le'],
+                      [8805, 'ge'],
+                      [8834, 'sub'],
+                      [8835, 'sup'],
+                      [8838, 'sube'],
+                      [8839, 'supe'],
+                      [8836, 'nsub'],
+                      [8853, 'oplus'],
+                      [8855, 'otimes'],
+                      [8869, 'perp'],
+                      [8901, 'sdot'],
+                      [8942, 'vellip'],
+                      [8968, 'rceil'],
+                      [8969, 'lceil'],
+                      [8970, 'lfloor'],
+                      [8971, 'rfloor'],
+                      [9001, 'rang'],
+                      [9002, 'lang'],
+                      [9674, 'loz'],
+                      [9824, 'spades'],
+                      [9827, 'clubs'],
+                      [9829, 'hearts'],
+                      [9830, 'diams'],
+                      [38, 'amp'],
+                      [34, 'quot'],
+                      [39, 'apos'],
+                      [169, 'copy'],
+                      [60, 'lt'],
+                      [62, 'gt'],
+                      [338, 'OElig'],
+                      [339, 'oelig'],
+                      [352, 'Scaron'],
+                      [353, 'scaron'],
+                      [376, 'Yuml'],
+                      [710, 'circ'],
+                      [732, 'tilde'],
+                      [8211, 'ndash'],
+                      [8212, 'mdash'],
+                      [8216, 'lsquo'],
+                      [8217, 'rsquo'],
+                      [8220, 'ldquo'],
+                      [8221, 'rdquo'],
+                      [8224, 'dagger'],
+                      [8225, 'Dagger'],
+                      [8240, 'permil'],
+                      [8364, 'euro'],
+                      [8249, 'lsaquo'],
+                      [8250, 'rsaquo'],
+                      [160, 'nbsp'],
+                      [161, 'iexcl'],
+                      [163, 'pound'],
+                      [164, 'curren'],
+                      [165, 'yen'],
+                      [166, 'brvbar'],
+                      [167, 'sect'],
+                      [168, 'uml'],
+                      [171, 'laquo'],
+                      [187, 'raquo'],
+                      [174, 'reg'],
+                      [170, 'ordf'],
+                      [172, 'not'],
+                      [173, 'shy'],
+                      [175, 'macr'],
+                      [176, 'deg'],
+                      [177, 'plusmn'],
+                      [180, 'acute'],
+                      [181, 'micro'],
+                      [182, 'para'],
+                      [183, 'middot'],
+                      [184, 'cedil'],
+                      [186, 'ordm'],
+                      [162, 'cent'],
+                      [185, 'sup1'],
+                      [178, 'sup2'],
+                      [179, 'sup3'],
+                      [189, 'frac12'],
+                      [188, 'frac14'],
+                      [190, 'frac34'],
+                      [191, 'iquest'],
+                      [192, 'Agrave'],
+                      [193, 'Aacute'],
+                      [194, 'Acirc'],
+                      [195, 'Atilde'],
+                      [196, 'Auml'],
+                      [197, 'Aring'],
+                      [198, 'AElig'],
+                      [199, 'Ccedil'],
+                      [200, 'Egrave'],
+                      [201, 'Eacute'],
+                      [202, 'Ecirc'],
+                      [203, 'Euml'],
+                      [204, 'Igrave'],
+                      [205, 'Iacute'],
+                      [206, 'Icirc'],
+                      [207, 'Iuml'],
+                      [208, 'ETH'],
+                      [209, 'Ntilde'],
+                      [210, 'Ograve'],
+                      [211, 'Oacute'],
+                      [212, 'Ocirc'],
+                      [213, 'Otilde'],
+                      [214, 'Ouml'],
+                      [215, 'times'],
+                      [216, 'Oslash'],
+                      [217, 'Ugrave'],
+                      [218, 'Uacute'],
+                      [219, 'Ucirc'],
+                      [220, 'Uuml'],
+                      [221, 'Yacute'],
+                      [222, 'THORN'],
+                      [223, 'szlig'],
+                      [224, 'agrave'],
+                      [225, 'aacute'],
+                      [226, 'acirc'],
+                      [227, 'atilde'],
+                      [228, 'auml'],
+                      [229, 'aring'],
+                      [230, 'aelig'],
+                      [231, 'ccedil'],
+                      [232, 'egrave'],
+                      [233, 'eacute'],
+                      [234, 'ecirc'],
+                      [235, 'euml'],
+                      [236, 'igrave'],
+                      [237, 'iacute'],
+                      [238, 'icirc'],
+                      [239, 'iuml'],
+                      [240, 'eth'],
+                      [241, 'ntilde'],
+                      [242, 'ograve'],
+                      [243, 'oacute'],
+                      [244, 'ocirc'],
+                      [245, 'otilde'],
+                      [246, 'ouml'],
+                      [247, 'divide'],
+                      [248, 'oslash'],
+                      [249, 'ugrave'],
+                      [250, 'uacute'],
+                      [251, 'ucirc'],
+                      [252, 'uuml'],
+                      [253, 'yacute'],
+                      [254, 'thorn'],
+                      [255, 'yuml'],
+
+                      [8218, 'sbquo'],
+                      [402, 'fnof'],
+                      [8222, 'bdquo'],
+
+                      [128, 8364],
+                      [130, 8218],
+                      [131, 402],
+                      [132, 8222],
+                      [133, 8230],
+                      [134, 8224],
+                      [135, 8225],
+                      [136, 710],
+                      [137, 8240],
+                      [138, 352],
+                      [139, 8249],
+                      [140, 338],
+                      [142, 381],
+                      [145, 8216],
+                      [146, 8217],
+                      [147, 8220],
+                      [148, 8221],
+                      [149, 8226],
+                      [150, 8211],
+                      [151, 8212],
+                      [152, 732],
+                      [153, 8482],
+                      [154, 353],
+                      [155, 8250],
+                      [156, 339],
+                      [158, 382],
+                      [159, 376],
+
+                      [8194, 'ensp'],
+                      [8195, 'emsp'],
+                      [8201, 'thinsp'],
+                     ]
+
+      # Contains the mapping of code point (or name) to the actual Entity object.
+      ENTITY_MAP = Hash.new do |h,k|
+        if k.kind_of?(Integer)
+          h[k] = Entity.new(k, nil)
+        else
+          raise Kramdown::Error, "Can't handle generic non-integer character reference '#{k}'"
+        end
+      end
+
+      ENTITY_TABLE.each do |code_point, data|
+        if data.kind_of?(String)
+          ENTITY_MAP[code_point] = ENTITY_MAP[data] = Entity.new(code_point, data)
+        else
+          ENTITY_MAP[code_point] = ENTITY_MAP[data]
+        end
+      end
+
+      # Return the entity for the given code point or name +point_or_name+.
+      def entity(point_or_name)
+        ENTITY_MAP[point_or_name]
+      end
+
+      module_function :entity
+
+    end
+
+  end
+
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/html.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/html.rb
new file mode 100644
index 0000000..63dddca
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/html.rb
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'rexml/parsers/baseparser'
+
+module Kramdown
+
+  module Utils
+
+    # Provides convenience methods for HTML related tasks.
+    #
+    # *Note* that this module has to be mixed into a class that has a @root (containing an element
+    # of type :root) and an @options (containing an options hash) instance variable so that some of
+    # the methods can work correctly.
+    module Html
+
+      # Convert the entity +e+ to a string. The optional parameter +original+ may contain the
+      # original representation of the entity.
+      #
+      # This method uses the option +entity_output+ to determine the output form for the entity.
+      def entity_to_str(e, original = nil)
+        entity_output = @options[:entity_output]
+
+        if e.char.respond_to?(:encoding) && entity_output == :as_char &&
+            (c = e.char.encode(@root.options[:encoding]) rescue nil) &&
+            ((c = e.char) == '"' || !ESCAPE_MAP.has_key?(c))
+          c
+        elsif (entity_output == :as_input || entity_output == :as_char) && original
+          original
+        elsif (entity_output == :symbolic || ESCAPE_MAP.has_key?(e.char)) && !e.name.nil?
+          "&#{e.name};"
+        else # default to :numeric
+          "&##{e.code_point};"
+        end
+      end
+
+      # Return the HTML representation of the attributes +attr+.
+      def html_attributes(attr)
+        attr.map {|k,v| v.nil? || (k == 'id' && v.strip.empty?) ? '' : " #{k}=\"#{escape_html(v.to_s, :attribute)}\"" }.join('')
+      end
+
+      # :stopdoc:
+      ESCAPE_MAP = {
+        '<' => '&lt;',
+        '>' => '&gt;',
+        '&' => '&amp;',
+        '"' => '&quot;'
+      }
+      ESCAPE_ALL_RE = /<|>|&/
+      ESCAPE_TEXT_RE = Regexp.union(REXML::Parsers::BaseParser::REFERENCE_RE, /<|>|&/)
+      ESCAPE_ATTRIBUTE_RE = Regexp.union(REXML::Parsers::BaseParser::REFERENCE_RE, /<|>|&|"/)
+      ESCAPE_RE_FROM_TYPE = {
+        :all => ESCAPE_ALL_RE,
+        :text => ESCAPE_TEXT_RE,
+        :attribute => ESCAPE_ATTRIBUTE_RE
+      }
+      # :startdoc:
+
+      # Escape the special HTML characters in the string +str+. The parameter +type+ specifies what
+      # is escaped: :all - all special HTML characters except the quotation mark as well as
+      # entities, :text - all special HTML characters except the quotation mark but no entities and
+      # :attribute - all special HTML characters including the quotation mark but no entities.
+      def escape_html(str, type = :all)
+        str.gsub(ESCAPE_RE_FROM_TYPE[type]) {|m| ESCAPE_MAP[m] || m}
+      end
+
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/ordered_hash.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/ordered_hash.rb
new file mode 100644
index 0000000..42e773d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/ordered_hash.rb
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+
+  module Utils
+
+    if RUBY_VERSION < '1.9'
+
+      # A partial hash implementation which preserves the insertion order of the keys.
+      #
+      # *Note* that this class is only used on Ruby 1.8 since the built-in Hash on Ruby 1.9
+      # automatically preserves the insertion order. However, to remain compatibility only the
+      # methods defined in this class may be used when working with OrderedHash on Ruby 1.9.
+      class OrderedHash
+
+        include Enumerable
+
+        # Initialize the OrderedHash object.
+        def initialize
+          @data =  {}
+          @order = []
+        end
+
+        # Iterate over the stored keys in insertion order.
+        def each
+          @order.each {|k| yield(k, @data[k])}
+        end
+
+        # Return the value for the +key+.
+        def [](key)
+          @data[key]
+        end
+
+        # Return +true+ if the hash contains the key.
+        def has_key?(key)
+          @data.has_key?(key)
+        end
+
+        # Return +true+ if the hash contains no keys.
+        def empty?
+          @data.empty?
+        end
+
+        # Set the value for the +key+ to +val+.
+        def []=(key, val)
+          @order << key if !@data.has_key?(key)
+          @data[key] = val
+        end
+
+        # Delete the +key+.
+        def delete(key)
+          @order.delete(key)
+          @data.delete(key)
+        end
+
+        def merge!(other)
+          other.each {|k,v| self[k] = v}
+          self
+        end
+
+        def dup #:nodoc:
+          new_object = super
+          new_object.instance_variable_set(:@data, @data.dup)
+          new_object.instance_variable_set(:@order, @order.dup)
+          new_object
+        end
+
+        def ==(other) #:nodoc:
+          return false unless other.kind_of?(self.class)
+          @data == other.instance_variable_get(:@data) && @order == other.instance_variable_get(:@order)
+        end
+
+        def inspect #:nodoc:
+          "{" + map {|k,v| "#{k.inspect}=>#{v.inspect}"}.join(" ") + "}"
+        end
+
+      end
+
+    else
+      OrderedHash = Hash
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/string_scanner.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/string_scanner.rb
new file mode 100644
index 0000000..fdb3bee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/string_scanner.rb
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+
+require 'strscan'
+
+module Kramdown
+  module Utils
+
+    # This patched StringScanner adds line number information for current scan position and a
+    # start_line_number override for nested StringScanners.
+    class StringScanner < ::StringScanner
+
+      # The start line number. Used for nested StringScanners that scan a sub-string of the source
+      # document. The kramdown parser uses this, e.g., for span level parsers.
+      attr_reader :start_line_number
+
+      # Takes the start line number as optional second argument.
+      #
+      # Note: The original second argument is no longer used so this should be safe.
+      def initialize(string, start_line_number = 1)
+        super(string)
+        @start_line_number = start_line_number || 1
+        @previous_pos = 0
+        @previous_line_number = @start_line_number
+      end
+
+      # Sets the byte position of the scan pointer.
+      #
+      # Note: This also resets some internal variables, so always use pos= when setting the position
+      # and don't use any other method for that!
+      def pos=(pos)
+        if self.pos > pos
+          @previous_line_number = @start_line_number
+          @previous_pos = 0
+        end
+        super
+      end
+
+      # Return information needed to revert the byte position of the string scanner in a performant
+      # way.
+      #
+      # The returned data can be fed to #revert_pos to revert the position to the saved one.
+      #
+      # Note: Just saving #pos won't be enough.
+      def save_pos
+        [pos, @previous_pos, @previous_line_number]
+      end
+
+      # Revert the position to one saved by #save_pos.
+      def revert_pos(data)
+        self.pos = data[0]
+        @previous_pos, @previous_line_number = data[1], data[2]
+      end
+
+      # Returns the line number for current charpos.
+      #
+      # NOTE: Requires that all line endings are normalized to '\n'
+      #
+      # NOTE: Normally we'd have to add one to the count of newlines to get the correct line number.
+      # However we add the one indirectly by using a one-based start_line_number.
+      def current_line_number
+        # Not using string[@previous_pos..best_pos].count('\n') because it is slower
+        strscan = ::StringScanner.new(string)
+        strscan.pos = @previous_pos
+        old_pos = pos + 1
+        @previous_line_number += 1 while strscan.skip_until(/\n/) && strscan.pos <= old_pos
+
+        @previous_pos = (eos? ? pos : pos + 1)
+        @previous_line_number
+      end
+
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/unidecoder.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/unidecoder.rb
new file mode 100644
index 0000000..2b32457
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/utils/unidecoder.rb
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+# This file is based on code originally from the Stringex library and needs the data files from
+# Stringex to work correctly.
+
+module Kramdown
+  module Utils
+
+    # Provides the ability to tranliterate Unicode strings into plain ASCII ones.
+    module Unidecoder
+
+      gem 'stringex' if defined?(Gem)
+      path = $:.find {|dir| File.directory?(File.join(File.expand_path(dir), "stringex", "unidecoder_data"))}
+
+      if RUBY_VERSION <= '1.8.6' || !path
+        def self.decode(string)
+          string
+        end
+      else
+
+        CODEPOINTS = Hash.new do |h, k|
+          h[k] = YAML.load_file(File.join(path, "stringex", "unidecoder_data", "#{k}.yml"))
+        end
+
+        # Transliterate string from Unicode into ASCII.
+        def self.decode(string)
+          string.gsub(/[^\x00-\x7f]/u) do |codepoint|
+            begin
+              unpacked = codepoint.unpack("U")[0]
+              CODEPOINTS["x%02x" % (unpacked >> 8)][unpacked & 255]
+            rescue
+              "?"
+            end
+          end
+        end
+
+      end
+
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/version.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/version.rb
new file mode 100644
index 0000000..bd7c0c3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/lib/kramdown/version.rb
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+module Kramdown
+
+  # The kramdown version.
+  VERSION = '1.14.0'
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/man/man1/kramdown.1 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/man/man1/kramdown.1
new file mode 100644
index 0000000..7634dfa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/man/man1/kramdown.1
@@ -0,0 +1,368 @@
+.\" generated by kramdown
+.TH "KRAMDOWN" "1" "November 2016"
+.SH NAME
+kramdown \- a fast, pure\-Ruby Markdown\-superset converter
+.SH "SYNOPSIS"
+\fBkramdown\fP [\fIoptions\fP] [\fIFILE\fP\.\.\.]
+.SH "DESCRIPTION"
+kramdown is primarily used for parsing a superset of Markdown and converting it to different output formats\. It supports standard Markdown (with some minor modifications) and various extensions like tables and definition lists\. Due to its modular architecture it also allows other input formats than Markdown, for example, HTML or Github Flavored Markdown\.
+.P
+If \fIFILE\fP is not specified, kramdown reads from the standard input\. The result is written to the standard output\.
+.P
+There are two sets of options that kramdown accepts: The first one includes the options that are used directly by the kramdown binary\. The second set of options controls how kramdown parses and converts its input\.
+.SH "CLI\-ONLY OPTIONS"
+.TP
+\fB\-i\fP \fIFORMAT\fP, \fB\-\-input\fP \fIFORMAT\fP
+Specify the input format\. Available input formats: \fIkramdown\fP (this is the default), \fImarkdown\fP, \fIGFM\fP or \fIhtml\fP\&\.
+.TP
+\fB\-o\fP \fIFORMAT\fP, \fB\-\-output\fP \fIFORMAT\fP
+Specify one or more output formats separated by commas: \fIhtml\fP (default), \fIkramdown\fP, \fIlatex\fP, \fIpdf\fP, \fIman\fP or \fIremove_html_tags\fP\&\.
+.TP
+\fB\-v\fP, \fB\-\-version\fP
+Show the version of kramdown\.
+.TP
+\fB\-h\fP, \fB\-\-help\fP
+Show the help\.
+.SH "KRAMDOWN OPTIONS"
+.TP
+\fB\-\-auto\-id\-prefix\fP \fIARG\fP
+Prefix used for automatically generated header IDs
+.RS
+.P
+This option can be used to set a prefix for the automatically generated header IDs so that there is no conflict when rendering multiple kramdown documents into one output file separately\. The prefix should only contain characters that are valid in an ID!
+.P
+Default: \[u2018]\[u2019] Used by: HTML/Latex converter
+.RE
+.TP
+\fB\-\-[no\-]auto\-id\-stripping\fP
+Strip all formatting from header text for automatic ID generation
+.RS
+.P
+If this option is \fBtrue\fP, only the text elements of a header are used for generating the ID later (in contrast to just using the raw header text line)\.
+.P
+This option will be removed in version 2\.0 because this will be the default then\.
+.P
+Default: false Used by: kramdown parser
+.RE
+.TP
+\fB\-\-[no\-]auto\-ids\fP
+Use automatic header ID generation
+.RS
+.P
+If this option is \fBtrue\fP, ID values for all headers are automatically generated if no ID is explicitly specified\.
+.P
+Default: true Used by: HTML/Latex converter
+.RE
+.TP
+\fB\-\-coderay\-bold\-every\fP \fIARG\fP
+Defines how often a line number should be made bold
+.RS
+.P
+Can either be an integer or false (to turn off bold line numbers completely)\.
+.P
+Default: 10 Used by: HTML converter
+.RE
+.TP
+\fB\-\-coderay\-css\fP \fIARG\fP
+Defines how the highlighted code gets styled
+.RS
+.P
+Possible values are :class (CSS classes are applied to the code elements, one must supply the needed CSS file) or :style (default CSS styles are directly applied to the code elements)\.
+.P
+Default: style Used by: HTML converter
+.RE
+.TP
+\fB\-\-coderay\-default\-lang\fP \fIARG\fP
+Sets the default language for highlighting code blocks
+.RS
+.P
+If no language is set for a code block, the default language is used instead\. The value has to be one of the languages supported by coderay or nil if no default language should be used\.
+.P
+Default: nil Used by: HTML converter
+.RE
+.TP
+\fB\-\-coderay\-line\-number\-start\fP \fIARG\fP
+The start value for the line numbers
+.RS
+.P
+Default: 1 Used by: HTML converter
+.RE
+.TP
+\fB\-\-coderay\-line\-numbers\fP \fIARG\fP
+Defines how and if line numbers should be shown
+.RS
+.P
+The possible values are :table, :inline or nil\. If this option is nil, no line numbers are shown\.
+.P
+Default: :inline Used by: HTML converter
+.RE
+.TP
+\fB\-\-coderay\-tab\-width\fP \fIARG\fP
+The tab width used in highlighted code
+.RS
+.P
+Used by: HTML converter
+.RE
+.TP
+\fB\-\-coderay\-wrap\fP \fIARG\fP
+Defines how the highlighted code should be wrapped
+.RS
+.P
+The possible values are :span, :div or nil\.
+.P
+Default: :div Used by: HTML converter
+.RE
+.TP
+\fB\-\-[no\-]enable\-coderay\fP
+Use coderay for syntax highlighting
+.RS
+.P
+If this option is \fBtrue\fP, coderay is used by the HTML converter for syntax highlighting the content of code spans and code blocks\.
+.P
+Default: true Used by: HTML converter
+.RE
+.TP
+\fB\-\-entity\-output\fP \fIARG\fP
+Defines how entities are output
+.RS
+.P
+The possible values are :as_input (entities are output in the same form as found in the input), :numeric (entities are output in numeric form), :symbolic (entities are output in symbolic form if possible) or :as_char (entities are output as characters if possible, only available on Ruby 1\.9)\.
+.P
+Default: :as_char Used by: HTML converter, kramdown converter
+.RE
+.TP
+\fB\-\-footnote\-backlink\fP \fIARG\fP
+Defines the text that should be used for the footnote backlinks
+.RS
+.P
+The footnote backlink is just text, so any special HTML characters will be escaped\.
+.P
+If the footnote backlint text is an empty string, no footnote backlinks will be generated\.
+.P
+Default: \[u2018]\[u0026]8617;\[u2019] Used by: HTML converter
+.RE
+.TP
+\fB\-\-footnote\-nr\fP \fIARG\fP
+The number of the first footnote
+.RS
+.P
+This option can be used to specify the number that is used for the first footnote\.
+.P
+Default: 1 Used by: HTML converter
+.RE
+.TP
+\fB\-\-gfm\-quirks\fP \fIARG\fP
+Enables a set of GFM specific quirks
+.RS
+.P
+The way how GFM is transformed on Github often differs from the way kramdown does things\. Many of these differences are negligible but others are not\.
+.P
+This option allows one to enable/disable certain GFM quirks, i\.e\. ways in which GFM parsing differs from kramdown parsing\.
+.P
+The value has to be a list of quirk names that should be enabled, separated by commas\. Possible names are:
+.IP \(bu 4
+paragraph_end
+.RS
+.P
+Disables the kramdown restriction that at least one blank line has to be used after a paragraph before a new block element can be started\.
+.P
+Note that if this quirk is used, lazy line wrapping does not fully work anymore!
+.RE
+.P
+Default: paragraph_end Used by: GFM parser
+.RE
+.TP
+\fB\-\-[no\-]hard\-wrap\fP
+Interprets line breaks literally
+.RS
+.P
+Insert HTML \fB<br />\fP tags inside paragraphs where the original Markdown document had newlines (by default, Markdown ignores these newlines)\.
+.P
+Default: true Used by: GFM parser
+.RE
+.TP
+\fB\-\-header\-offset\fP \fIARG\fP
+Sets the output offset for headers
+.RS
+.P
+If this option is c (may also be negative) then a header with level n will be output as a header with level c+n\. If c+n is lower than 1, level 1 will be used\. If c+n is greater than 6, level 6 will be used\.
+.P
+Default: 0 Used by: HTML converter, Kramdown converter, Latex converter
+.RE
+.TP
+\fB\-\-[no\-]html\-to\-native\fP
+Convert HTML elements to native elements
+.RS
+.P
+If this option is \fBtrue\fP, the parser converts HTML elements to native elements\. For example, when parsing \fB<em>hallo</em>\fP the emphasis tag would normally be converted to an \fB:html\fP element with tag type \fB:em\fP\&\. If \fBhtml_to_native\fP is \fBtrue\fP, then the emphasis would be converted to a native \fB:em\fP element\.
+.P
+This is useful for converters that cannot deal with HTML elements\.
+.P
+Default: false Used by: kramdown parser
+.RE
+.TP
+\fB\-\-latex\-headers\fP \fIARG\fP
+Defines the LaTeX commands for different header levels
+.RS
+.P
+The commands for the header levels one to six can be specified by separating them with commas\.
+.P
+Default: section,subsection,subsubsection,paragraph,subparagraph,subparagraph Used by: Latex converter
+.RE
+.TP
+\fB\-\-line\-width\fP \fIARG\fP
+Defines the line width to be used when outputting a document
+.RS
+.P
+Default: 72 Used by: kramdown converter
+.RE
+.TP
+\fB\-\-link\-defs\fP \fIARG\fP
+Pre\-defines link definitions
+.RS
+.P
+This option can be used to pre\-define link definitions\. The value needs to be a Hash where the keys are the link identifiers and the values are two element Arrays with the link URL and the link title\.
+.P
+If the value is a String, it has to contain a valid YAML hash and the hash has to follow the above guidelines\.
+.P
+Default: {} Used by: kramdown parser
+.RE
+.TP
+\fB\-\-math\-engine\fP \fIARG\fP
+Set the math engine
+.RS
+.P
+Specifies the math engine that should be used for converting math blocks/spans\. If this option is set to +nil+, no math engine is used and the math blocks/spans are output as is\.
+.P
+Options for the selected math engine can be set with the math_engine_opts configuration option\.
+.P
+Default: mathjax Used by: HTML converter
+.RE
+.TP
+\fB\-\-math\-engine\-opts\fP \fIARG\fP
+Set the math engine options
+.RS
+.P
+Specifies options for the math engine set via the math_engine configuration option\.
+.P
+The value needs to be a hash with key\-value pairs that are understood by the used math engine\.
+.P
+Default: {} Used by: HTML converter
+.RE
+.TP
+\fB\-\-[no\-]parse\-block\-html\fP
+Process kramdown syntax in block HTML tags
+.RS
+.P
+If this option is \fBtrue\fP, the kramdown parser processes the content of block HTML tags as text containing block\-level elements\. Since this is not wanted normally, the default is \fBfalse\fP\&\. It is normally better to selectively enable kramdown processing via the markdown attribute\.
+.P
+Default: false Used by: kramdown parser
+.RE
+.TP
+\fB\-\-[no\-]parse\-span\-html\fP
+Process kramdown syntax in span HTML tags
+.RS
+.P
+If this option is \fBtrue\fP, the kramdown parser processes the content of span HTML tags as text containing span\-level elements\.
+.P
+Default: true Used by: kramdown parser
+.RE
+.TP
+\fB\-\-[no\-]remove\-block\-html\-tags\fP
+Remove block HTML tags
+.RS
+.P
+If this option is \fBtrue\fP, the RemoveHtmlTags converter removes block HTML tags\.
+.P
+Default: true Used by: RemoveHtmlTags converter
+.RE
+.TP
+\fB\-\-[no\-]remove\-span\-html\-tags\fP
+Remove span HTML tags
+.RS
+.P
+If this option is \fBtrue\fP, the RemoveHtmlTags converter removes span HTML tags\.
+.P
+Default: false Used by: RemoveHtmlTags converter
+.RE
+.TP
+\fB\-\-smart\-quotes\fP \fIARG\fP
+Defines the HTML entity names or code points for smart quote output
+.RS
+.P
+The entities identified by entity name or code point that should be used for, in order, a left single quote, a right single quote, a left double and a right double quote are specified by separating them with commas\.
+.P
+Default: lsquo,rsquo,ldquo,rdquo Used by: HTML/Latex converter
+.RE
+.TP
+\fB\-\-syntax\-highlighter\fP \fIARG\fP
+Set the syntax highlighter
+.RS
+.P
+Specifies the syntax highlighter that should be used for highlighting code blocks and spans\. If this option is set to +nil+, no syntax highlighting is done\.
+.P
+Options for the syntax highlighter can be set with the syntax_highlighter_opts configuration option\.
+.P
+Default: coderay Used by: HTML/Latex converter
+.RE
+.TP
+\fB\-\-syntax\-highlighter\-opts\fP \fIARG\fP
+Set the syntax highlighter options
+.RS
+.P
+Specifies options for the syntax highlighter set via the syntax_highlighter configuration option\.
+.P
+The value needs to be a hash with key\-value pairs that are understood by the used syntax highlighter\.
+.P
+Default: {} Used by: HTML/Latex converter
+.RE
+.TP
+\fB\-\-template\fP \fIARG\fP
+The name of an ERB template file that should be used to wrap the output or the ERB template itself\.
+.RS
+.P
+This is used to wrap the output in an environment so that the output can be used as a stand\-alone document\. For example, an HTML template would provide the needed header and body tags so that the whole output is a valid HTML file\. If no template is specified, the output will be just the converted text\.
+.P
+When resolving the template file, the given template name is used first\. If such a file is not found, the converter extension (the same as the converter name) is appended\. If the file still cannot be found, the templates name is interpreted as a template name that is provided by kramdown (without the converter extension)\. If the file is still not found, the template name is checked if it starts with \[u2018]string://\[u2019] and if it does, this prefix is removed and the rest is used as template content\.
+.P
+kramdown provides a default template named \[u2018]document\[u2019] for each converter\.
+.P
+Default: \[u2018]\[u2019] Used by: all converters
+.RE
+.TP
+\fB\-\-toc\-levels\fP \fIARG\fP
+Defines the levels that are used for the table of contents
+.RS
+.P
+The individual levels can be specified by separating them with commas (e\.g\. 1,2,3) or by using the range syntax (e\.g\. 1\.\.3)\. Only the specified levels are used for the table of contents\.
+.P
+Default: 1\.\.6 Used by: HTML/Latex converter
+.RE
+.TP
+\fB\-\-[no\-]transliterated\-header\-ids\fP
+Transliterate the header text before generating the ID
+.RS
+.P
+Only ASCII characters are used in headers IDs\. This is not good for languages with many non\-ASCII characters\. By enabling this option the header text is transliterated to ASCII as good as possible so that the resulting header ID is more useful\.
+.P
+The stringex library needs to be installed for this feature to work!
+.P
+Default: false Used by: HTML/Latex converter
+.RE
+.SH "EXIT STATUS"
+The exit status is 0 if no error happened\. Otherwise it is 1\.
+.SH "SEE ALSO"
+The kramdown website 
+.UR http://kramdown\.gettalong\.org
+.UE
+for more information, especially on the supported input syntax\.
+.SH "AUTHOR"
+kramdown was written by Thomas Leitner 
+.MT t_leitner@gmx\.at
+.UE
+\&\.
+.P
+This manual page was written by Thomas Leitner 
+.MT t_leitner@gmx\.at
+.UE
+\&\.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/setup.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/setup.rb
new file mode 100644
index 0000000..4f1e198
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/setup.rb
@@ -0,0 +1,1585 @@
+#
+# setup.rb
+#
+# Copyright (c) 2000-2005 Minero Aoki
+#
+# This program is free software.
+# You can distribute/modify this program under the terms of
+# the GNU LGPL, Lesser General Public License version 2.1.
+#
+
+unless Enumerable.method_defined?(:map)   # Ruby 1.4.6
+  module Enumerable
+    alias map collect
+  end
+end
+
+unless File.respond_to?(:read)   # Ruby 1.6
+  def File.read(fname)
+    open(fname) {|f|
+      return f.read
+    }
+  end
+end
+
+unless Errno.const_defined?(:ENOTEMPTY)   # Windows?
+  module Errno
+    class ENOTEMPTY
+      # We do not raise this exception, implementation is not needed.
+    end
+  end
+end
+
+def File.binread(fname)
+  open(fname, 'rb') {|f|
+    return f.read
+  }
+end
+
+# for corrupted Windows' stat(2)
+def File.dir?(path)
+  File.directory?((path[-1,1] == '/') ? path : path + '/')
+end
+
+
+class ConfigTable
+
+  include Enumerable
+
+  def initialize(rbconfig)
+    @rbconfig = rbconfig
+    @items = []
+    @table = {}
+    # options
+    @install_prefix = nil
+    @config_opt = nil
+    @verbose = true
+    @no_harm = false
+  end
+
+  attr_accessor :install_prefix
+  attr_accessor :config_opt
+
+  attr_writer :verbose
+
+  def verbose?
+    @verbose
+  end
+
+  attr_writer :no_harm
+
+  def no_harm?
+    @no_harm
+  end
+
+  def [](key)
+    lookup(key).resolve(self)
+  end
+
+  def []=(key, val)
+    lookup(key).set val
+  end
+
+  def names
+    @items.map {|i| i.name }
+  end
+
+  def each(&block)
+    @items.each(&block)
+  end
+
+  def key?(name)
+    @table.key?(name)
+  end
+
+  def lookup(name)
+    @table[name] or setup_rb_error "no such config item: #{name}"
+  end
+
+  def add(item)
+    @items.push item
+    @table[item.name] = item
+  end
+
+  def remove(name)
+    item = lookup(name)
+    @items.delete_if {|i| i.name == name }
+    @table.delete_if {|name, i| i.name == name }
+    item
+  end
+
+  def load_script(path, inst = nil)
+    if File.file?(path)
+      MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
+    end
+  end
+
+  def savefile
+    '.config'
+  end
+
+  def load_savefile
+    begin
+      File.foreach(savefile()) do |line|
+        k, v = *line.split(/=/, 2)
+        self[k] = v.strip
+      end
+    rescue Errno::ENOENT
+      setup_rb_error $!.message + "\n#{File.basename($0)} config first"
+    end
+  end
+
+  def save
+    @items.each {|i| i.value }
+    File.open(savefile(), 'w') {|f|
+      @items.each do |i|
+        f.printf "%s=%s\n", i.name, i.value if i.value? and i.value
+      end
+    }
+  end
+
+  def load_standard_entries
+    standard_entries(@rbconfig).each do |ent|
+      add ent
+    end
+  end
+
+  def standard_entries(rbconfig)
+    c = rbconfig
+
+    rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT'])
+
+    major = c['MAJOR'].to_i
+    minor = c['MINOR'].to_i
+    teeny = c['TEENY'].to_i
+    version = "#{major}.#{minor}"
+
+    # ruby ver. >= 1.4.4?
+    newpath_p = ((major >= 2) or
+                 ((major == 1) and
+                  ((minor >= 5) or
+                   ((minor == 4) and (teeny >= 4)))))
+
+    if c['rubylibdir']
+      # V > 1.6.3
+      libruby         = "#{c['prefix']}/lib/ruby"
+      librubyver      = c['rubylibdir']
+      librubyverarch  = c['archdir']
+      siteruby        = c['sitedir']
+      siterubyver     = c['sitelibdir']
+      siterubyverarch = c['sitearchdir']
+    elsif newpath_p
+      # 1.4.4 <= V <= 1.6.3
+      libruby         = "#{c['prefix']}/lib/ruby"
+      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
+      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+      siteruby        = c['sitedir']
+      siterubyver     = "$siteruby/#{version}"
+      siterubyverarch = "$siterubyver/#{c['arch']}"
+    else
+      # V < 1.4.4
+      libruby         = "#{c['prefix']}/lib/ruby"
+      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
+      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+      siteruby        = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
+      siterubyver     = siteruby
+      siterubyverarch = "$siterubyver/#{c['arch']}"
+    end
+    parameterize = lambda {|path|
+      path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
+    }
+
+    if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
+      makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
+    else
+      makeprog = 'make'
+    end
+
+    [
+      ExecItem.new('installdirs', 'std/site/home',
+                   'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
+          {|val, table|
+            case val
+            when 'std'
+              table['rbdir'] = '$librubyver'
+              table['sodir'] = '$librubyverarch'
+            when 'site'
+              table['rbdir'] = '$siterubyver'
+              table['sodir'] = '$siterubyverarch'
+            when 'home'
+              setup_rb_error '$HOME was not set' unless ENV['HOME']
+              table['prefix'] = ENV['HOME']
+              table['rbdir'] = '$libdir/ruby'
+              table['sodir'] = '$libdir/ruby'
+            end
+          },
+      PathItem.new('prefix', 'path', c['prefix'],
+                   'path prefix of target environment'),
+      PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
+                   'the directory for commands'),
+      PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
+                   'the directory for libraries'),
+      PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
+                   'the directory for shared data'),
+      PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
+                   'the directory for man pages'),
+      PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
+                   'the directory for system configuration files'),
+      PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
+                   'the directory for local state data'),
+      PathItem.new('libruby', 'path', libruby,
+                   'the directory for ruby libraries'),
+      PathItem.new('librubyver', 'path', librubyver,
+                   'the directory for standard ruby libraries'),
+      PathItem.new('librubyverarch', 'path', librubyverarch,
+                   'the directory for standard ruby extensions'),
+      PathItem.new('siteruby', 'path', siteruby,
+          'the directory for version-independent aux ruby libraries'),
+      PathItem.new('siterubyver', 'path', siterubyver,
+                   'the directory for aux ruby libraries'),
+      PathItem.new('siterubyverarch', 'path', siterubyverarch,
+                   'the directory for aux ruby binaries'),
+      PathItem.new('rbdir', 'path', '$siterubyver',
+                   'the directory for ruby scripts'),
+      PathItem.new('sodir', 'path', '$siterubyverarch',
+                   'the directory for ruby extentions'),
+      PathItem.new('rubypath', 'path', rubypath,
+                   'the path to set to #! line'),
+      ProgramItem.new('rubyprog', 'name', rubypath,
+                      'the ruby program using for installation'),
+      ProgramItem.new('makeprog', 'name', makeprog,
+                      'the make program to compile ruby extentions'),
+      SelectItem.new('shebang', 'all/ruby/never', 'ruby',
+                     'shebang line (#!) editing mode'),
+      BoolItem.new('without-ext', 'yes/no', 'no',
+                   'does not compile/install ruby extentions')
+    ]
+  end
+  private :standard_entries
+
+  def load_multipackage_entries
+    multipackage_entries().each do |ent|
+      add ent
+    end
+  end
+
+  def multipackage_entries
+    [
+      PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
+                               'package names that you want to install'),
+      PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
+                               'package names that you do not want to install')
+    ]
+  end
+  private :multipackage_entries
+
+  ALIASES = {
+    'std-ruby'         => 'librubyver',
+    'stdruby'          => 'librubyver',
+    'rubylibdir'       => 'librubyver',
+    'archdir'          => 'librubyverarch',
+    'site-ruby-common' => 'siteruby',     # For backward compatibility
+    'site-ruby'        => 'siterubyver',  # For backward compatibility
+    'bin-dir'          => 'bindir',
+    'bin-dir'          => 'bindir',
+    'rb-dir'           => 'rbdir',
+    'so-dir'           => 'sodir',
+    'data-dir'         => 'datadir',
+    'ruby-path'        => 'rubypath',
+    'ruby-prog'        => 'rubyprog',
+    'ruby'             => 'rubyprog',
+    'make-prog'        => 'makeprog',
+    'make'             => 'makeprog'
+  }
+
+  def fixup
+    ALIASES.each do |ali, name|
+      @table[ali] = @table[name]
+    end
+    @items.freeze
+    @table.freeze
+    @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/
+  end
+
+  def parse_opt(opt)
+    m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}"
+    m.to_a[1,2]
+  end
+
+  def dllext
+    @rbconfig['DLEXT']
+  end
+
+  def value_config?(name)
+    lookup(name).value?
+  end
+
+  class Item
+    def initialize(name, template, default, desc)
+      @name = name.freeze
+      @template = template
+      @value = default
+      @default = default
+      @description = desc
+    end
+
+    attr_reader :name
+    attr_reader :description
+
+    attr_accessor :default
+    alias help_default default
+
+    def help_opt
+      "--#{@name}=#{@template}"
+    end
+
+    def value?
+      true
+    end
+
+    def value
+      @value
+    end
+
+    def resolve(table)
+      @value.gsub(%r<\$([^/]+)>) { table[$1] }
+    end
+
+    def set(val)
+      @value = check(val)
+    end
+
+    private
+
+    def check(val)
+      setup_rb_error "config: --#{name} requires argument" unless val
+      val
+    end
+  end
+
+  class BoolItem < Item
+    def config_type
+      'bool'
+    end
+
+    def help_opt
+      "--#{@name}"
+    end
+
+    private
+
+    def check(val)
+      return 'yes' unless val
+      case val
+      when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes'
+      when /\An(o)?\z/i, /\Af(alse)\z/i  then 'no'
+      else
+        setup_rb_error "config: --#{@name} accepts only yes/no for argument"
+      end
+    end
+  end
+
+  class PathItem < Item
+    def config_type
+      'path'
+    end
+
+    private
+
+    def check(path)
+      setup_rb_error "config: --#{@name} requires argument"  unless path
+      path[0,1] == '$' ? path : File.expand_path(path)
+    end
+  end
+
+  class ProgramItem < Item
+    def config_type
+      'program'
+    end
+  end
+
+  class SelectItem < Item
+    def initialize(name, selection, default, desc)
+      super
+      @ok = selection.split('/')
+    end
+
+    def config_type
+      'select'
+    end
+
+    private
+
+    def check(val)
+      unless @ok.include?(val.strip)
+        setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
+      end
+      val.strip
+    end
+  end
+
+  class ExecItem < Item
+    def initialize(name, selection, desc, &block)
+      super name, selection, nil, desc
+      @ok = selection.split('/')
+      @action = block
+    end
+
+    def config_type
+      'exec'
+    end
+
+    def value?
+      false
+    end
+
+    def resolve(table)
+      setup_rb_error "$#{name()} wrongly used as option value"
+    end
+
+    undef set
+
+    def evaluate(val, table)
+      v = val.strip.downcase
+      unless @ok.include?(v)
+        setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})"
+      end
+      @action.call v, table
+    end
+  end
+
+  class PackageSelectionItem < Item
+    def initialize(name, template, default, help_default, desc)
+      super name, template, default, desc
+      @help_default = help_default
+    end
+
+    attr_reader :help_default
+
+    def config_type
+      'package'
+    end
+
+    private
+
+    def check(val)
+      unless File.dir?("packages/#{val}")
+        setup_rb_error "config: no such package: #{val}"
+      end
+      val
+    end
+  end
+
+  class MetaConfigEnvironment
+    def initialize(config, installer)
+      @config = config
+      @installer = installer
+    end
+
+    def config_names
+      @config.names
+    end
+
+    def config?(name)
+      @config.key?(name)
+    end
+
+    def bool_config?(name)
+      @config.lookup(name).config_type == 'bool'
+    end
+
+    def path_config?(name)
+      @config.lookup(name).config_type == 'path'
+    end
+
+    def value_config?(name)
+      @config.lookup(name).config_type != 'exec'
+    end
+
+    def add_config(item)
+      @config.add item
+    end
+
+    def add_bool_config(name, default, desc)
+      @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
+    end
+
+    def add_path_config(name, default, desc)
+      @config.add PathItem.new(name, 'path', default, desc)
+    end
+
+    def set_config_default(name, default)
+      @config.lookup(name).default = default
+    end
+
+    def remove_config(name)
+      @config.remove(name)
+    end
+
+    # For only multipackage
+    def packages
+      raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer
+      @installer.packages
+    end
+
+    # For only multipackage
+    def declare_packages(list)
+      raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer
+      @installer.packages = list
+    end
+  end
+
+end   # class ConfigTable
+
+
+# This module requires: #verbose?, #no_harm?
+module FileOperations
+
+  def mkdir_p(dirname, prefix = nil)
+    dirname = prefix + File.expand_path(dirname) if prefix
+    $stderr.puts "mkdir -p #{dirname}" if verbose?
+    return if no_harm?
+
+    # Does not check '/', it's too abnormal.
+    dirs = File.expand_path(dirname).split(%r<(?=/)>)
+    if /\A[a-z]:\z/i =~ dirs[0]
+      disk = dirs.shift
+      dirs[0] = disk + dirs[0]
+    end
+    dirs.each_index do |idx|
+      path = dirs[0..idx].join('')
+      Dir.mkdir path unless File.dir?(path)
+    end
+  end
+
+  def rm_f(path)
+    $stderr.puts "rm -f #{path}" if verbose?
+    return if no_harm?
+    force_remove_file path
+  end
+
+  def rm_rf(path)
+    $stderr.puts "rm -rf #{path}" if verbose?
+    return if no_harm?
+    remove_tree path
+  end
+
+  def remove_tree(path)
+    if File.symlink?(path)
+      remove_file path
+    elsif File.dir?(path)
+      remove_tree0 path
+    else
+      force_remove_file path
+    end
+  end
+
+  def remove_tree0(path)
+    Dir.foreach(path) do |ent|
+      next if ent == '.'
+      next if ent == '..'
+      entpath = "#{path}/#{ent}"
+      if File.symlink?(entpath)
+        remove_file entpath
+      elsif File.dir?(entpath)
+        remove_tree0 entpath
+      else
+        force_remove_file entpath
+      end
+    end
+    begin
+      Dir.rmdir path
+    rescue Errno::ENOTEMPTY
+      # directory may not be empty
+    end
+  end
+
+  def move_file(src, dest)
+    force_remove_file dest
+    begin
+      File.rename src, dest
+    rescue
+      File.open(dest, 'wb') {|f|
+        f.write File.binread(src)
+      }
+      File.chmod File.stat(src).mode, dest
+      File.unlink src
+    end
+  end
+
+  def force_remove_file(path)
+    begin
+      remove_file path
+    rescue
+    end
+  end
+
+  def remove_file(path)
+    File.chmod 0777, path
+    File.unlink path
+  end
+
+  def install(from, dest, mode, prefix = nil)
+    $stderr.puts "install #{from} #{dest}" if verbose?
+    return if no_harm?
+
+    realdest = prefix ? prefix + File.expand_path(dest) : dest
+    realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
+    str = File.binread(from)
+    if diff?(str, realdest)
+      verbose_off {
+        rm_f realdest if File.exist?(realdest)
+      }
+      File.open(realdest, 'wb') {|f|
+        f.write str
+      }
+      File.chmod mode, realdest
+
+      File.open("#{objdir_root()}/InstalledFiles", 'a') {|f|
+        if prefix
+          f.puts realdest.sub(prefix, '')
+        else
+          f.puts realdest
+        end
+      }
+    end
+  end
+
+  def diff?(new_content, path)
+    return true unless File.exist?(path)
+    new_content != File.binread(path)
+  end
+
+  def command(*args)
+    $stderr.puts args.join(' ') if verbose?
+    system(*args) or raise RuntimeError,
+        "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
+  end
+
+  def ruby(*args)
+    command config('rubyprog'), *args
+  end
+  
+  def make(task = nil)
+    command(*[config('makeprog'), task].compact)
+  end
+
+  def extdir?(dir)
+    File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb")
+  end
+
+  def files_of(dir)
+    Dir.open(dir) {|d|
+      return d.select {|ent| File.file?("#{dir}/#{ent}") }
+    }
+  end
+
+  DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn )
+
+  def directories_of(dir)
+    Dir.open(dir) {|d|
+      return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT
+    }
+  end
+
+end
+
+
+# This module requires: #srcdir_root, #objdir_root, #relpath
+module HookScriptAPI
+
+  def get_config(key)
+    @config[key]
+  end
+
+  alias config get_config
+
+  # obsolete: use metaconfig to change configuration
+  def set_config(key, val)
+    @config[key] = val
+  end
+
+  #
+  # srcdir/objdir (works only in the package directory)
+  #
+
+  def curr_srcdir
+    "#{srcdir_root()}/#{relpath()}"
+  end
+
+  def curr_objdir
+    "#{objdir_root()}/#{relpath()}"
+  end
+
+  def srcfile(path)
+    "#{curr_srcdir()}/#{path}"
+  end
+
+  def srcexist?(path)
+    File.exist?(srcfile(path))
+  end
+
+  def srcdirectory?(path)
+    File.dir?(srcfile(path))
+  end
+  
+  def srcfile?(path)
+    File.file?(srcfile(path))
+  end
+
+  def srcentries(path = '.')
+    Dir.open("#{curr_srcdir()}/#{path}") {|d|
+      return d.to_a - %w(. ..)
+    }
+  end
+
+  def srcfiles(path = '.')
+    srcentries(path).select {|fname|
+      File.file?(File.join(curr_srcdir(), path, fname))
+    }
+  end
+
+  def srcdirectories(path = '.')
+    srcentries(path).select {|fname|
+      File.dir?(File.join(curr_srcdir(), path, fname))
+    }
+  end
+
+end
+
+
+class ToplevelInstaller
+
+  Version   = '3.4.1'
+  Copyright = 'Copyright (c) 2000-2005 Minero Aoki'
+
+  TASKS = [
+    [ 'all',      'do config, setup, then install' ],
+    [ 'config',   'saves your configurations' ],
+    [ 'show',     'shows current configuration' ],
+    [ 'setup',    'compiles ruby extentions and others' ],
+    [ 'install',  'installs files' ],
+    [ 'test',     'run all tests in test/' ],
+    [ 'clean',    "does `make clean' for each extention" ],
+    [ 'distclean',"does `make distclean' for each extention" ]
+  ]
+
+  def ToplevelInstaller.invoke
+    config = ConfigTable.new(load_rbconfig())
+    config.load_standard_entries
+    config.load_multipackage_entries if multipackage?
+    config.fixup
+    klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller)
+    klass.new(File.dirname($0), config).invoke
+  end
+
+  def ToplevelInstaller.multipackage?
+    File.dir?(File.dirname($0) + '/packages')
+  end
+
+  def ToplevelInstaller.load_rbconfig
+    if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg }
+      ARGV.delete(arg)
+      load File.expand_path(arg.split(/=/, 2)[1])
+      $".push 'rbconfig.rb'
+    else
+      require 'rbconfig'
+    end
+    ::RbConfig::CONFIG
+  end
+
+  def initialize(ardir_root, config)
+    @ardir = File.expand_path(ardir_root)
+    @config = config
+    # cache
+    @valid_task_re = nil
+  end
+
+  def config(key)
+    @config[key]
+  end
+
+  def inspect
+    "#<#{self.class} #{__id__()}>"
+  end
+
+  def invoke
+    run_metaconfigs
+    case task = parsearg_global()
+    when nil, 'all'
+      parsearg_config
+      init_installers
+      exec_config
+      exec_setup
+      exec_install
+    else
+      case task
+      when 'config', 'test'
+        ;
+      when 'clean', 'distclean'
+        @config.load_savefile if File.exist?(@config.savefile)
+      else
+        @config.load_savefile
+      end
+      __send__ "parsearg_#{task}"
+      init_installers
+      __send__ "exec_#{task}"
+    end
+  end
+  
+  def run_metaconfigs
+    @config.load_script "#{@ardir}/metaconfig"
+  end
+
+  def init_installers
+    @installer = Installer.new(@config, @ardir, File.expand_path('.'))
+  end
+
+  #
+  # Hook Script API bases
+  #
+
+  def srcdir_root
+    @ardir
+  end
+
+  def objdir_root
+    '.'
+  end
+
+  def relpath
+    '.'
+  end
+
+  #
+  # Option Parsing
+  #
+
+  def parsearg_global
+    while arg = ARGV.shift
+      case arg
+      when /\A\w+\z/
+        setup_rb_error "invalid task: #{arg}" unless valid_task?(arg)
+        return arg
+      when '-q', '--quiet'
+        @config.verbose = false
+      when '--verbose'
+        @config.verbose = true
+      when '--help'
+        print_usage $stdout
+        exit 0
+      when '--version'
+        puts "#{File.basename($0)} version #{Version}"
+        exit 0
+      when '--copyright'
+        puts Copyright
+        exit 0
+      else
+        setup_rb_error "unknown global option '#{arg}'"
+      end
+    end
+    nil
+  end
+
+  def valid_task?(t)
+    valid_task_re() =~ t
+  end
+
+  def valid_task_re
+    @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/
+  end
+
+  def parsearg_no_options
+    unless ARGV.empty?
+      task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1)
+      setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}"
+    end
+  end
+
+  alias parsearg_show       parsearg_no_options
+  alias parsearg_setup      parsearg_no_options
+  alias parsearg_test       parsearg_no_options
+  alias parsearg_clean      parsearg_no_options
+  alias parsearg_distclean  parsearg_no_options
+
+  def parsearg_config
+    evalopt = []
+    set = []
+    @config.config_opt = []
+    while i = ARGV.shift
+      if /\A--?\z/ =~ i
+        @config.config_opt = ARGV.dup
+        break
+      end
+      name, value = *@config.parse_opt(i)
+      if @config.value_config?(name)
+        @config[name] = value
+      else
+        evalopt.push [name, value]
+      end
+      set.push name
+    end
+    evalopt.each do |name, value|
+      @config.lookup(name).evaluate value, @config
+    end
+    # Check if configuration is valid
+    set.each do |n|
+      @config[n] if @config.value_config?(n)
+    end
+  end
+
+  def parsearg_install
+    @config.no_harm = false
+    @config.install_prefix = ''
+    while a = ARGV.shift
+      case a
+      when '--no-harm'
+        @config.no_harm = true
+      when /\A--prefix=/
+        path = a.split(/=/, 2)[1]
+        path = File.expand_path(path) unless path[0,1] == '/'
+        @config.install_prefix = path
+      else
+        setup_rb_error "install: unknown option #{a}"
+      end
+    end
+  end
+
+  def print_usage(out)
+    out.puts 'Typical Installation Procedure:'
+    out.puts "  $ ruby #{File.basename $0} config"
+    out.puts "  $ ruby #{File.basename $0} setup"
+    out.puts "  # ruby #{File.basename $0} install (may require root privilege)"
+    out.puts
+    out.puts 'Detailed Usage:'
+    out.puts "  ruby #{File.basename $0} <global option>"
+    out.puts "  ruby #{File.basename $0} [<global options>] <task> [<task options>]"
+
+    fmt = "  %-24s %s\n"
+    out.puts
+    out.puts 'Global options:'
+    out.printf fmt, '-q,--quiet',   'suppress message outputs'
+    out.printf fmt, '   --verbose', 'output messages verbosely'
+    out.printf fmt, '   --help',    'print this message'
+    out.printf fmt, '   --version', 'print version and quit'
+    out.printf fmt, '   --copyright',  'print copyright and quit'
+    out.puts
+    out.puts 'Tasks:'
+    TASKS.each do |name, desc|
+      out.printf fmt, name, desc
+    end
+
+    fmt = "  %-24s %s [%s]\n"
+    out.puts
+    out.puts 'Options for CONFIG or ALL:'
+    @config.each do |item|
+      out.printf fmt, item.help_opt, item.description, item.help_default
+    end
+    out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's"
+    out.puts
+    out.puts 'Options for INSTALL:'
+    out.printf fmt, '--no-harm', 'only display what to do if given', 'off'
+    out.printf fmt, '--prefix=path',  'install path prefix', ''
+    out.puts
+  end
+
+  #
+  # Task Handlers
+  #
+
+  def exec_config
+    @installer.exec_config
+    @config.save   # must be final
+  end
+
+  def exec_setup
+    @installer.exec_setup
+  end
+
+  def exec_install
+    @installer.exec_install
+  end
+
+  def exec_test
+    @installer.exec_test
+  end
+
+  def exec_show
+    @config.each do |i|
+      printf "%-20s %s\n", i.name, i.value if i.value?
+    end
+  end
+
+  def exec_clean
+    @installer.exec_clean
+  end
+
+  def exec_distclean
+    @installer.exec_distclean
+  end
+
+end   # class ToplevelInstaller
+
+
+class ToplevelInstallerMulti < ToplevelInstaller
+
+  include FileOperations
+
+  def initialize(ardir_root, config)
+    super
+    @packages = directories_of("#{@ardir}/packages")
+    raise 'no package exists' if @packages.empty?
+    @root_installer = Installer.new(@config, @ardir, File.expand_path('.'))
+  end
+
+  def run_metaconfigs
+    @config.load_script "#{@ardir}/metaconfig", self
+    @packages.each do |name|
+      @config.load_script "#{@ardir}/packages/#{name}/metaconfig"
+    end
+  end
+
+  attr_reader :packages
+
+  def packages=(list)
+    raise 'package list is empty' if list.empty?
+    list.each do |name|
+      raise "directory packages/#{name} does not exist"\
+              unless File.dir?("#{@ardir}/packages/#{name}")
+    end
+    @packages = list
+  end
+
+  def init_installers
+    @installers = {}
+    @packages.each do |pack|
+      @installers[pack] = Installer.new(@config,
+                                       "#{@ardir}/packages/#{pack}",
+                                       "packages/#{pack}")
+    end
+    with    = extract_selection(config('with'))
+    without = extract_selection(config('without'))
+    @selected = @installers.keys.select {|name|
+                  (with.empty? or with.include?(name)) \
+                      and not without.include?(name)
+                }
+  end
+
+  def extract_selection(list)
+    a = list.split(/,/)
+    a.each do |name|
+      setup_rb_error "no such package: #{name}"  unless @installers.key?(name)
+    end
+    a
+  end
+
+  def print_usage(f)
+    super
+    f.puts 'Inluded packages:'
+    f.puts '  ' + @packages.sort.join(' ')
+    f.puts
+  end
+
+  #
+  # Task Handlers
+  #
+
+  def exec_config
+    run_hook 'pre-config'
+    each_selected_installers {|inst| inst.exec_config }
+    run_hook 'post-config'
+    @config.save   # must be final
+  end
+
+  def exec_setup
+    run_hook 'pre-setup'
+    each_selected_installers {|inst| inst.exec_setup }
+    run_hook 'post-setup'
+  end
+
+  def exec_install
+    run_hook 'pre-install'
+    each_selected_installers {|inst| inst.exec_install }
+    run_hook 'post-install'
+  end
+
+  def exec_test
+    run_hook 'pre-test'
+    each_selected_installers {|inst| inst.exec_test }
+    run_hook 'post-test'
+  end
+
+  def exec_clean
+    rm_f @config.savefile
+    run_hook 'pre-clean'
+    each_selected_installers {|inst| inst.exec_clean }
+    run_hook 'post-clean'
+  end
+
+  def exec_distclean
+    rm_f @config.savefile
+    run_hook 'pre-distclean'
+    each_selected_installers {|inst| inst.exec_distclean }
+    run_hook 'post-distclean'
+  end
+
+  #
+  # lib
+  #
+
+  def each_selected_installers
+    Dir.mkdir 'packages' unless File.dir?('packages')
+    @selected.each do |pack|
+      $stderr.puts "Processing the package `#{pack}' ..." if verbose?
+      Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
+      Dir.chdir "packages/#{pack}"
+      yield @installers[pack]
+      Dir.chdir '../..'
+    end
+  end
+
+  def run_hook(id)
+    @root_installer.run_hook id
+  end
+
+  # module FileOperations requires this
+  def verbose?
+    @config.verbose?
+  end
+
+  # module FileOperations requires this
+  def no_harm?
+    @config.no_harm?
+  end
+
+end   # class ToplevelInstallerMulti
+
+
+class Installer
+
+  FILETYPES = %w( bin lib ext data conf man )
+
+  include FileOperations
+  include HookScriptAPI
+
+  def initialize(config, srcroot, objroot)
+    @config = config
+    @srcdir = File.expand_path(srcroot)
+    @objdir = File.expand_path(objroot)
+    @currdir = '.'
+  end
+
+  def inspect
+    "#<#{self.class} #{File.basename(@srcdir)}>"
+  end
+
+  def noop(rel)
+  end
+
+  #
+  # Hook Script API base methods
+  #
+
+  def srcdir_root
+    @srcdir
+  end
+
+  def objdir_root
+    @objdir
+  end
+
+  def relpath
+    @currdir
+  end
+
+  #
+  # Config Access
+  #
+
+  # module FileOperations requires this
+  def verbose?
+    @config.verbose?
+  end
+
+  # module FileOperations requires this
+  def no_harm?
+    @config.no_harm?
+  end
+
+  def verbose_off
+    begin
+      save, @config.verbose = @config.verbose?, false
+      yield
+    ensure
+      @config.verbose = save
+    end
+  end
+
+  #
+  # TASK config
+  #
+
+  def exec_config
+    exec_task_traverse 'config'
+  end
+
+  alias config_dir_bin noop
+  alias config_dir_lib noop
+
+  def config_dir_ext(rel)
+    extconf if extdir?(curr_srcdir())
+  end
+
+  alias config_dir_data noop
+  alias config_dir_conf noop
+  alias config_dir_man noop
+
+  def extconf
+    ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt
+  end
+
+  #
+  # TASK setup
+  #
+
+  def exec_setup
+    exec_task_traverse 'setup'
+  end
+
+  def setup_dir_bin(rel)
+    files_of(curr_srcdir()).each do |fname|
+      update_shebang_line "#{curr_srcdir()}/#{fname}"
+    end
+  end
+
+  alias setup_dir_lib noop
+
+  def setup_dir_ext(rel)
+    make if extdir?(curr_srcdir())
+  end
+
+  alias setup_dir_data noop
+  alias setup_dir_conf noop
+  alias setup_dir_man noop
+
+  def update_shebang_line(path)
+    return if no_harm?
+    return if config('shebang') == 'never'
+    old = Shebang.load(path)
+    if old
+      $stderr.puts "warning: #{path}: Shebang line includes too many args.  It is not portable and your program may not work." if old.args.size > 1
+      new = new_shebang(old)
+      return if new.to_s == old.to_s
+    else
+      return unless config('shebang') == 'all'
+      new = Shebang.new(config('rubypath'))
+    end
+    $stderr.puts "updating shebang: #{File.basename(path)}" if verbose?
+    open_atomic_writer(path) {|output|
+      File.open(path, 'rb') {|f|
+        f.gets if old   # discard
+        output.puts new.to_s
+        output.print f.read
+      }
+    }
+  end
+
+  def new_shebang(old)
+    if /\Aruby/ =~ File.basename(old.cmd)
+      Shebang.new(config('rubypath'), old.args)
+    elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
+      Shebang.new(config('rubypath'), old.args[1..-1])
+    else
+      return old unless config('shebang') == 'all'
+      Shebang.new(config('rubypath'))
+    end
+  end
+
+  def open_atomic_writer(path, &block)
+    tmpfile = File.basename(path) + '.tmp'
+    begin
+      File.open(tmpfile, 'wb', &block)
+      File.rename tmpfile, File.basename(path)
+    ensure
+      File.unlink tmpfile if File.exist?(tmpfile)
+    end
+  end
+
+  class Shebang
+    def Shebang.load(path)
+      line = nil
+      File.open(path) {|f|
+        line = f.gets
+      }
+      return nil unless /\A#!/ =~ line
+      parse(line)
+    end
+
+    def Shebang.parse(line)
+      cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
+      new(cmd, args)
+    end
+
+    def initialize(cmd, args = [])
+      @cmd = cmd
+      @args = args
+    end
+
+    attr_reader :cmd
+    attr_reader :args
+
+    def to_s
+      "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}")
+    end
+  end
+
+  #
+  # TASK install
+  #
+
+  def exec_install
+    rm_f 'InstalledFiles'
+    exec_task_traverse 'install'
+  end
+
+  def install_dir_bin(rel)
+    install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755
+  end
+
+  def install_dir_lib(rel)
+    install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644
+  end
+
+  def install_dir_ext(rel)
+    return unless extdir?(curr_srcdir())
+    install_files rubyextentions('.'),
+                  "#{config('sodir')}/#{File.dirname(rel)}",
+                  0555
+  end
+
+  def install_dir_data(rel)
+    install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644
+  end
+
+  def install_dir_conf(rel)
+    # FIXME: should not remove current config files
+    # (rename previous file to .old/.org)
+    install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644
+  end
+
+  def install_dir_man(rel)
+    install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644
+  end
+
+  def install_files(list, dest, mode)
+    mkdir_p dest, @config.install_prefix
+    list.each do |fname|
+      install fname, dest, mode, @config.install_prefix
+    end
+  end
+
+  def libfiles
+    glob_reject(%w(*.y *.output), targetfiles())
+  end
+
+  def rubyextentions(dir)
+    ents = glob_select("*.#{@config.dllext}", targetfiles())
+    if ents.empty?
+      setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first"
+    end
+    ents
+  end
+
+  def targetfiles
+    mapdir(existfiles() - hookfiles())
+  end
+
+  def mapdir(ents)
+    ents.map {|ent|
+      if File.exist?(ent)
+      then ent                         # objdir
+      else "#{curr_srcdir()}/#{ent}"   # srcdir
+      end
+    }
+  end
+
+  # picked up many entries from cvs-1.11.1/src/ignore.c
+  JUNK_FILES = %w( 
+    core RCSLOG tags TAGS .make.state
+    .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb
+    *~ *.old *.bak *.BAK *.orig *.rej _$* *$
+
+    *.org *.in .*
+  )
+
+  def existfiles
+    glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.')))
+  end
+
+  def hookfiles
+    %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt|
+      %w( config setup install clean ).map {|t| sprintf(fmt, t) }
+    }.flatten
+  end
+
+  def glob_select(pat, ents)
+    re = globs2re([pat])
+    ents.select {|ent| re =~ ent }
+  end
+
+  def glob_reject(pats, ents)
+    re = globs2re(pats)
+    ents.reject {|ent| re =~ ent }
+  end
+
+  GLOB2REGEX = {
+    '.' => '\.',
+    '$' => '\$',
+    '#' => '\#',
+    '*' => '.*'
+  }
+
+  def globs2re(pats)
+    /\A(?:#{
+      pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|')
+    })\z/
+  end
+
+  #
+  # TASK test
+  #
+
+  TESTDIR = 'test'
+
+  def exec_test
+    unless File.directory?('test')
+      $stderr.puts 'no test in this package' if verbose?
+      return
+    end
+    $stderr.puts 'Running tests...' if verbose?
+    begin
+      require 'test/unit'
+    rescue LoadError
+      setup_rb_error 'test/unit cannot loaded.  You need Ruby 1.8 or later to invoke this task.'
+    end
+    runner = Test::Unit::AutoRunner.new(true)
+    runner.to_run << TESTDIR
+    runner.run
+  end
+
+  #
+  # TASK clean
+  #
+
+  def exec_clean
+    exec_task_traverse 'clean'
+    rm_f @config.savefile
+    rm_f 'InstalledFiles'
+  end
+
+  alias clean_dir_bin noop
+  alias clean_dir_lib noop
+  alias clean_dir_data noop
+  alias clean_dir_conf noop
+  alias clean_dir_man noop
+
+  def clean_dir_ext(rel)
+    return unless extdir?(curr_srcdir())
+    make 'clean' if File.file?('Makefile')
+  end
+
+  #
+  # TASK distclean
+  #
+
+  def exec_distclean
+    exec_task_traverse 'distclean'
+    rm_f @config.savefile
+    rm_f 'InstalledFiles'
+  end
+
+  alias distclean_dir_bin noop
+  alias distclean_dir_lib noop
+
+  def distclean_dir_ext(rel)
+    return unless extdir?(curr_srcdir())
+    make 'distclean' if File.file?('Makefile')
+  end
+
+  alias distclean_dir_data noop
+  alias distclean_dir_conf noop
+  alias distclean_dir_man noop
+
+  #
+  # Traversing
+  #
+
+  def exec_task_traverse(task)
+    run_hook "pre-#{task}"
+    FILETYPES.each do |type|
+      if type == 'ext' and config('without-ext') == 'yes'
+        $stderr.puts 'skipping ext/* by user option' if verbose?
+        next
+      end
+      traverse task, type, "#{task}_dir_#{type}"
+    end
+    run_hook "post-#{task}"
+  end
+
+  def traverse(task, rel, mid)
+    dive_into(rel) {
+      run_hook "pre-#{task}"
+      __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
+      directories_of(curr_srcdir()).each do |d|
+        traverse task, "#{rel}/#{d}", mid
+      end
+      run_hook "post-#{task}"
+    }
+  end
+
+  def dive_into(rel)
+    return unless File.dir?("#{@srcdir}/#{rel}")
+
+    dir = File.basename(rel)
+    Dir.mkdir dir unless File.dir?(dir)
+    prevdir = Dir.pwd
+    Dir.chdir dir
+    $stderr.puts '---> ' + rel if verbose?
+    @currdir = rel
+    yield
+    Dir.chdir prevdir
+    $stderr.puts '<--- ' + rel if verbose?
+    @currdir = File.dirname(rel)
+  end
+
+  def run_hook(id)
+    path = [ "#{curr_srcdir()}/#{id}",
+             "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) }
+    return unless path
+    begin
+      instance_eval File.read(path), path, 1
+    rescue
+      raise if $DEBUG
+      setup_rb_error "hook #{path} failed:\n" + $!.message
+    end
+  end
+
+end   # class Installer
+
+
+class SetupError < StandardError; end
+
+def setup_rb_error(msg)
+  raise SetupError, msg
+end
+
+if $0 == __FILE__
+  begin
+    ToplevelInstaller.invoke
+  rescue SetupError
+    raise if $DEBUG
+    $stderr.puts $!.message
+    $stderr.puts "Try 'ruby #{$0} --help' for detailed usage."
+    exit 1
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/run_tests.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/run_tests.rb
new file mode 100644
index 0000000..b7a241a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/run_tests.rb
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+$:.unshift File.dirname(__FILE__) + '/../lib'
+require 'kramdown'
+require 'test/unit/assertions'
+require 'yaml'
+
+include Test::Unit::Assertions
+
+arg = ARGV[0] || File.join(File.dirname(__FILE__), 'testcases')
+
+arg = if File.directory?(arg)
+        File.join(arg, '**/*.text')
+      else
+        arg + '.text'
+      end
+
+width = ((size = %x{stty size 2>/dev/null}).length > 0 ? size.split.last.to_i : 72) rescue 72
+width -= 8
+fwidth = 0
+Dir[arg].each {|f| fwidth = [fwidth, f.length + 10].max }.each do |file|
+  print(('Testing ' + file + ' ').ljust([fwidth, width].min))
+  $stdout.flush
+
+  html_file = file.sub('.text', '.html')
+  opts_file = file.sub('.text', '.options')
+  opts_file = File.join(File.dirname(file), 'options') if !File.exist?(opts_file)
+  options = File.exist?(opts_file) ? YAML::load(File.read(opts_file)) : {:auto_ids => false, :footnote_nr => 1}
+  doc = Kramdown::Document.new(File.read(file), options)
+  begin
+    assert_equal(File.read(html_file), doc.to_html)
+    puts 'PASSED'
+  rescue Exception => e
+    puts '  FAILED'
+    puts $!.message if $VERBOSE
+    puts $!.backtrace if $DEBUG
+  end
+  puts "Warnings:\n" + doc.warnings.join("\n") if !doc.warnings.empty? && $VERBOSE
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/test_files.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/test_files.rb
new file mode 100644
index 0000000..e19ed44
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/test_files.rb
@@ -0,0 +1,416 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+require 'minitest/autorun'
+require 'kramdown'
+require 'yaml'
+require 'tmpdir'
+
+begin
+  require 'kramdown/converter/syntax_highlighter/rouge'
+
+  class Kramdown::Converter::SyntaxHighlighter::Rouge::FORMATTER_CLASS
+    def format(tokens, &b)
+      super.sub(/<\/code><\/pre>\n?/, "</code></pre>\n")
+    end
+  end
+
+  # custom formatter for tests
+  class RougeHTMLFormatters < Kramdown::Converter::SyntaxHighlighter::Rouge::FORMATTER_CLASS
+    tag 'rouge_html_formatters'
+
+    def stream(tokens, &b)
+      yield %(<div class="custom-class">)
+      super
+      yield %(</div>)
+    end
+  end
+rescue LoadError, SyntaxError, NameError
+end
+
+Encoding.default_external = 'utf-8' if RUBY_VERSION >= '1.9'
+
+class TestFiles < Minitest::Test
+
+  EXCLUDE_KD_FILES = [('test/testcases/block/04_header/with_auto_ids.text' if RUBY_VERSION <= '1.8.6'), # bc of dep stringex not working
+                      ('test/testcases/span/03_codespan/rouge/' if RUBY_VERSION < '2.0'), #bc of rouge
+                      ('test/testcases/block/06_codeblock/rouge/' if RUBY_VERSION < '2.0'), #bc of rouge
+                      ('test/testcases/block/15_math/itex2mml.text' if RUBY_PLATFORM == 'java'), # bc of itextomml
+                      ('test/testcases/span/math/itex2mml.text' if RUBY_PLATFORM == 'java'), # bc of itextomml
+                     ].compact
+
+  # Generate test methods for kramdown-to-xxx conversion
+  Dir[File.dirname(__FILE__) + '/testcases/**/*.text'].each do |text_file|
+    next if EXCLUDE_KD_FILES.any? {|f| text_file =~ /#{f}/}
+    basename = text_file.sub(/\.text$/, '')
+    opts_file = text_file.sub(/\.text$/, '.options')
+    (Dir[basename + ".*"] - [text_file, opts_file]).each do |output_file|
+      next if (RUBY_VERSION >= '1.9' && File.exist?(output_file + '.19')) ||
+        (RUBY_VERSION < '1.9' && output_file =~ /\.19$/)
+      output_format = File.extname(output_file.sub(/\.19$/, ''))[1..-1]
+      next if !Kramdown::Converter.const_defined?(output_format[0..0].upcase + output_format[1..-1])
+      define_method('test_' + text_file.tr('.', '_') + "_to_#{output_format}") do
+        opts_file = File.join(File.dirname(text_file), 'options') if !File.exist?(opts_file)
+        options = File.exist?(opts_file) ? YAML::load(File.read(opts_file)) : {:auto_ids => false, :footnote_nr => 1}
+        doc = Kramdown::Document.new(File.read(text_file), options)
+        assert_equal(File.read(output_file), doc.send("to_#{output_format}"))
+      end
+    end
+  end
+
+  # Generate test methods for html-to-{html,kramdown} conversion
+  `tidy -v 2>&1`
+  if $?.exitstatus != 0
+    warn("Skipping html-to-{html,kramdown} tests because tidy executable is missing")
+  else
+    EXCLUDE_HTML_FILES = ['test/testcases/block/06_codeblock/whitespace.html', # bc of span inside pre
+                          'test/testcases/block/09_html/simple.html', # bc of xml elements
+                          'test/testcases/span/03_codespan/highlighting.html', # bc of span elements inside code element
+                          'test/testcases/block/04_header/with_auto_ids.html', # bc of auto_ids=true option
+                          'test/testcases/block/04_header/header_type_offset.html', # bc of header_offset option
+                          'test/testcases/block/06_codeblock/rouge/simple.html', # bc of double surrounding <div>
+                          'test/testcases/block/06_codeblock/rouge/multiple.html', # bc of double surrounding <div>
+                          ('test/testcases/span/03_codespan/rouge/simple.html' if RUBY_VERSION < '2.0'),
+                          ('test/testcases/span/03_codespan/rouge/disabled.html' if RUBY_VERSION < '2.0'),
+                          'test/testcases/block/15_math/ritex.html', # bc of tidy
+                          'test/testcases/span/math/ritex.html', # bc of tidy
+                          'test/testcases/block/15_math/itex2mml.html', # bc of tidy
+                          'test/testcases/span/math/itex2mml.html', # bc of tidy
+                          'test/testcases/block/15_math/mathjaxnode.html', # bc of tidy
+                          'test/testcases/block/15_math/mathjaxnode_notexhints.html', # bc of tidy
+                          'test/testcases/block/15_math/mathjaxnode_semantics.html', # bc of tidy
+                          'test/testcases/span/math/mathjaxnode.html', # bc of tidy
+                          'test/testcases/block/15_math/mathjax_preview.html', # bc of mathjax preview
+                          'test/testcases/block/15_math/mathjax_preview_simple.html', # bc of mathjax preview
+                          'test/testcases/block/15_math/mathjax_preview_as_code.html', # bc of mathjax preview
+                          'test/testcases/span/05_html/mark_element.html', # bc of tidy
+                          'test/testcases/block/09_html/xml.html', # bc of tidy
+                          'test/testcases/span/05_html/xml.html', # bc of tidy
+                         ].compact
+    EXCLUDE_HTML_TEXT_FILES = ['test/testcases/block/09_html/parse_as_span.htmlinput',
+                               'test/testcases/block/09_html/parse_as_raw.htmlinput',
+                              ].compact
+    Dir[File.dirname(__FILE__) + '/testcases/**/*.{html,html.19,htmlinput,htmlinput.19}'].each do |html_file|
+      next if EXCLUDE_HTML_FILES.any? {|f| html_file =~ /#{f}(\.19)?$/}
+      next if (RUBY_VERSION >= '1.9' && File.exist?(html_file + '.19')) ||
+        (RUBY_VERSION < '1.9' && html_file =~ /\.19$/)
+
+      out_files = []
+      out_files << [(html_file =~ /\.htmlinput(\.19)?$/ ? html_file.sub(/input(\.19)?$/, '') : html_file), :to_html]
+      if html_file =~ /\.htmlinput(\.19)?$/ && !EXCLUDE_HTML_TEXT_FILES.any? {|f| html_file =~ /#{f}/}
+        out_files << [html_file.sub(/htmlinput(\.19)?$/, 'text'), :to_kramdown]
+      end
+      out_files.select {|f, _| File.exist?(f)}.each do |out_file, out_method|
+        define_method('test_' + html_file.tr('.', '_') + "_to_#{File.extname(out_file)}") do
+          opts_file = html_file.sub(/\.html(input)?(\.19)?$/, '.options')
+          opts_file = File.join(File.dirname(html_file), 'options') if !File.exist?(opts_file)
+          options = File.exist?(opts_file) ? YAML::load(File.read(opts_file)) : {:auto_ids => false, :footnote_nr => 1}
+          doc = Kramdown::Document.new(File.read(html_file), options.merge(:input => 'html'))
+          if out_method == :to_html
+            assert_equal(tidy_output(File.read(out_file)), tidy_output(doc.send(out_method)))
+          else
+            assert_equal(File.read(out_file), doc.send(out_method))
+          end
+        end
+      end
+    end
+  end
+
+  def tidy_output(out)
+    cmd = "tidy -q --doctype omit #{RUBY_VERSION >= '1.9' ? '-utf8' : '-raw'} 2>/dev/null"
+    result = IO.popen(cmd, 'r+') do |io|
+      io.write(out)
+      io.close_write
+      io.read
+    end
+    if $?.exitstatus == 2
+      raise "Problem using tidy"
+    end
+    result
+  end
+
+  # Generate test methods for text-to-latex conversion and compilation
+  `latex -v 2>&1`
+  if $?.exitstatus != 0
+    warn("Skipping latex compilation tests because latex executable is missing")
+  else
+    EXCLUDE_LATEX_FILES = ['test/testcases/span/01_link/image_in_a.text', # bc of image link
+                           'test/testcases/span/01_link/imagelinks.text', # bc of image links
+                           'test/testcases/span/01_link/empty_title.text',
+                           'test/testcases/span/04_footnote/markers.text', # bc of footnote in header
+                           'test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text',
+                           'test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text',
+                          ].compact
+    Dir[File.dirname(__FILE__) + '/testcases/**/*.text'].each do |text_file|
+      next if EXCLUDE_LATEX_FILES.any? {|f| text_file =~ /#{f}$/}
+      define_method('test_' + text_file.tr('.', '_') + "_to_latex_compilation") do
+        latex =  Kramdown::Document.new(File.read(text_file),
+                                        :auto_ids => false, :footnote_nr => 1,
+                                        :template => 'document').to_latex
+        Dir.mktmpdir do |tmpdir|
+          result = IO.popen("latex -output-directory='#{tmpdir}' 2>/dev/null", 'r+') do |io|
+            io.write(latex)
+            io.close_write
+            io.read
+          end
+          assert($?.exitstatus == 0, result.scan(/^!(.*\n.*)/).join("\n"))
+        end
+      end
+    end
+  end
+
+  # Generate test methods for text->kramdown->html conversion
+  `tidy -v 2>&1`
+  if $?.exitstatus != 0
+    warn("Skipping text->kramdown->html tests because tidy executable is missing")
+  else
+    EXCLUDE_TEXT_FILES = ['test/testcases/span/05_html/markdown_attr.text',  # bc of markdown attr
+                          'test/testcases/block/09_html/markdown_attr.text', # bc of markdown attr
+                          'test/testcases/span/extension/options.text',      # bc of parse_span_html option
+                          'test/testcases/block/12_extension/options.text',  # bc of options option
+                          'test/testcases/block/12_extension/options3.text', # bc of options option
+                          'test/testcases/block/09_html/content_model/tables.text',  # bc of parse_block_html option
+                          'test/testcases/block/09_html/html_to_native/header.text', # bc of auto_ids option that interferes
+                          'test/testcases/block/09_html/html_to_native/table_simple.text', # bc of tr style attr getting removed
+                          'test/testcases/block/09_html/simple.text',        # bc of webgen:block elements
+                          'test/testcases/block/11_ial/simple.text',         # bc of change of ordering of attributes in header
+                          'test/testcases/span/extension/comment.text',      # bc of comment text modifications (can this be avoided?)
+                          'test/testcases/block/04_header/header_type_offset.text', # bc of header_offset being applied twice
+                          ('test/testcases/block/04_header/with_auto_ids.text' if RUBY_VERSION <= '1.8.6'), # bc of dep stringex not working
+                          ('test/testcases/span/03_codespan/rouge/simple.text' if RUBY_VERSION < '2.0'), #bc of rouge
+                          ('test/testcases/span/03_codespan/rouge/disabled.text' if RUBY_VERSION < '2.0'), #bc of rouge
+                          'test/testcases/block/06_codeblock/rouge/simple.text',
+                          'test/testcases/block/06_codeblock/rouge/multiple.text', # check, what document contain more, than one code block
+                          'test/testcases/block/15_math/ritex.text', # bc of tidy
+                          'test/testcases/span/math/ritex.text', # bc of tidy
+                          'test/testcases/block/15_math/itex2mml.text', # bc of tidy
+                          'test/testcases/span/math/itex2mml.text', # bc of tidy
+                          'test/testcases/block/15_math/mathjaxnode.text', # bc of tidy
+                          'test/testcases/block/15_math/mathjaxnode_notexhints.text', # bc of tidy
+                          'test/testcases/block/15_math/mathjaxnode_semantics.text', # bc of tidy
+                          'test/testcases/span/math/mathjaxnode.text', # bc of tidy
+                          'test/testcases/span/01_link/link_defs_with_ial.text', # bc of attribute ordering
+                          'test/testcases/span/05_html/mark_element.text', # bc of tidy
+                          'test/testcases/block/09_html/xml.text', # bc of tidy
+                          'test/testcases/span/05_html/xml.text', # bc of tidy
+                         ].compact
+    Dir[File.dirname(__FILE__) + '/testcases/**/*.text'].each do |text_file|
+      next if EXCLUDE_TEXT_FILES.any? {|f| text_file =~ /#{f}$/}
+      html_file = text_file.sub(/\.text$/, '.html')
+      html_file += '.19' if RUBY_VERSION >= '1.9' && File.exist?(html_file + '.19')
+      next unless File.exist?(html_file)
+      define_method('test_' + text_file.tr('.', '_') + "_to_kramdown_to_html") do
+        opts_file = text_file.sub(/\.text$/, '.options')
+        opts_file = File.join(File.dirname(text_file), 'options') if !File.exist?(opts_file)
+        options = File.exist?(opts_file) ? YAML::load(File.read(opts_file)) : {:auto_ids => false, :footnote_nr => 1}
+        kdtext = Kramdown::Document.new(File.read(text_file), options).to_kramdown
+        html = Kramdown::Document.new(kdtext, options).to_html
+        assert_equal(tidy_output(File.read(html_file)), tidy_output(html))
+      end
+    end
+  end
+
+  # Generate test methods for html-to-kramdown-to-html conversion
+  `tidy -v 2>&1`
+  if $?.exitstatus != 0
+    warn("Skipping html-to-kramdown-to-html tests because tidy executable is missing")
+  else
+    EXCLUDE_HTML_KD_FILES = ['test/testcases/span/extension/options.html',        # bc of parse_span_html option
+                             'test/testcases/span/05_html/normal.html',           # bc of br tag before closing p tag
+                             'test/testcases/block/12_extension/nomarkdown.html', # bc of nomarkdown extension
+                             'test/testcases/block/09_html/simple.html',          # bc of webgen:block elements
+                             'test/testcases/block/09_html/markdown_attr.html',   # bc of markdown attr
+                             'test/testcases/block/09_html/html_to_native/table_simple.html', # bc of invalidly converted simple table
+                             'test/testcases/block/06_codeblock/whitespace.html', # bc of entity to char conversion
+                             'test/testcases/block/06_codeblock/rouge/simple.html', # bc of double surrounding <div>
+                             'test/testcases/block/06_codeblock/rouge/multiple.html', # bc of double surrounding <div>
+                             'test/testcases/block/11_ial/simple.html',           # bc of change of ordering of attributes in header
+                             'test/testcases/span/03_codespan/highlighting.html', # bc of span elements inside code element
+                             'test/testcases/block/04_header/with_auto_ids.html', # bc of auto_ids=true option
+                             'test/testcases/block/04_header/header_type_offset.html', # bc of header_offset option
+                             'test/testcases/block/16_toc/toc_exclude.html',      # bc of different attribute ordering
+                             'test/testcases/span/autolinks/url_links.html',      # bc of quot entity being converted to char
+                             ('test/testcases/span/03_codespan/rouge/simple.html' if RUBY_VERSION < '2.0'),
+                             ('test/testcases/span/03_codespan/rouge/disabled.html' if RUBY_VERSION < '2.0'),
+                             'test/testcases/block/15_math/ritex.html', # bc of tidy
+                             'test/testcases/span/math/ritex.html', # bc of tidy
+                             'test/testcases/block/15_math/itex2mml.html', # bc of tidy
+                             'test/testcases/span/math/itex2mml.html', # bc of tidy
+                             'test/testcases/block/15_math/mathjaxnode.html', # bc of tidy
+                             'test/testcases/block/15_math/mathjaxnode_notexhints.html', # bc of tidy
+                             'test/testcases/block/15_math/mathjaxnode_semantics.html', # bc of tidy
+                             'test/testcases/span/math/mathjaxnode.html', # bc of tidy
+                             'test/testcases/block/15_math/mathjax_preview.html', # bc of mathjax preview
+                             'test/testcases/block/15_math/mathjax_preview_simple.html', # bc of mathjax preview
+                             'test/testcases/block/15_math/mathjax_preview_as_code.html', # bc of mathjax preview
+                             'test/testcases/span/01_link/link_defs_with_ial.html', # bc of attribute ordering
+                             'test/testcases/span/05_html/mark_element.html', # bc of tidy
+                             'test/testcases/block/09_html/xml.html', # bc of tidy
+                             'test/testcases/span/05_html/xml.html', # bc of tidy
+                            ].compact
+    Dir[File.dirname(__FILE__) + '/testcases/**/*.{html,html.19}'].each do |html_file|
+      next if EXCLUDE_HTML_KD_FILES.any? {|f| html_file =~ /#{f}(\.19)?$/}
+      next if (RUBY_VERSION >= '1.9' && File.exist?(html_file + '.19')) ||
+        (RUBY_VERSION < '1.9' && html_file =~ /\.19$/)
+      define_method('test_' + html_file.tr('.', '_') + "_to_kramdown_to_html") do
+        kd = Kramdown::Document.new(File.read(html_file), :input => 'html', :auto_ids => false, :footnote_nr => 1).to_kramdown
+        opts_file = html_file.sub(/\.html(\.19)?$/, '.options')
+        opts_file = File.join(File.dirname(html_file), 'options') if !File.exist?(opts_file)
+        options = File.exist?(opts_file) ? YAML::load(File.read(opts_file)) : {:auto_ids => false, :footnote_nr => 1}
+        doc = Kramdown::Document.new(kd, options)
+        assert_equal(tidy_output(File.read(html_file)), tidy_output(doc.to_html))
+      end
+    end
+  end
+
+  # Generate test methods for text-manpage conversion
+  Dir[File.dirname(__FILE__) + '/testcases/man/**/*.text'].each do |text_file|
+    define_method('test_' + text_file.tr('.', '_') + "_to_man") do
+      man_file = text_file.sub(/\.text$/, '.man')
+      doc =  Kramdown::Document.new(File.read(text_file))
+      assert_equal(File.read(man_file), doc.to_man)
+    end
+  end
+
+  EXCLUDE_GFM_FILES = [
+                       'test/testcases/block/03_paragraph/no_newline_at_end.text',
+                       'test/testcases/block/03_paragraph/indented.text',
+                       'test/testcases/block/03_paragraph/two_para.text',
+                       'test/testcases/block/04_header/atx_header.text',
+                       'test/testcases/block/04_header/setext_header.text',
+                       'test/testcases/block/04_header/with_auto_ids.text', # bc of ID generation difference
+                       'test/testcases/block/04_header/with_auto_id_prefix.text', # bc of ID generation difference
+                       'test/testcases/block/05_blockquote/indented.text',
+                       'test/testcases/block/05_blockquote/lazy.text',
+                       'test/testcases/block/05_blockquote/nested.text',
+                       'test/testcases/block/05_blockquote/no_newline_at_end.text',
+                       'test/testcases/block/06_codeblock/error.text',
+                       'test/testcases/block/07_horizontal_rule/error.text',
+                       'test/testcases/block/08_list/escaping.text',
+                       'test/testcases/block/08_list/item_ial.text',
+                       'test/testcases/block/08_list/lazy.text',
+                       'test/testcases/block/08_list/list_and_others.text',
+                       'test/testcases/block/08_list/other_first_element.text',
+                       'test/testcases/block/08_list/simple_ul.text',
+                       'test/testcases/block/08_list/special_cases.text',
+                       'test/testcases/block/08_list/lazy_and_nested.text', # bc of change in lazy line handling
+                       'test/testcases/block/09_html/comment.text',
+                       'test/testcases/block/09_html/html_to_native/code.text',
+                       'test/testcases/block/09_html/html_to_native/emphasis.text',
+                       'test/testcases/block/09_html/html_to_native/typography.text',
+                       'test/testcases/block/09_html/parse_as_raw.text',
+                       'test/testcases/block/09_html/simple.text',
+                       'test/testcases/block/12_extension/comment.text',
+                       'test/testcases/block/12_extension/ignored.text',
+                       'test/testcases/block/12_extension/nomarkdown.text',
+                       'test/testcases/block/13_definition_list/item_ial.text',
+                       'test/testcases/block/13_definition_list/multiple_terms.text',
+                       'test/testcases/block/13_definition_list/no_def_list.text',
+                       'test/testcases/block/13_definition_list/simple.text',
+                       'test/testcases/block/13_definition_list/with_blocks.text',
+                       'test/testcases/block/14_table/errors.text',
+                       'test/testcases/block/14_table/escaping.text',
+                       'test/testcases/block/14_table/simple.text',
+                       'test/testcases/block/15_math/normal.text',
+                       'test/testcases/block/16_toc/toc_with_footnotes.text', # bc of ID generation difference
+                       'test/testcases/encoding.text',
+                       'test/testcases/span/01_link/inline.text',
+                       'test/testcases/span/01_link/link_defs.text',
+                       'test/testcases/span/01_link/reference.text',
+                       'test/testcases/span/02_emphasis/normal.text',
+                       'test/testcases/span/03_codespan/normal.text',
+                       'test/testcases/span/04_footnote/definitions.text',
+                       'test/testcases/span/04_footnote/markers.text',
+                       'test/testcases/span/05_html/across_lines.text',
+                       'test/testcases/span/05_html/markdown_attr.text',
+                       'test/testcases/span/05_html/normal.text',
+                       'test/testcases/span/05_html/raw_span_elements.text',
+                       'test/testcases/span/autolinks/url_links.text',
+                       'test/testcases/span/extension/comment.text',
+                       'test/testcases/span/ial/simple.text',
+                       'test/testcases/span/line_breaks/normal.text',
+                       'test/testcases/span/math/normal.text',
+                       'test/testcases/span/text_substitutions/entities_as_char.text',
+                       'test/testcases/span/text_substitutions/entities.text',
+                       'test/testcases/span/text_substitutions/typography.text',
+                       ('test/testcases/span/03_codespan/rouge/simple.text' if RUBY_VERSION < '2.0'),
+                       ('test/testcases/span/03_codespan/rouge/disabled.text' if RUBY_VERSION < '2.0'),
+                       ('test/testcases/block/06_codeblock/rouge/simple.text' if RUBY_VERSION < '2.0'), #bc of rouge
+                       ('test/testcases/block/06_codeblock/rouge/disabled.text' if RUBY_VERSION < '2.0'), #bc of rouge
+                       ('test/testcases/block/06_codeblock/rouge/multiple.text' if RUBY_VERSION < '2.0'), #bc of rouge
+                       ('test/testcases/block/15_math/itex2mml.text' if RUBY_PLATFORM == 'java'), # bc of itextomml
+                       ('test/testcases/span/math/itex2mml.text' if RUBY_PLATFORM == 'java'), # bc of itextomml
+                      ].compact
+
+  # Generate test methods for gfm-to-html conversion
+  Dir[File.dirname(__FILE__) + '/{testcases,testcases_gfm}/**/*.text'].each do |text_file|
+    next if EXCLUDE_GFM_FILES.any? {|f| text_file =~ /#{f}$/}
+    basename = text_file.sub(/\.text$/, '')
+
+    html_file = [(".html.19" if RUBY_VERSION >= '1.9'), ".html"].compact.
+      map {|ext| basename + ext }.
+      detect {|file| File.exist?(file) }
+    next unless html_file
+
+    define_method('test_gfm_' + text_file.tr('.', '_') + "_to_html") do
+      opts_file = basename + '.options'
+      opts_file = File.join(File.dirname(html_file), 'options') if !File.exist?(opts_file)
+      options = File.exist?(opts_file) ? YAML::load(File.read(opts_file)) : {:auto_ids => false, :footnote_nr => 1}
+      doc = Kramdown::Document.new(File.read(text_file), options.merge(:input => 'GFM'))
+      assert_equal(File.read(html_file), doc.to_html)
+    end
+  end
+
+
+  EXCLUDE_PDF_MODIFY = ['test/testcases/span/text_substitutions/entities.text',
+                        'test/testcases/span/text_substitutions/entities_numeric.text',
+                        'test/testcases/span/text_substitutions/entities_as_char.text',
+                        'test/testcases/span/text_substitutions/entities_as_input.text',
+                        'test/testcases/span/text_substitutions/entities_symbolic.text',
+                        'test/testcases/block/04_header/with_auto_ids.text',
+                       ].compact
+
+  EXCLUDE_MODIFY = ['test/testcases/block/06_codeblock/rouge/multiple.text', # bc of HTMLFormater in options
+                   ]
+
+  # Generate test methods for asserting that converters don't modify the document tree.
+  Dir[File.dirname(__FILE__) + '/testcases/**/*.text'].each do |text_file|
+    opts_file = text_file.sub(/\.text$/, '.options')
+    options = File.exist?(opts_file) ? YAML::load(File.read(opts_file)) : {:auto_ids => false, :footnote_nr => 1}
+    (Kramdown::Converter.constants.map {|c| c.to_sym} - [:Base, :RemoveHtmlTags, :MathEngine, :SyntaxHighlighter]).each do |conv_class|
+      next if EXCLUDE_MODIFY.any? {|f| text_file =~ /#{f}$/}
+      next if conv_class == :Pdf && (RUBY_VERSION < '2.0' || EXCLUDE_PDF_MODIFY.any? {|f| text_file =~ /#{f}$/})
+      define_method("test_whether_#{conv_class}_modifies_tree_with_file_#{text_file.tr('.', '_')}") do
+        doc = Kramdown::Document.new(File.read(text_file), options)
+        options_before = Marshal.load(Marshal.dump(doc.options))
+        tree_before = Marshal.load(Marshal.dump(doc.root))
+        Kramdown::Converter.const_get(conv_class).convert(doc.root, doc.options)
+        assert_equal(options_before, doc.options)
+        assert_tree_not_changed(tree_before, doc.root)
+      end
+    end
+  end
+
+  def assert_tree_not_changed(old, new)
+    assert_equal(old.type, new.type, "type mismatch")
+    if old.value.kind_of?(Kramdown::Element)
+      assert_tree_not_changed(old.value, new.value)
+    else
+      assert(old.value == new.value, "value mismatch")
+    end
+    assert_equal(old.attr, new.attr, "attr mismatch")
+    assert_equal(old.options, new.options, "options mismatch")
+    assert_equal(old.children.length, new.children.length, "children count mismatch")
+
+    old.children.each_with_index do |child, index|
+      assert_tree_not_changed(child, new.children[index])
+    end
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/test_location.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/test_location.rb
new file mode 100644
index 0000000..4477fbd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/test_location.rb
@@ -0,0 +1,229 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+
+require 'minitest/autorun'
+require 'kramdown'
+
+Encoding.default_external = 'utf-8' if RUBY_VERSION >= '1.9'
+
+describe 'location' do
+
+  # checks that +element+'s :location option corresponds to the location stored
+  # in the element.attr['class']
+  def check_element_for_location(element)
+    if (match = /^line-(\d+)/.match(element.attr['class'] || ''))
+      expected_line = match[1].to_i
+      element.options[:location].must_equal(expected_line)
+    end
+    element.children.each do |child|
+      check_element_for_location(child)
+    end
+  end
+
+  # Test cases consist of a kramdown string that uses IALs to specify the expected
+  # line numbers for a given element.
+  test_cases = {
+    'autolink' => %(testing autolinks\n\n<http://kramdown.org>{:.line-3}),
+    'blockquote' => %(
+      > block quote1
+      >
+      > * {:.line-3} list item in block quote
+      > * {:.line-4} list item in block quote
+      > {:.line-3}
+      {:.line-1}
+
+      > block quote2
+      {:.line-8}
+    ),
+    'codeblock' => %(\na para\n\n~~~~\ntest code 1\n~~~~\n{:.line-3}\n\n    test code 2\n{:.line-8}\n),
+    'codespan' => %(a para\n\nanother para `<code>`{:.line-3} with code\n),
+    'emphasis' => %(
+      para *span*{:.line-1}
+      {:.line-1}
+
+      ## header *span*{:.line-4}
+      {:.line-4}
+
+      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+      tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+      quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+      consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+      cillum *short span on single line*{:.line-11}
+      dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+      *long span over multiple lines - proident, sunt in culpa qui officia deserunt
+      mollit anim id est laborum.*{:.line-13}
+      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+      tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+      quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+      `code span`{:.line-18}
+      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+      tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+      quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+      {:.line-7}
+    ),
+    'header' => %(
+      # header1
+      {:.line-1}
+
+      ## header2
+      {:.line-4}
+
+      ## header3
+      {:.line-7}
+
+      header4
+      =======
+      {:.line-10}
+
+      ^
+
+      header5
+      -------
+      {:.line-16}
+    ),
+    'horizontal_rule' => %(\na para\n\n----\n{:.line-3}\n),
+    'html_entity' => "a para\n\nanother para with &amp;{:.line-3} html entity.\n",
+    'link' => %(
+      a para
+
+      This is [a link](http://rubyforge.org){:.line-3} to a page.
+
+      Here comes a ![smiley](../images/smiley.png){:.line-5}
+    ),
+    'list' => %(
+      * {:.line-1} list item
+      * {:.line-2} list item
+      * {:.line-3} list item
+      {:.line-1}
+
+      {:.line-7}
+      1. {:.line-7} list item
+      2. {:.line-8} list item
+      3. {:.line-9} list item
+
+      {:.line-12}
+      definition term 1
+      : {:.line-13} definition definition 1
+      definition term 2
+      : {:.line-15} definition definition 2
+    ),
+    'math_block' => %(\na para\n\n$$5+5$$\n{:.line-3}\n),
+    'math_inline' => %(\na para\n\nanother para with inline math $$5+5$${:.line-3}\n),
+    'paragraph' => %(
+      para1
+      {:.line-1}
+
+      para2
+      {:.line-4}
+
+      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+      tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+      quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+      consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+      {:.line-7}
+
+      {:.line-14}
+      para with leading IAL
+    ),
+    'table' => %(
+      a para
+
+      |first|second|third|
+      |-----|------|-----|
+      |a    |b     |c    |
+      {:.line-3}
+    ),
+    'typographic_symbol' => %(
+      a para
+
+      another para ---{:.line-3}
+
+      another para ...{:.line-5}
+    ),
+    'gh issue 129' => %(
+      `|`
+      {:.line-1}
+    ),
+    'gh issue 131' => %(
+      * {:.line-1} test
+        line 2
+        * {:.line-3} second
+        * {:.line-4} third
+      * {:.line-5} * {:.line-5} one
+        * {:.line-6} two
+    ),
+    'gh issue 158' => %(
+      😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁😁
+      {:.line-1}
+
+      - {:.line-4} T
+      {:.line-4}
+
+      # T
+      {:.line-7}
+    ),
+    'gh issue 243 - HTML raw elements' => %(
+      <ul class="line-1">
+        <li class="line-2">Test</li>
+      </ul>
+    ),
+  }
+  test_cases.each do |name, test_string|
+    it "Handles #{ name }" do
+      doc = Kramdown::Document.new(test_string.gsub(/^      /, '').strip)
+      check_element_for_location(doc.root)
+    end
+  end
+
+  it 'adds location info to duplicate abbreviation definition warnings' do
+    test_string = %(This snippet contains a duplicate abbreviation definition
+
+*[duplicate]: The first definition
+*[duplicate]: The second definition
+    )
+    doc = Kramdown::Document.new(test_string.strip)
+    doc.warnings.must_equal ["Duplicate abbreviation ID 'duplicate' on line 4 - overwriting"]
+  end
+
+  it 'handles abbreviations' do
+    str = "This *is* ABC and\n**and** ABC second\nanother ABC\nas ABC as\nABC at the end.\n\n*[ABC]: ABC"
+    doc = Kramdown::Document.new(str)
+    doc.root.children.first.children.select {|e| e.type == :abbreviation}.each_with_index do |e, i|
+      assert_equal(i + 1, e.options[:location])
+    end
+  end
+
+  it 'handles line breaks' do
+    str = "First  \nsecond\\\\\nthird  \n"
+    doc = Kramdown::Document.new(str)
+    doc.root.children.first.children.select {|e| e.type == :br}.each_with_index do |e, i|
+      assert_equal(i + 1, e.options[:location])
+    end
+  end
+
+  it 'handles smart quotes' do
+    str = "This is 'first'\nand 'second' and\n'third'"
+    doc = Kramdown::Document.new(str)
+    doc.root.children.first.children.select {|e| e.type == :smart_quote}.each_with_index do |e, i|
+      assert_equal(((i + 1) /2.0).ceil, e.options[:location])
+    end
+  end
+
+  it 'handles hard wrapped paragraphs with the GFM parser' do
+    str = "A*b*C\nA*b*C\nA*b*C"
+    doc = Kramdown::Document.new(str, :input => 'GFM', :hard_wrap => true)
+    para = doc.root.children.first
+    1.upto(3) do |line|
+      0.upto(line == 3 ? 2 : 3) do |element|
+        assert_equal(line, para.children[4*(line - 1) + element].options[:location])
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/test_string_scanner_kramdown.rb b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/test_string_scanner_kramdown.rb
new file mode 100644
index 0000000..6c1c1ed
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/test_string_scanner_kramdown.rb
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+#
+#--
+# Copyright (C) 2009-2016 Thomas Leitner <t_leitner@gmx.at>
+#
+# This file is part of kramdown which is licensed under the MIT.
+#++
+#
+
+
+require 'minitest/autorun'
+require 'kramdown/utils/string_scanner'
+
+describe Kramdown::Utils::StringScanner do
+
+  [
+    ["...........X............", [/X/], 1],
+    ["1\n2\n3\n4\n5\n6X", [/X/], 6],
+    ["1\n2\n3\n4\n5\n6X\n7\n8X", [/X/,/X/], 8],
+    [(".\n" * 1000) + 'X', [/X/], 1001]
+  ].each_with_index do |test_data, i|
+    test_string, scan_regexes, expect = test_data
+    it "computes the correct current_line_number for example ##{i+1}" do
+      str_sc = Kramdown::Utils::StringScanner.new(test_string)
+      scan_regexes.each { |scan_re| str_sc.scan_until(scan_re) }
+      str_sc.current_line_number.must_equal expect
+    end
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/spaces.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/spaces.html
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/spaces.html
@@ -0,0 +1 @@
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/spaces.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/spaces.text
new file mode 100644
index 0000000..2cbdaa6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/spaces.text
@@ -0,0 +1,3 @@
+
+             
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/tabs.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/tabs.html
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/tabs.html
@@ -0,0 +1 @@
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/tabs.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/tabs.text
new file mode 100644
index 0000000..69d6a47
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/01_blank_line/tabs.text
@@ -0,0 +1,6 @@
+	
+			
+	
+		
+
+	
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/beginning.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/beginning.html
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/beginning.html
@@ -0,0 +1 @@
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/beginning.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/beginning.text
new file mode 100644
index 0000000..8d15802
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/beginning.text
@@ -0,0 +1,3 @@
+^
+
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/end.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/end.html
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/end.html
@@ -0,0 +1 @@
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/end.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/end.text
new file mode 100644
index 0000000..db56ec3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/end.text
@@ -0,0 +1,3 @@
+
+
+^
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/middle.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/middle.html
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/middle.html
@@ -0,0 +1 @@
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/middle.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/middle.text
new file mode 100644
index 0000000..87210a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/02_eob/middle.text
@@ -0,0 +1,5 @@
+
+
+^
+
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/indented.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/indented.html
new file mode 100644
index 0000000..810cfc0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/indented.html
@@ -0,0 +1,18 @@
+<p>This is a para.</p>
+
+<p>This is a para.</p>
+
+<p>This is a para.</p>
+
+<p>This is a para.</p>
+
+<pre><code>This is a code block.
+</code></pre>
+
+<p>And this is another.</p>
+
+<p>A para
+ with
+  mixed
+indents.
+   and with much indent</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/indented.html.gfm b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/indented.html.gfm
new file mode 100644
index 0000000..4440c62
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/indented.html.gfm
@@ -0,0 +1,18 @@
+<p>This is a para.</p>
+
+<p>This is a para.</p>
+
+<p>This is a para.</p>
+
+<p>This is a para.</p>
+
+<pre><code>This is a code block.
+</code></pre>
+
+<p>And this is another.</p>
+
+<p>A para
+<br /> with
+<br />  mixed
+<br />indents.
+<br />   and with much indent</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/indented.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/indented.text
new file mode 100644
index 0000000..5849f5b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/indented.text
@@ -0,0 +1,19 @@
+This is a para.
+
+ This is a para.
+
+  This is a para.
+
+   This is a para.
+
+    This is a code block.
+
+
+       
+And this is another.
+
+A para
+ with
+  mixed
+indents.
+   and with much indent
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/no_newline_at_end.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/no_newline_at_end.html
new file mode 100644
index 0000000..6a209e2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/no_newline_at_end.html
@@ -0,0 +1,5 @@
+<p>One paragraph
+over
+   multiple lines.</p>
+
+<p>Second one without newline.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/no_newline_at_end.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/no_newline_at_end.text
new file mode 100644
index 0000000..7f1169d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/no_newline_at_end.text
@@ -0,0 +1,5 @@
+  One paragraph
+over
+   multiple lines.
+
+Second one without newline.
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/one_para.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/one_para.html
new file mode 100644
index 0000000..0d20e17
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/one_para.html
@@ -0,0 +1 @@
+<p>This is just a normal paragraph.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/one_para.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/one_para.text
new file mode 100644
index 0000000..0b01324
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/one_para.text
@@ -0,0 +1 @@
+This is just a normal paragraph.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/two_para.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/two_para.html
new file mode 100644
index 0000000..d6194ea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/two_para.html
@@ -0,0 +1,4 @@
+<p>This is just a normal paragraph.
+That goes on to the second line.</p>
+
+<p>Another paragraph.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/two_para.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/two_para.text
new file mode 100644
index 0000000..b0c730d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/03_paragraph/two_para.text
@@ -0,0 +1,4 @@
+This is just a normal paragraph.
+That goes on to the second line.
+
+Another paragraph.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header.html
new file mode 100644
index 0000000..6e0c273
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header.html
@@ -0,0 +1,51 @@
+<h1>This is a header</h1>
+
+<h2>This is a header</h2>
+
+<h3>This is a header</h3>
+
+<h4>This is a header</h4>
+
+<h5>This is a header</h5>
+
+<h6>This is a header</h6>
+
+<h1>Header</h1>
+<h1>Header</h1>
+
+<h2>Header</h2>
+<blockquote>
+  <p>blockquote</p>
+</blockquote>
+
+<h6>header</h6>
+<p>paragraph</p>
+
+<blockquote>
+  <p>blockquote
+### not a header</p>
+</blockquote>
+
+<h1>header #</h1>
+
+<h1>header</h1>
+
+<p>#</p>
+
+<p>#</p>
+
+<h3 id="id">Header</h3>
+
+<h3 id="Id">Header</h3>
+
+<h3 id="id">Header</h3>
+
+<h3 id="A-Za-z0-9_:t">Header</h3>
+
+<h3>Header {#9ab}</h3>
+
+<h3>Header{#noid}</h3>
+
+<h3>Header ##{#noid}</h3>
+
+<h3>Last</h3>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header.text
new file mode 100644
index 0000000..33d703f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header.text
@@ -0,0 +1,48 @@
+# This is a header
+
+## This is a header
+
+### This is a header
+
+#### This is a header
+
+##### This is a header
+
+###### This is a header
+
+# Header
+^
+# Header
+
+##Header   #####
+> blockquote
+
+###### header 
+paragraph
+
+> blockquote
+### not a header
+
+# header \#
+
+# header
+
+# 
+
+#
+
+### Header {#id}
+
+### Header ## {#Id}  
+
+### Header    ##    {#id}
+
+### Header {#A-Za-z0-9_:t}
+
+### Header {#9ab}
+
+### Header{#noid}
+
+### Header ##{#noid}
+
+### Last
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header_no_newline_at_end.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header_no_newline_at_end.html
new file mode 100644
index 0000000..9f49c3b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header_no_newline_at_end.html
@@ -0,0 +1 @@
+<h1>header</h1>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header_no_newline_at_end.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header_no_newline_at_end.text
new file mode 100644
index 0000000..7b74be4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/atx_header_no_newline_at_end.text
@@ -0,0 +1 @@
+# header
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.html
new file mode 100644
index 0000000..e031b9a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.html
@@ -0,0 +1,11 @@
+<h2>Lorem ipsum</h2>
+
+<h3>Lorem ipsum</h3>
+
+<h4>Lorem ipsum</h4>
+
+<h6>Lorem ipsum</h6>
+
+<h2>Lorem ipsum</h2>
+
+<h3>Lorem ipsum</h3>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.kramdown b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.kramdown
new file mode 100644
index 0000000..a77deb9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.kramdown
@@ -0,0 +1,12 @@
+## Lorem ipsum
+
+### Lorem ipsum
+
+#### Lorem ipsum
+
+###### Lorem ipsum
+
+## Lorem ipsum
+
+### Lorem ipsum
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.latex b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.latex
new file mode 100644
index 0000000..c9017e6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.latex
@@ -0,0 +1,12 @@
+\subsection*{Lorem ipsum}
+
+\subsubsection*{Lorem ipsum}
+
+\paragraph*{Lorem ipsum}
+
+\subparagraph*{Lorem ipsum}
+
+\subsection*{Lorem ipsum}
+
+\subsubsection*{Lorem ipsum}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.options
new file mode 100644
index 0000000..a805035
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.options
@@ -0,0 +1,2 @@
+:header_offset: 1
+:auto_ids: false
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.text
new file mode 100644
index 0000000..bfaefa2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/header_type_offset.text
@@ -0,0 +1,13 @@
+# Lorem ipsum
+
+## Lorem ipsum
+
+### Lorem ipsum
+
+###### Lorem ipsum
+
+Lorem ipsum
+===========
+
+Lorem ipsum
+-----------
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header.html
new file mode 100644
index 0000000..147c345
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header.html
@@ -0,0 +1,32 @@
+<h2>test</h2>
+
+<h1>test2</h1>
+
+<h2>test</h2>
+<p>para</p>
+
+<pre><code>   header =
+</code></pre>
+
+<p>=</p>
+
+<p>This is a para.
+With two lines.
+And not a header.
+=================</p>
+
+<blockquote>
+  <p>Blockquote.
+Not a Header
+-</p>
+</blockquote>
+
+<h2 id="id">header</h2>
+
+<h1 id="Id">header</h1>
+
+<h2 id="A-Za-z0-9_:">header</h2>
+
+<h2>header{#noid}</h2>
+
+<h2>header</h2>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header.text
new file mode 100644
index 0000000..ae94ecd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header.text
@@ -0,0 +1,39 @@
+test
+-
+
+test2
+=========
+
+test
+-
+para
+
+       header
+=
+
+
+=
+
+This is a para.
+With two lines.
+And not a header.
+=================
+
+> Blockquote.
+Not a Header
+-
+
+header {#id}  
+------------
+
+header        {#Id}
+======
+
+header {#A-Za-z0-9_:}
+------
+
+header{#noid}
+-----
+
+header
+------
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header_no_newline_at_end.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header_no_newline_at_end.html
new file mode 100644
index 0000000..9f49c3b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header_no_newline_at_end.html
@@ -0,0 +1 @@
+<h1>header</h1>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header_no_newline_at_end.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header_no_newline_at_end.text
new file mode 100644
index 0000000..0f00750
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/setext_header_no_newline_at_end.text
@@ -0,0 +1,2 @@
+header
+======
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_prefix.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_prefix.html
new file mode 100644
index 0000000..724d391
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_prefix.html
@@ -0,0 +1,3 @@
+<h1 id="hallo_header-1">Header 1</h1>
+
+<h1 id="hallo_section">123</h1>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_prefix.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_prefix.options
new file mode 100644
index 0000000..83305cb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_prefix.options
@@ -0,0 +1,2 @@
+:auto_ids: true
+:auto_id_prefix: hallo_
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_prefix.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_prefix.text
new file mode 100644
index 0000000..acf09fe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_prefix.text
@@ -0,0 +1,3 @@
+# Header 1
+
+# 123
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_stripping.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_stripping.html
new file mode 100644
index 0000000..1d342cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_stripping.html
@@ -0,0 +1 @@
+<h1 id="this-is-a-header"><em class="none">This is a header</em></h1>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_stripping.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_stripping.options
new file mode 100644
index 0000000..68800f6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_stripping.options
@@ -0,0 +1 @@
+:auto_id_stripping: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_stripping.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_stripping.text
new file mode 100644
index 0000000..2b57bc8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_id_stripping.text
@@ -0,0 +1 @@
+# <em class="none">This is a header</em>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_ids.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_ids.html
new file mode 100644
index 0000000..af8126d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_ids.html
@@ -0,0 +1,21 @@
+<h1 id="this-is-a-header">This is a header</h1>
+
+<h2 id="another-one-1-here">12. Another one-1-here</h2>
+
+<h3 id="do--it-now">Do ^&amp; it now</h3>
+
+<h1 id="hallo">Hallo</h1>
+
+<h2 id="not-now">Not now</h2>
+
+<h1 id="hallo-1">Hallo</h1>
+
+<h1 id="section">23232</h1>
+
+<h1 id="section-1">33333</h1>
+
+<h2 id="hallo-2">hallO</h2>
+
+<h1>Header without ID</h1>
+
+<h1 id="transliterated-day-la-vi-du">Transliterated: Đây-là-ví-dụ</h1>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_ids.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_ids.options
new file mode 100644
index 0000000..0a1fec8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_ids.options
@@ -0,0 +1,2 @@
+:auto_ids: true
+:transliterated_header_ids: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_ids.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_ids.text
new file mode 100644
index 0000000..f4cd91b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/04_header/with_auto_ids.text
@@ -0,0 +1,24 @@
+# This is a header
+
+## 12. Another one-1-here
+
+### Do ^& it now
+
+Hallo
+=====
+
+Not now
+-------
+
+# Hallo
+
+# 23232
+
+# 33333
+
+## hallO
+
+# Header without ID
+{: id=""}
+
+# Transliterated: Đây-là-ví-dụ
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/indented.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/indented.html
new file mode 100644
index 0000000..734bb7a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/indented.html
@@ -0,0 +1,25 @@
+<blockquote>
+  <p>A normal blockquote.</p>
+</blockquote>
+
+<blockquote>
+  <p>A normal blockquote.</p>
+</blockquote>
+
+<blockquote>
+  <p>A normal blockquote.</p>
+</blockquote>
+
+<blockquote>
+  <p>A normal blockquote.</p>
+</blockquote>
+
+<pre><code>&gt; A codeblock
+</code></pre>
+
+<blockquote>
+  <p>Blockquote
+with
+mixed
+indents.</p>
+</blockquote>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/indented.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/indented.text
new file mode 100644
index 0000000..70850b0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/indented.text
@@ -0,0 +1,14 @@
+> A normal blockquote.
+
+ > A normal blockquote.
+
+  > A normal blockquote.
+
+   > A normal blockquote.
+
+    > A codeblock
+
+> Blockquote
+ > with
+  >mixed
+> indents.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/lazy.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/lazy.html
new file mode 100644
index 0000000..00a2102
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/lazy.html
@@ -0,0 +1,34 @@
+<blockquote>
+  <p>This is a long
+long line.</p>
+</blockquote>
+
+<blockquote>
+  <blockquote>
+    <p>Nested quote
+inside
+still inside</p>
+  </blockquote>
+</blockquote>
+
+<blockquote>
+  <blockquote>
+    <p>This is a subquote.
+over multipline lines.
+continuing
+here</p>
+  </blockquote>
+</blockquote>
+
+<blockquote>
+  <p>This is a quote
+    no code</p>
+</blockquote>
+
+<blockquote id="id">
+  <p>This is a quote</p>
+</blockquote>
+
+<blockquote>
+  <p>This is a quote</p>
+</blockquote>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/lazy.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/lazy.text
new file mode 100644
index 0000000..adde6a6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/lazy.text
@@ -0,0 +1,20 @@
+> This is a long
+long line.
+
+> > Nested quote
+inside
+> still inside
+
+> > This is a subquote.
+> > over multipline lines.
+> continuing
+here
+
+> This is a quote
+    no code
+
+> This is a quote
+{: #id}
+
+> This is a quote
+^
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/nested.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/nested.html
new file mode 100644
index 0000000..4bc94f0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/nested.html
@@ -0,0 +1,10 @@
+<blockquote>
+  <p>foo</p>
+
+  <blockquote>
+    <p>bar
+ baz</p>
+  </blockquote>
+
+  <p>foo</p>
+</blockquote>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/nested.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/nested.text
new file mode 100644
index 0000000..2176882
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/nested.text
@@ -0,0 +1,6 @@
+> foo
+>
+> > bar
+>>  baz
+>
+> foo
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/no_newline_at_end.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/no_newline_at_end.html
new file mode 100644
index 0000000..1de4a60
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/no_newline_at_end.html
@@ -0,0 +1,4 @@
+<blockquote>
+  <p>This is a block quote
+with no newline.</p>
+</blockquote>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/no_newline_at_end.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/no_newline_at_end.text
new file mode 100644
index 0000000..402648a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/no_newline_at_end.text
@@ -0,0 +1,2 @@
+> This is a block quote
+> with no newline.
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/very_long_line.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/very_long_line.html
new file mode 100644
index 0000000..4a9aaf5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/very_long_line.html
@@ -0,0 +1,3 @@
+<blockquote>
+  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+</blockquote>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/very_long_line.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/very_long_line.text
new file mode 100644
index 0000000..a2b33bd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/very_long_line.text
@@ -0,0 +1 @@
+> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/with_code_blocks.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/with_code_blocks.html
new file mode 100644
index 0000000..30abd99
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/with_code_blocks.html
@@ -0,0 +1,15 @@
+<blockquote>
+  <p>Example:</p>
+
+  <pre><code>sub status {
+    print "working";
+}
+</code></pre>
+
+  <p>Or:</p>
+
+  <pre><code>sub status {
+    return "working";
+}
+</code></pre>
+</blockquote>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/with_code_blocks.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/with_code_blocks.text
new file mode 100644
index 0000000..3b188dd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/05_blockquote/with_code_blocks.text
@@ -0,0 +1,11 @@
+>Example:
+> 
+>     sub status {
+>         print "working";
+>     }
+> 
+> Or:
+> 
+>     sub status {
+>         return "working";
+>     }
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/disable-highlighting.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/disable-highlighting.html
new file mode 100644
index 0000000..142a5d3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/disable-highlighting.html
@@ -0,0 +1,4 @@
+<pre><code>x = Class.new
+</code></pre>
+<pre lang="html"><code>&lt;a&gt;href&lt;/a&gt;
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/disable-highlighting.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/disable-highlighting.options
new file mode 100644
index 0000000..72e9bc1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/disable-highlighting.options
@@ -0,0 +1 @@
+:enable_coderay: false
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/disable-highlighting.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/disable-highlighting.text
new file mode 100644
index 0000000..af4d0bd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/disable-highlighting.text
@@ -0,0 +1,4 @@
+    x = Class.new
+^
+    <a>href</a>
+{: lang="html"}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/error.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/error.html
new file mode 100644
index 0000000..d9f9da3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/error.html
@@ -0,0 +1,4 @@
+<p>Some para</p>
+
+<p>~~~~~~
+not codeblock</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/error.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/error.text
new file mode 100644
index 0000000..60ea366
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/error.text
@@ -0,0 +1,4 @@
+Some para
+
+~~~~~~
+not codeblock
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.latex b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.latex
new file mode 100644
index 0000000..a092a1f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.latex
@@ -0,0 +1,9 @@
+\begin{minted}[breaklines,linenos]{ruby}
+x = Class.new
+
+\end{minted}
+
+\begin{minted}[breaklines,linenos]{html}
+<a>this is a reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, long link</a>
+
+\end{minted}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.options
new file mode 100644
index 0000000..b773fc8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.options
@@ -0,0 +1,4 @@
+:syntax_highlighter: minted
+:syntax_highlighter_opts:
+  wrap: true
+  line_numbers: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.text
new file mode 100644
index 0000000..2636518
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.text
@@ -0,0 +1,5 @@
+    x = Class.new
+{: .language-ruby}
+
+    <a>this is a reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, reaally, long link</a>
+{: .language-html}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted.latex b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted.latex
new file mode 100644
index 0000000..354d6ab
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted.latex
@@ -0,0 +1,8 @@
+\begin{minted}[]{ruby}
+x = Class.new
+
+\end{minted}
+\begin{minted}[]{html}
+<a>href</a>
+
+\end{minted}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted.options
new file mode 100644
index 0000000..b2ee189
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted.options
@@ -0,0 +1,3 @@
+:syntax_highlighter: minted
+:syntax_highlighter_opts:
+  default_lang: ruby
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted.text
new file mode 100644
index 0000000..5ac4746
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-minted.text
@@ -0,0 +1,4 @@
+    x = Class.new
+^
+    <a>href</a>
+{: .language-html}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-opts.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-opts.html
new file mode 100644
index 0000000..5a2ea48
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-opts.html
@@ -0,0 +1,6 @@
+<div class="language-ruby highlighter-coderay"><span class="CodeRay">x = <span class="constant">Class</span>.new
+</span>
+</div>
+<div class="language-html highlighter-coderay"><span class="CodeRay"><span class="tag">&lt;a&gt;</span>href<span class="tag">&lt;/a&gt;</span>
+</span>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-opts.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-opts.options
new file mode 100644
index 0000000..be21a32
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-opts.options
@@ -0,0 +1,7 @@
+:syntax_highlighter_opts:
+  block:
+    css: class
+  default_lang: ruby
+  wrap: span
+  line_numbers: null
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-opts.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-opts.text
new file mode 100644
index 0000000..5ac4746
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting-opts.text
@@ -0,0 +1,4 @@
+    x = Class.new
+^
+    <a>href</a>
+{: .language-html}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting.html
new file mode 100644
index 0000000..5a2ea48
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting.html
@@ -0,0 +1,6 @@
+<div class="language-ruby highlighter-coderay"><span class="CodeRay">x = <span class="constant">Class</span>.new
+</span>
+</div>
+<div class="language-html highlighter-coderay"><span class="CodeRay"><span class="tag">&lt;a&gt;</span>href<span class="tag">&lt;/a&gt;</span>
+</span>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting.options
new file mode 100644
index 0000000..8133537
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting.options
@@ -0,0 +1,5 @@
+:coderay_default_lang: ruby
+:coderay_wrap: span
+:coderay_line_numbers: ~
+:coderay_css: class
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting.text
new file mode 100644
index 0000000..5ac4746
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/highlighting.text
@@ -0,0 +1,4 @@
+    x = Class.new
+^
+    <a>href</a>
+{: .language-html}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/issue_gh45.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/issue_gh45.html
new file mode 100644
index 0000000..b096a9e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/issue_gh45.html
@@ -0,0 +1,164 @@
+
+<p>B</p>
+
+<pre><code>                       BBBBBBBB. 
+
+
+
+           BBBB BB BBBBBBBB BBBBB. BBBBBBB BB BBBBB BB BBB BBBB BBBBB BBB BBB BBBB BBB BBBBBBB BBB BBBBBBB. B BBB'B BBBBB BBBB BBB BBBB BBBBBBB BBBB BBBB BBBB BBBBBBBB.
+
+
+                BBB BBBBB BBBBB BBB BBBB BBBB BBBB, BBB BBBBB BB BBBBB BBB BB BBBBBB BBBB BBB BBBBB BBBB BB. BBBBB BBB BBBBB BBBBB BBB BBBB BB BBBB BBBB BBBBB.
+
+
+                         BBBB BBBBB, BBBBB, BBBBBBBB?
+
+                   BB BBB BB BBBB BBB BBBB BBB BBBBBB /BBB BB BBBBBBBBB BBBB BBBBBBB BBBBBB BB BBB. 
+
+
+                   BBBB BBBBBBBB BBB BBBB BB BBBBB BBB BBBBBB BBBB BBBBB BBBBBB BBBBBBBBB BBBB BB BBBBB......................................................................
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+              BBBBB B'B BBB BBBBB. BBBB BBBBB BBBBB. ( B BBBBB BBBBBBBBBB BBBBB BBBB'B BBBBB BBBBB. BBB BBBB BBBBB BBBB BBBB. BBBBBBB BBB BB BBBBBBB BBB BBB B BBBB BBBBBBBBBBBB. BBBBB BBBBB.)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+             BBBB'B BB
+</code></pre>
+
+<p>.</p>
+
+<pre><code>        B BBB BBB BBB ? B. B BBB BBBBBB BBBB BBB BBBB. BBBBBBB BB BBBBBBB B BBBB BBBB BBB BBBBBB. 
+
+
+
+
+
+
+
+
+
+
+
+
+
+         BBBB BB 'BBBB' BBBB BBBBB.
+
+
+                           BBBBBBBB B BBBB BBBBBB BB BBBBBBBB BBB BBBBBBB BBBBBBB BBBBBBB. 
+
+
+     B BBBB BB BBBB. BBBBB BBBBBBBB. BBB BB BB. BB BB BBBB BB BBBBBBBBBB. BB BBBBBBBB BB BBBBBBBBB. 
+
+
+                     BBBBBBBB BB BBBB. BBBBBBB BBB BBBBB BBBBB BBBBB. B'BB BBBBBBB BB BBBBB BBBBB BBBBBBB BBB BBBBB. BBBB. 
+
+  B BBBBBB BBBB BB BBBB BBB. (BB BBB BBBBB BBBBB...............B)
+
+
+
+           BBBB!
+
+
+
+         BBBB BB BBB BBBBBBB BBBBBB.            B
+</code></pre>
+
+<p>B</p>
+
+<pre><code>     BBBBB BB/BBB BBBBB!  BBBB BBBB BBBBBBBBBBB 'BBB'B BBBBBB.' 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+          BBBB BBBBBBB BBBB BB BBB BBBBBBBB BB BBBB BBBBBB BBB BBBBBBBBB BBBB. BBBBBBBB BBBBBBB BBBB BBBB BBBB BB BBBB BB BBBB BB BBBB B BBB BB BBBBB BBBBBB.  B BBBB BBBBBBB BB BBBB BBBBB B BBB BBBBBBB BB BBBBB BBBB. BBB BBBBBBB BBBB. B BBB BBBB BBBB B BBBB BBBBBB BBB B BBBBBB BBBBBB. BBB BB BBBBBB BBBBBB BBBBBBBBBB BB...BBBBB BBBB BBBB BB BBBBB. (BBBBBBB BBB BBBBBB BBB'B BBBB BBB BBBBB BBB BB BBBBB BBBBBBBBBBB  BBBBB B BBBB BBBB BBBBB. 
+
+
+
+
+
+
+
+
+
+BBBBB BB BB BBBB B'B BBBB BBBBB BBBBB BBB BB BBBBBB/BBB (BBBBB) BBBBBB BB. 
+                          BBBBBBBB. B BBB BBBB BB BB BBB/BBBBBB BBBBBB BBB BBBB BBBBBBBB BB BB B BBBBBB BBBBBB BBBBB. (BBB/B BBB BBBB BBBB...BBB BBB BBB BBBB BB BB B BBBB BB BBB BB? BBBBBBB B BBB B BBBB BBBBBBBB BBB B BBB BBB BBBBB BBBB BBB BBBB BB B BBBBBBBB BB BBBBB BB BB BBB BBBBB BBB BB BBBBB BBBBBBB B BBB BBBBBBB. BBBBBB (BBBBB) BBBB BBBBB BBBBBBB BBBBB BBBB BBBB BBB. 100 BBBBBB BB BBBBB. BBBB BBB BBB BBBBBB BBB BB. BBB BBBB BB BBB BBBBB! BBB BB BBBBBB BBBBB B BBB'B BBBBBBBBB BBBB BBB BBB. (BBBBBB BBBBBBB BB BBBB BBBBB (BBBBBB BBBBB BBBBB BBBBB.))
+
+
+    BBB B BBBBBBBBBBB BBBB BBB BB BBB. BBBBB BBB BBBBB B BBBB BBBBBB BBBBB BBB. BB BBBBBB BBB BBBB B BBB BB BBBBBBBB BBBBBB BBBB BBB B BBBBBB BBBB BBBBBB BBBBBBB BBBB BBBB BBB BBBBBBBB.
+
+
+
+
+
+
+
+
+
+
+
+           BBBBB!!!!!!!
+
+
+         B BBB BBBB BBBBBB BBBB BBBB BBBB B BBB BBBBB BBB BBBBB B BBBB BBBBBBB BB BB BBBB BBBBBBBBB. B BBBB BBBBBB BBBBBBB BBBB BBBB BBB BBBB.
+
+                                               BB BB, BB BBBBBB BBBB, (BBBBBB BB BBB BBBB . BBBBB BB BBBB BBBB BB BB BBBB BBBB B BBBB BB BB (BB BBBB BB BBB BBBBBBB BB BBBBBBB. )) BB'BB BBB BBB'B BB BB BBBB BB B BBBB B BBBBB (BB BBBBBB BB BBB B'BB BBBBBBBB BB BBBB BBBB.)
+
+
+  B BBBBB B'BB BBB BB BBBB BBB BBB.
+</code></pre>
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/issue_gh45.test b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/issue_gh45.test
new file mode 100644
index 0000000..1bf8901
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/issue_gh45.test
@@ -0,0 +1,188 @@
+   

+ 

+ B

+ 

+ 

+ 

+ 

+                           BBBBBBBB. 

+

+

+

+               BBBB BB BBBBBBBB BBBBB. BBBBBBB BB BBBBB BB BBB BBBB BBBBB BBB BBB BBBB BBB BBBBBBB BBB BBBBBBB. B BBB'B BBBBB BBBB BBB BBBB BBBBBBB BBBB BBBB BBBB BBBBBBBB.

+

+

+                    BBB BBBBB BBBBB BBB BBBB BBBB BBBB, BBB BBBBB BB BBBBB BBB BB BBBBBB BBBB BBB BBBBB BBBB BB. BBBBB BBB BBBBB BBBBB BBB BBBB BB BBBB BBBB BBBBB.

+

+

+                             BBBB BBBBB, BBBBB, BBBBBBBB?

+

+                       BB BBB BB BBBB BBB BBBB BBB BBBBBB /BBB BB BBBBBBBBB BBBB BBBBBBB BBBBBB BB BBB. 

+

+

+                       BBBB BBBBBBBB BBB BBBB BB BBBBB BBB BBBBBB BBBB BBBBB BBBBBB BBBBBBBBB BBBB BB BBBBB......................................................................

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+                  BBBBB B'B BBB BBBBB. BBBB BBBBB BBBBB. ( B BBBBB BBBBBBBBBB BBBBB BBBB'B BBBBB BBBBB. BBB BBBB BBBBB BBBB BBBB. BBBBBBB BBB BB BBBBBBB BBB BBB B BBBB BBBBBBBBBBBB. BBBBB BBBBB.)

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+                 BBBB'B BB

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+.

+

+            B BBB BBB BBB ? B. B BBB BBBBBB BBBB BBB BBBB. BBBBBBB BB BBBBBBB B BBBB BBBB BBB BBBBBB. 

+

+

+

+

+

+

+

+

+

+

+

+

+

+             BBBB BB 'BBBB' BBBB BBBBB.

+

+

+                               BBBBBBBB B BBBB BBBBBB BB BBBBBBBB BBB BBBBBBB BBBBBBB BBBBBBB. 

+

+

+         B BBBB BB BBBB. BBBBB BBBBBBBB. BBB BB BB. BB BB BBBB BB BBBBBBBBBB. BB BBBBBBBB BB BBBBBBBBB. 

+

+

+                         BBBBBBBB BB BBBB. BBBBBBB BBB BBBBB BBBBB BBBBB. B'BB BBBBBBB BB BBBBB BBBBB BBBBBBB BBB BBBBB. BBBB. 

+

+      B BBBBBB BBBB BB BBBB BBB. (BB BBB BBBBB BBBBB...............B)

+

+

+

+               BBBB!

+

+

+

+             BBBB BB BBB BBBBBBB BBBBBB.           

+B

+

+B

+

+

+

+         BBBBB BB/BBB BBBBB!  BBBB BBBB BBBBBBBBBBB 'BBB'B BBBBBB.' 

+

+

+

+

+

+

+

+

+

+

+

+

+

+

+              BBBB BBBBBBB BBBB BB BBB BBBBBBBB BB BBBB BBBBBB BBB BBBBBBBBB BBBB. BBBBBBBB BBBBBBB BBBB BBBB BBBB BB BBBB BB BBBB BB BBBB B BBB BB BBBBB BBBBBB.  B BBBB BBBBBBB BB BBBB BBBBB B BBB BBBBBBB BB BBBBB BBBB. BBB BBBBBBB BBBB. B BBB BBBB BBBB B BBBB BBBBBB BBB B BBBBBB BBBBBB. BBB BB BBBBBB BBBBBB BBBBBBBBBB BB...BBBBB BBBB BBBB BB BBBBB. (BBBBBBB BBB BBBBBB BBB'B BBBB BBB BBBBB BBB BB BBBBB BBBBBBBBBBB  BBBBB B BBBB BBBB BBBBB. 

+

+

+

+

+

+

+

+

+

+    BBBBB BB BB BBBB B'B BBBB BBBBB BBBBB BBB BB BBBBBB/BBB (BBBBB) BBBBBB BB. 

+                              BBBBBBBB. B BBB BBBB BB BB BBB/BBBBBB BBBBBB BBB BBBB BBBBBBBB BB BB B BBBBBB BBBBBB BBBBB. (BBB/B BBB BBBB BBBB...BBB BBB BBB BBBB BB BB B BBBB BB BBB BB? BBBBBBB B BBB B BBBB BBBBBBBB BBB B BBB BBB BBBBB BBBB BBB BBBB BB B BBBBBBBB BB BBBBB BB BB BBB BBBBB BBB BB BBBBB BBBBBBB B BBB BBBBBBB. BBBBBB (BBBBB) BBBB BBBBB BBBBBBB BBBBB BBBB BBBB BBB. 100 BBBBBB BB BBBBB. BBBB BBB BBB BBBBBB BBB BB. BBB BBBB BB BBB BBBBB! BBB BB BBBBBB BBBBB B BBB'B BBBBBBBBB BBBB BBB BBB. (BBBBBB BBBBBBB BB BBBB BBBBB (BBBBBB BBBBB BBBBB BBBBB.))

+

+

+        BBB B BBBBBBBBBBB BBBB BBB BB BBB. BBBBB BBB BBBBB B BBBB BBBBBB BBBBB BBB. BB BBBBBB BBB BBBB B BBB BB BBBBBBBB BBBBBB BBBB BBB B BBBBBB BBBB BBBBBB BBBBBBB BBBB BBBB BBB BBBBBBBB.

+

+

+

+

+

+

+

+

+

+

+

+               BBBBB!!!!!!!

+

+

+             B BBB BBBB BBBBBB BBBB BBBB BBBB B BBB BBBBB BBB BBBBB B BBBB BBBBBBB BB BB BBBB BBBBBBBBB. B BBBB BBBBBB BBBBBBB BBBB BBBB BBB BBBB.

+

+                                                   BB BB, BB BBBBBB BBBB, (BBBBBB BB BBB BBBB . BBBBB BB BBBB BBBB BB BB BBBB BBBB B BBBB BB BB (BB BBBB BB BBB BBBBBBB BB BBBBBBB. )) BB'BB BBB BBB'B BB BB BBBB BB B BBBB B BBBBB (BB BBBBBB BB BBB B'BB BBBBBBBB BB BBBB BBBB.)

+

+

+      B BBBBB B'BB BBB BB BBBB BBB BBB.

+

+

+       

+

diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/lazy.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/lazy.html
new file mode 100644
index 0000000..47188f2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/lazy.html
@@ -0,0 +1,4 @@
+<pre><code>This is some code
+
+This is some  other code
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/lazy.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/lazy.text
new file mode 100644
index 0000000..2a95de6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/lazy.text
@@ -0,0 +1,5 @@
+    This is some
+code
+
+    This is some
+ other code
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end.html
new file mode 100644
index 0000000..7a003b2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end.html
@@ -0,0 +1,2 @@
+<pre><code>test  
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end.text
new file mode 100644
index 0000000..b64563f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end.text
@@ -0,0 +1 @@
+    test  
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end_1.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end_1.html
new file mode 100644
index 0000000..005870e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end_1.html
@@ -0,0 +1,2 @@
+<pre><code>test   test
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end_1.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end_1.text
new file mode 100644
index 0000000..65df71e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/no_newline_at_end_1.text
@@ -0,0 +1,2 @@
+    test  
+test
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/normal.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/normal.html
new file mode 100644
index 0000000..0bd2c1f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/normal.html
@@ -0,0 +1,13 @@
+<pre><code>starting code
+</code></pre>
+
+<p>paragraph</p>
+
+<pre><code>other code  
+with samples 
+</code></pre>
+
+<p>paragraph</p>
+
+<pre><code>  ending code
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/normal.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/normal.text
new file mode 100644
index 0000000..40ea702
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/normal.text
@@ -0,0 +1,10 @@
+    starting code
+
+paragraph
+
+    other code  
+    with samples 
+
+paragraph
+
+      ending code
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/disabled.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/disabled.html
new file mode 100644
index 0000000..2cc34d3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/disabled.html
@@ -0,0 +1,2 @@
+<pre><code>x = Class.new
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/disabled.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/disabled.options
new file mode 100644
index 0000000..5688828
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/disabled.options
@@ -0,0 +1,4 @@
+:syntax_highlighter: rouge
+:syntax_highlighter_opts:
+  block:
+    disable: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/disabled.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/disabled.text
new file mode 100644
index 0000000..0e50b41
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/disabled.text
@@ -0,0 +1 @@
+    x = Class.new
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/multiple.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/multiple.html
new file mode 100644
index 0000000..f07af79
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/multiple.html
@@ -0,0 +1,11 @@
+<div class="language-ruby highlighter-rouge"><div class="custom-class"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"Hello"</span>
+</code></pre>
+</div></div>
+
+<div class="language-ruby highlighter-rouge"><div class="custom-class"><pre class="highlight"><code><span class="nb">puts</span> <span class="s2">"World"</span>
+</code></pre>
+</div></div>
+
+<div class="language-php highlighter-rouge"><div class="custom-class"><pre class="highlight"><code><span class="nv">$foo</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Bar</span><span class="p">;</span>
+</code></pre>
+</div></div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/multiple.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/multiple.options
new file mode 100644
index 0000000..d49e7b9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/multiple.options
@@ -0,0 +1,4 @@
+:syntax_highlighter: rouge
+:syntax_highlighter_opts:
+  default_lang: ruby
+  formatter: !ruby/class 'RougeHTMLFormatters'
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/multiple.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/multiple.text
new file mode 100644
index 0000000..d1dd283
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/multiple.text
@@ -0,0 +1,11 @@
+~~~ ruby
+puts "Hello"
+~~~
+
+~~~ ruby
+puts "World"
+~~~
+
+~~~ php?start_inline=1
+$foo = new Bar;
+~~~
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/simple.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/simple.html
new file mode 100644
index 0000000..84d71cf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/simple.html
@@ -0,0 +1,10 @@
+<div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span>
+</code></pre>
+</div>
+<div class="language-html highlighter-rouge"><pre class="highlight"><code><span class="nt">&lt;a&gt;</span>href<span class="nt">&lt;/a&gt;</span>
+</code></pre>
+</div>
+
+<div class="language-php highlighter-rouge"><pre class="highlight"><code><span class="nv">$foo</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Bar</span><span class="p">;</span>
+</code></pre>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/simple.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/simple.options
new file mode 100644
index 0000000..f59e0ff
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/simple.options
@@ -0,0 +1,3 @@
+:syntax_highlighter: rouge
+:syntax_highlighter_opts:
+  default_lang: ruby
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/simple.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/simple.text
new file mode 100644
index 0000000..6c740e5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/rouge/simple.text
@@ -0,0 +1,9 @@
+    x = Class.new
+^
+    <a>href</a>
+{: .language-html}
+
+
+~~~ php?start_inline=1
+$foo = new Bar;
+~~~
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/tilde_syntax.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/tilde_syntax.html
new file mode 100644
index 0000000..1ddd91e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/tilde_syntax.html
@@ -0,0 +1,7 @@
+<pre><code>Here comes some code.
+</code></pre>
+
+<pre><code>~~~~~~~
+code with tildes
+~~~~~~~~
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/tilde_syntax.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/tilde_syntax.text
new file mode 100644
index 0000000..7625a1b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/tilde_syntax.text
@@ -0,0 +1,9 @@
+~~~~~~~~
+Here comes some code.
+~~~~~~~~
+
+~~~~~~~~~~~~
+~~~~~~~
+code with tildes
+~~~~~~~~
+~~~~~~~~~~~~~~~~~~
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/whitespace.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/whitespace.html
new file mode 100644
index 0000000..dcbb40f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/whitespace.html
@@ -0,0 +1,3 @@
+<pre class="show-whitespaces"><code>This<span class="ws-tab">	</span>is<span class="ws-space">&#8901;</span>some<span class="ws-space-r">&#8901;</span><span class="ws-space-r">&#8901;</span>
+<span class="ws-space-l">&#8901;</span><span class="ws-space-l">&#8901;</span><span class="ws-space-l">&#8901;</span><span class="ws-space-l">&#8901;</span>whitespace<span class="ws-space-r">&#8901;</span><span class="ws-space-r">&#8901;</span>
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/whitespace.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/whitespace.text
new file mode 100644
index 0000000..b15c9c9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/whitespace.text
@@ -0,0 +1,3 @@
+    This	is some  
+        whitespace  
+{:.show-whitespaces}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_blank_line.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_blank_line.html
new file mode 100644
index 0000000..f7c20b2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_blank_line.html
@@ -0,0 +1,13 @@
+<p>paragraph</p>
+
+<pre><code>code block
+
+continued here
+</code></pre>
+
+<p>ended</p>
+
+<pre><code>next blank line has 4 spaces
+</code></pre>
+
+<p>paragraph</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_blank_line.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_blank_line.text
new file mode 100644
index 0000000..e51dfa5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_blank_line.text
@@ -0,0 +1,12 @@
+paragraph
+
+    code block
+
+    continued here
+    
+
+ended
+
+    next blank line has 4 spaces
+    
+paragraph
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_eob_marker.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_eob_marker.html
new file mode 100644
index 0000000..cca17a2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_eob_marker.html
@@ -0,0 +1,6 @@
+<pre><code>code block
+
+continued here
+</code></pre>
+<pre><code>new block here
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_eob_marker.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_eob_marker.text
new file mode 100644
index 0000000..834c768
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_eob_marker.text
@@ -0,0 +1,5 @@
+    code block
+
+    continued here
+^
+    new block here
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_ial.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_ial.html
new file mode 100644
index 0000000..77085b3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_ial.html
@@ -0,0 +1,6 @@
+<pre class="cls"><code>code block
+
+continued here
+</code></pre>
+<pre><code>new block here
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_ial.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_ial.text
new file mode 100644
index 0000000..4489f2d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_ial.text
@@ -0,0 +1,5 @@
+    code block
+
+    continued here
+{:.cls}
+    new block here
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.html
new file mode 100644
index 0000000..f5872c3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.html
@@ -0,0 +1,24 @@
+<pre><code class="language-ruby">def what?
+  42
+end
+</code></pre>
+
+<pre class="class1"><code class="language-ruby">def what?
+  42
+end
+</code></pre>
+
+<pre><code class="language-ruby">def what?
+  42
+end
+</code></pre>
+
+<pre class="language-python"><code class="language-ruby">def what?
+  42
+end
+</code></pre>
+
+<pre class="language-python"><code class="language-ruby">def what?
+  42
+end
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.options
new file mode 100644
index 0000000..871923c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.options
@@ -0,0 +1,2 @@
+:enable_coderay: false
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.text
new file mode 100644
index 0000000..07f437e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.text
@@ -0,0 +1,33 @@
+~~~ ruby
+def what?
+  42
+end
+~~~
+
+~~~ ruby
+def what?
+  42
+end
+~~~
+{:.class1}
+
+~~~
+def what?
+  42
+end
+~~~
+{: .language-ruby}
+
+~~~ ruby
+def what?
+  42
+end
+~~~
+{: .language-python}
+
+~~~ ruby
+def what?
+  42
+end
+~~~
+{: class="language-python"}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.html
new file mode 100644
index 0000000..2530b1e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.html
@@ -0,0 +1,8 @@
+<pre><code class="language-asn.1">text
+</code></pre>
+
+<pre><code class="language-asn#w1">text
+</code></pre>
+
+<pre><code class="language-русский">text
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.options
new file mode 100644
index 0000000..871923c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.options
@@ -0,0 +1,2 @@
+:enable_coderay: false
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text
new file mode 100644
index 0000000..60424a0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text
@@ -0,0 +1,11 @@
+~~~ asn.1
+text
+~~~
+
+~~~ asn#w1
+text
+~~~
+
+~~~ русский
+text
+~~~
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.html
new file mode 100644
index 0000000..aa4b60f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.html
@@ -0,0 +1,3 @@
+<pre><code class="language-act-iii">s1'dim'a'500'm'500'q'500''
+index'j'j+1'j-1''
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.options
new file mode 100644
index 0000000..871923c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.options
@@ -0,0 +1,2 @@
+:enable_coderay: false
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text
new file mode 100644
index 0000000..423d5b7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text
@@ -0,0 +1,4 @@
+~~~ act-iii
+s1'dim'a'500'm'500'q'500''
+index'j'j+1'j-1''
+~~~
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/error.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/error.html
new file mode 100644
index 0000000..6b01ba9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/error.html
@@ -0,0 +1,7 @@
+<p>_ * _</p>
+
+<p>&#8212; * * *</p>
+
+<p>_ - *</p>
+
+<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- test</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/error.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/error.html.19
new file mode 100644
index 0000000..068811c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/error.html.19
@@ -0,0 +1,7 @@
+<p>_ * _</p>
+
+<p>— * * *</p>
+
+<p>_ - *</p>
+
+<p>———————————————- test</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/error.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/error.text
new file mode 100644
index 0000000..a024710
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/error.text
@@ -0,0 +1,7 @@
+_ * _
+
+--- * * *
+
+_ - *
+
+---------------------------------------------- test
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/normal.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/normal.html
new file mode 100644
index 0000000..e74b6e6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/normal.html
@@ -0,0 +1,19 @@
+<hr />
+<hr />
+<hr />
+
+<p>d- -</p>
+
+<hr />
+<hr />
+<hr />
+
+<h2>para</h2>
+<p>text</p>
+
+<hr />
+
+<pre><code>- - -
+</code></pre>
+
+<hr class="test" />
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/normal.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/normal.text
new file mode 100644
index 0000000..986101a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/normal.text
@@ -0,0 +1,20 @@
+***
+* * *
+-  - -   
+
+d- -
+
+---
+___
+***
+
+para
+-----------
+text
+
+* * *
+
+    - - -
+
+* * *
+{:.test}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/sepspaces.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/sepspaces.html
new file mode 100644
index 0000000..dbb86e5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/sepspaces.html
@@ -0,0 +1,3 @@
+<hr />
+<hr />
+<hr />
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/sepspaces.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/sepspaces.text
new file mode 100644
index 0000000..a5798b2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/sepspaces.text
@@ -0,0 +1,3 @@
+- - -
+*      *      *
+_  _ _    _  _
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/septabs.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/septabs.html
new file mode 100644
index 0000000..dbb86e5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/septabs.html
@@ -0,0 +1,3 @@
+<hr />
+<hr />
+<hr />
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/septabs.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/septabs.text
new file mode 100644
index 0000000..464fe20
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/07_horizontal_rule/septabs.text
@@ -0,0 +1,3 @@
+-	-	-
+*		*		*
+_		_	_			_	_
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/escaping.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/escaping.html
new file mode 100644
index 0000000..afc795c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/escaping.html
@@ -0,0 +1,17 @@
+<p>I have read the book
+1984. It was great
+- other say that, too!</p>
+
+<p>I have read the book
+1984. It was great
+- other say that, too!</p>
+
+<p>I have read the book
+  1984. It was great.</p>
+
+<p>I have read the book 1984.
+  - it was great!</p>
+
+<p>1984. Was great!</p>
+
+<p>- This too!</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/escaping.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/escaping.text
new file mode 100644
index 0000000..c3b1c59
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/escaping.text
@@ -0,0 +1,17 @@
+I have read the book
+1984. It was great
+- other say that, too!
+
+I have read the book
+1984\. It was great
+\- other say that, too!
+
+I have read the book
+  1984. It was great.
+
+I have read the book 1984.
+  - it was great!
+
+1984\. Was great!
+
+\- This too!
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/item_ial.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/item_ial.html
new file mode 100644
index 0000000..e6dfd3a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/item_ial.html
@@ -0,0 +1,10 @@
+<ul>
+  <li class="cls">IAL at first
+continued</li>
+  <li>another {:.cls}</li>
+  <li class="cls">IAL at last
+    code</li>
+  <li>X
+  test</li>
+  <li>X OK</li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/item_ial.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/item_ial.text
new file mode 100644
index 0000000..67bee70
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/item_ial.text
@@ -0,0 +1,8 @@
+*   {:.cls} IAL at first
+    continued
+* another {:.cls}
+* {:.cls} IAL at last
+      code
+* {::nomarkdown type="html"}X{:/nomarkdown}
+    test
+* {::nomarkdown type="html"}X{:/nomarkdown} OK
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy.html
new file mode 100644
index 0000000..01a5f9d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy.html
@@ -0,0 +1,39 @@
+<ul>
+  <li>This is a simple
+list item</li>
+  <li>
+    <p>Followed by another
+list item</p>
+  </li>
+  <li>
+    <p>Followed by</p>
+
+    <p>a para list item
+continued here</p>
+  </li>
+  <li>and a normal one</li>
+  <li>
+    <p>and</p>
+
+    <p>a para
+continued here</p>
+  </li>
+</ul>
+
+<p>para</p>
+
+<ul>
+  <li>multi line
+list item</li>
+</ul>
+
+<p>para</p>
+
+<ul>
+  <li>list item line1
+ one line
+  two lines</li>
+  <li>list item line2
+one line
+two lines</li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy.text
new file mode 100644
index 0000000..f372422
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy.text
@@ -0,0 +1,29 @@
+* This is a simple
+list item
+* Followed by another
+list item
+
+
+* Followed by
+
+    a para list item
+continued here
+* and a normal one
+* and
+
+    a para
+continued here
+
+para
+
+* multi line
+list item
+
+para
+
+*  list item line1
+ one line
+  two lines
+*  list item line2
+   one line
+two lines
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy_and_nested.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy_and_nested.html
new file mode 100644
index 0000000..90c7447
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy_and_nested.html
@@ -0,0 +1,9 @@
+<ol>
+  <li>Root level
+  * Second level
+    <ul>
+      <li>Third level
+      * Back to second level</li>
+    </ul>
+  </li>
+</ol>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy_and_nested.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy_and_nested.text
new file mode 100644
index 0000000..97a7755
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/lazy_and_nested.text
@@ -0,0 +1,4 @@
+1. Root level
+  * Second level
+    * Third level
+  * Back to second level
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_hr.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_hr.html
new file mode 100644
index 0000000..ecf51c7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_hr.html
@@ -0,0 +1,9 @@
+<ul>
+  <li>Starting a list</li>
+</ul>
+
+<hr />
+
+<ul>
+  <li>Starting a new list</li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_hr.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_hr.text
new file mode 100644
index 0000000..c7fcd47
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_hr.text
@@ -0,0 +1,5 @@
+* Starting a list
+
+* * *
+
+* Starting a new list
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_others.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_others.html
new file mode 100644
index 0000000..672428e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_others.html
@@ -0,0 +1,40 @@
+<ul>
+  <li>list item</li>
+</ul>
+
+<blockquote>
+  <p>blockquote</p>
+</blockquote>
+
+<p>para
+* * *
+para
+  - no list</p>
+
+<ul>
+  <li>
+    <p>item</p>
+
+    <blockquote>
+      <p>block</p>
+    </blockquote>
+
+    <h2>header</h2>
+  </li>
+  <li>
+    <p>test</p>
+
+    <pre><code>codeblock
+</code></pre>
+
+    <p>test</p>
+  </li>
+  <li>
+    <p>test</p>
+
+    <pre><code>codeblock
+</code></pre>
+
+    <p>test</p>
+  </li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_others.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_others.text
new file mode 100644
index 0000000..f680262
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/list_and_others.text
@@ -0,0 +1,26 @@
+* list item
+
+> blockquote
+
+para
+* * *
+para
+  - no list
+
++ item
+
+  > block
+
+  ## header
+
+* test
+
+      codeblock
+
+  test
+
+*	test
+
+		codeblock
+
+	test
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/mixed.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/mixed.html
new file mode 100644
index 0000000..9bc47e3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/mixed.html
@@ -0,0 +1,117 @@
+<p>With tabs/spaces, no paras:</p>
+
+<ul>
+  <li>item1</li>
+  <li>item2</li>
+  <li>item3</li>
+</ul>
+
+<p>With tabs/spaces, paras:</p>
+
+<ul>
+  <li>
+    <p>item1</p>
+  </li>
+  <li>
+    <p>item2</p>
+  </li>
+  <li>
+    <p>item3</p>
+  </li>
+</ul>
+
+<p>With tabs/spaces, no paras:</p>
+
+<ol>
+  <li>item1</li>
+  <li>item2</li>
+  <li>item3</li>
+</ol>
+
+<p>With tabs/spaces, paras:</p>
+
+<ol>
+  <li>
+    <p>item1</p>
+  </li>
+  <li>
+    <p>item2</p>
+  </li>
+  <li>
+    <p>item3</p>
+  </li>
+</ol>
+
+<p>Nested, without paras:</p>
+
+<ul>
+  <li>item1
+    <ul>
+      <li>item2
+        <ul>
+          <li>item3</li>
+        </ul>
+      </li>
+    </ul>
+  </li>
+</ul>
+
+<p>Nested, with paras:</p>
+
+<ul>
+  <li>
+    <p>item1</p>
+
+    <ul>
+      <li>item2
+        <ul>
+          <li>item3 (level 3)</li>
+        </ul>
+      </li>
+    </ul>
+  </li>
+</ul>
+
+<p>Ordered, without paras:</p>
+
+<ol>
+  <li>item1</li>
+  <li>item2
+    <ul>
+      <li>do</li>
+      <li>it</li>
+      <li>now</li>
+    </ul>
+  </li>
+  <li>item3</li>
+</ol>
+
+<p>Ordered, with paras:</p>
+
+<ol>
+  <li>
+    <p>item1</p>
+  </li>
+  <li>
+    <p>item2</p>
+
+    <ul>
+      <li>do</li>
+      <li>it</li>
+      <li>now</li>
+    </ul>
+  </li>
+  <li>
+    <p>item3</p>
+  </li>
+</ol>
+
+<p>Mixed tabs and spaces:</p>
+
+<ul>
+  <li>some text
+    <ul>
+      <li>nested</li>
+    </ul>
+  </li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/mixed.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/mixed.text
new file mode 100644
index 0000000..22b578d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/mixed.text
@@ -0,0 +1,66 @@
+With tabs/spaces, no paras:
+
+*	item1
++   item2
+-	item3
+
+With tabs/spaces, paras:
+
+-	item1
+
+*   item2
+
++	item3
+
+With tabs/spaces, no paras:
+
+1.	item1
+20. item2
+3.	item3
+
+With tabs/spaces, paras:
+
+1.	item1
+
+2.  item2
+
+3.	item3
+
+Nested, without paras:
+
+*	item1
+    *    item2
+	     *	item3
+
+Nested, with paras:
+
++   item1
+
+	* item2
+      * item3 (level 3)
+
+Ordered, without paras:
+
+1. item1
+2. item2
+	* do
+    * it
+    * now
+3. item3
+
+Ordered, with paras:
+
+1. item1
+
+2. item2
+
+	* do
+    * it
+    * now
+
+3. item3
+
+Mixed tabs and spaces:
+
+* 	  	some text
+        * nested
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/nested.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/nested.html
new file mode 100644
index 0000000..1921ee9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/nested.html
@@ -0,0 +1,17 @@
+<ul>
+  <li>some item
+    <ul>
+      <li>nested</li>
+    </ul>
+  </li>
+  <li>last item</li>
+</ul>
+<ul>
+  <li>
+    <p>some text</p>
+
+    <ul>
+      <li>nested</li>
+    </ul>
+  </li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/nested.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/nested.text
new file mode 100644
index 0000000..c71d864
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/nested.text
@@ -0,0 +1,7 @@
+* some item
+    * nested
+* last item
+^
+*	some text
+
+	* nested
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/other_first_element.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/other_first_element.html
new file mode 100644
index 0000000..3f4cd0f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/other_first_element.html
@@ -0,0 +1,39 @@
+<ul>
+  <li>
+    <pre><code>This is a code block.
+</code></pre>
+  </li>
+  <li>
+    <blockquote>
+      <p>This is a blockquote.</p>
+    </blockquote>
+  </li>
+  <li>
+    <h2>A header</h2>
+  </li>
+</ul>
+<ul>
+  <li>
+    <pre><code>This is a code block.
+</code></pre>
+  </li>
+  <li>
+    <blockquote>
+      <p>This is a blockquote.
+continued by some para.</p>
+    </blockquote>
+  </li>
+  <li>
+    <h1>A header</h1>
+    <p>a para</p>
+  </li>
+</ul>
+<ul>
+  <li>
+    <ul>
+      <li>nested list</li>
+      <li>other nested item</li>
+    </ul>
+  </li>
+  <li>item 2</li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/other_first_element.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/other_first_element.text
new file mode 100644
index 0000000..321cef6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/other_first_element.text
@@ -0,0 +1,18 @@
+* 
+        This is a code block.
+*   > This is a blockquote.
+*   ## A header
+^
+* 
+        This is a code block.
+
+*    > This is a blockquote.
+     continued by some para.
+
+*   A header
+    =========
+    a para
+^
+*   * nested list
+    * other nested item
+*   item 2
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ol.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ol.html
new file mode 100644
index 0000000..84e5a6b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ol.html
@@ -0,0 +1,19 @@
+<ol>
+  <li>This is a simple list item</li>
+  <li>
+    <p>Followed by another</p>
+  </li>
+  <li>
+    <p>Followed by</p>
+
+    <p>a para list item</p>
+  </li>
+  <li>and a normal one</li>
+  <li>
+    <p>and</p>
+
+    <p>a para</p>
+  </li>
+</ol>
+
+<p>para</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ol.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ol.text
new file mode 100644
index 0000000..aaf7dae
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ol.text
@@ -0,0 +1,13 @@
+1. This is a simple list item
+3. Followed by another
+
+
+10.	Followed by
+
+    a para list item
+1. and a normal one
+2. and
+
+    a para
+
+para
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ul.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ul.html
new file mode 100644
index 0000000..68db05e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ul.html
@@ -0,0 +1,48 @@
+<ul>
+  <li>This is a simple list item</li>
+  <li>
+    <p>Followed by another</p>
+  </li>
+  <li>
+    <p>Followed by</p>
+
+    <p>a para list item</p>
+  </li>
+  <li>and a normal one</li>
+  <li>
+    <p>and</p>
+
+    <p>a para</p>
+  </li>
+</ul>
+
+<p>para</p>
+
+<ul>
+  <li>multi line
+list item</li>
+</ul>
+
+<p>para</p>
+
+<ul>
+  <li>list item line1
+one line
+two lines</li>
+  <li>list item line2
+one line
+two lines</li>
+</ul>
+
+<p>para</p>
+
+<ul>
+  <li>list item line3
+one line
+two lines</li>
+  <li>list item line4
+ one line
+  two lines</li>
+</ul>
+
+<p>para</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ul.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ul.text
new file mode 100644
index 0000000..ccd25c3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/simple_ul.text
@@ -0,0 +1,36 @@
+* This is a simple list item
+* Followed by another
+
+
+* Followed by
+
+    a para list item
+* and a normal one
+* and
+
+    a para
+
+para
+
+* multi line
+  list item
+
+para
+
+*  list item line1
+   one line
+   two lines
+*  list item line2
+   one line
+   two lines
+
+para
+
+*   list item line3
+    one line
+    two lines
+*  list item line4
+    one line
+     two lines
+
+para
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/single_item.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/single_item.html
new file mode 100644
index 0000000..e079461
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/single_item.html
@@ -0,0 +1,3 @@
+<ul>
+  <li>single</li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/single_item.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/single_item.text
new file mode 100644
index 0000000..877d369
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/single_item.text
@@ -0,0 +1 @@
+* single
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/special_cases.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/special_cases.html
new file mode 100644
index 0000000..fbc775a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/special_cases.html
@@ -0,0 +1,62 @@
+<ul>
+  <li>
+    <p>not a para
+here</p>
+
+    <blockquote>
+      <p>blockquote</p>
+    </blockquote>
+  </li>
+  <li>
+    <p>and not
+  here</p>
+
+    <blockquote>
+      <p>blockquote</p>
+    </blockquote>
+  </li>
+  <li>
+    <p>this is a para</p>
+  </li>
+  <li>
+    <blockquote>
+      <p>blockquote</p>
+    </blockquote>
+  </li>
+  <li>
+    <p>this too</p>
+  </li>
+</ul>
+
+<p>A paragraph
+  1. followed not by ol
+- followed not by ul</p>
+
+<p>A compact list:</p>
+
+<ul>
+  <li>compact</li>
+  <li>list</li>
+  <li>items</li>
+</ul>
+
+<p>A normal list:</p>
+
+<ul>
+  <li>
+    <p>not</p>
+  </li>
+  <li>
+    <p>compact</p>
+  </li>
+  <li>
+    <p>but here</p>
+  </li>
+</ul>
+
+<p>List item without content:</p>
+
+<ul>
+  <li></li>
+  <li>a</li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/special_cases.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/special_cases.text
new file mode 100644
index 0000000..7406305
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/08_list/special_cases.text
@@ -0,0 +1,40 @@
+* not a para
+  here
+
+    > blockquote
+
+* and not
+    here
+
+    >blockquote
+
+* this is a para
+
+* > blockquote
+
+* this too
+
+^
+
+A paragraph
+  1. followed not by ol
+- followed not by ul
+
+A compact list:
+
+* compact
+* list
+* items
+
+A normal list:
+
+* not
+
+* compact
+
+* but here
+
+List item without content:
+
+* 
+* a
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/comment.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/comment.html
new file mode 100644
index 0000000..8d31bd4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/comment.html
@@ -0,0 +1,18 @@
+<!--comment-->
+
+<p>para1</p>
+
+<!-- Comment -->
+
+<p>para2</p>
+
+<!--
+Blah
+Blah
+-->
+<p>para</p>
+
+<blockquote>
+  <p>This is
+<!-- a comment --></p>
+</blockquote>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/comment.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/comment.text
new file mode 100644
index 0000000..b632bf2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/comment.text
@@ -0,0 +1,15 @@
+<!--comment-->
+
+para1
+
+<!-- Comment -->
+
+para2
+
+<!--
+Blah
+Blah
+--> para
+
+> This is
+> <!-- a comment -->
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/deflists.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/deflists.html
new file mode 100644
index 0000000..587d55a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/deflists.html
@@ -0,0 +1,6 @@
+<dl>
+  <dt><em>text</em></dt>
+  <dd>
+    <p>para</p>
+  </dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/deflists.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/deflists.options
new file mode 100644
index 0000000..a660da2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/deflists.options
@@ -0,0 +1 @@
+:parse_block_html: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/deflists.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/deflists.text
new file mode 100644
index 0000000..1e381d1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/deflists.text
@@ -0,0 +1,6 @@
+<dl>
+<dt>*text*</dt>
+<dd>
+para
+</dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/tables.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/tables.html
new file mode 100644
index 0000000..e11dc14
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/tables.html
@@ -0,0 +1,14 @@
+<table class="examples">
+<tr>
+  <th><em>Usage</em></th>
+  <th>
+Output
+  </th>
+</tr>
+<tr>
+  <td>Some <em>data</em></td>
+  <td>
+      <h1 id="some-more">Some more</h1>
+    </td>
+</tr>
+</table>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/tables.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/tables.options
new file mode 100644
index 0000000..a660da2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/tables.options
@@ -0,0 +1 @@
+:parse_block_html: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/tables.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/tables.text
new file mode 100644
index 0000000..c0cf2e7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/content_model/tables.text
@@ -0,0 +1,14 @@
+<table class="examples">
+<tr>
+  <th markdown="span">*Usage*</th>
+  <th>
+Output
+  </th>
+</tr>
+<tr>
+  <td markdown="span">Some *data*</td>
+  <td markdown="1">
+# Some more
+  </td>
+</tr>
+</table>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html5_attributes.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html5_attributes.html
new file mode 100644
index 0000000..c68a432
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html5_attributes.html
@@ -0,0 +1,13 @@
+<p lang="en" style="nothing" class="">paragraph</p>
+
+<p lang="en" style="nothing" class="">paragraph</p>
+
+<p lang="en" style="nothing" class="">paragraph</p>
+
+<p lang="en" class="" style="nothing">paragraph</p>
+
+<p class="" lang="en" style="nothing">paragraph</p>
+
+<p class="">paragraph</p>
+
+<p class="">paragraph</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html5_attributes.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html5_attributes.text
new file mode 100644
index 0000000..de182a9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html5_attributes.text
@@ -0,0 +1,13 @@
+<p lang="en" style='nothing' class>paragraph</p>
+
+<p lang='en' style="nothing" class>paragraph</p>
+
+<p lang='en' style="nothing" class >paragraph</p>
+
+<p lang='en' class style="nothing">paragraph</p>
+
+<p class lang='en' style="nothing">paragraph</p>
+
+<p cLaSs>paragraph</p>
+
+<p class >paragraph</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_after_block.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_after_block.html
new file mode 100644
index 0000000..f51c75b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_after_block.html
@@ -0,0 +1,7 @@
+<p>Para</p>
+<div class="test">division</div>
+
+<blockquote>
+  <p>Quote</p>
+</blockquote>
+<div class="test">division</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_after_block.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_after_block.text
new file mode 100644
index 0000000..cdcbff6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_after_block.text
@@ -0,0 +1,5 @@
+Para
+<div class="test">division</div>
+
+> Quote
+<div class="test">division</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_codeblocks.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_codeblocks.html
new file mode 100644
index 0000000..93d695a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_codeblocks.html
@@ -0,0 +1,15 @@
+<p>para</p>
+
+<pre><code>codeblock
+</code></pre>
+
+<div>
+  <p>test</p>
+</div>
+
+<pre><code>&lt;p&gt;codeblock&lt;/p&gt;
+</code></pre>
+
+<div>
+  <p>test</p>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_codeblocks.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_codeblocks.options
new file mode 100644
index 0000000..a660da2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_codeblocks.options
@@ -0,0 +1 @@
+:parse_block_html: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_codeblocks.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_codeblocks.text
new file mode 100644
index 0000000..a3cfda7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_codeblocks.text
@@ -0,0 +1,13 @@
+para
+
+    codeblock
+
+<div>
+  test
+</div>
+
+    <p>codeblock</p>
+
+<div>
+  test
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_headers.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_headers.html
new file mode 100644
index 0000000..65cb7e2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_headers.html
@@ -0,0 +1,5 @@
+<h1>header</h1>
+
+<div>
+======
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_headers.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_headers.text
new file mode 100644
index 0000000..64dc477
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_and_headers.text
@@ -0,0 +1,6 @@
+header
+======
+
+<div>
+======
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/code.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/code.html
new file mode 100644
index 0000000..f4b3221
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/code.html
@@ -0,0 +1,10 @@
+<p>This is a <code>code span with &lt;entities&gt; that should be preserved</code>.
+This is a <code>simple code</code> span.</p>
+
+<p>Some <code>&lt;</code></p>
+
+<pre><code>Some very important &lt; thing
+</code></pre>
+
+<pre><code>Some code&lt;&lt;
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/code.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/code.text
new file mode 100644
index 0000000..fda7db5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/code.text
@@ -0,0 +1,9 @@
+This is a <code>code span <b>with</b> &lt;entities&gt; that should be preserved</code>.
+This is a <code>simple code</code> span.
+
+<p>Some <code>&lt;</code></p>
+
+<pre>Some very important <b>&lt;</b> thing</pre>
+
+<pre><code>Some code<span>&lt;</span>&lt;
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/comment.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/comment.html
new file mode 100644
index 0000000..dacd437
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/comment.html
@@ -0,0 +1,7 @@
+<div>
+  <!--comment-->
+  <!--
+Blah
+Blah
+-->
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/comment.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/comment.text
new file mode 100644
index 0000000..1788630
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/comment.text
@@ -0,0 +1,8 @@
+<div>
+  <!--comment-->
+
+  <!--
+Blah
+Blah
+-->
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/emphasis.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/emphasis.html
new file mode 100644
index 0000000..e4389c0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/emphasis.html
@@ -0,0 +1,6 @@
+<p>This is <em>sized<strong>hallo</strong></em>.</p>
+
+<p>This is <strong>strong<em>italic</em>, yes!</strong>.</p>
+
+<p>This is <em> not</em> converted, as <em>is
+</em> this.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/emphasis.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/emphasis.text
new file mode 100644
index 0000000..7c75930
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/emphasis.text
@@ -0,0 +1,6 @@
+This is <em>sized<strong>hallo</strong></em>.
+
+This is <b>strong<i>italic</i>, yes!</b>.
+
+This is <em> not</em> converted, as <em>is
+</em> this.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/entity.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/entity.html
new file mode 100644
index 0000000..5c80ce6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/entity.html
@@ -0,0 +1 @@
+<p>This is *raw* HTML text containing &lt; entities!</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/entity.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/entity.text
new file mode 100644
index 0000000..5c80ce6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/entity.text
@@ -0,0 +1 @@
+<p>This is *raw* HTML text containing &lt; entities!</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/header.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/header.html
new file mode 100644
index 0000000..aebb206
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/header.html
@@ -0,0 +1,6 @@
+<h1 id="some-headerhere">Some <em class="cls">header</em>here!</h1>
+<h2 id="test">hallo</h2>
+<h3 id="hallo">hallo</h3>
+<h4 id="hallo-1">hallo</h4>
+<h5 id="hallo-2">hallo</h5>
+<h6 id="hallo-3">hallo</h6>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/header.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/header.options
new file mode 100644
index 0000000..987b4d9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/header.options
@@ -0,0 +1,2 @@
+:auto_ids: true
+:html_to_native: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/header.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/header.text
new file mode 100644
index 0000000..27eed3b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/header.text
@@ -0,0 +1,6 @@
+<h1>Some <em class='cls'>header</em>here!</h1>
+<h2 id="test">hallo</h2>
+<h3>hallo</h3>
+<h4>hallo</h4>
+<h5>hallo</h5>
+<h6>hallo</h6>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_dl.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_dl.html
new file mode 100644
index 0000000..6eaccfe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_dl.html
@@ -0,0 +1,8 @@
+<dl>
+  <dt>kram</dt>
+  <dd>down</dd>
+  <dt>kram</dt>
+  <dd>down</dd>
+  <dt>kram</dt>
+  <dd>down</dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_dl.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_dl.text
new file mode 100644
index 0000000..6eaccfe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_dl.text
@@ -0,0 +1,8 @@
+<dl>
+  <dt>kram</dt>
+  <dd>down</dd>
+  <dt>kram</dt>
+  <dd>down</dd>
+  <dt>kram</dt>
+  <dd>down</dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ol.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ol.html
new file mode 100644
index 0000000..eeebdfb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ol.html
@@ -0,0 +1,15 @@
+<ol>
+  <li>This is a simple list item</li>
+  <li>
+    <p>Followed by another</p>
+  </li>
+  <li>
+    <p>Followed by</p>
+    <p>a para list item</p>
+  </li>
+  <li>and a normal one</li>
+  <li>
+    <p>and</p>
+    <p>a para</p>
+  </li>
+</ol>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ol.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ol.text
new file mode 100644
index 0000000..41246df
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ol.text
@@ -0,0 +1,17 @@
+<ol>
+  <li>This is a simple list item</li>
+  <li>
+    <p>Followed by another</p>
+  </li>
+  <li>
+    <p>Followed by</p>
+
+    <p>a para list item</p>
+  </li>
+  <li>and a normal one</li>
+  <li>
+    <p>and</p>
+
+    <p>a para</p>
+  </li>
+</ol>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ul.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ul.html
new file mode 100644
index 0000000..c9b38d0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ul.html
@@ -0,0 +1,19 @@
+<ul>
+  <li>This is a simple list item</li>
+  <li>
+    <p>Followed by another</p>
+  </li>
+  <li>
+    <p>Followed by</p>
+    <p>a para list item</p>
+  </li>
+  <li>and a normal one</li>
+  <li>
+    <p>and</p>
+    <p>a para</p>
+  </li>
+</ul>
+
+<ul>
+  <li>multi line list item</li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ul.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ul.text
new file mode 100644
index 0000000..5a2d68e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/list_ul.text
@@ -0,0 +1,22 @@
+<ul>
+  <li>This is a simple list item</li>
+  <li>
+    <p>Followed by another</p>
+  </li>
+  <li>
+    <p>Followed by</p>
+
+    <p>a para list item</p>
+  </li>
+  <li>and a normal one</li>
+  <li>
+    <p>and</p>
+
+    <p>a para</p>
+  </li>
+</ul>
+
+<ul>
+  <li>multi line
+list item</li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/options
new file mode 100644
index 0000000..63936b9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/options
@@ -0,0 +1 @@
+:html_to_native: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/paragraph.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/paragraph.html
new file mode 100644
index 0000000..a276b1c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/paragraph.html
@@ -0,0 +1,3 @@
+<p>Some text here<span> and </span>end</p>
+
+<p>Some other text here</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/paragraph.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/paragraph.text
new file mode 100644
index 0000000..b10035c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/paragraph.text
@@ -0,0 +1,4 @@
+<p>Some text here<span> and </span>end
+</p>
+
+<p>Some other text here</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_normal.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_normal.html
new file mode 100644
index 0000000..bdd79ee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_normal.html
@@ -0,0 +1,12 @@
+<table class="examples">
+<tr>
+  <th>Usage</th>
+  <th>Other</th>
+</tr>
+<tr>
+  <td>Some *data*</td>
+  <td>
+    <p>Some more</p>
+  </td>
+</tr>
+</table>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_normal.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_normal.text
new file mode 100644
index 0000000..bdd79ee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_normal.text
@@ -0,0 +1,12 @@
+<table class="examples">
+<tr>
+  <th>Usage</th>
+  <th>Other</th>
+</tr>
+<tr>
+  <td>Some *data*</td>
+  <td>
+    <p>Some more</p>
+  </td>
+</tr>
+</table>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_simple.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_simple.html
new file mode 100644
index 0000000..88d9e6c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_simple.html
@@ -0,0 +1,61 @@
+<table class="examples">
+  <tbody>
+    <tr>
+      <td>Usage</td>
+      <td>Output</td>
+    </tr>
+    <tr>
+      <td>Some *data*</td>
+      <td>Some more</td>
+    </tr>
+  </tbody>
+</table>
+
+<table class="examples">
+  <thead>
+    <tr>
+      <th>Usage</th>
+      <th>Output</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>Some *data*</td>
+      <td>Some more</td>
+    </tr>
+  </tbody>
+  <tfoot>
+    <tr>
+      <td>foot</td>
+      <td>locker</td>
+    </tr>
+  </tfoot>
+</table>
+
+<table class="examples">
+  <tbody>
+    <tr>
+      <td style="text-align: left">Usage</td>
+      <td style="width: 10em">Output</td>
+    </tr>
+    <tr>
+      <td style="text-align: left">Some *data*</td>
+      <td>Some more</td>
+    </tr>
+  </tbody>
+</table>
+
+<table class="examples">
+<tr>
+  <th>Usage</th>
+  <th>
+Output
+  </th>
+</tr>
+<tr>
+  <td>Some *data*</td>
+  <td>
+Some more
+  </td>
+</tr>
+</table>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_simple.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_simple.text
new file mode 100644
index 0000000..ae7852b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/table_simple.text
@@ -0,0 +1,71 @@
+<table class="examples">
+<tr>
+  <td>Usage</td>
+  <td>
+Output
+  </td>
+</tr>
+<tr>
+  <td>Some *data*</td>
+  <td>
+Some more
+  </td>
+</tr>
+</table>
+
+<table class="examples">
+<thead>
+<tr>
+  <th>Usage</th>
+  <th>
+Output
+  </th>
+</tr>
+</thead>
+<tbody>
+<tr>
+  <td>Some *data*</td>
+  <td>
+Some more
+  </td>
+</tr>
+</tbody>
+<tfoot>
+<tr>
+  <td>foot</td>
+  <td>
+locker
+  </td>
+</tr>
+</tfoot>
+</table>
+
+<table class="examples">
+<tr>
+  <td style="text-align: left">Usage</td>
+  <td style="width: 10em">
+Output
+  </td>
+</tr>
+<tr>
+  <td style="text-align: left">Some *data*</td>
+  <td>
+Some more
+  </td>
+</tr>
+</table>
+
+<table class="examples">
+<tr>
+  <th>Usage</th>
+  <th>
+Output
+  </th>
+</tr>
+<tr>
+  <td>Some *data*</td>
+  <td>
+Some more
+  </td>
+</tr>
+</table>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/typography.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/typography.html
new file mode 100644
index 0000000..2f865aa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/typography.html
@@ -0,0 +1 @@
+<p>This is &#8230; something &#8220;to remember&#8221;!</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/typography.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/typography.html.19
new file mode 100644
index 0000000..2443965
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/typography.html.19
@@ -0,0 +1 @@
+<p>This is … something “to remember”!</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/typography.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/typography.text
new file mode 100644
index 0000000..ee33c5c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/html_to_native/typography.text
@@ -0,0 +1 @@
+<p>This is &hellip; something &ldquo;to remember&rdquo;!</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_1.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_1.html
new file mode 100644
index 0000000..77e0d78
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_1.html
@@ -0,0 +1,5 @@
+<p>para</p>
+
+<p>&lt;/div&gt;</p>
+
+<p>para</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_1.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_1.text
new file mode 100644
index 0000000..f2fc834
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_1.text
@@ -0,0 +1,5 @@
+para
+
+</div>
+
+para
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_2.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_2.html
new file mode 100644
index 0000000..b5da12f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_2.html
@@ -0,0 +1,5 @@
+<p>para</p>
+
+<hr />
+
+<p>para</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_2.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_2.text
new file mode 100644
index 0000000..675c94f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/invalid_html_2.text
@@ -0,0 +1,5 @@
+para
+
+<hr>
+
+para
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/markdown_attr.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/markdown_attr.html
new file mode 100644
index 0000000..930b8f4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/markdown_attr.html
@@ -0,0 +1,38 @@
+<div>
+  <p><em>para</em></p>
+</div>
+
+<div>
+<em>para</em>
+</div>
+
+<div>
+  <p><em>para</em></p>
+</div>
+
+<div>
+*para*
+</div>
+
+<p>
+  <p><em>para</em></p>
+</p>
+
+<p>
+<em>para</em>
+</p>
+
+<p>
+<em>para</em>
+</p>
+
+<p>
+*para*
+</p>
+
+<dl>
+  <dt><em>emphasize</em></dt>
+  <dd>
+    <p>para</p>
+  </dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/markdown_attr.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/markdown_attr.text
new file mode 100644
index 0000000..12e5aee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/markdown_attr.text
@@ -0,0 +1,38 @@
+<div markdown="block">
+*para*
+</div>
+
+<div markdown="span">
+*para*
+</div>
+
+<div markdown="1">
+*para*
+</div>
+
+<div markdown="0">
+*para*
+</div>
+
+<p markdown="block">
+*para*
+</p>
+
+<p markdown="span">
+*para*
+</p>
+
+<p markdown="1">
+*para*
+</p>
+
+<p markdown="0">
+*para*
+</p>
+
+<dl>
+  <dt markdown="1">*emphasize*</dt>
+  <dd markdown="1">
+para
+</dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/not_parsed.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/not_parsed.html
new file mode 100644
index 0000000..90bda03
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/not_parsed.html
@@ -0,0 +1,24 @@
+<div>
+This is some text
+</div>
+
+<div><div>
+This is some text
+</div></div>
+
+<div>
+&lt;/p&gt;
+</div>
+
+<div>
+<p><a href="/">Foo</a></p>
+</div>
+
+<p>This is some
+text</p>
+
+<p><a href="http://example.com">http://example.com</a></p>
+
+<div>
+&lt;http://example.com&gt;
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/not_parsed.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/not_parsed.text
new file mode 100644
index 0000000..1d1c71c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/not_parsed.text
@@ -0,0 +1,24 @@
+<div>
+This is some text
+</div>
+
+<div><div>
+This is some text
+</div></div>
+
+<div>
+</p>
+</div>
+
+<div>
+<p><a href="/">Foo</a></p>
+</div>
+
+<p>This is some
+text</p>
+
+<http://example.com>
+
+<div>
+<http://example.com>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.html
new file mode 100644
index 0000000..860f9b2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.html
@@ -0,0 +1,35 @@
+<p>baz { |qux| quux }</p>
+
+<p>This is some para.
+<script type="javascript">
+This *text* must not be converted.
+  </script></p>
+
+<script>Not *parsed* here</script>
+
+<script>*not*</script>
+<p><em>parsed</em>
+This too
+</p>
+
+<script>*not*<p>*parsed*
+This too
+</p></script>
+
+<script>something<p>*not*</p></script>
+
+<script></script>
+
+<script>
+This should be output
+<p> *as* is
+</p> and nothing should be done
+about it
+</not>
+</p>
+</script>
+
+<p><a href="http://example.com">http://example.com</a></p>
+
+<style> body > * { background-color: Red; } </style>
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.htmlinput b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.htmlinput
new file mode 100644
index 0000000..22b9ea5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.htmlinput
@@ -0,0 +1,34 @@
+<p>baz { |qux| quux }</p>
+
+<p>This is some para.
+<script type="javascript">
+This *text* must not be converted.
+  </SCRIPT></p>
+
+<script>Not *parsed* here</script>
+
+<sCRIpt>*not*</script>
+<p><em>parsed</em>
+This too
+</p>
+
+<script>*not*<p>*parsed*
+This too
+</p></script>
+
+<sCRIpt>something<p>*not*</p></scrIPt>
+
+<script></script>
+
+<script>
+This should be output
+<p> *as* is
+</p> and nothing should be done
+about it
+</not>
+</p>
+</script>
+
+<p><a href="http://example.com">http://example.com</a></p>
+
+<style> body > * { background-color: Red; } </style>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.options
new file mode 100644
index 0000000..a660da2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.options
@@ -0,0 +1 @@
+:parse_block_html: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.text
new file mode 100644
index 0000000..e0617c4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_raw.text
@@ -0,0 +1,33 @@
+<p>baz { |qux| quux }</p>
+
+This is some para.
+<script type="javascript">
+This *text* must not be converted.
+  </SCRIPT>
+
+<script>Not *parsed* here</script>
+
+<script>*not*</script><p>*parsed*
+This too
+</p>
+
+<script>*not*<p>*parsed*
+This too
+</p></script>
+
+<script>something<p>*not*</p></script>
+
+<script></script>
+
+<script>
+This should be output
+<p> *as* is
+</p> and nothing should be done
+about it
+</not>
+</p>
+</script>
+
+<http://example.com>
+
+<style> body > * { background-color: Red; } </style>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.html
new file mode 100644
index 0000000..2a6191f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.html
@@ -0,0 +1,12 @@
+<p>This <em>text
+should</em> be parsed
+as span
+</p>
+
+<p>This produces `</p>
+<p>` an unwanted result.&lt;/p&gt;</p>
+
+<p>This <em>text</em> too</p>
+<p>
+some text
+</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.htmlinput b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.htmlinput
new file mode 100644
index 0000000..4199b8b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.htmlinput
@@ -0,0 +1,12 @@
+<P>This <EM>text
+should</em> be parsed
+as span
+</p>
+
+<p>This produces `</p>
+<p>` an unwanted result.&lt;/p&gt;</p>
+
+<p>This <em>text</EM> too</P>
+<p>
+some text
+</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.options
new file mode 100644
index 0000000..a660da2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.options
@@ -0,0 +1 @@
+:parse_block_html: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.text
new file mode 100644
index 0000000..d07cf6d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_as_span.text
@@ -0,0 +1,9 @@
+<p>This *text
+should* be parsed
+as span
+</P>
+
+<p>This produces `</p>` an unwanted result.</p>
+
+<p>This *text* too</p><p>
+some text
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_block_html.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_block_html.html
new file mode 100644
index 0000000..8de78c0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_block_html.html
@@ -0,0 +1,21 @@
+<div>
+  <p>test</p>
+</div>
+
+<div>
+  <pre><code>test
+</code></pre>
+  <div>
+    <pre><code>test
+</code></pre>
+  </div>
+</div>
+
+<div>
+  <pre><code>code block with &lt;/div&gt;
+</code></pre>
+</div>
+
+<div>
+  <p>No matching end tag</p>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_block_html.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_block_html.options
new file mode 100644
index 0000000..a660da2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_block_html.options
@@ -0,0 +1 @@
+:parse_block_html: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_block_html.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_block_html.text
new file mode 100644
index 0000000..b8b1845
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/parse_block_html.text
@@ -0,0 +1,17 @@
+<DIV>
+  test
+</diV>
+
+<div>
+    test
+  <div>
+    test
+  </div>
+</div>
+
+<div>
+    code block with </div>
+</div>
+
+<div>
+No matching end tag
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/processing_instruction.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/processing_instruction.html
new file mode 100644
index 0000000..b292a05
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/processing_instruction.html
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<p>para</p>
+
+<?  test  ?>
+<p>para</p>
+
+<p>other</p>
+
+<?
+multiline *text*
+is allowed
+?>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/processing_instruction.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/processing_instruction.text
new file mode 100644
index 0000000..fcb866f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/processing_instruction.text
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+
+para
+
+<?  test  ?> para
+
+other
+
+<?
+multiline *text*
+is allowed
+?>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.html
new file mode 100644
index 0000000..2836156
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.html
@@ -0,0 +1,60 @@
+<div>
+  <p>test</p>
+</div>
+
+<p>
+para2
+</p>
+
+<div id="test">
+  <p>tes</p>
+
+  <p>test
+weiter
+</p>
+</div>
+
+<p>para4</p>
+
+<div>
+  <div>
+    <div>
+      <p>foo</p>
+    </div>
+    <div style="&nbsp;"></div>
+  </div>
+  <div>
+    <p>bar&nbsp;</p>
+  </div>
+</div>
+
+<p>para5</p>
+
+<div>
+  <p>id</p>
+</div>
+<p>test</p>
+
+<div>
+  <p>hallo</p>
+</div>
+<div>
+  <p>hallo</p>
+</div>
+
+<p>para6</p>
+
+<div>
+  <div class="clear"></div>
+  <p>Another para.</p>
+</div>
+
+<p><em>Test</em></p>
+
+<p><em>Test</em></p>
+
+<p><em>Test
+</em>
+</p>
+
+<iframe></iframe>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.html.19
new file mode 100644
index 0000000..0d926c5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.html.19
@@ -0,0 +1,60 @@
+<div>
+  <p>test</p>
+</div>
+
+<p>
+para2
+</p>
+
+<div id="test">
+  <p>tes</p>
+
+  <p>test
+weiter
+</p>
+</div>
+
+<p>para4</p>
+
+<div>
+  <div>
+    <div>
+      <p>foo</p>
+    </div>
+    <div style="&nbsp;"></div>
+  </div>
+  <div>
+    <p>bar </p>
+  </div>
+</div>
+
+<p>para5</p>
+
+<div>
+  <p>id</p>
+</div>
+<p>test</p>
+
+<div>
+  <p>hallo</p>
+</div>
+<div>
+  <p>hallo</p>
+</div>
+
+<p>para6</p>
+
+<div>
+  <div class="clear"></div>
+  <p>Another para.</p>
+</div>
+
+<p><em>Test</em></p>
+
+<p><em>Test</em></p>
+
+<p><em>Test
+</em>
+</p>
+
+<iframe></iframe>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.options
new file mode 100644
index 0000000..a660da2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.options
@@ -0,0 +1 @@
+:parse_block_html: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.text
new file mode 100644
index 0000000..a2ffe25
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/simple.text
@@ -0,0 +1,55 @@
+  <div>   
+test
+</div>
+
+<p>
+para2
+</p>
+
+<div id='test'>
+  <p>tes</p>
+
+  <p>test
+weiter
+</p>
+</div>
+
+para4
+
+<div>
+<div>
+<div>
+foo
+</div>
+   <div style="&nbsp;"></div>
+</div>
+<div>bar&nbsp;
+</div>
+</div>
+
+para5
+
+<div>id
+</div> test
+
+<div>
+hallo
+</div> <div>
+hallo
+</div>
+
+para6
+
+<div><DiV cLASs="clear"></dIv>
+Another para.
+</div>
+
+<em>Test</em>
+
+<p><em>Test</em></p>
+
+<p><em>Test
+</em>
+</p>
+
+<iframe></iframe>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/textarea.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/textarea.html
new file mode 100644
index 0000000..6f5693e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/textarea.html
@@ -0,0 +1,8 @@
+<p>This is a <textarea>inline</textarea></p>
+
+<textarea>This
+is
+
+some
+text
+</textarea>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/textarea.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/textarea.text
new file mode 100644
index 0000000..a240f5c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/textarea.text
@@ -0,0 +1,8 @@
+This is a <textarea>inline</textarea>
+
+<textarea>This
+is
+
+some
+text
+</textarea>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/xml.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/xml.html
new file mode 100644
index 0000000..d941bc0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/xml.html
@@ -0,0 +1,8 @@
+<webgen:block name="test" />
+
+<some:url name:spac="hallo">doit</some:url>
+
+<SoMe:UrL NamE:SpAC="test">doit</SoMe:UrL>
+
+<SoMe>doit&lt;/some&gt;
+</SoMe>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/xml.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/xml.text
new file mode 100644
index 0000000..6427fae
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/09_html/xml.text
@@ -0,0 +1,7 @@
+<webgen:block name="test" />
+
+<some:url name:spac='hallo'>doit</some:url>
+
+<SoMe:UrL NamE:SpAC='test'>doit</SoMe:UrL>
+
+<SoMe>doit</some>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/10_ald/simple.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/10_ald/simple.html
new file mode 100644
index 0000000..74b03d5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/10_ald/simple.html
@@ -0,0 +1,2 @@
+<p>Some paragraph</p>
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/10_ald/simple.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/10_ald/simple.text
new file mode 100644
index 0000000..f58768a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/10_ald/simple.text
@@ -0,0 +1,8 @@
+Some paragraph
+
+{:id: ref1}
+{:id: .class1}
+ {:id: #id}
+  {:id: key="value"}
+   {:id: .class2 .class3 ref2 #id-with key="value" key='value' key='dfsd\}' }
+{:test: k ey=value}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/auto_id_and_ial.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/auto_id_and_ial.html
new file mode 100644
index 0000000..9857a03
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/auto_id_and_ial.html
@@ -0,0 +1 @@
+<h2 id="myid" class="cls">A header</h2>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/auto_id_and_ial.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/auto_id_and_ial.options
new file mode 100644
index 0000000..8776b55
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/auto_id_and_ial.options
@@ -0,0 +1 @@
+:auto_ids: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/auto_id_and_ial.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/auto_id_and_ial.text
new file mode 100644
index 0000000..f521fb0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/auto_id_and_ial.text
@@ -0,0 +1,2 @@
+## A header
+{:#myid .cls}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/nested.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/nested.html
new file mode 100644
index 0000000..84cc368
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/nested.html
@@ -0,0 +1,11 @@
+<div class="cls" id="id">
+test
+</div>
+
+<div class="cls" id="id">
+  <p>test</p>
+</div>
+
+<blockquote class="cls" id="id">
+  <p>para</p>
+</blockquote>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/nested.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/nested.text
new file mode 100644
index 0000000..827645c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/nested.text
@@ -0,0 +1,15 @@
+{:.cls}
+<div>
+test
+</div>
+{:#id}
+
+{:.cls}
+<div markdown="1">
+test
+</div>
+{:#id}
+
+{:.cls}
+> para
+{:#id}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/simple.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/simple.html
new file mode 100644
index 0000000..1086f0c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/simple.html
@@ -0,0 +1,29 @@
+<p key1="val&quot;" key2="val'" class="other-class myclass class -class" id="other" key="val">Some paragraph.</p>
+
+<p class="cls1 cls2" id="id">Some paragraph.</p>
+
+<blockquote id="id" class="class">
+  <p>quote</p>
+</blockquote>
+
+<ul key="val">
+  <li>list</li>
+</ul>
+
+<pre id="other"><code>code block
+</code></pre>
+
+<pre><code>other code block
+</code></pre>
+
+<h2 id="myid">A header</h2>
+
+<p class="cls">Some paragraph here</p>
+
+<p class="cls1 cls2">Some paragraph here</p>
+
+<p class="cls">Paragraph</p>
+<p>Paragraph</p>
+
+<h1 class="class" id="other">Another header</h1>
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/simple.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/simple.text
new file mode 100644
index 0000000..b97eef3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/11_ial/simple.text
@@ -0,0 +1,41 @@
+Some paragraph.
+{:.class .-class id key="val"}
+
+Some paragraph.
+{:.cls1#id.cls2}
+
+> quote
+{: #id}
+  {: .class}
+
+* list
+{: key="val"}
+
+    code block
+{: #other}
+
+    other code block
+
+## A header
+{:#myid}
+
+{:.cls}
+Some paragraph here
+
+{:.cls1}
+{:.cls2}
+Some paragraph here
+
+Paragraph
+{:.cls}
+Paragraph
+
+Another header
+==============
+{: .class #other}
+
+{:id: #id key="valo"}
+{:id: #other .myclass other}
+{:other: key1="val\""  - ig.nored as_is#this key2='val\'' .other-class}
+
+{:.invalid}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/comment.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/comment.html
new file mode 100644
index 0000000..20b4c66
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/comment.html
@@ -0,0 +1,8 @@
+<p>This is a simple paragraph.</p>
+
+<!-- This is a comment {:/}which is {:/comment} ignored. -->
+
+<p>And another paragraph</p>
+
+<p>{::comment}
+Another paragraph</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/comment.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/comment.text
new file mode 100644
index 0000000..2dfc919
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/comment.text
@@ -0,0 +1,12 @@
+This is a simple paragraph.
+
+{::comment}
+This is a comment {:/}which is {:/comment} ignored.
+{:/comment}
+
+And another paragraph
+
+{::comment this='is' .ignore /}
+
+{::comment}
+Another paragraph
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/ignored.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/ignored.html
new file mode 100644
index 0000000..17aae5c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/ignored.html
@@ -0,0 +1,8 @@
+<p>paragraph</p>
+
+<p>{::something}
+anotherthing
+{:/something}</p>
+
+<p>{::something/}
+paragraph</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/ignored.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/ignored.text
new file mode 100644
index 0000000..ae94a8f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/ignored.text
@@ -0,0 +1,8 @@
+paragraph
+
+{::something}
+anotherthing
+{:/something}
+
+{::something/}
+paragraph
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.html
new file mode 100644
index 0000000..7fe58d5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.html
@@ -0,0 +1,10 @@
+<p>This is a simple paragraph.</p>
+
+This *is* not processed 
+
+<p>And another paragraph</p>
+
+<em>bold</em>
+
+<p>{::nomarkdown}
+Another paragraph</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.kramdown b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.kramdown
new file mode 100644
index 0000000..2cee512
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.kramdown
@@ -0,0 +1,20 @@
+This is a simple paragraph.
+
+{::nomarkdown}
+This *is* not processed 
+{:/}
+
+And another paragraph
+
+{::nomarkdown type="html"}
+<em>bold</em>
+{:/}
+
+{::nomarkdown type="latex"}
+\begin{itemize}
+\item[Yes] YESSSS!
+\end{itemize}
+{:/}
+
+\{::nomarkdown} Another paragraph
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.latex b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.latex
new file mode 100644
index 0000000..5af0263
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.latex
@@ -0,0 +1,13 @@
+This is a simple paragraph.
+
+This *is* not processed 
+
+And another paragraph
+
+\begin{itemize}
+\item[Yes] YESSSS!
+\end{itemize}
+
+\{::nomarkdown\}
+Another paragraph
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.text
new file mode 100644
index 0000000..43d441d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/nomarkdown.text
@@ -0,0 +1,21 @@
+This is a simple paragraph.
+
+{::nomarkdown}  
+This *is* not processed 
+  {:/nomarkdown}
+
+And another paragraph
+
+{::nomarkdown this='is' .ignore /}
+
+{::nomarkdown type='html'}
+<em>bold</em>
+{:/}
+{::nomarkdown type="latex"}
+\begin{itemize}
+\item[Yes] YESSSS!
+\end{itemize}
+{:/}
+
+{::nomarkdown}
+Another paragraph
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options.html
new file mode 100644
index 0000000..6ec69f0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options.html
@@ -0,0 +1,21 @@
+<h1>No header id</h1>
+
+<h1>without header id</h1>
+
+<div>
+some <span>*para*</span>
+</div>
+
+<div>
+  <p>some <span><em>para</em></span></p>
+</div>
+
+<p>Some text<sup id="fnref:ab"><a href="#fn:ab" class="footnote">10</a></sup>.</p>
+
+<div class="footnotes">
+  <ol start="10">
+    <li id="fn:ab">
+      <p>Some text.&nbsp;<a href="#fnref:ab" class="reversefootnote">&#8617;</a></p>
+    </li>
+  </ol>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options.text
new file mode 100644
index 0000000..5991ab7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options.text
@@ -0,0 +1,21 @@
+# No header id
+
+{::options unusedvar="val" /}
+
+# without header id
+
+<div>
+some <span>*para*</span>
+</div>
+
+{::options parse_block_html="true" parse_span_html="true" /}
+
+<div>
+some <span>*para*</span>
+</div>
+
+{::options footnote_nr="10" /}
+
+Some text[^ab].
+
+[^ab]: Some text.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options2.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options2.html
new file mode 100644
index 0000000..9824d3a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options2.html
@@ -0,0 +1,10 @@
+
+<p>Some text<sup id="fnref:ab"><a href="#fn:ab" class="footnote">1</a></sup>.</p>
+
+<div class="footnotes">
+  <ol>
+    <li id="fn:ab">
+      <p>Some text.&nbsp;<a href="#fnref:ab" class="reversefootnote">&#8617;</a></p>
+    </li>
+  </ol>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options2.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options2.text
new file mode 100644
index 0000000..78abfbe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options2.text
@@ -0,0 +1,5 @@
+{::options footnote_nr="da10" /}
+
+Some text[^ab].
+
+[^ab]: Some text.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options3.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options3.html
new file mode 100644
index 0000000..7434df6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options3.html
@@ -0,0 +1,7 @@
+<div class="language-ruby highlighter-coderay"><span class="CodeRay">x = <span class="constant">Class</span>.new
+</span>
+</div>
+
+<div class="language-ruby highlighter-coderay"><span class="CodeRay">x = <span class="constant">Class</span>.new
+</span>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options3.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options3.text
new file mode 100644
index 0000000..e0ee87c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/12_extension/options3.text
@@ -0,0 +1,7 @@
+    x = Class.new
+{: .language-ruby}
+
+{::options coderay_wrap="span" coderay_line_numbers="" coderay_css="class" coderay_tab_width="4" /}
+
+    x = Class.new
+{: .language-ruby}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/auto_ids.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/auto_ids.html
new file mode 100644
index 0000000..398628a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/auto_ids.html
@@ -0,0 +1,15 @@
+<dl>
+  <dt id="item">item</dt>
+  <dd>def</dd>
+  <dt id="item2">item2</dt>
+  <dd>def</dd>
+</dl>
+
+<dl>
+  <dt id="prefix-item">item</dt>
+  <dd>def</dd>
+  <dt id="prefix-item2">item2</dt>
+  <dd>def</dd>
+  <dt id="id">item3</dt>
+  <dd>def</dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/auto_ids.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/auto_ids.text
new file mode 100644
index 0000000..f1797a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/auto_ids.text
@@ -0,0 +1,18 @@
+{:auto_ids}
+item
+: def
+
+item2
+: def
+
+^
+
+{:auto_ids-prefix-}
+item
+: def
+
+item2
+: def
+
+{:#id} item3
+: def
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/definition_at_beginning.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/definition_at_beginning.html
new file mode 100644
index 0000000..7c5cc04
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/definition_at_beginning.html
@@ -0,0 +1 @@
+<p>: no definition</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/definition_at_beginning.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/definition_at_beginning.text
new file mode 100644
index 0000000..cd3671b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/definition_at_beginning.text
@@ -0,0 +1 @@
+: no definition
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/deflist_ial.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/deflist_ial.html
new file mode 100644
index 0000000..3090b1e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/deflist_ial.html
@@ -0,0 +1,4 @@
+<dl class="dl-horizontal dl-other">
+  <dt>item</dt>
+  <dd>definition</dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/deflist_ial.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/deflist_ial.text
new file mode 100644
index 0000000..587c3b0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/deflist_ial.text
@@ -0,0 +1,4 @@
+{:.dl-horizontal}
+item
+:   definition
+{:.dl-other}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/item_ial.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/item_ial.html
new file mode 100644
index 0000000..0ed1197
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/item_ial.html
@@ -0,0 +1,17 @@
+<dl>
+  <dt>item</dt>
+  <dd class="cls">definition
+continued</dd>
+  <dd>another {:.cls}</dd>
+  <dd class="class">
+    <pre><code>code
+</code></pre>
+  </dd>
+  <dd class="cls">IAL at last
+    no code bc of text</dd>
+  <dt class="class">term</dt>
+  <dd>definition</dd>
+  <dt class="class1">term1</dt>
+  <dt class="class2">term2</dt>
+  <dd>definition</dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/item_ial.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/item_ial.text
new file mode 100644
index 0000000..2058d74
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/item_ial.text
@@ -0,0 +1,16 @@
+item
+:   {:.cls} definition
+    continued
+: another {:.cls}
+: {:.class}
+        code
+: {:.cls} IAL at last
+      no code bc of text
+
+
+{:.class} term
+: definition
+
+{:.class1} term1
+{:.class2} term2
+: definition
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/multiple_terms.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/multiple_terms.html
new file mode 100644
index 0000000..e2e089b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/multiple_terms.html
@@ -0,0 +1,13 @@
+<dl>
+  <dt>kram</dt>
+  <dt><em>down</em></dt>
+  <dt>now</dt>
+  <dd>definition 1</dd>
+  <dd>definition 2</dd>
+  <dd>
+    <p>definition 3</p>
+  </dd>
+  <dd>
+    <p>definition 4</p>
+  </dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/multiple_terms.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/multiple_terms.text
new file mode 100644
index 0000000..b834258
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/multiple_terms.text
@@ -0,0 +1,10 @@
+kram
+*down*
+now
+: definition 1
+: definition 2
+
+: definition 3
+
+
+: definition 4
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/no_def_list.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/no_def_list.html
new file mode 100644
index 0000000..c16f962
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/no_def_list.html
@@ -0,0 +1,2 @@
+<p>This is a para
+: and not a definition list</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/no_def_list.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/no_def_list.text
new file mode 100644
index 0000000..98b52b3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/no_def_list.text
@@ -0,0 +1,2 @@
+This is a para
+\: and not a definition list
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/para_wrapping.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/para_wrapping.html
new file mode 100644
index 0000000..5f28fdf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/para_wrapping.html
@@ -0,0 +1,10 @@
+<dl>
+  <dt>term</dt>
+  <dd>
+    <p>definition</p>
+  </dd>
+  <dd>definition</dd>
+  <dd>
+    <p>definition</p>
+  </dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/para_wrapping.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/para_wrapping.text
new file mode 100644
index 0000000..280fa47
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/para_wrapping.text
@@ -0,0 +1,6 @@
+term
+
+: definition
+: definition
+
+: definition
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/separated_by_eob.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/separated_by_eob.html
new file mode 100644
index 0000000..0a1c4dc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/separated_by_eob.html
@@ -0,0 +1,8 @@
+<dl>
+  <dt>kram</dt>
+  <dd>down</dd>
+</dl>
+<dl>
+  <dt>kram</dt>
+  <dd>down</dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/separated_by_eob.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/separated_by_eob.text
new file mode 100644
index 0000000..56fedf1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/separated_by_eob.text
@@ -0,0 +1,5 @@
+kram
+: down
+^
+kram
+: down
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/simple.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/simple.html
new file mode 100644
index 0000000..791f145
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/simple.html
@@ -0,0 +1,10 @@
+<dl>
+  <dt>kram</dt>
+  <dd>down</dd>
+  <dt>novalue</dt>
+  <dd></dd>
+  <dt>kram</dt>
+  <dd>down
+kram</dd>
+  <dd>down</dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/simple.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/simple.text
new file mode 100644
index 0000000..e3bf730
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/simple.text
@@ -0,0 +1,10 @@
+kram
+: down
+
+novalue
+: 
+
+kram
+:   down
+kram
+: down
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/styled_terms.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/styled_terms.html
new file mode 100644
index 0000000..cf7d785
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/styled_terms.html
@@ -0,0 +1,4 @@
+<dl>
+  <dt><em>kram</em></dt>
+  <dd>down</dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/styled_terms.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/styled_terms.text
new file mode 100644
index 0000000..76eb355
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/styled_terms.text
@@ -0,0 +1,2 @@
+*kram*
+: down
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/too_much_space.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/too_much_space.html
new file mode 100644
index 0000000..b4df878
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/too_much_space.html
@@ -0,0 +1,3 @@
+<p>para</p>
+
+<p>: no definition</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/too_much_space.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/too_much_space.text
new file mode 100644
index 0000000..30ab445
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/too_much_space.text
@@ -0,0 +1,4 @@
+para
+
+
+: no definition
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/with_blocks.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/with_blocks.html
new file mode 100644
index 0000000..45b5865
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/with_blocks.html
@@ -0,0 +1,38 @@
+<dl>
+  <dt>kram</dt>
+  <dd>this is some
+text</dd>
+  <dd>
+    <p>this is some
+more text</p>
+  </dd>
+  <dt>kram</dt>
+  <dd>
+    <blockquote>
+      <p>blockquote</p>
+    </blockquote>
+  </dd>
+  <dt>kram</dt>
+  <dd>
+    <pre><code>code
+</code></pre>
+  </dd>
+  <dt>kram</dt>
+  <dd>
+    <dl>
+      <dt>kram</dt>
+      <dd>down</dd>
+    </dl>
+  </dd>
+  <dt>kram</dt>
+  <dd>
+    <h1>header</h1>
+  </dd>
+  <dt>kram</dt>
+  <dd>
+    <ul>
+      <li>list</li>
+      <li>items</li>
+    </ul>
+  </dd>
+</dl>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/with_blocks.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/with_blocks.text
new file mode 100644
index 0000000..15195ce
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/13_definition_list/with_blocks.text
@@ -0,0 +1,24 @@
+kram
+: this is some
+  text
+
+ :   this is some
+     more text
+
+kram
+: > blockquote
+
+kram
+: 
+        code
+
+kram
+: kram
+  : down
+
+kram
+: # header
+
+kram
+: * list
+  * items
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/errors.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/errors.html
new file mode 100644
index 0000000..302e97a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/errors.html
@@ -0,0 +1,12 @@
+<p>No table body</p>
+
+<p>|-|-|-</p>
+
+<p>|no|table|here|</p>
+
+<p>|no|table|here|
+paragraph</p>
+
+<p>|-|-|
+|-|-|</p>
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/errors.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/errors.text
new file mode 100644
index 0000000..3565d5b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/errors.text
@@ -0,0 +1,13 @@
+No table body
+
+|-|-|-
+
+[5]: test
+|no|table|here|
+
+|no|table|here|
+paragraph
+
+|-|-|
+|-|-|
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/escaping.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/escaping.html
new file mode 100644
index 0000000..b4528a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/escaping.html
@@ -0,0 +1,52 @@
+<p><code>cell 1 | cell 2</code></p>
+
+<p>cell 1 | cell 2</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell 1</td>
+      <td>cell 2 | continued</td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell 1</td>
+      <td>cell <code>2</code></td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell 1</td>
+      <td><code>code | span</code></td>
+    </tr>
+  </tbody>
+</table>
+
+<p>cell 1 <code>code | span</code></p>
+
+<p>cell 1 | <code>code | span</code></p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell 1</td>
+      <td>cell `2</td>
+      <td>cell 3</td>
+    </tr>
+    <tr>
+      <td>cell 1`</td>
+      <td>cell 2</td>
+      <td>cell 3</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>cell 1 | cell <code>2 | cell 3
+cell 1</code> | cell 2 | cell 3</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/escaping.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/escaping.text
new file mode 100644
index 0000000..a8a24d6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/escaping.text
@@ -0,0 +1,19 @@
+`cell 1 | cell 2`
+
+cell 1 \| cell 2
+
+cell 1 | cell 2 \| continued
+
+cell 1 | cell `2`
+
+cell 1 | `code | span`
+
+cell 1 `code | span`
+
+cell 1 \| `code | span`
+
+cell 1 | cell `2 | cell 3
+cell 1` | cell 2 | cell 3
+
+cell 1 \| cell `2 | cell 3
+cell 1` | cell 2 | cell 3
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/footer.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/footer.html
new file mode 100644
index 0000000..e6596ed
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/footer.html
@@ -0,0 +1,65 @@
+<p>Simple footer</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell1</td>
+      <td>cell2</td>
+    </tr>
+  </tbody>
+  <tfoot>
+    <tr>
+      <td>cell3</td>
+      <td>cell4</td>
+    </tr>
+  </tfoot>
+</table>
+
+<p>Full footer</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell1</td>
+      <td>cell2</td>
+    </tr>
+  </tbody>
+  <tfoot>
+    <tr>
+      <td>cell3</td>
+      <td>cell4</td>
+    </tr>
+  </tfoot>
+</table>
+
+<p>Footer with separator lines</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell1</td>
+      <td>cell2</td>
+    </tr>
+  </tbody>
+  <tfoot>
+    <tr>
+      <td>cell3</td>
+      <td>cell4</td>
+    </tr>
+    <tr>
+      <td>cell5</td>
+      <td>cell6</td>
+    </tr>
+  </tfoot>
+</table>
+
+<p>Empty footer</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell1</td>
+      <td>cell2</td>
+    </tr>
+  </tbody>
+</table>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/footer.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/footer.text
new file mode 100644
index 0000000..faaed8d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/footer.text
@@ -0,0 +1,25 @@
+Simple footer
+
+| cell1 | cell2
+|=
+| cell3 | cell4
+
+Full footer
+
+| cell1 | cell2
+|=======|=======|
+| cell3 | cell4
+
+Footer with separator lines
+
+| cell1 | cell2
+|=======|=======|
+| cell3 | cell4
+|---
+| cell5 | cell6
+|---
+
+Empty footer
+
+| cell1 | cell2
+|=
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/header.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/header.html
new file mode 100644
index 0000000..647f2c4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/header.html
@@ -0,0 +1,117 @@
+<p>Simple header</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>cell1</th>
+      <th>cell2</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>cell3</td>
+      <td>cell4</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Full header</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>cell1</th>
+      <th>cell2</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>cell3</td>
+      <td>cell4</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>With alignment and superfluous alignment defs</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>default</th>
+      <th style="text-align: left">left</th>
+      <th style="text-align: center">center</th>
+      <th style="text-align: right">right</th>
+      <th>default</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>cell1</td>
+      <td style="text-align: left">cell2</td>
+      <td style="text-align: center">cell3</td>
+      <td style="text-align: right">cell4</td>
+      <td>cell5</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>With leading sep line</p>
+
+<table>
+  <thead>
+    <tr>
+      <th>cell1</th>
+      <th>cell2</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>cell3</td>
+      <td>cell4</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Multiple bodies</p>
+
+<table>
+  <thead>
+    <tr>
+      <th style="text-align: center">cell1</th>
+      <th>cell2</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="text-align: center">cell3</td>
+      <td>cell4</td>
+    </tr>
+  </tbody>
+  <tbody>
+    <tr>
+      <td style="text-align: center">cell5</td>
+      <td>cell6</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Sep line with tab</p>
+
+<table>
+  <thead>
+    <tr>
+      <th style="text-align: right">right</th>
+      <th style="text-align: center">center</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="text-align: right">cell1</td>
+      <td style="text-align: center">cell2</td>
+    </tr>
+    <tr>
+      <td style="text-align: right">cell3</td>
+      <td style="text-align: center">cell4</td>
+    </tr>
+  </tbody>
+</table>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/header.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/header.text
new file mode 100644
index 0000000..6961bfb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/header.text
@@ -0,0 +1,39 @@
+Simple header
+
+| cell1 | cell2
+|-----
+| cell3 | cell4
+
+Full header
+
+| cell1 | cell2
+|-------|-------|
+| cell3 | cell4
+
+With alignment and superfluous alignment defs
+
+| default | left | center | right | default
+|-| :- |:-: | -: | - | :-: | :-
+| cell1 | cell2 | cell3 | cell4 | cell5
+
+With leading sep line
+
+|:-:|-:|
+| cell1 | cell2
+|-------|-------|
+| cell3 | cell4
+
+Multiple bodies
+
+| cell1 | cell2
++ :-: |
+| cell3 | cell4
+|----|||
+| cell5 | cell6
+
+Sep line with tab
+
+right | center
+---:  	|	:---:
+cell1 | cell2
+cell3 | cell4
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/no_table.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/no_table.html
new file mode 100644
index 0000000..dce46b1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/no_table.html
@@ -0,0 +1,3 @@
+<p>No table</p>
+
+<p>| Some | thing | here</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/no_table.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/no_table.text
new file mode 100644
index 0000000..90f90b3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/no_table.text
@@ -0,0 +1,3 @@
+No table
+
+\| Some \| thing \| here
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/simple.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/simple.html
new file mode 100644
index 0000000..186b1a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/simple.html
@@ -0,0 +1,177 @@
+<table>
+  <tbody>
+    <tr>
+      <td>cell1</td>
+      <td>cell2</td>
+    </tr>
+    <tr>
+      <td>cell3</td>
+      <td>cell4</td>
+    </tr>
+    <tr>
+      <td>cell5</td>
+      <td>cell6 |</td>
+    </tr>
+    <tr>
+      <td>cell7</td>
+      <td>cell8</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Missing cells at end</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell1</td>
+      <td>cell2</td>
+      <td>cell3</td>
+    </tr>
+    <tr>
+      <td>cell1</td>
+      <td>&#160;</td>
+      <td>&#160;</td>
+    </tr>
+    <tr>
+      <td>&#160;</td>
+      <td>cell2</td>
+      <td>cell3</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Escaped pipe characters</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell1 | cell1</td>
+      <td>cell2</td>
+    </tr>
+    <tr>
+      <td>cell1</td>
+      <td>cell2 |</td>
+    </tr>
+    <tr>
+      <td>cell1 <code>|</code> con</td>
+      <td>cell2</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Table with code elements</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>This is a <code>span | with</code> a pipe.</td>
+      <td>&#160;</td>
+      <td>&#160;</td>
+      <td>&#160;</td>
+    </tr>
+    <tr>
+      <td>Some <em>span</em></td>
+      <td>&lt;/em&gt; here</td>
+      <td>a <code>span | with</code> a</td>
+      <td>pipe.</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Special cases regarding codespan syntax</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>a</td>
+      <td><code>b</code></td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <tbody>
+    <tr>
+      <td><code>a</code></td>
+    </tr>
+  </tbody>
+</table>
+
+<table class="cls">
+  <tbody>
+    <tr>
+      <td>table</td>
+      <td>with</td>
+      <td>ial</td>
+    </tr>
+  </tbody>
+</table>
+
+<table class="cls">
+  <tbody>
+    <tr>
+      <td>table</td>
+      <td>with</td>
+      <td>ial</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>not starting with a bar</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>simple</td>
+      <td>table</td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <thead>
+    <tr>
+      <th>head1</th>
+      <th>head2</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>cell1</td>
+      <td>cell2</td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <thead>
+    <tr>
+      <th>head1</th>
+      <th>head2</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>&#160;</td>
+      <td>cell2</td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <tbody>
+    <tr>
+      <td>a</td>
+      <td>b</td>
+    </tr>
+    <tr>
+      <td>c</td>
+      <td>d</td>
+    </tr>
+    <tr>
+      <td>e</td>
+      <td>f</td>
+    </tr>
+  </tbody>
+</table>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/simple.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/simple.html.19
new file mode 100644
index 0000000..db7c892
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/simple.html.19
@@ -0,0 +1,177 @@
+<table>
+  <tbody>
+    <tr>
+      <td>cell1</td>
+      <td>cell2</td>
+    </tr>
+    <tr>
+      <td>cell3</td>
+      <td>cell4</td>
+    </tr>
+    <tr>
+      <td>cell5</td>
+      <td>cell6 |</td>
+    </tr>
+    <tr>
+      <td>cell7</td>
+      <td>cell8</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Missing cells at end</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell1</td>
+      <td>cell2</td>
+      <td>cell3</td>
+    </tr>
+    <tr>
+      <td>cell1</td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td> </td>
+      <td>cell2</td>
+      <td>cell3</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Escaped pipe characters</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>cell1 | cell1</td>
+      <td>cell2</td>
+    </tr>
+    <tr>
+      <td>cell1</td>
+      <td>cell2 |</td>
+    </tr>
+    <tr>
+      <td>cell1 <code>|</code> con</td>
+      <td>cell2</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Table with code elements</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>This is a <code>span | with</code> a pipe.</td>
+      <td> </td>
+      <td> </td>
+      <td> </td>
+    </tr>
+    <tr>
+      <td>Some <em>span</em></td>
+      <td>&lt;/em&gt; here</td>
+      <td>a <code>span | with</code> a</td>
+      <td>pipe.</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Special cases regarding codespan syntax</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>a</td>
+      <td><code>b</code></td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <tbody>
+    <tr>
+      <td><code>a</code></td>
+    </tr>
+  </tbody>
+</table>
+
+<table class="cls">
+  <tbody>
+    <tr>
+      <td>table</td>
+      <td>with</td>
+      <td>ial</td>
+    </tr>
+  </tbody>
+</table>
+
+<table class="cls">
+  <tbody>
+    <tr>
+      <td>table</td>
+      <td>with</td>
+      <td>ial</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>not starting with a bar</p>
+
+<table>
+  <tbody>
+    <tr>
+      <td>simple</td>
+      <td>table</td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <thead>
+    <tr>
+      <th>head1</th>
+      <th>head2</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>cell1</td>
+      <td>cell2</td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <thead>
+    <tr>
+      <th>head1</th>
+      <th>head2</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td> </td>
+      <td>cell2</td>
+    </tr>
+  </tbody>
+</table>
+
+<table>
+  <tbody>
+    <tr>
+      <td>a</td>
+      <td>b</td>
+    </tr>
+    <tr>
+      <td>c</td>
+      <td>d</td>
+    </tr>
+    <tr>
+      <td>e</td>
+      <td>f</td>
+    </tr>
+  </tbody>
+</table>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/simple.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/simple.text
new file mode 100644
index 0000000..2c176e8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/simple.text
@@ -0,0 +1,49 @@
+| cell1 | cell2 |
+|cell3 | cell4|
+|cell5|cell6 \|	
+| cell7|cell8   
+
+Missing cells at end
+
+| cell1 | cell2 | cell3 |
+| cell1 ||
+|| cell2 | cell3
+
+Escaped pipe characters
+
+| cell1 \| cell1 | cell2 |
+| cell1          | cell2 \|
+| cell1 `|` con | cell2
+
+Table with code elements
+
+| This is a <code>span | with</code> a pipe.
+| Some <em>span | </em> here | a <code>span | with</code> a | pipe.
+
+Special cases regarding codespan syntax
+
+|a|`b`
+
+|`a`
+
+{:.cls}
+| table | with | ial
+
+| table | with | ial
+{:.cls}
+
+not starting with a bar
+
+simple | table
+
+head1 | head2
+------|------
+cell1 | cell2
+
+ head1 | head2
+-------|------
+       | cell2
+
+| a | b |
+  c | d
+| e | f |
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/table_with_footnote.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/table_with_footnote.html
new file mode 100644
index 0000000..0bf6781
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/table_with_footnote.html
@@ -0,0 +1,25 @@
+<table>
+  <tbody>
+    <tr>
+      <td>this is <sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup></td>
+      <td>a table</td>
+    </tr>
+    <tr>
+      <td>with a</td>
+      <td>footnote</td>
+    </tr>
+  </tbody>
+</table>
+
+<div class="footnotes">
+  <ol>
+    <li id="fn:1">
+      <p>Something</p>
+
+      <blockquote>
+        <p>special here</p>
+      </blockquote>
+      <p><a href="#fnref:1" class="reversefootnote">&#8617;</a></p>
+    </li>
+  </ol>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/table_with_footnote.latex b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/table_with_footnote.latex
new file mode 100644
index 0000000..99b5312
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/table_with_footnote.latex
@@ -0,0 +1,11 @@
+\begin{longtable}{|l|l|}
+\hline
+this is \footnote{Something
+
+\begin{quote}
+special here
+\end{quote}} & a table\\
+with a & footnote\\
+\hline
+\end{longtable}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/table_with_footnote.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/table_with_footnote.text
new file mode 100644
index 0000000..345fc5d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/14_table/table_with_footnote.text
@@ -0,0 +1,6 @@
+| this is [^1] | a table
+| with a | footnote
+
+[^1]: Something
+
+    > special here
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/gh_128.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/gh_128.html
new file mode 100644
index 0000000..ab27b4b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/gh_128.html
@@ -0,0 +1,2 @@
+<script type="math/tex; mode=display">% <![CDATA[
+alert('a') alert('b<') %]]></script>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/gh_128.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/gh_128.text
new file mode 100644
index 0000000..95252a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/gh_128.text
@@ -0,0 +1 @@
+$$ <script>alert('a')</script> <script>alert('b<')</script> $$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/itex2mml.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/itex2mml.html
new file mode 100644
index 0000000..214212a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/itex2mml.html
@@ -0,0 +1 @@
+<math xmlns='http://www.w3.org/1998/Math/MathML' display='block'><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mi>a</mi><mrow><msup><mi>x</mi> <mn>3</mn></msup></mrow><mo>+</mo><mi>b</mi><mrow><msup><mi>x</mi> <mn>2</mn></msup></mrow><mo>+</mo><mi>cx</mi><mo>+</mo><mi>d</mi></mrow><annotation encoding='application/x-tex'>f(x) = a{x^3} + b{x^2} + cx + d</annotation></semantics></math>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/itex2mml.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/itex2mml.options
new file mode 100644
index 0000000..953bdae
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/itex2mml.options
@@ -0,0 +1 @@
+:math_engine: itex2mml
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/itex2mml.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/itex2mml.text
new file mode 100644
index 0000000..23fe297
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/itex2mml.text
@@ -0,0 +1 @@
+$$f(x) = a{x^3} + b{x^2} + cx + d$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview.html
new file mode 100644
index 0000000..5ef3a83
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview.html
@@ -0,0 +1,4 @@
+<p>This is a <span class="MathJax_Preview">5 + 5</span><script type="math/tex">5 + 5</script> statement</p>
+
+<div class="MathJax_Preview">5 + 5</div>
+<script type="math/tex; mode=display">5 + 5</script>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview.options
new file mode 100644
index 0000000..75f702c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview.options
@@ -0,0 +1,2 @@
+:math_engine_opts:
+  :preview: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview.text
new file mode 100644
index 0000000..7068767
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview.text
@@ -0,0 +1,5 @@
+This is a $$5 + 5$$ statement
+
+$$
+5 + 5
+$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_as_code.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_as_code.html
new file mode 100644
index 0000000..1ee20d4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_as_code.html
@@ -0,0 +1,4 @@
+<p>This is a <code class="MathJax_Preview">5 + 5</code><script type="math/tex">5 + 5</script> statement</p>
+
+<pre class="MathJax_Preview"><code>5 + 5</code></pre>
+<script type="math/tex; mode=display">5 + 5</script>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_as_code.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_as_code.options
new file mode 100644
index 0000000..ab0bc54
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_as_code.options
@@ -0,0 +1,3 @@
+:math_engine_opts:
+  :preview: true
+  :preview_as_code: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_as_code.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_as_code.text
new file mode 100644
index 0000000..7068767
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_as_code.text
@@ -0,0 +1,5 @@
+This is a $$5 + 5$$ statement
+
+$$
+5 + 5
+$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_simple.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_simple.html
new file mode 100644
index 0000000..623d286
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_simple.html
@@ -0,0 +1,4 @@
+<p>This is a <span class="MathJax_Preview">math</span><script type="math/tex">5 + 5</script> statement</p>
+
+<div class="MathJax_Preview">math</div>
+<script type="math/tex; mode=display">5 + 5</script>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_simple.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_simple.options
new file mode 100644
index 0000000..28a68b5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_simple.options
@@ -0,0 +1,2 @@
+:math_engine_opts:
+  :preview: 'math'
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_simple.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_simple.text
new file mode 100644
index 0000000..7068767
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjax_preview_simple.text
@@ -0,0 +1,5 @@
+This is a $$5 + 5$$ statement
+
+$$
+5 + 5
+$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode.html.19
new file mode 100644
index 0000000..4f95e8c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode.html.19
@@ -0,0 +1,27 @@
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+  <mi>f</mi>
+  <mo stretchy="false">(</mo>
+  <mi>x</mi>
+  <mo stretchy="false">)</mo>
+  <mo>=</mo>
+  <mi>a</mi>
+  <mrow class="MJX-TeXAtom-ORD">
+    <msup>
+      <mi>x</mi>
+      <mn>3</mn>
+    </msup>
+  </mrow>
+  <mo>+</mo>
+  <mi>b</mi>
+  <mrow class="MJX-TeXAtom-ORD">
+    <msup>
+      <mi>x</mi>
+      <mn>2</mn>
+    </msup>
+  </mrow>
+  <mo>+</mo>
+  <mi>c</mi>
+  <mi>x</mi>
+  <mo>+</mo>
+  <mi>d</mi>
+</math>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode.options
new file mode 100644
index 0000000..adc27e8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode.options
@@ -0,0 +1 @@
+:math_engine: mathjaxnode
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode.text
new file mode 100644
index 0000000..23fe297
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode.text
@@ -0,0 +1 @@
+$$f(x) = a{x^3} + b{x^2} + cx + d$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_notexhints.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_notexhints.html.19
new file mode 100644
index 0000000..078f47d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_notexhints.html.19
@@ -0,0 +1,23 @@
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+  <mi>f</mi>
+  <mo stretchy="false">(</mo>
+  <mi>x</mi>
+  <mo stretchy="false">)</mo>
+  <mo>=</mo>
+  <mi>a</mi>
+  <msup>
+    <mi>x</mi>
+    <mn>3</mn>
+  </msup>
+  <mo>+</mo>
+  <mi>b</mi>
+  <msup>
+    <mi>x</mi>
+    <mn>2</mn>
+  </msup>
+  <mo>+</mo>
+  <mi>c</mi>
+  <mi>x</mi>
+  <mo>+</mo>
+  <mi>d</mi>
+</math>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_notexhints.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_notexhints.options
new file mode 100644
index 0000000..827e462
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_notexhints.options
@@ -0,0 +1,3 @@
+:math_engine: mathjaxnode
+:math_engine_opts:
+  :texhints: false
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_notexhints.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_notexhints.text
new file mode 100644
index 0000000..23fe297
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_notexhints.text
@@ -0,0 +1 @@
+$$f(x) = a{x^3} + b{x^2} + cx + d$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_semantics.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_semantics.html.19
new file mode 100644
index 0000000..7c39c20
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_semantics.html.19
@@ -0,0 +1,32 @@
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+  <semantics>
+    <mrow>
+      <mi>f</mi>
+      <mo stretchy="false">(</mo>
+      <mi>x</mi>
+      <mo stretchy="false">)</mo>
+      <mo>=</mo>
+      <mi>a</mi>
+      <mrow class="MJX-TeXAtom-ORD">
+        <msup>
+          <mi>x</mi>
+          <mn>3</mn>
+        </msup>
+      </mrow>
+      <mo>+</mo>
+      <mi>b</mi>
+      <mrow class="MJX-TeXAtom-ORD">
+        <msup>
+          <mi>x</mi>
+          <mn>2</mn>
+        </msup>
+      </mrow>
+      <mo>+</mo>
+      <mi>c</mi>
+      <mi>x</mi>
+      <mo>+</mo>
+      <mi>d</mi>
+    </mrow>
+    <annotation encoding="application/x-tex">f(x) = a{x^3} + b{x^2} + cx + d</annotation>
+  </semantics>
+</math>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_semantics.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_semantics.options
new file mode 100644
index 0000000..1f645b1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_semantics.options
@@ -0,0 +1,3 @@
+:math_engine: mathjaxnode
+:math_engine_opts:
+  :semantics: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_semantics.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_semantics.text
new file mode 100644
index 0000000..23fe297
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/mathjaxnode_semantics.text
@@ -0,0 +1 @@
+$$f(x) = a{x^3} + b{x^2} + cx + d$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/no_engine.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/no_engine.html
new file mode 100644
index 0000000..5d6b343
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/no_engine.html
@@ -0,0 +1,3 @@
+<div id="math-id" class="kdmath">$$
+5+5
+$$</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/no_engine.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/no_engine.options
new file mode 100644
index 0000000..06d559e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/no_engine.options
@@ -0,0 +1 @@
+:math_engine: ~
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/no_engine.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/no_engine.text
new file mode 100644
index 0000000..fdee5cf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/no_engine.text
@@ -0,0 +1,2 @@
+{: #math-id}
+$$5+5$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/normal.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/normal.html
new file mode 100644
index 0000000..3000a86
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/normal.html
@@ -0,0 +1,29 @@
+<p>This is a para.
+<script type="math/tex">\text{LaTeX} \lambda_5</script></p>
+
+<script type="math/tex; mode=display">\lambda_5 = \alpha + 4</script>
+
+<p><script type="math/tex">\lambda_\alpha > 5</script>
+This is a para.</p>
+
+<script type="math/tex; mode=display">% <![CDATA[
+\begin{align*}
+&=5 \\
+&=6 \\
+\end{align*} %]]></script>
+
+<script type="math/tex; mode=display">5+5</script>
+
+<script type="math/tex; mode=display">5+5</script>
+
+<script type="math/tex; mode=display">5+5</script>
+
+<script type="math/tex; mode=display">5+5</script>
+
+<pre><code>$$5+5$$
+</code></pre>
+
+<script type="math/tex; mode=display">5+5</script>
+<script type="math/tex; mode=display">5+5</script>
+
+<script type="math/tex; mode=display">|x| = 5</script>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/normal.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/normal.text
new file mode 100644
index 0000000..aa5984a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/normal.text
@@ -0,0 +1,30 @@
+This is a para.
+$$ \text{LaTeX} \lambda_5 $$
+
+$$\lambda_5 = \alpha + 4$$
+
+$$\lambda_\alpha > 5$$
+This is a para.
+
+$$\begin{align*}
+&=5 \\
+&=6 \\
+\end{align*}$$
+
+$$5+5$$ 
+
+ $$5+5$$	
+
+  $$5+5$$
+
+   $$5+5$$
+
+    $$5+5$$
+
+{:.cls}
+$$5+5$$
+^
+$$5+5$$
+{:.cls}
+
+$$|x| = 5$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/ritex.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/ritex.html
new file mode 100644
index 0000000..e9d61b5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/ritex.html
@@ -0,0 +1 @@
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>f</mi><mo stretchy='false'>(</mo><mi>x</mi><mo stretchy='false'>)</mo><mo>=</mo><mi>a</mi><mrow><msup><mi>x</mi><mn>3</mn></msup></mrow><mo>+</mo><mi>b</mi><mrow><msup><mi>x</mi><mn>2</mn></msup></mrow><mo>+</mo><mi>c</mi><mi>x</mi><mo>+</mo><mi>d</mi></math>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/ritex.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/ritex.options
new file mode 100644
index 0000000..0ef54eb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/ritex.options
@@ -0,0 +1 @@
+:math_engine: ritex
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/ritex.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/ritex.text
new file mode 100644
index 0000000..23fe297
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/15_math/ritex.text
@@ -0,0 +1 @@
+$$f(x) = a{x^3} + b{x^2} + cx + d$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/no_toc.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/no_toc.html
new file mode 100644
index 0000000..bbb831e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/no_toc.html
@@ -0,0 +1,14 @@
+
+<h1>Header level 1</h1>
+
+<h2>Header level 2</h2>
+
+<h3>Header level 3</h3>
+
+<h4>Header level 4</h4>
+
+<h1>Other header level 1</h1>
+
+<h2>Other header level 2</h2>
+
+<h3>Other header level 3</h3>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/no_toc.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/no_toc.text
new file mode 100644
index 0000000..11ad829
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/no_toc.text
@@ -0,0 +1,16 @@
+* Here comes the table of content
+{:toc}
+
+# Header level 1
+
+## Header level 2
+
+### Header level 3
+
+#### Header level 4
+
+# Other header level 1
+
+## Other header level 2
+
+### Other header level 3
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_exclude.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_exclude.html
new file mode 100644
index 0000000..d352684
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_exclude.html
@@ -0,0 +1,35 @@
+<h1 class="no_toc" id="contents">Contents</h1>
+
+<ul id="markdown-toc">
+  <li><a href="#header-level-1" id="markdown-toc-header-level-1">Header level 1</a>    <ul>
+      <li><a href="#header-level-2" id="markdown-toc-header-level-2">Header level 2</a>        <ul>
+          <li><a href="#header-level-3" id="markdown-toc-header-level-3">Header level 3</a>            <ul>
+              <li><a href="#header-level-4" id="markdown-toc-header-level-4">Header level 4</a></li>
+            </ul>
+          </li>
+        </ul>
+      </li>
+    </ul>
+  </li>
+  <li><a href="#other-header-level-1" id="markdown-toc-other-header-level-1">Other header level 1</a>    <ul>
+      <li><a href="#other-header-level-2" id="markdown-toc-other-header-level-2">Other header level 2</a>        <ul>
+          <li><a href="#other-header-level-3" id="markdown-toc-other-header-level-3">Other header level 3</a></li>
+        </ul>
+      </li>
+    </ul>
+  </li>
+</ul>
+
+<h1 id="header-level-1">Header level 1</h1>
+
+<h2 id="header-level-2">Header level 2</h2>
+
+<h3 id="header-level-3">Header level 3</h3>
+
+<h4 id="header-level-4">Header level 4</h4>
+
+<h1 id="other-header-level-1">Other header level 1</h1>
+
+<h2 id="other-header-level-2">Other header level 2</h2>
+
+<h3 id="other-header-level-3">Other header level 3</h3>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_exclude.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_exclude.options
new file mode 100644
index 0000000..8776b55
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_exclude.options
@@ -0,0 +1 @@
+:auto_ids: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_exclude.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_exclude.text
new file mode 100644
index 0000000..d8f0b86
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_exclude.text
@@ -0,0 +1,19 @@
+# Contents
+{:.no_toc}
+
+* Here comes the table of content
+{:toc}
+
+# Header level 1
+
+## Header level 2
+
+### Header level 3
+
+#### Header level 4
+
+# Other header level 1
+
+## Other header level 2
+
+### Other header level 3
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_levels.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_levels.html
new file mode 100644
index 0000000..e50a07c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_levels.html
@@ -0,0 +1,24 @@
+<ul id="markdown-toc">
+  <li><a href="#header--level-2" id="markdown-toc-header--level-2">Header \` level 2</a>    <ul>
+      <li><a href="#header-level-3" id="markdown-toc-header-level-3">Header level 3</a></li>
+    </ul>
+  </li>
+  <li><a href="#other-header-level-2" id="markdown-toc-other-header-level-2">Other header level 2</a>    <ul>
+      <li><a href="#other-header-level-3" id="markdown-toc-other-header-level-3">Other header level 3</a></li>
+    </ul>
+  </li>
+</ul>
+
+<h1 id="header-level-1">Header level 1</h1>
+
+<h2 id="header--level-2">Header \` level 2</h2>
+
+<h3 id="header-level-3">Header level 3</h3>
+
+<h4 id="header-level-4">Header level 4</h4>
+
+<h1 id="other-header-level-1">Other header level 1</h1>
+
+<h2 id="other-header-level-2">Other header level 2</h2>
+
+<h3 id="other-header-level-3">Other header level 3</h3>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_levels.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_levels.options
new file mode 100644
index 0000000..bdfbeba
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_levels.options
@@ -0,0 +1,2 @@
+:toc_levels: 2..3
+:auto_ids: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_levels.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_levels.text
new file mode 100644
index 0000000..1a62dea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_levels.text
@@ -0,0 +1,16 @@
+* Here comes the table of content
+{:toc}
+
+# Header level 1
+
+## Header \\\` level 2
+
+### Header level 3
+
+#### Header level 4
+
+# Other header level 1
+
+## Other header level 2
+
+### Other header level 3
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_with_footnotes.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_with_footnotes.html
new file mode 100644
index 0000000..776a780
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_with_footnotes.html
@@ -0,0 +1,13 @@
+<ul id="markdown-toc">
+  <li><a href="#header1-level-1" id="markdown-toc-header1-level-1">Header level 1</a></li>
+</ul>
+
+<h1 id="header1-level-1">Header<sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup> level 1</h1>
+
+<div class="footnotes">
+  <ol>
+    <li id="fn:1">
+      <p>Some footnote content here&nbsp;<a href="#fnref:1" class="reversefootnote">&#8617;</a></p>
+    </li>
+  </ol>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_with_footnotes.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_with_footnotes.options
new file mode 100644
index 0000000..8776b55
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_with_footnotes.options
@@ -0,0 +1 @@
+:auto_ids: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_with_footnotes.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_with_footnotes.text
new file mode 100644
index 0000000..5879ed5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/block/16_toc/toc_with_footnotes.text
@@ -0,0 +1,6 @@
+* Here comes the table of content
+{:toc}
+
+# Header[^1] level 1
+
+[^1]: Some footnote content here
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/encoding.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/encoding.html
new file mode 100644
index 0000000..0339347
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/encoding.html
@@ -0,0 +1,46 @@
+<p>Das ist gewöhnlich <em>ein</em> <a href="http://example.org">Über-Problem</a> mit manchen<br />
+Sälen <a href="http://example.org">http://example.org</a> und <span id="test">anderen Dinge</span>. Siehe
+<img src="http://example.org" alt="Über mich" />!</p>
+
+<blockquote class="test">
+  <p>Vielleicht <em class="red">höre</em> ich nicht richtig?</p>
+</blockquote>
+
+<ul>
+  <li>Sollten wir uns das überl<em>egen</em>? <em>Verhöhne</em> mich nicht!</li>
+  <li>Ho ho höher! Sind *wir* da?</li>
+</ul>
+
+<h1>Titel sind urschön</h1>
+
+<h2 id="hot">Manche mögens <em>ärmer</em></h2>
+
+<pre><code>öha
+was nun?
+</code></pre>
+
+<dl>
+  <dt>Töne</dt>
+  <dd>Laute Geräusche</dd>
+  <dd>vielleicht noch was ä<em>hnliches</em></dd>
+</dl>
+
+<table>
+  <thead>
+    <tr>
+      <th>hoch</th>
+      <th>höher</th>
+      <th>am höchsten</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>über</td>
+      <td>drüber</td>
+      <td>müde</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>Das ist schön
+gemacht</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/encoding.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/encoding.text
new file mode 100644
index 0000000..65edf4b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/encoding.text
@@ -0,0 +1,28 @@
+Das ist gewöhnlich *ein* [Über-Problem](http://example.org) mit manchen  
+Sälen <http://example.org> und <span id='test'>anderen Dinge</span>. Siehe
+![Über mich](http://example.org)!
+
+> Vielleicht *höre*{:.red} ich nicht richtig?
+{:.test}
+
+* Sollten wir uns das überl*egen*? *Verhöhne* mich nicht!
+* Ho ho höher! Sind \*wir\* da?
+
+Titel sind urschön
+==================
+
+## Manche mögens *ärmer*   {#hot}
+
+    öha
+    was nun?
+
+Töne
+: Laute Geräusche
+: vielleicht noch was ä*hnliches*
+
+| hoch | höher | am höchsten |
+|----------------------------|
+| über | drüber | müde       |
+
+<p markdown='1'>Das ist schön
+gemacht</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/example.man b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/example.man
new file mode 100644
index 0000000..b1afee7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/example.man
@@ -0,0 +1,123 @@
+.\" generated by kramdown
+.TH "NAME" "1" "November 2016" "Some extra data"
+.SH NAME
+name \- description
+.SH "SYNOPSIS"
+\fBname\fP [\fBOPTIONS\fP] \fIarguments\fP\.\.\.
+.SH "DESCRIPTION"
+This is a normal paragraph\.
+.sp
+.PD 0
+.IP \(bu 4
+A
+.IP \(bu 4
+compact
+.IP \(bu 4
+list
+.IP \(bu 4
+with multiple 
+.RS
+.IP \(bu 4
+items and 
+.RS
+.IP \(bu 4
+nested
+.RE
+.RE
+.IP \(bu 4
+as well
+.PD
+.RS
+.P
+blockquotes are fine
+.IP 1. 4
+numbered lists
+.IP 2. 4
+work too 
+.RS
+.IP 1. 4
+and they
+.IP 2. 4
+can be 
+.RS
+.IP 1. 4
+nested
+.RE
+.RE
+.IP 3. 4
+again
+.RE
+.sp
+.RS 4
+.EX
+Some fancy code
+   going
+     on
+       here
+.EE
+.RE
+.TP
+\fB\-o\fP
+.TQ
+\fB\-\-option\fP
+Description lists
+.sp
+are useful as well
+.P
+And compact definition lists:
+.sp
+.PD 0
+.TP
+\fBo\fP
+Option
+.TP
+\fBk\fP
+Key
+.TP
+\fBv\fP
+Value
+.PD
+.TS
+box center ;
+l l l l .
+tables	can	be	centered	
+.TE
+.sp
+.TS
+box ;
+lb lb cb rb .
+Default aligned	Left aligned	Center aligned	Right aligned	
+=
+.T&
+l l c r .
+First body part	Second cell	Third cell	fourth cell	
+Second \fIline\fP	foo	\fBstrong\fP	baz	
+Third line	\fBquux\fP	baz	bar	
+_
+.T&
+l l c r .
+Second body				
+2nd line				
+=
+Footer row one				
+Footer row two				
+.TE
+.sp
+.P
+Inline formatting like \fIemphasis\fP, \fBstrong\fP and \fBcode span\fP work as ususal\. 
+.UR are_well\.html
+Links
+.UE
+work, too! As do
+.br
+line breaks\.
+.P
+Abbreviations like MD can be used but the abbreviation title is ignored\.
+.P
+Math elements work \fB\el = 5\fP inline and in block form:
+.sp
+.RS 4
+.EX
+\elambda_5 = \ealpha + 4
+.EE
+.RE
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/example.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/example.text
new file mode 100644
index 0000000..12b011b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/example.text
@@ -0,0 +1,85 @@
+# name(1) - description
+{: data-date="November 2016" data-extra="Some extra data"}
+
+## SYNOPSIS
+
+`name` \[`OPTIONS`\] *arguments*...
+
+## DESCRIPTION
+
+This is a normal paragraph.
+
+* A
+* compact
+* list
+* with multiple
+  * items and
+    * nested
+* as well
+{:.compact}
+
+> blockquotes are fine
+>
+> 1. numbered lists
+>
+> 2. work too
+>    1. and they
+>    2. can be
+>       1. nested
+>
+> 3. again
+
+~~~
+Some fancy code
+   going
+     on
+       here
+~~~
+
+`-o`
+`--option`
+: Description lists
+: are useful as well
+
+And compact definition lists:
+
+`o`
+: Option
+
+`k`
+: Key
+
+`v`
+: Value
+{:.compact}
+
+| tables | can | be | centered |
+{:.center}
+
+|-----------------+------------+-----------------+----------------|
+| Default aligned |Left aligned| Center aligned  | Right aligned  |
+|-----------------|:-----------|:---------------:|---------------:|
+| First body part |Second cell | Third cell      | fourth cell    |
+| Second *line*   |foo         | **strong**      | baz            |
+| Third line      |`quux`      | baz             | bar            |
+|-----------------+------------+-----------------+----------------|
+| Second body     |            |                 |                |
+| 2nd line        |            |                 |                |
+|=================+============+=================+================|
+| Footer row one  |            |                 |                |
+| Footer row two  |            |                 |                |
+|-----------------+------------+-----------------+----------------|
+
+
+Inline formatting like *emphasis*, **strong** and `code span` work
+as ususal. [Links](are_well.html) work, too! As do\\
+line breaks.
+
+Abbreviations like MD can be used but the abbreviation title is
+ignored.
+
+*[MD]: Markdown
+
+Math elements work $$\l = 5$$ inline and in block form:
+
+$$\lambda_5 = \alpha + 4$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-dash-description.man b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-dash-description.man
new file mode 100644
index 0000000..8e47527
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-dash-description.man
@@ -0,0 +1,4 @@
+.\" generated by kramdown
+.TH "NAME" "7"
+.SH NAME
+name \- description
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-dash-description.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-dash-description.text
new file mode 100644
index 0000000..832c921
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-dash-description.text
@@ -0,0 +1 @@
+# name -- description
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-description.man b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-description.man
new file mode 100644
index 0000000..e59dc5e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-description.man
@@ -0,0 +1,4 @@
+.\" generated by kramdown
+.TH "NAME" "1" "November 2016" "Something extra"
+.SH NAME
+name \- description
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-description.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-description.text
new file mode 100644
index 0000000..941482c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-description.text
@@ -0,0 +1,2 @@
+# name description
+{: data-section="1" data-date="November 2016" data-extra="Something extra"}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section-description.man b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section-description.man
new file mode 100644
index 0000000..8df4ff7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section-description.man
@@ -0,0 +1,4 @@
+.\" generated by kramdown
+.TH "NAME" "1"
+.SH NAME
+name \- description
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section-description.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section-description.text
new file mode 100644
index 0000000..5f3e765
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section-description.text
@@ -0,0 +1 @@
+# name(1) -- description
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section.man b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section.man
new file mode 100644
index 0000000..7ca8757
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section.man
@@ -0,0 +1,2 @@
+.\" generated by kramdown
+.TH "NAME" "1"
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section.text
new file mode 100644
index 0000000..da98dbd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name-section.text
@@ -0,0 +1 @@
+# name(1)
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name.man b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name.man
new file mode 100644
index 0000000..8488496
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name.man
@@ -0,0 +1,2 @@
+.\" generated by kramdown
+.TH "NAME" "7"
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name.text
new file mode 100644
index 0000000..5f4656a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/heading-name.text
@@ -0,0 +1 @@
+# name
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/sections.man b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/sections.man
new file mode 100644
index 0000000..14ab233
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/sections.man
@@ -0,0 +1,4 @@
+.\" generated by kramdown
+.SH "NAME"
+works
+.SS "Sub section"
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/sections.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/sections.text
new file mode 100644
index 0000000..d1f5f86
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/sections.text
@@ -0,0 +1,11 @@
+## NAME
+
+works
+
+### Sub section
+
+#### Ignored
+
+##### Ignored
+
+###### Ignored
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/text-escaping.man b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/text-escaping.man
new file mode 100644
index 0000000..710a4f1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/text-escaping.man
@@ -0,0 +1,8 @@
+.\" generated by kramdown
+\&\. at the start of the line
+.P
+line with \efB backslash symbol
+.P
+some \. other \- escaped \' symbols
+.P
+\&\.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/text-escaping.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/text-escaping.text
new file mode 100644
index 0000000..052b94f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/man/text-escaping.text
@@ -0,0 +1,7 @@
+. at the start of the line
+
+line with \fB backslash symbol
+
+some . other - escaped \' symbols
+
+.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty.html
new file mode 100644
index 0000000..a1102ea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty.html
@@ -0,0 +1,5 @@
+<p>This is [] empty.</p>
+
+<p>This is [][] empty.</p>
+
+<p>This is <a href="test.html"></a> empty.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty.text
new file mode 100644
index 0000000..cca5de5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty.text
@@ -0,0 +1,5 @@
+This is [] empty.
+
+This is [][] empty.
+
+This is [](test.html) empty.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty_title.htmlinput b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty_title.htmlinput
new file mode 100644
index 0000000..b95b2cc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty_title.htmlinput
@@ -0,0 +1,3 @@
+<p>Image with empty title: <img src="/images/other.png" alt="alt text" title="" /></p>
+
+<p>Link <a href="http://example.tld" title="">reference</a> with empty title.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty_title.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty_title.text
new file mode 100644
index 0000000..baabe7d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/empty_title.text
@@ -0,0 +1,7 @@
+Image with empty title: ![alt text](/images/other.png)
+
+Link [reference][1] with empty title.
+
+
+
+[1]: http://example.tld
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/image_in_a.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/image_in_a.html
new file mode 100644
index 0000000..e1f4ade
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/image_in_a.html
@@ -0,0 +1,5 @@
+<p>Simple: <a href="local.html">Some <img src="/images/other.png" alt="alt text" /></a></p>
+
+<p>Nested: <a href="local.html">Some <img src="/images/other.png" alt="alt ![img](text.png) text" /></a></p>
+
+<p>Simple: <a href="local.html">Some <em>text <img src="/images/other.png" alt="alt text" /> text</em></a></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/image_in_a.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/image_in_a.text
new file mode 100644
index 0000000..bdbfb65
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/image_in_a.text
@@ -0,0 +1,5 @@
+Simple: [Some ![alt text](/images/other.png)](local.html)
+
+Nested: [Some ![alt ![img](text.png) text](/images/other.png)](local.html)
+
+Simple: [Some *text ![alt text](/images/other.png) text*](local.html)
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/imagelinks.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/imagelinks.html
new file mode 100644
index 0000000..565d36f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/imagelinks.html
@@ -0,0 +1,15 @@
+<p>Simple: <img src="/images/other.png" alt="alt text" /></p>
+
+<p>Simple with title: <img src="/images/other.png" alt="alt text" title="title" /></p>
+
+<p>Empty img link: <img src="" alt="alt text" /></p>
+
+<p>Reference style: <img src="other.png" alt="alt text" /></p>
+
+<p>Reference style with title: <img src="other.png" alt="alt text" title="Title" /></p>
+
+<p>No alt text: <img src="other.png" alt="" /></p>
+
+<p>No id: <img src="other.png" alt="imgo" title="Title" /></p>
+
+<p>With escaped pipe: <img src="other.png" alt="an | pipe" /></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/imagelinks.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/imagelinks.text
new file mode 100644
index 0000000..05050a2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/imagelinks.text
@@ -0,0 +1,18 @@
+Simple: ![alt text](/images/other.png)
+
+Simple with title: ![alt text](/images/other.png "title")
+
+Empty img link: ![alt text]()
+
+Reference style: ![alt text][img]
+
+Reference style with title: ![alt text][imgo]
+
+No alt text: ![](other.png)
+
+No id: ![imgo]
+
+[img]: other.png
+[imgo]: other.png "Title"
+
+With escaped pipe: ![an \| pipe](other.png)
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/inline.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/inline.html
new file mode 100644
index 0000000..0810bc7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/inline.html
@@ -0,0 +1,46 @@
+<p>simple <a href="">URL</a></p>
+
+<p>simple <a href="something.html">URL</a></p>
+
+<p>simple <a href="something.html">URL <em>with</em> formatting</a></p>
+
+<p>simple <a href="something.html" title="a t&quot;itle">URL with single quoted title</a></p>
+
+<p>simple <a href="something.html" title="a t'itle">URL with double quoted title</a></p>
+
+<p>simple <a href="something.html">URL [with ] escaped</a></p>
+
+<p>simple <a href="something.html">URL with ] escaped</a></p>
+
+<p>simple <a href="something.html">URL [with] nested</a></p>
+
+<p>simple <a href="something.html">URL with [no](link.html) inside</a></p>
+
+<p>simple <a href="/something/to(do)">URL with parens</a></p>
+
+<p>simple <a href="/something/to(do" title="doit">URL with parens</a></p>
+
+<p>simple <a href="something.html" title="title">URL broken
+on line</a></p>
+
+<p>simple <a href="with spaces.html">URL with spaces</a></p>
+
+<p>simple <a href="with spaces.html" title="title">URL with spaces</a></p>
+
+<p>simple <a href="with (spaces).html">URL with spaces</a></p>
+
+<p>simple <a href="spaces.html">leading/trailing spaces</a></p>
+
+<p>simple <a href="spaces.html">leading/trailing spaces</a></p>
+
+<p>simple <a href="spaces.html">leading/trailing spaces</a></p>
+
+<p>bad [URL <a href="something.html">not</a></p>
+
+<p>bad [URL with parens](something(new.html)</p>
+
+<p>bad [URL with empty title](something.html &#8216;&#8217;)</p>
+
+<p>bad [URL](</p>
+
+<p>bad [URL](no</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/inline.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/inline.html.19
new file mode 100644
index 0000000..8d00efa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/inline.html.19
@@ -0,0 +1,46 @@
+<p>simple <a href="">URL</a></p>
+
+<p>simple <a href="something.html">URL</a></p>
+
+<p>simple <a href="something.html">URL <em>with</em> formatting</a></p>
+
+<p>simple <a href="something.html" title="a t&quot;itle">URL with single quoted title</a></p>
+
+<p>simple <a href="something.html" title="a t'itle">URL with double quoted title</a></p>
+
+<p>simple <a href="something.html">URL [with ] escaped</a></p>
+
+<p>simple <a href="something.html">URL with ] escaped</a></p>
+
+<p>simple <a href="something.html">URL [with] nested</a></p>
+
+<p>simple <a href="something.html">URL with [no](link.html) inside</a></p>
+
+<p>simple <a href="/something/to(do)">URL with parens</a></p>
+
+<p>simple <a href="/something/to(do" title="doit">URL with parens</a></p>
+
+<p>simple <a href="something.html" title="title">URL broken
+on line</a></p>
+
+<p>simple <a href="with spaces.html">URL with spaces</a></p>
+
+<p>simple <a href="with spaces.html" title="title">URL with spaces</a></p>
+
+<p>simple <a href="with (spaces).html">URL with spaces</a></p>
+
+<p>simple <a href="spaces.html">leading/trailing spaces</a></p>
+
+<p>simple <a href="spaces.html">leading/trailing spaces</a></p>
+
+<p>simple <a href="spaces.html">leading/trailing spaces</a></p>
+
+<p>bad [URL <a href="something.html">not</a></p>
+
+<p>bad [URL with parens](something(new.html)</p>
+
+<p>bad [URL with empty title](something.html ‘’)</p>
+
+<p>bad [URL](</p>
+
+<p>bad [URL](no</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/inline.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/inline.text
new file mode 100644
index 0000000..c705764
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/inline.text
@@ -0,0 +1,48 @@
+simple [URL]()
+
+simple [URL](something.html)
+
+simple [URL *with* formatting](something.html)
+
+simple [URL with single quoted title](something.html 'a t"itle')
+
+simple [URL with double quoted title](something.html "a t'itle")
+
+simple [URL \[with \] escaped](something.html)
+
+simple [URL with \] escaped](something.html)
+
+simple [URL [with] nested](something.html)
+
+simple [URL with [no](link.html) inside](something.html)
+
+simple [URL with parens](/something/to(do))
+
+simple [URL with parens](/something/to(do "doit")
+
+simple [URL broken
+on line](something.html
+"title")
+
+simple [URL with spaces](with spaces.html)
+
+simple [URL with spaces](with spaces.html 'title')
+
+simple [URL with spaces](with (spaces).html)
+
+simple [leading/trailing spaces](  spaces.html)
+
+simple [leading/trailing spaces](spaces.html  )
+
+simple [leading/trailing spaces](  spaces.html  )
+
+
+bad [URL [not](something.html)
+
+bad [URL with parens](something(new.html)
+
+bad [URL with empty title](something.html '')
+
+bad [URL](
+
+bad [URL](no
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs.html
new file mode 100644
index 0000000..15e2ca7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs.html
@@ -0,0 +1,9 @@
+<p>This is a para.
+[id]: http://www.example.com/</p>
+
+<pre><code>[4]: nourl
+</code></pre>
+
+<p>Points to <a href="one.url">1</a> and <a href="two.url">2</a> and <a href="three.url">3</a> but not [4]</p>
+
+<p>Points to <a href="http://example.com">_.:,;!?-</a> and <a href="test.html#'test'" title="title">otherid8</a></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs.text
new file mode 100644
index 0000000..16a25b5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs.text
@@ -0,0 +1,27 @@
+This is a para.
+[id]: http://www.example.com/
+
+[otherid1]: http://wwww.example.com/ "title 1"
+[otherid2]: http://wwww.example.com/ 'title 2'
+[otherid3]: <some spaces.html>
+[otherid4]: <some spaces.html> 'title'
+[otherid5]: some spaces.html
+[otherid6]: some spaces.html 'title'
+[otherid7]: some spaces
+            "title"
+[otherid8]:test.html#'test' 'title'
+
+[break]:	http://www.example.com/test/asdf.html
+                'Another title'
+
+[1]: ignored.url
+ [1]: one.url
+  [2]: two.url
+   [3]: three.url
+    [4]: nourl
+
+Points to [1] and [2] and [3] but not [4]
+
+[_.:,;!?-]: http://example.com
+
+Points to [_.:,;!?-] and [otherid8]
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs_with_ial.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs_with_ial.html
new file mode 100644
index 0000000..f56d77d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs_with_ial.html
@@ -0,0 +1,4 @@
+<p>Link def with <a hreflang="en" class="test" href="http://example.com" title="title">attr</a> and <a hreflang="en" class="test" href="http://example.com" title="title">attr 2</a> and <a class="test" href="http://example.com">attr 3</a> and <a hreflang="en" class="test" href="http://example.com">attr before</a></p>
+
+<p>test</p>
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs_with_ial.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs_with_ial.text
new file mode 100644
index 0000000..59398a3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/link_defs_with_ial.text
@@ -0,0 +1,16 @@
+Link def with [attr] and [attr 2] and [attr 3] and [attr before]
+
+[attr]: http://example.com 'title'
+{: hreflang="en" .test}
+
+[attr 2]: http://example.com 'title'
+{: hreflang="en"}
+{: .test}
+
+[attr 3]: http://example.com
+{: .test}
+test
+
+{: hreflang="en"}
+{: .test}
+[attr before]: http://example.com
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/links_with_angle_brackets.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/links_with_angle_brackets.html
new file mode 100644
index 0000000..ecaa31e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/links_with_angle_brackets.html
@@ -0,0 +1,3 @@
+<p>This is a <a href="with angle.html">link</a>.</p>
+
+<p>This is a <a href="with angle.html" title="and title">link</a>.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/links_with_angle_brackets.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/links_with_angle_brackets.text
new file mode 100644
index 0000000..2cf0ece
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/links_with_angle_brackets.text
@@ -0,0 +1,3 @@
+This is a [link](<with angle.html>).
+
+This is a [link](<with angle.html> 'and title').
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.html
new file mode 100644
index 0000000..49afd2e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.html
@@ -0,0 +1,37 @@
+
+<p>simple <a href="otherurl.html">URL</a> and <a href="someurl.html">URL</a></p>
+
+<p>simple <a href="otherurl.html">URL</a> and <a href="someurl.html">URL</a></p>
+
+<p>simple <a href="otherurl.html">1</a> and <a href="someurl.html">isurl</a></p>
+
+<p>simple <a href="otherurl.html">1</a> and <a href="someurl.html">isurl</a></p>
+
+<p>this is [a holy <a href="someurl.html">isurl</a>]</p>
+
+<p>no [resolution][] here and [here]</p>
+
+<p>with a <a href="url.html">break 	 in
+the text</a></p>
+
+<p>this not [isurl] and not [isurl]</p>
+
+<p>a <a href="letters.html" title="This is the title">Link with_BIG</a> letters</p>
+
+<p>bad [no URL] d <a href="someurl.html">isurl</a></p>
+
+<p>[no url] invalid.html
+[no url]:</p>
+
+<p>&#8220;title&#8221;</p>
+
+<p>test <a href="invalid.html">url but no title</a>
+test [urldef]</p>
+
+<p>[urldef]: some.url &#8216;title&#8221;</p>
+
+<p>some <a href="with spaces.html" title="title">with spaces</a></p>
+
+<p>this <a href="occasion.html">is a &#8216;special&#8217; occasion for /all/ of us</a></p>
+
+<p>this is <a href="predefined.html">predefined</a> for <a href="uri.html" title="My URI">URI</a></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.html.19
new file mode 100644
index 0000000..f6fed18
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.html.19
@@ -0,0 +1,37 @@
+
+<p>simple <a href="otherurl.html">URL</a> and <a href="someurl.html">URL</a></p>
+
+<p>simple <a href="otherurl.html">URL</a> and <a href="someurl.html">URL</a></p>
+
+<p>simple <a href="otherurl.html">1</a> and <a href="someurl.html">isurl</a></p>
+
+<p>simple <a href="otherurl.html">1</a> and <a href="someurl.html">isurl</a></p>
+
+<p>this is [a holy <a href="someurl.html">isurl</a>]</p>
+
+<p>no [resolution][] here and [here]</p>
+
+<p>with a <a href="url.html">break 	 in
+the text</a></p>
+
+<p>this not [isurl] and not [isurl]</p>
+
+<p>a <a href="letters.html" title="This is the title">Link with_BIG</a> letters</p>
+
+<p>bad [no URL] d <a href="someurl.html">isurl</a></p>
+
+<p>[no url] invalid.html
+[no url]:</p>
+
+<p>“title”</p>
+
+<p>test <a href="invalid.html">url but no title</a>
+test [urldef]</p>
+
+<p>[urldef]: some.url ‘title”</p>
+
+<p>some <a href="with spaces.html" title="title">with spaces</a></p>
+
+<p>this <a href="occasion.html">is a ‘special’ occasion for /all/ of us</a></p>
+
+<p>this is <a href="predefined.html">predefined</a> for <a href="uri.html" title="My URI">URI</a></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.options
new file mode 100644
index 0000000..efb4b01
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.options
@@ -0,0 +1,3 @@
+:link_defs:
+  predefined: [predefined.html]
+  URI: [uri.html, My URI]
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.text
new file mode 100644
index 0000000..9f39fa7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/01_link/reference.text
@@ -0,0 +1,53 @@
+[isurl]: someurl.html
+ [1]:     otherurl.html
+
+simple [URL][1] and [URL][isurl]
+
+simple [URL] [1] and [URL]
+[isurl]
+
+simple [1][] and [isurl][]
+
+simple [1] and [isurl]
+
+this is [a holy [isurl]]
+
+no [resolution][] here and [here]
+
+with a [break 	 in
+the text]
+
+  [break in the text]: url.html
+
+this not \[isurl] and not [isurl\]
+
+a [Link with_BIG] letters
+
+   [link WITH_big]: letters.html
+                    'This is the title'
+
+bad [no URL] d [isurl]
+
+[no url] invalid.html
+[no url]:
+
+[URL but no title]: invalid.html
+
+   "title"
+
+test [url but no title]
+test [urldef]
+
+[urldef]: some.url 'title"
+
+
+some [with spaces]
+
+[with spaces]: with spaces.html "title"
+
+this [is a 'special' occasion for /all/ of us]
+
+[is a 'special' occasion for /all/ of us]: occasion.html
+
+
+this is [predefined] for [URI]
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/empty.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/empty.html
new file mode 100644
index 0000000..127e694
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/empty.html
@@ -0,0 +1,3 @@
+<p>This __is **empty.</p>
+
+<p>This <em>**</em>is empty.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/empty.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/empty.text
new file mode 100644
index 0000000..c99d053
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/empty.text
@@ -0,0 +1,3 @@
+This __is **empty.
+
+This ****is empty.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/errors.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/errors.html
new file mode 100644
index 0000000..e62f03f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/errors.html
@@ -0,0 +1,9 @@
+<p>This is a *star.</p>
+
+<p>This is a **star.</p>
+
+<p>This is <em>*a *star</em>.</p>
+
+<p>This is *a star*.</p>
+
+<p>This** is** a star.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/errors.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/errors.text
new file mode 100644
index 0000000..e80e5eb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/errors.text
@@ -0,0 +1,9 @@
+This is a *star.
+
+This is a **star.
+
+This is **a *star*.
+
+This is *a star\*.
+
+This** is** a star.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/nesting.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/nesting.html
new file mode 100644
index 0000000..3d34cee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/nesting.html
@@ -0,0 +1,41 @@
+<ul>
+  <li><strong><em>test test</em></strong></li>
+  <li><strong><em>test test</em></strong></li>
+  <li><em>test <strong>test</strong></em></li>
+  <li><strong>test <em>test</em></strong></li>
+  <li><strong><em>test</em> test</strong></li>
+  <li><em><strong>test</strong> test</em></li>
+  <li><strong><em>test</em> test</strong></li>
+  <li><strong>test <em>test</em></strong></li>
+  <li><em>test <strong>test</strong></em></li>
+  <li><em>test <strong>test</strong></em></li>
+  <li><strong>test <em>test</em></strong></li>
+  <li><strong><em>test</em> test</strong></li>
+  <li><em><strong>test</strong> test</em></li>
+  <li><strong><em>test</em> test</strong></li>
+  <li><strong>test <em>test</em></strong></li>
+  <li><em>test <strong>test</strong></em></li>
+</ul>
+<ul>
+  <li><em>a</em>b</li>
+  <li>a<em>b</em></li>
+  <li>a<em>b</em>c</li>
+  <li><strong>a</strong>b</li>
+  <li>a<strong>b</strong></li>
+  <li>a<strong>b</strong>c</li>
+</ul>
+<ul>
+  <li>_a_b</li>
+  <li>a_b_</li>
+  <li>a_b_c</li>
+  <li>__a__b</li>
+  <li>a__b__</li>
+  <li>a__b__c</li>
+  <li>a__2__c</li>
+  <li>a__2__3</li>
+  <li>1__2__3</li>
+</ul>
+<ul>
+  <li><em>a _b_ c</em></li>
+  <li><strong>a __b__ c</strong></li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/nesting.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/nesting.text
new file mode 100644
index 0000000..ba67e84
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/nesting.text
@@ -0,0 +1,36 @@
+- ***test test***
+- ___test test___
+- *test **test***
+- **test *test***
+- ***test* test**
+- ***test** test*
+- ***test* test**
+- **test *test***
+- *test **test***
+- _test __test___
+- __test _test___
+- ___test_ test__
+- ___test__ test_
+- ___test_ test__
+- __test _test___
+- _test __test___
+^
+-  *a*b
+-   a*b*
+-   a*b*c
+- **a**b
+-   a**b**
+-   a**b**c
+^
+-  _a_b
+-   a_b_
+-   a_b_c
+- __a__b
+-   a__b__
+-   a__b__c
+-   a__2__c
+-   a__2__3
+-   1__2__3
+^
+-  *a _b_ c*
+-  **a __b__ c**
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/normal.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/normal.html
new file mode 100644
index 0000000..ca53cfe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/normal.html
@@ -0,0 +1,61 @@
+<p>This <em>is</em> so <strong>hard</strong>.</p>
+
+<p>This <em>is</em> so <strong>hard</strong> too.</p>
+
+<p><em>At</em> start
+<em>At</em> start</p>
+
+<p>At <em>end</em>
+At <em>end</em></p>
+
+<p><em>At</em> start
+<em>At</em> start</p>
+
+<p>At <em>end</em>
+At <em>end</em></p>
+
+<p>And <em>nest<strong>ed</strong></em>.</p>
+
+<p>And <em>nest**ed</em>.</p>
+
+<p>And *nest<strong>ed* like</strong> this.</p>
+
+<p>And <em>not_nest_ed</em>.</p>
+
+<p>And <strong><em>nested</em></strong>.</p>
+
+<p>And <strong><em>nested</em></strong>.</p>
+
+<p>And <strong>nest<em>e</em></strong>.</p>
+
+<p>And lonely * here*.</p>
+
+<p>And lonely ** here**.</p>
+
+<p>And <strong>lonely ** here</strong>.</p>
+
+<p>** and here**.</p>
+
+<p>And <strong>compli*cated *</strong> here</p>
+
+<p>Some<em>**what</em> more * <em>**he</em>re</p>
+
+<p>Do it <em>*this*</em> way
+Or this *<em>this</em>* way
+Or that <em>*that</em>* way
+Or that *<em>that*</em> way</p>
+
+<p><a href="http://blah.com/blah_%28">http://blah.com/blah_%28</a></p>
+
+<p><a href="A_-B">A-_B</a></p>
+
+<ul>
+  <li><em>test</em></li>
+  <li>&#8216;<em>test</em>&#8217;</li>
+  <li>&#8220;<em>test</em>&#8221;</li>
+  <li>(&#8220;<em>test</em>&#8221;)</li>
+  <li>(<em>test</em>)</li>
+  <li>“<em>test</em>”</li>
+  <li>`<em>test</em>&#8217;</li>
+  <li>„<em>test</em>“</li>
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/normal.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/normal.options
new file mode 100644
index 0000000..2e6e0a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/normal.options
@@ -0,0 +1 @@
+:entity_output: :numeric
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/normal.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/normal.text
new file mode 100644
index 0000000..ab30913
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/02_emphasis/normal.text
@@ -0,0 +1,59 @@
+This *is* so **hard**.
+
+This _is_ so __hard__ too.
+
+*At* start
+*At* start
+
+At *end*
+At *end*
+
+_At_ start
+_At_ start
+
+At _end_
+At _end_
+
+And *nest**ed***.
+
+And *nest**ed*.
+
+And *nest**ed* like** this.
+
+And *not_nest_ed*.
+
+And ***nested***.
+
+And ___nested___.
+
+And **nest*e***.
+
+And lonely * here*.
+
+And lonely ** here**.
+
+And **lonely ** here**.
+
+** and here**.
+
+And **compli*cated \*** here
+
+Some***what* more * ***he*re
+
+Do it *\*this\** way
+Or this \**this*\* way
+Or that *\*that*\* way
+Or that \**that\** way
+
+[http://blah.com/blah_%28](http://blah.com/blah_%28)
+
+[A-_B](A_-B)
+
+- _test_
+- '_test_'
+- "_test_"
+- ("_test_")
+- (_test_)
+- “_test_”
+- \`_test_'
+- „_test_“
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/empty.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/empty.html
new file mode 100644
index 0000000..20c5051
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/empty.html
@@ -0,0 +1,5 @@
+<p>This is `` empty.</p>
+
+<p>This is ``empty.</p>
+
+<p>This is ````empty.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/empty.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/empty.text
new file mode 100644
index 0000000..cbb9152
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/empty.text
@@ -0,0 +1,5 @@
+This is `` empty.
+
+This is ``empty.
+
+This is ````empty.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/errors.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/errors.html
new file mode 100644
index 0000000..1d341a8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/errors.html
@@ -0,0 +1 @@
+<p>Not ended `span.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/errors.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/errors.text
new file mode 100644
index 0000000..7a948b4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/errors.text
@@ -0,0 +1 @@
+Not ended `span.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting-minted.latex b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting-minted.latex
new file mode 100644
index 0000000..a1f84d9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting-minted.latex
@@ -0,0 +1,2 @@
+You can say \mintinline{ruby}{x = Class.new}, for example.
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting-minted.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting-minted.options
new file mode 100644
index 0000000..c11ebb6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting-minted.options
@@ -0,0 +1 @@
+:syntax_highlighter: minted
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting-minted.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting-minted.text
new file mode 100644
index 0000000..7373290
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting-minted.text
@@ -0,0 +1 @@
+You can say `x = Class.new`{:.language-ruby}, for example.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting.html
new file mode 100644
index 0000000..c6860f6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting.html
@@ -0,0 +1 @@
+<p>You can say <code class="language-ruby highlighter-coderay"><span class="CodeRay">x = <span style="color:#036;font-weight:bold">Class</span>.new</span></code>, for example.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting.text
new file mode 100644
index 0000000..7373290
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/highlighting.text
@@ -0,0 +1 @@
+You can say `x = Class.new`{:.language-ruby}, for example.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/normal.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/normal.html
new file mode 100644
index 0000000..68eddbe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/normal.html
@@ -0,0 +1,16 @@
+<p>This is <code>a</code> simple span.</p>
+
+<p>With <code>some&lt;ht&gt;&amp;ml</code> in it.</p>
+
+<p>And <code>`</code> backticks.</p>
+
+<p>And <code>``some``</code> more.</p>
+
+<p>With backslash <code>in\</code> it.</p>
+
+<p>This is a ` literal backtick.
+As `are` these!</p>
+
+<p>No <code>literal backtick</code>.</p>
+
+<p><code>something</code></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/normal.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/normal.text
new file mode 100644
index 0000000..10d06e2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/normal.text
@@ -0,0 +1,16 @@
+This is `a` simple span.
+
+With `some<ht>&ml` in it.
+
+And `` ` `` backticks.
+
+And ``` ``some`` ``` more.
+
+With backslash `in\` it.
+
+This is a ` literal backtick.
+As \`are\` these!
+
+No `` literal backtick``.
+
+`something`
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/disabled.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/disabled.html
new file mode 100644
index 0000000..7822f78
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/disabled.html
@@ -0,0 +1 @@
+<p>You can say <code class="language-ruby">Class</code>.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/disabled.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/disabled.options
new file mode 100644
index 0000000..34094e9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/disabled.options
@@ -0,0 +1,4 @@
+:syntax_highlighter: rouge
+:syntax_highlighter_opts:
+  span:
+    disable: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/disabled.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/disabled.text
new file mode 100644
index 0000000..d958d91
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/disabled.text
@@ -0,0 +1 @@
+You can say `Class`{:.language-ruby}.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/simple.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/simple.html
new file mode 100644
index 0000000..4294542
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/simple.html
@@ -0,0 +1 @@
+<p>You can say <code class="language-ruby highlighter-rouge"><span class="n">x</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span></code>, for example.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/simple.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/simple.options
new file mode 100644
index 0000000..9ac61e7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/simple.options
@@ -0,0 +1 @@
+:syntax_highlighter: rouge
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/simple.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/simple.text
new file mode 100644
index 0000000..7373290
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/03_codespan/rouge/simple.text
@@ -0,0 +1 @@
+You can say `x = Class.new`{:.language-ruby}, for example.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/backlink_text.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/backlink_text.html
new file mode 100644
index 0000000..1406316
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/backlink_text.html
@@ -0,0 +1,9 @@
+<p>Some footnote here<sup id="fnref:fn"><a href="#fn:fn" class="footnote">1</a></sup></p>
+
+<div class="footnotes">
+  <ol>
+    <li id="fn:fn">
+      <p>Some text here&nbsp;<a href="#fnref:fn" class="reversefootnote">text &8617; &lt;img /&gt;</a></p>
+    </li>
+  </ol>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/backlink_text.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/backlink_text.options
new file mode 100644
index 0000000..4c677ef
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/backlink_text.options
@@ -0,0 +1 @@
+:footnote_backlink: 'text &8617; <img />'
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/backlink_text.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/backlink_text.text
new file mode 100644
index 0000000..41a6f98
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/backlink_text.text
@@ -0,0 +1,3 @@
+Some footnote here[^fn]
+
+[^fn]: Some text here
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/definitions.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/definitions.html
new file mode 100644
index 0000000..9012cc0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/definitions.html
@@ -0,0 +1,17 @@
+<p>Some para.</p>
+
+<blockquote>
+  <p>blockquote</p>
+</blockquote>
+
+<ul>
+  <li>a list
+with some text</li>
+</ul>
+
+<ul>
+  <li>other list</li>
+</ul>
+<pre><code>code
+</code></pre>
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/definitions.latex b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/definitions.latex
new file mode 100644
index 0000000..f666976
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/definitions.latex
@@ -0,0 +1,17 @@
+Some para.
+
+\begin{quote}
+blockquote
+\end{quote}
+
+\begin{itemize}
+\item a list
+with some text
+\end{itemize}
+
+\begin{itemize}
+\item other list
+\end{itemize}
+\begin{verbatim}code
+\end{verbatim}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/definitions.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/definitions.text
new file mode 100644
index 0000000..44b52e0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/definitions.text
@@ -0,0 +1,24 @@
+Some para.
+
+[^footnote]: ignored definition
+[^footnote]: Some footnote text
+
+> blockquote
+
+[^other]: some
+    foot
+
+    note text
+
+* a list
+  with some text
+
+[^tnote]: foot note
+
+* other list
+^
+    code
+
+[^1]:
+    > a blockquote
+    and some para
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.html
new file mode 100644
index 0000000..747eff7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.html
@@ -0,0 +1,12 @@
+<p>This is a footnote<sup id="fnref:ab"><a href="#fn:ab" class="footnote">35</a></sup>. And another<sup id="fnref:bc"><a href="#fn:bc" class="footnote">36</a></sup>.</p>
+
+<div class="footnotes">
+  <ol start="35">
+    <li id="fn:ab">
+      <p>Some text.&nbsp;<a href="#fnref:ab" class="reversefootnote">&#8617;</a></p>
+    </li>
+    <li id="fn:bc">
+      <p>Some other text.&nbsp;<a href="#fnref:bc" class="reversefootnote">&#8617;</a></p>
+    </li>
+  </ol>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.latex b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.latex
new file mode 100644
index 0000000..8f07dde
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.latex
@@ -0,0 +1,2 @@
+This is a footnote\footnote{Some text.}. And another\footnote{Some other text.}.
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.options
new file mode 100644
index 0000000..f606ecf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.options
@@ -0,0 +1 @@
+:footnote_nr: 35
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.text
new file mode 100644
index 0000000..cad2935
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/footnote_nr.text
@@ -0,0 +1,4 @@
+This is a footnote[^ab]. And another[^bc].
+
+[^ab]: Some text.
+[^bc]: Some other text.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/inside_footnote.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/inside_footnote.html
new file mode 100644
index 0000000..755bc8e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/inside_footnote.html
@@ -0,0 +1,17 @@
+<p>Lorem ipsum<sup id="fnref:first"><a href="#fn:first" class="footnote">1</a></sup> dolor sit amet.</p>
+
+<p>Lorem ipsum<sup id="fnref:second"><a href="#fn:second" class="footnote">2</a></sup> dolor sit amet.</p>
+
+<div class="footnotes">
+  <ol>
+    <li id="fn:first">
+      <p>Consecutur adisping.<sup id="fnref:third"><a href="#fn:third" class="footnote">3</a></sup>&nbsp;<a href="#fnref:first" class="reversefootnote">&#8617;</a></p>
+    </li>
+    <li id="fn:second">
+      <p>Sed ut perspiciatis unde omnis.&nbsp;<a href="#fnref:second" class="reversefootnote">&#8617;</a></p>
+    </li>
+    <li id="fn:third">
+      <p>Sed ut.&nbsp;<a href="#fnref:third" class="reversefootnote">&#8617;</a></p>
+    </li>
+  </ol>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/inside_footnote.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/inside_footnote.text
new file mode 100644
index 0000000..f4f91e9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/inside_footnote.text
@@ -0,0 +1,9 @@
+Lorem ipsum[^first] dolor sit amet.
+
+Lorem ipsum[^second] dolor sit amet.
+
+[^first]: Consecutur adisping.[^third]
+
+[^second]: Sed ut perspiciatis unde omnis.
+
+[^third]: Sed ut.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/markers.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/markers.html
new file mode 100644
index 0000000..d4c45d7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/markers.html
@@ -0,0 +1,46 @@
+<p>This is some *ref.<sup id="fnref:fn"><a href="#fn:fn" class="footnote">1</a></sup></p>
+
+<blockquote>
+  <p>a blockquote <sup id="fnref:3"><a href="#fn:3" class="footnote">2</a></sup></p>
+</blockquote>
+
+<ul>
+  <li>and a list item <sup id="fnref:1"><a href="#fn:1" class="footnote">3</a></sup></li>
+</ul>
+
+<h1>And a header<sup id="fnref:now"><a href="#fn:now" class="footnote">4</a></sup></h1>
+
+<p>A marker without a definition [^without].</p>
+
+<p>A marker <sup id="fnref:empty"><a href="#fn:empty" class="footnote">5</a></sup> used twice<sup id="fnref:fn:1"><a href="#fn:fn" class="footnote">1</a></sup> and thrice<sup id="fnref:fn:2"><a href="#fn:fn" class="footnote">1</a></sup>.</p>
+
+<div class="footnotes">
+  <ol>
+    <li id="fn:fn">
+      <p>Some foot note text&nbsp;<a href="#fnref:fn" class="reversefootnote">&#8617;</a>&nbsp;<a href="#fnref:fn:1" class="reversefootnote">&#8617;<sup>2</sup></a>&nbsp;<a href="#fnref:fn:2" class="reversefootnote">&#8617;<sup>3</sup></a></p>
+    </li>
+    <li id="fn:3">
+      <p>other text
+with more lines</p>
+
+      <blockquote>
+        <p>and a quote</p>
+      </blockquote>
+      <p><a href="#fnref:3" class="reversefootnote">&#8617;</a></p>
+    </li>
+    <li id="fn:1">
+      <p>some <em>text</em>&nbsp;<a href="#fnref:1" class="reversefootnote">&#8617;</a></p>
+    </li>
+    <li id="fn:now">
+
+      <pre><code>code block
+continued here
+</code></pre>
+      <p><a href="#fnref:now" class="reversefootnote">&#8617;</a></p>
+    </li>
+    <li id="fn:empty">
+
+      <p><a href="#fnref:empty" class="reversefootnote">&#8617;</a></p>
+    </li>
+  </ol>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/markers.latex b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/markers.latex
new file mode 100644
index 0000000..fb5237e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/markers.latex
@@ -0,0 +1,23 @@
+This is some *ref.\footnote{Some foot note text}
+
+\begin{quote}
+a blockquote \footnote{other text
+with more lines
+
+\begin{quote}
+and a quote
+\end{quote}}
+\end{quote}
+
+\begin{itemize}
+\item and a list item \footnote{some \emph{text}}
+\end{itemize}
+
+\section*{And a header\footnote{\begin{verbatim}code block
+continued here
+\end{verbatim}}}
+
+A marker without a definition [\^{}without].
+
+A marker \footnote{} used twice\footnote{Some foot note text} and thrice\footnote{Some foot note text}.
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/markers.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/markers.text
new file mode 100644
index 0000000..42b77fb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/markers.text
@@ -0,0 +1,27 @@
+This is some *ref.[^fn]
+
+[^fn]: Some foot note text
+{: .class}
+
+> a blockquote [^3]
+
+* and a list item [^1]
+
+# And a header[^now]
+
+[^1]:some *text*
+[^3]: other text
+    with more lines
+
+    > and a quote
+
+A marker without a definition [^without].
+
+A marker [^empty] used twice[^fn] and thrice[^fn].
+
+[^now]:
+
+    	code block
+        continued here
+
+[^empty]:
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/placement.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/placement.html
new file mode 100644
index 0000000..e6543a9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/placement.html
@@ -0,0 +1,11 @@
+<div class="footnotes">
+  <ol>
+    <li id="fn:1">
+      <p>Footnote \` text&nbsp;<a href="#fnref:1" class="reversefootnote">&#8617;</a></p>
+    </li>
+  </ol>
+</div>
+
+<p>Some para with a<sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup> footnote.</p>
+
+<p>And another para.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/placement.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/placement.text
new file mode 100644
index 0000000..97c0ab1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/placement.text
@@ -0,0 +1,8 @@
+* footnotes will be placed here
+{:footnotes}
+
+Some para with a[^1] footnote.
+
+[^1]: Footnote \\\` text
+
+And another para.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/regexp_problem.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/regexp_problem.html
new file mode 100644
index 0000000..d246a37
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/regexp_problem.html
@@ -0,0 +1,14 @@
+<h1>Something</h1>
+<p>something<sup id="fnref:note1"><a href="#fn:note1" class="footnote">1</a></sup>.</p>
+
+<h1>Footnotes</h1>
+
+<h1>Test</h1>
+<div class="footnotes">
+  <ol>
+    <li id="fn:note1">
+
+      <p>A note&nbsp;<a href="#fnref:note1" class="reversefootnote">&#8617;</a></p>
+    </li>
+  </ol>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/regexp_problem.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/regexp_problem.text
new file mode 100644
index 0000000..6a60c61
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/regexp_problem.text
@@ -0,0 +1,52 @@
+# Something
+something[^note1].
+
+# Footnotes
+[^note1]:
+    A note
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Test
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/without_backlink.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/without_backlink.html
new file mode 100644
index 0000000..df5e917
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/without_backlink.html
@@ -0,0 +1,9 @@
+<p>Some footnote here<sup id="fnref:fn"><a href="#fn:fn" class="footnote">1</a></sup></p>
+
+<div class="footnotes">
+  <ol>
+    <li id="fn:fn">
+      <p>Some text here</p>
+    </li>
+  </ol>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/without_backlink.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/without_backlink.options
new file mode 100644
index 0000000..0512dd6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/without_backlink.options
@@ -0,0 +1 @@
+:footnote_backlink: ''
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/without_backlink.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/without_backlink.text
new file mode 100644
index 0000000..41a6f98
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/04_footnote/without_backlink.text
@@ -0,0 +1,3 @@
+Some footnote here[^fn]
+
+[^fn]: Some text here
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/across_lines.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/across_lines.html
new file mode 100644
index 0000000..e7cec40
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/across_lines.html
@@ -0,0 +1 @@
+<p>Link: <a href="test foo">test</a></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/across_lines.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/across_lines.text
new file mode 100644
index 0000000..8f39d95
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/across_lines.text
@@ -0,0 +1,2 @@
+Link: <a href="test
+foo">test</a>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/button.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/button.html
new file mode 100644
index 0000000..c49bb52
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/button.html
@@ -0,0 +1,7 @@
+<p><button>Some Text</button></p>
+
+<p>First some text and then a <button>here</button></p>
+
+<p><button>A button</button> and then text.</p>
+
+<p>A <button>with <strong>some</strong> <code>code</code> in <img src="image.png" alt="alt" /></button> it.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/button.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/button.text
new file mode 100644
index 0000000..e0a7783
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/button.text
@@ -0,0 +1,7 @@
+<button>Some Text</button>
+
+First some text and then a <button>here</button>
+
+<button>A button</button> and then text.
+
+A <button>with **some** `code` in ![alt](image.png)</button> it.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/invalid.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/invalid.html
new file mode 100644
index 0000000..030552f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/invalid.html
@@ -0,0 +1 @@
+<p>This is <span>some text</span></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/invalid.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/invalid.text
new file mode 100644
index 0000000..383f0a8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/invalid.text
@@ -0,0 +1 @@
+This is <span>some text
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/link_with_mailto.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/link_with_mailto.html
new file mode 100644
index 0000000..7d0d6ad
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/link_with_mailto.html
@@ -0,0 +1 @@
+<p>Link: <a href="mailto:test@example.com">text</a></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/link_with_mailto.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/link_with_mailto.text
new file mode 100644
index 0000000..fb01619
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/link_with_mailto.text
@@ -0,0 +1 @@
+Link: <a href="mailto:test@example.com">text</a>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/mark_element.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/mark_element.html
new file mode 100644
index 0000000..b6989b7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/mark_element.html
@@ -0,0 +1,3 @@
+<p>Lorem ipsum.</p>
+
+<p><mark>Test</mark></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/mark_element.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/mark_element.text
new file mode 100644
index 0000000..6ae30e0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/mark_element.text
@@ -0,0 +1,3 @@
+Lorem ipsum.
+
+<mark>Test</mark>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/markdown_attr.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/markdown_attr.html
new file mode 100644
index 0000000..44158c3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/markdown_attr.html
@@ -0,0 +1,6 @@
+<p>This is <span><em>text</em></span>
+This is <span>*text*</span>
+This is <span><em>text</em></span>
+This is <span><em>text</em></span>
+This is <span>*nothing* <strong>to <em>fear</em></strong> about</span>.
+This is <span>&lt;http://example.com&gt;</span>.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/markdown_attr.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/markdown_attr.text
new file mode 100644
index 0000000..dcc10ff
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/markdown_attr.text
@@ -0,0 +1,6 @@
+This is <span markdown="1">*text*</span>
+This is <span markdown="0">*text*</span>
+This is <span markdown="span">*text*</span>
+This is <span markdown="block">*text*</span>
+This is <span markdown="0">*nothing* <strong markdown="1">to *fear*</strong> about</span>.
+This is <span markdown="0"><http://example.com></span>.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/normal.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/normal.html
new file mode 100644
index 0000000..0da5f26
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/normal.html
@@ -0,0 +1,43 @@
+<p>Empty <a name="anchor" id="anchor" class=""></a>!</p>
+
+<p><a href="test">title</a> is a title.</p>
+
+<p>This is <? a PI ?>.</p>
+
+<p>This is <!-- a --> comment.</p>
+
+<p>This is <!-- a
+--> multiline comment.</p>
+
+<p>This is <span>tag
+now </span>.</p>
+
+<p>This is <span>tag
+</span> now.</p>
+
+<p>This is an empty <span></span> tag.</p>
+
+<p>This is <em>something<span test="do_it"></span> strange</em>.</p>
+
+<p>Auto-closing: <br /></p>
+
+<p>Expanding: <textarea></textarea></p>
+
+<p>An invalid tag: &lt;hR&gt;</p>
+
+<p>A &lt;p&gt;block tag&lt;/p&gt;.</p>
+
+<p>An invalid &lt;/closing&gt; tag.</p>
+
+<p>A <script>*not*</script> tag.</p>
+
+<p>An <span>unclosed <em>tag.</em></span></p>
+
+<p>Some <code>element with | pipe symbol</code></p>
+
+<p>Some <span><code>element with | pipe symbol</code></span></p>
+
+<p>Some <code>element with | pipe
+symbol|</code></p>
+
+<p><u>underlined</u></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/normal.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/normal.text
new file mode 100644
index 0000000..0156d7c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/normal.text
@@ -0,0 +1,43 @@
+Empty <a NaMe="anchor" ID="anchor" cLaSs></A>!
+
+<a href="test">title</a> is a title.
+
+This is <? a PI ?>.
+
+This is <!-- a --> comment.
+
+This is <!-- a
+--> multiline comment.
+
+This is <span>tag
+now </span>.
+
+This is <sPAn>tag
+</SPAN> now.
+
+This is an empty <span></span> tag.
+
+This is _something<span test="do_it" /> strange_.
+
+Auto-closing: <br>
+
+Expanding: <textarea></textarea>
+
+An invalid tag: <hR>
+
+A <p>block tag</p>.
+
+An invalid </closing> tag.
+
+A <script>*not*</script> tag.
+
+An <span>unclosed *tag.*
+
+Some <code>element with | pipe symbol</code>
+
+Some <span><code>element with | pipe symbol</code></span>
+
+Some <code>element with | pipe
+symbol|</code>
+
+<u>underlined</u>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/raw_span_elements.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/raw_span_elements.html
new file mode 100644
index 0000000..808f1db
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/raw_span_elements.html
@@ -0,0 +1,2 @@
+<p>This is raw <kbd>--version</kbd> and <samp>--version</samp> and <var>--version</var> and
+<code>---version</code>.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/raw_span_elements.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/raw_span_elements.text
new file mode 100644
index 0000000..5b128fc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/raw_span_elements.text
@@ -0,0 +1,2 @@
+This is raw <kbd>--version</kbd> and <samp>--version</samp> and <var>--version</var> and
+<code>---version</code>.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/xml.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/xml.html
new file mode 100644
index 0000000..00b43c1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/xml.html
@@ -0,0 +1,5 @@
+<p>This <some:url name:spac="hallo">doit</some:url> test</p>
+
+<p>This <SoMe:UrL NamE:SpAC="test">doit</SoMe:UrL> test</p>
+
+<p>This <SoMe>doit&lt;/some&gt; test</SoMe></p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/xml.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/xml.text
new file mode 100644
index 0000000..bc234de
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/05_html/xml.text
@@ -0,0 +1,5 @@
+This <some:url name:spac='hallo'>doit</some:url> test
+
+This <SoMe:UrL NamE:SpAC='test'>doit</SoMe:UrL> test
+
+This <SoMe>doit</some> test
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev.html
new file mode 100644
index 0000000..f247c53
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev.html
@@ -0,0 +1,21 @@
+<p>This <abbr title="It is, yes">is some</abbr> text.</p>
+
+<p>There <em><abbr title="It is, yes">is some</abbr> real</em> concern about <abbr title="This &amp; that">OtHeR!</abbr></p>
+
+<p><abbr title="It is, yes">is some</abbr> Think <abbr>empty</abbr> about <abbr title="Very nice country">Oesterreich</abbr>. <abbr title="Cascading">CSS</abbr> und <abbr title="Cascading 3">CSS3</abbr></p>
+
+<p>no abbrev here because there is someone and kulis some</p>
+
+<ul>
+  <li><abbr title="(eXtensible) HyperText Markup Language">(X)HTML</abbr> test</li>
+  <li>line two</li>
+</ul>
+
+<p><a href="http://en.wikipedia.org/wiki/Xhtml"><abbr title="(eXtensible) HyperText Markup Language">(X)HTML</abbr></a></p>
+
+<ul>
+  <li>test <abbr title="(eXtensible) HyperText Markup Language">(X)HTML</abbr></li>
+</ul>
+
+<p>This is <abbr class="testit test" title="Some text here">awesome</abbr>.</p>
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev.text
new file mode 100644
index 0000000..1aa8100
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev.text
@@ -0,0 +1,34 @@
+This is some text.
+
+*[is some]: Yes it is  
+*[OtHeR!]: This & that
+
+*[is some]: It is, yes  
+*[empty]:
+
+There *is some real* concern about OtHeR!
+
+is some Think empty about Oesterreich. CSS und CSS3
+
+no abbrev here because there is someone and kulis some
+
+*[Oesterreich]: 	Very nice country	
+
+*[CSS]: Cascading
+*[CSS3]: Cascading 3
+
+* (X)HTML test 
+* line two
+
+[(X)HTML](http://en.wikipedia.org/wiki/Xhtml)
+
+* test (X)HTML
+
+*[(X)HTML]: (eXtensible) HyperText Markup Language
+
+
+This is awesome.
+
+{:.testit}
+*[awesome]: Some text here
+{:.test}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev_defs.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev_defs.html
new file mode 100644
index 0000000..108fcfc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev_defs.html
@@ -0,0 +1,2 @@
+<pre><code>*[4]: noabbrev
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev_defs.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev_defs.text
new file mode 100644
index 0000000..3f3a0e5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/abbreviations/abbrev_defs.text
@@ -0,0 +1,5 @@
+*[ABBR]: Some abbreviations   
+ *[one abbr]: one abbrev
+  *[2 and other]: another
+   *[3]: yet another 
+    *[4]: noabbrev
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/autolinks/url_links.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/autolinks/url_links.html
new file mode 100644
index 0000000..90eae7d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/autolinks/url_links.html
@@ -0,0 +1,15 @@
+<p>This should be a <a href="http://www.example.com/">http://www.example.com/</a> link.
+This should be a <a href="mailto:john.doe@example.com">john.doe@example.com</a> link.
+As should <a href="mailto:john.doe@example.com">john.doe@example.com</a> this.
+As should <a href="mailto:john_doe@example.com">john_doe@example.com</a> this.
+As should <a href="mailto:CSS@example.com"><abbr title="Cascading">CSS</abbr>@example.com</a> this.
+Another ampersand <a href="http://www.example.com/?doit&amp;x=y">http://www.example.com/?doit&amp;x=y</a> link.
+More entities  <a href="http://www.example.com/?doit&amp;x=&quot;y&amp;z=y">http://www.example.com/?doit&amp;x=&quot;y&amp;z=y</a>.</p>
+
+<p>Email international <a href="mailto:übung@macht.den.meister.de">übung@macht.den.meister.de</a>, <a href="mailto:ü.äß@hülse.de">ü.äß@hülse.de</a>
+Email invalid: &lt;<a href="mailtos:me@example.com">me@example.com</a>&gt;</p>
+
+<p>Autolink with underscore: <a href="http://www.example.com/with_under_score">http://www.example.com/with_under_score</a></p>
+
+<p><a href="http://www.example.com/">http://www.example.com/</a></p>
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/autolinks/url_links.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/autolinks/url_links.text
new file mode 100644
index 0000000..033e8af
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/autolinks/url_links.text
@@ -0,0 +1,16 @@
+This should be a <http://www.example.com/> link.
+This should be a <mailto:john.doe@example.com> link.
+As should <john.doe@example.com> this.
+As should <john_doe@example.com> this.
+As should <CSS@example.com> this.
+Another ampersand <http://www.example.com/?doit&x=y> link.
+More entities  <http://www.example.com/?doit&amp;x=&quot;y&z=y>.
+
+Email international <übung@macht.den.meister.de>, <ü.äß@hülse.de>
+Email invalid: <[me@example.com](mailtos:me@example.com)>
+
+Autolink with underscore: <http://www.example.com/with_under_score>
+
+<http://www.example.com/>
+
+*[CSS]: Cascading
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/escaped_chars/normal.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/escaped_chars/normal.html
new file mode 100644
index 0000000..015d594
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/escaped_chars/normal.html
@@ -0,0 +1,47 @@
+<p>\</p>
+
+<p>.</p>
+
+<p>*</p>
+
+<p>_</p>
+
+<p>+</p>
+
+<p>-</p>
+
+<p>`</p>
+
+<p>(</p>
+
+<p>)</p>
+
+<p>[</p>
+
+<p>]</p>
+
+<p>{</p>
+
+<p>}</p>
+
+<p>#</p>
+
+<p>!</p>
+
+<p>&lt;&lt;</p>
+
+<p>&gt;&gt;</p>
+
+<p>:</p>
+
+<p>|</p>
+
+<p>"</p>
+
+<p>'</p>
+
+<p>=</p>
+
+<p>&gt;</p>
+
+<p>&lt;</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/escaped_chars/normal.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/escaped_chars/normal.text
new file mode 100644
index 0000000..1c47104
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/escaped_chars/normal.text
@@ -0,0 +1,47 @@
+\\
+
+\.
+
+\*
+
+\_
+
+\+
+
+\-
+
+\`
+
+\(
+
+\)
+
+\[
+
+\]
+
+\{
+
+\}
+
+\#
+
+\!
+
+\<<
+
+\>>
+
+\:
+
+\|
+
+\"
+
+\'
+
+\=
+
+\>
+
+\<
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/comment.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/comment.html
new file mode 100644
index 0000000..3544d49
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/comment.html
@@ -0,0 +1,6 @@
+<p>This is a <!-- simple --> paragraph.
+This is a <!-- simple --> paragraph.
+This is a <!-- simple {:/other} paragraph -->.
+This is a  paragraph.
+This is a {:/comment} simple {:/} paragraph.
+This is a {::comment} paragraph.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/comment.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/comment.text
new file mode 100644
index 0000000..8b9e8d3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/comment.text
@@ -0,0 +1,6 @@
+This is a {::comment}simple{:/} paragraph.
+This is a {::comment}simple{:/comment} paragraph.
+This is a {::comment}simple {:/other} paragraph{:/comment}.
+This is a {::comment/} paragraph.
+This is a {:/comment} simple {:/} paragraph.
+This is a {::comment} paragraph.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/ignored.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/ignored.html
new file mode 100644
index 0000000..63c2c40
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/ignored.html
@@ -0,0 +1 @@
+<p>This is {::something}paragraph{:/}</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/ignored.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/ignored.text
new file mode 100644
index 0000000..a7e7737
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/ignored.text
@@ -0,0 +1 @@
+This is {::something}paragraph{:/}
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/nomarkdown.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/nomarkdown.html
new file mode 100644
index 0000000..83de931
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/nomarkdown.html
@@ -0,0 +1 @@
+<p>This is *some* text.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/nomarkdown.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/nomarkdown.text
new file mode 100644
index 0000000..57c4b38
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/nomarkdown.text
@@ -0,0 +1 @@
+This is {::nomarkdown}*some*{:/} text.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/options.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/options.html
new file mode 100644
index 0000000..48e3076
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/options.html
@@ -0,0 +1 @@
+<p>This is an  option <span>*true*</span>!</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/options.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/options.text
new file mode 100644
index 0000000..e289491
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/extension/options.text
@@ -0,0 +1 @@
+This is an {::options parse_span_html="false" /} option <span>*true*</span>!
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/ial/simple.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/ial/simple.html
new file mode 100644
index 0000000..c0f3a47
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/ial/simple.html
@@ -0,0 +1,6 @@
+<p>This is a <code class="hund" id="dog">span</code>.</p>
+
+<p>This is a <code class="hund katz" id="dog" key="val">span</code>.</p>
+
+<p>This is an{: .ignored} span ial.
+This is an{: .escaped} span ial.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/ial/simple.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/ial/simple.text
new file mode 100644
index 0000000..8945602
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/ial/simple.text
@@ -0,0 +1,6 @@
+This is a `span`{: .hund #dog}.
+
+This is a `span`{: .hund #dog}{: .katz key='val'}.
+
+This is an{: .ignored} span ial.
+This is an\{: .escaped} span ial.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/line_breaks/normal.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/line_breaks/normal.html
new file mode 100644
index 0000000..11066a5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/line_breaks/normal.html
@@ -0,0 +1,11 @@
+<p>This is a line<br />
+with a line break.</p>
+
+<p>This is a line 
+without a line break.</p>
+
+<p>This is a line <br />
+with a line\ <br />
+break.</p>
+
+<p>Line break on last line.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/line_breaks/normal.latex b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/line_breaks/normal.latex
new file mode 100644
index 0000000..a62ff56
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/line_breaks/normal.latex
@@ -0,0 +1,12 @@
+This is a line\newline
+with a line break.
+
+This is a line 
+without a line break.
+
+This is a line \newline
+with a line\textbackslash{} \newline
+break.
+
+Line break on last line.
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/line_breaks/normal.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/line_breaks/normal.text
new file mode 100644
index 0000000..92f866f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/line_breaks/normal.text
@@ -0,0 +1,11 @@
+This is a line  
+with a line break.  
+
+This is a line 
+without a line break.
+
+This is a line \\
+with a line\\   
+break.
+
+Line break on last line.  
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/itex2mml.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/itex2mml.html
new file mode 100644
index 0000000..4e195d1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/itex2mml.html
@@ -0,0 +1 @@
+<p>This is <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mi>a</mi><mrow><msup><mi>x</mi> <mn>3</mn></msup></mrow><mo>+</mo><mi>b</mi><mrow><msup><mi>x</mi> <mn>2</mn></msup></mrow><mo>+</mo><mi>cx</mi><mo>+</mo><mi>d</mi></mrow><annotation encoding='application/x-tex'>f(x) = a{x^3} + b{x^2} + cx + d</annotation></semantics></math> something!</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/itex2mml.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/itex2mml.options
new file mode 100644
index 0000000..953bdae
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/itex2mml.options
@@ -0,0 +1 @@
+:math_engine: itex2mml
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/itex2mml.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/itex2mml.text
new file mode 100644
index 0000000..3e20b55
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/itex2mml.text
@@ -0,0 +1 @@
+This is $$f(x) = a{x^3} + b{x^2} + cx + d$$ something!
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/mathjaxnode.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/mathjaxnode.html.19
new file mode 100644
index 0000000..5ba3a68
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/mathjaxnode.html.19
@@ -0,0 +1,27 @@
+<p>This is <math xmlns="http://www.w3.org/1998/Math/MathML">
+  <mi>f</mi>
+  <mo stretchy="false">(</mo>
+  <mi>x</mi>
+  <mo stretchy="false">)</mo>
+  <mo>=</mo>
+  <mi>a</mi>
+  <mrow class="MJX-TeXAtom-ORD">
+    <msup>
+      <mi>x</mi>
+      <mn>3</mn>
+    </msup>
+  </mrow>
+  <mo>+</mo>
+  <mi>b</mi>
+  <mrow class="MJX-TeXAtom-ORD">
+    <msup>
+      <mi>x</mi>
+      <mn>2</mn>
+    </msup>
+  </mrow>
+  <mo>+</mo>
+  <mi>c</mi>
+  <mi>x</mi>
+  <mo>+</mo>
+  <mi>d</mi>
+</math> something!</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/mathjaxnode.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/mathjaxnode.options
new file mode 100644
index 0000000..adc27e8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/mathjaxnode.options
@@ -0,0 +1 @@
+:math_engine: mathjaxnode
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/mathjaxnode.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/mathjaxnode.text
new file mode 100644
index 0000000..3e20b55
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/mathjaxnode.text
@@ -0,0 +1 @@
+This is $$f(x) = a{x^3} + b{x^2} + cx + d$$ something!
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/no_engine.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/no_engine.html
new file mode 100644
index 0000000..3b93c54
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/no_engine.html
@@ -0,0 +1 @@
+<p><span class="kdmath">$5+5$</span> inline math</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/no_engine.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/no_engine.options
new file mode 100644
index 0000000..06d559e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/no_engine.options
@@ -0,0 +1 @@
+:math_engine: ~
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/no_engine.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/no_engine.text
new file mode 100644
index 0000000..a22f9fd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/no_engine.text
@@ -0,0 +1 @@
+$$5+5$$ inline math
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/normal.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/normal.html
new file mode 100644
index 0000000..d99130e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/normal.html
@@ -0,0 +1,10 @@
+<p>This is <script type="math/tex">\lambda_\alpha > 5</script> some math. With <script type="math/tex">1
++ 1</script> new line characters in between.</p>
+
+<p><script type="math/tex">5+5</script> inline math, $5.00 $$no math$$</p>
+
+<p>$$5+5$$ inline math</p>
+
+<p><script type="math/tex">5+5</script></p>
+
+<p>$$5+5$$</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/normal.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/normal.text
new file mode 100644
index 0000000..e37a007
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/normal.text
@@ -0,0 +1,10 @@
+This is $$\lambda_\alpha > 5$$ some math. With $$1
++ 1$$ new line characters in between.
+
+$$5+5$$ inline math, $5.00 \$$no math$$
+
+\$\$5+5$$ inline math
+
+\$$5+5$$
+
+\$\$5+5$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/ritex.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/ritex.html
new file mode 100644
index 0000000..60ba8fe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/ritex.html
@@ -0,0 +1 @@
+<p>This is <math xmlns="http://www.w3.org/1998/Math/MathML" display="inline"><mi>f</mi><mo stretchy='false'>(</mo><mi>x</mi><mo stretchy='false'>)</mo><mo>=</mo><mi>a</mi><mrow><msup><mi>x</mi><mn>3</mn></msup></mrow><mo>+</mo><mi>b</mi><mrow><msup><mi>x</mi><mn>2</mn></msup></mrow><mo>+</mo><mi>c</mi><mi>x</mi><mo>+</mo><mi>d</mi></math> something!</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/ritex.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/ritex.options
new file mode 100644
index 0000000..0ef54eb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/ritex.options
@@ -0,0 +1 @@
+:math_engine: ritex
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/ritex.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/ritex.text
new file mode 100644
index 0000000..3e20b55
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/math/ritex.text
@@ -0,0 +1 @@
+This is $$f(x) = a{x^3} + b{x^2} + cx + d$$ something!
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities.html
new file mode 100644
index 0000000..96b3b5c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities.html
@@ -0,0 +1,6 @@
+<p>This is the A&amp;O. &copy; 2008 by me
+As well \&amp; as this. Some &#343; other
+values may &#xAF; may also show but
+not st. like &amp;#xYZ;.</p>
+
+<p>This is BS&amp;T; done!</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities.options
new file mode 100644
index 0000000..036c561
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities.options
@@ -0,0 +1 @@
+:entity_output: :as_input
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities.text
new file mode 100644
index 0000000..0446f4c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities.text
@@ -0,0 +1,6 @@
+This is the A&O. &copy; 2008 by me
+As well \& as this. Some &#343; other
+values may &#xAF; may also show but
+not st. like &#xYZ;.
+
+This is BS&T; done!
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.html
new file mode 100644
index 0000000..7507f75
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.html
@@ -0,0 +1 @@
+<p>This &quot;is&quot; &#39;the&#39; A&amp;O. &copy; 2008 by me &#343; and &#x3bb;</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.html.19
new file mode 100644
index 0000000..ed2817b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.html.19
@@ -0,0 +1 @@
+<p>This "is" 'the' A&amp;O. © 2008 by me ŗ and λ</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.options
new file mode 100644
index 0000000..32a751e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.options
@@ -0,0 +1,2 @@
+:entity_output: :as_char
+:smart_quotes: apos,apos,quot,quot
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.text
new file mode 100644
index 0000000..279b511
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_char.text
@@ -0,0 +1 @@
+This "is" 'the' A&O. &copy; 2008 by me &#343; and &#x3bb;
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_input.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_input.html
new file mode 100644
index 0000000..d2eec9d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_input.html
@@ -0,0 +1 @@
+<p>This is the A&amp;O. &copy; 2008 by me &#343; and &#x3bb;</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_input.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_input.options
new file mode 100644
index 0000000..036c561
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_input.options
@@ -0,0 +1 @@
+:entity_output: :as_input
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_input.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_input.text
new file mode 100644
index 0000000..1ddf7cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_as_input.text
@@ -0,0 +1 @@
+This is the A&O. &copy; 2008 by me &#343; and &#x3bb;
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_numeric.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_numeric.html
new file mode 100644
index 0000000..d04613e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_numeric.html
@@ -0,0 +1 @@
+<p>This is the A&amp;O. &#169; 2008 by me &#343; and &#955;</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_numeric.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_numeric.options
new file mode 100644
index 0000000..2e6e0a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_numeric.options
@@ -0,0 +1 @@
+:entity_output: :numeric
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_numeric.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_numeric.text
new file mode 100644
index 0000000..1ddf7cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_numeric.text
@@ -0,0 +1 @@
+This is the A&O. &copy; 2008 by me &#343; and &#x3bb;
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_symbolic.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_symbolic.html
new file mode 100644
index 0000000..258ba14
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_symbolic.html
@@ -0,0 +1 @@
+<p>This is the A&amp;O. &copy; 2008 by me &#343; and &lambda;</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_symbolic.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_symbolic.options
new file mode 100644
index 0000000..c195785
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_symbolic.options
@@ -0,0 +1 @@
+:entity_output: :symbolic
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_symbolic.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_symbolic.text
new file mode 100644
index 0000000..1ddf7cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/entities_symbolic.text
@@ -0,0 +1 @@
+This is the A&O. &copy; 2008 by me &#343; and &#x3bb;
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/greaterthan.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/greaterthan.html
new file mode 100644
index 0000000..dcce4cc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/greaterthan.html
@@ -0,0 +1 @@
+<p>2 &gt; 1 &gt; 0</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/greaterthan.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/greaterthan.text
new file mode 100644
index 0000000..7dfb7f1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/greaterthan.text
@@ -0,0 +1 @@
+2 > 1 > 0
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/lowerthan.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/lowerthan.html
new file mode 100644
index 0000000..8ebac23
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/lowerthan.html
@@ -0,0 +1 @@
+<p>0 &lt; 1 &lt; 2</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/lowerthan.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/lowerthan.text
new file mode 100644
index 0000000..038df8b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/lowerthan.text
@@ -0,0 +1 @@
+0 < 1 < 2
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/typography.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/typography.html
new file mode 100644
index 0000000..02d1dbc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/typography.html
@@ -0,0 +1,40 @@
+<p>This is&hellip; something&mdash;this too&ndash;!</p>
+
+<p>This &laquo;is&raquo; some text, &laquo;&nbsp;this&nbsp;&raquo; too!</p>
+
+<p>&ldquo;Fancy quotes&rdquo; are &lsquo;cool&rsquo;, even in the &rsquo;80s!
+Je t&rsquo; aime. You&rsquo;re a funny one! Thomas&rsquo; name
+Mark&rsquo;s name. &ldquo;&hellip;you&rdquo;
+&ldquo;&lsquo;Nested&rsquo; quotes are &lsquo;possible&rsquo;&rdquo;, too!
+&lsquo;&ldquo;Otherway&rdquo; is &ldquo;round&rdquo;&rsquo;!</p>
+
+<p>&lsquo;Opening now!&rsquo;</p>
+
+<p>&rsquo;80s are really cool.</p>
+
+<p><em>Cluster</em>&rsquo;s Last Stand.</p>
+
+<p>Nam liber tempor
+&ldquo;&hellip;At vero eos et accusam&rdquo;</p>
+
+<p>&ldquo;<em>Single underscores</em> should work.&rdquo;</p>
+
+<p>&ldquo;<em>Single asterisks</em> should work.&rdquo;</p>
+
+<p>&lsquo;<strong>Double underscores</strong> should work.&rsquo;</p>
+
+<p>&lsquo;<strong>Double asterisks</strong> should work.&rsquo;</p>
+
+<p>&ldquo;<em>Hurrah!</em>&rdquo;</p>
+
+<p>&lsquo;<strong>Absolutely</strong>.&rsquo;</p>
+
+<p>&ldquo;&hellip;some Text&rdquo;</p>
+
+<p>&ldquo;&hellip; some Text&rdquo;</p>
+
+<p>This: &ldquo;&hellip;some Text&rdquo;</p>
+
+<p>This: &ldquo;&hellip; some Text&rdquo;</p>
+
+<p>&rdquo;[foo]&rdquo; &ldquo;[foo]&rdquo; d &ldquo;[foo]&rdquo;</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/typography.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/typography.options
new file mode 100644
index 0000000..4f1c17c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/typography.options
@@ -0,0 +1 @@
+:entity_output: symbolic
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/typography.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/typography.text
new file mode 100644
index 0000000..27e090e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases/span/text_substitutions/typography.text
@@ -0,0 +1,40 @@
+This is... something---this too--!
+
+This <<is>> some text, << this >> too!
+
+"Fancy quotes" are 'cool', even in the '80s!
+Je t' aime. You're a funny one! Thomas' name
+Mark's name. "...you"
+"'Nested' quotes are 'possible'", too!
+'"Otherway" is "round"'!
+
+'Opening now!'
+
+'80s are really cool.
+
+<em>Cluster</em>'s Last Stand.
+
+Nam liber tempor
+"...At vero eos et accusam"
+
+"_Single underscores_ should work."
+
+"*Single asterisks* should work."
+
+'__Double underscores__ should work.'
+
+'**Double asterisks** should work.'
+
+"_Hurrah!_"
+
+'__Absolutely__.'
+
+"...some Text"
+
+"... some Text"
+
+This: "...some Text"
+
+This: "... some Text"
+
+"\[foo]" "\[foo]" d "\[foo]"
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/atx_header.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/atx_header.html
new file mode 100644
index 0000000..776d7a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/atx_header.html
@@ -0,0 +1,3 @@
+<h1>header</h1>
+
+<p>#no header</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/atx_header.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/atx_header.text
new file mode 100644
index 0000000..5e70e2b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/atx_header.text
@@ -0,0 +1,3 @@
+# header
+
+#no header
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_disable_highlighting.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_disable_highlighting.html
new file mode 100644
index 0000000..8390d09
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_disable_highlighting.html
@@ -0,0 +1,2 @@
+<pre><code class="language-ruby">Kramdown::Document.new(text, :input =&gt; 'GFM')
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_disable_highlighting.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_disable_highlighting.options
new file mode 100644
index 0000000..72e9bc1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_disable_highlighting.options
@@ -0,0 +1 @@
+:enable_coderay: false
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_disable_highlighting.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_disable_highlighting.text
new file mode 100644
index 0000000..98cf3a8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_disable_highlighting.text
@@ -0,0 +1,3 @@
+```ruby
+Kramdown::Document.new(text, :input => 'GFM')
+```
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_syntax.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_syntax.html
new file mode 100644
index 0000000..8c1079d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_syntax.html
@@ -0,0 +1,20 @@
+<pre><code>Three backticks
+</code></pre>
+
+<pre><code>Four backticks
+</code></pre>
+
+<pre><code>Unbalanced bottom heavy
+</code></pre>
+
+<div class="language-ruby highlighter-coderay"><div class="CodeRay">
+  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>language no space
+</pre></div>
+</div>
+</div>
+
+<div class="language-ruby highlighter-coderay"><div class="CodeRay">
+  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>language with space
+</pre></div>
+</div>
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_syntax.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_syntax.text
new file mode 100644
index 0000000..fb5c611
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/backticks_syntax.text
@@ -0,0 +1,19 @@
+```
+Three backticks
+```
+
+````
+Four backticks
+````
+
+```
+Unbalanced bottom heavy
+``````
+
+````ruby
+language no space
+````
+
+```` ruby
+language with space
+````
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/codeblock_fenced.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/codeblock_fenced.html
new file mode 100644
index 0000000..0bdefdc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/codeblock_fenced.html
@@ -0,0 +1,20 @@
+<p>normal</p>
+
+<pre><code class="language-ruby">require 'kramdown'
+
+Kramdown::Document.new(text).to_html
+</code></pre>
+
+<p>indent with tab</p>
+
+<pre><code>```ruby
+require 'kramdown'
+
+Kramdown::Document.new(text).to_html
+```
+</code></pre>
+
+<p>indent with 2 spaces</p>
+
+<pre><code class="language-js">  console.log("hello");
+</code></pre>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/codeblock_fenced.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/codeblock_fenced.options
new file mode 100644
index 0000000..72e9bc1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/codeblock_fenced.options
@@ -0,0 +1 @@
+:enable_coderay: false
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/codeblock_fenced.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/codeblock_fenced.text
new file mode 100644
index 0000000..5e3e192
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/codeblock_fenced.text
@@ -0,0 +1,21 @@
+normal
+
+```ruby
+require 'kramdown'
+
+Kramdown::Document.new(text).to_html
+```
+
+indent with tab
+
+	```ruby
+	require 'kramdown'
+
+	Kramdown::Document.new(text).to_html
+	```
+
+indent with 2 spaces
+
+  ```js
+  console.log("hello");
+  ```
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks.html
new file mode 100644
index 0000000..1dfb2f0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks.html
@@ -0,0 +1,3 @@
+<p>one<br />
+<em>two</em><br />
+three</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks.text
new file mode 100644
index 0000000..f1287bd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks.text
@@ -0,0 +1,3 @@
+one
+_two_
+three
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks_off.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks_off.html
new file mode 100644
index 0000000..e1dba2b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks_off.html
@@ -0,0 +1,2 @@
+<p>This is just a normal paragraph.<br />
+Containing a manual line break above.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks_off.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks_off.options
new file mode 100644
index 0000000..f2da683
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks_off.options
@@ -0,0 +1 @@
+:hard_wrap: false
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks_off.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks_off.text
new file mode 100644
index 0000000..2fe88b9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/hard_line_breaks_off.text
@@ -0,0 +1,2 @@
+This is just a normal paragraph.  
+Containing a manual line break above.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.html
new file mode 100644
index 0000000..1e52650
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.html
@@ -0,0 +1,27 @@
+<h3 id="myid">test</h3>
+
+<h3 id="variable_name">variable_name</h3>
+
+<h3 id="abc-def-">abc def öúß</h3>
+
+<h3 id="192-abc-192">192 abc 192</h3>
+
+<h3>;.;;</h3>
+
+<h3 id="variable_name-1">variable_name</h3>
+
+<h3 id="variable_name-2">variable_name</h3>
+
+<h3 id="-1">;;</h3>
+
+<h3 id="before--after-tab">before 	after tab</h3>
+
+<h3 id="with-code">with <code>code</code></h3>
+
+<h3 id="with-space">with &nbsp;&auml;&nbsp;space</h3>
+
+<h3 id="with-smart-quotes">With &#8220;smart&#8221; quotes</h3>
+
+<h3 id="with--typographic--symbols">with &#8212; &#171;&#160;typographic&#160;&#187; &#8230; symbols</h3>
+
+<h3 id="with-m5">with <script type="math/tex">m=5</script></h3>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.html.19
new file mode 100644
index 0000000..b45fe8f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.html.19
@@ -0,0 +1,27 @@
+<h3 id="myid">test</h3>
+
+<h3 id="variable_name">variable_name</h3>
+
+<h3 id="abc-def-öúß">abc def öúß</h3>
+
+<h3 id="192-abc-192">192 abc 192</h3>
+
+<h3>;.;;</h3>
+
+<h3 id="variable_name-1">variable_name</h3>
+
+<h3 id="variable_name-2">variable_name</h3>
+
+<h3 id="-1">;;</h3>
+
+<h3 id="before--after-tab">before 	after tab</h3>
+
+<h3 id="with-code">with <code>code</code></h3>
+
+<h3 id="with-äspace">with  ä space</h3>
+
+<h3 id="with-smart-quotes">With “smart” quotes</h3>
+
+<h3 id="with--typographic--symbols">with — « typographic » … symbols</h3>
+
+<h3 id="with-m5">with <script type="math/tex">m=5</script></h3>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.options
new file mode 100644
index 0000000..8776b55
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.options
@@ -0,0 +1 @@
+:auto_ids: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.text
new file mode 100644
index 0000000..0a89c0b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids.text
@@ -0,0 +1,27 @@
+### test {#myid}
+
+### variable_name
+
+### abc def öúß
+
+### 192 abc 192
+
+### ;.;;
+
+### variable_name
+
+### variable_name
+
+### ;;
+
+### before 	after tab
+
+### with `code`
+
+### with &nbsp;&auml;&nbsp;space
+
+### With "smart" quotes
+
+### with --- << typographic >> ... symbols
+
+### with $$m=5$$
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids_with_prefix.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids_with_prefix.html
new file mode 100644
index 0000000..4aab072
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids_with_prefix.html
@@ -0,0 +1,3 @@
+<h1 id="hallo-header-1">Header 1</h1>
+
+<h1 id="hallo-123">123</h1>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids_with_prefix.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids_with_prefix.options
new file mode 100644
index 0000000..f37255d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids_with_prefix.options
@@ -0,0 +1,2 @@
+:auto_ids: true
+:auto_id_prefix: hallo-
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids_with_prefix.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids_with_prefix.text
new file mode 100644
index 0000000..acf09fe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/header_ids_with_prefix.text
@@ -0,0 +1,3 @@
+# Header 1
+
+# 123
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end-disabled.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end-disabled.html
new file mode 100644
index 0000000..41dfb3a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end-disabled.html
@@ -0,0 +1,31 @@
+<p>A<br />
+  - b</p>
+
+<p>This is a list<br />
+- or is it</p>
+
+<p>blockquote<br />
+&gt; text</p>
+
+<p>header<br />
+# text</p>
+
+<p>codeblock fenced<br />
+<code>
+puts hello world
+</code></p>
+
+<ul>
+  <li>
+    <p>level 1<br />
+some text</p>
+
+    <p>begin level 2<br />
+* level 2<br />
+* level 2</p>
+  </li>
+</ul>
+
+<h1 id="h1">h1</h1>
+<p>## h2<br />
+### h3</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end-disabled.options b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end-disabled.options
new file mode 100644
index 0000000..704f643
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end-disabled.options
@@ -0,0 +1 @@
+:gfm_quirks: []
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end-disabled.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end-disabled.text
new file mode 100644
index 0000000..4e09e03
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end-disabled.text
@@ -0,0 +1,27 @@
+A
+  - b
+
+This is a list
+- or is it
+
+blockquote
+> text
+
+header
+# text
+
+codeblock fenced
+```
+puts hello world
+```
+
+* level 1
+  some text
+
+  begin level 2
+  * level 2
+  * level 2
+
+# h1
+## h2
+### h3
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end.html
new file mode 100644
index 0000000..c337d61
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end.html
@@ -0,0 +1,38 @@
+<p>A</p>
+<ul>
+  <li>b</li>
+</ul>
+
+<p>This is a list</p>
+<ul>
+  <li>or is it</li>
+</ul>
+
+<p>blockquote</p>
+<blockquote>
+  <p>text</p>
+</blockquote>
+
+<p>header</p>
+<h1>text</h1>
+
+<p>codeblock fenced</p>
+<pre><code>puts hello world
+</code></pre>
+
+<ul>
+  <li>
+    <p>level 1<br />
+some text</p>
+
+    <p>begin level 2</p>
+    <ul>
+      <li>level 2</li>
+      <li>level 2</li>
+    </ul>
+  </li>
+</ul>
+
+<h1>h1</h1>
+<h2>h2</h2>
+<h3>h3</h3>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end.text
new file mode 100644
index 0000000..4e09e03
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/paragraph_end.text
@@ -0,0 +1,27 @@
+A
+  - b
+
+This is a list
+- or is it
+
+blockquote
+> text
+
+header
+# text
+
+codeblock fenced
+```
+puts hello world
+```
+
+* level 1
+  some text
+
+  begin level 2
+  * level 2
+  * level 2
+
+# h1
+## h2
+### h3
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/strikethrough.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/strikethrough.html
new file mode 100644
index 0000000..dad32ab
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/strikethrough.html
@@ -0,0 +1,27 @@
+<p><del>This is a test</del></p>
+
+<p>~<del>This is another test</del>~</p>
+
+<p><del>This is yet another test</del>~</p>
+
+<p>~~ This is a test of it NOT working ~~</p>
+
+<p>~~<br />
+This<br />
+is<br />
+a<br />
+<strong>multiline</strong><br />
+test<br />
+~~</p>
+
+<p>This is an <del><em>inline</em> <strong>strikethrough</strong></del> test</p>
+
+<p>This is an ~~escaped~~ strikethrough.</p>
+
+<p>This is a <del>strikethrough with a ~ in the middle</del></p>
+
+<p>I <del>don&#8217;t even</del>~ have an extra tilde.</p>
+
+<p>This should ~~not be struck.</p>
+
+<p>This <del>is a complex <em>strike</em> through *test ~~with nesting</del> involved* here~~.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/strikethrough.html.19 b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/strikethrough.html.19
new file mode 100644
index 0000000..ed28995
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/strikethrough.html.19
@@ -0,0 +1,27 @@
+<p><del>This is a test</del></p>
+
+<p>~<del>This is another test</del>~</p>
+
+<p><del>This is yet another test</del>~</p>
+
+<p>~~ This is a test of it NOT working ~~</p>
+
+<p>~~<br />
+This<br />
+is<br />
+a<br />
+<strong>multiline</strong><br />
+test<br />
+~~</p>
+
+<p>This is an <del><em>inline</em> <strong>strikethrough</strong></del> test</p>
+
+<p>This is an ~~escaped~~ strikethrough.</p>
+
+<p>This is a <del>strikethrough with a ~ in the middle</del></p>
+
+<p>I <del>don’t even</del>~ have an extra tilde.</p>
+
+<p>This should ~~not be struck.</p>
+
+<p>This <del>is a complex <em>strike</em> through *test ~~with nesting</del> involved* here~~.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/strikethrough.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/strikethrough.text
new file mode 100644
index 0000000..fbeffc6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/strikethrough.text
@@ -0,0 +1,27 @@
+~~This is a test~~
+
+~~~This is another test~~~
+
+~~This is yet another test~~~
+
+~~ This is a test of it NOT working ~~
+
+~~
+This
+is
+a
+**multiline**
+test
+~~
+
+This is an ~~_inline_ **strikethrough**~~ test
+
+This is an \~~escaped~~ strikethrough.
+
+This is a ~~strikethrough with a ~ in the middle~~
+
+I ~~don't even~~~ have an extra tilde.
+
+This should ~~not be struck.
+
+This ~~is a complex *strike* through *test ~~with nesting~~ involved* here~~.
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/two_para_hard_line_breaks.html b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/two_para_hard_line_breaks.html
new file mode 100644
index 0000000..d5ba2e4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/two_para_hard_line_breaks.html
@@ -0,0 +1,4 @@
+<p>This is just a normal paragraph.  <br />
+Containing a line break.</p>
+
+<p>Another paragraph.</p>
diff --git a/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/two_para_hard_line_breaks.text b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/two_para_hard_line_breaks.text
new file mode 100644
index 0000000..6b3d7c5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/kramdown-1.14.0/test/testcases_gfm/two_para_hard_line_breaks.text
@@ -0,0 +1,4 @@
+This is just a normal paragraph.  
+Containing a line break.
+
+Another paragraph.
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/History.md b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/History.md
new file mode 100644
index 0000000..f317aec
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/History.md
@@ -0,0 +1,232 @@
+# Liquid Change Log
+
+## 4.0.0 / not yet released / branch "master"
+
+### Changed
+* Render an opaque internal error by default for non-Liquid::Error (#835) [Dylan Thacker-Smith]
+* Ruby 2.0 support dropped (#832) [Dylan Thacker-Smith]
+* Add to_number Drop method to allow custom drops to work with number filters (#731)
+* Add strict_variables and strict_filters options to detect undefined references (#691)
+* Improve loop performance (#681) [Florian Weingarten]
+* Rename Drop method `before_method` to `liquid_method_missing` (#661) [Thierry Joyal]
+* Add url_decode filter to invert url_encode (#645) [Larry Archer]
+* Add global_filter to apply a filter to all output (#610) [Loren Hale]
+* Add compact filter (#600) [Carson Reinke]
+* Rename deprecated "has_key?" and "has_interrupt?" methods (#593) [Florian Weingarten]
+* Include template name with line numbers in render errors (574) [Dylan Thacker-Smith]
+* Add sort_natural filter (#554) [Martin Hanzel]
+* Add forloop.parentloop as a reference to the parent loop (#520) [Justin Li]
+* Block parsing moved to BlockBody class (#458) [Dylan Thacker-Smith]
+* Add concat filter to concatenate arrays (#429) [Diogo Beato]
+* Ruby 1.9 support dropped (#491) [Justin Li]
+* Liquid::Template.file_system's read_template_file method is no longer passed the context. (#441) [James Reid-Smith]
+* Remove support for `liquid_methods`
+* Liquid::Template.register_filter raises when the module overrides registered public methods as private or protected (#705) [Gaurav Chande]
+
+### Fixed
+* Fix map filter when value is a Proc (#672) [Guillaume Malette]
+* Fix truncate filter when value is not a string (#672) [Guillaume Malette]
+* Fix behaviour of escape filter when input is nil (#665) [Tanel Jakobsoo]
+* Fix sort filter behaviour with empty array input (#652) [Marcel Cary]
+* Fix test failure under certain timezones (#631) [Dylan Thacker-Smith]
+* Fix bug in uniq filter (#595) [Florian Weingarten]
+* Fix bug when "blank" and "empty" are used as variable names (#592) [Florian Weingarten]
+* Fix condition parse order in strict mode (#569) [Justin Li]
+* Fix naming of the "context variable" when dynamically including a template (#559) [Justin Li]
+* Gracefully accept empty strings in the date filter (#555) [Loren Hale]
+* Fix capturing into variables with a hyphen in the name (#505) [Florian Weingarten]
+* Fix case sensitivity regression in date standard filter (#499) [Kelley Reynolds]
+* Disallow filters with no variable in strict mode (#475) [Justin Li]
+* Disallow variable names in the strict parser that are not valid in the lax parser (#463) [Justin Li]
+* Fix BlockBody#warnings taking exponential time to compute (#486) [Justin Li]
+
+## 3.0.5 / 2015-07-23 / branch "3-0-stable"
+
+* Fix test failure under certain timezones [Dylan Thacker-Smith]
+
+## 3.0.4 / 2015-07-17
+
+* Fix chained access to multi-dimensional hashes [Florian Weingarten]
+
+## 3.0.3 / 2015-05-28
+
+* Fix condition parse order in strict mode (#569) [Justin Li]
+
+## 3.0.2 / 2015-04-24
+
+* Expose VariableLookup private members (#551) [Justin Li]
+* Documentation fixes
+
+## 3.0.1 / 2015-01-23
+
+* Remove duplicate `index0` key in TableRow tag (#502) [Alfred Xing]
+
+## 3.0.0 / 2014-11-12
+
+* Removed Block#end_tag. Instead, override parse with `super` followed by your code. See #446 [Dylan Thacker-Smith]
+* Fixed condition with wrong data types (#423) [Bogdan Gusiev]
+* Add url_encode to standard filters (#421) [Derrick Reimer]
+* Add uniq to standard filters [Florian Weingarten]
+* Add exception_handler feature (#397) and #254 [Bogdan Gusiev, Florian Weingarten]
+* Optimize variable parsing to avoid repeated regex evaluation during template rendering #383 [Jason Hiltz-Laforge]
+* Optimize checking for block interrupts to reduce object allocation #380 [Jason Hiltz-Laforge]
+* Properly set context rethrow_errors on render! #349 [Thierry Joyal]
+* Fix broken rendering of variables which are equal to false (#345) [Florian Weingarten]
+* Remove ActionView template handler [Dylan Thacker-Smith]
+* Freeze lots of string literals for new Ruby 2.1 optimization (#297) [Florian Weingarten]
+* Allow newlines in tags and variables (#324) [Dylan Thacker-Smith]
+* Tag#parse is called after initialize, which now takes options instead of tokens as the 3rd argument. See #321 [Dylan Thacker-Smith]
+* Raise `Liquid::ArgumentError` instead of `::ArgumentError` when filter has wrong number of arguments #309 [Bogdan Gusiev]
+* Add a to_s default for liquid drops (#306) [Adam Doeler]
+* Add strip, lstrip, and rstrip to standard filters [Florian Weingarten]
+* Make if, for & case tags return complete and consistent nodelists (#250) [Nick Jones]
+* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith]
+* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl]
+* Fix resource counting bug with respond_to?(:length) (#263) [Florian Weingarten]
+* Allow specifying custom patterns for template filenames (#284) [Andrei Gladkyi]
+* Allow drops to optimize loading a slice of elements (#282) [Tom Burns]
+* Support for passing variables to snippets in subdirs (#271) [Joost Hietbrink]
+* Add a class cache to avoid runtime extend calls (#249) [James Tucker]
+* Remove some legacy Ruby 1.8 compatibility code (#276) [Florian Weingarten]
+* Add default filter to standard filters (#267) [Derrick Reimer]
+* Add optional strict parsing and warn parsing (#235) [Tristan Hume]
+* Add I18n syntax error translation (#241) [Simon Hørup Eskildsen, Sirupsen]
+* Make sort filter work on enumerable drops (#239) [Florian Weingarten]
+* Fix clashing method names in enumerable drops (#238) [Florian Weingarten]
+* Make map filter work on enumerable drops (#233) [Florian Weingarten]
+* Improved whitespace stripping for blank blocks, related to #216 [Florian Weingarten]
+
+## 2.6.3 / 2015-07-23 / branch "2-6-stable"
+
+* Fix test failure under certain timezones [Dylan Thacker-Smith]
+
+## 2.6.2 / 2015-01-23
+
+* Remove duplicate hash key [Parker Moore]
+
+## 2.6.1 / 2014-01-10
+
+Security fix, cherry-picked from master (4e14a65):
+* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl]
+* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith]
+
+## 2.6.0 / 2013-11-25
+
+IMPORTANT: Liquid 2.6 is going to be the last version of Liquid which maintains explicit Ruby 1.8 compatability.
+The following releases will only be tested against Ruby 1.9 and Ruby 2.0 and are likely to break on Ruby 1.8.
+
+* Bugfix for #106: fix example servlet [gnowoel]
+* Bugfix for #97: strip_html filter supports multi-line tags [Jo Liss]
+* Bugfix for #114: strip_html filter supports style tags [James Allardice]
+* Bugfix for #117: 'now' support for date filter in Ruby 1.9 [Notre Dame Webgroup]
+* Bugfix for #166: truncate filter on UTF-8 strings with Ruby 1.8 [Florian Weingarten]
+* Bugfix for #204: 'raw' parsing bug [Florian Weingarten]
+* Bugfix for #150: 'for' parsing bug [Peter Schröder]
+* Bugfix for #126: Strip CRLF in strip_newline [Peter Schröder]
+* Bugfix for #174, "can't convert Fixnum into String" for "replace" [jsw0528]
+* Allow a Liquid::Drop to be passed into Template#render [Daniel Huckstep]
+* Resource limits [Florian Weingarten]
+* Add reverse filter [Jay Strybis]
+* Add utf-8 support
+* Use array instead of Hash to keep the registered filters [Tasos Stathopoulos]
+* Cache tokenized partial templates [Tom Burns]
+* Avoid warnings in Ruby 1.9.3 [Marcus Stollsteimer]
+* Better documentation for 'include' tag (closes #163) [Peter Schröder]
+* Use of BigDecimal on filters to have better precision (closes #155) [Arthur Nogueira Neves]
+
+## 2.5.5 / 2014-01-10 / branch "2-5-stable"
+
+Security fix, cherry-picked from master (4e14a65):
+* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl]
+* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith]
+
+## 2.5.4 / 2013-11-11
+
+* Fix "can't convert Fixnum into String" for "replace" (#173), [jsw0528]
+
+## 2.5.3 / 2013-10-09
+
+* #232, #234, #237: Fix map filter bugs [Florian Weingarten]
+
+## 2.5.2 / 2013-09-03 / deleted
+
+Yanked from rubygems, as it contained too many changes that broke compatibility. Those changes will be on following major releases.
+
+## 2.5.1 / 2013-07-24
+
+* #230: Fix security issue with map filter, Use invoke_drop in map filter [Florian Weingarten]
+
+## 2.5.0 / 2013-03-06
+
+* Prevent Object methods from being called on drops
+* Avoid symbol injection from liquid
+* Added break and continue statements
+* Fix filter parser for args without space separators
+* Add support for filter keyword arguments
+
+
+## 2.4.0 / 2012-08-03
+
+* Performance improvements
+* Allow filters in `assign`
+* Add `modulo` filter
+* Ruby 1.8, 1.9, and Rubinius compatibility fixes
+* Add support for `quoted['references']` in `tablerow`
+* Add support for Enumerable to `tablerow`
+* `strip_html` filter removes html comments
+
+
+## 2.3.0 / 2011-10-16
+
+* Several speed/memory improvements
+* Numerous bug fixes
+* Added support for MRI 1.9, Rubinius, and JRuby
+* Added support for integer drop parameters
+* Added epoch support to `date` filter
+* New `raw` tag that suppresses parsing
+* Added `else` option to `for` tag
+* New `increment` tag
+* New `split` filter
+
+
+## 2.2.1 / 2010-08-23
+
+* Added support for literal tags
+
+
+## 2.2.0 / 2010-08-22
+
+* Compatible with Ruby 1.8.7, 1.9.1 and 1.9.2-p0
+* Merged some changed made by the community
+
+
+## 1.9.0 / 2008-03-04
+
+* Fixed gem install rake task
+* Improve Error encapsulation in liquid by maintaining a own set of exceptions instead of relying on ruby build ins
+
+
+## Before 1.9.0
+
+* Added If with or / and expressions
+* Implemented .to_liquid for all objects which can be passed to liquid like Strings Arrays Hashes Numerics and Booleans. To export new objects to liquid just implement .to_liquid on them and return objects which themselves have .to_liquid methods.
+* Added more tags to standard library
+* Added include tag ( like partials in rails )
+* [...] Gazillion of detail improvements
+* Added strainers as filter hosts for better security [Tobias Luetke]
+* Fixed that rails integration would call filter with the wrong "self" [Michael Geary]
+* Fixed bad error reporting when a filter called a method which doesn't exist. Liquid told you that it couldn't find the filter which was obviously misleading [Tobias Luetke]
+* Removed count helper from standard lib. use size [Tobias Luetke]
+* Fixed bug with string filter parameters failing to tolerate commas in strings. [Paul Hammond]
+* Improved filter parameters. Filter parameters are now context sensitive; Types are resolved according to the rules of the context. Multiple parameters are now separated by the Liquid::ArgumentSeparator: , by default [Paul Hammond]
+    {{ 'Typo' | link_to: 'http://typo.leetsoft.com', 'Typo - a modern weblog engine' }}
+* Added Liquid::Drop. A base class which you can use for exporting proxy objects to liquid which can acquire more data when used in liquid. [Tobias Luetke]
+
+  class ProductDrop < Liquid::Drop
+    def top_sales
+       Shop.current.products.find(:all, :order => 'sales', :limit => 10 )
+    end
+  end
+  t = Liquid::Template.parse( ' {% for product in product.top_sales %} {{ product.name }} {% endfor %} '  )
+  t.render('product' => ProductDrop.new )
+* Added filter parameters support. Example: {{ date | format_date: "%Y" }} [Paul Hammond]
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/LICENSE b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/LICENSE
new file mode 100644
index 0000000..926b04e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2005, 2006 Tobias Luetke
+
+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/bundle/ruby/2.4.0/gems/liquid-4.0.0/README.md b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/README.md
new file mode 100644
index 0000000..877fdf6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/README.md
@@ -0,0 +1,106 @@
+[![Build Status](https://api.travis-ci.org/Shopify/liquid.svg?branch=master)](http://travis-ci.org/Shopify/liquid)
+[![Inline docs](http://inch-ci.org/github/Shopify/liquid.svg?branch=master)](http://inch-ci.org/github/Shopify/liquid)
+
+# Liquid template engine
+
+* [Contributing guidelines](CONTRIBUTING.md)
+* [Version history](History.md)
+* [Liquid documentation from Shopify](http://docs.shopify.com/themes/liquid-basics)
+* [Liquid Wiki at GitHub](https://github.com/Shopify/liquid/wiki)
+* [Website](http://liquidmarkup.org/)
+
+## Introduction
+
+Liquid is a template engine which was written with very specific requirements:
+
+* It has to have beautiful and simple markup. Template engines which don't produce good looking markup are no fun to use.
+* It needs to be non evaling and secure. Liquid templates are made so that users can edit them. You don't want to run code on your server which your users wrote.
+* It has to be stateless. Compile and render steps have to be separate so that the expensive parsing and compiling can be done once and later on you can just render it passing in a hash with local variables and objects.
+
+## Why you should use Liquid
+
+* You want to allow your users to edit the appearance of your application but don't want them to run **insecure code on your server**.
+* You want to render templates directly from the database.
+* You like smarty (PHP) style template engines.
+* You need a template engine which does HTML just as well as emails.
+* You don't like the markup of your current templating engine.
+
+## What does it look like?
+
+```html
+<ul id="products">
+  {% for product in products %}
+    <li>
+      <h2>{{ product.name }}</h2>
+      Only {{ product.price | price }}
+
+      {{ product.description | prettyprint | paragraph }}
+    </li>
+  {% endfor %}
+</ul>
+```
+
+## How to use Liquid
+
+Liquid supports a very simple API based around the Liquid::Template class.
+For standard use you can just pass it the content of a file and call render with a parameters hash.
+
+```ruby
+@template = Liquid::Template.parse("hi {{name}}") # Parses and compiles the template
+@template.render('name' => 'tobi')                # => "hi tobi"
+```
+
+### Error Modes
+
+Setting the error mode of Liquid lets you specify how strictly you want your templates to be interpreted.
+Normally the parser is very lax and will accept almost anything without error. Unfortunately this can make
+it very hard to debug and can lead to unexpected behaviour. 
+
+Liquid also comes with a stricter parser that can be used when editing templates to give better error messages
+when templates are invalid. You can enable this new parser like this:
+
+```ruby
+Liquid::Template.error_mode = :strict # Raises a SyntaxError when invalid syntax is used
+Liquid::Template.error_mode = :warn # Adds errors to template.errors but continues as normal
+Liquid::Template.error_mode = :lax # The default mode, accepts almost anything.
+```
+
+If you want to set the error mode only on specific templates you can pass `:error_mode` as an option to `parse`:
+```ruby
+Liquid::Template.parse(source, :error_mode => :strict)
+```
+This is useful for doing things like enabling strict mode only in the theme editor.
+
+It is recommended that you enable `:strict` or `:warn` mode on new apps to stop invalid templates from being created.
+It is also recommended that you use it in the template editors of existing apps to give editors better error messages.
+
+### Undefined variables and filters
+
+By default, the renderer doesn't raise or in any other way notify you if some variables or filters are missing, i.e. not passed to the `render` method.
+You can improve this situation by passing `strict_variables: true` and/or `strict_filters: true` options to the `render` method.
+When one of these options is set to true, all errors about undefined variables and undefined filters will be stored in `errors` array of a `Liquid::Template` instance.
+Here are some examples:
+
+```ruby
+template = Liquid::Template.parse("{{x}} {{y}} {{z.a}} {{z.b}}")
+template.render({ 'x' => 1, 'z' => { 'a' => 2 } }, { strict_variables: true })
+#=> '1  2 ' # when a variable is undefined, it's rendered as nil
+template.errors
+#=> [#<Liquid::UndefinedVariable: Liquid error: undefined variable y>, #<Liquid::UndefinedVariable: Liquid error: undefined variable b>]
+```
+
+```ruby
+template = Liquid::Template.parse("{{x | filter1 | upcase}}")
+template.render({ 'x' => 'foo' }, { strict_filters: true })
+#=> '' # when at least one filter in the filter chain is undefined, a whole expression is rendered as nil
+template.errors
+#=> [#<Liquid::UndefinedFilter: Liquid error: undefined filter filter1>]
+```
+
+If you want to raise on a first exception instead of pushing all of them in `errors`, you can use `render!` method:
+
+```ruby
+template = Liquid::Template.parse("{{x}} {{y}}")
+template.render!({ 'x' => 1}, { strict_variables: true })
+#=> Liquid::UndefinedVariable: Liquid error: undefined variable y
+```
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid.rb
new file mode 100644
index 0000000..7d9da26
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid.rb
@@ -0,0 +1,79 @@
+# Copyright (c) 2005 Tobias Luetke
+#
+# 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.
+
+module Liquid
+  FilterSeparator             = /\|/
+  ArgumentSeparator           = ','.freeze
+  FilterArgumentSeparator     = ':'.freeze
+  VariableAttributeSeparator  = '.'.freeze
+  WhitespaceControl           = '-'.freeze
+  TagStart                    = /\{\%/
+  TagEnd                      = /\%\}/
+  VariableSignature           = /\(?[\w\-\.\[\]]\)?/
+  VariableSegment             = /[\w\-]/
+  VariableStart               = /\{\{/
+  VariableEnd                 = /\}\}/
+  VariableIncompleteEnd       = /\}\}?/
+  QuotedString                = /"[^"]*"|'[^']*'/
+  QuotedFragment              = /#{QuotedString}|(?:[^\s,\|'"]|#{QuotedString})+/o
+  TagAttributes               = /(\w+)\s*\:\s*(#{QuotedFragment})/o
+  AnyStartingTag              = /#{TagStart}|#{VariableStart}/o
+  PartialTemplateParser       = /#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableIncompleteEnd}/om
+  TemplateParser              = /(#{PartialTemplateParser}|#{AnyStartingTag})/om
+  VariableParser              = /\[[^\]]+\]|#{VariableSegment}+\??/o
+
+  singleton_class.send(:attr_accessor, :cache_classes)
+  self.cache_classes = true
+end
+
+require "liquid/version"
+require 'liquid/lexer'
+require 'liquid/parser'
+require 'liquid/i18n'
+require 'liquid/drop'
+require 'liquid/tablerowloop_drop'
+require 'liquid/forloop_drop'
+require 'liquid/extensions'
+require 'liquid/errors'
+require 'liquid/interrupts'
+require 'liquid/strainer'
+require 'liquid/expression'
+require 'liquid/context'
+require 'liquid/parser_switching'
+require 'liquid/tag'
+require 'liquid/block'
+require 'liquid/block_body'
+require 'liquid/document'
+require 'liquid/variable'
+require 'liquid/variable_lookup'
+require 'liquid/range_lookup'
+require 'liquid/file_system'
+require 'liquid/resource_limits'
+require 'liquid/template'
+require 'liquid/standardfilters'
+require 'liquid/condition'
+require 'liquid/utils'
+require 'liquid/tokenizer'
+require 'liquid/parse_context'
+
+# Load all the tags of the standard library
+#
+Dir["#{__dir__}/liquid/tags/*.rb"].each { |f| require f }
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/block.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/block.rb
new file mode 100644
index 0000000..eed0475
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/block.rb
@@ -0,0 +1,67 @@
+module Liquid
+  class Block < Tag
+    def initialize(tag_name, markup, options)
+      super
+      @blank = true
+    end
+
+    def parse(tokens)
+      @body = BlockBody.new
+      while parse_body(@body, tokens)
+      end
+    end
+
+    def render(context)
+      @body.render(context)
+    end
+
+    def blank?
+      @blank
+    end
+
+    def nodelist
+      @body.nodelist
+    end
+
+    def unknown_tag(tag, _params, _tokens)
+      case tag
+      when 'else'.freeze
+        raise SyntaxError.new(parse_context.locale.t("errors.syntax.unexpected_else".freeze,
+          block_name: block_name))
+      when 'end'.freeze
+        raise SyntaxError.new(parse_context.locale.t("errors.syntax.invalid_delimiter".freeze,
+          block_name: block_name,
+          block_delimiter: block_delimiter))
+      else
+        raise SyntaxError.new(parse_context.locale.t("errors.syntax.unknown_tag".freeze, tag: tag))
+      end
+    end
+
+    def block_name
+      @tag_name
+    end
+
+    def block_delimiter
+      @block_delimiter ||= "end#{block_name}"
+    end
+
+    protected
+
+    def parse_body(body, tokens)
+      body.parse(tokens, parse_context) do |end_tag_name, end_tag_params|
+        @blank &&= body.blank?
+
+        return false if end_tag_name == block_delimiter
+        unless end_tag_name
+          raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_never_closed".freeze, block_name: block_name))
+        end
+
+        # this tag is not registered with the system
+        # pass it to the current block for special handling or error reporting
+        unknown_tag(end_tag_name, end_tag_params, tokens)
+      end
+
+      true
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/block_body.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/block_body.rb
new file mode 100644
index 0000000..4e2a4c9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/block_body.rb
@@ -0,0 +1,139 @@
+module Liquid
+  class BlockBody
+    FullToken = /\A#{TagStart}#{WhitespaceControl}?\s*(\w+)\s*(.*?)#{WhitespaceControl}?#{TagEnd}\z/om
+    ContentOfVariable = /\A#{VariableStart}#{WhitespaceControl}?(.*?)#{WhitespaceControl}?#{VariableEnd}\z/om
+    TAGSTART = "{%".freeze
+    VARSTART = "{{".freeze
+
+    attr_reader :nodelist
+
+    def initialize
+      @nodelist = []
+      @blank = true
+    end
+
+    def parse(tokenizer, parse_context)
+      parse_context.line_number = tokenizer.line_number
+      while token = tokenizer.shift
+        unless token.empty?
+          case
+          when token.start_with?(TAGSTART)
+            whitespace_handler(token, parse_context)
+            if token =~ FullToken
+              tag_name = $1
+              markup = $2
+              # fetch the tag from registered blocks
+              if tag = registered_tags[tag_name]
+                new_tag = tag.parse(tag_name, markup, tokenizer, parse_context)
+                @blank &&= new_tag.blank?
+                @nodelist << new_tag
+              else
+                # end parsing if we reach an unknown tag and let the caller decide
+                # determine how to proceed
+                return yield tag_name, markup
+              end
+            else
+              raise_missing_tag_terminator(token, parse_context)
+            end
+          when token.start_with?(VARSTART)
+            whitespace_handler(token, parse_context)
+            @nodelist << create_variable(token, parse_context)
+            @blank = false
+          else
+            if parse_context.trim_whitespace
+              token.lstrip!
+            end
+            parse_context.trim_whitespace = false
+            @nodelist << token
+            @blank &&= !!(token =~ /\A\s*\z/)
+          end
+        end
+        parse_context.line_number = tokenizer.line_number
+      end
+
+      yield nil, nil
+    end
+
+    def whitespace_handler(token, parse_context)
+      if token[2] == WhitespaceControl
+        previous_token = @nodelist.last
+        if previous_token.is_a? String
+          previous_token.rstrip!
+        end
+      end
+      parse_context.trim_whitespace = (token[-3] == WhitespaceControl)
+    end
+
+    def blank?
+      @blank
+    end
+
+    def render(context)
+      output = []
+      context.resource_limits.render_score += @nodelist.length
+
+      @nodelist.each do |token|
+        # Break out if we have any unhanded interrupts.
+        break if context.interrupt?
+
+        begin
+          # If we get an Interrupt that means the block must stop processing. An
+          # Interrupt is any command that stops block execution such as {% break %}
+          # or {% continue %}
+          if token.is_a?(Continue) || token.is_a?(Break)
+            context.push_interrupt(token.interrupt)
+            break
+          end
+
+          node_output = render_node(token, context)
+
+          unless token.is_a?(Block) && token.blank?
+            output << node_output
+          end
+        rescue MemoryError => e
+          raise e
+        rescue UndefinedVariable, UndefinedDropMethod, UndefinedFilter => e
+          context.handle_error(e, token.line_number, token.raw)
+          output << nil
+        rescue ::StandardError => e
+          output << context.handle_error(e, token.line_number, token.raw)
+        end
+      end
+
+      output.join
+    end
+
+    private
+
+    def render_node(node, context)
+      node_output = (node.respond_to?(:render) ? node.render(context) : node)
+      node_output = node_output.is_a?(Array) ? node_output.join : node_output.to_s
+
+      context.resource_limits.render_length += node_output.length
+      if context.resource_limits.reached?
+        raise MemoryError.new("Memory limits exceeded".freeze)
+      end
+      node_output
+    end
+
+    def create_variable(token, parse_context)
+      token.scan(ContentOfVariable) do |content|
+        markup = content.first
+        return Variable.new(markup, parse_context)
+      end
+      raise_missing_variable_terminator(token, parse_context)
+    end
+
+    def raise_missing_tag_terminator(token, parse_context)
+      raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_termination".freeze, token: token, tag_end: TagEnd.inspect))
+    end
+
+    def raise_missing_variable_terminator(token, parse_context)
+      raise SyntaxError.new(parse_context.locale.t("errors.syntax.variable_termination".freeze, token: token, tag_end: VariableEnd.inspect))
+    end
+
+    def registered_tags
+      Template.tags
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/condition.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/condition.rb
new file mode 100644
index 0000000..9573f6b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/condition.rb
@@ -0,0 +1,132 @@
+module Liquid
+  # Container for liquid nodes which conveniently wraps decision making logic
+  #
+  # Example:
+  #
+  #   c = Condition.new(1, '==', 1)
+  #   c.evaluate #=> true
+  #
+  class Condition #:nodoc:
+    @@operators = {
+      '=='.freeze => ->(cond, left, right) {  cond.send(:equal_variables, left, right) },
+      '!='.freeze => ->(cond, left, right) { !cond.send(:equal_variables, left, right) },
+      '<>'.freeze => ->(cond, left, right) { !cond.send(:equal_variables, left, right) },
+      '<'.freeze  => :<,
+      '>'.freeze  => :>,
+      '>='.freeze => :>=,
+      '<='.freeze => :<=,
+      'contains'.freeze => lambda do |cond, left, right|
+        if left && right && left.respond_to?(:include?)
+          right = right.to_s if left.is_a?(String)
+          left.include?(right)
+        else
+          false
+        end
+      end
+    }
+
+    def self.operators
+      @@operators
+    end
+
+    attr_reader :attachment
+    attr_accessor :left, :operator, :right
+
+    def initialize(left = nil, operator = nil, right = nil)
+      @left = left
+      @operator = operator
+      @right = right
+      @child_relation  = nil
+      @child_condition = nil
+    end
+
+    def evaluate(context = Context.new)
+      result = interpret_condition(left, right, operator, context)
+
+      case @child_relation
+      when :or
+        result || @child_condition.evaluate(context)
+      when :and
+        result && @child_condition.evaluate(context)
+      else
+        result
+      end
+    end
+
+    def or(condition)
+      @child_relation = :or
+      @child_condition = condition
+    end
+
+    def and(condition)
+      @child_relation = :and
+      @child_condition = condition
+    end
+
+    def attach(attachment)
+      @attachment = attachment
+    end
+
+    def else?
+      false
+    end
+
+    def inspect
+      "#<Condition #{[@left, @operator, @right].compact.join(' '.freeze)}>"
+    end
+
+    private
+
+    def equal_variables(left, right)
+      if left.is_a?(Liquid::Expression::MethodLiteral)
+        if right.respond_to?(left.method_name)
+          return right.send(left.method_name)
+        else
+          return nil
+        end
+      end
+
+      if right.is_a?(Liquid::Expression::MethodLiteral)
+        if left.respond_to?(right.method_name)
+          return left.send(right.method_name)
+        else
+          return nil
+        end
+      end
+
+      left == right
+    end
+
+    def interpret_condition(left, right, op, context)
+      # If the operator is empty this means that the decision statement is just
+      # a single variable. We can just poll this variable from the context and
+      # return this as the result.
+      return context.evaluate(left) if op.nil?
+
+      left = context.evaluate(left)
+      right = context.evaluate(right)
+
+      operation = self.class.operators[op] || raise(Liquid::ArgumentError.new("Unknown operator #{op}"))
+
+      if operation.respond_to?(:call)
+        operation.call(self, left, right)
+      elsif left.respond_to?(operation) && right.respond_to?(operation)
+        begin
+          left.send(operation, right)
+        rescue ::ArgumentError => e
+          raise Liquid::ArgumentError.new(e.message)
+        end
+      end
+    end
+  end
+
+  class ElseCondition < Condition
+    def else?
+      true
+    end
+
+    def evaluate(_context)
+      true
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/context.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/context.rb
new file mode 100644
index 0000000..6ba2353
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/context.rb
@@ -0,0 +1,224 @@
+module Liquid
+  # Context keeps the variable stack and resolves variables, as well as keywords
+  #
+  #   context['variable'] = 'testing'
+  #   context['variable'] #=> 'testing'
+  #   context['true']     #=> true
+  #   context['10.2232']  #=> 10.2232
+  #
+  #   context.stack do
+  #      context['bob'] = 'bobsen'
+  #   end
+  #
+  #   context['bob']  #=> nil  class Context
+  class Context
+    attr_reader :scopes, :errors, :registers, :environments, :resource_limits
+    attr_accessor :exception_renderer, :template_name, :partial, :global_filter, :strict_variables, :strict_filters
+
+    def initialize(environments = {}, outer_scope = {}, registers = {}, rethrow_errors = false, resource_limits = nil)
+      @environments     = [environments].flatten
+      @scopes           = [(outer_scope || {})]
+      @registers        = registers
+      @errors           = []
+      @partial          = false
+      @strict_variables = false
+      @resource_limits  = resource_limits || ResourceLimits.new(Template.default_resource_limits)
+      squash_instance_assigns_with_environments
+
+      @this_stack_used = false
+
+      self.exception_renderer = Template.default_exception_renderer
+      if rethrow_errors
+        self.exception_renderer = ->(e) { raise }
+      end
+
+      @interrupts = []
+      @filters = []
+      @global_filter = nil
+    end
+
+    def warnings
+      @warnings ||= []
+    end
+
+    def strainer
+      @strainer ||= Strainer.create(self, @filters)
+    end
+
+    # Adds filters to this context.
+    #
+    # Note that this does not register the filters with the main Template object. see <tt>Template.register_filter</tt>
+    # for that
+    def add_filters(filters)
+      filters = [filters].flatten.compact
+      @filters += filters
+      @strainer = nil
+    end
+
+    def apply_global_filter(obj)
+      global_filter.nil? ? obj : global_filter.call(obj)
+    end
+
+    # are there any not handled interrupts?
+    def interrupt?
+      !@interrupts.empty?
+    end
+
+    # push an interrupt to the stack. this interrupt is considered not handled.
+    def push_interrupt(e)
+      @interrupts.push(e)
+    end
+
+    # pop an interrupt from the stack
+    def pop_interrupt
+      @interrupts.pop
+    end
+
+    def handle_error(e, line_number = nil, raw_token = nil)
+      e = internal_error unless e.is_a?(Liquid::Error)
+      e.template_name ||= template_name
+      e.line_number ||= line_number
+      errors.push(e)
+      exception_renderer.call(e).to_s
+    end
+
+    def invoke(method, *args)
+      strainer.invoke(method, *args).to_liquid
+    end
+
+    # Push new local scope on the stack. use <tt>Context#stack</tt> instead
+    def push(new_scope = {})
+      @scopes.unshift(new_scope)
+      raise StackLevelError, "Nesting too deep".freeze if @scopes.length > 100
+    end
+
+    # Merge a hash of variables in the current local scope
+    def merge(new_scopes)
+      @scopes[0].merge!(new_scopes)
+    end
+
+    # Pop from the stack. use <tt>Context#stack</tt> instead
+    def pop
+      raise ContextError if @scopes.size == 1
+      @scopes.shift
+    end
+
+    # Pushes a new local scope on the stack, pops it at the end of the block
+    #
+    # Example:
+    #   context.stack do
+    #      context['var'] = 'hi'
+    #   end
+    #
+    #   context['var]  #=> nil
+    def stack(new_scope = nil)
+      old_stack_used = @this_stack_used
+      if new_scope
+        push(new_scope)
+        @this_stack_used = true
+      else
+        @this_stack_used = false
+      end
+
+      yield
+    ensure
+      pop if @this_stack_used
+      @this_stack_used = old_stack_used
+    end
+
+    def clear_instance_assigns
+      @scopes[0] = {}
+    end
+
+    # Only allow String, Numeric, Hash, Array, Proc, Boolean or <tt>Liquid::Drop</tt>
+    def []=(key, value)
+      unless @this_stack_used
+        @this_stack_used = true
+        push({})
+      end
+      @scopes[0][key] = value
+    end
+
+    # Look up variable, either resolve directly after considering the name. We can directly handle
+    # Strings, digits, floats and booleans (true,false).
+    # If no match is made we lookup the variable in the current scope and
+    # later move up to the parent blocks to see if we can resolve the variable somewhere up the tree.
+    # Some special keywords return symbols. Those symbols are to be called on the rhs object in expressions
+    #
+    # Example:
+    #   products == empty #=> products.empty?
+    def [](expression)
+      evaluate(Expression.parse(expression))
+    end
+
+    def key?(key)
+      self[key] != nil
+    end
+
+    def evaluate(object)
+      object.respond_to?(:evaluate) ? object.evaluate(self) : object
+    end
+
+    # Fetches an object starting at the local scope and then moving up the hierachy
+    def find_variable(key)
+      # This was changed from find() to find_index() because this is a very hot
+      # path and find_index() is optimized in MRI to reduce object allocation
+      index = @scopes.find_index { |s| s.key?(key) }
+      scope = @scopes[index] if index
+
+      variable = nil
+
+      if scope.nil?
+        @environments.each do |e|
+          variable = lookup_and_evaluate(e, key)
+          unless variable.nil?
+            scope = e
+            break
+          end
+        end
+      end
+
+      scope ||= @environments.last || @scopes.last
+      variable ||= lookup_and_evaluate(scope, key)
+
+      variable = variable.to_liquid
+      variable.context = self if variable.respond_to?(:context=)
+
+      variable
+    end
+
+    def lookup_and_evaluate(obj, key)
+      if @strict_variables && obj.respond_to?(:key?) && !obj.key?(key)
+        raise Liquid::UndefinedVariable, "undefined variable #{key}"
+      end
+
+      value = obj[key]
+
+      if value.is_a?(Proc) && obj.respond_to?(:[]=)
+        obj[key] = (value.arity == 0) ? value.call : value.call(self)
+      else
+        value
+      end
+    end
+
+    private
+
+    def internal_error
+      # raise and catch to set backtrace and cause on exception
+      raise Liquid::InternalError, 'internal'
+    rescue Liquid::InternalError => exc
+      exc
+    end
+
+    def squash_instance_assigns_with_environments
+      @scopes.last.each_key do |k|
+        @environments.each do |env|
+          if env.key?(k)
+            scopes.last[k] = lookup_and_evaluate(env, k)
+            break
+          end
+        end
+      end
+    end # squash_instance_assigns_with_environments
+  end # Context
+end # Liquid
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/document.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/document.rb
new file mode 100644
index 0000000..d035dd4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/document.rb
@@ -0,0 +1,27 @@
+module Liquid
+  class Document < BlockBody
+    def self.parse(tokens, parse_context)
+      doc = new
+      doc.parse(tokens, parse_context)
+      doc
+    end
+
+    def parse(tokens, parse_context)
+      super do |end_tag_name, end_tag_params|
+        unknown_tag(end_tag_name, parse_context) if end_tag_name
+      end
+    rescue SyntaxError => e
+      e.line_number ||= parse_context.line_number
+      raise
+    end
+
+    def unknown_tag(tag, parse_context)
+      case tag
+      when 'else'.freeze, 'end'.freeze
+        raise SyntaxError.new(parse_context.locale.t("errors.syntax.unexpected_outer_tag".freeze, tag: tag))
+      else
+        raise SyntaxError.new(parse_context.locale.t("errors.syntax.unknown_tag".freeze, tag: tag))
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/drop.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/drop.rb
new file mode 100644
index 0000000..6b5aa99
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/drop.rb
@@ -0,0 +1,78 @@
+require 'set'
+
+module Liquid
+  # A drop in liquid is a class which allows you to export DOM like things to liquid.
+  # Methods of drops are callable.
+  # The main use for liquid drops is to implement lazy loaded objects.
+  # If you would like to make data available to the web designers which you don't want loaded unless needed then
+  # a drop is a great way to do that.
+  #
+  # Example:
+  #
+  #   class ProductDrop < Liquid::Drop
+  #     def top_sales
+  #       Shop.current.products.find(:all, :order => 'sales', :limit => 10 )
+  #     end
+  #   end
+  #
+  #   tmpl = Liquid::Template.parse( ' {% for product in product.top_sales %} {{ product.name }} {%endfor%} '  )
+  #   tmpl.render('product' => ProductDrop.new ) # will invoke top_sales query.
+  #
+  # Your drop can either implement the methods sans any parameters
+  # or implement the liquid_method_missing(name) method which is a catch all.
+  class Drop
+    attr_writer :context
+
+    # Catch all for the method
+    def liquid_method_missing(method)
+      return nil unless @context && @context.strict_variables
+      raise Liquid::UndefinedDropMethod, "undefined method #{method}"
+    end
+
+    # called by liquid to invoke a drop
+    def invoke_drop(method_or_key)
+      if self.class.invokable?(method_or_key)
+        send(method_or_key)
+      else
+        liquid_method_missing(method_or_key)
+      end
+    end
+
+    def key?(_name)
+      true
+    end
+
+    def inspect
+      self.class.to_s
+    end
+
+    def to_liquid
+      self
+    end
+
+    def to_s
+      self.class.name
+    end
+
+    alias_method :[], :invoke_drop
+
+    # Check for method existence without invoking respond_to?, which creates symbols
+    def self.invokable?(method_name)
+      invokable_methods.include?(method_name.to_s)
+    end
+
+    def self.invokable_methods
+      @invokable_methods ||= begin
+        blacklist = Liquid::Drop.public_instance_methods + [:each]
+
+        if include?(Enumerable)
+          blacklist += Enumerable.public_instance_methods
+          blacklist -= [:sort, :count, :first, :min, :max, :include?]
+        end
+
+        whitelist = [:to_liquid] + (public_instance_methods - blacklist)
+        Set.new(whitelist.map(&:to_s))
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/errors.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/errors.rb
new file mode 100644
index 0000000..defa5ea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/errors.rb
@@ -0,0 +1,56 @@
+module Liquid
+  class Error < ::StandardError
+    attr_accessor :line_number
+    attr_accessor :template_name
+    attr_accessor :markup_context
+
+    def to_s(with_prefix = true)
+      str = ""
+      str << message_prefix if with_prefix
+      str << super()
+
+      if markup_context
+        str << " "
+        str << markup_context
+      end
+
+      str
+    end
+
+    private
+
+    def message_prefix
+      str = ""
+      if is_a?(SyntaxError)
+        str << "Liquid syntax error"
+      else
+        str << "Liquid error"
+      end
+
+      if line_number
+        str << " ("
+        str << template_name << " " if template_name
+        str << "line " << line_number.to_s << ")"
+      end
+
+      str << ": "
+      str
+    end
+  end
+
+  ArgumentError = Class.new(Error)
+  ContextError = Class.new(Error)
+  FileSystemError = Class.new(Error)
+  StandardError = Class.new(Error)
+  SyntaxError = Class.new(Error)
+  StackLevelError = Class.new(Error)
+  TaintedError = Class.new(Error)
+  MemoryError = Class.new(Error)
+  ZeroDivisionError = Class.new(Error)
+  FloatDomainError = Class.new(Error)
+  UndefinedVariable = Class.new(Error)
+  UndefinedDropMethod = Class.new(Error)
+  UndefinedFilter = Class.new(Error)
+  MethodOverrideError = Class.new(Error)
+  InternalError = Class.new(Error)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/expression.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/expression.rb
new file mode 100644
index 0000000..1325ae5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/expression.rb
@@ -0,0 +1,45 @@
+module Liquid
+  class Expression
+    class MethodLiteral
+      attr_reader :method_name, :to_s
+
+      def initialize(method_name, to_s)
+        @method_name = method_name
+        @to_s = to_s
+      end
+
+      def to_liquid
+        to_s
+      end
+    end
+
+    LITERALS = {
+      nil => nil, 'nil'.freeze => nil, 'null'.freeze => nil, ''.freeze => nil,
+      'true'.freeze  => true,
+      'false'.freeze => false,
+      'blank'.freeze => MethodLiteral.new(:blank?, '').freeze,
+      'empty'.freeze => MethodLiteral.new(:empty?, '').freeze
+    }
+
+    def self.parse(markup)
+      if LITERALS.key?(markup)
+        LITERALS[markup]
+      else
+        case markup
+        when /\A'(.*)'\z/m # Single quoted strings
+          $1
+        when /\A"(.*)"\z/m # Double quoted strings
+          $1
+        when /\A(-?\d+)\z/ # Integer and floats
+          $1.to_i
+        when /\A\((\S+)\.\.(\S+)\)\z/ # Ranges
+          RangeLookup.parse($1, $2)
+        when /\A(-?\d[\d\.]+)\z/ # Floats
+          $1.to_f
+        else
+          VariableLookup.parse(markup)
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/extensions.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/extensions.rb
new file mode 100644
index 0000000..d35bcea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/extensions.rb
@@ -0,0 +1,68 @@
+require 'time'
+require 'date'
+
+class String # :nodoc:
+  def to_liquid
+    self
+  end
+end
+
+class Array # :nodoc:
+  def to_liquid
+    self
+  end
+end
+
+class Hash # :nodoc:
+  def to_liquid
+    self
+  end
+end
+
+class Numeric # :nodoc:
+  def to_liquid
+    self
+  end
+end
+
+class Range # :nodoc:
+  def to_liquid
+    self
+  end
+end
+
+class Time # :nodoc:
+  def to_liquid
+    self
+  end
+end
+
+class DateTime < Date # :nodoc:
+  def to_liquid
+    self
+  end
+end
+
+class Date # :nodoc:
+  def to_liquid
+    self
+  end
+end
+
+class TrueClass
+  def to_liquid # :nodoc:
+    self
+  end
+end
+
+class FalseClass
+  def to_liquid # :nodoc:
+    self
+  end
+end
+
+class NilClass
+  def to_liquid # :nodoc:
+    self
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/file_system.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/file_system.rb
new file mode 100644
index 0000000..13f1f46
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/file_system.rb
@@ -0,0 +1,73 @@
+module Liquid
+  # A Liquid file system is a way to let your templates retrieve other templates for use with the include tag.
+  #
+  # You can implement subclasses that retrieve templates from the database, from the file system using a different
+  # path structure, you can provide them as hard-coded inline strings, or any manner that you see fit.
+  #
+  # You can add additional instance variables, arguments, or methods as needed.
+  #
+  # Example:
+  #
+  #   Liquid::Template.file_system = Liquid::LocalFileSystem.new(template_path)
+  #   liquid = Liquid::Template.parse(template)
+  #
+  # This will parse the template with a LocalFileSystem implementation rooted at 'template_path'.
+  class BlankFileSystem
+    # Called by Liquid to retrieve a template file
+    def read_template_file(_template_path)
+      raise FileSystemError, "This liquid context does not allow includes."
+    end
+  end
+
+  # This implements an abstract file system which retrieves template files named in a manner similar to Rails partials,
+  # ie. with the template name prefixed with an underscore. The extension ".liquid" is also added.
+  #
+  # For security reasons, template paths are only allowed to contain letters, numbers, and underscore.
+  #
+  # Example:
+  #
+  #   file_system = Liquid::LocalFileSystem.new("/some/path")
+  #
+  #   file_system.full_path("mypartial")       # => "/some/path/_mypartial.liquid"
+  #   file_system.full_path("dir/mypartial")   # => "/some/path/dir/_mypartial.liquid"
+  #
+  # Optionally in the second argument you can specify a custom pattern for template filenames.
+  # The Kernel::sprintf format specification is used.
+  # Default pattern is "_%s.liquid".
+  #
+  # Example:
+  #
+  #   file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html")
+  #
+  #   file_system.full_path("index") # => "/some/path/index.html"
+  #
+  class LocalFileSystem
+    attr_accessor :root
+
+    def initialize(root, pattern = "_%s.liquid".freeze)
+      @root = root
+      @pattern = pattern
+    end
+
+    def read_template_file(template_path)
+      full_path = full_path(template_path)
+      raise FileSystemError, "No such template '#{template_path}'" unless File.exist?(full_path)
+
+      File.read(full_path)
+    end
+
+    def full_path(template_path)
+      raise FileSystemError, "Illegal template name '#{template_path}'" unless template_path =~ /\A[^.\/][a-zA-Z0-9_\/]+\z/
+
+      full_path = if template_path.include?('/'.freeze)
+        File.join(root, File.dirname(template_path), @pattern % File.basename(template_path))
+      else
+        File.join(root, @pattern % template_path)
+      end
+
+      raise FileSystemError, "Illegal template path '#{File.expand_path(full_path)}'" unless File.expand_path(full_path).start_with?(File.expand_path(root))
+
+      full_path
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/forloop_drop.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/forloop_drop.rb
new file mode 100644
index 0000000..81b2d1a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/forloop_drop.rb
@@ -0,0 +1,42 @@
+module Liquid
+  class ForloopDrop < Drop
+    def initialize(name, length, parentloop)
+      @name = name
+      @length = length
+      @parentloop = parentloop
+      @index = 0
+    end
+
+    attr_reader :name, :length, :parentloop
+
+    def index
+      @index + 1
+    end
+
+    def index0
+      @index
+    end
+
+    def rindex
+      @length - @index
+    end
+
+    def rindex0
+      @length - @index - 1
+    end
+
+    def first
+      @index == 0
+    end
+
+    def last
+      @index == @length - 1
+    end
+
+    protected
+
+    def increment!
+      @index += 1
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/i18n.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/i18n.rb
new file mode 100644
index 0000000..e998d58
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/i18n.rb
@@ -0,0 +1,39 @@
+require 'yaml'
+
+module Liquid
+  class I18n
+    DEFAULT_LOCALE = File.join(File.expand_path(__dir__), "locales", "en.yml")
+
+    TranslationError = Class.new(StandardError)
+
+    attr_reader :path
+
+    def initialize(path = DEFAULT_LOCALE)
+      @path = path
+    end
+
+    def translate(name, vars = {})
+      interpolate(deep_fetch_translation(name), vars)
+    end
+    alias_method :t, :translate
+
+    def locale
+      @locale ||= YAML.load_file(@path)
+    end
+
+    private
+
+    def interpolate(name, vars)
+      name.gsub(/%\{(\w+)\}/) do
+        # raise TranslationError, "Undefined key #{$1} for interpolation in translation #{name}"  unless vars[$1.to_sym]
+        "#{vars[$1.to_sym]}"
+      end
+    end
+
+    def deep_fetch_translation(name)
+      name.split('.'.freeze).reduce(locale) do |level, cur|
+        level[cur] or raise TranslationError, "Translation for #{name} does not exist in locale #{path}"
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/interrupts.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/interrupts.rb
new file mode 100644
index 0000000..41359d7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/interrupts.rb
@@ -0,0 +1,16 @@
+module Liquid
+  # An interrupt is any command that breaks processing of a block (ex: a for loop).
+  class Interrupt
+    attr_reader :message
+
+    def initialize(message = nil)
+      @message = message || "interrupt".freeze
+    end
+  end
+
+  # Interrupt that is thrown whenever a {% break %} is called.
+  class BreakInterrupt < Interrupt; end
+
+  # Interrupt that is thrown whenever a {% continue %} is called.
+  class ContinueInterrupt < Interrupt; end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/lexer.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/lexer.rb
new file mode 100644
index 0000000..b9f2422
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/lexer.rb
@@ -0,0 +1,53 @@
+require "strscan"
+module Liquid
+  class Lexer
+    SPECIALS = {
+      '|'.freeze => :pipe,
+      '.'.freeze => :dot,
+      ':'.freeze => :colon,
+      ','.freeze => :comma,
+      '['.freeze => :open_square,
+      ']'.freeze => :close_square,
+      '('.freeze => :open_round,
+      ')'.freeze => :close_round,
+      '?'.freeze => :question,
+      '-'.freeze => :dash
+    }
+    IDENTIFIER = /[a-zA-Z_][\w-]*\??/
+    SINGLE_STRING_LITERAL = /'[^\']*'/
+    DOUBLE_STRING_LITERAL = /"[^\"]*"/
+    NUMBER_LITERAL = /-?\d+(\.\d+)?/
+    DOTDOT = /\.\./
+    COMPARISON_OPERATOR = /==|!=|<>|<=?|>=?|contains/
+
+    def initialize(input)
+      @ss = StringScanner.new(input.rstrip)
+    end
+
+    def tokenize
+      @output = []
+
+      until @ss.eos?
+        @ss.skip(/\s*/)
+        tok = case
+        when t = @ss.scan(COMPARISON_OPERATOR) then [:comparison, t]
+        when t = @ss.scan(SINGLE_STRING_LITERAL) then [:string, t]
+        when t = @ss.scan(DOUBLE_STRING_LITERAL) then [:string, t]
+        when t = @ss.scan(NUMBER_LITERAL) then [:number, t]
+        when t = @ss.scan(IDENTIFIER) then [:id, t]
+        when t = @ss.scan(DOTDOT) then [:dotdot, t]
+        else
+          c = @ss.getch
+          if s = SPECIALS[c]
+            [s, c]
+          else
+            raise SyntaxError, "Unexpected character #{c}"
+          end
+        end
+        @output << tok
+      end
+
+      @output << [:end_of_string]
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/locales/en.yml b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/locales/en.yml
new file mode 100644
index 0000000..9a259bf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/locales/en.yml
@@ -0,0 +1,26 @@
+---
+  errors:
+    syntax:
+      tag_unexpected_args: "Syntax Error in '%{tag}' - Valid syntax: %{tag}"
+      assign: "Syntax Error in 'assign' - Valid syntax: assign [var] = [source]"
+      capture: "Syntax Error in 'capture' - Valid syntax: capture [var]"
+      case: "Syntax Error in 'case' - Valid syntax: case [condition]"
+      case_invalid_when: "Syntax Error in tag 'case' - Valid when condition: {% when [condition] [or condition2...] %}"
+      case_invalid_else: "Syntax Error in tag 'case' - Valid else condition: {% else %} (no parameters) "
+      cycle: "Syntax Error in 'cycle' - Valid syntax: cycle [name :] var [, var2, var3 ...]"
+      for: "Syntax Error in 'for loop' - Valid syntax: for [item] in [collection]"
+      for_invalid_in: "For loops require an 'in' clause"
+      for_invalid_attribute: "Invalid attribute in for loop. Valid attributes are limit and offset"
+      if: "Syntax Error in tag 'if' - Valid syntax: if [expression]"
+      include: "Error in tag 'include' - Valid syntax: include '[template]' (with|for) [object|collection]"
+      unknown_tag: "Unknown tag '%{tag}'"
+      invalid_delimiter: "'end' is not a valid delimiter for %{block_name} tags. use %{block_delimiter}"
+      unexpected_else: "%{block_name} tag does not expect 'else' tag"
+      unexpected_outer_tag: "Unexpected outer '%{tag}' tag"
+      tag_termination: "Tag '%{token}' was not properly terminated with regexp: %{tag_end}"
+      variable_termination: "Variable '%{token}' was not properly terminated with regexp: %{tag_end}"
+      tag_never_closed: "'%{block_name}' tag was never closed"
+      meta_syntax_error: "Liquid syntax error: #{e.message}"
+      table_row: "Syntax Error in 'table_row loop' - Valid syntax: table_row [item] in [collection] cols=3"
+    argument:
+      include: "Argument error in tag 'include' - Illegal template name"
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/parse_context.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/parse_context.rb
new file mode 100644
index 0000000..34986dd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/parse_context.rb
@@ -0,0 +1,37 @@
+module Liquid
+  class ParseContext
+    attr_accessor :locale, :line_number, :trim_whitespace
+    attr_reader :partial, :warnings, :error_mode
+
+    def initialize(options = {})
+      @template_options = options ? options.dup : {}
+      @locale = @template_options[:locale] ||= I18n.new
+      @warnings = []
+      self.partial = false
+    end
+
+    def [](option_key)
+      @options[option_key]
+    end
+
+    def partial=(value)
+      @partial = value
+      @options = value ? partial_options : @template_options
+      @error_mode = @options[:error_mode] || Template.error_mode
+      value
+    end
+
+    def partial_options
+      @partial_options ||= begin
+        dont_pass = @template_options[:include_options_blacklist]
+        if dont_pass == true
+          { locale: locale }
+        elsif dont_pass.is_a?(Array)
+          @template_options.reject { |k, v| dont_pass.include?(k) }
+        else
+          @template_options
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/parser.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/parser.rb
new file mode 100644
index 0000000..6954343
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/parser.rb
@@ -0,0 +1,90 @@
+module Liquid
+  class Parser
+    def initialize(input)
+      l = Lexer.new(input)
+      @tokens = l.tokenize
+      @p = 0 # pointer to current location
+    end
+
+    def jump(point)
+      @p = point
+    end
+
+    def consume(type = nil)
+      token = @tokens[@p]
+      if type && token[0] != type
+        raise SyntaxError, "Expected #{type} but found #{@tokens[@p].first}"
+      end
+      @p += 1
+      token[1]
+    end
+
+    # Only consumes the token if it matches the type
+    # Returns the token's contents if it was consumed
+    # or false otherwise.
+    def consume?(type)
+      token = @tokens[@p]
+      return false unless token && token[0] == type
+      @p += 1
+      token[1]
+    end
+
+    # Like consume? Except for an :id token of a certain name
+    def id?(str)
+      token = @tokens[@p]
+      return false unless token && token[0] == :id
+      return false unless token[1] == str
+      @p += 1
+      token[1]
+    end
+
+    def look(type, ahead = 0)
+      tok = @tokens[@p + ahead]
+      return false unless tok
+      tok[0] == type
+    end
+
+    def expression
+      token = @tokens[@p]
+      if token[0] == :id
+        variable_signature
+      elsif [:string, :number].include? token[0]
+        consume
+      elsif token.first == :open_round
+        consume
+        first = expression
+        consume(:dotdot)
+        last = expression
+        consume(:close_round)
+        "(#{first}..#{last})"
+      else
+        raise SyntaxError, "#{token} is not a valid expression"
+      end
+    end
+
+    def argument
+      str = ""
+      # might be a keyword argument (identifier: expression)
+      if look(:id) && look(:colon, 1)
+        str << consume << consume << ' '.freeze
+      end
+
+      str << expression
+      str
+    end
+
+    def variable_signature
+      str = consume(:id)
+      while look(:open_square)
+        str << consume
+        str << expression
+        str << consume(:close_square)
+      end
+      if look(:dot)
+        str << consume
+        str << variable_signature
+      end
+      str
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/parser_switching.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/parser_switching.rb
new file mode 100644
index 0000000..3aa664a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/parser_switching.rb
@@ -0,0 +1,31 @@
+module Liquid
+  module ParserSwitching
+    def parse_with_selected_parser(markup)
+      case parse_context.error_mode
+      when :strict then strict_parse_with_error_context(markup)
+      when :lax    then lax_parse(markup)
+      when :warn
+        begin
+          return strict_parse_with_error_context(markup)
+        rescue SyntaxError => e
+          parse_context.warnings << e
+          return lax_parse(markup)
+        end
+      end
+    end
+
+    private
+
+    def strict_parse_with_error_context(markup)
+      strict_parse(markup)
+    rescue SyntaxError => e
+      e.line_number = line_number
+      e.markup_context = markup_context(markup)
+      raise e
+    end
+
+    def markup_context(markup)
+      "in \"#{markup.strip}\""
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/profiler.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/profiler.rb
new file mode 100644
index 0000000..dc9db60
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/profiler.rb
@@ -0,0 +1,158 @@
+require 'liquid/profiler/hooks'
+
+module Liquid
+  # Profiler enables support for profiling template rendering to help track down performance issues.
+  #
+  # To enable profiling, first require 'liquid/profiler'.
+  # Then, to profile a parse/render cycle, pass the <tt>profile: true</tt> option to <tt>Liquid::Template.parse</tt>.
+  # After <tt>Liquid::Template#render</tt> is called, the template object makes available an instance of this
+  # class via the <tt>Liquid::Template#profiler</tt> method.
+  #
+  #   template = Liquid::Template.parse(template_content, profile: true)
+  #   output  = template.render
+  #   profile = template.profiler
+  #
+  # This object contains all profiling information, containing information on what tags were rendered,
+  # where in the templates these tags live, and how long each tag took to render.
+  #
+  # This is a tree structure that is Enumerable all the way down, and keeps track of tags and rendering times
+  # inside of <tt>{% include %}</tt> tags.
+  #
+  #   profile.each do |node|
+  #     # Access to the node itself
+  #     node.code
+  #
+  #     # Which template and line number of this node.
+  #     # If top level, this will be "<root>".
+  #     node.partial
+  #     node.line_number
+  #
+  #     # Render time in seconds of this node
+  #     node.render_time
+  #
+  #     # If the template used {% include %}, this node will also have children.
+  #     node.children.each do |child2|
+  #       # ...
+  #     end
+  #   end
+  #
+  # Profiler also exposes the total time of the template's render in <tt>Liquid::Profiler#total_render_time</tt>.
+  #
+  # All render times are in seconds. There is a small performance hit when profiling is enabled.
+  #
+  class Profiler
+    include Enumerable
+
+    class Timing
+      attr_reader :code, :partial, :line_number, :children
+
+      def initialize(node, partial)
+        @code        = node.respond_to?(:raw) ? node.raw : node
+        @partial     = partial
+        @line_number = node.respond_to?(:line_number) ? node.line_number : nil
+        @children    = []
+      end
+
+      def self.start(node, partial)
+        new(node, partial).tap(&:start)
+      end
+
+      def start
+        @start_time = Time.now
+      end
+
+      def finish
+        @end_time = Time.now
+      end
+
+      def render_time
+        @end_time - @start_time
+      end
+    end
+
+    def self.profile_node_render(node)
+      if Profiler.current_profile && node.respond_to?(:render)
+        Profiler.current_profile.start_node(node)
+        output = yield
+        Profiler.current_profile.end_node(node)
+        output
+      else
+        yield
+      end
+    end
+
+    def self.profile_children(template_name)
+      if Profiler.current_profile
+        Profiler.current_profile.push_partial(template_name)
+        output = yield
+        Profiler.current_profile.pop_partial
+        output
+      else
+        yield
+      end
+    end
+
+    def self.current_profile
+      Thread.current[:liquid_profiler]
+    end
+
+    def initialize
+      @partial_stack = ["<root>"]
+
+      @root_timing = Timing.new("", current_partial)
+      @timing_stack = [@root_timing]
+
+      @render_start_at = Time.now
+      @render_end_at = @render_start_at
+    end
+
+    def start
+      Thread.current[:liquid_profiler] = self
+      @render_start_at = Time.now
+    end
+
+    def stop
+      Thread.current[:liquid_profiler] = nil
+      @render_end_at = Time.now
+    end
+
+    def total_render_time
+      @render_end_at - @render_start_at
+    end
+
+    def each(&block)
+      @root_timing.children.each(&block)
+    end
+
+    def [](idx)
+      @root_timing.children[idx]
+    end
+
+    def length
+      @root_timing.children.length
+    end
+
+    def start_node(node)
+      @timing_stack.push(Timing.start(node, current_partial))
+    end
+
+    def end_node(_node)
+      timing = @timing_stack.pop
+      timing.finish
+
+      @timing_stack.last.children << timing
+    end
+
+    def current_partial
+      @partial_stack.last
+    end
+
+    def push_partial(partial_name)
+      @partial_stack.push(partial_name)
+    end
+
+    def pop_partial
+      @partial_stack.pop
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/profiler/hooks.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/profiler/hooks.rb
new file mode 100644
index 0000000..6f8d798
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/profiler/hooks.rb
@@ -0,0 +1,23 @@
+module Liquid
+  class BlockBody
+    def render_node_with_profiling(node, context)
+      Profiler.profile_node_render(node) do
+        render_node_without_profiling(node, context)
+      end
+    end
+
+    alias_method :render_node_without_profiling, :render_node
+    alias_method :render_node, :render_node_with_profiling
+  end
+
+  class Include < Tag
+    def render_with_profiling(context)
+      Profiler.profile_children(context.evaluate(@template_name_expr).to_s) do
+        render_without_profiling(context)
+      end
+    end
+
+    alias_method :render_without_profiling, :render
+    alias_method :render, :render_with_profiling
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/range_lookup.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/range_lookup.rb
new file mode 100644
index 0000000..93bb420
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/range_lookup.rb
@@ -0,0 +1,37 @@
+module Liquid
+  class RangeLookup
+    def self.parse(start_markup, end_markup)
+      start_obj = Expression.parse(start_markup)
+      end_obj = Expression.parse(end_markup)
+      if start_obj.respond_to?(:evaluate) || end_obj.respond_to?(:evaluate)
+        new(start_obj, end_obj)
+      else
+        start_obj.to_i..end_obj.to_i
+      end
+    end
+
+    def initialize(start_obj, end_obj)
+      @start_obj = start_obj
+      @end_obj = end_obj
+    end
+
+    def evaluate(context)
+      start_int = to_integer(context.evaluate(@start_obj))
+      end_int = to_integer(context.evaluate(@end_obj))
+      start_int..end_int
+    end
+
+    private
+
+    def to_integer(input)
+      case input
+      when Integer
+        input
+      when NilClass, String
+        input.to_i
+      else
+        Utils.to_integer(input)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/resource_limits.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/resource_limits.rb
new file mode 100644
index 0000000..08b359b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/resource_limits.rb
@@ -0,0 +1,23 @@
+module Liquid
+  class ResourceLimits
+    attr_accessor :render_length, :render_score, :assign_score,
+      :render_length_limit, :render_score_limit, :assign_score_limit
+
+    def initialize(limits)
+      @render_length_limit = limits[:render_length_limit]
+      @render_score_limit = limits[:render_score_limit]
+      @assign_score_limit = limits[:assign_score_limit]
+      reset
+    end
+
+    def reached?
+      (@render_length_limit && @render_length > @render_length_limit) ||
+        (@render_score_limit && @render_score > @render_score_limit) ||
+        (@assign_score_limit && @assign_score > @assign_score_limit)
+    end
+
+    def reset
+      @render_length = @render_score = @assign_score = 0
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/standardfilters.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/standardfilters.rb
new file mode 100644
index 0000000..bb56f4c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/standardfilters.rb
@@ -0,0 +1,420 @@
+require 'cgi'
+require 'bigdecimal'
+
+module Liquid
+  module StandardFilters
+    HTML_ESCAPE = {
+      '&'.freeze => '&amp;'.freeze,
+      '>'.freeze => '&gt;'.freeze,
+      '<'.freeze => '&lt;'.freeze,
+      '"'.freeze => '&quot;'.freeze,
+      "'".freeze => '&#39;'.freeze
+    }
+    HTML_ESCAPE_ONCE_REGEXP = /["><']|&(?!([a-zA-Z]+|(#\d+));)/
+
+    # Return the size of an array or of an string
+    def size(input)
+      input.respond_to?(:size) ? input.size : 0
+    end
+
+    # convert an input string to DOWNCASE
+    def downcase(input)
+      input.to_s.downcase
+    end
+
+    # convert an input string to UPCASE
+    def upcase(input)
+      input.to_s.upcase
+    end
+
+    # capitalize words in the input centence
+    def capitalize(input)
+      input.to_s.capitalize
+    end
+
+    def escape(input)
+      CGI.escapeHTML(input).untaint unless input.nil?
+    end
+    alias_method :h, :escape
+
+    def escape_once(input)
+      input.to_s.gsub(HTML_ESCAPE_ONCE_REGEXP, HTML_ESCAPE)
+    end
+
+    def url_encode(input)
+      CGI.escape(input) unless input.nil?
+    end
+
+    def url_decode(input)
+      CGI.unescape(input) unless input.nil?
+    end
+
+    def slice(input, offset, length = nil)
+      offset = Utils.to_integer(offset)
+      length = length ? Utils.to_integer(length) : 1
+
+      if input.is_a?(Array)
+        input.slice(offset, length) || []
+      else
+        input.to_s.slice(offset, length) || ''
+      end
+    end
+
+    # Truncate a string down to x characters
+    def truncate(input, length = 50, truncate_string = "...".freeze)
+      return if input.nil?
+      input_str = input.to_s
+      length = Utils.to_integer(length)
+      truncate_string_str = truncate_string.to_s
+      l = length - truncate_string_str.length
+      l = 0 if l < 0
+      input_str.length > length ? input_str[0...l] + truncate_string_str : input_str
+    end
+
+    def truncatewords(input, words = 15, truncate_string = "...".freeze)
+      return if input.nil?
+      wordlist = input.to_s.split
+      words = Utils.to_integer(words)
+      l = words - 1
+      l = 0 if l < 0
+      wordlist.length > l ? wordlist[0..l].join(" ".freeze) + truncate_string.to_s : input
+    end
+
+    # Split input string into an array of substrings separated by given pattern.
+    #
+    # Example:
+    #   <div class="summary">{{ post | split '//' | first }}</div>
+    #
+    def split(input, pattern)
+      input.to_s.split(pattern.to_s)
+    end
+
+    def strip(input)
+      input.to_s.strip
+    end
+
+    def lstrip(input)
+      input.to_s.lstrip
+    end
+
+    def rstrip(input)
+      input.to_s.rstrip
+    end
+
+    def strip_html(input)
+      empty = ''.freeze
+      input.to_s.gsub(/<script.*?<\/script>/m, empty).gsub(/<!--.*?-->/m, empty).gsub(/<style.*?<\/style>/m, empty).gsub(/<.*?>/m, empty)
+    end
+
+    # Remove all newlines from the string
+    def strip_newlines(input)
+      input.to_s.gsub(/\r?\n/, ''.freeze)
+    end
+
+    # Join elements of the array with certain character between them
+    def join(input, glue = ' '.freeze)
+      InputIterator.new(input).join(glue)
+    end
+
+    # Sort elements of the array
+    # provide optional property with which to sort an array of hashes or drops
+    def sort(input, property = nil)
+      ary = InputIterator.new(input)
+      if property.nil?
+        ary.sort
+      elsif ary.empty? # The next two cases assume a non-empty array.
+        []
+      elsif ary.first.respond_to?(:[]) && !ary.first[property].nil?
+        ary.sort do |a, b|
+          a = a[property]
+          b = b[property]
+          if a && b
+            a <=> b
+          else
+            a ? -1 : 1
+          end
+        end
+      end
+    end
+
+    # Sort elements of an array ignoring case if strings
+    # provide optional property with which to sort an array of hashes or drops
+    def sort_natural(input, property = nil)
+      ary = InputIterator.new(input)
+
+      if property.nil?
+        ary.sort { |a, b| a.casecmp(b) }
+      elsif ary.empty? # The next two cases assume a non-empty array.
+        []
+      elsif ary.first.respond_to?(:[]) && !ary.first[property].nil?
+        ary.sort { |a, b| a[property].casecmp(b[property]) }
+      end
+    end
+
+    # Remove duplicate elements from an array
+    # provide optional property with which to determine uniqueness
+    def uniq(input, property = nil)
+      ary = InputIterator.new(input)
+
+      if property.nil?
+        ary.uniq
+      elsif ary.empty? # The next two cases assume a non-empty array.
+        []
+      elsif ary.first.respond_to?(:[])
+        ary.uniq{ |a| a[property] }
+      end
+    end
+
+    # Reverse the elements of an array
+    def reverse(input)
+      ary = InputIterator.new(input)
+      ary.reverse
+    end
+
+    # map/collect on a given property
+    def map(input, property)
+      InputIterator.new(input).map do |e|
+        e = e.call if e.is_a?(Proc)
+
+        if property == "to_liquid".freeze
+          e
+        elsif e.respond_to?(:[])
+          r = e[property]
+          r.is_a?(Proc) ? r.call : r
+        end
+      end
+    end
+
+    # Remove nils within an array
+    # provide optional property with which to check for nil
+    def compact(input, property = nil)
+      ary = InputIterator.new(input)
+
+      if property.nil?
+        ary.compact
+      elsif ary.empty? # The next two cases assume a non-empty array.
+        []
+      elsif ary.first.respond_to?(:[])
+        ary.reject{ |a| a[property].nil? }
+      end
+    end
+
+    # Replace occurrences of a string with another
+    def replace(input, string, replacement = ''.freeze)
+      input.to_s.gsub(string.to_s, replacement.to_s)
+    end
+
+    # Replace the first occurrences of a string with another
+    def replace_first(input, string, replacement = ''.freeze)
+      input.to_s.sub(string.to_s, replacement.to_s)
+    end
+
+    # remove a substring
+    def remove(input, string)
+      input.to_s.gsub(string.to_s, ''.freeze)
+    end
+
+    # remove the first occurrences of a substring
+    def remove_first(input, string)
+      input.to_s.sub(string.to_s, ''.freeze)
+    end
+
+    # add one string to another
+    def append(input, string)
+      input.to_s + string.to_s
+    end
+
+    def concat(input, array)
+      unless array.respond_to?(:to_ary)
+        raise ArgumentError.new("concat filter requires an array argument")
+      end
+      InputIterator.new(input).concat(array)
+    end
+
+    # prepend a string to another
+    def prepend(input, string)
+      string.to_s + input.to_s
+    end
+
+    # Add <br /> tags in front of all newlines in input string
+    def newline_to_br(input)
+      input.to_s.gsub(/\n/, "<br />\n".freeze)
+    end
+
+    # Reformat a date using Ruby's core Time#strftime( string ) -> string
+    #
+    #   %a - The abbreviated weekday name (``Sun'')
+    #   %A - The  full  weekday  name (``Sunday'')
+    #   %b - The abbreviated month name (``Jan'')
+    #   %B - The  full  month  name (``January'')
+    #   %c - The preferred local date and time representation
+    #   %d - Day of the month (01..31)
+    #   %H - Hour of the day, 24-hour clock (00..23)
+    #   %I - Hour of the day, 12-hour clock (01..12)
+    #   %j - Day of the year (001..366)
+    #   %m - Month of the year (01..12)
+    #   %M - Minute of the hour (00..59)
+    #   %p - Meridian indicator (``AM''  or  ``PM'')
+    #   %s - Number of seconds since 1970-01-01 00:00:00 UTC.
+    #   %S - Second of the minute (00..60)
+    #   %U - Week  number  of the current year,
+    #           starting with the first Sunday as the first
+    #           day of the first week (00..53)
+    #   %W - Week  number  of the current year,
+    #           starting with the first Monday as the first
+    #           day of the first week (00..53)
+    #   %w - Day of the week (Sunday is 0, 0..6)
+    #   %x - Preferred representation for the date alone, no time
+    #   %X - Preferred representation for the time alone, no date
+    #   %y - Year without a century (00..99)
+    #   %Y - Year with century
+    #   %Z - Time zone name
+    #   %% - Literal ``%'' character
+    #
+    #   See also: http://www.ruby-doc.org/core/Time.html#method-i-strftime
+    def date(input, format)
+      return input if format.to_s.empty?
+
+      return input unless date = Utils.to_date(input)
+
+      date.strftime(format.to_s)
+    end
+
+    # Get the first element of the passed in array
+    #
+    # Example:
+    #    {{ product.images | first | to_img }}
+    #
+    def first(array)
+      array.first if array.respond_to?(:first)
+    end
+
+    # Get the last element of the passed in array
+    #
+    # Example:
+    #    {{ product.images | last | to_img }}
+    #
+    def last(array)
+      array.last if array.respond_to?(:last)
+    end
+
+    # absolute value
+    def abs(input)
+      result = Utils.to_number(input).abs
+      result.is_a?(BigDecimal) ? result.to_f : result
+    end
+
+    # addition
+    def plus(input, operand)
+      apply_operation(input, operand, :+)
+    end
+
+    # subtraction
+    def minus(input, operand)
+      apply_operation(input, operand, :-)
+    end
+
+    # multiplication
+    def times(input, operand)
+      apply_operation(input, operand, :*)
+    end
+
+    # division
+    def divided_by(input, operand)
+      apply_operation(input, operand, :/)
+    rescue ::ZeroDivisionError => e
+      raise Liquid::ZeroDivisionError, e.message
+    end
+
+    def modulo(input, operand)
+      apply_operation(input, operand, :%)
+    rescue ::ZeroDivisionError => e
+      raise Liquid::ZeroDivisionError, e.message
+    end
+
+    def round(input, n = 0)
+      result = Utils.to_number(input).round(Utils.to_number(n))
+      result = result.to_f if result.is_a?(BigDecimal)
+      result = result.to_i if n == 0
+      result
+    rescue ::FloatDomainError => e
+      raise Liquid::FloatDomainError, e.message
+    end
+
+    def ceil(input)
+      Utils.to_number(input).ceil.to_i
+    rescue ::FloatDomainError => e
+      raise Liquid::FloatDomainError, e.message
+    end
+
+    def floor(input)
+      Utils.to_number(input).floor.to_i
+    rescue ::FloatDomainError => e
+      raise Liquid::FloatDomainError, e.message
+    end
+
+    def default(input, default_value = ''.freeze)
+      if !input || input.respond_to?(:empty?) && input.empty?
+        default_value
+      else
+        input
+      end
+    end
+
+    private
+
+    def apply_operation(input, operand, operation)
+      result = Utils.to_number(input).send(operation, Utils.to_number(operand))
+      result.is_a?(BigDecimal) ? result.to_f : result
+    end
+
+    class InputIterator
+      include Enumerable
+
+      def initialize(input)
+        @input = if input.is_a?(Array)
+          input.flatten
+        elsif input.is_a?(Hash)
+          [input]
+        elsif input.is_a?(Enumerable)
+          input
+        else
+          Array(input)
+        end
+      end
+
+      def join(glue)
+        to_a.join(glue)
+      end
+
+      def concat(args)
+        to_a.concat(args)
+      end
+
+      def reverse
+        reverse_each.to_a
+      end
+
+      def uniq(&block)
+        to_a.uniq(&block)
+      end
+
+      def compact
+        to_a.compact
+      end
+
+      def empty?
+        @input.each { return false }
+        true
+      end
+
+      def each
+        @input.each do |e|
+          yield(e.respond_to?(:to_liquid) ? e.to_liquid : e)
+        end
+      end
+    end
+  end
+
+  Template.register_filter(StandardFilters)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/strainer.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/strainer.rb
new file mode 100644
index 0000000..99a9c29
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/strainer.rb
@@ -0,0 +1,66 @@
+require 'set'
+
+module Liquid
+  # Strainer is the parent class for the filters system.
+  # New filters are mixed into the strainer class which is then instantiated for each liquid template render run.
+  #
+  # The Strainer only allows method calls defined in filters given to it via Strainer.global_filter,
+  # Context#add_filters or Template.register_filter
+  class Strainer #:nodoc:
+    @@global_strainer = Class.new(Strainer) do
+      @filter_methods = Set.new
+    end
+    @@strainer_class_cache = Hash.new do |hash, filters|
+      hash[filters] = Class.new(@@global_strainer) do
+        @filter_methods = @@global_strainer.filter_methods.dup
+        filters.each { |f| add_filter(f) }
+      end
+    end
+
+    def initialize(context)
+      @context = context
+    end
+
+    class << self
+      attr_reader :filter_methods
+    end
+
+    def self.add_filter(filter)
+      raise ArgumentError, "Expected module but got: #{filter.class}" unless filter.is_a?(Module)
+      unless self.class.include?(filter)
+        invokable_non_public_methods = (filter.private_instance_methods + filter.protected_instance_methods).select { |m| invokable?(m) }
+        if invokable_non_public_methods.any?
+          raise MethodOverrideError, "Filter overrides registered public methods as non public: #{invokable_non_public_methods.join(', ')}"
+        else
+          send(:include, filter)
+          @filter_methods.merge(filter.public_instance_methods.map(&:to_s))
+        end
+      end
+    end
+
+    def self.global_filter(filter)
+      @@strainer_class_cache.clear
+      @@global_strainer.add_filter(filter)
+    end
+
+    def self.invokable?(method)
+      @filter_methods.include?(method.to_s)
+    end
+
+    def self.create(context, filters = [])
+      @@strainer_class_cache[filters].new(context)
+    end
+
+    def invoke(method, *args)
+      if self.class.invokable?(method)
+        send(method, *args)
+      elsif @context && @context.strict_filters
+        raise Liquid::UndefinedFilter, "undefined filter #{method}"
+      else
+        args.first
+      end
+    rescue ::ArgumentError => e
+      raise Liquid::ArgumentError, e.message, e.backtrace
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tablerowloop_drop.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tablerowloop_drop.rb
new file mode 100644
index 0000000..cda4a1e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tablerowloop_drop.rb
@@ -0,0 +1,62 @@
+module Liquid
+  class TablerowloopDrop < Drop
+    def initialize(length, cols)
+      @length = length
+      @row = 1
+      @col = 1
+      @cols = cols
+      @index = 0
+    end
+
+    attr_reader :length, :col, :row
+
+    def index
+      @index + 1
+    end
+
+    def index0
+      @index
+    end
+
+    def col0
+      @col - 1
+    end
+
+    def rindex
+      @length - @index
+    end
+
+    def rindex0
+      @length - @index - 1
+    end
+
+    def first
+      @index == 0
+    end
+
+    def last
+      @index == @length - 1
+    end
+
+    def col_first
+      @col == 1
+    end
+
+    def col_last
+      @col == @cols
+    end
+
+    protected
+
+    def increment!
+      @index += 1
+
+      if @col == @cols
+        @col = 1
+        @row += 1
+      else
+        @col += 1
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tag.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tag.rb
new file mode 100644
index 0000000..06970c1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tag.rb
@@ -0,0 +1,43 @@
+module Liquid
+  class Tag
+    attr_reader :nodelist, :tag_name, :line_number, :parse_context
+    alias_method :options, :parse_context
+    include ParserSwitching
+
+    class << self
+      def parse(tag_name, markup, tokenizer, options)
+        tag = new(tag_name, markup, options)
+        tag.parse(tokenizer)
+        tag
+      end
+
+      private :new
+    end
+
+    def initialize(tag_name, markup, parse_context)
+      @tag_name   = tag_name
+      @markup     = markup
+      @parse_context = parse_context
+      @line_number = parse_context.line_number
+    end
+
+    def parse(_tokens)
+    end
+
+    def raw
+      "#{@tag_name} #{@markup}"
+    end
+
+    def name
+      self.class.name.downcase
+    end
+
+    def render(_context)
+      ''.freeze
+    end
+
+    def blank?
+      false
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/assign.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/assign.rb
new file mode 100644
index 0000000..f6cd5fa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/assign.rb
@@ -0,0 +1,51 @@
+module Liquid
+  # Assign sets a variable in your template.
+  #
+  #   {% assign foo = 'monkey' %}
+  #
+  # You can then use the variable later in the page.
+  #
+  #  {{ foo }}
+  #
+  class Assign < Tag
+    Syntax = /(#{VariableSignature}+)\s*=\s*(.*)\s*/om
+
+    def initialize(tag_name, markup, options)
+      super
+      if markup =~ Syntax
+        @to = $1
+        @from = Variable.new($2, options)
+      else
+        raise SyntaxError.new options[:locale].t("errors.syntax.assign".freeze)
+      end
+    end
+
+    def render(context)
+      val = @from.render(context)
+      context.scopes.last[@to] = val
+      context.resource_limits.assign_score += assign_score_of(val)
+      ''.freeze
+    end
+
+    def blank?
+      true
+    end
+
+    private
+
+    def assign_score_of(val)
+      if val.instance_of?(String)
+        val.length
+      elsif val.instance_of?(Array) || val.instance_of?(Hash)
+        sum = 1
+        # Uses #each to avoid extra allocations.
+        val.each { |child| sum += assign_score_of(child) }
+        sum
+      else
+        1
+      end
+    end
+  end
+
+  Template.register_tag('assign'.freeze, Assign)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/break.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/break.rb
new file mode 100644
index 0000000..6fe0969
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/break.rb
@@ -0,0 +1,18 @@
+module Liquid
+  # Break tag to be used to break out of a for loop.
+  #
+  # == Basic Usage:
+  #    {% for item in collection %}
+  #      {% if item.condition %}
+  #        {% break %}
+  #      {% endif %}
+  #    {% endfor %}
+  #
+  class Break < Tag
+    def interrupt
+      BreakInterrupt.new
+    end
+  end
+
+  Template.register_tag('break'.freeze, Break)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/capture.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/capture.rb
new file mode 100644
index 0000000..8674356
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/capture.rb
@@ -0,0 +1,38 @@
+module Liquid
+  # Capture stores the result of a block into a variable without rendering it inplace.
+  #
+  #   {% capture heading %}
+  #     Monkeys!
+  #   {% endcapture %}
+  #   ...
+  #   <h1>{{ heading }}</h1>
+  #
+  # Capture is useful for saving content for use later in your template, such as
+  # in a sidebar or footer.
+  #
+  class Capture < Block
+    Syntax = /(#{VariableSignature}+)/o
+
+    def initialize(tag_name, markup, options)
+      super
+      if markup =~ Syntax
+        @to = $1
+      else
+        raise SyntaxError.new(options[:locale].t("errors.syntax.capture"))
+      end
+    end
+
+    def render(context)
+      output = super
+      context.scopes.last[@to] = output
+      context.resource_limits.assign_score += output.length
+      ''.freeze
+    end
+
+    def blank?
+      true
+    end
+  end
+
+  Template.register_tag('capture'.freeze, Capture)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/case.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/case.rb
new file mode 100644
index 0000000..453b4d6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/case.rb
@@ -0,0 +1,86 @@
+module Liquid
+  class Case < Block
+    Syntax     = /(#{QuotedFragment})/o
+    WhenSyntax = /(#{QuotedFragment})(?:(?:\s+or\s+|\s*\,\s*)(#{QuotedFragment}.*))?/om
+
+    def initialize(tag_name, markup, options)
+      super
+      @blocks = []
+
+      if markup =~ Syntax
+        @left = Expression.parse($1)
+      else
+        raise SyntaxError.new(options[:locale].t("errors.syntax.case".freeze))
+      end
+    end
+
+    def parse(tokens)
+      body = BlockBody.new
+      while parse_body(body, tokens)
+        body = @blocks.last.attachment
+      end
+    end
+
+    def nodelist
+      @blocks.map(&:attachment)
+    end
+
+    def unknown_tag(tag, markup, tokens)
+      case tag
+      when 'when'.freeze
+        record_when_condition(markup)
+      when 'else'.freeze
+        record_else_condition(markup)
+      else
+        super
+      end
+    end
+
+    def render(context)
+      context.stack do
+        execute_else_block = true
+
+        output = ''
+        @blocks.each do |block|
+          if block.else?
+            return block.attachment.render(context) if execute_else_block
+          elsif block.evaluate(context)
+            execute_else_block = false
+            output << block.attachment.render(context)
+          end
+        end
+        output
+      end
+    end
+
+    private
+
+    def record_when_condition(markup)
+      body = BlockBody.new
+
+      while markup
+        unless markup =~ WhenSyntax
+          raise SyntaxError.new(options[:locale].t("errors.syntax.case_invalid_when".freeze))
+        end
+
+        markup = $2
+
+        block = Condition.new(@left, '=='.freeze, Expression.parse($1))
+        block.attach(body)
+        @blocks << block
+      end
+    end
+
+    def record_else_condition(markup)
+      unless markup.strip.empty?
+        raise SyntaxError.new(options[:locale].t("errors.syntax.case_invalid_else".freeze))
+      end
+
+      block = ElseCondition.new
+      block.attach(BlockBody.new)
+      @blocks << block
+    end
+  end
+
+  Template.register_tag('case'.freeze, Case)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/comment.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/comment.rb
new file mode 100644
index 0000000..c57c9cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/comment.rb
@@ -0,0 +1,16 @@
+module Liquid
+  class Comment < Block
+    def render(_context)
+      ''.freeze
+    end
+
+    def unknown_tag(_tag, _markup, _tokens)
+    end
+
+    def blank?
+      true
+    end
+  end
+
+  Template.register_tag('comment'.freeze, Comment)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/continue.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/continue.rb
new file mode 100644
index 0000000..9c81ec2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/continue.rb
@@ -0,0 +1,18 @@
+module Liquid
+  # Continue tag to be used to break out of a for loop.
+  #
+  # == Basic Usage:
+  #    {% for item in collection %}
+  #      {% if item.condition %}
+  #        {% continue %}
+  #      {% endif %}
+  #    {% endfor %}
+  #
+  class Continue < Tag
+    def interrupt
+      ContinueInterrupt.new
+    end
+  end
+
+  Template.register_tag('continue'.freeze, Continue)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/cycle.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/cycle.rb
new file mode 100644
index 0000000..345b988
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/cycle.rb
@@ -0,0 +1,57 @@
+module Liquid
+  # Cycle is usually used within a loop to alternate between values, like colors or DOM classes.
+  #
+  #   {% for item in items %}
+  #     <div class="{% cycle 'red', 'green', 'blue' %}"> {{ item }} </div>
+  #   {% end %}
+  #
+  #    <div class="red"> Item one </div>
+  #    <div class="green"> Item two </div>
+  #    <div class="blue"> Item three </div>
+  #    <div class="red"> Item four </div>
+  #    <div class="green"> Item five</div>
+  #
+  class Cycle < Tag
+    SimpleSyntax = /\A#{QuotedFragment}+/o
+    NamedSyntax  = /\A(#{QuotedFragment})\s*\:\s*(.*)/om
+
+    def initialize(tag_name, markup, options)
+      super
+      case markup
+      when NamedSyntax
+        @variables = variables_from_string($2)
+        @name = Expression.parse($1)
+      when SimpleSyntax
+        @variables = variables_from_string(markup)
+        @name = @variables.to_s
+      else
+        raise SyntaxError.new(options[:locale].t("errors.syntax.cycle".freeze))
+      end
+    end
+
+    def render(context)
+      context.registers[:cycle] ||= Hash.new(0)
+
+      context.stack do
+        key = context.evaluate(@name)
+        iteration = context.registers[:cycle][key]
+        result = context.evaluate(@variables[iteration])
+        iteration += 1
+        iteration  = 0 if iteration >= @variables.size
+        context.registers[:cycle][key] = iteration
+        result
+      end
+    end
+
+    private
+
+    def variables_from_string(markup)
+      markup.split(',').collect do |var|
+        var =~ /\s*(#{QuotedFragment})\s*/o
+        $1 ? Expression.parse($1) : nil
+      end.compact
+    end
+  end
+
+  Template.register_tag('cycle', Cycle)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/decrement.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/decrement.rb
new file mode 100644
index 0000000..b5cdaaa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/decrement.rb
@@ -0,0 +1,35 @@
+module Liquid
+  # decrement is used in a place where one needs to insert a counter
+  #     into a template, and needs the counter to survive across
+  #     multiple instantiations of the template.
+  #     NOTE: decrement is a pre-decrement, --i,
+  #           while increment is post:      i++.
+  #
+  #     (To achieve the survival, the application must keep the context)
+  #
+  #     if the variable does not exist, it is created with value 0.
+
+  #   Hello: {% decrement variable %}
+  #
+  # gives you:
+  #
+  #    Hello: -1
+  #    Hello: -2
+  #    Hello: -3
+  #
+  class Decrement < Tag
+    def initialize(tag_name, markup, options)
+      super
+      @variable = markup.strip
+    end
+
+    def render(context)
+      value = context.environments.first[@variable] ||= 0
+      value -= 1
+      context.environments.first[@variable] = value
+      value.to_s
+    end
+  end
+
+  Template.register_tag('decrement'.freeze, Decrement)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/for.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/for.rb
new file mode 100644
index 0000000..55011b3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/for.rb
@@ -0,0 +1,195 @@
+module Liquid
+  # "For" iterates over an array or collection.
+  # Several useful variables are available to you within the loop.
+  #
+  # == Basic usage:
+  #    {% for item in collection %}
+  #      {{ forloop.index }}: {{ item.name }}
+  #    {% endfor %}
+  #
+  # == Advanced usage:
+  #    {% for item in collection %}
+  #      <div {% if forloop.first %}class="first"{% endif %}>
+  #        Item {{ forloop.index }}: {{ item.name }}
+  #      </div>
+  #    {% else %}
+  #      There is nothing in the collection.
+  #    {% endfor %}
+  #
+  # You can also define a limit and offset much like SQL.  Remember
+  # that offset starts at 0 for the first item.
+  #
+  #    {% for item in collection limit:5 offset:10 %}
+  #      {{ item.name }}
+  #    {% end %}
+  #
+  #  To reverse the for loop simply use {% for item in collection reversed %}
+  #
+  # == Available variables:
+  #
+  # forloop.name:: 'item-collection'
+  # forloop.length:: Length of the loop
+  # forloop.index:: The current item's position in the collection;
+  #                 forloop.index starts at 1.
+  #                 This is helpful for non-programmers who start believe
+  #                 the first item in an array is 1, not 0.
+  # forloop.index0:: The current item's position in the collection
+  #                  where the first item is 0
+  # forloop.rindex:: Number of items remaining in the loop
+  #                  (length - index) where 1 is the last item.
+  # forloop.rindex0:: Number of items remaining in the loop
+  #                   where 0 is the last item.
+  # forloop.first:: Returns true if the item is the first item.
+  # forloop.last:: Returns true if the item is the last item.
+  # forloop.parentloop:: Provides access to the parent loop, if present.
+  #
+  class For < Block
+    Syntax = /\A(#{VariableSegment}+)\s+in\s+(#{QuotedFragment}+)\s*(reversed)?/o
+
+    def initialize(tag_name, markup, options)
+      super
+      @from = @limit = nil
+      parse_with_selected_parser(markup)
+      @for_block = BlockBody.new
+      @else_block = nil
+    end
+
+    def parse(tokens)
+      return unless parse_body(@for_block, tokens)
+      parse_body(@else_block, tokens)
+    end
+
+    def nodelist
+      @else_block ? [@for_block, @else_block] : [@for_block]
+    end
+
+    def unknown_tag(tag, markup, tokens)
+      return super unless tag == 'else'.freeze
+      @else_block = BlockBody.new
+    end
+
+    def render(context)
+      segment = collection_segment(context)
+
+      if segment.empty?
+        render_else(context)
+      else
+        render_segment(context, segment)
+      end
+    end
+
+    protected
+
+    def lax_parse(markup)
+      if markup =~ Syntax
+        @variable_name = $1
+        collection_name = $2
+        @reversed = !!$3
+        @name = "#{@variable_name}-#{collection_name}"
+        @collection_name = Expression.parse(collection_name)
+        markup.scan(TagAttributes) do |key, value|
+          set_attribute(key, value)
+        end
+      else
+        raise SyntaxError.new(options[:locale].t("errors.syntax.for".freeze))
+      end
+    end
+
+    def strict_parse(markup)
+      p = Parser.new(markup)
+      @variable_name = p.consume(:id)
+      raise SyntaxError.new(options[:locale].t("errors.syntax.for_invalid_in".freeze)) unless p.id?('in'.freeze)
+      collection_name = p.expression
+      @name = "#{@variable_name}-#{collection_name}"
+      @collection_name = Expression.parse(collection_name)
+      @reversed = p.id?('reversed'.freeze)
+
+      while p.look(:id) && p.look(:colon, 1)
+        unless attribute = p.id?('limit'.freeze) || p.id?('offset'.freeze)
+          raise SyntaxError.new(options[:locale].t("errors.syntax.for_invalid_attribute".freeze))
+        end
+        p.consume
+        set_attribute(attribute, p.expression)
+      end
+      p.consume(:end_of_string)
+    end
+
+    private
+
+    def collection_segment(context)
+      offsets = context.registers[:for] ||= Hash.new(0)
+
+      from = if @from == :continue
+        offsets[@name].to_i
+      else
+        context.evaluate(@from).to_i
+      end
+
+      collection = context.evaluate(@collection_name)
+      collection = collection.to_a if collection.is_a?(Range)
+
+      limit = context.evaluate(@limit)
+      to = limit ? limit.to_i + from : nil
+
+      segment = Utils.slice_collection(collection, from, to)
+      segment.reverse! if @reversed
+
+      offsets[@name] = from + segment.length
+
+      segment
+    end
+
+    def render_segment(context, segment)
+      for_stack = context.registers[:for_stack] ||= []
+      length = segment.length
+
+      result = ''
+
+      context.stack do
+        loop_vars = Liquid::ForloopDrop.new(@name, length, for_stack[-1])
+
+        for_stack.push(loop_vars)
+
+        begin
+          context['forloop'.freeze] = loop_vars
+
+          segment.each_with_index do |item, index|
+            context[@variable_name] = item
+            result << @for_block.render(context)
+            loop_vars.send(:increment!)
+
+            # Handle any interrupts if they exist.
+            if context.interrupt?
+              interrupt = context.pop_interrupt
+              break if interrupt.is_a? BreakInterrupt
+              next if interrupt.is_a? ContinueInterrupt
+            end
+          end
+        ensure
+          for_stack.pop
+        end
+      end
+
+      result
+    end
+
+    def set_attribute(key, expr)
+      case key
+      when 'offset'.freeze
+        @from = if expr == 'continue'.freeze
+          :continue
+        else
+          Expression.parse(expr)
+        end
+      when 'limit'.freeze
+        @limit = Expression.parse(expr)
+      end
+    end
+
+    def render_else(context)
+      @else_block ? @else_block.render(context) : ''.freeze
+    end
+  end
+
+  Template.register_tag('for'.freeze, For)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/if.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/if.rb
new file mode 100644
index 0000000..40176bb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/if.rb
@@ -0,0 +1,111 @@
+module Liquid
+  # If is the conditional block
+  #
+  #   {% if user.admin %}
+  #     Admin user!
+  #   {% else %}
+  #     Not admin user
+  #   {% endif %}
+  #
+  #    There are {% if count < 5 %} less {% else %} more {% endif %} items than you need.
+  #
+  class If < Block
+    Syntax = /(#{QuotedFragment})\s*([=!<>a-z_]+)?\s*(#{QuotedFragment})?/o
+    ExpressionsAndOperators = /(?:\b(?:\s?and\s?|\s?or\s?)\b|(?:\s*(?!\b(?:\s?and\s?|\s?or\s?)\b)(?:#{QuotedFragment}|\S+)\s*)+)/o
+    BOOLEAN_OPERATORS = %w(and or)
+
+    def initialize(tag_name, markup, options)
+      super
+      @blocks = []
+      push_block('if'.freeze, markup)
+    end
+
+    def parse(tokens)
+      while parse_body(@blocks.last.attachment, tokens)
+      end
+    end
+
+    def nodelist
+      @blocks.map(&:attachment)
+    end
+
+    def unknown_tag(tag, markup, tokens)
+      if ['elsif'.freeze, 'else'.freeze].include?(tag)
+        push_block(tag, markup)
+      else
+        super
+      end
+    end
+
+    def render(context)
+      context.stack do
+        @blocks.each do |block|
+          if block.evaluate(context)
+            return block.attachment.render(context)
+          end
+        end
+        ''.freeze
+      end
+    end
+
+    private
+
+    def push_block(tag, markup)
+      block = if tag == 'else'.freeze
+        ElseCondition.new
+      else
+        parse_with_selected_parser(markup)
+      end
+
+      @blocks.push(block)
+      block.attach(BlockBody.new)
+    end
+
+    def lax_parse(markup)
+      expressions = markup.scan(ExpressionsAndOperators)
+      raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop =~ Syntax
+
+      condition = Condition.new(Expression.parse($1), $2, Expression.parse($3))
+
+      until expressions.empty?
+        operator = expressions.pop.to_s.strip
+
+        raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless expressions.pop.to_s =~ Syntax
+
+        new_condition = Condition.new(Expression.parse($1), $2, Expression.parse($3))
+        raise(SyntaxError.new(options[:locale].t("errors.syntax.if".freeze))) unless BOOLEAN_OPERATORS.include?(operator)
+        new_condition.send(operator, condition)
+        condition = new_condition
+      end
+
+      condition
+    end
+
+    def strict_parse(markup)
+      p = Parser.new(markup)
+      condition = parse_binary_comparison(p)
+      p.consume(:end_of_string)
+      condition
+    end
+
+    def parse_binary_comparison(p)
+      condition = parse_comparison(p)
+      if op = (p.id?('and'.freeze) || p.id?('or'.freeze))
+        condition.send(op, parse_binary_comparison(p))
+      end
+      condition
+    end
+
+    def parse_comparison(p)
+      a = Expression.parse(p.expression)
+      if op = p.consume?(:comparison)
+        b = Expression.parse(p.expression)
+        Condition.new(a, op, b)
+      else
+        Condition.new(a)
+      end
+    end
+  end
+
+  Template.register_tag('if'.freeze, If)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/ifchanged.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/ifchanged.rb
new file mode 100644
index 0000000..d70cbe1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/ifchanged.rb
@@ -0,0 +1,18 @@
+module Liquid
+  class Ifchanged < Block
+    def render(context)
+      context.stack do
+        output = super
+
+        if output != context.registers[:ifchanged]
+          context.registers[:ifchanged] = output
+          output
+        else
+          ''.freeze
+        end
+      end
+    end
+  end
+
+  Template.register_tag('ifchanged'.freeze, Ifchanged)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/include.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/include.rb
new file mode 100644
index 0000000..9234eb4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/include.rb
@@ -0,0 +1,113 @@
+module Liquid
+  # Include allows templates to relate with other templates
+  #
+  # Simply include another template:
+  #
+  #   {% include 'product' %}
+  #
+  # Include a template with a local variable:
+  #
+  #   {% include 'product' with products[0] %}
+  #
+  # Include a template for a collection:
+  #
+  #   {% include 'product' for products %}
+  #
+  class Include < Tag
+    Syntax = /(#{QuotedFragment}+)(\s+(?:with|for)\s+(#{QuotedFragment}+))?/o
+
+    def initialize(tag_name, markup, options)
+      super
+
+      if markup =~ Syntax
+
+        template_name = $1
+        variable_name = $3
+
+        @variable_name_expr = variable_name ? Expression.parse(variable_name) : nil
+        @template_name_expr = Expression.parse(template_name)
+        @attributes = {}
+
+        markup.scan(TagAttributes) do |key, value|
+          @attributes[key] = Expression.parse(value)
+        end
+
+      else
+        raise SyntaxError.new(options[:locale].t("errors.syntax.include".freeze))
+      end
+    end
+
+    def parse(_tokens)
+    end
+
+    def render(context)
+      template_name = context.evaluate(@template_name_expr)
+      raise ArgumentError.new(options[:locale].t("errors.argument.include")) unless template_name
+
+      partial = load_cached_partial(template_name, context)
+      context_variable_name = template_name.split('/'.freeze).last
+
+      variable = if @variable_name_expr
+        context.evaluate(@variable_name_expr)
+      else
+        context.find_variable(template_name)
+      end
+
+      old_template_name = context.template_name
+      old_partial = context.partial
+      begin
+        context.template_name = template_name
+        context.partial = true
+        context.stack do
+          @attributes.each do |key, value|
+            context[key] = context.evaluate(value)
+          end
+
+          if variable.is_a?(Array)
+            variable.collect do |var|
+              context[context_variable_name] = var
+              partial.render(context)
+            end
+          else
+            context[context_variable_name] = variable
+            partial.render(context)
+          end
+        end
+      ensure
+        context.template_name = old_template_name
+        context.partial = old_partial
+      end
+    end
+
+    private
+
+    alias_method :parse_context, :options
+    private :parse_context
+
+    def load_cached_partial(template_name, context)
+      cached_partials = context.registers[:cached_partials] || {}
+
+      if cached = cached_partials[template_name]
+        return cached
+      end
+      source = read_template_from_file_system(context)
+      begin
+        parse_context.partial = true
+        partial = Liquid::Template.parse(source, parse_context)
+      ensure
+        parse_context.partial = false
+      end
+      cached_partials[template_name] = partial
+      context.registers[:cached_partials] = cached_partials
+      partial
+    end
+
+    def read_template_from_file_system(context)
+      file_system = context.registers[:file_system] || Liquid::Template.file_system
+
+      file_system.read_template_file(context.evaluate(@template_name_expr))
+    end
+  end
+
+  Template.register_tag('include'.freeze, Include)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/increment.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/increment.rb
new file mode 100644
index 0000000..baa0cbb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/increment.rb
@@ -0,0 +1,31 @@
+module Liquid
+  # increment is used in a place where one needs to insert a counter
+  #     into a template, and needs the counter to survive across
+  #     multiple instantiations of the template.
+  #     (To achieve the survival, the application must keep the context)
+  #
+  #     if the variable does not exist, it is created with value 0.
+  #
+  #   Hello: {% increment variable %}
+  #
+  # gives you:
+  #
+  #    Hello: 0
+  #    Hello: 1
+  #    Hello: 2
+  #
+  class Increment < Tag
+    def initialize(tag_name, markup, options)
+      super
+      @variable = markup.strip
+    end
+
+    def render(context)
+      value = context.environments.first[@variable] ||= 0
+      context.environments.first[@variable] = value + 1
+      value.to_s
+    end
+  end
+
+  Template.register_tag('increment'.freeze, Increment)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/raw.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/raw.rb
new file mode 100644
index 0000000..6b461bd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/raw.rb
@@ -0,0 +1,47 @@
+module Liquid
+  class Raw < Block
+    Syntax = /\A\s*\z/
+    FullTokenPossiblyInvalid = /\A(.*)#{TagStart}\s*(\w+)\s*(.*)?#{TagEnd}\z/om
+
+    def initialize(tag_name, markup, parse_context)
+      super
+
+      ensure_valid_markup(tag_name, markup, parse_context)
+    end
+
+    def parse(tokens)
+      @body = ''
+      while token = tokens.shift
+        if token =~ FullTokenPossiblyInvalid
+          @body << $1 if $1 != "".freeze
+          return if block_delimiter == $2
+        end
+        @body << token unless token.empty?
+      end
+
+      raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_never_closed".freeze, block_name: block_name))
+    end
+
+    def render(_context)
+      @body
+    end
+
+    def nodelist
+      [@body]
+    end
+
+    def blank?
+      @body.empty?
+    end
+
+    protected
+
+    def ensure_valid_markup(tag_name, markup, parse_context)
+      unless markup =~ Syntax
+        raise SyntaxError.new(parse_context.locale.t("errors.syntax.tag_unexpected_args".freeze, tag: tag_name))
+      end
+    end
+  end
+
+  Template.register_tag('raw'.freeze, Raw)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/table_row.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/table_row.rb
new file mode 100644
index 0000000..acd91e0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/table_row.rb
@@ -0,0 +1,54 @@
+module Liquid
+  class TableRow < Block
+    Syntax = /(\w+)\s+in\s+(#{QuotedFragment}+)/o
+
+    def initialize(tag_name, markup, options)
+      super
+      if markup =~ Syntax
+        @variable_name = $1
+        @collection_name = Expression.parse($2)
+        @attributes = {}
+        markup.scan(TagAttributes) do |key, value|
+          @attributes[key] = Expression.parse(value)
+        end
+      else
+        raise SyntaxError.new(options[:locale].t("errors.syntax.table_row".freeze))
+      end
+    end
+
+    def render(context)
+      collection = context.evaluate(@collection_name) or return ''.freeze
+
+      from = @attributes.key?('offset'.freeze) ? context.evaluate(@attributes['offset'.freeze]).to_i : 0
+      to = @attributes.key?('limit'.freeze) ? from + context.evaluate(@attributes['limit'.freeze]).to_i : nil
+
+      collection = Utils.slice_collection(collection, from, to)
+
+      length = collection.length
+
+      cols = context.evaluate(@attributes['cols'.freeze]).to_i
+
+      result = "<tr class=\"row1\">\n"
+      context.stack do
+        tablerowloop = Liquid::TablerowloopDrop.new(length, cols)
+        context['tablerowloop'.freeze] = tablerowloop
+
+        collection.each_with_index do |item, index|
+          context[@variable_name] = item
+
+          result << "<td class=\"col#{tablerowloop.col}\">" << super << '</td>'
+
+          if tablerowloop.col_last && !tablerowloop.last
+            result << "</tr>\n<tr class=\"row#{tablerowloop.row + 1}\">"
+          end
+
+          tablerowloop.send(:increment!)
+        end
+      end
+      result << "</tr>\n"
+      result
+    end
+  end
+
+  Template.register_tag('tablerow'.freeze, TableRow)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/unless.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/unless.rb
new file mode 100644
index 0000000..1d4280d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tags/unless.rb
@@ -0,0 +1,30 @@
+require_relative 'if'
+
+module Liquid
+  # Unless is a conditional just like 'if' but works on the inverse logic.
+  #
+  #   {% unless x < 0 %} x is greater than zero {% endunless %}
+  #
+  class Unless < If
+    def render(context)
+      context.stack do
+        # First condition is interpreted backwards ( if not )
+        first_block = @blocks.first
+        unless first_block.evaluate(context)
+          return first_block.attachment.render(context)
+        end
+
+        # After the first condition unless works just like if
+        @blocks[1..-1].each do |block|
+          if block.evaluate(context)
+            return block.attachment.render(context)
+          end
+        end
+
+        ''.freeze
+      end
+    end
+  end
+
+  Template.register_tag('unless'.freeze, Unless)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/template.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/template.rb
new file mode 100644
index 0000000..31a67e4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/template.rb
@@ -0,0 +1,254 @@
+module Liquid
+  # Templates are central to liquid.
+  # Interpretating templates is a two step process. First you compile the
+  # source code you got. During compile time some extensive error checking is performed.
+  # your code should expect to get some SyntaxErrors.
+  #
+  # After you have a compiled template you can then <tt>render</tt> it.
+  # You can use a compiled template over and over again and keep it cached.
+  #
+  # Example:
+  #
+  #   template = Liquid::Template.parse(source)
+  #   template.render('user_name' => 'bob')
+  #
+  class Template
+    attr_accessor :root
+    attr_reader :resource_limits, :warnings
+
+    @@file_system = BlankFileSystem.new
+
+    class TagRegistry
+      include Enumerable
+
+      def initialize
+        @tags = {}
+        @cache = {}
+      end
+
+      def [](tag_name)
+        return nil unless @tags.key?(tag_name)
+        return @cache[tag_name] if Liquid.cache_classes
+
+        lookup_class(@tags[tag_name]).tap { |o| @cache[tag_name] = o }
+      end
+
+      def []=(tag_name, klass)
+        @tags[tag_name]  = klass.name
+        @cache[tag_name] = klass
+      end
+
+      def delete(tag_name)
+        @tags.delete(tag_name)
+        @cache.delete(tag_name)
+      end
+
+      def each(&block)
+        @tags.each(&block)
+      end
+
+      private
+
+      def lookup_class(name)
+        name.split("::").reject(&:empty?).reduce(Object) { |scope, const| scope.const_get(const) }
+      end
+    end
+
+    attr_reader :profiler
+
+    class << self
+      # Sets how strict the parser should be.
+      # :lax acts like liquid 2.5 and silently ignores malformed tags in most cases.
+      # :warn is the default and will give deprecation warnings when invalid syntax is used.
+      # :strict will enforce correct syntax.
+      attr_writer :error_mode
+
+      # Sets how strict the taint checker should be.
+      # :lax is the default, and ignores the taint flag completely
+      # :warn adds a warning, but does not interrupt the rendering
+      # :error raises an error when tainted output is used
+      attr_writer :taint_mode
+
+      attr_accessor :default_exception_renderer
+      Template.default_exception_renderer = lambda do |exception|
+        exception
+      end
+
+      def file_system
+        @@file_system
+      end
+
+      def file_system=(obj)
+        @@file_system = obj
+      end
+
+      def register_tag(name, klass)
+        tags[name.to_s] = klass
+      end
+
+      def tags
+        @tags ||= TagRegistry.new
+      end
+
+      def error_mode
+        @error_mode ||= :lax
+      end
+
+      def taint_mode
+        @taint_mode ||= :lax
+      end
+
+      # Pass a module with filter methods which should be available
+      # to all liquid views. Good for registering the standard library
+      def register_filter(mod)
+        Strainer.global_filter(mod)
+      end
+
+      def default_resource_limits
+        @default_resource_limits ||= {}
+      end
+
+      # creates a new <tt>Template</tt> object from liquid source code
+      # To enable profiling, pass in <tt>profile: true</tt> as an option.
+      # See Liquid::Profiler for more information
+      def parse(source, options = {})
+        template = Template.new
+        template.parse(source, options)
+      end
+    end
+
+    def initialize
+      @rethrow_errors = false
+      @resource_limits = ResourceLimits.new(self.class.default_resource_limits)
+    end
+
+    # Parse source code.
+    # Returns self for easy chaining
+    def parse(source, options = {})
+      @options = options
+      @profiling = options[:profile]
+      @line_numbers = options[:line_numbers] || @profiling
+      parse_context = options.is_a?(ParseContext) ? options : ParseContext.new(options)
+      @root = Document.parse(tokenize(source), parse_context)
+      @warnings = parse_context.warnings
+      self
+    end
+
+    def registers
+      @registers ||= {}
+    end
+
+    def assigns
+      @assigns ||= {}
+    end
+
+    def instance_assigns
+      @instance_assigns ||= {}
+    end
+
+    def errors
+      @errors ||= []
+    end
+
+    # Render takes a hash with local variables.
+    #
+    # if you use the same filters over and over again consider registering them globally
+    # with <tt>Template.register_filter</tt>
+    #
+    # if profiling was enabled in <tt>Template#parse</tt> then the resulting profiling information
+    # will be available via <tt>Template#profiler</tt>
+    #
+    # Following options can be passed:
+    #
+    #  * <tt>filters</tt> : array with local filters
+    #  * <tt>registers</tt> : hash with register variables. Those can be accessed from
+    #    filters and tags and might be useful to integrate liquid more with its host application
+    #
+    def render(*args)
+      return ''.freeze if @root.nil?
+
+      context = case args.first
+      when Liquid::Context
+        c = args.shift
+
+        if @rethrow_errors
+          c.exception_renderer = ->(e) { raise }
+        end
+
+        c
+      when Liquid::Drop
+        drop = args.shift
+        drop.context = Context.new([drop, assigns], instance_assigns, registers, @rethrow_errors, @resource_limits)
+      when Hash
+        Context.new([args.shift, assigns], instance_assigns, registers, @rethrow_errors, @resource_limits)
+      when nil
+        Context.new(assigns, instance_assigns, registers, @rethrow_errors, @resource_limits)
+      else
+        raise ArgumentError, "Expected Hash or Liquid::Context as parameter"
+      end
+
+      case args.last
+      when Hash
+        options = args.pop
+
+        registers.merge!(options[:registers]) if options[:registers].is_a?(Hash)
+
+        apply_options_to_context(context, options)
+      when Module, Array
+        context.add_filters(args.pop)
+      end
+
+      # Retrying a render resets resource usage
+      context.resource_limits.reset
+
+      begin
+        # render the nodelist.
+        # for performance reasons we get an array back here. join will make a string out of it.
+        result = with_profiling(context) do
+          @root.render(context)
+        end
+        result.respond_to?(:join) ? result.join : result
+      rescue Liquid::MemoryError => e
+        context.handle_error(e)
+      ensure
+        @errors = context.errors
+      end
+    end
+
+    def render!(*args)
+      @rethrow_errors = true
+      render(*args)
+    end
+
+    private
+
+    def tokenize(source)
+      Tokenizer.new(source, @line_numbers)
+    end
+
+    def with_profiling(context)
+      if @profiling && !context.partial
+        raise "Profiler not loaded, require 'liquid/profiler' first" unless defined?(Liquid::Profiler)
+
+        @profiler = Profiler.new
+        @profiler.start
+
+        begin
+          yield
+        ensure
+          @profiler.stop
+        end
+      else
+        yield
+      end
+    end
+
+    def apply_options_to_context(context, options)
+      context.add_filters(options[:filters]) if options[:filters]
+      context.global_filter = options[:global_filter] if options[:global_filter]
+      context.exception_renderer = options[:exception_renderer] if options[:exception_renderer]
+      context.strict_variables = options[:strict_variables] if options[:strict_variables]
+      context.strict_filters = options[:strict_filters] if options[:strict_filters]
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tokenizer.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tokenizer.rb
new file mode 100644
index 0000000..d03657e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/tokenizer.rb
@@ -0,0 +1,31 @@
+module Liquid
+  class Tokenizer
+    attr_reader :line_number
+
+    def initialize(source, line_numbers = false)
+      @source = source
+      @line_number = line_numbers ? 1 : nil
+      @tokens = tokenize
+    end
+
+    def shift
+      token = @tokens.shift
+      @line_number += token.count("\n") if @line_number && token
+      token
+    end
+
+    private
+
+    def tokenize
+      @source = @source.source if @source.respond_to?(:source)
+      return [] if @source.to_s.empty?
+
+      tokens = @source.split(TemplateParser)
+
+      # removes the rogue empty element at the beginning of the array
+      tokens.shift if tokens[0] && tokens[0].empty?
+
+      tokens
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/utils.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/utils.rb
new file mode 100644
index 0000000..fc05ac5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/utils.rb
@@ -0,0 +1,83 @@
+module Liquid
+  module Utils
+    def self.slice_collection(collection, from, to)
+      if (from != 0 || !to.nil?) && collection.respond_to?(:load_slice)
+        collection.load_slice(from, to)
+      else
+        slice_collection_using_each(collection, from, to)
+      end
+    end
+
+    def self.slice_collection_using_each(collection, from, to)
+      segments = []
+      index = 0
+
+      # Maintains Ruby 1.8.7 String#each behaviour on 1.9
+      if collection.is_a?(String)
+        return collection.empty? ? [] : [collection]
+      end
+      return [] unless collection.respond_to?(:each)
+
+      collection.each do |item|
+        if to && to <= index
+          break
+        end
+
+        if from <= index
+          segments << item
+        end
+
+        index += 1
+      end
+
+      segments
+    end
+
+    def self.to_integer(num)
+      return num if num.is_a?(Integer)
+      num = num.to_s
+      begin
+        Integer(num)
+      rescue ::ArgumentError
+        raise Liquid::ArgumentError, "invalid integer"
+      end
+    end
+
+    def self.to_number(obj)
+      case obj
+      when Float
+        BigDecimal.new(obj.to_s)
+      when Numeric
+        obj
+      when String
+        (obj.strip =~ /\A-?\d+\.\d+\z/) ? BigDecimal.new(obj) : obj.to_i
+      else
+        if obj.respond_to?(:to_number)
+          obj.to_number
+        else
+          0
+        end
+      end
+    end
+
+    def self.to_date(obj)
+      return obj if obj.respond_to?(:strftime)
+
+      if obj.is_a?(String)
+        return nil if obj.empty?
+        obj = obj.downcase
+      end
+
+      case obj
+      when 'now'.freeze, 'today'.freeze
+        Time.now
+      when /\A\d+\z/, Integer
+        Time.at(obj.to_i)
+      when String
+        Time.parse(obj)
+      end
+    rescue ::ArgumentError
+      nil
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/variable.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/variable.rb
new file mode 100644
index 0000000..8006ac7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/variable.rb
@@ -0,0 +1,136 @@
+module Liquid
+  # Holds variables. Variables are only loaded "just in time"
+  # and are not evaluated as part of the render stage
+  #
+  #   {{ monkey }}
+  #   {{ user.name }}
+  #
+  # Variables can be combined with filters:
+  #
+  #   {{ user | link }}
+  #
+  class Variable
+    FilterParser = /(?:\s+|#{QuotedFragment}|#{ArgumentSeparator})+/o
+    attr_accessor :filters, :name, :line_number
+    attr_reader :parse_context
+    alias_method :options, :parse_context
+    include ParserSwitching
+
+    def initialize(markup, parse_context)
+      @markup  = markup
+      @name    = nil
+      @parse_context = parse_context
+      @line_number = parse_context.line_number
+
+      parse_with_selected_parser(markup)
+    end
+
+    def raw
+      @markup
+    end
+
+    def markup_context(markup)
+      "in \"{{#{markup}}}\""
+    end
+
+    def lax_parse(markup)
+      @filters = []
+      return unless markup =~ /(#{QuotedFragment})(.*)/om
+
+      name_markup = $1
+      filter_markup = $2
+      @name = Expression.parse(name_markup)
+      if filter_markup =~ /#{FilterSeparator}\s*(.*)/om
+        filters = $1.scan(FilterParser)
+        filters.each do |f|
+          next unless f =~ /\w+/
+          filtername = Regexp.last_match(0)
+          filterargs = f.scan(/(?:#{FilterArgumentSeparator}|#{ArgumentSeparator})\s*((?:\w+\s*\:\s*)?#{QuotedFragment})/o).flatten
+          @filters << parse_filter_expressions(filtername, filterargs)
+        end
+      end
+    end
+
+    def strict_parse(markup)
+      @filters = []
+      p = Parser.new(markup)
+
+      @name = Expression.parse(p.expression)
+      while p.consume?(:pipe)
+        filtername = p.consume(:id)
+        filterargs = p.consume?(:colon) ? parse_filterargs(p) : []
+        @filters << parse_filter_expressions(filtername, filterargs)
+      end
+      p.consume(:end_of_string)
+    end
+
+    def parse_filterargs(p)
+      # first argument
+      filterargs = [p.argument]
+      # followed by comma separated others
+      filterargs << p.argument while p.consume?(:comma)
+      filterargs
+    end
+
+    def render(context)
+      obj = @filters.inject(context.evaluate(@name)) do |output, (filter_name, filter_args, filter_kwargs)|
+        filter_args = evaluate_filter_expressions(context, filter_args, filter_kwargs)
+        context.invoke(filter_name, output, *filter_args)
+      end
+
+      obj = context.apply_global_filter(obj)
+
+      taint_check(context, obj)
+
+      obj
+    end
+
+    private
+
+    def parse_filter_expressions(filter_name, unparsed_args)
+      filter_args = []
+      keyword_args = {}
+      unparsed_args.each do |a|
+        if matches = a.match(/\A#{TagAttributes}\z/o)
+          keyword_args[matches[1]] = Expression.parse(matches[2])
+        else
+          filter_args << Expression.parse(a)
+        end
+      end
+      result = [filter_name, filter_args]
+      result << keyword_args unless keyword_args.empty?
+      result
+    end
+
+    def evaluate_filter_expressions(context, filter_args, filter_kwargs)
+      parsed_args = filter_args.map{ |expr| context.evaluate(expr) }
+      if filter_kwargs
+        parsed_kwargs = {}
+        filter_kwargs.each do |key, expr|
+          parsed_kwargs[key] = context.evaluate(expr)
+        end
+        parsed_args << parsed_kwargs
+      end
+      parsed_args
+    end
+
+    def taint_check(context, obj)
+      return unless obj.tainted?
+      return if Template.taint_mode == :lax
+
+      @markup =~ QuotedFragment
+      name = Regexp.last_match(0)
+
+      error = TaintedError.new("variable '#{name}' is tainted and was not escaped")
+      error.line_number = line_number
+      error.template_name = context.template_name
+
+      case Template.taint_mode
+      when :warn
+        context.warnings << error
+      when :error
+        raise error
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/variable_lookup.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/variable_lookup.rb
new file mode 100644
index 0000000..3ed4e4a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/variable_lookup.rb
@@ -0,0 +1,82 @@
+module Liquid
+  class VariableLookup
+    SQUARE_BRACKETED = /\A\[(.*)\]\z/m
+    COMMAND_METHODS = ['size'.freeze, 'first'.freeze, 'last'.freeze]
+
+    attr_reader :name, :lookups
+
+    def self.parse(markup)
+      new(markup)
+    end
+
+    def initialize(markup)
+      lookups = markup.scan(VariableParser)
+
+      name = lookups.shift
+      if name =~ SQUARE_BRACKETED
+        name = Expression.parse($1)
+      end
+      @name = name
+
+      @lookups = lookups
+      @command_flags = 0
+
+      @lookups.each_index do |i|
+        lookup = lookups[i]
+        if lookup =~ SQUARE_BRACKETED
+          lookups[i] = Expression.parse($1)
+        elsif COMMAND_METHODS.include?(lookup)
+          @command_flags |= 1 << i
+        end
+      end
+    end
+
+    def evaluate(context)
+      name = context.evaluate(@name)
+      object = context.find_variable(name)
+
+      @lookups.each_index do |i|
+        key = context.evaluate(@lookups[i])
+
+        # If object is a hash- or array-like object we look for the
+        # presence of the key and if its available we return it
+        if object.respond_to?(:[]) &&
+            ((object.respond_to?(:key?) && object.key?(key)) ||
+             (object.respond_to?(:fetch) && key.is_a?(Integer)))
+
+          # if its a proc we will replace the entry with the proc
+          res = context.lookup_and_evaluate(object, key)
+          object = res.to_liquid
+
+          # Some special cases. If the part wasn't in square brackets and
+          # no key with the same name was found we interpret following calls
+          # as commands and call them on the current object
+        elsif @command_flags & (1 << i) != 0 && object.respond_to?(key)
+          object = object.send(key).to_liquid
+
+          # No key was present with the desired value and it wasn't one of the directly supported
+          # keywords either. The only thing we got left is to return nil or
+          # raise an exception if `strict_variables` option is set to true
+        else
+          return nil unless context.strict_variables
+          raise Liquid::UndefinedVariable, "undefined variable #{key}"
+        end
+
+        # If we are dealing with a drop here we have to
+        object.context = context if object.respond_to?(:context=)
+      end
+
+      object
+    end
+
+    def ==(other)
+      self.class == other.class && state == other.state
+    end
+
+    protected
+
+    def state
+      [@name, @lookups, @command_flags]
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/version.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/version.rb
new file mode 100644
index 0000000..af15e07
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/lib/liquid/version.rb
@@ -0,0 +1,4 @@
+# encoding: utf-8
+module Liquid
+  VERSION = "4.0.0"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/fixtures/en_locale.yml b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/fixtures/en_locale.yml
new file mode 100644
index 0000000..0b113c6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/fixtures/en_locale.yml
@@ -0,0 +1,9 @@
+---
+  simple: "less is more"
+  whatever: "something %{something}"
+  errors:
+    i18n:
+      undefined_interpolation: "undefined key %{key}"
+      unknown_translation: "translation '%{name}' wasn't found"
+    syntax:
+      oops: "something wasn't right"
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/assign_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/assign_test.rb
new file mode 100644
index 0000000..5502289
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/assign_test.rb
@@ -0,0 +1,48 @@
+require 'test_helper'
+
+class AssignTest < Minitest::Test
+  include Liquid
+
+  def test_assign_with_hyphen_in_variable_name
+    template_source = <<-END_TEMPLATE
+    {% assign this-thing = 'Print this-thing' %}
+    {{ this-thing }}
+    END_TEMPLATE
+    template = Template.parse(template_source)
+    rendered = template.render!
+    assert_equal "Print this-thing", rendered.strip
+  end
+
+  def test_assigned_variable
+    assert_template_result('.foo.',
+      '{% assign foo = values %}.{{ foo[0] }}.',
+      'values' => %w(foo bar baz))
+
+    assert_template_result('.bar.',
+      '{% assign foo = values %}.{{ foo[1] }}.',
+      'values' => %w(foo bar baz))
+  end
+
+  def test_assign_with_filter
+    assert_template_result('.bar.',
+      '{% assign foo = values | split: "," %}.{{ foo[1] }}.',
+      'values' => "foo,bar,baz")
+  end
+
+  def test_assign_syntax_error
+    assert_match_syntax_error(/assign/,
+      '{% assign foo not values %}.',
+      'values' => "foo,bar,baz")
+  end
+
+  def test_assign_uses_error_mode
+    with_error_mode(:strict) do
+      assert_raises(SyntaxError) do
+        Template.parse("{% assign foo = ('X' | downcase) %}")
+      end
+    end
+    with_error_mode(:lax) do
+      assert Template.parse("{% assign foo = ('X' | downcase) %}")
+    end
+  end
+end # AssignTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/blank_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/blank_test.rb
new file mode 100644
index 0000000..e9b56df
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/blank_test.rb
@@ -0,0 +1,106 @@
+require 'test_helper'
+
+class FoobarTag < Liquid::Tag
+  def render(*args)
+    " "
+  end
+
+  Liquid::Template.register_tag('foobar', FoobarTag)
+end
+
+class BlankTestFileSystem
+  def read_template_file(template_path)
+    template_path
+  end
+end
+
+class BlankTest < Minitest::Test
+  include Liquid
+  N = 10
+
+  def wrap_in_for(body)
+    "{% for i in (1..#{N}) %}#{body}{% endfor %}"
+  end
+
+  def wrap_in_if(body)
+    "{% if true %}#{body}{% endif %}"
+  end
+
+  def wrap(body)
+    wrap_in_for(body) + wrap_in_if(body)
+  end
+
+  def test_new_tags_are_not_blank_by_default
+    assert_template_result(" " * N, wrap_in_for("{% foobar %}"))
+  end
+
+  def test_loops_are_blank
+    assert_template_result("", wrap_in_for(" "))
+  end
+
+  def test_if_else_are_blank
+    assert_template_result("", "{% if true %} {% elsif false %} {% else %} {% endif %}")
+  end
+
+  def test_unless_is_blank
+    assert_template_result("", wrap("{% unless true %} {% endunless %}"))
+  end
+
+  def test_mark_as_blank_only_during_parsing
+    assert_template_result(" " * (N + 1), wrap(" {% if false %} this never happens, but still, this block is not blank {% endif %}"))
+  end
+
+  def test_comments_are_blank
+    assert_template_result("", wrap(" {% comment %} whatever {% endcomment %} "))
+  end
+
+  def test_captures_are_blank
+    assert_template_result("", wrap(" {% capture foo %} whatever {% endcapture %} "))
+  end
+
+  def test_nested_blocks_are_blank_but_only_if_all_children_are
+    assert_template_result("", wrap(wrap(" ")))
+    assert_template_result("\n       but this is not " * (N + 1),
+      wrap('{% if true %} {% comment %} this is blank {% endcomment %} {% endif %}
+      {% if true %} but this is not {% endif %}'))
+  end
+
+  def test_assigns_are_blank
+    assert_template_result("", wrap(' {% assign foo = "bar" %} '))
+  end
+
+  def test_whitespace_is_blank
+    assert_template_result("", wrap(" "))
+    assert_template_result("", wrap("\t"))
+  end
+
+  def test_whitespace_is_not_blank_if_other_stuff_is_present
+    body = "     x "
+    assert_template_result(body * (N + 1), wrap(body))
+  end
+
+  def test_increment_is_not_blank
+    assert_template_result(" 0" * 2 * (N + 1), wrap("{% assign foo = 0 %} {% increment foo %} {% decrement foo %}"))
+  end
+
+  def test_cycle_is_not_blank
+    assert_template_result("  " * ((N + 1) / 2) + " ", wrap("{% cycle ' ', ' ' %}"))
+  end
+
+  def test_raw_is_not_blank
+    assert_template_result("  " * (N + 1), wrap(" {% raw %} {% endraw %}"))
+  end
+
+  def test_include_is_blank
+    Liquid::Template.file_system = BlankTestFileSystem.new
+    assert_template_result "foobar" * (N + 1), wrap("{% include 'foobar' %}")
+    assert_template_result " foobar " * (N + 1), wrap("{% include ' foobar ' %}")
+    assert_template_result "   " * (N + 1), wrap(" {% include ' ' %} ")
+  end
+
+  def test_case_is_blank
+    assert_template_result("", wrap(" {% assign foo = 'bar' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} {% endcase %} "))
+    assert_template_result("", wrap(" {% assign foo = 'else' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} {% endcase %} "))
+    assert_template_result("   x  " * (N + 1), wrap(" {% assign foo = 'else' %} {% case foo %} {% when 'bar' %} {% when 'whatever' %} {% else %} x {% endcase %} "))
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/capture_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/capture_test.rb
new file mode 100644
index 0000000..8d965b3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/capture_test.rb
@@ -0,0 +1,50 @@
+require 'test_helper'
+
+class CaptureTest < Minitest::Test
+  include Liquid
+
+  def test_captures_block_content_in_variable
+    assert_template_result("test string", "{% capture 'var' %}test string{% endcapture %}{{var}}", {})
+  end
+
+  def test_capture_with_hyphen_in_variable_name
+    template_source = <<-END_TEMPLATE
+    {% capture this-thing %}Print this-thing{% endcapture %}
+    {{ this-thing }}
+    END_TEMPLATE
+    template = Template.parse(template_source)
+    rendered = template.render!
+    assert_equal "Print this-thing", rendered.strip
+  end
+
+  def test_capture_to_variable_from_outer_scope_if_existing
+    template_source = <<-END_TEMPLATE
+    {% assign var = '' %}
+    {% if true %}
+    {% capture var %}first-block-string{% endcapture %}
+    {% endif %}
+    {% if true %}
+    {% capture var %}test-string{% endcapture %}
+    {% endif %}
+    {{var}}
+    END_TEMPLATE
+    template = Template.parse(template_source)
+    rendered = template.render!
+    assert_equal "test-string", rendered.gsub(/\s/, '')
+  end
+
+  def test_assigning_from_capture
+    template_source = <<-END_TEMPLATE
+    {% assign first = '' %}
+    {% assign second = '' %}
+    {% for number in (1..3) %}
+    {% capture first %}{{number}}{% endcapture %}
+    {% assign second = first %}
+    {% endfor %}
+    {{ first }}-{{ second }}
+    END_TEMPLATE
+    template = Template.parse(template_source)
+    rendered = template.render!
+    assert_equal "3-3", rendered.gsub(/\s/, '')
+  end
+end # CaptureTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/context_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/context_test.rb
new file mode 100644
index 0000000..2d109bb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/context_test.rb
@@ -0,0 +1,32 @@
+require 'test_helper'
+
+class ContextTest < Minitest::Test
+  include Liquid
+
+  def test_override_global_filter
+    global = Module.new do
+      def notice(output)
+        "Global #{output}"
+      end
+    end
+
+    local = Module.new do
+      def notice(output)
+        "Local #{output}"
+      end
+    end
+
+    with_global_filter(global) do
+      assert_equal 'Global test', Template.parse("{{'test' | notice }}").render!
+      assert_equal 'Local test', Template.parse("{{'test' | notice }}").render!({}, filters: [local])
+    end
+  end
+
+  def test_has_key_will_not_add_an_error_for_missing_keys
+    with_error_mode :strict do
+      context = Context.new
+      context.key?('unknown')
+      assert_empty context.errors
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/document_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/document_test.rb
new file mode 100644
index 0000000..bcc4a21
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/document_test.rb
@@ -0,0 +1,19 @@
+require 'test_helper'
+
+class DocumentTest < Minitest::Test
+  include Liquid
+
+  def test_unexpected_outer_tag
+    exc = assert_raises(SyntaxError) do
+      Template.parse("{% else %}")
+    end
+    assert_equal exc.message, "Liquid syntax error: Unexpected outer 'else' tag"
+  end
+
+  def test_unknown_tag
+    exc = assert_raises(SyntaxError) do
+      Template.parse("{% foo %}")
+    end
+    assert_equal exc.message, "Liquid syntax error: Unknown tag 'foo'"
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/drop_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/drop_test.rb
new file mode 100644
index 0000000..2de4a5a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/drop_test.rb
@@ -0,0 +1,273 @@
+require 'test_helper'
+
+class ContextDrop < Liquid::Drop
+  def scopes
+    @context.scopes.size
+  end
+
+  def scopes_as_array
+    (1..@context.scopes.size).to_a
+  end
+
+  def loop_pos
+    @context['forloop.index']
+  end
+
+  def liquid_method_missing(method)
+    @context[method]
+  end
+end
+
+class ProductDrop < Liquid::Drop
+  class TextDrop < Liquid::Drop
+    def array
+      ['text1', 'text2']
+    end
+
+    def text
+      'text1'
+    end
+  end
+
+  class CatchallDrop < Liquid::Drop
+    def liquid_method_missing(method)
+      'catchall_method: ' << method.to_s
+    end
+  end
+
+  def texts
+    TextDrop.new
+  end
+
+  def catchall
+    CatchallDrop.new
+  end
+
+  def context
+    ContextDrop.new
+  end
+
+  def user_input
+    "foo".taint
+  end
+
+  protected
+
+  def callmenot
+    "protected"
+  end
+end
+
+class EnumerableDrop < Liquid::Drop
+  def liquid_method_missing(method)
+    method
+  end
+
+  def size
+    3
+  end
+
+  def first
+    1
+  end
+
+  def count
+    3
+  end
+
+  def min
+    1
+  end
+
+  def max
+    3
+  end
+
+  def each
+    yield 1
+    yield 2
+    yield 3
+  end
+end
+
+class RealEnumerableDrop < Liquid::Drop
+  include Enumerable
+
+  def liquid_method_missing(method)
+    method
+  end
+
+  def each
+    yield 1
+    yield 2
+    yield 3
+  end
+end
+
+class DropsTest < Minitest::Test
+  include Liquid
+
+  def test_product_drop
+    tpl = Liquid::Template.parse('  ')
+    assert_equal '  ', tpl.render!('product' => ProductDrop.new)
+  end
+
+  def test_rendering_raises_on_tainted_attr
+    with_taint_mode(:error) do
+      tpl = Liquid::Template.parse('{{ product.user_input }}')
+      assert_raises TaintedError do
+        tpl.render!('product' => ProductDrop.new)
+      end
+    end
+  end
+
+  def test_rendering_warns_on_tainted_attr
+    with_taint_mode(:warn) do
+      tpl = Liquid::Template.parse('{{ product.user_input }}')
+      context = Context.new('product' => ProductDrop.new)
+      tpl.render!(context)
+      assert_equal [Liquid::TaintedError], context.warnings.map(&:class)
+      assert_equal "variable 'product.user_input' is tainted and was not escaped", context.warnings.first.to_s(false)
+    end
+  end
+
+  def test_rendering_doesnt_raise_on_escaped_tainted_attr
+    with_taint_mode(:error) do
+      tpl = Liquid::Template.parse('{{ product.user_input | escape }}')
+      tpl.render!('product' => ProductDrop.new)
+    end
+  end
+
+  def test_drop_does_only_respond_to_whitelisted_methods
+    assert_equal "", Liquid::Template.parse("{{ product.inspect }}").render!('product' => ProductDrop.new)
+    assert_equal "", Liquid::Template.parse("{{ product.pretty_inspect }}").render!('product' => ProductDrop.new)
+    assert_equal "", Liquid::Template.parse("{{ product.whatever }}").render!('product' => ProductDrop.new)
+    assert_equal "", Liquid::Template.parse('{{ product | map: "inspect" }}').render!('product' => ProductDrop.new)
+    assert_equal "", Liquid::Template.parse('{{ product | map: "pretty_inspect" }}').render!('product' => ProductDrop.new)
+    assert_equal "", Liquid::Template.parse('{{ product | map: "whatever" }}').render!('product' => ProductDrop.new)
+  end
+
+  def test_drops_respond_to_to_liquid
+    assert_equal "text1", Liquid::Template.parse("{{ product.to_liquid.texts.text }}").render!('product' => ProductDrop.new)
+    assert_equal "text1", Liquid::Template.parse('{{ product | map: "to_liquid" | map: "texts" | map: "text" }}').render!('product' => ProductDrop.new)
+  end
+
+  def test_text_drop
+    output = Liquid::Template.parse(' {{ product.texts.text }} ').render!('product' => ProductDrop.new)
+    assert_equal ' text1 ', output
+  end
+
+  def test_catchall_unknown_method
+    output = Liquid::Template.parse(' {{ product.catchall.unknown }} ').render!('product' => ProductDrop.new)
+    assert_equal ' catchall_method: unknown ', output
+  end
+
+  def test_catchall_integer_argument_drop
+    output = Liquid::Template.parse(' {{ product.catchall[8] }} ').render!('product' => ProductDrop.new)
+    assert_equal ' catchall_method: 8 ', output
+  end
+
+  def test_text_array_drop
+    output = Liquid::Template.parse('{% for text in product.texts.array %} {{text}} {% endfor %}').render!('product' => ProductDrop.new)
+    assert_equal ' text1  text2 ', output
+  end
+
+  def test_context_drop
+    output = Liquid::Template.parse(' {{ context.bar }} ').render!('context' => ContextDrop.new, 'bar' => "carrot")
+    assert_equal ' carrot ', output
+  end
+
+  def test_nested_context_drop
+    output = Liquid::Template.parse(' {{ product.context.foo }} ').render!('product' => ProductDrop.new, 'foo' => "monkey")
+    assert_equal ' monkey ', output
+  end
+
+  def test_protected
+    output = Liquid::Template.parse(' {{ product.callmenot }} ').render!('product' => ProductDrop.new)
+    assert_equal '  ', output
+  end
+
+  def test_object_methods_not_allowed
+    [:dup, :clone, :singleton_class, :eval, :class_eval, :inspect].each do |method|
+      output = Liquid::Template.parse(" {{ product.#{method} }} ").render!('product' => ProductDrop.new)
+      assert_equal '  ', output
+    end
+  end
+
+  def test_scope
+    assert_equal '1', Liquid::Template.parse('{{ context.scopes }}').render!('context' => ContextDrop.new)
+    assert_equal '2', Liquid::Template.parse('{%for i in dummy%}{{ context.scopes }}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1])
+    assert_equal '3', Liquid::Template.parse('{%for i in dummy%}{%for i in dummy%}{{ context.scopes }}{%endfor%}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1])
+  end
+
+  def test_scope_though_proc
+    assert_equal '1', Liquid::Template.parse('{{ s }}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] })
+    assert_equal '2', Liquid::Template.parse('{%for i in dummy%}{{ s }}{%endfor%}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] }, 'dummy' => [1])
+    assert_equal '3', Liquid::Template.parse('{%for i in dummy%}{%for i in dummy%}{{ s }}{%endfor%}{%endfor%}').render!('context' => ContextDrop.new, 's' => proc{ |c| c['context.scopes'] }, 'dummy' => [1])
+  end
+
+  def test_scope_with_assigns
+    assert_equal 'variable', Liquid::Template.parse('{% assign a = "variable"%}{{a}}').render!('context' => ContextDrop.new)
+    assert_equal 'variable', Liquid::Template.parse('{% assign a = "variable"%}{%for i in dummy%}{{a}}{%endfor%}').render!('context' => ContextDrop.new, 'dummy' => [1])
+    assert_equal 'test', Liquid::Template.parse('{% assign header_gif = "test"%}{{header_gif}}').render!('context' => ContextDrop.new)
+    assert_equal 'test', Liquid::Template.parse("{% assign header_gif = 'test'%}{{header_gif}}").render!('context' => ContextDrop.new)
+  end
+
+  def test_scope_from_tags
+    assert_equal '1', Liquid::Template.parse('{% for i in context.scopes_as_array %}{{i}}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1])
+    assert_equal '12', Liquid::Template.parse('{%for a in dummy%}{% for i in context.scopes_as_array %}{{i}}{% endfor %}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1])
+    assert_equal '123', Liquid::Template.parse('{%for a in dummy%}{%for a in dummy%}{% for i in context.scopes_as_array %}{{i}}{% endfor %}{% endfor %}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1])
+  end
+
+  def test_access_context_from_drop
+    assert_equal '123', Liquid::Template.parse('{%for a in dummy%}{{ context.loop_pos }}{% endfor %}').render!('context' => ContextDrop.new, 'dummy' => [1, 2, 3])
+  end
+
+  def test_enumerable_drop
+    assert_equal '123', Liquid::Template.parse('{% for c in collection %}{{c}}{% endfor %}').render!('collection' => EnumerableDrop.new)
+  end
+
+  def test_enumerable_drop_size
+    assert_equal '3', Liquid::Template.parse('{{collection.size}}').render!('collection' => EnumerableDrop.new)
+  end
+
+  def test_enumerable_drop_will_invoke_liquid_method_missing_for_clashing_method_names
+    ["select", "each", "map", "cycle"].each do |method|
+      assert_equal method.to_s, Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => EnumerableDrop.new)
+      assert_equal method.to_s, Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => EnumerableDrop.new)
+      assert_equal method.to_s, Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => RealEnumerableDrop.new)
+      assert_equal method.to_s, Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => RealEnumerableDrop.new)
+    end
+  end
+
+  def test_some_enumerable_methods_still_get_invoked
+    [ :count, :max ].each do |method|
+      assert_equal "3", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => RealEnumerableDrop.new)
+      assert_equal "3", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => RealEnumerableDrop.new)
+      assert_equal "3", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => EnumerableDrop.new)
+      assert_equal "3", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => EnumerableDrop.new)
+    end
+
+    assert_equal "yes", Liquid::Template.parse("{% if collection contains 3 %}yes{% endif %}").render!('collection' => RealEnumerableDrop.new)
+
+    [ :min, :first ].each do |method|
+      assert_equal "1", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => RealEnumerableDrop.new)
+      assert_equal "1", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => RealEnumerableDrop.new)
+      assert_equal "1", Liquid::Template.parse("{{collection.#{method}}}").render!('collection' => EnumerableDrop.new)
+      assert_equal "1", Liquid::Template.parse("{{collection[\"#{method}\"]}}").render!('collection' => EnumerableDrop.new)
+    end
+  end
+
+  def test_empty_string_value_access
+    assert_equal '', Liquid::Template.parse('{{ product[value] }}').render!('product' => ProductDrop.new, 'value' => '')
+  end
+
+  def test_nil_value_access
+    assert_equal '', Liquid::Template.parse('{{ product[value] }}').render!('product' => ProductDrop.new, 'value' => nil)
+  end
+
+  def test_default_to_s_on_drops
+    assert_equal 'ProductDrop', Liquid::Template.parse("{{ product }}").render!('product' => ProductDrop.new)
+    assert_equal 'EnumerableDrop', Liquid::Template.parse('{{ collection }}').render!('collection' => EnumerableDrop.new)
+  end
+end # DropsTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/error_handling_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/error_handling_test.rb
new file mode 100644
index 0000000..ba81861
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/error_handling_test.rb
@@ -0,0 +1,260 @@
+require 'test_helper'
+
+class ErrorHandlingTest < Minitest::Test
+  include Liquid
+
+  def test_templates_parsed_with_line_numbers_renders_them_in_errors
+    template = <<-LIQUID
+      Hello,
+
+      {{ errors.standard_error }} will raise a standard error.
+
+      Bla bla test.
+
+      {{ errors.syntax_error }} will raise a syntax error.
+
+      This is an argument error: {{ errors.argument_error }}
+
+      Bla.
+    LIQUID
+
+    expected = <<-TEXT
+      Hello,
+
+      Liquid error (line 3): standard error will raise a standard error.
+
+      Bla bla test.
+
+      Liquid syntax error (line 7): syntax error will raise a syntax error.
+
+      This is an argument error: Liquid error (line 9): argument error
+
+      Bla.
+    TEXT
+
+    output = Liquid::Template.parse(template, line_numbers: true).render('errors' => ErrorDrop.new)
+    assert_equal expected, output
+  end
+
+  def test_standard_error
+    template = Liquid::Template.parse(' {{ errors.standard_error }} ')
+    assert_equal ' Liquid error: standard error ', template.render('errors' => ErrorDrop.new)
+
+    assert_equal 1, template.errors.size
+    assert_equal StandardError, template.errors.first.class
+  end
+
+  def test_syntax
+    template = Liquid::Template.parse(' {{ errors.syntax_error }} ')
+    assert_equal ' Liquid syntax error: syntax error ', template.render('errors' => ErrorDrop.new)
+
+    assert_equal 1, template.errors.size
+    assert_equal SyntaxError, template.errors.first.class
+  end
+
+  def test_argument
+    template = Liquid::Template.parse(' {{ errors.argument_error }} ')
+    assert_equal ' Liquid error: argument error ', template.render('errors' => ErrorDrop.new)
+
+    assert_equal 1, template.errors.size
+    assert_equal ArgumentError, template.errors.first.class
+  end
+
+  def test_missing_endtag_parse_time_error
+    assert_raises(Liquid::SyntaxError) do
+      Liquid::Template.parse(' {% for a in b %} ... ')
+    end
+  end
+
+  def test_unrecognized_operator
+    with_error_mode(:strict) do
+      assert_raises(SyntaxError) do
+        Liquid::Template.parse(' {% if 1 =! 2 %}ok{% endif %} ')
+      end
+    end
+  end
+
+  def test_lax_unrecognized_operator
+    template = Liquid::Template.parse(' {% if 1 =! 2 %}ok{% endif %} ', error_mode: :lax)
+    assert_equal ' Liquid error: Unknown operator =! ', template.render
+    assert_equal 1, template.errors.size
+    assert_equal Liquid::ArgumentError, template.errors.first.class
+  end
+
+  def test_with_line_numbers_adds_numbers_to_parser_errors
+    err = assert_raises(SyntaxError) do
+      Liquid::Template.parse(%q(
+          foobar
+
+          {% "cat" | foobar %}
+
+          bla
+        ),
+        line_numbers: true
+      )
+    end
+
+    assert_match(/Liquid syntax error \(line 4\)/, err.message)
+  end
+
+  def test_with_line_numbers_adds_numbers_to_parser_errors_with_whitespace_trim
+    err = assert_raises(SyntaxError) do
+      Liquid::Template.parse(%q(
+          foobar
+
+          {%- "cat" | foobar -%}
+
+          bla
+        ),
+        line_numbers: true
+      )
+    end
+
+    assert_match(/Liquid syntax error \(line 4\)/, err.message)
+  end
+
+  def test_parsing_warn_with_line_numbers_adds_numbers_to_lexer_errors
+    template = Liquid::Template.parse('
+        foobar
+
+        {% if 1 =! 2 %}ok{% endif %}
+
+        bla
+            ',
+      error_mode: :warn,
+      line_numbers: true
+                                     )
+
+    assert_equal ['Liquid syntax error (line 4): Unexpected character = in "1 =! 2"'],
+      template.warnings.map(&:message)
+  end
+
+  def test_parsing_strict_with_line_numbers_adds_numbers_to_lexer_errors
+    err = assert_raises(SyntaxError) do
+      Liquid::Template.parse('
+          foobar
+
+          {% if 1 =! 2 %}ok{% endif %}
+
+          bla
+                ',
+        error_mode: :strict,
+        line_numbers: true
+                            )
+    end
+
+    assert_equal 'Liquid syntax error (line 4): Unexpected character = in "1 =! 2"', err.message
+  end
+
+  def test_syntax_errors_in_nested_blocks_have_correct_line_number
+    err = assert_raises(SyntaxError) do
+      Liquid::Template.parse('
+          foobar
+
+          {% if 1 != 2 %}
+            {% foo %}
+          {% endif %}
+
+          bla
+                ',
+        line_numbers: true
+                            )
+    end
+
+    assert_equal "Liquid syntax error (line 5): Unknown tag 'foo'", err.message
+  end
+
+  def test_strict_error_messages
+    err = assert_raises(SyntaxError) do
+      Liquid::Template.parse(' {% if 1 =! 2 %}ok{% endif %} ', error_mode: :strict)
+    end
+    assert_equal 'Liquid syntax error: Unexpected character = in "1 =! 2"', err.message
+
+    err = assert_raises(SyntaxError) do
+      Liquid::Template.parse('{{%%%}}', error_mode: :strict)
+    end
+    assert_equal 'Liquid syntax error: Unexpected character % in "{{%%%}}"', err.message
+  end
+
+  def test_warnings
+    template = Liquid::Template.parse('{% if ~~~ %}{{%%%}}{% else %}{{ hello. }}{% endif %}', error_mode: :warn)
+    assert_equal 3, template.warnings.size
+    assert_equal 'Unexpected character ~ in "~~~"', template.warnings[0].to_s(false)
+    assert_equal 'Unexpected character % in "{{%%%}}"', template.warnings[1].to_s(false)
+    assert_equal 'Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].to_s(false)
+    assert_equal '', template.render
+  end
+
+  def test_warning_line_numbers
+    template = Liquid::Template.parse("{% if ~~~ %}\n{{%%%}}{% else %}\n{{ hello. }}{% endif %}", error_mode: :warn, line_numbers: true)
+    assert_equal 'Liquid syntax error (line 1): Unexpected character ~ in "~~~"', template.warnings[0].message
+    assert_equal 'Liquid syntax error (line 2): Unexpected character % in "{{%%%}}"', template.warnings[1].message
+    assert_equal 'Liquid syntax error (line 3): Expected id but found end_of_string in "{{ hello. }}"', template.warnings[2].message
+    assert_equal 3, template.warnings.size
+    assert_equal [1, 2, 3], template.warnings.map(&:line_number)
+  end
+
+  # Liquid should not catch Exceptions that are not subclasses of StandardError, like Interrupt and NoMemoryError
+  def test_exceptions_propagate
+    assert_raises Exception do
+      template = Liquid::Template.parse('{{ errors.exception }}')
+      template.render('errors' => ErrorDrop.new)
+    end
+  end
+
+  def test_default_exception_renderer_with_internal_error
+    template = Liquid::Template.parse('This is a runtime error: {{ errors.runtime_error }}', line_numbers: true)
+
+    output = template.render({ 'errors' => ErrorDrop.new })
+
+    assert_equal 'This is a runtime error: Liquid error (line 1): internal', output
+    assert_equal [Liquid::InternalError], template.errors.map(&:class)
+  end
+
+  def test_setting_default_exception_renderer
+    old_exception_renderer = Liquid::Template.default_exception_renderer
+    exceptions = []
+    Liquid::Template.default_exception_renderer = ->(e) { exceptions << e; '' }
+    template = Liquid::Template.parse('This is a runtime error: {{ errors.argument_error }}')
+
+    output = template.render({ 'errors' => ErrorDrop.new })
+
+    assert_equal 'This is a runtime error: ', output
+    assert_equal [Liquid::ArgumentError], template.errors.map(&:class)
+  ensure
+    Liquid::Template.default_exception_renderer = old_exception_renderer if old_exception_renderer
+  end
+
+  def test_exception_renderer_exposing_non_liquid_error
+    template = Liquid::Template.parse('This is a runtime error: {{ errors.runtime_error }}', line_numbers: true)
+    exceptions = []
+    handler = ->(e) { exceptions << e; e.cause }
+
+    output = template.render({ 'errors' => ErrorDrop.new }, exception_renderer: handler)
+
+    assert_equal 'This is a runtime error: runtime error', output
+    assert_equal [Liquid::InternalError], exceptions.map(&:class)
+    assert_equal exceptions, template.errors
+    assert_equal '#<RuntimeError: runtime error>', exceptions.first.cause.inspect
+  end
+
+  class TestFileSystem
+    def read_template_file(template_path)
+      "{{ errors.argument_error }}"
+    end
+  end
+
+  def test_included_template_name_with_line_numbers
+    old_file_system = Liquid::Template.file_system
+
+    begin
+      Liquid::Template.file_system = TestFileSystem.new
+      template = Liquid::Template.parse("Argument error:\n{% include 'product' %}", line_numbers: true)
+      page = template.render('errors' => ErrorDrop.new)
+    ensure
+      Liquid::Template.file_system = old_file_system
+    end
+    assert_equal "Argument error:\nLiquid error (product line 1): argument error", page
+    assert_equal "product", template.errors.first.template_name
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/filter_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/filter_test.rb
new file mode 100644
index 0000000..d3c880e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/filter_test.rb
@@ -0,0 +1,178 @@
+require 'test_helper'
+
+module MoneyFilter
+  def money(input)
+    sprintf(' %d$ ', input)
+  end
+
+  def money_with_underscore(input)
+    sprintf(' %d$ ', input)
+  end
+end
+
+module CanadianMoneyFilter
+  def money(input)
+    sprintf(' %d$ CAD ', input)
+  end
+end
+
+module SubstituteFilter
+  def substitute(input, params = {})
+    input.gsub(/%\{(\w+)\}/) { |match| params[$1] }
+  end
+end
+
+class FiltersTest < Minitest::Test
+  include Liquid
+
+  module OverrideObjectMethodFilter
+    def tap(input)
+      "tap overridden"
+    end
+  end
+
+  def setup
+    @context = Context.new
+  end
+
+  def test_local_filter
+    @context['var'] = 1000
+    @context.add_filters(MoneyFilter)
+
+    assert_equal ' 1000$ ', Template.parse("{{var | money}}").render(@context)
+  end
+
+  def test_underscore_in_filter_name
+    @context['var'] = 1000
+    @context.add_filters(MoneyFilter)
+    assert_equal ' 1000$ ', Template.parse("{{var | money_with_underscore}}").render(@context)
+  end
+
+  def test_second_filter_overwrites_first
+    @context['var'] = 1000
+    @context.add_filters(MoneyFilter)
+    @context.add_filters(CanadianMoneyFilter)
+
+    assert_equal ' 1000$ CAD ', Template.parse("{{var | money}}").render(@context)
+  end
+
+  def test_size
+    @context['var'] = 'abcd'
+    @context.add_filters(MoneyFilter)
+
+    assert_equal '4', Template.parse("{{var | size}}").render(@context)
+  end
+
+  def test_join
+    @context['var'] = [1, 2, 3, 4]
+
+    assert_equal "1 2 3 4", Template.parse("{{var | join}}").render(@context)
+  end
+
+  def test_sort
+    @context['value'] = 3
+    @context['numbers'] = [2, 1, 4, 3]
+    @context['words'] = ['expected', 'as', 'alphabetic']
+    @context['arrays'] = ['flower', 'are']
+    @context['case_sensitive'] = ['sensitive', 'Expected', 'case']
+
+    assert_equal '1 2 3 4', Template.parse("{{numbers | sort | join}}").render(@context)
+    assert_equal 'alphabetic as expected', Template.parse("{{words | sort | join}}").render(@context)
+    assert_equal '3', Template.parse("{{value | sort}}").render(@context)
+    assert_equal 'are flower', Template.parse("{{arrays | sort | join}}").render(@context)
+    assert_equal 'Expected case sensitive', Template.parse("{{case_sensitive | sort | join}}").render(@context)
+  end
+
+  def test_sort_natural
+    @context['words'] = ['case', 'Assert', 'Insensitive']
+    @context['hashes'] = [{ 'a' => 'A' }, { 'a' => 'b' }, { 'a' => 'C' }]
+    @context['objects'] = [TestObject.new('A'), TestObject.new('b'), TestObject.new('C')]
+
+    # Test strings
+    assert_equal 'Assert case Insensitive', Template.parse("{{words | sort_natural | join}}").render(@context)
+
+    # Test hashes
+    assert_equal 'A b C', Template.parse("{{hashes | sort_natural: 'a' | map: 'a' | join}}").render(@context)
+
+    # Test objects
+    assert_equal 'A b C', Template.parse("{{objects | sort_natural: 'a' | map: 'a' | join}}").render(@context)
+  end
+
+  def test_compact
+    @context['words'] = ['a', nil, 'b', nil, 'c']
+    @context['hashes'] = [{ 'a' => 'A' }, { 'a' => nil }, { 'a' => 'C' }]
+    @context['objects'] = [TestObject.new('A'), TestObject.new(nil), TestObject.new('C')]
+
+    # Test strings
+    assert_equal 'a b c', Template.parse("{{words | compact | join}}").render(@context)
+
+    # Test hashes
+    assert_equal 'A C', Template.parse("{{hashes | compact: 'a' | map: 'a' | join}}").render(@context)
+
+    # Test objects
+    assert_equal 'A C', Template.parse("{{objects | compact: 'a' | map: 'a' | join}}").render(@context)
+  end
+
+  def test_strip_html
+    @context['var'] = "<b>bla blub</a>"
+
+    assert_equal "bla blub", Template.parse("{{ var | strip_html }}").render(@context)
+  end
+
+  def test_strip_html_ignore_comments_with_html
+    @context['var'] = "<!-- split and some <ul> tag --><b>bla blub</a>"
+
+    assert_equal "bla blub", Template.parse("{{ var | strip_html }}").render(@context)
+  end
+
+  def test_capitalize
+    @context['var'] = "blub"
+
+    assert_equal "Blub", Template.parse("{{ var | capitalize }}").render(@context)
+  end
+
+  def test_nonexistent_filter_is_ignored
+    @context['var'] = 1000
+
+    assert_equal '1000', Template.parse("{{ var | xyzzy }}").render(@context)
+  end
+
+  def test_filter_with_keyword_arguments
+    @context['surname'] = 'john'
+    @context['input'] = 'hello %{first_name}, %{last_name}'
+    @context.add_filters(SubstituteFilter)
+    output = Template.parse(%({{ input | substitute: first_name: surname, last_name: 'doe' }})).render(@context)
+    assert_equal 'hello john, doe', output
+  end
+
+  def test_override_object_method_in_filter
+    assert_equal "tap overridden", Template.parse("{{var | tap}}").render!({ 'var' => 1000 }, filters: [OverrideObjectMethodFilter])
+
+    # tap still treated as a non-existent filter
+    assert_equal "1000", Template.parse("{{var | tap}}").render!({ 'var' => 1000 })
+  end
+end
+
+class FiltersInTemplate < Minitest::Test
+  include Liquid
+
+  def test_local_global
+    with_global_filter(MoneyFilter) do
+      assert_equal " 1000$ ", Template.parse("{{1000 | money}}").render!(nil, nil)
+      assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, filters: CanadianMoneyFilter)
+      assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, filters: [CanadianMoneyFilter])
+    end
+  end
+
+  def test_local_filter_with_deprecated_syntax
+    assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, CanadianMoneyFilter)
+    assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render!(nil, [CanadianMoneyFilter])
+  end
+end # FiltersTest
+
+class TestObject < Liquid::Drop
+  attr_accessor :a
+  def initialize(a)
+    @a = a
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/hash_ordering_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/hash_ordering_test.rb
new file mode 100644
index 0000000..dfc1c29
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/hash_ordering_test.rb
@@ -0,0 +1,23 @@
+require 'test_helper'
+
+class HashOrderingTest < Minitest::Test
+  module MoneyFilter
+    def money(input)
+      sprintf(' %d$ ', input)
+    end
+  end
+
+  module CanadianMoneyFilter
+    def money(input)
+      sprintf(' %d$ CAD ', input)
+    end
+  end
+
+  include Liquid
+
+  def test_global_register_order
+    with_global_filter(MoneyFilter, CanadianMoneyFilter) do
+      assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render(nil, nil)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/output_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/output_test.rb
new file mode 100644
index 0000000..b4cf9d7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/output_test.rb
@@ -0,0 +1,123 @@
+require 'test_helper'
+
+module FunnyFilter
+  def make_funny(input)
+    'LOL'
+  end
+
+  def cite_funny(input)
+    "LOL: #{input}"
+  end
+
+  def add_smiley(input, smiley = ":-)")
+    "#{input} #{smiley}"
+  end
+
+  def add_tag(input, tag = "p", id = "foo")
+    %(<#{tag} id="#{id}">#{input}</#{tag}>)
+  end
+
+  def paragraph(input)
+    "<p>#{input}</p>"
+  end
+
+  def link_to(name, url)
+    %(<a href="#{url}">#{name}</a>)
+  end
+end
+
+class OutputTest < Minitest::Test
+  include Liquid
+
+  def setup
+    @assigns = {
+      'best_cars' => 'bmw',
+      'car' => { 'bmw' => 'good', 'gm' => 'bad' }
+    }
+  end
+
+  def test_variable
+    text = %( {{best_cars}} )
+
+    expected = %( bmw )
+    assert_equal expected, Template.parse(text).render!(@assigns)
+  end
+
+  def test_variable_traversing_with_two_brackets
+    text = %({{ site.data.menu[include.menu][include.locale] }})
+    assert_equal "it works!", Template.parse(text).render!(
+      "site" => { "data" => { "menu" => { "foo" => { "bar" => "it works!" } } } },
+      "include" => { "menu" => "foo", "locale" => "bar" }
+    )
+  end
+
+  def test_variable_traversing
+    text = %( {{car.bmw}} {{car.gm}} {{car.bmw}} )
+
+    expected = %( good bad good )
+    assert_equal expected, Template.parse(text).render!(@assigns)
+  end
+
+  def test_variable_piping
+    text = %( {{ car.gm | make_funny }} )
+    expected = %( LOL )
+
+    assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter])
+  end
+
+  def test_variable_piping_with_input
+    text = %( {{ car.gm | cite_funny }} )
+    expected = %( LOL: bad )
+
+    assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter])
+  end
+
+  def test_variable_piping_with_args
+    text = %! {{ car.gm | add_smiley : ':-(' }} !
+    expected = %| bad :-( |
+
+    assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter])
+  end
+
+  def test_variable_piping_with_no_args
+    text = %( {{ car.gm | add_smiley }} )
+    expected = %| bad :-) |
+
+    assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter])
+  end
+
+  def test_multiple_variable_piping_with_args
+    text = %! {{ car.gm | add_smiley : ':-(' | add_smiley : ':-('}} !
+    expected = %| bad :-( :-( |
+
+    assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter])
+  end
+
+  def test_variable_piping_with_multiple_args
+    text = %( {{ car.gm | add_tag : 'span', 'bar'}} )
+    expected = %( <span id="bar">bad</span> )
+
+    assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter])
+  end
+
+  def test_variable_piping_with_variable_args
+    text = %( {{ car.gm | add_tag : 'span', car.bmw}} )
+    expected = %( <span id="good">bad</span> )
+
+    assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter])
+  end
+
+  def test_multiple_pipings
+    text = %( {{ best_cars | cite_funny | paragraph }} )
+    expected = %( <p>LOL: bmw</p> )
+
+    assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter])
+  end
+
+  def test_link_to
+    text = %( {{ 'Typo' | link_to: 'http://typo.leetsoft.com' }} )
+    expected = %( <a href="http://typo.leetsoft.com">Typo</a> )
+
+    assert_equal expected, Template.parse(text).render!(@assigns, filters: [FunnyFilter])
+  end
+end # OutputTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/parsing_quirks_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/parsing_quirks_test.rb
new file mode 100644
index 0000000..3531318
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/parsing_quirks_test.rb
@@ -0,0 +1,118 @@
+require 'test_helper'
+
+class ParsingQuirksTest < Minitest::Test
+  include Liquid
+
+  def test_parsing_css
+    text = " div { font-weight: bold; } "
+    assert_equal text, Template.parse(text).render!
+  end
+
+  def test_raise_on_single_close_bracet
+    assert_raises(SyntaxError) do
+      Template.parse("text {{method} oh nos!")
+    end
+  end
+
+  def test_raise_on_label_and_no_close_bracets
+    assert_raises(SyntaxError) do
+      Template.parse("TEST {{ ")
+    end
+  end
+
+  def test_raise_on_label_and_no_close_bracets_percent
+    assert_raises(SyntaxError) do
+      Template.parse("TEST {% ")
+    end
+  end
+
+  def test_error_on_empty_filter
+    assert Template.parse("{{test}}")
+
+    with_error_mode(:lax) do
+      assert Template.parse("{{|test}}")
+    end
+
+    with_error_mode(:strict) do
+      assert_raises(SyntaxError) { Template.parse("{{|test}}") }
+      assert_raises(SyntaxError) { Template.parse("{{test |a|b|}}") }
+    end
+  end
+
+  def test_meaningless_parens_error
+    with_error_mode(:strict) do
+      assert_raises(SyntaxError) do
+        markup = "a == 'foo' or (b == 'bar' and c == 'baz') or false"
+        Template.parse("{% if #{markup} %} YES {% endif %}")
+      end
+    end
+  end
+
+  def test_unexpected_characters_syntax_error
+    with_error_mode(:strict) do
+      assert_raises(SyntaxError) do
+        markup = "true && false"
+        Template.parse("{% if #{markup} %} YES {% endif %}")
+      end
+      assert_raises(SyntaxError) do
+        markup = "false || true"
+        Template.parse("{% if #{markup} %} YES {% endif %}")
+      end
+    end
+  end
+
+  def test_no_error_on_lax_empty_filter
+    assert Template.parse("{{test |a|b|}}", error_mode: :lax)
+    assert Template.parse("{{test}}", error_mode: :lax)
+    assert Template.parse("{{|test|}}", error_mode: :lax)
+  end
+
+  def test_meaningless_parens_lax
+    with_error_mode(:lax) do
+      assigns = { 'b' => 'bar', 'c' => 'baz' }
+      markup = "a == 'foo' or (b == 'bar' and c == 'baz') or false"
+      assert_template_result(' YES ', "{% if #{markup} %} YES {% endif %}", assigns)
+    end
+  end
+
+  def test_unexpected_characters_silently_eat_logic_lax
+    with_error_mode(:lax) do
+      markup = "true && false"
+      assert_template_result(' YES ', "{% if #{markup} %} YES {% endif %}")
+      markup = "false || true"
+      assert_template_result('', "{% if #{markup} %} YES {% endif %}")
+    end
+  end
+
+  def test_raise_on_invalid_tag_delimiter
+    assert_raises(Liquid::SyntaxError) do
+      Template.new.parse('{% end %}')
+    end
+  end
+
+  def test_unanchored_filter_arguments
+    with_error_mode(:lax) do
+      assert_template_result('hi', "{{ 'hi there' | split$$$:' ' | first }}")
+
+      assert_template_result('x', "{{ 'X' | downcase) }}")
+
+      # After the messed up quotes a filter without parameters (reverse) should work
+      # but one with parameters (remove) shouldn't be detected.
+      assert_template_result('here',  "{{ 'hi there' | split:\"t\"\" | reverse | first}}")
+      assert_template_result('hi ',  "{{ 'hi there' | split:\"t\"\" | remove:\"i\" | first}}")
+    end
+  end
+
+  def test_invalid_variables_work
+    with_error_mode(:lax) do
+      assert_template_result('bar', "{% assign 123foo = 'bar' %}{{ 123foo }}")
+      assert_template_result('123', "{% assign 123 = 'bar' %}{{ 123 }}")
+    end
+  end
+
+  def test_extra_dots_in_ranges
+    with_error_mode(:lax) do
+      assert_template_result('12345', "{% for i in (1...5) %}{{ i }}{% endfor %}")
+    end
+  end
+end # ParsingQuirksTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/render_profiling_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/render_profiling_test.rb
new file mode 100644
index 0000000..d0111e7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/render_profiling_test.rb
@@ -0,0 +1,154 @@
+require 'test_helper'
+
+class RenderProfilingTest < Minitest::Test
+  include Liquid
+
+  class ProfilingFileSystem
+    def read_template_file(template_path)
+      "Rendering template {% assign template_name = '#{template_path}'%}\n{{ template_name }}"
+    end
+  end
+
+  def setup
+    Liquid::Template.file_system = ProfilingFileSystem.new
+  end
+
+  def test_template_allows_flagging_profiling
+    t = Template.parse("{{ 'a string' | upcase }}")
+    t.render!
+
+    assert_nil t.profiler
+  end
+
+  def test_parse_makes_available_simple_profiling
+    t = Template.parse("{{ 'a string' | upcase }}", profile: true)
+    t.render!
+
+    assert_equal 1, t.profiler.length
+
+    node = t.profiler[0]
+    assert_equal " 'a string' | upcase ", node.code
+  end
+
+  def test_render_ignores_raw_strings_when_profiling
+    t = Template.parse("This is raw string\nstuff\nNewline", profile: true)
+    t.render!
+
+    assert_equal 0, t.profiler.length
+  end
+
+  def test_profiling_includes_line_numbers_of_liquid_nodes
+    t = Template.parse("{{ 'a string' | upcase }}\n{% increment test %}", profile: true)
+    t.render!
+    assert_equal 2, t.profiler.length
+
+    # {{ 'a string' | upcase }}
+    assert_equal 1, t.profiler[0].line_number
+    # {{ increment test }}
+    assert_equal 2, t.profiler[1].line_number
+  end
+
+  def test_profiling_includes_line_numbers_of_included_partials
+    t = Template.parse("{% include 'a_template' %}", profile: true)
+    t.render!
+
+    included_children = t.profiler[0].children
+
+    # {% assign template_name = 'a_template' %}
+    assert_equal 1, included_children[0].line_number
+    # {{ template_name }}
+    assert_equal 2, included_children[1].line_number
+  end
+
+  def test_profiling_times_the_rendering_of_tokens
+    t = Template.parse("{% include 'a_template' %}", profile: true)
+    t.render!
+
+    node = t.profiler[0]
+    refute_nil node.render_time
+  end
+
+  def test_profiling_times_the_entire_render
+    t = Template.parse("{% include 'a_template' %}", profile: true)
+    t.render!
+
+    assert t.profiler.total_render_time >= 0, "Total render time was not calculated"
+  end
+
+  def test_profiling_uses_include_to_mark_children
+    t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}", profile: true)
+    t.render!
+
+    include_node = t.profiler[1]
+    assert_equal 2, include_node.children.length
+  end
+
+  def test_profiling_marks_children_with_the_name_of_included_partial
+    t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}", profile: true)
+    t.render!
+
+    include_node = t.profiler[1]
+    include_node.children.each do |child|
+      assert_equal "a_template", child.partial
+    end
+  end
+
+  def test_profiling_supports_multiple_templates
+    t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}\n{% include 'b_template' %}", profile: true)
+    t.render!
+
+    a_template = t.profiler[1]
+    a_template.children.each do |child|
+      assert_equal "a_template", child.partial
+    end
+
+    b_template = t.profiler[2]
+    b_template.children.each do |child|
+      assert_equal "b_template", child.partial
+    end
+  end
+
+  def test_profiling_supports_rendering_the_same_partial_multiple_times
+    t = Template.parse("{{ 'a string' | upcase }}\n{% include 'a_template' %}\n{% include 'a_template' %}", profile: true)
+    t.render!
+
+    a_template1 = t.profiler[1]
+    a_template1.children.each do |child|
+      assert_equal "a_template", child.partial
+    end
+
+    a_template2 = t.profiler[2]
+    a_template2.children.each do |child|
+      assert_equal "a_template", child.partial
+    end
+  end
+
+  def test_can_iterate_over_each_profiling_entry
+    t = Template.parse("{{ 'a string' | upcase }}\n{% increment test %}", profile: true)
+    t.render!
+
+    timing_count = 0
+    t.profiler.each do |timing|
+      timing_count += 1
+    end
+
+    assert_equal 2, timing_count
+  end
+
+  def test_profiling_marks_children_of_if_blocks
+    t = Template.parse("{% if true %} {% increment test %} {{ test }} {% endif %}", profile: true)
+    t.render!
+
+    assert_equal 1, t.profiler.length
+    assert_equal 2, t.profiler[0].children.length
+  end
+
+  def test_profiling_marks_children_of_for_blocks
+    t = Template.parse("{% for item in collection %} {{ item }} {% endfor %}", profile: true)
+    t.render!({ "collection" => ["one", "two"] })
+
+    assert_equal 1, t.profiler.length
+    # Will profile each invocation of the for block
+    assert_equal 2, t.profiler[0].children.length
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/security_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/security_test.rb
new file mode 100644
index 0000000..0357498
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/security_test.rb
@@ -0,0 +1,66 @@
+require 'test_helper'
+
+module SecurityFilter
+  def add_one(input)
+    "#{input} + 1"
+  end
+end
+
+class SecurityTest < Minitest::Test
+  include Liquid
+
+  def setup
+    @assigns = {}
+  end
+
+  def test_no_instance_eval
+    text = %( {{ '1+1' | instance_eval }} )
+    expected = %( 1+1 )
+
+    assert_equal expected, Template.parse(text).render!(@assigns)
+  end
+
+  def test_no_existing_instance_eval
+    text = %( {{ '1+1' | __instance_eval__ }} )
+    expected = %( 1+1 )
+
+    assert_equal expected, Template.parse(text).render!(@assigns)
+  end
+
+  def test_no_instance_eval_after_mixing_in_new_filter
+    text = %( {{ '1+1' | instance_eval }} )
+    expected = %( 1+1 )
+
+    assert_equal expected, Template.parse(text).render!(@assigns)
+  end
+
+  def test_no_instance_eval_later_in_chain
+    text = %( {{ '1+1' | add_one | instance_eval }} )
+    expected = %( 1+1 + 1 )
+
+    assert_equal expected, Template.parse(text).render!(@assigns, filters: SecurityFilter)
+  end
+
+  def test_does_not_add_filters_to_symbol_table
+    current_symbols = Symbol.all_symbols
+
+    test = %( {{ "some_string" | a_bad_filter }} )
+
+    template = Template.parse(test)
+    assert_equal [], (Symbol.all_symbols - current_symbols)
+
+    template.render!
+    assert_equal [], (Symbol.all_symbols - current_symbols)
+  end
+
+  def test_does_not_add_drop_methods_to_symbol_table
+    current_symbols = Symbol.all_symbols
+
+    assigns = { 'drop' => Drop.new }
+    assert_equal "", Template.parse("{{ drop.custom_method_1 }}", assigns).render!
+    assert_equal "", Template.parse("{{ drop.custom_method_2 }}", assigns).render!
+    assert_equal "", Template.parse("{{ drop.custom_method_3 }}", assigns).render!
+
+    assert_equal [], (Symbol.all_symbols - current_symbols)
+  end
+end # SecurityTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/standard_filter_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/standard_filter_test.rb
new file mode 100644
index 0000000..fcbfd88
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/standard_filter_test.rb
@@ -0,0 +1,535 @@
+# encoding: utf-8
+
+require 'test_helper'
+
+class Filters
+  include Liquid::StandardFilters
+end
+
+class TestThing
+  attr_reader :foo
+
+  def initialize
+    @foo = 0
+  end
+
+  def to_s
+    "woot: #{@foo}"
+  end
+
+  def [](whatever)
+    to_s
+  end
+
+  def to_liquid
+    @foo += 1
+    self
+  end
+end
+
+class TestDrop < Liquid::Drop
+  def test
+    "testfoo"
+  end
+end
+
+class TestEnumerable < Liquid::Drop
+  include Enumerable
+
+  def each(&block)
+    [ { "foo" => 1, "bar" => 2 }, { "foo" => 2, "bar" => 1 }, { "foo" => 3, "bar" => 3 } ].each(&block)
+  end
+end
+
+class NumberLikeThing < Liquid::Drop
+  def initialize(amount)
+    @amount = amount
+  end
+
+  def to_number
+    @amount
+  end
+end
+
+class StandardFiltersTest < Minitest::Test
+  include Liquid
+
+  def setup
+    @filters = Filters.new
+  end
+
+  def test_size
+    assert_equal 3, @filters.size([1, 2, 3])
+    assert_equal 0, @filters.size([])
+    assert_equal 0, @filters.size(nil)
+  end
+
+  def test_downcase
+    assert_equal 'testing', @filters.downcase("Testing")
+    assert_equal '', @filters.downcase(nil)
+  end
+
+  def test_upcase
+    assert_equal 'TESTING', @filters.upcase("Testing")
+    assert_equal '', @filters.upcase(nil)
+  end
+
+  def test_slice
+    assert_equal 'oob', @filters.slice('foobar', 1, 3)
+    assert_equal 'oobar', @filters.slice('foobar', 1, 1000)
+    assert_equal '', @filters.slice('foobar', 1, 0)
+    assert_equal 'o', @filters.slice('foobar', 1, 1)
+    assert_equal 'bar', @filters.slice('foobar', 3, 3)
+    assert_equal 'ar', @filters.slice('foobar', -2, 2)
+    assert_equal 'ar', @filters.slice('foobar', -2, 1000)
+    assert_equal 'r', @filters.slice('foobar', -1)
+    assert_equal '', @filters.slice(nil, 0)
+    assert_equal '', @filters.slice('foobar', 100, 10)
+    assert_equal '', @filters.slice('foobar', -100, 10)
+    assert_equal 'oob', @filters.slice('foobar', '1', '3')
+    assert_raises(Liquid::ArgumentError) do
+      @filters.slice('foobar', nil)
+    end
+    assert_raises(Liquid::ArgumentError) do
+      @filters.slice('foobar', 0, "")
+    end
+  end
+
+  def test_slice_on_arrays
+    input = 'foobar'.split(//)
+    assert_equal %w(o o b), @filters.slice(input, 1, 3)
+    assert_equal %w(o o b a r), @filters.slice(input, 1, 1000)
+    assert_equal %w(), @filters.slice(input, 1, 0)
+    assert_equal %w(o), @filters.slice(input, 1, 1)
+    assert_equal %w(b a r), @filters.slice(input, 3, 3)
+    assert_equal %w(a r), @filters.slice(input, -2, 2)
+    assert_equal %w(a r), @filters.slice(input, -2, 1000)
+    assert_equal %w(r), @filters.slice(input, -1)
+    assert_equal %w(), @filters.slice(input, 100, 10)
+    assert_equal %w(), @filters.slice(input, -100, 10)
+  end
+
+  def test_truncate
+    assert_equal '1234...', @filters.truncate('1234567890', 7)
+    assert_equal '1234567890', @filters.truncate('1234567890', 20)
+    assert_equal '...', @filters.truncate('1234567890', 0)
+    assert_equal '1234567890', @filters.truncate('1234567890')
+    assert_equal "测试...", @filters.truncate("测试测试测试测试", 5)
+    assert_equal '12341', @filters.truncate("1234567890", 5, 1)
+  end
+
+  def test_split
+    assert_equal ['12', '34'], @filters.split('12~34', '~')
+    assert_equal ['A? ', ' ,Z'], @filters.split('A? ~ ~ ~ ,Z', '~ ~ ~')
+    assert_equal ['A?Z'], @filters.split('A?Z', '~')
+    assert_equal [], @filters.split(nil, ' ')
+    assert_equal ['A', 'Z'], @filters.split('A1Z', 1)
+  end
+
+  def test_escape
+    assert_equal '&lt;strong&gt;', @filters.escape('<strong>')
+    assert_equal nil, @filters.escape(nil)
+    assert_equal '&lt;strong&gt;', @filters.h('<strong>')
+  end
+
+  def test_escape_once
+    assert_equal '&lt;strong&gt;Hulk&lt;/strong&gt;', @filters.escape_once('&lt;strong&gt;Hulk</strong>')
+  end
+
+  def test_url_encode
+    assert_equal 'foo%2B1%40example.com', @filters.url_encode('foo+1@example.com')
+    assert_equal nil, @filters.url_encode(nil)
+  end
+
+  def test_url_decode
+    assert_equal 'foo bar', @filters.url_decode('foo+bar')
+    assert_equal 'foo bar', @filters.url_decode('foo%20bar')
+    assert_equal 'foo+1@example.com', @filters.url_decode('foo%2B1%40example.com')
+    assert_equal nil, @filters.url_decode(nil)
+  end
+
+  def test_truncatewords
+    assert_equal 'one two three', @filters.truncatewords('one two three', 4)
+    assert_equal 'one two...', @filters.truncatewords('one two three', 2)
+    assert_equal 'one two three', @filters.truncatewords('one two three')
+    assert_equal 'Two small (13&#8221; x 5.5&#8221; x 10&#8221; high) baskets fit inside one large basket (13&#8221;...', @filters.truncatewords('Two small (13&#8221; x 5.5&#8221; x 10&#8221; high) baskets fit inside one large basket (13&#8221; x 16&#8221; x 10.5&#8221; high) with cover.', 15)
+    assert_equal "测试测试测试测试", @filters.truncatewords('测试测试测试测试', 5)
+    assert_equal 'one two1', @filters.truncatewords("one two three", 2, 1)
+  end
+
+  def test_strip_html
+    assert_equal 'test', @filters.strip_html("<div>test</div>")
+    assert_equal 'test', @filters.strip_html("<div id='test'>test</div>")
+    assert_equal '', @filters.strip_html("<script type='text/javascript'>document.write('some stuff');</script>")
+    assert_equal '', @filters.strip_html("<style type='text/css'>foo bar</style>")
+    assert_equal 'test', @filters.strip_html("<div\nclass='multiline'>test</div>")
+    assert_equal 'test', @filters.strip_html("<!-- foo bar \n test -->test")
+    assert_equal '', @filters.strip_html(nil)
+  end
+
+  def test_join
+    assert_equal '1 2 3 4', @filters.join([1, 2, 3, 4])
+    assert_equal '1 - 2 - 3 - 4', @filters.join([1, 2, 3, 4], ' - ')
+  end
+
+  def test_sort
+    assert_equal [1, 2, 3, 4], @filters.sort([4, 3, 2, 1])
+    assert_equal [{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }], @filters.sort([{ "a" => 4 }, { "a" => 3 }, { "a" => 1 }, { "a" => 2 }], "a")
+  end
+
+  def test_sort_when_property_is_sometimes_missing_puts_nils_last
+    input = [
+      { "price" => 4, "handle" => "alpha" },
+      { "handle" => "beta" },
+      { "price" => 1, "handle" => "gamma" },
+      { "handle" => "delta" },
+      { "price" => 2, "handle" => "epsilon" }
+    ]
+    expectation = [
+      { "price" => 1, "handle" => "gamma" },
+      { "price" => 2, "handle" => "epsilon" },
+      { "price" => 4, "handle" => "alpha" },
+      { "handle" => "delta" },
+      { "handle" => "beta" }
+    ]
+    assert_equal expectation, @filters.sort(input, "price")
+  end
+
+  def test_sort_empty_array
+    assert_equal [], @filters.sort([], "a")
+  end
+
+  def test_sort_natural_empty_array
+    assert_equal [], @filters.sort_natural([], "a")
+  end
+
+  def test_legacy_sort_hash
+    assert_equal [{ a: 1, b: 2 }], @filters.sort({ a: 1, b: 2 })
+  end
+
+  def test_numerical_vs_lexicographical_sort
+    assert_equal [2, 10], @filters.sort([10, 2])
+    assert_equal [{ "a" => 2 }, { "a" => 10 }], @filters.sort([{ "a" => 10 }, { "a" => 2 }], "a")
+    assert_equal ["10", "2"], @filters.sort(["10", "2"])
+    assert_equal [{ "a" => "10" }, { "a" => "2" }], @filters.sort([{ "a" => "10" }, { "a" => "2" }], "a")
+  end
+
+  def test_uniq
+    assert_equal ["foo"], @filters.uniq("foo")
+    assert_equal [1, 3, 2, 4], @filters.uniq([1, 1, 3, 2, 3, 1, 4, 3, 2, 1])
+    assert_equal [{ "a" => 1 }, { "a" => 3 }, { "a" => 2 }], @filters.uniq([{ "a" => 1 }, { "a" => 3 }, { "a" => 1 }, { "a" => 2 }], "a")
+    testdrop = TestDrop.new
+    assert_equal [testdrop], @filters.uniq([testdrop, TestDrop.new], 'test')
+  end
+
+  def test_uniq_empty_array
+    assert_equal [], @filters.uniq([], "a")
+  end
+
+  def test_compact_empty_array
+    assert_equal [], @filters.compact([], "a")
+  end
+
+  def test_reverse
+    assert_equal [4, 3, 2, 1], @filters.reverse([1, 2, 3, 4])
+  end
+
+  def test_legacy_reverse_hash
+    assert_equal [{ a: 1, b: 2 }], @filters.reverse(a: 1, b: 2)
+  end
+
+  def test_map
+    assert_equal [1, 2, 3, 4], @filters.map([{ "a" => 1 }, { "a" => 2 }, { "a" => 3 }, { "a" => 4 }], 'a')
+    assert_template_result 'abc', "{{ ary | map:'foo' | map:'bar' }}",
+      'ary' => [{ 'foo' => { 'bar' => 'a' } }, { 'foo' => { 'bar' => 'b' } }, { 'foo' => { 'bar' => 'c' } }]
+  end
+
+  def test_map_doesnt_call_arbitrary_stuff
+    assert_template_result "", '{{ "foo" | map: "__id__" }}'
+    assert_template_result "", '{{ "foo" | map: "inspect" }}'
+  end
+
+  def test_map_calls_to_liquid
+    t = TestThing.new
+    assert_template_result "woot: 1", '{{ foo | map: "whatever" }}', "foo" => [t]
+  end
+
+  def test_map_on_hashes
+    assert_template_result "4217", '{{ thing | map: "foo" | map: "bar" }}',
+      "thing" => { "foo" => [ { "bar" => 42 }, { "bar" => 17 } ] }
+  end
+
+  def test_legacy_map_on_hashes_with_dynamic_key
+    template = "{% assign key = 'foo' %}{{ thing | map: key | map: 'bar' }}"
+    hash = { "foo" => { "bar" => 42 } }
+    assert_template_result "42", template, "thing" => hash
+  end
+
+  def test_sort_calls_to_liquid
+    t = TestThing.new
+    Liquid::Template.parse('{{ foo | sort: "whatever" }}').render("foo" => [t])
+    assert t.foo > 0
+  end
+
+  def test_map_over_proc
+    drop = TestDrop.new
+    p = proc{ drop }
+    templ = '{{ procs | map: "test" }}'
+    assert_template_result "testfoo", templ, "procs" => [p]
+  end
+
+  def test_map_over_drops_returning_procs
+    drops = [
+      {
+        "proc" => ->{ "foo" },
+      },
+      {
+        "proc" => ->{ "bar" },
+      },
+    ]
+    templ = '{{ drops | map: "proc" }}'
+    assert_template_result "foobar", templ, "drops" => drops
+  end
+
+  def test_map_works_on_enumerables
+    assert_template_result "123", '{{ foo | map: "foo" }}', "foo" => TestEnumerable.new
+  end
+
+  def test_sort_works_on_enumerables
+    assert_template_result "213", '{{ foo | sort: "bar" | map: "foo" }}', "foo" => TestEnumerable.new
+  end
+
+  def test_first_and_last_call_to_liquid
+    assert_template_result 'foobar', '{{ foo | first }}', 'foo' => [ThingWithToLiquid.new]
+    assert_template_result 'foobar', '{{ foo | last }}', 'foo' => [ThingWithToLiquid.new]
+  end
+
+  def test_truncate_calls_to_liquid
+    assert_template_result "wo...", '{{ foo | truncate: 5 }}', "foo" => TestThing.new
+  end
+
+  def test_date
+    assert_equal 'May', @filters.date(Time.parse("2006-05-05 10:00:00"), "%B")
+    assert_equal 'June', @filters.date(Time.parse("2006-06-05 10:00:00"), "%B")
+    assert_equal 'July', @filters.date(Time.parse("2006-07-05 10:00:00"), "%B")
+
+    assert_equal 'May', @filters.date("2006-05-05 10:00:00", "%B")
+    assert_equal 'June', @filters.date("2006-06-05 10:00:00", "%B")
+    assert_equal 'July', @filters.date("2006-07-05 10:00:00", "%B")
+
+    assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", "")
+    assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", "")
+    assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", "")
+    assert_equal '2006-07-05 10:00:00', @filters.date("2006-07-05 10:00:00", nil)
+
+    assert_equal '07/05/2006', @filters.date("2006-07-05 10:00:00", "%m/%d/%Y")
+
+    assert_equal "07/16/2004", @filters.date("Fri Jul 16 01:00:00 2004", "%m/%d/%Y")
+    assert_equal "#{Date.today.year}", @filters.date('now', '%Y')
+    assert_equal "#{Date.today.year}", @filters.date('today', '%Y')
+    assert_equal "#{Date.today.year}", @filters.date('Today', '%Y')
+
+    assert_equal nil, @filters.date(nil, "%B")
+
+    assert_equal '', @filters.date('', "%B")
+
+    with_timezone("UTC") do
+      assert_equal "07/05/2006", @filters.date(1152098955, "%m/%d/%Y")
+      assert_equal "07/05/2006", @filters.date("1152098955", "%m/%d/%Y")
+    end
+  end
+
+  def test_first_last
+    assert_equal 1, @filters.first([1, 2, 3])
+    assert_equal 3, @filters.last([1, 2, 3])
+    assert_equal nil, @filters.first([])
+    assert_equal nil, @filters.last([])
+  end
+
+  def test_replace
+    assert_equal '2 2 2 2', @filters.replace('1 1 1 1', '1', 2)
+    assert_equal '2 2 2 2', @filters.replace('1 1 1 1', 1, 2)
+    assert_equal '2 1 1 1', @filters.replace_first('1 1 1 1', '1', 2)
+    assert_equal '2 1 1 1', @filters.replace_first('1 1 1 1', 1, 2)
+    assert_template_result '2 1 1 1', "{{ '1 1 1 1' | replace_first: '1', 2 }}"
+  end
+
+  def test_remove
+    assert_equal '   ', @filters.remove("a a a a", 'a')
+    assert_equal '   ', @filters.remove("1 1 1 1", 1)
+    assert_equal 'a a a', @filters.remove_first("a a a a", 'a ')
+    assert_equal ' 1 1 1', @filters.remove_first("1 1 1 1", 1)
+    assert_template_result 'a a a', "{{ 'a a a a' | remove_first: 'a ' }}"
+  end
+
+  def test_pipes_in_string_arguments
+    assert_template_result 'foobar', "{{ 'foo|bar' | remove: '|' }}"
+  end
+
+  def test_strip
+    assert_template_result 'ab c', "{{ source | strip }}", 'source' => " ab c  "
+    assert_template_result 'ab c', "{{ source | strip }}", 'source' => " \tab c  \n \t"
+  end
+
+  def test_lstrip
+    assert_template_result 'ab c  ', "{{ source | lstrip }}", 'source' => " ab c  "
+    assert_template_result "ab c  \n \t", "{{ source | lstrip }}", 'source' => " \tab c  \n \t"
+  end
+
+  def test_rstrip
+    assert_template_result " ab c", "{{ source | rstrip }}", 'source' => " ab c  "
+    assert_template_result " \tab c", "{{ source | rstrip }}", 'source' => " \tab c  \n \t"
+  end
+
+  def test_strip_newlines
+    assert_template_result 'abc', "{{ source | strip_newlines }}", 'source' => "a\nb\nc"
+    assert_template_result 'abc', "{{ source | strip_newlines }}", 'source' => "a\r\nb\nc"
+  end
+
+  def test_newlines_to_br
+    assert_template_result "a<br />\nb<br />\nc", "{{ source | newline_to_br }}", 'source' => "a\nb\nc"
+  end
+
+  def test_plus
+    assert_template_result "2", "{{ 1 | plus:1 }}"
+    assert_template_result "2.0", "{{ '1' | plus:'1.0' }}"
+
+    assert_template_result "5", "{{ price | plus:'2' }}", 'price' => NumberLikeThing.new(3)
+  end
+
+  def test_minus
+    assert_template_result "4", "{{ input | minus:operand }}", 'input' => 5, 'operand' => 1
+    assert_template_result "2.3", "{{ '4.3' | minus:'2' }}"
+
+    assert_template_result "5", "{{ price | minus:'2' }}", 'price' => NumberLikeThing.new(7)
+  end
+
+  def test_abs
+    assert_template_result "17", "{{ 17 | abs }}"
+    assert_template_result "17", "{{ -17 | abs }}"
+    assert_template_result "17", "{{ '17' | abs }}"
+    assert_template_result "17", "{{ '-17' | abs }}"
+    assert_template_result "0", "{{ 0 | abs }}"
+    assert_template_result "0", "{{ '0' | abs }}"
+    assert_template_result "17.42", "{{ 17.42 | abs }}"
+    assert_template_result "17.42", "{{ -17.42 | abs }}"
+    assert_template_result "17.42", "{{ '17.42' | abs }}"
+    assert_template_result "17.42", "{{ '-17.42' | abs }}"
+  end
+
+  def test_times
+    assert_template_result "12", "{{ 3 | times:4 }}"
+    assert_template_result "0", "{{ 'foo' | times:4 }}"
+    assert_template_result "6", "{{ '2.1' | times:3 | replace: '.','-' | plus:0}}"
+    assert_template_result "7.25", "{{ 0.0725 | times:100 }}"
+    assert_template_result "-7.25", '{{ "-0.0725" | times:100 }}'
+    assert_template_result "7.25", '{{ "-0.0725" | times: -100 }}'
+    assert_template_result "4", "{{ price | times:2 }}", 'price' => NumberLikeThing.new(2)
+  end
+
+  def test_divided_by
+    assert_template_result "4", "{{ 12 | divided_by:3 }}"
+    assert_template_result "4", "{{ 14 | divided_by:3 }}"
+
+    assert_template_result "5", "{{ 15 | divided_by:3 }}"
+    assert_equal "Liquid error: divided by 0", Template.parse("{{ 5 | divided_by:0 }}").render
+
+    assert_template_result "0.5", "{{ 2.0 | divided_by:4 }}"
+    assert_raises(Liquid::ZeroDivisionError) do
+      assert_template_result "4", "{{ 1 | modulo: 0 }}"
+    end
+
+    assert_template_result "5", "{{ price | divided_by:2 }}", 'price' => NumberLikeThing.new(10)
+  end
+
+  def test_modulo
+    assert_template_result "1", "{{ 3 | modulo:2 }}"
+    assert_raises(Liquid::ZeroDivisionError) do
+      assert_template_result "4", "{{ 1 | modulo: 0 }}"
+    end
+
+    assert_template_result "1", "{{ price | modulo:2 }}", 'price' => NumberLikeThing.new(3)
+  end
+
+  def test_round
+    assert_template_result "5", "{{ input | round }}", 'input' => 4.6
+    assert_template_result "4", "{{ '4.3' | round }}"
+    assert_template_result "4.56", "{{ input | round: 2 }}", 'input' => 4.5612
+    assert_raises(Liquid::FloatDomainError) do
+      assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | round }}"
+    end
+
+    assert_template_result "5", "{{ price | round }}", 'price' => NumberLikeThing.new(4.6)
+    assert_template_result "4", "{{ price | round }}", 'price' => NumberLikeThing.new(4.3)
+  end
+
+  def test_ceil
+    assert_template_result "5", "{{ input | ceil }}", 'input' => 4.6
+    assert_template_result "5", "{{ '4.3' | ceil }}"
+    assert_raises(Liquid::FloatDomainError) do
+      assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | ceil }}"
+    end
+
+    assert_template_result "5", "{{ price | ceil }}", 'price' => NumberLikeThing.new(4.6)
+  end
+
+  def test_floor
+    assert_template_result "4", "{{ input | floor }}", 'input' => 4.6
+    assert_template_result "4", "{{ '4.3' | floor }}"
+    assert_raises(Liquid::FloatDomainError) do
+      assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | floor }}"
+    end
+
+    assert_template_result "5", "{{ price | floor }}", 'price' => NumberLikeThing.new(5.4)
+  end
+
+  def test_append
+    assigns = { 'a' => 'bc', 'b' => 'd' }
+    assert_template_result('bcd', "{{ a | append: 'd'}}", assigns)
+    assert_template_result('bcd', "{{ a | append: b}}", assigns)
+  end
+
+  def test_concat
+    assert_equal [1, 2, 3, 4], @filters.concat([1, 2], [3, 4])
+    assert_equal [1, 2, 'a'],  @filters.concat([1, 2], ['a'])
+    assert_equal [1, 2, 10],   @filters.concat([1, 2], [10])
+
+    assert_raises(Liquid::ArgumentError, "concat filter requires an array argument") do
+      @filters.concat([1, 2], 10)
+    end
+  end
+
+  def test_prepend
+    assigns = { 'a' => 'bc', 'b' => 'a' }
+    assert_template_result('abc', "{{ a | prepend: 'a'}}", assigns)
+    assert_template_result('abc', "{{ a | prepend: b}}", assigns)
+  end
+
+  def test_default
+    assert_equal "foo", @filters.default("foo", "bar")
+    assert_equal "bar", @filters.default(nil, "bar")
+    assert_equal "bar", @filters.default("", "bar")
+    assert_equal "bar", @filters.default(false, "bar")
+    assert_equal "bar", @filters.default([], "bar")
+    assert_equal "bar", @filters.default({}, "bar")
+  end
+
+  def test_cannot_access_private_methods
+    assert_template_result('a', "{{ 'a' | to_number }}")
+  end
+
+  def test_date_raises_nothing
+    assert_template_result('', "{{ '' | date: '%D' }}")
+    assert_template_result('abc', "{{ 'abc' | date: '%D' }}")
+  end
+
+  private
+
+  def with_timezone(tz)
+    old_tz = ENV['TZ']
+    ENV['TZ'] = tz
+    yield
+  ensure
+    ENV['TZ'] = old_tz
+  end
+end # StandardFiltersTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/break_tag_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/break_tag_test.rb
new file mode 100644
index 0000000..0fbde83
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/break_tag_test.rb
@@ -0,0 +1,15 @@
+require 'test_helper'
+
+class BreakTagTest < Minitest::Test
+  include Liquid
+
+  # tests that no weird errors are raised if break is called outside of a
+  # block
+  def test_break_with_no_block
+    assigns = { 'i' => 1 }
+    markup = '{% break %}'
+    expected = ''
+
+    assert_template_result(expected, markup, assigns)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/continue_tag_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/continue_tag_test.rb
new file mode 100644
index 0000000..ce4c158
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/continue_tag_test.rb
@@ -0,0 +1,15 @@
+require 'test_helper'
+
+class ContinueTagTest < Minitest::Test
+  include Liquid
+
+  # tests that no weird errors are raised if continue is called outside of a
+  # block
+  def test_continue_with_no_block
+    assigns = {}
+    markup = '{% continue %}'
+    expected = ''
+
+    assert_template_result(expected, markup, assigns)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/for_tag_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/for_tag_test.rb
new file mode 100644
index 0000000..d9d396f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/for_tag_test.rb
@@ -0,0 +1,410 @@
+require 'test_helper'
+
+class ThingWithValue < Liquid::Drop
+  def value
+    3
+  end
+end
+
+class ForTagTest < Minitest::Test
+  include Liquid
+
+  def test_for
+    assert_template_result(' yo  yo  yo  yo ', '{%for item in array%} yo {%endfor%}', 'array' => [1, 2, 3, 4])
+    assert_template_result('yoyo', '{%for item in array%}yo{%endfor%}', 'array' => [1, 2])
+    assert_template_result(' yo ', '{%for item in array%} yo {%endfor%}', 'array' => [1])
+    assert_template_result('', '{%for item in array%}{%endfor%}', 'array' => [1, 2])
+    expected = <<HERE
+
+  yo
+
+  yo
+
+  yo
+
+HERE
+    template = <<HERE
+{%for item in array%}
+  yo
+{%endfor%}
+HERE
+    assert_template_result(expected, template, 'array' => [1, 2, 3])
+  end
+
+  def test_for_reversed
+    assigns = { 'array' => [ 1, 2, 3] }
+    assert_template_result('321', '{%for item in array reversed %}{{item}}{%endfor%}', assigns)
+  end
+
+  def test_for_with_range
+    assert_template_result(' 1  2  3 ', '{%for item in (1..3) %} {{item}} {%endfor%}')
+
+    assert_raises(Liquid::ArgumentError) do
+      Template.parse('{% for i in (a..2) %}{% endfor %}').render!("a" => [1, 2])
+    end
+
+    assert_template_result(' 0  1  2  3 ', '{% for item in (a..3) %} {{item}} {% endfor %}', "a" => "invalid integer")
+  end
+
+  def test_for_with_variable_range
+    assert_template_result(' 1  2  3 ', '{%for item in (1..foobar) %} {{item}} {%endfor%}', "foobar" => 3)
+  end
+
+  def test_for_with_hash_value_range
+    foobar = { "value" => 3 }
+    assert_template_result(' 1  2  3 ', '{%for item in (1..foobar.value) %} {{item}} {%endfor%}', "foobar" => foobar)
+  end
+
+  def test_for_with_drop_value_range
+    foobar = ThingWithValue.new
+    assert_template_result(' 1  2  3 ', '{%for item in (1..foobar.value) %} {{item}} {%endfor%}', "foobar" => foobar)
+  end
+
+  def test_for_with_variable
+    assert_template_result(' 1  2  3 ', '{%for item in array%} {{item}} {%endfor%}', 'array' => [1, 2, 3])
+    assert_template_result('123', '{%for item in array%}{{item}}{%endfor%}', 'array' => [1, 2, 3])
+    assert_template_result('123', '{% for item in array %}{{item}}{% endfor %}', 'array' => [1, 2, 3])
+    assert_template_result('abcd', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', 'b', 'c', 'd'])
+    assert_template_result('a b c', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', ' ', 'b', ' ', 'c'])
+    assert_template_result('abc', '{%for item in array%}{{item}}{%endfor%}', 'array' => ['a', '', 'b', '', 'c'])
+  end
+
+  def test_for_helpers
+    assigns = { 'array' => [1, 2, 3] }
+    assert_template_result(' 1/3  2/3  3/3 ',
+      '{%for item in array%} {{forloop.index}}/{{forloop.length}} {%endfor%}',
+      assigns)
+    assert_template_result(' 1  2  3 ', '{%for item in array%} {{forloop.index}} {%endfor%}', assigns)
+    assert_template_result(' 0  1  2 ', '{%for item in array%} {{forloop.index0}} {%endfor%}', assigns)
+    assert_template_result(' 2  1  0 ', '{%for item in array%} {{forloop.rindex0}} {%endfor%}', assigns)
+    assert_template_result(' 3  2  1 ', '{%for item in array%} {{forloop.rindex}} {%endfor%}', assigns)
+    assert_template_result(' true  false  false ', '{%for item in array%} {{forloop.first}} {%endfor%}', assigns)
+    assert_template_result(' false  false  true ', '{%for item in array%} {{forloop.last}} {%endfor%}', assigns)
+  end
+
+  def test_for_and_if
+    assigns = { 'array' => [1, 2, 3] }
+    assert_template_result('+--',
+      '{%for item in array%}{% if forloop.first %}+{% else %}-{% endif %}{%endfor%}',
+      assigns)
+  end
+
+  def test_for_else
+    assert_template_result('+++', '{%for item in array%}+{%else%}-{%endfor%}', 'array' => [1, 2, 3])
+    assert_template_result('-',   '{%for item in array%}+{%else%}-{%endfor%}', 'array' => [])
+    assert_template_result('-',   '{%for item in array%}+{%else%}-{%endfor%}', 'array' => nil)
+  end
+
+  def test_limiting
+    assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] }
+    assert_template_result('12', '{%for i in array limit:2 %}{{ i }}{%endfor%}', assigns)
+    assert_template_result('1234', '{%for i in array limit:4 %}{{ i }}{%endfor%}', assigns)
+    assert_template_result('3456', '{%for i in array limit:4 offset:2 %}{{ i }}{%endfor%}', assigns)
+    assert_template_result('3456', '{%for i in array limit: 4 offset: 2 %}{{ i }}{%endfor%}', assigns)
+  end
+
+  def test_dynamic_variable_limiting
+    assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] }
+    assigns['limit'] = 2
+    assigns['offset'] = 2
+
+    assert_template_result('34', '{%for i in array limit: limit offset: offset %}{{ i }}{%endfor%}', assigns)
+  end
+
+  def test_nested_for
+    assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] }
+    assert_template_result('123456', '{%for item in array%}{%for i in item%}{{ i }}{%endfor%}{%endfor%}', assigns)
+  end
+
+  def test_offset_only
+    assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] }
+    assert_template_result('890', '{%for i in array offset:7 %}{{ i }}{%endfor%}', assigns)
+  end
+
+  def test_pause_resume
+    assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } }
+    markup = <<-MKUP
+      {%for i in array.items limit: 3 %}{{i}}{%endfor%}
+      next
+      {%for i in array.items offset:continue limit: 3 %}{{i}}{%endfor%}
+      next
+      {%for i in array.items offset:continue limit: 3 %}{{i}}{%endfor%}
+      MKUP
+    expected = <<-XPCTD
+      123
+      next
+      456
+      next
+      789
+      XPCTD
+    assert_template_result(expected, markup, assigns)
+  end
+
+  def test_pause_resume_limit
+    assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } }
+    markup = <<-MKUP
+      {%for i in array.items limit:3 %}{{i}}{%endfor%}
+      next
+      {%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%}
+      next
+      {%for i in array.items offset:continue limit:1 %}{{i}}{%endfor%}
+      MKUP
+    expected = <<-XPCTD
+      123
+      next
+      456
+      next
+      7
+      XPCTD
+    assert_template_result(expected, markup, assigns)
+  end
+
+  def test_pause_resume_BIG_limit
+    assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } }
+    markup = <<-MKUP
+      {%for i in array.items limit:3 %}{{i}}{%endfor%}
+      next
+      {%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%}
+      next
+      {%for i in array.items offset:continue limit:1000 %}{{i}}{%endfor%}
+      MKUP
+    expected = <<-XPCTD
+      123
+      next
+      456
+      next
+      7890
+      XPCTD
+    assert_template_result(expected, markup, assigns)
+  end
+
+  def test_pause_resume_BIG_offset
+    assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } }
+    markup = '{%for i in array.items limit:3 %}{{i}}{%endfor%}
+      next
+      {%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%}
+      next
+      {%for i in array.items offset:continue limit:3 offset:1000 %}{{i}}{%endfor%}'
+    expected = '123
+      next
+      456
+      next
+      '
+    assert_template_result(expected, markup, assigns)
+  end
+
+  def test_for_with_break
+    assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } }
+
+    markup = '{% for i in array.items %}{% break %}{% endfor %}'
+    expected = ""
+    assert_template_result(expected, markup, assigns)
+
+    markup = '{% for i in array.items %}{{ i }}{% break %}{% endfor %}'
+    expected = "1"
+    assert_template_result(expected, markup, assigns)
+
+    markup = '{% for i in array.items %}{% break %}{{ i }}{% endfor %}'
+    expected = ""
+    assert_template_result(expected, markup, assigns)
+
+    markup = '{% for i in array.items %}{{ i }}{% if i > 3 %}{% break %}{% endif %}{% endfor %}'
+    expected = "1234"
+    assert_template_result(expected, markup, assigns)
+
+    # tests to ensure it only breaks out of the local for loop
+    # and not all of them.
+    assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] }
+    markup = '{% for item in array %}' \
+               '{% for i in item %}' \
+                 '{% if i == 1 %}' \
+                   '{% break %}' \
+                 '{% endif %}' \
+                 '{{ i }}' \
+               '{% endfor %}' \
+             '{% endfor %}'
+    expected = '3456'
+    assert_template_result(expected, markup, assigns)
+
+    # test break does nothing when unreached
+    assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } }
+    markup = '{% for i in array.items %}{% if i == 9999 %}{% break %}{% endif %}{{ i }}{% endfor %}'
+    expected = '12345'
+    assert_template_result(expected, markup, assigns)
+  end
+
+  def test_for_with_continue
+    assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } }
+
+    markup = '{% for i in array.items %}{% continue %}{% endfor %}'
+    expected = ""
+    assert_template_result(expected, markup, assigns)
+
+    markup = '{% for i in array.items %}{{ i }}{% continue %}{% endfor %}'
+    expected = "12345"
+    assert_template_result(expected, markup, assigns)
+
+    markup = '{% for i in array.items %}{% continue %}{{ i }}{% endfor %}'
+    expected = ""
+    assert_template_result(expected, markup, assigns)
+
+    markup = '{% for i in array.items %}{% if i > 3 %}{% continue %}{% endif %}{{ i }}{% endfor %}'
+    expected = "123"
+    assert_template_result(expected, markup, assigns)
+
+    markup = '{% for i in array.items %}{% if i == 3 %}{% continue %}{% else %}{{ i }}{% endif %}{% endfor %}'
+    expected = "1245"
+    assert_template_result(expected, markup, assigns)
+
+    # tests to ensure it only continues the local for loop and not all of them.
+    assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] }
+    markup = '{% for item in array %}' \
+               '{% for i in item %}' \
+                 '{% if i == 1 %}' \
+                   '{% continue %}' \
+                 '{% endif %}' \
+                 '{{ i }}' \
+               '{% endfor %}' \
+             '{% endfor %}'
+    expected = '23456'
+    assert_template_result(expected, markup, assigns)
+
+    # test continue does nothing when unreached
+    assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } }
+    markup = '{% for i in array.items %}{% if i == 9999 %}{% continue %}{% endif %}{{ i }}{% endfor %}'
+    expected = '12345'
+    assert_template_result(expected, markup, assigns)
+  end
+
+  def test_for_tag_string
+    # ruby 1.8.7 "String".each => Enumerator with single "String" element.
+    # ruby 1.9.3 no longer supports .each on String though we mimic
+    # the functionality for backwards compatibility
+
+    assert_template_result('test string',
+      '{%for val in string%}{{val}}{%endfor%}',
+      'string' => "test string")
+
+    assert_template_result('test string',
+      '{%for val in string limit:1%}{{val}}{%endfor%}',
+      'string' => "test string")
+
+    assert_template_result('val-string-1-1-0-1-0-true-true-test string',
+      '{%for val in string%}' \
+      '{{forloop.name}}-' \
+      '{{forloop.index}}-' \
+      '{{forloop.length}}-' \
+      '{{forloop.index0}}-' \
+      '{{forloop.rindex}}-' \
+      '{{forloop.rindex0}}-' \
+      '{{forloop.first}}-' \
+      '{{forloop.last}}-' \
+      '{{val}}{%endfor%}',
+      'string' => "test string")
+  end
+
+  def test_for_parentloop_references_parent_loop
+    assert_template_result('1.1 1.2 1.3 2.1 2.2 2.3 ',
+      '{% for inner in outer %}{% for k in inner %}' \
+      '{{ forloop.parentloop.index }}.{{ forloop.index }} ' \
+      '{% endfor %}{% endfor %}',
+      'outer' => [[1, 1, 1], [1, 1, 1]])
+  end
+
+  def test_for_parentloop_nil_when_not_present
+    assert_template_result('.1 .2 ',
+      '{% for inner in outer %}' \
+      '{{ forloop.parentloop.index }}.{{ forloop.index }} ' \
+      '{% endfor %}',
+      'outer' => [[1, 1, 1], [1, 1, 1]])
+  end
+
+  def test_inner_for_over_empty_input
+    assert_template_result 'oo', '{% for a in (1..2) %}o{% for b in empty %}{% endfor %}{% endfor %}'
+  end
+
+  def test_blank_string_not_iterable
+    assert_template_result('', "{% for char in characters %}I WILL NOT BE OUTPUT{% endfor %}", 'characters' => '')
+  end
+
+  def test_bad_variable_naming_in_for_loop
+    assert_raises(Liquid::SyntaxError) do
+      Liquid::Template.parse('{% for a/b in x %}{% endfor %}')
+    end
+  end
+
+  def test_spacing_with_variable_naming_in_for_loop
+    expected = '12345'
+    template = '{% for       item   in   items %}{{item}}{% endfor %}'
+    assigns  = { 'items' => [1, 2, 3, 4, 5] }
+    assert_template_result(expected, template, assigns)
+  end
+
+  class LoaderDrop < Liquid::Drop
+    attr_accessor :each_called, :load_slice_called
+
+    def initialize(data)
+      @data = data
+    end
+
+    def each
+      @each_called = true
+      @data.each { |el| yield el }
+    end
+
+    def load_slice(from, to)
+      @load_slice_called = true
+      @data[(from..to - 1)]
+    end
+  end
+
+  def test_iterate_with_each_when_no_limit_applied
+    loader = LoaderDrop.new([1, 2, 3, 4, 5])
+    assigns = { 'items' => loader }
+    expected = '12345'
+    template = '{% for item in items %}{{item}}{% endfor %}'
+    assert_template_result(expected, template, assigns)
+    assert loader.each_called
+    assert !loader.load_slice_called
+  end
+
+  def test_iterate_with_load_slice_when_limit_applied
+    loader = LoaderDrop.new([1, 2, 3, 4, 5])
+    assigns = { 'items' => loader }
+    expected = '1'
+    template = '{% for item in items limit:1 %}{{item}}{% endfor %}'
+    assert_template_result(expected, template, assigns)
+    assert !loader.each_called
+    assert loader.load_slice_called
+  end
+
+  def test_iterate_with_load_slice_when_limit_and_offset_applied
+    loader = LoaderDrop.new([1, 2, 3, 4, 5])
+    assigns = { 'items' => loader }
+    expected = '34'
+    template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}'
+    assert_template_result(expected, template, assigns)
+    assert !loader.each_called
+    assert loader.load_slice_called
+  end
+
+  def test_iterate_with_load_slice_returns_same_results_as_without
+    loader = LoaderDrop.new([1, 2, 3, 4, 5])
+    loader_assigns = { 'items' => loader }
+    array_assigns = { 'items' => [1, 2, 3, 4, 5] }
+    expected = '34'
+    template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}'
+    assert_template_result(expected, template, loader_assigns)
+    assert_template_result(expected, template, array_assigns)
+  end
+
+  def test_for_cleans_up_registers
+    context = Context.new(ErrorDrop.new)
+
+    assert_raises(StandardError) do
+      Liquid::Template.parse('{% for i in (1..2) %}{{ standard_error }}{% endfor %}').render!(context)
+    end
+
+    assert context.registers[:for_stack].empty?
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/if_else_tag_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/if_else_tag_test.rb
new file mode 100644
index 0000000..45a5d3a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/if_else_tag_test.rb
@@ -0,0 +1,188 @@
+require 'test_helper'
+
+class IfElseTagTest < Minitest::Test
+  include Liquid
+
+  def test_if
+    assert_template_result('  ', ' {% if false %} this text should not go into the output {% endif %} ')
+    assert_template_result('  this text should go into the output  ',
+      ' {% if true %} this text should go into the output {% endif %} ')
+    assert_template_result('  you rock ?', '{% if false %} you suck {% endif %} {% if true %} you rock {% endif %}?')
+  end
+
+  def test_literal_comparisons
+    assert_template_result(' NO ', '{% assign v = false %}{% if v %} YES {% else %} NO {% endif %}')
+    assert_template_result(' YES ', '{% assign v = nil %}{% if v == nil %} YES {% else %} NO {% endif %}')
+  end
+
+  def test_if_else
+    assert_template_result(' YES ', '{% if false %} NO {% else %} YES {% endif %}')
+    assert_template_result(' YES ', '{% if true %} YES {% else %} NO {% endif %}')
+    assert_template_result(' YES ', '{% if "foo" %} YES {% else %} NO {% endif %}')
+  end
+
+  def test_if_boolean
+    assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => true)
+  end
+
+  def test_if_or
+    assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => true, 'b' => true)
+    assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => true, 'b' => false)
+    assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => false, 'b' => true)
+    assert_template_result('',      '{% if a or b %} YES {% endif %}', 'a' => false, 'b' => false)
+
+    assert_template_result(' YES ', '{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => true)
+    assert_template_result('',      '{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => false)
+  end
+
+  def test_if_or_with_operators
+    assert_template_result(' YES ', '{% if a == true or b == true %} YES {% endif %}', 'a' => true, 'b' => true)
+    assert_template_result(' YES ', '{% if a == true or b == false %} YES {% endif %}', 'a' => true, 'b' => true)
+    assert_template_result('', '{% if a == false or b == false %} YES {% endif %}', 'a' => true, 'b' => true)
+  end
+
+  def test_comparison_of_strings_containing_and_or_or
+    awful_markup = "a == 'and' and b == 'or' and c == 'foo and bar' and d == 'bar or baz' and e == 'foo' and foo and bar"
+    assigns = { 'a' => 'and', 'b' => 'or', 'c' => 'foo and bar', 'd' => 'bar or baz', 'e' => 'foo', 'foo' => true, 'bar' => true }
+    assert_template_result(' YES ', "{% if #{awful_markup} %} YES {% endif %}", assigns)
+  end
+
+  def test_comparison_of_expressions_starting_with_and_or_or
+    assigns = { 'order' => { 'items_count' => 0 }, 'android' => { 'name' => 'Roy' } }
+    assert_template_result("YES",
+      "{% if android.name == 'Roy' %}YES{% endif %}",
+      assigns)
+    assert_template_result("YES",
+      "{% if order.items_count == 0 %}YES{% endif %}",
+      assigns)
+  end
+
+  def test_if_and
+    assert_template_result(' YES ', '{% if true and true %} YES {% endif %}')
+    assert_template_result('', '{% if false and true %} YES {% endif %}')
+    assert_template_result('', '{% if false and true %} YES {% endif %}')
+  end
+
+  def test_hash_miss_generates_false
+    assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => {})
+  end
+
+  def test_if_from_variable
+    assert_template_result('', '{% if var %} NO {% endif %}', 'var' => false)
+    assert_template_result('', '{% if var %} NO {% endif %}', 'var' => nil)
+    assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => { 'bar' => false })
+    assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => {})
+    assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => nil)
+    assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => true)
+
+    assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => "text")
+    assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => true)
+    assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => 1)
+    assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => {})
+    assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => [])
+    assert_template_result(' YES ', '{% if "foo" %} YES {% endif %}')
+    assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => true })
+    assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => "text" })
+    assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => 1 })
+    assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => {} })
+    assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => [] })
+
+    assert_template_result(' YES ', '{% if var %} NO {% else %} YES {% endif %}', 'var' => false)
+    assert_template_result(' YES ', '{% if var %} NO {% else %} YES {% endif %}', 'var' => nil)
+    assert_template_result(' YES ', '{% if var %} YES {% else %} NO {% endif %}', 'var' => true)
+    assert_template_result(' YES ', '{% if "foo" %} YES {% else %} NO {% endif %}', 'var' => "text")
+
+    assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => { 'bar' => false })
+    assert_template_result(' YES ', '{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => { 'bar' => true })
+    assert_template_result(' YES ', '{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => { 'bar' => "text" })
+    assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => { 'notbar' => true })
+    assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => {})
+    assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'notfoo' => { 'bar' => true })
+  end
+
+  def test_nested_if
+    assert_template_result('', '{% if false %}{% if false %} NO {% endif %}{% endif %}')
+    assert_template_result('', '{% if false %}{% if true %} NO {% endif %}{% endif %}')
+    assert_template_result('', '{% if true %}{% if false %} NO {% endif %}{% endif %}')
+    assert_template_result(' YES ', '{% if true %}{% if true %} YES {% endif %}{% endif %}')
+
+    assert_template_result(' YES ', '{% if true %}{% if true %} YES {% else %} NO {% endif %}{% else %} NO {% endif %}')
+    assert_template_result(' YES ', '{% if true %}{% if false %} NO {% else %} YES {% endif %}{% else %} NO {% endif %}')
+    assert_template_result(' YES ', '{% if false %}{% if true %} NO {% else %} NONO {% endif %}{% else %} YES {% endif %}')
+  end
+
+  def test_comparisons_on_null
+    assert_template_result('', '{% if null < 10 %} NO {% endif %}')
+    assert_template_result('', '{% if null <= 10 %} NO {% endif %}')
+    assert_template_result('', '{% if null >= 10 %} NO {% endif %}')
+    assert_template_result('', '{% if null > 10 %} NO {% endif %}')
+
+    assert_template_result('', '{% if 10 < null %} NO {% endif %}')
+    assert_template_result('', '{% if 10 <= null %} NO {% endif %}')
+    assert_template_result('', '{% if 10 >= null %} NO {% endif %}')
+    assert_template_result('', '{% if 10 > null %} NO {% endif %}')
+  end
+
+  def test_else_if
+    assert_template_result('0', '{% if 0 == 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}')
+    assert_template_result('1', '{% if 0 != 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}')
+    assert_template_result('2', '{% if 0 != 0 %}0{% elsif 1 != 1%}1{% else %}2{% endif %}')
+
+    assert_template_result('elsif', '{% if false %}if{% elsif true %}elsif{% endif %}')
+  end
+
+  def test_syntax_error_no_variable
+    assert_raises(SyntaxError){ assert_template_result('', '{% if jerry == 1 %}') }
+  end
+
+  def test_syntax_error_no_expression
+    assert_raises(SyntaxError) { assert_template_result('', '{% if %}') }
+  end
+
+  def test_if_with_custom_condition
+    original_op = Condition.operators['contains']
+    Condition.operators['contains'] = :[]
+
+    assert_template_result('yes', %({% if 'bob' contains 'o' %}yes{% endif %}))
+    assert_template_result('no', %({% if 'bob' contains 'f' %}yes{% else %}no{% endif %}))
+  ensure
+    Condition.operators['contains'] = original_op
+  end
+
+  def test_operators_are_ignored_unless_isolated
+    original_op = Condition.operators['contains']
+    Condition.operators['contains'] = :[]
+
+    assert_template_result('yes',
+      %({% if 'gnomeslab-and-or-liquid' contains 'gnomeslab-and-or-liquid' %}yes{% endif %}))
+  ensure
+    Condition.operators['contains'] = original_op
+  end
+
+  def test_operators_are_whitelisted
+    assert_raises(SyntaxError) do
+      assert_template_result('', %({% if 1 or throw or or 1 %}yes{% endif %}))
+    end
+  end
+
+  def test_multiple_conditions
+    tpl = "{% if a or b and c %}true{% else %}false{% endif %}"
+
+    tests = {
+      [true, true, true] => true,
+      [true, true, false] => true,
+      [true, false, true] => true,
+      [true, false, false] => true,
+      [false, true, true] => true,
+      [false, true, false] => false,
+      [false, false, true] => false,
+      [false, false, false] => false,
+    }
+
+    tests.each do |vals, expected|
+      a, b, c = vals
+      assigns = { 'a' => a, 'b' => b, 'c' => c }
+      assert_template_result expected.to_s, tpl, assigns, assigns.to_s
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/include_tag_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/include_tag_test.rb
new file mode 100644
index 0000000..7b4e3f6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/include_tag_test.rb
@@ -0,0 +1,238 @@
+require 'test_helper'
+
+class TestFileSystem
+  def read_template_file(template_path)
+    case template_path
+    when "product"
+      "Product: {{ product.title }} "
+
+    when "locale_variables"
+      "Locale: {{echo1}} {{echo2}}"
+
+    when "variant"
+      "Variant: {{ variant.title }}"
+
+    when "nested_template"
+      "{% include 'header' %} {% include 'body' %} {% include 'footer' %}"
+
+    when "body"
+      "body {% include 'body_detail' %}"
+
+    when "nested_product_template"
+      "Product: {{ nested_product_template.title }} {%include 'details'%} "
+
+    when "recursively_nested_template"
+      "-{% include 'recursively_nested_template' %}"
+
+    when "pick_a_source"
+      "from TestFileSystem"
+
+    when 'assignments'
+      "{% assign foo = 'bar' %}"
+
+    else
+      template_path
+    end
+  end
+end
+
+class OtherFileSystem
+  def read_template_file(template_path)
+    'from OtherFileSystem'
+  end
+end
+
+class CountingFileSystem
+  attr_reader :count
+  def read_template_file(template_path)
+    @count ||= 0
+    @count += 1
+    'from CountingFileSystem'
+  end
+end
+
+class CustomInclude < Liquid::Tag
+  Syntax = /(#{Liquid::QuotedFragment}+)(\s+(?:with|for)\s+(#{Liquid::QuotedFragment}+))?/o
+
+  def initialize(tag_name, markup, tokens)
+    markup =~ Syntax
+    @template_name = $1
+    super
+  end
+
+  def parse(tokens)
+  end
+
+  def render(context)
+    @template_name[1..-2]
+  end
+end
+
+class IncludeTagTest < Minitest::Test
+  include Liquid
+
+  def setup
+    Liquid::Template.file_system = TestFileSystem.new
+  end
+
+  def test_include_tag_looks_for_file_system_in_registers_first
+    assert_equal 'from OtherFileSystem',
+      Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: OtherFileSystem.new })
+  end
+
+  def test_include_tag_with
+    assert_template_result "Product: Draft 151cm ",
+      "{% include 'product' with products[0] %}", "products" => [ { 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' } ]
+  end
+
+  def test_include_tag_with_default_name
+    assert_template_result "Product: Draft 151cm ",
+      "{% include 'product' %}", "product" => { 'title' => 'Draft 151cm' }
+  end
+
+  def test_include_tag_for
+    assert_template_result "Product: Draft 151cm Product: Element 155cm ",
+      "{% include 'product' for products %}", "products" => [ { 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' } ]
+  end
+
+  def test_include_tag_with_local_variables
+    assert_template_result "Locale: test123 ", "{% include 'locale_variables' echo1: 'test123' %}"
+  end
+
+  def test_include_tag_with_multiple_local_variables
+    assert_template_result "Locale: test123 test321",
+      "{% include 'locale_variables' echo1: 'test123', echo2: 'test321' %}"
+  end
+
+  def test_include_tag_with_multiple_local_variables_from_context
+    assert_template_result "Locale: test123 test321",
+      "{% include 'locale_variables' echo1: echo1, echo2: more_echos.echo2 %}",
+      'echo1' => 'test123', 'more_echos' => { "echo2" => 'test321' }
+  end
+
+  def test_included_templates_assigns_variables
+    assert_template_result "bar", "{% include 'assignments' %}{{ foo }}"
+  end
+
+  def test_nested_include_tag
+    assert_template_result "body body_detail", "{% include 'body' %}"
+
+    assert_template_result "header body body_detail footer", "{% include 'nested_template' %}"
+  end
+
+  def test_nested_include_with_variable
+    assert_template_result "Product: Draft 151cm details ",
+      "{% include 'nested_product_template' with product %}", "product" => { "title" => 'Draft 151cm' }
+
+    assert_template_result "Product: Draft 151cm details Product: Element 155cm details ",
+      "{% include 'nested_product_template' for products %}", "products" => [{ "title" => 'Draft 151cm' }, { "title" => 'Element 155cm' }]
+  end
+
+  def test_recursively_included_template_does_not_produce_endless_loop
+    infinite_file_system = Class.new do
+      def read_template_file(template_path)
+        "-{% include 'loop' %}"
+      end
+    end
+
+    Liquid::Template.file_system = infinite_file_system.new
+
+    assert_raises(Liquid::StackLevelError, SystemStackError) do
+      Template.parse("{% include 'loop' %}").render!
+    end
+  end
+
+  def test_dynamically_choosen_template
+    assert_template_result "Test123", "{% include template %}", "template" => 'Test123'
+    assert_template_result "Test321", "{% include template %}", "template" => 'Test321'
+
+    assert_template_result "Product: Draft 151cm ", "{% include template for product %}",
+      "template" => 'product', 'product' => { 'title' => 'Draft 151cm' }
+  end
+
+  def test_include_tag_caches_second_read_of_same_partial
+    file_system = CountingFileSystem.new
+    assert_equal 'from CountingFileSystemfrom CountingFileSystem',
+      Template.parse("{% include 'pick_a_source' %}{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system })
+    assert_equal 1, file_system.count
+  end
+
+  def test_include_tag_doesnt_cache_partials_across_renders
+    file_system = CountingFileSystem.new
+    assert_equal 'from CountingFileSystem',
+      Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system })
+    assert_equal 1, file_system.count
+
+    assert_equal 'from CountingFileSystem',
+      Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system })
+    assert_equal 2, file_system.count
+  end
+
+  def test_include_tag_within_if_statement
+    assert_template_result "foo_if_true", "{% if true %}{% include 'foo_if_true' %}{% endif %}"
+  end
+
+  def test_custom_include_tag
+    original_tag = Liquid::Template.tags['include']
+    Liquid::Template.tags['include'] = CustomInclude
+    begin
+      assert_equal "custom_foo",
+        Template.parse("{% include 'custom_foo' %}").render!
+    ensure
+      Liquid::Template.tags['include'] = original_tag
+    end
+  end
+
+  def test_custom_include_tag_within_if_statement
+    original_tag = Liquid::Template.tags['include']
+    Liquid::Template.tags['include'] = CustomInclude
+    begin
+      assert_equal "custom_foo_if_true",
+        Template.parse("{% if true %}{% include 'custom_foo_if_true' %}{% endif %}").render!
+    ensure
+      Liquid::Template.tags['include'] = original_tag
+    end
+  end
+
+  def test_does_not_add_error_in_strict_mode_for_missing_variable
+    Liquid::Template.file_system = TestFileSystem.new
+
+    a = Liquid::Template.parse(' {% include "nested_template" %}')
+    a.render!
+    assert_empty a.errors
+  end
+
+  def test_passing_options_to_included_templates
+    assert_raises(Liquid::SyntaxError) do
+      Template.parse("{% include template %}", error_mode: :strict).render!("template" => '{{ "X" || downcase }}')
+    end
+    with_error_mode(:lax) do
+      assert_equal 'x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: true).render!("template" => '{{ "X" || downcase }}')
+    end
+    assert_raises(Liquid::SyntaxError) do
+      Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:locale]).render!("template" => '{{ "X" || downcase }}')
+    end
+    with_error_mode(:lax) do
+      assert_equal 'x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:error_mode]).render!("template" => '{{ "X" || downcase }}')
+    end
+  end
+
+  def test_render_raise_argument_error_when_template_is_undefined
+    assert_raises(Liquid::ArgumentError) do
+      template = Liquid::Template.parse('{% include undefined_variable %}')
+      template.render!
+    end
+    assert_raises(Liquid::ArgumentError) do
+      template = Liquid::Template.parse('{% include nil %}')
+      template.render!
+    end
+  end
+
+  def test_including_via_variable_value
+    assert_template_result "from TestFileSystem", "{% assign page = 'pick_a_source' %}{% include page %}"
+
+    assert_template_result "Product: Draft 151cm ", "{% assign page = 'product' %}{% include page %}", "product" => { 'title' => 'Draft 151cm' }
+
+    assert_template_result "Product: Draft 151cm ", "{% assign page = 'product' %}{% include page for foo %}", "foo" => { 'title' => 'Draft 151cm' }
+  end
+end # IncludeTagTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/increment_tag_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/increment_tag_test.rb
new file mode 100644
index 0000000..97c51ac
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/increment_tag_test.rb
@@ -0,0 +1,23 @@
+require 'test_helper'
+
+class IncrementTagTest < Minitest::Test
+  include Liquid
+
+  def test_inc
+    assert_template_result('0', '{%increment port %}', {})
+    assert_template_result('0 1', '{%increment port %} {%increment port%}', {})
+    assert_template_result('0 0 1 2 1',
+      '{%increment port %} {%increment starboard%} ' \
+      '{%increment port %} {%increment port%} ' \
+      '{%increment starboard %}', {})
+  end
+
+  def test_dec
+    assert_template_result('9', '{%decrement port %}', { 'port' => 10 })
+    assert_template_result('-1 -2', '{%decrement port %} {%decrement port%}', {})
+    assert_template_result('1 5 2 2 5',
+      '{%increment port %} {%increment starboard%} ' \
+      '{%increment port %} {%decrement port%} ' \
+      '{%decrement starboard %}', { 'port' => 1, 'starboard' => 5 })
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/raw_tag_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/raw_tag_test.rb
new file mode 100644
index 0000000..634d052
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/raw_tag_test.rb
@@ -0,0 +1,31 @@
+require 'test_helper'
+
+class RawTagTest < Minitest::Test
+  include Liquid
+
+  def test_tag_in_raw
+    assert_template_result '{% comment %} test {% endcomment %}',
+      '{% raw %}{% comment %} test {% endcomment %}{% endraw %}'
+  end
+
+  def test_output_in_raw
+    assert_template_result '{{ test }}', '{% raw %}{{ test }}{% endraw %}'
+  end
+
+  def test_open_tag_in_raw
+    assert_template_result ' Foobar {% invalid ', '{% raw %} Foobar {% invalid {% endraw %}'
+    assert_template_result ' Foobar invalid %} ', '{% raw %} Foobar invalid %} {% endraw %}'
+    assert_template_result ' Foobar {{ invalid ', '{% raw %} Foobar {{ invalid {% endraw %}'
+    assert_template_result ' Foobar invalid }} ', '{% raw %} Foobar invalid }} {% endraw %}'
+    assert_template_result ' Foobar {% invalid {% {% endraw ', '{% raw %} Foobar {% invalid {% {% endraw {% endraw %}'
+    assert_template_result ' Foobar {% {% {% ', '{% raw %} Foobar {% {% {% {% endraw %}'
+    assert_template_result ' test {% raw %} {% endraw %}', '{% raw %} test {% raw %} {% {% endraw %}endraw %}'
+    assert_template_result ' Foobar {{ invalid 1', '{% raw %} Foobar {{ invalid {% endraw %}{{ 1 }}'
+  end
+
+  def test_invalid_raw
+    assert_match_syntax_error(/tag was never closed/, '{% raw %} foo')
+    assert_match_syntax_error(/Valid syntax/, '{% raw } foo {% endraw %}')
+    assert_match_syntax_error(/Valid syntax/, '{% raw } foo %}{% endraw %}')
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/standard_tag_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/standard_tag_test.rb
new file mode 100644
index 0000000..4b4703a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/standard_tag_test.rb
@@ -0,0 +1,296 @@
+require 'test_helper'
+
+class StandardTagTest < Minitest::Test
+  include Liquid
+
+  def test_no_transform
+    assert_template_result('this text should come out of the template without change...',
+      'this text should come out of the template without change...')
+
+    assert_template_result('blah', 'blah')
+    assert_template_result('<blah>', '<blah>')
+    assert_template_result('|,.:', '|,.:')
+    assert_template_result('', '')
+
+    text = %(this shouldnt see any transformation either but has multiple lines
+              as you can clearly see here ...)
+    assert_template_result(text, text)
+  end
+
+  def test_has_a_block_which_does_nothing
+    assert_template_result(%(the comment block should be removed  .. right?),
+      %(the comment block should be removed {%comment%} be gone.. {%endcomment%} .. right?))
+
+    assert_template_result('', '{%comment%}{%endcomment%}')
+    assert_template_result('', '{%comment%}{% endcomment %}')
+    assert_template_result('', '{% comment %}{%endcomment%}')
+    assert_template_result('', '{% comment %}{% endcomment %}')
+    assert_template_result('', '{%comment%}comment{%endcomment%}')
+    assert_template_result('', '{% comment %}comment{% endcomment %}')
+    assert_template_result('', '{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}')
+
+    assert_template_result('', '{%comment%}{%blabla%}{%endcomment%}')
+    assert_template_result('', '{% comment %}{% blabla %}{% endcomment %}')
+    assert_template_result('', '{%comment%}{% endif %}{%endcomment%}')
+    assert_template_result('', '{% comment %}{% endwhatever %}{% endcomment %}')
+    assert_template_result('', '{% comment %}{% raw %} {{%%%%}}  }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}')
+
+    assert_template_result('foobar', 'foo{%comment%}comment{%endcomment%}bar')
+    assert_template_result('foobar', 'foo{% comment %}comment{% endcomment %}bar')
+    assert_template_result('foobar', 'foo{%comment%} comment {%endcomment%}bar')
+    assert_template_result('foobar', 'foo{% comment %} comment {% endcomment %}bar')
+
+    assert_template_result('foo  bar', 'foo {%comment%} {%endcomment%} bar')
+    assert_template_result('foo  bar', 'foo {%comment%}comment{%endcomment%} bar')
+    assert_template_result('foo  bar', 'foo {%comment%} comment {%endcomment%} bar')
+
+    assert_template_result('foobar', 'foo{%comment%}
+                                     {%endcomment%}bar')
+  end
+
+  def test_hyphenated_assign
+    assigns = { 'a-b' => '1' }
+    assert_template_result('a-b:1 a-b:2', 'a-b:{{a-b}} {%assign a-b = 2 %}a-b:{{a-b}}', assigns)
+  end
+
+  def test_assign_with_colon_and_spaces
+    assigns = { 'var' => { 'a:b c' => { 'paged' => '1' } } }
+    assert_template_result('var2: 1', '{%assign var2 = var["a:b c"].paged %}var2: {{var2}}', assigns)
+  end
+
+  def test_capture
+    assigns = { 'var' => 'content' }
+    assert_template_result('content foo content foo ',
+      '{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
+      assigns)
+  end
+
+  def test_capture_detects_bad_syntax
+    assert_raises(SyntaxError) do
+      assert_template_result('content foo content foo ',
+        '{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
+        { 'var' => 'content' })
+    end
+  end
+
+  def test_case
+    assigns = { 'condition' => 2 }
+    assert_template_result(' its 2 ',
+      '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
+      assigns)
+
+    assigns = { 'condition' => 1 }
+    assert_template_result(' its 1 ',
+      '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
+      assigns)
+
+    assigns = { 'condition' => 3 }
+    assert_template_result('',
+      '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
+      assigns)
+
+    assigns = { 'condition' => "string here" }
+    assert_template_result(' hit ',
+      '{% case condition %}{% when "string here" %} hit {% endcase %}',
+      assigns)
+
+    assigns = { 'condition' => "bad string here" }
+    assert_template_result('',
+      '{% case condition %}{% when "string here" %} hit {% endcase %}',\
+      assigns)
+  end
+
+  def test_case_with_else
+    assigns = { 'condition' => 5 }
+    assert_template_result(' hit ',
+      '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
+      assigns)
+
+    assigns = { 'condition' => 6 }
+    assert_template_result(' else ',
+      '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
+      assigns)
+
+    assigns = { 'condition' => 6 }
+    assert_template_result(' else ',
+      '{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}',
+      assigns)
+  end
+
+  def test_case_on_size
+    assert_template_result('',  '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [])
+    assert_template_result('1', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1])
+    assert_template_result('2', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1])
+    assert_template_result('',  '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1])
+    assert_template_result('',  '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1, 1])
+    assert_template_result('',  '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1, 1, 1])
+  end
+
+  def test_case_on_size_with_else
+    assert_template_result('else',
+      '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
+      'a' => [])
+
+    assert_template_result('1',
+      '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
+      'a' => [1])
+
+    assert_template_result('2',
+      '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
+      'a' => [1, 1])
+
+    assert_template_result('else',
+      '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
+      'a' => [1, 1, 1])
+
+    assert_template_result('else',
+      '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
+      'a' => [1, 1, 1, 1])
+
+    assert_template_result('else',
+      '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
+      'a' => [1, 1, 1, 1, 1])
+  end
+
+  def test_case_on_length_with_else
+    assert_template_result('else',
+      '{% case a.empty? %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
+      {})
+
+    assert_template_result('false',
+      '{% case false %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
+      {})
+
+    assert_template_result('true',
+      '{% case true %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
+      {})
+
+    assert_template_result('else',
+      '{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
+      {})
+  end
+
+  def test_assign_from_case
+    # Example from the shopify forums
+    code = "{% case collection.handle %}{% when 'menswear-jackets' %}{% assign ptitle = 'menswear' %}{% when 'menswear-t-shirts' %}{% assign ptitle = 'menswear' %}{% else %}{% assign ptitle = 'womenswear' %}{% endcase %}{{ ptitle }}"
+    template = Liquid::Template.parse(code)
+    assert_equal "menswear",   template.render!("collection" => { 'handle' => 'menswear-jackets' })
+    assert_equal "menswear",   template.render!("collection" => { 'handle' => 'menswear-t-shirts' })
+    assert_equal "womenswear", template.render!("collection" => { 'handle' => 'x' })
+    assert_equal "womenswear", template.render!("collection" => { 'handle' => 'y' })
+    assert_equal "womenswear", template.render!("collection" => { 'handle' => 'z' })
+  end
+
+  def test_case_when_or
+    code = '{% case condition %}{% when 1 or 2 or 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 })
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 })
+    assert_template_result(' its 4 ', code, { 'condition' => 4 })
+    assert_template_result('', code, { 'condition' => 5 })
+
+    code = '{% case condition %}{% when 1 or "string" or null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' })
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil })
+    assert_template_result('', code, { 'condition' => 'something else' })
+  end
+
+  def test_case_when_comma
+    code = '{% case condition %}{% when 1, 2, 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 })
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 })
+    assert_template_result(' its 4 ', code, { 'condition' => 4 })
+    assert_template_result('', code, { 'condition' => 5 })
+
+    code = '{% case condition %}{% when 1, "string", null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' })
+    assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil })
+    assert_template_result('', code, { 'condition' => 'something else' })
+  end
+
+  def test_assign
+    assert_template_result 'variable', '{% assign a = "variable"%}{{a}}'
+  end
+
+  def test_assign_unassigned
+    assigns = { 'var' => 'content' }
+    assert_template_result('var2:  var2:content', 'var2:{{var2}} {%assign var2 = var%} var2:{{var2}}', assigns)
+  end
+
+  def test_assign_an_empty_string
+    assert_template_result '', '{% assign a = ""%}{{a}}'
+  end
+
+  def test_assign_is_global
+    assert_template_result 'variable', '{%for i in (1..2) %}{% assign a = "variable"%}{% endfor %}{{a}}'
+  end
+
+  def test_case_detects_bad_syntax
+    assert_raises(SyntaxError) do
+      assert_template_result('',  '{% case false %}{% when %}true{% endcase %}', {})
+    end
+
+    assert_raises(SyntaxError) do
+      assert_template_result('',  '{% case false %}{% huh %}true{% endcase %}', {})
+    end
+  end
+
+  def test_cycle
+    assert_template_result('one', '{%cycle "one", "two"%}')
+    assert_template_result('one two', '{%cycle "one", "two"%} {%cycle "one", "two"%}')
+    assert_template_result(' two', '{%cycle "", "two"%} {%cycle "", "two"%}')
+
+    assert_template_result('one two one', '{%cycle "one", "two"%} {%cycle "one", "two"%} {%cycle "one", "two"%}')
+
+    assert_template_result('text-align: left text-align: right',
+      '{%cycle "text-align: left", "text-align: right" %} {%cycle "text-align: left", "text-align: right"%}')
+  end
+
+  def test_multiple_cycles
+    assert_template_result('1 2 1 1 2 3 1',
+      '{%cycle 1,2%} {%cycle 1,2%} {%cycle 1,2%} {%cycle 1,2,3%} {%cycle 1,2,3%} {%cycle 1,2,3%} {%cycle 1,2,3%}')
+  end
+
+  def test_multiple_named_cycles
+    assert_template_result('one one two two one one',
+      '{%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %} {%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %} {%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %}')
+  end
+
+  def test_multiple_named_cycles_with_names_from_context
+    assigns = { "var1" => 1, "var2" => 2 }
+    assert_template_result('one one two two one one',
+      '{%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %}', assigns)
+  end
+
+  def test_size_of_array
+    assigns = { "array" => [1, 2, 3, 4] }
+    assert_template_result('array has 4 elements', "array has {{ array.size }} elements", assigns)
+  end
+
+  def test_size_of_hash
+    assigns = { "hash" => { a: 1, b: 2, c: 3, d: 4 } }
+    assert_template_result('hash has 4 elements', "hash has {{ hash.size }} elements", assigns)
+  end
+
+  def test_illegal_symbols
+    assert_template_result('', '{% if true == empty %}?{% endif %}', {})
+    assert_template_result('', '{% if true == null %}?{% endif %}', {})
+    assert_template_result('', '{% if empty == true %}?{% endif %}', {})
+    assert_template_result('', '{% if null == true %}?{% endif %}', {})
+  end
+
+  def test_ifchanged
+    assigns = { 'array' => [ 1, 1, 2, 2, 3, 3] }
+    assert_template_result('123', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns)
+
+    assigns = { 'array' => [ 1, 1, 1, 1] }
+    assert_template_result('1', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns)
+  end
+
+  def test_multiline_tag
+    assert_template_result '0 1 2 3', "0{%\nfor i in (1..3)\n%} {{\ni\n}}{%\nendfor\n%}"
+  end
+end # StandardTagTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/statements_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/statements_test.rb
new file mode 100644
index 0000000..eeff166
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/statements_test.rb
@@ -0,0 +1,111 @@
+require 'test_helper'
+
+class StatementsTest < Minitest::Test
+  include Liquid
+
+  def test_true_eql_true
+    text = ' {% if true == true %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text
+  end
+
+  def test_true_not_eql_true
+    text = ' {% if true != true %} true {% else %} false {% endif %} '
+    assert_template_result '  false  ', text
+  end
+
+  def test_true_lq_true
+    text = ' {% if 0 > 0 %} true {% else %} false {% endif %} '
+    assert_template_result '  false  ', text
+  end
+
+  def test_one_lq_zero
+    text = ' {% if 1 > 0 %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text
+  end
+
+  def test_zero_lq_one
+    text = ' {% if 0 < 1 %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text
+  end
+
+  def test_zero_lq_or_equal_one
+    text = ' {% if 0 <= 0 %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text
+  end
+
+  def test_zero_lq_or_equal_one_involving_nil
+    text = ' {% if null <= 0 %} true {% else %} false {% endif %} '
+    assert_template_result '  false  ', text
+
+    text = ' {% if 0 <= null %} true {% else %} false {% endif %} '
+    assert_template_result '  false  ', text
+  end
+
+  def test_zero_lqq_or_equal_one
+    text = ' {% if 0 >= 0 %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text
+  end
+
+  def test_strings
+    text = " {% if 'test' == 'test' %} true {% else %} false {% endif %} "
+    assert_template_result '  true  ', text
+  end
+
+  def test_strings_not_equal
+    text = " {% if 'test' != 'test' %} true {% else %} false {% endif %} "
+    assert_template_result '  false  ', text
+  end
+
+  def test_var_strings_equal
+    text = ' {% if var == "hello there!" %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text, 'var' => 'hello there!'
+  end
+
+  def test_var_strings_are_not_equal
+    text = ' {% if "hello there!" == var %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text, 'var' => 'hello there!'
+  end
+
+  def test_var_and_long_string_are_equal
+    text = " {% if var == 'hello there!' %} true {% else %} false {% endif %} "
+    assert_template_result '  true  ', text, 'var' => 'hello there!'
+  end
+
+  def test_var_and_long_string_are_equal_backwards
+    text = " {% if 'hello there!' == var %} true {% else %} false {% endif %} "
+    assert_template_result '  true  ', text, 'var' => 'hello there!'
+  end
+
+  # def test_is_nil
+  #  text = %| {% if var != nil %} true {% else %} false {% end %} |
+  #  @template.assigns = { 'var' => 'hello there!'}
+  #  expected = %|  true  |
+  #  assert_equal expected, @template.parse(text)
+  # end
+
+  def test_is_collection_empty
+    text = ' {% if array == empty %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text, 'array' => []
+  end
+
+  def test_is_not_collection_empty
+    text = ' {% if array == empty %} true {% else %} false {% endif %} '
+    assert_template_result '  false  ', text, 'array' => [1, 2, 3]
+  end
+
+  def test_nil
+    text = ' {% if var == nil %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text, 'var' => nil
+
+    text = ' {% if var == null %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text, 'var' => nil
+  end
+
+  def test_not_nil
+    text = ' {% if var != nil %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text, 'var' => 1
+
+    text = ' {% if var != null %} true {% else %} false {% endif %} '
+    assert_template_result '  true  ', text, 'var' => 1
+  end
+end # StatementsTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/table_row_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/table_row_test.rb
new file mode 100644
index 0000000..d7bc14c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/table_row_test.rb
@@ -0,0 +1,64 @@
+require 'test_helper'
+
+class TableRowTest < Minitest::Test
+  include Liquid
+
+  class ArrayDrop < Liquid::Drop
+    include Enumerable
+
+    def initialize(array)
+      @array = array
+    end
+
+    def each(&block)
+      @array.each(&block)
+    end
+  end
+
+  def test_table_row
+    assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
+      '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
+      'numbers' => [1, 2, 3, 4, 5, 6])
+
+    assert_template_result("<tr class=\"row1\">\n</tr>\n",
+      '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
+      'numbers' => [])
+  end
+
+  def test_table_row_with_different_cols
+    assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td><td class=\"col4\"> 4 </td><td class=\"col5\"> 5 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 6 </td></tr>\n",
+      '{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}',
+      'numbers' => [1, 2, 3, 4, 5, 6])
+  end
+
+  def test_table_col_counter
+    assert_template_result("<tr class=\"row1\">\n<td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row2\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row3\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n",
+      '{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}',
+      'numbers' => [1, 2, 3, 4, 5, 6])
+  end
+
+  def test_quoted_fragment
+    assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
+      "{% tablerow n in collections.frontpage cols:3%} {{n}} {% endtablerow %}",
+      'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] })
+    assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
+      "{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}",
+      'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] })
+  end
+
+  def test_enumerable_drop
+    assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
+      '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
+      'numbers' => ArrayDrop.new([1, 2, 3, 4, 5, 6]))
+  end
+
+  def test_offset_and_limit
+    assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
+      '{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}',
+      'numbers' => [0, 1, 2, 3, 4, 5, 6, 7])
+  end
+
+  def test_blank_string_not_iterable
+    assert_template_result("<tr class=\"row1\">\n</tr>\n", "{% tablerow char in characters cols:3 %}I WILL NOT BE OUTPUT{% endtablerow %}", 'characters' => '')
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/unless_else_tag_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/unless_else_tag_test.rb
new file mode 100644
index 0000000..c414a71
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/tags/unless_else_tag_test.rb
@@ -0,0 +1,26 @@
+require 'test_helper'
+
+class UnlessElseTagTest < Minitest::Test
+  include Liquid
+
+  def test_unless
+    assert_template_result('  ', ' {% unless true %} this text should not go into the output {% endunless %} ')
+    assert_template_result('  this text should go into the output  ',
+      ' {% unless false %} this text should go into the output {% endunless %} ')
+    assert_template_result('  you rock ?', '{% unless true %} you suck {% endunless %} {% unless false %} you rock {% endunless %}?')
+  end
+
+  def test_unless_else
+    assert_template_result(' YES ', '{% unless true %} NO {% else %} YES {% endunless %}')
+    assert_template_result(' YES ', '{% unless false %} YES {% else %} NO {% endunless %}')
+    assert_template_result(' YES ', '{% unless "foo" %} NO {% else %} YES {% endunless %}')
+  end
+
+  def test_unless_in_loop
+    assert_template_result '23', '{% for i in choices %}{% unless i %}{{ forloop.index }}{% endunless %}{% endfor %}', 'choices' => [1, nil, false]
+  end
+
+  def test_unless_else_in_loop
+    assert_template_result ' TRUE  2  3 ', '{% for i in choices %}{% unless i %} {{ forloop.index }} {% else %} TRUE {% endunless %}{% endfor %}', 'choices' => [1, nil, false]
+  end
+end # UnlessElseTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/template_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/template_test.rb
new file mode 100644
index 0000000..253b976
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/template_test.rb
@@ -0,0 +1,323 @@
+require 'test_helper'
+require 'timeout'
+
+class TemplateContextDrop < Liquid::Drop
+  def liquid_method_missing(method)
+    method
+  end
+
+  def foo
+    'fizzbuzz'
+  end
+
+  def baz
+    @context.registers['lulz']
+  end
+end
+
+class SomethingWithLength < Liquid::Drop
+  def length
+    nil
+  end
+end
+
+class ErroneousDrop < Liquid::Drop
+  def bad_method
+    raise 'ruby error in drop'
+  end
+end
+
+class DropWithUndefinedMethod < Liquid::Drop
+  def foo
+    'foo'
+  end
+end
+
+class TemplateTest < Minitest::Test
+  include Liquid
+
+  def test_instance_assigns_persist_on_same_template_object_between_parses
+    t = Template.new
+    assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render!
+    assert_equal 'from instance assigns', t.parse("{{ foo }}").render!
+  end
+
+  def test_warnings_is_not_exponential_time
+    str = "false"
+    100.times do
+      str = "{% if true %}true{% else %}#{str}{% endif %}"
+    end
+
+    t = Template.parse(str)
+    assert_equal [], Timeout.timeout(1) { t.warnings }
+  end
+
+  def test_instance_assigns_persist_on_same_template_parsing_between_renders
+    t = Template.new.parse("{{ foo }}{% assign foo = 'foo' %}{{ foo }}")
+    assert_equal 'foo', t.render!
+    assert_equal 'foofoo', t.render!
+  end
+
+  def test_custom_assigns_do_not_persist_on_same_template
+    t = Template.new
+    assert_equal 'from custom assigns', t.parse("{{ foo }}").render!('foo' => 'from custom assigns')
+    assert_equal '', t.parse("{{ foo }}").render!
+  end
+
+  def test_custom_assigns_squash_instance_assigns
+    t = Template.new
+    assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render!
+    assert_equal 'from custom assigns', t.parse("{{ foo }}").render!('foo' => 'from custom assigns')
+  end
+
+  def test_persistent_assigns_squash_instance_assigns
+    t = Template.new
+    assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render!
+    t.assigns['foo'] = 'from persistent assigns'
+    assert_equal 'from persistent assigns', t.parse("{{ foo }}").render!
+  end
+
+  def test_lambda_is_called_once_from_persistent_assigns_over_multiple_parses_and_renders
+    t = Template.new
+    t.assigns['number'] = -> { @global ||= 0; @global += 1 }
+    assert_equal '1', t.parse("{{number}}").render!
+    assert_equal '1', t.parse("{{number}}").render!
+    assert_equal '1', t.render!
+    @global = nil
+  end
+
+  def test_lambda_is_called_once_from_custom_assigns_over_multiple_parses_and_renders
+    t = Template.new
+    assigns = { 'number' => -> { @global ||= 0; @global += 1 } }
+    assert_equal '1', t.parse("{{number}}").render!(assigns)
+    assert_equal '1', t.parse("{{number}}").render!(assigns)
+    assert_equal '1', t.render!(assigns)
+    @global = nil
+  end
+
+  def test_resource_limits_works_with_custom_length_method
+    t = Template.parse("{% assign foo = bar %}")
+    t.resource_limits.render_length_limit = 42
+    assert_equal "", t.render!("bar" => SomethingWithLength.new)
+  end
+
+  def test_resource_limits_render_length
+    t = Template.parse("0123456789")
+    t.resource_limits.render_length_limit = 5
+    assert_equal "Liquid error: Memory limits exceeded", t.render
+    assert t.resource_limits.reached?
+
+    t.resource_limits.render_length_limit = 10
+    assert_equal "0123456789", t.render!
+    refute_nil t.resource_limits.render_length
+  end
+
+  def test_resource_limits_render_score
+    t = Template.parse("{% for a in (1..10) %} {% for a in (1..10) %} foo {% endfor %} {% endfor %}")
+    t.resource_limits.render_score_limit = 50
+    assert_equal "Liquid error: Memory limits exceeded", t.render
+    assert t.resource_limits.reached?
+
+    t = Template.parse("{% for a in (1..100) %} foo {% endfor %}")
+    t.resource_limits.render_score_limit = 50
+    assert_equal "Liquid error: Memory limits exceeded", t.render
+    assert t.resource_limits.reached?
+
+    t.resource_limits.render_score_limit = 200
+    assert_equal (" foo " * 100), t.render!
+    refute_nil t.resource_limits.render_score
+  end
+
+  def test_resource_limits_assign_score
+    t = Template.parse("{% assign foo = 42 %}{% assign bar = 23 %}")
+    t.resource_limits.assign_score_limit = 1
+    assert_equal "Liquid error: Memory limits exceeded", t.render
+    assert t.resource_limits.reached?
+
+    t.resource_limits.assign_score_limit = 2
+    assert_equal "", t.render!
+    refute_nil t.resource_limits.assign_score
+  end
+
+  def test_resource_limits_assign_score_nested
+    t = Template.parse("{% assign foo = 'aaaa' | reverse %}")
+
+    t.resource_limits.assign_score_limit = 3
+    assert_equal "Liquid error: Memory limits exceeded", t.render
+    assert t.resource_limits.reached?
+
+    t.resource_limits.assign_score_limit = 5
+    assert_equal "", t.render!
+  end
+
+  def test_resource_limits_aborts_rendering_after_first_error
+    t = Template.parse("{% for a in (1..100) %} foo1 {% endfor %} bar {% for a in (1..100) %} foo2 {% endfor %}")
+    t.resource_limits.render_score_limit = 50
+    assert_equal "Liquid error: Memory limits exceeded", t.render
+    assert t.resource_limits.reached?
+  end
+
+  def test_resource_limits_hash_in_template_gets_updated_even_if_no_limits_are_set
+    t = Template.parse("{% for a in (1..100) %} {% assign foo = 1 %} {% endfor %}")
+    t.render!
+    assert t.resource_limits.assign_score > 0
+    assert t.resource_limits.render_score > 0
+    assert t.resource_limits.render_length > 0
+  end
+
+  def test_render_length_persists_between_blocks
+    t = Template.parse("{% if true %}aaaa{% endif %}")
+    t.resource_limits.render_length_limit = 7
+    assert_equal "Liquid error: Memory limits exceeded", t.render
+    t.resource_limits.render_length_limit = 8
+    assert_equal "aaaa", t.render
+
+    t = Template.parse("{% if true %}aaaa{% endif %}{% if true %}bbb{% endif %}")
+    t.resource_limits.render_length_limit = 13
+    assert_equal "Liquid error: Memory limits exceeded", t.render
+    t.resource_limits.render_length_limit = 14
+    assert_equal "aaaabbb", t.render
+
+    t = Template.parse("{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}{% if true %}a{% endif %}{% if true %}b{% endif %}")
+    t.resource_limits.render_length_limit = 5
+    assert_equal "Liquid error: Memory limits exceeded", t.render
+    t.resource_limits.render_length_limit = 11
+    assert_equal "Liquid error: Memory limits exceeded", t.render
+    t.resource_limits.render_length_limit = 12
+    assert_equal "ababab", t.render
+  end
+
+  def test_default_resource_limits_unaffected_by_render_with_context
+    context = Context.new
+    t = Template.parse("{% for a in (1..100) %} {% assign foo = 1 %} {% endfor %}")
+    t.render!(context)
+    assert context.resource_limits.assign_score > 0
+    assert context.resource_limits.render_score > 0
+    assert context.resource_limits.render_length > 0
+  end
+
+  def test_can_use_drop_as_context
+    t = Template.new
+    t.registers['lulz'] = 'haha'
+    drop = TemplateContextDrop.new
+    assert_equal 'fizzbuzz', t.parse('{{foo}}').render!(drop)
+    assert_equal 'bar', t.parse('{{bar}}').render!(drop)
+    assert_equal 'haha', t.parse("{{baz}}").render!(drop)
+  end
+
+  def test_render_bang_force_rethrow_errors_on_passed_context
+    context = Context.new({ 'drop' => ErroneousDrop.new })
+    t = Template.new.parse('{{ drop.bad_method }}')
+
+    e = assert_raises RuntimeError do
+      t.render!(context)
+    end
+    assert_equal 'ruby error in drop', e.message
+  end
+
+  def test_exception_renderer_that_returns_string
+    exception = nil
+    handler = ->(e) { exception = e; '<!-- error -->' }
+
+    output = Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_renderer: handler)
+
+    assert exception.is_a?(Liquid::ZeroDivisionError)
+    assert_equal '<!-- error -->', output
+  end
+
+  def test_exception_renderer_that_raises
+    exception = nil
+    assert_raises(Liquid::ZeroDivisionError) do
+      Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_renderer: ->(e) { exception = e; raise })
+    end
+    assert exception.is_a?(Liquid::ZeroDivisionError)
+  end
+
+  def test_global_filter_option_on_render
+    global_filter_proc = ->(output) { "#{output} filtered" }
+    rendered_template = Template.parse("{{name}}").render({ "name" => "bob" }, global_filter: global_filter_proc)
+
+    assert_equal 'bob filtered', rendered_template
+  end
+
+  def test_global_filter_option_when_native_filters_exist
+    global_filter_proc = ->(output) { "#{output} filtered" }
+    rendered_template = Template.parse("{{name | upcase}}").render({ "name" => "bob" }, global_filter: global_filter_proc)
+
+    assert_equal 'BOB filtered', rendered_template
+  end
+
+  def test_undefined_variables
+    t = Template.parse("{{x}} {{y}} {{z.a}} {{z.b}} {{z.c.d}}")
+    result = t.render({ 'x' => 33, 'z' => { 'a' => 32, 'c' => { 'e' => 31 } } }, { strict_variables: true })
+
+    assert_equal '33  32  ', result
+    assert_equal 3, t.errors.count
+    assert_instance_of Liquid::UndefinedVariable, t.errors[0]
+    assert_equal 'Liquid error: undefined variable y', t.errors[0].message
+    assert_instance_of Liquid::UndefinedVariable, t.errors[1]
+    assert_equal 'Liquid error: undefined variable b', t.errors[1].message
+    assert_instance_of Liquid::UndefinedVariable, t.errors[2]
+    assert_equal 'Liquid error: undefined variable d', t.errors[2].message
+  end
+
+  def test_undefined_variables_raise
+    t = Template.parse("{{x}} {{y}} {{z.a}} {{z.b}} {{z.c.d}}")
+
+    assert_raises UndefinedVariable do
+      t.render!({ 'x' => 33, 'z' => { 'a' => 32, 'c' => { 'e' => 31 } } }, { strict_variables: true })
+    end
+  end
+
+  def test_undefined_drop_methods
+    d = DropWithUndefinedMethod.new
+    t = Template.new.parse('{{ foo }} {{ woot }}')
+    result = t.render(d, { strict_variables: true })
+
+    assert_equal 'foo ', result
+    assert_equal 1, t.errors.count
+    assert_instance_of Liquid::UndefinedDropMethod, t.errors[0]
+  end
+
+  def test_undefined_drop_methods_raise
+    d = DropWithUndefinedMethod.new
+    t = Template.new.parse('{{ foo }} {{ woot }}')
+
+    assert_raises UndefinedDropMethod do
+      t.render!(d, { strict_variables: true })
+    end
+  end
+
+  def test_undefined_filters
+    t = Template.parse("{{a}} {{x | upcase | somefilter1 | somefilter2 | somefilter3}}")
+    filters = Module.new do
+      def somefilter3(v)
+        "-#{v}-"
+      end
+    end
+    result = t.render({ 'a' => 123, 'x' => 'foo' }, { filters: [filters], strict_filters: true })
+
+    assert_equal '123 ', result
+    assert_equal 1, t.errors.count
+    assert_instance_of Liquid::UndefinedFilter, t.errors[0]
+    assert_equal 'Liquid error: undefined filter somefilter1', t.errors[0].message
+  end
+
+  def test_undefined_filters_raise
+    t = Template.parse("{{x | somefilter1 | upcase | somefilter2}}")
+
+    assert_raises UndefinedFilter do
+      t.render!({ 'x' => 'foo' }, { strict_filters: true })
+    end
+  end
+
+  def test_using_range_literal_works_as_expected
+    t = Template.parse("{% assign foo = (x..y) %}{{ foo }}")
+    result = t.render({ 'x' => 1, 'y' => 5 })
+    assert_equal '1..5', result
+
+    t = Template.parse("{% assign nums = (x..y) %}{% for num in nums %}{{ num }}{% endfor %}")
+    result = t.render({ 'x' => 1, 'y' => 5 })
+    assert_equal '12345', result
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/trim_mode_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/trim_mode_test.rb
new file mode 100644
index 0000000..ed24fe3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/trim_mode_test.rb
@@ -0,0 +1,525 @@
+require 'test_helper'
+
+class TrimModeTest < Minitest::Test
+  include Liquid
+
+  # Make sure the trim isn't applied to standard output
+  def test_standard_output
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {{ 'John' }}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>
+          John
+        </p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_variable_output_with_multiple_blank_lines
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+
+
+          {{- 'John' -}}
+
+
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>John</p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_tag_output_with_multiple_blank_lines
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+
+
+          {%- if true -%}
+          yes
+          {%- endif -%}
+
+
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>yes</p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  # Make sure the trim isn't applied to standard tags
+  def test_standard_tags
+    whitespace = '          '
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {% if true %}
+          yes
+          {% endif %}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>
+#{whitespace}
+          yes
+#{whitespace}
+        </p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {% if false %}
+          no
+          {% endif %}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>
+#{whitespace}
+        </p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  # Make sure the trim isn't too agressive
+  def test_no_trim_output
+    text = '<p>{{- \'John\' -}}</p>'
+    expected = '<p>John</p>'
+    assert_template_result(expected, text)
+  end
+
+  # Make sure the trim isn't too agressive
+  def test_no_trim_tags
+    text = '<p>{%- if true -%}yes{%- endif -%}</p>'
+    expected = '<p>yes</p>'
+    assert_template_result(expected, text)
+
+    text = '<p>{%- if false -%}no{%- endif -%}</p>'
+    expected = '<p></p>'
+    assert_template_result(expected, text)
+  end
+
+  def test_single_line_outer_tag
+    text = '<p> {%- if true %} yes {% endif -%} </p>'
+    expected = '<p> yes </p>'
+    assert_template_result(expected, text)
+
+    text = '<p> {%- if false %} no {% endif -%} </p>'
+    expected = '<p></p>'
+    assert_template_result(expected, text)
+  end
+
+  def test_single_line_inner_tag
+    text = '<p> {% if true -%} yes {%- endif %} </p>'
+    expected = '<p> yes </p>'
+    assert_template_result(expected, text)
+
+    text = '<p> {% if false -%} no {%- endif %} </p>'
+    expected = '<p>  </p>'
+    assert_template_result(expected, text)
+  end
+
+  def test_single_line_post_tag
+    text = '<p> {% if true -%} yes {% endif -%} </p>'
+    expected = '<p> yes </p>'
+    assert_template_result(expected, text)
+
+    text = '<p> {% if false -%} no {% endif -%} </p>'
+    expected = '<p> </p>'
+    assert_template_result(expected, text)
+  end
+
+  def test_single_line_pre_tag
+    text = '<p> {%- if true %} yes {%- endif %} </p>'
+    expected = '<p> yes </p>'
+    assert_template_result(expected, text)
+
+    text = '<p> {%- if false %} no {%- endif %} </p>'
+    expected = '<p> </p>'
+    assert_template_result(expected, text)
+  end
+
+  def test_pre_trim_output
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {{- 'John' }}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>John
+        </p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_pre_trim_tags
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {%- if true %}
+          yes
+          {%- endif %}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>
+          yes
+        </p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {%- if false %}
+          no
+          {%- endif %}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>
+        </p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_post_trim_output
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {{ 'John' -}}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>
+          John</p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_post_trim_tags
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {% if true -%}
+          yes
+          {% endif -%}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>
+          yes
+          </p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {% if false -%}
+          no
+          {% endif -%}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>
+          </p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_pre_and_post_trim_tags
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {%- if true %}
+          yes
+          {% endif -%}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>
+          yes
+          </p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {%- if false %}
+          no
+          {% endif -%}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p></p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_post_and_pre_trim_tags
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {% if true -%}
+          yes
+          {%- endif %}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>
+          yes
+        </p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+
+    whitespace = '          '
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {% if false -%}
+          no
+          {%- endif %}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>
+#{whitespace}
+        </p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_trim_output
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {{- 'John' -}}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>John</p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_trim_tags
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {%- if true -%}
+          yes
+          {%- endif -%}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>yes</p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {%- if false -%}
+          no
+          {%- endif -%}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p></p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_whitespace_trim_output
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {{- 'John' -}},
+          {{- '30' -}}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>John,30</p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_whitespace_trim_tags
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {%- if true -%}
+          yes
+          {%- endif -%}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>yes</p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {%- if false -%}
+          no
+          {%- endif -%}
+        </p>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p></p>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_complex_trim_output
+    text = <<-END_TEMPLATE
+      <div>
+        <p>
+          {{- 'John' -}}
+          {{- '30' -}}
+        </p>
+        <b>
+          {{ 'John' -}}
+          {{- '30' }}
+        </b>
+        <i>
+          {{- 'John' }}
+          {{ '30' -}}
+        </i>
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+        <p>John30</p>
+        <b>
+          John30
+        </b>
+        <i>John
+          30</i>
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_complex_trim
+    text = <<-END_TEMPLATE
+      <div>
+        {%- if true -%}
+          {%- if true -%}
+            <p>
+              {{- 'John' -}}
+            </p>
+          {%- endif -%}
+        {%- endif -%}
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div><p>John</p></div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+
+  def test_raw_output
+    whitespace = '        '
+    text = <<-END_TEMPLATE
+      <div>
+        {% raw %}
+          {%- if true -%}
+            <p>
+              {{- 'John' -}}
+            </p>
+          {%- endif -%}
+        {% endraw %}
+      </div>
+    END_TEMPLATE
+    expected = <<-END_EXPECTED
+      <div>
+#{whitespace}
+          {%- if true -%}
+            <p>
+              {{- 'John' -}}
+            </p>
+          {%- endif -%}
+#{whitespace}
+      </div>
+    END_EXPECTED
+    assert_template_result(expected, text)
+  end
+end # TrimModeTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/variable_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/variable_test.rb
new file mode 100644
index 0000000..58df833
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/integration/variable_test.rb
@@ -0,0 +1,92 @@
+require 'test_helper'
+
+class VariableTest < Minitest::Test
+  include Liquid
+
+  def test_simple_variable
+    template = Template.parse(%({{test}}))
+    assert_equal 'worked', template.render!('test' => 'worked')
+    assert_equal 'worked wonderfully', template.render!('test' => 'worked wonderfully')
+  end
+
+  def test_variable_render_calls_to_liquid
+    assert_template_result 'foobar', '{{ foo }}', 'foo' => ThingWithToLiquid.new
+  end
+
+  def test_simple_with_whitespaces
+    template = Template.parse(%(  {{ test }}  ))
+    assert_equal '  worked  ', template.render!('test' => 'worked')
+    assert_equal '  worked wonderfully  ', template.render!('test' => 'worked wonderfully')
+  end
+
+  def test_ignore_unknown
+    template = Template.parse(%({{ test }}))
+    assert_equal '', template.render!
+  end
+
+  def test_using_blank_as_variable_name
+    template = Template.parse("{% assign foo = blank %}{{ foo }}")
+    assert_equal '', template.render!
+  end
+
+  def test_using_empty_as_variable_name
+    template = Template.parse("{% assign foo = empty %}{{ foo }}")
+    assert_equal '', template.render!
+  end
+
+  def test_hash_scoping
+    template = Template.parse(%({{ test.test }}))
+    assert_equal 'worked', template.render!('test' => { 'test' => 'worked' })
+  end
+
+  def test_false_renders_as_false
+    assert_equal 'false', Template.parse("{{ foo }}").render!('foo' => false)
+    assert_equal 'false', Template.parse("{{ false }}").render!
+  end
+
+  def test_nil_renders_as_empty_string
+    assert_equal '', Template.parse("{{ nil }}").render!
+    assert_equal 'cat', Template.parse("{{ nil | append: 'cat' }}").render!
+  end
+
+  def test_preset_assigns
+    template = Template.parse(%({{ test }}))
+    template.assigns['test'] = 'worked'
+    assert_equal 'worked', template.render!
+  end
+
+  def test_reuse_parsed_template
+    template = Template.parse(%({{ greeting }} {{ name }}))
+    template.assigns['greeting'] = 'Goodbye'
+    assert_equal 'Hello Tobi', template.render!('greeting' => 'Hello', 'name' => 'Tobi')
+    assert_equal 'Hello ', template.render!('greeting' => 'Hello', 'unknown' => 'Tobi')
+    assert_equal 'Hello Brian', template.render!('greeting' => 'Hello', 'name' => 'Brian')
+    assert_equal 'Goodbye Brian', template.render!('name' => 'Brian')
+    assert_equal({ 'greeting' => 'Goodbye' }, template.assigns)
+  end
+
+  def test_assigns_not_polluted_from_template
+    template = Template.parse(%({{ test }}{% assign test = 'bar' %}{{ test }}))
+    template.assigns['test'] = 'baz'
+    assert_equal 'bazbar', template.render!
+    assert_equal 'bazbar', template.render!
+    assert_equal 'foobar', template.render!('test' => 'foo')
+    assert_equal 'bazbar', template.render!
+  end
+
+  def test_hash_with_default_proc
+    template = Template.parse(%(Hello {{ test }}))
+    assigns = Hash.new { |h, k| raise "Unknown variable '#{k}'" }
+    assigns['test'] = 'Tobi'
+    assert_equal 'Hello Tobi', template.render!(assigns)
+    assigns.delete('test')
+    e = assert_raises(RuntimeError) do
+      template.render!(assigns)
+    end
+    assert_equal "Unknown variable 'test'", e.message
+  end
+
+  def test_multiline_variable
+    assert_equal 'worked', Template.parse("{{\ntest\n}}").render!('test' => 'worked')
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/test_helper.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/test_helper.rb
new file mode 100644
index 0000000..b8e4d9a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/test_helper.rb
@@ -0,0 +1,117 @@
+#!/usr/bin/env ruby
+
+ENV["MT_NO_EXPECTATIONS"] = "1"
+require 'minitest/autorun'
+require 'spy/integration'
+
+$LOAD_PATH.unshift(File.join(File.expand_path(__dir__), '..', 'lib'))
+require 'liquid.rb'
+require 'liquid/profiler'
+
+mode = :strict
+if env_mode = ENV['LIQUID_PARSER_MODE']
+  puts "-- #{env_mode.upcase} ERROR MODE"
+  mode = env_mode.to_sym
+end
+Liquid::Template.error_mode = mode
+
+if ENV['LIQUID-C'] == '1'
+  puts "-- LIQUID C"
+  require 'liquid/c'
+end
+
+if Minitest.const_defined?('Test')
+  # We're on Minitest 5+. Nothing to do here.
+else
+  # Minitest 4 doesn't have Minitest::Test yet.
+  Minitest::Test = MiniTest::Unit::TestCase
+end
+
+module Minitest
+  class Test
+    def fixture(name)
+      File.join(File.expand_path(__dir__), "fixtures", name)
+    end
+  end
+
+  module Assertions
+    include Liquid
+
+    def assert_template_result(expected, template, assigns = {}, message = nil)
+      assert_equal expected, Template.parse(template).render!(assigns), message
+    end
+
+    def assert_template_result_matches(expected, template, assigns = {}, message = nil)
+      return assert_template_result(expected, template, assigns, message) unless expected.is_a? Regexp
+
+      assert_match expected, Template.parse(template).render!(assigns), message
+    end
+
+    def assert_match_syntax_error(match, template, assigns = {})
+      exception = assert_raises(Liquid::SyntaxError) do
+        Template.parse(template).render(assigns)
+      end
+      assert_match match, exception.message
+    end
+
+    def with_global_filter(*globals)
+      original_global_strainer = Liquid::Strainer.class_variable_get(:@@global_strainer)
+      Liquid::Strainer.class_variable_set(:@@global_strainer, Class.new(Liquid::Strainer) do
+        @filter_methods = Set.new
+      end)
+      Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear
+
+      globals.each do |global|
+        Liquid::Template.register_filter(global)
+      end
+      yield
+    ensure
+      Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear
+      Liquid::Strainer.class_variable_set(:@@global_strainer, original_global_strainer)
+    end
+
+    def with_taint_mode(mode)
+      old_mode = Liquid::Template.taint_mode
+      Liquid::Template.taint_mode = mode
+      yield
+    ensure
+      Liquid::Template.taint_mode = old_mode
+    end
+
+    def with_error_mode(mode)
+      old_mode = Liquid::Template.error_mode
+      Liquid::Template.error_mode = mode
+      yield
+    ensure
+      Liquid::Template.error_mode = old_mode
+    end
+  end
+end
+
+class ThingWithToLiquid
+  def to_liquid
+    'foobar'
+  end
+end
+
+class ErrorDrop < Liquid::Drop
+  def standard_error
+    raise Liquid::StandardError, 'standard error'
+  end
+
+  def argument_error
+    raise Liquid::ArgumentError, 'argument error'
+  end
+
+  def syntax_error
+    raise Liquid::SyntaxError, 'syntax error'
+  end
+
+  def runtime_error
+    raise 'runtime error'
+  end
+
+  def exception
+    raise Exception, 'exception'
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/block_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/block_unit_test.rb
new file mode 100644
index 0000000..6a27a7d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/block_unit_test.rb
@@ -0,0 +1,58 @@
+require 'test_helper'
+
+class BlockUnitTest < Minitest::Test
+  include Liquid
+
+  def test_blankspace
+    template = Liquid::Template.parse("  ")
+    assert_equal ["  "], template.root.nodelist
+  end
+
+  def test_variable_beginning
+    template = Liquid::Template.parse("{{funk}}  ")
+    assert_equal 2, template.root.nodelist.size
+    assert_equal Variable, template.root.nodelist[0].class
+    assert_equal String, template.root.nodelist[1].class
+  end
+
+  def test_variable_end
+    template = Liquid::Template.parse("  {{funk}}")
+    assert_equal 2, template.root.nodelist.size
+    assert_equal String, template.root.nodelist[0].class
+    assert_equal Variable, template.root.nodelist[1].class
+  end
+
+  def test_variable_middle
+    template = Liquid::Template.parse("  {{funk}}  ")
+    assert_equal 3, template.root.nodelist.size
+    assert_equal String, template.root.nodelist[0].class
+    assert_equal Variable, template.root.nodelist[1].class
+    assert_equal String, template.root.nodelist[2].class
+  end
+
+  def test_variable_many_embedded_fragments
+    template = Liquid::Template.parse("  {{funk}} {{so}} {{brother}} ")
+    assert_equal 7, template.root.nodelist.size
+    assert_equal [String, Variable, String, Variable, String, Variable, String],
+      block_types(template.root.nodelist)
+  end
+
+  def test_with_block
+    template = Liquid::Template.parse("  {% comment %} {% endcomment %} ")
+    assert_equal [String, Comment, String], block_types(template.root.nodelist)
+    assert_equal 3, template.root.nodelist.size
+  end
+
+  def test_with_custom_tag
+    Liquid::Template.register_tag("testtag", Block)
+    assert Liquid::Template.parse("{% testtag %} {% endtesttag %}")
+  ensure
+    Liquid::Template.tags.delete('testtag')
+  end
+
+  private
+
+  def block_types(nodelist)
+    nodelist.collect(&:class)
+  end
+end # VariableTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/condition_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/condition_unit_test.rb
new file mode 100644
index 0000000..8dfc788
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/condition_unit_test.rb
@@ -0,0 +1,158 @@
+require 'test_helper'
+
+class ConditionUnitTest < Minitest::Test
+  include Liquid
+
+  def setup
+    @context = Liquid::Context.new
+  end
+
+  def test_basic_condition
+    assert_equal false, Condition.new(1, '==', 2).evaluate
+    assert_equal true,  Condition.new(1, '==', 1).evaluate
+  end
+
+  def test_default_operators_evalute_true
+    assert_evaluates_true 1, '==', 1
+    assert_evaluates_true 1, '!=', 2
+    assert_evaluates_true 1, '<>', 2
+    assert_evaluates_true 1, '<', 2
+    assert_evaluates_true 2, '>', 1
+    assert_evaluates_true 1, '>=', 1
+    assert_evaluates_true 2, '>=', 1
+    assert_evaluates_true 1, '<=', 2
+    assert_evaluates_true 1, '<=', 1
+    # negative numbers
+    assert_evaluates_true 1, '>', -1
+    assert_evaluates_true (-1), '<', 1
+    assert_evaluates_true 1.0, '>', -1.0
+    assert_evaluates_true (-1.0), '<', 1.0
+  end
+
+  def test_default_operators_evalute_false
+    assert_evaluates_false 1, '==', 2
+    assert_evaluates_false 1, '!=', 1
+    assert_evaluates_false 1, '<>', 1
+    assert_evaluates_false 1, '<', 0
+    assert_evaluates_false 2, '>', 4
+    assert_evaluates_false 1, '>=', 3
+    assert_evaluates_false 2, '>=', 4
+    assert_evaluates_false 1, '<=', 0
+    assert_evaluates_false 1, '<=', 0
+  end
+
+  def test_contains_works_on_strings
+    assert_evaluates_true 'bob', 'contains', 'o'
+    assert_evaluates_true 'bob', 'contains', 'b'
+    assert_evaluates_true 'bob', 'contains', 'bo'
+    assert_evaluates_true 'bob', 'contains', 'ob'
+    assert_evaluates_true 'bob', 'contains', 'bob'
+
+    assert_evaluates_false 'bob', 'contains', 'bob2'
+    assert_evaluates_false 'bob', 'contains', 'a'
+    assert_evaluates_false 'bob', 'contains', '---'
+  end
+
+  def test_invalid_comparation_operator
+    assert_evaluates_argument_error 1, '~~', 0
+  end
+
+  def test_comparation_of_int_and_str
+    assert_evaluates_argument_error '1', '>', 0
+    assert_evaluates_argument_error '1', '<', 0
+    assert_evaluates_argument_error '1', '>=', 0
+    assert_evaluates_argument_error '1', '<=', 0
+  end
+
+  def test_contains_works_on_arrays
+    @context = Liquid::Context.new
+    @context['array'] = [1, 2, 3, 4, 5]
+    array_expr = VariableLookup.new("array")
+
+    assert_evaluates_false array_expr, 'contains', 0
+    assert_evaluates_true array_expr, 'contains', 1
+    assert_evaluates_true array_expr, 'contains', 2
+    assert_evaluates_true array_expr, 'contains', 3
+    assert_evaluates_true array_expr, 'contains', 4
+    assert_evaluates_true array_expr, 'contains', 5
+    assert_evaluates_false array_expr, 'contains', 6
+    assert_evaluates_false array_expr, 'contains', "1"
+  end
+
+  def test_contains_returns_false_for_nil_operands
+    @context = Liquid::Context.new
+    assert_evaluates_false VariableLookup.new('not_assigned'), 'contains', '0'
+    assert_evaluates_false 0, 'contains', VariableLookup.new('not_assigned')
+  end
+
+  def test_contains_return_false_on_wrong_data_type
+    assert_evaluates_false 1, 'contains', 0
+  end
+
+  def test_contains_with_string_left_operand_coerces_right_operand_to_string
+    assert_evaluates_true ' 1 ', 'contains', 1
+    assert_evaluates_false ' 1 ', 'contains', 2
+  end
+
+  def test_or_condition
+    condition = Condition.new(1, '==', 2)
+
+    assert_equal false, condition.evaluate
+
+    condition.or Condition.new(2, '==', 1)
+
+    assert_equal false, condition.evaluate
+
+    condition.or Condition.new(1, '==', 1)
+
+    assert_equal true, condition.evaluate
+  end
+
+  def test_and_condition
+    condition = Condition.new(1, '==', 1)
+
+    assert_equal true, condition.evaluate
+
+    condition.and Condition.new(2, '==', 2)
+
+    assert_equal true, condition.evaluate
+
+    condition.and Condition.new(2, '==', 1)
+
+    assert_equal false, condition.evaluate
+  end
+
+  def test_should_allow_custom_proc_operator
+    Condition.operators['starts_with'] = proc { |cond, left, right| left =~ %r{^#{right}} }
+
+    assert_evaluates_true 'bob', 'starts_with', 'b'
+    assert_evaluates_false 'bob', 'starts_with', 'o'
+  ensure
+    Condition.operators.delete 'starts_with'
+  end
+
+  def test_left_or_right_may_contain_operators
+    @context = Liquid::Context.new
+    @context['one'] = @context['another'] = "gnomeslab-and-or-liquid"
+
+    assert_evaluates_true VariableLookup.new("one"), '==', VariableLookup.new("another")
+  end
+
+  private
+
+  def assert_evaluates_true(left, op, right)
+    assert Condition.new(left, op, right).evaluate(@context),
+      "Evaluated false: #{left} #{op} #{right}"
+  end
+
+  def assert_evaluates_false(left, op, right)
+    assert !Condition.new(left, op, right).evaluate(@context),
+      "Evaluated true: #{left} #{op} #{right}"
+  end
+
+  def assert_evaluates_argument_error(left, op, right)
+    assert_raises(Liquid::ArgumentError) do
+      Condition.new(left, op, right).evaluate(@context)
+    end
+  end
+end # ConditionTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/context_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/context_unit_test.rb
new file mode 100644
index 0000000..5655865
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/context_unit_test.rb
@@ -0,0 +1,483 @@
+require 'test_helper'
+
+class HundredCentes
+  def to_liquid
+    100
+  end
+end
+
+class CentsDrop < Liquid::Drop
+  def amount
+    HundredCentes.new
+  end
+
+  def non_zero?
+    true
+  end
+end
+
+class ContextSensitiveDrop < Liquid::Drop
+  def test
+    @context['test']
+  end
+end
+
+class Category < Liquid::Drop
+  attr_accessor :name
+
+  def initialize(name)
+    @name = name
+  end
+
+  def to_liquid
+    CategoryDrop.new(self)
+  end
+end
+
+class CategoryDrop
+  attr_accessor :category, :context
+  def initialize(category)
+    @category = category
+  end
+end
+
+class CounterDrop < Liquid::Drop
+  def count
+    @count ||= 0
+    @count += 1
+  end
+end
+
+class ArrayLike
+  def fetch(index)
+  end
+
+  def [](index)
+    @counts ||= []
+    @counts[index] ||= 0
+    @counts[index] += 1
+  end
+
+  def to_liquid
+    self
+  end
+end
+
+class ContextUnitTest < Minitest::Test
+  include Liquid
+
+  def setup
+    @context = Liquid::Context.new
+  end
+
+  def teardown
+    Spy.teardown
+  end
+
+  def test_variables
+    @context['string'] = 'string'
+    assert_equal 'string', @context['string']
+
+    @context['num'] = 5
+    assert_equal 5, @context['num']
+
+    @context['time'] = Time.parse('2006-06-06 12:00:00')
+    assert_equal Time.parse('2006-06-06 12:00:00'), @context['time']
+
+    @context['date'] = Date.today
+    assert_equal Date.today, @context['date']
+
+    now = DateTime.now
+    @context['datetime'] = now
+    assert_equal now, @context['datetime']
+
+    @context['bool'] = true
+    assert_equal true, @context['bool']
+
+    @context['bool'] = false
+    assert_equal false, @context['bool']
+
+    @context['nil'] = nil
+    assert_equal nil, @context['nil']
+    assert_equal nil, @context['nil']
+  end
+
+  def test_variables_not_existing
+    assert_equal nil, @context['does_not_exist']
+  end
+
+  def test_scoping
+    @context.push
+    @context.pop
+
+    assert_raises(Liquid::ContextError) do
+      @context.pop
+    end
+
+    assert_raises(Liquid::ContextError) do
+      @context.push
+      @context.pop
+      @context.pop
+    end
+  end
+
+  def test_length_query
+    @context['numbers'] = [1, 2, 3, 4]
+
+    assert_equal 4, @context['numbers.size']
+
+    @context['numbers'] = { 1 => 1, 2 => 2, 3 => 3, 4 => 4 }
+
+    assert_equal 4, @context['numbers.size']
+
+    @context['numbers'] = { 1 => 1, 2 => 2, 3 => 3, 4 => 4, 'size' => 1000 }
+
+    assert_equal 1000, @context['numbers.size']
+  end
+
+  def test_hyphenated_variable
+    @context['oh-my'] = 'godz'
+    assert_equal 'godz', @context['oh-my']
+  end
+
+  def test_add_filter
+    filter = Module.new do
+      def hi(output)
+        output + ' hi!'
+      end
+    end
+
+    context = Context.new
+    context.add_filters(filter)
+    assert_equal 'hi? hi!', context.invoke(:hi, 'hi?')
+
+    context = Context.new
+    assert_equal 'hi?', context.invoke(:hi, 'hi?')
+
+    context.add_filters(filter)
+    assert_equal 'hi? hi!', context.invoke(:hi, 'hi?')
+  end
+
+  def test_only_intended_filters_make_it_there
+    filter = Module.new do
+      def hi(output)
+        output + ' hi!'
+      end
+    end
+
+    context = Context.new
+    assert_equal "Wookie", context.invoke("hi", "Wookie")
+
+    context.add_filters(filter)
+    assert_equal "Wookie hi!", context.invoke("hi", "Wookie")
+  end
+
+  def test_add_item_in_outer_scope
+    @context['test'] = 'test'
+    @context.push
+    assert_equal 'test', @context['test']
+    @context.pop
+    assert_equal 'test', @context['test']
+  end
+
+  def test_add_item_in_inner_scope
+    @context.push
+    @context['test'] = 'test'
+    assert_equal 'test', @context['test']
+    @context.pop
+    assert_equal nil, @context['test']
+  end
+
+  def test_hierachical_data
+    @context['hash'] = { "name" => 'tobi' }
+    assert_equal 'tobi', @context['hash.name']
+    assert_equal 'tobi', @context['hash["name"]']
+  end
+
+  def test_keywords
+    assert_equal true, @context['true']
+    assert_equal false, @context['false']
+  end
+
+  def test_digits
+    assert_equal 100, @context['100']
+    assert_equal 100.00, @context['100.00']
+  end
+
+  def test_strings
+    assert_equal "hello!", @context['"hello!"']
+    assert_equal "hello!", @context["'hello!'"]
+  end
+
+  def test_merge
+    @context.merge({ "test" => "test" })
+    assert_equal 'test', @context['test']
+    @context.merge({ "test" => "newvalue", "foo" => "bar" })
+    assert_equal 'newvalue', @context['test']
+    assert_equal 'bar', @context['foo']
+  end
+
+  def test_array_notation
+    @context['test'] = [1, 2, 3, 4, 5]
+
+    assert_equal 1, @context['test[0]']
+    assert_equal 2, @context['test[1]']
+    assert_equal 3, @context['test[2]']
+    assert_equal 4, @context['test[3]']
+    assert_equal 5, @context['test[4]']
+  end
+
+  def test_recoursive_array_notation
+    @context['test'] = { 'test' => [1, 2, 3, 4, 5] }
+
+    assert_equal 1, @context['test.test[0]']
+
+    @context['test'] = [{ 'test' => 'worked' }]
+
+    assert_equal 'worked', @context['test[0].test']
+  end
+
+  def test_hash_to_array_transition
+    @context['colors'] = {
+      'Blue'    => ['003366', '336699', '6699CC', '99CCFF'],
+      'Green'   => ['003300', '336633', '669966', '99CC99'],
+      'Yellow'  => ['CC9900', 'FFCC00', 'FFFF99', 'FFFFCC'],
+      'Red'     => ['660000', '993333', 'CC6666', 'FF9999']
+    }
+
+    assert_equal '003366', @context['colors.Blue[0]']
+    assert_equal 'FF9999', @context['colors.Red[3]']
+  end
+
+  def test_try_first
+    @context['test'] = [1, 2, 3, 4, 5]
+
+    assert_equal 1, @context['test.first']
+    assert_equal 5, @context['test.last']
+
+    @context['test'] = { 'test' => [1, 2, 3, 4, 5] }
+
+    assert_equal 1, @context['test.test.first']
+    assert_equal 5, @context['test.test.last']
+
+    @context['test'] = [1]
+    assert_equal 1, @context['test.first']
+    assert_equal 1, @context['test.last']
+  end
+
+  def test_access_hashes_with_hash_notation
+    @context['products'] = { 'count' => 5, 'tags' => ['deepsnow', 'freestyle'] }
+    @context['product'] = { 'variants' => [ { 'title' => 'draft151cm' }, { 'title' => 'element151cm' } ] }
+
+    assert_equal 5, @context['products["count"]']
+    assert_equal 'deepsnow', @context['products["tags"][0]']
+    assert_equal 'deepsnow', @context['products["tags"].first']
+    assert_equal 'draft151cm', @context['product["variants"][0]["title"]']
+    assert_equal 'element151cm', @context['product["variants"][1]["title"]']
+    assert_equal 'draft151cm', @context['product["variants"][0]["title"]']
+    assert_equal 'element151cm', @context['product["variants"].last["title"]']
+  end
+
+  def test_access_variable_with_hash_notation
+    @context['foo'] = 'baz'
+    @context['bar'] = 'foo'
+
+    assert_equal 'baz', @context['["foo"]']
+    assert_equal 'baz', @context['[bar]']
+  end
+
+  def test_access_hashes_with_hash_access_variables
+    @context['var'] = 'tags'
+    @context['nested'] = { 'var' => 'tags' }
+    @context['products'] = { 'count' => 5, 'tags' => ['deepsnow', 'freestyle'] }
+
+    assert_equal 'deepsnow', @context['products[var].first']
+    assert_equal 'freestyle', @context['products[nested.var].last']
+  end
+
+  def test_hash_notation_only_for_hash_access
+    @context['array'] = [1, 2, 3, 4, 5]
+    @context['hash'] = { 'first' => 'Hello' }
+
+    assert_equal 1, @context['array.first']
+    assert_equal nil, @context['array["first"]']
+    assert_equal 'Hello', @context['hash["first"]']
+  end
+
+  def test_first_can_appear_in_middle_of_callchain
+    @context['product'] = { 'variants' => [ { 'title' => 'draft151cm' }, { 'title' => 'element151cm' } ] }
+
+    assert_equal 'draft151cm', @context['product.variants[0].title']
+    assert_equal 'element151cm', @context['product.variants[1].title']
+    assert_equal 'draft151cm', @context['product.variants.first.title']
+    assert_equal 'element151cm', @context['product.variants.last.title']
+  end
+
+  def test_cents
+    @context.merge("cents" => HundredCentes.new)
+    assert_equal 100, @context['cents']
+  end
+
+  def test_nested_cents
+    @context.merge("cents" => { 'amount' => HundredCentes.new })
+    assert_equal 100, @context['cents.amount']
+
+    @context.merge("cents" => { 'cents' => { 'amount' => HundredCentes.new } })
+    assert_equal 100, @context['cents.cents.amount']
+  end
+
+  def test_cents_through_drop
+    @context.merge("cents" => CentsDrop.new)
+    assert_equal 100, @context['cents.amount']
+  end
+
+  def test_nested_cents_through_drop
+    @context.merge("vars" => { "cents" => CentsDrop.new })
+    assert_equal 100, @context['vars.cents.amount']
+  end
+
+  def test_drop_methods_with_question_marks
+    @context.merge("cents" => CentsDrop.new)
+    assert @context['cents.non_zero?']
+  end
+
+  def test_context_from_within_drop
+    @context.merge("test" => '123', "vars" => ContextSensitiveDrop.new)
+    assert_equal '123', @context['vars.test']
+  end
+
+  def test_nested_context_from_within_drop
+    @context.merge("test" => '123', "vars" => { "local" => ContextSensitiveDrop.new })
+    assert_equal '123', @context['vars.local.test']
+  end
+
+  def test_ranges
+    @context.merge("test" => '5')
+    assert_equal (1..5), @context['(1..5)']
+    assert_equal (1..5), @context['(1..test)']
+    assert_equal (5..5), @context['(test..test)']
+  end
+
+  def test_cents_through_drop_nestedly
+    @context.merge("cents" => { "cents" => CentsDrop.new })
+    assert_equal 100, @context['cents.cents.amount']
+
+    @context.merge("cents" => { "cents" => { "cents" => CentsDrop.new } })
+    assert_equal 100, @context['cents.cents.cents.amount']
+  end
+
+  def test_drop_with_variable_called_only_once
+    @context['counter'] = CounterDrop.new
+
+    assert_equal 1, @context['counter.count']
+    assert_equal 2, @context['counter.count']
+    assert_equal 3, @context['counter.count']
+  end
+
+  def test_drop_with_key_called_only_once
+    @context['counter'] = CounterDrop.new
+
+    assert_equal 1, @context['counter["count"]']
+    assert_equal 2, @context['counter["count"]']
+    assert_equal 3, @context['counter["count"]']
+  end
+
+  def test_proc_as_variable
+    @context['dynamic'] = proc { 'Hello' }
+
+    assert_equal 'Hello', @context['dynamic']
+  end
+
+  def test_lambda_as_variable
+    @context['dynamic'] = proc { 'Hello' }
+
+    assert_equal 'Hello', @context['dynamic']
+  end
+
+  def test_nested_lambda_as_variable
+    @context['dynamic'] = { "lambda" => proc { 'Hello' } }
+
+    assert_equal 'Hello', @context['dynamic.lambda']
+  end
+
+  def test_array_containing_lambda_as_variable
+    @context['dynamic'] = [1, 2, proc { 'Hello' }, 4, 5]
+
+    assert_equal 'Hello', @context['dynamic[2]']
+  end
+
+  def test_lambda_is_called_once
+    @context['callcount'] = proc { @global ||= 0; @global += 1; @global.to_s }
+
+    assert_equal '1', @context['callcount']
+    assert_equal '1', @context['callcount']
+    assert_equal '1', @context['callcount']
+
+    @global = nil
+  end
+
+  def test_nested_lambda_is_called_once
+    @context['callcount'] = { "lambda" => proc { @global ||= 0; @global += 1; @global.to_s } }
+
+    assert_equal '1', @context['callcount.lambda']
+    assert_equal '1', @context['callcount.lambda']
+    assert_equal '1', @context['callcount.lambda']
+
+    @global = nil
+  end
+
+  def test_lambda_in_array_is_called_once
+    @context['callcount'] = [1, 2, proc { @global ||= 0; @global += 1; @global.to_s }, 4, 5]
+
+    assert_equal '1', @context['callcount[2]']
+    assert_equal '1', @context['callcount[2]']
+    assert_equal '1', @context['callcount[2]']
+
+    @global = nil
+  end
+
+  def test_access_to_context_from_proc
+    @context.registers[:magic] = 345392
+
+    @context['magic'] = proc { @context.registers[:magic] }
+
+    assert_equal 345392, @context['magic']
+  end
+
+  def test_to_liquid_and_context_at_first_level
+    @context['category'] = Category.new("foobar")
+    assert_kind_of CategoryDrop, @context['category']
+    assert_equal @context, @context['category'].context
+  end
+
+  def test_use_empty_instead_of_any_in_interrupt_handling_to_avoid_lots_of_unnecessary_object_allocations
+    mock_any = Spy.on_instance_method(Array, :any?)
+    mock_empty = Spy.on_instance_method(Array, :empty?)
+
+    @context.interrupt?
+
+    refute mock_any.has_been_called?
+    assert mock_empty.has_been_called?
+  end
+
+  def test_context_initialization_with_a_proc_in_environment
+    contx = Context.new([test: ->(c) { c['poutine'] }], { test: :foo })
+
+    assert contx
+    assert_nil contx['poutine']
+  end
+
+  def test_apply_global_filter
+    global_filter_proc = ->(output) { "#{output} filtered" }
+
+    context = Context.new
+    context.global_filter = global_filter_proc
+
+    assert_equal 'hi filtered', context.apply_global_filter('hi')
+  end
+
+  def test_apply_global_filter_when_no_global_filter_exist
+    context = Context.new
+    assert_equal 'hi', context.apply_global_filter('hi')
+  end
+end # ContextTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/file_system_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/file_system_unit_test.rb
new file mode 100644
index 0000000..2c7250b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/file_system_unit_test.rb
@@ -0,0 +1,35 @@
+require 'test_helper'
+
+class FileSystemUnitTest < Minitest::Test
+  include Liquid
+
+  def test_default
+    assert_raises(FileSystemError) do
+      BlankFileSystem.new.read_template_file("dummy")
+    end
+  end
+
+  def test_local
+    file_system = Liquid::LocalFileSystem.new("/some/path")
+    assert_equal "/some/path/_mypartial.liquid", file_system.full_path("mypartial")
+    assert_equal "/some/path/dir/_mypartial.liquid", file_system.full_path("dir/mypartial")
+
+    assert_raises(FileSystemError) do
+      file_system.full_path("../dir/mypartial")
+    end
+
+    assert_raises(FileSystemError) do
+      file_system.full_path("/dir/../../dir/mypartial")
+    end
+
+    assert_raises(FileSystemError) do
+      file_system.full_path("/etc/passwd")
+    end
+  end
+
+  def test_custom_template_filename_patterns
+    file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html")
+    assert_equal "/some/path/mypartial.html", file_system.full_path("mypartial")
+    assert_equal "/some/path/dir/mypartial.html", file_system.full_path("dir/mypartial")
+  end
+end # FileSystemTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/i18n_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/i18n_unit_test.rb
new file mode 100644
index 0000000..b57500e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/i18n_unit_test.rb
@@ -0,0 +1,37 @@
+require 'test_helper'
+
+class I18nUnitTest < Minitest::Test
+  include Liquid
+
+  def setup
+    @i18n = I18n.new(fixture("en_locale.yml"))
+  end
+
+  def test_simple_translate_string
+    assert_equal "less is more", @i18n.translate("simple")
+  end
+
+  def test_nested_translate_string
+    assert_equal "something wasn't right", @i18n.translate("errors.syntax.oops")
+  end
+
+  def test_single_string_interpolation
+    assert_equal "something different", @i18n.translate("whatever", something: "different")
+  end
+
+  # def test_raises_translation_error_on_undefined_interpolation_key
+  #   assert_raises I18n::TranslationError do
+  #     @i18n.translate("whatever", :oopstypos => "yes")
+  #   end
+  # end
+
+  def test_raises_unknown_translation
+    assert_raises I18n::TranslationError do
+      @i18n.translate("doesnt_exist")
+    end
+  end
+
+  def test_sets_default_path_to_en
+    assert_equal I18n::DEFAULT_LOCALE, I18n.new.path
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/lexer_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/lexer_unit_test.rb
new file mode 100644
index 0000000..af9c267
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/lexer_unit_test.rb
@@ -0,0 +1,51 @@
+require 'test_helper'
+
+class LexerUnitTest < Minitest::Test
+  include Liquid
+
+  def test_strings
+    tokens = Lexer.new(%( 'this is a test""' "wat 'lol'")).tokenize
+    assert_equal [[:string, %('this is a test""')], [:string, %("wat 'lol'")], [:end_of_string]], tokens
+  end
+
+  def test_integer
+    tokens = Lexer.new('hi 50').tokenize
+    assert_equal [[:id, 'hi'], [:number, '50'], [:end_of_string]], tokens
+  end
+
+  def test_float
+    tokens = Lexer.new('hi 5.0').tokenize
+    assert_equal [[:id, 'hi'], [:number, '5.0'], [:end_of_string]], tokens
+  end
+
+  def test_comparison
+    tokens = Lexer.new('== <> contains').tokenize
+    assert_equal [[:comparison, '=='], [:comparison, '<>'], [:comparison, 'contains'], [:end_of_string]], tokens
+  end
+
+  def test_specials
+    tokens = Lexer.new('| .:').tokenize
+    assert_equal [[:pipe, '|'], [:dot, '.'], [:colon, ':'], [:end_of_string]], tokens
+    tokens = Lexer.new('[,]').tokenize
+    assert_equal [[:open_square, '['], [:comma, ','], [:close_square, ']'], [:end_of_string]], tokens
+  end
+
+  def test_fancy_identifiers
+    tokens = Lexer.new('hi five?').tokenize
+    assert_equal [[:id, 'hi'], [:id, 'five?'], [:end_of_string]], tokens
+
+    tokens = Lexer.new('2foo').tokenize
+    assert_equal [[:number, '2'], [:id, 'foo'], [:end_of_string]], tokens
+  end
+
+  def test_whitespace
+    tokens = Lexer.new("five|\n\t ==").tokenize
+    assert_equal [[:id, 'five'], [:pipe, '|'], [:comparison, '=='], [:end_of_string]], tokens
+  end
+
+  def test_unexpected_character
+    assert_raises(SyntaxError) do
+      Lexer.new("%").tokenize
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/parser_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/parser_unit_test.rb
new file mode 100644
index 0000000..9f23337
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/parser_unit_test.rb
@@ -0,0 +1,82 @@
+require 'test_helper'
+
+class ParserUnitTest < Minitest::Test
+  include Liquid
+
+  def test_consume
+    p = Parser.new("wat: 7")
+    assert_equal 'wat', p.consume(:id)
+    assert_equal ':', p.consume(:colon)
+    assert_equal '7', p.consume(:number)
+  end
+
+  def test_jump
+    p = Parser.new("wat: 7")
+    p.jump(2)
+    assert_equal '7', p.consume(:number)
+  end
+
+  def test_consume?
+    p = Parser.new("wat: 7")
+    assert_equal 'wat', p.consume?(:id)
+    assert_equal false, p.consume?(:dot)
+    assert_equal ':', p.consume(:colon)
+    assert_equal '7', p.consume?(:number)
+  end
+
+  def test_id?
+    p = Parser.new("wat 6 Peter Hegemon")
+    assert_equal 'wat', p.id?('wat')
+    assert_equal false, p.id?('endgame')
+    assert_equal '6', p.consume(:number)
+    assert_equal 'Peter', p.id?('Peter')
+    assert_equal false, p.id?('Achilles')
+  end
+
+  def test_look
+    p = Parser.new("wat 6 Peter Hegemon")
+    assert_equal true, p.look(:id)
+    assert_equal 'wat', p.consume(:id)
+    assert_equal false, p.look(:comparison)
+    assert_equal true, p.look(:number)
+    assert_equal true, p.look(:id, 1)
+    assert_equal false, p.look(:number, 1)
+  end
+
+  def test_expressions
+    p = Parser.new("hi.there hi?[5].there? hi.there.bob")
+    assert_equal 'hi.there', p.expression
+    assert_equal 'hi?[5].there?', p.expression
+    assert_equal 'hi.there.bob', p.expression
+
+    p = Parser.new("567 6.0 'lol' \"wut\"")
+    assert_equal '567', p.expression
+    assert_equal '6.0', p.expression
+    assert_equal "'lol'", p.expression
+    assert_equal '"wut"', p.expression
+  end
+
+  def test_ranges
+    p = Parser.new("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)")
+    assert_equal '(5..7)', p.expression
+    assert_equal '(1.5..9.6)', p.expression
+    assert_equal '(young..old)', p.expression
+    assert_equal '(hi[5].wat..old)', p.expression
+  end
+
+  def test_arguments
+    p = Parser.new("filter: hi.there[5], keyarg: 7")
+    assert_equal 'filter', p.consume(:id)
+    assert_equal ':', p.consume(:colon)
+    assert_equal 'hi.there[5]', p.argument
+    assert_equal ',', p.consume(:comma)
+    assert_equal 'keyarg: 7', p.argument
+  end
+
+  def test_invalid_expression
+    assert_raises(SyntaxError) do
+      p = Parser.new("==")
+      p.expression
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/regexp_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/regexp_unit_test.rb
new file mode 100644
index 0000000..0821229
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/regexp_unit_test.rb
@@ -0,0 +1,44 @@
+require 'test_helper'
+
+class RegexpUnitTest < Minitest::Test
+  include Liquid
+
+  def test_empty
+    assert_equal [], ''.scan(QuotedFragment)
+  end
+
+  def test_quote
+    assert_equal ['"arg 1"'], '"arg 1"'.scan(QuotedFragment)
+  end
+
+  def test_words
+    assert_equal ['arg1', 'arg2'], 'arg1 arg2'.scan(QuotedFragment)
+  end
+
+  def test_tags
+    assert_equal ['<tr>', '</tr>'], '<tr> </tr>'.scan(QuotedFragment)
+    assert_equal ['<tr></tr>'], '<tr></tr>'.scan(QuotedFragment)
+    assert_equal ['<style', 'class="hello">', '</style>'], %(<style class="hello">' </style>).scan(QuotedFragment)
+  end
+
+  def test_double_quoted_words
+    assert_equal ['arg1', 'arg2', '"arg 3"'], 'arg1 arg2 "arg 3"'.scan(QuotedFragment)
+  end
+
+  def test_single_quoted_words
+    assert_equal ['arg1', 'arg2', "'arg 3'"], 'arg1 arg2 \'arg 3\''.scan(QuotedFragment)
+  end
+
+  def test_quoted_words_in_the_middle
+    assert_equal ['arg1', 'arg2', '"arg 3"', 'arg4'], 'arg1 arg2 "arg 3" arg4   '.scan(QuotedFragment)
+  end
+
+  def test_variable_parser
+    assert_equal ['var'],                               'var'.scan(VariableParser)
+    assert_equal ['var', 'method'],                     'var.method'.scan(VariableParser)
+    assert_equal ['var', '[method]'],                   'var[method]'.scan(VariableParser)
+    assert_equal ['var', '[method]', '[0]'],            'var[method][0]'.scan(VariableParser)
+    assert_equal ['var', '["method"]', '[0]'],          'var["method"][0]'.scan(VariableParser)
+    assert_equal ['var', '[method]', '[0]', 'method'],  'var[method][0].method'.scan(VariableParser)
+  end
+end # RegexpTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/strainer_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/strainer_unit_test.rb
new file mode 100644
index 0000000..6ccdc27
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/strainer_unit_test.rb
@@ -0,0 +1,148 @@
+require 'test_helper'
+
+class StrainerUnitTest < Minitest::Test
+  include Liquid
+
+  module AccessScopeFilters
+    def public_filter
+      "public"
+    end
+
+    def private_filter
+      "private"
+    end
+    private :private_filter
+  end
+
+  Strainer.global_filter(AccessScopeFilters)
+
+  def test_strainer
+    strainer = Strainer.create(nil)
+    assert_equal 5, strainer.invoke('size', 'input')
+    assert_equal "public", strainer.invoke("public_filter")
+  end
+
+  def test_stainer_raises_argument_error
+    strainer = Strainer.create(nil)
+    assert_raises(Liquid::ArgumentError) do
+      strainer.invoke("public_filter", 1)
+    end
+  end
+
+  def test_stainer_argument_error_contains_backtrace
+    strainer = Strainer.create(nil)
+    begin
+      strainer.invoke("public_filter", 1)
+    rescue Liquid::ArgumentError => e
+      assert_match(
+        /\ALiquid error: wrong number of arguments \((1 for 0|given 1, expected 0)\)\z/,
+        e.message)
+      assert_equal e.backtrace[0].split(':')[0], __FILE__
+    end
+  end
+
+  def test_strainer_only_invokes_public_filter_methods
+    strainer = Strainer.create(nil)
+    assert_equal false, strainer.class.invokable?('__test__')
+    assert_equal false, strainer.class.invokable?('test')
+    assert_equal false, strainer.class.invokable?('instance_eval')
+    assert_equal false, strainer.class.invokable?('__send__')
+    assert_equal true, strainer.class.invokable?('size') # from the standard lib
+  end
+
+  def test_strainer_returns_nil_if_no_filter_method_found
+    strainer = Strainer.create(nil)
+    assert_nil strainer.invoke("private_filter")
+    assert_nil strainer.invoke("undef_the_filter")
+  end
+
+  def test_strainer_returns_first_argument_if_no_method_and_arguments_given
+    strainer = Strainer.create(nil)
+    assert_equal "password", strainer.invoke("undef_the_method", "password")
+  end
+
+  def test_strainer_only_allows_methods_defined_in_filters
+    strainer = Strainer.create(nil)
+    assert_equal "1 + 1", strainer.invoke("instance_eval", "1 + 1")
+    assert_equal "puts",  strainer.invoke("__send__", "puts", "Hi Mom")
+    assert_equal "has_method?", strainer.invoke("invoke", "has_method?", "invoke")
+  end
+
+  def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation
+    a = Module.new
+    b = Module.new
+    strainer = Strainer.create(nil, [a, b])
+    assert_kind_of Strainer, strainer
+    assert_kind_of a, strainer
+    assert_kind_of b, strainer
+    assert_kind_of Liquid::StandardFilters, strainer
+  end
+
+  def test_add_filter_when_wrong_filter_class
+    c = Context.new
+    s = c.strainer
+    wrong_filter = ->(v) { v.reverse }
+
+    assert_raises ArgumentError do
+      s.class.add_filter(wrong_filter)
+    end
+  end
+
+  module PrivateMethodOverrideFilter
+    private
+
+    def public_filter
+      "overriden as private"
+    end
+  end
+
+  def test_add_filter_raises_when_module_privately_overrides_registered_public_methods
+    strainer = Context.new.strainer
+
+    error = assert_raises(Liquid::MethodOverrideError) do
+      strainer.class.add_filter(PrivateMethodOverrideFilter)
+    end
+    assert_equal 'Liquid error: Filter overrides registered public methods as non public: public_filter', error.message
+  end
+
+  module ProtectedMethodOverrideFilter
+    protected
+
+    def public_filter
+      "overriden as protected"
+    end
+  end
+
+  def test_add_filter_raises_when_module_overrides_registered_public_method_as_protected
+    strainer = Context.new.strainer
+
+    error = assert_raises(Liquid::MethodOverrideError) do
+      strainer.class.add_filter(ProtectedMethodOverrideFilter)
+    end
+    assert_equal 'Liquid error: Filter overrides registered public methods as non public: public_filter', error.message
+  end
+
+  module PublicMethodOverrideFilter
+    def public_filter
+      "public"
+    end
+  end
+
+  def test_add_filter_does_not_raise_when_module_overrides_previously_registered_method
+    strainer = Context.new.strainer
+    strainer.class.add_filter(PublicMethodOverrideFilter)
+    assert strainer.class.filter_methods.include?('public_filter')
+  end
+
+  module LateAddedFilter
+    def late_added_filter(input)
+      "filtered"
+    end
+  end
+
+  def test_global_filter_clears_cache
+    assert_equal 'input', Strainer.create(nil).invoke('late_added_filter', 'input')
+    Strainer.global_filter(LateAddedFilter)
+    assert_equal 'filtered', Strainer.create(nil).invoke('late_added_filter', 'input')
+  end
+end # StrainerTest
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tag_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tag_unit_test.rb
new file mode 100644
index 0000000..c4b901b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tag_unit_test.rb
@@ -0,0 +1,21 @@
+require 'test_helper'
+
+class TagUnitTest < Minitest::Test
+  include Liquid
+
+  def test_tag
+    tag = Tag.parse('tag', "", Tokenizer.new(""), ParseContext.new)
+    assert_equal 'liquid::tag', tag.name
+    assert_equal '', tag.render(Context.new)
+  end
+
+  def test_return_raw_text_of_tag
+    tag = Tag.parse("long_tag", "param1, param2, param3", Tokenizer.new(""), ParseContext.new)
+    assert_equal("long_tag param1, param2, param3", tag.raw)
+  end
+
+  def test_tag_name_should_return_name_of_the_tag
+    tag = Tag.parse("some_tag", "", Tokenizer.new(""), ParseContext.new)
+    assert_equal 'some_tag', tag.tag_name
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tags/case_tag_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tags/case_tag_unit_test.rb
new file mode 100644
index 0000000..7110308
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tags/case_tag_unit_test.rb
@@ -0,0 +1,10 @@
+require 'test_helper'
+
+class CaseTagUnitTest < Minitest::Test
+  include Liquid
+
+  def test_case_nodelist
+    template = Liquid::Template.parse('{% case var %}{% when true %}WHEN{% else %}ELSE{% endcase %}')
+    assert_equal ['WHEN', 'ELSE'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tags/for_tag_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tags/for_tag_unit_test.rb
new file mode 100644
index 0000000..b8fc520
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tags/for_tag_unit_test.rb
@@ -0,0 +1,13 @@
+require 'test_helper'
+
+class ForTagUnitTest < Minitest::Test
+  def test_for_nodelist
+    template = Liquid::Template.parse('{% for item in items %}FOR{% endfor %}')
+    assert_equal ['FOR'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten
+  end
+
+  def test_for_else_nodelist
+    template = Liquid::Template.parse('{% for item in items %}FOR{% else %}ELSE{% endfor %}')
+    assert_equal ['FOR', 'ELSE'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tags/if_tag_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tags/if_tag_unit_test.rb
new file mode 100644
index 0000000..7ecfc40
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tags/if_tag_unit_test.rb
@@ -0,0 +1,8 @@
+require 'test_helper'
+
+class IfTagUnitTest < Minitest::Test
+  def test_if_nodelist
+    template = Liquid::Template.parse('{% if true %}IF{% else %}ELSE{% endif %}')
+    assert_equal ['IF', 'ELSE'], template.root.nodelist[0].nodelist.map(&:nodelist).flatten
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/template_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/template_unit_test.rb
new file mode 100644
index 0000000..6328be5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/template_unit_test.rb
@@ -0,0 +1,78 @@
+require 'test_helper'
+
+class TemplateUnitTest < Minitest::Test
+  include Liquid
+
+  def test_sets_default_localization_in_document
+    t = Template.new
+    t.parse('{%comment%}{%endcomment%}')
+    assert_instance_of I18n, t.root.nodelist[0].options[:locale]
+  end
+
+  def test_sets_default_localization_in_context_with_quick_initialization
+    t = Template.new
+    t.parse('{%comment%}{%endcomment%}', locale: I18n.new(fixture("en_locale.yml")))
+
+    locale = t.root.nodelist[0].options[:locale]
+    assert_instance_of I18n, locale
+    assert_equal fixture("en_locale.yml"), locale.path
+  end
+
+  def test_with_cache_classes_tags_returns_the_same_class
+    original_cache_setting = Liquid.cache_classes
+    Liquid.cache_classes = true
+
+    original_klass = Class.new
+    Object.send(:const_set, :CustomTag, original_klass)
+    Template.register_tag('custom', CustomTag)
+
+    Object.send(:remove_const, :CustomTag)
+
+    new_klass = Class.new
+    Object.send(:const_set, :CustomTag, new_klass)
+
+    assert Template.tags['custom'].equal?(original_klass)
+  ensure
+    Object.send(:remove_const, :CustomTag)
+    Template.tags.delete('custom')
+    Liquid.cache_classes = original_cache_setting
+  end
+
+  def test_without_cache_classes_tags_reloads_the_class
+    original_cache_setting = Liquid.cache_classes
+    Liquid.cache_classes = false
+
+    original_klass = Class.new
+    Object.send(:const_set, :CustomTag, original_klass)
+    Template.register_tag('custom', CustomTag)
+
+    Object.send(:remove_const, :CustomTag)
+
+    new_klass = Class.new
+    Object.send(:const_set, :CustomTag, new_klass)
+
+    assert Template.tags['custom'].equal?(new_klass)
+  ensure
+    Object.send(:remove_const, :CustomTag)
+    Template.tags.delete('custom')
+    Liquid.cache_classes = original_cache_setting
+  end
+
+  class FakeTag; end
+
+  def test_tags_delete
+    Template.register_tag('fake', FakeTag)
+    assert_equal FakeTag, Template.tags['fake']
+
+    Template.tags.delete('fake')
+    assert_nil Template.tags['fake']
+  end
+
+  def test_tags_can_be_looped_over
+    Template.register_tag('fake', FakeTag)
+    result = Template.tags.map { |name, klass| [name, klass] }
+    assert result.include?(["fake", "TemplateUnitTest::FakeTag"])
+  ensure
+    Template.tags.delete('fake')
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tokenizer_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tokenizer_unit_test.rb
new file mode 100644
index 0000000..de84c1f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/tokenizer_unit_test.rb
@@ -0,0 +1,55 @@
+require 'test_helper'
+
+class TokenizerTest < Minitest::Test
+  def test_tokenize_strings
+    assert_equal [' '], tokenize(' ')
+    assert_equal ['hello world'], tokenize('hello world')
+  end
+
+  def test_tokenize_variables
+    assert_equal ['{{funk}}'], tokenize('{{funk}}')
+    assert_equal [' ', '{{funk}}', ' '], tokenize(' {{funk}} ')
+    assert_equal [' ', '{{funk}}', ' ', '{{so}}', ' ', '{{brother}}', ' '], tokenize(' {{funk}} {{so}} {{brother}} ')
+    assert_equal [' ', '{{  funk  }}', ' '], tokenize(' {{  funk  }} ')
+  end
+
+  def test_tokenize_blocks
+    assert_equal ['{%comment%}'], tokenize('{%comment%}')
+    assert_equal [' ', '{%comment%}', ' '], tokenize(' {%comment%} ')
+
+    assert_equal [' ', '{%comment%}', ' ', '{%endcomment%}', ' '], tokenize(' {%comment%} {%endcomment%} ')
+    assert_equal ['  ', '{% comment %}', ' ', '{% endcomment %}', ' '], tokenize("  {% comment %} {% endcomment %} ")
+  end
+
+  def test_calculate_line_numbers_per_token_with_profiling
+    assert_equal [1],       tokenize_line_numbers("{{funk}}")
+    assert_equal [1, 1, 1], tokenize_line_numbers(" {{funk}} ")
+    assert_equal [1, 2, 2], tokenize_line_numbers("\n{{funk}}\n")
+    assert_equal [1, 1, 3], tokenize_line_numbers(" {{\n funk \n}} ")
+  end
+
+  private
+
+  def tokenize(source)
+    tokenizer = Liquid::Tokenizer.new(source)
+    tokens = []
+    while t = tokenizer.shift
+      tokens << t
+    end
+    tokens
+  end
+
+  def tokenize_line_numbers(source)
+    tokenizer = Liquid::Tokenizer.new(source, true)
+    line_numbers = []
+    loop do
+      line_number = tokenizer.line_number
+      if tokenizer.shift
+        line_numbers << line_number
+      else
+        break
+      end
+    end
+    line_numbers
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/variable_unit_test.rb b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/variable_unit_test.rb
new file mode 100644
index 0000000..5a21ace
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/liquid-4.0.0/test/unit/variable_unit_test.rb
@@ -0,0 +1,162 @@
+require 'test_helper'
+
+class VariableUnitTest < Minitest::Test
+  include Liquid
+
+  def test_variable
+    var = create_variable('hello')
+    assert_equal VariableLookup.new('hello'), var.name
+  end
+
+  def test_filters
+    var = create_variable('hello | textileze')
+    assert_equal VariableLookup.new('hello'), var.name
+    assert_equal [['textileze', []]], var.filters
+
+    var = create_variable('hello | textileze | paragraph')
+    assert_equal VariableLookup.new('hello'), var.name
+    assert_equal [['textileze', []], ['paragraph', []]], var.filters
+
+    var = create_variable(%( hello | strftime: '%Y'))
+    assert_equal VariableLookup.new('hello'), var.name
+    assert_equal [['strftime', ['%Y']]], var.filters
+
+    var = create_variable(%( 'typo' | link_to: 'Typo', true ))
+    assert_equal 'typo', var.name
+    assert_equal [['link_to', ['Typo', true]]], var.filters
+
+    var = create_variable(%( 'typo' | link_to: 'Typo', false ))
+    assert_equal 'typo', var.name
+    assert_equal [['link_to', ['Typo', false]]], var.filters
+
+    var = create_variable(%( 'foo' | repeat: 3 ))
+    assert_equal 'foo', var.name
+    assert_equal [['repeat', [3]]], var.filters
+
+    var = create_variable(%( 'foo' | repeat: 3, 3 ))
+    assert_equal 'foo', var.name
+    assert_equal [['repeat', [3, 3]]], var.filters
+
+    var = create_variable(%( 'foo' | repeat: 3, 3, 3 ))
+    assert_equal 'foo', var.name
+    assert_equal [['repeat', [3, 3, 3]]], var.filters
+
+    var = create_variable(%( hello | strftime: '%Y, okay?'))
+    assert_equal VariableLookup.new('hello'), var.name
+    assert_equal [['strftime', ['%Y, okay?']]], var.filters
+
+    var = create_variable(%( hello | things: "%Y, okay?", 'the other one'))
+    assert_equal VariableLookup.new('hello'), var.name
+    assert_equal [['things', ['%Y, okay?', 'the other one']]], var.filters
+  end
+
+  def test_filter_with_date_parameter
+    var = create_variable(%( '2006-06-06' | date: "%m/%d/%Y"))
+    assert_equal '2006-06-06', var.name
+    assert_equal [['date', ['%m/%d/%Y']]], var.filters
+  end
+
+  def test_filters_without_whitespace
+    var = create_variable('hello | textileze | paragraph')
+    assert_equal VariableLookup.new('hello'), var.name
+    assert_equal [['textileze', []], ['paragraph', []]], var.filters
+
+    var = create_variable('hello|textileze|paragraph')
+    assert_equal VariableLookup.new('hello'), var.name
+    assert_equal [['textileze', []], ['paragraph', []]], var.filters
+
+    var = create_variable("hello|replace:'foo','bar'|textileze")
+    assert_equal VariableLookup.new('hello'), var.name
+    assert_equal [['replace', ['foo', 'bar']], ['textileze', []]], var.filters
+  end
+
+  def test_symbol
+    var = create_variable("http://disney.com/logo.gif | image: 'med' ", error_mode: :lax)
+    assert_equal VariableLookup.new('http://disney.com/logo.gif'), var.name
+    assert_equal [['image', ['med']]], var.filters
+  end
+
+  def test_string_to_filter
+    var = create_variable("'http://disney.com/logo.gif' | image: 'med' ")
+    assert_equal 'http://disney.com/logo.gif', var.name
+    assert_equal [['image', ['med']]], var.filters
+  end
+
+  def test_string_single_quoted
+    var = create_variable(%( "hello" ))
+    assert_equal 'hello', var.name
+  end
+
+  def test_string_double_quoted
+    var = create_variable(%( 'hello' ))
+    assert_equal 'hello', var.name
+  end
+
+  def test_integer
+    var = create_variable(%( 1000 ))
+    assert_equal 1000, var.name
+  end
+
+  def test_float
+    var = create_variable(%( 1000.01 ))
+    assert_equal 1000.01, var.name
+  end
+
+  def test_dashes
+    assert_equal VariableLookup.new('foo-bar'), create_variable('foo-bar').name
+    assert_equal VariableLookup.new('foo-bar-2'), create_variable('foo-bar-2').name
+
+    with_error_mode :strict do
+      assert_raises(Liquid::SyntaxError) { create_variable('foo - bar') }
+      assert_raises(Liquid::SyntaxError) { create_variable('-foo') }
+      assert_raises(Liquid::SyntaxError) { create_variable('2foo') }
+    end
+  end
+
+  def test_string_with_special_chars
+    var = create_variable(%( 'hello! $!@.;"ddasd" ' ))
+    assert_equal 'hello! $!@.;"ddasd" ', var.name
+  end
+
+  def test_string_dot
+    var = create_variable(%( test.test ))
+    assert_equal VariableLookup.new('test.test'), var.name
+  end
+
+  def test_filter_with_keyword_arguments
+    var = create_variable(%( hello | things: greeting: "world", farewell: 'goodbye'))
+    assert_equal VariableLookup.new('hello'), var.name
+    assert_equal [['things', [], { 'greeting' => 'world', 'farewell' => 'goodbye' }]], var.filters
+  end
+
+  def test_lax_filter_argument_parsing
+    var = create_variable(%( number_of_comments | pluralize: 'comment': 'comments' ), error_mode: :lax)
+    assert_equal VariableLookup.new('number_of_comments'), var.name
+    assert_equal [['pluralize', ['comment', 'comments']]], var.filters
+  end
+
+  def test_strict_filter_argument_parsing
+    with_error_mode(:strict) do
+      assert_raises(SyntaxError) do
+        create_variable(%( number_of_comments | pluralize: 'comment': 'comments' ))
+      end
+    end
+  end
+
+  def test_output_raw_source_of_variable
+    var = create_variable(%( name_of_variable | upcase ))
+    assert_equal " name_of_variable | upcase ", var.raw
+  end
+
+  def test_variable_lookup_interface
+    lookup = VariableLookup.new('a.b.c')
+    assert_equal 'a', lookup.name
+    assert_equal ['b', 'c'], lookup.lookups
+  end
+
+  private
+
+  def create_variable(markup, options = {})
+    Variable.new(markup, ParseContext.new(options))
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/CHANGELOG.md b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/CHANGELOG.md
new file mode 100644
index 0000000..232adbd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/CHANGELOG.md
@@ -0,0 +1 @@
+# Moved to [GitHub releases](https://github.com/guard/listen/releases) page.
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/CONTRIBUTING.md b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/CONTRIBUTING.md
new file mode 100644
index 0000000..5a5d6de
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/CONTRIBUTING.md
@@ -0,0 +1,38 @@
+Contribute to Listen
+===================
+
+File an issue
+-------------
+
+If you haven't already, first see [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) for known issues, solutions and workarounds.
+
+You can report bugs and feature requests to [GitHub Issues](https://github.com/guard/listen/issues).
+
+**Please don't ask question in the issue tracker**, instead ask them in our
+[Google group](http://groups.google.com/group/guard-dev) or on `#guard` (irc.freenode.net).
+
+Try to figure out where the issue belongs to: Is it an issue with Listen itself or with Guard?
+
+
+**It's most likely that your bug gets resolved faster if you provide as much information as possible!**
+
+The MOST useful information is debugging output from Listen (`LISTEN_GEM_DEBUGGING=1`) - see [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) for details.
+
+
+Development
+-----------
+
+* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames).
+* Source hosted at [GitHub](https://github.com/guard/listen).
+
+Pull requests are very welcome! Please try to follow these simple rules if applicable:
+
+* Please create a topic branch for every separate change you make.
+* Make sure your patches are well tested. All specs run with `rake spec` must pass.
+* Update the [Yard](http://yardoc.org/) documentation.
+* Update the [README](https://github.com/guard/listen/blob/master/README.md).
+* Update the [CHANGELOG](https://github.com/guard/listen/blob/master/CHANGELOG.md) for noteworthy changes.
+* Please **do not change** the version number.
+
+For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on
+`#guard` (irc.freenode.net).
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/LICENSE.txt b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/LICENSE.txt
new file mode 100644
index 0000000..b5f71c8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2013 Thibaud Guillaume-Gentil
+
+MIT License
+
+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/bundle/ruby/2.4.0/gems/listen-3.0.8/README.md b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/README.md
new file mode 100644
index 0000000..b7a5896
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/README.md
@@ -0,0 +1,293 @@
+:exclamation: Listen is currently accepting more maintainers. Please [read this](https://github.com/guard/guard/wiki/Maintainers) if you're interested in joining the team.
+
+# Listen
+
+[![Gem Version](https://badge.fury.io/rb/listen.png)](http://badge.fury.io/rb/listen) [![Build Status](https://travis-ci.org/guard/listen.png)](https://travis-ci.org/guard/listen) [![Dependency Status](https://gemnasium.com/guard/listen.png)](https://gemnasium.com/guard/listen) [![Code Climate](https://codeclimate.com/github/guard/listen.png)](https://codeclimate.com/github/guard/listen) [![Coverage Status](https://coveralls.io/repos/guard/listen/badge.png?branch=master)](https://coveralls.io/r/guard/listen)
+
+The Listen gem listens to file modifications and notifies you about the changes.
+
+## Features
+
+* OS-optimized adapters on MRI for Mac OS X 10.6+, Linux, \*BSD and Windows, [more info](#listen-adapters) below.
+* Detects file modification, addition and removal.
+* You can watch multiple directories.
+* Regexp-patterns for ignoring paths for more accuracy and speed
+* Increased change detection accuracy on OS X HFS and VFAT volumes.
+* Tested on MRI Ruby environments (2.0+ only) via [Travis CI](https://travis-ci.org/guard/listen),
+
+## Issues / limitations
+
+* Limited support for symlinked directories ([#279](https://github.com/guard/listen/issues/279)):
+  * Symlinks are always followed ([#25](https://github.com/guard/listen/issues/25)).
+  * Symlinked directories pointing within a watched directory are not supported ([#273](https://github.com/guard/listen/pull/273)- see [Duplicate directory errors](https://github.com/guard/listen/wiki/Duplicate-directory-errors)).
+* No directory/adapter-specific configuration options.
+* Support for plugins planned for future.
+* TCP functionality was removed in Listen [3.0.0](https://github.com/guard/listen/releases/tag/v3.0.0) ([#319](https://github.com/guard/listen/issues/319), [#218](https://github.com/guard/listen/issues/218)). There are plans to extract this feature to separate gems ([#258](https://github.com/guard/listen/issues/258)), until this is finished, you can use by locking the `listen` gem to version `'~> 2.10'`.
+* Some filesystems won't work without polling (VM/Vagrant Shared folders, NFS, Samba, sshfs, etc.).
+* Specs suite on JRuby and Rubinius aren't reliable on Travis CI, but should work.
+* Windows and \*BSD adapter aren't continuously and automatically tested.
+* OSX adapter has some performance limitations ([#342](https://github.com/guard/listen/issues/342)).
+* Ruby 1.9.3 is no longer maintained (and may not work with Listen) - it's best to upgrade to Ruby 2.2.2.
+
+Pull requests or help is very welcome for these.
+
+## Install
+
+The simplest way to install Listen is to use [Bundler](http://bundler.io).
+
+```ruby
+gem 'listen', '~> 3.0' # NOTE: for TCP functionality, use '~> 2.10' for now
+```
+
+## Usage
+
+Call `Listen.to` with either a single directory or multiple directories, then define the "changes" callback in a block.
+
+``` ruby
+listener = Listen.to('dir/to/listen', 'dir/to/listen2') do |modified, added, removed|
+  puts "modified absolute path: #{modified}"
+  puts "added absolute path: #{added}"
+  puts "removed absolute path: #{removed}"
+end
+listener.start # not blocking
+sleep
+```
+
+### Pause / unpause / stop
+
+Listeners can also be easily paused/unpaused:
+
+``` ruby
+listener = Listen.to('dir/path/to/listen') { |modified, added, removed| puts 'handle changes here...' }
+
+listener.start
+listener.paused? # => false
+listener.processing? # => true
+
+listener.pause   # stops processing changes (but keeps on collecting them)
+listener.paused? # => true
+listener.processing? # => false
+
+listener.unpause # resumes processing changes ("start" would do the same)
+listener.stop    # stop both listening to changes and processing them
+```
+
+  Note: While paused, Listen keeps on collecting changes in the background - to clear them, call "stop"
+
+  Note: You should keep track of all started listeners and stop them properly on finish.
+
+### Ignore / ignore!
+
+Listen ignores some directories and extensions by default (See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer), you can add ignoring patterns with the `ignore` option/method or overwrite default with `ignore!` option/method.
+
+``` ruby
+listener = Listen.to('dir/path/to/listen', ignore: /\.txt/) { |modified, added, removed| # ... }
+listener.start
+listener.ignore! /\.pkg/ # overwrite all patterns and only ignore pkg extension.
+listener.ignore /\.rb/   # ignore rb extension in addition of pkg.
+sleep
+```
+
+Note: `:ignore` regexp patterns are evaluated against relative paths.
+
+Note: Ignoring paths does not improve performance, except when Polling ([#274](https://github.com/guard/listen/issues/274))
+
+### Only
+
+Listen catches all files (less the ignored ones) by default. If you want to only listen to a specific type of file (i.e., just `.rb` extension), you should use the `only` option/method.
+
+``` ruby
+listener = Listen.to('dir/path/to/listen', only: /\.rb$/) { |modified, added, removed| # ... }
+listener.start
+listener.only /_spec\.rb$/ # overwrite all existing only patterns.
+sleep
+```
+
+Note: `:only` regexp patterns are evaluated only against relative **file** paths.
+
+
+## Changes callback
+
+Changes to the listened-to directories gets reported back to the user in a callback.
+The registered callback gets invoked, when there are changes, with **three** parameters:
+`modified`, `added` and `removed` paths, in that particular order.
+Paths are always returned in their absolute form.
+
+Example:
+
+```ruby
+listener = Listen.to('path/to/app') do |modified, added, removed|
+  # This block will be called when there are changes.
+end
+listener.start
+sleep
+```
+
+or ...
+
+```ruby
+# Create a callback
+callback = Proc.new do |modified, added, removed|
+  # This proc will be called when there are changes.
+end
+listener = Listen.to('dir', &callback)
+listener.start
+sleep
+```
+
+## Options
+
+All the following options can be set through the `Listen.to` after the directory path(s) params.
+
+```ruby
+ignore: [%r{/foo/bar}, /\.pid$/, /\.coffee$/]   # Ignore a list of paths
+                                                # default: See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer
+
+ignore!: %r{/foo/bar}                           # Same as ignore options, but overwrite default ignored paths.
+
+only: %r{.rb$}                                  # Only listen to specific files
+                                                # default: none
+
+latency: 0.5                                    # Set the delay (**in seconds**) between checking for changes
+                                                # default: 0.25 sec (1.0 sec for polling)
+
+wait_for_delay: 4                               # Set the delay (**in seconds**) between calls to the callback when changes exist
+                                                # default: 0.10 sec
+
+force_polling: true                             # Force the use of the polling adapter
+                                                # default: none
+
+relative: false                                 # Whether changes should be relative to current dir or not
+                                                # default: false
+
+polling_fallback_message: 'custom message'      # Set a custom polling fallback message (or disable it with false)
+                                                # default: "Listen will be polling for changes. Learn more at https://github.com/guard/listen#listen-adapters."
+```
+
+## Debugging
+
+Setting the environment variable `LISTEN_GEM_DEBUGGING=1` sets up the INFO level logger, while `LISTEN_GEM_DEBUGGING=2` sets up the DEBUG level logger. 
+
+You can also set `Listen.logger` to a custom logger.
+
+
+## Listen adapters
+
+The Listen gem has a set of adapters to notify it when there are changes.
+
+There are 4 OS-specific adapters to support Darwin, Linux, \*BSD and Windows.
+These adapters are fast as they use some system-calls to implement the notifying function.
+
+There is also a polling adapter - although it's much slower than other adapters,
+it works on every platform/system and scenario (including network filesystems such as VM shared folders).
+
+The Darwin and Linux adapters are dependencies of the Listen gem so they work out of the box. For other adapters a specific gem will have to be added to your Gemfile, please read below.
+
+The Listen gem will choose the best adapter automatically, if present. If you
+want to force the use of the polling adapter, use the `:force_polling` option
+while initializing the listener.
+
+### On Windows
+
+If you are on Windows, it's recommended to use the [`wdm`](https://github.com/Maher4Ever/wdm) adapter instead of polling.
+
+Please add the following to your Gemfile:
+
+```ruby
+gem 'wdm', '>= 0.1.0' if Gem.win_platform?
+```
+
+### On \*BSD
+
+If you are on \*BSD you can try to use the [`rb-kqueue`](https://github.com/mat813/rb-kqueue) adapter instead of polling.
+
+Please add the following to your Gemfile:
+
+```ruby
+require 'rbconfig'
+if RbConfig::CONFIG['target_os'] =~ /bsd|dragonfly/i
+  gem 'rb-kqueue', '>= 0.2'
+end
+
+```
+
+### Getting the [polling fallback message](#options)?
+
+Please visit the [installation section of the Listen WIKI](https://github.com/guard/listen/wiki#installation) for more information and options for potential fixes.
+
+### Issues and troubleshooting
+
+*NOTE: without providing the output after setting the `LISTEN_GEM_DEBUGGING=1` environment variable, it can be almost impossible to guess why listen is not working as expected.*
+
+See [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting)
+
+## Performance
+
+If Listen seems slow or unresponsive, make sure you're not using the Polling adapter (you should see a warning upon startup if you are).
+
+Also, if the directories you're watching contain many files, make sure you're:
+
+* not using Polling (ideally)
+* using `:ignore` and `:only` options to avoid tracking directories you don't care about (important with Polling and on MacOS)
+* running Listen with the `:latency` and `:wait_for_delay` options not too small or too big (depends on needs)
+* not watching directories with log files, database files or other frequently changing files
+* not using a version of Listen prior to 2.7.7
+* not getting silent crashes within Listen (see LISTEN_GEM_DEBUGGING=2)
+* not running multiple instances of Listen in the background
+* using a file system with atime modification disabled (ideally)
+* not using a filesystem with inaccurate file modification times (ideally), e.g. HFS, VFAT
+* not buffering to a slow terminal (e.g. transparency + fancy font + slow gfx card + lots of output)
+* ideally not running a slow encryption stack, e.g. btrfs + ecryptfs
+
+When in doubt, LISTEN_GEM_DEBUGGING=2 can help discover the actual events and time they happened.
+
+See also [Tips and Techniques](https://github.com/guard/listen/wiki/Tips-and-Techniques).
+
+## Development
+
+* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames).
+* Source hosted at [GitHub](https://github.com/guard/listen).
+
+Pull requests are very welcome! Please try to follow these simple rules if applicable:
+
+* Please create a topic branch for every separate change you make.
+* Make sure your patches are well tested. All specs must pass on [Travis CI](https://travis-ci.org/guard/listen).
+* Update the [Yard](http://yardoc.org/) documentation.
+* Update the [README](https://github.com/guard/listen/blob/master/README.md).
+* Please **do not change** the version number.
+
+For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on
+`#guard` (irc.freenode.net).
+
+## Acknowledgments
+
+* [Michael Kessler (netzpirat)][] for having written the [initial specs](https://github.com/guard/listen/commit/1e457b13b1bb8a25d2240428ce5ed488bafbed1f).
+* [Travis Tilley (ttilley)][] for this awesome work on [fssm][] & [rb-fsevent][].
+* [Nathan Weizenbaum (nex3)][] for [rb-inotify][], a thorough inotify wrapper.
+* [Mathieu Arnold (mat813)][] for [rb-kqueue][], a simple kqueue wrapper.
+* [Maher Sallam][] for [wdm][], windows support wouldn't exist without him.
+* [Yehuda Katz (wycats)][] for [vigilo][], that has been a great source of inspiration.
+
+## Author
+
+[Thibaud Guillaume-Gentil](https://github.com/thibaudgg) ([@thibaudgg](https://twitter.com/thibaudgg))
+
+## Contributors
+
+[https://github.com/guard/listen/graphs/contributors](https://github.com/guard/listen/graphs/contributors)
+
+[Thibaud Guillaume-Gentil (thibaudgg)]: https://github.com/thibaudgg
+[Maher Sallam]: https://github.com/Maher4Ever
+[Michael Kessler (netzpirat)]: https://github.com/netzpirat
+[Travis Tilley (ttilley)]: https://github.com/ttilley
+[fssm]: https://github.com/ttilley/fssm
+[rb-fsevent]: https://github.com/thibaudgg/rb-fsevent
+[Mathieu Arnold (mat813)]: https://github.com/mat813
+[Nathan Weizenbaum (nex3)]: https://github.com/nex3
+[rb-inotify]: https://github.com/nex3/rb-inotify
+[stereobooster]: https://github.com/stereobooster
+[rb-fchange]: https://github.com/stereobooster/rb-fchange
+[rb-kqueue]: https://github.com/mat813/rb-kqueue
+[Yehuda Katz (wycats)]: https://github.com/wycats
+[vigilo]: https://github.com/wycats/vigilo
+[wdm]: https://github.com/Maher4Ever/wdm
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/bin/listen b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/bin/listen
new file mode 100755
index 0000000..dbbdef2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/bin/listen
@@ -0,0 +1,12 @@
+#!/usr/bin/env ruby
+
+require 'listen'
+require 'listen/cli'
+
+unless defined?(JRUBY_VERSION)
+  if Signal.list.keys.include?('INT')
+    Signal.trap('INT') { Thread.new { Listen.stop } }
+  end
+end
+
+Listen::CLI.start
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen.rb
new file mode 100644
index 0000000..57d4a1a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen.rb
@@ -0,0 +1,55 @@
+require 'logger'
+require 'listen/logger'
+require 'listen/listener'
+
+require 'listen/internals/thread_pool'
+
+# Always set up logging by default first time file is required
+#
+# NOTE: If you need to clear the logger completely, do so *after*
+# requiring this file. If you need to set a custom logger,
+# require the listen/logger file and set the logger before requiring
+# this file.
+Listen.setup_default_logger_if_unset
+
+# Won't print anything by default because of level - unless you've set
+# LISTEN_GEM_DEBUGGING or provided your own logger with a high enough level
+Listen::Logger.info "Listen loglevel set to: #{Listen.logger.level}"
+Listen::Logger.info "Listen version: #{Listen::VERSION}"
+
+module Listen
+  class << self
+    # Listens to file system modifications on a either single directory or
+    # multiple directories.
+    #
+    # @param (see Listen::Listener#new)
+    #
+    # @yield [modified, added, removed] the changed files
+    # @yieldparam [Array<String>] modified the list of modified files
+    # @yieldparam [Array<String>] added the list of added files
+    # @yieldparam [Array<String>] removed the list of removed files
+    #
+    # @return [Listen::Listener] the listener
+    #
+    def to(*args, &block)
+      @listeners ||= []
+      Listener.new(*args, &block).tap do |listener|
+        @listeners << listener
+      end
+    end
+
+    # This is used by the `listen` binary to handle Ctrl-C
+    #
+    def stop
+      Internals::ThreadPool.stop
+      @listeners ||= []
+
+      # TODO: should use a mutex for this
+      @listeners.each do |listener|
+        # call stop to halt the main loop
+        listener.stop
+      end
+      @listeners = nil
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter.rb
new file mode 100644
index 0000000..288bcb4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter.rb
@@ -0,0 +1,43 @@
+require 'listen/adapter/base'
+require 'listen/adapter/bsd'
+require 'listen/adapter/darwin'
+require 'listen/adapter/linux'
+require 'listen/adapter/polling'
+require 'listen/adapter/windows'
+
+module Listen
+  module Adapter
+    OPTIMIZED_ADAPTERS = [Darwin, Linux, BSD, Windows]
+    POLLING_FALLBACK_MESSAGE = 'Listen will be polling for changes.'\
+      'Learn more at https://github.com/guard/listen#listen-adapters.'
+
+    def self.select(options = {})
+      _log :debug, 'Adapter: considering polling ...'
+      return Polling if options[:force_polling]
+      _log :debug, 'Adapter: considering optimized backend...'
+      return _usable_adapter_class if _usable_adapter_class
+      _log :debug, 'Adapter: falling back to polling...'
+      _warn_polling_fallback(options)
+      Polling
+    rescue
+      _log :warn, format('Adapter: failed: %s:%s', $ERROR_POSITION.inspect,
+                         $ERROR_POSITION * "\n")
+      raise
+    end
+
+    private
+
+    def self._usable_adapter_class
+      OPTIMIZED_ADAPTERS.detect(&:usable?)
+    end
+
+    def self._warn_polling_fallback(options)
+      msg = options.fetch(:polling_fallback_message, POLLING_FALLBACK_MESSAGE)
+      Kernel.warn "[Listen warning]:\n  #{msg}" if msg
+    end
+
+    def self._log(type, message)
+      Listen::Logger.send(type, message)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/base.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/base.rb
new file mode 100644
index 0000000..2f59d9b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/base.rb
@@ -0,0 +1,137 @@
+require 'listen/options'
+require 'listen/record'
+require 'listen/change'
+
+module Listen
+  module Adapter
+    class Base
+      attr_reader :options
+
+      # TODO: only used by tests
+      DEFAULTS = {}
+
+      attr_reader :config
+
+      def initialize(config)
+        @started = false
+        @config = config
+
+        @configured = nil
+
+        fail 'No directories to watch!' if config.directories.empty?
+
+        defaults = self.class.const_get('DEFAULTS')
+        @options = Listen::Options.new(config.adapter_options, defaults)
+      rescue
+        _log_exception 'adapter config failed: %s:%s called from: %s', caller
+        raise
+      end
+
+      # TODO: it's a separate method as a temporary workaround for tests
+      def configure
+        if @configured
+          _log(:warn, 'Adapter already configured!')
+          return
+        end
+
+        @configured = true
+
+        @callbacks ||= {}
+        config.directories.each do |dir|
+          callback = @callbacks[dir] || lambda do |event|
+            _process_event(dir, event)
+          end
+          @callbacks[dir] = callback
+          _configure(dir, &callback)
+        end
+
+        @snapshots ||= {}
+        # TODO: separate config per directory (some day maybe)
+        change_config = Change::Config.new(config.queue, config.silencer)
+        config.directories.each do |dir|
+          record = Record.new(dir)
+          snapshot = Change.new(change_config, record)
+          @snapshots[dir] = snapshot
+        end
+      end
+
+      def started?
+        @started
+      end
+
+      def start
+        configure
+
+        if started?
+          _log(:warn, 'Adapter already started!')
+          return
+        end
+
+        @started = true
+
+        calling_stack = caller.dup
+        Listen::Internals::ThreadPool.add do
+          begin
+            @snapshots.values.each do |snapshot|
+              _timed('Record.build()') { snapshot.record.build }
+            end
+            _run
+          rescue
+            msg = 'run() in thread failed: %s:\n'\
+              ' %s\n\ncalled from:\n %s'
+            _log_exception(msg, calling_stack)
+            raise # for unit tests mostly
+          end
+        end
+      end
+
+      def stop
+        _stop
+      end
+
+      def self.usable?
+        const_get('OS_REGEXP') =~ RbConfig::CONFIG['target_os']
+      end
+
+      private
+
+      def _stop
+      end
+
+      def _timed(title)
+        start = Time.now.to_f
+        yield
+        diff = Time.now.to_f - start
+        Listen::Logger.info format('%s: %.05f seconds', title, diff)
+      rescue
+        Listen::Logger.warn "#{title} crashed: #{$ERROR_INFO.inspect}"
+        raise
+      end
+
+      # TODO: allow backend adapters to pass specific invalidation objects
+      # e.g. Darwin -> DirRescan, INotify -> MoveScan, etc.
+      def _queue_change(type, dir, rel_path, options)
+        @snapshots[dir].invalidate(type, rel_path, options)
+      end
+
+      def _log(*args, &block)
+        self.class.send(:_log, *args, &block)
+      end
+
+      def _log_exception(msg, caller_stack)
+        formatted = format(
+          msg,
+          $ERROR_INFO,
+          $ERROR_POSITION * "\n",
+          caller_stack * "\n"
+        )
+
+        _log(:error, formatted)
+      end
+
+      def self._log(*args, &block)
+        Listen::Logger.send(*args, &block)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/bsd.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/bsd.rb
new file mode 100644
index 0000000..b559049
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/bsd.rb
@@ -0,0 +1,106 @@
+# Listener implementation for BSD's `kqueue`.
+# @see http://www.freebsd.org/cgi/man.cgi?query=kqueue
+# @see https://github.com/mat813/rb-kqueue/blob/master/lib/rb-kqueue/queue.rb
+#
+module Listen
+  module Adapter
+    class BSD < Base
+      OS_REGEXP = /bsd|dragonfly/i
+
+      DEFAULTS = {
+        events: [
+          :delete,
+          :write,
+          :extend,
+          :attrib,
+          :rename
+          # :link, :revoke
+        ]
+      }
+
+      BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '')
+        Please add the following to your Gemfile to avoid polling for changes:
+          require 'rbconfig'
+          if RbConfig::CONFIG['target_os'] =~ /#{OS_REGEXP}/
+            gem 'rb-kqueue', '>= 0.2'
+          end
+      EOS
+
+      def self.usable?
+        return false unless super
+        require 'rb-kqueue'
+        require 'find'
+        true
+      rescue LoadError
+        Kernel.warn BUNDLER_DECLARE_GEM
+        false
+      end
+
+      private
+
+      def _configure(directory, &_callback)
+        @worker ||= KQueue::Queue.new
+        @callback = _callback
+        # use Record to make a snapshot of dir, so we
+        # can detect new files
+        _find(directory.to_s) { |path| _watch_file(path, @worker) }
+      end
+
+      def _run
+        @worker.run
+      end
+
+      def _process_event(dir, event)
+        full_path = _event_path(event)
+        if full_path.directory?
+          # Force dir content tracking to kick in, or we won't have
+          # names of added files
+          _queue_change(:dir, dir, '.', recursive: true)
+        elsif full_path.exist?
+          path = full_path.relative_path_from(dir)
+          _queue_change(:file, dir, path.to_s, change: _change(event.flags))
+        end
+
+        # If it is a directory, and it has a write flag, it means a
+        # file has been added so find out which and deal with it.
+        # No need to check for removed files, kqueue will forget them
+        # when the vfs does.
+        _watch_for_new_file(event) if full_path.directory?
+      end
+
+      def _change(event_flags)
+        { modified: [:attrib, :extend],
+          added:    [:write],
+          removed:  [:rename, :delete]
+        }.each do |change, flags|
+          return change unless (flags & event_flags).empty?
+        end
+        nil
+      end
+
+      def _event_path(event)
+        Pathname.new(event.watcher.path)
+      end
+
+      def _watch_for_new_file(event)
+        queue = event.watcher.queue
+        _find(_event_path(event).to_s) do |file_path|
+          unless queue.watchers.detect { |_, v| v.path == file_path.to_s }
+            _watch_file(file_path, queue)
+          end
+        end
+      end
+
+      def _watch_file(path, queue)
+        queue.watch_file(path, *options.events, &@callback)
+      rescue Errno::ENOENT => e
+        _log :warn, "kqueue: watch file failed: #{e.message}"
+      end
+
+      # Quick rubocop workaround
+      def _find(*paths, &block)
+        Find.send(:find, *paths, &block)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/config.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/config.rb
new file mode 100644
index 0000000..57f567b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/config.rb
@@ -0,0 +1,26 @@
+require 'pathname'
+
+module Listen
+  module Adapter
+    class Config
+      attr_reader :directories
+      attr_reader :silencer
+      attr_reader :queue
+      attr_reader :adapter_options
+
+      def initialize(directories, queue, silencer, adapter_options)
+        # Default to current directory if no directories are supplied
+        directories = [Dir.pwd] if directories.to_a.empty?
+        
+        # TODO: fix (flatten, array, compact?)
+        @directories = directories.map do |directory|
+          Pathname.new(directory.to_s).realpath
+        end
+
+        @silencer = silencer
+        @queue = queue
+        @adapter_options = adapter_options
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/darwin.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/darwin.rb
new file mode 100644
index 0000000..d4acf96
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/darwin.rb
@@ -0,0 +1,88 @@
+require 'thread'
+require 'listen/internals/thread_pool'
+
+module Listen
+  module Adapter
+    # Adapter implementation for Mac OS X `FSEvents`.
+    #
+    class Darwin < Base
+      OS_REGEXP = /darwin(?<major_version>1\d+)/i
+
+      # The default delay between checking for changes.
+      DEFAULTS = { latency: 0.1 }
+
+      INCOMPATIBLE_GEM_VERSION = <<-EOS.gsub(/^ {8}/, '')
+        rb-fsevent > 0.9.4 no longer supports OS X 10.6 through 10.8.
+
+        Please add the following to your Gemfile to avoid polling for changes:
+          require 'rbconfig'
+          if RbConfig::CONFIG['target_os'] =~ /darwin(1[0-3])/i
+            gem 'rb-fsevent', '<= 0.9.4'
+          end
+      EOS
+
+      def self.usable?
+        require 'rb-fsevent'
+        darwin_version = RbConfig::CONFIG['target_os'][OS_REGEXP, :major_version] or return false
+        return true if darwin_version.to_i >= 13 # darwin13 is OS X 10.9
+        return true if Gem::Version.new(FSEvent::VERSION) <= Gem::Version.new('0.9.4')
+        Kernel.warn INCOMPATIBLE_GEM_VERSION
+        false
+      end
+
+      private
+
+      # NOTE: each directory gets a DIFFERENT callback!
+      def _configure(dir, &callback)
+        opts = { latency: options.latency }
+
+        @workers ||= ::Queue.new
+        @workers << FSEvent.new.tap do |worker|
+          _log :debug, "fsevent: watching: #{dir.to_s.inspect}"
+          worker.watch(dir.to_s, opts, &callback)
+        end
+      end
+
+      def _run
+        first = @workers.pop
+
+        # NOTE: _run is called within a thread, so run every other
+        # worker in it's own thread
+        _run_workers_in_background(_to_array(@workers))
+        _run_worker(first)
+      end
+
+      def _process_event(dir, event)
+        _log :debug, "fsevent: processing event: #{event.inspect}"
+        event.each do |path|
+          new_path = Pathname.new(path.sub(/\/$/, ''))
+          _log :debug, "fsevent: #{new_path}"
+          # TODO: does this preserve symlinks?
+          rel_path = new_path.relative_path_from(dir).to_s
+          _queue_change(:dir, dir, rel_path, recursive: true)
+        end
+      end
+
+      def _run_worker(worker)
+        _log :debug, "fsevent: running worker: #{worker.inspect}"
+        worker.run
+      rescue
+        _log_exception 'fsevent: running worker failed: %s:%s called from: %s', caller
+      end
+
+      def _run_workers_in_background(workers)
+        workers.each do |worker|
+          # NOTE: while passing local variables to the block below is not
+          # thread safe, using 'worker' from the enumerator above is ok
+          Listen::Internals::ThreadPool.add { _run_worker(worker) }
+        end
+      end
+
+      def _to_array(queue)
+        workers = []
+        workers << queue.pop until queue.empty?
+        workers
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/linux.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/linux.rb
new file mode 100644
index 0000000..4e29caf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/linux.rb
@@ -0,0 +1,108 @@
+module Listen
+  module Adapter
+    # @see https://github.com/nex3/rb-inotify
+    class Linux < Base
+      OS_REGEXP = /linux/i
+
+      DEFAULTS = {
+        events: [
+          :recursive,
+          :attrib,
+          :create,
+          :delete,
+          :move,
+          :close_write
+        ],
+        wait_for_delay: 0.1
+      }
+
+      private
+
+      WIKI_URL = 'https://github.com/guard/listen'\
+        '/wiki/Increasing-the-amount-of-inotify-watchers'
+
+      INOTIFY_LIMIT_MESSAGE = <<-EOS.gsub(/^\s*/, '')
+        FATAL: Listen error: unable to monitor directories for changes.
+        Visit #{WIKI_URL} for info on how to fix this.
+      EOS
+
+      def _configure(directory, &callback)
+        require 'rb-inotify'
+        @worker ||= ::INotify::Notifier.new
+        @worker.watch(directory.to_s, *options.events, &callback)
+      rescue Errno::ENOSPC
+        abort(INOTIFY_LIMIT_MESSAGE)
+      end
+
+      def _run
+        Thread.current[:listen_blocking_read_thread] = true
+        @worker.run
+        Thread.current[:listen_blocking_read_thread] = false
+      end
+
+      def _process_event(dir, event)
+        # NOTE: avoid using event.absolute_name since new API
+        # will need to have a custom recursion implemented
+        # to properly match events to configured directories
+        path = Pathname.new(event.watcher.path) + event.name
+        rel_path = path.relative_path_from(dir).to_s
+
+        _log(:debug) { "inotify: #{rel_path} (#{event.flags.inspect})" }
+
+        if /1|true/ =~ ENV['LISTEN_GEM_SIMULATE_FSEVENT']
+          if (event.flags & [:moved_to, :moved_from]) || _dir_event?(event)
+            rel_path = path.dirname.relative_path_from(dir).to_s
+            _queue_change(:dir, dir, rel_path, {})
+          else
+            _queue_change(:dir, dir, rel_path, {})
+          end
+          return
+        end
+
+        return if _skip_event?(event)
+
+        cookie_params = event.cookie.zero? ? {} : { cookie: event.cookie }
+
+        # Note: don't pass options to force rescanning the directory, so we can
+        # detect moving/deleting a whole tree
+        if _dir_event?(event)
+          _queue_change(:dir, dir, rel_path, cookie_params)
+          return
+        end
+
+        params = cookie_params.merge(change: _change(event.flags))
+
+        _queue_change(:file, dir, rel_path, params)
+      end
+
+      def _skip_event?(event)
+        # Event on root directory
+        return true if event.name == ''
+        # INotify reports changes to files inside directories as events
+        # on the directories themselves too.
+        #
+        # @see http://linux.die.net/man/7/inotify
+        _dir_event?(event) && (event.flags & [:close, :modify]).any?
+      end
+
+      def _change(event_flags)
+        { modified:   [:attrib, :close_write],
+          moved_to:   [:moved_to],
+          moved_from: [:moved_from],
+          added:      [:create],
+          removed:    [:delete] }.each do |change, flags|
+          return change unless (flags & event_flags).empty?
+        end
+        nil
+      end
+
+      def _dir_event?(event)
+        event.flags.include?(:isdir)
+      end
+
+      def _stop
+        @worker && @worker.close
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/polling.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/polling.rb
new file mode 100644
index 0000000..d1d57be
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/polling.rb
@@ -0,0 +1,37 @@
+module Listen
+  module Adapter
+    # Polling Adapter that works cross-platform and
+    # has no dependencies. This is the adapter that
+    # uses the most CPU processing power and has higher
+    # file IO than the other implementations.
+    #
+    class Polling < Base
+      OS_REGEXP = // # match every OS
+
+      DEFAULTS = { latency: 1.0, wait_for_delay: 0.05 }
+
+      private
+
+      def _configure(_, &callback)
+        @polling_callbacks ||= []
+        @polling_callbacks << callback
+      end
+
+      def _run
+        loop do
+          start = Time.now.to_f
+          @polling_callbacks.each do |callback|
+            callback.call(nil)
+            nap_time = options.latency - (Time.now.to_f - start)
+            # TODO: warn if nap_time is negative (polling too slow)
+            sleep(nap_time) if nap_time > 0
+          end
+        end
+      end
+
+      def _process_event(dir, _)
+        _queue_change(:dir, dir, '.', recursive: true)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/windows.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/windows.rb
new file mode 100644
index 0000000..b15fb4c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/adapter/windows.rb
@@ -0,0 +1,99 @@
+module Listen
+  module Adapter
+    # Adapter implementation for Windows `wdm`.
+    #
+    class Windows < Base
+      OS_REGEXP = /mswin|mingw|cygwin/i
+
+      BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '')
+        Please add the following to your Gemfile to avoid polling for changes:
+          gem 'wdm', '>= 0.1.0' if Gem.win_platform?
+      EOS
+
+      def self.usable?
+        return false unless super
+        require 'wdm'
+        true
+      rescue LoadError
+        _log :debug, format('wdm - load failed: %s:%s', $ERROR_INFO,
+                            $ERROR_POSITION * "\n")
+
+        Kernel.warn BUNDLER_DECLARE_GEM
+        false
+      end
+
+      private
+
+      def _configure(dir, &callback)
+        require 'wdm'
+        _log :debug, 'wdm - starting...'
+        @worker ||= WDM::Monitor.new
+        @worker.watch_recursively(dir.to_s, :files) do |change|
+          callback.call([:file, change])
+        end
+
+        @worker.watch_recursively(dir.to_s, :directories) do |change|
+          callback.call([:dir, change])
+        end
+
+        events = [:attributes, :last_write]
+        @worker.watch_recursively(dir.to_s, *events) do |change|
+          callback.call([:attr, change])
+        end
+      end
+
+      def _run
+        @worker.run!
+      end
+
+      def _process_event(dir, event)
+        _log :debug, "wdm - callback: #{event.inspect}"
+
+        type, change = event
+
+        full_path = Pathname(change.path)
+
+        rel_path = full_path.relative_path_from(dir).to_s
+
+        options = { change: _change(change.type) }
+
+        case type
+        when :file
+          _queue_change(:file, dir, rel_path, options)
+        when :attr
+          unless full_path.directory?
+            _queue_change(:file, dir, rel_path, options)
+          end
+        when :dir
+          if change.type == :removed
+            # TODO: check if watched dir?
+            _queue_change(:dir, dir, Pathname(rel_path).dirname.to_s, {})
+          elsif change.type == :added
+            _queue_change(:dir, dir, rel_path, {})
+          else
+            # do nothing - changed directory means either:
+            #   - removed subdirs (handled above)
+            #   - added subdirs (handled above)
+            #   - removed files (handled by _file_callback)
+            #   - added files (handled by _file_callback)
+            # so what's left?
+          end
+        end
+      rescue
+        details = event.inspect
+        _log :error, format('wdm - callback (%): %s:%s', details, $ERROR_INFO,
+                            $ERROR_POSITION * "\n")
+        raise
+      end
+
+      def _change(type)
+        { modified: [:modified, :attrib], # TODO: is attrib really passed?
+          added:    [:added, :renamed_new_file],
+          removed:  [:removed, :renamed_old_file] }.each do |change, types|
+          return change if types.include?(type)
+        end
+        nil
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/backend.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/backend.rb
new file mode 100644
index 0000000..a98f603
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/backend.rb
@@ -0,0 +1,43 @@
+require 'listen/adapter'
+require 'listen/adapter/base'
+require 'listen/adapter/config'
+
+require 'forwardable'
+
+# This class just aggregates configuration object to avoid Listener specs
+# from exploding with huge test setup blocks
+module Listen
+  class Backend
+    def initialize(directories, queue, silencer, config)
+      adapter_select_opts = config.adapter_select_options
+
+      adapter_class = Adapter.select(adapter_select_opts)
+
+      # Use default from adapter if possible
+      @min_delay_between_events = config.min_delay_between_events
+      @min_delay_between_events ||= adapter_class::DEFAULTS[:wait_for_delay]
+      @min_delay_between_events ||= 0.1
+
+      adapter_opts = config.adapter_instance_options(adapter_class)
+
+      aconfig = Adapter::Config.new(directories, queue, silencer, adapter_opts)
+      @adapter = adapter_class.new(aconfig)
+    end
+
+    def start
+      adapter.start
+    end
+
+    def stop
+      adapter.stop
+    end
+
+    def min_delay_between_events
+      @min_delay_between_events
+    end
+
+    private
+
+    attr_reader :adapter
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/change.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/change.rb
new file mode 100644
index 0000000..b73028d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/change.rb
@@ -0,0 +1,78 @@
+require 'listen/file'
+require 'listen/directory'
+
+module Listen
+  # TODO: rename to Snapshot
+  class Change
+    # TODO: test this class for coverage
+    class Config
+      def initialize(queue, silencer)
+        @queue = queue
+        @silencer = silencer
+      end
+
+      def silenced?(path, type)
+        @silencer.silenced?(Pathname(path), type)
+      end
+
+      def queue(*args)
+        @queue << args
+      end
+    end
+
+    attr_reader :record
+
+    def initialize(config, record)
+      @config = config
+      @record = record
+    end
+
+    # Invalidate some part of the snapshot/record (dir, file, subtree, etc.)
+    def invalidate(type, rel_path, options)
+      watched_dir = Pathname.new(record.root)
+
+      change = options[:change]
+      cookie = options[:cookie]
+
+      if !cookie && config.silenced?(rel_path, type)
+        Listen::Logger.debug {  "(silenced): #{rel_path.inspect}" }
+        return
+      end
+
+      path = watched_dir + rel_path
+
+      Listen::Logger.debug do
+        log_details = options[:silence] && 'recording' || change || 'unknown'
+        "#{log_details}: #{type}:#{path} (#{options.inspect})"
+      end
+
+      if change
+        options = cookie ? { cookie: cookie } : {}
+        config.queue(type, change, watched_dir, rel_path, options)
+      else
+        if type == :dir
+          # NOTE: POSSIBLE RECURSION
+          # TODO: fix - use a queue instead
+          Directory.scan(self, rel_path, options)
+        else
+          change = File.change(record, rel_path)
+          return if !change || options[:silence]
+          config.queue(:file, change, watched_dir, rel_path)
+        end
+      end
+    rescue RuntimeError => ex
+      msg = format(
+        '%s#%s crashed %s:%s',
+        self.class,
+        __method__,
+        exinspect,
+        ex.backtrace * "\n")
+      Listen::Logger.error(msg)
+      raise
+    end
+
+    private
+
+    attr_reader :config
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/cli.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/cli.rb
new file mode 100644
index 0000000..851f063
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/cli.rb
@@ -0,0 +1,65 @@
+require 'thor'
+require 'listen'
+require 'logger'
+
+module Listen
+  class CLI < Thor
+    default_task :start
+
+    desc 'start', 'Starts Listen'
+
+    class_option :verbose,
+                 type:    :boolean,
+                 default: false,
+                 aliases: '-v',
+                 banner:  'Verbose'
+
+    class_option :directory,
+                 type:    :array,
+                 default: '.',
+                 aliases: '-d',
+                 banner:  'The directory to listen to'
+
+    class_option :relative,
+                 type:    :boolean,
+                 default: false,
+                 aliases: '-r',
+                 banner:  'Convert paths relative to current directory'
+
+    def start
+      Listen::Forwarder.new(options).start
+    end
+  end
+
+  class Forwarder
+    attr_reader :logger
+    def initialize(options)
+      @options = options
+      @logger = ::Logger.new(STDOUT)
+      @logger.level = ::Logger::INFO
+      @logger.formatter = proc { |_, _, _, msg| "#{msg}\n" }
+    end
+
+    def start
+      logger.info 'Starting listen...'
+      directory = @options[:directory]
+      relative = @options[:relative]
+      callback = proc do |modified, added, removed|
+        if @options[:verbose]
+          logger.info "+ #{added}" unless added.empty?
+          logger.info "- #{removed}" unless removed.empty?
+          logger.info "> #{modified}" unless modified.empty?
+        end
+      end
+
+      listener = Listen.to(
+        directory,
+        relative: relative,
+        &callback)
+
+      listener.start
+
+      sleep 0.5 while listener.processing?
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/directory.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/directory.rb
new file mode 100644
index 0000000..9f9ecaa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/directory.rb
@@ -0,0 +1,87 @@
+require 'set'
+
+module Listen
+  # TODO: refactor (turn it into a normal object, cache the stat, etc)
+  class Directory
+    def self.scan(snapshot, rel_path, options)
+      record = snapshot.record
+      dir = Pathname.new(record.root)
+      previous = record.dir_entries(rel_path)
+
+      record.add_dir(rel_path)
+
+      # TODO: use children(with_directory: false)
+      path = dir + rel_path
+      current = Set.new(_children(path))
+
+      Listen::Logger.debug do
+        format('%s: %s(%s): %s -> %s',
+               (options[:silence] ? 'Recording' : 'Scanning'),
+               rel_path, options.inspect, previous.inspect, current.inspect)
+      end
+
+      begin
+        current.each do |full_path|
+          type = ::File.lstat(full_path.to_s).directory? ? :dir : :file
+          item_rel_path = full_path.relative_path_from(dir).to_s
+          _change(snapshot, type, item_rel_path, options)
+        end
+      rescue Errno::ENOENT
+        # The directory changed meanwhile, so rescan it
+        current = Set.new(_children(path))
+        retry
+      end
+
+      # TODO: this is not tested properly
+      previous = previous.reject { |entry, _| current.include? path + entry }
+
+      _async_changes(snapshot, Pathname.new(rel_path), previous, options)
+
+    rescue Errno::ENOENT, Errno::EHOSTDOWN
+      record.unset_path(rel_path)
+      _async_changes(snapshot, Pathname.new(rel_path), previous, options)
+
+    rescue Errno::ENOTDIR
+      # TODO: path not tested
+      record.unset_path(rel_path)
+      _async_changes(snapshot, path, previous, options)
+      _change(snapshot, :file, rel_path, options)
+    rescue
+      Listen::Logger.warn do
+        format('scan DIED: %s:%s', $ERROR_INFO, $ERROR_POSITION * "\n")
+      end
+      raise
+    end
+
+    def self._async_changes(snapshot, path, previous, options)
+      fail "Not a Pathname: #{path.inspect}" unless path.respond_to?(:children)
+      previous.each do |entry, data|
+        # TODO: this is a hack with insufficient testing
+        type = data.key?(:mtime) ? :file : :dir
+        rel_path_s = (path + entry).to_s
+        _change(snapshot, type, rel_path_s, options)
+      end
+    end
+
+    def self._change(snapshot, type, path, options)
+      return snapshot.invalidate(type, path, options) if type == :dir
+
+      # Minor param cleanup for tests
+      # TODO: use a dedicated Event class
+      opts = options.dup
+      opts.delete(:recursive)
+      snapshot.invalidate(type, path, opts)
+    end
+
+    def self._children(path)
+      return path.children unless RUBY_ENGINE == 'jruby'
+
+      # JRuby inconsistency workaround, see:
+      # https://github.com/jruby/jruby/issues/3840
+      exists = path.exist?
+      directory = path.directory?
+      return path.children unless (exists && !directory)
+      raise Errno::ENOTDIR, path.to_s
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/config.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/config.rb
new file mode 100644
index 0000000..ee13bd6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/config.rb
@@ -0,0 +1,59 @@
+module Listen
+  module Event
+    class Config
+      def initialize(
+        listener,
+        event_queue,
+        queue_optimizer,
+        wait_for_delay,
+        &block)
+
+        @listener = listener
+        @event_queue = event_queue
+        @queue_optimizer = queue_optimizer
+        @min_delay_between_events = wait_for_delay
+        @block = block
+      end
+
+      def sleep(*args)
+        Kernel.sleep(*args)
+      end
+
+      def call(*args)
+        @block.call(*args) if @block
+      end
+
+      def timestamp
+        Time.now.to_f
+      end
+
+      def event_queue
+        @event_queue
+      end
+
+      def callable?
+        @block
+      end
+
+      def optimize_changes(changes)
+        @queue_optimizer.smoosh_changes(changes)
+      end
+
+      def min_delay_between_events
+        @min_delay_between_events
+      end
+
+      def stopped?
+        listener.state == :stopped
+      end
+
+      def paused?
+        listener.state == :paused
+      end
+
+      private
+
+      attr_reader :listener
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/loop.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/loop.rb
new file mode 100644
index 0000000..008dbfb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/loop.rb
@@ -0,0 +1,117 @@
+require 'thread'
+
+require 'timeout'
+require 'listen/event/processor'
+
+module Listen
+  module Event
+    class Loop
+      class Error < RuntimeError
+        class NotStarted < Error
+        end
+      end
+
+      def initialize(config)
+        @config = config
+        @wait_thread = nil
+        @state = :paused
+        @reasons = ::Queue.new
+      end
+
+      def wakeup_on_event
+        return if stopped?
+        return unless processing?
+        return unless wait_thread.alive?
+        _wakeup(:event)
+      end
+
+      def paused?
+        wait_thread && state == :paused
+      end
+
+      def processing?
+        return false if stopped?
+        return false if paused?
+        state == :processing
+      end
+
+      def setup
+        # TODO: use a Fiber instead?
+        q = ::Queue.new
+        @wait_thread = Internals::ThreadPool.add do
+          _wait_for_changes(q, config)
+        end
+
+        Listen::Logger.debug('Waiting for processing to start...')
+        Timeout.timeout(5) { q.pop }
+      end
+
+      def resume
+        fail Error::NotStarted if stopped?
+        return unless wait_thread
+        _wakeup(:resume)
+      end
+
+      def pause
+        # TODO: works?
+        # fail NotImplementedError
+      end
+
+      def teardown
+        return unless wait_thread
+        if wait_thread.alive?
+          _wakeup(:teardown)
+          wait_thread.join
+        end
+        @wait_thread = nil
+      end
+
+      def stopped?
+        !wait_thread
+      end
+
+      private
+
+      attr_reader :config
+      attr_reader :wait_thread
+
+      attr_accessor :state
+
+      def _wait_for_changes(ready_queue, config)
+        processor = Event::Processor.new(config, @reasons)
+
+        _wait_until_resumed(ready_queue)
+        processor.loop_for(config.min_delay_between_events)
+      rescue StandardError => ex
+        _nice_error(ex)
+      end
+
+      def _sleep(*args)
+        Kernel.sleep(*args)
+      end
+
+      def _wait_until_resumed(ready_queue)
+        self.state = :paused
+        ready_queue << :ready
+        sleep
+        self.state = :processing
+      end
+
+      def _nice_error(ex)
+        indent = "\n -- "
+        msg = format(
+          'exception while processing events: %s Backtrace:%s%s',
+          ex,
+          indent,
+          ex.backtrace * indent
+        )
+        Listen::Logger.error(msg)
+      end
+
+      def _wakeup(reason)
+        @reasons << reason
+        wait_thread.wakeup
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/processor.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/processor.rb
new file mode 100644
index 0000000..ab492e7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/processor.rb
@@ -0,0 +1,122 @@
+module Listen
+  module Event
+    class Processor
+      def initialize(config, reasons)
+        @config = config
+        @reasons = reasons
+        _reset_no_unprocessed_events
+      end
+
+      # TODO: implement this properly instead of checking the state at arbitrary
+      # points in time
+      def loop_for(latency)
+        @latency = latency
+
+        loop do
+          _wait_until_events
+          _wait_until_events_calm_down
+          _wait_until_no_longer_paused
+          _process_changes
+        end
+      rescue Stopped
+        Listen::Logger.debug('Processing stopped')
+      end
+
+      private
+
+      class Stopped < RuntimeError
+      end
+
+      def _wait_until_events_calm_down
+        loop do
+          now = _timestamp
+
+          # Assure there's at least latency between callbacks to allow
+          # for accumulating changes
+          diff = _deadline - now
+          break if diff <= 0
+
+          # give events a bit of time to accumulate so they can be
+          # compressed/optimized
+          _sleep(:waiting_until_latency, diff)
+        end
+      end
+
+      def _wait_until_no_longer_paused
+        # TODO: may not be a good idea?
+        _sleep(:waiting_for_unpause) while config.paused?
+      end
+
+      def _check_stopped
+        return unless config.stopped?
+
+        _flush_wakeup_reasons
+        raise Stopped
+      end
+
+      def _sleep(_local_reason, *args)
+        _check_stopped
+        sleep_duration = config.sleep(*args)
+        _check_stopped
+
+        _flush_wakeup_reasons do |reason|
+          next unless reason == :event
+          _remember_time_of_first_unprocessed_event unless config.paused?
+        end
+
+        sleep_duration
+      end
+
+      def _remember_time_of_first_unprocessed_event
+        @first_unprocessed_event_time ||= _timestamp
+      end
+
+      def _reset_no_unprocessed_events
+        @first_unprocessed_event_time = nil
+      end
+
+      def _deadline
+        @first_unprocessed_event_time + @latency
+      end
+
+      def _wait_until_events
+        # TODO: long sleep may not be a good idea?
+        _sleep(:waiting_for_events) while config.event_queue.empty?
+        @first_unprocessed_event_time ||= _timestamp
+      end
+
+      def _flush_wakeup_reasons
+        reasons = @reasons
+        until reasons.empty?
+          reason = reasons.pop
+          yield reason if block_given?
+        end
+      end
+
+      def _timestamp
+        config.timestamp
+      end
+
+      # for easier testing without sleep loop
+      def _process_changes
+        _reset_no_unprocessed_events
+
+        changes = []
+        changes << config.event_queue.pop until config.event_queue.empty?
+
+        callable = config.callable?
+        return unless callable
+
+        hash = config.optimize_changes(changes)
+        result = [hash[:modified], hash[:added], hash[:removed]]
+        return if result.all?(&:empty?)
+
+        block_start = _timestamp
+        config.call(*result)
+        Listen::Logger.debug "Callback took #{_timestamp - block_start} sec"
+      end
+
+      attr_reader :config
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/queue.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/queue.rb
new file mode 100644
index 0000000..a650720
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/event/queue.rb
@@ -0,0 +1,58 @@
+require 'thread'
+
+require 'forwardable'
+
+module Listen
+  module Event
+    class Queue
+      class Config
+        def initialize(relative)
+          @relative = relative
+        end
+
+        def relative?
+          @relative
+        end
+      end
+
+      def initialize(config, &block)
+        @event_queue = ::Queue.new
+        @block = block
+        @config = config
+      end
+
+      def <<(args)
+        type, change, dir, path, options = *args
+        fail "Invalid type: #{type.inspect}" unless [:dir, :file].include? type
+        fail "Invalid change: #{change.inspect}" unless change.is_a?(Symbol)
+        fail "Invalid path: #{path.inspect}" unless path.is_a?(String)
+
+        dir = _safe_relative_from_cwd(dir)
+        event_queue.public_send(:<<, [type, change, dir, path, options])
+
+        block.call(args) if block
+      end
+
+      def empty?
+        event_queue.empty?
+      end
+
+      def pop
+        event_queue.pop
+      end
+
+      private
+
+      attr_reader :event_queue
+      attr_reader :block
+      attr_reader :config
+
+      def _safe_relative_from_cwd(dir)
+        return dir unless config.relative?
+        dir.relative_path_from(Pathname.pwd)
+      rescue ArgumentError
+        dir
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/file.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/file.rb
new file mode 100644
index 0000000..d5dbc93
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/file.rb
@@ -0,0 +1,80 @@
+require 'digest/md5'
+
+module Listen
+  class File
+    def self.change(record, rel_path)
+      path = Pathname.new(record.root) + rel_path
+      lstat = path.lstat
+
+      data = { mtime: lstat.mtime.to_f, mode: lstat.mode }
+
+      record_data = record.file_data(rel_path)
+
+      if record_data.empty?
+        record.update_file(rel_path, data)
+        return :added
+      end
+
+      if data[:mode] != record_data[:mode]
+        record.update_file(rel_path, data)
+        return :modified
+      end
+
+      if data[:mtime] != record_data[:mtime]
+        record.update_file(rel_path, data)
+        return :modified
+      end
+
+      return if /1|true/ =~ ENV['LISTEN_GEM_DISABLE_HASHING']
+      return unless self.inaccurate_mac_time?(lstat)
+
+      # Check if change happened within 1 second (maybe it's even
+      # too much, e.g. 0.3-0.5 could be sufficient).
+      #
+      # With rb-fsevent, there's a (configurable) latency between
+      # when file was changed and when the event was triggered.
+      #
+      # If a file is saved at ???14.998, by the time the event is
+      # actually received by Listen, the time could already be e.g.
+      # ???15.7.
+      #
+      # And since Darwin adapter uses directory scanning, the file
+      # mtime may be the same (e.g. file was changed at ???14.001,
+      # then at ???14.998, but the fstat time would be ???14.0 in
+      # both cases).
+      #
+      # If change happend at ???14.999997, the mtime is 14.0, so for
+      # an mtime=???14.0 we assume it could even be almost ???15.0
+      #
+      # So if Time.now.to_f is ???15.999998 and stat reports mtime
+      # at ???14.0, then event was due to that file'd change when:
+      #
+      # ???15.999997 - ???14.999998 < 1.0s
+      #
+      # So the "2" is "1 + 1" (1s to cover rb-fsevent latency +
+      # 1s maximum difference between real mtime and that recorded
+      # in the file system)
+      #
+      return if data[:mtime].to_i + 2 <= Time.now.to_f
+
+      md5 = Digest::MD5.file(path).digest
+      record.update_file(rel_path, data.merge(md5: md5))
+      :modified if record_data[:md5] && md5 != record_data[:md5]
+    rescue SystemCallError
+      record.unset_path(rel_path)
+      :removed
+    rescue
+      Listen::Logger.debug "lstat failed for: #{rel_path} (#{$ERROR_INFO})"
+      raise
+    end
+
+    def self.inaccurate_mac_time?(stat)
+      # 'mac' means Modified/Accessed/Created
+
+      # Since precision depends on mounted FS (e.g. you can have a FAT partiion
+      # mounted on Linux), check for fields with a remainder to detect this
+
+      [stat.mtime, stat.ctime, stat.atime].map(&:usec).all?(&:zero?)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/fsm.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/fsm.rb
new file mode 100644
index 0000000..88946f2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/fsm.rb
@@ -0,0 +1,131 @@
+# Code copied from https://github.com/celluloid/celluloid-fsm
+module Listen
+  module FSM
+    DEFAULT_STATE = :default # Default state name unless one is explicitly set
+
+    # Included hook to extend class methods
+    def self.included(klass)
+      klass.send :extend, ClassMethods
+    end
+
+    module ClassMethods
+      # Obtain or set the default state
+      # Passing a state name sets the default state
+      def default_state(new_default = nil)
+        if new_default
+          @default_state = new_default.to_sym
+        else
+          defined?(@default_state) ? @default_state : DEFAULT_STATE
+        end
+      end
+
+      # Obtain the valid states for this FSM
+      def states
+        @states ||= {}
+      end
+
+      # Declare an FSM state and optionally provide a callback block to fire
+      # Options:
+      # * to: a state or array of states this state can transition to
+      def state(*args, &block)
+        if args.last.is_a? Hash
+          # Stringify keys :/
+          options = args.pop.each_with_object({}) { |(k, v), h| h[k.to_s] = v }
+        else
+          options = {}
+        end
+
+        args.each do |name|
+          name = name.to_sym
+          default_state name if options['default']
+          states[name] = State.new(name, options['to'], &block)
+        end
+      end
+    end
+
+    # Be kind and call super if you must redefine initialize
+    def initialize
+      @state = self.class.default_state
+    end
+
+    # Obtain the current state of the FSM
+    attr_reader :state
+
+    def transition(state_name)
+      new_state = validate_and_sanitize_new_state(state_name)
+      return unless new_state
+      transition_with_callbacks!(new_state)
+    end
+
+    # Immediate state transition with no checks, or callbacks. "Dangerous!"
+    def transition!(state_name)
+      @state = state_name
+    end
+
+    protected
+
+    def validate_and_sanitize_new_state(state_name)
+      state_name = state_name.to_sym
+
+      return if current_state_name == state_name
+
+      if current_state && !current_state.valid_transition?(state_name)
+        valid = current_state.transitions.map(&:to_s).join(', ')
+        msg = "#{self.class} can't change state from '#{@state}'"\
+          " to '#{state_name}', only to: #{valid}"
+        fail ArgumentError, msg
+      end
+
+      new_state = states[state_name]
+
+      unless new_state
+        return if state_name == default_state
+        fail ArgumentError, "invalid state for #{self.class}: #{state_name}"
+      end
+
+      new_state
+    end
+
+    def transition_with_callbacks!(state_name)
+      transition! state_name.name
+      state_name.call(self)
+    end
+
+    def states
+      self.class.states
+    end
+
+    def default_state
+      self.class.default_state
+    end
+
+    def current_state
+      states[@state]
+    end
+
+    def current_state_name
+      current_state && current_state.name || ''
+    end
+
+    class State
+      attr_reader :name, :transitions
+
+      def initialize(name, transitions = nil, &block)
+        @name, @block = name, block
+        @transitions = nil
+        @transitions = Array(transitions).map(&:to_sym) if transitions
+      end
+
+      def call(obj)
+        obj.instance_eval(&@block) if @block
+      end
+
+      def valid_transition?(new_state)
+        # All transitions are allowed unless expressly
+        return true unless @transitions
+
+        @transitions.include? new_state.to_sym
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/internals/thread_pool.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/internals/thread_pool.rb
new file mode 100644
index 0000000..e112d90
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/internals/thread_pool.rb
@@ -0,0 +1,29 @@
+module Listen
+  # @private api
+  module Internals
+    module ThreadPool
+      def self.add(&block)
+        Thread.new { block.call }.tap do |th|
+          (@threads ||= Queue.new) << th
+        end
+      end
+
+      def self.stop
+        return unless @threads ||= nil
+        return if @threads.empty? # return to avoid using possibly stubbed Queue
+
+        killed = Queue.new
+        # You can't kill a read on a descriptor in JRuby, so let's just
+        # ignore running threads (listen rb-inotify waiting for disk activity
+        # before closing)  pray threads die faster than they are created...
+        limit = RUBY_ENGINE == 'jruby' ? [1] : []
+
+        killed << @threads.pop.kill until @threads.empty?
+        until killed.empty?
+          th = killed.pop
+          th.join(*limit) unless th[:listen_blocking_read_thread]
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/listener.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/listener.rb
new file mode 100644
index 0000000..80e6152
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/listener.rb
@@ -0,0 +1,132 @@
+require 'English'
+
+require 'listen/version'
+
+require 'listen/backend'
+
+require 'listen/silencer'
+require 'listen/silencer/controller'
+
+require 'listen/queue_optimizer'
+
+require 'listen/fsm'
+
+require 'listen/event/loop'
+require 'listen/event/queue'
+require 'listen/event/config'
+
+require 'listen/listener/config'
+
+module Listen
+  class Listener
+    include Listen::FSM
+
+    # Initializes the directories listener.
+    #
+    # @param [String] directory the directories to listen to
+    # @param [Hash] options the listen options (see Listen::Listener::Options)
+    #
+    # @yield [modified, added, removed] the changed files
+    # @yieldparam [Array<String>] modified the list of modified files
+    # @yieldparam [Array<String>] added the list of added files
+    # @yieldparam [Array<String>] removed the list of removed files
+    #
+    def initialize(*dirs, &block)
+      options = dirs.last.is_a?(Hash) ? dirs.pop : {}
+
+      @config = Config.new(options)
+
+      eq_config = Event::Queue::Config.new(@config.relative?)
+      queue = Event::Queue.new(eq_config) { @processor.wakeup_on_event }
+
+      silencer = Silencer.new
+      rules = @config.silencer_rules
+      @silencer_controller = Silencer::Controller.new(silencer, rules)
+
+      @backend = Backend.new(dirs, queue, silencer, @config)
+
+      optimizer_config = QueueOptimizer::Config.new(@backend, silencer)
+
+      pconfig = Event::Config.new(
+        self,
+        queue,
+        QueueOptimizer.new(optimizer_config),
+        @backend.min_delay_between_events,
+        &block)
+
+      @processor = Event::Loop.new(pconfig)
+
+      super() # FSM
+    end
+
+    default_state :initializing
+
+    state :initializing, to: [:backend_started, :stopped]
+
+    state :backend_started, to: [:frontend_ready, :stopped] do
+      backend.start
+    end
+
+    state :frontend_ready, to: [:processing_events, :stopped] do
+      processor.setup
+    end
+
+    state :processing_events, to: [:paused, :stopped] do
+      processor.resume
+    end
+
+    state :paused, to: [:processing_events, :stopped] do
+      processor.pause
+    end
+
+    state :stopped, to: [:backend_started] do
+      backend.stop # should be before processor.teardown to halt events ASAP
+      processor.teardown
+    end
+
+    # Starts processing events and starts adapters
+    # or resumes invoking callbacks if paused
+    def start
+      transition :backend_started if state == :initializing
+      transition :frontend_ready if state == :backend_started
+      transition :processing_events if state == :frontend_ready
+      transition :processing_events if state == :paused
+    end
+
+    # Stops both listening for events and processing them
+    def stop
+      transition :stopped
+    end
+
+    # Stops invoking callbacks (messages pile up)
+    def pause
+      transition :paused
+    end
+
+    # processing means callbacks are called
+    def processing?
+      state == :processing_events
+    end
+
+    def paused?
+      state == :paused
+    end
+
+    def ignore(regexps)
+      @silencer_controller.append_ignores(regexps)
+    end
+
+    def ignore!(regexps)
+      @silencer_controller.replace_with_bang_ignores(regexps)
+    end
+
+    def only(regexps)
+      @silencer_controller.replace_with_only(regexps)
+    end
+
+    private
+
+    attr_reader :processor
+    attr_reader :backend
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/listener/config.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/listener/config.rb
new file mode 100644
index 0000000..8db77a4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/listener/config.rb
@@ -0,0 +1,45 @@
+module Listen
+  class Listener
+    class Config
+      DEFAULTS = {
+        # Listener options
+        debug: false, # TODO: is this broken?
+        wait_for_delay: nil, # NOTE: should be provided by adapter if possible
+        relative: false,
+
+        # Backend selecting options
+        force_polling: false,
+        polling_fallback_message: nil
+      }
+
+      def initialize(opts)
+        @options = DEFAULTS.merge(opts)
+        @relative = @options[:relative]
+        @min_delay_between_events = @options[:wait_for_delay]
+        @silencer_rules = @options # silencer will extract what it needs
+      end
+
+      def relative?
+        @relative
+      end
+
+      def min_delay_between_events
+        @min_delay_between_events
+      end
+
+      def silencer_rules
+        @silencer_rules
+      end
+
+      def adapter_instance_options(klass)
+        valid_keys = klass.const_get('DEFAULTS').keys
+        Hash[@options.select { |key, _| valid_keys.include?(key) }]
+      end
+
+      def adapter_select_options
+        valid_keys = %w(force_polling polling_fallback_message).map(&:to_sym)
+        Hash[@options.select { |key, _| valid_keys.include?(key) }]
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/logger.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/logger.rb
new file mode 100644
index 0000000..b0e6333
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/logger.rb
@@ -0,0 +1,32 @@
+module Listen
+  def self.logger
+    @logger ||= nil
+  end
+
+  def self.logger=(logger)
+    @logger = logger
+  end
+
+  def self.setup_default_logger_if_unset
+    self.logger ||= ::Logger.new(STDERR).tap do |logger|
+      debugging = ENV['LISTEN_GEM_DEBUGGING']
+      logger.level =
+        case debugging.to_s
+        when /2/
+          ::Logger::DEBUG
+        when /true|yes|1/i
+          ::Logger::INFO
+        else
+          ::Logger::ERROR
+        end
+    end
+  end
+
+  class Logger
+    [:fatal, :error, :warn, :info, :debug].each do |meth|
+      define_singleton_method(meth) do |*args, &block|
+        Listen.logger.public_send(meth, *args, &block) if Listen.logger
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/options.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/options.rb
new file mode 100644
index 0000000..7ae36a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/options.rb
@@ -0,0 +1,23 @@
+module Listen
+  class Options
+    def initialize(opts, defaults)
+      @options = {}
+      given_options = opts.dup
+      defaults.keys.each do |key|
+        @options[key] = given_options.delete(key) || defaults[key]
+      end
+
+      return if given_options.empty?
+
+      msg = "Unknown options: #{given_options.inspect}"
+      Listen::Logger.warn msg
+      fail msg
+    end
+
+    def method_missing(name, *_)
+      return @options[name] if @options.key?(name)
+      msg = "Bad option: #{name.inspect} (valid:#{@options.keys.inspect})"
+      fail NameError, msg
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/queue_optimizer.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/queue_optimizer.rb
new file mode 100644
index 0000000..4fc7b89
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/queue_optimizer.rb
@@ -0,0 +1,132 @@
+module Listen
+  class QueueOptimizer
+    class Config
+      def initialize(adapter_class, silencer)
+        @adapter_class = adapter_class
+        @silencer = silencer
+      end
+
+      def exist?(path)
+        Pathname(path).exist?
+      end
+
+      def silenced?(path, type)
+        @silencer.silenced?(path, type)
+      end
+
+      def debug(*args, &block)
+        Listen.logger.debug(*args, &block)
+      end
+    end
+
+    def smoosh_changes(changes)
+      # TODO: adapter could be nil at this point (shutdown)
+      cookies = changes.group_by do |_, _, _, _, options|
+        (options || {})[:cookie]
+      end
+      _squash_changes(_reinterpret_related_changes(cookies))
+    end
+
+    def initialize(config)
+      @config = config
+    end
+
+    private
+
+    attr_reader :config
+
+    # groups changes into the expected structure expected by
+    # clients
+    def _squash_changes(changes)
+      # We combine here for backward compatibility
+      # Newer clients should receive dir and path separately
+      changes = changes.map { |change, dir, path| [change, dir + path] }
+
+      actions = changes.group_by(&:last).map do |path, action_list|
+        [_logical_action_for(path, action_list.map(&:first)), path.to_s]
+      end
+
+      config.debug("listen: raw changes: #{actions.inspect}")
+
+      { modified: [], added: [], removed: [] }.tap do |squashed|
+        actions.each do |type, path|
+          squashed[type] << path unless type.nil?
+        end
+        config.debug("listen: final changes: #{squashed.inspect}")
+      end
+    end
+
+    def _logical_action_for(path, actions)
+      actions << :added if actions.delete(:moved_to)
+      actions << :removed if actions.delete(:moved_from)
+
+      modified = actions.detect { |x| x == :modified }
+      _calculate_add_remove_difference(actions, path, modified)
+    end
+
+    def _calculate_add_remove_difference(actions, path, default_if_exists)
+      added = actions.count { |x| x == :added }
+      removed = actions.count { |x| x == :removed }
+      diff = added - removed
+
+      # TODO: avoid checking if path exists and instead assume the events are
+      # in order (if last is :removed, it doesn't exist, etc.)
+      if config.exist?(path)
+        if diff > 0
+          :added
+        elsif diff.zero? && added > 0
+          :modified
+        else
+          default_if_exists
+        end
+      else
+        diff < 0 ? :removed : nil
+      end
+    end
+
+    # remove extraneous rb-inotify events, keeping them only if it's a possible
+    # editor rename() call (e.g. Kate and Sublime)
+    def _reinterpret_related_changes(cookies)
+      table = { moved_to: :added, moved_from: :removed }
+      cookies.map do |_, changes|
+        data = _detect_possible_editor_save(changes)
+        if data
+          to_dir, to_file = data
+          [[:modified, to_dir, to_file]]
+        else
+          not_silenced = changes.reject do |type, _, _, path, _|
+            config.silenced?(Pathname(path), type)
+          end
+          not_silenced.map do |_, change, dir, path, _|
+            [table.fetch(change, change), dir, path]
+          end
+        end
+      end.flatten(1)
+    end
+
+    def _detect_possible_editor_save(changes)
+      return unless changes.size == 2
+
+      from_type = from_change = from = nil
+      to_type = to_change = to_dir = to = nil
+
+      changes.each do |data|
+        case data[1]
+        when :moved_from
+          from_type, from_change, _, from, _ = data
+        when :moved_to
+          to_type, to_change, to_dir, to, _ = data
+        else
+          return nil
+        end
+      end
+
+      return unless from && to
+
+      # Expect an ignored moved_from and non-ignored moved_to
+      # to qualify as an "editor modify"
+      return unless config.silenced?(Pathname(from), from_type)
+      config.silenced?(Pathname(to), to_type) ? nil : [to_dir, to]
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/record.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/record.rb
new file mode 100644
index 0000000..70e3797
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/record.rb
@@ -0,0 +1,120 @@
+require 'thread'
+require 'listen/record/entry'
+require 'listen/record/symlink_detector'
+
+module Listen
+  class Record
+    # TODO: one Record object per watched directory?
+    # TODO: deprecate
+
+    attr_reader :root
+    def initialize(directory)
+      @tree = _auto_hash
+      @root = directory.to_s
+    end
+
+    def add_dir(rel_path)
+      return if [nil, '', '.'].include? rel_path
+      @tree[rel_path] ||= {}
+    end
+
+    def update_file(rel_path, data)
+      dirname, basename = Pathname(rel_path).split.map(&:to_s)
+      _fast_update_file(dirname, basename, data)
+    end
+
+    def unset_path(rel_path)
+      dirname, basename = Pathname(rel_path).split.map(&:to_s)
+      _fast_unset_path(dirname, basename)
+    end
+
+    def file_data(rel_path)
+      dirname, basename = Pathname(rel_path).split.map(&:to_s)
+      if [nil, '', '.'].include? dirname
+        tree[basename] ||= {}
+        tree[basename].dup
+      else
+        tree[dirname] ||= {}
+        tree[dirname][basename] ||= {}
+        tree[dirname][basename].dup
+      end
+    end
+
+    def dir_entries(rel_path)
+      subtree =
+        if [nil, '', '.'].include? rel_path.to_s
+          tree
+        else
+          tree[rel_path.to_s] ||= _auto_hash
+          tree[rel_path.to_s]
+        end
+
+      result = {}
+      subtree.each do |key, values|
+        # only get data for file entries
+        result[key] = values.key?(:mtime) ? values : {}
+      end
+      result
+    end
+
+    def build
+      @tree = _auto_hash
+      # TODO: test with a file name given
+      # TODO: test other permissions
+      # TODO: test with mixed encoding
+      symlink_detector = SymlinkDetector.new
+      remaining = ::Queue.new
+      remaining << Entry.new(root, nil, nil)
+      _fast_build_dir(remaining, symlink_detector) until remaining.empty?
+    end
+
+    private
+
+    def _auto_hash
+      Hash.new { |h, k| h[k] = Hash.new }
+    end
+
+    def tree
+      @tree
+    end
+
+    def _fast_update_file(dirname, basename, data)
+      if [nil, '', '.'].include? dirname
+        tree[basename] = (tree[basename] || {}).merge(data)
+      else
+        tree[dirname] ||= {}
+        tree[dirname][basename] = (tree[dirname][basename] || {}).merge(data)
+      end
+    end
+
+    def _fast_unset_path(dirname, basename)
+      # this may need to be reworked to properly remove
+      # entries from a tree, without adding non-existing dirs to the record
+      if [nil, '', '.'].include? dirname
+        return unless tree.key?(basename)
+        tree.delete(basename)
+      else
+        return unless tree.key?(dirname)
+        tree[dirname].delete(basename)
+      end
+    end
+
+    def _fast_build_dir(remaining, symlink_detector)
+      entry = remaining.pop
+      children = entry.children # NOTE: children() implicitly tests if dir
+      symlink_detector.verify_unwatched!(entry)
+      children.each { |child| remaining << child }
+      add_dir(entry.record_dir_key)
+    rescue Errno::ENOTDIR
+      _fast_try_file(entry)
+    rescue SystemCallError, SymlinkDetector::Error
+      _fast_unset_path(entry.relative, entry.name)
+    end
+
+    def _fast_try_file(entry)
+      _fast_update_file(entry.relative, entry.name, entry.meta)
+    rescue SystemCallError
+      _fast_unset_path(entry.relative, entry.name)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/record/entry.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/record/entry.rb
new file mode 100644
index 0000000..de37b9a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/record/entry.rb
@@ -0,0 +1,62 @@
+module Listen
+  # @private api
+  class Record
+    # Represents a directory entry (dir or file)
+    class Entry
+      # file: "/home/me/watched_dir", "app/models", "foo.rb"
+      # dir, "/home/me/watched_dir", "."
+      def initialize(root, relative, name = nil)
+        @root, @relative, @name = root, relative, name
+      end
+
+      attr_reader :root, :relative, :name
+
+      def children
+        child_relative = _join
+        (_entries(sys_path) - %w(. ..)).map do |name|
+          Entry.new(@root, child_relative, name)
+        end
+      end
+
+      def meta
+        lstat = ::File.lstat(sys_path)
+        { mtime: lstat.mtime.to_f, mode: lstat.mode }
+      end
+
+      # record hash is e.g.
+      # if @record["/home/me/watched_dir"]["project/app/models"]["foo.rb"]
+      # if @record["/home/me/watched_dir"]["project/app"]["models"]
+      # record_dir_key is "project/app/models"
+      def record_dir_key
+        ::File.join(*[@relative, @name].compact)
+      end
+
+      def sys_path
+        # Use full path in case someone uses chdir
+        ::File.join(*[@root, @relative, @name].compact)
+      end
+
+      def real_path
+        @real_path ||= ::File.realpath(sys_path)
+      end
+
+      private
+
+      def _join
+        args = [@relative, @name].compact
+        args.empty? ? nil : ::File.join(*args)
+      end
+
+      def _entries(dir)
+        return Dir.entries(dir) unless RUBY_ENGINE == 'jruby'
+
+        # JRuby inconsistency workaround, see:
+        # https://github.com/jruby/jruby/issues/3840
+        exists = ::File.exist?(dir)
+        directory = ::File.directory?(dir)
+        return Dir.entries(dir) unless (exists && !directory)
+        raise Errno::ENOTDIR, dir
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/record/symlink_detector.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/record/symlink_detector.rb
new file mode 100644
index 0000000..e021a1a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/record/symlink_detector.rb
@@ -0,0 +1,39 @@
+require 'set'
+
+module Listen
+  # @private api
+  class Record
+    class SymlinkDetector
+      WIKI = 'https://github.com/guard/listen/wiki/Duplicate-directory-errors'
+
+      SYMLINK_LOOP_ERROR = <<-EOS
+        ** ERROR: directory is already being watched! **
+
+        Directory: %s
+
+        is already being watched through: %s
+
+        MORE INFO: #{WIKI}
+      EOS
+
+      class Error < RuntimeError
+      end
+
+      def initialize
+        @real_dirs = Set.new
+      end
+
+      def verify_unwatched!(entry)
+        real_path = entry.real_path
+        @real_dirs.add?(real_path) || _fail(entry.sys_path, real_path)
+      end
+
+      private
+
+      def _fail(symlinked, real_path)
+        STDERR.puts format(SYMLINK_LOOP_ERROR, symlinked, real_path)
+        fail Error, 'Failed due to looped symlinks'
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/silencer.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/silencer.rb
new file mode 100644
index 0000000..3c9f84b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/silencer.rb
@@ -0,0 +1,97 @@
+module Listen
+  class Silencer
+    # The default list of directories that get ignored.
+    DEFAULT_IGNORED_DIRECTORIES = %r{^(?:
+      \.git
+      | \.svn
+      | \.hg
+      | \.rbx
+      | \.bundle
+      | bundle
+      | vendor/bundle
+      | log
+      | tmp
+      |vendor/ruby
+    )(/|$)}x
+
+    # The default list of files that get ignored.
+    DEFAULT_IGNORED_EXTENSIONS  = /(?:
+      # Kate's tmp\/swp files
+      \..*\d+\.new
+      | \.kate-swp
+
+      # Gedit tmp files
+      | \.goutputstream-.{6}
+
+      # Intellij files
+      | ___jb_bak___
+      | ___jb_old___
+
+      # Vim swap files and write test
+      | \.sw[px]
+      | \.swpx
+      | ^4913
+
+      # Sed temporary files - but without actual words, like 'sedatives'
+      | (?:^
+         sed
+
+         (?:
+          [a-zA-Z0-9]{0}[A-Z]{1}[a-zA-Z0-9]{5} |
+          [a-zA-Z0-9]{1}[A-Z]{1}[a-zA-Z0-9]{4} |
+          [a-zA-Z0-9]{2}[A-Z]{1}[a-zA-Z0-9]{3} |
+          [a-zA-Z0-9]{3}[A-Z]{1}[a-zA-Z0-9]{2} |
+          [a-zA-Z0-9]{4}[A-Z]{1}[a-zA-Z0-9]{1} |
+          [a-zA-Z0-9]{5}[A-Z]{1}[a-zA-Z0-9]{0}
+         )
+        )
+
+      # other files
+      | \.DS_Store
+      | \.tmp
+      | ~
+    )$/x
+
+    attr_accessor :only_patterns, :ignore_patterns
+
+    def initialize
+      configure({})
+    end
+
+    def configure(options)
+      @only_patterns = options[:only] ? Array(options[:only]) : nil
+      @ignore_patterns = _init_ignores(options[:ignore], options[:ignore!])
+    end
+
+    # Note: relative_path is temporarily expected to be a relative Pathname to
+    # make refactoring easier (ideally, it would take a string)
+
+    # TODO: switch type and path places - and verify
+    def silenced?(relative_path, type)
+      path = relative_path.to_s
+
+      if only_patterns && type == :file
+        return true unless only_patterns.any? { |pattern| path =~ pattern }
+      end
+
+      ignore_patterns.any? { |pattern| path =~ pattern }
+    end
+
+    private
+
+    attr_reader :options
+
+    def _init_ignores(ignores, overrides)
+      patterns = []
+      unless overrides
+        patterns << DEFAULT_IGNORED_DIRECTORIES
+        patterns << DEFAULT_IGNORED_EXTENSIONS
+      end
+
+      patterns << ignores
+      patterns << overrides
+
+      patterns.compact.flatten
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/silencer/controller.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/silencer/controller.rb
new file mode 100644
index 0000000..a07e0ae
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/silencer/controller.rb
@@ -0,0 +1,48 @@
+module Listen
+  class Silencer
+    class Controller
+      def initialize(silencer, default_options)
+        @silencer = silencer
+
+        opts = default_options
+
+        @prev_silencer_options = {}
+        rules = [:only, :ignore, :ignore!].map do |option|
+          [option, opts[option]] if opts.key? option
+        end
+
+        _reconfigure_silencer(Hash[rules.compact])
+      end
+
+      def append_ignores(*regexps)
+        prev_ignores = Array(@prev_silencer_options[:ignore])
+        _reconfigure_silencer(ignore: [prev_ignores + regexps])
+      end
+
+      def replace_with_bang_ignores(regexps)
+        _reconfigure_silencer(ignore!: regexps)
+      end
+
+      def replace_with_only(regexps)
+        _reconfigure_silencer(only: regexps)
+      end
+
+      private
+
+      def _reconfigure_silencer(extra_options)
+        opts = extra_options.dup
+        opts = opts.map do |key, value|
+          [key, Array(value).flatten.compact]
+        end
+        opts = Hash[opts]
+
+        if opts.key?(:ignore) && opts[:ignore].empty?
+          opts.delete(:ignore)
+        end
+
+        @prev_silencer_options = opts
+        @silencer.configure(@prev_silencer_options.dup.freeze)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/version.rb b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/version.rb
new file mode 100644
index 0000000..5bcc98e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/listen-3.0.8/lib/listen/version.rb
@@ -0,0 +1,3 @@
+module Listen
+  VERSION = '3.0.8'
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/.gitignore b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/.gitignore
new file mode 100644
index 0000000..d87d4be
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/.gitignore
@@ -0,0 +1,17 @@
+*.gem
+*.rbc
+.bundle
+.config
+.yardoc
+Gemfile.lock
+InstalledFiles
+_yardoc
+coverage
+doc/
+lib/bundler/man
+pkg
+rdoc
+spec/reports
+test/tmp
+test/version_tmp
+tmp
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/.rspec b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/.rspec
new file mode 100644
index 0000000..5f16476
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/.rspec
@@ -0,0 +1,2 @@
+--color
+--format progress
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/.travis.yml b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/.travis.yml
new file mode 100644
index 0000000..d7c261d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/.travis.yml
@@ -0,0 +1,15 @@
+language: ruby
+rvm:
+  - 1.9.3
+  - 2.0.0
+  - 2.1
+sudo: false
+cache: bundler
+before_script: bundle update
+script: "./script/cibuild"
+notifications:
+  email:
+    recipients:
+      - mercenary@jekyllrb.com
+    on_success: change
+    on_failure: change
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/Gemfile b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/Gemfile
new file mode 100644
index 0000000..50c90db
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/Gemfile
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+
+# Specify your gem's dependencies in mercenary.gemspec
+gemspec
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/History.markdown b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/History.markdown
new file mode 100644
index 0000000..360b83f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/History.markdown
@@ -0,0 +1,109 @@
+## 0.3.6 / 2016-04-07
+
+### Bug Fixes
+
+  * Presenter: Options should include those from parent command (#42)
+
+## 0.3.5 / 2014-11-12
+
+### Bug Fixes
+
+  * Capture `OptionsParser::InvalidOption` and show a nice error message (#38)
+  * Absolute paths for requires and autoloads (#39)
+
+### Development Fixes
+
+  * Bump to RSpec 3 (#40)
+
+## 0.3.4 / 2014-07-11
+
+### Bug Fixes
+
+  * Use option object as key in the command's `@map` hash (#35)
+
+## 0.3.3 / 2014-05-07
+
+### Bug Fixes
+
+  * The `--version` flag should not exit with code 1, but instead code 0. (#33)
+
+## 0.3.2 / 2014-03-18
+
+### Bug Fixes
+
+  * Remove duplicate commands from help output; show aliases w/command names (#29)
+
+## 0.3.1 / 2014-02-21
+
+### Minor Enhancements
+
+  * Add `-t/--trace` to list of options in help message (#19)
+
+### Bug Fixes
+
+  * `Mercenary::Option` now accepts return values in the form of Class constants (#22)
+
+## 0.3.0 / 2014-02-20
+
+### Major Enhancements
+
+  * Officially drop 1.8.7 support (#14)
+  * Allow Commands to set their own versions (#17)
+  * Show subcommands, options and usage in help and attach to all commands (#18)
+  * Add `-t, --trace` to allow full exception backtrace to print, otherwise print just the error message (#19)
+
+### Minor Enhancements
+
+  * Logging state is maintained throughout process (#12)
+  * Tidy up Command#logger output (#21)
+
+### Development Fixes
+
+  * Added specs for `Program` (#13)
+
+## 0.2.1 / 2013-12-25
+
+### Bug Fixes
+
+  * Added missing comma to fix '-v' and '--version' options (#9)
+
+## 0.2.0 / 2013-11-30
+
+### Major Enhancements
+
+  * Add `Command#default_command` to specify a default command if none is given by the user at runtime (#7)
+
+### Minor Enhancements
+
+  * Add `Command#execute` to execute the actions of a command (#6)
+
+### Development Fixes
+
+  * Add standard GitHub bootstrap and cibuild scripts to `script/` (#2)
+
+## 0.1.0 / 2013-11-08
+
+### Major Enhancements
+
+  * It works!
+
+### Minor Enhancements
+
+  * Add a logger to `Command`
+  * Add `--version` switch to all programs
+
+### Bug Fixes
+
+  * Fix `Command#syntax` and `Command#description`'s handing of setting vs getting
+  * Fix load path problem in `lib/mercenary.rb`
+
+### Development Fixes
+
+  * Add TomDoc to everything
+  * Add a couple starter specs
+  * Add TravisCI badge
+  * Add Travis configuration
+
+## 0.0.1 / 2013-11-06
+
+  * Birthday!
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/LICENSE.txt b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/LICENSE.txt
new file mode 100644
index 0000000..354c0b2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2013-2014 Parker Moore
+
+MIT License
+
+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/bundle/ruby/2.4.0/gems/mercenary-0.3.6/README.md b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/README.md
new file mode 100644
index 0000000..ed9b1a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/README.md
@@ -0,0 +1,250 @@
+# Mercenary
+
+Lightweight and flexible library for writing command-line apps in Ruby.
+
+[![Build Status](https://secure.travis-ci.org/jekyll/mercenary.png)](https://travis-ci.org/jekyll/mercenary)
+
+## Installation
+
+Add this line to your application's Gemfile:
+
+    gem 'mercenary'
+
+And then execute:
+
+    $ bundle
+
+Or install it yourself as:
+
+    $ gem install mercenary
+
+**Note: Mercenary may not work with Ruby < 1.9.3.**
+
+## Usage
+
+Creating programs and commands with Mercenary is easy:
+
+```ruby
+Mercenary.program(:jekyll) do |p|
+  p.version Jekyll::VERSION
+  p.description 'Jekyll is a blog-aware, static site generator in Ruby'
+  p.syntax "jekyll <subcommand> [options]"
+
+  p.command(:new) do |c|
+    c.syntax "new PATH" # do not include the program name or super commands
+    c.description "Creates a new Jekyll site scaffold in PATH"
+    c.option 'blank', '--blank', 'Initialize the new site without any content.'
+
+    c.action do |args, options|
+      Jekyll::Commands::New.process(args, blank: options['blank'])
+    end
+  end
+
+  p.command(:build) do |c|
+    c.syntax "build [options]"
+    c.description "Builds your Jekyll site"
+
+    c.option 'safe', '--safe', 'Run in safe mode'
+    c.option 'source', '--source DIR', 'From where to collect the source files'
+    c.option 'destination', '--dest DIR', 'To where the compiled files should be written'
+
+    c.action do |_, options|
+      Jekyll::Commands::Build.process(options)
+    end
+  end
+
+  # Bring in command bundled in external gem
+  begin
+    require "jekyll-import"
+    JekyllImport.init_with_program(p)
+  rescue LoadError
+  end
+
+  p.default_command(:build)
+end
+```
+
+All commands have the following default options:
+
+- `-h/--help` - show a help message
+- `-v/--version` - show the program version
+- `-t/--trace` - show the full backtrace when an error occurs
+
+## API
+
+### `Mercenary`
+
+#### `.program`
+
+Creates and executes a program. Accepts two arguments:
+
+- `name` - program name as a Symbol
+- `block` - the specification for the program, passed the program instance as an
+  argument.
+
+Example is above, under the heading [Usage](#usage).
+
+### `Program`
+
+`Program` is a subclass of `Command`, so it has all of the methods documented
+below as well as those for `Command`.
+
+#### `#config`
+
+Fetches the program configuration hash.
+
+### `Command`
+
+#### `#new`
+
+Create a new command. Accepts two arguments:
+
+- `name` - the name of your command, as a symbol
+- `parent` - (optional) the parent Command
+
+#### `#version`
+
+Sets or gets the version of the command. Accepts an optional argument:
+
+- `version` - (optional) the version to set for the command. If present, this
+  becomes the new version for the command and persists.
+
+#### `#syntax`
+
+Sets or gets the syntax of the command. Built on parent syntaxes if a parent
+exists. Accepts one optional argument:
+
+- `syntax` - (optional) the syntax to set for the command. Will inherit from the
+  parent commands or program. Usually in the form of
+  `"command_name <SUBCOMMAND> [OPTIONS]"`
+
+When a parent command exists, say `supercommand`, with syntax set as
+`supercommand <SUBCOMMAND> [OPTIONS]`, the syntax of the command in question
+will be `supercommand command_name <SUBCOMMAND> [OPTIONS]` with both
+`<SUBCOMMAND>` and `[OPTIONS]` stripped out. Any text between `<` and `>` or
+between `[` and `]` will be stripped from parent command syntaxes. The purpose
+of this chaining is to reduce redundancy.
+
+#### `#description`
+
+Sets or gets the description of the command. Accepts one optional argument:
+
+- `desc` - (optional) the description to set for the command. If
+  provided, will override any previous description set for the command.
+
+#### `#default_command`
+
+Sets or gets the default subcommand of the command to execute in the event no
+subcommand is passed during execution. Accepts one optional argument:
+
+- `command_name` - (optional) the `Symbol` name of the subcommand to be
+  executed. Raises an `ArgumentError` if the subcommand doesn't exist.
+  Overwrites previously-set default commands.
+
+#### `#option`
+
+Adds a new option to the command. Accepts many arguments:
+
+- `config_key` - the configuration key that the value of this option maps to.
+- `*options` - all the options, globbed, to be passed to `OptionParser`, namely the
+  switches and the option description. Usually in the format
+  `"-s", "--switch", "Sets the 'switch' flag"`.
+
+Valid option calls:
+
+```ruby
+cmd.option 'config_key', '-c', 'Sets the "config" flag'
+cmd.option 'config_key', '--config', 'Sets the "config" flag'
+cmd.option 'config_key', '-c', '--config', 'Sets the "config" flag.'
+cmd.option 'config_key', '-c FILE', '--config FILE', 'The config file.'
+cmd.option 'config_key', '-c FILE1[,FILE2[,FILE3...]]', '--config FILE1[,FILE2[,FILE3...]]', Array, 'The config files.'
+```
+
+Notice that you can specify either a short switch, a long switch, or both. If
+you want to accept an argument, you have to specify it in the switch strings.
+The class of the argument defaults to `String`, but you can optionally set a
+different class to create, e.g. `Array`, if you are expecting a particular class
+in your code from this option's value. The description is also optional, but
+it's highly recommended to include a description.
+
+#### `#alias` 
+
+Specifies an alias for this command such that the alias may be used in place of
+the command during execution. Accepts one argument:
+
+- `cmd_name` - the alias name for this command as a `Symbol`
+
+Example:
+
+```ruby
+cmd.alias(:my_alias)
+# Now `cmd` is now also executable via "my_alias"
+```
+
+#### `#action`
+
+Specifies a block to be executed in the event the command is specified at
+runtime. The block is given two arguments:
+
+- `args` - the non-switch arguments given from the command-line
+- `options` - the options hash built via the switches passed
+
+**Note that actions are additive**, meaning any new call to `#action` will
+result in another action to be executed at runtime. Actions will be executed in
+the order they are specified in.
+
+Example:
+
+```ruby
+cmd.action do |args, options|
+  # do something!
+end
+```
+
+#### `#logger`
+
+Access the logger for this command. Useful for outputting information to STDOUT.
+Accepts one optional argument:
+
+- `level` - (optional) the severity threshold at which to begin logging. Uses
+  Ruby's built-in
+  [`Logger`](http://www.ruby-doc.org/stdlib-2.1.0/libdoc/logger/rdoc/Logger.html)
+  levels.
+
+Log level defaults to `Logger::INFO`.
+
+Examples:
+
+```ruby
+cmd.logger(Logger::DEBUG)
+cmd.logger.debug "My debug message."
+cmd.logger.info "My informative message."
+cmd.logger.warn "ACHTUNG!!"
+cmd.logger.error "Something terrible has happened."
+cmd.logger.fatal "I can't continue doing what I'm doing."
+```
+
+#### `#command`
+
+Creates a new subcommand for the current command. Accepts two arguments:
+
+- `cmd_name` - the command name, as a Symbol
+- `block` -  the specification of the subcommand in a block
+
+Example:
+
+```ruby
+my_command.command(:my_subcommand) do |subcmd|
+  subcmd.description 'My subcommand'
+  subcmd.syntax 'my_subcommand [OPTIONS]'
+  # ...
+end
+```
+
+## Contributing
+
+1. Fork it
+2. Create your feature branch (`git checkout -b my-new-feature`)
+3. Commit your changes (`git commit -am 'Add some feature'`)
+4. Push to the branch (`git push origin my-new-feature`)
+5. Create new Pull Request
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/Rakefile b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/Rakefile
new file mode 100644
index 0000000..2995527
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/Rakefile
@@ -0,0 +1 @@
+require "bundler/gem_tasks"
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/examples/help_dialogue.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/examples/help_dialogue.rb
new file mode 100755
index 0000000..807e587
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/examples/help_dialogue.rb
@@ -0,0 +1,46 @@
+#!/usr/bin/env ruby
+
+$:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib })
+
+require "mercenary"
+
+# This example sets the logging mode of mercenary to
+# debug. Logging messages from "p.logger.debug" will
+# be output to STDOUT.
+
+Mercenary.program(:help_dialogue) do |p|
+
+  p.version "2.0.1"
+  p.description 'An example of the help dialogue in Mercenary'
+  p.syntax 'help_dialogue <subcommand>'
+
+  p.command(:some_subcommand) do |c|
+    c.version '1.4.2'
+    c.syntax 'some_subcommand <subcommand> [options]'
+    c.description 'Some subcommand to do something'
+    c.option 'an_option', '-o', '--option', 'Some option'
+    c.alias(:blah)
+
+    c.command(:yet_another_sub) do |f|
+      f.syntax 'yet_another_sub [options]'
+      f.description 'Do amazing things'
+      f.option 'blah', '-b', '--blah', 'Trigger blah flag'
+      f.option 'heh', '-H ARG', '--heh ARG', 'Give a heh'
+
+      f.action do |args, options|
+        print "Args: "
+        p args
+        print "Opts: "
+        p options
+      end
+    end
+  end
+
+  p.command(:another_subcommand) do |c|
+    c.syntax 'another_subcommand <subcommand> [options]'
+    c.description 'Another subcommand to do something different.'
+    c.option 'an_option', '-O', '--option', 'Some option'
+    c.option 'another_options', '--pluginzzz', 'Set where the plugins should be found from'
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/examples/logging.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/examples/logging.rb
new file mode 100644
index 0000000..2cb867a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/examples/logging.rb
@@ -0,0 +1,39 @@
+#!/usr/bin/env ruby
+
+$:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib })
+
+require "mercenary"
+
+# This example sets the logging mode of mercenary to
+# debug. Logging messages from "p.logger.debug" will
+# be output to STDOUT.
+
+Mercenary.program(:logger_output) do |p|
+
+  p.version "5.2.6"
+  p.description 'An example of turning on logging for Mercenary.'
+  p.syntax 'logger_output'
+
+
+  p.logger.info "The default log level is INFO. So this will output."
+  p.logger.debug "Since DEBUG is below INFO, this will not output."
+
+  p.logger(Logger::DEBUG)
+  p.logger.debug "Logger level now set to DEBUG. So everything will output."
+  
+  p.logger.debug    "Example of DEBUG level message."
+  p.logger.info     "Example of INFO level message."
+  p.logger.warn     "Example of WARN level message."
+  p.logger.error    "Example of ERROR level message."
+  p.logger.fatal    "Example of FATAL level message."
+  p.logger.unknown  "Example of UNKNOWN level message."
+
+  p.action do |args, options|
+    
+    p.logger(Logger::INFO)
+    p.logger.debug "Logger level back to INFO. This line will not output."
+    p.logger.info "This INFO message will output."
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/examples/trace.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/examples/trace.rb
new file mode 100644
index 0000000..0aaa365
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/examples/trace.rb
@@ -0,0 +1,21 @@
+#!/usr/bin/env ruby
+
+$:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib })
+
+require "mercenary"
+
+# This example sets the logging mode of mercenary to
+# debug. Logging messages from "p.logger.debug" will
+# be output to STDOUT.
+
+Mercenary.program(:trace) do |p|
+
+  p.version "2.0.1"
+  p.description 'An example of traces in Mercenary'
+  p.syntax 'trace <subcommand>'
+
+  p.action do |_, _|
+    raise ArgumentError.new("YOU DID SOMETHING TERRIBLE YOU BUFFOON")
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary.rb
new file mode 100644
index 0000000..1c4be62
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary.rb
@@ -0,0 +1,21 @@
+require File.expand_path("../mercenary/version", __FILE__)
+require "optparse"
+require "logger"
+
+module Mercenary
+  autoload :Command,   File.expand_path("../mercenary/command", __FILE__)
+  autoload :Option,    File.expand_path("../mercenary/option", __FILE__)
+  autoload :Presenter, File.expand_path("../mercenary/presenter", __FILE__)
+  autoload :Program,   File.expand_path("../mercenary/program", __FILE__)
+
+  # Public: Instantiate a new program and execute.
+  #
+  # name - the name of your program
+  #
+  # Returns nothing.
+  def self.program(name)
+    program = Program.new(name)
+    yield program
+    program.go(ARGV)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/command.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/command.rb
new file mode 100644
index 0000000..0bcc4dd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/command.rb
@@ -0,0 +1,280 @@
+module Mercenary
+  class Command
+    attr_reader :name
+    attr_reader :description
+    attr_reader :syntax
+    attr_accessor :options
+    attr_accessor :commands
+    attr_accessor :actions
+    attr_reader :map
+    attr_accessor :parent
+    attr_reader :trace
+    attr_reader :aliases
+
+    # Public: Creates a new Command
+    #
+    # name - the name of the command
+    # parent - (optional) the instancce of Mercenary::Command which you wish to
+    #          be the parent of this command
+    #
+    # Returns nothing
+    def initialize(name, parent = nil)
+      @name     = name
+      @options  = []
+      @commands = {}
+      @actions  = []
+      @map      = {}
+      @parent   = parent
+      @trace    = false
+      @aliases  = []
+    end
+
+    # Public: Sets or gets the command version
+    #
+    # version - the command version (optional)
+    #
+    # Returns the version and sets it if an argument is non-nil
+    def version(version = nil)
+      @version = version if version
+      @version
+    end
+
+    # Public: Sets or gets the syntax string
+    #
+    # syntax - the string which describes this command's usage syntax (optional)
+    #
+    # Returns the syntax string and sets it if an argument is present
+    def syntax(syntax = nil)
+      @syntax = syntax if syntax
+      syntax_list = []
+      if parent
+        syntax_list << parent.syntax.to_s.gsub(/<[\w\s-]+>/, '').gsub(/\[[\w\s-]+\]/, '').strip
+      end
+      syntax_list << (@syntax || name.to_s)
+      syntax_list.join(" ")
+    end
+
+    # Public: Sets or gets the command description
+    #
+    # description - the description of what the command does (optional)
+    #
+    # Returns the description and sets it if an argument is present
+    def description(desc = nil)
+      @description = desc if desc
+      @description
+    end
+
+    # Public: Sets the default command
+    #
+    # command_name - the command name to be executed in the event no args are
+    #                present
+    #
+    # Returns the default command if there is one, `nil` otherwise
+    def default_command(command_name = nil)
+      if command_name
+        if commands.has_key?(command_name)
+          @default_command = commands[command_name] if command_name
+          @default_command
+        else
+          raise ArgumentError.new("'#{command_name}' couldn't be found in this command's list of commands.")
+        end
+      else
+        @default_command
+      end
+    end
+
+    # Public: Adds an option switch
+    #
+    # sym - the variable key which is used to identify the value of the switch
+    #       at runtime in the options hash
+    #
+    # Returns nothing
+    def option(sym, *options)
+      new_option = Option.new(sym, options)
+      @options << new_option
+      @map[new_option] = sym
+    end
+
+    # Public: Adds a subcommand
+    #
+    # cmd_name - the name of the command
+    # block    - a block accepting the new instance of Mercenary::Command to be
+    #            modified (optional)
+    #
+    # Returns nothing
+    def command(cmd_name)
+      cmd = Command.new(cmd_name, self)
+      yield cmd
+      @commands[cmd_name] = cmd
+    end
+
+    # Public: Add an alias for this command's name to be attached to the parent
+    #
+    # cmd_name - the name of the alias
+    #
+    # Returns nothing
+    def alias(cmd_name)
+      logger.debug "adding alias to parent for self: '#{cmd_name}'"
+      aliases << cmd_name
+      @parent.commands[cmd_name] = self
+    end
+
+    # Public: Add an action Proc to be executed at runtime
+    #
+    # block - the Proc to be executed at runtime
+    #
+    # Returns nothing
+    def action(&block)
+      @actions << block
+    end
+
+    # Public: Fetch a Logger (stdlib)
+    #
+    # level - the logger level (a Logger constant, see docs for more info)
+    #
+    # Returns the instance of Logger
+    def logger(level = nil)
+      unless @logger
+        @logger = Logger.new(STDOUT)
+        @logger.level = level || Logger::INFO
+        @logger.formatter = proc do |severity, datetime, progname, msg|
+          "#{identity} | " << "#{severity.downcase.capitalize}:".ljust(7) << " #{msg}\n"
+        end
+      end
+
+      @logger.level = level unless level.nil?
+      @logger
+    end
+
+    # Public: Run the command
+    #
+    # argv   - an array of string args
+    # opts   - the instance of OptionParser
+    # config - the output config hash
+    #
+    # Returns the command to be executed
+    def go(argv, opts, config)
+      opts.banner = "Usage: #{syntax}"
+      process_options(opts, config)
+      add_default_options(opts)
+
+      if argv[0] && cmd = commands[argv[0].to_sym]
+        logger.debug "Found subcommand '#{cmd.name}'"
+        argv.shift
+        cmd.go(argv, opts, config)
+      else
+        logger.debug "No additional command found, time to exec"
+        self
+      end
+    end
+
+    # Public: Add this command's options to OptionParser and set a default
+    #         action of setting the value of the option to the inputted hash
+    #
+    # opts - instance of OptionParser
+    # config - the Hash in which the option values should be placed
+    #
+    # Returns nothing
+    def process_options(opts, config)
+      options.each do |option|
+        opts.on(*option.for_option_parser) do |x|
+          config[map[option]] = x
+        end
+      end
+    end
+
+    # Public: Add version and help options to the command
+    #
+    # opts - instance of OptionParser
+    #
+    # Returns nothing
+    def add_default_options(opts)
+      option 'show_help', '-h', '--help', 'Show this message'
+      option 'show_version', '-v', '--version', 'Print the name and version'
+      option 'show_backtrace', '-t', '--trace', 'Show the full backtrace when an error occurs'
+      opts.on("-v", "--version", "Print the version") do
+        puts "#{name} #{version}"
+        exit(0)
+      end
+
+      opts.on('-t', '--trace', 'Show full backtrace if an error occurs') do
+        @trace = true
+      end
+
+      opts.on_tail("-h", "--help", "Show this message") do
+        puts self
+        exit
+      end
+    end
+
+    # Public: Execute all actions given the inputted args and options
+    #
+    # argv - (optional) command-line args (sans opts)
+    # config - (optional) the Hash configuration of string key to value
+    #
+    # Returns nothing
+    def execute(argv = [], config = {})
+      if actions.empty? && !default_command.nil?
+        default_command.execute
+      else
+        actions.each { |a| a.call(argv, config) }
+      end
+    end
+
+    # Public: Check if this command has a subcommand
+    #
+    # sub_command - the name of the subcommand
+    #
+    # Returns true if this command is the parent of a command of name
+    # 'sub_command' and false otherwise
+    def has_command?(sub_command)
+      commands.keys.include?(sub_command)
+    end
+
+    # Public: Identify this command
+    #
+    # Returns a string which identifies this command
+    def ident
+      "<Command name=#{identity}>"
+    end
+
+    # Public: Get the full identity (name & version) of this command
+    #
+    # Returns a string containing the name and version if it exists
+    def identity
+      "#{full_name} #{version if version}".strip
+    end
+
+    # Public: Get the name of the current command plus that of
+    #   its parent commands
+    #
+    # Returns the full name of the command
+    def full_name
+      the_name = []
+      the_name << parent.full_name if parent && parent.full_name
+      the_name << name
+      the_name.join(" ")
+    end
+
+    # Public: Return all the names and aliases for this command.
+    #
+    # Returns a comma-separated String list of the name followed by its aliases
+    def names_and_aliases
+      ([name.to_s] + aliases).compact.join(", ")
+    end
+
+    # Public: Build a string containing a summary of the command
+    #
+    # Returns a one-line summary of the command.
+    def summarize
+      "  #{names_and_aliases.ljust(20)}  #{description}"
+    end
+
+    # Public: Build a string containing the command name, options and any subcommands
+    #
+    # Returns the string identifying this command, its options and its subcommands
+    def to_s
+      Presenter.new(self).print_command
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/option.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/option.rb
new file mode 100644
index 0000000..56a49b6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/option.rb
@@ -0,0 +1,87 @@
+module Mercenary
+  class Option
+    attr_reader :config_key, :description, :short, :long, :return_type
+
+    # Public: Create a new Option
+    #
+    # config_key - the key in the config hash to which the value of this option
+    #              will map
+    # info       - an array containing first the switches, then an optional
+    #              return type (e.g. Array), then a description of the option
+    #
+    # Returns nothing
+    def initialize(config_key, info)
+      @config_key  = config_key
+      while arg = info.shift
+        begin
+          @return_type = Object.const_get("#{arg}")
+          next
+        rescue NameError
+        end
+        if arg.start_with?("-")
+          if arg.start_with?("--")
+            @long = arg
+          else
+            @short = arg
+          end
+          next
+        end
+        @description = arg
+      end
+    end
+
+    # Public: Fetch the array containing the info OptionParser is interested in
+    #
+    # Returns the array which OptionParser#on wants
+    def for_option_parser
+      [short, long, return_type, description].flatten.reject{ |o| o.to_s.empty? }
+    end
+
+    # Public: Build a string representation of this option including the
+    #   switches and description
+    #
+    # Returns a string representation of this option
+    def to_s
+      "#{formatted_switches}  #{description}"
+    end
+
+    # Public: Build a beautifully-formatted string representation of the switches
+    #
+    # Returns a formatted string representation of the switches
+    def formatted_switches
+      [
+        switches.first.rjust(10),
+        switches.last.ljust(13)
+      ].join(", ").gsub(/ , /, '   ').gsub(/,   /, '    ')
+    end
+
+    # Public: Hash based on the hash value of instance variables
+    #
+    # Returns a Fixnum which is unique to this Option based on the instance variables
+    def hash
+      instance_variables.map do |var|
+        instance_variable_get(var).hash
+      end.reduce(:^)
+    end
+
+    # Public: Check equivalence of two Options based on equivalence of their
+    #   instance variables
+    #
+    # Returns true if all the instance variables are equal, false otherwise
+    def eql?(other)
+      return false unless self.class.eql?(other.class)
+      instance_variables.map do |var|
+        instance_variable_get(var).eql?(other.instance_variable_get(var))
+      end.all?
+    end
+
+    # Public: Fetch an array of switches, including the short and long versions
+    #
+    # Returns an array of two strings. An empty string represents no switch in
+    # that position.
+    def switches
+      [short, long].map(&:to_s)
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb
new file mode 100644
index 0000000..0521ee0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb
@@ -0,0 +1,94 @@
+module Mercenary
+  class Presenter
+    attr_accessor :command
+
+    # Public: Make a new Presenter
+    #
+    # command - a Mercenary::Command to present
+    #
+    # Returns nothing
+    def initialize(command)
+      @command = command
+    end
+
+    # Public: Builds a string representation of the command usage
+    #
+    # Returns the string representation of the command usage
+    def usage_presentation
+      "  #{command.syntax}"
+    end
+
+    # Public: Builds a string representation of the options
+    #
+    # Returns the string representation of the options
+    def options_presentation
+      return nil unless command_options_presentation || parent_command_options_presentation
+      [command_options_presentation, parent_command_options_presentation].compact.join("\n")
+    end
+
+    def command_options_presentation
+      return nil unless command.options.size > 0
+      command.options.map(&:to_s).join("\n")
+    end
+
+    # Public: Builds a string representation of the options for parent
+    # commands
+    #
+    # Returns the string representation of the options for parent commands
+    def parent_command_options_presentation
+      return nil unless command.parent
+      Presenter.new(command.parent).options_presentation
+    end
+
+    # Public: Builds a string representation of the subcommands
+    #
+    # Returns the string representation of the subcommands
+    def subcommands_presentation
+      return nil unless command.commands.size > 0
+      command.commands.values.uniq.map(&:summarize).join("\n")
+    end
+
+    # Public: Builds the command header, including the command identity and description
+    #
+    # Returns the command header as a String
+    def command_header
+      header = "#{command.identity}"
+      header << " -- #{command.description}" if command.description
+      header
+    end
+
+    # Public: Builds a string representation of the whole command
+    #
+    # Returns the string representation of the whole command
+    def command_presentation
+      msg = []
+      msg << command_header
+      msg << "Usage:"
+      msg << usage_presentation
+
+      if opts = options_presentation
+        msg << "Options:\n#{opts}"
+      end
+      if subcommands = subcommands_presentation
+        msg << "Subcommands:\n#{subcommands_presentation}"
+      end
+      msg.join("\n\n")
+    end
+
+    # Public: Turn a print_* into a *_presentation or freak out
+    #
+    # meth  - the method being called
+    # args  - an array of arguments passed to the missing method
+    # block - the block passed to the missing method
+    #
+    # Returns the value of whatever function is called
+    def method_missing(meth, *args, &block)
+      if meth.to_s =~ /^print_(.+)$/
+        send("#{$1.downcase}_presentation")
+      else
+        super # You *must* call super if you don't handle the method,
+              # otherwise you'll mess up Ruby's method lookup.
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/program.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/program.rb
new file mode 100644
index 0000000..53591c0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/program.rb
@@ -0,0 +1,53 @@
+module Mercenary
+  class Program < Command
+    attr_reader :optparse
+    attr_reader :config
+
+    # Public: Creates a new Program
+    #
+    # name - the name of the program
+    #
+    # Returns nothing
+    def initialize(name)
+      @config = {}
+      super(name)
+    end
+
+    # Public: Run the program
+    #
+    # argv - an array of string args (usually ARGV)
+    #
+    # Returns nothing
+    def go(argv)
+      logger.debug("Using args passed in: #{argv.inspect}")
+
+      cmd = nil
+
+      @optparse = OptionParser.new do |opts|
+        cmd = super(argv, opts, @config)
+      end
+
+      begin
+        @optparse.parse!(argv)
+      rescue OptionParser::InvalidOption => e
+        logger.error "Whoops, we can't understand your command."
+        logger.error "#{e.message}"
+        logger.error "Run your command again with the --help switch to see available options."
+        abort
+      end
+
+      logger.debug("Parsed config: #{@config.inspect}")
+
+      begin
+        cmd.execute(argv, @config)
+      rescue => e
+        if cmd.trace
+          raise e
+        else
+          logger.error e.message
+          abort
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/version.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/version.rb
new file mode 100644
index 0000000..296046b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/lib/mercenary/version.rb
@@ -0,0 +1,3 @@
+module Mercenary
+  VERSION = "0.3.6"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/mercenary.gemspec b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/mercenary.gemspec
new file mode 100644
index 0000000..e9f8294
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/mercenary.gemspec
@@ -0,0 +1,24 @@
+# coding: utf-8
+lib = File.expand_path('../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require 'mercenary/version'
+
+Gem::Specification.new do |spec|
+  spec.name          = "mercenary"
+  spec.version       = Mercenary::VERSION
+  spec.authors       = ["Tom Preston-Werner", "Parker Moore"]
+  spec.email         = ["tom@mojombo.com", "parkrmoore@gmail.com"]
+  spec.description   = %q{Lightweight and flexible library for writing command-line apps in Ruby.}
+  spec.summary       = %q{Lightweight and flexible library for writing command-line apps in Ruby.}
+  spec.homepage      = "https://github.com/jekyll/mercenary"
+  spec.license       = "MIT"
+
+  spec.files         = `git ls-files`.split($/)
+  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
+  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
+  spec.require_paths = ["lib"]
+
+  spec.add_development_dependency "bundler", "~> 1.3"
+  spec.add_development_dependency "rake"
+  spec.add_development_dependency "rspec", "~> 3.0"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/bootstrap b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/bootstrap
new file mode 100755
index 0000000..a0cf262
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/bootstrap
@@ -0,0 +1,7 @@
+#! /bin/sh
+
+set -e
+
+echo "Time to get set up."
+bundle install
+echo "Boom."
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/cibuild b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/cibuild
new file mode 100755
index 0000000..260e363
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/cibuild
@@ -0,0 +1,6 @@
+#! /bin/sh
+
+set -ex
+
+bundle exec rspec
+./script/examples
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/console b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/console
new file mode 100755
index 0000000..27ed279
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/console
@@ -0,0 +1,3 @@
+#! /bin/bash
+
+irb -r./lib/mercenary.rb
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/examples b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/examples
new file mode 100755
index 0000000..a722ab3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/script/examples
@@ -0,0 +1,18 @@
+#! /bin/bash
+
+set -e
+
+function run () {
+  echo "+ ruby ./examples/$@"
+  ruby -e "puts '=' * 79"
+  ruby ./examples/$@
+  ruby -e "puts '=' * 79"
+}
+
+run logging.rb
+run logging.rb -v
+run help_dialogue.rb -h
+run help_dialogue.rb some_subcommand -h
+run help_dialogue.rb another_subcommand -h
+run help_dialogue.rb some_subcommand yet_another_sub -h
+run help_dialogue.rb some_subcommand yet_another_sub -b
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/command_spec.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/command_spec.rb
new file mode 100644
index 0000000..e1c029a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/command_spec.rb
@@ -0,0 +1,98 @@
+require "spec_helper"
+
+describe(Mercenary::Command) do
+
+  context "a basic command" do
+    let(:command) { Mercenary::Command.new(:my_name) }
+    let(:parent)  { Mercenary::Command.new(:my_parent) }
+    let(:with_sub) do
+      c = Mercenary::Command.new(:i_have_subcommand)
+      add_sub.call(c)
+      c
+    end
+    let(:command_with_parent) do
+      Mercenary::Command.new(
+        :i_have_parent,
+        parent
+      )
+    end
+    let(:add_sub) do
+      Proc.new do |c|
+        c.command(:sub_command) { |p| }
+      end
+    end
+
+    it "can be created with just a name" do
+      expect(command.name).to eql(:my_name)
+    end
+
+    it "can hold a parent command" do
+      expect(command_with_parent.parent).to eql(parent)
+    end
+
+    it "can create subcommands" do
+      expect(add_sub.call(command)).to be_a(Mercenary::Command)
+      expect(add_sub.call(command).parent).to eq(command)
+    end
+
+    it "can set its version" do
+      version = "1.4.2"
+      command.version version
+      expect(command.version).to eq(version)
+    end
+
+    it "can set its syntax" do
+      syntax_string = "my_name [options]"
+      cmd = described_class.new(:my_name)
+      cmd.syntax syntax_string
+      expect(cmd.syntax).to eq(syntax_string)
+    end
+
+    it "can set its description" do
+      desc = "run all the things"
+      command.description desc
+      expect(command.description).to eq(desc)
+    end
+
+    it "can set its options" do
+      name = "show_drafts"
+      opts  = ['--drafts', 'Render posts in the _drafts folder']
+      option = Mercenary::Option.new(name, opts)
+      command.option name, *opts
+      expect(command.options).to eql([option])
+      expect(command.map.values).to include(name)
+    end
+
+    it "knows its full name" do
+      expect(command_with_parent.full_name).to eql("my_parent i_have_parent")
+    end
+
+    it "knows its identity" do
+      command_with_parent.version '1.8.7'
+      expect(command_with_parent.identity).to eql("my_parent i_have_parent 1.8.7")
+    end
+
+    it "raises an ArgumentError if I specify a default_command that isn't there" do
+      c = command # some weird NameError with the block below?
+      expect { c.default_command(:nope) }.to raise_error(ArgumentError)
+    end
+
+    it "sets the default_command" do
+      expect(with_sub.default_command(:sub_command).name).to eq(:sub_command)
+    end
+
+    context "with an alias" do
+      before(:each) do
+        command_with_parent.alias(:an_alias)
+      end
+      it "shows the alias in the summary" do
+        expect(command_with_parent.summarize).to eql("  i_have_parent, an_alias  ")
+      end
+
+      it "its names_and_aliases method reports both the name and alias" do
+        expect(command_with_parent.names_and_aliases).to eql("i_have_parent, an_alias")
+      end
+    end
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/option_spec.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/option_spec.rb
new file mode 100644
index 0000000..83e58fd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/option_spec.rb
@@ -0,0 +1,83 @@
+require 'spec_helper'
+
+describe(Mercenary::Option) do
+  let(:config_key)  { "largo" }
+  let(:description) { "This is a description" }
+  let(:switches)    { ['-l', '--largo'] }
+  let(:option)      { described_class.new(config_key, [switches, description].flatten.reject(&:nil?)) }
+
+  it "knows its config key" do
+    expect(option.config_key).to eql(config_key)
+  end
+
+  it "knows its description" do
+    expect(option.description).to eql(description)
+  end
+
+  it "knows its switches" do
+    expect(option.switches).to eql(switches)
+  end
+
+  it "knows how to present itself" do
+    expect(option.to_s).to eql("        -l, --largo        #{description}")
+  end
+
+  it "has an OptionParser representation" do
+    expect(option.for_option_parser).to eql([switches, description].flatten)
+  end
+
+  it "compares itself with other options well" do
+    new_option = described_class.new(config_key, ['-l', '--largo', description])
+    expect(option.eql?(new_option)).to be(true)
+    expect(option.hash.eql?(new_option.hash)).to be(true)
+  end
+
+  it "has a custom #hash" do
+    expect(option.hash.to_s).to match(/\d+/)
+  end
+
+  context "with just the long switch" do
+    let(:switches) { ['--largo'] }
+
+    it "adds an empty string in place of the short switch" do
+      expect(option.switches).to eql(['', '--largo'])
+    end
+
+    it "sets its description properly" do
+      expect(option.description).to eql(description)
+    end
+
+    it "knows how to present the switch" do
+      expect(option.formatted_switches).to eql("            --largo      ")
+    end
+  end
+
+  context "with just the short switch" do
+    let(:switches) { ['-l'] }
+
+    it "adds an empty string in place of the long switch" do
+      expect(option.switches).to eql(['-l', ''])
+    end
+
+    it "sets its description properly" do
+      expect(option.description).to eql(description)
+    end
+
+    it "knows how to present the switch" do
+      expect(option.formatted_switches).to eql("        -l               ")
+    end
+  end
+
+  context "without a description" do
+    let(:description) { nil }
+
+    it "knows there is no description" do
+      expect(option.description).to be(nil)
+    end
+
+    it "knows both inputs are switches" do
+      expect(option.switches).to eql(switches)
+    end
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/presenter_spec.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/presenter_spec.rb
new file mode 100644
index 0000000..f61ed45
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/presenter_spec.rb
@@ -0,0 +1,39 @@
+require 'spec_helper'
+
+describe(Mercenary::Presenter) do
+  let(:supercommand) { Mercenary::Command.new(:script_name) }
+  let(:command) { Mercenary::Command.new(:subcommand, supercommand) }
+  let(:presenter) { described_class.new(command) }
+
+  before(:each) do
+    command.version '1.4.2'
+    command.description 'Do all the things.'
+    command.option 'one', '-1', '--one', 'The first option'
+    command.option 'two', '-2', '--two', 'The second option'
+    command.alias :cmd
+    supercommand.commands[command.name] = command
+  end
+
+  it "knows how to present the command" do
+    expect(presenter.command_presentation).to eql("script_name subcommand 1.4.2 -- Do all the things.\n\nUsage:\n\n  script_name subcommand\n\nOptions:\n        -1, --one          The first option\n        -2, --two          The second option")
+  end
+
+  it "knows how to present the subcommands, without duplicates for aliases" do
+    expect(described_class.new(supercommand).subcommands_presentation).to eql("  subcommand, cmd       Do all the things.")
+  end
+
+  it "knows how to present the usage" do
+    expect(presenter.usage_presentation).to eql("  script_name subcommand")
+  end
+
+  it "knows how to present the options" do
+    expect(presenter.options_presentation).to eql("        -1, --one          The first option\n        -2, --two          The second option")
+  end
+
+  it "allows you to say print_* instead of *_presentation" do
+    expect(presenter.print_usage).to       eql(presenter.usage_presentation)
+    expect(presenter.print_subcommands).to eql(presenter.subcommands_presentation)
+    expect(presenter.print_options).to     eql(presenter.options_presentation)
+    expect(presenter.print_command).to     eql(presenter.command_presentation)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/program_spec.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/program_spec.rb
new file mode 100644
index 0000000..f5d961e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/program_spec.rb
@@ -0,0 +1,19 @@
+require "spec_helper"
+
+describe(Mercenary::Program) do
+
+  context "a basic program" do
+    let(:program) { Mercenary::Program.new(:my_name) }
+
+    it "can be created with just a name" do
+      expect(program.name).to eql(:my_name)
+    end
+
+    it "can set its version" do
+      version = Mercenary::VERSION
+      program.version version
+      expect(program.version).to eq(version)
+    end
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/spec_helper.rb b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/spec_helper.rb
new file mode 100644
index 0000000..c379985
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/mercenary-0.3.6/spec/spec_helper.rb
@@ -0,0 +1,14 @@
+lib = File.expand_path('../../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require 'mercenary'
+
+RSpec.configure do |config|
+  config.run_all_when_everything_filtered = true
+  config.filter_run :focus
+
+  # Run specs in random order to surface order dependencies. If you find an
+  # order dependency and want to debug it, you can fix the order by providing
+  # the seed, which is printed after each run.
+  #     --seed 1234
+  config.order = 'random'
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/LICENSE.txt b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/LICENSE.txt
new file mode 100644
index 0000000..e8c3c2d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/LICENSE.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Parker Moore
+
+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/bundle/ruby/2.4.0/gems/minima-2.1.1/README.md b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/README.md
new file mode 100644
index 0000000..182ee5d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/README.md
@@ -0,0 +1,147 @@
+# minima
+
+*Minima is a one-size-fits-all Jekyll theme for writers*. It's Jekyll's default (and first) theme. It's what you get when you run `jekyll new`.
+
+[Theme preview](https://jekyll.github.io/minima/)
+
+![minima theme preview](/screenshot.png)
+
+## Installation
+
+Add this line to your Jekyll site's Gemfile:
+
+```ruby
+gem "minima"
+```
+
+And add this line to your Jekyll site:
+
+```yaml
+theme: minima
+```
+
+And then execute:
+
+    $ bundle
+
+
+## Contents At-A-Glance
+
+Minima has been scaffolded by the `jekyll new-theme` command and therefore has all the necessary files and directories to have a new Jekyll site up and running with zero-configuration.
+
+### Layouts
+
+Refers to files within the `_layouts` directory, that define the markup for your theme.
+
+  - `default.html` &mdash; The base layout that lays the foundation for subsequent layouts. The derived layouts inject their contents into this file at the line that says ` {{ content }} ` and are linked to this file via [FrontMatter](https://jekyllrb.com/docs/frontmatter/) declaration `layout: default`.
+  - `home.html` &mdash; The layout for your landing-page / home-page / index-page.
+  - `page.html` &mdash; The layout for your documents that contain FrontMatter, but are not posts.
+  - `post.html` &mdash; The layout for your posts.
+
+### Includes
+
+Refers to snippets of code within the `_includes` directory that can be inserted in multiple layouts (and another include-file as well) within the same theme-gem.
+
+  - `disqus_comments.html` &mdash; Code to markup disqus comment box.
+  - `footer.html` &mdash; Defines the site's footer section.
+  - `google-analytics.html` &mdash; Inserts Google Analytics module (active only in production environment).
+  - `head.html` &mdash; Code-block that defines the `<head></head>` in *default* layout.
+  - `header.html` &mdash; Defines the site's main header section.
+  - `icon-* files` &mdash; Inserts github and twitter ids with respective icons.
+
+### Sass
+
+Refers to `.scss` files within the `_sass` directory that define the theme's styles.
+
+  - `minima.scss` &mdash; The core file imported by preprocessed `main.scss`, it defines the variable defaults for the theme and also further imports sass partials to supplement itself.
+  - `minima/_base.scss` &mdash; Resets and defines base styles for various HTML elements.
+  - `minima/_layout.scss` &mdash; Defines the visual style for various layouts.
+  - `minima/_syntax-highlighting.scss` &mdash; Defines the styles for syntax-highlighting.
+
+### Assets
+
+Refers to various asset files within the `assets` directory.
+Contains the `main.scss` that imports sass files from within the `_sass` directory. This `main.scss` is what gets processed into the theme's main stylesheet `main.css` called by `_layouts/default.html` via `_includes/head.html`.
+
+This directory can include sub-directories to manage assets of similar type, and will be copied over as is, to the final transformed site directory.
+
+
+## Usage
+
+### Customization
+
+To override the default structure and style of minima, simply create the concerned directory at the root of your site, copy the file you wish to customize to that directory, and then edit the file.
+e.g., to override the [`_includes/head.html `](_includes/head.html) file to specify a custom style path, create an `_includes` directory, copy `_includes/head.html` from minima gem folder to `<yoursite>/_includes` and start editing that file.
+
+The site's default CSS has now moved to a new place within the gem itself, [`assets/main.scss`](assets/main.scss). To **override the default CSS**, the file has to exist at your site source. Do either of the following:
+- Create a new instance of `main.scss` at site source.
+  - Create a new file `main.scss` at `<your-site>/assets/`
+  - Add the frontmatter dashes, and
+  - Add `@import "minima";`, to `<your-site>/assets/main.scss`
+  - Add your custom CSS.
+- Download the file from this repo
+  - Create  a new file `main.scss` at `<your-site>/assets/`
+  - Copy the contents at [assets/main.scss](assets/main.scss) onto the `main.scss` you just created, and edit away!
+- Copy directly from Minima 2.0 gem
+  - Go to your local minima gem installation directory ( run `bundle show minima` to get the path to it ).
+  - Copy the `assets/` folder from there into the root of `<your-site>`
+  - Change whatever values you want, inside `<your-site>/assets/main.scss`
+
+--
+
+### Change default date format
+
+You can change the default date format by specifying `site.minima.date_format`
+in `_config.yml`.
+
+```
+# Minima date format
+# refer to http://shopify.github.io/liquid/filters/date/ if you want to customize this
+minima:
+  date_format: "%b %-d, %Y"
+```
+
+--
+
+### Enabling comments (via Disqus)
+
+Optionally, if you have a Disqus account, you can tell Jekyll to use it to show a comments section below each post.
+
+To enable it, add the following lines to your Jekyll site:
+
+```yaml
+  disqus:
+    shortname: my_disqus_shortname
+```
+
+You can find out more about Disqus' shortnames [here](https://help.disqus.com/customer/portal/articles/466208).
+
+Comments are enabled by default and will only appear in production, i.e., `JEKYLL_ENV=production`
+
+If you don't want to display comments for a particular post you can disable them by adding `comments: false` to that post's YAML Front Matter.
+
+--
+
+### Enabling Google Analytics
+
+To enable Google Anaytics, add the following lines to your Jekyll site:
+
+```yaml
+  google_analytics: UA-NNNNNNNN-N
+```
+
+Google Analytics will only appear in production, i.e., `JEKYLL_ENV=production`
+
+## Contributing
+
+Bug reports and pull requests are welcome on GitHub at https://github.com/jekyll/minima. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
+
+## Development
+
+To set up your environment to develop this theme, run `script/bootstrap`.
+
+To test your theme, run `script/server` (or `bundle exec jekyll serve`) and open your browser at `http://localhost:4000`. This starts a Jekyll server using your theme and the contents. As you make modifications, your site will regenerate and you should see the changes in the browser after a refresh.
+
+## License
+
+The theme is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/disqus_comments.html b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/disqus_comments.html
new file mode 100644
index 0000000..87fa309
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/disqus_comments.html
@@ -0,0 +1,20 @@
+{% if page.comments != false and jekyll.environment == "production" %}
+
+  <div id="disqus_thread"></div>
+  <script>
+    var disqus_config = function () {
+      this.page.url = '{{ page.url | absolute_url }}';
+      this.page.identifier = '{{ page.url | absolute_url }}';
+    };
+
+    (function() {
+      var d = document, s = d.createElement('script');
+
+      s.src = 'https://{{ site.disqus.shortname }}.disqus.com/embed.js';
+
+      s.setAttribute('data-timestamp', +new Date());
+      (d.head || d.body).appendChild(s);
+    })();
+  </script>
+  <noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
+{% endif %}
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/footer.html b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/footer.html
new file mode 100644
index 0000000..dc26507
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/footer.html
@@ -0,0 +1,46 @@
+<footer class="site-footer">
+
+  <div class="wrapper">
+
+    <h2 class="footer-heading">{{ site.title | escape }}</h2>
+
+    <div class="footer-col-wrapper">
+      <div class="footer-col footer-col-1">
+        <ul class="contact-list">
+          <li>
+            {% if site.author %}
+              {{ site.author | escape }}
+            {% else %}
+              {{ site.title | escape }}
+            {% endif %}
+            </li>
+            {% if site.email %}
+            <li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li>
+            {% endif %}
+        </ul>
+      </div>
+
+      <div class="footer-col footer-col-2">
+        <ul class="social-media-list">
+          {% if site.github_username %}
+          <li>
+            {% include icon-github.html username=site.github_username %}
+          </li>
+          {% endif %}
+
+          {% if site.twitter_username %}
+          <li>
+            {% include icon-twitter.html username=site.twitter_username %}
+          </li>
+          {% endif %}
+        </ul>
+      </div>
+
+      <div class="footer-col footer-col-3">
+        <p>{{ site.description | escape }}</p>
+      </div>
+    </div>
+
+  </div>
+
+</footer>
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/google-analytics.html b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/google-analytics.html
new file mode 100644
index 0000000..eb2a692
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/google-analytics.html
@@ -0,0 +1,11 @@
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', '{{ site.google_analytics }}', 'auto');
+  ga('send', 'pageview');
+
+</script>
+  
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/head.html b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/head.html
new file mode 100644
index 0000000..99b698f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/head.html
@@ -0,0 +1,16 @@
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <title>{% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %}</title>
+  <meta name="description" content="{{ page.excerpt | default: site.description | strip_html | normalize_whitespace | truncate: 160 | escape }}">
+
+  <link rel="stylesheet" href="{{ "/assets/main.css" | relative_url }}">
+  <link rel="canonical" href="{{ page.url | replace:'index.html','' | absolute_url }}">
+  <link rel="alternate" type="application/rss+xml" title="{{ site.title | escape }}" href="{{ "/feed.xml" | relative_url }}">
+  
+  {% if jekyll.environment == 'production' and site.google_analytics %}
+  {% include google-analytics.html %}
+  {% endif %}
+</head>
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/header.html b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/header.html
new file mode 100644
index 0000000..db72550
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/header.html
@@ -0,0 +1,32 @@
+<header class="site-header" role="banner">
+
+  <div class="wrapper">
+    {% assign default_paths = site.pages | map: "path" %}
+    {% assign page_paths = site.header_pages | default: default_paths %}
+    <a class="site-title" href="{{ "/" | relative_url }}">{{ site.title | escape }}</a>
+  
+    {% if page_paths %}
+      <nav class="site-nav">
+        <input type="checkbox" id="nav-trigger" class="nav-trigger" />
+        <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
+              <path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
+              <path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+        </label>
+
+        <div class="trigger">
+          {% for path in page_paths %}
+            {% assign my_page = site.pages | where: "path", path | first %}
+            {% if my_page.title %}
+            <a class="page-link" href="{{ my_page.url | relative_url }}">{{ my_page.title | escape }}</a>
+            {% endif %}
+          {% endfor %}
+        </div>
+      </nav>
+    {% endif %}
+  </div>
+</header>
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-github.html b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-github.html
new file mode 100644
index 0000000..e501a16
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-github.html
@@ -0,0 +1 @@
+<a href="https://github.com/{{ include.username }}"><span class="icon icon--github">{% include icon-github.svg %}</span><span class="username">{{ include.username }}</span></a>
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-github.svg b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-github.svg
new file mode 100644
index 0000000..e6c5f6d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-github.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 16 16" width="16px" height="16px"><path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/></svg>
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-twitter.html b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-twitter.html
new file mode 100644
index 0000000..e623dbd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-twitter.html
@@ -0,0 +1 @@
+<a href="https://twitter.com/{{ include.username }}"><span class="icon icon--twitter">{% include icon-twitter.svg %}</span><span class="username">{{ include.username }}</span></a>
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-twitter.svg b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-twitter.svg
new file mode 100644
index 0000000..efc0ecf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_includes/icon-twitter.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 16 16" width="16px" height="16px"><path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/></svg>
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/default.html b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/default.html
new file mode 100644
index 0000000..52085bf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/default.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="{{ page.lang | default: site.lang | default: "en" }}">
+
+  {% include head.html %}
+
+  <body>
+
+    {% include header.html %}
+
+    <main class="page-content" aria-label="Content">
+      <div class="wrapper">
+        {{ content }}
+      </div>
+    </main>
+
+    {% include footer.html %}
+
+  </body>
+
+</html>
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/home.html b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/home.html
new file mode 100644
index 0000000..6e2f604
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/home.html
@@ -0,0 +1,26 @@
+---
+layout: default
+---
+
+<div class="home">
+
+  <h1 class="page-heading">Posts</h1>
+  
+  {{ content }}
+
+  <ul class="post-list">
+    {% for post in site.posts %}
+      <li>
+        {% assign date_format = site.minima.date_format | default: "%b %-d, %Y" %}
+        <span class="post-meta">{{ post.date | date: date_format }}</span>
+
+        <h2>
+          <a class="post-link" href="{{ post.url | relative_url }}">{{ post.title | escape }}</a>
+        </h2>
+      </li>
+    {% endfor %}
+  </ul>
+
+  <p class="rss-subscribe">subscribe <a href="{{ "/feed.xml" | relative_url }}">via RSS</a></p>
+
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/page.html b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/page.html
new file mode 100644
index 0000000..01e4b2a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/page.html
@@ -0,0 +1,14 @@
+---
+layout: default
+---
+<article class="post">
+
+  <header class="post-header">
+    <h1 class="post-title">{{ page.title | escape }}</h1>
+  </header>
+
+  <div class="post-content">
+    {{ content }}
+  </div>
+
+</article>
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/post.html b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/post.html
new file mode 100644
index 0000000..55ec11b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_layouts/post.html
@@ -0,0 +1,25 @@
+---
+layout: default
+---
+<article class="post" itemscope itemtype="http://schema.org/BlogPosting">
+
+  <header class="post-header">
+    <h1 class="post-title" itemprop="name headline">{{ page.title | escape }}</h1>
+    <p class="post-meta">
+      <time datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">
+        {% assign date_format = site.minima.date_format | default: "%b %-d, %Y" %}
+        {{ page.date | date: date_format }}
+      </time>
+      {% if page.author %}
+        • <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span itemprop="name">{{ page.author }}</span></span>
+      {% endif %}</p>
+  </header>
+
+  <div class="post-content" itemprop="articleBody">
+    {{ content }}
+  </div>
+
+  {% if site.disqus.shortname %}
+    {% include disqus_comments.html %}
+  {% endif %}
+</article>
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima.scss b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima.scss
new file mode 100644
index 0000000..ff94a8a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima.scss
@@ -0,0 +1,49 @@
+@charset "utf-8";
+
+// Define defaults for each variable.
+
+$base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !default;
+$base-font-size:   16px !default;
+$base-font-weight: 400 !default;
+$small-font-size:  $base-font-size * 0.875 !default;
+$base-line-height: 1.5 !default;
+
+$spacing-unit:     30px !default;
+
+$text-color:       #111 !default;
+$background-color: #fdfdfd !default;
+$brand-color:      #2a7ae2 !default;
+
+$grey-color:       #828282 !default;
+$grey-color-light: lighten($grey-color, 40%) !default;
+$grey-color-dark:  darken($grey-color, 25%) !default;
+
+// Width of the content area
+$content-width:    800px !default;
+
+$on-palm:          600px !default;
+$on-laptop:        800px !default;
+
+// Use media queries like this:
+// @include media-query($on-palm) {
+//   .wrapper {
+//     padding-right: $spacing-unit / 2;
+//     padding-left: $spacing-unit / 2;
+//   }
+// }
+@mixin media-query($device) {
+  @media screen and (max-width: $device) {
+    @content;
+  }
+}
+
+@mixin relative-font-size($ratio) {
+  font-size: $base-font-size * $ratio;
+}
+
+// Import partials.
+@import
+  "minima/base",
+  "minima/layout",
+  "minima/syntax-highlighting"
+;
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima/_base.scss b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima/_base.scss
new file mode 100644
index 0000000..a10fd98
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima/_base.scss
@@ -0,0 +1,215 @@
+/**
+ * Reset some basic elements
+ */
+body, h1, h2, h3, h4, h5, h6,
+p, blockquote, pre, hr,
+dl, dd, ol, ul, figure {
+  margin: 0;
+  padding: 0;
+}
+
+
+
+/**
+ * Basic styling
+ */
+body {
+  font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;
+  color: $text-color;
+  background-color: $background-color;
+  -webkit-text-size-adjust: 100%;
+  -webkit-font-feature-settings: "kern" 1;
+     -moz-font-feature-settings: "kern" 1;
+       -o-font-feature-settings: "kern" 1;
+          font-feature-settings: "kern" 1;
+  font-kerning: normal;
+}
+
+
+
+/**
+ * Set `margin-bottom` to maintain vertical rhythm
+ */
+h1, h2, h3, h4, h5, h6,
+p, blockquote, pre,
+ul, ol, dl, figure,
+%vertical-rhythm {
+  margin-bottom: $spacing-unit / 2;
+}
+
+
+
+/**
+ * Images
+ */
+img {
+  max-width: 100%;
+  vertical-align: middle;
+}
+
+
+
+/**
+ * Figures
+ */
+figure > img {
+  display: block;
+}
+
+figcaption {
+  font-size: $small-font-size;
+}
+
+
+
+/**
+ * Lists
+ */
+ul, ol {
+  margin-left: $spacing-unit;
+}
+
+li {
+  > ul,
+  > ol {
+    margin-bottom: 0;
+  }
+}
+
+
+
+/**
+ * Headings
+ */
+h1, h2, h3, h4, h5, h6 {
+  font-weight: $base-font-weight;
+}
+
+
+
+/**
+ * Links
+ */
+a {
+  color: $brand-color;
+  text-decoration: none;
+
+  &:visited {
+    color: darken($brand-color, 15%);
+  }
+
+  &:hover {
+    color: $text-color;
+    text-decoration: underline;
+  }
+
+  .social-media-list &:hover {
+    text-decoration: none;
+
+    .username {
+      text-decoration: underline;
+    }
+  }
+}
+
+
+/**
+ * Blockquotes
+ */
+blockquote {
+  color: $grey-color;
+  border-left: 4px solid $grey-color-light;
+  padding-left: $spacing-unit / 2;
+  @include relative-font-size(1.125);
+  letter-spacing: -1px;
+  font-style: italic;
+
+  > :last-child {
+    margin-bottom: 0;
+  }
+}
+
+
+
+/**
+ * Code formatting
+ */
+pre,
+code {
+  @include relative-font-size(0.9375);
+  border: 1px solid $grey-color-light;
+  border-radius: 3px;
+  background-color: #eef;
+}
+
+code {
+  padding: 1px 5px;
+}
+
+pre {
+  padding: 8px 12px;
+  overflow-x: auto;
+
+  > code {
+    border: 0;
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+
+
+
+/**
+ * Wrapper
+ */
+.wrapper {
+  max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2));
+  max-width:         calc(#{$content-width} - (#{$spacing-unit} * 2));
+  margin-right: auto;
+  margin-left: auto;
+  padding-right: $spacing-unit;
+  padding-left: $spacing-unit;
+  @extend %clearfix;
+
+  @include media-query($on-laptop) {
+    max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit}));
+    max-width:         calc(#{$content-width} - (#{$spacing-unit}));
+    padding-right: $spacing-unit / 2;
+    padding-left: $spacing-unit / 2;
+  }
+}
+
+
+
+/**
+ * Clearfix
+ */
+%clearfix:after {
+  content: "";
+  display: table;
+  clear: both;
+}
+
+
+
+/**
+ * Icons
+ */
+.icon > svg {
+  display: inline-block;
+  vertical-align: middle;
+
+  path {
+    fill: $grey-color;
+  }
+}
+
+.social-media-list {
+  .icon {
+    padding-right: 5px;
+  }
+
+  li + li {
+    padding-top: 5px;
+  }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima/_layout.scss b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima/_layout.scss
new file mode 100644
index 0000000..121042b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima/_layout.scss
@@ -0,0 +1,250 @@
+/**
+ * Site header
+ */
+.site-header {
+  border-top: 5px solid $grey-color-dark;
+  border-bottom: 1px solid $grey-color-light;
+  min-height: $spacing-unit * 1.865;
+
+  // Positioning context for the mobile navigation icon
+  position: relative;
+}
+
+.site-title {
+  @include relative-font-size(1.625);
+  font-weight: 300;
+  line-height: $base-line-height * $base-font-size * 2.25;
+  letter-spacing: -1px;
+  margin-bottom: 0;
+  float: left;
+
+  &,
+  &:visited {
+    color: $grey-color-dark;
+  }
+}
+
+.site-nav {
+  float: right;
+  line-height: $base-line-height * $base-font-size * 2.25;
+
+  .nav-trigger {
+      display: none;
+  }
+
+  .menu-icon {
+    display: none;
+  }
+
+  .page-link {
+    color: $text-color;
+    line-height: $base-line-height;
+
+    // Gaps between nav items, but not on the last one
+    &:not(:last-child) {
+      margin-right: 20px;
+    }
+  }
+
+  @include media-query($on-palm) {
+    position: absolute;
+    top: 9px;
+    right: $spacing-unit / 2;
+    background-color: $background-color;
+    border: 1px solid $grey-color-light;
+    border-radius: 5px;
+    text-align: right;
+
+    label[for="nav-trigger"] {
+      display: block;
+      float: right;
+      width: 36px;
+      height: 36px;
+      z-index: 2;
+      cursor: pointer;
+    }
+
+    .menu-icon {
+      display: block;
+      float: right;
+      width: 36px;
+      height: 26px;
+      line-height: 0;
+      padding-top: 10px;
+      text-align: center;
+
+      > svg path {
+        fill: $grey-color-dark;
+      }
+    }
+
+    input ~ .trigger {
+      clear: both;
+      display: none;
+    }
+
+    input:checked ~ .trigger {
+      display: block;
+      padding-bottom: 5px;
+    }
+
+    .page-link {
+      display: block;
+      padding: 5px 10px;
+
+      &:not(:last-child) {
+        margin-right: 0;
+      }
+      margin-left: 20px;
+    }
+  }
+}
+
+
+
+/**
+ * Site footer
+ */
+.site-footer {
+  border-top: 1px solid $grey-color-light;
+  padding: $spacing-unit 0;
+}
+
+.footer-heading {
+  @include relative-font-size(1.125);
+  margin-bottom: $spacing-unit / 2;
+}
+
+.contact-list,
+.social-media-list {
+  list-style: none;
+  margin-left: 0;
+}
+
+.footer-col-wrapper {
+  @include relative-font-size(0.9375);
+  color: $grey-color;
+  margin-left: -$spacing-unit / 2;
+  @extend %clearfix;
+}
+
+.footer-col {
+  float: left;
+  margin-bottom: $spacing-unit / 2;
+  padding-left: $spacing-unit / 2;
+}
+
+.footer-col-1 {
+  width: -webkit-calc(35% - (#{$spacing-unit} / 2));
+  width:         calc(35% - (#{$spacing-unit} / 2));
+}
+
+.footer-col-2 {
+  width: -webkit-calc(20% - (#{$spacing-unit} / 2));
+  width:         calc(20% - (#{$spacing-unit} / 2));
+}
+
+.footer-col-3 {
+  width: -webkit-calc(45% - (#{$spacing-unit} / 2));
+  width:         calc(45% - (#{$spacing-unit} / 2));
+}
+
+@include media-query($on-laptop) {
+  .footer-col-1,
+  .footer-col-2 {
+    width: -webkit-calc(50% - (#{$spacing-unit} / 2));
+    width:         calc(50% - (#{$spacing-unit} / 2));
+  }
+
+  .footer-col-3 {
+    width: -webkit-calc(100% - (#{$spacing-unit} / 2));
+    width:         calc(100% - (#{$spacing-unit} / 2));
+  }
+}
+
+@include media-query($on-palm) {
+  .footer-col {
+    float: none;
+    width: -webkit-calc(100% - (#{$spacing-unit} / 2));
+    width:         calc(100% - (#{$spacing-unit} / 2));
+  }
+}
+
+
+
+/**
+ * Page content
+ */
+.page-content {
+  padding: $spacing-unit 0;
+}
+
+.page-heading {
+  @include relative-font-size(1.25);
+}
+
+.post-list {
+  margin-left: 0;
+  list-style: none;
+
+  > li {
+    margin-bottom: $spacing-unit;
+  }
+}
+
+.post-meta {
+  font-size: $small-font-size;
+  color: $grey-color;
+}
+
+.post-link {
+  display: block;
+  @include relative-font-size(1.5);
+}
+
+
+
+/**
+ * Posts
+ */
+.post-header {
+  margin-bottom: $spacing-unit;
+}
+
+.post-title {
+  @include relative-font-size(2.625);
+  letter-spacing: -1px;
+  line-height: 1;
+
+  @include media-query($on-laptop) {
+    @include relative-font-size(2.25);
+  }
+}
+
+.post-content {
+  margin-bottom: $spacing-unit;
+
+  h2 {
+    @include relative-font-size(2);
+
+    @include media-query($on-laptop) {
+      @include relative-font-size(1.75);
+    }
+  }
+
+  h3 {
+    @include relative-font-size(1.625);
+
+    @include media-query($on-laptop) {
+      @include relative-font-size(1.375);
+    }
+  }
+
+  h4 {
+    @include relative-font-size(1.25);
+
+    @include media-query($on-laptop) {
+      @include relative-font-size(1.125);
+    }
+  }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima/_syntax-highlighting.scss b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima/_syntax-highlighting.scss
new file mode 100644
index 0000000..bccdb89
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/_sass/minima/_syntax-highlighting.scss
@@ -0,0 +1,71 @@
+/**
+ * Syntax highlighting styles
+ */
+.highlight {
+  background: #fff;
+  @extend %vertical-rhythm;
+
+  .highlighter-rouge & {
+    background: #eef;
+  }
+
+  .c     { color: #998; font-style: italic } // Comment
+  .err   { color: #a61717; background-color: #e3d2d2 } // Error
+  .k     { font-weight: bold } // Keyword
+  .o     { font-weight: bold } // Operator
+  .cm    { color: #998; font-style: italic } // Comment.Multiline
+  .cp    { color: #999; font-weight: bold } // Comment.Preproc
+  .c1    { color: #998; font-style: italic } // Comment.Single
+  .cs    { color: #999; font-weight: bold; font-style: italic } // Comment.Special
+  .gd    { color: #000; background-color: #fdd } // Generic.Deleted
+  .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific
+  .ge    { font-style: italic } // Generic.Emph
+  .gr    { color: #a00 } // Generic.Error
+  .gh    { color: #999 } // Generic.Heading
+  .gi    { color: #000; background-color: #dfd } // Generic.Inserted
+  .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific
+  .go    { color: #888 } // Generic.Output
+  .gp    { color: #555 } // Generic.Prompt
+  .gs    { font-weight: bold } // Generic.Strong
+  .gu    { color: #aaa } // Generic.Subheading
+  .gt    { color: #a00 } // Generic.Traceback
+  .kc    { font-weight: bold } // Keyword.Constant
+  .kd    { font-weight: bold } // Keyword.Declaration
+  .kp    { font-weight: bold } // Keyword.Pseudo
+  .kr    { font-weight: bold } // Keyword.Reserved
+  .kt    { color: #458; font-weight: bold } // Keyword.Type
+  .m     { color: #099 } // Literal.Number
+  .s     { color: #d14 } // Literal.String
+  .na    { color: #008080 } // Name.Attribute
+  .nb    { color: #0086B3 } // Name.Builtin
+  .nc    { color: #458; font-weight: bold } // Name.Class
+  .no    { color: #008080 } // Name.Constant
+  .ni    { color: #800080 } // Name.Entity
+  .ne    { color: #900; font-weight: bold } // Name.Exception
+  .nf    { color: #900; font-weight: bold } // Name.Function
+  .nn    { color: #555 } // Name.Namespace
+  .nt    { color: #000080 } // Name.Tag
+  .nv    { color: #008080 } // Name.Variable
+  .ow    { font-weight: bold } // Operator.Word
+  .w     { color: #bbb } // Text.Whitespace
+  .mf    { color: #099 } // Literal.Number.Float
+  .mh    { color: #099 } // Literal.Number.Hex
+  .mi    { color: #099 } // Literal.Number.Integer
+  .mo    { color: #099 } // Literal.Number.Oct
+  .sb    { color: #d14 } // Literal.String.Backtick
+  .sc    { color: #d14 } // Literal.String.Char
+  .sd    { color: #d14 } // Literal.String.Doc
+  .s2    { color: #d14 } // Literal.String.Double
+  .se    { color: #d14 } // Literal.String.Escape
+  .sh    { color: #d14 } // Literal.String.Heredoc
+  .si    { color: #d14 } // Literal.String.Interpol
+  .sx    { color: #d14 } // Literal.String.Other
+  .sr    { color: #009926 } // Literal.String.Regex
+  .s1    { color: #d14 } // Literal.String.Single
+  .ss    { color: #990073 } // Literal.String.Symbol
+  .bp    { color: #999 } // Name.Builtin.Pseudo
+  .vc    { color: #008080 } // Name.Variable.Class
+  .vg    { color: #008080 } // Name.Variable.Global
+  .vi    { color: #008080 } // Name.Variable.Instance
+  .il    { color: #099 } // Literal.Number.Integer.Long
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/assets/main.scss b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/assets/main.scss
new file mode 100644
index 0000000..c60ebe4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/minima-2.1.1/assets/main.scss
@@ -0,0 +1,5 @@
+---
+# Only the main Sass file needs front matter (the dashes are enough)
+---
+
+@import "minima";
diff --git a/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/Gemfile b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/Gemfile
new file mode 100644
index 0000000..140e9d4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/Gemfile
@@ -0,0 +1,25 @@
+# ----------------------------------------------------------------------------
+# Frozen-string-literal: true
+# Copyright: 2015-2016 Jordon Bedwell - MIT License
+# Encoding: utf-8
+# ----------------------------------------------------------------------------
+
+source "https://rubygems.org"
+gem "rake", :require => false
+gemspec
+
+group :test do
+  gem "luna-rspec-formatters", :require => false
+  gem "codeclimate-test-reporter", :require => false
+  gem "safe_yaml", :require => false
+end
+
+group :development do
+  gem "rspec", :require => false
+  gem "rspec-helpers", :require => false
+  gem "luna-rubocop-formatters", :require => false
+  gem "rubocop", :github => "bbatsov/rubocop", :require => false
+  gem "benchmark-ips", :require => false
+  gem "simple-ansi", :require => false
+  gem "pry", :require => false
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/LICENSE b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/LICENSE
new file mode 100644
index 0000000..e603a78
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2015-2016 Jordon Bedwell
+
+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/bundle/ruby/2.4.0/gems/pathutil-0.14.0/Rakefile b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/Rakefile
new file mode 100644
index 0000000..f3af3c1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/Rakefile
@@ -0,0 +1,83 @@
+# ----------------------------------------------------------------------------
+# Frozen-string-literal: true
+# Copyright: 2015-2016 Jordon Bedwell - MIT License
+# Encoding: utf-8
+# ----------------------------------------------------------------------------
+
+require "open3"
+require "rspec/core/rake_task"
+require_relative "benchmark/support/task"
+require "luna/rubocop/rake/task"
+require "simple/ansi"
+require "pathutil"
+require "json"
+
+# ----------------------------------------------------------------------------
+
+task :default => [
+  ENV["BENCHMARK"] ? :benchmark : :spec
+]
+
+# ----------------------------------------------------------------------------
+
+BenchmarkTask.new :benchmark
+RSpec::Core::RakeTask.new :spec
+task :test => :spec
+
+# ----------------------------------------------------------------------------
+
+namespace :diff do
+  desc "List methods we have that Pathname doesn't."
+  task :methods do
+    methods = Pathutil.instance_methods - Pathname.instance_methods - Object.instance_methods
+    methods.each do |method|
+      $stdout.print "- ", "`", method, "`", "\n"
+    end
+  end
+end
+
+# ----------------------------------------------------------------------------
+
+namespace :missing do
+  desc "List methods we are missing."
+  task :methods do
+    methods = Pathname.instance_methods - Pathutil.instance_methods - Object.instance_methods
+    methods-= [
+      :cleanpath
+    ]
+
+    methods.each do |method|
+      $stdout.puts method
+    end
+  end
+end
+
+# ----------------------------------------------------------------------------
+
+namespace :pathname do
+  desc "List all of Pathnames methods."
+  task :methods do
+    methods = Pathname.instance_methods - Object.instance_methods
+    methods.each_with_index do |method, index|
+      $stdout.print method
+      unless index == methods.size - 1
+        $stdout.print ", "
+      end
+    end
+
+    $stdout.puts
+  end
+end
+
+# ----------------------------------------------------------------------------
+
+desc "List all of Pathutils methods."
+task :methods do
+  methods = Pathutil.instance_methods - Object.instance_methods
+  methods.each_with_index do |method, index|
+    $stdout.print "`", method, "`"
+    $stdout.print ", " unless index == methods.size - 1
+  end
+
+  $stdout.puts
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/lib/pathutil.rb b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/lib/pathutil.rb
new file mode 100644
index 0000000..1078392
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/lib/pathutil.rb
@@ -0,0 +1,913 @@
+# Frozen-string-literal: true
+# Copyright: 2015-2016 Jordon Bedwell - MIT License
+# Encoding: utf-8
+
+require "pathutil/helpers"
+require "forwardable/extended"
+require "find"
+
+class Pathutil
+  attr_writer :encoding
+  extend Forwardable::Extended
+  extend Helpers
+
+  # --
+  # @note A lot of this class can be compatible with Pathname.
+  # Initialize a new instance.
+  # @return Pathutil
+  # --
+  def initialize(path)
+    return @path = path if path.is_a?(String)
+    return @path = path.to_path if path.respond_to?(:to_path)
+    return @path = path.to_s
+  end
+
+  # --
+  # Make a path relative.
+  # --
+
+  def relative
+    return self if relative?
+    self.class.new(strip_windows_drive.gsub(
+      %r!\A(\\+|/+)!, ""
+    ))
+  end
+
+  # --
+  # Make a path absolute
+  # --
+
+  def absolute
+    return self if absolute?
+    self.class.new("/").join(
+      @path
+    )
+  end
+
+  # --
+  # @see Pathname#cleanpath.
+  # @note This is a wholesale rip and cleanup of Pathname#cleanpath
+  # @return Pathutil
+  # --
+  def cleanpath(symlink = false)
+    symlink ? conservative_cleanpath : aggressive_cleanpath
+  end
+
+  # --
+  # @yield Pathutil
+  # @note It will return all results that it finds across all ascending paths.
+  # @example Pathutil.new("~/").expand_path.search_backwards(".bashrc") => [#<Pathutil:/home/user/.bashrc>]
+  # Search backwards for a file (like Rakefile, _config.yml, opts.yml).
+  # @return Enum
+  # --
+  def search_backwards(file, backwards: Float::INFINITY)
+    ary = []
+
+    ascend.with_index(1).each do |path, index|
+      if index > backwards
+        break
+
+      else
+        Dir.chdir path do
+          if block_given?
+            file = self.class.new(file)
+            if yield(file)
+              ary.push(
+                file
+              )
+            end
+
+          elsif File.exist?(file)
+            ary.push(self.class.new(
+              path.join(file)
+            ))
+          end
+        end
+      end
+    end
+
+    ary
+  end
+
+  # --
+  # Read the file as a YAML file turning it into an object.
+  # @see self.class.load_yaml as this a direct alias of that method.
+  # @return Hash
+  # --
+  def read_yaml(throw_missing: false, **kwd)
+    self.class.load_yaml(
+      read, **kwd
+    )
+
+  rescue Errno::ENOENT
+    throw_missing ? raise : (
+      return {}
+    )
+  end
+
+  # --
+  # Read the file as a JSON file turning it into an object.
+  # @see self.class.read_json as this is a direct alias of that method.
+  # @return Hash
+  # --
+  def read_json(throw_missing: false)
+    JSON.parse(
+      read
+    )
+
+  rescue Errno::ENOENT
+    throw_missing ? raise : (
+      return {}
+    )
+  end
+
+  # --
+  # @note The blank part is intentionally left there so that you can rejoin.
+  # Splits the path into all parts so that you can do step by step comparisons
+  # @example Pathutil.new("/my/path").split_path # => ["", "my", "path"]
+  # @return Array<String>
+  # --
+  def split_path
+    @path.split(
+      %r!\\+|/+!
+    )
+  end
+
+  # --
+  # @see `String#==` for more details.
+  # A stricter version of `==` that also makes sure the object matches.
+  # @return true|false
+  # --
+  def ===(other)
+    other.is_a?(self.class) && @path == other
+  end
+
+  # --
+  # @example Pathutil.new("/hello") >= Pathutil.new("/") # => true
+  # @example Pathutil.new("/hello") >= Pathutil.new("/hello") # => true
+  # Checks to see if a path falls within a path and deeper or is the other.
+  # @return true|false
+  # --
+  def >=(other)
+    mine, other = expanded_paths(other)
+    return true if other == mine
+    mine.in_path?(other)
+  end
+
+  # --
+  # @example Pathutil.new("/hello/world") > Pathutil.new("/hello") # => true
+  # Strictly checks to see if a path is deeper but within the path of the other.
+  # @return true|false
+  # --
+  def >(other)
+    mine, other = expanded_paths(other)
+    return false if other == mine
+    mine.in_path?(other)
+  end
+
+  # --
+  # @example Pathutil.new("/") < Pathutil.new("/hello") # => true
+  # Strictly check to see if a path is behind other path but within it.
+  # @return true|false
+  # --
+  def <(other)
+    mine, other = expanded_paths(other)
+    return false if other == mine
+    other.in_path?(mine)
+  end
+
+  # --
+  # Check to see if a path is behind the other path but within it.
+  # @example Pathutil.new("/hello") < Pathutil.new("/hello") # => true
+  # @example Pathutil.new("/") < Pathutil.new("/hello") # => true
+  # @return true|false
+  # --
+  def <=(other)
+    mine, other = expanded_paths(other)
+    return true if other == mine
+    other.in_path?(mine)
+  end
+
+  # --
+  # @note "./" is considered relative.
+  # Check to see if the path is absolute, as in: starts with "/"
+  # @return true|false
+  # --
+  def absolute?
+    return !!(
+      @path =~ %r!\A(?:[A-Za-z]:)?(?:\\+|/+)!
+    )
+  end
+
+  # --
+  # @yield Pathutil
+  # Break apart the path and yield each with the previous parts.
+  # @example Pathutil.new("/hello/world").ascend.to_a # => ["/", "/hello", "/hello/world"]
+  # @example Pathutil.new("/hello/world").ascend { |path| $stdout.puts path }
+  # @return Enum
+  # --
+  def ascend
+    unless block_given?
+      return to_enum(
+        __method__
+      )
+    end
+
+    yield(
+      path = self
+    )
+
+    while (new_path = path.dirname)
+      if path == new_path || new_path == "."
+        break
+      else
+        path = new_path
+        yield  new_path
+      end
+    end
+
+    nil
+  end
+
+  # --
+  # @yield Pathutil
+  # Break apart the path in reverse order and descend into the path.
+  # @example Pathutil.new("/hello/world").descend.to_a # => ["/hello/world", "/hello", "/"]
+  # @example Pathutil.new("/hello/world").descend { |path| $stdout.puts path }
+  # @return Enum
+  # --
+  def descend
+    unless block_given?
+      return to_enum(
+        __method__
+      )
+    end
+
+    ascend.to_a.reverse_each do |val|
+      yield val
+    end
+
+    nil
+  end
+
+  # --
+  # @yield Pathutil
+  # @example Pathutil.new("/hello/world").each_line { |line| $stdout.puts line }
+  # Wraps `readlines` and allows you to yield on the result.
+  # @return Enum
+  # --
+  def each_line
+    return to_enum(__method__) unless block_given?
+    readlines.each do |line|
+      yield line
+    end
+
+    nil
+  end
+
+  # --
+  # @example Pathutil.new("/hello").fnmatch?("/hello") # => true
+  # Unlike traditional `fnmatch`, with this one `Regexp` is allowed.
+  # @example Pathutil.new("/hello").fnmatch?(/h/) # => true
+  # @see `File#fnmatch` for more information.
+  # @return true|false
+  # --
+  def fnmatch?(matcher)
+    matcher.is_a?(Regexp) ? !!(self =~ matcher) : \
+      File.fnmatch(matcher, self)
+  end
+
+  # --
+  # Allows you to quickly determine if the file is the root folder.
+  # @return true|false
+  # --
+  def root?
+    !!(self =~ %r!\A(?:[A-Za-z]:)?(?:\\+|/+)\z!)
+  end
+
+  # --
+  # Allows you to check if the current path is in the path you want.
+  # @return true|false
+  # --
+  def in_path?(path)
+    path = self.class.new(path).expand_path.split_path
+    mine = (symlink?? expand_path.realpath : expand_path).split_path
+    path.each_with_index { |part, index| return false if mine[index] != part }
+    true
+  end
+
+  # --
+
+  def inspect
+    "#<#{self.class}:#{@path}>"
+  end
+
+  # --
+  # @return Array<Pathutil>
+  # Grab all of the children from the current directory, including hidden.
+  # @yield Pathutil
+  # --
+  def children
+    ary = []
+
+    Dir.foreach(@path) do |path|
+      if path == "." || path == ".."
+        next
+      else
+        path = self.class.new(File.join(@path, path))
+        yield path if block_given?
+        ary.push(
+          path
+        )
+      end
+    end
+
+    ary
+  end
+
+  # --
+  # @yield Pathutil
+  # Allows you to glob however you wish to glob in the current `Pathutil`
+  # @see `File::Constants` for a list of flags.
+  # @return Enum
+  # --
+  def glob(pattern, flags = 0)
+    unless block_given?
+      return to_enum(
+        __method__, pattern, flags
+      )
+    end
+
+    chdir do
+      Dir.glob(pattern, flags).each do |file|
+        yield self.class.new(
+          File.join(@path, file)
+        )
+      end
+    end
+
+    nil
+  end
+
+  # --
+  # @yield &block
+  # Move to the current directory temporarily (or for good) and do work son.
+  # @note you do not need to ship a block at all.
+  # @return nil
+  # --
+  def chdir
+    if !block_given?
+      Dir.chdir(
+        @path
+      )
+
+    else
+      Dir.chdir @path do
+        yield
+      end
+    end
+  end
+
+  # --
+  # @yield Pathutil
+  # Find all files without care and yield the given block.
+  # @return Enum
+  # --
+  def find
+    return to_enum(__method__) unless block_given?
+    Find.find @path do |val|
+      yield self.class.new(val)
+    end
+  end
+
+  # --
+  # @yield Pathutil
+  # Splits the path returning each part (filename) back to you.
+  # @return Enum
+  # --
+  def each_filename
+    return to_enum(__method__) unless block_given?
+    @path.split(File::SEPARATOR).delete_if(&:empty?).each do |file|
+      yield file
+    end
+  end
+
+  # --
+  # Get the parent of the current path.
+  # @note This will simply return self if "/".
+  # @return Pathutil
+  # --
+  def parent
+    return self if @path == "/"
+    self.class.new(absolute?? File.dirname(@path) : File.join(
+      @path, ".."
+    ))
+  end
+
+  # --
+  # @yield Pathutil
+  # Split the file into its dirname and basename, so you can do stuff.
+  # @return nil
+  # --
+  def split
+    File.split(@path).collect! do |path|
+      self.class.new(path)
+    end
+  end
+
+  # --
+  # @note Your extension should start with "."
+  # Replace a files extension with your given extension.
+  # @return Pathutil
+  # --
+  def sub_ext(ext)
+    self.class.new(@path.chomp(File.extname(@path)) + ext)
+  end
+
+  # --
+  # A less complex version of `relative_path_from` that simply uses a
+  # `Regexp` and returns the full path if it cannot be determined.
+  # @return Pathutil
+  # --
+  def relative_path_from(from)
+    from = self.class.new(from).expand_path.gsub(%r!/$!, "")
+    self.class.new(expand_path.gsub(%r!^#{
+      from.regexp_escape
+    }/!, ""))
+  end
+
+  # --
+  # Expands the path and left joins the root to the path.
+  # @return Pathutil
+  # --
+  def enforce_root(root)
+    return self if !relative? && in_path?(root)
+    self.class.new(root).join(
+      self
+    )
+  end
+
+  # --
+  # Copy a directory, allowing symlinks if the link falls inside of the root.
+  # This is indented for people who wish some safety to their copies.
+  # @note Ignore is ignored on safe_copy file because it's explicit.
+  # @return nil
+  # --
+  def safe_copy(to, root: nil, ignore: [])
+    raise ArgumentError, "must give a root" unless root
+    root = self.class.new(root)
+    to   = self.class.new(to)
+
+    if directory?
+      safe_copy_directory(to, {
+        :root => root, :ignore => ignore
+      })
+
+    else
+      safe_copy_file(to, {
+        :root => root
+      })
+    end
+  end
+
+  # --
+  # @see `self.class.normalize` as this is an alias.
+  # --
+  def normalize
+    return @normalize ||= begin
+      self.class.normalize
+    end
+  end
+
+  # --
+  # @see `self.class.encoding` as this is an alias.
+  # --
+  def encoding
+    return @encoding ||= begin
+      self.class.encoding
+    end
+  end
+
+  # --
+  # @note You can set the default encodings via the class.
+  # Read took two steroid shots: it can normalize your string, and encode.
+  # @return String
+  # --
+  def read(*args, **kwd)
+    kwd[:encoding] ||= encoding
+
+    if normalize[:read]
+      File.read(self, *args, kwd).encode({
+        :universal_newline => true
+      })
+
+    else
+      File.read(
+        self, *args, kwd
+      )
+    end
+  end
+
+  # --
+  # @note You can set the default encodings via the class.
+  # Binread took two steroid shots: it can normalize your string, and encode.
+  # @return String
+  # --
+  def binread(*args, **kwd)
+    kwd[:encoding] ||= encoding
+
+    if normalize[:read]
+      File.binread(self, *args, kwd).encode({
+        :universal_newline => true
+      })
+
+    else
+      File.read(
+        self, *args, kwd
+      )
+    end
+  end
+
+  # --
+  # @note You can set the default encodings via the class.
+  # Readlines took two steroid shots: it can normalize your string, and encode.
+  # @return Array<String>
+  # --
+  def readlines(*args, **kwd)
+    kwd[:encoding] ||= encoding
+
+    if normalize[:read]
+      File.readlines(self, *args, kwd).encode({
+        :universal_newline => true
+      })
+
+    else
+      File.readlines(
+        self, *args, kwd
+      )
+    end
+  end
+
+  # --
+  # @note You can set the default encodings via the class.
+  # Write took two steroid shots: it can normalize your string, and encode.
+  # @return Fixnum<Bytes>
+  # --
+  def write(data, *args, **kwd)
+    kwd[:encoding] ||= encoding
+
+    if normalize[:write]
+      File.write(self, data.encode(
+        :crlf_newline => true
+      ), *args, kwd)
+
+    else
+      File.write(
+        self, data, *args, kwd
+      )
+    end
+  end
+
+  # --
+  # @note You can set the default encodings via the class.
+  # Binwrite took two steroid shots: it can normalize your string, and encode.
+  # @return Fixnum<Bytes>
+  # --
+  def binwrite(data, *args, **kwd)
+    kwd[:encoding] ||= encoding
+
+    if normalize[:write]
+      File.binwrite(self, data.encode(
+        :crlf_newline => true
+      ), *args, kwd)
+
+    else
+      File.binwrite(
+        self, data, *args, kwd
+      )
+    end
+  end
+
+  # --
+
+  def to_regexp(guard: true)
+    Regexp.new((guard ? "\\A" : "") + Regexp.escape(
+      self
+    ))
+  end
+
+  # --
+  # Strips the windows drive from the path.
+  # --
+
+  def strip_windows_drive(path = @path)
+    self.class.new(path.gsub(
+      %r!\A[A-Za-z]:(?:\\+|/+)!, ""
+    ))
+  end
+
+  # --
+  # rubocop:disable Metrics/AbcSize
+  # rubocop:disable Metrics/CyclomaticComplexity
+  # rubocop:disable Metrics/PerceivedComplexity
+  # --
+
+  def aggressive_cleanpath
+    return self.class.new("/") if root?
+
+    _out = split_path.each_with_object([]) do |part, out|
+      next if part == "." || (part == ".." && out.last == "")
+      if part == ".." && out.last && out.last != ".."
+        out.pop
+
+      else
+        out.push(
+          part
+        )
+      end
+    end
+
+    # --
+
+    return self.class.new("/") if _out == [""].freeze
+    return self.class.new(".") if _out.empty? && (end_with?(".") || relative?)
+    self.class.new(_out.join("/"))
+  end
+
+  # --
+
+  def conservative_cleanpath
+    _out = split_path.each_with_object([]) do |part, out|
+      next if part == "." || (part == ".." && out.last == "")
+      out.push(
+        part
+      )
+    end
+
+    # --
+
+    if !_out.empty? && basename == "." && _out.last != "" && _out.last != ".."
+      _out << "."
+    end
+
+    # --
+
+    return self.class.new("/") if _out == [""].freeze
+    return self.class.new(".") if _out.empty? && (end_with?(".") || relative?)
+    return self.class.new(_out.join("/")).join("") if @path =~ %r!/\z! \
+      && _out.last != "." && _out.last != ".."
+    self.class.new(_out.join("/"))
+  end
+
+  # --
+  # rubocop:enable Metrics/AbcSize
+  # rubocop:enable Metrics/CyclomaticComplexity
+  # rubocop:enable Metrics/PerceivedComplexity
+  # Expand the paths and return.
+  # --
+  private
+  def expanded_paths(path)
+    return expand_path, self.class.new(path).expand_path
+  end
+
+  # --
+  # Safely copy a file.
+  # --
+  private
+  def safe_copy_file(to, root: nil)
+    raise Errno::EPERM, "#{self} not in #{root}" unless in_path?(root)
+    FileUtils.cp(self, to, {
+      :preserve => true
+    })
+  end
+
+  # --
+  # Safely copy a directory and it's sub-files.
+  # --
+  private
+  def safe_copy_directory(to, root: nil, ignore: [])
+    ignore = [ignore].flatten.uniq
+
+    if !in_path?(root)
+      raise Errno::EPERM, "#{self} not in #{
+        root
+      }"
+
+    else
+      to.mkdir_p unless to.exist?
+      children do |file|
+        unless ignore.any? { |path| file.in_path?(path) }
+          if !file.in_path?(root)
+            raise Errno::EPERM, "#{file} not in #{
+              root
+            }"
+
+          elsif file.file?
+            FileUtils.cp(file, to, {
+              :preserve => true
+            })
+
+          else
+            path = file.realpath
+            path.safe_copy(to.join(file.basename), {
+              :root => root, :ignore => ignore
+            })
+          end
+        end
+      end
+    end
+  end
+
+  class << self
+    attr_writer :encoding
+
+    # --
+    # @note We do nothing special here.
+    # Get the current directory that Ruby knows about.
+    # @return Pathutil
+    # --
+    def pwd
+      new(
+        Dir.pwd
+      )
+    end
+
+    alias gcwd pwd
+    alias cwd  pwd
+
+    # --
+    # @note you are encouraged to override this if you need to.
+    # Aliases the default system encoding to us so that we can do most read
+    # and write operations with that encoding, instead of being crazy.
+    # --
+    def encoding
+      return @encoding ||= begin
+        Encoding.default_external
+      end
+    end
+
+    # --
+    # Normalize CRLF -> LF   on Windows reads, to ease  your troubles.
+    # Normalize LF   -> CLRF on Windows write, to ease  your troubles.
+    # --
+    def normalize
+      return @normalize ||= {
+        :read  => Gem.win_platform?,
+        :write => Gem.win_platform?
+      }
+    end
+
+    # --
+    # Make a temporary directory.
+    # @note if you adruptly exit it will not remove the dir.
+    # @note this directory is removed on exit.
+    # @return Pathutil
+    # --
+    def tmpdir(*args)
+      rtn = new(make_tmpname(*args)).tap(&:mkdir)
+      ObjectSpace.define_finalizer(rtn, proc do
+        rtn.rm_rf
+      end)
+
+      rtn
+    end
+
+    # --
+    # Make a temporary file.
+    # @note if you adruptly exit it will not remove the dir.
+    # @note this file is removed on exit.
+    # @return Pathutil
+    # --
+    def tmpfile(*args)
+      rtn = new(make_tmpname(*args)).tap(&:touch)
+      ObjectSpace.define_finalizer(rtn, proc do
+        rtn.rm_rf
+      end)
+
+      rtn
+    end
+  end
+
+  # --
+
+  rb_delegate :gcwd, :to => :"self.class"
+  rb_delegate :pwd,  :to => :"self.class"
+
+  # --
+
+  rb_delegate :sub,         :to => :@path, :wrap => true
+  rb_delegate :chomp,       :to => :@path, :wrap => true
+  rb_delegate :gsub,        :to => :@path, :wrap => true
+  rb_delegate :=~,          :to => :@path
+  rb_delegate :==,          :to => :@path
+  rb_delegate :to_s,        :to => :@path
+  rb_delegate :freeze,      :to => :@path
+  rb_delegate :end_with?,   :to => :@path
+  rb_delegate :start_with?, :to => :@path
+  rb_delegate :frozen?,     :to => :@path
+  rb_delegate :to_str,      :to => :@path
+  rb_delegate :"!~",        :to => :@path
+  rb_delegate :<=>,         :to => :@path
+
+  # --
+
+  rb_delegate :chmod,        :to => :File, :args => { :after => :@path }
+  rb_delegate :lchown,       :to => :File, :args => { :after => :@path }
+  rb_delegate :lchmod,       :to => :File, :args => { :after => :@path }
+  rb_delegate :chown,        :to => :File, :args => { :after => :@path }
+  rb_delegate :basename,     :to => :File, :args => :@path, :wrap => true
+  rb_delegate :dirname,      :to => :File, :args => :@path, :wrap => true
+  rb_delegate :readlink,     :to => :File, :args => :@path, :wrap => true
+  rb_delegate :expand_path,  :to => :File, :args => :@path, :wrap => true
+  rb_delegate :realdirpath,  :to => :File, :args => :@path, :wrap => true
+  rb_delegate :realpath,     :to => :File, :args => :@path, :wrap => true
+  rb_delegate :rename,       :to => :File, :args => :@path, :wrap => true
+  rb_delegate :join,         :to => :File, :args => :@path, :wrap => true
+  rb_delegate :size,         :to => :File, :args => :@path
+  rb_delegate :link,         :to => :File, :args => :@path
+  rb_delegate :atime,        :to => :File, :args => :@path
+  rb_delegate :ctime,        :to => :File, :args => :@path
+  rb_delegate :lstat,        :to => :File, :args => :@path
+  rb_delegate :utime,        :to => :File, :args => :@path
+  rb_delegate :sysopen,      :to => :File, :args => :@path
+  rb_delegate :birthtime,    :to => :File, :args => :@path
+  rb_delegate :mountpoint?,  :to => :File, :args => :@path
+  rb_delegate :truncate,     :to => :File, :args => :@path
+  rb_delegate :symlink,      :to => :File, :args => :@path
+  rb_delegate :extname,      :to => :File, :args => :@path
+  rb_delegate :zero?,        :to => :File, :args => :@path
+  rb_delegate :ftype,        :to => :File, :args => :@path
+  rb_delegate :mtime,        :to => :File, :args => :@path
+  rb_delegate :open,         :to => :File, :args => :@path
+  rb_delegate :stat,         :to => :File, :args => :@path
+
+  # --
+
+  rb_delegate :pipe?,            :to => :FileTest, :args => :@path
+  rb_delegate :file?,            :to => :FileTest, :args => :@path
+  rb_delegate :owned?,           :to => :FileTest, :args => :@path
+  rb_delegate :setgid?,          :to => :FileTest, :args => :@path
+  rb_delegate :socket?,          :to => :FileTest, :args => :@path
+  rb_delegate :readable?,        :to => :FileTest, :args => :@path
+  rb_delegate :blockdev?,        :to => :FileTest, :args => :@path
+  rb_delegate :directory?,       :to => :FileTest, :args => :@path
+  rb_delegate :readable_real?,   :to => :FileTest, :args => :@path
+  rb_delegate :world_readable?,  :to => :FileTest, :args => :@path
+  rb_delegate :executable_real?, :to => :FileTest, :args => :@path
+  rb_delegate :world_writable?,  :to => :FileTest, :args => :@path
+  rb_delegate :writable_real?,   :to => :FileTest, :args => :@path
+  rb_delegate :executable?,      :to => :FileTest, :args => :@path
+  rb_delegate :writable?,        :to => :FileTest, :args => :@path
+  rb_delegate :grpowned?,        :to => :FileTest, :args => :@path
+  rb_delegate :chardev?,         :to => :FileTest, :args => :@path
+  rb_delegate :symlink?,         :to => :FileTest, :args => :@path
+  rb_delegate :sticky?,          :to => :FileTest, :args => :@path
+  rb_delegate :setuid?,          :to => :FileTest, :args => :@path
+  rb_delegate :exist?,           :to => :FileTest, :args => :@path
+  rb_delegate :size?,            :to => :FileTest, :args => :@path
+
+  # --
+
+  rb_delegate :rm_rf,   :to => :FileUtils, :args => :@path
+  rb_delegate :rm_r,    :to => :FileUtils, :args => :@path
+  rb_delegate :rm_f,    :to => :FileUtils, :args => :@path
+  rb_delegate :rm,      :to => :FileUtils, :args => :@path
+  rb_delegate :cp_r,    :to => :FileUtils, :args => :@path
+  rb_delegate :touch,   :to => :FileUtils, :args => :@path
+  rb_delegate :mkdir_p, :to => :FileUtils, :args => :@path
+  rb_delegate :mkpath,  :to => :FileUtils, :args => :@path
+  rb_delegate :cp,      :to => :FileUtils, :args => :@path
+
+  # --
+
+  rb_delegate :each_child, :to => :children
+  rb_delegate :each_entry, :to => :children
+  rb_delegate :to_a,       :to => :children
+
+  # --
+
+  rb_delegate :opendir, :to => :Dir, :alias_of => :open
+  rb_delegate :relative?, :to => :self, :alias_of => :absolute?, :bool => :reverse
+  rb_delegate :regexp_escape, :to => :Regexp, :args => :@path, :alias_of => :escape
+  rb_delegate :shellescape, :to => :Shellwords, :args => :@path
+  rb_delegate :mkdir, :to => :Dir, :args => :@path
+
+  # --
+
+  alias + join
+  alias delete rm
+  alias rmtree rm_r
+  alias to_path to_s
+  alias last basename
+  alias entries children
+  alias make_symlink symlink
+  alias cleanpath_conservative conservative_cleanpath
+  alias cleanpath_aggressive aggressive_cleanpath
+  alias prepend enforce_root
+  alias fnmatch fnmatch?
+  alias make_link link
+  alias first dirname
+  alias rmdir rm_r
+  alias unlink rm
+  alias / join
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/lib/pathutil/helpers.rb b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/lib/pathutil/helpers.rb
new file mode 100644
index 0000000..f4ec835
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/lib/pathutil/helpers.rb
@@ -0,0 +1,108 @@
+class Pathutil
+  module Helpers
+    extend self
+
+    # --
+
+    def allowed
+      return @allowed ||= begin
+        {
+          :yaml => {
+            :classes => [],
+            :symbols => []
+          }
+        }
+      end
+    end
+
+    # --
+    # Wraps around YAML and SafeYAML to provide alternatives to Rubies.
+    # @note We default aliases to yes so we can detect if you explicit true.
+    # @return Hash
+    # --
+    def load_yaml(data, safe: true, whitelist_classes: allowed[:yaml][:classes], \
+        whitelist_symbols: allowed[:yaml][:symbols], aliases: :yes)
+
+      require "yaml"
+      unless safe
+        return YAML.load(
+          data
+        )
+      end
+
+      if !YAML.respond_to?(:safe_load)
+        setup_safe_yaml whitelist_classes, aliases
+        SafeYAML.load(
+          data
+        )
+
+      else
+        YAML.safe_load(
+          data,
+          whitelist_classes,
+          whitelist_symbols,
+          aliases
+        )
+      end
+    end
+
+    # --
+    # Make a temporary name suitable for temporary files and directories.
+    # @return String
+    # --
+    def make_tmpname(prefix = "", suffix = nil, root = nil)
+      prefix = tmpname_prefix(prefix)
+      suffix = tmpname_suffix(suffix)
+
+      root ||= Dir::Tmpname.tmpdir
+      File.join(root, Dir::Tmpname.make_tmpname(
+        prefix, suffix
+      ))
+    end
+
+    # --
+
+    private
+    def tmpname_suffix(suffix)
+      suffix = suffix.join("-") if suffix.is_a?(Array)
+      suffix = suffix.gsub(/\A\-/, "") unless !suffix || suffix.empty?
+      suffix
+    end
+
+    # --
+    # Cleanup the temp name prefix, joining if necessary.
+    # rubocop:disable Style/ParallelAssignment
+    # --
+    private
+    def tmpname_prefix(prefix)
+      ext, prefix = prefix, "" if !prefix.is_a?(Array) && prefix.start_with?(".")
+      ext = prefix.pop if prefix.is_a?(Array) && prefix[-1].start_with?(".")
+      prefix = prefix.join("-") if prefix.is_a?(Array)
+
+      unless prefix.empty?
+        prefix = prefix.gsub(/\-\Z/, "") \
+          + "-"
+      end
+
+      return [
+        prefix, ext || ""
+      ]
+    end
+
+    # --
+    # Wrap around, cleanup, deprecate and use SafeYAML.
+    # rubocop:enable Style/ParallelAssignment
+    # --
+    private
+    def setup_safe_yaml(whitelist_classes, aliases)
+      warn "WARN: SafeYAML does not support disabling  of aliases." if aliases && aliases != :yes
+      warn "WARN: SafeYAML will be removed when Ruby 2.0 goes EOL."
+      require "safe_yaml/load"
+
+      SafeYAML.restore_defaults!
+      whitelist_classes.map(&SafeYAML.method(
+        :whitelist_class!
+      ))
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/lib/pathutil/version.rb b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/lib/pathutil/version.rb
new file mode 100644
index 0000000..442f4ee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/pathutil-0.14.0/lib/pathutil/version.rb
@@ -0,0 +1,7 @@
+# Frozen-string-literal: true
+# Copyright: 2015-2016 Jordon Bedwell - MIT License
+# Encoding: utf-8
+
+class Pathutil
+  VERSION = "0.14.0"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.gitignore b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.gitignore
new file mode 100644
index 0000000..9e5a30a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.gitignore
@@ -0,0 +1,11 @@
+# Bundler
+.bundle
+Gemfile.lock
+pkg/*
+
+# Rubinius
+*.rbc
+
+# YARD
+.yardoc
+yardoc/
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.rubocop.yml b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.rubocop.yml
new file mode 100644
index 0000000..38af0d3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.rubocop.yml
@@ -0,0 +1,32 @@
+inherit_from:
+  - .rubocop_defaults.yml
+
+AllCops:
+  Exclude:
+    # Exclude .gemspec files because they are generally auto-generated
+    - '*.gemspec'
+    # Exclude vendored folders
+    - 'tmp/**/*'
+    - 'vendor/**/*'
+    # Exclude artifacts
+    - 'pkg/**/*'
+    # Other
+    - 'test/benchmarks/**/*'
+    - 'test/profilers/**/*'
+
+Style/ClassAndModuleChildren:
+  Exclude:
+    - 'spec/**/*_spec.rb'
+    - 'test/**/*_test.rb'
+
+# Dear Rubocop, I don't want to use String#strip_heredoc
+Layout/IndentHeredoc:
+  Enabled: false
+
+Style/WordArray:
+  Enabled: false
+  MinSize: 3
+
+Style/SymbolArray:
+  Enabled: false
+  MinSize: 3
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.rubocop_defaults.yml b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.rubocop_defaults.yml
new file mode 100644
index 0000000..86a8e81
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.rubocop_defaults.yml
@@ -0,0 +1,174 @@
+AllCops:
+  Exclude:
+    # Exclude .gemspec files because they are generally auto-generated
+    - '*.gemspec'
+    # Exclude vendored folders
+    - 'tmp/**/*'
+    - 'vendor/**/*'
+
+# [codesmell]
+Metrics/AbcSize:
+  Enabled: false
+  Exclude:
+    - 'spec/**/*_spec.rb'
+    - 'test/**/*_test.rb'
+
+# [codesmell]
+Metrics/BlockLength:
+  Enabled: false
+
+# [codesmell]
+Metrics/CyclomaticComplexity:
+  Enabled: false
+  Exclude:
+    - 'spec/**/*_spec.rb'
+    - 'test/**/*_test.rb'
+
+# [codesmell]
+Metrics/ClassLength:
+  Enabled: false
+  Exclude:
+    - 'spec/**/*_spec.rb'
+    - 'test/**/*_test.rb'
+
+# [codesmell]
+Metrics/LineLength:
+  Enabled: false
+  Exclude:
+    - 'spec/**/*_spec.rb'
+    - 'test/**/*_test.rb'
+  Max: 100
+
+# [codesmell]
+Metrics/MethodLength:
+  Enabled: false
+  Exclude:
+    - 'spec/**/*_spec.rb'
+    - 'test/**/*_test.rb'
+  Max: 10
+
+# [codesmell]
+Metrics/ModuleLength:
+  Enabled: false
+  Exclude:
+    - 'spec/**/*_spec.rb'
+    - 'test/**/*_test.rb'
+
+# [codesmell]
+Metrics/ParameterLists:
+  Enabled: false
+  Max: 5
+
+# [codesmell]
+Metrics/PerceivedComplexity:
+  Enabled: false
+
+# [codesmell]
+# I don't really get the point of this cop.
+Performance/RedundantMerge:
+  Enabled: false
+
+# Do not use "and" or "or" in conditionals, but for readability we can use it
+# to chain executions. Just beware of operator order.
+Style/AndOr:
+  EnforcedStyle: conditionals
+
+Style/Documentation:
+  Exclude:
+    - 'spec/**/*'
+    - 'test/**/*'
+
+# Double empty lines are useful to separate conceptually different methods
+# in the same class or module.
+Layout/EmptyLines:
+  Enabled: false
+
+# In most cases, a space is nice. Sometimes, it's not.
+# Just be consistent with the rest of the surrounding code.
+Layout/EmptyLinesAroundClassBody:
+  Enabled: false
+
+# In most cases, a space is nice. Sometimes, it's not.
+# Just be consistent with the rest of the surrounding code.
+Layout/EmptyLinesAroundModuleBody:
+  Enabled: false
+
+# This is quite buggy, as it doesn't recognize double lines.
+# Double empty lines are useful to separate conceptually different methods
+# in the same class or module.
+Layout/EmptyLineBetweenDefs:
+  Enabled: false
+
+# I personally don't care about the format style.
+# In most cases I like to use %, but not at the point I want to enforce it
+# as a convention in the entire code.
+Style/FormatString:
+  Enabled: false
+
+# Prefer the latest Hash syntax
+Style/HashSyntax:
+  Exclude:
+    # But Rakefiles generally have some definition like
+    #   :default => :test
+    # that looks nicer with the old rocket syntax.
+    - 'Rakefile'
+
+# Array indentation should be considered like MultilineMethodCallIndentation indentation
+# and use 4 spaces instead of 2.
+Layout/IndentArray:
+  IndentationWidth: 4
+
+# Hash indentation should be considered like MultilineMethodCallIndentation indentation
+# and use 4 spaces instead of 2.
+Layout/IndentHash:
+  IndentationWidth: 4
+
+# Multi-line differs from standard indentation, they are indented twice.
+Layout/MultilineMethodCallIndentation:
+  EnforcedStyle: indented
+  IndentationWidth: 4
+
+# unless is not always cool.
+Style/NegatedIf:
+  Enabled: false
+
+# For years, %w() has been the de-facto standard. A lot of libraries are using ().
+# Switching to [] would be a nightmare.
+Style/PercentLiteralDelimiters:
+  Enabled: false
+
+# There are cases were the inline rescue is ok. We can either downgrade the severity,
+# or rely on the developer judgement on a case-by-case basis.
+Style/RescueModifier:
+  Enabled: false
+
+# Sorry, but using trailing spaces helps readability.
+#
+#   %w( foo bar )
+#
+# looks better to me than
+#
+#   %w( foo bar )
+#
+Layout/SpaceInsidePercentLiteralDelimiters:
+  Enabled: false
+
+# Hate It or Love It, I prefer double quotes as this is more consistent
+# with several other programming languages and the output of puts and inspect.
+Style/StringLiterals:
+  EnforcedStyle: double_quotes
+
+# It's nice to be consistent. The trailing comma also allows easy reordering,
+# and doesn't cause a diff in Git when you add a line to the bottom.
+Style/TrailingCommaInLiteral:
+  EnforcedStyleForMultiline: consistent_comma
+
+Style/TrivialAccessors:
+  # IgnoreClassMethods because I want to be able to define class-level accessors
+  # that sets an instance variable on the metaclass, such as:
+  #
+  #    def self.default=(value)
+  #      @default = value
+  #    end
+  #
+  IgnoreClassMethods: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.ruby-gemset b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.ruby-gemset
new file mode 100644
index 0000000..06070ae
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.ruby-gemset
@@ -0,0 +1 @@
+publicsuffix
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.travis.yml b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.travis.yml
new file mode 100644
index 0000000..f63ea84
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.travis.yml
@@ -0,0 +1,26 @@
+language: ruby
+
+rvm:
+  - 2.1
+  - 2.2
+  - 2.3.3
+  - 2.4.0
+  - ruby-head
+  - jruby-9.0.5.0
+  - jruby-9.1.0.0
+
+before_install:
+  - gem update --system
+  - gem install bundler
+
+cache:
+  - bundler
+
+env:
+  - COVERALL=1
+
+matrix:
+  allow_failures:
+    - rvm: ruby-head
+    - rvm: jruby-9.0.5.0
+    - rvm: jruby-9.1.0.0
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.yardopts b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.yardopts
new file mode 100644
index 0000000..0a782de
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/.yardopts
@@ -0,0 +1 @@
+--title 'Ruby Public Suffix API Documentation'
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/2.0-Upgrade.md b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/2.0-Upgrade.md
new file mode 100644
index 0000000..1a10bfb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/2.0-Upgrade.md
@@ -0,0 +1,52 @@
+# Welcome to PublicSuffix 2.0!
+
+PublicSuffix 2.0 contains a rewritten internal representation and comparison logic, that drastically increases the lookup performance. The new version also changes several internal and external API.
+
+This document documents the most relevant changes to help you upgrading from PublicSuffix 1.0 to 2.0.
+
+## What's New
+
+- The library is now 100% compliants with the official PublicSuffix tests. The major breaking change you may experience, is that if a domain passed as input doesn't match any rule, the rule `*` is assumed. You can override this behavior by passing a custom default rule with the `default_rule` option. The old behavior can be restored by passing `default_rule: nil`.
+- `PublicSuffix.domain` is a new method that parses the input and returns the domain (combination of second level domain + suffix). This is a convenient helper to parse a domain name, for example when you need to determine the cookie or SSL scope.
+- Added the ability to disable the use of private domains either at runtime, in addition to the ability to not load the private domains section when reading the list (`private_domains: false`). This feature also superseded the `private_domains` class-level attribute, that is no longer available.
+
+## Upgrade
+
+When upgrading, here's the most relevant changes to keep an eye on:
+
+- Several futile utility helpers were removed, such as `Domain#rule`, `Domain#is_a_domain?`, `Domain#is_a_subdomain?`, `Domain#valid?`. You can easily obtain the same result by having a custom method that reconstructs the logic, and/or calling `PublicSuffix.{domain|parse}(domain.to_s)`.
+- `PublicSuffix::List.private_domains` is no longer available. Instead, you now have two ways to enable/disable the private domains:
+
+    1. At runtime, by using the `ignore_private` option
+
+    ```ruby
+    PublicSuffix.domain("something.blogspot.com", ignore_private: true)
+    ```
+
+    1. Loading a filtered list:
+
+    ```ruby
+    # Disable support for private TLDs
+    PublicSuffix::List.default = PublicSuffix::List.parse(File.read(PublicSuffix::List::DEFAULT_LIST_PATH), private_domains: false)
+    # => "blogspot.com"
+    PublicSuffix.domain("something.blogspot.com")
+    # => "blogspot.com"
+    ```
+- Now that the library is 100% compliant with the official PublicSuffix algorithm, if a domain passed as input doesn't match any rule, the wildcard rule `*` is assumed. This means that unlisted TLDs will be considered valid by default, when they would have been invalid in 1.x. However, you can override this behavior to emulate the 1.x behavior if needed:
+
+    ```ruby
+    # 1.x:
+
+    PublicSuffix.valid?("google.commm")
+    # => false
+
+    # 2.x:
+
+    PublicSuffix.valid?("google.commm")
+    # => true
+
+    # Overriding 2.x behavior if needed:
+
+    PublicSuffix.valid?("google.commm", default_rule: nil)
+    # => false
+    ````
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/CHANGELOG.md b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/CHANGELOG.md
new file mode 100644
index 0000000..ab62ddc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/CHANGELOG.md
@@ -0,0 +1,324 @@
+# Changelog
+
+
+#### Release 3.0.0
+
+This new version includes a major redesign of the library internals, with the goal to drastically
+improve the lookup time while reducing storage space.
+
+For this reason, several public methods that are no longer applicable have been deprecated
+and/or removed. You can find more information at GH-133.
+
+- CHANGED: Updated definitions.
+- CHANGED: Dropped support for Ruby < 2.1
+- CHANGED: `PublicSuffix::List#rules` is now protected. You should not rely on it as the internal rule representation is subject to change to optimize performances.
+- CHANGED: Removed `PublicSuffix::List.clear`, it was an unnecessary accessor method. Use `PublicSuffix::List.default = nil` if you **really** need to reset the default list. You shouldn't.
+- CHANGED: `PublicSuffix::List#select` is now private. You should not use it, instead use `PublicSuffix::List#find`.
+- CHANGED: `PublicSuffix::List` no longer implements Enumerable. Instead, use `#each` to loop over, or get an Enumerator.
+- CHANGED: Redesigned internal list storage and lookup algorithm to achieve O(1) lookup time (see GH-133).
+
+
+#### Release 2.0.5
+
+- CHANGED: Updated definitions.
+- CHANGED: Initialization performance improvements (GH-128). [Thanks @casperisfine]
+
+
+#### Release 2.0.4
+
+- FIXED: Fix a bug that caused the GEM to be published with the wrong version number in the gemspec (GH-121).
+
+- CHANGED: Updated definitions.
+
+
+#### Release 2.0.3
+
+- CHANGED: Updated definitions.
+
+
+#### Release 2.0.2
+
+- CHANGED: Updated definitions.
+
+
+#### Release 2.0.1
+
+- FIXED: Fix bug that prevented .valid? to reset the default rule
+
+
+#### Release 2.0.0
+
+- NEW: Added PublicSuffix.domain # => sld.tld
+- NEW: Added the ability to disable the use of private domains either at runtime, in addition to the ability to not load the private domains section when reading the list (`private_domains: false`). This feature also superseded the `private_domains` class-level attribute, that is no longer available.
+
+- CHANGED: Considerable performance improvements (GH-92)
+- CHANGED: Updated definitions.
+- CHANGED: Removed deprecated PublicSuffix::InvalidDomain exception
+- CHANGED: If the suffix is now listed, then the prevaling rule is "*" as defined by the PSL algorithm (GH-91)
+- CHANGED: Input validation is performed only if you call `PublicSuffix.parse` or `PublicSuffix.list`
+- CHANGED: Input with leading dot is invalid per PSL acceptance tests
+- CHANGED: Removed `private_domains` class-level attribute. It is replaced by the `private_domains: false` option in the list parse method.
+- CHANGED: The default list now assumes you use UTF-8 for reading the input (GH-94),
+
+- REMOVED: Removed futile utility helpers such as `Domain#rule`, `Domain#is_a_domain?`, `Domain#is_a_subdomain?`, `Domain#valid?`. You can easily obtain the same result by having a custom method that reconstructs the logic, and/or calling `PublicSuffix.{domain|parse}(domain.to_s)`.
+
+
+#### Release 1.5.3
+
+- FIXED: Don't duplicate rule indices when creating index (GH-77). [Thanks @ags]
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.5.2
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.5.1
+
+- FIXED: Ignore case for parsing and validating (GH-62)
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.5.0
+
+- CHANGED: Dropped support for Ruby < 2.0
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.4.6
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.4.5
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.4.4
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.4.3
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.4.2
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.4.1
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.4.0
+
+- CHANGED: Moved the definitions in the lib folder.
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.3.3
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.3.2
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.3.1
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.3.0
+
+- NEW: Ability to skip Private Domains (GH-28). [Thanks @rb2k]
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.2.1
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.2.0
+
+- NEW: Allow a custom List on `PublicSuffix.parse` (GH-26). [Thanks @itspriddle]
+
+- FIXED: PublicSuffix.parse and PublicSuffix.valid? crashes when input is nil (GH-20).
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.1.3
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.1.2
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.1.1
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.1.0
+
+- FIXED: #valid? and #parse consider URIs as valid domains (GH-15)
+
+- CHANGED: Updated definitions.
+
+- CHANGED: Removed deprecatd PublicSuffixService::RuleList.
+
+
+#### Release 1.0.0
+
+- CHANGED: Updated definitions.
+
+
+#### Release 1.0.0.rc1
+
+The library is now known as PublicSuffix.
+
+
+#### Release 0.9.1
+
+- CHANGED: Renamed PublicSuffixService::RuleList to PublicSuffixService::List.
+
+- CHANGED: Renamed PublicSuffixService::List#list to PublicSuffixService::List#rules.
+
+- CHANGED: Renamed PublicSuffixService to PublicSuffix.
+
+- CHANGED: Updated definitions.
+
+
+#### Release 0.9.0
+
+- CHANGED: Minimum Ruby version increased to Ruby 1.8.7.
+
+- CHANGED: rake/gempackagetask is deprecated.  Use rubygems/package_task instead.
+
+
+#### Release 0.8.4
+
+- FIXED: Reverted bugfix for issue #12 for Ruby 1.8.6.
+  This is the latest version compatible with Ruby 1.8.6.
+
+
+#### Release 0.8.3
+
+- FIXED: Fixed ArgumentError: invalid byte sequence in US-ASCII with Ruby 1.9.2 (#12).
+
+- CHANGED: Updated definitions (#11).
+
+- CHANGED: Renamed definitions.txt to definitions.dat.
+
+
+#### Release 0.8.2
+
+- NEW: Added support for rubygems-test.
+
+- CHANGED: Integrated Bundler.
+
+- CHANGED: Updated definitions.
+
+
+#### Release 0.8.1
+
+- FIXED: The files in the release 0.8.0 have wrong permission 600 and can't be loaded (#10).
+
+
+#### Release 0.8.0
+
+- CHANGED: Update public suffix list to d1a5599b49fa 2010-10-25 15:10 +0100 (#9)
+
+- NEW: Add support for Fully Qualified Domain Names (#7)
+
+
+#### Release 0.7.0
+
+- CHANGED: Using YARD to document the code instead of RDoc.
+
+- FIXED: RuleList cache is not recreated when a new rule is appended to the list (#6)
+
+- FIXED: PublicSuffixService.valid? should return false if the domain is not defined or not allowed (#4, #5)
+
+
+#### Release 0.6.0
+
+- NEW:  PublicSuffixService.parse raises DomainNotAllowed when trying to parse a domain name
+  which exists, but is not allowed by the current definition list (#3)
+
+        PublicSuffixService.parse("nic.do")
+        # => PublicSuffixService::DomainNotAllowed
+
+- CHANGED: Renamed PublicSuffixService::InvalidDomain to PublicSuffixService::DomainInvalid
+
+
+#### Release 0.5.2
+
+- CHANGED: Update public suffix list to 248ea690d671 2010-09-16 18:02 +0100
+
+
+#### Release 0.5.1
+
+- CHANGED: Update public suffix list to 14dc66dd53c1 2010-09-15 17:09 +0100
+
+
+#### Release 0.5.0
+
+- CHANGED: Improve documentation for Domain#domain and Domain#subdomain (#1).
+
+- CHANGED: Performance improvements (#2).
+
+
+#### Release 0.4.0
+
+- CHANGED: Rename library from DomainName to PublicSuffixService to reduce the probability of name conflicts.
+
+
+#### Release 0.3.1
+
+- Deprecated DomainName library.
+
+
+#### Release 0.3.0
+
+- CHANGED: DomainName#domain and DomainName#subdomain are no longer alias of Domain#sld and Domain#tld.
+
+- CHANGED: Removed DomainName#labels and decoupled Rule from DomainName.
+
+- CHANGED: DomainName#valid? no longer instantiates new DomainName objects. This means less overhead.
+
+- CHANGED: Refactoring the entire DomainName API. Removed the internal on-the-fly parsing. Added a bunch of new methods to check and validate the DomainName.
+
+
+#### Release 0.2.0
+
+- NEW: DomainName#valid?
+
+- NEW: DomainName#parse and DomainName#parse!
+
+- NEW: DomainName#valid_domain? and DomainName#valid_subdomain?
+
+- CHANGED: Make sure RuleList lookup is only performed once.
+
+
+#### Release 0.1.0
+
+- Initial version
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/Gemfile b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/Gemfile
new file mode 100644
index 0000000..db22b74
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/Gemfile
@@ -0,0 +1,10 @@
+source "https://rubygems.org"
+
+gemspec
+
+gem "coveralls", require: false
+gem "minitest"
+gem "minitest-reporters"
+gem "rubocop", require: false
+
+gem "memory_profiler", require: false
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/LICENSE.txt b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/LICENSE.txt
new file mode 100644
index 0000000..81fe94d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2009-2017 Simone Carletti <weppos@weppos.net>
+
+MIT License
+
+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/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/README.md b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/README.md
new file mode 100644
index 0000000..c2d9b5d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/README.md
@@ -0,0 +1,202 @@
+# Public Suffix <small>for Ruby</small>
+
+<tt>PublicSuffix</tt> is a Ruby domain name parser based on the [Public Suffix List](https://publicsuffix.org/).
+
+[![Build Status](https://travis-ci.org/weppos/publicsuffix-ruby.svg?branch=master)](https://travis-ci.org/weppos/publicsuffix-ruby)
+
+
+## Requirements
+
+- Ruby >= 2.0
+
+For an older versions of Ruby use a previous release.
+
+
+## Installation
+
+You can install the gem manually:
+
+```shell
+$ gem install public_suffix
+```
+
+Or use Bundler and define it as a dependency in your `Gemfile`:
+
+```ruby
+gem 'public_suffix'
+```
+
+If you are upgrading to 2.0, see [2.0-Upgrade.md](2.0-Upgrade.md).
+
+## Usage
+
+Extract the domain out from a name:
+
+```ruby
+PublicSuffix.domain("google.com")
+# => "google.com"
+PublicSuffix.domain("www.google.com")
+# => "google.com"
+PublicSuffix.domain("www.google.co.uk")
+# => "google.co.uk"
+```
+
+Parse a domain without subdomains:
+
+```ruby
+domain = PublicSuffix.parse("google.com")
+# => #<PublicSuffix::Domain>
+domain.tld
+# => "com"
+domain.sld
+# => "google"
+domain.trd
+# => nil
+domain.domain
+# => "google.com"
+domain.subdomain
+# => nil
+```
+
+Parse a domain with subdomains:
+
+```ruby
+domain = PublicSuffix.parse("www.google.com")
+# => #<PublicSuffix::Domain>
+domain.tld
+# => "com"
+domain.sld
+# => "google"
+domain.trd
+# => "www"
+domain.domain
+# => "google.com"
+domain.subdomain
+# => "www.google.com"
+```
+
+Simple validation example:
+
+```ruby
+PublicSuffix.valid?("google.com")
+# => true
+
+PublicSuffix.valid?("www.google.com")
+# => true
+
+# Explicitly forbidden, it is listed as a private domain
+PublicSuffix.valid?("blogspot.com")
+# => false
+
+# Unknown/not-listed TLD domains are valid by default
+PublicSuffix.valid?("example.tldnotlisted")
+# => true
+```
+
+Strict validation (without applying the default * rule):
+
+```ruby
+PublicSuffix.valid?("example.tldnotlisted", default_rule: nil)
+# => false
+```
+
+
+## Fully Qualified Domain Names
+
+This library automatically recognizes Fully Qualified Domain Names. A FQDN is a domain name that end with a trailing dot.
+
+```ruby
+# Parse a standard domain name
+PublicSuffix.domain("www.google.com")
+# => "google.com"
+
+# Parse a fully qualified domain name
+PublicSuffix.domain("www.google.com.")
+# => "google.com"
+```
+
+## Private domains
+
+This library has support for switching off support for private (non-ICANN).
+
+```ruby
+# Extract a domain including private domains (by default)
+PublicSuffix.domain("something.blogspot.com")
+# => "something.blogspot.com"
+
+# Extract a domain excluding private domains
+PublicSuffix.domain("something.blogspot.com", ignore_private: true)
+# => "blogspot.com"
+
+# It also works for #parse and #valid?
+PublicSuffix.parse("something.blogspot.com", ignore_private: true)
+PublicSuffix.valid?("something.blogspot.com", ignore_private: true)
+```
+
+If you don't care about private domains at all, it's more efficient to exclude them when the list is parsed:
+
+```ruby
+# Disable support for private TLDs
+PublicSuffix::List.default = PublicSuffix::List.parse(File.read(PublicSuffix::List::DEFAULT_LIST_PATH), private_domains: false)
+# => "blogspot.com"
+PublicSuffix.domain("something.blogspot.com")
+# => "blogspot.com"
+```
+
+
+## What is the Public Suffix List?
+
+The [Public Suffix List](https://publicsuffix.org) is a cross-vendor initiative to provide an accurate list of domain name suffixes.
+
+The Public Suffix List is an initiative of the Mozilla Project, but is maintained as a community resource. It is available for use in any software, but was originally created to meet the needs of browser manufacturers.
+
+A "public suffix" is one under which Internet users can directly register names. Some examples of public suffixes are ".com", ".co.uk" and "pvt.k12.wy.us". The Public Suffix List is a list of all known public suffixes.
+
+
+## Why the Public Suffix List is better than any available Regular Expression parser?
+
+Previously, browsers used an algorithm which basically only denied setting wide-ranging cookies for top-level domains with no dots (e.g. com or org). However, this did not work for top-level domains where only third-level registrations are allowed (e.g. co.uk). In these cases, websites could set a cookie for co.uk which will be passed onto every website registered under co.uk.
+
+Clearly, this was a security risk as it allowed websites other than the one setting the cookie to read it, and therefore potentially extract sensitive information.
+
+Since there is no algorithmic method of finding the highest level at which a domain may be registered for a particular top-level domain (the policies differ with each registry), the only method is to create a list of all top-level domains and the level at which domains can be registered. This is the aim of the effective TLD list.
+
+As well as being used to prevent cookies from being set where they shouldn't be, the list can also potentially be used for other applications where the registry controlled and privately controlled parts of a domain name need to be known, for example when grouping by top-level domains.
+
+Source: https://wiki.mozilla.org/Public_Suffix_List
+
+Not convinced yet? Check out [this real world example](https://stackoverflow.com/q/288810/123527).
+
+
+## Does <tt>PublicSuffix</tt> make requests to Public Suffix List website?
+
+No. <tt>PublicSuffix</tt> comes with a bundled list. It does not make any HTTP requests to parse or validate a domain.
+
+
+## Feedback and bug reports
+
+If you use this library and find yourself missing any functionality, please [let me know](mailto:weppos@weppos.net).
+
+Pull requests are very welcome! Please include tests and/or feature coverage for every patch, and create a topic branch for every separate change you make.
+
+Report issues or feature requests to [GitHub Issues](https://github.com/weppos/publicsuffix-ruby/issues).
+
+
+## More
+
+- [Homepage](https://simonecarletti.com/code/publicsuffix-ruby)
+- [Repository](https://github.com/weppos/publicsuffix-ruby)
+- [API Documentation](http://rubydoc.info/gems/public_suffix)
+- [Introducing the Public Suffix List library for Ruby](https://simonecarletti.com/blog/2010/06/public-suffix-list-library-for-ruby/)
+
+
+## Changelog
+
+See the [CHANGELOG.md](CHANGELOG.md) file for details.
+
+
+## License
+
+Copyright (c) 2009-2017 Simone Carletti. This is Free Software distributed under the MIT license.
+
+The [Public Suffix List source](https://publicsuffix.org/list/) is subject to the terms of the Mozilla Public License, v. 2.0.
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/Rakefile b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/Rakefile
new file mode 100644
index 0000000..d304b66
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/Rakefile
@@ -0,0 +1,49 @@
+require "bundler/gem_tasks"
+
+# By default, run tests and linter.
+task default: [:test, :rubocop]
+
+
+require "rake/testtask"
+
+Rake::TestTask.new do |t|
+  t.libs = %w( lib test )
+  t.pattern = "test/**/*_test.rb"
+  t.verbose = !ENV["VERBOSE"].nil?
+  t.warning = !ENV["WARNING"].nil?
+end
+
+require "rubocop/rake_task"
+
+RuboCop::RakeTask.new
+
+
+require "yard/rake/yardoc_task"
+
+YARD::Rake::YardocTask.new(:yardoc) do |y|
+  y.options = ["--output-dir", "yardoc"]
+end
+
+CLOBBER.include "yardoc"
+
+
+task :benchmarks do
+  Dir["benchmarks/bm_*.rb"].each do |file|
+    sh "ruby #{file}"
+  end
+end
+task default: [:benchmarks] if ENV["BENCHMARKS"] == "1"
+
+
+desc "Downloads the Public Suffix List file from the repository and stores it locally."
+task :"update-list" do
+  require "net/http"
+
+  DEFINITION_URL = "https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat".freeze
+
+  File.open("data/list.txt", "w+") do |f|
+    response = Net::HTTP.get_response(URI.parse(DEFINITION_URL))
+    response.body
+    f.write(response.body)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/bin/console b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/bin/console
new file mode 100755
index 0000000..fd0f739
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/bin/console
@@ -0,0 +1,14 @@
+#!/usr/bin/env ruby
+
+require "bundler/setup"
+require "public_suffix"
+
+# You can add fixtures and/or initialization code here to make experimenting
+# with your gem easier. You can also use a different console, if you like.
+
+# (If you use this, don't forget to add pry to your Gemfile!)
+# require "pry"
+# Pry.start
+
+require "irb"
+IRB.start
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/data/list.txt b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/data/list.txt
new file mode 100644
index 0000000..1258bdd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/data/list.txt
@@ -0,0 +1,12225 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat,
+// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported.
+
+// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/.
+
+// ===BEGIN ICANN DOMAINS===
+
+// ac : https://en.wikipedia.org/wiki/.ac
+ac
+com.ac
+edu.ac
+gov.ac
+net.ac
+mil.ac
+org.ac
+
+// ad : https://en.wikipedia.org/wiki/.ad
+ad
+nom.ad
+
+// ae : https://en.wikipedia.org/wiki/.ae
+// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php
+ae
+co.ae
+net.ae
+org.ae
+sch.ae
+ac.ae
+gov.ae
+mil.ae
+
+// aero : see https://www.information.aero/index.php?id=66
+aero
+accident-investigation.aero
+accident-prevention.aero
+aerobatic.aero
+aeroclub.aero
+aerodrome.aero
+agents.aero
+aircraft.aero
+airline.aero
+airport.aero
+air-surveillance.aero
+airtraffic.aero
+air-traffic-control.aero
+ambulance.aero
+amusement.aero
+association.aero
+author.aero
+ballooning.aero
+broker.aero
+caa.aero
+cargo.aero
+catering.aero
+certification.aero
+championship.aero
+charter.aero
+civilaviation.aero
+club.aero
+conference.aero
+consultant.aero
+consulting.aero
+control.aero
+council.aero
+crew.aero
+design.aero
+dgca.aero
+educator.aero
+emergency.aero
+engine.aero
+engineer.aero
+entertainment.aero
+equipment.aero
+exchange.aero
+express.aero
+federation.aero
+flight.aero
+freight.aero
+fuel.aero
+gliding.aero
+government.aero
+groundhandling.aero
+group.aero
+hanggliding.aero
+homebuilt.aero
+insurance.aero
+journal.aero
+journalist.aero
+leasing.aero
+logistics.aero
+magazine.aero
+maintenance.aero
+media.aero
+microlight.aero
+modelling.aero
+navigation.aero
+parachuting.aero
+paragliding.aero
+passenger-association.aero
+pilot.aero
+press.aero
+production.aero
+recreation.aero
+repbody.aero
+res.aero
+research.aero
+rotorcraft.aero
+safety.aero
+scientist.aero
+services.aero
+show.aero
+skydiving.aero
+software.aero
+student.aero
+trader.aero
+trading.aero
+trainer.aero
+union.aero
+workinggroup.aero
+works.aero
+
+// af : http://www.nic.af/help.jsp
+af
+gov.af
+com.af
+org.af
+net.af
+edu.af
+
+// ag : http://www.nic.ag/prices.htm
+ag
+com.ag
+org.ag
+net.ag
+co.ag
+nom.ag
+
+// ai : http://nic.com.ai/
+ai
+off.ai
+com.ai
+net.ai
+org.ai
+
+// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31
+al
+com.al
+edu.al
+gov.al
+mil.al
+net.al
+org.al
+
+// am : https://en.wikipedia.org/wiki/.am
+am
+
+// ao : https://en.wikipedia.org/wiki/.ao
+// http://www.dns.ao/REGISTR.DOC
+ao
+ed.ao
+gv.ao
+og.ao
+co.ao
+pb.ao
+it.ao
+
+// aq : https://en.wikipedia.org/wiki/.aq
+aq
+
+// ar : https://nic.ar/nic-argentina/normativa-vigente
+ar
+com.ar
+edu.ar
+gob.ar
+gov.ar
+int.ar
+mil.ar
+musica.ar
+net.ar
+org.ar
+tur.ar
+
+// arpa : https://en.wikipedia.org/wiki/.arpa
+// Confirmed by registry <iana-questions@icann.org> 2008-06-18
+arpa
+e164.arpa
+in-addr.arpa
+ip6.arpa
+iris.arpa
+uri.arpa
+urn.arpa
+
+// as : https://en.wikipedia.org/wiki/.as
+as
+gov.as
+
+// asia : https://en.wikipedia.org/wiki/.asia
+asia
+
+// at : https://en.wikipedia.org/wiki/.at
+// Confirmed by registry <it@nic.at> 2008-06-17
+at
+ac.at
+co.at
+gv.at
+or.at
+
+// au : https://en.wikipedia.org/wiki/.au
+// http://www.auda.org.au/
+au
+// 2LDs
+com.au
+net.au
+org.au
+edu.au
+gov.au
+asn.au
+id.au
+// Historic 2LDs (closed to new registration, but sites still exist)
+info.au
+conf.au
+oz.au
+// CGDNs - http://www.cgdn.org.au/
+act.au
+nsw.au
+nt.au
+qld.au
+sa.au
+tas.au
+vic.au
+wa.au
+// 3LDs
+act.edu.au
+nsw.edu.au
+nt.edu.au
+qld.edu.au
+sa.edu.au
+tas.edu.au
+vic.edu.au
+wa.edu.au
+// act.gov.au  Bug 984824 - Removed at request of Greg Tankard
+// nsw.gov.au  Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au>
+// nt.gov.au  Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au>
+qld.gov.au
+sa.gov.au
+tas.gov.au
+vic.gov.au
+wa.gov.au
+
+// aw : https://en.wikipedia.org/wiki/.aw
+aw
+com.aw
+
+// ax : https://en.wikipedia.org/wiki/.ax
+ax
+
+// az : https://en.wikipedia.org/wiki/.az
+az
+com.az
+net.az
+int.az
+gov.az
+org.az
+edu.az
+info.az
+pp.az
+mil.az
+name.az
+pro.az
+biz.az
+
+// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf
+ba
+com.ba
+edu.ba
+gov.ba
+mil.ba
+net.ba
+org.ba
+
+// bb : https://en.wikipedia.org/wiki/.bb
+bb
+biz.bb
+co.bb
+com.bb
+edu.bb
+gov.bb
+info.bb
+net.bb
+org.bb
+store.bb
+tv.bb
+
+// bd : https://en.wikipedia.org/wiki/.bd
+*.bd
+
+// be : https://en.wikipedia.org/wiki/.be
+// Confirmed by registry <tech@dns.be> 2008-06-08
+be
+ac.be
+
+// bf : https://en.wikipedia.org/wiki/.bf
+bf
+gov.bf
+
+// bg : https://en.wikipedia.org/wiki/.bg
+// https://www.register.bg/user/static/rules/en/index.html
+bg
+a.bg
+b.bg
+c.bg
+d.bg
+e.bg
+f.bg
+g.bg
+h.bg
+i.bg
+j.bg
+k.bg
+l.bg
+m.bg
+n.bg
+o.bg
+p.bg
+q.bg
+r.bg
+s.bg
+t.bg
+u.bg
+v.bg
+w.bg
+x.bg
+y.bg
+z.bg
+0.bg
+1.bg
+2.bg
+3.bg
+4.bg
+5.bg
+6.bg
+7.bg
+8.bg
+9.bg
+
+// bh : https://en.wikipedia.org/wiki/.bh
+bh
+com.bh
+edu.bh
+net.bh
+org.bh
+gov.bh
+
+// bi : https://en.wikipedia.org/wiki/.bi
+// http://whois.nic.bi/
+bi
+co.bi
+com.bi
+edu.bi
+or.bi
+org.bi
+
+// biz : https://en.wikipedia.org/wiki/.biz
+biz
+
+// bj : https://en.wikipedia.org/wiki/.bj
+bj
+asso.bj
+barreau.bj
+gouv.bj
+
+// bm : http://www.bermudanic.bm/dnr-text.txt
+bm
+com.bm
+edu.bm
+gov.bm
+net.bm
+org.bm
+
+// bn : https://en.wikipedia.org/wiki/.bn
+*.bn
+
+// bo : http://www.nic.bo/
+bo
+com.bo
+edu.bo
+gov.bo
+gob.bo
+int.bo
+org.bo
+net.bo
+mil.bo
+tv.bo
+
+// br : http://registro.br/dominio/categoria.html
+// Submitted by registry <fneves@registro.br>
+br
+adm.br
+adv.br
+agr.br
+am.br
+arq.br
+art.br
+ato.br
+b.br
+belem.br
+bio.br
+blog.br
+bmd.br
+cim.br
+cng.br
+cnt.br
+com.br
+coop.br
+cri.br
+def.br
+ecn.br
+eco.br
+edu.br
+emp.br
+eng.br
+esp.br
+etc.br
+eti.br
+far.br
+flog.br
+floripa.br
+fm.br
+fnd.br
+fot.br
+fst.br
+g12.br
+ggf.br
+gov.br
+// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil
+ac.gov.br
+al.gov.br
+am.gov.br
+ap.gov.br
+ba.gov.br
+ce.gov.br
+df.gov.br
+es.gov.br
+go.gov.br
+ma.gov.br
+mg.gov.br
+ms.gov.br
+mt.gov.br
+pa.gov.br
+pb.gov.br
+pe.gov.br
+pi.gov.br
+pr.gov.br
+rj.gov.br
+rn.gov.br
+ro.gov.br
+rr.gov.br
+rs.gov.br
+sc.gov.br
+se.gov.br
+sp.gov.br
+to.gov.br
+imb.br
+ind.br
+inf.br
+jampa.br
+jor.br
+jus.br
+leg.br
+lel.br
+mat.br
+med.br
+mil.br
+mp.br
+mus.br
+net.br
+*.nom.br
+not.br
+ntr.br
+odo.br
+org.br
+poa.br
+ppg.br
+pro.br
+psc.br
+psi.br
+qsl.br
+radio.br
+rec.br
+recife.br
+slg.br
+srv.br
+taxi.br
+teo.br
+tmp.br
+trd.br
+tur.br
+tv.br
+vet.br
+vix.br
+vlog.br
+wiki.br
+zlg.br
+
+// bs : http://www.nic.bs/rules.html
+bs
+com.bs
+net.bs
+org.bs
+edu.bs
+gov.bs
+
+// bt : https://en.wikipedia.org/wiki/.bt
+bt
+com.bt
+edu.bt
+gov.bt
+net.bt
+org.bt
+
+// bv : No registrations at this time.
+// Submitted by registry <jarle@uninett.no>
+bv
+
+// bw : https://en.wikipedia.org/wiki/.bw
+// http://www.gobin.info/domainname/bw.doc
+// list of other 2nd level tlds ?
+bw
+co.bw
+org.bw
+
+// by : https://en.wikipedia.org/wiki/.by
+// http://tld.by/rules_2006_en.html
+// list of other 2nd level tlds ?
+by
+gov.by
+mil.by
+// Official information does not indicate that com.by is a reserved
+// second-level domain, but it's being used as one (see www.google.com.by and
+// www.yahoo.com.by, for example), so we list it here for safety's sake.
+com.by
+
+// http://hoster.by/
+of.by
+
+// bz : https://en.wikipedia.org/wiki/.bz
+// http://www.belizenic.bz/
+bz
+com.bz
+net.bz
+org.bz
+edu.bz
+gov.bz
+
+// ca : https://en.wikipedia.org/wiki/.ca
+ca
+// ca geographical names
+ab.ca
+bc.ca
+mb.ca
+nb.ca
+nf.ca
+nl.ca
+ns.ca
+nt.ca
+nu.ca
+on.ca
+pe.ca
+qc.ca
+sk.ca
+yk.ca
+// gc.ca: https://en.wikipedia.org/wiki/.gc.ca
+// see also: http://registry.gc.ca/en/SubdomainFAQ
+gc.ca
+
+// cat : https://en.wikipedia.org/wiki/.cat
+cat
+
+// cc : https://en.wikipedia.org/wiki/.cc
+cc
+
+// cd : https://en.wikipedia.org/wiki/.cd
+// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1
+cd
+gov.cd
+
+// cf : https://en.wikipedia.org/wiki/.cf
+cf
+
+// cg : https://en.wikipedia.org/wiki/.cg
+cg
+
+// ch : https://en.wikipedia.org/wiki/.ch
+ch
+
+// ci : https://en.wikipedia.org/wiki/.ci
+// http://www.nic.ci/index.php?page=charte
+ci
+org.ci
+or.ci
+com.ci
+co.ci
+edu.ci
+ed.ci
+ac.ci
+net.ci
+go.ci
+asso.ci
+aéroport.ci
+int.ci
+presse.ci
+md.ci
+gouv.ci
+
+// ck : https://en.wikipedia.org/wiki/.ck
+*.ck
+!www.ck
+
+// cl : https://en.wikipedia.org/wiki/.cl
+cl
+gov.cl
+gob.cl
+co.cl
+mil.cl
+
+// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927
+cm
+co.cm
+com.cm
+gov.cm
+net.cm
+
+// cn : https://en.wikipedia.org/wiki/.cn
+// Submitted by registry <tanyaling@cnnic.cn>
+cn
+ac.cn
+com.cn
+edu.cn
+gov.cn
+net.cn
+org.cn
+mil.cn
+公司.cn
+网络.cn
+網絡.cn
+// cn geographic names
+ah.cn
+bj.cn
+cq.cn
+fj.cn
+gd.cn
+gs.cn
+gz.cn
+gx.cn
+ha.cn
+hb.cn
+he.cn
+hi.cn
+hl.cn
+hn.cn
+jl.cn
+js.cn
+jx.cn
+ln.cn
+nm.cn
+nx.cn
+qh.cn
+sc.cn
+sd.cn
+sh.cn
+sn.cn
+sx.cn
+tj.cn
+xj.cn
+xz.cn
+yn.cn
+zj.cn
+hk.cn
+mo.cn
+tw.cn
+
+// co : https://en.wikipedia.org/wiki/.co
+// Submitted by registry <tecnico@uniandes.edu.co>
+co
+arts.co
+com.co
+edu.co
+firm.co
+gov.co
+info.co
+int.co
+mil.co
+net.co
+nom.co
+org.co
+rec.co
+web.co
+
+// com : https://en.wikipedia.org/wiki/.com
+com
+
+// coop : https://en.wikipedia.org/wiki/.coop
+coop
+
+// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do
+cr
+ac.cr
+co.cr
+ed.cr
+fi.cr
+go.cr
+or.cr
+sa.cr
+
+// cu : https://en.wikipedia.org/wiki/.cu
+cu
+com.cu
+edu.cu
+org.cu
+net.cu
+gov.cu
+inf.cu
+
+// cv : https://en.wikipedia.org/wiki/.cv
+cv
+
+// cw : http://www.una.cw/cw_registry/
+// Confirmed by registry <registry@una.net> 2013-03-26
+cw
+com.cw
+edu.cw
+net.cw
+org.cw
+
+// cx : https://en.wikipedia.org/wiki/.cx
+// list of other 2nd level tlds ?
+cx
+gov.cx
+
+// cy : http://www.nic.cy/
+// Submitted by registry Panayiotou Fotia <cydns@ucy.ac.cy>
+cy
+ac.cy
+biz.cy
+com.cy
+ekloges.cy
+gov.cy
+ltd.cy
+name.cy
+net.cy
+org.cy
+parliament.cy
+press.cy
+pro.cy
+tm.cy
+
+// cz : https://en.wikipedia.org/wiki/.cz
+cz
+
+// de : https://en.wikipedia.org/wiki/.de
+// Confirmed by registry <ops@denic.de> (with technical
+// reservations) 2008-07-01
+de
+
+// dj : https://en.wikipedia.org/wiki/.dj
+dj
+
+// dk : https://en.wikipedia.org/wiki/.dk
+// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17
+dk
+
+// dm : https://en.wikipedia.org/wiki/.dm
+dm
+com.dm
+net.dm
+org.dm
+edu.dm
+gov.dm
+
+// do : https://en.wikipedia.org/wiki/.do
+do
+art.do
+com.do
+edu.do
+gob.do
+gov.do
+mil.do
+net.do
+org.do
+sld.do
+web.do
+
+// dz : https://en.wikipedia.org/wiki/.dz
+dz
+com.dz
+org.dz
+net.dz
+gov.dz
+edu.dz
+asso.dz
+pol.dz
+art.dz
+
+// ec : http://www.nic.ec/reg/paso1.asp
+// Submitted by registry <vabboud@nic.ec>
+ec
+com.ec
+info.ec
+net.ec
+fin.ec
+k12.ec
+med.ec
+pro.ec
+org.ec
+edu.ec
+gov.ec
+gob.ec
+mil.ec
+
+// edu : https://en.wikipedia.org/wiki/.edu
+edu
+
+// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B
+ee
+edu.ee
+gov.ee
+riik.ee
+lib.ee
+med.ee
+com.ee
+pri.ee
+aip.ee
+org.ee
+fie.ee
+
+// eg : https://en.wikipedia.org/wiki/.eg
+eg
+com.eg
+edu.eg
+eun.eg
+gov.eg
+mil.eg
+name.eg
+net.eg
+org.eg
+sci.eg
+
+// er : https://en.wikipedia.org/wiki/.er
+*.er
+
+// es : https://www.nic.es/site_ingles/ingles/dominios/index.html
+es
+com.es
+nom.es
+org.es
+gob.es
+edu.es
+
+// et : https://en.wikipedia.org/wiki/.et
+et
+com.et
+gov.et
+org.et
+edu.et
+biz.et
+name.et
+info.et
+net.et
+
+// eu : https://en.wikipedia.org/wiki/.eu
+eu
+
+// fi : https://en.wikipedia.org/wiki/.fi
+fi
+// aland.fi : https://en.wikipedia.org/wiki/.ax
+// This domain is being phased out in favor of .ax. As there are still many
+// domains under aland.fi, we still keep it on the list until aland.fi is
+// completely removed.
+// TODO: Check for updates (expected to be phased out around Q1/2009)
+aland.fi
+
+// fj : https://en.wikipedia.org/wiki/.fj
+*.fj
+
+// fk : https://en.wikipedia.org/wiki/.fk
+*.fk
+
+// fm : https://en.wikipedia.org/wiki/.fm
+fm
+
+// fo : https://en.wikipedia.org/wiki/.fo
+fo
+
+// fr : http://www.afnic.fr/
+// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs
+fr
+com.fr
+asso.fr
+nom.fr
+prd.fr
+presse.fr
+tm.fr
+// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels
+aeroport.fr
+assedic.fr
+avocat.fr
+avoues.fr
+cci.fr
+chambagri.fr
+chirurgiens-dentistes.fr
+experts-comptables.fr
+geometre-expert.fr
+gouv.fr
+greta.fr
+huissier-justice.fr
+medecin.fr
+notaires.fr
+pharmacien.fr
+port.fr
+veterinaire.fr
+
+// ga : https://en.wikipedia.org/wiki/.ga
+ga
+
+// gb : This registry is effectively dormant
+// Submitted by registry <Damien.Shaw@ja.net>
+gb
+
+// gd : https://en.wikipedia.org/wiki/.gd
+gd
+
+// ge : http://www.nic.net.ge/policy_en.pdf
+ge
+com.ge
+edu.ge
+gov.ge
+org.ge
+mil.ge
+net.ge
+pvt.ge
+
+// gf : https://en.wikipedia.org/wiki/.gf
+gf
+
+// gg : http://www.channelisles.net/register-domains/
+// Confirmed by registry <nigel@channelisles.net> 2013-11-28
+gg
+co.gg
+net.gg
+org.gg
+
+// gh : https://en.wikipedia.org/wiki/.gh
+// see also: http://www.nic.gh/reg_now.php
+// Although domains directly at second level are not possible at the moment,
+// they have been possible for some time and may come back.
+gh
+com.gh
+edu.gh
+gov.gh
+org.gh
+mil.gh
+
+// gi : http://www.nic.gi/rules.html
+gi
+com.gi
+ltd.gi
+gov.gi
+mod.gi
+edu.gi
+org.gi
+
+// gl : https://en.wikipedia.org/wiki/.gl
+// http://nic.gl
+gl
+co.gl
+com.gl
+edu.gl
+net.gl
+org.gl
+
+// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm
+gm
+
+// gn : http://psg.com/dns/gn/gn.txt
+// Submitted by registry <randy@psg.com>
+gn
+ac.gn
+com.gn
+edu.gn
+gov.gn
+org.gn
+net.gn
+
+// gov : https://en.wikipedia.org/wiki/.gov
+gov
+
+// gp : http://www.nic.gp/index.php?lang=en
+gp
+com.gp
+net.gp
+mobi.gp
+edu.gp
+org.gp
+asso.gp
+
+// gq : https://en.wikipedia.org/wiki/.gq
+gq
+
+// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html
+// Submitted by registry <segred@ics.forth.gr>
+gr
+com.gr
+edu.gr
+net.gr
+org.gr
+gov.gr
+
+// gs : https://en.wikipedia.org/wiki/.gs
+gs
+
+// gt : http://www.gt/politicas_de_registro.html
+gt
+com.gt
+edu.gt
+gob.gt
+ind.gt
+mil.gt
+net.gt
+org.gt
+
+// gu : http://gadao.gov.gu/registration.txt
+*.gu
+
+// gw : https://en.wikipedia.org/wiki/.gw
+gw
+
+// gy : https://en.wikipedia.org/wiki/.gy
+// http://registry.gy/
+gy
+co.gy
+com.gy
+edu.gy
+gov.gy
+net.gy
+org.gy
+
+// hk : https://www.hkdnr.hk
+// Submitted by registry <hk.tech@hkirc.hk>
+hk
+com.hk
+edu.hk
+gov.hk
+idv.hk
+net.hk
+org.hk
+公司.hk
+教育.hk
+敎育.hk
+政府.hk
+個人.hk
+个人.hk
+箇人.hk
+網络.hk
+网络.hk
+组織.hk
+網絡.hk
+网絡.hk
+组织.hk
+組織.hk
+組织.hk
+
+// hm : https://en.wikipedia.org/wiki/.hm
+hm
+
+// hn : http://www.nic.hn/politicas/ps02,,05.html
+hn
+com.hn
+edu.hn
+org.hn
+net.hn
+mil.hn
+gob.hn
+
+// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf
+hr
+iz.hr
+from.hr
+name.hr
+com.hr
+
+// ht : http://www.nic.ht/info/charte.cfm
+ht
+com.ht
+shop.ht
+firm.ht
+info.ht
+adult.ht
+net.ht
+pro.ht
+org.ht
+med.ht
+art.ht
+coop.ht
+pol.ht
+asso.ht
+edu.ht
+rel.ht
+gouv.ht
+perso.ht
+
+// hu : http://www.domain.hu/domain/English/sld.html
+// Confirmed by registry <pasztor@iszt.hu> 2008-06-12
+hu
+co.hu
+info.hu
+org.hu
+priv.hu
+sport.hu
+tm.hu
+2000.hu
+agrar.hu
+bolt.hu
+casino.hu
+city.hu
+erotica.hu
+erotika.hu
+film.hu
+forum.hu
+games.hu
+hotel.hu
+ingatlan.hu
+jogasz.hu
+konyvelo.hu
+lakas.hu
+media.hu
+news.hu
+reklam.hu
+sex.hu
+shop.hu
+suli.hu
+szex.hu
+tozsde.hu
+utazas.hu
+video.hu
+
+// id : https://register.pandi.or.id/
+id
+ac.id
+biz.id
+co.id
+desa.id
+go.id
+mil.id
+my.id
+net.id
+or.id
+sch.id
+web.id
+
+// ie : https://en.wikipedia.org/wiki/.ie
+ie
+gov.ie
+
+// il : http://www.isoc.org.il/domains/
+il
+ac.il
+co.il
+gov.il
+idf.il
+k12.il
+muni.il
+net.il
+org.il
+
+// im : https://www.nic.im/
+// Submitted by registry <info@nic.im>
+im
+ac.im
+co.im
+com.im
+ltd.co.im
+net.im
+org.im
+plc.co.im
+tt.im
+tv.im
+
+// in : https://en.wikipedia.org/wiki/.in
+// see also: https://registry.in/Policies
+// Please note, that nic.in is not an official eTLD, but used by most
+// government institutions.
+in
+co.in
+firm.in
+net.in
+org.in
+gen.in
+ind.in
+nic.in
+ac.in
+edu.in
+res.in
+gov.in
+mil.in
+
+// info : https://en.wikipedia.org/wiki/.info
+info
+
+// int : https://en.wikipedia.org/wiki/.int
+// Confirmed by registry <iana-questions@icann.org> 2008-06-18
+int
+eu.int
+
+// io : http://www.nic.io/rules.html
+// list of other 2nd level tlds ?
+io
+com.io
+
+// iq : http://www.cmc.iq/english/iq/iqregister1.htm
+iq
+gov.iq
+edu.iq
+mil.iq
+com.iq
+org.iq
+net.iq
+
+// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules
+// Also see http://www.nic.ir/Internationalized_Domain_Names
+// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16
+ir
+ac.ir
+co.ir
+gov.ir
+id.ir
+net.ir
+org.ir
+sch.ir
+// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH)
+ایران.ir
+// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH)
+ايران.ir
+
+// is : http://www.isnic.is/domain/rules.php
+// Confirmed by registry <marius@isgate.is> 2008-12-06
+is
+net.is
+com.is
+edu.is
+gov.is
+org.is
+int.is
+
+// it : https://en.wikipedia.org/wiki/.it
+it
+gov.it
+edu.it
+// Reserved geo-names:
+// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf
+// There is also a list of reserved geo-names corresponding to Italian municipalities
+// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here.
+// Regions
+abr.it
+abruzzo.it
+aosta-valley.it
+aostavalley.it
+bas.it
+basilicata.it
+cal.it
+calabria.it
+cam.it
+campania.it
+emilia-romagna.it
+emiliaromagna.it
+emr.it
+friuli-v-giulia.it
+friuli-ve-giulia.it
+friuli-vegiulia.it
+friuli-venezia-giulia.it
+friuli-veneziagiulia.it
+friuli-vgiulia.it
+friuliv-giulia.it
+friulive-giulia.it
+friulivegiulia.it
+friulivenezia-giulia.it
+friuliveneziagiulia.it
+friulivgiulia.it
+fvg.it
+laz.it
+lazio.it
+lig.it
+liguria.it
+lom.it
+lombardia.it
+lombardy.it
+lucania.it
+mar.it
+marche.it
+mol.it
+molise.it
+piedmont.it
+piemonte.it
+pmn.it
+pug.it
+puglia.it
+sar.it
+sardegna.it
+sardinia.it
+sic.it
+sicilia.it
+sicily.it
+taa.it
+tos.it
+toscana.it
+trentino-a-adige.it
+trentino-aadige.it
+trentino-alto-adige.it
+trentino-altoadige.it
+trentino-s-tirol.it
+trentino-stirol.it
+trentino-sud-tirol.it
+trentino-sudtirol.it
+trentino-sued-tirol.it
+trentino-suedtirol.it
+trentinoa-adige.it
+trentinoaadige.it
+trentinoalto-adige.it
+trentinoaltoadige.it
+trentinos-tirol.it
+trentinostirol.it
+trentinosud-tirol.it
+trentinosudtirol.it
+trentinosued-tirol.it
+trentinosuedtirol.it
+tuscany.it
+umb.it
+umbria.it
+val-d-aosta.it
+val-daosta.it
+vald-aosta.it
+valdaosta.it
+valle-aosta.it
+valle-d-aosta.it
+valle-daosta.it
+valleaosta.it
+valled-aosta.it
+valledaosta.it
+vallee-aoste.it
+valleeaoste.it
+vao.it
+vda.it
+ven.it
+veneto.it
+// Provinces
+ag.it
+agrigento.it
+al.it
+alessandria.it
+alto-adige.it
+altoadige.it
+an.it
+ancona.it
+andria-barletta-trani.it
+andria-trani-barletta.it
+andriabarlettatrani.it
+andriatranibarletta.it
+ao.it
+aosta.it
+aoste.it
+ap.it
+aq.it
+aquila.it
+ar.it
+arezzo.it
+ascoli-piceno.it
+ascolipiceno.it
+asti.it
+at.it
+av.it
+avellino.it
+ba.it
+balsan.it
+bari.it
+barletta-trani-andria.it
+barlettatraniandria.it
+belluno.it
+benevento.it
+bergamo.it
+bg.it
+bi.it
+biella.it
+bl.it
+bn.it
+bo.it
+bologna.it
+bolzano.it
+bozen.it
+br.it
+brescia.it
+brindisi.it
+bs.it
+bt.it
+bz.it
+ca.it
+cagliari.it
+caltanissetta.it
+campidano-medio.it
+campidanomedio.it
+campobasso.it
+carbonia-iglesias.it
+carboniaiglesias.it
+carrara-massa.it
+carraramassa.it
+caserta.it
+catania.it
+catanzaro.it
+cb.it
+ce.it
+cesena-forli.it
+cesenaforli.it
+ch.it
+chieti.it
+ci.it
+cl.it
+cn.it
+co.it
+como.it
+cosenza.it
+cr.it
+cremona.it
+crotone.it
+cs.it
+ct.it
+cuneo.it
+cz.it
+dell-ogliastra.it
+dellogliastra.it
+en.it
+enna.it
+fc.it
+fe.it
+fermo.it
+ferrara.it
+fg.it
+fi.it
+firenze.it
+florence.it
+fm.it
+foggia.it
+forli-cesena.it
+forlicesena.it
+fr.it
+frosinone.it
+ge.it
+genoa.it
+genova.it
+go.it
+gorizia.it
+gr.it
+grosseto.it
+iglesias-carbonia.it
+iglesiascarbonia.it
+im.it
+imperia.it
+is.it
+isernia.it
+kr.it
+la-spezia.it
+laquila.it
+laspezia.it
+latina.it
+lc.it
+le.it
+lecce.it
+lecco.it
+li.it
+livorno.it
+lo.it
+lodi.it
+lt.it
+lu.it
+lucca.it
+macerata.it
+mantova.it
+massa-carrara.it
+massacarrara.it
+matera.it
+mb.it
+mc.it
+me.it
+medio-campidano.it
+mediocampidano.it
+messina.it
+mi.it
+milan.it
+milano.it
+mn.it
+mo.it
+modena.it
+monza-brianza.it
+monza-e-della-brianza.it
+monza.it
+monzabrianza.it
+monzaebrianza.it
+monzaedellabrianza.it
+ms.it
+mt.it
+na.it
+naples.it
+napoli.it
+no.it
+novara.it
+nu.it
+nuoro.it
+og.it
+ogliastra.it
+olbia-tempio.it
+olbiatempio.it
+or.it
+oristano.it
+ot.it
+pa.it
+padova.it
+padua.it
+palermo.it
+parma.it
+pavia.it
+pc.it
+pd.it
+pe.it
+perugia.it
+pesaro-urbino.it
+pesarourbino.it
+pescara.it
+pg.it
+pi.it
+piacenza.it
+pisa.it
+pistoia.it
+pn.it
+po.it
+pordenone.it
+potenza.it
+pr.it
+prato.it
+pt.it
+pu.it
+pv.it
+pz.it
+ra.it
+ragusa.it
+ravenna.it
+rc.it
+re.it
+reggio-calabria.it
+reggio-emilia.it
+reggiocalabria.it
+reggioemilia.it
+rg.it
+ri.it
+rieti.it
+rimini.it
+rm.it
+rn.it
+ro.it
+roma.it
+rome.it
+rovigo.it
+sa.it
+salerno.it
+sassari.it
+savona.it
+si.it
+siena.it
+siracusa.it
+so.it
+sondrio.it
+sp.it
+sr.it
+ss.it
+suedtirol.it
+sv.it
+ta.it
+taranto.it
+te.it
+tempio-olbia.it
+tempioolbia.it
+teramo.it
+terni.it
+tn.it
+to.it
+torino.it
+tp.it
+tr.it
+trani-andria-barletta.it
+trani-barletta-andria.it
+traniandriabarletta.it
+tranibarlettaandria.it
+trapani.it
+trentino.it
+trento.it
+treviso.it
+trieste.it
+ts.it
+turin.it
+tv.it
+ud.it
+udine.it
+urbino-pesaro.it
+urbinopesaro.it
+va.it
+varese.it
+vb.it
+vc.it
+ve.it
+venezia.it
+venice.it
+verbania.it
+vercelli.it
+verona.it
+vi.it
+vibo-valentia.it
+vibovalentia.it
+vicenza.it
+viterbo.it
+vr.it
+vs.it
+vt.it
+vv.it
+
+// je : http://www.channelisles.net/register-domains/
+// Confirmed by registry <nigel@channelisles.net> 2013-11-28
+je
+co.je
+net.je
+org.je
+
+// jm : http://www.com.jm/register.html
+*.jm
+
+// jo : http://www.dns.jo/Registration_policy.aspx
+jo
+com.jo
+org.jo
+net.jo
+edu.jo
+sch.jo
+gov.jo
+mil.jo
+name.jo
+
+// jobs : https://en.wikipedia.org/wiki/.jobs
+jobs
+
+// jp : https://en.wikipedia.org/wiki/.jp
+// http://jprs.co.jp/en/jpdomain.html
+// Submitted by registry <info@jprs.jp>
+jp
+// jp organizational type names
+ac.jp
+ad.jp
+co.jp
+ed.jp
+go.jp
+gr.jp
+lg.jp
+ne.jp
+or.jp
+// jp prefecture type names
+aichi.jp
+akita.jp
+aomori.jp
+chiba.jp
+ehime.jp
+fukui.jp
+fukuoka.jp
+fukushima.jp
+gifu.jp
+gunma.jp
+hiroshima.jp
+hokkaido.jp
+hyogo.jp
+ibaraki.jp
+ishikawa.jp
+iwate.jp
+kagawa.jp
+kagoshima.jp
+kanagawa.jp
+kochi.jp
+kumamoto.jp
+kyoto.jp
+mie.jp
+miyagi.jp
+miyazaki.jp
+nagano.jp
+nagasaki.jp
+nara.jp
+niigata.jp
+oita.jp
+okayama.jp
+okinawa.jp
+osaka.jp
+saga.jp
+saitama.jp
+shiga.jp
+shimane.jp
+shizuoka.jp
+tochigi.jp
+tokushima.jp
+tokyo.jp
+tottori.jp
+toyama.jp
+wakayama.jp
+yamagata.jp
+yamaguchi.jp
+yamanashi.jp
+栃木.jp
+愛知.jp
+愛媛.jp
+兵庫.jp
+熊本.jp
+茨城.jp
+北海道.jp
+千葉.jp
+和歌山.jp
+長崎.jp
+長野.jp
+新潟.jp
+青森.jp
+静岡.jp
+東京.jp
+石川.jp
+埼玉.jp
+三重.jp
+京都.jp
+佐賀.jp
+大分.jp
+大阪.jp
+奈良.jp
+宮城.jp
+宮崎.jp
+富山.jp
+山口.jp
+山形.jp
+山梨.jp
+岩手.jp
+岐阜.jp
+岡山.jp
+島根.jp
+広島.jp
+徳島.jp
+沖縄.jp
+滋賀.jp
+神奈川.jp
+福井.jp
+福岡.jp
+福島.jp
+秋田.jp
+群馬.jp
+香川.jp
+高知.jp
+鳥取.jp
+鹿児島.jp
+// jp geographic type names
+// http://jprs.jp/doc/rule/saisoku-1.html
+*.kawasaki.jp
+*.kitakyushu.jp
+*.kobe.jp
+*.nagoya.jp
+*.sapporo.jp
+*.sendai.jp
+*.yokohama.jp
+!city.kawasaki.jp
+!city.kitakyushu.jp
+!city.kobe.jp
+!city.nagoya.jp
+!city.sapporo.jp
+!city.sendai.jp
+!city.yokohama.jp
+// 4th level registration
+aisai.aichi.jp
+ama.aichi.jp
+anjo.aichi.jp
+asuke.aichi.jp
+chiryu.aichi.jp
+chita.aichi.jp
+fuso.aichi.jp
+gamagori.aichi.jp
+handa.aichi.jp
+hazu.aichi.jp
+hekinan.aichi.jp
+higashiura.aichi.jp
+ichinomiya.aichi.jp
+inazawa.aichi.jp
+inuyama.aichi.jp
+isshiki.aichi.jp
+iwakura.aichi.jp
+kanie.aichi.jp
+kariya.aichi.jp
+kasugai.aichi.jp
+kira.aichi.jp
+kiyosu.aichi.jp
+komaki.aichi.jp
+konan.aichi.jp
+kota.aichi.jp
+mihama.aichi.jp
+miyoshi.aichi.jp
+nishio.aichi.jp
+nisshin.aichi.jp
+obu.aichi.jp
+oguchi.aichi.jp
+oharu.aichi.jp
+okazaki.aichi.jp
+owariasahi.aichi.jp
+seto.aichi.jp
+shikatsu.aichi.jp
+shinshiro.aichi.jp
+shitara.aichi.jp
+tahara.aichi.jp
+takahama.aichi.jp
+tobishima.aichi.jp
+toei.aichi.jp
+togo.aichi.jp
+tokai.aichi.jp
+tokoname.aichi.jp
+toyoake.aichi.jp
+toyohashi.aichi.jp
+toyokawa.aichi.jp
+toyone.aichi.jp
+toyota.aichi.jp
+tsushima.aichi.jp
+yatomi.aichi.jp
+akita.akita.jp
+daisen.akita.jp
+fujisato.akita.jp
+gojome.akita.jp
+hachirogata.akita.jp
+happou.akita.jp
+higashinaruse.akita.jp
+honjo.akita.jp
+honjyo.akita.jp
+ikawa.akita.jp
+kamikoani.akita.jp
+kamioka.akita.jp
+katagami.akita.jp
+kazuno.akita.jp
+kitaakita.akita.jp
+kosaka.akita.jp
+kyowa.akita.jp
+misato.akita.jp
+mitane.akita.jp
+moriyoshi.akita.jp
+nikaho.akita.jp
+noshiro.akita.jp
+odate.akita.jp
+oga.akita.jp
+ogata.akita.jp
+semboku.akita.jp
+yokote.akita.jp
+yurihonjo.akita.jp
+aomori.aomori.jp
+gonohe.aomori.jp
+hachinohe.aomori.jp
+hashikami.aomori.jp
+hiranai.aomori.jp
+hirosaki.aomori.jp
+itayanagi.aomori.jp
+kuroishi.aomori.jp
+misawa.aomori.jp
+mutsu.aomori.jp
+nakadomari.aomori.jp
+noheji.aomori.jp
+oirase.aomori.jp
+owani.aomori.jp
+rokunohe.aomori.jp
+sannohe.aomori.jp
+shichinohe.aomori.jp
+shingo.aomori.jp
+takko.aomori.jp
+towada.aomori.jp
+tsugaru.aomori.jp
+tsuruta.aomori.jp
+abiko.chiba.jp
+asahi.chiba.jp
+chonan.chiba.jp
+chosei.chiba.jp
+choshi.chiba.jp
+chuo.chiba.jp
+funabashi.chiba.jp
+futtsu.chiba.jp
+hanamigawa.chiba.jp
+ichihara.chiba.jp
+ichikawa.chiba.jp
+ichinomiya.chiba.jp
+inzai.chiba.jp
+isumi.chiba.jp
+kamagaya.chiba.jp
+kamogawa.chiba.jp
+kashiwa.chiba.jp
+katori.chiba.jp
+katsuura.chiba.jp
+kimitsu.chiba.jp
+kisarazu.chiba.jp
+kozaki.chiba.jp
+kujukuri.chiba.jp
+kyonan.chiba.jp
+matsudo.chiba.jp
+midori.chiba.jp
+mihama.chiba.jp
+minamiboso.chiba.jp
+mobara.chiba.jp
+mutsuzawa.chiba.jp
+nagara.chiba.jp
+nagareyama.chiba.jp
+narashino.chiba.jp
+narita.chiba.jp
+noda.chiba.jp
+oamishirasato.chiba.jp
+omigawa.chiba.jp
+onjuku.chiba.jp
+otaki.chiba.jp
+sakae.chiba.jp
+sakura.chiba.jp
+shimofusa.chiba.jp
+shirako.chiba.jp
+shiroi.chiba.jp
+shisui.chiba.jp
+sodegaura.chiba.jp
+sosa.chiba.jp
+tako.chiba.jp
+tateyama.chiba.jp
+togane.chiba.jp
+tohnosho.chiba.jp
+tomisato.chiba.jp
+urayasu.chiba.jp
+yachimata.chiba.jp
+yachiyo.chiba.jp
+yokaichiba.chiba.jp
+yokoshibahikari.chiba.jp
+yotsukaido.chiba.jp
+ainan.ehime.jp
+honai.ehime.jp
+ikata.ehime.jp
+imabari.ehime.jp
+iyo.ehime.jp
+kamijima.ehime.jp
+kihoku.ehime.jp
+kumakogen.ehime.jp
+masaki.ehime.jp
+matsuno.ehime.jp
+matsuyama.ehime.jp
+namikata.ehime.jp
+niihama.ehime.jp
+ozu.ehime.jp
+saijo.ehime.jp
+seiyo.ehime.jp
+shikokuchuo.ehime.jp
+tobe.ehime.jp
+toon.ehime.jp
+uchiko.ehime.jp
+uwajima.ehime.jp
+yawatahama.ehime.jp
+echizen.fukui.jp
+eiheiji.fukui.jp
+fukui.fukui.jp
+ikeda.fukui.jp
+katsuyama.fukui.jp
+mihama.fukui.jp
+minamiechizen.fukui.jp
+obama.fukui.jp
+ohi.fukui.jp
+ono.fukui.jp
+sabae.fukui.jp
+sakai.fukui.jp
+takahama.fukui.jp
+tsuruga.fukui.jp
+wakasa.fukui.jp
+ashiya.fukuoka.jp
+buzen.fukuoka.jp
+chikugo.fukuoka.jp
+chikuho.fukuoka.jp
+chikujo.fukuoka.jp
+chikushino.fukuoka.jp
+chikuzen.fukuoka.jp
+chuo.fukuoka.jp
+dazaifu.fukuoka.jp
+fukuchi.fukuoka.jp
+hakata.fukuoka.jp
+higashi.fukuoka.jp
+hirokawa.fukuoka.jp
+hisayama.fukuoka.jp
+iizuka.fukuoka.jp
+inatsuki.fukuoka.jp
+kaho.fukuoka.jp
+kasuga.fukuoka.jp
+kasuya.fukuoka.jp
+kawara.fukuoka.jp
+keisen.fukuoka.jp
+koga.fukuoka.jp
+kurate.fukuoka.jp
+kurogi.fukuoka.jp
+kurume.fukuoka.jp
+minami.fukuoka.jp
+miyako.fukuoka.jp
+miyama.fukuoka.jp
+miyawaka.fukuoka.jp
+mizumaki.fukuoka.jp
+munakata.fukuoka.jp
+nakagawa.fukuoka.jp
+nakama.fukuoka.jp
+nishi.fukuoka.jp
+nogata.fukuoka.jp
+ogori.fukuoka.jp
+okagaki.fukuoka.jp
+okawa.fukuoka.jp
+oki.fukuoka.jp
+omuta.fukuoka.jp
+onga.fukuoka.jp
+onojo.fukuoka.jp
+oto.fukuoka.jp
+saigawa.fukuoka.jp
+sasaguri.fukuoka.jp
+shingu.fukuoka.jp
+shinyoshitomi.fukuoka.jp
+shonai.fukuoka.jp
+soeda.fukuoka.jp
+sue.fukuoka.jp
+tachiarai.fukuoka.jp
+tagawa.fukuoka.jp
+takata.fukuoka.jp
+toho.fukuoka.jp
+toyotsu.fukuoka.jp
+tsuiki.fukuoka.jp
+ukiha.fukuoka.jp
+umi.fukuoka.jp
+usui.fukuoka.jp
+yamada.fukuoka.jp
+yame.fukuoka.jp
+yanagawa.fukuoka.jp
+yukuhashi.fukuoka.jp
+aizubange.fukushima.jp
+aizumisato.fukushima.jp
+aizuwakamatsu.fukushima.jp
+asakawa.fukushima.jp
+bandai.fukushima.jp
+date.fukushima.jp
+fukushima.fukushima.jp
+furudono.fukushima.jp
+futaba.fukushima.jp
+hanawa.fukushima.jp
+higashi.fukushima.jp
+hirata.fukushima.jp
+hirono.fukushima.jp
+iitate.fukushima.jp
+inawashiro.fukushima.jp
+ishikawa.fukushima.jp
+iwaki.fukushima.jp
+izumizaki.fukushima.jp
+kagamiishi.fukushima.jp
+kaneyama.fukushima.jp
+kawamata.fukushima.jp
+kitakata.fukushima.jp
+kitashiobara.fukushima.jp
+koori.fukushima.jp
+koriyama.fukushima.jp
+kunimi.fukushima.jp
+miharu.fukushima.jp
+mishima.fukushima.jp
+namie.fukushima.jp
+nango.fukushima.jp
+nishiaizu.fukushima.jp
+nishigo.fukushima.jp
+okuma.fukushima.jp
+omotego.fukushima.jp
+ono.fukushima.jp
+otama.fukushima.jp
+samegawa.fukushima.jp
+shimogo.fukushima.jp
+shirakawa.fukushima.jp
+showa.fukushima.jp
+soma.fukushima.jp
+sukagawa.fukushima.jp
+taishin.fukushima.jp
+tamakawa.fukushima.jp
+tanagura.fukushima.jp
+tenei.fukushima.jp
+yabuki.fukushima.jp
+yamato.fukushima.jp
+yamatsuri.fukushima.jp
+yanaizu.fukushima.jp
+yugawa.fukushima.jp
+anpachi.gifu.jp
+ena.gifu.jp
+gifu.gifu.jp
+ginan.gifu.jp
+godo.gifu.jp
+gujo.gifu.jp
+hashima.gifu.jp
+hichiso.gifu.jp
+hida.gifu.jp
+higashishirakawa.gifu.jp
+ibigawa.gifu.jp
+ikeda.gifu.jp
+kakamigahara.gifu.jp
+kani.gifu.jp
+kasahara.gifu.jp
+kasamatsu.gifu.jp
+kawaue.gifu.jp
+kitagata.gifu.jp
+mino.gifu.jp
+minokamo.gifu.jp
+mitake.gifu.jp
+mizunami.gifu.jp
+motosu.gifu.jp
+nakatsugawa.gifu.jp
+ogaki.gifu.jp
+sakahogi.gifu.jp
+seki.gifu.jp
+sekigahara.gifu.jp
+shirakawa.gifu.jp
+tajimi.gifu.jp
+takayama.gifu.jp
+tarui.gifu.jp
+toki.gifu.jp
+tomika.gifu.jp
+wanouchi.gifu.jp
+yamagata.gifu.jp
+yaotsu.gifu.jp
+yoro.gifu.jp
+annaka.gunma.jp
+chiyoda.gunma.jp
+fujioka.gunma.jp
+higashiagatsuma.gunma.jp
+isesaki.gunma.jp
+itakura.gunma.jp
+kanna.gunma.jp
+kanra.gunma.jp
+katashina.gunma.jp
+kawaba.gunma.jp
+kiryu.gunma.jp
+kusatsu.gunma.jp
+maebashi.gunma.jp
+meiwa.gunma.jp
+midori.gunma.jp
+minakami.gunma.jp
+naganohara.gunma.jp
+nakanojo.gunma.jp
+nanmoku.gunma.jp
+numata.gunma.jp
+oizumi.gunma.jp
+ora.gunma.jp
+ota.gunma.jp
+shibukawa.gunma.jp
+shimonita.gunma.jp
+shinto.gunma.jp
+showa.gunma.jp
+takasaki.gunma.jp
+takayama.gunma.jp
+tamamura.gunma.jp
+tatebayashi.gunma.jp
+tomioka.gunma.jp
+tsukiyono.gunma.jp
+tsumagoi.gunma.jp
+ueno.gunma.jp
+yoshioka.gunma.jp
+asaminami.hiroshima.jp
+daiwa.hiroshima.jp
+etajima.hiroshima.jp
+fuchu.hiroshima.jp
+fukuyama.hiroshima.jp
+hatsukaichi.hiroshima.jp
+higashihiroshima.hiroshima.jp
+hongo.hiroshima.jp
+jinsekikogen.hiroshima.jp
+kaita.hiroshima.jp
+kui.hiroshima.jp
+kumano.hiroshima.jp
+kure.hiroshima.jp
+mihara.hiroshima.jp
+miyoshi.hiroshima.jp
+naka.hiroshima.jp
+onomichi.hiroshima.jp
+osakikamijima.hiroshima.jp
+otake.hiroshima.jp
+saka.hiroshima.jp
+sera.hiroshima.jp
+seranishi.hiroshima.jp
+shinichi.hiroshima.jp
+shobara.hiroshima.jp
+takehara.hiroshima.jp
+abashiri.hokkaido.jp
+abira.hokkaido.jp
+aibetsu.hokkaido.jp
+akabira.hokkaido.jp
+akkeshi.hokkaido.jp
+asahikawa.hokkaido.jp
+ashibetsu.hokkaido.jp
+ashoro.hokkaido.jp
+assabu.hokkaido.jp
+atsuma.hokkaido.jp
+bibai.hokkaido.jp
+biei.hokkaido.jp
+bifuka.hokkaido.jp
+bihoro.hokkaido.jp
+biratori.hokkaido.jp
+chippubetsu.hokkaido.jp
+chitose.hokkaido.jp
+date.hokkaido.jp
+ebetsu.hokkaido.jp
+embetsu.hokkaido.jp
+eniwa.hokkaido.jp
+erimo.hokkaido.jp
+esan.hokkaido.jp
+esashi.hokkaido.jp
+fukagawa.hokkaido.jp
+fukushima.hokkaido.jp
+furano.hokkaido.jp
+furubira.hokkaido.jp
+haboro.hokkaido.jp
+hakodate.hokkaido.jp
+hamatonbetsu.hokkaido.jp
+hidaka.hokkaido.jp
+higashikagura.hokkaido.jp
+higashikawa.hokkaido.jp
+hiroo.hokkaido.jp
+hokuryu.hokkaido.jp
+hokuto.hokkaido.jp
+honbetsu.hokkaido.jp
+horokanai.hokkaido.jp
+horonobe.hokkaido.jp
+ikeda.hokkaido.jp
+imakane.hokkaido.jp
+ishikari.hokkaido.jp
+iwamizawa.hokkaido.jp
+iwanai.hokkaido.jp
+kamifurano.hokkaido.jp
+kamikawa.hokkaido.jp
+kamishihoro.hokkaido.jp
+kamisunagawa.hokkaido.jp
+kamoenai.hokkaido.jp
+kayabe.hokkaido.jp
+kembuchi.hokkaido.jp
+kikonai.hokkaido.jp
+kimobetsu.hokkaido.jp
+kitahiroshima.hokkaido.jp
+kitami.hokkaido.jp
+kiyosato.hokkaido.jp
+koshimizu.hokkaido.jp
+kunneppu.hokkaido.jp
+kuriyama.hokkaido.jp
+kuromatsunai.hokkaido.jp
+kushiro.hokkaido.jp
+kutchan.hokkaido.jp
+kyowa.hokkaido.jp
+mashike.hokkaido.jp
+matsumae.hokkaido.jp
+mikasa.hokkaido.jp
+minamifurano.hokkaido.jp
+mombetsu.hokkaido.jp
+moseushi.hokkaido.jp
+mukawa.hokkaido.jp
+muroran.hokkaido.jp
+naie.hokkaido.jp
+nakagawa.hokkaido.jp
+nakasatsunai.hokkaido.jp
+nakatombetsu.hokkaido.jp
+nanae.hokkaido.jp
+nanporo.hokkaido.jp
+nayoro.hokkaido.jp
+nemuro.hokkaido.jp
+niikappu.hokkaido.jp
+niki.hokkaido.jp
+nishiokoppe.hokkaido.jp
+noboribetsu.hokkaido.jp
+numata.hokkaido.jp
+obihiro.hokkaido.jp
+obira.hokkaido.jp
+oketo.hokkaido.jp
+okoppe.hokkaido.jp
+otaru.hokkaido.jp
+otobe.hokkaido.jp
+otofuke.hokkaido.jp
+otoineppu.hokkaido.jp
+oumu.hokkaido.jp
+ozora.hokkaido.jp
+pippu.hokkaido.jp
+rankoshi.hokkaido.jp
+rebun.hokkaido.jp
+rikubetsu.hokkaido.jp
+rishiri.hokkaido.jp
+rishirifuji.hokkaido.jp
+saroma.hokkaido.jp
+sarufutsu.hokkaido.jp
+shakotan.hokkaido.jp
+shari.hokkaido.jp
+shibecha.hokkaido.jp
+shibetsu.hokkaido.jp
+shikabe.hokkaido.jp
+shikaoi.hokkaido.jp
+shimamaki.hokkaido.jp
+shimizu.hokkaido.jp
+shimokawa.hokkaido.jp
+shinshinotsu.hokkaido.jp
+shintoku.hokkaido.jp
+shiranuka.hokkaido.jp
+shiraoi.hokkaido.jp
+shiriuchi.hokkaido.jp
+sobetsu.hokkaido.jp
+sunagawa.hokkaido.jp
+taiki.hokkaido.jp
+takasu.hokkaido.jp
+takikawa.hokkaido.jp
+takinoue.hokkaido.jp
+teshikaga.hokkaido.jp
+tobetsu.hokkaido.jp
+tohma.hokkaido.jp
+tomakomai.hokkaido.jp
+tomari.hokkaido.jp
+toya.hokkaido.jp
+toyako.hokkaido.jp
+toyotomi.hokkaido.jp
+toyoura.hokkaido.jp
+tsubetsu.hokkaido.jp
+tsukigata.hokkaido.jp
+urakawa.hokkaido.jp
+urausu.hokkaido.jp
+uryu.hokkaido.jp
+utashinai.hokkaido.jp
+wakkanai.hokkaido.jp
+wassamu.hokkaido.jp
+yakumo.hokkaido.jp
+yoichi.hokkaido.jp
+aioi.hyogo.jp
+akashi.hyogo.jp
+ako.hyogo.jp
+amagasaki.hyogo.jp
+aogaki.hyogo.jp
+asago.hyogo.jp
+ashiya.hyogo.jp
+awaji.hyogo.jp
+fukusaki.hyogo.jp
+goshiki.hyogo.jp
+harima.hyogo.jp
+himeji.hyogo.jp
+ichikawa.hyogo.jp
+inagawa.hyogo.jp
+itami.hyogo.jp
+kakogawa.hyogo.jp
+kamigori.hyogo.jp
+kamikawa.hyogo.jp
+kasai.hyogo.jp
+kasuga.hyogo.jp
+kawanishi.hyogo.jp
+miki.hyogo.jp
+minamiawaji.hyogo.jp
+nishinomiya.hyogo.jp
+nishiwaki.hyogo.jp
+ono.hyogo.jp
+sanda.hyogo.jp
+sannan.hyogo.jp
+sasayama.hyogo.jp
+sayo.hyogo.jp
+shingu.hyogo.jp
+shinonsen.hyogo.jp
+shiso.hyogo.jp
+sumoto.hyogo.jp
+taishi.hyogo.jp
+taka.hyogo.jp
+takarazuka.hyogo.jp
+takasago.hyogo.jp
+takino.hyogo.jp
+tamba.hyogo.jp
+tatsuno.hyogo.jp
+toyooka.hyogo.jp
+yabu.hyogo.jp
+yashiro.hyogo.jp
+yoka.hyogo.jp
+yokawa.hyogo.jp
+ami.ibaraki.jp
+asahi.ibaraki.jp
+bando.ibaraki.jp
+chikusei.ibaraki.jp
+daigo.ibaraki.jp
+fujishiro.ibaraki.jp
+hitachi.ibaraki.jp
+hitachinaka.ibaraki.jp
+hitachiomiya.ibaraki.jp
+hitachiota.ibaraki.jp
+ibaraki.ibaraki.jp
+ina.ibaraki.jp
+inashiki.ibaraki.jp
+itako.ibaraki.jp
+iwama.ibaraki.jp
+joso.ibaraki.jp
+kamisu.ibaraki.jp
+kasama.ibaraki.jp
+kashima.ibaraki.jp
+kasumigaura.ibaraki.jp
+koga.ibaraki.jp
+miho.ibaraki.jp
+mito.ibaraki.jp
+moriya.ibaraki.jp
+naka.ibaraki.jp
+namegata.ibaraki.jp
+oarai.ibaraki.jp
+ogawa.ibaraki.jp
+omitama.ibaraki.jp
+ryugasaki.ibaraki.jp
+sakai.ibaraki.jp
+sakuragawa.ibaraki.jp
+shimodate.ibaraki.jp
+shimotsuma.ibaraki.jp
+shirosato.ibaraki.jp
+sowa.ibaraki.jp
+suifu.ibaraki.jp
+takahagi.ibaraki.jp
+tamatsukuri.ibaraki.jp
+tokai.ibaraki.jp
+tomobe.ibaraki.jp
+tone.ibaraki.jp
+toride.ibaraki.jp
+tsuchiura.ibaraki.jp
+tsukuba.ibaraki.jp
+uchihara.ibaraki.jp
+ushiku.ibaraki.jp
+yachiyo.ibaraki.jp
+yamagata.ibaraki.jp
+yawara.ibaraki.jp
+yuki.ibaraki.jp
+anamizu.ishikawa.jp
+hakui.ishikawa.jp
+hakusan.ishikawa.jp
+kaga.ishikawa.jp
+kahoku.ishikawa.jp
+kanazawa.ishikawa.jp
+kawakita.ishikawa.jp
+komatsu.ishikawa.jp
+nakanoto.ishikawa.jp
+nanao.ishikawa.jp
+nomi.ishikawa.jp
+nonoichi.ishikawa.jp
+noto.ishikawa.jp
+shika.ishikawa.jp
+suzu.ishikawa.jp
+tsubata.ishikawa.jp
+tsurugi.ishikawa.jp
+uchinada.ishikawa.jp
+wajima.ishikawa.jp
+fudai.iwate.jp
+fujisawa.iwate.jp
+hanamaki.iwate.jp
+hiraizumi.iwate.jp
+hirono.iwate.jp
+ichinohe.iwate.jp
+ichinoseki.iwate.jp
+iwaizumi.iwate.jp
+iwate.iwate.jp
+joboji.iwate.jp
+kamaishi.iwate.jp
+kanegasaki.iwate.jp
+karumai.iwate.jp
+kawai.iwate.jp
+kitakami.iwate.jp
+kuji.iwate.jp
+kunohe.iwate.jp
+kuzumaki.iwate.jp
+miyako.iwate.jp
+mizusawa.iwate.jp
+morioka.iwate.jp
+ninohe.iwate.jp
+noda.iwate.jp
+ofunato.iwate.jp
+oshu.iwate.jp
+otsuchi.iwate.jp
+rikuzentakata.iwate.jp
+shiwa.iwate.jp
+shizukuishi.iwate.jp
+sumita.iwate.jp
+tanohata.iwate.jp
+tono.iwate.jp
+yahaba.iwate.jp
+yamada.iwate.jp
+ayagawa.kagawa.jp
+higashikagawa.kagawa.jp
+kanonji.kagawa.jp
+kotohira.kagawa.jp
+manno.kagawa.jp
+marugame.kagawa.jp
+mitoyo.kagawa.jp
+naoshima.kagawa.jp
+sanuki.kagawa.jp
+tadotsu.kagawa.jp
+takamatsu.kagawa.jp
+tonosho.kagawa.jp
+uchinomi.kagawa.jp
+utazu.kagawa.jp
+zentsuji.kagawa.jp
+akune.kagoshima.jp
+amami.kagoshima.jp
+hioki.kagoshima.jp
+isa.kagoshima.jp
+isen.kagoshima.jp
+izumi.kagoshima.jp
+kagoshima.kagoshima.jp
+kanoya.kagoshima.jp
+kawanabe.kagoshima.jp
+kinko.kagoshima.jp
+kouyama.kagoshima.jp
+makurazaki.kagoshima.jp
+matsumoto.kagoshima.jp
+minamitane.kagoshima.jp
+nakatane.kagoshima.jp
+nishinoomote.kagoshima.jp
+satsumasendai.kagoshima.jp
+soo.kagoshima.jp
+tarumizu.kagoshima.jp
+yusui.kagoshima.jp
+aikawa.kanagawa.jp
+atsugi.kanagawa.jp
+ayase.kanagawa.jp
+chigasaki.kanagawa.jp
+ebina.kanagawa.jp
+fujisawa.kanagawa.jp
+hadano.kanagawa.jp
+hakone.kanagawa.jp
+hiratsuka.kanagawa.jp
+isehara.kanagawa.jp
+kaisei.kanagawa.jp
+kamakura.kanagawa.jp
+kiyokawa.kanagawa.jp
+matsuda.kanagawa.jp
+minamiashigara.kanagawa.jp
+miura.kanagawa.jp
+nakai.kanagawa.jp
+ninomiya.kanagawa.jp
+odawara.kanagawa.jp
+oi.kanagawa.jp
+oiso.kanagawa.jp
+sagamihara.kanagawa.jp
+samukawa.kanagawa.jp
+tsukui.kanagawa.jp
+yamakita.kanagawa.jp
+yamato.kanagawa.jp
+yokosuka.kanagawa.jp
+yugawara.kanagawa.jp
+zama.kanagawa.jp
+zushi.kanagawa.jp
+aki.kochi.jp
+geisei.kochi.jp
+hidaka.kochi.jp
+higashitsuno.kochi.jp
+ino.kochi.jp
+kagami.kochi.jp
+kami.kochi.jp
+kitagawa.kochi.jp
+kochi.kochi.jp
+mihara.kochi.jp
+motoyama.kochi.jp
+muroto.kochi.jp
+nahari.kochi.jp
+nakamura.kochi.jp
+nankoku.kochi.jp
+nishitosa.kochi.jp
+niyodogawa.kochi.jp
+ochi.kochi.jp
+okawa.kochi.jp
+otoyo.kochi.jp
+otsuki.kochi.jp
+sakawa.kochi.jp
+sukumo.kochi.jp
+susaki.kochi.jp
+tosa.kochi.jp
+tosashimizu.kochi.jp
+toyo.kochi.jp
+tsuno.kochi.jp
+umaji.kochi.jp
+yasuda.kochi.jp
+yusuhara.kochi.jp
+amakusa.kumamoto.jp
+arao.kumamoto.jp
+aso.kumamoto.jp
+choyo.kumamoto.jp
+gyokuto.kumamoto.jp
+kamiamakusa.kumamoto.jp
+kikuchi.kumamoto.jp
+kumamoto.kumamoto.jp
+mashiki.kumamoto.jp
+mifune.kumamoto.jp
+minamata.kumamoto.jp
+minamioguni.kumamoto.jp
+nagasu.kumamoto.jp
+nishihara.kumamoto.jp
+oguni.kumamoto.jp
+ozu.kumamoto.jp
+sumoto.kumamoto.jp
+takamori.kumamoto.jp
+uki.kumamoto.jp
+uto.kumamoto.jp
+yamaga.kumamoto.jp
+yamato.kumamoto.jp
+yatsushiro.kumamoto.jp
+ayabe.kyoto.jp
+fukuchiyama.kyoto.jp
+higashiyama.kyoto.jp
+ide.kyoto.jp
+ine.kyoto.jp
+joyo.kyoto.jp
+kameoka.kyoto.jp
+kamo.kyoto.jp
+kita.kyoto.jp
+kizu.kyoto.jp
+kumiyama.kyoto.jp
+kyotamba.kyoto.jp
+kyotanabe.kyoto.jp
+kyotango.kyoto.jp
+maizuru.kyoto.jp
+minami.kyoto.jp
+minamiyamashiro.kyoto.jp
+miyazu.kyoto.jp
+muko.kyoto.jp
+nagaokakyo.kyoto.jp
+nakagyo.kyoto.jp
+nantan.kyoto.jp
+oyamazaki.kyoto.jp
+sakyo.kyoto.jp
+seika.kyoto.jp
+tanabe.kyoto.jp
+uji.kyoto.jp
+ujitawara.kyoto.jp
+wazuka.kyoto.jp
+yamashina.kyoto.jp
+yawata.kyoto.jp
+asahi.mie.jp
+inabe.mie.jp
+ise.mie.jp
+kameyama.mie.jp
+kawagoe.mie.jp
+kiho.mie.jp
+kisosaki.mie.jp
+kiwa.mie.jp
+komono.mie.jp
+kumano.mie.jp
+kuwana.mie.jp
+matsusaka.mie.jp
+meiwa.mie.jp
+mihama.mie.jp
+minamiise.mie.jp
+misugi.mie.jp
+miyama.mie.jp
+nabari.mie.jp
+shima.mie.jp
+suzuka.mie.jp
+tado.mie.jp
+taiki.mie.jp
+taki.mie.jp
+tamaki.mie.jp
+toba.mie.jp
+tsu.mie.jp
+udono.mie.jp
+ureshino.mie.jp
+watarai.mie.jp
+yokkaichi.mie.jp
+furukawa.miyagi.jp
+higashimatsushima.miyagi.jp
+ishinomaki.miyagi.jp
+iwanuma.miyagi.jp
+kakuda.miyagi.jp
+kami.miyagi.jp
+kawasaki.miyagi.jp
+marumori.miyagi.jp
+matsushima.miyagi.jp
+minamisanriku.miyagi.jp
+misato.miyagi.jp
+murata.miyagi.jp
+natori.miyagi.jp
+ogawara.miyagi.jp
+ohira.miyagi.jp
+onagawa.miyagi.jp
+osaki.miyagi.jp
+rifu.miyagi.jp
+semine.miyagi.jp
+shibata.miyagi.jp
+shichikashuku.miyagi.jp
+shikama.miyagi.jp
+shiogama.miyagi.jp
+shiroishi.miyagi.jp
+tagajo.miyagi.jp
+taiwa.miyagi.jp
+tome.miyagi.jp
+tomiya.miyagi.jp
+wakuya.miyagi.jp
+watari.miyagi.jp
+yamamoto.miyagi.jp
+zao.miyagi.jp
+aya.miyazaki.jp
+ebino.miyazaki.jp
+gokase.miyazaki.jp
+hyuga.miyazaki.jp
+kadogawa.miyazaki.jp
+kawaminami.miyazaki.jp
+kijo.miyazaki.jp
+kitagawa.miyazaki.jp
+kitakata.miyazaki.jp
+kitaura.miyazaki.jp
+kobayashi.miyazaki.jp
+kunitomi.miyazaki.jp
+kushima.miyazaki.jp
+mimata.miyazaki.jp
+miyakonojo.miyazaki.jp
+miyazaki.miyazaki.jp
+morotsuka.miyazaki.jp
+nichinan.miyazaki.jp
+nishimera.miyazaki.jp
+nobeoka.miyazaki.jp
+saito.miyazaki.jp
+shiiba.miyazaki.jp
+shintomi.miyazaki.jp
+takaharu.miyazaki.jp
+takanabe.miyazaki.jp
+takazaki.miyazaki.jp
+tsuno.miyazaki.jp
+achi.nagano.jp
+agematsu.nagano.jp
+anan.nagano.jp
+aoki.nagano.jp
+asahi.nagano.jp
+azumino.nagano.jp
+chikuhoku.nagano.jp
+chikuma.nagano.jp
+chino.nagano.jp
+fujimi.nagano.jp
+hakuba.nagano.jp
+hara.nagano.jp
+hiraya.nagano.jp
+iida.nagano.jp
+iijima.nagano.jp
+iiyama.nagano.jp
+iizuna.nagano.jp
+ikeda.nagano.jp
+ikusaka.nagano.jp
+ina.nagano.jp
+karuizawa.nagano.jp
+kawakami.nagano.jp
+kiso.nagano.jp
+kisofukushima.nagano.jp
+kitaaiki.nagano.jp
+komagane.nagano.jp
+komoro.nagano.jp
+matsukawa.nagano.jp
+matsumoto.nagano.jp
+miasa.nagano.jp
+minamiaiki.nagano.jp
+minamimaki.nagano.jp
+minamiminowa.nagano.jp
+minowa.nagano.jp
+miyada.nagano.jp
+miyota.nagano.jp
+mochizuki.nagano.jp
+nagano.nagano.jp
+nagawa.nagano.jp
+nagiso.nagano.jp
+nakagawa.nagano.jp
+nakano.nagano.jp
+nozawaonsen.nagano.jp
+obuse.nagano.jp
+ogawa.nagano.jp
+okaya.nagano.jp
+omachi.nagano.jp
+omi.nagano.jp
+ookuwa.nagano.jp
+ooshika.nagano.jp
+otaki.nagano.jp
+otari.nagano.jp
+sakae.nagano.jp
+sakaki.nagano.jp
+saku.nagano.jp
+sakuho.nagano.jp
+shimosuwa.nagano.jp
+shinanomachi.nagano.jp
+shiojiri.nagano.jp
+suwa.nagano.jp
+suzaka.nagano.jp
+takagi.nagano.jp
+takamori.nagano.jp
+takayama.nagano.jp
+tateshina.nagano.jp
+tatsuno.nagano.jp
+togakushi.nagano.jp
+togura.nagano.jp
+tomi.nagano.jp
+ueda.nagano.jp
+wada.nagano.jp
+yamagata.nagano.jp
+yamanouchi.nagano.jp
+yasaka.nagano.jp
+yasuoka.nagano.jp
+chijiwa.nagasaki.jp
+futsu.nagasaki.jp
+goto.nagasaki.jp
+hasami.nagasaki.jp
+hirado.nagasaki.jp
+iki.nagasaki.jp
+isahaya.nagasaki.jp
+kawatana.nagasaki.jp
+kuchinotsu.nagasaki.jp
+matsuura.nagasaki.jp
+nagasaki.nagasaki.jp
+obama.nagasaki.jp
+omura.nagasaki.jp
+oseto.nagasaki.jp
+saikai.nagasaki.jp
+sasebo.nagasaki.jp
+seihi.nagasaki.jp
+shimabara.nagasaki.jp
+shinkamigoto.nagasaki.jp
+togitsu.nagasaki.jp
+tsushima.nagasaki.jp
+unzen.nagasaki.jp
+ando.nara.jp
+gose.nara.jp
+heguri.nara.jp
+higashiyoshino.nara.jp
+ikaruga.nara.jp
+ikoma.nara.jp
+kamikitayama.nara.jp
+kanmaki.nara.jp
+kashiba.nara.jp
+kashihara.nara.jp
+katsuragi.nara.jp
+kawai.nara.jp
+kawakami.nara.jp
+kawanishi.nara.jp
+koryo.nara.jp
+kurotaki.nara.jp
+mitsue.nara.jp
+miyake.nara.jp
+nara.nara.jp
+nosegawa.nara.jp
+oji.nara.jp
+ouda.nara.jp
+oyodo.nara.jp
+sakurai.nara.jp
+sango.nara.jp
+shimoichi.nara.jp
+shimokitayama.nara.jp
+shinjo.nara.jp
+soni.nara.jp
+takatori.nara.jp
+tawaramoto.nara.jp
+tenkawa.nara.jp
+tenri.nara.jp
+uda.nara.jp
+yamatokoriyama.nara.jp
+yamatotakada.nara.jp
+yamazoe.nara.jp
+yoshino.nara.jp
+aga.niigata.jp
+agano.niigata.jp
+gosen.niigata.jp
+itoigawa.niigata.jp
+izumozaki.niigata.jp
+joetsu.niigata.jp
+kamo.niigata.jp
+kariwa.niigata.jp
+kashiwazaki.niigata.jp
+minamiuonuma.niigata.jp
+mitsuke.niigata.jp
+muika.niigata.jp
+murakami.niigata.jp
+myoko.niigata.jp
+nagaoka.niigata.jp
+niigata.niigata.jp
+ojiya.niigata.jp
+omi.niigata.jp
+sado.niigata.jp
+sanjo.niigata.jp
+seiro.niigata.jp
+seirou.niigata.jp
+sekikawa.niigata.jp
+shibata.niigata.jp
+tagami.niigata.jp
+tainai.niigata.jp
+tochio.niigata.jp
+tokamachi.niigata.jp
+tsubame.niigata.jp
+tsunan.niigata.jp
+uonuma.niigata.jp
+yahiko.niigata.jp
+yoita.niigata.jp
+yuzawa.niigata.jp
+beppu.oita.jp
+bungoono.oita.jp
+bungotakada.oita.jp
+hasama.oita.jp
+hiji.oita.jp
+himeshima.oita.jp
+hita.oita.jp
+kamitsue.oita.jp
+kokonoe.oita.jp
+kuju.oita.jp
+kunisaki.oita.jp
+kusu.oita.jp
+oita.oita.jp
+saiki.oita.jp
+taketa.oita.jp
+tsukumi.oita.jp
+usa.oita.jp
+usuki.oita.jp
+yufu.oita.jp
+akaiwa.okayama.jp
+asakuchi.okayama.jp
+bizen.okayama.jp
+hayashima.okayama.jp
+ibara.okayama.jp
+kagamino.okayama.jp
+kasaoka.okayama.jp
+kibichuo.okayama.jp
+kumenan.okayama.jp
+kurashiki.okayama.jp
+maniwa.okayama.jp
+misaki.okayama.jp
+nagi.okayama.jp
+niimi.okayama.jp
+nishiawakura.okayama.jp
+okayama.okayama.jp
+satosho.okayama.jp
+setouchi.okayama.jp
+shinjo.okayama.jp
+shoo.okayama.jp
+soja.okayama.jp
+takahashi.okayama.jp
+tamano.okayama.jp
+tsuyama.okayama.jp
+wake.okayama.jp
+yakage.okayama.jp
+aguni.okinawa.jp
+ginowan.okinawa.jp
+ginoza.okinawa.jp
+gushikami.okinawa.jp
+haebaru.okinawa.jp
+higashi.okinawa.jp
+hirara.okinawa.jp
+iheya.okinawa.jp
+ishigaki.okinawa.jp
+ishikawa.okinawa.jp
+itoman.okinawa.jp
+izena.okinawa.jp
+kadena.okinawa.jp
+kin.okinawa.jp
+kitadaito.okinawa.jp
+kitanakagusuku.okinawa.jp
+kumejima.okinawa.jp
+kunigami.okinawa.jp
+minamidaito.okinawa.jp
+motobu.okinawa.jp
+nago.okinawa.jp
+naha.okinawa.jp
+nakagusuku.okinawa.jp
+nakijin.okinawa.jp
+nanjo.okinawa.jp
+nishihara.okinawa.jp
+ogimi.okinawa.jp
+okinawa.okinawa.jp
+onna.okinawa.jp
+shimoji.okinawa.jp
+taketomi.okinawa.jp
+tarama.okinawa.jp
+tokashiki.okinawa.jp
+tomigusuku.okinawa.jp
+tonaki.okinawa.jp
+urasoe.okinawa.jp
+uruma.okinawa.jp
+yaese.okinawa.jp
+yomitan.okinawa.jp
+yonabaru.okinawa.jp
+yonaguni.okinawa.jp
+zamami.okinawa.jp
+abeno.osaka.jp
+chihayaakasaka.osaka.jp
+chuo.osaka.jp
+daito.osaka.jp
+fujiidera.osaka.jp
+habikino.osaka.jp
+hannan.osaka.jp
+higashiosaka.osaka.jp
+higashisumiyoshi.osaka.jp
+higashiyodogawa.osaka.jp
+hirakata.osaka.jp
+ibaraki.osaka.jp
+ikeda.osaka.jp
+izumi.osaka.jp
+izumiotsu.osaka.jp
+izumisano.osaka.jp
+kadoma.osaka.jp
+kaizuka.osaka.jp
+kanan.osaka.jp
+kashiwara.osaka.jp
+katano.osaka.jp
+kawachinagano.osaka.jp
+kishiwada.osaka.jp
+kita.osaka.jp
+kumatori.osaka.jp
+matsubara.osaka.jp
+minato.osaka.jp
+minoh.osaka.jp
+misaki.osaka.jp
+moriguchi.osaka.jp
+neyagawa.osaka.jp
+nishi.osaka.jp
+nose.osaka.jp
+osakasayama.osaka.jp
+sakai.osaka.jp
+sayama.osaka.jp
+sennan.osaka.jp
+settsu.osaka.jp
+shijonawate.osaka.jp
+shimamoto.osaka.jp
+suita.osaka.jp
+tadaoka.osaka.jp
+taishi.osaka.jp
+tajiri.osaka.jp
+takaishi.osaka.jp
+takatsuki.osaka.jp
+tondabayashi.osaka.jp
+toyonaka.osaka.jp
+toyono.osaka.jp
+yao.osaka.jp
+ariake.saga.jp
+arita.saga.jp
+fukudomi.saga.jp
+genkai.saga.jp
+hamatama.saga.jp
+hizen.saga.jp
+imari.saga.jp
+kamimine.saga.jp
+kanzaki.saga.jp
+karatsu.saga.jp
+kashima.saga.jp
+kitagata.saga.jp
+kitahata.saga.jp
+kiyama.saga.jp
+kouhoku.saga.jp
+kyuragi.saga.jp
+nishiarita.saga.jp
+ogi.saga.jp
+omachi.saga.jp
+ouchi.saga.jp
+saga.saga.jp
+shiroishi.saga.jp
+taku.saga.jp
+tara.saga.jp
+tosu.saga.jp
+yoshinogari.saga.jp
+arakawa.saitama.jp
+asaka.saitama.jp
+chichibu.saitama.jp
+fujimi.saitama.jp
+fujimino.saitama.jp
+fukaya.saitama.jp
+hanno.saitama.jp
+hanyu.saitama.jp
+hasuda.saitama.jp
+hatogaya.saitama.jp
+hatoyama.saitama.jp
+hidaka.saitama.jp
+higashichichibu.saitama.jp
+higashimatsuyama.saitama.jp
+honjo.saitama.jp
+ina.saitama.jp
+iruma.saitama.jp
+iwatsuki.saitama.jp
+kamiizumi.saitama.jp
+kamikawa.saitama.jp
+kamisato.saitama.jp
+kasukabe.saitama.jp
+kawagoe.saitama.jp
+kawaguchi.saitama.jp
+kawajima.saitama.jp
+kazo.saitama.jp
+kitamoto.saitama.jp
+koshigaya.saitama.jp
+kounosu.saitama.jp
+kuki.saitama.jp
+kumagaya.saitama.jp
+matsubushi.saitama.jp
+minano.saitama.jp
+misato.saitama.jp
+miyashiro.saitama.jp
+miyoshi.saitama.jp
+moroyama.saitama.jp
+nagatoro.saitama.jp
+namegawa.saitama.jp
+niiza.saitama.jp
+ogano.saitama.jp
+ogawa.saitama.jp
+ogose.saitama.jp
+okegawa.saitama.jp
+omiya.saitama.jp
+otaki.saitama.jp
+ranzan.saitama.jp
+ryokami.saitama.jp
+saitama.saitama.jp
+sakado.saitama.jp
+satte.saitama.jp
+sayama.saitama.jp
+shiki.saitama.jp
+shiraoka.saitama.jp
+soka.saitama.jp
+sugito.saitama.jp
+toda.saitama.jp
+tokigawa.saitama.jp
+tokorozawa.saitama.jp
+tsurugashima.saitama.jp
+urawa.saitama.jp
+warabi.saitama.jp
+yashio.saitama.jp
+yokoze.saitama.jp
+yono.saitama.jp
+yorii.saitama.jp
+yoshida.saitama.jp
+yoshikawa.saitama.jp
+yoshimi.saitama.jp
+aisho.shiga.jp
+gamo.shiga.jp
+higashiomi.shiga.jp
+hikone.shiga.jp
+koka.shiga.jp
+konan.shiga.jp
+kosei.shiga.jp
+koto.shiga.jp
+kusatsu.shiga.jp
+maibara.shiga.jp
+moriyama.shiga.jp
+nagahama.shiga.jp
+nishiazai.shiga.jp
+notogawa.shiga.jp
+omihachiman.shiga.jp
+otsu.shiga.jp
+ritto.shiga.jp
+ryuoh.shiga.jp
+takashima.shiga.jp
+takatsuki.shiga.jp
+torahime.shiga.jp
+toyosato.shiga.jp
+yasu.shiga.jp
+akagi.shimane.jp
+ama.shimane.jp
+gotsu.shimane.jp
+hamada.shimane.jp
+higashiizumo.shimane.jp
+hikawa.shimane.jp
+hikimi.shimane.jp
+izumo.shimane.jp
+kakinoki.shimane.jp
+masuda.shimane.jp
+matsue.shimane.jp
+misato.shimane.jp
+nishinoshima.shimane.jp
+ohda.shimane.jp
+okinoshima.shimane.jp
+okuizumo.shimane.jp
+shimane.shimane.jp
+tamayu.shimane.jp
+tsuwano.shimane.jp
+unnan.shimane.jp
+yakumo.shimane.jp
+yasugi.shimane.jp
+yatsuka.shimane.jp
+arai.shizuoka.jp
+atami.shizuoka.jp
+fuji.shizuoka.jp
+fujieda.shizuoka.jp
+fujikawa.shizuoka.jp
+fujinomiya.shizuoka.jp
+fukuroi.shizuoka.jp
+gotemba.shizuoka.jp
+haibara.shizuoka.jp
+hamamatsu.shizuoka.jp
+higashiizu.shizuoka.jp
+ito.shizuoka.jp
+iwata.shizuoka.jp
+izu.shizuoka.jp
+izunokuni.shizuoka.jp
+kakegawa.shizuoka.jp
+kannami.shizuoka.jp
+kawanehon.shizuoka.jp
+kawazu.shizuoka.jp
+kikugawa.shizuoka.jp
+kosai.shizuoka.jp
+makinohara.shizuoka.jp
+matsuzaki.shizuoka.jp
+minamiizu.shizuoka.jp
+mishima.shizuoka.jp
+morimachi.shizuoka.jp
+nishiizu.shizuoka.jp
+numazu.shizuoka.jp
+omaezaki.shizuoka.jp
+shimada.shizuoka.jp
+shimizu.shizuoka.jp
+shimoda.shizuoka.jp
+shizuoka.shizuoka.jp
+susono.shizuoka.jp
+yaizu.shizuoka.jp
+yoshida.shizuoka.jp
+ashikaga.tochigi.jp
+bato.tochigi.jp
+haga.tochigi.jp
+ichikai.tochigi.jp
+iwafune.tochigi.jp
+kaminokawa.tochigi.jp
+kanuma.tochigi.jp
+karasuyama.tochigi.jp
+kuroiso.tochigi.jp
+mashiko.tochigi.jp
+mibu.tochigi.jp
+moka.tochigi.jp
+motegi.tochigi.jp
+nasu.tochigi.jp
+nasushiobara.tochigi.jp
+nikko.tochigi.jp
+nishikata.tochigi.jp
+nogi.tochigi.jp
+ohira.tochigi.jp
+ohtawara.tochigi.jp
+oyama.tochigi.jp
+sakura.tochigi.jp
+sano.tochigi.jp
+shimotsuke.tochigi.jp
+shioya.tochigi.jp
+takanezawa.tochigi.jp
+tochigi.tochigi.jp
+tsuga.tochigi.jp
+ujiie.tochigi.jp
+utsunomiya.tochigi.jp
+yaita.tochigi.jp
+aizumi.tokushima.jp
+anan.tokushima.jp
+ichiba.tokushima.jp
+itano.tokushima.jp
+kainan.tokushima.jp
+komatsushima.tokushima.jp
+matsushige.tokushima.jp
+mima.tokushima.jp
+minami.tokushima.jp
+miyoshi.tokushima.jp
+mugi.tokushima.jp
+nakagawa.tokushima.jp
+naruto.tokushima.jp
+sanagochi.tokushima.jp
+shishikui.tokushima.jp
+tokushima.tokushima.jp
+wajiki.tokushima.jp
+adachi.tokyo.jp
+akiruno.tokyo.jp
+akishima.tokyo.jp
+aogashima.tokyo.jp
+arakawa.tokyo.jp
+bunkyo.tokyo.jp
+chiyoda.tokyo.jp
+chofu.tokyo.jp
+chuo.tokyo.jp
+edogawa.tokyo.jp
+fuchu.tokyo.jp
+fussa.tokyo.jp
+hachijo.tokyo.jp
+hachioji.tokyo.jp
+hamura.tokyo.jp
+higashikurume.tokyo.jp
+higashimurayama.tokyo.jp
+higashiyamato.tokyo.jp
+hino.tokyo.jp
+hinode.tokyo.jp
+hinohara.tokyo.jp
+inagi.tokyo.jp
+itabashi.tokyo.jp
+katsushika.tokyo.jp
+kita.tokyo.jp
+kiyose.tokyo.jp
+kodaira.tokyo.jp
+koganei.tokyo.jp
+kokubunji.tokyo.jp
+komae.tokyo.jp
+koto.tokyo.jp
+kouzushima.tokyo.jp
+kunitachi.tokyo.jp
+machida.tokyo.jp
+meguro.tokyo.jp
+minato.tokyo.jp
+mitaka.tokyo.jp
+mizuho.tokyo.jp
+musashimurayama.tokyo.jp
+musashino.tokyo.jp
+nakano.tokyo.jp
+nerima.tokyo.jp
+ogasawara.tokyo.jp
+okutama.tokyo.jp
+ome.tokyo.jp
+oshima.tokyo.jp
+ota.tokyo.jp
+setagaya.tokyo.jp
+shibuya.tokyo.jp
+shinagawa.tokyo.jp
+shinjuku.tokyo.jp
+suginami.tokyo.jp
+sumida.tokyo.jp
+tachikawa.tokyo.jp
+taito.tokyo.jp
+tama.tokyo.jp
+toshima.tokyo.jp
+chizu.tottori.jp
+hino.tottori.jp
+kawahara.tottori.jp
+koge.tottori.jp
+kotoura.tottori.jp
+misasa.tottori.jp
+nanbu.tottori.jp
+nichinan.tottori.jp
+sakaiminato.tottori.jp
+tottori.tottori.jp
+wakasa.tottori.jp
+yazu.tottori.jp
+yonago.tottori.jp
+asahi.toyama.jp
+fuchu.toyama.jp
+fukumitsu.toyama.jp
+funahashi.toyama.jp
+himi.toyama.jp
+imizu.toyama.jp
+inami.toyama.jp
+johana.toyama.jp
+kamiichi.toyama.jp
+kurobe.toyama.jp
+nakaniikawa.toyama.jp
+namerikawa.toyama.jp
+nanto.toyama.jp
+nyuzen.toyama.jp
+oyabe.toyama.jp
+taira.toyama.jp
+takaoka.toyama.jp
+tateyama.toyama.jp
+toga.toyama.jp
+tonami.toyama.jp
+toyama.toyama.jp
+unazuki.toyama.jp
+uozu.toyama.jp
+yamada.toyama.jp
+arida.wakayama.jp
+aridagawa.wakayama.jp
+gobo.wakayama.jp
+hashimoto.wakayama.jp
+hidaka.wakayama.jp
+hirogawa.wakayama.jp
+inami.wakayama.jp
+iwade.wakayama.jp
+kainan.wakayama.jp
+kamitonda.wakayama.jp
+katsuragi.wakayama.jp
+kimino.wakayama.jp
+kinokawa.wakayama.jp
+kitayama.wakayama.jp
+koya.wakayama.jp
+koza.wakayama.jp
+kozagawa.wakayama.jp
+kudoyama.wakayama.jp
+kushimoto.wakayama.jp
+mihama.wakayama.jp
+misato.wakayama.jp
+nachikatsuura.wakayama.jp
+shingu.wakayama.jp
+shirahama.wakayama.jp
+taiji.wakayama.jp
+tanabe.wakayama.jp
+wakayama.wakayama.jp
+yuasa.wakayama.jp
+yura.wakayama.jp
+asahi.yamagata.jp
+funagata.yamagata.jp
+higashine.yamagata.jp
+iide.yamagata.jp
+kahoku.yamagata.jp
+kaminoyama.yamagata.jp
+kaneyama.yamagata.jp
+kawanishi.yamagata.jp
+mamurogawa.yamagata.jp
+mikawa.yamagata.jp
+murayama.yamagata.jp
+nagai.yamagata.jp
+nakayama.yamagata.jp
+nanyo.yamagata.jp
+nishikawa.yamagata.jp
+obanazawa.yamagata.jp
+oe.yamagata.jp
+oguni.yamagata.jp
+ohkura.yamagata.jp
+oishida.yamagata.jp
+sagae.yamagata.jp
+sakata.yamagata.jp
+sakegawa.yamagata.jp
+shinjo.yamagata.jp
+shirataka.yamagata.jp
+shonai.yamagata.jp
+takahata.yamagata.jp
+tendo.yamagata.jp
+tozawa.yamagata.jp
+tsuruoka.yamagata.jp
+yamagata.yamagata.jp
+yamanobe.yamagata.jp
+yonezawa.yamagata.jp
+yuza.yamagata.jp
+abu.yamaguchi.jp
+hagi.yamaguchi.jp
+hikari.yamaguchi.jp
+hofu.yamaguchi.jp
+iwakuni.yamaguchi.jp
+kudamatsu.yamaguchi.jp
+mitou.yamaguchi.jp
+nagato.yamaguchi.jp
+oshima.yamaguchi.jp
+shimonoseki.yamaguchi.jp
+shunan.yamaguchi.jp
+tabuse.yamaguchi.jp
+tokuyama.yamaguchi.jp
+toyota.yamaguchi.jp
+ube.yamaguchi.jp
+yuu.yamaguchi.jp
+chuo.yamanashi.jp
+doshi.yamanashi.jp
+fuefuki.yamanashi.jp
+fujikawa.yamanashi.jp
+fujikawaguchiko.yamanashi.jp
+fujiyoshida.yamanashi.jp
+hayakawa.yamanashi.jp
+hokuto.yamanashi.jp
+ichikawamisato.yamanashi.jp
+kai.yamanashi.jp
+kofu.yamanashi.jp
+koshu.yamanashi.jp
+kosuge.yamanashi.jp
+minami-alps.yamanashi.jp
+minobu.yamanashi.jp
+nakamichi.yamanashi.jp
+nanbu.yamanashi.jp
+narusawa.yamanashi.jp
+nirasaki.yamanashi.jp
+nishikatsura.yamanashi.jp
+oshino.yamanashi.jp
+otsuki.yamanashi.jp
+showa.yamanashi.jp
+tabayama.yamanashi.jp
+tsuru.yamanashi.jp
+uenohara.yamanashi.jp
+yamanakako.yamanashi.jp
+yamanashi.yamanashi.jp
+
+// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145
+*.ke
+
+// kg : http://www.domain.kg/dmn_n.html
+kg
+org.kg
+net.kg
+com.kg
+edu.kg
+gov.kg
+mil.kg
+
+// kh : http://www.mptc.gov.kh/dns_registration.htm
+*.kh
+
+// ki : http://www.ki/dns/index.html
+ki
+edu.ki
+biz.ki
+net.ki
+org.ki
+gov.ki
+info.ki
+com.ki
+
+// km : https://en.wikipedia.org/wiki/.km
+// http://www.domaine.km/documents/charte.doc
+km
+org.km
+nom.km
+gov.km
+prd.km
+tm.km
+edu.km
+mil.km
+ass.km
+com.km
+// These are only mentioned as proposed suggestions at domaine.km, but
+// https://en.wikipedia.org/wiki/.km says they're available for registration:
+coop.km
+asso.km
+presse.km
+medecin.km
+notaires.km
+pharmaciens.km
+veterinaire.km
+gouv.km
+
+// kn : https://en.wikipedia.org/wiki/.kn
+// http://www.dot.kn/domainRules.html
+kn
+net.kn
+org.kn
+edu.kn
+gov.kn
+
+// kp : http://www.kcce.kp/en_index.php
+kp
+com.kp
+edu.kp
+gov.kp
+org.kp
+rep.kp
+tra.kp
+
+// kr : https://en.wikipedia.org/wiki/.kr
+// see also: http://domain.nida.or.kr/eng/registration.jsp
+kr
+ac.kr
+co.kr
+es.kr
+go.kr
+hs.kr
+kg.kr
+mil.kr
+ms.kr
+ne.kr
+or.kr
+pe.kr
+re.kr
+sc.kr
+// kr geographical names
+busan.kr
+chungbuk.kr
+chungnam.kr
+daegu.kr
+daejeon.kr
+gangwon.kr
+gwangju.kr
+gyeongbuk.kr
+gyeonggi.kr
+gyeongnam.kr
+incheon.kr
+jeju.kr
+jeonbuk.kr
+jeonnam.kr
+seoul.kr
+ulsan.kr
+
+// kw : https://en.wikipedia.org/wiki/.kw
+*.kw
+
+// ky : http://www.icta.ky/da_ky_reg_dom.php
+// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17
+ky
+edu.ky
+gov.ky
+com.ky
+org.ky
+net.ky
+
+// kz : https://en.wikipedia.org/wiki/.kz
+// see also: http://www.nic.kz/rules/index.jsp
+kz
+org.kz
+edu.kz
+net.kz
+gov.kz
+mil.kz
+com.kz
+
+// la : https://en.wikipedia.org/wiki/.la
+// Submitted by registry <gavin.brown@nic.la>
+la
+int.la
+net.la
+info.la
+edu.la
+gov.la
+per.la
+com.la
+org.la
+
+// lb : https://en.wikipedia.org/wiki/.lb
+// Submitted by registry <randy@psg.com>
+lb
+com.lb
+edu.lb
+gov.lb
+net.lb
+org.lb
+
+// lc : https://en.wikipedia.org/wiki/.lc
+// see also: http://www.nic.lc/rules.htm
+lc
+com.lc
+net.lc
+co.lc
+org.lc
+edu.lc
+gov.lc
+
+// li : https://en.wikipedia.org/wiki/.li
+li
+
+// lk : http://www.nic.lk/seclevpr.html
+lk
+gov.lk
+sch.lk
+net.lk
+int.lk
+com.lk
+org.lk
+edu.lk
+ngo.lk
+soc.lk
+web.lk
+ltd.lk
+assn.lk
+grp.lk
+hotel.lk
+ac.lk
+
+// lr : http://psg.com/dns/lr/lr.txt
+// Submitted by registry <randy@psg.com>
+lr
+com.lr
+edu.lr
+gov.lr
+org.lr
+net.lr
+
+// ls : https://en.wikipedia.org/wiki/.ls
+ls
+co.ls
+org.ls
+
+// lt : https://en.wikipedia.org/wiki/.lt
+lt
+// gov.lt : http://www.gov.lt/index_en.php
+gov.lt
+
+// lu : http://www.dns.lu/en/
+lu
+
+// lv : http://www.nic.lv/DNS/En/generic.php
+lv
+com.lv
+edu.lv
+gov.lv
+org.lv
+mil.lv
+id.lv
+net.lv
+asn.lv
+conf.lv
+
+// ly : http://www.nic.ly/regulations.php
+ly
+com.ly
+net.ly
+gov.ly
+plc.ly
+edu.ly
+sch.ly
+med.ly
+org.ly
+id.ly
+
+// ma : https://en.wikipedia.org/wiki/.ma
+// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf
+ma
+co.ma
+net.ma
+gov.ma
+org.ma
+ac.ma
+press.ma
+
+// mc : http://www.nic.mc/
+mc
+tm.mc
+asso.mc
+
+// md : https://en.wikipedia.org/wiki/.md
+md
+
+// me : https://en.wikipedia.org/wiki/.me
+me
+co.me
+net.me
+org.me
+edu.me
+ac.me
+gov.me
+its.me
+priv.me
+
+// mg : http://nic.mg/nicmg/?page_id=39
+mg
+org.mg
+nom.mg
+gov.mg
+prd.mg
+tm.mg
+edu.mg
+mil.mg
+com.mg
+co.mg
+
+// mh : https://en.wikipedia.org/wiki/.mh
+mh
+
+// mil : https://en.wikipedia.org/wiki/.mil
+mil
+
+// mk : https://en.wikipedia.org/wiki/.mk
+// see also: http://dns.marnet.net.mk/postapka.php
+mk
+com.mk
+org.mk
+net.mk
+edu.mk
+gov.mk
+inf.mk
+name.mk
+
+// ml : http://www.gobin.info/domainname/ml-template.doc
+// see also: https://en.wikipedia.org/wiki/.ml
+ml
+com.ml
+edu.ml
+gouv.ml
+gov.ml
+net.ml
+org.ml
+presse.ml
+
+// mm : https://en.wikipedia.org/wiki/.mm
+*.mm
+
+// mn : https://en.wikipedia.org/wiki/.mn
+mn
+gov.mn
+edu.mn
+org.mn
+
+// mo : http://www.monic.net.mo/
+mo
+com.mo
+net.mo
+org.mo
+edu.mo
+gov.mo
+
+// mobi : https://en.wikipedia.org/wiki/.mobi
+mobi
+
+// mp : http://www.dot.mp/
+// Confirmed by registry <dcamacho@saipan.com> 2008-06-17
+mp
+
+// mq : https://en.wikipedia.org/wiki/.mq
+mq
+
+// mr : https://en.wikipedia.org/wiki/.mr
+mr
+gov.mr
+
+// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf
+ms
+com.ms
+edu.ms
+gov.ms
+net.ms
+org.ms
+
+// mt : https://www.nic.org.mt/go/policy
+// Submitted by registry <help@nic.org.mt>
+mt
+com.mt
+edu.mt
+net.mt
+org.mt
+
+// mu : https://en.wikipedia.org/wiki/.mu
+mu
+com.mu
+net.mu
+org.mu
+gov.mu
+ac.mu
+co.mu
+or.mu
+
+// museum : http://about.museum/naming/
+// http://index.museum/
+museum
+academy.museum
+agriculture.museum
+air.museum
+airguard.museum
+alabama.museum
+alaska.museum
+amber.museum
+ambulance.museum
+american.museum
+americana.museum
+americanantiques.museum
+americanart.museum
+amsterdam.museum
+and.museum
+annefrank.museum
+anthro.museum
+anthropology.museum
+antiques.museum
+aquarium.museum
+arboretum.museum
+archaeological.museum
+archaeology.museum
+architecture.museum
+art.museum
+artanddesign.museum
+artcenter.museum
+artdeco.museum
+arteducation.museum
+artgallery.museum
+arts.museum
+artsandcrafts.museum
+asmatart.museum
+assassination.museum
+assisi.museum
+association.museum
+astronomy.museum
+atlanta.museum
+austin.museum
+australia.museum
+automotive.museum
+aviation.museum
+axis.museum
+badajoz.museum
+baghdad.museum
+bahn.museum
+bale.museum
+baltimore.museum
+barcelona.museum
+baseball.museum
+basel.museum
+baths.museum
+bauern.museum
+beauxarts.museum
+beeldengeluid.museum
+bellevue.museum
+bergbau.museum
+berkeley.museum
+berlin.museum
+bern.museum
+bible.museum
+bilbao.museum
+bill.museum
+birdart.museum
+birthplace.museum
+bonn.museum
+boston.museum
+botanical.museum
+botanicalgarden.museum
+botanicgarden.museum
+botany.museum
+brandywinevalley.museum
+brasil.museum
+bristol.museum
+british.museum
+britishcolumbia.museum
+broadcast.museum
+brunel.museum
+brussel.museum
+brussels.museum
+bruxelles.museum
+building.museum
+burghof.museum
+bus.museum
+bushey.museum
+cadaques.museum
+california.museum
+cambridge.museum
+can.museum
+canada.museum
+capebreton.museum
+carrier.museum
+cartoonart.museum
+casadelamoneda.museum
+castle.museum
+castres.museum
+celtic.museum
+center.museum
+chattanooga.museum
+cheltenham.museum
+chesapeakebay.museum
+chicago.museum
+children.museum
+childrens.museum
+childrensgarden.museum
+chiropractic.museum
+chocolate.museum
+christiansburg.museum
+cincinnati.museum
+cinema.museum
+circus.museum
+civilisation.museum
+civilization.museum
+civilwar.museum
+clinton.museum
+clock.museum
+coal.museum
+coastaldefence.museum
+cody.museum
+coldwar.museum
+collection.museum
+colonialwilliamsburg.museum
+coloradoplateau.museum
+columbia.museum
+columbus.museum
+communication.museum
+communications.museum
+community.museum
+computer.museum
+computerhistory.museum
+comunicações.museum
+contemporary.museum
+contemporaryart.museum
+convent.museum
+copenhagen.museum
+corporation.museum
+correios-e-telecomunicações.museum
+corvette.museum
+costume.museum
+countryestate.museum
+county.museum
+crafts.museum
+cranbrook.museum
+creation.museum
+cultural.museum
+culturalcenter.museum
+culture.museum
+cyber.museum
+cymru.museum
+dali.museum
+dallas.museum
+database.museum
+ddr.museum
+decorativearts.museum
+delaware.museum
+delmenhorst.museum
+denmark.museum
+depot.museum
+design.museum
+detroit.museum
+dinosaur.museum
+discovery.museum
+dolls.museum
+donostia.museum
+durham.museum
+eastafrica.museum
+eastcoast.museum
+education.museum
+educational.museum
+egyptian.museum
+eisenbahn.museum
+elburg.museum
+elvendrell.museum
+embroidery.museum
+encyclopedic.museum
+england.museum
+entomology.museum
+environment.museum
+environmentalconservation.museum
+epilepsy.museum
+essex.museum
+estate.museum
+ethnology.museum
+exeter.museum
+exhibition.museum
+family.museum
+farm.museum
+farmequipment.museum
+farmers.museum
+farmstead.museum
+field.museum
+figueres.museum
+filatelia.museum
+film.museum
+fineart.museum
+finearts.museum
+finland.museum
+flanders.museum
+florida.museum
+force.museum
+fortmissoula.museum
+fortworth.museum
+foundation.museum
+francaise.museum
+frankfurt.museum
+franziskaner.museum
+freemasonry.museum
+freiburg.museum
+fribourg.museum
+frog.museum
+fundacio.museum
+furniture.museum
+gallery.museum
+garden.museum
+gateway.museum
+geelvinck.museum
+gemological.museum
+geology.museum
+georgia.museum
+giessen.museum
+glas.museum
+glass.museum
+gorge.museum
+grandrapids.museum
+graz.museum
+guernsey.museum
+halloffame.museum
+hamburg.museum
+handson.museum
+harvestcelebration.museum
+hawaii.museum
+health.museum
+heimatunduhren.museum
+hellas.museum
+helsinki.museum
+hembygdsforbund.museum
+heritage.museum
+histoire.museum
+historical.museum
+historicalsociety.museum
+historichouses.museum
+historisch.museum
+historisches.museum
+history.museum
+historyofscience.museum
+horology.museum
+house.museum
+humanities.museum
+illustration.museum
+imageandsound.museum
+indian.museum
+indiana.museum
+indianapolis.museum
+indianmarket.museum
+intelligence.museum
+interactive.museum
+iraq.museum
+iron.museum
+isleofman.museum
+jamison.museum
+jefferson.museum
+jerusalem.museum
+jewelry.museum
+jewish.museum
+jewishart.museum
+jfk.museum
+journalism.museum
+judaica.museum
+judygarland.museum
+juedisches.museum
+juif.museum
+karate.museum
+karikatur.museum
+kids.museum
+koebenhavn.museum
+koeln.museum
+kunst.museum
+kunstsammlung.museum
+kunstunddesign.museum
+labor.museum
+labour.museum
+lajolla.museum
+lancashire.museum
+landes.museum
+lans.museum
+läns.museum
+larsson.museum
+lewismiller.museum
+lincoln.museum
+linz.museum
+living.museum
+livinghistory.museum
+localhistory.museum
+london.museum
+losangeles.museum
+louvre.museum
+loyalist.museum
+lucerne.museum
+luxembourg.museum
+luzern.museum
+mad.museum
+madrid.museum
+mallorca.museum
+manchester.museum
+mansion.museum
+mansions.museum
+manx.museum
+marburg.museum
+maritime.museum
+maritimo.museum
+maryland.museum
+marylhurst.museum
+media.museum
+medical.museum
+medizinhistorisches.museum
+meeres.museum
+memorial.museum
+mesaverde.museum
+michigan.museum
+midatlantic.museum
+military.museum
+mill.museum
+miners.museum
+mining.museum
+minnesota.museum
+missile.museum
+missoula.museum
+modern.museum
+moma.museum
+money.museum
+monmouth.museum
+monticello.museum
+montreal.museum
+moscow.museum
+motorcycle.museum
+muenchen.museum
+muenster.museum
+mulhouse.museum
+muncie.museum
+museet.museum
+museumcenter.museum
+museumvereniging.museum
+music.museum
+national.museum
+nationalfirearms.museum
+nationalheritage.museum
+nativeamerican.museum
+naturalhistory.museum
+naturalhistorymuseum.museum
+naturalsciences.museum
+nature.museum
+naturhistorisches.museum
+natuurwetenschappen.museum
+naumburg.museum
+naval.museum
+nebraska.museum
+neues.museum
+newhampshire.museum
+newjersey.museum
+newmexico.museum
+newport.museum
+newspaper.museum
+newyork.museum
+niepce.museum
+norfolk.museum
+north.museum
+nrw.museum
+nuernberg.museum
+nuremberg.museum
+nyc.museum
+nyny.museum
+oceanographic.museum
+oceanographique.museum
+omaha.museum
+online.museum
+ontario.museum
+openair.museum
+oregon.museum
+oregontrail.museum
+otago.museum
+oxford.museum
+pacific.museum
+paderborn.museum
+palace.museum
+paleo.museum
+palmsprings.museum
+panama.museum
+paris.museum
+pasadena.museum
+pharmacy.museum
+philadelphia.museum
+philadelphiaarea.museum
+philately.museum
+phoenix.museum
+photography.museum
+pilots.museum
+pittsburgh.museum
+planetarium.museum
+plantation.museum
+plants.museum
+plaza.museum
+portal.museum
+portland.museum
+portlligat.museum
+posts-and-telecommunications.museum
+preservation.museum
+presidio.museum
+press.museum
+project.museum
+public.museum
+pubol.museum
+quebec.museum
+railroad.museum
+railway.museum
+research.museum
+resistance.museum
+riodejaneiro.museum
+rochester.museum
+rockart.museum
+roma.museum
+russia.museum
+saintlouis.museum
+salem.museum
+salvadordali.museum
+salzburg.museum
+sandiego.museum
+sanfrancisco.museum
+santabarbara.museum
+santacruz.museum
+santafe.museum
+saskatchewan.museum
+satx.museum
+savannahga.museum
+schlesisches.museum
+schoenbrunn.museum
+schokoladen.museum
+school.museum
+schweiz.museum
+science.museum
+scienceandhistory.museum
+scienceandindustry.museum
+sciencecenter.museum
+sciencecenters.museum
+science-fiction.museum
+sciencehistory.museum
+sciences.museum
+sciencesnaturelles.museum
+scotland.museum
+seaport.museum
+settlement.museum
+settlers.museum
+shell.museum
+sherbrooke.museum
+sibenik.museum
+silk.museum
+ski.museum
+skole.museum
+society.museum
+sologne.museum
+soundandvision.museum
+southcarolina.museum
+southwest.museum
+space.museum
+spy.museum
+square.museum
+stadt.museum
+stalbans.museum
+starnberg.museum
+state.museum
+stateofdelaware.museum
+station.museum
+steam.museum
+steiermark.museum
+stjohn.museum
+stockholm.museum
+stpetersburg.museum
+stuttgart.museum
+suisse.museum
+surgeonshall.museum
+surrey.museum
+svizzera.museum
+sweden.museum
+sydney.museum
+tank.museum
+tcm.museum
+technology.museum
+telekommunikation.museum
+television.museum
+texas.museum
+textile.museum
+theater.museum
+time.museum
+timekeeping.museum
+topology.museum
+torino.museum
+touch.museum
+town.museum
+transport.museum
+tree.museum
+trolley.museum
+trust.museum
+trustee.museum
+uhren.museum
+ulm.museum
+undersea.museum
+university.museum
+usa.museum
+usantiques.museum
+usarts.museum
+uscountryestate.museum
+usculture.museum
+usdecorativearts.museum
+usgarden.museum
+ushistory.museum
+ushuaia.museum
+uslivinghistory.museum
+utah.museum
+uvic.museum
+valley.museum
+vantaa.museum
+versailles.museum
+viking.museum
+village.museum
+virginia.museum
+virtual.museum
+virtuel.museum
+vlaanderen.museum
+volkenkunde.museum
+wales.museum
+wallonie.museum
+war.museum
+washingtondc.museum
+watchandclock.museum
+watch-and-clock.museum
+western.museum
+westfalen.museum
+whaling.museum
+wildlife.museum
+williamsburg.museum
+windmill.museum
+workshop.museum
+york.museum
+yorkshire.museum
+yosemite.museum
+youth.museum
+zoological.museum
+zoology.museum
+ירושלים.museum
+иком.museum
+
+// mv : https://en.wikipedia.org/wiki/.mv
+// "mv" included because, contra Wikipedia, google.mv exists.
+mv
+aero.mv
+biz.mv
+com.mv
+coop.mv
+edu.mv
+gov.mv
+info.mv
+int.mv
+mil.mv
+museum.mv
+name.mv
+net.mv
+org.mv
+pro.mv
+
+// mw : http://www.registrar.mw/
+mw
+ac.mw
+biz.mw
+co.mw
+com.mw
+coop.mw
+edu.mw
+gov.mw
+int.mw
+museum.mw
+net.mw
+org.mw
+
+// mx : http://www.nic.mx/
+// Submitted by registry <farias@nic.mx>
+mx
+com.mx
+org.mx
+gob.mx
+edu.mx
+net.mx
+
+// my : http://www.mynic.net.my/
+my
+com.my
+net.my
+org.my
+gov.my
+edu.my
+mil.my
+name.my
+
+// mz : http://www.uem.mz/
+// Submitted by registry <antonio@uem.mz>
+mz
+ac.mz
+adv.mz
+co.mz
+edu.mz
+gov.mz
+mil.mz
+net.mz
+org.mz
+
+// na : http://www.na-nic.com.na/
+// http://www.info.na/domain/
+na
+info.na
+pro.na
+name.na
+school.na
+or.na
+dr.na
+us.na
+mx.na
+ca.na
+in.na
+cc.na
+tv.na
+ws.na
+mobi.na
+co.na
+com.na
+org.na
+
+// name : has 2nd-level tlds, but there's no list of them
+name
+
+// nc : http://www.cctld.nc/
+nc
+asso.nc
+nom.nc
+
+// ne : https://en.wikipedia.org/wiki/.ne
+ne
+
+// net : https://en.wikipedia.org/wiki/.net
+net
+
+// nf : https://en.wikipedia.org/wiki/.nf
+nf
+com.nf
+net.nf
+per.nf
+rec.nf
+web.nf
+arts.nf
+firm.nf
+info.nf
+other.nf
+store.nf
+
+// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds
+ng
+com.ng
+edu.ng
+gov.ng
+i.ng
+mil.ng
+mobi.ng
+name.ng
+net.ng
+org.ng
+sch.ng
+
+// ni : http://www.nic.ni/
+ni
+ac.ni
+biz.ni
+co.ni
+com.ni
+edu.ni
+gob.ni
+in.ni
+info.ni
+int.ni
+mil.ni
+net.ni
+nom.ni
+org.ni
+web.ni
+
+// nl : https://en.wikipedia.org/wiki/.nl
+//      https://www.sidn.nl/
+//      ccTLD for the Netherlands
+nl
+
+// BV.nl will be a registry for dutch BV's (besloten vennootschap)
+bv.nl
+
+// no : http://www.norid.no/regelverk/index.en.html
+// The Norwegian registry has declined to notify us of updates. The web pages
+// referenced below are the official source of the data. There is also an
+// announce mailing list:
+// https://postlister.uninett.no/sympa/info/norid-diskusjon
+no
+// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html
+fhs.no
+vgs.no
+fylkesbibl.no
+folkebibl.no
+museum.no
+idrett.no
+priv.no
+// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html
+mil.no
+stat.no
+dep.no
+kommune.no
+herad.no
+// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html
+// counties
+aa.no
+ah.no
+bu.no
+fm.no
+hl.no
+hm.no
+jan-mayen.no
+mr.no
+nl.no
+nt.no
+of.no
+ol.no
+oslo.no
+rl.no
+sf.no
+st.no
+svalbard.no
+tm.no
+tr.no
+va.no
+vf.no
+// primary and lower secondary schools per county
+gs.aa.no
+gs.ah.no
+gs.bu.no
+gs.fm.no
+gs.hl.no
+gs.hm.no
+gs.jan-mayen.no
+gs.mr.no
+gs.nl.no
+gs.nt.no
+gs.of.no
+gs.ol.no
+gs.oslo.no
+gs.rl.no
+gs.sf.no
+gs.st.no
+gs.svalbard.no
+gs.tm.no
+gs.tr.no
+gs.va.no
+gs.vf.no
+// cities
+akrehamn.no
+åkrehamn.no
+algard.no
+ålgård.no
+arna.no
+brumunddal.no
+bryne.no
+bronnoysund.no
+brønnøysund.no
+drobak.no
+drøbak.no
+egersund.no
+fetsund.no
+floro.no
+florø.no
+fredrikstad.no
+hokksund.no
+honefoss.no
+hønefoss.no
+jessheim.no
+jorpeland.no
+jørpeland.no
+kirkenes.no
+kopervik.no
+krokstadelva.no
+langevag.no
+langevåg.no
+leirvik.no
+mjondalen.no
+mjøndalen.no
+mo-i-rana.no
+mosjoen.no
+mosjøen.no
+nesoddtangen.no
+orkanger.no
+osoyro.no
+osøyro.no
+raholt.no
+råholt.no
+sandnessjoen.no
+sandnessjøen.no
+skedsmokorset.no
+slattum.no
+spjelkavik.no
+stathelle.no
+stavern.no
+stjordalshalsen.no
+stjørdalshalsen.no
+tananger.no
+tranby.no
+vossevangen.no
+// communities
+afjord.no
+åfjord.no
+agdenes.no
+al.no
+ål.no
+alesund.no
+ålesund.no
+alstahaug.no
+alta.no
+áltá.no
+alaheadju.no
+álaheadju.no
+alvdal.no
+amli.no
+åmli.no
+amot.no
+åmot.no
+andebu.no
+andoy.no
+andøy.no
+andasuolo.no
+ardal.no
+årdal.no
+aremark.no
+arendal.no
+ås.no
+aseral.no
+åseral.no
+asker.no
+askim.no
+askvoll.no
+askoy.no
+askøy.no
+asnes.no
+åsnes.no
+audnedaln.no
+aukra.no
+aure.no
+aurland.no
+aurskog-holand.no
+aurskog-høland.no
+austevoll.no
+austrheim.no
+averoy.no
+averøy.no
+balestrand.no
+ballangen.no
+balat.no
+bálát.no
+balsfjord.no
+bahccavuotna.no
+báhccavuotna.no
+bamble.no
+bardu.no
+beardu.no
+beiarn.no
+bajddar.no
+bájddar.no
+baidar.no
+báidár.no
+berg.no
+bergen.no
+berlevag.no
+berlevåg.no
+bearalvahki.no
+bearalváhki.no
+bindal.no
+birkenes.no
+bjarkoy.no
+bjarkøy.no
+bjerkreim.no
+bjugn.no
+bodo.no
+bodø.no
+badaddja.no
+bådåddjå.no
+budejju.no
+bokn.no
+bremanger.no
+bronnoy.no
+brønnøy.no
+bygland.no
+bykle.no
+barum.no
+bærum.no
+bo.telemark.no
+bø.telemark.no
+bo.nordland.no
+bø.nordland.no
+bievat.no
+bievát.no
+bomlo.no
+bømlo.no
+batsfjord.no
+båtsfjord.no
+bahcavuotna.no
+báhcavuotna.no
+dovre.no
+drammen.no
+drangedal.no
+dyroy.no
+dyrøy.no
+donna.no
+dønna.no
+eid.no
+eidfjord.no
+eidsberg.no
+eidskog.no
+eidsvoll.no
+eigersund.no
+elverum.no
+enebakk.no
+engerdal.no
+etne.no
+etnedal.no
+evenes.no
+evenassi.no
+evenášši.no
+evje-og-hornnes.no
+farsund.no
+fauske.no
+fuossko.no
+fuoisku.no
+fedje.no
+fet.no
+finnoy.no
+finnøy.no
+fitjar.no
+fjaler.no
+fjell.no
+flakstad.no
+flatanger.no
+flekkefjord.no
+flesberg.no
+flora.no
+fla.no
+flå.no
+folldal.no
+forsand.no
+fosnes.no
+frei.no
+frogn.no
+froland.no
+frosta.no
+frana.no
+fræna.no
+froya.no
+frøya.no
+fusa.no
+fyresdal.no
+forde.no
+førde.no
+gamvik.no
+gangaviika.no
+gáŋgaviika.no
+gaular.no
+gausdal.no
+gildeskal.no
+gildeskål.no
+giske.no
+gjemnes.no
+gjerdrum.no
+gjerstad.no
+gjesdal.no
+gjovik.no
+gjøvik.no
+gloppen.no
+gol.no
+gran.no
+grane.no
+granvin.no
+gratangen.no
+grimstad.no
+grong.no
+kraanghke.no
+kråanghke.no
+grue.no
+gulen.no
+hadsel.no
+halden.no
+halsa.no
+hamar.no
+hamaroy.no
+habmer.no
+hábmer.no
+hapmir.no
+hápmir.no
+hammerfest.no
+hammarfeasta.no
+hámmárfeasta.no
+haram.no
+hareid.no
+harstad.no
+hasvik.no
+aknoluokta.no
+ákŋoluokta.no
+hattfjelldal.no
+aarborte.no
+haugesund.no
+hemne.no
+hemnes.no
+hemsedal.no
+heroy.more-og-romsdal.no
+herøy.møre-og-romsdal.no
+heroy.nordland.no
+herøy.nordland.no
+hitra.no
+hjartdal.no
+hjelmeland.no
+hobol.no
+hobøl.no
+hof.no
+hol.no
+hole.no
+holmestrand.no
+holtalen.no
+holtålen.no
+hornindal.no
+horten.no
+hurdal.no
+hurum.no
+hvaler.no
+hyllestad.no
+hagebostad.no
+hægebostad.no
+hoyanger.no
+høyanger.no
+hoylandet.no
+høylandet.no
+ha.no
+hå.no
+ibestad.no
+inderoy.no
+inderøy.no
+iveland.no
+jevnaker.no
+jondal.no
+jolster.no
+jølster.no
+karasjok.no
+karasjohka.no
+kárášjohka.no
+karlsoy.no
+galsa.no
+gálsá.no
+karmoy.no
+karmøy.no
+kautokeino.no
+guovdageaidnu.no
+klepp.no
+klabu.no
+klæbu.no
+kongsberg.no
+kongsvinger.no
+kragero.no
+kragerø.no
+kristiansand.no
+kristiansund.no
+krodsherad.no
+krødsherad.no
+kvalsund.no
+rahkkeravju.no
+ráhkkerávju.no
+kvam.no
+kvinesdal.no
+kvinnherad.no
+kviteseid.no
+kvitsoy.no
+kvitsøy.no
+kvafjord.no
+kvæfjord.no
+giehtavuoatna.no
+kvanangen.no
+kvænangen.no
+navuotna.no
+návuotna.no
+kafjord.no
+kåfjord.no
+gaivuotna.no
+gáivuotna.no
+larvik.no
+lavangen.no
+lavagis.no
+loabat.no
+loabát.no
+lebesby.no
+davvesiida.no
+leikanger.no
+leirfjord.no
+leka.no
+leksvik.no
+lenvik.no
+leangaviika.no
+leaŋgaviika.no
+lesja.no
+levanger.no
+lier.no
+lierne.no
+lillehammer.no
+lillesand.no
+lindesnes.no
+lindas.no
+lindås.no
+lom.no
+loppa.no
+lahppi.no
+láhppi.no
+lund.no
+lunner.no
+luroy.no
+lurøy.no
+luster.no
+lyngdal.no
+lyngen.no
+ivgu.no
+lardal.no
+lerdal.no
+lærdal.no
+lodingen.no
+lødingen.no
+lorenskog.no
+lørenskog.no
+loten.no
+løten.no
+malvik.no
+masoy.no
+måsøy.no
+muosat.no
+muosát.no
+mandal.no
+marker.no
+marnardal.no
+masfjorden.no
+meland.no
+meldal.no
+melhus.no
+meloy.no
+meløy.no
+meraker.no
+meråker.no
+moareke.no
+moåreke.no
+midsund.no
+midtre-gauldal.no
+modalen.no
+modum.no
+molde.no
+moskenes.no
+moss.no
+mosvik.no
+malselv.no
+målselv.no
+malatvuopmi.no
+málatvuopmi.no
+namdalseid.no
+aejrie.no
+namsos.no
+namsskogan.no
+naamesjevuemie.no
+nååmesjevuemie.no
+laakesvuemie.no
+nannestad.no
+narvik.no
+narviika.no
+naustdal.no
+nedre-eiker.no
+nes.akershus.no
+nes.buskerud.no
+nesna.no
+nesodden.no
+nesseby.no
+unjarga.no
+unjárga.no
+nesset.no
+nissedal.no
+nittedal.no
+nord-aurdal.no
+nord-fron.no
+nord-odal.no
+norddal.no
+nordkapp.no
+davvenjarga.no
+davvenjárga.no
+nordre-land.no
+nordreisa.no
+raisa.no
+ráisa.no
+nore-og-uvdal.no
+notodden.no
+naroy.no
+nærøy.no
+notteroy.no
+nøtterøy.no
+odda.no
+oksnes.no
+øksnes.no
+oppdal.no
+oppegard.no
+oppegård.no
+orkdal.no
+orland.no
+ørland.no
+orskog.no
+ørskog.no
+orsta.no
+ørsta.no
+os.hedmark.no
+os.hordaland.no
+osen.no
+osteroy.no
+osterøy.no
+ostre-toten.no
+østre-toten.no
+overhalla.no
+ovre-eiker.no
+øvre-eiker.no
+oyer.no
+øyer.no
+oygarden.no
+øygarden.no
+oystre-slidre.no
+øystre-slidre.no
+porsanger.no
+porsangu.no
+porsáŋgu.no
+porsgrunn.no
+radoy.no
+radøy.no
+rakkestad.no
+rana.no
+ruovat.no
+randaberg.no
+rauma.no
+rendalen.no
+rennebu.no
+rennesoy.no
+rennesøy.no
+rindal.no
+ringebu.no
+ringerike.no
+ringsaker.no
+rissa.no
+risor.no
+risør.no
+roan.no
+rollag.no
+rygge.no
+ralingen.no
+rælingen.no
+rodoy.no
+rødøy.no
+romskog.no
+rømskog.no
+roros.no
+røros.no
+rost.no
+røst.no
+royken.no
+røyken.no
+royrvik.no
+røyrvik.no
+rade.no
+råde.no
+salangen.no
+siellak.no
+saltdal.no
+salat.no
+sálát.no
+sálat.no
+samnanger.no
+sande.more-og-romsdal.no
+sande.møre-og-romsdal.no
+sande.vestfold.no
+sandefjord.no
+sandnes.no
+sandoy.no
+sandøy.no
+sarpsborg.no
+sauda.no
+sauherad.no
+sel.no
+selbu.no
+selje.no
+seljord.no
+sigdal.no
+siljan.no
+sirdal.no
+skaun.no
+skedsmo.no
+ski.no
+skien.no
+skiptvet.no
+skjervoy.no
+skjervøy.no
+skierva.no
+skiervá.no
+skjak.no
+skjåk.no
+skodje.no
+skanland.no
+skånland.no
+skanit.no
+skánit.no
+smola.no
+smøla.no
+snillfjord.no
+snasa.no
+snåsa.no
+snoasa.no
+snaase.no
+snåase.no
+sogndal.no
+sokndal.no
+sola.no
+solund.no
+songdalen.no
+sortland.no
+spydeberg.no
+stange.no
+stavanger.no
+steigen.no
+steinkjer.no
+stjordal.no
+stjørdal.no
+stokke.no
+stor-elvdal.no
+stord.no
+stordal.no
+storfjord.no
+omasvuotna.no
+strand.no
+stranda.no
+stryn.no
+sula.no
+suldal.no
+sund.no
+sunndal.no
+surnadal.no
+sveio.no
+svelvik.no
+sykkylven.no
+sogne.no
+søgne.no
+somna.no
+sømna.no
+sondre-land.no
+søndre-land.no
+sor-aurdal.no
+sør-aurdal.no
+sor-fron.no
+sør-fron.no
+sor-odal.no
+sør-odal.no
+sor-varanger.no
+sør-varanger.no
+matta-varjjat.no
+mátta-várjjat.no
+sorfold.no
+sørfold.no
+sorreisa.no
+sørreisa.no
+sorum.no
+sørum.no
+tana.no
+deatnu.no
+time.no
+tingvoll.no
+tinn.no
+tjeldsund.no
+dielddanuorri.no
+tjome.no
+tjøme.no
+tokke.no
+tolga.no
+torsken.no
+tranoy.no
+tranøy.no
+tromso.no
+tromsø.no
+tromsa.no
+romsa.no
+trondheim.no
+troandin.no
+trysil.no
+trana.no
+træna.no
+trogstad.no
+trøgstad.no
+tvedestrand.no
+tydal.no
+tynset.no
+tysfjord.no
+divtasvuodna.no
+divttasvuotna.no
+tysnes.no
+tysvar.no
+tysvær.no
+tonsberg.no
+tønsberg.no
+ullensaker.no
+ullensvang.no
+ulvik.no
+utsira.no
+vadso.no
+vadsø.no
+cahcesuolo.no
+čáhcesuolo.no
+vaksdal.no
+valle.no
+vang.no
+vanylven.no
+vardo.no
+vardø.no
+varggat.no
+várggát.no
+vefsn.no
+vaapste.no
+vega.no
+vegarshei.no
+vegårshei.no
+vennesla.no
+verdal.no
+verran.no
+vestby.no
+vestnes.no
+vestre-slidre.no
+vestre-toten.no
+vestvagoy.no
+vestvågøy.no
+vevelstad.no
+vik.no
+vikna.no
+vindafjord.no
+volda.no
+voss.no
+varoy.no
+værøy.no
+vagan.no
+vågan.no
+voagat.no
+vagsoy.no
+vågsøy.no
+vaga.no
+vågå.no
+valer.ostfold.no
+våler.østfold.no
+valer.hedmark.no
+våler.hedmark.no
+
+// np : http://www.mos.com.np/register.html
+*.np
+
+// nr : http://cenpac.net.nr/dns/index.html
+// Submitted by registry <technician@cenpac.net.nr>
+nr
+biz.nr
+info.nr
+gov.nr
+edu.nr
+org.nr
+net.nr
+com.nr
+
+// nu : https://en.wikipedia.org/wiki/.nu
+nu
+
+// nz : https://en.wikipedia.org/wiki/.nz
+// Submitted by registry <jay@nzrs.net.nz>
+nz
+ac.nz
+co.nz
+cri.nz
+geek.nz
+gen.nz
+govt.nz
+health.nz
+iwi.nz
+kiwi.nz
+maori.nz
+mil.nz
+māori.nz
+net.nz
+org.nz
+parliament.nz
+school.nz
+
+// om : https://en.wikipedia.org/wiki/.om
+om
+co.om
+com.om
+edu.om
+gov.om
+med.om
+museum.om
+net.om
+org.om
+pro.om
+
+// onion : https://tools.ietf.org/html/rfc7686
+onion
+
+// org : https://en.wikipedia.org/wiki/.org
+org
+
+// pa : http://www.nic.pa/
+// Some additional second level "domains" resolve directly as hostnames, such as
+// pannet.pa, so we add a rule for "pa".
+pa
+ac.pa
+gob.pa
+com.pa
+org.pa
+sld.pa
+edu.pa
+net.pa
+ing.pa
+abo.pa
+med.pa
+nom.pa
+
+// pe : https://www.nic.pe/InformeFinalComision.pdf
+pe
+edu.pe
+gob.pe
+nom.pe
+mil.pe
+org.pe
+com.pe
+net.pe
+
+// pf : http://www.gobin.info/domainname/formulaire-pf.pdf
+pf
+com.pf
+org.pf
+edu.pf
+
+// pg : https://en.wikipedia.org/wiki/.pg
+*.pg
+
+// ph : http://www.domains.ph/FAQ2.asp
+// Submitted by registry <jed@email.com.ph>
+ph
+com.ph
+net.ph
+org.ph
+gov.ph
+edu.ph
+ngo.ph
+mil.ph
+i.ph
+
+// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK
+pk
+com.pk
+net.pk
+edu.pk
+org.pk
+fam.pk
+biz.pk
+web.pk
+gov.pk
+gob.pk
+gok.pk
+gon.pk
+gop.pk
+gos.pk
+info.pk
+
+// pl http://www.dns.pl/english/index.html
+// Submitted by registry
+pl
+com.pl
+net.pl
+org.pl
+// pl functional domains (http://www.dns.pl/english/index.html)
+aid.pl
+agro.pl
+atm.pl
+auto.pl
+biz.pl
+edu.pl
+gmina.pl
+gsm.pl
+info.pl
+mail.pl
+miasta.pl
+media.pl
+mil.pl
+nieruchomosci.pl
+nom.pl
+pc.pl
+powiat.pl
+priv.pl
+realestate.pl
+rel.pl
+sex.pl
+shop.pl
+sklep.pl
+sos.pl
+szkola.pl
+targi.pl
+tm.pl
+tourism.pl
+travel.pl
+turystyka.pl
+// Government domains
+gov.pl
+ap.gov.pl
+ic.gov.pl
+is.gov.pl
+us.gov.pl
+kmpsp.gov.pl
+kppsp.gov.pl
+kwpsp.gov.pl
+psp.gov.pl
+wskr.gov.pl
+kwp.gov.pl
+mw.gov.pl
+ug.gov.pl
+um.gov.pl
+umig.gov.pl
+ugim.gov.pl
+upow.gov.pl
+uw.gov.pl
+starostwo.gov.pl
+pa.gov.pl
+po.gov.pl
+psse.gov.pl
+pup.gov.pl
+rzgw.gov.pl
+sa.gov.pl
+so.gov.pl
+sr.gov.pl
+wsa.gov.pl
+sko.gov.pl
+uzs.gov.pl
+wiih.gov.pl
+winb.gov.pl
+pinb.gov.pl
+wios.gov.pl
+witd.gov.pl
+wzmiuw.gov.pl
+piw.gov.pl
+wiw.gov.pl
+griw.gov.pl
+wif.gov.pl
+oum.gov.pl
+sdn.gov.pl
+zp.gov.pl
+uppo.gov.pl
+mup.gov.pl
+wuoz.gov.pl
+konsulat.gov.pl
+oirm.gov.pl
+// pl regional domains (http://www.dns.pl/english/index.html)
+augustow.pl
+babia-gora.pl
+bedzin.pl
+beskidy.pl
+bialowieza.pl
+bialystok.pl
+bielawa.pl
+bieszczady.pl
+boleslawiec.pl
+bydgoszcz.pl
+bytom.pl
+cieszyn.pl
+czeladz.pl
+czest.pl
+dlugoleka.pl
+elblag.pl
+elk.pl
+glogow.pl
+gniezno.pl
+gorlice.pl
+grajewo.pl
+ilawa.pl
+jaworzno.pl
+jelenia-gora.pl
+jgora.pl
+kalisz.pl
+kazimierz-dolny.pl
+karpacz.pl
+kartuzy.pl
+kaszuby.pl
+katowice.pl
+kepno.pl
+ketrzyn.pl
+klodzko.pl
+kobierzyce.pl
+kolobrzeg.pl
+konin.pl
+konskowola.pl
+kutno.pl
+lapy.pl
+lebork.pl
+legnica.pl
+lezajsk.pl
+limanowa.pl
+lomza.pl
+lowicz.pl
+lubin.pl
+lukow.pl
+malbork.pl
+malopolska.pl
+mazowsze.pl
+mazury.pl
+mielec.pl
+mielno.pl
+mragowo.pl
+naklo.pl
+nowaruda.pl
+nysa.pl
+olawa.pl
+olecko.pl
+olkusz.pl
+olsztyn.pl
+opoczno.pl
+opole.pl
+ostroda.pl
+ostroleka.pl
+ostrowiec.pl
+ostrowwlkp.pl
+pila.pl
+pisz.pl
+podhale.pl
+podlasie.pl
+polkowice.pl
+pomorze.pl
+pomorskie.pl
+prochowice.pl
+pruszkow.pl
+przeworsk.pl
+pulawy.pl
+radom.pl
+rawa-maz.pl
+rybnik.pl
+rzeszow.pl
+sanok.pl
+sejny.pl
+slask.pl
+slupsk.pl
+sosnowiec.pl
+stalowa-wola.pl
+skoczow.pl
+starachowice.pl
+stargard.pl
+suwalki.pl
+swidnica.pl
+swiebodzin.pl
+swinoujscie.pl
+szczecin.pl
+szczytno.pl
+tarnobrzeg.pl
+tgory.pl
+turek.pl
+tychy.pl
+ustka.pl
+walbrzych.pl
+warmia.pl
+warszawa.pl
+waw.pl
+wegrow.pl
+wielun.pl
+wlocl.pl
+wloclawek.pl
+wodzislaw.pl
+wolomin.pl
+wroclaw.pl
+zachpomor.pl
+zagan.pl
+zarow.pl
+zgora.pl
+zgorzelec.pl
+
+// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf
+pm
+
+// pn : http://www.government.pn/PnRegistry/policies.htm
+pn
+gov.pn
+co.pn
+org.pn
+edu.pn
+net.pn
+
+// post : https://en.wikipedia.org/wiki/.post
+post
+
+// pr : http://www.nic.pr/index.asp?f=1
+pr
+com.pr
+net.pr
+org.pr
+gov.pr
+edu.pr
+isla.pr
+pro.pr
+biz.pr
+info.pr
+name.pr
+// these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr
+est.pr
+prof.pr
+ac.pr
+
+// pro : http://registry.pro/get-pro
+pro
+aaa.pro
+aca.pro
+acct.pro
+avocat.pro
+bar.pro
+cpa.pro
+eng.pro
+jur.pro
+law.pro
+med.pro
+recht.pro
+
+// ps : https://en.wikipedia.org/wiki/.ps
+// http://www.nic.ps/registration/policy.html#reg
+ps
+edu.ps
+gov.ps
+sec.ps
+plo.ps
+com.ps
+org.ps
+net.ps
+
+// pt : http://online.dns.pt/dns/start_dns
+pt
+net.pt
+gov.pt
+org.pt
+edu.pt
+int.pt
+publ.pt
+com.pt
+nome.pt
+
+// pw : https://en.wikipedia.org/wiki/.pw
+pw
+co.pw
+ne.pw
+or.pw
+ed.pw
+go.pw
+belau.pw
+
+// py : http://www.nic.py/pautas.html#seccion_9
+// Submitted by registry
+py
+com.py
+coop.py
+edu.py
+gov.py
+mil.py
+net.py
+org.py
+
+// qa : http://domains.qa/en/
+qa
+com.qa
+edu.qa
+gov.qa
+mil.qa
+name.qa
+net.qa
+org.qa
+sch.qa
+
+// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs
+re
+asso.re
+com.re
+nom.re
+
+// ro : http://www.rotld.ro/
+ro
+arts.ro
+com.ro
+firm.ro
+info.ro
+nom.ro
+nt.ro
+org.ro
+rec.ro
+store.ro
+tm.ro
+www.ro
+
+// rs : https://www.rnids.rs/en/domains/national-domains
+rs
+ac.rs
+co.rs
+edu.rs
+gov.rs
+in.rs
+org.rs
+
+// ru : https://cctld.ru/en/domains/domens_ru/reserved/
+ru
+ac.ru
+edu.ru
+gov.ru
+int.ru
+mil.ru
+test.ru
+
+// rw : http://www.nic.rw/cgi-bin/policy.pl
+rw
+gov.rw
+net.rw
+edu.rw
+ac.rw
+com.rw
+co.rw
+int.rw
+mil.rw
+gouv.rw
+
+// sa : http://www.nic.net.sa/
+sa
+com.sa
+net.sa
+org.sa
+gov.sa
+med.sa
+pub.sa
+edu.sa
+sch.sa
+
+// sb : http://www.sbnic.net.sb/
+// Submitted by registry <lee.humphries@telekom.com.sb>
+sb
+com.sb
+edu.sb
+gov.sb
+net.sb
+org.sb
+
+// sc : http://www.nic.sc/
+sc
+com.sc
+gov.sc
+net.sc
+org.sc
+edu.sc
+
+// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm
+// Submitted by registry <admin@isoc.sd>
+sd
+com.sd
+net.sd
+org.sd
+edu.sd
+med.sd
+tv.sd
+gov.sd
+info.sd
+
+// se : https://en.wikipedia.org/wiki/.se
+// Submitted by registry <patrik.wallstrom@iis.se>
+se
+a.se
+ac.se
+b.se
+bd.se
+brand.se
+c.se
+d.se
+e.se
+f.se
+fh.se
+fhsk.se
+fhv.se
+g.se
+h.se
+i.se
+k.se
+komforb.se
+kommunalforbund.se
+komvux.se
+l.se
+lanbib.se
+m.se
+n.se
+naturbruksgymn.se
+o.se
+org.se
+p.se
+parti.se
+pp.se
+press.se
+r.se
+s.se
+t.se
+tm.se
+u.se
+w.se
+x.se
+y.se
+z.se
+
+// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines
+sg
+com.sg
+net.sg
+org.sg
+gov.sg
+edu.sg
+per.sg
+
+// sh : http://www.nic.sh/registrar.html
+sh
+com.sh
+net.sh
+gov.sh
+org.sh
+mil.sh
+
+// si : https://en.wikipedia.org/wiki/.si
+si
+
+// sj : No registrations at this time.
+// Submitted by registry <jarle@uninett.no>
+sj
+
+// sk : https://en.wikipedia.org/wiki/.sk
+// list of 2nd level domains ?
+sk
+
+// sl : http://www.nic.sl
+// Submitted by registry <adam@neoip.com>
+sl
+com.sl
+net.sl
+edu.sl
+gov.sl
+org.sl
+
+// sm : https://en.wikipedia.org/wiki/.sm
+sm
+
+// sn : https://en.wikipedia.org/wiki/.sn
+sn
+art.sn
+com.sn
+edu.sn
+gouv.sn
+org.sn
+perso.sn
+univ.sn
+
+// so : http://www.soregistry.com/
+so
+com.so
+net.so
+org.so
+
+// sr : https://en.wikipedia.org/wiki/.sr
+sr
+
+// st : http://www.nic.st/html/policyrules/
+st
+co.st
+com.st
+consulado.st
+edu.st
+embaixada.st
+gov.st
+mil.st
+net.st
+org.st
+principe.st
+saotome.st
+store.st
+
+// su : https://en.wikipedia.org/wiki/.su
+su
+
+// sv : http://www.svnet.org.sv/niveldos.pdf
+sv
+com.sv
+edu.sv
+gob.sv
+org.sv
+red.sv
+
+// sx : https://en.wikipedia.org/wiki/.sx
+// Submitted by registry <jcvignes@openregistry.com>
+sx
+gov.sx
+
+// sy : https://en.wikipedia.org/wiki/.sy
+// see also: http://www.gobin.info/domainname/sy.doc
+sy
+edu.sy
+gov.sy
+net.sy
+mil.sy
+com.sy
+org.sy
+
+// sz : https://en.wikipedia.org/wiki/.sz
+// http://www.sispa.org.sz/
+sz
+co.sz
+ac.sz
+org.sz
+
+// tc : https://en.wikipedia.org/wiki/.tc
+tc
+
+// td : https://en.wikipedia.org/wiki/.td
+td
+
+// tel: https://en.wikipedia.org/wiki/.tel
+// http://www.telnic.org/
+tel
+
+// tf : https://en.wikipedia.org/wiki/.tf
+tf
+
+// tg : https://en.wikipedia.org/wiki/.tg
+// http://www.nic.tg/
+tg
+
+// th : https://en.wikipedia.org/wiki/.th
+// Submitted by registry <krit@thains.co.th>
+th
+ac.th
+co.th
+go.th
+in.th
+mi.th
+net.th
+or.th
+
+// tj : http://www.nic.tj/policy.html
+tj
+ac.tj
+biz.tj
+co.tj
+com.tj
+edu.tj
+go.tj
+gov.tj
+int.tj
+mil.tj
+name.tj
+net.tj
+nic.tj
+org.tj
+test.tj
+web.tj
+
+// tk : https://en.wikipedia.org/wiki/.tk
+tk
+
+// tl : https://en.wikipedia.org/wiki/.tl
+tl
+gov.tl
+
+// tm : http://www.nic.tm/local.html
+tm
+com.tm
+co.tm
+org.tm
+net.tm
+nom.tm
+gov.tm
+mil.tm
+edu.tm
+
+// tn : https://en.wikipedia.org/wiki/.tn
+// http://whois.ati.tn/
+tn
+com.tn
+ens.tn
+fin.tn
+gov.tn
+ind.tn
+intl.tn
+nat.tn
+net.tn
+org.tn
+info.tn
+perso.tn
+tourism.tn
+edunet.tn
+rnrt.tn
+rns.tn
+rnu.tn
+mincom.tn
+agrinet.tn
+defense.tn
+turen.tn
+
+// to : https://en.wikipedia.org/wiki/.to
+// Submitted by registry <egullich@colo.to>
+to
+com.to
+gov.to
+net.to
+org.to
+edu.to
+mil.to
+
+// subTLDs: https://www.nic.tr/forms/eng/policies.pdf
+//     and: https://www.nic.tr/forms/politikalar.pdf
+// Submitted by <mehmetgurevin@gmail.com>
+tr
+com.tr
+info.tr
+biz.tr
+net.tr
+org.tr
+web.tr
+gen.tr
+tv.tr
+av.tr
+dr.tr
+bbs.tr
+name.tr
+tel.tr
+gov.tr
+bel.tr
+pol.tr
+mil.tr
+k12.tr
+edu.tr
+kep.tr
+
+// Used by Northern Cyprus
+nc.tr
+
+// Used by government agencies of Northern Cyprus
+gov.nc.tr
+
+// travel : https://en.wikipedia.org/wiki/.travel
+travel
+
+// tt : http://www.nic.tt/
+tt
+co.tt
+com.tt
+org.tt
+net.tt
+biz.tt
+info.tt
+pro.tt
+int.tt
+coop.tt
+jobs.tt
+mobi.tt
+travel.tt
+museum.tt
+aero.tt
+name.tt
+gov.tt
+edu.tt
+
+// tv : https://en.wikipedia.org/wiki/.tv
+// Not listing any 2LDs as reserved since none seem to exist in practice,
+// Wikipedia notwithstanding.
+tv
+
+// tw : https://en.wikipedia.org/wiki/.tw
+tw
+edu.tw
+gov.tw
+mil.tw
+com.tw
+net.tw
+org.tw
+idv.tw
+game.tw
+ebiz.tw
+club.tw
+網路.tw
+組織.tw
+商業.tw
+
+// tz : http://www.tznic.or.tz/index.php/domains
+// Submitted by registry <manager@tznic.or.tz>
+tz
+ac.tz
+co.tz
+go.tz
+hotel.tz
+info.tz
+me.tz
+mil.tz
+mobi.tz
+ne.tz
+or.tz
+sc.tz
+tv.tz
+
+// ua : https://hostmaster.ua/policy/?ua
+// Submitted by registry <dk@cctld.ua>
+ua
+// ua 2LD
+com.ua
+edu.ua
+gov.ua
+in.ua
+net.ua
+org.ua
+// ua geographic names
+// https://hostmaster.ua/2ld/
+cherkassy.ua
+cherkasy.ua
+chernigov.ua
+chernihiv.ua
+chernivtsi.ua
+chernovtsy.ua
+ck.ua
+cn.ua
+cr.ua
+crimea.ua
+cv.ua
+dn.ua
+dnepropetrovsk.ua
+dnipropetrovsk.ua
+dominic.ua
+donetsk.ua
+dp.ua
+if.ua
+ivano-frankivsk.ua
+kh.ua
+kharkiv.ua
+kharkov.ua
+kherson.ua
+khmelnitskiy.ua
+khmelnytskyi.ua
+kiev.ua
+kirovograd.ua
+km.ua
+kr.ua
+krym.ua
+ks.ua
+kv.ua
+kyiv.ua
+lg.ua
+lt.ua
+lugansk.ua
+lutsk.ua
+lv.ua
+lviv.ua
+mk.ua
+mykolaiv.ua
+nikolaev.ua
+od.ua
+odesa.ua
+odessa.ua
+pl.ua
+poltava.ua
+rivne.ua
+rovno.ua
+rv.ua
+sb.ua
+sebastopol.ua
+sevastopol.ua
+sm.ua
+sumy.ua
+te.ua
+ternopil.ua
+uz.ua
+uzhgorod.ua
+vinnica.ua
+vinnytsia.ua
+vn.ua
+volyn.ua
+yalta.ua
+zaporizhzhe.ua
+zaporizhzhia.ua
+zhitomir.ua
+zhytomyr.ua
+zp.ua
+zt.ua
+
+// ug : https://www.registry.co.ug/
+ug
+co.ug
+or.ug
+ac.ug
+sc.ug
+go.ug
+ne.ug
+com.ug
+org.ug
+
+// uk : https://en.wikipedia.org/wiki/.uk
+// Submitted by registry <Michael.Daly@nominet.org.uk>
+uk
+ac.uk
+co.uk
+gov.uk
+ltd.uk
+me.uk
+net.uk
+nhs.uk
+org.uk
+plc.uk
+police.uk
+*.sch.uk
+
+// us : https://en.wikipedia.org/wiki/.us
+us
+dni.us
+fed.us
+isa.us
+kids.us
+nsn.us
+// us geographic names
+ak.us
+al.us
+ar.us
+as.us
+az.us
+ca.us
+co.us
+ct.us
+dc.us
+de.us
+fl.us
+ga.us
+gu.us
+hi.us
+ia.us
+id.us
+il.us
+in.us
+ks.us
+ky.us
+la.us
+ma.us
+md.us
+me.us
+mi.us
+mn.us
+mo.us
+ms.us
+mt.us
+nc.us
+nd.us
+ne.us
+nh.us
+nj.us
+nm.us
+nv.us
+ny.us
+oh.us
+ok.us
+or.us
+pa.us
+pr.us
+ri.us
+sc.us
+sd.us
+tn.us
+tx.us
+ut.us
+vi.us
+vt.us
+va.us
+wa.us
+wi.us
+wv.us
+wy.us
+// The registrar notes several more specific domains available in each state,
+// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat
+// haphazard; in some states these domains resolve as addresses, while in others
+// only subdomains are available, or even nothing at all. We include the
+// most common ones where it's clear that different sites are different
+// entities.
+k12.ak.us
+k12.al.us
+k12.ar.us
+k12.as.us
+k12.az.us
+k12.ca.us
+k12.co.us
+k12.ct.us
+k12.dc.us
+k12.de.us
+k12.fl.us
+k12.ga.us
+k12.gu.us
+// k12.hi.us  Bug 614565 - Hawaii has a state-wide DOE login
+k12.ia.us
+k12.id.us
+k12.il.us
+k12.in.us
+k12.ks.us
+k12.ky.us
+k12.la.us
+k12.ma.us
+k12.md.us
+k12.me.us
+k12.mi.us
+k12.mn.us
+k12.mo.us
+k12.ms.us
+k12.mt.us
+k12.nc.us
+// k12.nd.us  Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov>
+k12.ne.us
+k12.nh.us
+k12.nj.us
+k12.nm.us
+k12.nv.us
+k12.ny.us
+k12.oh.us
+k12.ok.us
+k12.or.us
+k12.pa.us
+k12.pr.us
+k12.ri.us
+k12.sc.us
+// k12.sd.us  Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us>
+k12.tn.us
+k12.tx.us
+k12.ut.us
+k12.vi.us
+k12.vt.us
+k12.va.us
+k12.wa.us
+k12.wi.us
+// k12.wv.us  Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu>
+k12.wy.us
+cc.ak.us
+cc.al.us
+cc.ar.us
+cc.as.us
+cc.az.us
+cc.ca.us
+cc.co.us
+cc.ct.us
+cc.dc.us
+cc.de.us
+cc.fl.us
+cc.ga.us
+cc.gu.us
+cc.hi.us
+cc.ia.us
+cc.id.us
+cc.il.us
+cc.in.us
+cc.ks.us
+cc.ky.us
+cc.la.us
+cc.ma.us
+cc.md.us
+cc.me.us
+cc.mi.us
+cc.mn.us
+cc.mo.us
+cc.ms.us
+cc.mt.us
+cc.nc.us
+cc.nd.us
+cc.ne.us
+cc.nh.us
+cc.nj.us
+cc.nm.us
+cc.nv.us
+cc.ny.us
+cc.oh.us
+cc.ok.us
+cc.or.us
+cc.pa.us
+cc.pr.us
+cc.ri.us
+cc.sc.us
+cc.sd.us
+cc.tn.us
+cc.tx.us
+cc.ut.us
+cc.vi.us
+cc.vt.us
+cc.va.us
+cc.wa.us
+cc.wi.us
+cc.wv.us
+cc.wy.us
+lib.ak.us
+lib.al.us
+lib.ar.us
+lib.as.us
+lib.az.us
+lib.ca.us
+lib.co.us
+lib.ct.us
+lib.dc.us
+// lib.de.us  Issue #243 - Moved to Private section at request of Ed Moore <Ed.Moore@lib.de.us>
+lib.fl.us
+lib.ga.us
+lib.gu.us
+lib.hi.us
+lib.ia.us
+lib.id.us
+lib.il.us
+lib.in.us
+lib.ks.us
+lib.ky.us
+lib.la.us
+lib.ma.us
+lib.md.us
+lib.me.us
+lib.mi.us
+lib.mn.us
+lib.mo.us
+lib.ms.us
+lib.mt.us
+lib.nc.us
+lib.nd.us
+lib.ne.us
+lib.nh.us
+lib.nj.us
+lib.nm.us
+lib.nv.us
+lib.ny.us
+lib.oh.us
+lib.ok.us
+lib.or.us
+lib.pa.us
+lib.pr.us
+lib.ri.us
+lib.sc.us
+lib.sd.us
+lib.tn.us
+lib.tx.us
+lib.ut.us
+lib.vi.us
+lib.vt.us
+lib.va.us
+lib.wa.us
+lib.wi.us
+// lib.wv.us  Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us>
+lib.wy.us
+// k12.ma.us contains school districts in Massachusetts. The 4LDs are
+//  managed independently except for private (PVT), charter (CHTR) and
+//  parochial (PAROCH) schools.  Those are delegated directly to the
+//  5LD operators.   <k12-ma-hostmaster _ at _ rsuc.gweep.net>
+pvt.k12.ma.us
+chtr.k12.ma.us
+paroch.k12.ma.us
+
+// uy : http://www.nic.org.uy/
+uy
+com.uy
+edu.uy
+gub.uy
+mil.uy
+net.uy
+org.uy
+
+// uz : http://www.reg.uz/
+uz
+co.uz
+com.uz
+net.uz
+org.uz
+
+// va : https://en.wikipedia.org/wiki/.va
+va
+
+// vc : https://en.wikipedia.org/wiki/.vc
+// Submitted by registry <kshah@ca.afilias.info>
+vc
+com.vc
+net.vc
+org.vc
+gov.vc
+mil.vc
+edu.vc
+
+// ve : https://registro.nic.ve/
+// Submitted by registry
+ve
+arts.ve
+co.ve
+com.ve
+e12.ve
+edu.ve
+firm.ve
+gob.ve
+gov.ve
+info.ve
+int.ve
+mil.ve
+net.ve
+org.ve
+rec.ve
+store.ve
+tec.ve
+web.ve
+
+// vg : https://en.wikipedia.org/wiki/.vg
+vg
+
+// vi : http://www.nic.vi/newdomainform.htm
+// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other
+// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they
+// are available for registration (which they do not seem to be).
+vi
+co.vi
+com.vi
+k12.vi
+net.vi
+org.vi
+
+// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp
+vn
+com.vn
+net.vn
+org.vn
+edu.vn
+gov.vn
+int.vn
+ac.vn
+biz.vn
+info.vn
+name.vn
+pro.vn
+health.vn
+
+// vu : https://en.wikipedia.org/wiki/.vu
+// http://www.vunic.vu/
+vu
+com.vu
+edu.vu
+net.vu
+org.vu
+
+// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf
+wf
+
+// ws : https://en.wikipedia.org/wiki/.ws
+// http://samoanic.ws/index.dhtml
+ws
+com.ws
+net.ws
+org.ws
+gov.ws
+edu.ws
+
+// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf
+yt
+
+// IDN ccTLDs
+// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then
+// U-label, and follow this format:
+// // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD>
+// // [sponsoring org]
+// U-Label
+
+// xn--mgbaam7a8h ("Emerat", Arabic) : AE
+// http://nic.ae/english/arabicdomain/rules.jsp
+امارات
+
+// xn--y9a3aq ("hye", Armenian) : AM
+// ISOC AM (operated by .am Registry)
+հայ
+
+// xn--54b7fta0cc ("Bangla", Bangla) : BD
+বাংলা
+
+// xn--90ae ("bg", Bulgarian) : BG
+бг
+
+// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY
+// Operated by .by registry
+бел
+
+// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN
+// CNNIC
+// http://cnnic.cn/html/Dir/2005/10/11/3218.htm
+中国
+
+// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN
+// CNNIC
+// http://cnnic.cn/html/Dir/2005/10/11/3218.htm
+中國
+
+// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ
+الجزائر
+
+// xn--wgbh1c ("Egypt/Masr", Arabic) : EG
+// http://www.dotmasr.eg/
+مصر
+
+// xn--e1a4c ("eu", Cyrillic) : EU
+ею
+
+// xn--node ("ge", Georgian Mkhedruli) : GE
+გე
+
+// xn--qxam ("el", Greek) : GR
+// Hellenic Ministry of Infrastructure, Transport, and Networks
+ελ
+
+// xn--j6w193g ("Hong Kong", Chinese) : HK
+// https://www2.hkirc.hk/register/rules.jsp
+香港
+
+// xn--2scrj9c ("Bharat", Kannada) : IN
+// India
+ಭಾರತ
+
+// xn--3hcrj9c ("Bharat", Oriya) : IN
+// India
+ଭାରତ
+
+// xn--45br5cyl ("Bharatam", Assamese) : IN
+// India
+ভাৰত
+
+// xn--h2breg3eve ("Bharatam", Sanskrit) : IN
+// India
+भारतम्
+
+// xn--h2brj9c8c ("Bharot", Santali) : IN
+// India
+भारोत
+
+// xn--mgbgu82a ("Bharat", Sindhi) : IN
+// India
+ڀارت
+
+// xn--rvc1e0am3e ("Bharatam", Malayalam) : IN
+// India
+ഭാരതം
+
+// xn--h2brj9c ("Bharat", Devanagari) : IN
+// India
+भारत
+
+// xn--mgbbh1a71e ("Bharat", Arabic) : IN
+// India
+بھارت
+
+// xn--fpcrj9c3d ("Bharat", Telugu) : IN
+// India
+భారత్
+
+// xn--gecrj9c ("Bharat", Gujarati) : IN
+// India
+ભારત
+
+// xn--s9brj9c ("Bharat", Gurmukhi) : IN
+// India
+ਭਾਰਤ
+
+// xn--45brj9c ("Bharat", Bengali) : IN
+// India
+ভারত
+
+// xn--xkc2dl3a5ee0h ("India", Tamil) : IN
+// India
+இந்தியா
+
+// xn--mgba3a4f16a ("Iran", Persian) : IR
+ایران
+
+// xn--mgba3a4fra ("Iran", Arabic) : IR
+ايران
+
+// xn--mgbtx2b ("Iraq", Arabic) : IQ
+// Communications and Media Commission
+عراق
+
+// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO
+// National Information Technology Center (NITC)
+// Royal Scientific Society, Al-Jubeiha
+الاردن
+
+// xn--3e0b707e ("Republic of Korea", Hangul) : KR
+한국
+
+// xn--80ao21a ("Kaz", Kazakh) : KZ
+қаз
+
+// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK
+// http://nic.lk
+ලංකා
+
+// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK
+// http://nic.lk
+இலங்கை
+
+// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA
+المغرب
+
+// xn--d1alf ("mkd", Macedonian) : MK
+// MARnet
+мкд
+
+// xn--l1acc ("mon", Mongolian) : MN
+мон
+
+// xn--mix891f ("Macao", Chinese, Traditional) : MO
+// MONIC / HNET Asia (Registry Operator for .mo)
+澳門
+
+// xn--mix082f ("Macao", Chinese, Simplified) : MO
+澳门
+
+// xn--mgbx4cd0ab ("Malaysia", Malay) : MY
+مليسيا
+
+// xn--mgb9awbf ("Oman", Arabic) : OM
+عمان
+
+// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK
+پاکستان
+
+// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK
+پاكستان
+
+// xn--ygbi2ammx ("Falasteen", Arabic) : PS
+// The Palestinian National Internet Naming Authority (PNINA)
+// http://www.pnina.ps
+فلسطين
+
+// xn--90a3ac ("srb", Cyrillic) : RS
+// https://www.rnids.rs/en/domains/national-domains
+срб
+пр.срб
+орг.срб
+обр.срб
+од.срб
+упр.срб
+ак.срб
+
+// xn--p1ai ("rf", Russian-Cyrillic) : RU
+// http://www.cctld.ru/en/docs/rulesrf.php
+рф
+
+// xn--wgbl6a ("Qatar", Arabic) : QA
+// http://www.ict.gov.qa/
+قطر
+
+// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA
+// http://www.nic.net.sa/
+السعودية
+
+// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant)  : SA
+السعودیة
+
+// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA
+السعودیۃ
+
+// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA
+السعوديه
+
+// xn--mgbpl2fh ("sudan", Arabic) : SD
+// Operated by .sd registry
+سودان
+
+// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG
+新加坡
+
+// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG
+சிங்கப்பூர்
+
+// xn--ogbpf8fl ("Syria", Arabic) : SY
+سورية
+
+// xn--mgbtf8fl ("Syria", Arabic, variant) : SY
+سوريا
+
+// xn--o3cw4h ("Thai", Thai) : TH
+// http://www.thnic.co.th
+ไทย
+ศึกษา.ไทย
+ธุรกิจ.ไทย
+รัฐบาล.ไทย
+ทหาร.ไทย
+เน็ต.ไทย
+องค์กร.ไทย
+
+// xn--pgbs0dh ("Tunisia", Arabic) : TN
+// http://nic.tn
+تونس
+
+// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW
+// http://www.twnic.net/english/dn/dn_07a.htm
+台灣
+
+// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW
+// http://www.twnic.net/english/dn/dn_07a.htm
+台湾
+
+// xn--nnx388a ("Taiwan", Chinese, variant) : TW
+臺灣
+
+// xn--j1amh ("ukr", Cyrillic) : UA
+укр
+
+// xn--mgb2ddes ("AlYemen", Arabic) : YE
+اليمن
+
+// xxx : http://icmregistry.com
+xxx
+
+// ye : http://www.y.net.ye/services/domain_name.htm
+*.ye
+
+// za : http://www.zadna.org.za/content/page/domain-information
+ac.za
+agric.za
+alt.za
+co.za
+edu.za
+gov.za
+grondar.za
+law.za
+mil.za
+net.za
+ngo.za
+nis.za
+nom.za
+org.za
+school.za
+tm.za
+web.za
+
+// zm : https://zicta.zm/
+// Submitted by registry <info@zicta.zm>
+zm
+ac.zm
+biz.zm
+co.zm
+com.zm
+edu.zm
+gov.zm
+info.zm
+mil.zm
+net.zm
+org.zm
+sch.zm
+
+// zw : https://www.potraz.gov.zw/
+// Confirmed by registry <bmtengwa@potraz.gov.zw> 2017-01-25
+zw
+ac.zw
+co.zw
+gov.zw
+mil.zw
+org.zw
+
+// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2017-02-23T00:46:09Z
+
+// aaa : 2015-02-26 American Automobile Association, Inc.
+aaa
+
+// aarp : 2015-05-21 AARP
+aarp
+
+// abarth : 2015-07-30 Fiat Chrysler Automobiles N.V.
+abarth
+
+// abb : 2014-10-24 ABB Ltd
+abb
+
+// abbott : 2014-07-24 Abbott Laboratories, Inc.
+abbott
+
+// abbvie : 2015-07-30 AbbVie Inc.
+abbvie
+
+// abc : 2015-07-30 Disney Enterprises, Inc.
+abc
+
+// able : 2015-06-25 Able Inc.
+able
+
+// abogado : 2014-04-24 Top Level Domain Holdings Limited
+abogado
+
+// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre
+abudhabi
+
+// academy : 2013-11-07 Half Oaks, LLC
+academy
+
+// accenture : 2014-08-15 Accenture plc
+accenture
+
+// accountant : 2014-11-20 dot Accountant Limited
+accountant
+
+// accountants : 2014-03-20 Knob Town, LLC
+accountants
+
+// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG
+aco
+
+// active : 2014-05-01 The Active Network, Inc
+active
+
+// actor : 2013-12-12 United TLD Holdco Ltd.
+actor
+
+// adac : 2015-07-16 Allgemeiner Deutscher Automobil-Club e.V. (ADAC)
+adac
+
+// ads : 2014-12-04 Charleston Road Registry Inc.
+ads
+
+// adult : 2014-10-16 ICM Registry AD LLC
+adult
+
+// aeg : 2015-03-19 Aktiebolaget Electrolux
+aeg
+
+// aetna : 2015-05-21 Aetna Life Insurance Company
+aetna
+
+// afamilycompany : 2015-07-23 Johnson Shareholdings, Inc.
+afamilycompany
+
+// afl : 2014-10-02 Australian Football League
+afl
+
+// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa
+africa
+
+// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation)
+agakhan
+
+// agency : 2013-11-14 Steel Falls, LLC
+agency
+
+// aig : 2014-12-18 American International Group, Inc.
+aig
+
+// aigo : 2015-08-06 aigo Digital Technology Co,Ltd.
+aigo
+
+// airbus : 2015-07-30 Airbus S.A.S.
+airbus
+
+// airforce : 2014-03-06 United TLD Holdco Ltd.
+airforce
+
+// airtel : 2014-10-24 Bharti Airtel Limited
+airtel
+
+// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation)
+akdn
+
+// alfaromeo : 2015-07-31 Fiat Chrysler Automobiles N.V.
+alfaromeo
+
+// alibaba : 2015-01-15 Alibaba Group Holding Limited
+alibaba
+
+// alipay : 2015-01-15 Alibaba Group Holding Limited
+alipay
+
+// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft
+allfinanz
+
+// allstate : 2015-07-31 Allstate Fire and Casualty Insurance Company
+allstate
+
+// ally : 2015-06-18 Ally Financial Inc.
+ally
+
+// alsace : 2014-07-02 REGION D ALSACE
+alsace
+
+// alstom : 2015-07-30 ALSTOM
+alstom
+
+// americanexpress : 2015-07-31 American Express Travel Related Services Company, Inc.
+americanexpress
+
+// americanfamily : 2015-07-23 AmFam, Inc.
+americanfamily
+
+// amex : 2015-07-31 American Express Travel Related Services Company, Inc.
+amex
+
+// amfam : 2015-07-23 AmFam, Inc.
+amfam
+
+// amica : 2015-05-28 Amica Mutual Insurance Company
+amica
+
+// amsterdam : 2014-07-24 Gemeente Amsterdam
+amsterdam
+
+// analytics : 2014-12-18 Campus IP LLC
+analytics
+
+// android : 2014-08-07 Charleston Road Registry Inc.
+android
+
+// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
+anquan
+
+// anz : 2015-07-31 Australia and New Zealand Banking Group Limited
+anz
+
+// aol : 2015-09-17 AOL Inc.
+aol
+
+// apartments : 2014-12-11 June Maple, LLC
+apartments
+
+// app : 2015-05-14 Charleston Road Registry Inc.
+app
+
+// apple : 2015-05-14 Apple Inc.
+apple
+
+// aquarelle : 2014-07-24 Aquarelle.com
+aquarelle
+
+// arab : 2015-11-12 League of Arab States
+arab
+
+// aramco : 2014-11-20 Aramco Services Company
+aramco
+
+// archi : 2014-02-06 STARTING DOT LIMITED
+archi
+
+// army : 2014-03-06 United TLD Holdco Ltd.
+army
+
+// art : 2016-03-24 UK Creative Ideas Limited
+art
+
+// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E.
+arte
+
+// asda : 2015-07-31 Wal-Mart Stores, Inc.
+asda
+
+// associates : 2014-03-06 Baxter Hill, LLC
+associates
+
+// athleta : 2015-07-30 The Gap, Inc.
+athleta
+
+// attorney : 2014-03-20
+attorney
+
+// auction : 2014-03-20
+auction
+
+// audi : 2015-05-21 AUDI Aktiengesellschaft
+audi
+
+// audible : 2015-06-25 Amazon EU S.à r.l.
+audible
+
+// audio : 2014-03-20 Uniregistry, Corp.
+audio
+
+// auspost : 2015-08-13 Australian Postal Corporation
+auspost
+
+// author : 2014-12-18 Amazon EU S.à r.l.
+author
+
+// auto : 2014-11-13
+auto
+
+// autos : 2014-01-09 DERAutos, LLC
+autos
+
+// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca
+avianca
+
+// aws : 2015-06-25 Amazon EU S.à r.l.
+aws
+
+// axa : 2013-12-19 AXA SA
+axa
+
+// azure : 2014-12-18 Microsoft Corporation
+azure
+
+// baby : 2015-04-09 Johnson & Johnson Services, Inc.
+baby
+
+// baidu : 2015-01-08 Baidu, Inc.
+baidu
+
+// banamex : 2015-07-30 Citigroup Inc.
+banamex
+
+// bananarepublic : 2015-07-31 The Gap, Inc.
+bananarepublic
+
+// band : 2014-06-12
+band
+
+// bank : 2014-09-25 fTLD Registry Services LLC
+bank
+
+// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable
+bar
+
+// barcelona : 2014-07-24 Municipi de Barcelona
+barcelona
+
+// barclaycard : 2014-11-20 Barclays Bank PLC
+barclaycard
+
+// barclays : 2014-11-20 Barclays Bank PLC
+barclays
+
+// barefoot : 2015-06-11 Gallo Vineyards, Inc.
+barefoot
+
+// bargains : 2013-11-14 Half Hallow, LLC
+bargains
+
+// baseball : 2015-10-29 MLB Advanced Media DH, LLC
+baseball
+
+// basketball : 2015-08-20 Fédération Internationale de Basketball (FIBA)
+basketball
+
+// bauhaus : 2014-04-17 Werkhaus GmbH
+bauhaus
+
+// bayern : 2014-01-23 Bayern Connect GmbH
+bayern
+
+// bbc : 2014-12-18 British Broadcasting Corporation
+bbc
+
+// bbt : 2015-07-23 BB&T Corporation
+bbt
+
+// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A.
+bbva
+
+// bcg : 2015-04-02 The Boston Consulting Group, Inc.
+bcg
+
+// bcn : 2014-07-24 Municipi de Barcelona
+bcn
+
+// beats : 2015-05-14 Beats Electronics, LLC
+beats
+
+// beauty : 2015-12-03 L'Oréal
+beauty
+
+// beer : 2014-01-09 Top Level Domain Holdings Limited
+beer
+
+// bentley : 2014-12-18 Bentley Motors Limited
+bentley
+
+// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG
+berlin
+
+// best : 2013-12-19 BestTLD Pty Ltd
+best
+
+// bestbuy : 2015-07-31 BBY Solutions, Inc.
+bestbuy
+
+// bet : 2015-05-07 Afilias plc
+bet
+
+// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited
+bharti
+
+// bible : 2014-06-19 American Bible Society
+bible
+
+// bid : 2013-12-19 dot Bid Limited
+bid
+
+// bike : 2013-08-27 Grand Hollow, LLC
+bike
+
+// bing : 2014-12-18 Microsoft Corporation
+bing
+
+// bingo : 2014-12-04 Sand Cedar, LLC
+bingo
+
+// bio : 2014-03-06 STARTING DOT LIMITED
+bio
+
+// black : 2014-01-16 Afilias Limited
+black
+
+// blackfriday : 2014-01-16 Uniregistry, Corp.
+blackfriday
+
+// blanco : 2015-07-16 BLANCO GmbH + Co KG
+blanco
+
+// blockbuster : 2015-07-30 Dish DBS Corporation
+blockbuster
+
+// blog : 2015-05-14
+blog
+
+// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC
+bloomberg
+
+// blue : 2013-11-07 Afilias Limited
+blue
+
+// bms : 2014-10-30 Bristol-Myers Squibb Company
+bms
+
+// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft
+bmw
+
+// bnl : 2014-07-24 Banca Nazionale del Lavoro
+bnl
+
+// bnpparibas : 2014-05-29 BNP Paribas
+bnpparibas
+
+// boats : 2014-12-04 DERBoats, LLC
+boats
+
+// boehringer : 2015-07-09 Boehringer Ingelheim International GmbH
+boehringer
+
+// bofa : 2015-07-31 NMS Services, Inc.
+bofa
+
+// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br
+bom
+
+// bond : 2014-06-05 Bond University Limited
+bond
+
+// boo : 2014-01-30 Charleston Road Registry Inc.
+boo
+
+// book : 2015-08-27 Amazon EU S.à r.l.
+book
+
+// booking : 2015-07-16 Booking.com B.V.
+booking
+
+// boots : 2015-01-08 THE BOOTS COMPANY PLC
+boots
+
+// bosch : 2015-06-18 Robert Bosch GMBH
+bosch
+
+// bostik : 2015-05-28 Bostik SA
+bostik
+
+// boston : 2015-12-10
+boston
+
+// bot : 2014-12-18 Amazon EU S.à r.l.
+bot
+
+// boutique : 2013-11-14 Over Galley, LLC
+boutique
+
+// box : 2015-11-12 NS1 Limited
+box
+
+// bradesco : 2014-12-18 Banco Bradesco S.A.
+bradesco
+
+// bridgestone : 2014-12-18 Bridgestone Corporation
+bridgestone
+
+// broadway : 2014-12-22 Celebrate Broadway, Inc.
+broadway
+
+// broker : 2014-12-11 IG Group Holdings PLC
+broker
+
+// brother : 2015-01-29 Brother Industries, Ltd.
+brother
+
+// brussels : 2014-02-06 DNS.be vzw
+brussels
+
+// budapest : 2013-11-21 Top Level Domain Holdings Limited
+budapest
+
+// bugatti : 2015-07-23 Bugatti International SA
+bugatti
+
+// build : 2013-11-07 Plan Bee LLC
+build
+
+// builders : 2013-11-07 Atomic Madison, LLC
+builders
+
+// business : 2013-11-07 Spring Cross, LLC
+business
+
+// buy : 2014-12-18 Amazon EU S.à r.l.
+buy
+
+// buzz : 2013-10-02 DOTSTRATEGY CO.
+buzz
+
+// bzh : 2014-02-27 Association www.bzh
+bzh
+
+// cab : 2013-10-24 Half Sunset, LLC
+cab
+
+// cafe : 2015-02-11 Pioneer Canyon, LLC
+cafe
+
+// cal : 2014-07-24 Charleston Road Registry Inc.
+cal
+
+// call : 2014-12-18 Amazon EU S.à r.l.
+call
+
+// calvinklein : 2015-07-30 PVH gTLD Holdings LLC
+calvinklein
+
+// cam : 2016-04-21 AC Webconnecting Holding B.V.
+cam
+
+// camera : 2013-08-27 Atomic Maple, LLC
+camera
+
+// camp : 2013-11-07 Delta Dynamite, LLC
+camp
+
+// cancerresearch : 2014-05-15 Australian Cancer Research Foundation
+cancerresearch
+
+// canon : 2014-09-12 Canon Inc.
+canon
+
+// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry
+capetown
+
+// capital : 2014-03-06 Delta Mill, LLC
+capital
+
+// capitalone : 2015-08-06 Capital One Financial Corporation
+capitalone
+
+// car : 2015-01-22
+car
+
+// caravan : 2013-12-12 Caravan International, Inc.
+caravan
+
+// cards : 2013-12-05 Foggy Hollow, LLC
+cards
+
+// care : 2014-03-06 Goose Cross
+care
+
+// career : 2013-10-09 dotCareer LLC
+career
+
+// careers : 2013-10-02 Wild Corner, LLC
+careers
+
+// cars : 2014-11-13
+cars
+
+// cartier : 2014-06-23 Richemont DNS Inc.
+cartier
+
+// casa : 2013-11-21 Top Level Domain Holdings Limited
+casa
+
+// case : 2015-09-03 CNH Industrial N.V.
+case
+
+// caseih : 2015-09-03 CNH Industrial N.V.
+caseih
+
+// cash : 2014-03-06 Delta Lake, LLC
+cash
+
+// casino : 2014-12-18 Binky Sky, LLC
+casino
+
+// catering : 2013-12-05 New Falls. LLC
+catering
+
+// catholic : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)
+catholic
+
+// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+cba
+
+// cbn : 2014-08-22 The Christian Broadcasting Network, Inc.
+cbn
+
+// cbre : 2015-07-02 CBRE, Inc.
+cbre
+
+// cbs : 2015-08-06 CBS Domains Inc.
+cbs
+
+// ceb : 2015-04-09 The Corporate Executive Board Company
+ceb
+
+// center : 2013-11-07 Tin Mill, LLC
+center
+
+// ceo : 2013-11-07 CEOTLD Pty Ltd
+ceo
+
+// cern : 2014-06-05 European Organization for Nuclear Research ("CERN")
+cern
+
+// cfa : 2014-08-28 CFA Institute
+cfa
+
+// cfd : 2014-12-11 IG Group Holdings PLC
+cfd
+
+// chanel : 2015-04-09 Chanel International B.V.
+chanel
+
+// channel : 2014-05-08 Charleston Road Registry Inc.
+channel
+
+// chase : 2015-04-30 JPMorgan Chase & Co.
+chase
+
+// chat : 2014-12-04 Sand Fields, LLC
+chat
+
+// cheap : 2013-11-14 Sand Cover, LLC
+cheap
+
+// chintai : 2015-06-11 CHINTAI Corporation
+chintai
+
+// chloe : 2014-10-16 Richemont DNS Inc.
+chloe
+
+// christmas : 2013-11-21 Uniregistry, Corp.
+christmas
+
+// chrome : 2014-07-24 Charleston Road Registry Inc.
+chrome
+
+// chrysler : 2015-07-30 FCA US LLC.
+chrysler
+
+// church : 2014-02-06 Holly Fields, LLC
+church
+
+// cipriani : 2015-02-19 Hotel Cipriani Srl
+cipriani
+
+// circle : 2014-12-18 Amazon EU S.à r.l.
+circle
+
+// cisco : 2014-12-22 Cisco Technology, Inc.
+cisco
+
+// citadel : 2015-07-23 Citadel Domain LLC
+citadel
+
+// citi : 2015-07-30 Citigroup Inc.
+citi
+
+// citic : 2014-01-09 CITIC Group Corporation
+citic
+
+// city : 2014-05-29 Snow Sky, LLC
+city
+
+// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc.
+cityeats
+
+// claims : 2014-03-20 Black Corner, LLC
+claims
+
+// cleaning : 2013-12-05 Fox Shadow, LLC
+cleaning
+
+// click : 2014-06-05 Uniregistry, Corp.
+click
+
+// clinic : 2014-03-20 Goose Park, LLC
+clinic
+
+// clinique : 2015-10-01 The Estée Lauder Companies Inc.
+clinique
+
+// clothing : 2013-08-27 Steel Lake, LLC
+clothing
+
+// cloud : 2015-04-16 ARUBA S.p.A.
+cloud
+
+// club : 2013-11-08 .CLUB DOMAINS, LLC
+club
+
+// clubmed : 2015-06-25 Club Méditerranée S.A.
+clubmed
+
+// coach : 2014-10-09 Koko Island, LLC
+coach
+
+// codes : 2013-10-31 Puff Willow, LLC
+codes
+
+// coffee : 2013-10-17 Trixy Cover, LLC
+coffee
+
+// college : 2014-01-16 XYZ.COM LLC
+college
+
+// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH
+cologne
+
+// comcast : 2015-07-23 Comcast IP Holdings I, LLC
+comcast
+
+// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+commbank
+
+// community : 2013-12-05 Fox Orchard, LLC
+community
+
+// company : 2013-11-07 Silver Avenue, LLC
+company
+
+// compare : 2015-10-08 iSelect Ltd
+compare
+
+// computer : 2013-10-24 Pine Mill, LLC
+computer
+
+// comsec : 2015-01-08 VeriSign, Inc.
+comsec
+
+// condos : 2013-12-05 Pine House, LLC
+condos
+
+// construction : 2013-09-16 Fox Dynamite, LLC
+construction
+
+// consulting : 2013-12-05
+consulting
+
+// contact : 2015-01-08 Top Level Spectrum, Inc.
+contact
+
+// contractors : 2013-09-10 Magic Woods, LLC
+contractors
+
+// cooking : 2013-11-21 Top Level Domain Holdings Limited
+cooking
+
+// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc.
+cookingchannel
+
+// cool : 2013-11-14 Koko Lake, LLC
+cool
+
+// corsica : 2014-09-25 Collectivité Territoriale de Corse
+corsica
+
+// country : 2013-12-19 Top Level Domain Holdings Limited
+country
+
+// coupon : 2015-02-26 Amazon EU S.à r.l.
+coupon
+
+// coupons : 2015-03-26 Black Island, LLC
+coupons
+
+// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD
+courses
+
+// credit : 2014-03-20 Snow Shadow, LLC
+credit
+
+// creditcard : 2014-03-20 Binky Frostbite, LLC
+creditcard
+
+// creditunion : 2015-01-22 CUNA Performance Resources, LLC
+creditunion
+
+// cricket : 2014-10-09 dot Cricket Limited
+cricket
+
+// crown : 2014-10-24 Crown Equipment Corporation
+crown
+
+// crs : 2014-04-03 Federated Co-operatives Limited
+crs
+
+// cruise : 2015-12-10 Viking River Cruises (Bermuda) Ltd.
+cruise
+
+// cruises : 2013-12-05 Spring Way, LLC
+cruises
+
+// csc : 2014-09-25 Alliance-One Services, Inc.
+csc
+
+// cuisinella : 2014-04-03 SALM S.A.S.
+cuisinella
+
+// cymru : 2014-05-08 Nominet UK
+cymru
+
+// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd.
+cyou
+
+// dabur : 2014-02-06 Dabur India Limited
+dabur
+
+// dad : 2014-01-23 Charleston Road Registry Inc.
+dad
+
+// dance : 2013-10-24 United TLD Holdco Ltd.
+dance
+
+// data : 2016-06-02 Dish DBS Corporation
+data
+
+// date : 2014-11-20 dot Date Limited
+date
+
+// dating : 2013-12-05 Pine Fest, LLC
+dating
+
+// datsun : 2014-03-27 NISSAN MOTOR CO., LTD.
+datsun
+
+// day : 2014-01-30 Charleston Road Registry Inc.
+day
+
+// dclk : 2014-11-20 Charleston Road Registry Inc.
+dclk
+
+// dds : 2015-05-07 Top Level Domain Holdings Limited
+dds
+
+// deal : 2015-06-25 Amazon EU S.à r.l.
+deal
+
+// dealer : 2014-12-22 Dealer Dot Com, Inc.
+dealer
+
+// deals : 2014-05-22 Sand Sunset, LLC
+deals
+
+// degree : 2014-03-06
+degree
+
+// delivery : 2014-09-11 Steel Station, LLC
+delivery
+
+// dell : 2014-10-24 Dell Inc.
+dell
+
+// deloitte : 2015-07-31 Deloitte Touche Tohmatsu
+deloitte
+
+// delta : 2015-02-19 Delta Air Lines, Inc.
+delta
+
+// democrat : 2013-10-24 United TLD Holdco Ltd.
+democrat
+
+// dental : 2014-03-20 Tin Birch, LLC
+dental
+
+// dentist : 2014-03-20
+dentist
+
+// desi : 2013-11-14 Desi Networks LLC
+desi
+
+// design : 2014-11-07 Top Level Design, LLC
+design
+
+// dev : 2014-10-16 Charleston Road Registry Inc.
+dev
+
+// dhl : 2015-07-23 Deutsche Post AG
+dhl
+
+// diamonds : 2013-09-22 John Edge, LLC
+diamonds
+
+// diet : 2014-06-26 Uniregistry, Corp.
+diet
+
+// digital : 2014-03-06 Dash Park, LLC
+digital
+
+// direct : 2014-04-10 Half Trail, LLC
+direct
+
+// directory : 2013-09-20 Extra Madison, LLC
+directory
+
+// discount : 2014-03-06 Holly Hill, LLC
+discount
+
+// discover : 2015-07-23 Discover Financial Services
+discover
+
+// dish : 2015-07-30 Dish DBS Corporation
+dish
+
+// diy : 2015-11-05 Lifestyle Domain Holdings, Inc.
+diy
+
+// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd.
+dnp
+
+// docs : 2014-10-16 Charleston Road Registry Inc.
+docs
+
+// doctor : 2016-06-02 Brice Trail, LLC
+doctor
+
+// dodge : 2015-07-30 FCA US LLC.
+dodge
+
+// dog : 2014-12-04 Koko Mill, LLC
+dog
+
+// doha : 2014-09-18 Communications Regulatory Authority (CRA)
+doha
+
+// domains : 2013-10-17 Sugar Cross, LLC
+domains
+
+// dot : 2015-05-21 Dish DBS Corporation
+dot
+
+// download : 2014-11-20 dot Support Limited
+download
+
+// drive : 2015-03-05 Charleston Road Registry Inc.
+drive
+
+// dtv : 2015-06-04 Dish DBS Corporation
+dtv
+
+// dubai : 2015-01-01 Dubai Smart Government Department
+dubai
+
+// duck : 2015-07-23 Johnson Shareholdings, Inc.
+duck
+
+// dunlop : 2015-07-02 The Goodyear Tire & Rubber Company
+dunlop
+
+// duns : 2015-08-06 The Dun & Bradstreet Corporation
+duns
+
+// dupont : 2015-06-25 E. I. du Pont de Nemours and Company
+dupont
+
+// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry
+durban
+
+// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+dvag
+
+// dvr : 2016-05-26 Hughes Satellite Systems Corporation
+dvr
+
+// earth : 2014-12-04 Interlink Co., Ltd.
+earth
+
+// eat : 2014-01-23 Charleston Road Registry Inc.
+eat
+
+// eco : 2016-07-08 Big Room Inc.
+eco
+
+// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V.
+edeka
+
+// education : 2013-11-07 Brice Way, LLC
+education
+
+// email : 2013-10-31 Spring Madison, LLC
+email
+
+// emerck : 2014-04-03 Merck KGaA
+emerck
+
+// energy : 2014-09-11 Binky Birch, LLC
+energy
+
+// engineer : 2014-03-06 United TLD Holdco Ltd.
+engineer
+
+// engineering : 2014-03-06 Romeo Canyon
+engineering
+
+// enterprises : 2013-09-20 Snow Oaks, LLC
+enterprises
+
+// epost : 2015-07-23 Deutsche Post AG
+epost
+
+// epson : 2014-12-04 Seiko Epson Corporation
+epson
+
+// equipment : 2013-08-27 Corn Station, LLC
+equipment
+
+// ericsson : 2015-07-09 Telefonaktiebolaget L M Ericsson
+ericsson
+
+// erni : 2014-04-03 ERNI Group Holding AG
+erni
+
+// esq : 2014-05-08 Charleston Road Registry Inc.
+esq
+
+// estate : 2013-08-27 Trixy Park, LLC
+estate
+
+// esurance : 2015-07-23 Esurance Insurance Company
+esurance
+
+// etisalat : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat)
+etisalat
+
+// eurovision : 2014-04-24 European Broadcasting Union (EBU)
+eurovision
+
+// eus : 2013-12-12 Puntueus Fundazioa
+eus
+
+// events : 2013-12-05 Pioneer Maple, LLC
+events
+
+// everbank : 2014-05-15 EverBank
+everbank
+
+// exchange : 2014-03-06 Spring Falls, LLC
+exchange
+
+// expert : 2013-11-21 Magic Pass, LLC
+expert
+
+// exposed : 2013-12-05 Victor Beach, LLC
+exposed
+
+// express : 2015-02-11 Sea Sunset, LLC
+express
+
+// extraspace : 2015-05-14 Extra Space Storage LLC
+extraspace
+
+// fage : 2014-12-18 Fage International S.A.
+fage
+
+// fail : 2014-03-06 Atomic Pipe, LLC
+fail
+
+// fairwinds : 2014-11-13 FairWinds Partners, LLC
+fairwinds
+
+// faith : 2014-11-20 dot Faith Limited
+faith
+
+// family : 2015-04-02
+family
+
+// fan : 2014-03-06
+fan
+
+// fans : 2014-11-07 Asiamix Digital Limited
+fans
+
+// farm : 2013-11-07 Just Maple, LLC
+farm
+
+// farmers : 2015-07-09 Farmers Insurance Exchange
+farmers
+
+// fashion : 2014-07-03 Top Level Domain Holdings Limited
+fashion
+
+// fast : 2014-12-18 Amazon EU S.à r.l.
+fast
+
+// fedex : 2015-08-06 Federal Express Corporation
+fedex
+
+// feedback : 2013-12-19 Top Level Spectrum, Inc.
+feedback
+
+// ferrari : 2015-07-31 Fiat Chrysler Automobiles N.V.
+ferrari
+
+// ferrero : 2014-12-18 Ferrero Trading Lux S.A.
+ferrero
+
+// fiat : 2015-07-31 Fiat Chrysler Automobiles N.V.
+fiat
+
+// fidelity : 2015-07-30 Fidelity Brokerage Services LLC
+fidelity
+
+// fido : 2015-08-06 Rogers Communications Partnership
+fido
+
+// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd
+film
+
+// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br
+final
+
+// finance : 2014-03-20 Cotton Cypress, LLC
+finance
+
+// financial : 2014-03-06 Just Cover, LLC
+financial
+
+// fire : 2015-06-25 Amazon EU S.à r.l.
+fire
+
+// firestone : 2014-12-18 Bridgestone Corporation
+firestone
+
+// firmdale : 2014-03-27 Firmdale Holdings Limited
+firmdale
+
+// fish : 2013-12-12 Fox Woods, LLC
+fish
+
+// fishing : 2013-11-21 Top Level Domain Holdings Limited
+fishing
+
+// fit : 2014-11-07 Top Level Domain Holdings Limited
+fit
+
+// fitness : 2014-03-06 Brice Orchard, LLC
+fitness
+
+// flickr : 2015-04-02 Yahoo! Domain Services Inc.
+flickr
+
+// flights : 2013-12-05 Fox Station, LLC
+flights
+
+// flir : 2015-07-23 FLIR Systems, Inc.
+flir
+
+// florist : 2013-11-07 Half Cypress, LLC
+florist
+
+// flowers : 2014-10-09 Uniregistry, Corp.
+flowers
+
+// fly : 2014-05-08 Charleston Road Registry Inc.
+fly
+
+// foo : 2014-01-23 Charleston Road Registry Inc.
+foo
+
+// food : 2016-04-21 Lifestyle Domain Holdings, Inc.
+food
+
+// foodnetwork : 2015-07-02 Lifestyle Domain Holdings, Inc.
+foodnetwork
+
+// football : 2014-12-18 Foggy Farms, LLC
+football
+
+// ford : 2014-11-13 Ford Motor Company
+ford
+
+// forex : 2014-12-11 IG Group Holdings PLC
+forex
+
+// forsale : 2014-05-22
+forsale
+
+// forum : 2015-04-02 Fegistry, LLC
+forum
+
+// foundation : 2013-12-05 John Dale, LLC
+foundation
+
+// fox : 2015-09-11 FOX Registry, LLC
+fox
+
+// free : 2015-12-10 Amazon EU S.à r.l.
+free
+
+// fresenius : 2015-07-30 Fresenius Immobilien-Verwaltungs-GmbH
+fresenius
+
+// frl : 2014-05-15 FRLregistry B.V.
+frl
+
+// frogans : 2013-12-19 OP3FT
+frogans
+
+// frontdoor : 2015-07-02 Lifestyle Domain Holdings, Inc.
+frontdoor
+
+// frontier : 2015-02-05 Frontier Communications Corporation
+frontier
+
+// ftr : 2015-07-16 Frontier Communications Corporation
+ftr
+
+// fujitsu : 2015-07-30 Fujitsu Limited
+fujitsu
+
+// fujixerox : 2015-07-23 Xerox DNHC LLC
+fujixerox
+
+// fun : 2016-01-14
+fun
+
+// fund : 2014-03-20 John Castle, LLC
+fund
+
+// furniture : 2014-03-20 Lone Fields, LLC
+furniture
+
+// futbol : 2013-09-20
+futbol
+
+// fyi : 2015-04-02 Silver Tigers, LLC
+fyi
+
+// gal : 2013-11-07 Asociación puntoGAL
+gal
+
+// gallery : 2013-09-13 Sugar House, LLC
+gallery
+
+// gallo : 2015-06-11 Gallo Vineyards, Inc.
+gallo
+
+// gallup : 2015-02-19 Gallup, Inc.
+gallup
+
+// game : 2015-05-28 Uniregistry, Corp.
+game
+
+// games : 2015-05-28
+games
+
+// gap : 2015-07-31 The Gap, Inc.
+gap
+
+// garden : 2014-06-26 Top Level Domain Holdings Limited
+garden
+
+// gbiz : 2014-07-17 Charleston Road Registry Inc.
+gbiz
+
+// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems"
+gdn
+
+// gea : 2014-12-04 GEA Group Aktiengesellschaft
+gea
+
+// gent : 2014-01-23 COMBELL GROUP NV/SA
+gent
+
+// genting : 2015-03-12 Resorts World Inc Pte. Ltd.
+genting
+
+// george : 2015-07-31 Wal-Mart Stores, Inc.
+george
+
+// ggee : 2014-01-09 GMO Internet, Inc.
+ggee
+
+// gift : 2013-10-17 Uniregistry, Corp.
+gift
+
+// gifts : 2014-07-03 Goose Sky, LLC
+gifts
+
+// gives : 2014-03-06 United TLD Holdco Ltd.
+gives
+
+// giving : 2014-11-13 Giving Limited
+giving
+
+// glade : 2015-07-23 Johnson Shareholdings, Inc.
+glade
+
+// glass : 2013-11-07 Black Cover, LLC
+glass
+
+// gle : 2014-07-24 Charleston Road Registry Inc.
+gle
+
+// global : 2014-04-17 Dot GLOBAL AS
+global
+
+// globo : 2013-12-19 Globo Comunicação e Participações S.A
+globo
+
+// gmail : 2014-05-01 Charleston Road Registry Inc.
+gmail
+
+// gmbh : 2016-01-29 Extra Dynamite, LLC
+gmbh
+
+// gmo : 2014-01-09 GMO Internet, Inc.
+gmo
+
+// gmx : 2014-04-24 1&1 Mail & Media GmbH
+gmx
+
+// godaddy : 2015-07-23 Go Daddy East, LLC
+godaddy
+
+// gold : 2015-01-22 June Edge, LLC
+gold
+
+// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD.
+goldpoint
+
+// golf : 2014-12-18 Lone falls, LLC
+golf
+
+// goo : 2014-12-18 NTT Resonant Inc.
+goo
+
+// goodhands : 2015-07-31 Allstate Fire and Casualty Insurance Company
+goodhands
+
+// goodyear : 2015-07-02 The Goodyear Tire & Rubber Company
+goodyear
+
+// goog : 2014-11-20 Charleston Road Registry Inc.
+goog
+
+// google : 2014-07-24 Charleston Road Registry Inc.
+google
+
+// gop : 2014-01-16 Republican State Leadership Committee, Inc.
+gop
+
+// got : 2014-12-18 Amazon EU S.à r.l.
+got
+
+// grainger : 2015-05-07 Grainger Registry Services, LLC
+grainger
+
+// graphics : 2013-09-13 Over Madison, LLC
+graphics
+
+// gratis : 2014-03-20 Pioneer Tigers, LLC
+gratis
+
+// green : 2014-05-08 Afilias Limited
+green
+
+// gripe : 2014-03-06 Corn Sunset, LLC
+gripe
+
+// grocery : 2016-06-16 Wal-Mart Stores, Inc.
+grocery
+
+// group : 2014-08-15 Romeo Town, LLC
+group
+
+// guardian : 2015-07-30 The Guardian Life Insurance Company of America
+guardian
+
+// gucci : 2014-11-13 Guccio Gucci S.p.a.
+gucci
+
+// guge : 2014-08-28 Charleston Road Registry Inc.
+guge
+
+// guide : 2013-09-13 Snow Moon, LLC
+guide
+
+// guitars : 2013-11-14 Uniregistry, Corp.
+guitars
+
+// guru : 2013-08-27 Pioneer Cypress, LLC
+guru
+
+// hair : 2015-12-03 L'Oréal
+hair
+
+// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH
+hamburg
+
+// hangout : 2014-11-13 Charleston Road Registry Inc.
+hangout
+
+// haus : 2013-12-05
+haus
+
+// hbo : 2015-07-30 HBO Registry Services, Inc.
+hbo
+
+// hdfc : 2015-07-30 HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED
+hdfc
+
+// hdfcbank : 2015-02-12 HDFC Bank Limited
+hdfcbank
+
+// health : 2015-02-11 DotHealth, LLC
+health
+
+// healthcare : 2014-06-12 Silver Glen, LLC
+healthcare
+
+// help : 2014-06-26 Uniregistry, Corp.
+help
+
+// helsinki : 2015-02-05 City of Helsinki
+helsinki
+
+// here : 2014-02-06 Charleston Road Registry Inc.
+here
+
+// hermes : 2014-07-10 HERMES INTERNATIONAL
+hermes
+
+// hgtv : 2015-07-02 Lifestyle Domain Holdings, Inc.
+hgtv
+
+// hiphop : 2014-03-06 Uniregistry, Corp.
+hiphop
+
+// hisamitsu : 2015-07-16 Hisamitsu Pharmaceutical Co.,Inc.
+hisamitsu
+
+// hitachi : 2014-10-31 Hitachi, Ltd.
+hitachi
+
+// hiv : 2014-03-13
+hiv
+
+// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited
+hkt
+
+// hockey : 2015-03-19 Half Willow, LLC
+hockey
+
+// holdings : 2013-08-27 John Madison, LLC
+holdings
+
+// holiday : 2013-11-07 Goose Woods, LLC
+holiday
+
+// homedepot : 2015-04-02 Homer TLC, Inc.
+homedepot
+
+// homegoods : 2015-07-16 The TJX Companies, Inc.
+homegoods
+
+// homes : 2014-01-09 DERHomes, LLC
+homes
+
+// homesense : 2015-07-16 The TJX Companies, Inc.
+homesense
+
+// honda : 2014-12-18 Honda Motor Co., Ltd.
+honda
+
+// honeywell : 2015-07-23 Honeywell GTLD LLC
+honeywell
+
+// horse : 2013-11-21 Top Level Domain Holdings Limited
+horse
+
+// hospital : 2016-10-20 Ruby Pike, LLC
+hospital
+
+// host : 2014-04-17 DotHost Inc.
+host
+
+// hosting : 2014-05-29 Uniregistry, Corp.
+hosting
+
+// hot : 2015-08-27 Amazon EU S.à r.l.
+hot
+
+// hoteles : 2015-03-05 Travel Reservations SRL
+hoteles
+
+// hotels : 2016-04-07 Booking.com B.V.
+hotels
+
+// hotmail : 2014-12-18 Microsoft Corporation
+hotmail
+
+// house : 2013-11-07 Sugar Park, LLC
+house
+
+// how : 2014-01-23 Charleston Road Registry Inc.
+how
+
+// hsbc : 2014-10-24 HSBC Holdings PLC
+hsbc
+
+// htc : 2015-04-02 HTC corporation
+htc
+
+// hughes : 2015-07-30 Hughes Satellite Systems Corporation
+hughes
+
+// hyatt : 2015-07-30 Hyatt GTLD, L.L.C.
+hyatt
+
+// hyundai : 2015-07-09 Hyundai Motor Company
+hyundai
+
+// ibm : 2014-07-31 International Business Machines Corporation
+ibm
+
+// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited
+icbc
+
+// ice : 2014-10-30 IntercontinentalExchange, Inc.
+ice
+
+// icu : 2015-01-08 One.com A/S
+icu
+
+// ieee : 2015-07-23 IEEE Global LLC
+ieee
+
+// ifm : 2014-01-30 ifm electronic gmbh
+ifm
+
+// ikano : 2015-07-09 Ikano S.A.
+ikano
+
+// imamat : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation)
+imamat
+
+// imdb : 2015-06-25 Amazon EU S.à r.l.
+imdb
+
+// immo : 2014-07-10 Auburn Bloom, LLC
+immo
+
+// immobilien : 2013-11-07 United TLD Holdco Ltd.
+immobilien
+
+// industries : 2013-12-05 Outer House, LLC
+industries
+
+// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD.
+infiniti
+
+// ing : 2014-01-23 Charleston Road Registry Inc.
+ing
+
+// ink : 2013-12-05 Top Level Design, LLC
+ink
+
+// institute : 2013-11-07 Outer Maple, LLC
+institute
+
+// insurance : 2015-02-19 fTLD Registry Services LLC
+insurance
+
+// insure : 2014-03-20 Pioneer Willow, LLC
+insure
+
+// intel : 2015-08-06 Intel Corporation
+intel
+
+// international : 2013-11-07 Wild Way, LLC
+international
+
+// intuit : 2015-07-30 Intuit Administrative Services, Inc.
+intuit
+
+// investments : 2014-03-20 Holly Glen, LLC
+investments
+
+// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A.
+ipiranga
+
+// irish : 2014-08-07 Dot-Irish LLC
+irish
+
+// iselect : 2015-02-11 iSelect Ltd
+iselect
+
+// ismaili : 2015-08-06 Fondation Aga Khan (Aga Khan Foundation)
+ismaili
+
+// ist : 2014-08-28 Istanbul Metropolitan Municipality
+ist
+
+// istanbul : 2014-08-28 Istanbul Metropolitan Municipality
+istanbul
+
+// itau : 2014-10-02 Itau Unibanco Holding S.A.
+itau
+
+// itv : 2015-07-09 ITV Services Limited
+itv
+
+// iveco : 2015-09-03 CNH Industrial N.V.
+iveco
+
+// iwc : 2014-06-23 Richemont DNS Inc.
+iwc
+
+// jaguar : 2014-11-13 Jaguar Land Rover Ltd
+jaguar
+
+// java : 2014-06-19 Oracle Corporation
+java
+
+// jcb : 2014-11-20 JCB Co., Ltd.
+jcb
+
+// jcp : 2015-04-23 JCP Media, Inc.
+jcp
+
+// jeep : 2015-07-30 FCA US LLC.
+jeep
+
+// jetzt : 2014-01-09
+jetzt
+
+// jewelry : 2015-03-05 Wild Bloom, LLC
+jewelry
+
+// jio : 2015-04-02 Affinity Names, Inc.
+jio
+
+// jlc : 2014-12-04 Richemont DNS Inc.
+jlc
+
+// jll : 2015-04-02 Jones Lang LaSalle Incorporated
+jll
+
+// jmp : 2015-03-26 Matrix IP LLC
+jmp
+
+// jnj : 2015-06-18 Johnson & Johnson Services, Inc.
+jnj
+
+// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry
+joburg
+
+// jot : 2014-12-18 Amazon EU S.à r.l.
+jot
+
+// joy : 2014-12-18 Amazon EU S.à r.l.
+joy
+
+// jpmorgan : 2015-04-30 JPMorgan Chase & Co.
+jpmorgan
+
+// jprs : 2014-09-18 Japan Registry Services Co., Ltd.
+jprs
+
+// juegos : 2014-03-20 Uniregistry, Corp.
+juegos
+
+// juniper : 2015-07-30 JUNIPER NETWORKS, INC.
+juniper
+
+// kaufen : 2013-11-07 United TLD Holdco Ltd.
+kaufen
+
+// kddi : 2014-09-12 KDDI CORPORATION
+kddi
+
+// kerryhotels : 2015-04-30 Kerry Trading Co. Limited
+kerryhotels
+
+// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited
+kerrylogistics
+
+// kerryproperties : 2015-04-09 Kerry Trading Co. Limited
+kerryproperties
+
+// kfh : 2014-12-04 Kuwait Finance House
+kfh
+
+// kia : 2015-07-09 KIA MOTORS CORPORATION
+kia
+
+// kim : 2013-09-23 Afilias Limited
+kim
+
+// kinder : 2014-11-07 Ferrero Trading Lux S.A.
+kinder
+
+// kindle : 2015-06-25 Amazon EU S.à r.l.
+kindle
+
+// kitchen : 2013-09-20 Just Goodbye, LLC
+kitchen
+
+// kiwi : 2013-09-20 DOT KIWI LIMITED
+kiwi
+
+// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH
+koeln
+
+// komatsu : 2015-01-08 Komatsu Ltd.
+komatsu
+
+// kosher : 2015-08-20 Kosher Marketing Assets LLC
+kosher
+
+// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft)
+kpmg
+
+// kpn : 2015-01-08 Koninklijke KPN N.V.
+kpn
+
+// krd : 2013-12-05 KRG Department of Information Technology
+krd
+
+// kred : 2013-12-19 KredTLD Pty Ltd
+kred
+
+// kuokgroup : 2015-04-09 Kerry Trading Co. Limited
+kuokgroup
+
+// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen
+kyoto
+
+// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA
+lacaixa
+
+// ladbrokes : 2015-08-06 LADBROKES INTERNATIONAL PLC
+ladbrokes
+
+// lamborghini : 2015-06-04 Automobili Lamborghini S.p.A.
+lamborghini
+
+// lamer : 2015-10-01 The Estée Lauder Companies Inc.
+lamer
+
+// lancaster : 2015-02-12 LANCASTER
+lancaster
+
+// lancia : 2015-07-31 Fiat Chrysler Automobiles N.V.
+lancia
+
+// lancome : 2015-07-23 L'Oréal
+lancome
+
+// land : 2013-09-10 Pine Moon, LLC
+land
+
+// landrover : 2014-11-13 Jaguar Land Rover Ltd
+landrover
+
+// lanxess : 2015-07-30 LANXESS Corporation
+lanxess
+
+// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated
+lasalle
+
+// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico
+lat
+
+// latino : 2015-07-30 Dish DBS Corporation
+latino
+
+// latrobe : 2014-06-16 La Trobe University
+latrobe
+
+// law : 2015-01-22 Minds + Machines Group Limited
+law
+
+// lawyer : 2014-03-20
+lawyer
+
+// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant")
+lds
+
+// lease : 2014-03-06 Victor Trail, LLC
+lease
+
+// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc
+leclerc
+
+// lefrak : 2015-07-16 LeFrak Organization, Inc.
+lefrak
+
+// legal : 2014-10-16 Blue Falls, LLC
+legal
+
+// lego : 2015-07-16 LEGO Juris A/S
+lego
+
+// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION
+lexus
+
+// lgbt : 2014-05-08 Afilias Limited
+lgbt
+
+// liaison : 2014-10-02 Liaison Technologies, Incorporated
+liaison
+
+// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG
+lidl
+
+// life : 2014-02-06 Trixy Oaks, LLC
+life
+
+// lifeinsurance : 2015-01-15 American Council of Life Insurers
+lifeinsurance
+
+// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc.
+lifestyle
+
+// lighting : 2013-08-27 John McCook, LLC
+lighting
+
+// like : 2014-12-18 Amazon EU S.à r.l.
+like
+
+// lilly : 2015-07-31 Eli Lilly and Company
+lilly
+
+// limited : 2014-03-06 Big Fest, LLC
+limited
+
+// limo : 2013-10-17 Hidden Frostbite, LLC
+limo
+
+// lincoln : 2014-11-13 Ford Motor Company
+lincoln
+
+// linde : 2014-12-04 Linde Aktiengesellschaft
+linde
+
+// link : 2013-11-14 Uniregistry, Corp.
+link
+
+// lipsy : 2015-06-25 Lipsy Ltd
+lipsy
+
+// live : 2014-12-04
+live
+
+// living : 2015-07-30 Lifestyle Domain Holdings, Inc.
+living
+
+// lixil : 2015-03-19 LIXIL Group Corporation
+lixil
+
+// loan : 2014-11-20 dot Loan Limited
+loan
+
+// loans : 2014-03-20 June Woods, LLC
+loans
+
+// locker : 2015-06-04 Dish DBS Corporation
+locker
+
+// locus : 2015-06-25 Locus Analytics LLC
+locus
+
+// loft : 2015-07-30 Annco, Inc.
+loft
+
+// lol : 2015-01-30 Uniregistry, Corp.
+lol
+
+// london : 2013-11-14 Dot London Domains Limited
+london
+
+// lotte : 2014-11-07 Lotte Holdings Co., Ltd.
+lotte
+
+// lotto : 2014-04-10 Afilias Limited
+lotto
+
+// love : 2014-12-22 Merchant Law Group LLP
+love
+
+// lpl : 2015-07-30 LPL Holdings, Inc.
+lpl
+
+// lplfinancial : 2015-07-30 LPL Holdings, Inc.
+lplfinancial
+
+// ltd : 2014-09-25 Over Corner, LLC
+ltd
+
+// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA
+ltda
+
+// lundbeck : 2015-08-06 H. Lundbeck A/S
+lundbeck
+
+// lupin : 2014-11-07 LUPIN LIMITED
+lupin
+
+// luxe : 2014-01-09 Top Level Domain Holdings Limited
+luxe
+
+// luxury : 2013-10-17 Luxury Partners, LLC
+luxury
+
+// macys : 2015-07-31 Macys, Inc.
+macys
+
+// madrid : 2014-05-01 Comunidad de Madrid
+madrid
+
+// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF)
+maif
+
+// maison : 2013-12-05 Victor Frostbite, LLC
+maison
+
+// makeup : 2015-01-15 L'Oréal
+makeup
+
+// man : 2014-12-04 MAN SE
+man
+
+// management : 2013-11-07 John Goodbye, LLC
+management
+
+// mango : 2013-10-24 PUNTO FA S.L.
+mango
+
+// map : 2016-06-09 Charleston Road Registry Inc.
+map
+
+// market : 2014-03-06
+market
+
+// marketing : 2013-11-07 Fern Pass, LLC
+marketing
+
+// markets : 2014-12-11 IG Group Holdings PLC
+markets
+
+// marriott : 2014-10-09 Marriott Worldwide Corporation
+marriott
+
+// marshalls : 2015-07-16 The TJX Companies, Inc.
+marshalls
+
+// maserati : 2015-07-31 Fiat Chrysler Automobiles N.V.
+maserati
+
+// mattel : 2015-08-06 Mattel Sites, Inc.
+mattel
+
+// mba : 2015-04-02 Lone Hollow, LLC
+mba
+
+// mcd : 2015-07-30 McDonald’s Corporation
+mcd
+
+// mcdonalds : 2015-07-30 McDonald’s Corporation
+mcdonalds
+
+// mckinsey : 2015-07-31 McKinsey Holdings, Inc.
+mckinsey
+
+// med : 2015-08-06 Medistry LLC
+med
+
+// media : 2014-03-06 Grand Glen, LLC
+media
+
+// meet : 2014-01-16
+meet
+
+// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation
+melbourne
+
+// meme : 2014-01-30 Charleston Road Registry Inc.
+meme
+
+// memorial : 2014-10-16 Dog Beach, LLC
+memorial
+
+// men : 2015-02-26 Exclusive Registry Limited
+men
+
+// menu : 2013-09-11 Wedding TLD2, LLC
+menu
+
+// meo : 2014-11-07 PT Comunicacoes S.A.
+meo
+
+// merckmsd : 2016-07-14 MSD Registry Holdings, Inc.
+merckmsd
+
+// metlife : 2015-05-07 MetLife Services and Solutions, LLC
+metlife
+
+// miami : 2013-12-19 Top Level Domain Holdings Limited
+miami
+
+// microsoft : 2014-12-18 Microsoft Corporation
+microsoft
+
+// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft
+mini
+
+// mint : 2015-07-30 Intuit Administrative Services, Inc.
+mint
+
+// mit : 2015-07-02 Massachusetts Institute of Technology
+mit
+
+// mitsubishi : 2015-07-23 Mitsubishi Corporation
+mitsubishi
+
+// mlb : 2015-05-21 MLB Advanced Media DH, LLC
+mlb
+
+// mls : 2015-04-23 The Canadian Real Estate Association
+mls
+
+// mma : 2014-11-07 MMA IARD
+mma
+
+// mobile : 2016-06-02 Dish DBS Corporation
+mobile
+
+// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L.
+mobily
+
+// moda : 2013-11-07 United TLD Holdco Ltd.
+moda
+
+// moe : 2013-11-13 Interlink Co., Ltd.
+moe
+
+// moi : 2014-12-18 Amazon EU S.à r.l.
+moi
+
+// mom : 2015-04-16 Uniregistry, Corp.
+mom
+
+// monash : 2013-09-30 Monash University
+monash
+
+// money : 2014-10-16 Outer McCook, LLC
+money
+
+// monster : 2015-09-11 Monster Worldwide, Inc.
+monster
+
+// montblanc : 2014-06-23 Richemont DNS Inc.
+montblanc
+
+// mopar : 2015-07-30 FCA US LLC.
+mopar
+
+// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant")
+mormon
+
+// mortgage : 2014-03-20
+mortgage
+
+// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)
+moscow
+
+// moto : 2015-06-04
+moto
+
+// motorcycles : 2014-01-09 DERMotorcycles, LLC
+motorcycles
+
+// mov : 2014-01-30 Charleston Road Registry Inc.
+mov
+
+// movie : 2015-02-05 New Frostbite, LLC
+movie
+
+// movistar : 2014-10-16 Telefónica S.A.
+movistar
+
+// msd : 2015-07-23 MSD Registry Holdings, Inc.
+msd
+
+// mtn : 2014-12-04 MTN Dubai Limited
+mtn
+
+// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation
+mtpc
+
+// mtr : 2015-03-12 MTR Corporation Limited
+mtr
+
+// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC
+mutual
+
+// nab : 2015-08-20 National Australia Bank Limited
+nab
+
+// nadex : 2014-12-11 IG Group Holdings PLC
+nadex
+
+// nagoya : 2013-10-24 GMO Registry, Inc.
+nagoya
+
+// nationwide : 2015-07-23 Nationwide Mutual Insurance Company
+nationwide
+
+// natura : 2015-03-12 NATURA COSMÉTICOS S.A.
+natura
+
+// navy : 2014-03-06 United TLD Holdco Ltd.
+navy
+
+// nba : 2015-07-31 NBA REGISTRY, LLC
+nba
+
+// nec : 2015-01-08 NEC Corporation
+nec
+
+// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
+netbank
+
+// netflix : 2015-06-18 Netflix, Inc.
+netflix
+
+// network : 2013-11-14 Trixy Manor, LLC
+network
+
+// neustar : 2013-12-05 NeuStar, Inc.
+neustar
+
+// new : 2014-01-30 Charleston Road Registry Inc.
+new
+
+// newholland : 2015-09-03 CNH Industrial N.V.
+newholland
+
+// news : 2014-12-18
+news
+
+// next : 2015-06-18 Next plc
+next
+
+// nextdirect : 2015-06-18 Next plc
+nextdirect
+
+// nexus : 2014-07-24 Charleston Road Registry Inc.
+nexus
+
+// nfl : 2015-07-23 NFL Reg Ops LLC
+nfl
+
+// ngo : 2014-03-06 Public Interest Registry
+ngo
+
+// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK)
+nhk
+
+// nico : 2014-12-04 DWANGO Co., Ltd.
+nico
+
+// nike : 2015-07-23 NIKE, Inc.
+nike
+
+// nikon : 2015-05-21 NIKON CORPORATION
+nikon
+
+// ninja : 2013-11-07 United TLD Holdco Ltd.
+ninja
+
+// nissan : 2014-03-27 NISSAN MOTOR CO., LTD.
+nissan
+
+// nissay : 2015-10-29 Nippon Life Insurance Company
+nissay
+
+// nokia : 2015-01-08 Nokia Corporation
+nokia
+
+// northwesternmutual : 2015-06-18 Northwestern Mutual Registry, LLC
+northwesternmutual
+
+// norton : 2014-12-04 Symantec Corporation
+norton
+
+// now : 2015-06-25 Amazon EU S.à r.l.
+now
+
+// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+nowruz
+
+// nowtv : 2015-05-14 Starbucks (HK) Limited
+nowtv
+
+// nra : 2014-05-22 NRA Holdings Company, INC.
+nra
+
+// nrw : 2013-11-21 Minds + Machines GmbH
+nrw
+
+// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
+ntt
+
+// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications
+nyc
+
+// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA
+obi
+
+// observer : 2015-04-30
+observer
+
+// off : 2015-07-23 Johnson Shareholdings, Inc.
+off
+
+// office : 2015-03-12 Microsoft Corporation
+office
+
+// okinawa : 2013-12-05 BusinessRalliart Inc.
+okinawa
+
+// olayan : 2015-05-14 Crescent Holding GmbH
+olayan
+
+// olayangroup : 2015-05-14 Crescent Holding GmbH
+olayangroup
+
+// oldnavy : 2015-07-31 The Gap, Inc.
+oldnavy
+
+// ollo : 2015-06-04 Dish DBS Corporation
+ollo
+
+// omega : 2015-01-08 The Swatch Group Ltd
+omega
+
+// one : 2014-11-07 One.com A/S
+one
+
+// ong : 2014-03-06 Public Interest Registry
+ong
+
+// onl : 2013-09-16 I-Registry Ltd.
+onl
+
+// online : 2015-01-15 DotOnline Inc.
+online
+
+// onyourside : 2015-07-23 Nationwide Mutual Insurance Company
+onyourside
+
+// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED
+ooo
+
+// open : 2015-07-31 American Express Travel Related Services Company, Inc.
+open
+
+// oracle : 2014-06-19 Oracle Corporation
+oracle
+
+// orange : 2015-03-12 Orange Brand Services Limited
+orange
+
+// organic : 2014-03-27 Afilias Limited
+organic
+
+// origins : 2015-10-01 The Estée Lauder Companies Inc.
+origins
+
+// osaka : 2014-09-04 Interlink Co., Ltd.
+osaka
+
+// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd.
+otsuka
+
+// ott : 2015-06-04 Dish DBS Corporation
+ott
+
+// ovh : 2014-01-16 OVH SAS
+ovh
+
+// page : 2014-12-04 Charleston Road Registry Inc.
+page
+
+// pamperedchef : 2015-02-05 The Pampered Chef, Ltd.
+pamperedchef
+
+// panasonic : 2015-07-30 Panasonic Corporation
+panasonic
+
+// panerai : 2014-11-07 Richemont DNS Inc.
+panerai
+
+// paris : 2014-01-30 City of Paris
+paris
+
+// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+pars
+
+// partners : 2013-12-05 Magic Glen, LLC
+partners
+
+// parts : 2013-12-05 Sea Goodbye, LLC
+parts
+
+// party : 2014-09-11 Blue Sky Registry Limited
+party
+
+// passagens : 2015-03-05 Travel Reservations SRL
+passagens
+
+// pay : 2015-08-27 Amazon EU S.à r.l.
+pay
+
+// pccw : 2015-05-14 PCCW Enterprises Limited
+pccw
+
+// pet : 2015-05-07 Afilias plc
+pet
+
+// pfizer : 2015-09-11 Pfizer Inc.
+pfizer
+
+// pharmacy : 2014-06-19 National Association of Boards of Pharmacy
+pharmacy
+
+// phd : 2016-07-28 Charleston Road Registry Inc.
+phd
+
+// philips : 2014-11-07 Koninklijke Philips N.V.
+philips
+
+// phone : 2016-06-02 Dish DBS Corporation
+phone
+
+// photo : 2013-11-14 Uniregistry, Corp.
+photo
+
+// photography : 2013-09-20 Sugar Glen, LLC
+photography
+
+// photos : 2013-10-17 Sea Corner, LLC
+photos
+
+// physio : 2014-05-01 PhysBiz Pty Ltd
+physio
+
+// piaget : 2014-10-16 Richemont DNS Inc.
+piaget
+
+// pics : 2013-11-14 Uniregistry, Corp.
+pics
+
+// pictet : 2014-06-26 Pictet Europe S.A.
+pictet
+
+// pictures : 2014-03-06 Foggy Sky, LLC
+pictures
+
+// pid : 2015-01-08 Top Level Spectrum, Inc.
+pid
+
+// pin : 2014-12-18 Amazon EU S.à r.l.
+pin
+
+// ping : 2015-06-11 Ping Registry Provider, Inc.
+ping
+
+// pink : 2013-10-01 Afilias Limited
+pink
+
+// pioneer : 2015-07-16 Pioneer Corporation
+pioneer
+
+// pizza : 2014-06-26 Foggy Moon, LLC
+pizza
+
+// place : 2014-04-24 Snow Galley, LLC
+place
+
+// play : 2015-03-05 Charleston Road Registry Inc.
+play
+
+// playstation : 2015-07-02 Sony Computer Entertainment Inc.
+playstation
+
+// plumbing : 2013-09-10 Spring Tigers, LLC
+plumbing
+
+// plus : 2015-02-05 Sugar Mill, LLC
+plus
+
+// pnc : 2015-07-02 PNC Domain Co., LLC
+pnc
+
+// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+pohl
+
+// poker : 2014-07-03 Afilias Domains No. 5 Limited
+poker
+
+// politie : 2015-08-20 Politie Nederland
+politie
+
+// porn : 2014-10-16 ICM Registry PN LLC
+porn
+
+// pramerica : 2015-07-30 Prudential Financial, Inc.
+pramerica
+
+// praxi : 2013-12-05 Praxi S.p.A.
+praxi
+
+// press : 2014-04-03 DotPress Inc.
+press
+
+// prime : 2015-06-25 Amazon EU S.à r.l.
+prime
+
+// prod : 2014-01-23 Charleston Road Registry Inc.
+prod
+
+// productions : 2013-12-05 Magic Birch, LLC
+productions
+
+// prof : 2014-07-24 Charleston Road Registry Inc.
+prof
+
+// progressive : 2015-07-23 Progressive Casualty Insurance Company
+progressive
+
+// promo : 2014-12-18
+promo
+
+// properties : 2013-12-05 Big Pass, LLC
+properties
+
+// property : 2014-05-22 Uniregistry, Corp.
+property
+
+// protection : 2015-04-23
+protection
+
+// pru : 2015-07-30 Prudential Financial, Inc.
+pru
+
+// prudential : 2015-07-30 Prudential Financial, Inc.
+prudential
+
+// pub : 2013-12-12 United TLD Holdco Ltd.
+pub
+
+// pwc : 2015-10-29 PricewaterhouseCoopers LLP
+pwc
+
+// qpon : 2013-11-14 dotCOOL, Inc.
+qpon
+
+// quebec : 2013-12-19 PointQuébec Inc
+quebec
+
+// quest : 2015-03-26 Quest ION Limited
+quest
+
+// qvc : 2015-07-30 QVC, Inc.
+qvc
+
+// racing : 2014-12-04 Premier Registry Limited
+racing
+
+// radio : 2016-07-21 European Broadcasting Union (EBU)
+radio
+
+// raid : 2015-07-23 Johnson Shareholdings, Inc.
+raid
+
+// read : 2014-12-18 Amazon EU S.à r.l.
+read
+
+// realestate : 2015-09-11 dotRealEstate LLC
+realestate
+
+// realtor : 2014-05-29 Real Estate Domains LLC
+realtor
+
+// realty : 2015-03-19 Fegistry, LLC
+realty
+
+// recipes : 2013-10-17 Grand Island, LLC
+recipes
+
+// red : 2013-11-07 Afilias Limited
+red
+
+// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd.
+redstone
+
+// redumbrella : 2015-03-26 Travelers TLD, LLC
+redumbrella
+
+// rehab : 2014-03-06 United TLD Holdco Ltd.
+rehab
+
+// reise : 2014-03-13
+reise
+
+// reisen : 2014-03-06 New Cypress, LLC
+reisen
+
+// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc.
+reit
+
+// reliance : 2015-04-02 Reliance Industries Limited
+reliance
+
+// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd.
+ren
+
+// rent : 2014-12-04 DERRent, LLC
+rent
+
+// rentals : 2013-12-05 Big Hollow,LLC
+rentals
+
+// repair : 2013-11-07 Lone Sunset, LLC
+repair
+
+// report : 2013-12-05 Binky Glen, LLC
+report
+
+// republican : 2014-03-20 United TLD Holdco Ltd.
+republican
+
+// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable
+rest
+
+// restaurant : 2014-07-03 Snow Avenue, LLC
+restaurant
+
+// review : 2014-11-20 dot Review Limited
+review
+
+// reviews : 2013-09-13
+reviews
+
+// rexroth : 2015-06-18 Robert Bosch GMBH
+rexroth
+
+// rich : 2013-11-21 I-Registry Ltd.
+rich
+
+// richardli : 2015-05-14 Pacific Century Asset Management (HK) Limited
+richardli
+
+// ricoh : 2014-11-20 Ricoh Company, Ltd.
+ricoh
+
+// rightathome : 2015-07-23 Johnson Shareholdings, Inc.
+rightathome
+
+// ril : 2015-04-02 Reliance Industries Limited
+ril
+
+// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO
+rio
+
+// rip : 2014-07-10 United TLD Holdco Ltd.
+rip
+
+// rmit : 2015-11-19 Royal Melbourne Institute of Technology
+rmit
+
+// rocher : 2014-12-18 Ferrero Trading Lux S.A.
+rocher
+
+// rocks : 2013-11-14
+rocks
+
+// rodeo : 2013-12-19 Top Level Domain Holdings Limited
+rodeo
+
+// rogers : 2015-08-06 Rogers Communications Partnership
+rogers
+
+// room : 2014-12-18 Amazon EU S.à r.l.
+room
+
+// rsvp : 2014-05-08 Charleston Road Registry Inc.
+rsvp
+
+// rugby : 2016-12-15 World Rugby Strategic Developments Limited
+rugby
+
+// ruhr : 2013-10-02 regiodot GmbH & Co. KG
+ruhr
+
+// run : 2015-03-19 Snow Park, LLC
+run
+
+// rwe : 2015-04-02 RWE AG
+rwe
+
+// ryukyu : 2014-01-09 BusinessRalliart Inc.
+ryukyu
+
+// saarland : 2013-12-12 dotSaarland GmbH
+saarland
+
+// safe : 2014-12-18 Amazon EU S.à r.l.
+safe
+
+// safety : 2015-01-08 Safety Registry Services, LLC.
+safety
+
+// sakura : 2014-12-18 SAKURA Internet Inc.
+sakura
+
+// sale : 2014-10-16
+sale
+
+// salon : 2014-12-11 Outer Orchard, LLC
+salon
+
+// samsclub : 2015-07-31 Wal-Mart Stores, Inc.
+samsclub
+
+// samsung : 2014-04-03 SAMSUNG SDS CO., LTD
+samsung
+
+// sandvik : 2014-11-13 Sandvik AB
+sandvik
+
+// sandvikcoromant : 2014-11-07 Sandvik AB
+sandvikcoromant
+
+// sanofi : 2014-10-09 Sanofi
+sanofi
+
+// sap : 2014-03-27 SAP AG
+sap
+
+// sapo : 2014-11-07 PT Comunicacoes S.A.
+sapo
+
+// sarl : 2014-07-03 Delta Orchard, LLC
+sarl
+
+// sas : 2015-04-02 Research IP LLC
+sas
+
+// save : 2015-06-25 Amazon EU S.à r.l.
+save
+
+// saxo : 2014-10-31 Saxo Bank A/S
+saxo
+
+// sbi : 2015-03-12 STATE BANK OF INDIA
+sbi
+
+// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION
+sbs
+
+// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ)
+sca
+
+// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB")
+scb
+
+// schaeffler : 2015-08-06 Schaeffler Technologies AG & Co. KG
+schaeffler
+
+// schmidt : 2014-04-03 SALM S.A.S.
+schmidt
+
+// scholarships : 2014-04-24 Scholarships.com, LLC
+scholarships
+
+// school : 2014-12-18 Little Galley, LLC
+school
+
+// schule : 2014-03-06 Outer Moon, LLC
+schule
+
+// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG
+schwarz
+
+// science : 2014-09-11 dot Science Limited
+science
+
+// scjohnson : 2015-07-23 Johnson Shareholdings, Inc.
+scjohnson
+
+// scor : 2014-10-31 SCOR SE
+scor
+
+// scot : 2014-01-23 Dot Scot Registry Limited
+scot
+
+// search : 2016-06-09 Charleston Road Registry Inc.
+search
+
+// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal)
+seat
+
+// secure : 2015-08-27 Amazon EU S.à r.l.
+secure
+
+// security : 2015-05-14
+security
+
+// seek : 2014-12-04 Seek Limited
+seek
+
+// select : 2015-10-08 iSelect Ltd
+select
+
+// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A.
+sener
+
+// services : 2014-02-27 Fox Castle, LLC
+services
+
+// ses : 2015-07-23 SES
+ses
+
+// seven : 2015-08-06 Seven West Media Ltd
+seven
+
+// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG
+sew
+
+// sex : 2014-11-13 ICM Registry SX LLC
+sex
+
+// sexy : 2013-09-11 Uniregistry, Corp.
+sexy
+
+// sfr : 2015-08-13 Societe Francaise du Radiotelephone - SFR
+sfr
+
+// shangrila : 2015-09-03 Shangri‐La International Hotel Management Limited
+shangrila
+
+// sharp : 2014-05-01 Sharp Corporation
+sharp
+
+// shaw : 2015-04-23 Shaw Cablesystems G.P.
+shaw
+
+// shell : 2015-07-30 Shell Information Technology International Inc
+shell
+
+// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+shia
+
+// shiksha : 2013-11-14 Afilias Limited
+shiksha
+
+// shoes : 2013-10-02 Binky Galley, LLC
+shoes
+
+// shop : 2016-04-08 GMO Registry, Inc.
+shop
+
+// shopping : 2016-03-31
+shopping
+
+// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
+shouji
+
+// show : 2015-03-05 Snow Beach, LLC
+show
+
+// showtime : 2015-08-06 CBS Domains Inc.
+showtime
+
+// shriram : 2014-01-23 Shriram Capital Ltd.
+shriram
+
+// silk : 2015-06-25 Amazon EU S.à r.l.
+silk
+
+// sina : 2015-03-12 Sina Corporation
+sina
+
+// singles : 2013-08-27 Fern Madison, LLC
+singles
+
+// site : 2015-01-15 DotSite Inc.
+site
+
+// ski : 2015-04-09 STARTING DOT LIMITED
+ski
+
+// skin : 2015-01-15 L'Oréal
+skin
+
+// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch
+sky
+
+// skype : 2014-12-18 Microsoft Corporation
+skype
+
+// sling : 2015-07-30 Hughes Satellite Systems Corporation
+sling
+
+// smart : 2015-07-09 Smart Communications, Inc. (SMART)
+smart
+
+// smile : 2014-12-18 Amazon EU S.à r.l.
+smile
+
+// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F
+sncf
+
+// soccer : 2015-03-26 Foggy Shadow, LLC
+soccer
+
+// social : 2013-11-07 United TLD Holdco Ltd.
+social
+
+// softbank : 2015-07-02 SoftBank Corp.
+softbank
+
+// software : 2014-03-20
+software
+
+// sohu : 2013-12-19 Sohu.com Limited
+sohu
+
+// solar : 2013-11-07 Ruby Town, LLC
+solar
+
+// solutions : 2013-11-07 Silver Cover, LLC
+solutions
+
+// song : 2015-02-26 Amazon EU S.à r.l.
+song
+
+// sony : 2015-01-08 Sony Corporation
+sony
+
+// soy : 2014-01-23 Charleston Road Registry Inc.
+soy
+
+// space : 2014-04-03 DotSpace Inc.
+space
+
+// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG
+spiegel
+
+// spot : 2015-02-26 Amazon EU S.à r.l.
+spot
+
+// spreadbetting : 2014-12-11 IG Group Holdings PLC
+spreadbetting
+
+// srl : 2015-05-07 mySRL GmbH
+srl
+
+// srt : 2015-07-30 FCA US LLC.
+srt
+
+// stada : 2014-11-13 STADA Arzneimittel AG
+stada
+
+// staples : 2015-07-30 Staples, Inc.
+staples
+
+// star : 2015-01-08 Star India Private Limited
+star
+
+// starhub : 2015-02-05 StarHub Ltd
+starhub
+
+// statebank : 2015-03-12 STATE BANK OF INDIA
+statebank
+
+// statefarm : 2015-07-30 State Farm Mutual Automobile Insurance Company
+statefarm
+
+// statoil : 2014-12-04 Statoil ASA
+statoil
+
+// stc : 2014-10-09 Saudi Telecom Company
+stc
+
+// stcgroup : 2014-10-09 Saudi Telecom Company
+stcgroup
+
+// stockholm : 2014-12-18 Stockholms kommun
+stockholm
+
+// storage : 2014-12-22 Self Storage Company LLC
+storage
+
+// store : 2015-04-09 DotStore Inc.
+store
+
+// stream : 2016-01-08 dot Stream Limited
+stream
+
+// studio : 2015-02-11
+studio
+
+// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD
+study
+
+// style : 2014-12-04 Binky Moon, LLC
+style
+
+// sucks : 2014-12-22 Vox Populi Registry Inc.
+sucks
+
+// supplies : 2013-12-19 Atomic Fields, LLC
+supplies
+
+// supply : 2013-12-19 Half Falls, LLC
+supply
+
+// support : 2013-10-24 Grand Orchard, LLC
+support
+
+// surf : 2014-01-09 Top Level Domain Holdings Limited
+surf
+
+// surgery : 2014-03-20 Tin Avenue, LLC
+surgery
+
+// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION
+suzuki
+
+// swatch : 2015-01-08 The Swatch Group Ltd
+swatch
+
+// swiftcover : 2015-07-23 Swiftcover Insurance Services Limited
+swiftcover
+
+// swiss : 2014-10-16 Swiss Confederation
+swiss
+
+// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet
+sydney
+
+// symantec : 2014-12-04 Symantec Corporation
+symantec
+
+// systems : 2013-11-07 Dash Cypress, LLC
+systems
+
+// tab : 2014-12-04 Tabcorp Holdings Limited
+tab
+
+// taipei : 2014-07-10 Taipei City Government
+taipei
+
+// talk : 2015-04-09 Amazon EU S.à r.l.
+talk
+
+// taobao : 2015-01-15 Alibaba Group Holding Limited
+taobao
+
+// target : 2015-07-31 Target Domain Holdings, LLC
+target
+
+// tatamotors : 2015-03-12 Tata Motors Ltd
+tatamotors
+
+// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic"
+tatar
+
+// tattoo : 2013-08-30 Uniregistry, Corp.
+tattoo
+
+// tax : 2014-03-20 Storm Orchard, LLC
+tax
+
+// taxi : 2015-03-19 Pine Falls, LLC
+taxi
+
+// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+tci
+
+// tdk : 2015-06-11 TDK Corporation
+tdk
+
+// team : 2015-03-05 Atomic Lake, LLC
+team
+
+// tech : 2015-01-30 Dot Tech LLC
+tech
+
+// technology : 2013-09-13 Auburn Falls
+technology
+
+// telecity : 2015-02-19 TelecityGroup International Limited
+telecity
+
+// telefonica : 2014-10-16 Telefónica S.A.
+telefonica
+
+// temasek : 2014-08-07 Temasek Holdings (Private) Limited
+temasek
+
+// tennis : 2014-12-04 Cotton Bloom, LLC
+tennis
+
+// teva : 2015-07-02 Teva Pharmaceutical Industries Limited
+teva
+
+// thd : 2015-04-02 Homer TLC, Inc.
+thd
+
+// theater : 2015-03-19 Blue Tigers, LLC
+theater
+
+// theatre : 2015-05-07
+theatre
+
+// tiaa : 2015-07-23 Teachers Insurance and Annuity Association of America
+tiaa
+
+// tickets : 2015-02-05 Accent Media Limited
+tickets
+
+// tienda : 2013-11-14 Victor Manor, LLC
+tienda
+
+// tiffany : 2015-01-30 Tiffany and Company
+tiffany
+
+// tips : 2013-09-20 Corn Willow, LLC
+tips
+
+// tires : 2014-11-07 Dog Edge, LLC
+tires
+
+// tirol : 2014-04-24 punkt Tirol GmbH
+tirol
+
+// tjmaxx : 2015-07-16 The TJX Companies, Inc.
+tjmaxx
+
+// tjx : 2015-07-16 The TJX Companies, Inc.
+tjx
+
+// tkmaxx : 2015-07-16 The TJX Companies, Inc.
+tkmaxx
+
+// tmall : 2015-01-15 Alibaba Group Holding Limited
+tmall
+
+// today : 2013-09-20 Pearl Woods, LLC
+today
+
+// tokyo : 2013-11-13 GMO Registry, Inc.
+tokyo
+
+// tools : 2013-11-21 Pioneer North, LLC
+tools
+
+// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd.
+top
+
+// toray : 2014-12-18 Toray Industries, Inc.
+toray
+
+// toshiba : 2014-04-10 TOSHIBA Corporation
+toshiba
+
+// total : 2015-08-06 Total SA
+total
+
+// tours : 2015-01-22 Sugar Station, LLC
+tours
+
+// town : 2014-03-06 Koko Moon, LLC
+town
+
+// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION
+toyota
+
+// toys : 2014-03-06 Pioneer Orchard, LLC
+toys
+
+// trade : 2014-01-23 Elite Registry Limited
+trade
+
+// trading : 2014-12-11 IG Group Holdings PLC
+trading
+
+// training : 2013-11-07 Wild Willow, LLC
+training
+
+// travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc.
+travelchannel
+
+// travelers : 2015-03-26 Travelers TLD, LLC
+travelers
+
+// travelersinsurance : 2015-03-26 Travelers TLD, LLC
+travelersinsurance
+
+// trust : 2014-10-16
+trust
+
+// trv : 2015-03-26 Travelers TLD, LLC
+trv
+
+// tube : 2015-06-11 Latin American Telecom LLC
+tube
+
+// tui : 2014-07-03 TUI AG
+tui
+
+// tunes : 2015-02-26 Amazon EU S.à r.l.
+tunes
+
+// tushu : 2014-12-18 Amazon EU S.à r.l.
+tushu
+
+// tvs : 2015-02-19 T V SUNDRAM IYENGAR  & SONS LIMITED
+tvs
+
+// ubank : 2015-08-20 National Australia Bank Limited
+ubank
+
+// ubs : 2014-12-11 UBS AG
+ubs
+
+// uconnect : 2015-07-30 FCA US LLC.
+uconnect
+
+// unicom : 2015-10-15 China United Network Communications Corporation Limited
+unicom
+
+// university : 2014-03-06 Little Station, LLC
+university
+
+// uno : 2013-09-11 Dot Latin LLC
+uno
+
+// uol : 2014-05-01 UBN INTERNET LTDA.
+uol
+
+// ups : 2015-06-25 UPS Market Driver, Inc.
+ups
+
+// vacations : 2013-12-05 Atomic Tigers, LLC
+vacations
+
+// vana : 2014-12-11 Lifestyle Domain Holdings, Inc.
+vana
+
+// vanguard : 2015-09-03 The Vanguard Group, Inc.
+vanguard
+
+// vegas : 2014-01-16 Dot Vegas, Inc.
+vegas
+
+// ventures : 2013-08-27 Binky Lake, LLC
+ventures
+
+// verisign : 2015-08-13 VeriSign, Inc.
+verisign
+
+// versicherung : 2014-03-20
+versicherung
+
+// vet : 2014-03-06
+vet
+
+// viajes : 2013-10-17 Black Madison, LLC
+viajes
+
+// video : 2014-10-16
+video
+
+// vig : 2015-05-14 VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe
+vig
+
+// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd.
+viking
+
+// villas : 2013-12-05 New Sky, LLC
+villas
+
+// vin : 2015-06-18 Holly Shadow, LLC
+vin
+
+// vip : 2015-01-22 Minds + Machines Group Limited
+vip
+
+// virgin : 2014-09-25 Virgin Enterprises Limited
+virgin
+
+// visa : 2015-07-30 Visa Worldwide Pte. Limited
+visa
+
+// vision : 2013-12-05 Koko Station, LLC
+vision
+
+// vista : 2014-09-18 Vistaprint Limited
+vista
+
+// vistaprint : 2014-09-18 Vistaprint Limited
+vistaprint
+
+// viva : 2014-11-07 Saudi Telecom Company
+viva
+
+// vivo : 2015-07-31 Telefonica Brasil S.A.
+vivo
+
+// vlaanderen : 2014-02-06 DNS.be vzw
+vlaanderen
+
+// vodka : 2013-12-19 Top Level Domain Holdings Limited
+vodka
+
+// volkswagen : 2015-05-14 Volkswagen Group of America Inc.
+volkswagen
+
+// volvo : 2015-11-12 Volvo Holding Sverige Aktiebolag
+volvo
+
+// vote : 2013-11-21 Monolith Registry LLC
+vote
+
+// voting : 2013-11-13 Valuetainment Corp.
+voting
+
+// voto : 2013-11-21 Monolith Registry LLC
+voto
+
+// voyage : 2013-08-27 Ruby House, LLC
+voyage
+
+// vuelos : 2015-03-05 Travel Reservations SRL
+vuelos
+
+// wales : 2014-05-08 Nominet UK
+wales
+
+// walmart : 2015-07-31 Wal-Mart Stores, Inc.
+walmart
+
+// walter : 2014-11-13 Sandvik AB
+walter
+
+// wang : 2013-10-24 Zodiac Leo Limited
+wang
+
+// wanggou : 2014-12-18 Amazon EU S.à r.l.
+wanggou
+
+// warman : 2015-06-18 Weir Group IP Limited
+warman
+
+// watch : 2013-11-14 Sand Shadow, LLC
+watch
+
+// watches : 2014-12-22 Richemont DNS Inc.
+watches
+
+// weather : 2015-01-08 The Weather Channel, LLC
+weather
+
+// weatherchannel : 2015-03-12 The Weather Channel, LLC
+weatherchannel
+
+// webcam : 2014-01-23 dot Webcam Limited
+webcam
+
+// weber : 2015-06-04 Saint-Gobain Weber SA
+weber
+
+// website : 2014-04-03 DotWebsite Inc.
+website
+
+// wed : 2013-10-01 Atgron, Inc.
+wed
+
+// wedding : 2014-04-24 Top Level Domain Holdings Limited
+wedding
+
+// weibo : 2015-03-05 Sina Corporation
+weibo
+
+// weir : 2015-01-29 Weir Group IP Limited
+weir
+
+// whoswho : 2014-02-20 Who's Who Registry
+whoswho
+
+// wien : 2013-10-28 punkt.wien GmbH
+wien
+
+// wiki : 2013-11-07 Top Level Design, LLC
+wiki
+
+// williamhill : 2014-03-13 William Hill Organization Limited
+williamhill
+
+// win : 2014-11-20 First Registry Limited
+win
+
+// windows : 2014-12-18 Microsoft Corporation
+windows
+
+// wine : 2015-06-18 June Station, LLC
+wine
+
+// winners : 2015-07-16 The TJX Companies, Inc.
+winners
+
+// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC
+wme
+
+// wolterskluwer : 2015-08-06 Wolters Kluwer N.V.
+wolterskluwer
+
+// woodside : 2015-07-09 Woodside Petroleum Limited
+woodside
+
+// work : 2013-12-19 Top Level Domain Holdings Limited
+work
+
+// works : 2013-11-14 Little Dynamite, LLC
+works
+
+// world : 2014-06-12 Bitter Fields, LLC
+world
+
+// wow : 2015-10-08 Amazon EU S.à r.l.
+wow
+
+// wtc : 2013-12-19 World Trade Centers Association, Inc.
+wtc
+
+// wtf : 2014-03-06 Hidden Way, LLC
+wtf
+
+// xbox : 2014-12-18 Microsoft Corporation
+xbox
+
+// xerox : 2014-10-24 Xerox DNHC LLC
+xerox
+
+// xfinity : 2015-07-09 Comcast IP Holdings I, LLC
+xfinity
+
+// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
+xihuan
+
+// xin : 2014-12-11 Elegant Leader Limited
+xin
+
+// xn--11b4c3d : 2015-01-15 VeriSign Sarl
+कॉम
+
+// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l.
+セール
+
+// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd.
+佛山
+
+// xn--30rr7y : 2014-06-12 Excellent First Limited
+慈善
+
+// xn--3bst00m : 2013-09-13 Eagle Horizon Limited
+集团
+
+// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED
+在线
+
+// xn--3oq18vl8pn36a : 2015-07-02 Volkswagen (China) Investment Co., Ltd.
+大众汽车
+
+// xn--3pxu8k : 2015-01-15 VeriSign Sarl
+点看
+
+// xn--42c2d9a : 2015-01-15 VeriSign Sarl
+คอม
+
+// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited
+八卦
+
+// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment
+موقع
+
+// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center
+公益
+
+// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center)
+公司
+
+// xn--5su34j936bgsg : 2015-09-03 Shangri‐La International Hotel Management Limited
+香格里拉
+
+// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited
+网站
+
+// xn--6frz82g : 2013-09-23 Afilias Limited
+移动
+
+// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited
+我爱你
+
+// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)
+москва
+
+// xn--80aqecdr1a : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)
+католик
+
+// xn--80asehdb : 2013-07-14 CORE Association
+онлайн
+
+// xn--80aswg : 2013-07-14 CORE Association
+сайт
+
+// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited
+联通
+
+// xn--9dbq2a : 2015-01-15 VeriSign Sarl
+קום
+
+// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED
+时尚
+
+// xn--9krt00a : 2015-03-12 Sina Corporation
+微博
+
+// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited
+淡马锡
+
+// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l.
+ファッション
+
+// xn--c1avg : 2013-11-14 Public Interest Registry
+орг
+
+// xn--c2br7g : 2015-01-15 VeriSign Sarl
+नेट
+
+// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l.
+ストア
+
+// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD
+삼성
+
+// xn--czr694b : 2014-01-16 Dot Trademark TLD Holding Company Limited
+商标
+
+// xn--czrs0t : 2013-12-19 Wild Island, LLC
+商店
+
+// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited
+商城
+
+// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet”
+дети
+
+// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l.
+ポイント
+
+// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社
+新闻
+
+// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited
+工行
+
+// xn--fct429k : 2015-04-09 Amazon EU S.à r.l.
+家電
+
+// xn--fhbei : 2015-01-15 VeriSign Sarl
+كوم
+
+// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED
+中文网
+
+// xn--fiq64b : 2013-10-14 CITIC Group Corporation
+中信
+
+// xn--fjq720a : 2014-05-22 Will Bloom, LLC
+娱乐
+
+// xn--flw351e : 2014-07-31 Charleston Road Registry Inc.
+谷歌
+
+// xn--fzys8d69uvgm : 2015-05-14 PCCW Enterprises Limited
+電訊盈科
+
+// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited
+购物
+
+// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l.
+クラウド
+
+// xn--gk3at1e : 2015-10-08 Amazon EU S.à r.l.
+通販
+
+// xn--hxt814e : 2014-05-15 Zodiac Libra Limited
+网店
+
+// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry
+संगठन
+
+// xn--imr513n : 2014-12-11 Dot Trademark TLD Holding Company Limited
+餐厅
+
+// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center)
+网络
+
+// xn--j1aef : 2015-01-15 VeriSign Sarl
+ком
+
+// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation
+诺基亚
+
+// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l.
+食品
+
+// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V.
+飞利浦
+
+// xn--kpu716f : 2014-12-22 Richemont DNS Inc.
+手表
+
+// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd
+手机
+
+// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company
+ارامكو
+
+// xn--mgba7c0bbn0a : 2015-05-14 Crescent Holding GmbH
+العليان
+
+// xn--mgbaakc7dvf : 2015-09-03 Emirates Telecommunications Corporation (trading as Etisalat)
+اتصالات
+
+// xn--mgbab2bd : 2013-10-31 CORE Association
+بازار
+
+// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L.
+موبايلي
+
+// xn--mgbca7dzdo : 2015-07-30 Abu Dhabi Systems and Information Centre
+ابوظبي
+
+// xn--mgbi4ecexp : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)
+كاثوليك
+
+// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+همراه
+
+// xn--mk1bu44c : 2015-01-15 VeriSign Sarl
+닷컴
+
+// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd.
+政府
+
+// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd.
+شبكة
+
+// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House
+بيتك
+
+// xn--ngbrx : 2015-11-12 League of Arab States
+عرب
+
+// xn--nqv7f : 2013-11-14 Public Interest Registry
+机构
+
+// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry
+组织机构
+
+// xn--nyqy26a : 2014-11-07 Stable Tone Limited
+健康
+
+// xn--p1acf : 2013-12-12 Rusnames Limited
+рус
+
+// xn--pbt977c : 2014-12-22 Richemont DNS Inc.
+珠宝
+
+// xn--pssy2u : 2015-01-15 VeriSign Sarl
+大拿
+
+// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc.
+みんな
+
+// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc.
+グーグル
+
+// xn--rhqv96g : 2013-09-11 Stable Tone Limited
+世界
+
+// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l.
+書籍
+
+// xn--ses554g : 2014-01-16
+网址
+
+// xn--t60b56a : 2015-01-15 VeriSign Sarl
+닷넷
+
+// xn--tckwe : 2015-01-15 VeriSign Sarl
+コム
+
+// xn--tiq49xqyj : 2015-10-21 Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)
+天主教
+
+// xn--unup4y : 2013-07-14 Spring Fields, LLC
+游戏
+
+// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+vermögensberater
+
+// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
+vermögensberatung
+
+// xn--vhquv : 2013-08-27 Dash McCook, LLC
+企业
+
+// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd.
+信息
+
+// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited
+嘉里大酒店
+
+// xn--w4rs40l : 2015-07-30 Kerry Trading Co. Limited
+嘉里
+
+// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd.
+广东
+
+// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center
+政务
+
+// xperia : 2015-05-14 Sony Mobile Communications AB
+xperia
+
+// xyz : 2013-12-05 XYZ.COM LLC
+xyz
+
+// yachts : 2014-01-09 DERYachts, LLC
+yachts
+
+// yahoo : 2015-04-02 Yahoo! Domain Services Inc.
+yahoo
+
+// yamaxun : 2014-12-18 Amazon EU S.à r.l.
+yamaxun
+
+// yandex : 2014-04-10 YANDEX, LLC
+yandex
+
+// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD.
+yodobashi
+
+// yoga : 2014-05-29 Top Level Domain Holdings Limited
+yoga
+
+// yokohama : 2013-12-12 GMO Registry, Inc.
+yokohama
+
+// you : 2015-04-09 Amazon EU S.à r.l.
+you
+
+// youtube : 2014-05-01 Charleston Road Registry Inc.
+youtube
+
+// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
+yun
+
+// zappos : 2015-06-25 Amazon EU S.à r.l.
+zappos
+
+// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.)
+zara
+
+// zero : 2014-12-18 Amazon EU S.à r.l.
+zero
+
+// zip : 2014-05-08 Charleston Road Registry Inc.
+zip
+
+// zippo : 2015-07-02 Zadco Company
+zippo
+
+// zone : 2013-11-14 Outer Falls, LLC
+zone
+
+// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich)
+zuerich
+
+
+// ===END ICANN DOMAINS===
+// ===BEGIN PRIVATE DOMAINS===
+// (Note: these are in alphabetical order by company name)
+
+// 1GB LLC : https://www.1gb.ua/
+// Submitted by 1GB LLC <noc@1gb.com.ua>
+cc.ua
+inf.ua
+ltd.ua
+
+// Agnat sp. z o.o. : https://domena.pl
+// Submitted by Przemyslaw Plewa <it-admin@domena.pl>
+beep.pl
+
+// Alces Software Ltd : http://alces-software.com
+// Submitted by Mark J. Titorenko <mark.titorenko@alces-software.com>
+*.compute.estate
+*.alces.network
+
+// alwaysdata : https://www.alwaysdata.com
+// Submitted by Cyril <admin@alwaysdata.com>
+*.alwaysdata.net
+
+// Amazon CloudFront : https://aws.amazon.com/cloudfront/
+// Submitted by Donavan Miller <donavanm@amazon.com>
+cloudfront.net
+
+// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/
+// Submitted by Luke Wells <psl-maintainers@amazon.com>
+*.compute.amazonaws.com
+*.compute-1.amazonaws.com
+*.compute.amazonaws.com.cn
+us-east-1.amazonaws.com
+
+// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/
+// Submitted by Luke Wells <psl-maintainers@amazon.com>
+elasticbeanstalk.cn-north-1.amazonaws.com.cn
+*.elasticbeanstalk.com
+
+// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/
+// Submitted by Luke Wells <psl-maintainers@amazon.com>
+*.elb.amazonaws.com
+*.elb.amazonaws.com.cn
+
+// Amazon S3 : https://aws.amazon.com/s3/
+// Submitted by Luke Wells <psl-maintainers@amazon.com>
+s3.amazonaws.com
+s3-ap-northeast-1.amazonaws.com
+s3-ap-northeast-2.amazonaws.com
+s3-ap-south-1.amazonaws.com
+s3-ap-southeast-1.amazonaws.com
+s3-ap-southeast-2.amazonaws.com
+s3-ca-central-1.amazonaws.com
+s3-eu-central-1.amazonaws.com
+s3-eu-west-1.amazonaws.com
+s3-eu-west-2.amazonaws.com
+s3-external-1.amazonaws.com
+s3-fips-us-gov-west-1.amazonaws.com
+s3-sa-east-1.amazonaws.com
+s3-us-gov-west-1.amazonaws.com
+s3-us-east-2.amazonaws.com
+s3-us-west-1.amazonaws.com
+s3-us-west-2.amazonaws.com
+s3.ap-northeast-2.amazonaws.com
+s3.ap-south-1.amazonaws.com
+s3.cn-north-1.amazonaws.com.cn
+s3.ca-central-1.amazonaws.com
+s3.eu-central-1.amazonaws.com
+s3.eu-west-2.amazonaws.com
+s3.us-east-2.amazonaws.com
+s3.dualstack.ap-northeast-1.amazonaws.com
+s3.dualstack.ap-northeast-2.amazonaws.com
+s3.dualstack.ap-south-1.amazonaws.com
+s3.dualstack.ap-southeast-1.amazonaws.com
+s3.dualstack.ap-southeast-2.amazonaws.com
+s3.dualstack.ca-central-1.amazonaws.com
+s3.dualstack.eu-central-1.amazonaws.com
+s3.dualstack.eu-west-1.amazonaws.com
+s3.dualstack.eu-west-2.amazonaws.com
+s3.dualstack.sa-east-1.amazonaws.com
+s3.dualstack.us-east-1.amazonaws.com
+s3.dualstack.us-east-2.amazonaws.com
+s3-website-us-east-1.amazonaws.com
+s3-website-us-west-1.amazonaws.com
+s3-website-us-west-2.amazonaws.com
+s3-website-ap-northeast-1.amazonaws.com
+s3-website-ap-southeast-1.amazonaws.com
+s3-website-ap-southeast-2.amazonaws.com
+s3-website-eu-west-1.amazonaws.com
+s3-website-sa-east-1.amazonaws.com
+s3-website.ap-northeast-2.amazonaws.com
+s3-website.ap-south-1.amazonaws.com
+s3-website.ca-central-1.amazonaws.com
+s3-website.eu-central-1.amazonaws.com
+s3-website.eu-west-2.amazonaws.com
+s3-website.us-east-2.amazonaws.com
+
+// Amune : https://amune.org/
+// Submitted by Team Amune <cert@amune.org>
+t3l3p0rt.net
+tele.amune.org
+
+// Aptible : https://www.aptible.com/
+// Submitted by Thomas Orozco <thomas@aptible.com>
+on-aptible.com
+
+// Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/
+// Submitted by Hector Martin <marcan@euskalencounter.org>
+user.party.eus
+
+// Association potager.org : https://potager.org/
+// Submitted by Lunar <jardiniers@potager.org>
+pimienta.org
+poivron.org
+potager.org
+sweetpepper.org
+
+// ASUSTOR Inc. : http://www.asustor.com
+// Submitted by Vincent Tseng <vincenttseng@asustor.com>
+myasustor.com
+
+// AVM : https://avm.de
+// Submitted by Andreas Weise <a.weise@avm.de>
+myfritz.net
+
+// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com
+// Submitted by James Kennedy <domains@advisorwebsites.com>
+*.awdev.ca
+*.advisor.ws
+
+// backplane : https://www.backplane.io
+// Submitted by Anthony Voutas <anthony@backplane.io>
+backplaneapp.io
+
+// BetaInABox
+// Submitted by Adrian <adrian@betainabox.com>
+betainabox.com
+
+// BinaryLane : http://www.binarylane.com
+// Submitted by Nathan O'Sullivan <nathan@mammoth.com.au>
+bnr.la
+
+// Boomla : https://boomla.com
+// Submitted by Tibor Halter <thalter@boomla.com>
+boomla.net
+
+// Boxfuse : https://boxfuse.com
+// Submitted by Axel Fontaine <axel@boxfuse.com>
+boxfuse.io
+
+// bplaced : https://www.bplaced.net/
+// Submitted by Miroslav Bozic <security@bplaced.net>
+square7.ch
+bplaced.com
+bplaced.de
+square7.de
+bplaced.net
+square7.net
+
+// BrowserSafetyMark
+// Submitted by Dave Tharp <browsersafetymark.io@quicinc.com>
+browsersafetymark.io
+
+// callidomus : https://www.callidomus.com/
+// Submitted by Marcus Popp <admin@callidomus.com>
+mycd.eu
+
+// CentralNic : http://www.centralnic.com/names/domains
+// Submitted by registry <gavin.brown@centralnic.com>
+ae.org
+ar.com
+br.com
+cn.com
+com.de
+com.se
+de.com
+eu.com
+gb.com
+gb.net
+hu.com
+hu.net
+jp.net
+jpn.com
+kr.com
+mex.com
+no.com
+qc.com
+ru.com
+sa.com
+se.com
+se.net
+uk.com
+uk.net
+us.com
+uy.com
+za.bz
+za.com
+
+// Africa.com Web Solutions Ltd : https://registry.africa.com
+// Submitted by Gavin Brown <gavin.brown@centralnic.com>
+africa.com
+
+// iDOT Services Limited : http://www.domain.gr.com
+// Submitted by Gavin Brown <gavin.brown@centralnic.com>
+gr.com
+
+// Radix FZC : http://domains.in.net
+// Submitted by Gavin Brown <gavin.brown@centralnic.com>
+in.net
+
+// US REGISTRY LLC : http://us.org
+// Submitted by Gavin Brown <gavin.brown@centralnic.com>
+us.org
+
+// co.com Registry, LLC : https://registry.co.com
+// Submitted by Gavin Brown <gavin.brown@centralnic.com>
+co.com
+
+// c.la : http://www.c.la/
+c.la
+
+// certmgr.org : https://certmgr.org
+// Submitted by B. Blechschmidt <hostmaster@certmgr.org>
+certmgr.org
+
+// Citrix : https://citrix.com
+// Submitted by Alex Stoddard <alex.stoddard@citrix.com>
+xenapponazure.com
+
+// ClearVox : http://www.clearvox.nl/
+// Submitted by Leon Rowland <leon@clearvox.nl>
+virtueeldomein.nl
+
+// Cloud66 : https://www.cloud66.com/
+// Submitted by Khash Sajadi <khash@cloud66.com>
+c66.me
+
+// CloudAccess.net : https://www.cloudaccess.net/
+// Submitted by Pawel Panek <noc@cloudaccess.net>
+jdevcloud.com
+wpdevcloud.com
+cloudaccess.host
+freesite.host
+cloudaccess.net
+
+// cloudControl : https://www.cloudcontrol.com/
+// Submitted by Tobias Wilken <tw@cloudcontrol.com>
+cloudcontrolled.com
+cloudcontrolapp.com
+
+// co.ca : http://registry.co.ca/
+co.ca
+
+// i-registry s.r.o. : http://www.i-registry.cz/
+// Submitted by Martin Semrad <semrad@i-registry.cz>
+co.cz
+
+// CDN77.com : http://www.cdn77.com
+// Submitted by Jan Krpes <jan.krpes@cdn77.com>
+c.cdn77.org
+cdn77-ssl.net
+r.cdn77.net
+rsc.cdn77.org
+ssl.origin.cdn77-secure.org
+
+// Cloud DNS Ltd : http://www.cloudns.net
+// Submitted by Aleksander Hristov <noc@cloudns.net>
+cloudns.asia
+cloudns.biz
+cloudns.club
+cloudns.cc
+cloudns.eu
+cloudns.in
+cloudns.info
+cloudns.org
+cloudns.pro
+cloudns.pw
+cloudns.us
+
+// CoDNS B.V.
+co.nl
+co.no
+
+// COSIMO GmbH : http://www.cosimo.de
+// Submitted by Rene Marticke <rmarticke@cosimo.de>
+dyn.cosidns.de
+dynamisches-dns.de
+dnsupdater.de
+internet-dns.de
+l-o-g-i-n.de
+dynamic-dns.info
+feste-ip.net
+knx-server.net
+static-access.net
+
+// Craynic, s.r.o. : http://www.craynic.com/
+// Submitted by Ales Krajnik <ales.krajnik@craynic.com>
+realm.cz
+
+// Cryptonomic : https://cryptonomic.net/
+// Submitted by Andrew Cady <public-suffix-list@cryptonomic.net>
+*.cryptonomic.net
+
+// Cupcake : https://cupcake.io/
+// Submitted by Jonathan Rudenberg <jonathan@cupcake.io>
+cupcake.is
+
+// cyon GmbH : https://www.cyon.ch/
+// Submitted by Dominic Luechinger <dol@cyon.ch>
+cyon.link
+cyon.site
+
+// Daplie, Inc : https://daplie.com
+// Submitted by AJ ONeal <aj@daplie.com>
+daplie.me
+localhost.daplie.me
+
+// Dansk.net : http://www.dansk.net/
+// Submitted by Anani Voule <digital@digital.co.dk>
+biz.dk
+co.dk
+firm.dk
+reg.dk
+store.dk
+
+// deSEC : https://desec.io/
+// Submitted by Peter Thomassen <peter@desec.io>
+dedyn.io
+
+// DNShome : https://www.dnshome.de/
+// Submitted by Norbert Auler <mail@dnshome.de>
+dnshome.de
+
+// DrayTek Corp. : https://www.draytek.com/
+// Submitted by Paul Fang <mis@draytek.com>
+drayddns.com
+
+// DreamHost : http://www.dreamhost.com/
+// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com>
+dreamhosters.com
+
+// Drobo : http://www.drobo.com/
+// Submitted by Ricardo Padilha <rpadilha@drobo.com>
+mydrobo.com
+
+// Drud Holdings, LLC. : https://www.drud.com/
+// Submitted by Kevin Bridges <kevin@drud.com>
+drud.io
+drud.us
+
+// DuckDNS : http://www.duckdns.org/
+// Submitted by Richard Harper <richard@duckdns.org>
+duckdns.org
+
+// dy.fi : http://dy.fi/
+// Submitted by Heikki Hannikainen <hessu@hes.iki.fi>
+dy.fi
+tunk.org
+
+// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/
+dyndns-at-home.com
+dyndns-at-work.com
+dyndns-blog.com
+dyndns-free.com
+dyndns-home.com
+dyndns-ip.com
+dyndns-mail.com
+dyndns-office.com
+dyndns-pics.com
+dyndns-remote.com
+dyndns-server.com
+dyndns-web.com
+dyndns-wiki.com
+dyndns-work.com
+dyndns.biz
+dyndns.info
+dyndns.org
+dyndns.tv
+at-band-camp.net
+ath.cx
+barrel-of-knowledge.info
+barrell-of-knowledge.info
+better-than.tv
+blogdns.com
+blogdns.net
+blogdns.org
+blogsite.org
+boldlygoingnowhere.org
+broke-it.net
+buyshouses.net
+cechire.com
+dnsalias.com
+dnsalias.net
+dnsalias.org
+dnsdojo.com
+dnsdojo.net
+dnsdojo.org
+does-it.net
+doesntexist.com
+doesntexist.org
+dontexist.com
+dontexist.net
+dontexist.org
+doomdns.com
+doomdns.org
+dvrdns.org
+dyn-o-saur.com
+dynalias.com
+dynalias.net
+dynalias.org
+dynathome.net
+dyndns.ws
+endofinternet.net
+endofinternet.org
+endoftheinternet.org
+est-a-la-maison.com
+est-a-la-masion.com
+est-le-patron.com
+est-mon-blogueur.com
+for-better.biz
+for-more.biz
+for-our.info
+for-some.biz
+for-the.biz
+forgot.her.name
+forgot.his.name
+from-ak.com
+from-al.com
+from-ar.com
+from-az.net
+from-ca.com
+from-co.net
+from-ct.com
+from-dc.com
+from-de.com
+from-fl.com
+from-ga.com
+from-hi.com
+from-ia.com
+from-id.com
+from-il.com
+from-in.com
+from-ks.com
+from-ky.com
+from-la.net
+from-ma.com
+from-md.com
+from-me.org
+from-mi.com
+from-mn.com
+from-mo.com
+from-ms.com
+from-mt.com
+from-nc.com
+from-nd.com
+from-ne.com
+from-nh.com
+from-nj.com
+from-nm.com
+from-nv.com
+from-ny.net
+from-oh.com
+from-ok.com
+from-or.com
+from-pa.com
+from-pr.com
+from-ri.com
+from-sc.com
+from-sd.com
+from-tn.com
+from-tx.com
+from-ut.com
+from-va.com
+from-vt.com
+from-wa.com
+from-wi.com
+from-wv.com
+from-wy.com
+ftpaccess.cc
+fuettertdasnetz.de
+game-host.org
+game-server.cc
+getmyip.com
+gets-it.net
+go.dyndns.org
+gotdns.com
+gotdns.org
+groks-the.info
+groks-this.info
+ham-radio-op.net
+here-for-more.info
+hobby-site.com
+hobby-site.org
+home.dyndns.org
+homedns.org
+homeftp.net
+homeftp.org
+homeip.net
+homelinux.com
+homelinux.net
+homelinux.org
+homeunix.com
+homeunix.net
+homeunix.org
+iamallama.com
+in-the-band.net
+is-a-anarchist.com
+is-a-blogger.com
+is-a-bookkeeper.com
+is-a-bruinsfan.org
+is-a-bulls-fan.com
+is-a-candidate.org
+is-a-caterer.com
+is-a-celticsfan.org
+is-a-chef.com
+is-a-chef.net
+is-a-chef.org
+is-a-conservative.com
+is-a-cpa.com
+is-a-cubicle-slave.com
+is-a-democrat.com
+is-a-designer.com
+is-a-doctor.com
+is-a-financialadvisor.com
+is-a-geek.com
+is-a-geek.net
+is-a-geek.org
+is-a-green.com
+is-a-guru.com
+is-a-hard-worker.com
+is-a-hunter.com
+is-a-knight.org
+is-a-landscaper.com
+is-a-lawyer.com
+is-a-liberal.com
+is-a-libertarian.com
+is-a-linux-user.org
+is-a-llama.com
+is-a-musician.com
+is-a-nascarfan.com
+is-a-nurse.com
+is-a-painter.com
+is-a-patsfan.org
+is-a-personaltrainer.com
+is-a-photographer.com
+is-a-player.com
+is-a-republican.com
+is-a-rockstar.com
+is-a-socialist.com
+is-a-soxfan.org
+is-a-student.com
+is-a-teacher.com
+is-a-techie.com
+is-a-therapist.com
+is-an-accountant.com
+is-an-actor.com
+is-an-actress.com
+is-an-anarchist.com
+is-an-artist.com
+is-an-engineer.com
+is-an-entertainer.com
+is-by.us
+is-certified.com
+is-found.org
+is-gone.com
+is-into-anime.com
+is-into-cars.com
+is-into-cartoons.com
+is-into-games.com
+is-leet.com
+is-lost.org
+is-not-certified.com
+is-saved.org
+is-slick.com
+is-uberleet.com
+is-very-bad.org
+is-very-evil.org
+is-very-good.org
+is-very-nice.org
+is-very-sweet.org
+is-with-theband.com
+isa-geek.com
+isa-geek.net
+isa-geek.org
+isa-hockeynut.com
+issmarterthanyou.com
+isteingeek.de
+istmein.de
+kicks-ass.net
+kicks-ass.org
+knowsitall.info
+land-4-sale.us
+lebtimnetz.de
+leitungsen.de
+likes-pie.com
+likescandy.com
+merseine.nu
+mine.nu
+misconfused.org
+mypets.ws
+myphotos.cc
+neat-url.com
+office-on-the.net
+on-the-web.tv
+podzone.net
+podzone.org
+readmyblog.org
+saves-the-whales.com
+scrapper-site.net
+scrapping.cc
+selfip.biz
+selfip.com
+selfip.info
+selfip.net
+selfip.org
+sells-for-less.com
+sells-for-u.com
+sells-it.net
+sellsyourhome.org
+servebbs.com
+servebbs.net
+servebbs.org
+serveftp.net
+serveftp.org
+servegame.org
+shacknet.nu
+simple-url.com
+space-to-rent.com
+stuff-4-sale.org
+stuff-4-sale.us
+teaches-yoga.com
+thruhere.net
+traeumtgerade.de
+webhop.biz
+webhop.info
+webhop.net
+webhop.org
+worse-than.tv
+writesthisblog.com
+
+// ddnss.de : https://www.ddnss.de/
+// Submitted by Robert Niedziela <webmaster@ddnss.de>
+ddnss.de
+dyn.ddnss.de
+dyndns.ddnss.de
+dyndns1.de
+dyn-ip24.de
+home-webserver.de
+dyn.home-webserver.de
+myhome-server.de
+ddnss.org
+
+// Definima : http://www.definima.com/
+// Submitted by Maxence Bitterli <maxence@definima.com>
+definima.net
+definima.io
+
+// Dynu.com : https://www.dynu.com/
+// Submitted by Sue Ye <sue@dynu.com>
+ddnsfree.com
+ddnsgeek.com
+giize.com
+gleeze.com
+kozow.com
+loseyourip.com
+ooguy.com
+theworkpc.com
+casacam.net
+dynu.net
+accesscam.org
+camdvr.org
+freeddns.org
+mywire.org
+webredirect.org
+myddns.rocks
+blogsite.xyz
+
+// dynv6 : https://dynv6.com
+// Submitted by Dominik Menke <dom@digineo.de>
+dynv6.net
+
+// E4YOU spol. s.r.o. : https://e4you.cz/
+// Submitted by Vladimir Dudr <info@e4you.cz>
+e4.cz
+
+// Enalean SAS: https://www.enalean.com
+// Submitted by Thomas Cottier <thomas.cottier@enalean.com>
+mytuleap.com
+
+// Enonic : http://enonic.com/
+// Submitted by Erik Kaareng-Sunde <esu@enonic.com>
+enonic.io
+customer.enonic.io
+
+// EU.org https://eu.org/
+// Submitted by Pierre Beyssac <hostmaster@eu.org>
+eu.org
+al.eu.org
+asso.eu.org
+at.eu.org
+au.eu.org
+be.eu.org
+bg.eu.org
+ca.eu.org
+cd.eu.org
+ch.eu.org
+cn.eu.org
+cy.eu.org
+cz.eu.org
+de.eu.org
+dk.eu.org
+edu.eu.org
+ee.eu.org
+es.eu.org
+fi.eu.org
+fr.eu.org
+gr.eu.org
+hr.eu.org
+hu.eu.org
+ie.eu.org
+il.eu.org
+in.eu.org
+int.eu.org
+is.eu.org
+it.eu.org
+jp.eu.org
+kr.eu.org
+lt.eu.org
+lu.eu.org
+lv.eu.org
+mc.eu.org
+me.eu.org
+mk.eu.org
+mt.eu.org
+my.eu.org
+net.eu.org
+ng.eu.org
+nl.eu.org
+no.eu.org
+nz.eu.org
+paris.eu.org
+pl.eu.org
+pt.eu.org
+q-a.eu.org
+ro.eu.org
+ru.eu.org
+se.eu.org
+si.eu.org
+sk.eu.org
+tr.eu.org
+uk.eu.org
+us.eu.org
+
+// Evennode : http://www.evennode.com/
+// Submitted by Michal Kralik <support@evennode.com>
+eu-1.evennode.com
+eu-2.evennode.com
+eu-3.evennode.com
+eu-4.evennode.com
+us-1.evennode.com
+us-2.evennode.com
+us-3.evennode.com
+us-4.evennode.com
+
+// eDirect Corp. : https://hosting.url.com.tw/
+// Submitted by C.S. chang <cschang@corp.url.com.tw>
+twmail.cc
+twmail.net
+twmail.org
+mymailer.com.tw
+url.tw
+
+// Facebook, Inc.
+// Submitted by Peter Ruibal <public-suffix@fb.com>
+apps.fbsbx.com
+
+// FAITID : https://faitid.org/
+// Submitted by Maxim Alzoba <tech.contact@faitid.org>
+// https://www.flexireg.net/stat_info
+ru.net
+adygeya.ru
+bashkiria.ru
+bir.ru
+cbg.ru
+com.ru
+dagestan.ru
+grozny.ru
+kalmykia.ru
+kustanai.ru
+marine.ru
+mordovia.ru
+msk.ru
+mytis.ru
+nalchik.ru
+nov.ru
+pyatigorsk.ru
+spb.ru
+vladikavkaz.ru
+vladimir.ru
+abkhazia.su
+adygeya.su
+aktyubinsk.su
+arkhangelsk.su
+armenia.su
+ashgabad.su
+azerbaijan.su
+balashov.su
+bashkiria.su
+bryansk.su
+bukhara.su
+chimkent.su
+dagestan.su
+east-kazakhstan.su
+exnet.su
+georgia.su
+grozny.su
+ivanovo.su
+jambyl.su
+kalmykia.su
+kaluga.su
+karacol.su
+karaganda.su
+karelia.su
+khakassia.su
+krasnodar.su
+kurgan.su
+kustanai.su
+lenug.su
+mangyshlak.su
+mordovia.su
+msk.su
+murmansk.su
+nalchik.su
+navoi.su
+north-kazakhstan.su
+nov.su
+obninsk.su
+penza.su
+pokrovsk.su
+sochi.su
+spb.su
+tashkent.su
+termez.su
+togliatti.su
+troitsk.su
+tselinograd.su
+tula.su
+tuva.su
+vladikavkaz.su
+vladimir.su
+vologda.su
+
+// Fastly Inc. : http://www.fastly.com/
+// Submitted by Fastly Security <security@fastly.com>
+fastlylb.net
+map.fastlylb.net
+freetls.fastly.net
+map.fastly.net
+a.prod.fastly.net
+global.prod.fastly.net
+a.ssl.fastly.net
+b.ssl.fastly.net
+global.ssl.fastly.net
+
+// Featherhead : https://featherhead.xyz/
+// Submitted by Simon Menke <simon@featherhead.xyz>
+fhapp.xyz
+
+// Fedora : https://fedoraproject.org/
+// submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org>
+fedorainfracloud.org
+fedorapeople.org
+cloud.fedoraproject.org
+
+// Filegear Inc. : https://www.filegear.com
+// Submitted by Jason Zhu <jason@owtware.com>
+filegear.me
+
+// Firebase, Inc.
+// Submitted by Chris Raynor <chris@firebase.com>
+firebaseapp.com
+
+// Flynn : https://flynn.io
+// Submitted by Jonathan Rudenberg <jonathan@flynn.io>
+flynnhub.com
+flynnhosting.net
+
+// Freebox : http://www.freebox.fr
+// Submitted by Romain Fliedel <rfliedel@freebox.fr>
+freebox-os.com
+freeboxos.com
+fbx-os.fr
+fbxos.fr
+freebox-os.fr
+freeboxos.fr
+
+// Fusion Intranet : https://www.fusion-intranet.com
+// Submitted by Matthias Burtscher <matthias.burtscher@fusonic.net>
+myfusion.cloud
+
+// Futureweb OG : http://www.futureweb.at
+// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at>
+futurehosting.at
+futuremailing.at
+*.ex.ortsinfo.at
+*.kunden.ortsinfo.at
+*.statics.cloud
+
+// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains
+// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk>
+service.gov.uk
+
+// GitHub, Inc.
+// Submitted by Patrick Toomey <security@github.com>
+github.io
+githubusercontent.com
+
+// GitLab, Inc.
+// Submitted by Alex Hanselka <alex@gitlab.com>
+gitlab.io
+
+// UKHomeOffice : https://www.gov.uk/government/organisations/home-office
+// Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk>
+homeoffice.gov.uk
+
+// GlobeHosting, Inc.
+// Submitted by Zoltan Egresi <egresi@globehosting.com>
+ro.im
+shop.ro
+
+// GoIP DNS Services : http://www.goip.de
+// Submitted by Christian Poulter <milchstrasse@goip.de>
+goip.de
+
+// Google, Inc.
+// Submitted by Eduardo Vela <evn@google.com>
+*.0emm.com
+appspot.com
+blogspot.ae
+blogspot.al
+blogspot.am
+blogspot.ba
+blogspot.be
+blogspot.bg
+blogspot.bj
+blogspot.ca
+blogspot.cf
+blogspot.ch
+blogspot.cl
+blogspot.co.at
+blogspot.co.id
+blogspot.co.il
+blogspot.co.ke
+blogspot.co.nz
+blogspot.co.uk
+blogspot.co.za
+blogspot.com
+blogspot.com.ar
+blogspot.com.au
+blogspot.com.br
+blogspot.com.by
+blogspot.com.co
+blogspot.com.cy
+blogspot.com.ee
+blogspot.com.eg
+blogspot.com.es
+blogspot.com.mt
+blogspot.com.ng
+blogspot.com.tr
+blogspot.com.uy
+blogspot.cv
+blogspot.cz
+blogspot.de
+blogspot.dk
+blogspot.fi
+blogspot.fr
+blogspot.gr
+blogspot.hk
+blogspot.hr
+blogspot.hu
+blogspot.ie
+blogspot.in
+blogspot.is
+blogspot.it
+blogspot.jp
+blogspot.kr
+blogspot.li
+blogspot.lt
+blogspot.lu
+blogspot.md
+blogspot.mk
+blogspot.mr
+blogspot.mx
+blogspot.my
+blogspot.nl
+blogspot.no
+blogspot.pe
+blogspot.pt
+blogspot.qa
+blogspot.re
+blogspot.ro
+blogspot.rs
+blogspot.ru
+blogspot.se
+blogspot.sg
+blogspot.si
+blogspot.sk
+blogspot.sn
+blogspot.td
+blogspot.tw
+blogspot.ug
+blogspot.vn
+cloudfunctions.net
+cloud.goog
+codespot.com
+googleapis.com
+googlecode.com
+pagespeedmobilizer.com
+publishproxy.com
+withgoogle.com
+withyoutube.com
+
+// Hashbang : https://hashbang.sh
+hashbang.sh
+
+// Hasura : https://hasura.io
+// Submitted by Shahidh K Muhammed <shahidh@hasura.io>
+hasura-app.io
+
+// Hepforge : https://www.hepforge.org
+// Submitted by David Grellscheid <admin@hepforge.org>
+hepforge.org
+
+// Heroku : https://www.heroku.com/
+// Submitted by Tom Maher <tmaher@heroku.com>
+herokuapp.com
+herokussl.com
+
+// Ici la Lune : http://www.icilalune.com/
+// Submitted by Simon Morvan <simon@icilalune.com>
+moonscale.net
+
+// iki.fi
+// Submitted by Hannu Aronsson <haa@iki.fi>
+iki.fi
+
+// info.at : http://www.info.at/
+biz.at
+info.at
+
+// info.cx : http://info.cx
+// Submitted by Jacob Slater <whois@igloo.to>
+info.cx
+
+// Interlegis : http://www.interlegis.leg.br
+// Submitted by Gabriel Ferreira <registrobr@interlegis.leg.br>
+ac.leg.br
+al.leg.br
+am.leg.br
+ap.leg.br
+ba.leg.br
+ce.leg.br
+df.leg.br
+es.leg.br
+go.leg.br
+ma.leg.br
+mg.leg.br
+ms.leg.br
+mt.leg.br
+pa.leg.br
+pb.leg.br
+pe.leg.br
+pi.leg.br
+pr.leg.br
+rj.leg.br
+rn.leg.br
+ro.leg.br
+rr.leg.br
+rs.leg.br
+sc.leg.br
+se.leg.br
+sp.leg.br
+to.leg.br
+
+// IPiFony Systems, Inc. : https://www.ipifony.com/
+// Submitted by Matthew Hardeman <mhardeman@ipifony.com>
+ipifony.net
+
+// Joyent : https://www.joyent.com/
+// Submitted by Brian Bennett <brian.bennett@joyent.com>
+*.triton.zone
+*.cns.joyent.com
+
+// JS.ORG : http://dns.js.org
+// Submitted by Stefan Keim <admin@js.org>
+js.org
+
+// Keyweb AG : https://www.keyweb.de
+// Submitted by Martin Dannehl <postmaster@keymachine.de>
+keymachine.de
+
+// KnightPoint Systems, LLC : http://www.knightpoint.com/
+// Submitted by Roy Keene <rkeene@knightpoint.com>
+knightpoint.systems
+
+// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf
+co.krd
+edu.krd
+
+// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de
+// Submitted by Lars Laehn <info@lcube.de>
+git-repos.de
+lcube-server.de
+svn-repos.de
+
+// LiquidNet Ltd : http://www.liquidnetlimited.com/
+// Submitted by Victor Velchev <admin@liquidnetlimited.com>
+we.bs
+
+// Lukanet Ltd : https://lukanet.com
+// Submitted by Anton Avramov <register@lukanet.com>
+barsy.bg
+barsyonline.com
+barsy.de
+barsy.eu
+barsy.in
+barsy.net
+barsy.online
+barsy.support
+
+// Magento Commerce
+// Submitted by Damien Tournoud <dtournoud@magento.cloud>
+*.magentosite.cloud
+
+// Mail.Ru Group : https://hb.cldmail.ru
+// Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru>
+hb.cldmail.ru
+
+// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/
+// Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz>
+cloud.metacentrum.cz
+custom.metacentrum.cz
+
+// Meteor Development Group : https://www.meteor.com/hosting
+// Submitted by Pierre Carrier <pierre@meteor.com>
+meteorapp.com
+eu.meteorapp.com
+
+// Michau Enterprises Limited : http://www.co.pl/
+co.pl
+
+// Microsoft : http://microsoft.com
+// Submitted by Barry Dorrans <bdorrans@microsoft.com>
+azurewebsites.net
+azure-mobile.net
+cloudapp.net
+
+// Mozilla Foundation : https://mozilla.org/
+// Submitted by glob <glob@mozilla.com>
+bmoattachments.org
+
+// MSK-IX : https://www.msk-ix.ru/
+// Submitted by Khannanov Roman <r.khannanov@msk-ix.ru>
+net.ru
+org.ru
+pp.ru
+
+// Netlify : https://www.netlify.com
+// Submitted by Jessica Parsons <jessica@netlify.com>
+bitballoon.com
+netlify.com
+
+// Neustar Inc.
+// Submitted by Trung Tran <Trung.Tran@neustar.biz>
+4u.com
+
+// ngrok : https://ngrok.com/
+// Submitted by Alan Shreve <alan@ngrok.com>
+ngrok.io
+
+// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/
+// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net>
+nfshost.com
+
+// nsupdate.info : https://www.nsupdate.info/
+// Submitted by Thomas Waldmann <info@nsupdate.info>
+nsupdate.info
+nerdpol.ovh
+
+// No-IP.com : https://noip.com/
+// Submitted by Deven Reza <publicsuffixlist@noip.com>
+blogsyte.com
+brasilia.me
+cable-modem.org
+ciscofreak.com
+collegefan.org
+couchpotatofries.org
+damnserver.com
+ddns.me
+ditchyourip.com
+dnsfor.me
+dnsiskinky.com
+dvrcam.info
+dynns.com
+eating-organic.net
+fantasyleague.cc
+geekgalaxy.com
+golffan.us
+health-carereform.com
+homesecuritymac.com
+homesecuritypc.com
+hopto.me
+ilovecollege.info
+loginto.me
+mlbfan.org
+mmafan.biz
+myactivedirectory.com
+mydissent.net
+myeffect.net
+mymediapc.net
+mypsx.net
+mysecuritycamera.com
+mysecuritycamera.net
+mysecuritycamera.org
+net-freaks.com
+nflfan.org
+nhlfan.net
+no-ip.ca
+no-ip.co.uk
+no-ip.net
+noip.us
+onthewifi.com
+pgafan.net
+point2this.com
+pointto.us
+privatizehealthinsurance.net
+quicksytes.com
+read-books.org
+securitytactics.com
+serveexchange.com
+servehumour.com
+servep2p.com
+servesarcasm.com
+stufftoread.com
+ufcfan.org
+unusualperson.com
+workisboring.com
+3utilities.com
+bounceme.net
+ddns.net
+ddnsking.com
+gotdns.ch
+hopto.org
+myftp.biz
+myftp.org
+myvnc.com
+no-ip.biz
+no-ip.info
+no-ip.org
+noip.me
+redirectme.net
+servebeer.com
+serveblog.net
+servecounterstrike.com
+serveftp.com
+servegame.com
+servehalflife.com
+servehttp.com
+serveirc.com
+serveminecraft.net
+servemp3.com
+servepics.com
+servequake.com
+sytes.net
+webhop.me
+zapto.org
+
+// NodeArt : https://nodeart.io
+// Submitted by Konstantin Nosov <Nosov@nodeart.io>
+stage.nodeart.io
+
+// Nodum B.V. : https://nodum.io/
+// Submitted by Wietse Wind <hello+publicsuffixlist@nodum.io>
+nodum.co
+nodum.io
+
+// NYC.mn : http://www.information.nyc.mn
+// Submitted by Matthew Brown <mattbrown@nyc.mn>
+nyc.mn
+
+// NymNom : https://nymnom.com/
+// Submitted by Dave McCormack <dave.mccormack@nymnom.com>
+nom.ae
+nom.ai
+nom.al
+nym.by
+nym.bz
+nom.cl
+nom.gd
+nom.gl
+nym.gr
+nom.gt
+nom.hn
+nom.im
+nym.kz
+nym.la
+nom.li
+nym.li
+nym.lt
+nym.lu
+nym.me
+nom.mk
+nym.mx
+nom.nu
+nym.nz
+nym.pe
+nym.pt
+nom.pw
+nom.qa
+nom.rs
+nom.si
+nym.sk
+nym.su
+nym.sx
+nym.tw
+nom.ug
+nom.uy
+nom.vc
+nom.vg
+
+// Octopodal Solutions, LLC. : https://ulterius.io/
+// Submitted by Andrew Sampson <andrew@ulterius.io>
+cya.gg
+
+// One Fold Media : http://www.onefoldmedia.com/
+// Submitted by Eddie Jones <eddie@onefoldmedia.com>
+nid.io
+
+// OpenCraft GmbH : http://opencraft.com/
+// Submitted by Sven Marnach <sven@opencraft.com>
+opencraft.hosting
+
+// Opera Software, A.S.A.
+// Submitted by Yngve Pettersen <yngve@opera.com>
+operaunite.com
+
+// OutSystems
+// Submitted by Duarte Santos <domain-admin@outsystemscloud.com>
+outsystemscloud.com
+
+// OwnProvider : http://www.ownprovider.com
+// Submitted by Jan Moennich <jan.moennich@ownprovider.com>
+ownprovider.com
+
+// oy.lc
+// Submitted by Charly Coste <changaco@changaco.oy.lc>
+oy.lc
+
+// Pagefog : https://pagefog.com/
+// Submitted by Derek Myers <derek@pagefog.com>
+pgfog.com
+
+// Pagefront : https://www.pagefronthq.com/
+// Submitted by Jason Kriss <jason@pagefronthq.com>
+pagefrontapp.com
+
+// .pl domains (grandfathered)
+art.pl
+gliwice.pl
+krakow.pl
+poznan.pl
+wroc.pl
+zakopane.pl
+
+// Pantheon Systems, Inc. : https://pantheon.io/
+// Submitted by Gary Dylina <gary@pantheon.io>
+pantheonsite.io
+gotpantheon.com
+
+// Peplink | Pepwave : http://peplink.com/
+// Submitted by Steve Leung <steveleung@peplink.com>
+mypep.link
+
+// Planet-Work : https://www.planet-work.com/
+// Submitted by Frédéric VANNIÈRE <f.vanniere@planet-work.com>
+on-web.fr
+
+// Platform.sh : https://platform.sh
+// Submitted by Nikola Kotur <nikola@platform.sh>
+*.platform.sh
+*.platformsh.site
+
+// prgmr.com : https://prgmr.com/
+// Submitted by Sarah Newman <owner@prgmr.com>
+xen.prgmr.com
+
+// priv.at : http://www.nic.priv.at/
+// Submitted by registry <lendl@nic.at>
+priv.at
+
+// Protonet GmbH : http://protonet.io
+// Submitted by Martin Meier <admin@protonet.io>
+protonet.io
+
+// Publication Presse Communication SARL : https://ppcom.fr
+// Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr>
+chirurgiens-dentistes-en-france.fr
+
+// QA2
+// Submitted by Daniel Dent (https://www.danieldent.com/)
+qa2.com
+
+// QNAP System Inc : https://www.qnap.com
+// Submitted by Nick Chang <nickchang@qnap.com>
+dev-myqnapcloud.com
+alpha-myqnapcloud.com
+myqnapcloud.com
+
+// Quip : https://quip.com
+// Submitted by Patrick Linehan <plinehan@quip.com>
+*.quipelements.com
+
+// Qutheory LLC : http://qutheory.io
+// Submitted by Jonas Schwartz <jonas@qutheory.io>
+vapor.cloud
+vaporcloud.io
+
+// Rackmaze LLC : https://www.rackmaze.com
+// Submitted by Kirill Pertsev <kika@rackmaze.com>
+rackmaze.com
+rackmaze.net
+
+// Red Hat, Inc. OpenShift : https://openshift.redhat.com/
+// Submitted by Tim Kramer <tkramer@rhcloud.com>
+rhcloud.com
+
+// RethinkDB : https://www.rethinkdb.com/
+// Submitted by Chris Kastorff <info@rethinkdb.com>
+hzc.io
+
+// Revitalised Limited : http://www.revitalised.co.uk
+// Submitted by Jack Price <jack@revitalised.co.uk>
+wellbeingzone.eu
+ptplus.fit
+wellbeingzone.co.uk
+
+// Sandstorm Development Group, Inc. : https://sandcats.io/
+// Submitted by Asheesh Laroia <asheesh@sandstorm.io>
+sandcats.io
+
+// SBE network solutions GmbH : https://www.sbe.de/
+// Submitted by Norman Meilick <nm@sbe.de>
+logoip.de
+logoip.com
+
+// Securepoint GmbH : https://www.securepoint.de
+// Submitted by Erik Anders <erik.anders@securepoint.de>
+firewall-gateway.com
+firewall-gateway.de
+my-gateway.de
+my-router.de
+spdns.de
+spdns.eu
+firewall-gateway.net
+my-firewall.org
+myfirewall.org
+spdns.org
+
+// SensioLabs, SAS : https://sensiolabs.com/
+// Submitted by Fabien Potencier <fabien.potencier@sensiolabs.com>
+*.sensiosite.cloud
+
+// Service Online LLC : http://drs.ua/
+// Submitted by Serhii Bulakh <support@drs.ua>
+biz.ua
+co.ua
+pp.ua
+
+// ShiftEdit : https://shiftedit.net/
+// Submitted by Adam Jimenez <adam@shiftcreate.com>
+shiftedit.io
+
+// Shopblocks : http://www.shopblocks.com/
+// Submitted by Alex Bowers <alex@shopblocks.com>
+myshopblocks.com
+
+// SinaAppEngine : http://sae.sina.com.cn/
+// Submitted by SinaAppEngine <saesupport@sinacloud.com>
+1kapp.com
+appchizi.com
+applinzi.com
+sinaapp.com
+vipsinaapp.com
+
+// Skyhat : http://www.skyhat.io
+// Submitted by Shante Adam <shante@skyhat.io>
+bounty-full.com
+alpha.bounty-full.com
+beta.bounty-full.com
+
+// staticland : https://static.land
+// Submitted by Seth Vincent <sethvincent@gmail.com>
+static.land
+dev.static.land
+sites.static.land
+
+// SourceLair PC : https://www.sourcelair.com
+// Submitted by Antonis Kalipetis <akalipetis@sourcelair.com>
+apps.lair.io
+*.stolos.io
+
+// SpaceKit : https://www.spacekit.io/
+// Submitted by Reza Akhavan <spacekit.io@gmail.com>
+spacekit.io
+
+// Stackspace : https://www.stackspace.io/
+// Submitted by Lina He <info@stackspace.io>
+stackspace.space
+
+// Storj Labs Inc. : https://storj.io/
+// Submitted by Philip Hutchins <hostmaster@storj.io>
+storj.farm
+
+// Sub 6 Limited: http://www.sub6.com
+// Submitted by Dan Miller <dm@sub6.com>
+temp-dns.com
+
+// Synology, Inc. : https://www.synology.com/
+// Submitted by Rony Weng <ronyweng@synology.com>
+diskstation.me
+dscloud.biz
+dscloud.me
+dscloud.mobi
+dsmynas.com
+dsmynas.net
+dsmynas.org
+familyds.com
+familyds.net
+familyds.org
+i234.me
+myds.me
+synology.me
+vpnplus.to
+
+// TAIFUN Software AG : http://taifun-software.de
+// Submitted by Bjoern Henke <dev-server@taifun-software.de>
+taifun-dns.de
+
+// TASK geographical domains (www.task.gda.pl/uslugi/dns)
+gda.pl
+gdansk.pl
+gdynia.pl
+med.pl
+sopot.pl
+
+// Thingdust AG : https://thingdust.com/
+// Submitted by Adrian Imboden <adi@thingdust.com>
+cust.dev.thingdust.io
+cust.disrec.thingdust.io
+cust.prod.thingdust.io
+cust.testing.thingdust.io
+
+// TownNews.com : http://www.townnews.com
+// Submitted by Dustin Ward <dward@townnews.com>
+bloxcms.com
+townnews-staging.com
+
+// TrafficPlex GmbH : https://www.trafficplex.de/
+// Submitted by Phillipp Röll <phillipp.roell@trafficplex.de>
+12hp.at
+2ix.at
+4lima.at
+lima-city.at
+12hp.ch
+2ix.ch
+4lima.ch
+lima-city.ch
+trafficplex.cloud
+de.cool
+12hp.de
+2ix.de
+4lima.de
+lima-city.de
+1337.pictures
+clan.rip
+lima-city.rocks
+webspace.rocks
+lima.zone
+
+// TransIP : htts://www.transip.nl
+// Submitted by Rory Breuk <rbreuk@transip.nl>
+*.transurl.be
+*.transurl.eu
+*.transurl.nl
+
+// TuxFamily : http://tuxfamily.org
+// Submitted by TuxFamily administrators <adm@staff.tuxfamily.org>
+tuxfamily.org
+
+// TwoDNS : https://www.twodns.de/
+// Submitted by TwoDNS-Support <support@two-dns.de>
+dd-dns.de
+diskstation.eu
+diskstation.org
+dray-dns.de
+draydns.de
+dyn-vpn.de
+dynvpn.de
+mein-vigor.de
+my-vigor.de
+my-wan.de
+syno-ds.de
+synology-diskstation.de
+synology-ds.de
+
+// Uberspace : https://uberspace.de
+// Submitted by Moritz Werner <mwerner@jonaspasche.com>
+uber.space
+
+// UDR Limited : http://www.udr.hk.com
+// Submitted by registry <hostmaster@udr.hk.com>
+hk.com
+hk.org
+ltd.hk
+inc.hk
+
+// .US
+// Submitted by Ed Moore <Ed.Moore@lib.de.us>
+lib.de.us
+
+// Viprinet Europe GmbH : http://www.viprinet.com
+// Submitted by Simon Kissel <hostmaster@viprinet.com>
+router.management
+
+// WeDeploy by Liferay, Inc. : https://www.wedeploy.com
+// Submitted by Henrique Vicente <security@wedeploy.com>
+wedeploy.io
+wedeploy.me
+
+// Western Digital Technologies, Inc : https://www.wdc.com
+// Submitted by Jung Jin <jungseok.jin@wdc.com>
+remotewd.com
+
+// Wikimedia Labs : https://wikitech.wikimedia.org
+// Submitted by Yuvi Panda <yuvipanda@wikimedia.org>
+wmflabs.org
+
+// XS4ALL Internet bv : https://www.xs4all.nl/
+// Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net>
+cistron.nl
+demon.nl
+xs4all.space
+
+// Yola : https://www.yola.com/
+// Submitted by Stefano Rivera <stefano@yola.com>
+yolasite.com
+
+// Yombo : https://yombo.net
+// Submitted by Mitch Schwenk <mitch@yombo.net>
+ybo.faith
+yombo.me
+homelink.one
+ybo.party
+ybo.review
+ybo.science
+ybo.trade
+
+// ZaNiC : http://www.za.net/
+// Submitted by registry <hostmaster@nic.za.net>
+za.net
+za.org
+
+// Zeit, Inc. : https://zeit.domains/
+// Submitted by Olli Vanhoja <olli@zeit.co>
+now.sh
+
+// ===END PRIVATE DOMAINS===
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix.rb
new file mode 100644
index 0000000..7b79dd3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix.rb
@@ -0,0 +1,175 @@
+# = Public Suffix
+#
+# Domain name parser based on the Public Suffix List.
+#
+# Copyright (c) 2009-2017 Simone Carletti <weppos@weppos.net>
+
+require_relative "public_suffix/domain"
+require_relative "public_suffix/version"
+require_relative "public_suffix/errors"
+require_relative "public_suffix/rule"
+require_relative "public_suffix/list"
+
+# PublicSuffix is a Ruby domain name parser based on the Public Suffix List.
+#
+# The [Public Suffix List](https://publicsuffix.org) is a cross-vendor initiative
+# to provide an accurate list of domain name suffixes.
+#
+# The Public Suffix List is an initiative of the Mozilla Project,
+# but is maintained as a community resource. It is available for use in any software,
+# but was originally created to meet the needs of browser manufacturers.
+module PublicSuffix
+
+  DOT   = ".".freeze
+  BANG  = "!".freeze
+  STAR  = "*".freeze
+
+  # Parses +name+ and returns the {PublicSuffix::Domain} instance.
+  #
+  # @example Parse a valid domain
+  #   PublicSuffix.parse("google.com")
+  #   # => #<PublicSuffix::Domain:0x007fec2e51e588 @sld="google", @tld="com", @trd=nil>
+  #
+  # @example Parse a valid subdomain
+  #   PublicSuffix.parse("www.google.com")
+  #   # => #<PublicSuffix::Domain:0x007fec276d4cf8 @sld="google", @tld="com", @trd="www">
+  #
+  # @example Parse a fully qualified domain
+  #   PublicSuffix.parse("google.com.")
+  #   # => #<PublicSuffix::Domain:0x007fec257caf38 @sld="google", @tld="com", @trd=nil>
+  #
+  # @example Parse a fully qualified domain (subdomain)
+  #   PublicSuffix.parse("www.google.com.")
+  #   # => #<PublicSuffix::Domain:0x007fec27b6bca8 @sld="google", @tld="com", @trd="www">
+  #
+  # @example Parse an invalid (unlisted) domain
+  #   PublicSuffix.parse("x.yz")
+  #   # => #<PublicSuffix::Domain:0x007fec2f49bec0 @sld="x", @tld="yz", @trd=nil>
+  #
+  # @example Parse an invalid (unlisted) domain with strict checking (without applying the default * rule)
+  #   PublicSuffix.parse("x.yz", default_rule: nil)
+  #   # => PublicSuffix::DomainInvalid: `x.yz` is not a valid domain
+  #
+  # @example Parse an URL (not supported, only domains)
+  #   PublicSuffix.parse("http://www.google.com")
+  #   # => PublicSuffix::DomainInvalid: http://www.google.com is not expected to contain a scheme
+  #
+  #
+  # @param  [String, #to_s] name The domain name or fully qualified domain name to parse.
+  # @param  [PublicSuffix::List] list The rule list to search, defaults to the default {PublicSuffix::List}
+  # @param  [Boolean] ignore_private
+  # @return [PublicSuffix::Domain]
+  #
+  # @raise [PublicSuffix::DomainInvalid]
+  #   If domain is not a valid domain.
+  # @raise [PublicSuffix::DomainNotAllowed]
+  #   If a rule for +domain+ is found, but the rule doesn't allow +domain+.
+  def self.parse(name, list: List.default, default_rule: list.default_rule, ignore_private: false)
+    what = normalize(name)
+    raise what if what.is_a?(DomainInvalid)
+
+    rule = list.find(what, default: default_rule, ignore_private: ignore_private)
+
+    # rubocop:disable Style/IfUnlessModifier
+    if rule.nil?
+      raise DomainInvalid, "`#{what}` is not a valid domain"
+    end
+    if rule.decompose(what).last.nil?
+      raise DomainNotAllowed, "`#{what}` is not allowed according to Registry policy"
+    end
+    # rubocop:enable Style/IfUnlessModifier
+
+    decompose(what, rule)
+  end
+
+  # Checks whether +domain+ is assigned and allowed, without actually parsing it.
+  #
+  # This method doesn't care whether domain is a domain or subdomain.
+  # The validation is performed using the default {PublicSuffix::List}.
+  #
+  # @example Validate a valid domain
+  #   PublicSuffix.valid?("example.com")
+  #   # => true
+  #
+  # @example Validate a valid subdomain
+  #   PublicSuffix.valid?("www.example.com")
+  #   # => true
+  #
+  # @example Validate a not-listed domain
+  #   PublicSuffix.valid?("example.tldnotlisted")
+  #   # => true
+  #
+  # @example Validate a not-listed domain with strict checking (without applying the default * rule)
+  #   PublicSuffix.valid?("example.tldnotlisted")
+  #   # => true
+  #   PublicSuffix.valid?("example.tldnotlisted", default_rule: nil)
+  #   # => false
+  #
+  # @example Validate a fully qualified domain
+  #   PublicSuffix.valid?("google.com.")
+  #   # => true
+  #   PublicSuffix.valid?("www.google.com.")
+  #   # => true
+  #
+  # @example Check an URL (which is not a valid domain)
+  #   PublicSuffix.valid?("http://www.example.com")
+  #   # => false
+  #
+  #
+  # @param  [String, #to_s] name The domain name or fully qualified domain name to validate.
+  # @param  [Boolean] ignore_private
+  # @return [Boolean]
+  def self.valid?(name, list: List.default, default_rule: list.default_rule, ignore_private: false)
+    what = normalize(name)
+    return false if what.is_a?(DomainInvalid)
+
+    rule = list.find(what, default: default_rule, ignore_private: ignore_private)
+
+    !rule.nil? && !rule.decompose(what).last.nil?
+  end
+
+  # Attempt to parse the name and returns the domain, if valid.
+  #
+  # This method doesn't raise. Instead, it returns nil if the domain is not valid for whatever reason.
+  #
+  # @param  [String, #to_s] name The domain name or fully qualified domain name to parse.
+  # @param  [PublicSuffix::List] list The rule list to search, defaults to the default {PublicSuffix::List}
+  # @param  [Boolean] ignore_private
+  # @return [String]
+  def self.domain(name, **options)
+    parse(name, **options).domain
+  rescue PublicSuffix::Error
+    nil
+  end
+
+
+  # private
+
+  def self.decompose(name, rule)
+    left, right = rule.decompose(name)
+
+    parts = left.split(DOT)
+    # If we have 0 parts left, there is just a tld and no domain or subdomain
+    # If we have 1 part  left, there is just a tld, domain and not subdomain
+    # If we have 2 parts left, the last part is the domain, the other parts (combined) are the subdomain
+    tld = right
+    sld = parts.empty? ? nil : parts.pop
+    trd = parts.empty? ? nil : parts.join(DOT)
+
+    Domain.new(tld, sld, trd)
+  end
+
+  # Pretend we know how to deal with user input.
+  def self.normalize(name)
+    name = name.to_s.dup
+    name.strip!
+    name.chomp!(DOT)
+    name.downcase!
+
+    return DomainInvalid.new("Name is blank") if name.empty?
+    return DomainInvalid.new("Name starts with a dot") if name.start_with?(DOT)
+    return DomainInvalid.new("%s is not expected to contain a scheme" % name) if name.include?("://")
+    name
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/domain.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/domain.rb
new file mode 100644
index 0000000..4c4edd4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/domain.rb
@@ -0,0 +1,235 @@
+# = Public Suffix
+#
+# Domain name parser based on the Public Suffix List.
+#
+# Copyright (c) 2009-2017 Simone Carletti <weppos@weppos.net>
+
+module PublicSuffix
+
+  # Domain represents a domain name, composed by a TLD, SLD and TRD.
+  class Domain
+
+    # Splits a string into the labels, that is the dot-separated parts.
+    #
+    # The input is not validated, but it is assumed to be a valid domain name.
+    #
+    # @example
+    #
+    #   name_to_labels('example.com')
+    #   # => ['example', 'com']
+    #
+    #   name_to_labels('example.co.uk')
+    #   # => ['example', 'co', 'uk']
+    #
+    # @param  name [String, #to_s] The domain name to split.
+    # @return [Array<String>]
+    def self.name_to_labels(name)
+      name.to_s.split(DOT)
+    end
+
+
+    attr_reader :tld, :sld, :trd
+
+    # Creates and returns a new {PublicSuffix::Domain} instance.
+    #
+    # @overload initialize(tld)
+    #   Initializes with a +tld+.
+    #   @param [String] tld The TLD (extension)
+    # @overload initialize(tld, sld)
+    #   Initializes with a +tld+ and +sld+.
+    #   @param [String] tld The TLD (extension)
+    #   @param [String] sld The TRD (domain)
+    # @overload initialize(tld, sld, trd)
+    #   Initializes with a +tld+, +sld+ and +trd+.
+    #   @param [String] tld The TLD (extension)
+    #   @param [String] sld The SLD (domain)
+    #   @param [String] tld The TRD (subdomain)
+    #
+    # @yield [self] Yields on self.
+    # @yieldparam [PublicSuffix::Domain] self The newly creates instance
+    #
+    # @example Initialize with a TLD
+    #   PublicSuffix::Domain.new("com")
+    #   # => #<PublicSuffix::Domain @tld="com">
+    #
+    # @example Initialize with a TLD and SLD
+    #   PublicSuffix::Domain.new("com", "example")
+    #   # => #<PublicSuffix::Domain @tld="com", @trd=nil>
+    #
+    # @example Initialize with a TLD, SLD and TRD
+    #   PublicSuffix::Domain.new("com", "example", "wwww")
+    #   # => #<PublicSuffix::Domain @tld="com", @trd=nil, @sld="example">
+    #
+    def initialize(*args)
+      @tld, @sld, @trd = args
+      yield(self) if block_given?
+    end
+
+    # Returns a string representation of this object.
+    #
+    # @return [String]
+    def to_s
+      name
+    end
+
+    # Returns an array containing the domain parts.
+    #
+    # @return [Array<String, nil>]
+    #
+    # @example
+    #
+    #   PublicSuffix::Domain.new("google.com").to_a
+    #   # => [nil, "google", "com"]
+    #
+    #   PublicSuffix::Domain.new("www.google.com").to_a
+    #   # => [nil, "google", "com"]
+    #
+    def to_a
+      [@trd, @sld, @tld]
+    end
+
+    # Returns the full domain name.
+    #
+    # @return [String]
+    #
+    # @example Gets the domain name of a domain
+    #   PublicSuffix::Domain.new("com", "google").name
+    #   # => "google.com"
+    #
+    # @example Gets the domain name of a subdomain
+    #   PublicSuffix::Domain.new("com", "google", "www").name
+    #   # => "www.google.com"
+    #
+    def name
+      [@trd, @sld, @tld].compact.join(DOT)
+    end
+
+    # Returns a domain-like representation of this object
+    # if the object is a {#domain?}, <tt>nil</tt> otherwise.
+    #
+    #   PublicSuffix::Domain.new("com").domain
+    #   # => nil
+    #
+    #   PublicSuffix::Domain.new("com", "google").domain
+    #   # => "google.com"
+    #
+    #   PublicSuffix::Domain.new("com", "google", "www").domain
+    #   # => "www.google.com"
+    #
+    # This method doesn't validate the input. It handles the domain
+    # as a valid domain name and simply applies the necessary transformations.
+    #
+    # This method returns a FQD, not just the domain part.
+    # To get the domain part, use <tt>#sld</tt> (aka second level domain).
+    #
+    #   PublicSuffix::Domain.new("com", "google", "www").domain
+    #   # => "google.com"
+    #
+    #   PublicSuffix::Domain.new("com", "google", "www").sld
+    #   # => "google"
+    #
+    # @see #domain?
+    # @see #subdomain
+    #
+    # @return [String]
+    def domain
+      [@sld, @tld].join(DOT) if domain?
+    end
+
+    # Returns a subdomain-like representation of this object
+    # if the object is a {#subdomain?}, <tt>nil</tt> otherwise.
+    #
+    #   PublicSuffix::Domain.new("com").subdomain
+    #   # => nil
+    #
+    #   PublicSuffix::Domain.new("com", "google").subdomain
+    #   # => nil
+    #
+    #   PublicSuffix::Domain.new("com", "google", "www").subdomain
+    #   # => "www.google.com"
+    #
+    # This method doesn't validate the input. It handles the domain
+    # as a valid domain name and simply applies the necessary transformations.
+    #
+    # This method returns a FQD, not just the subdomain part.
+    # To get the subdomain part, use <tt>#trd</tt> (aka third level domain).
+    #
+    #   PublicSuffix::Domain.new("com", "google", "www").subdomain
+    #   # => "www.google.com"
+    #
+    #   PublicSuffix::Domain.new("com", "google", "www").trd
+    #   # => "www"
+    #
+    # @see #subdomain?
+    # @see #domain
+    #
+    # @return [String]
+    def subdomain
+      [@trd, @sld, @tld].join(DOT) if subdomain?
+    end
+
+    # Checks whether <tt>self</tt> looks like a domain.
+    #
+    # This method doesn't actually validate the domain.
+    # It only checks whether the instance contains
+    # a value for the {#tld} and {#sld} attributes.
+    # If you also want to validate the domain,
+    # use {#valid_domain?} instead.
+    #
+    # @example
+    #
+    #   PublicSuffix::Domain.new("com").domain?
+    #   # => false
+    #
+    #   PublicSuffix::Domain.new("com", "google").domain?
+    #   # => true
+    #
+    #   PublicSuffix::Domain.new("com", "google", "www").domain?
+    #   # => true
+    #
+    #   # This is an invalid domain, but returns true
+    #   # because this method doesn't validate the content.
+    #   PublicSuffix::Domain.new("com", nil).domain?
+    #   # => true
+    #
+    # @see #subdomain?
+    #
+    # @return [Boolean]
+    def domain?
+      !(@tld.nil? || @sld.nil?)
+    end
+
+    # Checks whether <tt>self</tt> looks like a subdomain.
+    #
+    # This method doesn't actually validate the subdomain.
+    # It only checks whether the instance contains
+    # a value for the {#tld}, {#sld} and {#trd} attributes.
+    # If you also want to validate the domain,
+    # use {#valid_subdomain?} instead.
+    #
+    # @example
+    #
+    #   PublicSuffix::Domain.new("com").subdomain?
+    #   # => false
+    #
+    #   PublicSuffix::Domain.new("com", "google").subdomain?
+    #   # => false
+    #
+    #   PublicSuffix::Domain.new("com", "google", "www").subdomain?
+    #   # => true
+    #
+    #   # This is an invalid domain, but returns true
+    #   # because this method doesn't validate the content.
+    #   PublicSuffix::Domain.new("com", "example", nil).subdomain?
+    #   # => true
+    #
+    # @see #domain?
+    #
+    # @return [Boolean]
+    def subdomain?
+      !(@tld.nil? || @sld.nil? || @trd.nil?)
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/errors.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/errors.rb
new file mode 100644
index 0000000..a636e76
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/errors.rb
@@ -0,0 +1,39 @@
+# = Public Suffix
+#
+# Domain name parser based on the Public Suffix List.
+#
+# Copyright (c) 2009-2017 Simone Carletti <weppos@weppos.net>
+
+module PublicSuffix
+
+  class Error < StandardError
+  end
+
+  # Raised when trying to parse an invalid name.
+  # A name is considered invalid when no rule is found in the definition list.
+  #
+  # @example
+  #
+  #   PublicSuffix.parse("nic.test")
+  #   # => PublicSuffix::DomainInvalid
+  #
+  #   PublicSuffix.parse("http://www.nic.it")
+  #   # => PublicSuffix::DomainInvalid
+  #
+  class DomainInvalid < Error
+  end
+
+  # Raised when trying to parse a name that matches a suffix.
+  #
+  # @example
+  #
+  #   PublicSuffix.parse("nic.do")
+  #   # => PublicSuffix::DomainNotAllowed
+  #
+  #   PublicSuffix.parse("www.nic.do")
+  #   # => PublicSuffix::Domain
+  #
+  class DomainNotAllowed < DomainInvalid
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/list.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/list.rb
new file mode 100644
index 0000000..04e53a9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/list.rb
@@ -0,0 +1,245 @@
+# = Public Suffix
+#
+# Domain name parser based on the Public Suffix List.
+#
+# Copyright (c) 2009-2017 Simone Carletti <weppos@weppos.net>
+
+module PublicSuffix
+
+  # A {PublicSuffix::List} is a collection of one
+  # or more {PublicSuffix::Rule}.
+  #
+  # Given a {PublicSuffix::List},
+  # you can add or remove {PublicSuffix::Rule},
+  # iterate all items in the list or search for the first rule
+  # which matches a specific domain name.
+  #
+  #   # Create a new list
+  #   list =  PublicSuffix::List.new
+  #
+  #   # Push two rules to the list
+  #   list << PublicSuffix::Rule.factory("it")
+  #   list << PublicSuffix::Rule.factory("com")
+  #
+  #   # Get the size of the list
+  #   list.size
+  #   # => 2
+  #
+  #   # Search for the rule matching given domain
+  #   list.find("example.com")
+  #   # => #<PublicSuffix::Rule::Normal>
+  #   list.find("example.org")
+  #   # => nil
+  #
+  # You can create as many {PublicSuffix::List} you want.
+  # The {PublicSuffix::List.default} rule list is used
+  # to tokenize and validate a domain.
+  #
+  class List
+
+    DEFAULT_LIST_PATH = File.expand_path("../../data/list.txt", __dir__)
+
+    # Gets the default rule list.
+    #
+    # Initializes a new {PublicSuffix::List} parsing the content
+    # of {PublicSuffix::List.default_list_content}, if required.
+    #
+    # @return [PublicSuffix::List]
+    def self.default(**options)
+      @default ||= parse(File.read(DEFAULT_LIST_PATH), options)
+    end
+
+    # Sets the default rule list to +value+.
+    #
+    # @param [PublicSuffix::List] value
+    #   The new rule list.
+    #
+    # @return [PublicSuffix::List]
+    def self.default=(value)
+      @default = value
+    end
+
+    # Parse given +input+ treating the content as Public Suffix List.
+    #
+    # See http://publicsuffix.org/format/ for more details about input format.
+    #
+    # @param  string [#each_line] The list to parse.
+    # @param  private_domains [Boolean] whether to ignore the private domains section.
+    # @return [Array<PublicSuffix::Rule::*>]
+    def self.parse(input, private_domains: true)
+      comment_token = "//".freeze
+      private_token = "===BEGIN PRIVATE DOMAINS===".freeze
+      section = nil # 1 == ICANN, 2 == PRIVATE
+
+      new do |list|
+        input.each_line do |line|
+          line.strip!
+          case # rubocop:disable Style/EmptyCaseCondition
+
+          # skip blank lines
+          when line.empty?
+            next
+
+          # include private domains or stop scanner
+          when line.include?(private_token)
+            break if !private_domains
+            section = 2
+
+          # skip comments
+          when line.start_with?(comment_token)
+            next
+
+          else
+            list.add(Rule.factory(line, private: section == 2))
+
+          end
+        end
+      end
+    end
+
+
+    # Initializes an empty {PublicSuffix::List}.
+    #
+    # @yield [self] Yields on self.
+    # @yieldparam [PublicSuffix::List] self The newly created instance.
+    def initialize
+      @rules = {}
+      yield(self) if block_given?
+    end
+
+
+    # Checks whether two lists are equal.
+    #
+    # List <tt>one</tt> is equal to <tt>two</tt>, if <tt>two</tt> is an instance of
+    # {PublicSuffix::List} and each +PublicSuffix::Rule::*+
+    # in list <tt>one</tt> is available in list <tt>two</tt>, in the same order.
+    #
+    # @param  other [PublicSuffix::List] the List to compare
+    # @return [Boolean]
+    def ==(other)
+      return false unless other.is_a?(List)
+      equal?(other) || @rules == other.rules
+    end
+    alias eql? ==
+
+    # Iterates each rule in the list.
+    def each(&block)
+      Enumerator.new do |y|
+        @rules.each do |key, node|
+          y << entry_to_rule(node, key)
+        end
+      end.each(&block)
+    end
+
+
+    # Adds the given object to the list and optionally refreshes the rule index.
+    #
+    # @param  rule [PublicSuffix::Rule::*] the rule to add to the list
+    # @return [self]
+    def add(rule)
+      @rules[rule.value] = rule_to_entry(rule)
+      self
+    end
+    alias << add
+
+    # Gets the number of rules in the list.
+    #
+    # @return [Integer]
+    def size
+      @rules.size
+    end
+
+    # Checks whether the list is empty.
+    #
+    # @return [Boolean]
+    def empty?
+      @rules.empty?
+    end
+
+    # Removes all rules.
+    #
+    # @return [self]
+    def clear
+      @rules.clear
+      self
+    end
+
+    # Finds and returns the rule corresponding to the longest public suffix for the hostname.
+    #
+    # @param  name [#to_s] the hostname
+    # @param  default [PublicSuffix::Rule::*] the default rule to return in case no rule matches
+    # @return [PublicSuffix::Rule::*]
+    def find(name, default: default_rule, **options)
+      rule = select(name, **options).inject do |l, r|
+        return r if r.class == Rule::Exception
+        l.length > r.length ? l : r
+      end
+      rule || default
+    end
+
+    # Selects all the rules matching given hostame.
+    #
+    # If `ignore_private` is set to true, the algorithm will skip the rules that are flagged as
+    # private domain. Note that the rules will still be part of the loop.
+    # If you frequently need to access lists ignoring the private domains,
+    # you should create a list that doesn't include these domains setting the
+    # `private_domains: false` option when calling {.parse}.
+    #
+    # Note that this method is currently private, as you should not rely on it. Instead,
+    # the public interface is {#find}. The current internal algorithm allows to return all
+    # matching rules, but different data structures may not be able to do it, and instead would
+    # return only the match. For this reason, you should rely on {#find}.
+    #
+    # @param  name [#to_s] the hostname
+    # @param  ignore_private [Boolean]
+    # @return [Array<PublicSuffix::Rule::*>]
+    def select(name, ignore_private: false)
+      name = name.to_s
+
+      parts = name.split(DOT).reverse!
+      index = 0
+      query = parts[index]
+      rules = []
+
+      loop do
+        match = @rules[query]
+        if !match.nil? && (ignore_private == false || match.private == false)
+          rules << entry_to_rule(match, query)
+        end
+
+        index += 1
+        break if index >= parts.size
+        query = parts[index] + DOT + query
+      end
+
+      rules
+    end
+    private :select
+
+    # Gets the default rule.
+    #
+    # @see PublicSuffix::Rule.default_rule
+    #
+    # @return [PublicSuffix::Rule::*]
+    def default_rule
+      PublicSuffix::Rule.default
+    end
+
+
+    protected
+
+    attr_reader :rules
+
+
+    private
+
+    def entry_to_rule(entry, value)
+      entry.type.new(value: value, length: entry.length, private: entry.private)
+    end
+
+    def rule_to_entry(rule)
+      Rule::Entry.new(rule.class, rule.length, rule.private)
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/rule.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/rule.rb
new file mode 100644
index 0000000..f5d8169
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/rule.rb
@@ -0,0 +1,348 @@
+# = Public Suffix
+#
+# Domain name parser based on the Public Suffix List.
+#
+# Copyright (c) 2009-2017 Simone Carletti <weppos@weppos.net>
+
+module PublicSuffix
+
+  # A Rule is a special object which holds a single definition
+  # of the Public Suffix List.
+  #
+  # There are 3 types of rules, each one represented by a specific
+  # subclass within the +PublicSuffix::Rule+ namespace.
+  #
+  # To create a new Rule, use the {PublicSuffix::Rule#factory} method.
+  #
+  #   PublicSuffix::Rule.factory("ar")
+  #   # => #<PublicSuffix::Rule::Normal>
+  #
+  module Rule
+
+    # @api internal
+    Entry = Struct.new(:type, :length, :private)
+
+    # = Abstract rule class
+    #
+    # This represent the base class for a Rule definition
+    # in the {Public Suffix List}[https://publicsuffix.org].
+    #
+    # This is intended to be an Abstract class
+    # and you shouldn't create a direct instance. The only purpose
+    # of this class is to expose a common interface
+    # for all the available subclasses.
+    #
+    # * {PublicSuffix::Rule::Normal}
+    # * {PublicSuffix::Rule::Exception}
+    # * {PublicSuffix::Rule::Wildcard}
+    #
+    # ## Properties
+    #
+    # A rule is composed by 4 properties:
+    #
+    # value   - A normalized version of the rule name.
+    #           The normalization process depends on rule tpe.
+    #
+    # Here's an example
+    #
+    #   PublicSuffix::Rule.factory("*.google.com")
+    #   #<PublicSuffix::Rule::Wildcard:0x1015c14b0
+    #       @value="google.com"
+    #   >
+    #
+    # ## Rule Creation
+    #
+    # The best way to create a new rule is passing the rule name
+    # to the <tt>PublicSuffix::Rule.factory</tt> method.
+    #
+    #   PublicSuffix::Rule.factory("com")
+    #   # => PublicSuffix::Rule::Normal
+    #
+    #   PublicSuffix::Rule.factory("*.com")
+    #   # => PublicSuffix::Rule::Wildcard
+    #
+    # This method will detect the rule type and create an instance
+    # from the proper rule class.
+    #
+    # ## Rule Usage
+    #
+    # A rule describes the composition of a domain name and explains how to tokenize
+    # the name into tld, sld and trd.
+    #
+    # To use a rule, you first need to be sure the name you want to tokenize
+    # can be handled by the current rule.
+    # You can use the <tt>#match?</tt> method.
+    #
+    #   rule = PublicSuffix::Rule.factory("com")
+    #
+    #   rule.match?("google.com")
+    #   # => true
+    #
+    #   rule.match?("google.com")
+    #   # => false
+    #
+    # Rule order is significant. A name can match more than one rule.
+    # See the {Public Suffix Documentation}[http://publicsuffix.org/format/]
+    # to learn more about rule priority.
+    #
+    # When you have the right rule, you can use it to tokenize the domain name.
+    #
+    #   rule = PublicSuffix::Rule.factory("com")
+    #
+    #   rule.decompose("google.com")
+    #   # => ["google", "com"]
+    #
+    #   rule.decompose("www.google.com")
+    #   # => ["www.google", "com"]
+    #
+    # @abstract
+    #
+    class Base
+
+      # @return [String] the rule definition
+      attr_reader :value
+
+      # @return [String] the length of the rule
+      attr_reader :length
+
+      # @return [Boolean] true if the rule is a private domain
+      attr_reader :private
+
+
+      # Initializes a new rule from the content.
+      #
+      # @param  content [String] the content of the rule
+      # @param  private [Boolean]
+      def self.build(content, private: false)
+        new(value: content, private: private)
+      end
+
+      # Initializes a new rule.
+      #
+      # @param  value [String]
+      # @param  private [Boolean]
+      def initialize(value:, length: nil, private: false)
+        @value    = value.to_s
+        @length   = length || @value.count(DOT) + 1
+        @private  = private
+      end
+
+      # Checks whether this rule is equal to <tt>other</tt>.
+      #
+      # @param  [PublicSuffix::Rule::*] other The rule to compare
+      # @return [Boolean]
+      #   Returns true if this rule and other are instances of the same class
+      #   and has the same value, false otherwise.
+      def ==(other)
+        equal?(other) || (self.class == other.class && value == other.value)
+      end
+      alias eql? ==
+
+      # Checks if this rule matches +name+.
+      #
+      # A domain name is said to match a rule if and only if
+      # all of the following conditions are met:
+      #
+      # - When the domain and rule are split into corresponding labels,
+      #   that the domain contains as many or more labels than the rule.
+      # - Beginning with the right-most labels of both the domain and the rule,
+      #   and continuing for all labels in the rule, one finds that for every pair,
+      #   either they are identical, or that the label from the rule is "*".
+      #
+      # @see https://publicsuffix.org/list/
+      #
+      # @example
+      #   PublicSuffix::Rule.factory("com").match?("example.com")
+      #   # => true
+      #   PublicSuffix::Rule.factory("com").match?("example.net")
+      #   # => false
+      #
+      # @param  name [String] the domain name to check
+      # @return [Boolean]
+      def match?(name)
+        # Note: it works because of the assumption there are no
+        # rules like foo.*.com. If the assumption is incorrect,
+        # we need to properly walk the input and skip parts according
+        # to wildcard component.
+        diff = name.chomp(value)
+        diff.empty? || diff[-1] == DOT
+      end
+
+      # @abstract
+      def parts
+        raise NotImplementedError
+      end
+
+      # @abstract
+      # @param  [String, #to_s] name The domain name to decompose
+      # @return [Array<String, nil>]
+      def decompose(*)
+        raise NotImplementedError
+      end
+
+    end
+
+    # Normal represents a standard rule (e.g. com).
+    class Normal < Base
+
+      # Gets the original rule definition.
+      #
+      # @return [String] The rule definition.
+      def rule
+        value
+      end
+
+      # Decomposes the domain name according to rule properties.
+      #
+      # @param  [String, #to_s] name The domain name to decompose
+      # @return [Array<String>] The array with [trd + sld, tld].
+      def decompose(domain)
+        suffix = parts.join('\.')
+        matches = domain.to_s.match(/^(.*)\.(#{suffix})$/)
+        matches ? matches[1..2] : [nil, nil]
+      end
+
+      # dot-split rule value and returns all rule parts
+      # in the order they appear in the value.
+      #
+      # @return [Array<String>]
+      def parts
+        @value.split(DOT)
+      end
+
+    end
+
+    # Wildcard represents a wildcard rule (e.g. *.co.uk).
+    class Wildcard < Base
+
+      # Initializes a new rule from the content.
+      #
+      # @param  content [String] the content of the rule
+      # @param  private [Boolean]
+      def self.build(content, private: false)
+        new(value: content.to_s[2..-1], private: private)
+      end
+
+      # Initializes a new rule.
+      #
+      # @param  value [String]
+      # @param  private [Boolean]
+      def initialize(value:, length: nil, private: false)
+        super(value: value, length: length, private: private)
+        length or @length += 1 # * counts as 1
+      end
+
+      # Gets the original rule definition.
+      #
+      # @return [String] The rule definition.
+      def rule
+        value == "" ? STAR : STAR + DOT + value
+      end
+
+      # Decomposes the domain name according to rule properties.
+      #
+      # @param  [String, #to_s] name The domain name to decompose
+      # @return [Array<String>] The array with [trd + sld, tld].
+      def decompose(domain)
+        suffix = ([".*?"] + parts).join('\.')
+        matches = domain.to_s.match(/^(.*)\.(#{suffix})$/)
+        matches ? matches[1..2] : [nil, nil]
+      end
+
+      # dot-split rule value and returns all rule parts
+      # in the order they appear in the value.
+      #
+      # @return [Array<String>]
+      def parts
+        @value.split(DOT)
+      end
+
+    end
+
+    # Exception represents an exception rule (e.g. !parliament.uk).
+    class Exception < Base
+
+      # Initializes a new rule from the content.
+      #
+      # @param  content [String] the content of the rule
+      # @param  private [Boolean]
+      def self.build(content, private: false)
+        new(value: content.to_s[1..-1], private: private)
+      end
+
+      # Gets the original rule definition.
+      #
+      # @return [String] The rule definition.
+      def rule
+        BANG + value
+      end
+
+      # Decomposes the domain name according to rule properties.
+      #
+      # @param  [String, #to_s] name The domain name to decompose
+      # @return [Array<String>] The array with [trd + sld, tld].
+      def decompose(domain)
+        suffix = parts.join('\.')
+        matches = domain.to_s.match(/^(.*)\.(#{suffix})$/)
+        matches ? matches[1..2] : [nil, nil]
+      end
+
+      # dot-split rule value and returns all rule parts
+      # in the order they appear in the value.
+      # The leftmost label is not considered a label.
+      #
+      # See http://publicsuffix.org/format/:
+      # If the prevailing rule is a exception rule,
+      # modify it by removing the leftmost label.
+      #
+      # @return [Array<String>]
+      def parts
+        @value.split(DOT)[1..-1]
+      end
+
+    end
+
+
+    # Takes the +name+ of the rule, detects the specific rule class
+    # and creates a new instance of that class.
+    # The +name+ becomes the rule +value+.
+    #
+    # @example Creates a Normal rule
+    #   PublicSuffix::Rule.factory("ar")
+    #   # => #<PublicSuffix::Rule::Normal>
+    #
+    # @example Creates a Wildcard rule
+    #   PublicSuffix::Rule.factory("*.ar")
+    #   # => #<PublicSuffix::Rule::Wildcard>
+    #
+    # @example Creates an Exception rule
+    #   PublicSuffix::Rule.factory("!congresodelalengua3.ar")
+    #   # => #<PublicSuffix::Rule::Exception>
+    #
+    # @param  [String] content The rule content.
+    # @return [PublicSuffix::Rule::*] A rule instance.
+    def self.factory(content, private: false)
+      case content.to_s[0, 1]
+      when STAR
+        Wildcard
+      when BANG
+        Exception
+      else
+        Normal
+      end.build(content, private: private)
+    end
+
+    # The default rule to use if no rule match.
+    #
+    # The default rule is "*". From https://publicsuffix.org/list/:
+    #
+    # > If no rules match, the prevailing rule is "*".
+    #
+    # @return [PublicSuffix::Rule::Wildcard] The default rule.
+    def self.default
+      factory(STAR)
+    end
+
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/version.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/version.rb
new file mode 100644
index 0000000..b422ab1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/lib/public_suffix/version.rb
@@ -0,0 +1,10 @@
+# = Public Suffix
+#
+# Domain name parser based on the Public Suffix List.
+#
+# Copyright (c) 2009-2017 Simone Carletti <weppos@weppos.net>
+
+module PublicSuffix
+  # The current library version.
+  VERSION = "3.0.0".freeze
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/public_suffix.gemspec b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/public_suffix.gemspec
new file mode 100644
index 0000000..44bfccf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/public_suffix.gemspec
@@ -0,0 +1,25 @@
+# -*- encoding: utf-8 -*-
+$LOAD_PATH.push File.expand_path("../lib", __FILE__)
+require "public_suffix/version"
+
+Gem::Specification.new do |s|
+  s.name        = "public_suffix"
+  s.version     = PublicSuffix::VERSION
+  s.authors     = ["Simone Carletti"]
+  s.email       = ["weppos@weppos.net"]
+  s.homepage    = "https://simonecarletti.com/code/publicsuffix-ruby"
+  s.summary     = "Domain name parser based on the Public Suffix List."
+  s.description = "PublicSuffix can parse and decompose a domain name into top level domain, domain and subdomains."
+  s.licenses    = ["MIT"]
+
+  s.required_ruby_version = ">= 2.1"
+
+  s.require_paths    = ["lib"]
+  s.files            = `git ls-files`.split("\n")
+  s.test_files       = `git ls-files -- {test,spec,features}/*`.split("\n")
+  s.extra_rdoc_files = %w( LICENSE.txt )
+
+  s.add_development_dependency "rake"
+  s.add_development_dependency "mocha"
+  s.add_development_dependency "yard"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/.empty b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/.empty
new file mode 100644
index 0000000..e322015
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/.empty
@@ -0,0 +1,2 @@
+# This is an empty file I use to force a non-empty commit when I only need to store notes
+..
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/acceptance_test.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/acceptance_test.rb
new file mode 100644
index 0000000..147f41f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/acceptance_test.rb
@@ -0,0 +1,127 @@
+require "test_helper"
+
+class AcceptanceTest < Minitest::Test
+
+  VALID_CASES = [
+      ["example.com",             "example.com",        [nil, "example", "com"]],
+      ["foo.example.com",         "example.com",        ["foo", "example", "com"]],
+
+      ["verybritish.co.uk",       "verybritish.co.uk",  [nil, "verybritish", "co.uk"]],
+      ["foo.verybritish.co.uk",   "verybritish.co.uk",  ["foo", "verybritish", "co.uk"]],
+
+      ["parliament.uk",           "parliament.uk",      [nil, "parliament", "uk"]],
+      ["foo.parliament.uk",       "parliament.uk",      ["foo", "parliament", "uk"]],
+  ].freeze
+
+  def test_valid
+    VALID_CASES.each do |input, domain, results|
+      parsed = PublicSuffix.parse(input)
+      trd, sld, tld = results
+      assert_equal tld, parsed.tld, "Invalid tld for `#{name}`"
+      assert_equal sld, parsed.sld, "Invalid sld for `#{name}`"
+      if trd.nil?
+        assert_nil parsed.trd, "Invalid trd for `#{name}`"
+      else
+        assert_equal trd, parsed.trd, "Invalid trd for `#{name}`"
+      end
+
+      assert_equal domain, PublicSuffix.domain(input)
+      assert PublicSuffix.valid?(input)
+    end
+  end
+
+
+  INVALID_CASES = [
+      ["nic.ke",                  PublicSuffix::DomainNotAllowed],
+      [nil,                       PublicSuffix::DomainInvalid],
+      ["",                        PublicSuffix::DomainInvalid],
+      ["  ",                      PublicSuffix::DomainInvalid],
+  ].freeze
+
+  def test_invalid
+    INVALID_CASES.each do |(name, error)|
+      assert_raises(error) { PublicSuffix.parse(name) }
+      assert !PublicSuffix.valid?(name)
+    end
+  end
+
+
+  REJECTED_CASES = [
+      ["www. .com",           true],
+      ["foo.co..uk",          true],
+      ["goo,gle.com",         true],
+      ["-google.com",         true],
+      ["google-.com",         true],
+
+      # This case was covered in GH-15.
+      # I decided to cover this case because it's not easily reproducible with URI.parse
+      # and can lead to several false positives.
+      ["http://google.com",   false],
+  ].freeze
+
+  def test_rejected
+    REJECTED_CASES.each do |name, expected|
+      assert_equal expected, PublicSuffix.valid?(name),
+                   "Expected %s to be %s" % [name.inspect, expected.inspect]
+      assert !valid_domain?(name),
+             "#{name} expected to be invalid"
+    end
+  end
+
+
+  CASE_CASES = [
+      ["Www.google.com", %w( www google com )],
+      ["www.Google.com", %w( www google com )],
+      ["www.google.Com", %w( www google com )],
+  ].freeze
+
+  def test_ignore_case
+    CASE_CASES.each do |name, results|
+      domain = PublicSuffix.parse(name)
+      trd, sld, tld = results
+      assert_equal tld, domain.tld, "Invalid tld for `#{name}'"
+      assert_equal sld, domain.sld, "Invalid sld for `#{name}'"
+      assert_equal trd, domain.trd, "Invalid trd for `#{name}'"
+      assert PublicSuffix.valid?(name)
+    end
+  end
+
+
+  INCLUDE_PRIVATE_CASES = [
+      ["blogspot.com", true, "blogspot.com"],
+      ["blogspot.com", false, nil],
+      ["subdomain.blogspot.com", true, "blogspot.com"],
+      ["subdomain.blogspot.com", false, "subdomain.blogspot.com"],
+  ].freeze
+
+  def test_ignore_private
+    # test domain and parse
+    INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected|
+      if expected.nil?
+        assert_nil PublicSuffix.domain(given, ignore_private: ignore_private)
+      else
+        assert_equal expected, PublicSuffix.domain(given, ignore_private: ignore_private)
+      end
+    end
+    # test valid?
+    INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected|
+      assert_equal !expected.nil?, PublicSuffix.valid?(given, ignore_private: ignore_private)
+    end
+  end
+
+
+  def valid_uri?(name)
+    uri = URI.parse(name)
+    !uri.host.nil?
+  rescue
+    false
+  end
+
+  def valid_domain?(name)
+    uri = URI.parse(name)
+    !uri.host.nil? && uri.scheme.nil?
+  rescue
+    false
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_find.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_find.rb
new file mode 100644
index 0000000..0074f1d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_find.rb
@@ -0,0 +1,66 @@
+require 'benchmark'
+require_relative "../../lib/public_suffix"
+
+NAME_SHORT  = "example.de"
+NAME_MEDIUM = "www.subdomain.example.de"
+NAME_LONG   = "one.two.three.four.five.example.de"
+NAME_WILD   = "one.two.three.four.five.example.bd"
+NAME_EXCP   = "one.two.three.four.five.www.ck"
+
+IAAA = "www.example.ac"
+IZZZ = "www.example.zone"
+
+PAAA = "one.two.three.four.five.example.beep.pl"
+PZZZ = "one.two.three.four.five.example.now.sh"
+
+JP   = "www.yokoshibahikari.chiba.jp"
+IT   = "www.example.it"
+COM  = "www.example.com"
+
+TIMES = (ARGV.first || 50_000).to_i
+
+# Initialize
+PublicSuffixList = PublicSuffix::List.default
+PublicSuffixList.find("example.com")
+
+Benchmark.bmbm(25) do |x|
+  x.report("NAME_SHORT") do
+    TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil }
+  end
+  x.report("NAME_MEDIUM") do
+    TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil }
+  end
+  x.report("NAME_LONG") do
+    TIMES.times { PublicSuffixList.find(NAME_LONG) != nil }
+  end
+  x.report("NAME_WILD") do
+    TIMES.times { PublicSuffixList.find(NAME_WILD) != nil }
+  end
+  x.report("NAME_EXCP") do
+    TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil }
+  end
+
+  x.report("IAAA") do
+    TIMES.times { PublicSuffixList.find(IAAA) != nil }
+  end
+  x.report("IZZZ") do
+    TIMES.times { PublicSuffixList.find(IZZZ) != nil }
+  end
+
+  x.report("PAAA") do
+    TIMES.times { PublicSuffixList.find(PAAA) != nil }
+  end
+  x.report("PZZZ") do
+    TIMES.times { PublicSuffixList.find(PZZZ) != nil }
+  end
+
+  x.report("JP") do
+    TIMES.times { PublicSuffixList.find(JP) != nil }
+  end
+  x.report("IT") do
+    TIMES.times { PublicSuffixList.find(IT) != nil }
+  end
+  x.report("COM") do
+    TIMES.times { PublicSuffixList.find(COM) != nil }
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_find_all.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_find_all.rb
new file mode 100644
index 0000000..0bcfd42
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_find_all.rb
@@ -0,0 +1,102 @@
+require 'benchmark'
+require_relative "../../lib/public_suffix"
+
+NAME_SHORT  = "example.de"
+NAME_MEDIUM = "www.subdomain.example.de"
+NAME_LONG   = "one.two.three.four.five.example.de"
+NAME_WILD   = "one.two.three.four.five.example.bd"
+NAME_EXCP   = "one.two.three.four.five.www.ck"
+
+IAAA = "www.example.ac"
+IZZZ = "www.example.zone"
+
+PAAA = "one.two.three.four.five.example.beep.pl"
+PZZZ = "one.two.three.four.five.example.now.sh"
+
+JP   = "www.yokoshibahikari.chiba.jp"
+IT   = "www.example.it"
+COM  = "www.example.com"
+
+TIMES = (ARGV.first || 50_000).to_i
+
+# Initialize
+PublicSuffixList = PublicSuffix::List.default
+PublicSuffixList.find("example.com")
+
+Benchmark.bmbm(25) do |x|
+  x.report("NAME_SHORT") do
+    TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil }
+  end
+  x.report("NAME_SHORT (noprivate)") do
+    TIMES.times { PublicSuffixList.find(NAME_SHORT, ignore_private: true) != nil }
+  end
+  x.report("NAME_MEDIUM") do
+    TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil }
+  end
+  x.report("NAME_MEDIUM (noprivate)") do
+    TIMES.times { PublicSuffixList.find(NAME_MEDIUM, ignore_private: true) != nil }
+  end
+  x.report("NAME_LONG") do
+    TIMES.times { PublicSuffixList.find(NAME_LONG) != nil }
+  end
+  x.report("NAME_LONG (noprivate)") do
+    TIMES.times { PublicSuffixList.find(NAME_LONG, ignore_private: true) != nil }
+  end
+  x.report("NAME_WILD") do
+    TIMES.times { PublicSuffixList.find(NAME_WILD) != nil }
+  end
+  x.report("NAME_WILD (noprivate)") do
+    TIMES.times { PublicSuffixList.find(NAME_WILD, ignore_private: true) != nil }
+  end
+  x.report("NAME_EXCP") do
+    TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil }
+  end
+  x.report("NAME_EXCP (noprivate)") do
+    TIMES.times { PublicSuffixList.find(NAME_EXCP, ignore_private: true) != nil }
+  end
+
+  x.report("IAAA") do
+    TIMES.times { PublicSuffixList.find(IAAA) != nil }
+  end
+  x.report("IAAA (noprivate)") do
+    TIMES.times { PublicSuffixList.find(IAAA, ignore_private: true) != nil }
+  end
+  x.report("IZZZ") do
+    TIMES.times { PublicSuffixList.find(IZZZ) != nil }
+  end
+  x.report("IZZZ (noprivate)") do
+    TIMES.times { PublicSuffixList.find(IZZZ, ignore_private: true) != nil }
+  end
+
+  x.report("PAAA") do
+    TIMES.times { PublicSuffixList.find(PAAA) != nil }
+  end
+  x.report("PAAA (noprivate)") do
+    TIMES.times { PublicSuffixList.find(PAAA, ignore_private: true) != nil }
+  end
+  x.report("PZZZ") do
+    TIMES.times { PublicSuffixList.find(PZZZ) != nil }
+  end
+  x.report("PZZZ (noprivate)") do
+    TIMES.times { PublicSuffixList.find(PZZZ, ignore_private: true) != nil }
+  end
+
+  x.report("JP") do
+    TIMES.times { PublicSuffixList.find(JP) != nil }
+  end
+  x.report("JP (noprivate)") do
+    TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil }
+  end
+  x.report("IT") do
+    TIMES.times { PublicSuffixList.find(IT) != nil }
+  end
+  x.report("IT (noprivate)") do
+    TIMES.times { PublicSuffixList.find(IT, ignore_private: true) != nil }
+  end
+  x.report("COM") do
+    TIMES.times { PublicSuffixList.find(COM) != nil }
+  end
+  x.report("COM (noprivate)") do
+    TIMES.times { PublicSuffixList.find(COM, ignore_private: true) != nil }
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_names.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_names.rb
new file mode 100644
index 0000000..36b2bce
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_names.rb
@@ -0,0 +1,91 @@
+require 'benchmark/ips'
+
+STRING = "www.subdomain.example.com"
+ARRAY  = %w(
+  com
+  example.com
+  subdomain.example.com
+  www.subdomain.example.com
+)
+
+def tokenizer1(string)
+  parts = string.split(".").reverse!
+  index = 0
+  query = parts[index]
+  names = []
+
+  loop do
+    names << query
+
+    index += 1
+    break if index >= parts.size
+    query = parts[index] + "." + query
+  end
+  names
+end
+
+def tokenizer2(string)
+  parts = string.split(".")
+  index = parts.size - 1
+  query = parts[index]
+  names = []
+
+  loop do
+    names << query
+
+    index -= 1
+    break if index < 0
+    query = parts[index] + "." + query
+  end
+  names
+end
+
+def tokenizer3(string)
+  isx = string.size
+  idx = string.size - 1
+  names = []
+
+  loop do
+    isx = string.rindex(".", isx - 1) || -1
+    names << string[isx + 1, idx - isx]
+
+    break if isx <= 0
+  end
+  names
+end
+
+def tokenizer4(string)
+  isx = string.size
+  idx = string.size - 1
+  names = []
+
+  loop do
+    isx = string.rindex(".", isx - 1) || -1
+    names << string[(isx+1)..idx]
+
+    break if isx <= 0
+  end
+  names
+end
+
+(x = tokenizer1(STRING)) == ARRAY or fail("tokenizer1 failed: #{x.inspect}")
+(x = tokenizer2(STRING)) == ARRAY or fail("tokenizer2 failed: #{x.inspect}")
+(x = tokenizer3(STRING)) == ARRAY or fail("tokenizer3 failed: #{x.inspect}")
+(x = tokenizer4(STRING)) == ARRAY or fail("tokenizer4 failed: #{x.inspect}")
+
+Benchmark.ips do |x|
+  x.report("tokenizer1") do
+    tokenizer1(STRING).is_a?(Array)
+  end
+  x.report("tokenizer2") do
+    tokenizer2(STRING).is_a?(Array)
+  end
+  x.report("tokenizer3") do
+    tokenizer3(STRING).is_a?(Array)
+  end
+  x.report("tokenizer4") do
+    tokenizer4(STRING).is_a?(Array)
+  end
+
+  x.compare!
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_select.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_select.rb
new file mode 100644
index 0000000..66d908b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_select.rb
@@ -0,0 +1,26 @@
+require 'benchmark'
+require_relative "../../lib/public_suffix"
+
+JP   = "www.yokoshibahikari.chiba.jp"
+
+TIMES = (ARGV.first || 50_000).to_i
+
+# Initialize
+class PublicSuffix::List
+  public :select
+end
+PublicSuffixList = PublicSuffix::List.default
+PublicSuffixList.select("example.jp")
+PublicSuffixList.find("example.jp")
+
+Benchmark.bmbm(25) do |x|
+  x.report("JP select") do
+    TIMES.times { PublicSuffixList.select(JP) }
+  end
+  x.report("JP find") do
+    TIMES.times { PublicSuffixList.find(JP) }
+  end
+  # x.report("JP (noprivate)") do
+  #   TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil }
+  # end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_select_incremental.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_select_incremental.rb
new file mode 100644
index 0000000..f002c82
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_select_incremental.rb
@@ -0,0 +1,25 @@
+require 'benchmark'
+require_relative "../../lib/public_suffix"
+
+JP   = "www.yokoshibahikari.chiba.jp"
+
+TIMES = (ARGV.first || 50_000).to_i
+
+# Initialize
+class PublicSuffix::List
+  public :select
+end
+PublicSuffixList = PublicSuffix::List.default
+PublicSuffixList.select("example.jp")
+
+Benchmark.bmbm(25) do |x|
+  x.report("select jp") do
+    TIMES.times { PublicSuffixList.select("jp") }
+  end
+  x.report("select example.jp") do
+    TIMES.times { PublicSuffixList.select("example.jp") }
+  end
+  x.report("select www.example.jp") do
+    TIMES.times { PublicSuffixList.select("www.example.jp") }
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_valid.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_valid.rb
new file mode 100644
index 0000000..a484451
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/benchmarks/bm_valid.rb
@@ -0,0 +1,101 @@
+require 'benchmark'
+require_relative "../../lib/public_suffix"
+
+NAME_SHORT  = "example.de"
+NAME_MEDIUM = "www.subdomain.example.de"
+NAME_LONG   = "one.two.three.four.five.example.de"
+NAME_WILD   = "one.two.three.four.five.example.bd"
+NAME_EXCP   = "one.two.three.four.five.www.ck"
+
+IAAA = "www.example.ac"
+IZZZ = "www.example.zone"
+
+PAAA = "one.two.three.four.five.example.beep.pl"
+PZZZ = "one.two.three.four.five.example.now.sh"
+
+JP   = "www.yokoshibahikari.chiba.jp"
+IT   = "www.example.it"
+COM  = "www.example.com"
+
+TIMES = (ARGV.first || 50_000).to_i
+
+# Initialize
+PublicSuffix.valid?("example.com")
+
+Benchmark.bmbm(25) do |x|
+  x.report("NAME_SHORT") do
+    TIMES.times { PublicSuffix.valid?(NAME_SHORT) == true }
+  end
+  x.report("NAME_SHORT (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(NAME_SHORT, ignore_private: true) == true }
+  end
+  x.report("NAME_MEDIUM") do
+    TIMES.times { PublicSuffix.valid?(NAME_MEDIUM) == true }
+  end
+  x.report("NAME_MEDIUM (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(NAME_MEDIUM, ignore_private: true) == true }
+  end
+  x.report("NAME_LONG") do
+    TIMES.times { PublicSuffix.valid?(NAME_LONG) == true }
+  end
+  x.report("NAME_LONG (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(NAME_LONG, ignore_private: true) == true }
+  end
+  x.report("NAME_WILD") do
+    TIMES.times { PublicSuffix.valid?(NAME_WILD) == true }
+  end
+  x.report("NAME_WILD (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(NAME_WILD, ignore_private: true) == true }
+  end
+  x.report("NAME_EXCP") do
+    TIMES.times { PublicSuffix.valid?(NAME_EXCP) == true }
+  end
+  x.report("NAME_EXCP (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(NAME_EXCP, ignore_private: true) == true }
+  end
+
+  x.report("IAAA") do
+    TIMES.times { PublicSuffix.valid?(IAAA) == true }
+  end
+  x.report("IAAA (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(IAAA, ignore_private: true) == true }
+  end
+  x.report("IZZZ") do
+    TIMES.times { PublicSuffix.valid?(IZZZ) == true }
+  end
+  x.report("IZZZ (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(IZZZ, ignore_private: true) == true }
+  end
+
+  x.report("PAAA") do
+    TIMES.times { PublicSuffix.valid?(PAAA) == true }
+  end
+  x.report("PAAA (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(PAAA, ignore_private: true) == true }
+  end
+  x.report("PZZZ") do
+    TIMES.times { PublicSuffix.valid?(PZZZ) == true }
+  end
+  x.report("PZZZ (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(PZZZ, ignore_private: true) == true }
+  end
+
+  x.report("JP") do
+    TIMES.times { PublicSuffix.valid?(JP) == true }
+  end
+  x.report("JP (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(JP, ignore_private: true) == true }
+  end
+  x.report("IT") do
+    TIMES.times { PublicSuffix.valid?(IT) == true }
+  end
+  x.report("IT (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(IT, ignore_private: true) == true }
+  end
+  x.report("COM") do
+    TIMES.times { PublicSuffix.valid?(COM) == true }
+  end
+  x.report("COM (noprivate)") do
+    TIMES.times { PublicSuffix.valid?(COM, ignore_private: true) == true }
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/domain_profiler.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/domain_profiler.rb
new file mode 100644
index 0000000..1ed1050
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/domain_profiler.rb
@@ -0,0 +1,12 @@
+$LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
+
+require "memory_profiler"
+require "public_suffix"
+
+PublicSuffix::List.default
+
+report = MemoryProfiler.report do
+  PublicSuffix.domain("www.example.com")
+end
+
+report.pretty_print
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/find_profiler.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/find_profiler.rb
new file mode 100644
index 0000000..53d28eb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/find_profiler.rb
@@ -0,0 +1,12 @@
+$LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
+
+require "memory_profiler"
+require "public_suffix"
+
+PublicSuffix::List.default
+
+report = MemoryProfiler.report do
+  PublicSuffix::List.default.find("www.example.com")
+end
+
+report.pretty_print
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/find_profiler_jp.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/find_profiler_jp.rb
new file mode 100644
index 0000000..65c13fe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/find_profiler_jp.rb
@@ -0,0 +1,12 @@
+$LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
+
+require "memory_profiler"
+require "public_suffix"
+
+PublicSuffix::List.default
+
+report = MemoryProfiler.report do
+  PublicSuffix::List.default.find("a.b.ide.kyoto.jp")
+end
+
+report.pretty_print
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/initialization_profiler.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/initialization_profiler.rb
new file mode 100644
index 0000000..008b1e7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/initialization_profiler.rb
@@ -0,0 +1,11 @@
+$LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
+
+require "memory_profiler"
+require "public_suffix"
+
+report = MemoryProfiler.report do
+  PublicSuffix::List.default
+end
+
+report.pretty_print
+# report.pretty_print(to_file: 'profiler-%s-%d.txt' % [ARGV[0], Time.now.to_i])
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/list_profsize.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/list_profsize.rb
new file mode 100644
index 0000000..0b98b4b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/list_profsize.rb
@@ -0,0 +1,11 @@
+$LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
+
+require_relative "object_binsize"
+require "public_suffix"
+
+list = PublicSuffix::List.default
+puts "#{list.size} rules:"
+
+prof = ObjectBinsize.new
+prof.report(PublicSuffix::List.default, label: "PublicSuffix::List size")
+prof.report(PublicSuffix::List.default.instance_variable_get(:@rules), label: "Size of rules")
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/object_binsize.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/object_binsize.rb
new file mode 100644
index 0000000..dc60bdb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/profilers/object_binsize.rb
@@ -0,0 +1,57 @@
+require 'tempfile'
+
+# A very simple memory profiles that checks the full size of a variable
+# by serializing into a binary file.
+#
+# Yes, I know this is very rough, but there are cases where ObjectSpace.memsize_of
+# doesn't cooperate, and this is one of the possible workarounds.
+#
+# For certain cases, it works (TM).
+class ObjectBinsize
+
+  def measure(var, label: nil)
+    dump(var, label: label)
+  end
+
+  def report(var, label: nil, padding: 10)
+    file = measure(var, label: label)
+
+    size = format_integer(file.size)
+    name = label || File.basename(file.path)
+    printf("%#{padding}s   %s\n", size, name)
+  end
+
+  private
+
+  def dump(var, **args)
+    file = Tempfile.new(args[:label].to_s)
+    file.write(Marshal.dump(var))
+    file
+  ensure
+    file.close
+  end
+
+  def format_integer(int)
+    int.to_s.reverse.gsub(/...(?=.)/, '\&,').reverse
+  end
+
+end
+
+if __FILE__ == $0
+  prof = ObjectBinsize.new
+
+  prof.report(nil, label: "nil")
+  prof.report(false, label: "false")
+  prof.report(true, label: "true")
+  prof.report(0, label: "integer")
+  prof.report("", label: "empty string")
+  prof.report({}, label: "empty hash")
+  prof.report({}, label: "empty array")
+
+  prof.report({ foo: "1" }, label: "hash 1 item (symbol)")
+  prof.report({ foo: "1", bar: 2 }, label: "hash 2 items (symbol)")
+  prof.report({ "foo" => "1" }, label: "hash 1 item (string)")
+  prof.report({ "foo" => "1", "bar" => 2 }, label: "hash 2 items (string)")
+
+  prof.report("big string" * 200, label: "big string * 200")
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/psl_test.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/psl_test.rb
new file mode 100644
index 0000000..81d3f9e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/psl_test.rb
@@ -0,0 +1,49 @@
+require "test_helper"
+require "public_suffix"
+
+# This test runs against the current PSL file and ensures
+# the definitions satisfies the test suite.
+class PslTest < Minitest::Test
+
+  ROOT = File.expand_path("../../", __FILE__)
+
+  # rubocop:disable Security/Eval
+  def self.tests
+    File.readlines(File.join(ROOT, "test/tests.txt")).map do |line|
+      line = line.strip
+      next if line.empty?
+      next if line.start_with?("//")
+      input, output = line.split(", ")
+
+      # handle the case of eval("null"), it must be eval("nil")
+      input  = "nil" if input  == "null"
+      output = "nil" if output == "null"
+
+      input  = eval(input)
+      output = eval(output)
+      [input, output]
+    end
+  end
+  # rubocop:enable
+
+
+  def test_valid
+    # Parse the PSL and run the tests
+    data = File.read(PublicSuffix::List::DEFAULT_LIST_PATH)
+    PublicSuffix::List.default = PublicSuffix::List.parse(data)
+
+    failures = []
+    self.class.tests.each do |input, output|
+      # Punycode domains are not supported ATM
+      next if input =~ /xn\-\-/
+
+      domain = PublicSuffix.domain(input) rescue nil
+      failures << [input, output, domain] if output != domain
+    end
+
+    message = "The following #{failures.size} tests fail:\n"
+    failures.each { |i, o, d| message += "Expected %s to be %s, got %s\n" % [i.inspect, o.inspect, d.inspect] }
+    assert_equal 0, failures.size, message
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/test_helper.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/test_helper.rb
new file mode 100644
index 0000000..943e7c7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/test_helper.rb
@@ -0,0 +1,13 @@
+if ENV["COVERALL"]
+  require "coveralls"
+  Coveralls.wear!
+end
+
+require "minitest/autorun"
+require "minitest/reporters"
+require "mocha/setup"
+
+Minitest::Reporters.use! Minitest::Reporters::DefaultReporter.new(color: true)
+
+$LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
+require "public_suffix"
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/tests.txt b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/tests.txt
new file mode 100644
index 0000000..b11150a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/tests.txt
@@ -0,0 +1,98 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+
+// null input
+null, null
+// Mixed case
+'COM', null
+'example.COM', 'example.com'
+'WwW.example.COM', 'example.com'
+// Leading dot
+'.com', null
+'.example', null
+'.example.com', null
+'.example.example', null
+// Unlisted TLD
+'example', null
+'example.example', 'example.example'
+'b.example.example', 'example.example'
+'a.b.example.example', 'example.example'
+// Listed, but non-Internet, TLD
+//'local', null
+//'example.local', null
+//'b.example.local', null
+//'a.b.example.local', null
+// TLD with only 1 rule
+'biz', null
+'domain.biz', 'domain.biz'
+'b.domain.biz', 'domain.biz'
+'a.b.domain.biz', 'domain.biz'
+// TLD with some 2-level rules
+'com', null
+'example.com', 'example.com'
+'b.example.com', 'example.com'
+'a.b.example.com', 'example.com'
+'uk.com', null
+'example.uk.com', 'example.uk.com'
+'b.example.uk.com', 'example.uk.com'
+'a.b.example.uk.com', 'example.uk.com'
+'test.ac', 'test.ac'
+// TLD with only 1 (wildcard) rule
+'mm', null
+'c.mm', null
+'b.c.mm', 'b.c.mm'
+'a.b.c.mm', 'b.c.mm'
+// More complex TLD
+'jp', null
+'test.jp', 'test.jp'
+'www.test.jp', 'test.jp'
+'ac.jp', null
+'test.ac.jp', 'test.ac.jp'
+'www.test.ac.jp', 'test.ac.jp'
+'kyoto.jp', null
+'test.kyoto.jp', 'test.kyoto.jp'
+'ide.kyoto.jp', null
+'b.ide.kyoto.jp', 'b.ide.kyoto.jp'
+'a.b.ide.kyoto.jp', 'b.ide.kyoto.jp'
+'c.kobe.jp', null
+'b.c.kobe.jp', 'b.c.kobe.jp'
+'a.b.c.kobe.jp', 'b.c.kobe.jp'
+'city.kobe.jp', 'city.kobe.jp'
+'www.city.kobe.jp', 'city.kobe.jp'
+// TLD with a wildcard rule and exceptions
+'ck', null
+'test.ck', null
+'b.test.ck', 'b.test.ck'
+'a.b.test.ck', 'b.test.ck'
+'www.ck', 'www.ck'
+'www.www.ck', 'www.ck'
+// US K12
+'us', null
+'test.us', 'test.us'
+'www.test.us', 'test.us'
+'ak.us', null
+'test.ak.us', 'test.ak.us'
+'www.test.ak.us', 'test.ak.us'
+'k12.ak.us', null
+'test.k12.ak.us', 'test.k12.ak.us'
+'www.test.k12.ak.us', 'test.k12.ak.us'
+// IDN labels
+'食狮.com.cn', '食狮.com.cn'
+'食狮.公司.cn', '食狮.公司.cn'
+'www.食狮.公司.cn', '食狮.公司.cn'
+'shishi.公司.cn', 'shishi.公司.cn'
+'公司.cn', null
+'食狮.中国', '食狮.中国'
+'www.食狮.中国', '食狮.中国'
+'shishi.中国', 'shishi.中国'
+'中国', null
+// Same as above, but punycoded
+'xn--85x722f.com.cn', 'xn--85x722f.com.cn'
+'xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'
+'www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'
+'shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn'
+'xn--55qx5d.cn', null
+'xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'
+'www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'
+'shishi.xn--fiqs8s', 'shishi.xn--fiqs8s'
+'xn--fiqs8s', null
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/domain_test.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/domain_test.rb
new file mode 100644
index 0000000..509ce1b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/domain_test.rb
@@ -0,0 +1,104 @@
+require "test_helper"
+
+class PublicSuffix::DomainTest < Minitest::Test
+
+  def setup
+    @klass = PublicSuffix::Domain
+  end
+
+  # Tokenizes given input into labels.
+  def test_self_name_to_labels
+    assert_equal  %w( someone spaces live com ),
+                  PublicSuffix::Domain.name_to_labels("someone.spaces.live.com")
+    assert_equal  %w( leontina23samiko wiki zoho com ),
+                  PublicSuffix::Domain.name_to_labels("leontina23samiko.wiki.zoho.com")
+  end
+
+  # Converts input into String.
+  def test_self_name_to_labels_converts_input_to_string
+    assert_equal  %w( someone spaces live com ),
+                  PublicSuffix::Domain.name_to_labels(:"someone.spaces.live.com")
+  end
+
+
+  def test_initialize_with_tld
+    domain = @klass.new("com")
+    assert_equal "com", domain.tld
+    assert_nil domain.sld
+    assert_nil domain.trd
+  end
+
+  def test_initialize_with_tld_and_sld
+    domain = @klass.new("com", "google")
+    assert_equal "com", domain.tld
+    assert_equal "google", domain.sld
+    assert_nil domain.trd
+  end
+
+  def test_initialize_with_tld_and_sld_and_trd
+    domain = @klass.new("com", "google", "www")
+    assert_equal "com", domain.tld
+    assert_equal "google", domain.sld
+    assert_equal "www", domain.trd
+  end
+
+
+  def test_to_s
+    assert_equal "com",             @klass.new("com").to_s
+    assert_equal "google.com",      @klass.new("com", "google").to_s
+    assert_equal "www.google.com",  @klass.new("com", "google", "www").to_s
+  end
+
+  def test_to_a
+    assert_equal [nil, nil, "com"],         @klass.new("com").to_a
+    assert_equal [nil, "google", "com"],    @klass.new("com", "google").to_a
+    assert_equal ["www", "google", "com"],  @klass.new("com", "google", "www").to_a
+  end
+
+
+  def test_tld
+    assert_equal "com", @klass.new("com", "google", "www").tld
+  end
+
+  def test_sld
+    assert_equal "google", @klass.new("com", "google", "www").sld
+  end
+
+  def test_trd
+    assert_equal "www", @klass.new("com", "google", "www").trd
+  end
+
+
+  def test_name
+    assert_equal "com",             @klass.new("com").name
+    assert_equal "google.com",      @klass.new("com", "google").name
+    assert_equal "www.google.com",  @klass.new("com", "google", "www").name
+  end
+
+  def test_domain
+    assert_nil @klass.new("com").domain
+    assert_nil @klass.new("tldnotlisted").domain
+    assert_equal "google.com", @klass.new("com", "google").domain
+    assert_equal "google.tldnotlisted", @klass.new("tldnotlisted", "google").domain
+    assert_equal "google.com", @klass.new("com", "google", "www").domain
+    assert_equal "google.tldnotlisted", @klass.new("tldnotlisted", "google", "www").domain
+  end
+
+  def test_subdomain
+    assert_nil @klass.new("com").subdomain
+    assert_nil @klass.new("tldnotlisted").subdomain
+    assert_nil @klass.new("com", "google").subdomain
+    assert_nil @klass.new("tldnotlisted", "google").subdomain
+    assert_equal "www.google.com", @klass.new("com", "google", "www").subdomain
+    assert_equal "www.google.tldnotlisted", @klass.new("tldnotlisted", "google", "www").subdomain
+  end
+
+
+  def test_domain_question
+    assert !@klass.new("com").domain?
+    assert  @klass.new("com", "example").domain?
+    assert  @klass.new("com", "example", "www").domain?
+    assert  @klass.new("tldnotlisted", "example").domain?
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/errors_test.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/errors_test.rb
new file mode 100644
index 0000000..47ac592
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/errors_test.rb
@@ -0,0 +1,23 @@
+require "test_helper"
+
+class ErrorsTest < Minitest::Test
+
+  # Inherits from StandardError
+  def test_error_inheritance
+    assert_kind_of  StandardError,
+                    PublicSuffix::Error.new
+  end
+
+  # Inherits from PublicSuffix::Error
+  def test_domain_invalid_inheritance
+    assert_kind_of  PublicSuffix::Error,
+                    PublicSuffix::DomainInvalid.new
+  end
+
+  # Inherits from PublicSuffix::DomainInvalid
+  def test_domain_not_allowed_inheritance
+    assert_kind_of  PublicSuffix::DomainInvalid,
+                    PublicSuffix::DomainNotAllowed.new
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/list_test.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/list_test.rb
new file mode 100644
index 0000000..874c5cc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/list_test.rb
@@ -0,0 +1,239 @@
+require "test_helper"
+
+class PublicSuffix::ListTest < Minitest::Test
+
+  def setup
+    @list = PublicSuffix::List.new
+  end
+
+  def teardown
+    PublicSuffix::List.default = nil
+  end
+
+
+  def test_initialize
+    assert_instance_of PublicSuffix::List, @list
+    assert_equal 0, @list.size
+  end
+
+
+  def test_equality_with_self
+    list = PublicSuffix::List.new
+    assert_equal list, list
+  end
+
+  def test_equality_with_internals
+    rule = PublicSuffix::Rule.factory("com")
+    assert_equal PublicSuffix::List.new.add(rule), PublicSuffix::List.new.add(rule)
+  end
+
+  def test_each_without_block
+    list = PublicSuffix::List.parse(<<EOS)
+alpha
+beta
+EOS
+
+    assert_kind_of Enumerator, list.each
+    assert_equal 2, list.each.count
+    assert_equal PublicSuffix::Rule.factory("alpha"), list.each.first
+  end
+
+  def test_each_with_block
+    list = PublicSuffix::List.parse(<<EOS)
+alpha
+beta
+EOS
+
+    entries = []
+    list.each { |r| entries << r }
+
+    assert_equal 2, entries.count
+    assert_equal PublicSuffix::Rule.factory("alpha"), entries.first
+  end
+
+
+  def test_add
+    assert_equal @list, @list.add(PublicSuffix::Rule.factory("foo"))
+    assert_equal @list, @list <<  PublicSuffix::Rule.factory("bar")
+    assert_equal 2, @list.size
+  end
+
+  def test_add_should_recreate_index
+    @list = PublicSuffix::List.parse("com")
+    assert_equal PublicSuffix::Rule.factory("com"), @list.find("google.com")
+    assert_equal @list.default_rule, @list.find("google.net")
+
+    @list << PublicSuffix::Rule.factory("net")
+    assert_equal PublicSuffix::Rule.factory("com"), @list.find("google.com")
+    assert_equal PublicSuffix::Rule.factory("net"), @list.find("google.net")
+  end
+
+  def test_empty?
+    assert @list.empty?
+    @list.add(PublicSuffix::Rule.factory(""))
+    assert !@list.empty?
+  end
+
+  def test_size
+    assert_equal 0, @list.size
+    assert_equal @list, @list.add(PublicSuffix::Rule.factory(""))
+    assert_equal 1, @list.size
+  end
+
+  def test_clear
+    assert_equal 0, @list.size
+    assert_equal @list, @list.add(PublicSuffix::Rule.factory(""))
+    assert_equal 1, @list.size
+    assert_equal @list, @list.clear
+    assert_equal 0, @list.size
+  end
+
+
+  def test_find
+    list = PublicSuffix::List.parse(<<EOS)
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+// ===BEGIN ICANN DOMAINS===
+
+// com
+com
+
+// uk
+*.uk
+*.sch.uk
+!bl.uk
+!british-library.uk
+
+// io
+io
+
+// ===END ICANN DOMAINS===
+// ===BEGIN PRIVATE DOMAINS===
+
+// Google, Inc.
+blogspot.com
+
+// ===END PRIVATE DOMAINS===
+EOS
+
+    # match IANA
+    assert_equal PublicSuffix::Rule.factory("com"), list.find("example.com")
+    assert_equal PublicSuffix::Rule.factory("com"), list.find("foo.example.com")
+
+    # match wildcard
+    assert_equal PublicSuffix::Rule.factory("*.uk"), list.find("example.uk")
+    assert_equal PublicSuffix::Rule.factory("*.uk"), list.find("example.co.uk")
+    assert_equal PublicSuffix::Rule.factory("*.uk"), list.find("foo.example.co.uk")
+
+    # match exception
+    assert_equal PublicSuffix::Rule.factory("!british-library.uk"), list.find("british-library.uk")
+    assert_equal PublicSuffix::Rule.factory("!british-library.uk"), list.find("foo.british-library.uk")
+
+    # match default rule
+    assert_equal PublicSuffix::Rule.factory("*"), list.find("test")
+    assert_equal PublicSuffix::Rule.factory("*"), list.find("example.test")
+    assert_equal PublicSuffix::Rule.factory("*"), list.find("foo.example.test")
+
+    # match private
+    assert_equal PublicSuffix::Rule.factory("blogspot.com", private: true), list.find("blogspot.com")
+    assert_equal PublicSuffix::Rule.factory("blogspot.com", private: true), list.find("foo.blogspot.com")
+  end
+
+
+  def test_select
+    assert_equal 2, list.send(:select, "british-library.uk").size
+  end
+
+  def test_select_name_blank
+    assert_equal [], list.send(:select, nil)
+    assert_equal [], list.send(:select, "")
+    assert_equal [], list.send(:select, " ")
+  end
+
+  def test_select_ignore_private
+    list = PublicSuffix::List.new
+    list.add r1 = PublicSuffix::Rule.factory("io")
+    list.add r2 = PublicSuffix::Rule.factory("example.io", private: true)
+
+    assert_equal list.send(:select, "foo.io"), [r1]
+    assert_equal list.send(:select, "example.io"), [r1, r2]
+    assert_equal list.send(:select, "foo.example.io"), [r1, r2]
+
+    assert_equal list.send(:select, "foo.io", ignore_private: false), [r1]
+    assert_equal list.send(:select, "example.io", ignore_private: false), [r1, r2]
+    assert_equal list.send(:select, "foo.example.io", ignore_private: false), [r1, r2]
+
+    assert_equal list.send(:select, "foo.io", ignore_private: true), [r1]
+    assert_equal list.send(:select, "example.io", ignore_private: true), [r1]
+    assert_equal list.send(:select, "foo.example.io", ignore_private: true), [r1]
+  end
+
+
+  def test_self_default_getter
+    PublicSuffix::List.default = nil
+    assert_nil(PublicSuffix::List.class_eval { @default })
+    PublicSuffix::List.default
+    refute_nil(PublicSuffix::List.class_eval { @default })
+  end
+
+  def test_self_default_setter
+    PublicSuffix::List.default
+    refute_nil(PublicSuffix::List.class_eval { @default })
+    PublicSuffix::List.default = nil
+    assert_nil(PublicSuffix::List.class_eval { @default })
+  end
+
+  def test_self_parse
+    list = PublicSuffix::List.parse(<<EOS)
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+// ===BEGIN ICANN DOMAINS===
+
+// com
+com
+
+// uk
+*.uk
+!british-library.uk
+
+// ===END ICANN DOMAINS===
+// ===BEGIN PRIVATE DOMAINS===
+
+// Google, Inc.
+blogspot.com
+
+// ===END PRIVATE DOMAINS===
+EOS
+
+    assert_instance_of PublicSuffix::List, list
+    assert_equal 4, list.size
+
+    rules = %w( com *.uk !british-library.uk blogspot.com ).map { |name| PublicSuffix::Rule.factory(name) }
+    assert_equal rules, list.each.to_a
+
+    # private domains
+    assert_equal false, list.find("com").private
+    assert_equal true,  list.find("blogspot.com").private
+  end
+
+
+  private
+
+  def list
+    @_list ||= PublicSuffix::List.parse(<<EOS)
+// com : http://en.wikipedia.org/wiki/.com
+com
+
+// uk : http://en.wikipedia.org/wiki/.uk
+*.uk
+*.sch.uk
+!bl.uk
+!british-library.uk
+EOS
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/public_suffix_test.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/public_suffix_test.rb
new file mode 100644
index 0000000..ee5ae1f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/public_suffix_test.rb
@@ -0,0 +1,186 @@
+require "test_helper"
+
+class PublicSuffixTest < Minitest::Test
+
+  def test_private_domains_enabled_by_default
+    domain = PublicSuffix.parse("www.example.blogspot.com")
+    assert_equal "blogspot.com", domain.tld
+  end
+
+  def test_private_domains_disable
+    data = File.read(PublicSuffix::List::DEFAULT_LIST_PATH)
+    PublicSuffix::List.default = PublicSuffix::List.parse(data, private_domains: false)
+    domain = PublicSuffix.parse("www.example.blogspot.com")
+    assert_equal "com", domain.tld
+  ensure
+    PublicSuffix::List.default = nil
+  end
+
+
+  def test_self_parse_a_domain_with_tld_and_sld
+    domain = PublicSuffix.parse("example.com")
+    assert_instance_of PublicSuffix::Domain, domain
+    assert_equal "com",     domain.tld
+    assert_equal "example", domain.sld
+    assert_nil              domain.trd
+
+    domain = PublicSuffix.parse("example.co.uk")
+    assert_instance_of PublicSuffix::Domain, domain
+    assert_equal "co.uk",   domain.tld
+    assert_equal "example", domain.sld
+    assert_nil              domain.trd
+  end
+
+  def test_self_parse_a_domain_with_tld_and_sld_and_trd
+    domain = PublicSuffix.parse("alpha.example.com")
+    assert_instance_of PublicSuffix::Domain, domain
+    assert_equal "com",     domain.tld
+    assert_equal "example", domain.sld
+    assert_equal "alpha",   domain.trd
+
+    domain = PublicSuffix.parse("alpha.example.co.uk")
+    assert_instance_of PublicSuffix::Domain, domain
+    assert_equal "co.uk",   domain.tld
+    assert_equal "example", domain.sld
+    assert_equal "alpha",   domain.trd
+  end
+
+  def test_self_parse_a_domain_with_tld_and_sld_and_4rd
+    domain = PublicSuffix.parse("one.two.example.com")
+    assert_instance_of PublicSuffix::Domain, domain
+    assert_equal "com",     domain.tld
+    assert_equal "example", domain.sld
+    assert_equal "one.two", domain.trd
+
+    domain = PublicSuffix.parse("one.two.example.co.uk")
+    assert_instance_of PublicSuffix::Domain, domain
+    assert_equal "co.uk",   domain.tld
+    assert_equal "example", domain.sld
+    assert_equal "one.two", domain.trd
+  end
+
+  def test_self_parse_name_fqdn
+    domain = PublicSuffix.parse("www.example.com.")
+    assert_instance_of PublicSuffix::Domain, domain
+    assert_equal "com",     domain.tld
+    assert_equal "example", domain.sld
+    assert_equal "www",     domain.trd
+  end
+
+  def test_self_parse_with_custom_list
+    list = PublicSuffix::List.new
+    list << PublicSuffix::Rule.factory("test")
+
+    domain = PublicSuffix.parse("www.example.test", list: list)
+    assert_instance_of PublicSuffix::Domain, domain
+    assert_equal "test",    domain.tld
+    assert_equal "example", domain.sld
+    assert_equal "www",     domain.trd
+  end
+
+  def test_self_parse_with_notlisted_name
+    domain = PublicSuffix.parse("example.tldnotlisted")
+    assert_instance_of PublicSuffix::Domain, domain
+    assert_equal "tldnotlisted",    domain.tld
+    assert_equal "example",         domain.sld
+    assert_nil                      domain.trd
+  end
+
+  def test_self_parse_with_unallowed_domain
+    error = assert_raises(PublicSuffix::DomainNotAllowed) { PublicSuffix.parse("example.ke") }
+    assert_match(/example\.ke/, error.message)
+  end
+
+  def test_self_parse_with_uri
+    error = assert_raises(PublicSuffix::DomainInvalid) { PublicSuffix.parse("http://google.com") }
+    assert_match(%r{http://google\.com}, error.message)
+  end
+
+
+  def test_self_valid
+    assert  PublicSuffix.valid?("google.com")
+    assert  PublicSuffix.valid?("www.google.com")
+    assert  PublicSuffix.valid?("google.co.uk")
+    assert  PublicSuffix.valid?("www.google.co.uk")
+  end
+
+  def test_self_valid_with_notlisted_name
+    assert  PublicSuffix.valid?("google.tldnotlisted")
+    assert  PublicSuffix.valid?("www.google.tldnotlisted")
+  end
+
+  # def test_self_valid_with_fully_qualified_domain_name
+  #   assert  PublicSuffix.valid?("google.com.")
+  #   assert  PublicSuffix.valid?("google.co.uk.")
+  #   assert !PublicSuffix.valid?("google.tldnotlisted.")
+  # end
+
+
+  def test_self_domain
+    assert_equal "google.com",    PublicSuffix.domain("google.com")
+    assert_equal "google.com",    PublicSuffix.domain("www.google.com")
+    assert_equal "google.co.uk",  PublicSuffix.domain("google.co.uk")
+    assert_equal "google.co.uk",  PublicSuffix.domain("www.google.co.uk")
+  end
+
+  def test_self_domain_with_notlisted_name
+    assert_equal "example.tldnotlisted", PublicSuffix.domain("example.tldnotlisted")
+  end
+
+  def test_self_domain_with_unallowed_name
+    assert_nil PublicSuffix.domain("example.ke")
+  end
+
+  def test_self_domain_with_blank_sld
+    assert_nil PublicSuffix.domain("com")
+    assert_nil PublicSuffix.domain(".com")
+  end
+
+
+  def test_self_normalize
+    [
+        ["com", "com"],
+        ["example.com", "example.com"],
+        ["www.example.com", "www.example.com"],
+
+        ["example.com.",  "example.com"],     # strip FQDN
+        [" example.com ", "example.com"],     # strip spaces
+        ["Example.COM",   "example.com"],     # downcase
+    ].each do |input, output|
+      assert_equal output, PublicSuffix.normalize(input)
+    end
+  end
+
+  def test_normalize_blank
+    [
+        nil,
+        "",
+        " ",
+    ].each do |input, _|
+      error = PublicSuffix.normalize(input)
+      assert_instance_of PublicSuffix::DomainInvalid, error
+      assert_equal "Name is blank", error.message
+    end
+  end
+
+  def test_normalize_scheme
+    [
+        "https://google.com",
+    ].each do |input, _|
+      error = PublicSuffix.normalize(input)
+      assert_instance_of PublicSuffix::DomainInvalid, error
+      assert_match(/scheme/, error.message)
+    end
+  end
+
+  def test_normalize_leading_dot
+    [
+        ".google.com",
+    ].each do |input, _|
+      error = PublicSuffix.normalize(input)
+      assert_instance_of PublicSuffix::DomainInvalid, error
+      assert_match "Name starts with a dot", error.message
+    end
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/rule_test.rb b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/rule_test.rb
new file mode 100644
index 0000000..ed1c132
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/public_suffix-3.0.0/test/unit/rule_test.rb
@@ -0,0 +1,220 @@
+require "test_helper"
+
+class PublicSuffix::RuleTest < Minitest::Test
+
+  def test_factory_should_return_rule_normal
+    rule = PublicSuffix::Rule.factory("com")
+    assert_instance_of PublicSuffix::Rule::Normal, rule
+
+    rule = PublicSuffix::Rule.factory("verona.it")
+    assert_instance_of PublicSuffix::Rule::Normal, rule
+  end
+
+  def test_factory_should_return_rule_exception
+    rule = PublicSuffix::Rule.factory("!british-library.uk")
+    assert_instance_of PublicSuffix::Rule::Exception, rule
+  end
+
+  def test_factory_should_return_rule_wildcard
+    rule = PublicSuffix::Rule.factory("*.do")
+    assert_instance_of PublicSuffix::Rule::Wildcard, rule
+
+    rule = PublicSuffix::Rule.factory("*.sch.uk")
+    assert_instance_of PublicSuffix::Rule::Wildcard, rule
+  end
+
+
+  def test_default_returns_default_wildcard
+    default = PublicSuffix::Rule.default
+    assert_equal PublicSuffix::Rule::Wildcard.build("*"), default
+    assert_equal %w( example tldnotlisted ), default.decompose("example.tldnotlisted")
+    assert_equal %w( www.example tldnotlisted ), default.decompose("www.example.tldnotlisted")
+  end
+
+end
+
+
+class PublicSuffix::RuleBaseTest < Minitest::Test
+
+  class ::PublicSuffix::Rule::Test < ::PublicSuffix::Rule::Base
+  end
+
+  def setup
+    @klass = PublicSuffix::Rule::Base
+  end
+
+
+  def test_initialize
+    rule = @klass.new(value: "verona.it")
+    assert_instance_of @klass,  rule
+    assert_equal "verona.it",   rule.value
+  end
+
+
+  def test_equality_with_self
+    rule = PublicSuffix::Rule::Base.new(value: "foo")
+    assert_equal rule, rule
+  end
+
+  # rubocop:disable Style/SingleLineMethods
+  def test_equality_with_internals
+    assert_equal @klass.new(value: "foo"), @klass.new(value: "foo")
+    refute_equal @klass.new(value: "foo"), @klass.new(value: "bar")
+    refute_equal @klass.new(value: "foo"), PublicSuffix::Rule::Test.new(value: "foo")
+    refute_equal @klass.new(value: "foo"), PublicSuffix::Rule::Test.new(value: "bar")
+    refute_equal @klass.new(value: "foo"), Class.new { def name; foo; end }.new
+  end
+  # rubocop:enable Style/SingleLineMethods
+
+  def test_match
+    [
+        # standard match
+        [PublicSuffix::Rule.factory("uk"), "uk", true],
+        [PublicSuffix::Rule.factory("uk"), "example.uk", true],
+        [PublicSuffix::Rule.factory("uk"), "example.co.uk", true],
+        [PublicSuffix::Rule.factory("co.uk"), "example.co.uk", true],
+
+        # FIXME
+        # [PublicSuffix::Rule.factory("*.com"), "com", false],
+        [PublicSuffix::Rule.factory("*.com"), "example.com", true],
+        [PublicSuffix::Rule.factory("*.com"), "foo.example.com", true],
+        [PublicSuffix::Rule.factory("!example.com"), "com", false],
+        [PublicSuffix::Rule.factory("!example.com"), "example.com", true],
+        [PublicSuffix::Rule.factory("!example.com"), "foo.example.com", true],
+
+        # TLD mismatch
+        [PublicSuffix::Rule.factory("gk"), "example.uk", false],
+        [PublicSuffix::Rule.factory("gk"), "example.co.uk", false],
+        [PublicSuffix::Rule.factory("co.uk"), "uk", false],
+
+        # general mismatch
+        [PublicSuffix::Rule.factory("uk.co"), "example.co.uk", false],
+        [PublicSuffix::Rule.factory("go.uk"), "example.co.uk", false],
+        [PublicSuffix::Rule.factory("co.uk"), "uk", false],
+
+        # partial matches/mismatches
+        [PublicSuffix::Rule.factory("co"), "example.co.uk", false],
+        [PublicSuffix::Rule.factory("example"), "example.uk", false],
+        [PublicSuffix::Rule.factory("le.it"), "example.it", false],
+        [PublicSuffix::Rule.factory("le.it"), "le.it", true],
+        [PublicSuffix::Rule.factory("le.it"), "foo.le.it", true],
+
+    ].each do |rule, input, expected|
+      assert_equal expected, rule.match?(input)
+    end
+  end
+
+
+  def test_parts
+    assert_raises(NotImplementedError) { @klass.new(value: "com").parts }
+  end
+
+  def test_decompose
+    assert_raises(NotImplementedError) { @klass.new(value: "com").decompose("google.com") }
+  end
+
+end
+
+
+class PublicSuffix::RuleNormalTest < Minitest::Test
+
+  def setup
+    @klass = PublicSuffix::Rule::Normal
+  end
+
+
+  def test_build
+    rule = @klass.build("verona.it")
+    assert_instance_of @klass,              rule
+    assert_equal "verona.it",               rule.value
+    assert_equal "verona.it",               rule.rule
+  end
+
+
+  def test_length
+    assert_equal 1, @klass.build("com").length
+    assert_equal 2, @klass.build("co.com").length
+    assert_equal 3, @klass.build("mx.co.com").length
+  end
+
+  def test_parts
+    assert_equal %w(com), @klass.build("com").parts
+    assert_equal %w(co com), @klass.build("co.com").parts
+    assert_equal %w(mx co com), @klass.build("mx.co.com").parts
+  end
+
+  def test_decompose
+    assert_equal [nil, nil], @klass.build("com").decompose("com")
+    assert_equal %w( example com ), @klass.build("com").decompose("example.com")
+    assert_equal %w( foo.example com ), @klass.build("com").decompose("foo.example.com")
+  end
+
+end
+
+
+class PublicSuffix::RuleExceptionTest < Minitest::Test
+
+  def setup
+    @klass = PublicSuffix::Rule::Exception
+  end
+
+
+  def test_initialize
+    rule = @klass.build("!british-library.uk")
+    assert_instance_of @klass, rule
+    assert_equal "british-library.uk", rule.value
+    assert_equal "!british-library.uk", rule.rule
+  end
+
+
+  def test_length
+    assert_equal 2, @klass.build("!british-library.uk").length
+    assert_equal 3, @klass.build("!foo.british-library.uk").length
+  end
+
+  def test_parts
+    assert_equal %w( uk ), @klass.build("!british-library.uk").parts
+    assert_equal %w( tokyo jp ), @klass.build("!metro.tokyo.jp").parts
+  end
+
+  def test_decompose
+    assert_equal [nil, nil], @klass.build("!british-library.uk").decompose("uk")
+    assert_equal %w( british-library uk ), @klass.build("!british-library.uk").decompose("british-library.uk")
+    assert_equal %w( foo.british-library uk ), @klass.build("!british-library.uk").decompose("foo.british-library.uk")
+  end
+
+end
+
+
+class PublicSuffix::RuleWildcardTest < Minitest::Test
+
+  def setup
+    @klass = PublicSuffix::Rule::Wildcard
+  end
+
+
+  def test_initialize
+    rule = @klass.build("*.aichi.jp")
+    assert_instance_of @klass, rule
+    assert_equal "aichi.jp", rule.value
+    assert_equal "*.aichi.jp", rule.rule
+  end
+
+
+  def test_length
+    assert_equal 2, @klass.build("*.uk").length
+    assert_equal 3, @klass.build("*.co.uk").length
+  end
+
+  def test_parts
+    assert_equal %w( uk ), @klass.build("*.uk").parts
+    assert_equal %w( co uk ), @klass.build("*.co.uk").parts
+  end
+
+  def test_decompose
+    assert_equal [nil, nil], @klass.build("*.do").decompose("nic.do")
+    assert_equal %w( google co.uk ), @klass.build("*.uk").decompose("google.co.uk")
+    assert_equal %w( foo.google co.uk ), @klass.build("*.uk").decompose("foo.google.co.uk")
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/.gitignore b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/.gitignore
new file mode 100644
index 0000000..25a0e9a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/.gitignore
@@ -0,0 +1,13 @@
+*.gem
+.DS_Store
+.Trashes
+.bundle
+.com.apple.timemachine.supported
+.fseventsd
+.idea
+.rbx
+/ext/build
+Desktop DB
+Desktop DF
+Gemfile.lock
+pkg/*
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/Gemfile b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/Gemfile
new file mode 100644
index 0000000..b4e2a20
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/Gemfile
@@ -0,0 +1,3 @@
+source "https://rubygems.org"
+
+gemspec
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/Guardfile b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/Guardfile
new file mode 100644
index 0000000..63a666e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/Guardfile
@@ -0,0 +1,8 @@
+# A sample Guardfile
+# More info at http://github.com/guard/guard#readme
+
+guard :rspec do
+  watch(%r(^spec/(.*)_spec.rb))
+  watch(%r(^lib/(.*)\.rb))        { |m| "spec/#{m[1]}_spec.rb" }
+  watch('spec/spec_helper.rb')    { 'spec' }
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/LICENSE.txt b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/LICENSE.txt
new file mode 100644
index 0000000..b083ecd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2010-2014 Thibaud Guillaume-Gentil & Travis Tilley
+
+MIT License
+
+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/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/README.md b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/README.md
new file mode 100644
index 0000000..21e6a5f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/README.md
@@ -0,0 +1,259 @@
+[![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/thibaudgg/rb-fsevent)
+[![endorse](https://api.coderwall.com/ttilley/endorsecount.png)](https://coderwall.com/ttilley)
+
+# rb-fsevent
+
+Very simple & usable Mac OSX FSEvents API
+
+* RubyCocoa not required!
+* Signals are working (really)
+* Tested on MRI 2.4.1, RBX 3.72, JRuby 1.7.26 and 9.1.8.0
+* Tested on 10.8
+
+## HFS+ filename corruption bug
+
+There is a _very_ long-standing (since 2011) OSX bug where sometimes the filename metadata for HFS+ filesystems will get corrupted, resulting in some APIs returning one case for a file, and other APIs returning another. This corruption is not currently fixed by their tools, though Apple has been made aware of the issue and are working on it (as of may 2015). The result is that sometimes, _for no visible reason to the user_, fsevents would simply not work. As of rb-fsevent 0.9.5 this issue is properly detected and an insanely hacky (but effective) workaround is used that replaces the system `realpath()` with a custom implementation that should always return the same value as the kernel reporting (thus fixing fsevents).
+
+Please note that this doesn't repair the underlying issue on disk. Other apps and libraries using fsevents will continue to break with no warning. There may be other issues unrelated to fsevents.
+
+## Install
+
+    gem install rb-fsevent
+
+### re-compilation
+
+rb-fsevent comes with a pre-compiled fsevent\_watch binary supporting x86\_64 on 10.9 and above. The binary is codesigned with my (Travis Tilley) Developer ID as an extra precaution when distributing pre-compiled code and contains an embedded plist describing its build environment. This should be sufficient for most users, but if you need to use rb-fsevent on 10.8 or lower then recompilation is necessary. This can be done by entering the installed gem's ext directory and running:
+
+    MACOSX_DEPLOYMENT_TARGET="10.7" rake replace_exe
+
+The following ENV vars are recognized:
+
+* CC
+* CFLAGS
+* ARCHFLAGS
+* MACOSX\_DEPLOYMENT\_TARGET
+* FWDEBUG (enables debug mode, printing an obscene number of informational
+  messages to STDERR)
+
+### embedded plist
+
+You can retrieve the values in the embedded plist via the CLI:
+
+    fsevent_watch --show-plist
+
+The output is essentially formatted as `"#{key}:\n  #{value}\n"` to make it easier to read than plist style xml. The result looks like this:
+
+    DTSDKName:
+      macosx10.5
+    FSEWBuildTriple:
+      i386-apple-darwin10.8.0
+    FSEWCC:
+      /usr/bin/gcc-4.2
+    DTSDKPath:
+      /Developer/SDKs/MacOSX10.5.sdk
+    FSEWCCVersion:
+      i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
+    FSEWCFLAGS:
+      -fconstant-cfstrings -fno-strict-aliasing -Wall -mmacosx-version-min=10.5 -O3
+
+If, for some perverse reason, you prefer to look at the xml... it can be retrieved via:
+
+    otool -s __TEXT __info_plist ./bin/fsevent_watch | grep ^0 | xxd -r -
+
+### codesign
+
+You can verify code signing information for a specific fsevent\_watch via:
+
+    codesign -d -vvv ./bin/fsevent_watch
+
+If you're using the pre-compiled binary, then the output should contain something to the effect of:
+
+    Authority=Developer ID Application: Travis Tilley
+    Authority=Developer ID Certification Authority
+    Authority=Apple Root CA
+    Timestamp=Dec 31, 2012 12:49:13 PM
+
+## Usage
+
+### Singular path
+
+```ruby
+require 'rb-fsevent'
+
+fsevent = FSEvent.new
+fsevent.watch Dir.pwd do |directories|
+  puts "Detected change inside: #{directories.inspect}"
+end
+fsevent.run
+```
+
+### Multiple paths
+
+```ruby
+require 'rb-fsevent'
+
+paths = ['/tmp/path/one', '/tmp/path/two', Dir.pwd]
+
+fsevent = FSEvent.new
+fsevent.watch paths do |directories|
+  puts "Detected change inside: #{directories.inspect}"
+end
+fsevent.run
+```
+
+### Multiple paths and additional options as a Hash
+
+```ruby
+require 'rb-fsevent'
+
+paths = ['/tmp/path/one', '/tmp/path/two', Dir.pwd]
+options = {:latency => 1.5, :no_defer => true }
+
+fsevent = FSEvent.new
+fsevent.watch paths, options do |directories|
+  puts "Detected change inside: #{directories.inspect}"
+end
+fsevent.run
+```
+
+### Multiple paths and additional options as an Array
+
+```ruby
+require 'rb-fsevent'
+
+paths = ['/tmp/path/one', '/tmp/path/two', Dir.pwd]
+options = ['--latency', 1.5, '--no-defer']
+
+fsevent = FSEvent.new
+fsevent.watch paths, options do |directories|
+  puts "Detected change inside: #{directories.inspect}"
+end
+fsevent.run
+```
+
+### Using _full_ event information
+
+```ruby
+require 'rb-fsevent'
+fsevent = FSEvent.new
+fsevent.watch Dir.pwd do |paths, event_meta|
+  event_meta.events.each do |event|
+    puts "event ID: #{event.id}"
+    puts "path: #{event.path}"
+    puts "c flags: #{event.cflags}"
+    puts "named flags: #{event.flags.join(', ')}"
+    # named flags will include strings such as `ItemInodeMetaMod` or `OwnEvent`
+  end
+end
+fsevent.run
+```
+
+## Options
+
+When defining options using a hash or hash-like object, it gets checked for validity and converted to the appropriate fsevent\_watch commandline arguments array when the FSEvent class is instantiated. This is obviously the safest and preferred method of passing in options.
+
+You may, however, choose to pass in an array of commandline arguments as your options value and it will be passed on, unmodified, to the fsevent\_watch binary when called.
+
+So far, the following options are supported:
+
+* :latency => 0.5 # in seconds
+* :no\_defer => true
+* :watch\_root => true
+* :since\_when => 18446744073709551615 # an FSEventStreamEventId
+* :file\_events => true
+
+### Latency
+
+The :latency parameter determines how long the service should wait after the first event before passing that information along to the client. If your latency is set to 4 seconds, and 300 changes occur in the first three, then the callback will be fired only once. If latency is set to 0.1 in the exact same scenario, you will see that callback fire somewhere closer to between 25 and 30 times.
+
+Setting a higher latency value allows for more effective temporal coalescing, resulting in fewer callbacks and greater overall efficiency... at the cost of apparent responsiveness. Setting this to a reasonably high value (and NOT setting :no\_defer) is particularly well suited for background, daemon, or batch processing applications.
+
+Implementation note: It appears that FSEvents will only coalesce events from a maximum of 32 distinct subpaths, making the above completely accurate only when events are to fewer than 32 subpaths. Creating 300 files in one directory, for example, or 30 files in 10 subdirectories, but not 300 files within 300 subdirectories. In the latter case, you may receive 31 callbacks in one go after the latency period. As this appears to be an implementation detail, the number could potentially differ across OS revisions. It is entirely possible that this number is somehow configurable, but I have not yet discovered an accepted method of doing so.
+
+### NoDefer
+
+The :no\_defer option changes the behavior of the latency parameter completely. Rather than waiting for $latency period of time before sending along events in an attempt to coalesce a potential deluge ahead of time, that first event is sent along to the client immediately and is followed by a $latency period of silence before sending along any additional events that occurred within that period.
+
+This behavior is particularly useful for interactive applications where that feeling of apparent responsiveness is most important, but you still don't want to get overwhelmed by a series of events that occur in rapid succession.
+
+### WatchRoot
+
+The :watch\_root option allows for catching the scenario where you start watching "~/src/demo\_project" and either it is later renamed to "~/src/awesome\_sauce\_3000" or the path changes in such a manner that the original directory is now at "~/clients/foo/iteration4/demo\_project".
+
+Unfortunately, while this behavior is somewhat supported in the fsevent\_watch binary built as part of this project, support for passing across detailed metadata is not (yet). As a result, you would not receive the appropriate RootChanged event and be able to react appropriately. Also, since the C code doesn't open watched directories and retain that file descriptor as part of path-specific callback metadata, we are unable to issue an F\_GETPATH fcntl() to determine the directory's new path.
+
+Please do not use this option until proper support is added (or, even better, add it and submit a pull request).
+
+### SinceWhen
+
+The FSEventStreamEventId passed in to :since\_when is used as a base for reacting to historic events. Unfortunately, not only is the metadata for transitioning from historic to live events not currently passed along, but it is incorrectly passed as a change event on the root path, and only per-host event streams are currently supported. When using per-host event streams, the event IDs are not guaranteed to be unique or contiguous when shared volumes (firewire/USB/net/etc) are used on multiple macs.
+
+Please do not use this option until proper support is added, unless it's acceptable for you to receive that one fake event that's handled incorrectly when events transition from historical to live. Even in that scenario, there's no metadata available for determining the FSEventStreamEventId of the last received event.
+
+WARNING: passing in 0 as the parameter to :since\_when will return events for every directory modified since "the beginning of time".
+
+### FileEvents ###
+
+Prepare yourself for an obscene number of callbacks. Realistically, an "Atomic Save" could easily fire maybe 6 events for the combination of creating the new file, changing metadata/permissions, writing content, swapping out the old file for the new may itself result in multiple events being fired, and so forth. By the time you get the event for the temporary file being created as part of the atomic save, it will already be gone and swapped with the original file. This and issues of a similar nature have prevented me from adding the option to the ruby code despite the fsevent\_watch binary supporting file level events for quite some time now. Mountain Lion seems to be better at coalescing needless events, but that might just be my imagination.
+
+## Debugging output
+
+If the gem is re-compiled with the environment variable FWDEBUG set, then fsevent\_watch will be built with its various DEBUG sections defined, and the output to STDERR is truly verbose (and hopefully helpful in debugging your application and not just fsevent\_watch itself). If enough people find this to be directly useful when developing code that makes use of rb-fsevent, then it wouldn't be hard to clean this up and make it a feature enabled by a commandline argument instead. Until somebody files an issue, however, I will assume otherwise.
+
+    append_path called for: /tmp/moo/cow/
+      resolved path to: /private/tmp/moo/cow
+
+    config.sinceWhen    18446744073709551615
+    config.latency      0.300000
+    config.flags        00000000
+    config.paths
+      /private/tmp/moo/cow
+
+    FSEventStreamRef @ 0x100108540:
+       allocator = 0x7fff705a4ee0
+       callback = 0x10000151e
+       context = {0, 0x0, 0x0, 0x0, 0x0}
+       numPathsToWatch = 1
+       pathsToWatch = 0x7fff705a4ee0
+            pathsToWatch[0] = '/private/tmp/moo/cow'
+       latestEventId = -1
+       latency = 300000 (microseconds)
+       flags = 0x00000000
+       runLoop = 0x0
+       runLoopMode = 0x0
+
+    FSEventStreamCallback fired!
+      numEvents: 32
+      event path: /private/tmp/moo/cow/1/a/
+      event flags: 00000000
+      event ID: 1023767
+      event path: /private/tmp/moo/cow/1/b/
+      event flags: 00000000
+      event ID: 1023782
+      event path: /private/tmp/moo/cow/1/c/
+      event flags: 00000000
+      event ID: 1023797
+      event path: /private/tmp/moo/cow/1/d/
+      event flags: 00000000
+      event ID: 1023812
+      [etc]
+
+
+## Development
+
+* Source hosted at [GitHub](http://github.com/thibaudgg/rb-fsevent)
+* Report issues/Questions/Feature requests on [GitHub Issues](http://github.com/thibaudgg/rb-fsevent/issues)
+
+Pull requests are quite welcome! Please ensure that your commits are in a topic branch for each individual changeset that can be reasonably isolated. It is also important to ensure that your changes are well tested... whether that means new tests, modified tests, or fixing a scenario where the existing tests currently fail. If you have rbenv and ruby-build, we have a helper task for running the testsuite in all of them:
+
+    rake spec:portability
+
+The list of tested targets is currently:
+
+    %w[2.4.1 rbx-3.72 jruby-1.7.26 jruby-9.1.8.0]
+
+## Authors
+
+* [Travis Tilley](http://github.com/ttilley)
+* [Thibaud Guillaume-Gentil](http://github.com/thibaudgg)
+* [Andrey Tarantsov](https://github.com/andreyvit)
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/Rakefile b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/Rakefile
new file mode 100644
index 0000000..53a08a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/Rakefile
@@ -0,0 +1,33 @@
+# -*- encoding: utf-8 -*-
+require 'bundler'
+Bundler::GemHelper.install_tasks
+
+require 'rspec/core/rake_task'
+RSpec::Core::RakeTask.new(:spec)
+task :default => :spec
+
+namespace(:spec) do
+  desc "Run all specs on multiple ruby versions"
+  task(:portability) do
+    versions = %w[2.4.1 rbx-3.72 jruby-1.7.26 jruby-9.1.8.0]
+    versions.each do |version|
+      # system <<-BASH
+      #   bash -c 'source ~/.rvm/scripts/rvm;
+      #            rvm #{version};
+      #            echo "--------- version #{version} ----------\n";
+      #            bundle install;
+      #            rake spec'
+      # BASH
+      system <<-BASH
+        bash -c 'export PATH="$HOME/.rbenv/bin:$PATH";
+                 [[ `which rbenv` ]] && eval "$(rbenv init -)";
+                 [[ ! -a $HOME/.rbenv/versions/#{version} ]] && rbenv install #{version};
+                 rbenv shell #{version};
+                 rbenv which bundle 2> /dev/null || gem install bundler;
+                 rm Gemfile.lock;
+                 bundle install;
+                 rake spec;'
+      BASH
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/bin/fsevent_watch b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/bin/fsevent_watch
new file mode 100755
index 0000000..889204f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/bin/fsevent_watch
Binary files differ
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/LICENSE b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/LICENSE
new file mode 100644
index 0000000..a35e195
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/LICENSE
@@ -0,0 +1,21 @@
+Copyright (c) 2011-2013 Travis Tilley
+
+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/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.c b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.c
new file mode 100644
index 0000000..60e3d37
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.c
@@ -0,0 +1,626 @@
+/*
+ * FSEventsFix
+ *
+ * Resolves a long-standing bug in realpath() that prevents FSEvents API from
+ * monitoring certain folders on a wide range of OS X released (10.6-10.10 at least).
+ *
+ * The underlying issue is that for some folders, realpath() call starts returning
+ * a path with incorrect casing (e.g. "/users/smt" instead of "/Users/smt").
+ * FSEvents is case-sensitive and calls realpath() on the paths you pass in, so
+ * an incorrect value returned by realpath() prevents FSEvents from seeing any
+ * change events.
+ *
+ * See the discussion at https://github.com/thibaudgg/rb-fsevent/issues/10 about
+ * the history of this bug and how this library came to exist.
+ *
+ * This library uses Facebook's fishhook to replace a custom implementation of
+ * realpath in place of the system realpath; FSEvents will then invoke our custom
+ * implementation (which does not screw up the names) and will thus work correctly.
+ *
+ * Our implementation of realpath is based on the open-source implementation from
+ * OS X 10.10, with a single change applied (enclosed in "BEGIN WORKAROUND FOR
+ * OS X BUG" ... "END WORKAROUND FOR OS X BUG").
+ *
+ * Include FSEventsFix.{h,c} into your project and call FSEventsFixInstall().
+ *
+ * It is recommended that you install FSEventsFix on demand, using FSEventsFixIsBroken
+ * to check if the folder you're about to pass to FSEventStreamCreate needs the fix.
+ * Note that the fix must be applied before calling FSEventStreamCreate.
+ *
+ * FSEventsFixIsBroken requires a path that uses the correct case for all folder names,
+ * i.e. a path provided by the system APIs or constructed from folder names provided
+ * by the directory enumeration APIs.
+ *
+ * Copyright (c) 2015 Andrey Tarantsov <andrey@tarantsov.com>
+ * Copyright (c) 2003 Constantin S. Svintsoff <kostik@iclub.nsu.ru>
+ *
+ * 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.
+ *
+ * Based on a realpath implementation from Apple libc 498.1.7, taken from
+ * http://www.opensource.apple.com/source/Libc/Libc-498.1.7/stdlib/FreeBSD/realpath.c
+ * and provided under the following license:
+ *
+ * Copyright (c) 2003 Constantin S. Svintsoff <kostik@iclub.nsu.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. The names of the authors may not be used to endorse or promote
+ *    products derived from this software without specific prior written
+ *    permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ */
+
+
+#include "FSEventsFix.h"
+
+#include <dispatch/dispatch.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <dlfcn.h>
+
+
+const char *const FSEventsFixVersionString = "0.11.0";
+
+
+#pragma mark - Forward declarations
+
+static char *(*orig_realpath)(const char *restrict file_name, char resolved_name[PATH_MAX]);
+static char *CFURL_realpath(const char *restrict file_name, char resolved_name[PATH_MAX]);
+static char *FSEventsFix_realpath_wrapper(const char *restrict src, char *restrict dst);
+
+static void _FSEventsFixHookInstall();
+static void _FSEventsFixHookUninstall();
+
+
+#pragma mark - Internal state
+
+static dispatch_queue_t g_queue = NULL;
+
+static int64_t g_enable_refcount = 0;
+
+static bool g_in_self_test = false;
+static bool g_hook_operational = false;
+
+static void(^g_logging_block)(FSEventsFixMessageType type, const char *message);
+static FSEventsFixDebugOptions g_debug_opt = 0;
+
+typedef struct {
+    char *name;
+    void *replacement;
+    void *original;
+    uint hooked_symbols;
+} rebinding_t;
+
+static rebinding_t g_rebindings[] = {
+    { "_realpath$DARWIN_EXTSN", (void *) &FSEventsFix_realpath_wrapper, (void *) &realpath, 0 }
+};
+static const uint g_rebindings_nel = sizeof(g_rebindings) / sizeof(g_rebindings[0]);
+
+
+#pragma mark - Logging
+
+static void _FSEventsFixLog(FSEventsFixMessageType type, const char *__restrict fmt, ...) __attribute__((__format__ (__printf__, 2, 3)));
+
+static void _FSEventsFixLog(FSEventsFixMessageType type, const char *__restrict fmt, ...) {
+    if (g_logging_block) {
+        char *message = NULL;
+        va_list va;
+        va_start(va, fmt);
+        vasprintf(&message, fmt, va);
+        va_end(va);
+
+        if (message) {
+            if (!!(g_debug_opt & FSEventsFixDebugOptionLogToStderr)) {
+                fprintf(stderr, "FSEventsFix: %s\n", message);
+            }
+            if (g_logging_block) {
+                g_logging_block(type, message);
+            }
+            free(message);
+        }
+    }
+}
+
+
+#pragma mark - API
+
+void _FSEventsFixInitialize() {
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        g_queue = dispatch_queue_create("FSEventsFix", DISPATCH_QUEUE_SERIAL);
+    });
+}
+
+void FSEventsFixConfigure(FSEventsFixDebugOptions debugOptions, void(^loggingBlock)(FSEventsFixMessageType severity, const char *message)) {
+    _FSEventsFixInitialize();
+    loggingBlock = Block_copy(loggingBlock);
+    dispatch_sync(g_queue, ^{
+        g_debug_opt = debugOptions;
+        g_logging_block = loggingBlock;
+    });
+}
+
+// Must be called from the private serial queue.
+void _FSEventsFixSelfTest() {
+    g_in_self_test = true;
+    g_hook_operational = false;
+    static char result[1024];
+    realpath("/Etc/__!FSEventsFixSelfTest!__", result);
+    g_in_self_test = false;
+}
+
+void FSEventsFixEnable() {
+    _FSEventsFixInitialize();
+    dispatch_sync(g_queue, ^{
+        if (++g_enable_refcount == 1) {
+            orig_realpath = dlsym(RTLD_DEFAULT, "realpath");
+            _FSEventsFixHookInstall();
+            _FSEventsFixSelfTest();
+            if (g_hook_operational) {
+                _FSEventsFixLog(FSEventsFixMessageTypeStatusChange, "Enabled");
+            } else {
+                _FSEventsFixLog(FSEventsFixMessageTypeFatalError, "Failed to enable (hook not called)");
+            }
+        }
+    });
+}
+
+void FSEventsFixDisable() {
+    _FSEventsFixInitialize();
+    dispatch_sync(g_queue, ^{
+        if (g_enable_refcount == 0) {
+            abort();
+        }
+        if (--g_enable_refcount == 0) {
+            _FSEventsFixHookUninstall();
+            _FSEventsFixSelfTest();
+            if (!g_hook_operational) {
+                _FSEventsFixLog(FSEventsFixMessageTypeStatusChange, "Disabled");
+            } else {
+                _FSEventsFixLog(FSEventsFixMessageTypeFatalError, "Failed to disable (hook still called)");
+            }
+        }
+    });
+}
+
+bool FSEventsFixIsOperational() {
+    _FSEventsFixInitialize();
+    __block bool result = false;
+    dispatch_sync(g_queue, ^{
+        result = g_hook_operational;
+    });
+    return result;
+}
+
+bool _FSEventsFixIsBroken_noresolve(const char *resolved) {
+    if (!!(g_debug_opt & FSEventsFixDebugOptionSimulateBroken)) {
+        if (strstr(resolved, FSEventsFixSimulatedBrokenFolderMarker)) {
+            return true;
+        }
+    }
+
+    char *reresolved = realpath(resolved, NULL);
+    if (reresolved) {
+        bool broken = (0 != strcmp(resolved, reresolved));
+        free(reresolved);
+        return broken;
+    } else {
+        return true;
+    }
+}
+
+bool FSEventsFixIsBroken(const char *path) {
+    char *resolved = CFURL_realpath(path, NULL);
+    if (!resolved) {
+        return true;
+    }
+    bool broken = _FSEventsFixIsBroken_noresolve(resolved);
+    free(resolved);
+    return broken;
+}
+
+char *FSEventsFixCopyRootBrokenFolderPath(const char *inpath) {
+    if (!FSEventsFixIsBroken(inpath)) {
+        return NULL;
+    }
+
+    // get a mutable copy of an absolute path
+    char *path = CFURL_realpath(inpath, NULL);
+    if (!path) {
+        return NULL;
+    }
+
+    for (;;) {
+        char *sep = strrchr(path, '/');
+        if ((sep == NULL) || (sep == path)) {
+            break;
+        }
+        *sep = 0;
+        if (!_FSEventsFixIsBroken_noresolve(path)) {
+            *sep = '/';
+            break;
+        }
+    }
+
+    return path;
+}
+
+static void _FSEventsFixAttemptRepair(const char *folder) {
+    int rv = rename(folder, folder);
+
+    if (!!(g_debug_opt & FSEventsFixDebugOptionSimulateRepair)) {
+        const char *pos = strstr(folder, FSEventsFixSimulatedBrokenFolderMarker);
+        if (pos) {
+            char *fixed = strdup(folder);
+            fixed[pos - folder] = 0;
+            strcat(fixed, pos + strlen(FSEventsFixSimulatedBrokenFolderMarker));
+
+            rv = rename(folder, fixed);
+            free(fixed);
+        }
+    }
+
+    if (rv != 0) {
+        if (errno == EPERM) {
+            _FSEventsFixLog(FSEventsFixMessageTypeResult, "Permission error when trying to repair '%s'", folder);
+        } else {
+            _FSEventsFixLog(FSEventsFixMessageTypeExpectedFailure, "Unknown error when trying to repair '%s': errno = %d", folder, errno);
+        }
+    }
+}
+
+FSEventsFixRepairStatus FSEventsFixRepairIfNeeded(const char *inpath) {
+    char *root = FSEventsFixCopyRootBrokenFolderPath(inpath);
+    if (root == NULL) {
+        return FSEventsFixRepairStatusNotBroken;
+    }
+
+    for (;;) {
+        _FSEventsFixAttemptRepair(root);
+        char *newRoot = FSEventsFixCopyRootBrokenFolderPath(inpath);
+        if (newRoot == NULL) {
+            _FSEventsFixLog(FSEventsFixMessageTypeResult, "Repaired '%s' in '%s'", root, inpath);
+            free(root);
+            return FSEventsFixRepairStatusRepaired;
+        }
+        if (0 == strcmp(root, newRoot)) {
+            _FSEventsFixLog(FSEventsFixMessageTypeResult, "Failed to repair '%s' in '%s'", root, inpath);
+            free(root);
+            free(newRoot);
+            return FSEventsFixRepairStatusFailed;
+        }
+        _FSEventsFixLog(FSEventsFixMessageTypeResult, "Partial success, repaired '%s' in '%s'", root, inpath);
+        free(root);
+        root = newRoot;
+    }
+}
+
+
+#pragma mark - FSEventsFix realpath wrapper
+
+static char *FSEventsFix_realpath_wrapper(const char * __restrict src, char * __restrict dst) {
+    if (g_in_self_test) {
+        if (strstr(src, "__!FSEventsFixSelfTest!__")) {
+            g_hook_operational = true;
+        }
+    }
+
+    // CFURL_realpath doesn't support putting where resolution failed into the
+    // dst buffer, so we call the original realpath here first and if it gets a
+    // result, replace that with the output of CFURL_realpath. that way all the
+    // features of the original realpath are available.
+    char *rv = NULL;
+    char *orv = orig_realpath(src, dst);
+    if (orv != NULL) { rv = CFURL_realpath(src, dst); }
+
+    if (!!(g_debug_opt & FSEventsFixDebugOptionLogCalls)) {
+        char *result = rv ?: dst;
+        _FSEventsFixLog(FSEventsFixMessageTypeCall, "realpath(%s) => %s\n", src, result);
+    }
+
+    if (!!(g_debug_opt & FSEventsFixDebugOptionUppercaseReturn)) {
+        char *result = rv ?: dst;
+        if (result) {
+            for (char *pch = result; *pch; ++pch) {
+                *pch = (char)toupper(*pch);
+            }
+        }
+    }
+
+    return rv;
+}
+
+
+#pragma mark - realpath
+
+// naive implementation of realpath on top of CFURL
+// NOTE: doesn't quite support the full range of errno results one would
+// expect here, in part because some of these functions just return a boolean,
+// and in part because i'm not dealing with messy CFErrorRef objects and
+// attempting to translate those to sane errno values.
+// NOTE: the OSX realpath will return _where_ resolution failed in resolved_name
+// if passed in and return NULL. we can't properly support that extension here
+// since the resolution happens entirely behind the scenes to us in CFURL.
+static char* CFURL_realpath(const char *file_name, char resolved_name[PATH_MAX])
+{
+    char* resolved;
+    CFURLRef url1;
+    CFURLRef url2;
+    CFStringRef path;
+
+    if (file_name == NULL) {
+        errno = EINVAL;
+        return (NULL);
+    }
+
+#if __DARWIN_UNIX03
+    if (*file_name == 0) {
+        errno = ENOENT;
+        return (NULL);
+    }
+#endif
+
+    // create a buffer to store our result if we weren't passed one
+    if (!resolved_name) {
+        if ((resolved = malloc(PATH_MAX)) == NULL) return (NULL);
+    } else {
+        resolved = resolved_name;
+    }
+
+    url1 = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)file_name, (CFIndex)strlen(file_name), false);
+    if (url1 == NULL) { goto error_return; }
+
+    url2 = CFURLCopyAbsoluteURL(url1);
+    CFRelease(url1);
+    if (url2 == NULL) { goto error_return; }
+
+    url1 = CFURLCreateFileReferenceURL(NULL, url2, NULL);
+    CFRelease(url2);
+    if (url1 == NULL) { goto error_return; }
+
+    // if there are multiple hard links to the original path, this may end up
+    // being _completely_ different from what was intended
+    url2 = CFURLCreateFilePathURL(NULL, url1, NULL);
+    CFRelease(url1);
+    if (url2 == NULL) { goto error_return; }
+
+    path = CFURLCopyFileSystemPath(url2, kCFURLPOSIXPathStyle);
+    CFRelease(url2);
+    if (path == NULL) { goto error_return; }
+
+    bool success = CFStringGetCString(path, resolved, PATH_MAX, kCFStringEncodingUTF8);
+    CFRelease(path);
+    if (!success) { goto error_return; }
+
+    return resolved;
+
+error_return:
+    if (!resolved_name) {
+        // we weren't passed in an output buffer and created our own. free it
+        int e = errno;
+        free(resolved);
+        errno = e;
+    }
+    return (NULL);
+}
+
+
+#pragma mark - fishhook
+
+// Copyright (c) 2013, Facebook, Inc.
+// 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.
+//   * Neither the name Facebook nor the names of its contributors may be used to
+//     endorse or promote products derived from this software without specific
+//     prior written permission.
+// 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.
+
+#import <stdlib.h>
+#import <string.h>
+#import <sys/types.h>
+#import <mach-o/dyld.h>
+#import <mach-o/loader.h>
+#import <mach-o/nlist.h>
+
+#ifdef __LP64__
+typedef struct mach_header_64 mach_header_t;
+typedef struct segment_command_64 segment_command_t;
+typedef struct section_64 section_t;
+typedef struct nlist_64 nlist_t;
+#define LC_SEGMENT_ARCH_DEPENDENT LC_SEGMENT_64
+#else
+typedef struct mach_header mach_header_t;
+typedef struct segment_command segment_command_t;
+typedef struct section section_t;
+typedef struct nlist nlist_t;
+#define LC_SEGMENT_ARCH_DEPENDENT LC_SEGMENT
+#endif
+
+static volatile bool g_hook_installed = false;
+
+static void _FSEventsFixHookUpdateSection(section_t *section, intptr_t slide, nlist_t *symtab, char *strtab, uint32_t *indirect_symtab)
+{
+    uint32_t *indirect_symbol_indices = indirect_symtab + section->reserved1;
+    void **indirect_symbol_bindings = (void **)((uintptr_t)slide + section->addr);
+    for (uint i = 0; i < section->size / sizeof(void *); i++) {
+        uint32_t symtab_index = indirect_symbol_indices[i];
+        if (symtab_index == INDIRECT_SYMBOL_ABS || symtab_index == INDIRECT_SYMBOL_LOCAL ||
+            symtab_index == (INDIRECT_SYMBOL_LOCAL   | INDIRECT_SYMBOL_ABS)) {
+            continue;
+        }
+        uint32_t strtab_offset = symtab[symtab_index].n_un.n_strx;
+        char *symbol_name = strtab + strtab_offset;
+        for (rebinding_t *cur = g_rebindings, *end = g_rebindings + g_rebindings_nel; cur < end; ++cur)  {
+            if (strcmp(symbol_name, cur->name) == 0) {
+                if (g_hook_installed) {
+                    if (indirect_symbol_bindings[i] != cur->replacement) {
+                        indirect_symbol_bindings[i] = cur->replacement;
+                        ++cur->hooked_symbols;
+                    }
+                } else if (cur->original != NULL) {
+                    if (indirect_symbol_bindings[i] == cur->replacement) {
+                        indirect_symbol_bindings[i] = cur->original;
+                        if (cur->hooked_symbols > 0) {
+                            --cur->hooked_symbols;
+                        }
+                    }
+                }
+                goto symbol_loop;
+            }
+        }
+    symbol_loop:;
+    }
+}
+
+static void _FSEventsFixHookUpdateImage(const struct mach_header *header, intptr_t slide) {
+    Dl_info info;
+    if (dladdr(header, &info) == 0) {
+        return;
+    }
+
+    segment_command_t *cur_seg_cmd;
+    segment_command_t *linkedit_segment = NULL;
+    struct symtab_command* symtab_cmd = NULL;
+    struct dysymtab_command* dysymtab_cmd = NULL;
+
+    uintptr_t cur = (uintptr_t)header + sizeof(mach_header_t);
+    for (uint i = 0; i < header->ncmds; i++, cur += cur_seg_cmd->cmdsize) {
+        cur_seg_cmd = (segment_command_t *)cur;
+        if (cur_seg_cmd->cmd == LC_SEGMENT_ARCH_DEPENDENT) {
+            if (strcmp(cur_seg_cmd->segname, SEG_LINKEDIT) == 0) {
+                linkedit_segment = cur_seg_cmd;
+            }
+        } else if (cur_seg_cmd->cmd == LC_SYMTAB) {
+            symtab_cmd = (struct symtab_command*)cur_seg_cmd;
+        } else if (cur_seg_cmd->cmd == LC_DYSYMTAB) {
+            dysymtab_cmd = (struct dysymtab_command*)cur_seg_cmd;
+        }
+    }
+
+    if (!symtab_cmd || !dysymtab_cmd || !linkedit_segment ||
+        !dysymtab_cmd->nindirectsyms) {
+        return;
+    }
+
+    // Find base symbol/string table addresses
+    uintptr_t linkedit_base = (uintptr_t)slide + linkedit_segment->vmaddr - linkedit_segment->fileoff;
+    nlist_t *symtab = (nlist_t *)(linkedit_base + symtab_cmd->symoff);
+    char *strtab = (char *)(linkedit_base + symtab_cmd->stroff);
+
+    // Get indirect symbol table (array of uint32_t indices into symbol table)
+    uint32_t *indirect_symtab = (uint32_t *)(linkedit_base + dysymtab_cmd->indirectsymoff);
+
+    cur = (uintptr_t)header + sizeof(mach_header_t);
+    for (uint i = 0; i < header->ncmds; i++, cur += cur_seg_cmd->cmdsize) {
+        cur_seg_cmd = (segment_command_t *)cur;
+        if (cur_seg_cmd->cmd == LC_SEGMENT_ARCH_DEPENDENT) {
+            if (strcmp(cur_seg_cmd->segname, SEG_DATA) != 0) {
+                continue;
+            }
+            for (uint j = 0; j < cur_seg_cmd->nsects; j++) {
+                section_t *sect =
+                (section_t *)(cur + sizeof(segment_command_t)) + j;
+                if ((sect->flags & SECTION_TYPE) == S_LAZY_SYMBOL_POINTERS) {
+                    _FSEventsFixHookUpdateSection(sect, slide, symtab, strtab, indirect_symtab);
+                }
+                if ((sect->flags & SECTION_TYPE) == S_NON_LAZY_SYMBOL_POINTERS) {
+                    _FSEventsFixHookUpdateSection(sect, slide, symtab, strtab, indirect_symtab);
+                }
+            }
+        }
+    }
+}
+
+static void _FSEventsFixHookSaveOriginals() {
+    for (rebinding_t *cur = g_rebindings, *end = g_rebindings + g_rebindings_nel; cur < end; ++cur)  {
+        void *original = cur->original = dlsym(RTLD_DEFAULT, cur->name+1);
+        if (!original) {
+            const char *error = dlerror();
+            _FSEventsFixLog(FSEventsFixMessageTypeFatalError, "Cannot find symbol %s, dlsym says: %s\n", cur->name, error);
+        }
+    }
+}
+
+static void _FSEventsFixHookUpdate() {
+    uint32_t c = _dyld_image_count();
+    for (uint32_t i = 0; i < c; i++) {
+        _FSEventsFixHookUpdateImage(_dyld_get_image_header(i), _dyld_get_image_vmaddr_slide(i));
+    }
+}
+
+static void _FSEventsFixHookInstall() {
+    static bool first_rebinding_done = false;
+
+    if (!g_hook_installed) {
+        g_hook_installed = true;
+
+        if (!first_rebinding_done) {
+            first_rebinding_done = true;
+            _FSEventsFixHookSaveOriginals();
+            _dyld_register_func_for_add_image(_FSEventsFixHookUpdateImage);
+        } else {
+            _FSEventsFixHookUpdate();
+        }
+    }
+}
+
+static void _FSEventsFixHookUninstall() {
+    if (g_hook_installed) {
+        g_hook_installed = false;
+        _FSEventsFixHookUpdate();
+    }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.h b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.h
new file mode 100644
index 0000000..b70b880
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/FSEventsFix.h
@@ -0,0 +1,105 @@
+/*
+ * FSEventsFix
+ *
+ * Works around a long-standing bug in realpath() that prevents FSEvents API from
+ * monitoring certain folders on a wide range of OS X releases (10.6-10.10 at least).
+ *
+ * The underlying issue is that for some folders, realpath() call starts returning
+ * a path with incorrect casing (e.g. "/users/smt" instead of "/Users/smt").
+ * FSEvents is case-sensitive and calls realpath() on the paths you pass in, so
+ * an incorrect value returned by realpath() prevents FSEvents from seeing any
+ * change events.
+ *
+ * See the discussion at https://github.com/thibaudgg/rb-fsevent/issues/10 about
+ * the history of this bug and how this library came to exist.
+ *
+ * This library uses Facebook's fishhook to replace a custom implementation of
+ * realpath in place of the system realpath; FSEvents will then invoke our custom
+ * implementation (which does not screw up the names) and will thus work correctly.
+ *
+ * Our implementation of realpath is based on the open-source implementation from
+ * OS X 10.10, with a single change applied (enclosed in "BEGIN WORKAROUND FOR
+ * OS X BUG" ... "END WORKAROUND FOR OS X BUG").
+ *
+ * Include FSEventsFix.{h,c} into your project and call FSEventsFixInstall().
+ *
+ * It is recommended that you install FSEventsFix on demand, using FSEventsFixIsBroken
+ * to check if the folder you're about to pass to FSEventStreamCreate needs the fix.
+ * Note that the fix must be applied before calling FSEventStreamCreate.
+ *
+ * FSEventsFixIsBroken requires a path that uses the correct case for all folder names,
+ * i.e. a path provided by the system APIs or constructed from folder names provided
+ * by the directory enumeration APIs.
+ *
+ * See .c file for license & copyrights, but basically this is available under a mix
+ * of MIT and BSD licenses.
+ */
+
+#ifndef __FSEventsFix__
+#define __FSEventsFix__
+
+#include <CoreFoundation/CoreFoundation.h>
+
+/// A library version string (e.g. 1.2.3) for displaying and logging purposes
+extern const char *const FSEventsFixVersionString;
+
+/// See FSEventsFixDebugOptionSimulateBroken
+#define FSEventsFixSimulatedBrokenFolderMarker  "__!FSEventsBroken!__"
+
+typedef CF_OPTIONS(unsigned, FSEventsFixDebugOptions) {
+    /// Always return an uppercase string from realpath
+    FSEventsFixDebugOptionUppercaseReturn  = 0x01,
+    
+    /// Log all calls to realpath using the logger configured via FSEventsFixConfigure
+    FSEventsFixDebugOptionLogCalls         = 0x02,
+
+    /// In addition to the logging block (if any), log everything to stderr
+    FSEventsFixDebugOptionLogToStderr      = 0x08,
+    
+    /// Report paths containing FSEventsFixSimulatedBrokenFolderMarker as broken
+    FSEventsFixDebugOptionSimulateBroken   = 0x10,
+    
+    /// Repair paths containing FSEventsFixSimulatedBrokenFolderMarker by renaming them
+    FSEventsFixDebugOptionSimulateRepair   = 0x20,
+};
+
+typedef CF_ENUM(int, FSEventsFixMessageType) {
+    /// Call logging requested via FSEventsFixDebugOptionLogCalls
+    FSEventsFixMessageTypeCall,
+    
+    /// Results of actions like repair, and other pretty verbose, but notable, stuff.
+    FSEventsFixMessageTypeResult,
+
+    /// Enabled/disabled status change
+    FSEventsFixMessageTypeStatusChange,
+
+    /// Expected failure (treat as a warning)
+    FSEventsFixMessageTypeExpectedFailure,
+
+    /// Severe failure that most likely means that the library won't work
+    FSEventsFixMessageTypeFatalError
+};
+
+typedef CF_ENUM(int, FSEventsFixRepairStatus) {
+    FSEventsFixRepairStatusNotBroken,
+    FSEventsFixRepairStatusRepaired,
+    FSEventsFixRepairStatusFailed,
+};
+
+/// Note that the logging block can be called on any dispatch queue.
+void FSEventsFixConfigure(FSEventsFixDebugOptions debugOptions, void(^loggingBlock)(FSEventsFixMessageType type, const char *message));
+
+void FSEventsFixEnable();
+void FSEventsFixDisable();
+
+bool FSEventsFixIsOperational();
+
+bool FSEventsFixIsBroken(const char *path);
+
+/// If the path is broken, returns a string identifying the root broken folder,
+/// otherwise, returns NULL. You need to free() the returned string.
+char *FSEventsFixCopyRootBrokenFolderPath(const char *path);
+
+FSEventsFixRepairStatus FSEventsFixRepairIfNeeded(const char *path);
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.c b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.c
new file mode 100644
index 0000000..6e033d0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.c
@@ -0,0 +1,373 @@
+//
+//  TSICTString.c
+//  TSITString
+//
+//  Created by Travis Tilley on 9/27/11.
+//
+
+#include "TSICTString.h"
+
+
+const char* const TNetstringTypes = ",#^!~}]Z";
+const char* const OTNetstringTypes = ",#^!~{[Z";
+const UInt8 TNetstringSeparator = ':';
+
+TSITStringFormat TSITStringDefaultFormat = kTSITStringFormatTNetstring;
+
+static const CFRange BeginningRange = {0,0};
+
+static CFTypeID kCFDataTypeID       = -1UL;
+static CFTypeID kCFStringTypeID     = -1UL;
+static CFTypeID kCFNumberTypeID     = -1UL;
+static CFTypeID kCFBooleanTypeID    = -1UL;
+static CFTypeID kCFNullTypeID       = -1UL;
+static CFTypeID kCFArrayTypeID      = -1UL;
+static CFTypeID kCFDictionaryTypeID = -1UL;
+
+
+__attribute__((constructor)) void Init_TSICTString(void)
+{
+    kCFDataTypeID        = CFDataGetTypeID();
+    kCFStringTypeID      = CFStringGetTypeID();
+    kCFNumberTypeID      = CFNumberGetTypeID();
+    kCFBooleanTypeID     = CFBooleanGetTypeID();
+    kCFNullTypeID        = CFNullGetTypeID();
+    kCFArrayTypeID       = CFArrayGetTypeID();
+    kCFDictionaryTypeID  = CFDictionaryGetTypeID();
+}
+
+
+void TSICTStringSetDefaultFormat(TSITStringFormat format)
+{
+    if (format == kTSITStringFormatDefault) {
+        TSITStringDefaultFormat = kTSITStringFormatTNetstring;
+    } else {
+        TSITStringDefaultFormat = format;
+    }
+}
+
+TSITStringFormat TSICTStringGetDefaultFormat(void)
+{
+    return TSITStringDefaultFormat;
+}
+
+
+void TSICTStringDestroy(TStringIRep* rep)
+{
+    CFRelease(rep->data);
+    free(rep->length);
+    free(rep);
+}
+
+
+static inline TStringIRep* TSICTStringCreateWithDataOfTypeAndFormat(CFDataRef data, TSITStringTag type, TSITStringFormat format)
+{
+    if (format == kTSITStringFormatDefault) {
+        format = TSICTStringGetDefaultFormat();
+    }
+
+    TStringIRep* rep = calloc(1, sizeof(TStringIRep));
+    rep->data = CFDataCreateCopy(kCFAllocatorDefault, data);
+    rep->type = type;
+    rep->format = format;
+    rep->length = calloc(10, sizeof(char));
+
+    CFIndex len = CFDataGetLength(rep->data);
+    if (snprintf(rep->length, 10, "%lu", len)) {
+        return rep;
+    } else {
+        TSICTStringDestroy(rep);
+        return NULL;
+    }
+}
+
+static inline CFDataRef TSICTStringCreateDataFromIntermediateRepresentation(TStringIRep* rep)
+{
+    CFIndex len = CFDataGetLength(rep->data);
+    CFMutableDataRef buffer = CFDataCreateMutableCopy(kCFAllocatorDefault, (len + 12), rep->data);
+    UInt8* bufferBytes = CFDataGetMutableBytePtr(buffer);
+
+    size_t prefixLength = strlen(rep->length) + 1;
+    CFDataReplaceBytes(buffer, BeginningRange, (const UInt8*)rep->length, (CFIndex)prefixLength);
+
+    if (rep->format == kTSITStringFormatTNetstring) {
+        const UInt8 ftag = (UInt8)TNetstringTypes[rep->type];
+        CFDataAppendBytes(buffer, &ftag, 1);
+        bufferBytes[(prefixLength - 1)] = TNetstringSeparator;
+    } else if (rep->format == kTSITStringFormatOTNetstring) {
+        const UInt8 ftag = (UInt8)OTNetstringTypes[rep->type];
+        bufferBytes[(prefixLength - 1)] = ftag;
+    }
+
+    CFDataRef dataRep = CFDataCreateCopy(kCFAllocatorDefault, buffer);
+    CFRelease(buffer);
+
+    return dataRep;
+}
+
+static inline CFStringRef TSICTStringCreateStringFromIntermediateRepresentation(TStringIRep* rep)
+{
+    CFDataRef data = TSICTStringCreateDataFromIntermediateRepresentation(rep);
+    CFStringRef string = CFStringCreateFromExternalRepresentation(kCFAllocatorDefault, data, kCFStringEncodingUTF8);
+    CFRelease(data);
+    return string;
+}
+
+static inline void TSICTStringAppendObjectToMutableDataWithFormat(CFTypeRef object, CFMutableDataRef buffer, TSITStringFormat format)
+{
+    if (object == NULL) {
+        object = kCFNull;
+    }
+
+    CFRetain(object);
+
+    TStringIRep* objRep = TSICTStringCreateWithObjectAndFormat(object, format);
+    CFDataRef objData = TSICTStringCreateDataFromIntermediateRepresentation(objRep);
+    CFDataAppendBytes(buffer, (CFDataGetBytePtr(objData)), CFDataGetLength(objData));
+    CFRelease(objData);
+    TSICTStringDestroy(objRep);
+
+    CFRelease(object);
+}
+
+static void ArrayBufferAppendCallback(const void* item, void* context)
+{
+    TStringCollectionCallbackContext* cx = (TStringCollectionCallbackContext*)context;
+    CFMutableDataRef buffer = cx->buffer;
+    TSITStringFormat format = cx->format;
+
+    TSICTStringAppendObjectToMutableDataWithFormat(item, buffer, format);
+}
+
+static void DictionaryBufferAppendCallback(const void* key, const void* value, void* context)
+{
+    TStringCollectionCallbackContext* cx = (TStringCollectionCallbackContext*)context;
+    CFMutableDataRef buffer = cx->buffer;
+    TSITStringFormat format = cx->format;
+
+    TSICTStringAppendObjectToMutableDataWithFormat(key, buffer, format);
+    TSICTStringAppendObjectToMutableDataWithFormat(value, buffer, format);
+}
+
+
+CFDataRef TSICTStringCreateRenderedData(TStringIRep* rep)
+{
+    return TSICTStringCreateDataFromIntermediateRepresentation(rep);
+}
+
+CFDataRef TSICTStringCreateRenderedDataFromObjectWithFormat(CFTypeRef object, TSITStringFormat format)
+{
+    if (object == NULL) {
+        object = kCFNull;
+    }
+
+    CFRetain(object);
+
+    TStringIRep* rep = TSICTStringCreateWithObjectAndFormat(object, format);
+    CFDataRef data = TSICTStringCreateDataFromIntermediateRepresentation(rep);
+
+    TSICTStringDestroy(rep);
+    CFRelease(object);
+
+    return data;
+}
+
+CFStringRef TSICTStringCreateRenderedString(TStringIRep* rep)
+{
+    return TSICTStringCreateStringFromIntermediateRepresentation(rep);
+}
+
+CFStringRef TSICTStringCreateRenderedStringFromObjectWithFormat(CFTypeRef object, TSITStringFormat format)
+{
+    if (object == NULL) {
+        object = kCFNull;
+    }
+
+    CFRetain(object);
+
+    TStringIRep* rep = TSICTStringCreateWithObjectAndFormat(object, format);
+    CFStringRef string = TSICTStringCreateStringFromIntermediateRepresentation(rep);
+
+    TSICTStringDestroy(rep);
+    CFRelease(object);
+
+    return string;
+}
+
+
+TStringIRep* TSICTStringCreateWithObjectAndFormat(CFTypeRef object, TSITStringFormat format)
+{
+    if (object == NULL) {
+        return TSICTStringCreateNullWithFormat(format);
+    }
+    CFRetain(object);
+
+    CFTypeID cfType = CFGetTypeID(object);
+    TStringIRep* rep = NULL;
+
+    if (cfType == kCFDataTypeID) {
+        rep = TSICTStringCreateWithDataOfTypeAndFormat(object, kTSITStringTagString, format);
+    } else if (cfType == kCFStringTypeID) {
+        rep = TSICTStringCreateWithStringAndFormat(object, format);
+    } else if (cfType == kCFNumberTypeID) {
+        rep = TSICTStringCreateWithNumberAndFormat(object, format);
+    } else if (cfType == kCFBooleanTypeID) {
+        if (CFBooleanGetValue(object)) {
+            rep = TSICTStringCreateTrueWithFormat(format);
+        } else {
+            rep = TSICTStringCreateFalseWithFormat(format);
+        }
+    } else if (cfType == kCFNullTypeID) {
+        rep = TSICTStringCreateNullWithFormat(format);
+    } else if (cfType == kCFArrayTypeID) {
+        rep = TSICTStringCreateWithArrayAndFormat(object, format);
+    } else if (cfType == kCFDictionaryTypeID) {
+        rep = TSICTStringCreateWithDictionaryAndFormat(object, format);
+    } else {
+        rep = TSICTStringCreateInvalidWithFormat(format);
+    }
+
+    CFRelease(object);
+    return rep;
+}
+
+TStringIRep* TSICTStringCreateWithStringAndFormat(CFStringRef string, TSITStringFormat format)
+{
+    CFRetain(string);
+    CFDataRef data = CFStringCreateExternalRepresentation(kCFAllocatorDefault, string, kCFStringEncodingUTF8, '?');
+    TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagString, format);
+    CFRelease(data);
+    CFRelease(string);
+    return rep;
+}
+
+TStringIRep* TSICTStringCreateWithNumberAndFormat(CFNumberRef number, TSITStringFormat format)
+{
+    CFRetain(number);
+    TSITStringTag tag = kTSITStringTagNumber;
+    CFDataRef data;
+    CFNumberType numType = CFNumberGetType(number);
+
+    switch(numType) {
+        case kCFNumberCharType:
+        {
+            int value;
+            if (CFNumberGetValue(number, kCFNumberIntType, &value)) {
+                if (value == 0 || value == 1) {
+                    tag = kTSITStringTagBool;
+                } else {
+                    tag = kTSITStringTagString;
+                }
+            }
+            break;
+        }
+        case kCFNumberFloat32Type:
+        case kCFNumberFloat64Type:
+        case kCFNumberFloatType:
+        case kCFNumberDoubleType:
+        {
+            tag = kTSITStringTagFloat;
+            break;
+        }
+    }
+
+    if (tag == kTSITStringTagBool) {
+        bool value;
+        CFNumberGetValue(number, kCFNumberIntType, &value);
+        if (value) {
+            data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"true", 4);
+        } else {
+            data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"false", 5);
+        }
+    } else if (tag == kTSITStringTagFloat) {
+        char buf[32];
+        char *p, *e;
+        double value;
+
+        CFNumberGetValue(number, numType, &value);
+        sprintf(buf, "%#.15g", value);
+
+        e = buf + strlen(buf);
+        p = e;
+        while (p[-1]=='0' && ('0' <= p[-2] && p[-2] <= '9')) {
+            p--;
+        }
+        memmove(p, e, strlen(e)+1);
+
+        data = CFDataCreate(kCFAllocatorDefault, (UInt8*)buf, (CFIndex)strlen(buf));
+    } else {
+        char buf[32];
+        SInt64 value;
+        CFNumberGetValue(number, numType, &value);
+        sprintf(buf, "%lli", value);
+        data = CFDataCreate(kCFAllocatorDefault, (UInt8*)buf, (CFIndex)strlen(buf));
+    }
+
+    TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, tag, format);
+    CFRelease(data);
+    CFRelease(number);
+    return rep;
+}
+
+TStringIRep* TSICTStringCreateTrueWithFormat(TSITStringFormat format)
+{
+    CFDataRef data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"true", 4);
+    TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagBool, format);
+    CFRelease(data);
+    return rep;
+}
+
+TStringIRep* TSICTStringCreateFalseWithFormat(TSITStringFormat format)
+{
+    CFDataRef data = CFDataCreate(kCFAllocatorDefault, (UInt8*)"false", 5);
+    TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagBool, format);
+    CFRelease(data);
+    return rep;
+}
+
+TStringIRep* TSICTStringCreateNullWithFormat(TSITStringFormat format)
+{
+    CFDataRef data = CFDataCreate(kCFAllocatorDefault, NULL, 0);
+    TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagNull, format);
+    CFRelease(data);
+    return rep;
+}
+
+TStringIRep* TSICTStringCreateInvalidWithFormat(TSITStringFormat format)
+{
+    CFDataRef data = CFDataCreate(kCFAllocatorDefault, NULL, 0);
+    TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(data, kTSITStringTagInvalid, format);
+    CFRelease(data);
+    return rep;
+}
+
+TStringIRep* TSICTStringCreateWithArrayAndFormat(CFArrayRef array, TSITStringFormat format)
+{
+    CFRetain(array);
+
+    CFMutableDataRef buffer = CFDataCreateMutable(kCFAllocatorDefault, 0);
+
+    CFRange all = CFRangeMake(0, CFArrayGetCount(array));
+    TStringCollectionCallbackContext cx = {buffer, format};
+    CFArrayApplyFunction(array, all, ArrayBufferAppendCallback, &cx);
+
+    TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(buffer, kTSITStringTagList, format);
+    CFRelease(buffer);
+    CFRelease(array);
+    return rep;
+}
+
+TStringIRep* TSICTStringCreateWithDictionaryAndFormat(CFDictionaryRef dictionary, TSITStringFormat format)
+{
+    CFRetain(dictionary);
+
+    CFMutableDataRef buffer = CFDataCreateMutable(kCFAllocatorDefault, 0);
+
+    TStringCollectionCallbackContext cx = {buffer, format};
+    CFDictionaryApplyFunction(dictionary, DictionaryBufferAppendCallback, &cx);
+
+    TStringIRep* rep = TSICTStringCreateWithDataOfTypeAndFormat(buffer, kTSITStringTagDict, format);
+    CFRelease(buffer);
+    CFRelease(dictionary);
+    return rep;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.h b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.h
new file mode 100644
index 0000000..daf085c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/TSICTString.h
@@ -0,0 +1,74 @@
+//
+//  TSICTString.h
+//  TSITString
+//
+//  Created by Travis Tilley on 9/27/11.
+//
+
+#ifndef TSICTString_H
+#define TSICTString_H
+
+#include <CoreFoundation/CoreFoundation.h>
+
+
+typedef enum {
+    kTSITStringTagString   = 0,
+    kTSITStringTagNumber   = 1,
+    kTSITStringTagFloat    = 2,
+    kTSITStringTagBool     = 3,
+    kTSITStringTagNull     = 4,
+    kTSITStringTagDict     = 5,
+    kTSITStringTagList     = 6,
+    kTSITStringTagInvalid  = 7,
+} TSITStringTag;
+
+extern const char* const TNetstringTypes;
+extern const char* const OTNetstringTypes;
+extern const UInt8 TNetstringSeparator;
+
+typedef enum {
+    kTSITStringFormatDefault        = 0,
+    kTSITStringFormatOTNetstring    = 1,
+    kTSITStringFormatTNetstring     = 2,
+} TSITStringFormat;
+
+extern TSITStringFormat TSITStringDefaultFormat;
+
+typedef struct TSITStringIntermediate {
+    CFDataRef           data;
+    char*               length;
+    TSITStringTag       type;
+    TSITStringFormat    format;
+} TStringIRep;
+
+typedef struct {
+    CFMutableDataRef    buffer;
+    TSITStringFormat    format;
+} TStringCollectionCallbackContext;
+
+
+void Init_TSICTString(void);
+
+void TSICTStringSetDefaultFormat(TSITStringFormat format);
+TSITStringFormat TSICTStringGetDefaultFormat(void);
+
+void TSICTStringDestroy(TStringIRep* rep);
+
+CFDataRef TSICTStringCreateRenderedData(TStringIRep* rep);
+CFDataRef TSICTStringCreateRenderedDataFromObjectWithFormat(CFTypeRef object, TSITStringFormat format);
+
+CFStringRef TSICTStringCreateRenderedString(TStringIRep* rep);
+CFStringRef TSICTStringCreateRenderedStringFromObjectWithFormat(CFTypeRef object, TSITStringFormat format);
+
+TStringIRep* TSICTStringCreateWithObjectAndFormat(CFTypeRef object, TSITStringFormat format);
+TStringIRep* TSICTStringCreateWithStringAndFormat(CFStringRef string, TSITStringFormat format);
+TStringIRep* TSICTStringCreateWithNumberAndFormat(CFNumberRef number, TSITStringFormat format);
+TStringIRep* TSICTStringCreateTrueWithFormat(TSITStringFormat format);
+TStringIRep* TSICTStringCreateFalseWithFormat(TSITStringFormat format);
+TStringIRep* TSICTStringCreateNullWithFormat(TSITStringFormat format);
+TStringIRep* TSICTStringCreateInvalidWithFormat(TSITStringFormat format);
+TStringIRep* TSICTStringCreateWithArrayAndFormat(CFArrayRef array, TSITStringFormat format);
+TStringIRep* TSICTStringCreateWithDictionaryAndFormat(CFDictionaryRef dictionary, TSITStringFormat format);
+
+
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.c b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.c
new file mode 100644
index 0000000..6d36dd1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.c
@@ -0,0 +1,201 @@
+#include <getopt.h>
+#include "cli.h"
+
+const char* cli_info_purpose = "A flexible command-line interface for the FSEvents API";
+const char* cli_info_usage = "Usage: fsevent_watch [OPTIONS]... [PATHS]...";
+const char* cli_info_help[] = {
+  "  -h, --help                you're looking at it",
+  "  -V, --version             print version number and exit",
+  "  -p, --show-plist          display the embedded Info.plist values",
+  "  -s, --since-when=EventID  fire historical events since ID",
+  "  -l, --latency=seconds     latency period (default='0.5')",
+  "  -n, --no-defer            enable no-defer latency modifier",
+  "  -r, --watch-root          watch for when the root path has changed",
+  // "  -i, --ignore-self         ignore current process",
+  "  -F, --file-events         provide file level event data",
+  "  -f, --format=name         output format (classic, niw, \n"
+  "                                           tnetstring, otnetstring)",
+  0
+};
+
+static void default_args (struct cli_info* args_info)
+{
+  args_info->since_when_arg     = kFSEventStreamEventIdSinceNow;
+  args_info->latency_arg        = 0.5;
+  args_info->no_defer_flag      = false;
+  args_info->watch_root_flag    = false;
+  args_info->ignore_self_flag   = false;
+  args_info->file_events_flag   = false;
+  args_info->mark_self_flag     = false;
+  args_info->format_arg         = kFSEventWatchOutputFormatOTNetstring;
+}
+
+static void cli_parser_release (struct cli_info* args_info)
+{
+  unsigned int i;
+
+  for (i=0; i < args_info->inputs_num; ++i) {
+    free(args_info->inputs[i]);
+  }
+
+  if (args_info->inputs_num) {
+    free(args_info->inputs);
+  }
+
+  args_info->inputs_num = 0;
+}
+
+void cli_parser_init (struct cli_info* args_info)
+{
+  default_args(args_info);
+
+  args_info->inputs = 0;
+  args_info->inputs_num = 0;
+}
+
+void cli_parser_free (struct cli_info* args_info)
+{
+  cli_parser_release(args_info);
+}
+
+static void cli_print_info_dict (const void *key,
+                                 const void *value,
+                                 void *context)
+{
+  CFStringRef entry = CFStringCreateWithFormat(NULL, NULL,
+    CFSTR("%@:\n  %@"), key, value);
+  if (entry) {
+    CFShow(entry);
+    CFRelease(entry);
+  }
+}
+
+void cli_show_plist (void)
+{
+  CFBundleRef mainBundle = CFBundleGetMainBundle();
+  CFRetain(mainBundle);
+  CFDictionaryRef mainBundleDict = CFBundleGetInfoDictionary(mainBundle);
+  if (mainBundleDict) {
+    CFRetain(mainBundleDict);
+    printf("Embedded Info.plist metadata:\n\n");
+    CFDictionaryApplyFunction(mainBundleDict, cli_print_info_dict, NULL);
+    CFRelease(mainBundleDict);
+  }
+  CFRelease(mainBundle);
+  printf("\n");
+}
+
+void cli_print_version (void)
+{
+  printf("%s %s\n\n", CLI_NAME, CLI_VERSION);
+#ifdef COMPILED_AT
+  printf("Compiled at:    %s\n", COMPILED_AT);
+#endif
+#ifdef COMPILER
+  printf("Compiled with:  %s\n", COMPILER);
+#endif
+#ifdef TARGET_CPU
+  printf("Compiled for:   %s\n", TARGET_CPU);
+#endif
+  printf("\n");
+}
+
+void cli_print_help (void)
+{
+  cli_print_version();
+
+  printf("\n%s\n", cli_info_purpose);
+  printf("\n%s\n", cli_info_usage);
+  printf("\n");
+
+  int i = 0;
+  while (cli_info_help[i]) {
+    printf("%s\n", cli_info_help[i++]);
+  }
+}
+
+int cli_parser (int argc, const char** argv, struct cli_info* args_info)
+{
+  static struct option longopts[] = {
+    { "help",         no_argument,        NULL, 'h' },
+    { "version",      no_argument,        NULL, 'V' },
+    { "show-plist",   no_argument,        NULL, 'p' },
+    { "since-when",   required_argument,  NULL, 's' },
+    { "latency",      required_argument,  NULL, 'l' },
+    { "no-defer",     no_argument,        NULL, 'n' },
+    { "watch-root",   no_argument,        NULL, 'r' },
+    { "ignore-self",  no_argument,        NULL, 'i' },
+    { "file-events",  no_argument,        NULL, 'F' },
+    { "mark-self",    no_argument,        NULL, 'm' },
+    { "format",       required_argument,  NULL, 'f' },
+    { 0, 0, 0, 0 }
+  };
+
+  const char* shortopts = "hVps:l:nriFf:";
+
+  int c = -1;
+
+  while ((c = getopt_long(argc, (char * const*)argv, shortopts, longopts, NULL)) != -1) {
+    switch(c) {
+    case 's': // since-when
+      args_info->since_when_arg = strtoull(optarg, NULL, 0);
+      break;
+    case 'l': // latency
+      args_info->latency_arg = strtod(optarg, NULL);
+      break;
+    case 'n': // no-defer
+      args_info->no_defer_flag = true;
+      break;
+    case 'r': // watch-root
+      args_info->watch_root_flag = true;
+      break;
+    case 'i': // ignore-self
+      args_info->ignore_self_flag = true;
+      break;
+    case 'F': // file-events
+      args_info->file_events_flag = true;
+      break;
+    case 'm': // mark-self
+      args_info->mark_self_flag = true;
+      break;
+    case 'f': // format
+      if (strcmp(optarg, "classic") == 0) {
+        args_info->format_arg = kFSEventWatchOutputFormatClassic;
+      } else if (strcmp(optarg, "niw") == 0) {
+        args_info->format_arg = kFSEventWatchOutputFormatNIW;
+      } else if (strcmp(optarg, "tnetstring") == 0) {
+        args_info->format_arg = kFSEventWatchOutputFormatTNetstring;
+      } else if (strcmp(optarg, "otnetstring") == 0) {
+        args_info->format_arg = kFSEventWatchOutputFormatOTNetstring;
+      } else {
+        fprintf(stderr, "Unknown output format: %s\n", optarg);
+        exit(EXIT_FAILURE);
+      }
+      break;
+    case 'V': // version
+      cli_print_version();
+      exit(EXIT_SUCCESS);
+    case 'p': // show-plist
+      cli_show_plist();
+      exit(EXIT_SUCCESS);
+    case 'h': // help
+    case '?': // invalid option
+    case ':': // missing argument
+      cli_print_help();
+      exit((c == 'h') ? EXIT_SUCCESS : EXIT_FAILURE);
+    }
+  }
+
+  if (optind < argc) {
+    int i = 0;
+    args_info->inputs_num = (unsigned int)(argc - optind);
+    args_info->inputs =
+      (char**)(malloc ((args_info->inputs_num)*sizeof(char*)));
+    while (optind < argc)
+      if (argv[optind++] != argv[0]) {
+        args_info->inputs[i++] = strdup(argv[optind-1]);
+      }
+  }
+
+  return EXIT_SUCCESS;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.h b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.h
new file mode 100644
index 0000000..2164995
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/cli.h
@@ -0,0 +1,45 @@
+#ifndef CLI_H
+#define CLI_H
+
+#include "common.h"
+
+#ifndef CLI_NAME
+#define CLI_NAME "fsevent_watch"
+#endif /* CLI_NAME */
+
+#ifndef PROJECT_VERSION
+#error "PROJECT_VERSION not set"
+#endif /* PROJECT_VERSION */
+
+#ifndef CLI_VERSION
+#define CLI_VERSION _xstr(PROJECT_VERSION)
+#endif /* CLI_VERSION */
+
+
+struct cli_info {
+  UInt64 since_when_arg;
+  double latency_arg;
+  bool no_defer_flag;
+  bool watch_root_flag;
+  bool ignore_self_flag;
+  bool file_events_flag;
+  bool mark_self_flag;
+  enum FSEventWatchOutputFormat format_arg;
+
+  char** inputs;
+  unsigned inputs_num;
+};
+
+extern const char* cli_info_purpose;
+extern const char* cli_info_usage;
+extern const char* cli_info_help[];
+
+void cli_print_help(void);
+void cli_print_version(void);
+
+int cli_parser (int argc, const char** argv, struct cli_info* args_info);
+void cli_parser_init (struct cli_info* args_info);
+void cli_parser_free (struct cli_info* args_info);
+
+
+#endif /* CLI_H */
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/common.h b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/common.h
new file mode 100644
index 0000000..b2d3e4e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/common.h
@@ -0,0 +1,22 @@
+#ifndef fsevent_watch_common_h
+#define fsevent_watch_common_h
+
+#include <CoreFoundation/CoreFoundation.h>
+#ifdef __OBJC__
+#import <Foundation/Foundation.h>
+#endif
+
+#include <CoreServices/CoreServices.h>
+#include <unistd.h>
+#include "compat.h"
+#include "defines.h"
+#include "TSICTString.h"
+
+enum FSEventWatchOutputFormat {
+  kFSEventWatchOutputFormatClassic,
+  kFSEventWatchOutputFormatNIW,
+  kFSEventWatchOutputFormatTNetstring,
+  kFSEventWatchOutputFormatOTNetstring
+};
+
+#endif /* fsevent_watch_common_h */
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.c b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.c
new file mode 100644
index 0000000..5f51baf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.c
@@ -0,0 +1,41 @@
+#include "compat.h"
+
+
+#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_6) || \
+    (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)
+FSEventStreamCreateFlags  kFSEventStreamCreateFlagIgnoreSelf        = 0x00000008;
+#endif
+
+#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_7) || \
+    (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)
+FSEventStreamCreateFlags  kFSEventStreamCreateFlagFileEvents        = 0x00000010;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemCreated        = 0x00000100;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemRemoved        = 0x00000200;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemInodeMetaMod   = 0x00000400;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemRenamed        = 0x00000800;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemModified       = 0x00001000;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemFinderInfoMod  = 0x00002000;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemChangeOwner    = 0x00004000;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemXattrMod       = 0x00008000;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemIsFile         = 0x00010000;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemIsDir          = 0x00020000;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemIsSymlink      = 0x00040000;
+#endif
+
+#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_9) || \
+    (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0)
+FSEventStreamCreateFlags  kFSEventStreamCreateFlagMarkSelf          = 0x00000020;
+FSEventStreamEventFlags   kFSEventStreamEventFlagOwnEvent           = 0x00080000;
+#endif
+
+#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_10) || \
+    (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0)
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemIsHardlink     = 0x00100000;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemIsLastHardlink = 0x00200000;
+#endif
+
+#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_13) || \
+    (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_11_0)
+FSEventStreamCreateFlags  kFSEventStreamCreateFlagUseExtendedData   = 0x00000040;
+FSEventStreamEventFlags   kFSEventStreamEventFlagItemCloned         = 0x00400000;
+#endif
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.h b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.h
new file mode 100644
index 0000000..757b413
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/compat.h
@@ -0,0 +1,100 @@
+/**
+ * @headerfile compat.h
+ * FSEventStream flag compatibility shim
+ *
+ * In order to compile a binary against an older SDK yet still support the
+ * features present in later OS releases, we need to define any missing enum
+ * constants not present in the older SDK. This allows us to safely defer
+ * feature detection to runtime (and avoid recompilation).
+ */
+
+
+#ifndef listen_fsevents_compat_h
+#define listen_fsevents_compat_h
+
+#ifndef __CORESERVICES__
+#include <CoreServices/CoreServices.h>
+#endif // __CORESERVICES__
+
+#ifndef __AVAILABILITY__
+#include <Availability.h>
+#endif // __AVAILABILITY__
+
+#ifndef __MAC_10_6
+#define __MAC_10_6            1060
+#endif
+#ifndef __MAC_10_7
+#define __MAC_10_7            1070
+#endif
+#ifndef __MAC_10_9
+#define __MAC_10_9            1090
+#endif
+#ifndef __MAC_10_10
+#define __MAC_10_10         101000
+#endif
+#ifndef __MAC_10_13
+#define __MAC_10_13         101300
+#endif
+#ifndef __IPHONE_6_0
+#define __IPHONE_6_0         60000
+#endif
+#ifndef __IPHONE_7_0
+#define __IPHONE_7_0         70000
+#endif
+#ifndef __IPHONE_9_0
+#define __IPHONE_9_0         90000
+#endif
+#ifndef __IPHONE_11_0
+#define __IPHONE_11_0       110000
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_6) || \
+    (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)
+extern FSEventStreamCreateFlags kFSEventStreamCreateFlagIgnoreSelf;
+#endif
+
+#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_7) || \
+    (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0)
+extern FSEventStreamCreateFlags kFSEventStreamCreateFlagFileEvents;
+extern FSEventStreamEventFlags  kFSEventStreamEventFlagItemCreated,
+                                kFSEventStreamEventFlagItemRemoved,
+                                kFSEventStreamEventFlagItemInodeMetaMod,
+                                kFSEventStreamEventFlagItemRenamed,
+                                kFSEventStreamEventFlagItemModified,
+                                kFSEventStreamEventFlagItemFinderInfoMod,
+                                kFSEventStreamEventFlagItemChangeOwner,
+                                kFSEventStreamEventFlagItemXattrMod,
+                                kFSEventStreamEventFlagItemIsFile,
+                                kFSEventStreamEventFlagItemIsDir,
+                                kFSEventStreamEventFlagItemIsSymlink;
+#endif
+
+#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_9) || \
+    (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0)
+extern FSEventStreamCreateFlags kFSEventStreamCreateFlagMarkSelf;
+extern FSEventStreamEventFlags  kFSEventStreamEventFlagOwnEvent;
+#endif
+
+#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_10) || \
+    (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0)
+extern FSEventStreamEventFlags  kFSEventStreamEventFlagItemIsHardlink,
+                                kFSEventStreamEventFlagItemIsLastHardlink;
+#endif
+
+#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_13) || \
+    (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_11_0)
+extern FSEventStreamCreateFlags kFSEventStreamCreateFlagUseExtendedData;
+extern FSEventStreamEventFlags  kFSEventStreamEventFlagItemCloned;
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // listen_fsevents_compat_h
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/defines.h b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/defines.h
new file mode 100644
index 0000000..6f6e87b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/defines.h
@@ -0,0 +1,40 @@
+#ifndef fsevent_watch_defines_h
+#define fsevent_watch_defines_h
+
+#define _str(s) #s
+#define _xstr(s) _str(s)
+
+#define COMPILED_AT __DATE__ " " __TIME__
+
+#if defined (__clang__)
+#define COMPILER "clang " __clang_version__
+#elif defined (__GNUC__)
+#define COMPILER "gcc " __VERSION__
+#else
+#define COMPILER "unknown"
+#endif
+
+#if defined(__ppc__)
+#define TARGET_CPU "ppc"
+#elif defined(__ppc64__)
+#define TARGET_CPU "ppc64"
+#elif defined(__i386__)
+#define TARGET_CPU "i386"
+#elif defined(__x86_64__)
+#define TARGET_CPU "x86_64"
+#else
+#define TARGET_CPU "unknown"
+#endif
+
+#define FLAG_CHECK(flags, flag) ((flags) & (flag))
+
+#define FPRINTF_FLAG_CHECK(flags, flag, msg, fd)  \
+  do {                                            \
+    if (FLAG_CHECK(flags, flag)) {                \
+      fprintf(fd, "%s", msg "\n"); } }            \
+  while (0)
+
+#define FLAG_CHECK_STDERR(flags, flag, msg)       \
+        FPRINTF_FLAG_CHECK(flags, flag, msg, stderr)
+
+#endif /* fsevent_watch_defines_h */
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/main.c b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/main.c
new file mode 100644
index 0000000..b18596a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/main.c
@@ -0,0 +1,548 @@
+#include "common.h"
+#include "signal_handlers.h"
+#include "cli.h"
+#include "FSEventsFix.h"
+
+// TODO: set on fire. cli.{h,c} handle both parsing and defaults, so there's
+//       no need to set those here. also, in order to scope metadata by path,
+//       each stream will need its own configuration... so this won't work as
+//       a global any more. In the end the goal is to make the output format
+//       able to declare not just that something happened and what flags were
+//       attached, but what path it was watching that caused those events (so
+//       that the path itself can be used for routing that information to the
+//       relevant callback).
+//
+// Structure for storing metadata parsed from the commandline
+static struct {
+  FSEventStreamEventId            sinceWhen;
+  CFTimeInterval                  latency;
+  FSEventStreamCreateFlags        flags;
+  CFMutableArrayRef               paths;
+  enum FSEventWatchOutputFormat   format;
+} config = {
+  (UInt64) kFSEventStreamEventIdSinceNow,
+  (double) 0.3,
+  (CFOptionFlags) kFSEventStreamCreateFlagNone,
+  NULL,
+  kFSEventWatchOutputFormatOTNetstring
+};
+
+// Prototypes
+static void         append_path(const char* path);
+static inline void  parse_cli_settings(int argc, const char* argv[]);
+static void         callback(FSEventStreamRef streamRef,
+                             void* clientCallBackInfo,
+                             size_t numEvents,
+                             void* eventPaths,
+                             const FSEventStreamEventFlags eventFlags[],
+                             const FSEventStreamEventId eventIds[]);
+static bool needs_fsevents_fix = false;
+
+// Resolve a path and append it to the CLI settings structure
+// The FSEvents API will, internally, resolve paths using a similar scheme.
+// Performing this ahead of time makes things less confusing, IMHO.
+static void append_path(const char* path)
+{
+#ifdef DEBUG
+  fprintf(stderr, "\n");
+  fprintf(stderr, "append_path called for: %s\n", path);
+#endif
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060
+
+#ifdef DEBUG
+  fprintf(stderr, "compiled against 10.6+, using CFURLCreateFileReferenceURL\n");
+#endif
+
+  CFURLRef url = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)path, (CFIndex)strlen(path), false);
+  CFURLRef placeholder = CFURLCopyAbsoluteURL(url);
+  CFRelease(url);
+
+  CFMutableArrayRef imaginary = NULL;
+
+  // if we don't have an existing url, spin until we get to a parent that
+  // does exist, saving any imaginary components for appending back later
+  while(!CFURLResourceIsReachable(placeholder, NULL)) {
+#ifdef DEBUG
+    fprintf(stderr, "path does not exist\n");
+#endif
+
+    CFStringRef child;
+
+    if (imaginary == NULL) {
+      imaginary = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+    }
+
+    child = CFURLCopyLastPathComponent(placeholder);
+    CFArrayInsertValueAtIndex(imaginary, 0, child);
+    CFRelease(child);
+
+    url = CFURLCreateCopyDeletingLastPathComponent(NULL, placeholder);
+    CFRelease(placeholder);
+    placeholder = url;
+
+#ifdef DEBUG
+    fprintf(stderr, "parent: ");
+    CFShow(placeholder);
+#endif
+  }
+
+#ifdef DEBUG
+  fprintf(stderr, "path exists\n");
+#endif
+
+  // realpath() doesn't always return the correct case for a path, so this
+  // is a funky workaround that converts a path into a (volId/inodeId) pair
+  // and asks what the path should be for that. since it looks at the actual
+  // inode instead of returning the same case passed in like realpath()
+  // appears to do for HFS+, it should always be correct.
+  url = CFURLCreateFileReferenceURL(NULL, placeholder, NULL);
+  CFRelease(placeholder);
+  placeholder = CFURLCreateFilePathURL(NULL, url, NULL);
+  CFRelease(url);
+
+#ifdef DEBUG
+  fprintf(stderr, "path resolved to: ");
+  CFShow(placeholder);
+#endif
+
+  // if we stripped off any imaginary path components, append them back on
+  if (imaginary != NULL) {
+    CFIndex count = CFArrayGetCount(imaginary);
+    for (CFIndex i = 0; i<count; i++) {
+      CFStringRef component = CFArrayGetValueAtIndex(imaginary, i);
+#ifdef DEBUG
+      fprintf(stderr, "appending component: ");
+      CFShow(component);
+#endif
+      url = CFURLCreateCopyAppendingPathComponent(NULL, placeholder, component, false);
+      CFRelease(placeholder);
+      placeholder = url;
+    }
+    CFRelease(imaginary);
+  }
+
+#ifdef DEBUG
+  fprintf(stderr, "result: ");
+  CFShow(placeholder);
+#endif
+
+  CFStringRef cfPath = CFURLCopyFileSystemPath(placeholder, kCFURLPOSIXPathStyle);
+  CFRelease(placeholder);
+
+  char cPath[PATH_MAX];
+  if (CFStringGetCString(cfPath, cPath, PATH_MAX, kCFStringEncodingUTF8)) {
+    FSEventsFixRepairStatus status = FSEventsFixRepairIfNeeded(cPath);
+    if (status == FSEventsFixRepairStatusFailed) {
+      needs_fsevents_fix = true;
+    }
+  }
+
+  CFArrayAppendValue(config.paths, cfPath);
+  CFRelease(cfPath);
+
+#else
+
+#ifdef DEBUG
+  fprintf(stderr, "compiled against 10.5, using realpath()\n");
+#endif
+
+  char fullPath[PATH_MAX + 1];
+
+  if (realpath(path, fullPath) == NULL) {
+#ifdef DEBUG
+    fprintf(stderr, "  realpath not directly resolvable from path\n");
+#endif
+
+    if (path[0] != '/') {
+#ifdef DEBUG
+      fprintf(stderr, "  passed path is not absolute\n");
+#endif
+      size_t len;
+      getcwd(fullPath, sizeof(fullPath));
+#ifdef DEBUG
+      fprintf(stderr, "  result of getcwd: %s\n", fullPath);
+#endif
+      len = strlen(fullPath);
+      fullPath[len] = '/';
+      strlcpy(&fullPath[len + 1], path, sizeof(fullPath) - (len + 1));
+    } else {
+#ifdef DEBUG
+      fprintf(stderr, "  assuming path does not YET exist\n");
+#endif
+      strlcpy(fullPath, path, sizeof(fullPath));
+    }
+  }
+
+#ifdef DEBUG
+  fprintf(stderr, "  resolved path to: %s\n", fullPath);
+  fprintf(stderr, "\n");
+#endif
+
+  CFStringRef pathRef = CFStringCreateWithCString(kCFAllocatorDefault,
+                                                  fullPath,
+                                                  kCFStringEncodingUTF8);
+  CFArrayAppendValue(config.paths, pathRef);
+  CFRelease(pathRef);
+
+#endif
+}
+
+// Parse commandline settings
+static inline void parse_cli_settings(int argc, const char* argv[])
+{
+  // runtime os version detection
+  SInt32 osMajorVersion, osMinorVersion;
+  if (!(Gestalt(gestaltSystemVersionMajor, &osMajorVersion) == noErr)) {
+    osMajorVersion = 0;
+  }
+  if (!(Gestalt(gestaltSystemVersionMinor, &osMinorVersion) == noErr)) {
+    osMinorVersion = 0;
+  }
+
+  if ((osMajorVersion == 10) & (osMinorVersion < 5)) {
+    fprintf(stderr, "The FSEvents API is unavailable on this version of macos!\n");
+    exit(EXIT_FAILURE);
+  }
+
+  struct cli_info args_info;
+  cli_parser_init(&args_info);
+
+  if (cli_parser(argc, argv, &args_info) != 0) {
+    exit(EXIT_FAILURE);
+  }
+
+  config.paths = CFArrayCreateMutable(NULL,
+                                      (CFIndex)0,
+                                      &kCFTypeArrayCallBacks);
+
+  config.sinceWhen = args_info.since_when_arg;
+  config.latency = args_info.latency_arg;
+  config.format = args_info.format_arg;
+
+  if (args_info.no_defer_flag) {
+    config.flags |= kFSEventStreamCreateFlagNoDefer;
+  }
+  if (args_info.watch_root_flag) {
+    config.flags |= kFSEventStreamCreateFlagWatchRoot;
+  }
+
+  if (args_info.ignore_self_flag) {
+    if ((osMajorVersion == 10) & (osMinorVersion >= 6)) {
+      config.flags |= kFSEventStreamCreateFlagIgnoreSelf;
+    } else {
+      fprintf(stderr, "MacOSX 10.6 or later is required for --ignore-self\n");
+      exit(EXIT_FAILURE);
+    }
+  }
+
+  if (args_info.file_events_flag) {
+    if ((osMajorVersion == 10) & (osMinorVersion >= 7)) {
+      config.flags |= kFSEventStreamCreateFlagFileEvents;
+    } else {
+      fprintf(stderr, "MacOSX 10.7 or later required for --file-events\n");
+      exit(EXIT_FAILURE);
+    }
+  }
+
+  if (args_info.mark_self_flag) {
+    if ((osMajorVersion == 10) & (osMinorVersion >= 9)) {
+      config.flags |= kFSEventStreamCreateFlagMarkSelf;
+    } else {
+      fprintf(stderr, "MacOSX 10.9 or later required for --mark-self\n");
+      exit(EXIT_FAILURE);
+    }
+  }
+
+  if (args_info.inputs_num == 0) {
+    append_path(".");
+  } else {
+    for (unsigned int i=0; i < args_info.inputs_num; ++i) {
+      append_path(args_info.inputs[i]);
+    }
+  }
+
+  cli_parser_free(&args_info);
+
+#ifdef DEBUG
+  fprintf(stderr, "config.sinceWhen    %llu\n", config.sinceWhen);
+  fprintf(stderr, "config.latency      %f\n", config.latency);
+
+// STFU clang
+#if defined(__LP64__)
+  fprintf(stderr, "config.flags        %#.8x\n", config.flags);
+#else
+  fprintf(stderr, "config.flags        %#.8lx\n", config.flags);
+#endif
+
+  FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagUseCFTypes,
+                    "  Using CF instead of C types");
+  FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagNoDefer,
+                    "  NoDefer latency modifier enabled");
+  FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagWatchRoot,
+                    "  WatchRoot notifications enabled");
+  FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagIgnoreSelf,
+                    "  IgnoreSelf enabled");
+  FLAG_CHECK_STDERR(config.flags, kFSEventStreamCreateFlagFileEvents,
+                    "  FileEvents enabled");
+
+  fprintf(stderr, "config.paths\n");
+
+  long numpaths = CFArrayGetCount(config.paths);
+
+  for (long i = 0; i < numpaths; i++) {
+    char path[PATH_MAX];
+    CFStringGetCString(CFArrayGetValueAtIndex(config.paths, i),
+                       path,
+                       PATH_MAX,
+                       kCFStringEncodingUTF8);
+    fprintf(stderr, "  %s\n", path);
+  }
+
+  fprintf(stderr, "\n");
+#endif
+}
+
+// original output format for rb-fsevent
+static void classic_output_format(size_t numEvents,
+                                  char** paths)
+{
+  for (size_t i = 0; i < numEvents; i++) {
+    fprintf(stdout, "%s:", paths[i]);
+  }
+  fprintf(stdout, "\n");
+}
+
+// output format used in the Yoshimasa Niwa branch of rb-fsevent
+static void niw_output_format(size_t numEvents,
+                              char** paths,
+                              const FSEventStreamEventFlags eventFlags[],
+                              const FSEventStreamEventId eventIds[])
+{
+  for (size_t i = 0; i < numEvents; i++) {
+    fprintf(stdout, "%lu:%llu:%s\n",
+            (unsigned long)eventFlags[i],
+            (unsigned long long)eventIds[i],
+            paths[i]);
+  }
+  fprintf(stdout, "\n");
+}
+
+static void tstring_output_format(size_t numEvents,
+                                  char** paths,
+                                  const FSEventStreamEventFlags eventFlags[],
+                                  const FSEventStreamEventId eventIds[],
+                                  TSITStringFormat format)
+{
+  CFMutableArrayRef events = CFArrayCreateMutable(kCFAllocatorDefault,
+                             0, &kCFTypeArrayCallBacks);
+
+  for (size_t i = 0; i < numEvents; i++) {
+    CFMutableDictionaryRef event = CFDictionaryCreateMutable(kCFAllocatorDefault,
+                                   0,
+                                   &kCFTypeDictionaryKeyCallBacks,
+                                   &kCFTypeDictionaryValueCallBacks);
+
+    CFStringRef path = CFStringCreateWithBytes(kCFAllocatorDefault,
+                       (const UInt8*)paths[i],
+                       (CFIndex)strlen(paths[i]),
+                       kCFStringEncodingUTF8,
+                       false);
+    CFDictionarySetValue(event, CFSTR("path"), path);
+
+    CFNumberRef ident = CFNumberCreate(kCFAllocatorDefault, kCFNumberLongLongType, &eventIds[i]);
+    CFDictionarySetValue(event, CFSTR("id"), ident);
+
+    CFNumberRef cflags = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &eventFlags[i]);
+    CFDictionarySetValue(event, CFSTR("cflags"), cflags);
+
+    CFMutableArrayRef flags = CFArrayCreateMutable(kCFAllocatorDefault,
+                              0, &kCFTypeArrayCallBacks);
+
+#define FLAG_ADD_NAME(flagsnum, flagnum, flagname, flagarray)   \
+  do {                                                          \
+    if (FLAG_CHECK(flagsnum, flagnum)) {                        \
+      CFArrayAppendValue(flagarray, CFSTR(flagname)); } }       \
+  while(0)
+
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagMustScanSubDirs,     "MustScanSubDirs", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagUserDropped,         "UserDropped", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagKernelDropped,       "KernelDropped", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagEventIdsWrapped,     "EventIdsWrapped", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagHistoryDone,         "HistoryDone", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagRootChanged,         "RootChanged", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagMount,               "Mount", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagUnmount,             "Unmount", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemCreated,         "ItemCreated", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemRemoved,         "ItemRemoved", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemInodeMetaMod,    "ItemInodeMetaMod", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemRenamed,         "ItemRenamed", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemModified,        "ItemModified", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemFinderInfoMod,   "ItemFinderInfoMod", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemChangeOwner,     "ItemChangeOwner", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemXattrMod,        "ItemXattrMod", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsFile,          "ItemIsFile", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsDir,           "ItemIsDir", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsSymlink,       "ItemIsSymlink", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagOwnEvent,            "OwnEvent", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsHardlink,      "ItemIsHardLink", flags);
+    FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsLastHardlink,  "ItemIsLastHardLink", flags);
+
+    CFDictionarySetValue(event, CFSTR("flags"), flags);
+
+
+    CFArrayAppendValue(events, event);
+
+    CFRelease(event);
+    CFRelease(path);
+    CFRelease(ident);
+    CFRelease(cflags);
+    CFRelease(flags);
+  }
+
+  CFMutableDictionaryRef meta = CFDictionaryCreateMutable(kCFAllocatorDefault,
+                                0,
+                                &kCFTypeDictionaryKeyCallBacks,
+                                &kCFTypeDictionaryValueCallBacks);
+  CFDictionarySetValue(meta, CFSTR("events"), events);
+
+  CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberCFIndexType, &numEvents);
+  CFDictionarySetValue(meta, CFSTR("numEvents"), num);
+
+  CFDataRef data = TSICTStringCreateRenderedDataFromObjectWithFormat(meta, format);
+  fprintf(stdout, "%s", CFDataGetBytePtr(data));
+
+  CFRelease(events);
+  CFRelease(num);
+  CFRelease(meta);
+  CFRelease(data);
+}
+
+static void callback(__attribute__((unused)) FSEventStreamRef streamRef,
+                     __attribute__((unused)) void* clientCallBackInfo,
+                     size_t numEvents,
+                     void* eventPaths,
+                     const FSEventStreamEventFlags eventFlags[],
+                     const FSEventStreamEventId eventIds[])
+{
+  char** paths = eventPaths;
+
+
+#ifdef DEBUG
+  fprintf(stderr, "\n");
+  fprintf(stderr, "FSEventStreamCallback fired!\n");
+  fprintf(stderr, "  numEvents: %lu\n", numEvents);
+
+  for (size_t i = 0; i < numEvents; i++) {
+    fprintf(stderr, "\n");
+    fprintf(stderr, "  event ID: %llu\n", eventIds[i]);
+
+// STFU clang
+#if defined(__LP64__)
+    fprintf(stderr, "  event flags: %#.8x\n", eventFlags[i]);
+#else
+    fprintf(stderr, "  event flags: %#.8lx\n", eventFlags[i]);
+#endif
+
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagMustScanSubDirs,
+                      "    Recursive scanning of directory required");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagUserDropped,
+                      "    Buffering problem: events dropped user-side");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagKernelDropped,
+                      "    Buffering problem: events dropped kernel-side");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagEventIdsWrapped,
+                      "    Event IDs have wrapped");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagHistoryDone,
+                      "    All historical events have been processed");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagRootChanged,
+                      "    Root path has changed");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagMount,
+                      "    A new volume was mounted at this path");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagUnmount,
+                      "    A volume was unmounted from this path");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemCreated,
+                      "    Item created");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemRemoved,
+                      "    Item removed");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemInodeMetaMod,
+                      "    Item metadata modified");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemRenamed,
+                      "    Item renamed");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemModified,
+                      "    Item modified");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemFinderInfoMod,
+                      "    Item Finder Info modified");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemChangeOwner,
+                      "    Item changed ownership");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemXattrMod,
+                      "    Item extended attributes modified");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsFile,
+                      "    Item is a file");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsDir,
+                      "    Item is a directory");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsSymlink,
+                      "    Item is a symbolic link");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsHardlink,
+                      "    Item is a hard link");
+    FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsLastHardlink,
+                      "    Item is the last hard link");
+    fprintf(stderr, "  event path: %s\n", paths[i]);
+    fprintf(stderr, "\n");
+  }
+
+  fprintf(stderr, "\n");
+#endif
+
+  if (config.format == kFSEventWatchOutputFormatClassic) {
+    classic_output_format(numEvents, paths);
+  } else if (config.format == kFSEventWatchOutputFormatNIW) {
+    niw_output_format(numEvents, paths, eventFlags, eventIds);
+  } else if (config.format == kFSEventWatchOutputFormatTNetstring) {
+    tstring_output_format(numEvents, paths, eventFlags, eventIds,
+                          kTSITStringFormatTNetstring);
+  } else if (config.format == kFSEventWatchOutputFormatOTNetstring) {
+    tstring_output_format(numEvents, paths, eventFlags, eventIds,
+                          kTSITStringFormatOTNetstring);
+  }
+
+  fflush(stdout);
+}
+
+int main(int argc, const char* argv[])
+{
+  install_signal_handlers();
+  parse_cli_settings(argc, argv);
+
+  if (needs_fsevents_fix) {
+    FSEventsFixEnable();
+  }
+
+  FSEventStreamContext context = {0, NULL, NULL, NULL, NULL};
+  FSEventStreamRef stream;
+  stream = FSEventStreamCreate(kCFAllocatorDefault,
+                               (FSEventStreamCallback)&callback,
+                               &context,
+                               config.paths,
+                               config.sinceWhen,
+                               config.latency,
+                               config.flags);
+
+#ifdef DEBUG
+  FSEventStreamShow(stream);
+  fprintf(stderr, "\n");
+#endif
+
+  if (needs_fsevents_fix) {
+    FSEventsFixDisable();
+  }
+
+  FSEventStreamScheduleWithRunLoop(stream,
+                                   CFRunLoopGetCurrent(),
+                                   kCFRunLoopDefaultMode);
+  FSEventStreamStart(stream);
+  CFRunLoopRun();
+  FSEventStreamFlushSync(stream);
+  FSEventStreamStop(stream);
+
+  return 0;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.c b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.c
new file mode 100644
index 0000000..b20da3f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.c
@@ -0,0 +1,66 @@
+#include "signal_handlers.h"
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+
+#define PPID_ALARM_INTERVAL 2 // send SIGALRM every this seconds
+
+
+static pid_t orig_ppid;
+
+
+static void signal_handler(int _) {
+  exit(EXIT_FAILURE);
+}
+
+static void check_ppid(void) {
+  if (getppid() != orig_ppid) {
+    exit(EXIT_FAILURE);
+  }
+}
+
+static void check_stdout_open(void) {
+  if (fcntl(STDOUT_FILENO, F_GETFD) < 0) {
+    exit(EXIT_FAILURE);
+  }
+}
+
+static void alarm_handler(int _) {
+  check_ppid();
+  check_stdout_open();
+  alarm(PPID_ALARM_INTERVAL);
+  signal(SIGALRM, alarm_handler);
+}
+
+static void die(const char *msg) {
+  fprintf(stderr, "\nFATAL: %s\n", msg);
+  abort();
+}
+
+static void install_signal_handler(int sig, void (*handler)(int)) {
+  if (signal(sig, handler) == SIG_ERR) {
+    die("Could not install signal handler");
+  }
+}
+
+void install_signal_handlers(void) {
+  // check pipe is still connected
+  check_stdout_open();
+
+  // watch getppid() every PPID_ALARM_INTERVAL seconds 
+  orig_ppid = getppid();
+  if (orig_ppid <= 1) {
+    die("prematurely zombied");
+  }
+  install_signal_handler(SIGALRM, alarm_handler);
+  alarm(PPID_ALARM_INTERVAL);
+
+  // be sure to exit on SIGHUP, SIGPIPE
+  install_signal_handler(SIGHUP,  signal_handler);
+  install_signal_handler(SIGPIPE, signal_handler);
+}
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.h b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.h
new file mode 100644
index 0000000..c31685d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/fsevent_watch/signal_handlers.h
@@ -0,0 +1,16 @@
+/**
+ * @headerfile signal_handlers.h
+ * Signal handlers to stop the zombie hordes
+ *
+ * Catch and handle signals better so that we die faster like a good meat puppet.
+ */
+
+
+#ifndef fsevent_watch_signal_handlers_h
+#define fsevent_watch_signal_handlers_h
+
+
+void install_signal_handlers(void);
+
+
+#endif // fsevent_watch_signal_handlers_h
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/rakefile.rb b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/rakefile.rb
new file mode 100644
index 0000000..d7789bd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/ext/rakefile.rb
@@ -0,0 +1,226 @@
+# -*- encoding: utf-8 -*-
+require 'rubygems' unless defined?(Gem)
+require 'pathname'
+require 'date'
+require 'time'
+require 'rake/clean'
+
+raise "unable to find xcodebuild" unless system('which', 'xcodebuild')
+
+
+FSEVENT_WATCH_EXE_VERSION = '0.1.5'
+
+$this_dir = Pathname.new(__FILE__).dirname.expand_path
+$final_exe = $this_dir.parent.join('bin/fsevent_watch')
+
+$src_dir = $this_dir.join('fsevent_watch')
+$obj_dir = $this_dir.join('build')
+
+SRC = Pathname.glob("#{$src_dir}/*.c")
+OBJ = SRC.map {|s| $obj_dir.join("#{s.basename('.c')}.o")}
+
+$now = DateTime.now.xmlschema rescue Time.now.xmlschema
+
+$CC = ENV['CC'] || `which clang || which gcc`.strip
+$CFLAGS = ENV['CFLAGS'] || '-fconstant-cfstrings -fasm-blocks -fstrict-aliasing -Wall'
+$ARCHFLAGS = ENV['ARCHFLAGS'] || '-arch x86_64'
+$DEFINES = "-DNS_BUILD_32_LIKE_64 -DNS_BLOCK_ASSERTIONS -DPROJECT_VERSION=#{FSEVENT_WATCH_EXE_VERSION}"
+
+$GCC_C_LANGUAGE_STANDARD = ENV['GCC_C_LANGUAGE_STANDARD'] || 'gnu11'
+
+# generic developer id name so it'll match correctly for anyone who has only
+# one developer id in their keychain (not that I expect anyone else to bother)
+$CODE_SIGN_IDENTITY = 'Developer ID Application'
+
+$arch = `uname -m`.strip
+$os_release = `uname -r`.strip
+$BUILD_TRIPLE = "#{$arch}-apple-darwin#{$os_release}"
+
+$CCVersion = `#{$CC} --version | head -n 1`.strip
+
+
+CLEAN.include OBJ.map(&:to_s)
+CLEAN.include $obj_dir.join('Info.plist').to_s
+CLEAN.include $obj_dir.join('fsevent_watch').to_s
+CLOBBER.include $final_exe.to_s
+
+
+task :sw_vers do
+  $mac_product_version = `sw_vers -productVersion`.strip
+  $mac_build_version = `sw_vers -buildVersion`.strip
+  $MACOSX_DEPLOYMENT_TARGET = ENV['MACOSX_DEPLOYMENT_TARGET'] || $mac_product_version.sub(/\.\d*$/, '')
+  $CFLAGS = "#{$CFLAGS} -mmacosx-version-min=#{$MACOSX_DEPLOYMENT_TARGET}"
+end
+
+task :get_sdk_info => :sw_vers do
+  $SDK_INFO = {}
+  version_info = `xcodebuild -version -sdk macosx#{$MACOSX_DEPLOYMENT_TARGET}`
+  raise "invalid SDK" unless !!$?.exitstatus
+  version_info.strip.each_line do |line|
+    next if line.strip.empty?
+    next unless line.include?(':')
+    match = line.match(/([^:]*): (.*)/)
+    next unless match
+    $SDK_INFO[match[1]] = match[2]
+  end
+end
+
+task :debug => :sw_vers do
+  $DEFINES = "-DDEBUG #{$DEFINES}"
+  $CFLAGS = "#{$CFLAGS} -O0 -fno-omit-frame-pointer -g"
+end
+
+task :release => :sw_vers do
+  $DEFINES = "-DNDEBUG #{$DEFINES}"
+  $CFLAGS = "#{$CFLAGS} -Ofast"
+end
+
+desc 'configure build type depending on whether ENV var FWDEBUG is set'
+task :set_build_type => :sw_vers do
+  if ENV['FWDEBUG']
+    Rake::Task[:debug].invoke
+  else
+    Rake::Task[:release].invoke
+  end
+end
+
+desc 'set build arch to ppc'
+task :ppc do
+  $ARCHFLAGS = '-arch ppc'
+end
+
+desc 'set build arch to x86_64'
+task :x86_64 do
+  $ARCHFLAGS = '-arch x86_64'
+end
+
+desc 'set build arch to i386'
+task :x86 do
+  $ARCHFLAGS = '-arch i386'
+end
+
+task :setup_env => [:set_build_type, :sw_vers, :get_sdk_info]
+
+directory $obj_dir.to_s
+file $obj_dir.to_s => :setup_env
+
+SRC.zip(OBJ).each do |source, object|
+  file object.to_s => [source.to_s, $obj_dir.to_s] do
+    cmd = [
+      $CC,
+      $ARCHFLAGS,
+      "-std=#{$GCC_C_LANGUAGE_STANDARD}",
+      $CFLAGS,
+      $DEFINES,
+      "-I#{$src_dir}",
+      '-isysroot',
+      $SDK_INFO['Path'],
+      '-c', source,
+      '-o', object
+    ]
+    sh(cmd.map {|s| s.to_s}.join(' '))
+  end
+end
+
+file $obj_dir.join('Info.plist').to_s => [$obj_dir.to_s, :setup_env] do
+  File.open($obj_dir.join('Info.plist').to_s, 'w+') do |file|
+    indentation = ''
+    indent      =  lambda {|num|    indentation = ' ' * num               }
+    add         =  lambda {|str| file << "#{indentation}#{str}\n"   }
+    key         =  lambda {|str| add["<key>#{str}</key>"]           }
+    string      =  lambda {|str| add["<string>#{str}</string>"]     }
+
+
+    add['<?xml version="1.0" encoding="UTF-8"?>']
+    add['<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">']
+    add['<plist version="1.0">']
+
+    indent[2]
+    add['<dict>']
+    indent[4]
+
+    key['CFBundleExecutable']
+    string['fsevent_watch']
+    key['CFBundleIdentifier']
+    string['com.teaspoonofinsanity.fsevent_watch']
+    key['CFBundleName']
+    string['fsevent_watch']
+    key['CFBundleDisplayName']
+    string['FSEvent Watch CLI']
+    key['NSHumanReadableCopyright']
+    string['Copyright (C) 2011-2017 Travis Tilley']
+
+    key['CFBundleVersion']
+    string["#{FSEVENT_WATCH_EXE_VERSION}"]
+    key['LSMinimumSystemVersion']
+    string["#{$MACOSX_DEPLOYMENT_TARGET}"]
+    key['DTSDKBuild']
+    string["#{$SDK_INFO['ProductBuildVersion']}"]
+    key['DTSDKName']
+    string["macosx#{$SDK_INFO['SDKVersion']}"]
+    key['DTSDKPath']
+    string["#{$SDK_INFO['Path']}"]
+    key['BuildMachineOSBuild']
+    string["#{$mac_build_version}"]
+    key['BuildMachineOSVersion']
+    string["#{$mac_product_version}"]
+    key['FSEWCompiledAt']
+    string["#{$now}"]
+    key['FSEWVersionInfoBuilder']
+    string["#{`whoami`.strip}"]
+    key['FSEWBuildTriple']
+    string["#{$BUILD_TRIPLE}"]
+    key['FSEWCC']
+    string["#{$CC}"]
+    key['FSEWCCVersion']
+    string["#{$CCVersion}"]
+    key['FSEWCFLAGS']
+    string["#{$CFLAGS}"]
+
+    indent[2]
+    add['</dict>']
+    indent[0]
+
+    add['</plist>']
+  end
+end
+
+desc 'generate an Info.plist used for code signing as well as embedding build settings into the resulting binary'
+task :plist => $obj_dir.join('Info.plist').to_s
+
+
+file $obj_dir.join('fsevent_watch').to_s => [$obj_dir.to_s, $obj_dir.join('Info.plist').to_s] + OBJ.map(&:to_s) do
+  cmd = [
+    $CC,
+    $ARCHFLAGS,
+    "-std=#{$GCC_C_LANGUAGE_STANDARD}",
+    $CFLAGS,
+    $DEFINES,
+    "-I#{$src_dir}",
+    '-isysroot',
+    $SDK_INFO['Path'],
+    '-framework CoreFoundation -framework CoreServices',
+    '-sectcreate __TEXT __info_plist',
+    $obj_dir.join('Info.plist')
+  ] + OBJ + [
+    '-o', $obj_dir.join('fsevent_watch')
+  ]
+  sh(cmd.map {|s| s.to_s}.join(' '))
+end
+
+desc 'compile and link build/fsevent_watch'
+task :build => $obj_dir.join('fsevent_watch').to_s
+
+desc 'codesign build/fsevent_watch binary'
+task :codesign => :build do
+  sh "codesign -s '#{$CODE_SIGN_IDENTITY}' #{$obj_dir.join('fsevent_watch')}"
+end
+
+directory $this_dir.parent.join('bin')
+
+desc 'replace bundled fsevent_watch binary with build/fsevent_watch'
+task :replace_exe => [$this_dir.parent.join('bin'), :build] do
+  sh "mv #{$obj_dir.join('fsevent_watch')} #{$final_exe}"
+end
+
+task :default => [:replace_exe, :clean]
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/otnetstring.rb b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/otnetstring.rb
new file mode 100644
index 0000000..cd8de4c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/otnetstring.rb
@@ -0,0 +1,85 @@
+# Copyright (c) 2011 Konstantin Haase
+#
+# 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.
+
+
+require 'stringio'
+
+module OTNetstring
+  class Error < StandardError; end
+
+  class << self
+    def parse(io, encoding = 'internal', fallback_encoding = nil)
+      fallback_encoding = io.encoding if io.respond_to? :encoding
+      io = StringIO.new(io) if io.respond_to? :to_str
+      length, byte = "", nil
+
+      while byte.nil? || byte =~ /\d/
+        length << byte if byte
+        byte = io.read(1)
+      end
+
+      if length.size > 9
+        raise Error, "#{length} is longer than 9 digits"
+      elsif length !~ /\d+/
+        raise Error, "Expected '#{byte}' to be a digit"
+      end
+      length = Integer(length)
+
+      case byte
+      when '#' then Integer io.read(length)
+      when ',' then with_encoding io.read(length), encoding, fallback_encoding
+      when '~' then
+        raise Error, "nil has length of 0, #{length} given" unless length == 0
+      when '!' then io.read(length) == 'true'
+      when '[', '{'
+        array = []
+        start = io.pos
+        array << parse(io, encoding, fallback_encoding) while io.pos - start < length
+        raise Error, 'Nested element longer than container' if io.pos - start != length
+        byte == "{" ? Hash[*array] : array
+      else
+        raise Error, "Unknown type '#{byte}'"
+      end
+    end
+
+    def encode(obj, string_sep = ',')
+      case obj
+      when String   then with_encoding "#{obj.bytesize}#{string_sep}#{obj}", "binary"
+      when Integer  then encode(obj.inspect, '#')
+      when NilClass then "0~"
+      when Array    then encode(obj.map { |e| encode(e) }.join, '[')
+      when Hash     then encode(obj.map { |a,b| encode(a)+encode(b) }.join, '{')
+      when FalseClass, TrueClass then encode(obj.inspect, '!')
+      else raise Error, 'cannot encode %p' % obj
+      end
+    end
+
+    private
+
+    def with_encoding(str, encoding, fallback = nil)
+      return str unless str.respond_to? :encode
+      encoding = Encoding.find encoding if encoding.respond_to? :to_str
+      encoding ||= fallback
+      encoding ? str.encode(encoding) : str
+    rescue EncodingError
+      str.force_encoding(encoding)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent.rb b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent.rb
new file mode 100644
index 0000000..1ff68a3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent.rb
@@ -0,0 +1,3 @@
+# -*- encoding: utf-8 -*-
+require 'rb-fsevent/fsevent'
+require 'rb-fsevent/version'
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/fsevent.rb b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/fsevent.rb
new file mode 100644
index 0000000..808609d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/fsevent.rb
@@ -0,0 +1,157 @@
+# -*- encoding: utf-8 -*-
+
+require 'otnetstring'
+
+class FSEvent
+  class << self
+    class_eval <<-END
+      def root_path
+        "#{File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))}"
+      end
+    END
+    class_eval <<-END
+      def watcher_path
+        "#{File.join(FSEvent.root_path, 'bin', 'fsevent_watch')}"
+      end
+    END
+  end
+
+  attr_reader :paths, :callback
+
+  def initialize args = nil, &block
+    watch(args, &block) unless args.nil?
+  end
+
+  def watch(watch_paths, options=nil, &block)
+    @paths      = watch_paths.kind_of?(Array) ? watch_paths : [watch_paths]
+    @callback   = block
+
+    if options.kind_of?(Hash)
+      @options  = parse_options(options)
+    elsif options.kind_of?(Array)
+      @options  = options
+    else
+      @options  = []
+    end
+  end
+
+  def run
+    @pipe    = open_pipe
+    @running = true
+
+    # please note the use of IO::select() here, as it is used specifically to
+    # preserve correct signal handling behavior in ruby 1.8.
+    while @running && IO::select([@pipe], nil, nil, nil)
+      # managing the IO ourselves allows us to be careful and never pass an
+      # incomplete message to OTNetstring.parse()
+      message = ""
+      length = ""
+      byte = nil
+
+      reading_length = true
+      found_length = false
+
+      while reading_length
+        byte = @pipe.read(1)
+        if "#{byte}" =~ /\d/
+          length << byte
+          found_length = true
+        elsif found_length == false
+          next
+        else
+          reading_length = false
+        end
+      end
+      length = Integer(length, 10)
+      type = byte
+
+      message << "#{length}#{type}"
+      message << @pipe.read(length)
+
+      decoded = OTNetstring.parse(message)
+      modified_paths = decoded["events"].map {|event| event["path"]}
+      # passing the full info as a second block param feels icky, but such is
+      # the trap of backward compatibility.
+      case callback.arity
+        when 1
+          callback.call(modified_paths)
+        when 2
+          callback.call(modified_paths, decoded)
+      end
+    end
+  rescue Interrupt, IOError, Errno::EBADF
+  ensure
+    stop
+  end
+
+  def stop
+    unless @pipe.nil?
+      Process.kill('KILL', @pipe.pid) if process_running?(@pipe.pid)
+      @pipe.close
+    end
+  rescue IOError
+  ensure
+    @running = false
+  end
+
+  def process_running?(pid)
+    begin
+      Process.kill(0, pid)
+      true
+    rescue Errno::ESRCH
+      false
+    end
+  end
+
+  if RUBY_VERSION < '1.9'
+    def open_pipe
+      IO.popen("'#{self.class.watcher_path}' #{options_string} #{shellescaped_paths}")
+    end
+
+    private
+
+    def options_string
+      @options.join(' ')
+    end
+
+    def shellescaped_paths
+      @paths.map {|path| shellescape(path)}.join(' ')
+    end
+
+    # for Ruby 1.8.6  support
+    def shellescape(str)
+      # An empty argument will be skipped, so return empty quotes.
+      return "''" if str.empty?
+
+      str = str.dup
+
+      # Process as a single byte sequence because not all shell
+      # implementations are multibyte aware.
+      str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/n, "\\\\\\1")
+
+      # A LF cannot be escaped with a backslash because a backslash + LF
+      # combo is regarded as line continuation and simply ignored.
+      str.gsub!(/\n/, "'\n'")
+
+      return str
+    end
+  else
+    def open_pipe
+      IO.popen([self.class.watcher_path] + @options + @paths)
+    end
+  end
+
+  private
+
+  def parse_options(options={})
+    opts = ['--format=otnetstring']
+    opts.concat(['--since-when', options[:since_when]]) if options[:since_when]
+    opts.concat(['--latency', options[:latency]]) if options[:latency]
+    opts.push('--no-defer') if options[:no_defer]
+    opts.push('--watch-root') if options[:watch_root]
+    opts.push('--file-events') if options[:file_events]
+    # ruby 1.9's IO.popen(array-of-stuff) syntax requires all items to be strings
+    opts.map {|opt| "#{opt}"}
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/version.rb b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/version.rb
new file mode 100644
index 0000000..57300ce
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/lib/rb-fsevent/version.rb
@@ -0,0 +1,5 @@
+# -*- encoding: utf-8 -*-
+
+class FSEvent
+  VERSION = '0.10.2'
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/rb-fsevent.gemspec b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/rb-fsevent.gemspec
new file mode 100644
index 0000000..a7370db
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-fsevent-0.10.2/rb-fsevent.gemspec
@@ -0,0 +1,27 @@
+# coding: utf-8
+lib = File.expand_path('../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require 'rb-fsevent/version'
+
+Gem::Specification.new do |s|
+  s.name        = 'rb-fsevent'
+  s.version     = FSEvent::VERSION
+  s.authors     = ['Thibaud Guillaume-Gentil', 'Travis Tilley']
+  s.email       = ['thibaud@thibaud.gg', 'ttilley@gmail.com']
+  s.homepage    = 'http://rubygems.org/gems/rb-fsevent'
+  s.summary     = 'Very simple & usable FSEvents API'
+  s.description = 'FSEvents API with Signals catching (without RubyCocoa)'
+  s.license     = 'MIT'
+
+  s.metadata = {
+    'source_code_uri' => 'https://github.com/thibaudgg/rb-fsevent'
+  }
+
+  s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^spec/}) }
+  s.require_path = 'lib'
+
+  s.add_development_dependency 'bundler',     '~> 1.0'
+  s.add_development_dependency 'rspec',       '~> 3.6'
+  s.add_development_dependency 'guard-rspec', '~> 4.2'
+  s.add_development_dependency 'rake',        '~> 12.0'
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/.gitignore b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/.gitignore
new file mode 100644
index 0000000..db868c7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/.gitignore
@@ -0,0 +1,19 @@
+*.gem
+*.rbc
+.bundle
+.config
+.yardoc
+Gemfile.lock
+InstalledFiles
+_yardoc
+coverage
+doc/
+lib/bundler/man
+pkg
+rdoc
+spec/reports
+test/tmp
+test/version_tmp
+tmp
+.tags*
+.rspec_status
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/.travis.yml b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/.travis.yml
new file mode 100644
index 0000000..014f847
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/.travis.yml
@@ -0,0 +1,30 @@
+language: ruby
+sudo: false
+dist: trusty
+cache: bundler
+rvm:
+  - 1.8
+  - 1.9
+  - 2.0
+  - 2.1
+  - 2.2
+  - 2.3
+  - 2.4
+  - jruby-head
+  - ruby-head
+  - jruby-9.1.8.0
+  - jruby-head
+  - rbx-3
+matrix:
+  allow_failures:
+    - rvm: ruby-head
+    - rvm: jruby-head
+    - rvm: rbx-3
+  fast_finish: true
+script:
+  # Unit test
+  - bundle exec rake
+  # Install test
+  - gem build rb-inotify.gemspec
+  - gem install rb-inotify-*.gem
+  - sh -c "gem list | grep rb-inotify"
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/.yardopts b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/.yardopts
new file mode 100644
index 0000000..cd347c5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/.yardopts
@@ -0,0 +1,4 @@
+--readme          README.md
+--markup          markdown
+--markup-provider maruku
+--no-private
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/Gemfile b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/Gemfile
new file mode 100644
index 0000000..fa75df1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/Gemfile
@@ -0,0 +1,3 @@
+source 'https://rubygems.org'
+
+gemspec
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/README.md b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/README.md
new file mode 100644
index 0000000..5c38acb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/README.md
@@ -0,0 +1,103 @@
+# rb-inotify
+
+This is a simple wrapper over the [inotify](http://en.wikipedia.org/wiki/Inotify) Linux kernel subsystem
+for monitoring changes to files and directories.
+It uses the [FFI](http://wiki.github.com/ffi/ffi) gem to avoid having to compile a C extension.
+
+[API documentation is available on rdoc.info](http://rdoc.info/projects/nex3/rb-inotify).
+
+[![Build Status](https://secure.travis-ci.org/guard/rb-inotify.svg)](http://travis-ci.org/guard/rb-inotify)
+[![Code Climate](https://codeclimate.com/github/guard/rb-inotify.svg)](https://codeclimate.com/github/guard/rb-inotify)
+[![Coverage Status](https://coveralls.io/repos/guard/rb-inotify/badge.svg)](https://coveralls.io/r/guard/rb-inotify)
+
+## Basic Usage
+
+The API is similar to the inotify C API, but with a more Rubyish feel.
+First, create a notifier:
+
+    notifier = INotify::Notifier.new
+
+Then, tell it to watch the paths you're interested in
+for the events you care about:
+
+    notifier.watch("path/to/foo.txt", :modify) {puts "foo.txt was modified!"}
+    notifier.watch("path/to/bar", :moved_to, :create) do |event|
+      puts "#{event.name} is now in path/to/bar!"
+    end
+
+Inotify can watch directories or individual files.
+It can pay attention to all sorts of events;
+for a full list, see [the inotify man page](http://www.tin.org/bin/man.cgi?section=7&topic=inotify).
+
+Finally, you get at the events themselves:
+
+    notifier.run
+
+This will loop infinitely, calling the appropriate callbacks when the files are changed.
+If you don't want infinite looping,
+you can also block until there are available events,
+process them all at once,
+and then continue on your merry way:
+
+    notifier.process
+
+## Advanced Usage
+
+Sometimes it's necessary to have finer control over the underlying IO operations
+than is provided by the simple callback API.
+The trick to this is that the \{INotify::Notifier#to_io Notifier#to_io} method
+returns a fully-functional IO object,
+with a file descriptor and everything.
+This means, for example, that it can be passed to `IO#select`:
+
+     # Wait 10 seconds for an event then give up
+     if IO.select([notifier.to_io], [], [], 10)
+       notifier.process
+     end
+
+It can even be used with EventMachine:
+
+     require 'eventmachine'
+
+     EM.run do
+       EM.watch notifier.to_io do
+         notifier.process
+       end
+     end
+
+Unfortunately, this currently doesn't work under JRuby.
+JRuby currently doesn't use native file descriptors for the IO object,
+so we can't use the notifier's file descriptor as a stand-in.
+
+## Contributing
+
+1. Fork it
+2. Create your feature branch (`git checkout -b my-new-feature`)
+3. Commit your changes (`git commit -am 'Add some feature'`)
+4. Push to the branch (`git push origin my-new-feature`)
+5. Create new Pull Request
+
+## License
+
+Released under the MIT license.
+
+Copyright, 2009, by Nathan Weizenbaum.  
+Copyright, 2017, by [Samuel G. D. Williams](http://www.codeotaku.com/samuel-williams).
+
+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/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/Rakefile b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/Rakefile
new file mode 100644
index 0000000..bc3a3b6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/Rakefile
@@ -0,0 +1,14 @@
+require "bundler/gem_tasks"
+require 'rspec/core/rake_task'
+
+RSpec::Core::RakeTask.new(:spec)
+
+desc "Run tests"
+task :default => :spec
+
+task :console do
+  require 'rb-inotify'
+  require 'pry'
+  
+  binding.pry
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify.rb b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify.rb
new file mode 100644
index 0000000..8897aef
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify.rb
@@ -0,0 +1,15 @@
+require 'rb-inotify/version'
+require 'rb-inotify/native'
+require 'rb-inotify/native/flags'
+require 'rb-inotify/notifier'
+require 'rb-inotify/watcher'
+require 'rb-inotify/event'
+require 'rb-inotify/errors'
+
+# The root module of the library, which is laid out as so:
+#
+# * {Notifier} -- The main class, where the notifications are set up
+# * {Watcher} -- A watcher for a single file or directory
+# * {Event} -- An filesystem event notification
+module INotify
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/errors.rb b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/errors.rb
new file mode 100644
index 0000000..afee709
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/errors.rb
@@ -0,0 +1,3 @@
+module INotify
+  class QueueOverflowError < RuntimeError; end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/event.rb b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/event.rb
new file mode 100644
index 0000000..11701ac
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/event.rb
@@ -0,0 +1,146 @@
+module INotify
+  # An event caused by a change on the filesystem.
+  # Each {Watcher} can fire many events,
+  # which are passed to that watcher's callback.
+  class Event
+    # A list of other events that are related to this one.
+    # Currently, this is only used for files that are moved within the same directory:
+    # the `:moved_from` and the `:moved_to` events will be related.
+    #
+    # @return [Array<Event>]
+    attr_reader :related
+
+    # The name of the file that the event occurred on.
+    # This is only set for events that occur on files in directories;
+    # otherwise, it's `""`.
+    # Similarly, if the event is being fired for the directory itself
+    # the name will be `""`
+    #
+    # This pathname is relative to the enclosing directory.
+    # For the absolute pathname, use \{#absolute\_name}.
+    # Note that when the `:recursive` flag is passed to {Notifier#watch},
+    # events in nested subdirectories will still have a `#name` field
+    # relative to their immediately enclosing directory.
+    # For example, an event on the file `"foo/bar/baz"`
+    # will have name `"baz"`.
+    #
+    # @return [String]
+    attr_reader :name
+
+    # The {Notifier} that fired this event.
+    #
+    # @return [Notifier]
+    attr_reader :notifier
+
+    # An integer specifying that this event is related to some other event,
+    # which will have the same cookie.
+    #
+    # Currently, this is only used for files that are moved within the same directory.
+    # Both the `:moved_from` and the `:moved_to` events will have the same cookie.
+    #
+    # @private
+    # @return [Fixnum]
+    attr_reader :cookie
+
+    # The {Watcher#id id} of the {Watcher} that fired this event.
+    #
+    # @private
+    # @return [Fixnum]
+    attr_reader :watcher_id
+
+    # Returns the {Watcher} that fired this event.
+    #
+    # @return [Watcher]
+    def watcher
+      @watcher ||= @notifier.watchers[@watcher_id]
+    end
+
+    # The absolute path of the file that the event occurred on.
+    #
+    # This is actually only as absolute as the path passed to the {Watcher}
+    # that created this event.
+    # However, it is relative to the working directory,
+    # assuming that hasn't changed since the watcher started.
+    #
+    # @return [String]
+    def absolute_name
+      return watcher.path if name.empty?
+      return File.join(watcher.path, name)
+    end
+
+    # Returns the flags that describe this event.
+    # This is generally similar to the input to {Notifier#watch},
+    # except that it won't contain options flags nor `:all_events`,
+    # and it may contain one or more of the following flags:
+    #
+    # `:unmount`
+    # : The filesystem containing the watched file or directory was unmounted.
+    #
+    # `:ignored`
+    # : The \{#watcher watcher} was closed, or the watched file or directory was deleted.
+    #
+    # `:isdir`
+    # : The subject of this event is a directory.
+    #
+    # @return [Array<Symbol>]
+    def flags
+      @flags ||= Native::Flags.from_mask(@native[:mask])
+    end
+
+    # Constructs an {Event} object from a string of binary data,
+    # and destructively modifies the string to get rid of the initial segment
+    # used to construct the Event.
+    #
+    # @private
+    # @param data [String] The string to be modified
+    # @param notifier [Notifier] The {Notifier} that fired the event
+    # @return [Event, nil] The event, or `nil` if the string is empty
+    def self.consume(data, notifier)
+      return nil if data.empty?
+      ev = new(data, notifier)
+      data.replace data[ev.size..-1]
+      ev
+    end
+
+    # Creates an event from a string of binary data.
+    # Differs from {Event.consume} in that it doesn't modify the string.
+    #
+    # @private
+    # @param data [String] The data string
+    # @param notifier [Notifier] The {Notifier} that fired the event
+    def initialize(data, notifier)
+      ptr = FFI::MemoryPointer.from_string(data)
+      @native = Native::Event.new(ptr)
+      @related = []
+      @cookie = @native[:cookie]
+      @name = fix_encoding(data[@native.size, @native[:len]].gsub(/\0+$/, ''))
+      @notifier = notifier
+      @watcher_id = @native[:wd]
+
+      raise QueueOverflowError.new("inotify event queue has overflowed.") if @native[:mask] & Native::Flags::IN_Q_OVERFLOW != 0
+    end
+
+    # Calls the callback of the watcher that fired this event,
+    # passing in the event itself.
+    #
+    # @private
+    def callback!
+      watcher && watcher.callback!(self)
+    end
+
+    # Returns the size of this event object in bytes,
+    # including the \{#name} string.
+    #
+    # @return [Fixnum]
+    def size
+      @native.size + @native[:len]
+    end
+
+    private
+
+    def fix_encoding(name)
+      name.force_encoding('filesystem') if name.respond_to?(:force_encoding)
+      name
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native.rb b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native.rb
new file mode 100644
index 0000000..ee51f7c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native.rb
@@ -0,0 +1,36 @@
+require 'ffi'
+
+module INotify
+  # This module contains the low-level foreign-function interface code
+  # for dealing with the inotify C APIs.
+  # It's an implementation detail, and not meant for users to deal with.
+  #
+  # @private
+  module Native
+    extend FFI::Library
+    ffi_lib FFI::Library::LIBC
+    begin
+      ffi_lib 'inotify'
+    rescue LoadError
+    end
+
+    # The C struct describing an inotify event.
+    #
+    # @private
+    class Event < FFI::Struct
+      layout(
+        :wd, :int,
+        :mask, :uint32,
+        :cookie, :uint32,
+        :len, :uint32)
+    end
+
+    attach_function :inotify_init, [], :int
+    attach_function :inotify_add_watch, [:int, :string, :uint32], :int
+    attach_function :inotify_rm_watch, [:int, :uint32], :int
+    attach_function :fpathconf, [:int, :int], :long
+
+    attach_function :read, [:int, :pointer, :size_t], :ssize_t
+    attach_function :close, [:int], :int
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native/flags.rb b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native/flags.rb
new file mode 100644
index 0000000..5640130
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native/flags.rb
@@ -0,0 +1,94 @@
+module INotify
+  module Native
+    # A module containing all the inotify flags
+    # to be passed to {Notifier#watch}.
+    #
+    # @private
+    module Flags
+      # File was accessed.
+      IN_ACCESS = 0x00000001
+      # Metadata changed.
+      IN_ATTRIB = 0x00000004
+      # Writtable file was closed.
+      IN_CLOSE_WRITE = 0x00000008
+      # File was modified.
+      IN_MODIFY = 0x00000002
+      # Unwrittable file closed.
+      IN_CLOSE_NOWRITE = 0x00000010
+      # File was opened.
+      IN_OPEN = 0x00000020
+      # File was moved from X.
+      IN_MOVED_FROM = 0x00000040
+      # File was moved to Y.
+      IN_MOVED_TO = 0x00000080
+      # Subfile was created.
+      IN_CREATE = 0x00000100
+      # Subfile was deleted.
+      IN_DELETE = 0x00000200
+      # Self was deleted.
+      IN_DELETE_SELF = 0x00000400
+      # Self was moved.
+      IN_MOVE_SELF = 0x00000800
+
+      ## Helper events.
+
+      # Close.
+      IN_CLOSE = (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
+      # Moves.
+      IN_MOVE = (IN_MOVED_FROM | IN_MOVED_TO)
+      # All events which a program can wait on.
+      IN_ALL_EVENTS = (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE |
+        IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | IN_MOVED_TO | IN_CREATE |
+        IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF)
+
+
+      ## Special flags.
+
+      # Only watch the path if it is a directory.
+      IN_ONLYDIR = 0x01000000
+      # Do not follow a sym link.
+      IN_DONT_FOLLOW = 0x02000000
+      # Add to the mask of an already existing watch.
+      IN_MASK_ADD = 0x20000000
+      # Only send event once.
+      IN_ONESHOT = 0x80000000
+
+
+      ## Events sent by the kernel.
+
+      # Backing fs was unmounted.
+      IN_UNMOUNT = 0x00002000
+      # Event queued overflowed.
+      IN_Q_OVERFLOW = 0x00004000
+      # File was ignored.
+      IN_IGNORED = 0x00008000
+      # Event occurred against dir.
+      IN_ISDIR = 0x40000000
+
+      ## fpathconf Macros
+
+      # returns the maximum length of a filename in the directory path or fd that the process is allowed to create.  The corresponding macro is _POSIX_NAME_MAX.
+      PC_NAME_MAX = 3
+
+      # Converts a list of flags to the bitmask that the C API expects.
+      #
+      # @param flags [Array<Symbol>]
+      # @return [Fixnum]
+      def self.to_mask(flags)
+        flags.map {|flag| const_get("IN_#{flag.to_s.upcase}")}.
+          inject(0) {|mask, flag| mask | flag}
+      end
+
+      # Converts a bitmask from the C API into a list of flags.
+      #
+      # @param mask [Fixnum]
+      # @return [Array<Symbol>]
+      def self.from_mask(mask)
+        constants.map {|c| c.to_s}.select do |c|
+          next false unless c =~ /^IN_/
+          const_get(c) & mask != 0
+        end.map {|c| c.sub("IN_", "").downcase.to_sym} - [:all_events]
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/notifier.rb b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/notifier.rb
new file mode 100644
index 0000000..043bc20
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/notifier.rb
@@ -0,0 +1,339 @@
+module INotify
+  # Notifier wraps a single instance of inotify.
+  # It's possible to have more than one instance,
+  # but usually unnecessary.
+  #
+  # @example
+  #   # Create the notifier
+  #   notifier = INotify::Notifier.new
+  #
+  #   # Run this callback whenever the file path/to/foo.txt is read
+  #   notifier.watch("path/to/foo.txt", :access) do
+  #     puts "Foo.txt was accessed!"
+  #   end
+  #
+  #   # Watch for any file in the directory being deleted
+  #   # or moved out of the directory.
+  #   notifier.watch("path/to/directory", :delete, :moved_from) do |event|
+  #     # The #name field of the event object contains the name of the affected file
+  #     puts "#{event.name} is no longer in the directory!"
+  #   end
+  #
+  #   # Nothing happens until you run the notifier!
+  #   notifier.run
+  class Notifier
+    # A list of directories that should never be recursively watched.
+    #
+    # * Files in `/dev/fd` sometimes register as directories, but are not enumerable.
+    RECURSIVE_BLACKLIST = %w[/dev/fd]
+
+    # A hash from {Watcher} ids to the instances themselves.
+    #
+    # @private
+    # @return [{Fixnum => Watcher}]
+    attr_reader :watchers
+
+    # The underlying file descriptor for this notifier.
+    # This is a valid OS file descriptor, and can be used as such
+    # (except under JRuby -- see \{#to\_io}).
+    #
+    # @return [Fixnum]
+    attr_reader :fd
+
+    # @return [Boolean] Whether or not this Ruby implementation supports
+    #   wrapping the native file descriptor in a Ruby IO wrapper.
+    def self.supports_ruby_io?
+      RUBY_PLATFORM !~ /java/
+    end
+
+    # Creates a new {Notifier}.
+    #
+    # @return [Notifier]
+    # @raise [SystemCallError] if inotify failed to initialize for some reason
+    def initialize
+      @fd = Native.inotify_init
+      @watchers = {}
+      return unless @fd < 0
+
+      raise SystemCallError.new(
+        "Failed to initialize inotify" +
+        case FFI.errno
+        when Errno::EMFILE::Errno; ": the user limit on the total number of inotify instances has been reached."
+        when Errno::ENFILE::Errno; ": the system limit on the total number of file descriptors has been reached."
+        when Errno::ENOMEM::Errno; ": insufficient kernel memory is available."
+        else; ""
+        end,
+        FFI.errno)
+    end
+
+    # Returns a Ruby IO object wrapping the underlying file descriptor.
+    # Since this file descriptor is fully functional (except under JRuby),
+    # this IO object can be used in any way a Ruby-created IO object can.
+    # This includes passing it to functions like `#select`.
+    #
+    # Note that this always returns the same IO object.
+    # Creating lots of IO objects for the same file descriptor
+    # can cause some odd problems.
+    #
+    # **This is not supported under JRuby**.
+    # JRuby currently doesn't use native file descriptors for the IO object,
+    # so we can't use this file descriptor as a stand-in.
+    #
+    # @return [IO] An IO object wrapping the file descriptor
+    # @raise [NotImplementedError] if this is being called in JRuby
+    def to_io
+      unless self.class.supports_ruby_io?
+        raise NotImplementedError.new("INotify::Notifier#to_io is not supported under JRuby")
+      end
+      @io ||= IO.new(@fd)
+    end
+
+    # Watches a file or directory for changes,
+    # calling the callback when there are.
+    # This is only activated once \{#process} or \{#run} is called.
+    #
+    # **Note that by default, this does not recursively watch subdirectories
+    # of the watched directory**.
+    # To do so, use the `:recursive` flag.
+    #
+    # ## Flags
+    #
+    # `:access`
+    # : A file is accessed (that is, read).
+    #
+    # `:attrib`
+    # : A file's metadata is changed (e.g. permissions, timestamps, etc).
+    #
+    # `:close_write`
+    # : A file that was opened for writing is closed.
+    #
+    # `:close_nowrite`
+    # : A file that was not opened for writing is closed.
+    #
+    # `:modify`
+    # : A file is modified.
+    #
+    # `:open`
+    # : A file is opened.
+    #
+    # ### Directory-Specific Flags
+    #
+    # These flags only apply when a directory is being watched.
+    #
+    # `:moved_from`
+    # : A file is moved out of the watched directory.
+    #
+    # `:moved_to`
+    # : A file is moved into the watched directory.
+    #
+    # `:create`
+    # : A file is created in the watched directory.
+    #
+    # `:delete`
+    # : A file is deleted in the watched directory.
+    #
+    # `:delete_self`
+    # : The watched file or directory itself is deleted.
+    #
+    # `:move_self`
+    # : The watched file or directory itself is moved.
+    #
+    # ### Helper Flags
+    #
+    # These flags are just combinations of the flags above.
+    #
+    # `:close`
+    # : Either `:close_write` or `:close_nowrite` is activated.
+    #
+    # `:move`
+    # : Either `:moved_from` or `:moved_to` is activated.
+    #
+    # `:all_events`
+    # : Any event above is activated.
+    #
+    # ### Options Flags
+    #
+    # These flags don't actually specify events.
+    # Instead, they specify options for the watcher.
+    #
+    # `:onlydir`
+    # : Only watch the path if it's a directory.
+    #
+    # `:dont_follow`
+    # : Don't follow symlinks.
+    #
+    # `:mask_add`
+    # : Add these flags to the pre-existing flags for this path.
+    #
+    # `:oneshot`
+    # : Only send the event once, then shut down the watcher.
+    #
+    # `:recursive`
+    # : Recursively watch any subdirectories that are created.
+    #   Note that this is a feature of rb-inotify,
+    #   rather than of inotify itself, which can only watch one level of a directory.
+    #   This means that the {Event#name} field
+    #   will contain only the basename of the modified file.
+    #   When using `:recursive`, {Event#absolute_name} should always be used.
+    #
+    # @param path [String] The path to the file or directory
+    # @param flags [Array<Symbol>] Which events to watch for
+    # @yield [event] A block that will be called
+    #   whenever one of the specified events occur
+    # @yieldparam event [Event] The Event object containing information
+    #   about the event that occured
+    # @return [Watcher] A Watcher set up to watch this path for these events
+    # @raise [SystemCallError] if the file or directory can't be watched,
+    #   e.g. if the file isn't found, read access is denied,
+    #   or the flags don't contain any events
+    def watch(path, *flags, &callback)
+      return Watcher.new(self, path, *flags, &callback) unless flags.include?(:recursive)
+
+      dir = Dir.new(path)
+
+      dir.each do |base|
+        d = File.join(path, base)
+        binary_d = d.respond_to?(:force_encoding) ? d.dup.force_encoding('BINARY') : d
+        next if binary_d =~ /\/\.\.?$/ # Current or parent directory
+        next if RECURSIVE_BLACKLIST.include?(d)
+        next if flags.include?(:dont_follow) && File.symlink?(d)
+        next if !File.directory?(d)
+
+        watch(d, *flags, &callback)
+      end
+
+      dir.close
+
+      rec_flags = [:create, :moved_to]
+      return watch(path, *((flags - [:recursive]) | rec_flags)) do |event|
+        callback.call(event) if flags.include?(:all_events) || !(flags & event.flags).empty?
+        next if (rec_flags & event.flags).empty? || !event.flags.include?(:isdir)
+        begin
+          watch(event.absolute_name, *flags, &callback)
+        rescue Errno::ENOENT
+          # If the file has been deleted since the glob was run, we don't want to error out.
+        end
+      end
+    end
+
+    # Starts the notifier watching for filesystem events.
+    # Blocks until \{#stop} is called.
+    #
+    # @see #process
+    def run
+      @stop = false
+      process until @stop
+    end
+
+    # Stop watching for filesystem events.
+    # That is, if we're in a \{#run} loop,
+    # exit out as soon as we finish handling the events.
+    def stop
+      @stop = true
+    end
+
+    # Blocks until there are one or more filesystem events
+    # that this notifier has watchers registered for.
+    # Once there are events, the appropriate callbacks are called
+    # and this function returns.
+    #
+    # @see #run
+    def process
+      read_events.each do |event|
+        event.callback!
+        event.flags.include?(:ignored) && event.notifier.watchers.delete(event.watcher_id)
+      end
+    end
+
+    # Close the notifier.
+    #
+    # @raise [SystemCallError] if closing the underlying file descriptor fails.
+    def close
+      stop
+      if Native.close(@fd) == 0
+        @watchers.clear
+        return
+      end
+
+      raise SystemCallError.new("Failed to properly close inotify socket" +
+       case FFI.errno
+       when Errno::EBADF::Errno; ": invalid or closed file descriptior"
+       when Errno::EIO::Errno; ": an I/O error occured"
+       end,
+       FFI.errno)
+    end
+
+    # Blocks until there are one or more filesystem events that this notifier
+    # has watchers registered for. Once there are events, returns their {Event}
+    # objects.
+    #
+    # This can return an empty list if the watcher was closed elsewhere.
+    #
+    # {#run} or {#process} are ususally preferable to calling this directly.
+    def read_events
+      size = Native::Event.size + Native.fpathconf(fd, Native::Flags::PC_NAME_MAX) + 1
+      tries = 1
+
+      begin
+        data = readpartial(size)
+      rescue SystemCallError => er
+        # EINVAL means that there's more data to be read
+        # than will fit in the buffer size
+        raise er unless er.errno == Errno::EINVAL::Errno && tries < 5
+        size *= 2
+        tries += 1
+        retry
+      end
+      return [] if data.nil?
+
+      events = []
+      cookies = {}
+      while event = Event.consume(data, self)
+        events << event
+        next if event.cookie == 0
+        cookies[event.cookie] ||= []
+        cookies[event.cookie] << event
+      end
+      cookies.each {|c, evs| evs.each {|ev| ev.related.replace(evs - [ev]).freeze}}
+      events
+    end
+
+    private
+
+    # Same as IO#readpartial, or as close as we need.
+    def readpartial(size)
+      # Use Ruby's readpartial if possible, to avoid blocking other threads.
+      begin
+        return to_io.readpartial(size) if self.class.supports_ruby_io?
+      rescue Errno::EBADF, IOError
+        # If the IO has already been closed, reading from it will cause
+        # Errno::EBADF. In JRuby it can raise IOError with invalid or
+        # closed file descriptor.
+        return nil
+      rescue IOError => ex
+        return nil if ex.message =~ /stream closed/
+        raise
+      end
+
+      tries = 0
+      begin
+        tries += 1
+        buffer = FFI::MemoryPointer.new(:char, size)
+        size_read = Native.read(fd, buffer, size)
+        return buffer.read_string(size_read) if size_read >= 0
+      end while FFI.errno == Errno::EINTR::Errno && tries <= 5
+
+      raise SystemCallError.new("Error reading inotify events" +
+        case FFI.errno
+        when Errno::EAGAIN::Errno; ": no data available for non-blocking I/O"
+        when Errno::EBADF::Errno; ": invalid or closed file descriptor"
+        when Errno::EFAULT::Errno; ": invalid buffer"
+        when Errno::EINVAL::Errno; ": invalid file descriptor"
+        when Errno::EIO::Errno; ": I/O error"
+        when Errno::EISDIR::Errno; ": file descriptor is a directory"
+        else; ""
+        end,
+        FFI.errno)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/version.rb b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/version.rb
new file mode 100644
index 0000000..661eb1c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/version.rb
@@ -0,0 +1,24 @@
+# Copyright, 2012, by Natalie Weizenbaum.
+# Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
+#
+# 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.
+
+module INotify
+  VERSION = '0.9.10'
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/watcher.rb b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/watcher.rb
new file mode 100644
index 0000000..1205e2d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/watcher.rb
@@ -0,0 +1,88 @@
+module INotify
+  # Watchers monitor a single path for changes,
+  # specified by {INotify::Notifier#watch event flags}.
+  # A watcher is usually created via \{Notifier#watch}.
+  #
+  # One {Notifier} may have many {Watcher}s.
+  # The Notifier actually takes care of the checking for events,
+  # via \{Notifier#run #run} or \{Notifier#process #process}.
+  # The main purpose of having Watcher objects
+  # is to be able to disable them using \{#close}.
+  class Watcher
+    # The {Notifier} that this Watcher belongs to.
+    #
+    # @return [Notifier]
+    attr_reader :notifier
+
+    # The path that this Watcher is watching.
+    #
+    # @return [String]
+    attr_reader :path
+
+    # The {INotify::Notifier#watch flags}
+    # specifying the events that this Watcher is watching for,
+    # and potentially some options as well.
+    #
+    # @return [Array<Symbol>]
+    attr_reader :flags
+
+    # The id for this Watcher.
+    # Used to retrieve this Watcher from {Notifier#watchers}.
+    #
+    # @private
+    # @return [Fixnum]
+    attr_reader :id
+
+    # Calls this Watcher's callback with the given {Event}.
+    #
+    # @private
+    # @param event [Event]
+    def callback!(event)
+      @callback[event]
+    end
+
+    # Disables this Watcher, so that it doesn't fire any more events.
+    #
+    # @raise [SystemCallError] if the watch fails to be disabled for some reason
+    def close
+      if Native.inotify_rm_watch(@notifier.fd, @id) == 0
+        @notifier.watchers.delete(@id)
+        return
+      end
+
+      raise SystemCallError.new("Failed to stop watching #{path.inspect}",
+                                FFI.errno)
+    end
+
+    # Creates a new {Watcher}.
+    #
+    # @private
+    # @see Notifier#watch
+    def initialize(notifier, path, *flags, &callback)
+      @notifier = notifier
+      @callback = callback || proc {}
+      @path = path
+      @flags = flags.freeze
+      @id = Native.inotify_add_watch(@notifier.fd, path.dup,
+        Native::Flags.to_mask(flags))
+
+      unless @id < 0
+        @notifier.watchers[@id] = self
+        return
+      end
+
+      raise SystemCallError.new(
+        "Failed to watch #{path.inspect}" +
+        case FFI.errno
+        when Errno::EACCES::Errno; ": read access to the given file is not permitted."
+        when Errno::EBADF::Errno; ": the given file descriptor is not valid."
+        when Errno::EFAULT::Errno; ": path points outside of the process's accessible address space."
+        when Errno::EINVAL::Errno; ": the given event mask contains no legal events; or fd is not an inotify file descriptor."
+        when Errno::ENOMEM::Errno; ": insufficient kernel memory was available."
+        when Errno::ENOSPC::Errno; ": The user limit on the total number of inotify watches was reached or the kernel failed to allocate a needed resource."
+        else; ""
+        end,
+        FFI.errno)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/rb-inotify.gemspec b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/rb-inotify.gemspec
new file mode 100644
index 0000000..1dbc777
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/rb-inotify.gemspec
@@ -0,0 +1,30 @@
+# -*- encoding: utf-8 -*-
+
+$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
+require 'rb-inotify/version'
+
+Gem::Specification.new do |spec|
+  spec.name     = 'rb-inotify'
+  spec.version  = INotify::VERSION
+  spec.platform = Gem::Platform::RUBY
+
+  spec.summary     = 'A Ruby wrapper for Linux inotify, using FFI'
+  spec.authors     = ['Natalie Weizenbaum', 'Samuel Williams']
+  spec.email       = ['nex342@gmail.com', 'samuel.williams@oriontransfer.co.nz']
+  spec.homepage    = 'https://github.com/guard/rb-inotify'
+  spec.licenses    = ['MIT']
+
+  spec.files         = `git ls-files`.split($/)
+  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
+  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
+  spec.require_paths = ["lib"]
+
+  spec.required_ruby_version = '>= 0'
+
+  spec.add_dependency 'ffi', '>= 0.5.0', '< 2'
+
+  spec.add_development_dependency "rspec", "~> 3.4"
+  spec.add_development_dependency "bundler", "~> 1.3"
+  # rake 11.x requires Ruby >= 1.9.3
+  spec.add_development_dependency "rake", ">= 10.5.0", "< 13"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/spec/rb-inotify/errors_spec.rb b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/spec/rb-inotify/errors_spec.rb
new file mode 100644
index 0000000..f2f5e3e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/spec/rb-inotify/errors_spec.rb
@@ -0,0 +1,9 @@
+require 'spec_helper'
+
+describe INotify do
+  describe "QueueOverflowError" do
+    it "exists" do
+      expect(INotify::QueueOverflowError).to be_truthy
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/spec/rb-inotify_spec.rb b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/spec/rb-inotify_spec.rb
new file mode 100644
index 0000000..b73ea30
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/spec/rb-inotify_spec.rb
@@ -0,0 +1,9 @@
+require 'spec_helper'
+
+describe INotify do
+  describe "version" do
+    it "exists" do
+      expect(INotify::VERSION).to be_truthy
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/spec/spec_helper.rb b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/spec/spec_helper.rb
new file mode 100644
index 0000000..7dceb7b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rb-inotify-0.9.10/spec/spec_helper.rb
@@ -0,0 +1,12 @@
+
+require "bundler/setup"
+require "rb-inotify"
+
+RSpec.configure do |config|
+	# Enable flags like --only-failures and --next-failure
+	config.example_status_persistence_file_path = ".rspec_status"
+
+	config.expect_with :rspec do |c|
+		c.syntax = :expect
+	end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/Gemfile b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/Gemfile
new file mode 100644
index 0000000..918c4cb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/Gemfile
@@ -0,0 +1,23 @@
+source 'http://rubygems.org'
+
+gemspec
+
+gem 'minitest', '~> 4.0'
+gem 'wrong'
+
+gem 'rake'
+
+# don't try to install redcarpet under jruby
+gem 'redcarpet', :platforms => :ruby
+
+group :development do
+  gem 'pry'
+
+  # docs
+  gem 'yard'
+  gem 'github-markup'
+
+  # for visual tests
+  gem 'sinatra'
+  gem 'shotgun'
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/LICENSE b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/LICENSE
new file mode 100644
index 0000000..660592c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/LICENSE
@@ -0,0 +1,186 @@
+# MIT license.  See http://www.opensource.org/licenses/mit-license.php
+
+Copyright (c) 2012 Jeanine Adkisson.
+
+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.
+
+# SPECIAL NOTE:
+Many of the lexers in this project are adaptations of those in Pygments
+(pygments.org).  The license for Pygments is as follows:
+
+# BEGIN pygments/LICENSE #
+
+Copyright (c) 2006-2012 by the respective authors (see AUTHORS file).
+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
+OWNER 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.
+
+# END pygments/LICENSE #
+
+The contents of the AUTHORS file at the time of porting was:
+
+# BEGIN pygments/AUTHORS #
+
+Pygments is written and maintained by Georg Brandl <georg@python.org>.
+
+Major developers are Tim Hatch <tim@timhatch.com> and Armin Ronacher
+<armin.ronacher@active-4.com>.
+
+Other contributors, listed alphabetically, are:
+
+* Sam Aaron -- Ioke lexer
+* Kumar Appaiah -- Debian control lexer
+* Ali Afshar -- image formatter
+* Andreas Amann -- AppleScript lexer
+* Jeffrey Arnold -- R/S lexer, BUGS lexers
+* Jeremy Ashkenas -- CoffeeScript lexer
+* Stefan Matthias Aust -- Smalltalk lexer
+* Ben Bangert -- Mako lexers
+* Max Battcher -- Darcs patch lexer
+* Paul Baumgart, 280 North, Inc. -- Objective-J lexer
+* Michael Bayer -- Myghty lexers
+* John Benediktsson -- Factor lexer
+* Christopher Bertels -- Fancy lexer
+* Jarrett Billingsley -- MiniD lexer
+* Adam Blinkinsop -- Haskell, Redcode lexers
+* Frits van Bommel -- assembler lexers
+* Pierre Bourdon -- bugfixes
+* Hiram Chirino -- Scaml and Jade lexers
+* Leaf Corcoran -- MoonScript lexer
+* Christopher Creutzig -- MuPAD lexer
+* Pete Curry -- bugfixes
+* Owen Durni -- haXe lexer
+* Nick Efford -- Python 3 lexer
+* Sven Efftinge -- Xtend lexer
+* Artem Egorkine -- terminal256 formatter
+* James H. Fisher -- PostScript lexer
+* Carlos Galdino -- Elixir and Elixir Console lexers
+* Naveen Garg -- Autohotkey lexer
+* Laurent Gautier -- R/S lexer
+* Alex Gaynor -- PyPy log lexer
+* Bertrand Goetzmann -- Groovy lexer
+* Krzysiek Goj -- Scala lexer
+* Matt Good -- Genshi, Cheetah lexers
+* Patrick Gotthardt -- PHP namespaces support
+* Olivier Guibe -- Asymptote lexer
+* Martin Harriman -- SNOBOL lexer
+* Matthew Harrison -- SVG formatter
+* Steven Hazel -- Tcl lexer
+* Aslak Hellesøy -- Gherkin lexer
+* Greg Hendershott -- Racket lexer
+* Jordi Gutiérrez Hermoso -- Octave lexer
+* David Hess, Fish Software, Inc. -- Objective-J lexer
+* Varun Hiremath -- Debian control lexer
+* Doug Hogan -- Mscgen lexer
+* Ben Hollis -- Mason lexer
+* Tim Howard -- BlitzMax lexer
+* Ivan Inozemtsev -- Fantom lexer
+* Brian R. Jackson -- Tea lexer
+* Dennis Kaarsemaker -- sources.list lexer
+* Igor Kalnitsky -- vhdl lexer
+* Eric Knibbe -- Lasso lexer
+* Adam Koprowski -- Opa lexer
+* Benjamin Kowarsch -- Modula-2 lexer
+* Alexander Kriegisch -- Kconfig and AspectJ lexers
+* Marek Kubica -- Scheme lexer
+* Jochen Kupperschmidt -- Markdown processor
+* Gerd Kurzbach -- Modelica lexer
+* Olov Lassus -- Dart lexer
+* Sylvestre Ledru -- Scilab lexer
+* Mark Lee -- Vala lexer
+* Ben Mabey -- Gherkin lexer
+* Simone Margaritelli -- Hybris lexer
+* Kirk McDonald -- D lexer
+* Gordon McGregor -- SystemVerilog lexer
+* Stephen McKamey -- Duel/JBST lexer
+* Brian McKenna -- F# lexer
+* Lukas Meuser -- BBCode formatter, Lua lexer
+* Paul Miller -- LiveScript lexer
+* Hong Minhee -- HTTP lexer
+* Michael Mior -- Awk lexer
+* Jon Morton -- Rust lexer
+* Paulo Moura -- Logtalk lexer
+* Mher Movsisyan -- DTD lexer
+* Ana Nelson -- Ragel, ANTLR, R console lexers
+* Nam T. Nguyen -- Monokai style
+* Jesper Noehr -- HTML formatter "anchorlinenos"
+* Mike Nolta -- Julia lexer
+* Jonas Obrist -- BBCode lexer
+* David Oliva -- Rebol lexer
+* Jon Parise -- Protocol buffers lexer
+* Ronny Pfannschmidt -- BBCode lexer
+* Benjamin Peterson -- Test suite refactoring
+* Dominik Picheta -- Nimrod lexer
+* Clément Prévost -- UrbiScript lexer
+* Kashif Rasul -- CUDA lexer
+* Justin Reidy -- MXML lexer
+* Norman Richards -- JSON lexer
+* Lubomir Rintel -- GoodData MAQL and CL lexers
+* Andre Roberge -- Tango style
+* Konrad Rudolph -- LaTeX formatter enhancements
+* Mario Ruggier -- Evoque lexers
+* Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers
+* Matteo Sasso -- Common Lisp lexer
+* Joe Schafer -- Ada lexer
+* Ken Schutte -- Matlab lexers
+* Tassilo Schweyer -- Io, MOOCode lexers
+* Joerg Sieker -- ABAP lexer
+* Robert Simmons -- Standard ML lexer
+* Kirill Simonov -- YAML lexer
+* Steve Spigarelli -- XQuery lexer
+* Jerome St-Louis -- eC lexer
+* James Strachan -- Kotlin lexer
+* Tiberius Teng -- default style overhaul
+* Jeremy Thurgood -- Erlang, Squid config lexers
+* Erick Tryzelaar -- Felix lexer
+* Daniele Varrazzo -- PostgreSQL lexers
+* Abe Voelker -- OpenEdge ABL lexer
+* Whitney Young -- ObjectiveC lexer
+* Matthias Vallentin -- Bro lexer
+* Nathan Weizenbaum -- Haml and Sass lexers
+* Dietmar Winkler -- Modelica lexer
+* Nils Winter -- Smalltalk lexer
+* Davy Wybiral -- Clojure lexer
+* Diego Zamboni -- CFengine3 lexer
+* Alex Zimin -- Nemerle lexer
+
+Many thanks for all contributions!
+
+# END pygments/AUTHORS #
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/bin/rougify b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/bin/rougify
new file mode 100755
index 0000000..bee4b0a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/bin/rougify
@@ -0,0 +1,16 @@
+#!/usr/bin/env ruby
+
+require 'pathname'
+ROOT_DIR = Pathname.new(__FILE__).dirname.parent
+load ROOT_DIR.join('lib/rouge.rb')
+load ROOT_DIR.join('lib/rouge/cli.rb')
+
+begin
+  Rouge::CLI.parse(ARGV).run
+rescue Rouge::CLI::Error => e
+  puts e.message
+  exit e.status
+rescue Interrupt
+  $stderr.puts "\nrouge: interrupted"
+  exit 2
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge.rb
new file mode 100644
index 0000000..2d6f730
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge.rb
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*- #
+
+# stdlib
+require 'pathname'
+
+# The containing module for Rouge
+module Rouge
+  class << self
+    # Highlight some text with a given lexer and formatter.
+    #
+    # @example
+    #   Rouge.highlight('@foo = 1', 'ruby', 'html')
+    #   Rouge.highlight('var foo = 1;', 'js', 'terminal256')
+    #
+    #   # streaming - chunks become available as they are lexed
+    #   Rouge.highlight(large_string, 'ruby', 'html') do |chunk|
+    #     $stdout.print chunk
+    #   end
+    def highlight(text, lexer, formatter, &b)
+      lexer = Lexer.find(lexer) unless lexer.respond_to? :lex
+      raise "unknown lexer #{lexer}" unless lexer
+
+      formatter = Formatter.find(formatter) unless formatter.respond_to? :format
+      raise "unknown formatter #{formatter}" unless formatter
+
+      formatter.format(lexer.lex(text), &b)
+    end
+  end
+end
+
+load_dir = Pathname.new(__FILE__).dirname
+load load_dir.join('rouge/version.rb')
+
+load load_dir.join('rouge/util.rb')
+
+load load_dir.join('rouge/text_analyzer.rb')
+load load_dir.join('rouge/token.rb')
+
+load load_dir.join('rouge/guesser.rb')
+load load_dir.join('rouge/guessers/glob_mapping.rb')
+load load_dir.join('rouge/guessers/modeline.rb')
+load load_dir.join('rouge/guessers/filename.rb')
+load load_dir.join('rouge/guessers/mimetype.rb')
+load load_dir.join('rouge/guessers/source.rb')
+
+load load_dir.join('rouge/lexer.rb')
+load load_dir.join('rouge/regex_lexer.rb')
+load load_dir.join('rouge/template_lexer.rb')
+
+lexers_dir = load_dir.join('rouge/lexers')
+Dir.glob(lexers_dir.join('*.rb')).each do |f|
+  Rouge::Lexers.load_lexer(Pathname.new(f).relative_path_from(lexers_dir).to_s)
+end
+
+load load_dir.join('rouge/formatter.rb')
+load load_dir.join('rouge/formatters/html.rb')
+load load_dir.join('rouge/formatters/terminal256.rb')
+load load_dir.join('rouge/formatters/null.rb')
+
+load load_dir.join('rouge/theme.rb')
+load load_dir.join('rouge/themes/thankful_eyes.rb')
+load load_dir.join('rouge/themes/colorful.rb')
+load load_dir.join('rouge/themes/base16.rb')
+load load_dir.join('rouge/themes/github.rb')
+load load_dir.join('rouge/themes/monokai.rb')
+load load_dir.join('rouge/themes/molokai.rb')
+load load_dir.join('rouge/themes/monokai_sublime.rb')
+load load_dir.join('rouge/themes/gruvbox.rb')
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/cli.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/cli.rb
new file mode 100644
index 0000000..0071400
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/cli.rb
@@ -0,0 +1,363 @@
+# -*- coding: utf-8 -*- #
+
+# not required by the main lib.
+# to use this module, require 'rouge/cli'.
+
+module Rouge
+  class FileReader
+    attr_reader :input
+    def initialize(input)
+      @input = input
+    end
+
+    def file
+      case input
+      when '-'
+        IO.new($stdin.fileno, 'r:utf-8')
+      when String
+        File.new(input, 'r:utf-8')
+      when ->(i){ i.respond_to? :read }
+        input
+      end
+    end
+
+    def read
+      @read ||= begin
+        file.read
+      rescue => e
+        $stderr.puts "unable to open #{input}: #{e.message}"
+        exit 1
+      ensure
+        file.close
+      end
+    end
+  end
+
+  class CLI
+    def self.doc
+      return enum_for(:doc) unless block_given?
+
+      yield %|usage: rougify [command] [args...]|
+      yield %||
+      yield %|where <command> is one of:|
+      yield %|	highlight	#{Highlight.desc}|
+      yield %|	help		#{Help.desc}|
+      yield %|	style		#{Style.desc}|
+      yield %|	list		#{List.desc}|
+      yield %|	version		#{Version.desc}|
+      yield %||
+      yield %|See `rougify help <command>` for more info.|
+    end
+
+    class Error < StandardError
+      attr_reader :message, :status
+      def initialize(message, status=1)
+        @message = message
+        @status = status
+      end
+    end
+
+    def self.parse(argv=ARGV)
+      argv = normalize_syntax(argv)
+
+      mode = argv.shift
+
+      klass = class_from_arg(mode)
+      return klass.parse(argv) if klass
+
+      case mode
+      when '-h', '--help', 'help', '-help'
+        Help.parse(argv)
+      else
+        argv.unshift(mode) if mode
+        Highlight.parse(argv)
+      end
+    end
+
+    def initialize(options={})
+    end
+
+    def self.error!(msg, status=1)
+      raise Error.new(msg, status)
+    end
+
+    def error!(*a)
+      self.class.error!(*a)
+    end
+
+    def self.class_from_arg(arg)
+      case arg
+      when 'version', '--version', '-v'
+        Version
+      when 'help'
+        Help
+      when 'highlight', 'hi'
+        Highlight
+      when 'style'
+        Style
+      when 'list'
+        List
+      end
+    end
+
+    class Version < CLI
+      def self.desc
+        "print the rouge version number"
+      end
+
+      def self.parse(*); new; end
+
+      def run
+        puts Rouge.version
+      end
+    end
+
+    class Help < CLI
+      def self.desc
+        "print help info"
+      end
+
+      def self.doc
+        return enum_for(:doc) unless block_given?
+
+        yield %|usage: rougify help <command>|
+        yield %||
+        yield %|print help info for <command>.|
+      end
+
+      def self.parse(argv)
+        opts = { :mode => CLI }
+        until argv.empty?
+          arg = argv.shift
+          klass = class_from_arg(arg)
+          if klass
+            opts[:mode] = klass
+            next
+          end
+        end
+        new(opts)
+      end
+
+      def initialize(opts={})
+        @mode = opts[:mode]
+      end
+
+      def run
+        @mode.doc.each(&method(:puts))
+      end
+    end
+
+    class Highlight < CLI
+      def self.desc
+        "highlight code"
+      end
+
+      def self.doc
+        return enum_for(:doc) unless block_given?
+
+        yield %[usage: rougify highlight <filename> [options...]]
+        yield %[       rougify highlight [options...]]
+        yield %[]
+        yield %[--input-file|-i <filename>  specify a file to read, or - to use stdin]
+        yield %[]
+        yield %[--lexer|-l <lexer>          specify the lexer to use.]
+        yield %[                            If not provided, rougify will try to guess]
+        yield %[                            based on --mimetype, the filename, and the]
+        yield %[                            file contents.]
+        yield %[]
+        yield %[--formatter|-f <opts>       specify the output formatter to use.]
+        yield %[                            If not provided, rougify will default to]
+        yield %[                            terminal256.]
+        yield %[]
+        yield %[--mimetype|-m <mimetype>    specify a mimetype for lexer guessing]
+        yield %[]
+        yield %[--lexer-opts|-L <opts>      specify lexer options in CGI format]
+        yield %[                            (opt1=val1&opt2=val2)]
+        yield %[]
+        yield %[--formatter-opts|-F <opts>  specify formatter options in CGI format]
+        yield %[                            (opt1=val1&opt2=val2)]
+      end
+
+      def self.parse(argv)
+        opts = {
+          :formatter => 'terminal256',
+          :input_file => '-',
+          :lexer_opts => {},
+          :formatter_opts => {},
+        }
+
+        until argv.empty?
+          arg = argv.shift
+          case arg
+          when '--input-file', '-i'
+            opts[:input_file] = argv.shift
+          when '--mimetype', '-m'
+            opts[:mimetype] = argv.shift
+          when '--lexer', '-l'
+            opts[:lexer] = argv.shift
+          when '--formatter', '-f'
+            opts[:formatter] = argv.shift
+          when '--lexer-opts', '-L'
+            opts[:lexer_opts] = parse_cgi(argv.shift)
+          when '--formatter-opts', '-F'
+            opts[:formatter_opts] = parse_cgi(argv.shift)
+          when /^--/
+            error! "unknown option #{arg.inspect}"
+          else
+            opts[:input_file] = arg
+          end
+        end
+
+        new(opts)
+      end
+
+      def input_stream
+        @input_stream ||= FileReader.new(@input_file)
+      end
+
+      def input
+        @input ||= input_stream.read
+      end
+
+      def lexer_class
+        @lexer_class ||= Lexer.guess(
+          :filename => @input_file,
+          :mimetype => @mimetype,
+          :source => input_stream,
+        )
+      end
+
+      def lexer
+        @lexer ||= lexer_class.new(@lexer_opts)
+      end
+
+      attr_reader :input_file, :lexer_name, :mimetype, :formatter
+
+      def initialize(opts={})
+        @input_file = opts[:input_file]
+
+        if opts[:lexer]
+          @lexer_class = Lexer.find(opts[:lexer]) \
+            or error! "unkown lexer #{opts[:lexer].inspect}"
+        else
+          @lexer_name = opts[:lexer]
+          @mimetype = opts[:mimetype]
+        end
+
+        @lexer_opts = opts[:lexer_opts]
+
+        formatter_class = Formatter.find(opts[:formatter]) \
+          or error! "unknown formatter #{opts[:formatter]}"
+
+        @formatter = formatter_class.new(opts[:formatter_opts])
+      end
+
+      def run
+        formatter.format(lexer.lex(input), &method(:print))
+      end
+
+    private
+      def self.parse_cgi(str)
+        pairs = CGI.parse(str).map { |k, v| [k.to_sym, v.first] }
+        Hash[pairs]
+      end
+    end
+
+    class Style < CLI
+      def self.desc
+        "print CSS styles"
+      end
+
+      def self.doc
+        return enum_for(:doc) unless block_given?
+
+        yield %|usage: rougify style [<theme-name>] [<options>]|
+        yield %||
+        yield %|Print CSS styles for the given theme.  Extra options are|
+        yield %|passed to the theme.  Theme defaults to thankful_eyes.|
+        yield %||
+        yield %|options:|
+        yield %|  --scope	(default: .highlight) a css selector to scope by|
+        yield %||
+        yield %|available themes:|
+        yield %|  #{Theme.registry.keys.sort.join(', ')}|
+      end
+
+      def self.parse(argv)
+        opts = { :theme_name => 'thankful_eyes' }
+
+        until argv.empty?
+          arg = argv.shift
+          case arg
+          when /--(\w+)/
+            opts[$1.tr('-', '_').to_sym] = argv.shift
+          else
+            opts[:theme_name] = arg
+          end
+        end
+
+        new(opts)
+      end
+
+      def initialize(opts)
+        theme_name = opts.delete(:theme_name)
+        theme_class = Theme.find(theme_name) \
+          or error! "unknown theme: #{theme_name}"
+
+        @theme = theme_class.new(opts)
+      end
+
+      def run
+        @theme.render(&method(:puts))
+      end
+    end
+
+    class List < CLI
+      def self.desc
+        "list available lexers"
+      end
+
+      def self.doc
+        return enum_for(:doc) unless block_given?
+
+        yield %|usage: rouge list|
+        yield %||
+        yield %|print a list of all available lexers with their descriptions.|
+      end
+
+      def self.parse(argv)
+        new
+      end
+
+      def run
+        puts "== Available Lexers =="
+
+        Lexer.all.sort_by(&:tag).each do |lexer|
+          desc = "#{lexer.desc}"
+          if lexer.aliases.any?
+            desc << " [aliases: #{lexer.aliases.join(',')}]"
+          end
+          puts "%s: %s" % [lexer.tag, desc]
+          puts
+        end
+      end
+    end
+
+  private
+    def self.normalize_syntax(argv)
+      out = []
+      argv.each do |arg|
+        case arg
+        when /^(--\w+)=(.*)$/
+          out << $1 << $2
+        when /^(-\w)(.+)$/
+          out << $1 << $2
+        else
+          out << arg
+        end
+      end
+
+      out
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/actionscript b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/actionscript
new file mode 100644
index 0000000..f081e25
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/actionscript
@@ -0,0 +1,4 @@
+function hello(name:String):void
+{
+	trace("hello " + name);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/apache b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/apache
new file mode 100644
index 0000000..ce3e5fc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/apache
@@ -0,0 +1,21 @@
+AddDefaultCharset UTF-8
+
+RewriteEngine On
+
+# Serve gzipped version if available and accepted
+AddEncoding x-gzip .gz
+RewriteCond %{HTTP:Accept-Encoding} gzip
+RewriteCond %{REQUEST_FILENAME}.gz -f
+RewriteRule ^(.*)$ $1.gz [QSA,L]
+<FilesMatch \.css\.gz$>
+  ForceType text/css
+  Header append Vary Accept-Encoding
+</FilesMatch>
+<FilesMatch \.js\.gz$>
+  ForceType application/javascript
+  Header append Vary Accept-Encoding
+</FilesMatch>
+<FilesMatch \.html\.gz$>
+  ForceType text/html
+  Header append Vary Accept-Encoding
+</FilesMatch>
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/apiblueprint b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/apiblueprint
new file mode 100644
index 0000000..25dc577
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/apiblueprint
@@ -0,0 +1,33 @@
+FORMAT: 1A
+HOST: http://polls.apiblueprint.org/
+
+# Polls
+
+Polls is a simple API allowing consumers to view polls and vote in them.
+
+# Polls API Root [/]
+
+## Group Question
+
+Resources related to questions in the API.
+
+## Question [/questions/{question_id}]
+
++ Parameters
+    + question_id: 1 (number, required) - ID of the Question in form of an integer
+
++ Attributes
+    + question: `Favourite programming language?` (required)
+    + published_at: `2014-11-11T08:40:51.620Z` - An ISO8601 date when the question was published
+    + choices (array[Choice], required) - An array of Choice objects
+    + url: /questions/1
+
+### View a Questions Detail [GET]
+
++ Response 200 (application/json)
+    + Attributes (Question)
+
+### Delete a Question [DELETE]
+
++ Relation: delete
++ Response 204
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/applescript b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/applescript
new file mode 100644
index 0000000..c824919
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/applescript
@@ -0,0 +1,2 @@
+-- AppleScript playing with iTunes
+tell application "iTunes" to get current selection
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/biml b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/biml
new file mode 100644
index 0000000..e4d5f68
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/biml
@@ -0,0 +1,38 @@
+<#@ template language="C#" #>
+<#@ import namespace="System.Data" #>
+<Biml xmlns="http://schemas.varigence.com/biml.xsd">
+    <Connections>
+        <!-- Creates a connection to the Adventure Works database -->
+        <Connection
+            Name="AdventureWorks"
+            ConnectionString="Provider=SQLNCLI10.1;Data Source=Localhost;Persist Security Info=False;Integrated Security=SSPI;Initial Catalog=AdventureWorksDW" 
+            />
+    </Connections>
+    <!-- Packages Collection -->
+    <Packages>
+        <!-- A Package -->
+        <Package
+            Name="MyFirstPackage"
+            ConstraintMode="Linear"
+            >
+            <!-- A Package's Tasks -->
+            <Tasks>
+                <ExecuteSQL Name="ExecuteStoredProc" ConnectionName="AdventureWorks">
+                    <DirectInput>EXEC usp_StoredProc</DirectInput>
+                </ExecuteSQL>
+                <# foreach (var table in RootNode.Tables) { #>
+                    <Dataflow Name="Duplicate <#=table.Name#> Data">
+                        <Transformations>
+                            <OleDbSource Name="Retrieve Data" ConnectionName="AdventureWorks">
+                                <DirectInput>SELECT * FROM <#=table.Name#></DirectInput>
+                            </OleDbSource>
+                            <OleDbDestination Name="Insert Data" ConnectionName="AdventureWorks">
+                                <ExternalTableOutput Table="<#=table.Name#>" />
+                            </OleDbDestination>
+                        </Transformations>
+                    </Dataflow>
+                <# } #>
+            </Tasks>
+        </Package>
+    </Packages>
+</Biml>
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/c b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/c
new file mode 100644
index 0000000..34771c8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/c
@@ -0,0 +1,8 @@
+#include "ruby/ruby.h"
+
+static int
+clone_method_i(st_data_t key, st_data_t value, st_data_t data)
+{
+    clone_method((VALUE)data, (ID)key, (const rb_method_entry_t *)value);
+    return ST_CONTINUE;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ceylon b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ceylon
new file mode 100644
index 0000000..fcf19e0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ceylon
@@ -0,0 +1,7 @@
+shared class CeylonClass<Parameter>()
+    given Parameter satisfies Object {
+    
+    shared String name => "CeylonClass";
+} 
+
+shared void run() => CeylonClass();
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/cfscript b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/cfscript
new file mode 100644
index 0000000..9006416
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/cfscript
@@ -0,0 +1,18 @@
+component accessors="true" {
+
+  property type="string" name="firstName" default="";
+  property string username;
+
+  function init(){
+    return this;
+  }
+
+  public any function submitOrder( required product, coupon="", boolean results=true ){
+
+    var foo = function( required string baz, x=true, y=false ){
+      return "bar!";
+    };
+
+    return foo;
+  }
+}
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/clojure b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/clojure
new file mode 100644
index 0000000..a9b682e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/clojure
@@ -0,0 +1,5 @@
+(defn make-adder [x]
+  (let [y x]
+    (fn [z] (+ y z))))
+(def add2 (make-adder 2))
+(add2 4)
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/cmake b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/cmake
new file mode 100644
index 0000000..89fcc51
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/cmake
@@ -0,0 +1,7 @@
+cmake_minimum_required(VERSION 2.8.3)
+
+project(foo C)
+
+# some note
+add_executable(foo utils.c "foo.c")
+target_link_libraries(foo ${LIBRARIES})
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/coffeescript b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/coffeescript
new file mode 100644
index 0000000..a562db6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/coffeescript
@@ -0,0 +1,5 @@
+# Objects:
+math =
+  root:   Math.sqrt
+  square: square
+  cube:   (x) -> x * square x
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/common_lisp b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/common_lisp
new file mode 100644
index 0000000..c6d2861
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/common_lisp
@@ -0,0 +1 @@
+(defun square (x) (* x x))
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/conf b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/conf
new file mode 100644
index 0000000..5386d4e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/conf
@@ -0,0 +1,4 @@
+# A generic configuration file
+option1 "val1"
+option2 23
+option3 'val3'
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/coq b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/coq
new file mode 100644
index 0000000..c484498
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/coq
@@ -0,0 +1,11 @@
+Require Import Coq.Lists.List.
+
+Section with_T.
+  Context {T : Type}.
+
+  Fixpoint length (ls : list T) : nat :=
+    match ls with
+    | nil => 0
+    | _ :: ls => S (length ls)
+    end.
+End with_T.
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/cpp b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/cpp
new file mode 100644
index 0000000..c20cf27
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/cpp
@@ -0,0 +1,8 @@
+#include<iostream>
+
+using namespace std;
+
+int main()
+{
+    cout << "Hello World" << endl;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/csharp b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/csharp
new file mode 100644
index 0000000..04e4a8e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/csharp
@@ -0,0 +1,5 @@
+// reverse byte order (16-bit)
+public static UInt16 ReverseBytes(UInt16 value)
+{
+  return (UInt16)((value & 0xFFU) << 8 | (value & 0xFF00U) >> 8);
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/css b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/css
new file mode 100644
index 0000000..0d1fe74
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/css
@@ -0,0 +1,4 @@
+body {
+    font-size: 12pt;
+    background: #fff url(temp.png) top left no-repeat;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/d b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/d
new file mode 100644
index 0000000..65d4945
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/d
@@ -0,0 +1,16 @@
+import std.algorithm, std.conv, std.functional,
+    std.math, std.regex, std.stdio;
+
+alias round = pipe!(to!real, std.math.round, to!string);
+static reFloatingPoint = ctRegex!`[0-9]+\.[0-9]+`;
+
+void main()
+{
+    // Replace anything that looks like a real
+    // number with the rounded equivalent.
+    stdin
+        .byLine
+        .map!(l => l.replaceAll!(c => c.hit.round)
+                                (reFloatingPoint))
+        .each!writeln;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/dart b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/dart
new file mode 100644
index 0000000..4b40da5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/dart
@@ -0,0 +1,6 @@
+void main() {
+  var collection=[1,2,3,4,5];
+  for(var a in collection){
+    print(a);
+  }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/diff b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/diff
new file mode 100644
index 0000000..ab4f316
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/diff
@@ -0,0 +1,7 @@
+--- file1	2012-10-16 15:07:58.086886874 +0100
++++ file2	2012-10-16 15:08:07.642887236 +0100
+@@ -1,3 +1,3 @@
+ a b c
+-d e f
++D E F
+ g h i
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/eiffel b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/eiffel
new file mode 100644
index 0000000..ec025cc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/eiffel
@@ -0,0 +1,30 @@
+note
+  description: "Represents a person."
+
+class
+  PERSON
+
+create
+  make, make_unknown
+
+feature {NONE} -- Creation
+
+  make (a_name: like name)
+      -- Create a person with `a_name' as `name'.
+    do
+      name := a_name
+    ensure
+      name = a_name
+    end
+
+  make_unknown
+    do ensure
+      name = Void
+    end
+
+feature -- Access
+
+  name: detachable STRING
+      -- Full name or Void if unknown.
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/elixir b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/elixir
new file mode 100644
index 0000000..f81d641
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/elixir
@@ -0,0 +1 @@
+Enum.map([1,2,3], fn(x) -> x * 2 end)
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/erb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/erb
new file mode 100644
index 0000000..1f922b6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/erb
@@ -0,0 +1 @@
+<title><%= @title %></title>
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/erlang b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/erlang
new file mode 100644
index 0000000..c942b60
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/erlang
@@ -0,0 +1,7 @@
+%%% Geometry module.
+-module(geometry).
+-export([area/1]).
+
+%% Compute rectangle and circle area.
+area({rectangle, Width, Ht}) -> Width * Ht;
+area({circle, R})            -> 3.14159 * R * R.
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/factor b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/factor
new file mode 100644
index 0000000..2538dff
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/factor
@@ -0,0 +1,5 @@
+USING: io kernel sequences ;
+
+4 iota [
+    "Happy Birthday " write 2 = "dear NAME" "to You" ? print
+] each
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/fortran b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/fortran
new file mode 100644
index 0000000..4fc52c5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/fortran
@@ -0,0 +1,22 @@
+program bottles
+
+    implicit none
+    integer :: nbottles
+
+    do nbottles = 99, 1, -1
+        call print_bottles(nbottles)
+    end do
+
+contains
+
+    subroutine print_bottles(n)
+        implicit none
+        integer, intent(in) :: n
+
+        write(*, "(I0, 1X, 'bottles of beer on the wall,')") n
+        write(*, "(I0, 1X, 'bottles of beer.')") n
+        write(*, "('Take one down, pass it around,')")
+        write(*, "(I0, 1X, 'bottles of beer on the wall.', /)") n - 1
+    end subroutine print_bottles
+
+end program bottles
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/gherkin b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/gherkin
new file mode 100644
index 0000000..6db139c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/gherkin
@@ -0,0 +1,17 @@
+# language: en
+Feature: Addition
+  In order to avoid silly mistakes
+  As a math idiot
+  I want to be told the sum of two numbers
+
+  Scenario Outline: Add two numbers
+    Given I have entered <input_1> into the calculator
+    And I have entered <input_2> into the calculator
+    When I press <button>
+    Then the result should be <output> on the screen
+
+  Examples:
+    | input_1 | input_2 | button | output |
+    | 20      | 30      | add    | 50     |
+    | 2       | 5       | add    | 7      |
+    | 0       | 40      | add    | 40     |
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/glsl b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/glsl
new file mode 100644
index 0000000..b2b284e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/glsl
@@ -0,0 +1,14 @@
+#version 330 core
+
+uniform mat4 worldMatrix;
+
+layout(location = 0) in vec2 position;
+layout(location = 1) in vec4 color;
+
+out vec4 vertexColor;
+
+void main()
+{
+    vertexColor = color;
+    gl_Position = vec4(position, 0.0, 1.0);
+}
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/go b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/go
new file mode 100644
index 0000000..078ddff
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/go
@@ -0,0 +1,7 @@
+package main
+
+import "fmt"
+
+func main() {
+	fmt.Println("Hello, 世界")
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/gradle b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/gradle
new file mode 100644
index 0000000..5a191f9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/gradle
@@ -0,0 +1,10 @@
+apply plugin: 'java'
+
+repositories {
+  jcenter()
+}
+
+dependencies {
+  compile 'org.openjdk.jmh:jmh-core:1.12'
+  compile 'org.openjdk.jmh:jmh-generator-annprocess:1.12'
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/groovy b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/groovy
new file mode 100644
index 0000000..6be7311
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/groovy
@@ -0,0 +1,9 @@
+class Greet {
+  def name
+  Greet(who) { name = who[0].toUpperCase() +
+                      who[1..-1] }
+  def salute() { println "Hello $name!" }
+}
+
+g = new Greet('world')  // create object
+g.salute()               // output "Hello World!"
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/haml b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/haml
new file mode 100644
index 0000000..4dcb687
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/haml
@@ -0,0 +1,5 @@
+%section.container
+  %h1= post.title
+  %h2= post.subtitle
+  .content
+    = post.content
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/handlebars b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/handlebars
new file mode 100644
index 0000000..6dc4a7e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/handlebars
@@ -0,0 +1,7 @@
+<div class="entry">
+  <h1>{{title}}</h1>
+  {{#with story}}
+    <div class="intro">{{{intro}}}</div>
+    <div class="body">{{{body}}}</div>
+  {{/with}}
+</div>
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/haskell b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/haskell
new file mode 100644
index 0000000..2672159
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/haskell
@@ -0,0 +1,6 @@
+quicksort :: Ord a => [a] -> [a]
+quicksort []     = []
+quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
+    where
+        lesser  = filter (< p) xs
+        greater = filter (>= p) xs
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/html b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/html
new file mode 100644
index 0000000..9329a37
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/html
@@ -0,0 +1,8 @@
+<html>
+  <head><title>Title!</title></head>
+  <body>
+    <p id="foo">Hello, World!</p>
+    <script type="text/javascript">var a = 1;</script>
+    <style type="text/css">#foo { font-weight: bold; }</style>
+  </body>
+</html>
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/http b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/http
new file mode 100644
index 0000000..28bc750
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/http
@@ -0,0 +1,14 @@
+POST /demo/submit/ HTTP/1.1
+Host: rouge.jneen.net
+Cache-Control: max-age=0
+Origin: http://rouge.jayferd.us
+User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2)
+    AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7
+Content-Type: application/json
+Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
+Referer: http://pygments.org/
+Accept-Encoding: gzip,deflate,sdch
+Accept-Language: en-US,en;q=0.8
+Accept-Charset: windows-949,utf-8;q=0.7,*;q=0.3
+
+{"name":"test","lang":"text","boring":true}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ini b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ini
new file mode 100644
index 0000000..f600c91
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ini
@@ -0,0 +1,4 @@
+; last modified 1 April 2001 by John Doe
+[owner]
+name=John Doe
+organization=Acme Widgets Inc.
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/io b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/io
new file mode 100644
index 0000000..05f0a20
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/io
@@ -0,0 +1,11 @@
+bottle := method(i,
+  if(i==0, return "no more bottles of beer")
+  if(i==1, return "1 bottle of beer")
+  return i asString .. " bottles of beer"
+)
+
+for(i, 99, 1, -1,
+  write(bottle(i), " on the wall, ", bottle(i), ",\n")
+  write("take one down, pass it around,\n")
+  write(bottle(i - 1), " on the wall.\n\n")
+)
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/java b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/java
new file mode 100644
index 0000000..0cca61e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/java
@@ -0,0 +1,5 @@
+public class java {
+    public static void main(String[] args) {
+        System.out.println("Hello World");
+    }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/javascript b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/javascript
new file mode 100644
index 0000000..134a70e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/javascript
@@ -0,0 +1 @@
+$(document).ready(function() { alert('ready!'); });
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/jinja b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/jinja
new file mode 100644
index 0000000..808cf77
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/jinja
@@ -0,0 +1,9 @@
+{% extends "layout.html" %}
+
+{% block body %}
+  <ul>
+  {% for user in users %}
+    <li><a href="{{ user.url }}">{{ user.username }}</a></li>
+  {% endfor %}
+  </ul>
+{% endblock %}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/json b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/json
new file mode 100644
index 0000000..eead967
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/json
@@ -0,0 +1 @@
+{ "one": 1, "two": 2, "null": null, "simple": true }
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/json-doc b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/json-doc
new file mode 100644
index 0000000..a2a57fe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/json-doc
@@ -0,0 +1 @@
+{ "one": 1, "two": 2, "null": null, "simple": true } // a simple json object
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/jsonnet b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/jsonnet
new file mode 100644
index 0000000..510441f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/jsonnet
@@ -0,0 +1,28 @@
+// Compiler template
+local CCompiler = {
+  cFlags: [],
+  out: "a.out",
+  local flags_str = std.join(" ", self.cFlags),
+  local files_str = std.join(" ", self.files),
+  cmd: "%s %s %s -o %s" % [self.compiler, flags_str, files_str, self.out],
+};
+
+// GCC specialization
+local Gcc = CCompiler { compiler: "gcc" };
+
+// Another specialization
+local Clang = CCompiler { compiler: "clang" };
+
+// Mixins - append flags
+local Opt = { cFlags: super.cFlags + ["-O3", "-DNDEBUG"] };
+local Dbg = { cFlags: super.cFlags + ["-g"] };
+
+// Output:
+{
+  targets: [
+    Gcc { files: ["a.c", "b.c"] },
+    Clang { files: ["test.c"], out: "test" },
+    Clang + Opt { files: ["test2.c"], out: "test2" },
+    Gcc + Opt + Dbg { files: ["foo.c", "bar.c"], out: "baz" },
+  ]
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/julia b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/julia
new file mode 100644
index 0000000..fe0e9e8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/julia
@@ -0,0 +1,11 @@
+function mandel(z)
+    c = z
+    maxiter = 80
+    for n = 1:maxiter
+        if abs(z) > 2
+            return n-1
+        end
+        z = z^2 + c
+    end
+    return maxiter
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/kotlin b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/kotlin
new file mode 100644
index 0000000..a27b0db
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/kotlin
@@ -0,0 +1,3 @@
+fun main(args: Array<String>) {
+    println("Hello, world!")
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/liquid b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/liquid
new file mode 100644
index 0000000..ec57021
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/liquid
@@ -0,0 +1,11 @@
+<ul id="products">
+  {% for product in products %}
+    <li>
+      <h2>{{ product.title }}</h2>
+      Only {{ product.price | format_as_money }}
+
+      <p>{{ product.description | prettyprint | truncate: 200  }}</p>
+
+    </li>
+  {% endfor %}
+</ul>
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/literate_coffeescript b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/literate_coffeescript
new file mode 100644
index 0000000..0e5f25f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/literate_coffeescript
@@ -0,0 +1,3 @@
+Import the helpers we plan to use.
+
+    {extend, last} = require './helpers'
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/literate_haskell b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/literate_haskell
new file mode 100644
index 0000000..10e7535
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/literate_haskell
@@ -0,0 +1,7 @@
+In Bird-style you have to leave a blank before the code.
+
+> fact :: Integer -> Integer
+> fact 0 = 1
+> fact n = n * fact (n-1)
+
+And you have to leave a blank line after the code as well.
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/llvm b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/llvm
new file mode 100644
index 0000000..c4596a8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/llvm
@@ -0,0 +1,20 @@
+; copied from http://llvm.org/docs/LangRef.html#module-structure
+; Declare the string constant as a global constant.
+@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"
+
+; External declaration of the puts function
+declare i32 @puts(i8* nocapture) nounwind
+
+; Definition of main function
+define i32 @main() {   ; i32()*
+  ; Convert [13 x i8]* to i8  *...
+  %cast210 = getelementptr [13 x i8]* @.str, i64 0, i64 0
+
+  ; Call puts function to write out the string to stdout.
+  call i32 @puts(i8* %cast210)
+  ret i32 0
+}
+
+; Named metadata
+!1 = metadata !{i32 42}
+!foo = !{!1, null}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/lua b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/lua
new file mode 100644
index 0000000..2abebae
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/lua
@@ -0,0 +1,12 @@
+-- defines a factorial function
+function fact (n)
+  if n == 0 then
+    return 1
+  else
+    return n * fact(n-1)
+  end
+end
+    
+print("enter a number:")
+a = io.read("*number")        -- read a number
+print(fact(a))
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/make b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/make
new file mode 100644
index 0000000..cdac715
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/make
@@ -0,0 +1,6 @@
+.PHONY: all
+all: $(OBJ)
+
+$(OBJ): $(SOURCE)
+	@echo "compiling..."
+	$(GCC) $(CFLAGS) $< > $@
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/markdown b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/markdown
new file mode 100644
index 0000000..5e36314
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/markdown
@@ -0,0 +1,4 @@
+Markdown has cool [reference links][ref 1]
+and [regular links too](http://example.com)
+
+[ref 1]: http://example.com
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/matlab b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/matlab
new file mode 100644
index 0000000..3777fb5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/matlab
@@ -0,0 +1,6 @@
+A = cat( 3, [1 2 3; 9 8 7; 4 6 5], [0 3 2; 8 8 4; 5 3 5], ...
+                 [6 4 7; 6 8 5; 5 4 3]);
+% The EIG function is applied to each of the horizontal 'slices' of A.
+for i = 1:3
+    eig(squeeze(A(i,:,:)))
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/moonscript b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/moonscript
new file mode 100644
index 0000000..4c8511d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/moonscript
@@ -0,0 +1,16 @@
+util = require "my.module"
+
+a_table = {
+  foo: 'bar'
+  interpolated: "foo-#{other.stuff 2 + 3}"
+  "string": 2
+  do: 'keyword'
+}
+
+class MyClass extends SomeClass
+  new: (@init, arg2 = 'default') =>
+    @derived = @init + 2
+    super!
+
+  other: =>
+    @foo + 2
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/nasm b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/nasm
new file mode 100644
index 0000000..2bf20e6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/nasm
@@ -0,0 +1,26 @@
+%macro IRQ 2
+    global irq%1
+    irq%1:
+        cli
+        push byte 0     ; push a dummy error code
+        push byte %2    ; push the IRQ number
+        jmp  irq_common_stub
+%endmacro
+
+extern irq_handler
+
+irq_common_stub:
+    pusha           ; Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
+    mov ax, ds      ; Lower 16-bits of eax = ds.
+    push eax        ; save the data segment descriptor
+    mov ax, 0x10    ; load the kernel data segment descriptor
+    mov edx, eax
+    call irq_handler
+
+%assign i 0
+%rep 8
+ISR_NOERRCODE i
+%assign i i+1
+%endrep
+
+ISR_NOERRCODE 9
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/nginx b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/nginx
new file mode 100644
index 0000000..0288770
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/nginx
@@ -0,0 +1,5 @@
+server {
+  listen          80;
+  server_name     example.com *.example.com;
+  rewrite ^       http://www.domain.com$request_uri? permanent;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/nim b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/nim
new file mode 100644
index 0000000..74498cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/nim
@@ -0,0 +1,27 @@
+import math,strutils
+
+proc fixedWidth(input: string, minFieldSize: int):string {.inline.} =
+  # Note that field size is a minimum- will expand field if input
+  # string is larger
+  if input.startsWith("-"):
+    return(input & repeatchar(count=(abs(minFieldSize-len(input))),c=' '))
+  else:
+    return(" " & input & repeatchar(count=(abs(minFieldSize-len(input))-1),c=' '))
+
+template mathOnInterval(lowbound,highbound:float,counts: int,p:proc) =
+  block:
+    var step:    float = (highbound - lowbound)/(max(counts,1))
+    var current: float = lowbound
+    while current < highbound:
+      echo($fixedWidth($current,25) & ": " & $fixedWidth($p(current),25))
+      current += step
+
+echo "Sine of theta from 0 to 2*PI by PI/12"
+mathOnInterval(0.0,2.0*PI,12,sin)
+echo("\n")
+echo "Cosine of theta from 0 to 2*PI by PI/12"
+mathOnInterval(0.0,2.0*PI,12,cos)
+
+# The first example above is much the same as:
+# for i in 1..100:
+#   echo($sin( (float(i)/100.0) * 2.0*PI ))
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/objective_c b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/objective_c
new file mode 100644
index 0000000..c085626
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/objective_c
@@ -0,0 +1,18 @@
+@interface Person : NSObject {
+  @public
+  NSString *name;
+  @private
+  int age;
+}
+
+@property(copy) NSString *name;
+@property(readonly) int age;
+
+-(id)initWithAge:(int)age;
+@end
+
+NSArray *arrayLiteral = @[@"abc", @1];
+NSDictionary *dictLiteral = @{
+  @"hello": @"world",
+  @"goodbye": @"cruel world"
+};
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ocaml b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ocaml
new file mode 100644
index 0000000..e09cf09
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ocaml
@@ -0,0 +1,12 @@
+(* Binary tree with leaves car­rying an integer. *)
+type tree = Leaf of int | Node of tree * tree
+
+let rec exists_leaf test tree =
+  match tree with
+  | Leaf v -> test v
+  | Node (left, right) ->
+      exists_leaf test left
+      || exists_leaf test right
+
+let has_even_leaf tree =
+  exists_leaf (fun n -> n mod 2 = 0) tree
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/pascal b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/pascal
new file mode 100644
index 0000000..16be537
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/pascal
@@ -0,0 +1,14 @@
+program FizzBuzz(output);
+var
+  i: Integer;
+begin
+  for i := 1 to 100 do
+    if i mod 15 = 0 then
+      WriteLn('FizzBuzz')
+    else if i mod 3 = 0 then
+      WriteLn('Fizz')
+    else if i mod 5 = 0 then
+      WriteLn('Buzz')
+    else
+      WriteLn(i)
+end.
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/perl b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/perl
new file mode 100644
index 0000000..a966445
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/perl
@@ -0,0 +1,5 @@
+#!/usr/bin/env perl
+use warnings;
+print "a: ";
+my $a = "foo";
+print $a;
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/php b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/php
new file mode 100644
index 0000000..7ca7fe6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/php
@@ -0,0 +1,3 @@
+<?php
+  print("Hello {$world}");
+?>
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/plaintext b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/plaintext
new file mode 100644
index 0000000..60180f7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/plaintext
@@ -0,0 +1 @@
+plain text :)
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/powershell b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/powershell
new file mode 100644
index 0000000..a03a692
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/powershell
@@ -0,0 +1,49 @@
+Function Get-IPv4Scopes
+<#
+	.SYNOPSIS
+		Read IPv4Scopes from an array of servers
+	.PARAMETER Servers
+		Specifies an array of servers
+	.EXAMPLE
+		Get-IPv4Scopes
+        
+		Will prompt for all inputs
+#>
+{
+    [CmdletBinding()]
+    Param(
+    # 1
+    [parameter(
+        Mandatory=$true,
+        Position=0,
+        ValueFromPipelineByPropertyName=$true,
+        HelpMessage="Server List"
+        )]
+    [string[]]$Servers,
+    #2
+    [parameter(Mandatory=$false,ValueFromPipeline=$false)]
+    [bool]$Unique=$false
+    )  #EndParam
+
+    Begin {}
+
+    Process {
+        $arrayJobs=@()
+        foreach ($server in $Servers) {
+            $arrayJobs+=Invoke-Command -ComputerName $server -scriptblock {Get-DhcpServerv4Scope}  -AsJob
+        }
+        $complete=$false
+        while (-not $complete) {
+            $arrayJobsInProgress= $arrayJobs | Where-Object { $_.State -match 'running' }
+            if (-not $arrayJobsInProgress) { $complete=$true }
+        }
+        $Scopes=$arrayJobs|Receive-Job
+        $UniqueScopes=$Scopes|Sort-Object -Property ScopeId -Unique
+    }
+
+    End {
+        if ($Unique) { return $UniqueScopes }
+        else { return $Scopes }
+    }
+
+} #end function
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/praat b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/praat
new file mode 100644
index 0000000..f1af35b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/praat
@@ -0,0 +1,26 @@
+form Copy selected files...
+  word Prefix
+  word Suffix _copy
+  boolean Keep_original 1
+endform
+
+total_objects = numberOfSelected()
+for i to total_objects
+  my_object[i] = selected(i)
+endfor
+for i to total_objects
+  selectObject: my_object[i]
+  @copy()
+  new[i] = selected()
+endfor
+if total_objects
+  selectObject: new[1]
+  for i from 2 to total_objects
+    plusObject: new[i]
+  endfor
+endif
+
+procedure copy ()
+  .name$ = extractWord$(selected$(), " ")
+  Copy: prefix$ + .name$ + suffix$
+endproc
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/prolog b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/prolog
new file mode 100644
index 0000000..8430e6b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/prolog
@@ -0,0 +1,9 @@
+diff(plus(A,B), X, plus(DA, DB))
+   <= diff(A, X, DA) and diff(B, X, DB).
+
+diff(times(A,B), X, plus(times(A, DB), times(DA, B)))
+   <= diff(A, X, DA) and diff(B, X, DB).
+
+equal(X, X).
+diff(X, X, 1).
+diff(Y, X, 0) <= not equal(Y, X).
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/properties b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/properties
new file mode 100644
index 0000000..b5b717d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/properties
@@ -0,0 +1,7 @@
+# You are reading the ".properties" entry.
+! The exclamation mark can also mark text as comments.
+website = http\://en.wikipedia.org/
+language = English
+country : Poland
+continent=Europe
+key.with.dots=This is the value that could be looked up with the key "key.with.dots".
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/protobuf b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/protobuf
new file mode 100644
index 0000000..fdab9e9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/protobuf
@@ -0,0 +1,5 @@
+message Person {
+  required string name = 1;
+  required int32 id = 2;
+  optional string email = 3;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/puppet b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/puppet
new file mode 100644
index 0000000..621d9c9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/puppet
@@ -0,0 +1,6 @@
+service { 'ntp':
+  name      => $service_name,
+  ensure    => running,
+  enable    => true,
+  subscribe => File['ntp.conf'],
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/python b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/python
new file mode 100644
index 0000000..77a5cb3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/python
@@ -0,0 +1,6 @@
+def fib(n):    # write Fibonacci series up to n
+    """Print a Fibonacci series up to n."""
+    a, b = 0, 1
+    while a < n:
+        print a,
+        a, b = b, a+b
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/qml b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/qml
new file mode 100644
index 0000000..9aacda6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/qml
@@ -0,0 +1,9 @@
+import QtQuick 2.0
+Item {
+    width: 200
+    height: 100
+    MouseArea {
+        anchors.fill: parent
+        onClicked: Qt.quit()
+    }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/r b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/r
new file mode 100644
index 0000000..b6804b0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/r
@@ -0,0 +1,8 @@
+dbenford <- function(x){
+    log10(1 + 1/x)
+}
+
+pbenford <- function(q){
+    cumprobs <- cumsum(dbenford(1:9))
+    return(cumprobs[q])
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/racket b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/racket
new file mode 100644
index 0000000..bd99818
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/racket
@@ -0,0 +1,24 @@
+#lang racket
+
+;; draw a graph of cos and deriv^3(cos)
+(require plot)
+(define ((deriv f) x)
+  (/ (- (f x) (f (- x 0.001))) 0.001))
+(define (thrice f) (lambda (x) (f (f (f x)))))
+(plot (list (function ((thrice deriv) sin) -5 5)
+            (function cos -5 5 #:color 'blue)))
+
+;; Print the Greek alphabet
+(for ([i (in-range 25)])
+  (displayln
+   (integer->char
+    (+ i (char->integer #\u3B1)))))
+
+;; An echo server
+(define listener (tcp-listen 12345))
+(let echo-server ()
+  (define-values (in out) (tcp-accept listener))
+  (thread (λ ()
+             (copy-port in out)
+             (close-output-port out)))
+  (echo-server))
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ruby b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ruby
new file mode 100644
index 0000000..be609a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/ruby
@@ -0,0 +1,9 @@
+class Greeter
+  def initialize(name="World")
+    @name = name
+  end
+
+  def say_hi
+    puts "Hi #{@name}!"
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/rust b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/rust
new file mode 100644
index 0000000..b73b162
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/rust
@@ -0,0 +1,12 @@
+use core::*;
+
+fn main() {
+    for ["Alice", "Bob", "Carol"].each |&name| {
+        do task::spawn {
+            let v = rand::Rng().shuffle([1, 2, 3]);
+            for v.each |&num| {
+                io::print(fmt!("%s says: '%d'\n", name, num))
+            }
+        }
+    }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sass b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sass
new file mode 100644
index 0000000..1e768de
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sass
@@ -0,0 +1,3 @@
+@for $i from 1 through 3
+  .item-#{$i}
+    width: 2em * $i
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/scala b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/scala
new file mode 100644
index 0000000..75f19ee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/scala
@@ -0,0 +1,3 @@
+class Greeter(name: String = "World") {
+  def sayHi() { println("Hi " + name + "!") }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/scheme b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/scheme
new file mode 100644
index 0000000..c9c4dbd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/scheme
@@ -0,0 +1,4 @@
+(define Y
+  (lambda (m)
+    ((lambda (f) (m (lambda (a) ((f f) a))))
+     (lambda (f) (m (lambda (a) ((f f) a)))))))
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/scss b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/scss
new file mode 100644
index 0000000..3f259a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/scss
@@ -0,0 +1,5 @@
+@for $i from 1 through 3 {
+  .item-#{$i} {
+    width: 2em * $i;
+  }
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sed b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sed
new file mode 100644
index 0000000..4683cd3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sed
@@ -0,0 +1,4 @@
+/begin/,/end/ {
+  /begin/n # skip over the line that has "begin" on it
+  s/old/new/
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/shell b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/shell
new file mode 100644
index 0000000..f01fe48
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/shell
@@ -0,0 +1,2 @@
+# If not running interactively, don't do anything
+[[ -z "$PS1" ]] && return
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/shell_session b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/shell_session
new file mode 100644
index 0000000..d5cba67
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/shell_session
@@ -0,0 +1,10 @@
+$ ls /bin/bash
+/bin/bash
+$ sudo su -
+[sudo] password for sio4: 
+# ls /bin/bash
+/bin/bash
+# 
+# exit
+logout
+$ 
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/slim b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/slim
new file mode 100644
index 0000000..215a4e2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/slim
@@ -0,0 +1,17 @@
+doctype html
+html
+  body
+    h1 Markup examples   
+    #content
+      p 
+      | Slim can have #{ruby_code} interpolated!
+      /[if IE]
+        javascript:
+          alert('Slim supports embedded javascript!')
+
+      - unless items.empty?
+        table
+          - for item in items do
+            tr
+              td.name = item.name
+              td.price = item.price
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/smalltalk b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/smalltalk
new file mode 100644
index 0000000..af97161
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/smalltalk
@@ -0,0 +1,6 @@
+quadMultiply: i1 and: i2 
+    "This method multiplies the given numbers by each other
+    and the result by 4."
+    | mul |
+    mul := i1 * i2.
+    ^mul * 4
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/smarty b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/smarty
new file mode 100644
index 0000000..bb7f664
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/smarty
@@ -0,0 +1,12 @@
+{foo bar='single quotes' baz="double quotes" test3=$test3}
+
+<ul>
+  {foreach from=$myvariable item=data}
+    <li>{$data.field}</li>
+  {foreachelse}
+    <li>No Data</li>
+  {/foreach}
+</ul>
+
+<div class="{if $foo}class1{else}class2{/if}">{$foo.bar.baz}</div>
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sml b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sml
new file mode 100644
index 0000000..02a57d3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sml
@@ -0,0 +1,4 @@
+datatype shape
+   = Circle   of loc * real      (* center and radius *)
+   | Square   of loc * real      (* upper-left corner and side length; axis-aligned *)
+   | Triangle of loc * loc * loc (* corners *)
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sql b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sql
new file mode 100644
index 0000000..45a7a17
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/sql
@@ -0,0 +1 @@
+SELECT * FROM `users` WHERE `user`.`id` = 1
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/swift b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/swift
new file mode 100644
index 0000000..0c54ed2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/swift
@@ -0,0 +1,5 @@
+// Say hello to poeple
+func sayHello(personName: String) -> String {
+    let greeting = "Hello, " + personName + "!"
+    return greeting
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tap b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tap
new file mode 100644
index 0000000..1d9bf5a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tap
@@ -0,0 +1,5 @@
+ok 1 - Input file opened
+not ok 2 - First line of the input valid
+ok 3 - Read the rest of the file
+not ok 4 - Summarized correctly # TODO Not written yet
+1..4
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tcl b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tcl
new file mode 100644
index 0000000..9bbe87c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tcl
@@ -0,0 +1 @@
+proc cross_sum {s} {expr [join [split $s ""] +]}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tex b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tex
new file mode 100644
index 0000000..430510f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tex
@@ -0,0 +1 @@
+To write \LaTeX\ you would type \verb:\LaTeX:.
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/toml b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/toml
new file mode 100644
index 0000000..40c11c1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/toml
@@ -0,0 +1,9 @@
+# This is a TOML document. Boom.
+
+title = "TOML Example"
+
+[owner]
+name = "Tom Preston-Werner"
+organization = "GitHub"
+bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
+dob = 1979-05-27T07:32:00Z # First class dates? Why not?
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tulip b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tulip
new file mode 100644
index 0000000..1bb7355
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/tulip
@@ -0,0 +1,14 @@
+# ref.tlp
+@module ref
+
+ref value = Instance (spawn [! loop value ])
+
+loop value = receive [
+  .set new-value => loop new-value
+  p, .get => (send p value; loop value)
+]
+
+@module Instance pid [
+  set val = .set val > send pid
+  get! = .get > send-wait pid
+]
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/twig b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/twig
new file mode 100644
index 0000000..2e5e577
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/twig
@@ -0,0 +1,9 @@
+{% include 'header.html' %}
+
+{% for user in users %}
+  * {{ user.name }}
+{% else %}
+  No users have been found.
+{% endfor %}
+
+{% include 'footer.html' %}
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/typescript b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/typescript
new file mode 100644
index 0000000..134a70e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/typescript
@@ -0,0 +1 @@
+$(document).ready(function() { alert('ready!'); });
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/vb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/vb
new file mode 100644
index 0000000..f7e323d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/vb
@@ -0,0 +1,4 @@
+Private Sub Form_Load()
+    ' Execute a simple message box that says "Hello, World!"
+    MsgBox "Hello, World!"
+End Sub
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/verilog b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/verilog
new file mode 100644
index 0000000..7f752c6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/verilog
@@ -0,0 +1,27 @@
+/**
+ * Verilog Lexer
+ */
+module Foo(
+  input logic Clk_CI,
+  input logic Rst_RBI,
+  input logic A,
+  input logic B,
+  output logic C
+);
+  logic C_DN, C_DP;
+
+  assign C = C_DP;
+
+  always_comb begin : proc_next_state
+    C_DN = A + B;
+  end
+
+  // Clocked process
+  always_ff @(posedge Clk_CI, negedge Rst_RBI) begin
+    if(~Rst_RBI) begin
+      C_DP <= 1'b0;
+    end else begin
+      C_DP <= C_DN;
+    end
+  end
+endmodule
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/viml b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/viml
new file mode 100644
index 0000000..93a364b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/viml
@@ -0,0 +1,14 @@
+function! s:Make(dir, make, format, name) abort
+  let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd' : 'cd'
+  let cwd = getcwd()
+  let [mp, efm, cc] = [&l:mp, &l:efm, get(b:, 'current_compiler', '')]
+  try
+    execute cd fnameescape(dir)
+    let [&l:mp, &l:efm, b:current_compiler] = [a:make, a:format, a:compiler]
+    execute (exists(':Make') == 2 ? 'Make' : 'make')
+  finally
+    let [&l:mp, &l:efm, b:current_compiler] = [mp, efm, cc]
+    if empty(cc) | unlet! b:current_compiler | endif
+    execute cd fnameescape(cwd)
+  endtry
+endfunction
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/xml b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/xml
new file mode 100644
index 0000000..149844b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xsl:template match="/"></xsl:template>
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/yaml b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/yaml
new file mode 100644
index 0000000..2f622de
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/demos/yaml
@@ -0,0 +1,4 @@
+---
+one: Mark McGwire
+two: Sammy Sosa
+three: Ken Griffey
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatter.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatter.rb
new file mode 100644
index 0000000..646ae8d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatter.rb
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  # A Formatter takes a token stream and formats it for human viewing.
+  class Formatter
+    # @private
+    REGISTRY = {}
+
+    # Specify or get the unique tag for this formatter.  This is used
+    # for specifying a formatter in `rougify`.
+    def self.tag(tag=nil)
+      return @tag unless tag
+      REGISTRY[tag] = self
+
+      @tag = tag
+    end
+
+    # Find a formatter class given a unique tag.
+    def self.find(tag)
+      REGISTRY[tag]
+    end
+
+    # Format a token stream.  Delegates to {#format}.
+    def self.format(tokens, opts={}, &b)
+      new(opts).format(tokens, &b)
+    end
+
+    # Format a token stream.
+    def format(tokens, &b)
+      return stream(tokens, &b) if block_given?
+
+      out = ''
+      stream(tokens) { |piece| out << piece }
+
+      out
+    end
+
+    # @deprecated Use {#format} instead.
+    def render(tokens)
+      warn 'Formatter#render is deprecated, use #format instead.'
+      format(tokens)
+    end
+
+    # @abstract
+    # yield strings that, when concatenated, form the formatted output
+    def stream(tokens, &b)
+      raise 'abstract'
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatters/html.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatters/html.rb
new file mode 100644
index 0000000..cdc8a2d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatters/html.rb
@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*- #
+
+# stdlib
+require 'cgi'
+
+module Rouge
+  module Formatters
+    # Transforms a token stream into HTML output.
+    class HTML < Formatter
+      tag 'html'
+
+      # @option opts [String] :css_class ('highlight')
+      # @option opts [true/false] :line_numbers (false)
+      # @option opts [Rouge::CSSTheme] :inline_theme (nil)
+      # @option opts [true/false] :wrap (true)
+      #
+      # Initialize with options.
+      #
+      # If `:inline_theme` is given, then instead of rendering the
+      # tokens as <span> tags with CSS classes, the styles according to
+      # the given theme will be inlined in "style" attributes.  This is
+      # useful for formats in which stylesheets are not available.
+      #
+      # Content will be wrapped in a tag (`div` if tableized, `pre` if
+      # not) with the given `:css_class` unless `:wrap` is set to `false`.
+      def initialize(opts={})
+        @css_class = opts.fetch(:css_class, 'highlight')
+        @css_class = " class=#{@css_class.inspect}" if @css_class
+
+        @line_numbers = opts.fetch(:line_numbers, false)
+        @start_line = opts.fetch(:start_line, 1)
+        @inline_theme = opts.fetch(:inline_theme, nil)
+        @inline_theme = Theme.find(@inline_theme).new if @inline_theme.is_a? String
+
+        @wrap = opts.fetch(:wrap, true)
+      end
+
+      # @yield the html output.
+      def stream(tokens, &b)
+        if @line_numbers
+          stream_tableized(tokens, &b)
+        else
+          stream_untableized(tokens, &b)
+        end
+      end
+
+    private
+      def stream_untableized(tokens, &b)
+        yield "<pre#@css_class><code>" if @wrap
+        tokens.each{ |tok, val| span(tok, val, &b) }
+        yield "</code></pre>\n" if @wrap
+      end
+
+      def stream_tableized(tokens)
+        num_lines = 0
+        last_val = ''
+        formatted = ''
+
+        tokens.each do |tok, val|
+          last_val = val
+          num_lines += val.scan(/\n/).size
+          span(tok, val) { |str| formatted << str }
+        end
+
+        # add an extra line for non-newline-terminated strings
+        if last_val[-1] != "\n"
+          num_lines += 1
+          span(Token::Tokens::Text::Whitespace, "\n") { |str| formatted << str }
+        end
+
+        # generate a string of newline-separated line numbers for the gutter>
+        numbers = %<<pre class="lineno">#{(@start_line..num_lines+@start_line-1)
+          .to_a.join("\n")}</pre>>
+
+        yield "<div#@css_class>" if @wrap
+        yield '<table style="border-spacing: 0"><tbody><tr>'
+
+        # the "gl" class applies the style for Generic.Lineno
+        yield '<td class="gutter gl" style="text-align: right">'
+        yield numbers
+        yield '</td>'
+
+        yield '<td class="code">'
+        yield '<pre>'
+        yield formatted
+        yield '</pre>'
+        yield '</td>'
+
+        yield "</tr></tbody></table>\n"
+        yield "</div>\n" if @wrap
+      end
+
+      TABLE_FOR_ESCAPE_HTML = {
+        '&' => '&amp;',
+        '<' => '&lt;',
+        '>' => '&gt;',
+      }
+
+      def span(tok, val)
+        val = val.gsub(/[&<>]/, TABLE_FOR_ESCAPE_HTML)
+        shortname = tok.shortname or raise "unknown token: #{tok.inspect} for #{val.inspect}"
+
+        if shortname.empty?
+          yield val
+        else
+          if @inline_theme
+            rules = @inline_theme.style_for(tok).rendered_rules
+
+            yield "<span style=\"#{rules.to_a.join(';')}\">#{val}</span>"
+          else
+            yield "<span class=\"#{shortname}\">#{val}</span>"
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatters/null.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatters/null.rb
new file mode 100644
index 0000000..04f1ba0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatters/null.rb
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Formatters
+    # A formatter which renders nothing.
+    class Null < Formatter
+      tag 'null'
+
+      def initialize(*)
+      end
+
+      def stream(tokens, &b)
+        tokens.each do |tok, val|
+          yield "#{tok} #{val.inspect}\n"
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatters/terminal256.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatters/terminal256.rb
new file mode 100644
index 0000000..165120d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/formatters/terminal256.rb
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Formatters
+    # A formatter for 256-color terminals
+    class Terminal256 < Formatter
+      tag 'terminal256'
+
+      # @private
+      attr_reader :theme
+
+
+      # @option opts :theme
+      #   (default is thankful_eyes) the theme to render with.
+      def initialize(opts={})
+        @theme = opts[:theme] || 'thankful_eyes'
+        @theme = Theme.find(@theme) if @theme.is_a? String
+      end
+
+      def stream(tokens, &b)
+        tokens.each do |tok, val|
+          escape = escape_sequence(tok)
+          yield escape.style_string
+          yield val.gsub("\n", "\n#{escape.style_string}")
+          yield escape.reset_string
+        end
+      end
+
+      class EscapeSequence
+        attr_reader :style
+        def initialize(style)
+          @style = style
+        end
+
+        def self.xterm_colors
+          @xterm_colors ||= [].tap do |out|
+            # colors 0..15: 16 basic colors
+            out << [0x00, 0x00, 0x00] # 0
+            out << [0xcd, 0x00, 0x00] # 1
+            out << [0x00, 0xcd, 0x00] # 2
+            out << [0xcd, 0xcd, 0x00] # 3
+            out << [0x00, 0x00, 0xee] # 4
+            out << [0xcd, 0x00, 0xcd] # 5
+            out << [0x00, 0xcd, 0xcd] # 6
+            out << [0xe5, 0xe5, 0xe5] # 7
+            out << [0x7f, 0x7f, 0x7f] # 8
+            out << [0xff, 0x00, 0x00] # 9
+            out << [0x00, 0xff, 0x00] # 10
+            out << [0xff, 0xff, 0x00] # 11
+            out << [0x5c, 0x5c, 0xff] # 12
+            out << [0xff, 0x00, 0xff] # 13
+            out << [0x00, 0xff, 0xff] # 14
+            out << [0xff, 0xff, 0xff] # 15
+
+            # colors 16..232: the 6x6x6 color cube
+            valuerange = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]
+
+            217.times do |i|
+              r = valuerange[(i / 36) % 6]
+              g = valuerange[(i / 6) % 6]
+              b = valuerange[i % 6]
+              out << [r, g, b]
+            end
+
+            # colors 233..253: grayscale
+            1.upto 22 do |i|
+              v = 8 + i * 10
+              out << [v, v, v]
+            end
+          end
+        end
+
+        def fg
+          return @fg if instance_variable_defined? :@fg
+          @fg = style.fg && self.class.color_index(style.fg)
+        end
+
+        def bg
+          return @bg if instance_variable_defined? :@bg
+          @bg = style.bg && self.class.color_index(style.bg)
+        end
+
+        def style_string
+          @style_string ||= begin
+            attrs = []
+
+            attrs << ['38', '5', fg.to_s] if fg
+            attrs << ['48', '5', bg.to_s] if bg
+            attrs << '01' if style[:bold]
+            attrs << '04' if style[:italic] # underline, but hey, whatevs
+            escape(attrs)
+          end
+        end
+
+        def reset_string
+          @reset_string ||= begin
+            attrs = []
+            attrs << '39' if fg # fg reset
+            attrs << '49' if bg # bg reset
+            attrs << '00' if style[:bold] || style[:italic]
+
+            escape(attrs)
+          end
+        end
+
+      private
+        def escape(attrs)
+          return '' if attrs.empty?
+          "\e[#{attrs.join(';')}m"
+        end
+
+        def self.color_index(color)
+          @color_index_cache ||= {}
+          @color_index_cache[color] ||= closest_color(*get_rgb(color))
+        end
+
+        def self.get_rgb(color)
+          color = $1 if color =~ /#([0-9a-f]+)/i
+          hexes = case color.size
+          when 3
+            color.chars.map { |c| "#{c}#{c}" }
+          when 6
+            color.scan(/../)
+          else
+            raise "invalid color: #{color}"
+          end
+
+          hexes.map { |h| h.to_i(16) }
+        end
+
+        # max distance between two colors, #000000 to #ffffff
+        MAX_DISTANCE = 257 * 257 * 3
+
+        def self.closest_color(r, g, b)
+          @@colors_cache ||= {}
+          key = (r << 16) + (g << 8) + b
+          @@colors_cache.fetch(key) do
+            distance = MAX_DISTANCE
+
+            match = 0
+
+            xterm_colors.each_with_index do |(cr, cg, cb), i|
+              d = (r - cr)**2 + (g - cg)**2 + (b - cb)**2
+              next if d >= distance
+
+              match = i
+              distance = d
+            end
+
+            match
+          end
+        end
+      end
+
+    # private
+      def escape_sequence(token)
+        @escape_sequences ||= {}
+        @escape_sequences[token.qualname] ||=
+          EscapeSequence.new(get_style(token))
+      end
+
+      def get_style(token)
+        return text_style if token.ancestors.include? Token::Tokens::Text
+
+        theme.get_own_style(token) || text_style
+      end
+
+      def text_style
+        style = theme.get_style(Token['Text'])
+        # don't highlight text backgrounds
+        style.delete :bg
+        style
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guesser.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guesser.rb
new file mode 100644
index 0000000..a857a22
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guesser.rb
@@ -0,0 +1,46 @@
+module Rouge
+  class Guesser
+    def self.guess(guessers, lexers)
+      original_size = lexers.size
+
+      guessers.each do |g|
+        new_lexers = case g
+        when Guesser then g.filter(lexers)
+        when proc { |x| x.respond_to? :call } then g.call(lexers)
+        else raise "bad guesser: #{g}"
+        end
+
+        lexers = new_lexers && new_lexers.any? ? new_lexers : lexers
+      end
+
+      # if we haven't filtered the input at *all*,
+      # then we have no idea what language it is,
+      # so we bail and return [].
+      lexers.size < original_size ? lexers : []
+    end
+
+    def collect_best(lexers, opts={}, &scorer)
+      best = []
+      best_score = opts[:threshold]
+
+      lexers.each do |lexer|
+        score = scorer.call(lexer)
+
+        next if score.nil?
+
+        if best_score.nil? || score > best_score
+          best_score = score
+          best = [lexer]
+        elsif score == best_score
+          best << lexer
+        end
+      end
+
+      best
+    end
+
+    def filter(lexers)
+      raise 'abstract'
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/filename.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/filename.rb
new file mode 100644
index 0000000..f26bc04
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/filename.rb
@@ -0,0 +1,25 @@
+module Rouge
+  module Guessers
+    class Filename < Guesser
+      attr_reader :fname
+      def initialize(filename)
+        @filename = filename
+      end
+
+      # returns a list of lexers that match the given filename with
+      # equal specificity (i.e. number of wildcards in the pattern).
+      # This helps disambiguate between, e.g. the Nginx lexer, which
+      # matches `nginx.conf`, and the Conf lexer, which matches `*.conf`.
+      # In this case, nginx will win because the pattern has no wildcards,
+      # while `*.conf` has one.
+      def filter(lexers)
+        mapping = {}
+        lexers.each do |lexer|
+          mapping[lexer.name] = lexer.filenames || []
+        end
+
+        GlobMapping.new(mapping, @filename).filter(lexers)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/glob_mapping.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/glob_mapping.rb
new file mode 100644
index 0000000..431fa5d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/glob_mapping.rb
@@ -0,0 +1,46 @@
+module Rouge
+  module Guessers
+    # This class allows for custom behavior
+    # with glob -> lexer name mappings
+    class GlobMapping < Guesser
+      def self.by_pairs(mapping, filename)
+        glob_map = {}
+        mapping.each do |(glob, lexer_name)|
+          lexer = Lexer.find(lexer_name)
+
+          # ignore unknown lexers
+          next unless lexer
+
+          glob_map[lexer.name] ||= []
+          glob_map[lexer.name] << glob
+        end
+
+        new(glob_map, filename)
+      end
+
+      attr_reader :glob_map, :filename
+      def initialize(glob_map, filename)
+        @glob_map = glob_map
+        @filename = filename
+      end
+
+      def filter(lexers)
+        basename = File.basename(filename)
+
+        collect_best(lexers) do |lexer|
+          score = (@glob_map[lexer.name] || []).map do |pattern|
+            if test_pattern(pattern, basename)
+              # specificity is better the fewer wildcards there are
+              -pattern.scan(/[*?\[]/).size
+            end
+          end.compact.min
+        end
+      end
+
+      private
+      def test_pattern(pattern, path)
+        File.fnmatch?(pattern, path, File::FNM_DOTMATCH | File::FNM_CASEFOLD)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/mimetype.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/mimetype.rb
new file mode 100644
index 0000000..c5ef017
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/mimetype.rb
@@ -0,0 +1,14 @@
+module Rouge
+  module Guessers
+    class Mimetype < Guesser
+      attr_reader :mimetype
+      def initialize(mimetype)
+        @mimetype = mimetype
+      end
+
+      def filter(lexers)
+        lexers.select { |lexer| lexer.mimetypes.include? @mimetype }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/modeline.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/modeline.rb
new file mode 100644
index 0000000..ac08b5f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/modeline.rb
@@ -0,0 +1,42 @@
+module Rouge
+  module Guessers
+    class Modeline < Guesser
+      # [jneen] regexen stolen from linguist
+      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=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=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]
+
+      def initialize(source, opts={})
+        @source = source
+        @lines = opts[:lines] || 5
+      end
+
+      def filter(lexers)
+        # don't bother reading the stream if we've already decided
+        return lexers if lexers.size == 1
+
+        source_text = @source
+        source_text = source_text.read if source_text.respond_to? :read
+
+        lines = source_text.split(/\r?\n/)
+
+        search_space = (lines.first(@lines) + lines.last(@lines)).join("\n")
+
+        matches = MODELINES.map { |re| re.match(search_space) }.compact
+        match_set = Set.new(matches.map { |m| m[1] })
+
+        lexers.select { |l| (Set.new([l.tag] + l.aliases) & match_set).any? }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/source.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/source.rb
new file mode 100644
index 0000000..5ee3c08
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/guessers/source.rb
@@ -0,0 +1,39 @@
+module Rouge
+  module Guessers
+    class Source < Guesser
+      attr_reader :source
+      def initialize(source)
+        @source = source
+      end
+
+      def filter(lexers)
+        # don't bother reading the input if
+        # we've already filtered to 1
+        return lexers if lexers.size == 1
+
+        # If we're filtering against *all* lexers, we only use confident return
+        # values from analyze_text.  But if we've filtered down already, we can trust
+        # the analysis more.
+        threshold = lexers.size < 10 ? 0 : 0.5
+
+        source_text = case @source
+        when String
+          @source
+        when ->(s){ s.respond_to? :read }
+          @source.read
+        else
+          raise 'invalid source'
+        end
+
+        Lexer.assert_utf8!(source_text)
+
+        source_text = TextAnalyzer.new(source_text)
+
+        collect_best(lexers, threshold: threshold) do |lexer|
+          next unless lexer.methods(false).include? :analyze_text
+          lexer.analyze_text(source_text)
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexer.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexer.rb
new file mode 100644
index 0000000..e213b95
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexer.rb
@@ -0,0 +1,374 @@
+# -*- coding: utf-8 -*- #
+
+# stdlib
+require 'strscan'
+require 'cgi'
+require 'set'
+
+module Rouge
+  # @abstract
+  # A lexer transforms text into a stream of `[token, chunk]` pairs.
+  class Lexer
+    include Token::Tokens
+
+    class << self
+      # Lexes `stream` with the given options.  The lex is delegated to a
+      # new instance.
+      #
+      # @see #lex
+      def lex(stream, opts={}, &b)
+        new(opts).lex(stream, &b)
+      end
+
+      def default_options(o={})
+        @default_options ||= {}
+        @default_options.merge!(o)
+        @default_options
+      end
+
+      # Given a string, return the correct lexer class.
+      def find(name)
+        registry[name.to_s]
+      end
+
+      # Find a lexer, with fancy shiny features.
+      #
+      # * The string you pass can include CGI-style options
+      #
+      #     Lexer.find_fancy('erb?parent=tex')
+      #
+      # * You can pass the special name 'guess' so we guess for you,
+      #   and you can pass a second argument of the code to guess by
+      #
+      #     Lexer.find_fancy('guess', "#!/bin/bash\necho Hello, world")
+      #
+      # This is used in the Redcarpet plugin as well as Rouge's own
+      # markdown lexer for highlighting internal code blocks.
+      #
+      def find_fancy(str, code=nil)
+        name, opts = str ? str.split('?', 2) : [nil, '']
+
+        # parse the options hash from a cgi-style string
+        opts = CGI.parse(opts || '').map do |k, vals|
+          [ k.to_sym, vals.empty? ? true : vals[0] ]
+        end
+
+        opts = Hash[opts]
+
+        lexer_class = case name
+        when 'guess', nil
+          self.guess(:source => code, :mimetype => opts[:mimetype])
+        when String
+          self.find(name)
+        end
+
+        lexer_class && lexer_class.new(opts)
+      end
+
+      # Specify or get this lexer's title. Meant to be human-readable.
+      def title(t=nil)
+        if t.nil?
+          t = tag.capitalize
+        end
+        @title ||= t
+      end
+
+      # Specify or get this lexer's description.
+      def desc(arg=:absent)
+        if arg == :absent
+          @desc
+        else
+          @desc = arg
+        end
+      end
+
+      # Specify or get the path name containing a small demo for
+      # this lexer (can be overriden by {demo}).
+      def demo_file(arg=:absent)
+        return @demo_file = Pathname.new(arg) unless arg == :absent
+
+        @demo_file = Pathname.new(__FILE__).dirname.join('demos', tag)
+      end
+
+      # Specify or get a small demo string for this lexer
+      def demo(arg=:absent)
+        return @demo = arg unless arg == :absent
+
+        @demo = File.read(demo_file, encoding: 'utf-8')
+      end
+
+      # @return a list of all lexers.
+      def all
+        registry.values.uniq
+      end
+
+      # Guess which lexer to use based on a hash of info.
+      #
+      # This accepts the same arguments as Lexer.guess, but will never throw
+      # an error.  It will return a (possibly empty) list of potential lexers
+      # to use.
+      def guesses(info={})
+        mimetype, filename, source = info.values_at(:mimetype, :filename, :source)
+        custom_globs = info[:custom_globs]
+
+        guessers = (info[:guessers] || []).dup
+
+        guessers << Guessers::Mimetype.new(mimetype) if mimetype
+        guessers << Guessers::GlobMapping.by_pairs(custom_globs, filename) if custom_globs && filename
+        guessers << Guessers::Filename.new(filename) if filename
+        guessers << Guessers::Modeline.new(source) if source
+        guessers << Guessers::Source.new(source) if source
+
+        Guesser.guess(guessers, Lexer.all)
+      end
+
+      class AmbiguousGuess < StandardError
+        attr_reader :alternatives
+        def initialize(alternatives); @alternatives = alternatives; end
+
+        def message
+          "Ambiguous guess: can't decide between #{alternatives.map(&:tag).inspect}"
+        end
+      end
+
+      # Guess which lexer to use based on a hash of info.
+      #
+      # @option info :mimetype
+      #   A mimetype to guess by
+      # @option info :filename
+      #   A filename to guess by
+      # @option info :source
+      #   The source itself, which, if guessing by mimetype or filename
+      #   fails, will be searched for shebangs, <!DOCTYPE ...> tags, and
+      #   other hints.
+      #
+      # @see Lexer.analyze_text
+      # @see Lexer.guesses
+      def guess(info={})
+        lexers = guesses(info)
+
+        return Lexers::PlainText if lexers.empty?
+        return lexers[0] if lexers.size == 1
+
+        raise AmbiguousGuess.new(lexers)
+      end
+
+      def guess_by_mimetype(mt)
+        guess :mimetype => mt
+      end
+
+      def guess_by_filename(fname)
+        guess :filename => fname
+      end
+
+      def guess_by_source(source)
+        guess :source => source
+      end
+
+    private
+
+    protected
+      # @private
+      def register(name, lexer)
+        registry[name.to_s] = lexer
+      end
+
+    public
+      # Used to specify or get the canonical name of this lexer class.
+      #
+      # @example
+      #   class MyLexer < Lexer
+      #     tag 'foo'
+      #   end
+      #
+      #   MyLexer.tag # => 'foo'
+      #
+      #   Lexer.find('foo') # => MyLexer
+      def tag(t=nil)
+        return @tag if t.nil?
+
+        @tag = t.to_s
+        Lexer.register(@tag, self)
+      end
+
+      # Used to specify alternate names this lexer class may be found by.
+      #
+      # @example
+      #   class Erb < Lexer
+      #     tag 'erb'
+      #     aliases 'eruby', 'rhtml'
+      #   end
+      #
+      #   Lexer.find('eruby') # => Erb
+      def aliases(*args)
+        args.map!(&:to_s)
+        args.each { |arg| Lexer.register(arg, self) }
+        (@aliases ||= []).concat(args)
+      end
+
+      # Specify a list of filename globs associated with this lexer.
+      #
+      # @example
+      #   class Ruby < Lexer
+      #     filenames '*.rb', '*.ruby', 'Gemfile', 'Rakefile'
+      #   end
+      def filenames(*fnames)
+        (@filenames ||= []).concat(fnames)
+      end
+
+      # Specify a list of mimetypes associated with this lexer.
+      #
+      # @example
+      #   class Html < Lexer
+      #     mimetypes 'text/html', 'application/xhtml+xml'
+      #   end
+      def mimetypes(*mts)
+        (@mimetypes ||= []).concat(mts)
+      end
+
+      # @private
+      def assert_utf8!(str)
+        return if %w(US-ASCII UTF-8 ASCII-8BIT).include? str.encoding.name
+        raise EncodingError.new(
+          "Bad encoding: #{str.encoding.names.join(',')}. " +
+          "Please convert your string to UTF-8."
+        )
+      end
+
+    private
+      def registry
+        @registry ||= {}
+      end
+    end
+
+    # -*- instance methods -*- #
+
+    # Create a new lexer with the given options.  Individual lexers may
+    # specify extra options.  The only current globally accepted option
+    # is `:debug`.
+    #
+    # @option opts :debug
+    #   Prints debug information to stdout.  The particular info depends
+    #   on the lexer in question.  In regex lexers, this will log the
+    #   state stack at the beginning of each step, along with each regex
+    #   tried and each stream consumed.  Try it, it's pretty useful.
+    def initialize(opts={})
+      options(opts)
+
+      @debug = option(:debug)
+    end
+
+    # get and/or specify the options for this lexer.
+    def options(o={})
+      (@options ||= {}).merge!(o)
+
+      self.class.default_options.merge(@options)
+    end
+
+    # get or specify one option for this lexer
+    def option(k, v=:absent)
+      if v == :absent
+        options[k]
+      else
+        options({ k => v })
+      end
+    end
+
+    # @deprecated
+    # Instead of `debug { "foo" }`, simply `puts "foo" if @debug`.
+    #
+    # Leave a debug message if the `:debug` option is set.  The message
+    # is given as a block because some debug messages contain calculated
+    # information that is unnecessary for lexing in the real world.
+    #
+    # Calls to this method should be guarded with "if @debug" for best
+    # performance when debugging is turned off.
+    #
+    # @example
+    #   debug { "hello, world!" } if @debug
+    def debug
+      warn "Lexer#debug is deprecated.  Simply puts if @debug instead."
+      puts yield if @debug
+    end
+
+    # @abstract
+    #
+    # Called after each lex is finished.  The default implementation
+    # is a noop.
+    def reset!
+    end
+
+    # Given a string, yield [token, chunk] pairs.  If no block is given,
+    # an enumerator is returned.
+    #
+    # @option opts :continue
+    #   Continue the lex from the previous state (i.e. don't call #reset!)
+    def lex(string, opts={}, &b)
+      return enum_for(:lex, string, opts) unless block_given?
+
+      Lexer.assert_utf8!(string)
+
+      reset! unless opts[:continue]
+
+      # consolidate consecutive tokens of the same type
+      last_token = nil
+      last_val = nil
+      stream_tokens(string) do |tok, val|
+        next if val.empty?
+
+        if tok == last_token
+          last_val << val
+          next
+        end
+
+        b.call(last_token, last_val) if last_token
+        last_token = tok
+        last_val = val
+      end
+
+      b.call(last_token, last_val) if last_token
+    end
+
+    # delegated to {Lexer.tag}
+    def tag
+      self.class.tag
+    end
+
+    # @abstract
+    #
+    # Yield `[token, chunk]` pairs, given a prepared input stream.  This
+    # must be implemented.
+    #
+    # @param [StringScanner] stream
+    #   the stream
+    def stream_tokens(stream, &b)
+      raise 'abstract'
+    end
+
+    # @abstract
+    #
+    # Return a number between 0 and 1 indicating the likelihood that
+    # the text given should be lexed with this lexer.  The default
+    # implementation returns 0.  Values under 0.5 will only be used
+    # to disambiguate filename or mimetype matches.
+    #
+    # @param [TextAnalyzer] text
+    #   the text to be analyzed, with a couple of handy methods on it,
+    #   like {TextAnalyzer#shebang?} and {TextAnalyzer#doctype?}
+    def self.analyze_text(text)
+      0
+    end
+  end
+
+  module Lexers
+    @_loaded_lexers = {}
+
+    def self.load_lexer(relpath)
+      return if @_loaded_lexers.key?(relpath)
+      @_loaded_lexers[relpath] = true
+
+      root = Pathname.new(__FILE__).dirname.join('lexers')
+      load root.join(relpath)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/actionscript.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/actionscript.rb
new file mode 100644
index 0000000..84d5ac8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/actionscript.rb
@@ -0,0 +1,195 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Actionscript < RegexLexer
+      title "ActionScript"
+      desc "ActionScript"
+
+      tag 'actionscript'
+      aliases 'as', 'as3'
+      filenames '*.as'
+      mimetypes 'application/x-actionscript'
+
+      state :comments_and_whitespace do
+        rule /\s+/, Text
+        rule %r(//.*?$), Comment::Single
+        rule %r(/\*.*?\*/)m, Comment::Multiline
+      end
+
+      state :expr_start do
+        mixin :comments_and_whitespace
+
+        rule %r(/) do
+          token Str::Regex
+          goto :regex
+        end
+
+        rule /[{]/, Punctuation, :object
+
+        rule //, Text, :pop!
+      end
+
+      state :regex do
+        rule %r(/) do
+          token Str::Regex
+          goto :regex_end
+        end
+
+        rule %r([^/]\n), Error, :pop!
+
+        rule /\n/, Error, :pop!
+        rule /\[\^/, Str::Escape, :regex_group
+        rule /\[/, Str::Escape, :regex_group
+        rule /\\./, Str::Escape
+        rule %r{[(][?][:=<!]}, Str::Escape
+        rule /[{][\d,]+[}]/, Str::Escape
+        rule /[()?]/, Str::Escape
+        rule /./, Str::Regex
+      end
+
+      state :regex_end do
+        rule /[gim]+/, Str::Regex, :pop!
+        rule(//) { pop! }
+      end
+
+      state :regex_group do
+        # specially highlight / in a group to indicate that it doesn't
+        # close the regex
+        rule /\//, Str::Escape
+
+        rule %r([^/]\n) do
+          token Error
+          pop! 2
+        end
+
+        rule /\]/, Str::Escape, :pop!
+        rule /\\./, Str::Escape
+        rule /./, Str::Regex
+      end
+
+      state :bad_regex do
+        rule /[^\n]+/, Error, :pop!
+      end
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          for in while do break return continue switch case default
+          if else throw try catch finally new delete typeof is
+          this with
+        )
+      end
+
+      def self.declarations
+        @declarations ||= Set.new %w(var with function)
+      end
+
+      def self.reserved
+        @reserved ||= Set.new %w(
+          dynamic final internal native public protected private class const
+          override static package interface extends implements namespace
+          set get import include super flash_proxy object_proxy trace
+        )
+      end
+
+      def self.constants
+        @constants ||= Set.new %w(true false null NaN Infinity undefined)
+      end
+
+      def self.builtins
+        @builtins ||= %w(
+          void Function Math Class
+          Object RegExp decodeURI
+          decodeURIComponent encodeURI encodeURIComponent
+          eval isFinite isNaN parseFloat parseInt this
+        )
+      end
+
+      id = /[$a-zA-Z_][a-zA-Z0-9_]*/
+
+      state :root do
+        rule /\A\s*#!.*?\n/m, Comment::Preproc, :statement
+        rule /\n/, Text, :statement
+        rule %r((?<=\n)(?=\s|/|<!--)), Text, :expr_start
+        mixin :comments_and_whitespace
+        rule %r(\+\+ | -- | ~ | && | \|\| | \\(?=\n) | << | >>>? | ===
+               | !== )x,
+          Operator, :expr_start
+        rule %r([:-<>+*%&|\^/!=]=?), Operator, :expr_start
+        rule /[(\[,]/, Punctuation, :expr_start
+        rule /;/, Punctuation, :statement
+        rule /[)\].]/, Punctuation
+
+        rule /[?]/ do
+          token Punctuation
+          push :ternary
+          push :expr_start
+        end
+
+        rule /[{}]/, Punctuation, :statement
+
+        rule id do |m|
+          if self.class.keywords.include? m[0]
+            token Keyword
+            push :expr_start
+          elsif self.class.declarations.include? m[0]
+            token Keyword::Declaration
+            push :expr_start
+          elsif self.class.reserved.include? m[0]
+            token Keyword::Reserved
+          elsif self.class.constants.include? m[0]
+            token Keyword::Constant
+          elsif self.class.builtins.include? m[0]
+            token Name::Builtin
+          else
+            token Name::Other
+          end
+        end
+
+        rule /\-[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, Num::Float
+        rule /0x[0-9a-fA-F]+/, Num::Hex
+        rule /\-[0-9]+/, Num::Integer
+        rule /"(\\\\|\\"|[^"])*"/, Str::Double
+        rule /'(\\\\|\\'|[^'])*'/, Str::Single
+      end
+
+      # braced parts that aren't object literals
+      state :statement do
+        rule /(#{id})(\s*)(:)/ do
+          groups Name::Label, Text, Punctuation
+        end
+
+        rule /[{}]/, Punctuation
+
+        mixin :expr_start
+      end
+
+      # object literals
+      state :object do
+        mixin :comments_and_whitespace
+        rule /[}]/ do
+          token Punctuation
+          goto :statement
+        end
+
+        rule /(#{id})(\s*)(:)/ do
+          groups Name::Attribute, Text, Punctuation
+          push :expr_start
+        end
+
+        rule /:/, Punctuation
+        mixin :root
+      end
+
+      # ternary expressions, where <id>: is not a label!
+      state :ternary do
+        rule /:/ do
+          token Punctuation
+          goto :expr_start
+        end
+
+        mixin :root
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apache.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apache.rb
new file mode 100644
index 0000000..e68eb94
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apache.rb
@@ -0,0 +1,71 @@
+require 'yaml'
+
+module Rouge
+  module Lexers
+    class Apache < RegexLexer
+      title "Apache"
+      desc 'configuration files for Apache web server'
+      tag 'apache'
+      mimetypes 'text/x-httpd-conf', 'text/x-apache-conf'
+      filenames '.htaccess', 'httpd.conf'
+
+      class << self
+        attr_reader :keywords
+      end
+      # Load Apache keywords from separate YML file
+      @keywords = ::YAML.load(File.open(Pathname.new(__FILE__).dirname.join('apache/keywords.yml'))).tap do |h|
+        h.each do |k,v|
+          h[k] = Set.new v
+        end
+      end
+
+      def name_for_token(token, kwtype, tktype)
+        if self.class.keywords[kwtype].include? token
+          tktype
+        else
+          Text
+        end
+      end
+
+      state :whitespace do
+        rule /\#.*/, Comment
+        rule /\s+/m, Text
+      end
+
+      state :root do
+        mixin :whitespace
+
+        rule /(<\/?)(\w+)/ do |m|
+          groups Punctuation, name_for_token(m[2].downcase, :sections, Name::Label)
+          push :section
+        end
+
+        rule /\w+/ do |m|
+          token name_for_token(m[0].downcase, :directives, Name::Class)
+          push :directive
+        end
+      end
+
+      state :section do
+        # Match section arguments
+        rule /([^>]+)?(>(?:\r\n?|\n)?)/ do |m|
+          groups Literal::String::Regex, Punctuation
+          pop!
+        end
+
+        mixin :whitespace
+      end
+
+      state :directive do
+        # Match value literals and other directive arguments
+        rule /\r\n?|\n/, Text, :pop!
+
+        mixin :whitespace
+
+        rule /\S+/ do |m|
+          token name_for_token(m[0], :values, Literal::String::Symbol)
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apache/keywords.yml b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apache/keywords.yml
new file mode 100644
index 0000000..6b415d8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apache/keywords.yml
@@ -0,0 +1,764 @@
+:sections:
+  - "directory"
+  - "directorymatch"
+  - "files"
+  - "filesmatch"
+  - "ifdefine"
+  - "ifmodule"
+  - "limit"
+  - "limitexcept"
+  - "location"
+  - "locationmatch"
+  - "proxy"
+  - "proxymatch"
+  - "virtualhost"
+
+:directives:
+  - "acceptfilter"
+  - "acceptmutex"
+  - "acceptpathinfo"
+  - "accessconfig"
+  - "accessfilename"
+  - "action"
+  - "addalt"
+  - "addaltbyencoding"
+  - "addaltbytype"
+  - "addcharset"
+  - "adddefaultcharset"
+  - "adddescription"
+  - "addencoding"
+  - "addhandler"
+  - "addicon"
+  - "addiconbyencoding"
+  - "addiconbytype"
+  - "addinputfilter"
+  - "addlanguage"
+  - "addmodule"
+  - "addmoduleinfo"
+  - "addoutputfilter"
+  - "addoutputfilterbytype"
+  - "addtype"
+  - "agentlog"
+  - "alias"
+  - "aliasmatch"
+  - "allow"
+  - "allowconnect"
+  - "allowencodedslashes"
+  - "allowmethods"
+  - "allowoverride"
+  - "allowoverridelist"
+  - "anonymous"
+  - "anonymous_authoritative"
+  - "anonymous_logemail"
+  - "anonymous_mustgiveemail"
+  - "anonymous_nouserid"
+  - "anonymous_verifyemail"
+  - "assignuserid"
+  - "authauthoritative"
+  - "authdbauthoritative"
+  - "authdbgroupfile"
+  - "authdbmauthoritative"
+  - "asyncrequestworkerfactor"
+  - "authbasicauthoritative"
+  - "authbasicfake"
+  - "authbasicprovider"
+  - "authbasicusedigestalgorithm"
+  - "authdbduserpwquery"
+  - "authdbduserrealmquery"
+  - "authdbmgroupfile"
+  - "authdbmtype"
+  - "authdbmuserfile"
+  - "authdbuserfile"
+  - "authdigestalgorithm"
+  - "authdigestdomain"
+  - "authdigestfile"
+  - "authdigestgroupfile"
+  - "authdigestnccheck"
+  - "authdigestnonceformat"
+  - "authdigestnoncelifetime"
+  - "authdigestprovider"
+  - "authdigestqop"
+  - "authdigestshmemsize"
+  - "authformauthoritative"
+  - "authformbody"
+  - "authformdisablenostore"
+  - "authformfakebasicauth"
+  - "authformlocation"
+  - "authformloginrequiredlocation"
+  - "authformloginsuccesslocation"
+  - "authformlogoutlocation"
+  - "authformmethod"
+  - "authformmimetype"
+  - "authformpassword"
+  - "authformprovider"
+  - "authformsitepassphrase"
+  - "authformsize"
+  - "authformusername"
+  - "authgroupfile"
+  - "authldapauthoritative"
+  - "authldapauthorizeprefix"
+  - "authldapbindauthoritative"
+  - "authldapbinddn"
+  - "authldapbindpassword"
+  - "authldapcharsetconfig"
+  - "authldapcompareasuser"
+  - "authldapcomparednonserver"
+  - "authldapdereferencealiases"
+  - "authldapenabled"
+  - "authldapfrontpagehack"
+  - "authldapgroupattribute"
+  - "authldapgroupattributeisdn"
+  - "authldapinitialbindasuser"
+  - "authldapinitialbindpattern"
+  - "authldapmaxsubgroupdepth"
+  - "authldapremoteuserattribute"
+  - "authldapremoteuserisdn"
+  - "authldapsearchasuser"
+  - "authldapsubgroupattribute"
+  - "authldapsubgroupclass"
+  - "authldapurl"
+  - "authmerging"
+  - "authname"
+  - "authncachecontext"
+  - "authncacheenable"
+  - "authncacheprovidefor"
+  - "authncachesocache"
+  - "authncachetimeout"
+  - "authnzfcgicheckauthnprovider"
+  - "authnzfcgidefineprovider"
+  - "authtype"
+  - "authuserfile"
+  - "authzdbdlogintoreferer"
+  - "authzdbdquery"
+  - "authzdbdredirectquery"
+  - "authzdbmtype"
+  - "authzsendforbiddenonfailure"
+  - "balancergrowth"
+  - "balancerinherit"
+  - "balancermember"
+  - "balancerpersist"
+  - "bindaddress"
+  - "browsermatch"
+  - "browsermatchnocase"
+  - "bs2000account"
+  - "bufferedlogs"
+  - "buffersize"
+  - "cachedefaultexpire"
+  - "cachedetailheader"
+  - "cachedirlength"
+  - "cachedirlevels"
+  - "cachedisable"
+  - "cacheenable"
+  - "cacheexpirycheck"
+  - "cachefile"
+  - "cacheforcecompletion"
+  - "cachegcclean"
+  - "cachegcdaily"
+  - "cachegcinterval"
+  - "cachegcmemusage"
+  - "cachegcunused"
+  - "cacheheader"
+  - "cacheignorecachecontrol"
+  - "cacheignoreheaders"
+  - "cacheignorenolastmod"
+  - "cacheignorequerystring"
+  - "cacheignoreurlsessionidentifiers"
+  - "cachekeybaseurl"
+  - "cachelastmodifiedfactor"
+  - "cachelock"
+  - "cachelockmaxage"
+  - "cachelockpath"
+  - "cachemaxexpire"
+  - "cachemaxfilesize"
+  - "cacheminexpire"
+  - "cacheminfilesize"
+  - "cachenegotiateddocs"
+  - "cachequickhandler"
+  - "cachereadsize"
+  - "cachereadtime"
+  - "cacheroot"
+  - "cachesize"
+  - "cachetimemargin"
+  - "cachesocache"
+  - "cachesocachemaxsize"
+  - "cachesocachemaxtime"
+  - "cachesocachemintime"
+  - "cachesocachereadsize"
+  - "cachesocachereadtime"
+  - "cachestaleonerror"
+  - "cachestoreexpired"
+  - "cachestorenostore"
+  - "cachestoreprivate"
+  - "cgidscripttimeout"
+  - "cgimapextension"
+  - "cgipassauth"
+  - "charsetdefault"
+  - "charsetoptions"
+  - "charsetsourceenc"
+  - "checkcaseonly"
+  - "checkspelling"
+  - "childperuserid"
+  - "clearmodulelist"
+  - "chrootdir"
+  - "contentdigest"
+  - "cookiedomain"
+  - "cookieexpires"
+  - "cookielog"
+  - "cookiename"
+  - "cookiestyle"
+  - "cookietracking"
+  - "coredumpdirectory"
+  - "customlog"
+  - "dav"
+  - "davdepthinfinity"
+  - "davgenericlockdb"
+  - "davlockdb"
+  - "davmintimeout"
+  - "dbdexptime"
+  - "dbdinitsql"
+  - "dbdkeep"
+  - "dbdmax"
+  - "dbdmin"
+  - "dbdparams"
+  - "dbdpersist"
+  - "dbdpreparesql"
+  - "dbdriver"
+  - "defaulticon"
+  - "defaultlanguage"
+  - "defaultmode"
+  - "defaultruntimedir"
+  - "defaulttype"
+  - "define"
+  - "deflatebuffersize"
+  - "deflatecompressionlevel"
+  - "deflatefilternote"
+  - "deflateinflatelimitrequestbody"
+  - "deflateinflateratioburst"
+  - "deflateinflateratiolimit"
+  - "deflatememlevel"
+  - "deflatewindowsize"
+  - "deny"
+  - "directorycheckhandler"
+  - "directoryindex"
+  - "directoryindexredirect"
+  - "directoryslash"
+  - "doctitle"
+  - "doctrailer"
+  - "documentroot"
+  - "dtraceprivileges"
+  - "dumpioinput"
+  - "dumpiooutput"
+  - "enableexceptionhook"
+  - "enablemmap"
+  - "enablesendfile"
+  - "error"
+  - "errordocument"
+  - "errorlog"
+  - "errorlogformat"
+  - "example"
+  - "expiresactive"
+  - "expiresbytype"
+  - "expiresdefault"
+  - "extendedstatus"
+  - "extfilterdefine"
+  - "extfilteroptions"
+  - "fallbackresource"
+  - "fancyindexing"
+  - "fileetag"
+  - "filterchain"
+  - "filterdeclare"
+  - "filterprotocol"
+  - "filterprovider"
+  - "filtertrace"
+  - "forcelanguagepriority"
+  - "forcetype"
+  - "forensiclog"
+  - "globallog"
+  - "gprofdir"
+  - "gracefulshutdowntimeout"
+  - "group"
+  - "h2direct"
+  - "h2keepalivetimeout"
+  - "h2maxsessionstreams"
+  - "h2maxworkeridleseconds"
+  - "h2maxworkers"
+  - "h2minworkers"
+  - "h2moderntlsonly"
+  - "h2push"
+  - "h2pushdiarysize"
+  - "h2pushpriority"
+  - "h2serializeheaders"
+  - "h2sessionextrafiles"
+  - "h2streammaxmemsize"
+  - "h2streamtimeout"
+  - "h2timeout"
+  - "h2tlscooldownsecs"
+  - "h2tlswarmupsize"
+  - "h2upgrade"
+  - "h2windowsize"
+  - "header"
+  - "headername"
+  - "headprefix"
+  - "headsuffix"
+  - "hidesys"
+  - "hideurl"
+  - "heartbeataddress"
+  - "heartbeatlisten"
+  - "heartbeatmaxservers"
+  - "heartbeatstorage"
+  - "heartbeatstorage"
+  - "hostnamelookups"
+  - "htmldir"
+  - "httplogfile"
+  - "identitycheck"
+  - "identitychecktimeout"
+  - "imapbase"
+  - "imapdefault"
+  - "imapmenu"
+  - "include"
+  - "includeoptional"
+  - "indexheadinsert"
+  - "indexignore"
+  - "indexignorereset"
+  - "indexoptions"
+  - "indexorderdefault"
+  - "indexstylesheet"
+  - "inputsed"
+  - "isapiappendlogtoerrors"
+  - "isapiappendlogtoquery"
+  - "isapicachefile"
+  - "isapifakeasync"
+  - "isapilognotsupported"
+  - "isapireadaheadbuffer"
+  - "keepalive"
+  - "keepalivetimeout"
+  - "keptbodysize"
+  - "languagepriority"
+  - "lasturls"
+  - "ldapcacheentries"
+  - "ldapcachettl"
+  - "ldapconnectionpoolttl"
+  - "ldapconnectiontimeout"
+  - "ldaplibrarydebug"
+  - "ldapopcacheentries"
+  - "ldapopcachettl"
+  - "ldapreferralhoplimit"
+  - "ldapreferrals"
+  - "ldapretries"
+  - "ldapretrydelay"
+  - "ldapsharedcachefile"
+  - "ldapsharedcachesize"
+  - "ldaptimeout"
+  - "ldaptrustedca"
+  - "ldaptrustedcatype"
+  - "ldaptrustedclientcert"
+  - "ldaptrustedglobalcert"
+  - "ldaptrustedmode"
+  - "ldapverifyservercert"
+  - "limitinternalrecursion"
+  - "limitrequestbody"
+  - "limitrequestfields"
+  - "limitrequestfieldsize"
+  - "limitrequestline"
+  - "limitxmlrequestbody"
+  - "listen"
+  - "listenbacklog"
+  - "listencoresbucketsratio"
+  - "loadfile"
+  - "loadmodule"
+  - "lockfile"
+  - "logformat"
+  - "logiotrackttfb"
+  - "loglevel"
+  - "logmessage"
+  - "luaauthzprovider"
+  - "luacodecache"
+  - "luahookaccesschecker"
+  - "luahookauthchecker"
+  - "luahookcheckuserid"
+  - "luahookfixups"
+  - "luahookinsertfilter"
+  - "luahooklog"
+  - "luahookmaptostorage"
+  - "luahooktranslatename"
+  - "luahooktypechecker"
+  - "luainherit"
+  - "luainputfilter"
+  - "luamaphandler"
+  - "luaoutputfilter"
+  - "luapackagecpath"
+  - "luapackagepath"
+  - "luaquickhandler"
+  - "luaroot"
+  - "luascope"
+  - "maxclients"
+  - "maxconnectionsperchild"
+  - "maxkeepaliverequests"
+  - "maxmemfree"
+  - "maxrequestsperchild"
+  - "maxrequestsperthread"
+  - "maxrangeoverlaps"
+  - "maxrangereversals"
+  - "maxranges"
+  - "maxrequestworkers"
+  - "maxspareservers"
+  - "maxsparethreads"
+  - "maxthreads"
+  - "maxthreadsperchild"
+  - "mcachemaxobjectcount"
+  - "mcachemaxobjectsize"
+  - "mcachemaxstreamingbuffer"
+  - "mcacheminobjectsize"
+  - "mcacheremovalalgorithm"
+  - "mcachesize"
+  - "memcacheconnttl"
+  - "mergetrailers"
+  - "metadir"
+  - "metafiles"
+  - "metasuffix"
+  - "mimemagicfile"
+  - "minspareservers"
+  - "minsparethreads"
+  - "mmapfile"
+  - "modemstandard"
+  - "modmimeusepathinfo"
+  - "multiviewsmatch"
+  - "mutex"
+  - "namevirtualhost"
+  - "nocache"
+  - "noproxy"
+  - "numservers"
+  - "nwssltrustedcerts"
+  - "nwsslupgradeable"
+  - "options"
+  - "order"
+  - "outputsed"
+  - "passenv"
+  - "pidfile"
+  - "port"
+  - "privatedir"
+  - "privilegesmode"
+  - "protocol"
+  - "protocolecho"
+  - "protocols"
+  - "protocolshonororder"
+  - "proxyaddheaders"
+  - "proxybadheader"
+  - "proxyblock"
+  - "proxydomain"
+  - "proxyerroroverride"
+  - "proxyexpressdbmfile"
+  - "proxyexpressdbmtype"
+  - "proxyexpressenable"
+  - "proxyftpdircharset"
+  - "proxyftpescapewildcards"
+  - "proxyftplistonwildcard"
+  - "proxyhtmlbufsize"
+  - "proxyhtmlcharsetout"
+  - "proxyhtmldoctype"
+  - "proxyhtmlenable"
+  - "proxyhtmlevents"
+  - "proxyhtmlextended"
+  - "proxyhtmlfixups"
+  - "proxyhtmlinterp"
+  - "proxyhtmllinks"
+  - "proxyhtmlmeta"
+  - "proxyhtmlstripcomments"
+  - "proxyhtmlurlmap"
+  - "proxyiobuffersize"
+  - "proxymaxforwards"
+  - "proxypass"
+  - "proxypassinherit"
+  - "proxypassinterpolateenv"
+  - "proxypassmatch"
+  - "proxypassreverse"
+  - "proxypassreversecookiedomain"
+  - "proxypassreversecookiepath"
+  - "proxypreservehost"
+  - "proxyreceivebuffersize"
+  - "proxyremote"
+  - "proxyremotematch"
+  - "proxyrequests"
+  - "proxyscgiinternalredirect"
+  - "proxyscgisendfile"
+  - "proxyset"
+  - "proxysourceaddress"
+  - "proxystatus"
+  - "proxytimeout"
+  - "proxyvia"
+  - "qualifyredirecturl"
+  - "readmename"
+  - "receivebuffersize"
+  - "redirect"
+  - "redirectmatch"
+  - "redirectpermanent"
+  - "redirecttemp"
+  - "refererignore"
+  - "refererlog"
+  - "reflectorheader"
+  - "remoteipheader"
+  - "remoteipinternalproxy"
+  - "remoteipinternalproxylist"
+  - "remoteipproxiesheader"
+  - "remoteiptrustedproxy"
+  - "remoteiptrustedproxylist"
+  - "removecharset"
+  - "removeencoding"
+  - "removehandler"
+  - "removeinputfilter"
+  - "removelanguage"
+  - "removeoutputfilter"
+  - "removetype"
+  - "requestheader"
+  - "requestreadtimeout"
+  - "require"
+  - "resourceconfig"
+  - "rewritebase"
+  - "rewritecond"
+  - "rewriteengine"
+  - "rewritelock"
+  - "rewritelog"
+  - "rewriteloglevel"
+  - "rewritemap"
+  - "rewriteoptions"
+  - "rewriterule"
+  - "rlimitcpu"
+  - "rlimitmem"
+  - "rlimitnproc"
+  - "satisfy"
+  - "scoreboardfile"
+  - "script"
+  - "scriptalias"
+  - "scriptaliasmatch"
+  - "scriptinterpretersource"
+  - "scriptlog"
+  - "scriptlogbuffer"
+  - "scriptloglength"
+  - "scriptsock"
+  - "securelisten"
+  - "seerequesttail"
+  - "sendbuffersize"
+  - "serveradmin"
+  - "serveralias"
+  - "serverlimit"
+  - "servername"
+  - "serverpath"
+  - "serverroot"
+  - "serversignature"
+  - "servertokens"
+  - "servertype"
+  - "session"
+  - "sessioncookiename"
+  - "sessioncookiename2"
+  - "sessioncookieremove"
+  - "sessioncryptocipher"
+  - "sessioncryptodriver"
+  - "sessioncryptopassphrase"
+  - "sessioncryptopassphrasefile"
+  - "sessiondbdcookiename"
+  - "sessiondbdcookiename2"
+  - "sessiondbdcookieremove"
+  - "sessiondbddeletelabel"
+  - "sessiondbdinsertlabel"
+  - "sessiondbdperuser"
+  - "sessiondbdselectlabel"
+  - "sessiondbdupdatelabel"
+  - "sessionenv"
+  - "sessionexclude"
+  - "sessionheader"
+  - "sessioninclude"
+  - "sessionmaxage"
+  - "setenv"
+  - "setenvif"
+  - "setenvifexpr"
+  - "setenvifnocase"
+  - "sethandler"
+  - "setinputfilter"
+  - "setoutputfilter"
+  - "ssiendtag"
+  - "ssierrormsg"
+  - "ssietag"
+  - "ssilastmodified"
+  - "ssilegacyexprparser"
+  - "ssistarttag"
+  - "ssitimeformat"
+  - "ssiundefinedecho"
+  - "sslcacertificatefile"
+  - "sslcacertificatepath"
+  - "sslcadnrequestfile"
+  - "sslcadnrequestpath"
+  - "sslcarevocationcheck"
+  - "sslcarevocationfile"
+  - "sslcarevocationpath"
+  - "sslcertificatechainfile"
+  - "sslcertificatefile"
+  - "sslcertificatekeyfile"
+  - "sslciphersuite"
+  - "sslcompression"
+  - "sslcryptodevice"
+  - "sslengine"
+  - "sslfips"
+  - "sslhonorcipherorder"
+  - "sslinsecurerenegotiation"
+  - "sslmutex"
+  - "sslocspdefaultresponder"
+  - "sslocspenable"
+  - "sslocspoverrideresponder"
+  - "sslocspproxyurl"
+  - "sslocsprespondertimeout"
+  - "sslocspresponsemaxage"
+  - "sslocspresponsetimeskew"
+  - "sslocspuserequestnonce"
+  - "sslopensslconfcmd"
+  - "ssloptions"
+  - "sslpassphrasedialog"
+  - "sslprotocol"
+  - "sslproxycacertificatefile"
+  - "sslproxycacertificatepath"
+  - "sslproxycarevocationcheck"
+  - "sslproxycarevocationfile"
+  - "sslproxycarevocationpath"
+  - "sslproxycheckpeercn"
+  - "sslproxycheckpeerexpire"
+  - "sslproxycheckpeername"
+  - "sslproxyciphersuite"
+  - "sslproxyengine"
+  - "sslproxymachinecertificatechainfile"
+  - "sslproxymachinecertificatefile"
+  - "sslproxymachinecertificatepath"
+  - "sslproxyprotocol"
+  - "sslproxyverify"
+  - "sslproxyverifydepth"
+  - "sslrandomseed"
+  - "sslrenegbuffersize"
+  - "sslrequire"
+  - "sslrequiressl"
+  - "sslsessioncache"
+  - "sslsessioncachetimeout"
+  - "sslsessionticketkeyfile"
+  - "sslsessiontickets"
+  - "sslsrpunknownuserseed"
+  - "sslsrpverifierfile"
+  - "sslstaplingcache"
+  - "sslstaplingerrorcachetimeout"
+  - "sslstaplingfaketrylater"
+  - "sslstaplingforceurl"
+  - "sslstaplingrespondertimeout"
+  - "sslstaplingresponsemaxage"
+  - "sslstaplingresponsetimeskew"
+  - "sslstaplingreturnrespondererrors"
+  - "sslstaplingstandardcachetimeout"
+  - "sslstrictsnivhostcheck"
+  - "sslusername"
+  - "sslusestapling"
+  - "sslverifyclient"
+  - "sslverifydepth"
+  - "startservers"
+  - "startthreads"
+  - "substitute"
+  - "substituteinheritbefore"
+  - "substitutemaxlinelength"
+  - "suexec"
+  - "suexecusergroup"
+  - "threadlimit"
+  - "threadsperchild"
+  - "threadstacksize"
+  - "timeout"
+  - "topsites"
+  - "topurls"
+  - "traceenable"
+  - "transferlog"
+  - "typesconfig"
+  - "undefine"
+  - "undefmacro"
+  - "unsetenv"
+  - "use"
+  - "usecanonicalname"
+  - "usecanonicalphysicalport"
+  - "user"
+  - "userdir"
+  - "vhostcgimode"
+  - "vhostcgiprivs"
+  - "vhostgroup"
+  - "vhostprivs"
+  - "vhostsecure"
+  - "vhostuser"
+  - "virtualdocumentroot"
+  - "virtualdocumentrootip"
+  - "virtualscriptalias"
+  - "virtualscriptaliasip"
+  - "win32disableacceptex"
+  - "watchdoginterval"
+  - "xbithack"
+  - "xml2encalias"
+  - "xml2encdefault"
+  - "xml2startparse"
+
+:values:
+  - "add"
+  - "All"
+  - "allow"
+  - "any"
+  - "append"
+  - "AuthConfig"
+  - "Basic"
+  - "CONNECT"
+  - "DELETE"
+  - "deny"
+  - "Digest"
+  - "double"
+  - "downgrade-1.0"
+  - "email"
+  - "env"
+  - "error"
+  - "ExecCGI"
+  - "FancyIndexing"
+  - "FileInfo"
+  - "FollowSymLinks"
+  - "force-response-1.0"
+  - "formatted"
+  - "from"
+  - "full"
+  - "Full"
+  - "GET"
+  - "gone"
+  - "group"
+  - "IconsAreLinks"
+  - "Includes"
+  - "IncludesNOEXEC"
+  - "Indexes"
+  - "inetd"
+  - "inherit"
+  - "Limit"
+  - "map"
+  - "Minimal"
+  - "MultiViews"
+  - "mutual-failure"
+  - "nocontent"
+  - "nokeepalive"
+  - "none"
+  - "None"
+  - "off"
+  - "on"
+  - "Options"
+  - "OPTIONS"
+  - "OS"
+  - "permanent"
+  - "POST"
+  - "PUT"
+  - "referer"
+  - "ScanHTMLTitles"
+  - "seeother"
+  - "semi-formatted"
+  - "set"
+  - "standalone"
+  - "SuppressDescription"
+  - "SuppressLastModified"
+  - "SuppressSize"
+  - "SymLinksIfOwnerMatch"
+  - "temporary"
+  - "unformatted"
+  - "unset"
+  - "URL"
+  - "user"
+  - "valid-user"
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apiblueprint.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apiblueprint.rb
new file mode 100644
index 0000000..3d22204
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apiblueprint.rb
@@ -0,0 +1,51 @@
+module Rouge
+  module Lexers
+    load_lexer 'markdown.rb'
+
+    class APIBlueprint < Markdown
+      title 'API Blueprint'
+      desc 'Markdown based API description language.'
+
+      tag 'apiblueprint'
+      aliases 'apiblueprint', 'apib'
+      filenames '*.apib'
+      mimetypes 'text/vnd.apiblueprint'
+
+      def self.analyze_text(text)
+        return 1 if text.start_with?('FORMAT: 1A\n')
+      end
+
+      prepend :root do
+        # Metadata
+        rule(/(\S+)(:\s*)(.*)$/) do
+          groups Name::Variable, Punctuation, Literal::String
+        end
+
+        # Resource Group
+        rule(/^(#+)(\s*Group\s+)(.*)$/) do
+          groups Punctuation, Keyword, Generic::Heading
+        end
+
+        # Resource \ Action
+        rule(/^(#+)(.*)(\[.*\])$/) do
+          groups Punctuation, Generic::Heading, Literal::String
+        end
+
+        # Relation
+        rule(/^([\+\-\*])(\s*Relation:)(\s*.*)$/) do
+          groups Punctuation, Keyword, Literal::String
+        end
+
+        # MSON
+        rule(/^(\s+[\+\-\*]\s*)(Attributes|Parameters)(.*)$/) do
+          groups Punctuation, Keyword, Literal::String
+        end
+
+        # Request/Response
+        rule(/^([\+\-\*]\s*)(Request|Response)(\s+\d\d\d)?(.*)$/) do
+          groups Punctuation, Keyword, Literal::Number, Literal::String
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apple_script.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apple_script.rb
new file mode 100644
index 0000000..785a215
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/apple_script.rb
@@ -0,0 +1,367 @@
+# -*- coding: utf-8 -*- #
+module Rouge
+  module Lexers
+    class AppleScript < RegexLexer
+      title "AppleScript"
+      desc "The AppleScript scripting language by Apple Inc. (http://developer.apple.com/applescript/)"
+
+      tag 'applescript'
+      aliases 'applescript'
+
+      filenames '*.applescript', '*.scpt'
+
+      mimetypes 'application/x-applescript'
+
+      def self.literals
+        @literals ||= ['AppleScript', 'current application', 'false', 'linefeed',
+                       'missing value', 'pi','quote', 'result', 'return', 'space',
+                       'tab', 'text item delimiters', 'true', 'version']
+      end
+
+      def self.classes
+        @classes ||= ['alias ', 'application ', 'boolean ', 'class ', 'constant ',
+                      'date ', 'file ', 'integer ', 'list ', 'number ', 'POSIX file ',
+                      'real ', 'record ', 'reference ', 'RGB color ', 'script ',
+                      'text ', 'unit types', '(?:Unicode )?text', 'string']
+      end
+
+      def self.builtins
+        @builtins ||= ['attachment', 'attribute run', 'character', 'day', 'month',
+                       'paragraph', 'word', 'year']
+      end
+
+      def self.handler_params
+        @handler_params ||= ['about', 'above', 'against', 'apart from', 'around',
+                             'aside from', 'at', 'below', 'beneath', 'beside',
+                             'between', 'for', 'given', 'instead of', 'on', 'onto',
+                             'out of', 'over', 'since']
+      end
+
+      def self.commands
+        @commands ||= ['ASCII (character|number)', 'activate', 'beep', 'choose URL',
+                'choose application', 'choose color', 'choose file( name)?',
+                'choose folder', 'choose from list',
+                'choose remote application', 'clipboard info',
+                'close( access)?', 'copy', 'count', 'current date', 'delay',
+                'delete', 'display (alert|dialog)', 'do shell script',
+                'duplicate', 'exists', 'get eof', 'get volume settings',
+                'info for', 'launch', 'list (disks|folder)', 'load script',
+                'log', 'make', 'mount volume', 'new', 'offset',
+                'open( (for access|location))?', 'path to', 'print', 'quit',
+                'random number', 'read', 'round', 'run( script)?',
+                'say', 'scripting components',
+                'set (eof|the clipboard to|volume)', 'store script',
+                'summarize', 'system attribute', 'system info',
+                'the clipboard', 'time to GMT', 'write', 'quoted form']
+      end
+
+      def self.references
+        @references ||= ['(in )?back of', '(in )?front of', '[0-9]+(st|nd|rd|th)',
+                  'first', 'second', 'third', 'fourth', 'fifth', 'sixth',
+                  'seventh', 'eighth', 'ninth', 'tenth', 'after', 'back',
+                  'before', 'behind', 'every', 'front', 'index', 'last',
+                  'middle', 'some', 'that', 'through', 'thru', 'where', 'whose']
+      end
+
+      def self.operators
+        @operators ||= ["and", "or", "is equal", "equals", "(is )?equal to", "is not",
+                 "isn't", "isn't equal( to)?", "is not equal( to)?",
+                 "doesn't equal", "does not equal", "(is )?greater than",
+                 "comes after", "is not less than or equal( to)?",
+                 "isn't less than or equal( to)?", "(is )?less than",
+                 "comes before", "is not greater than or equal( to)?",
+                 "isn't greater than or equal( to)?",
+                 "(is  )?greater than or equal( to)?", "is not less than",
+                 "isn't less than", "does not come before",
+                 "doesn't come before", "(is )?less than or equal( to)?",
+                 "is not greater than", "isn't greater than",
+                 "does not come after", "doesn't come after", "starts? with",
+                 "begins? with", "ends? with", "contains?", "does not contain",
+                 "doesn't contain", "is in", "is contained by", "is not in",
+                 "is not contained by", "isn't contained by", "div", "mod",
+                 "not", "(a  )?(ref( to)?|reference to)", "is", "does"]
+      end
+
+      def self.controls
+        @controls ||= ['considering', 'else', 'error', 'exit', 'from', 'if',
+               'ignoring', 'in', 'repeat', 'tell', 'then', 'times', 'to',
+               'try', 'until', 'using terms from', 'while', 'whith',
+               'with timeout( of)?', 'with transaction', 'by', 'continue',
+               'end', 'its?', 'me', 'my', 'return', 'of' , 'as']
+      end
+
+      def self.declarations
+        @declarations ||= ['global', 'local', 'prop(erty)?', 'set', 'get']
+      end
+
+      def self.reserved
+        @reserved ||= ['but', 'put', 'returning', 'the']
+      end
+
+      def self.studio_classes
+        @studio_classes ||= ['action cell', 'alert reply', 'application', 'box',
+                     'browser( cell)?', 'bundle', 'button( cell)?', 'cell',
+                     'clip view', 'color well', 'color-panel',
+                     'combo box( item)?', 'control',
+                     'data( (cell|column|item|row|source))?', 'default entry',
+                     'dialog reply', 'document', 'drag info', 'drawer',
+                     'event', 'font(-panel)?', 'formatter',
+                     'image( (cell|view))?', 'matrix', 'menu( item)?', 'item',
+                     'movie( view)?', 'open-panel', 'outline view', 'panel',
+                     'pasteboard', 'plugin', 'popup button',
+                     'progress indicator', 'responder', 'save-panel',
+                     'scroll view', 'secure text field( cell)?', 'slider',
+                     'sound', 'split view', 'stepper', 'tab view( item)?',
+                     'table( (column|header cell|header view|view))',
+                     'text( (field( cell)?|view))?', 'toolbar( item)?',
+                     'user-defaults', 'view', 'window']
+      end
+
+      def self.studio_events
+        @studio_events ||= ['accept outline drop', 'accept table drop', 'action',
+                    'activated', 'alert ended', 'awake from nib', 'became key',
+                    'became main', 'begin editing', 'bounds changed',
+                    'cell value', 'cell value changed', 'change cell value',
+                    'change item value', 'changed', 'child of item',
+                    'choose menu item', 'clicked', 'clicked toolbar item',
+                    'closed', 'column clicked', 'column moved',
+                    'column resized', 'conclude drop', 'data representation',
+                    'deminiaturized', 'dialog ended', 'document nib name',
+                    'double clicked', 'drag( (entered|exited|updated))?',
+                    'drop', 'end editing', 'exposed', 'idle', 'item expandable',
+                    'item value', 'item value changed', 'items changed',
+                    'keyboard down', 'keyboard up', 'launched',
+                    'load data representation', 'miniaturized', 'mouse down',
+                    'mouse dragged', 'mouse entered', 'mouse exited',
+                    'mouse moved', 'mouse up', 'moved',
+                    'number of browser rows', 'number of items',
+                    'number of rows', 'open untitled', 'opened', 'panel ended',
+                    'parameters updated', 'plugin loaded', 'prepare drop',
+                    'prepare outline drag', 'prepare outline drop',
+                    'prepare table drag', 'prepare table drop',
+                    'read from file', 'resigned active', 'resigned key',
+                    'resigned main', 'resized( sub views)?',
+                    'right mouse down', 'right mouse dragged',
+                    'right mouse up', 'rows changed', 'scroll wheel',
+                    'selected tab view item', 'selection changed',
+                    'selection changing', 'should begin editing',
+                    'should close', 'should collapse item',
+                    'should end editing', 'should expand item',
+                    'should open( untitled)?',
+                    'should quit( after last window closed)?',
+                    'should select column', 'should select item',
+                    'should select row', 'should select tab view item',
+                    'should selection change', 'should zoom', 'shown',
+                    'update menu item', 'update parameters',
+                    'update toolbar item', 'was hidden', 'was miniaturized',
+                    'will become active', 'will close', 'will dismiss',
+                    'will display browser cell', 'will display cell',
+                    'will display item cell', 'will display outline cell',
+                    'will finish launching', 'will hide', 'will miniaturize',
+                    'will move', 'will open', 'will pop up', 'will quit',
+                    'will resign active', 'will resize( sub views)?',
+                    'will select tab view item', 'will show', 'will zoom',
+                    'write to file', 'zoomed']
+      end
+
+      def self.studio_commands
+        @studio_commands ||= ['animate', 'append', 'call method', 'center',
+                      'close drawer', 'close panel', 'display',
+                      'display alert', 'display dialog', 'display panel', 'go',
+                      'hide', 'highlight', 'increment', 'item for',
+                      'load image', 'load movie', 'load nib', 'load panel',
+                      'load sound', 'localized string', 'lock focus', 'log',
+                      'open drawer', 'path for', 'pause', 'perform action',
+                      'play', 'register', 'resume', 'scroll', 'select( all)?',
+                      'show', 'size to fit', 'start', 'step back',
+                      'step forward', 'stop', 'synchronize', 'unlock focus',
+                      'update']
+      end
+
+      def self.studio_properties
+        @studio_properties ||= ['accepts arrow key', 'action method', 'active',
+                        'alignment', 'allowed identifiers',
+                        'allows branch selection', 'allows column reordering',
+                        'allows column resizing', 'allows column selection',
+                        'allows customization', 'allows editing text attributes',
+                        'allows empty selection', 'allows mixed state',
+                        'allows multiple selection', 'allows reordering',
+                        'allows undo', 'alpha( value)?', 'alternate image',
+                        'alternate increment value', 'alternate title',
+                        'animation delay', 'associated file name',
+                        'associated object', 'auto completes', 'auto display',
+                        'auto enables items', 'auto repeat', 'auto resizes( outline column)?',
+                        'auto save expanded items', 'auto save name',
+                        'auto save table columns', 'auto saves configuration',
+                        'auto scroll', 'auto sizes all columns to fit',
+                        'auto sizes cells', 'background color', 'bezel state',
+                        'bezel style', 'bezeled', 'border rect', 'border type',
+                        'bordered', 'bounds( rotation)?', 'box type',
+                        'button returned', 'button type',
+                        'can choose directories', 'can choose files', 'can draw', 'can hide',
+                        'cell( (background color|size|type))?', 'characters',
+                        'class', 'click count', 'clicked( data)? column',
+                        'clicked data item', 'clicked( data)? row',
+                        'closeable', 'collating', 'color( (mode|panel))',
+                        'command key down', 'configuration',
+                        'content(s| (size|view( margins)?))?', 'context',
+                        'continuous', 'control key down', 'control size',
+                        'control tint', 'control view',
+                        'controller visible', 'coordinate system',
+                        'copies( on scroll)?', 'corner view', 'current cell',
+                        'current column', 'current( field)?  editor',
+                        'current( menu)? item', 'current row',
+                        'current tab view item', 'data source',
+                        'default identifiers', 'delta (x|y|z)',
+                        'destination window', 'directory', 'display mode',
+                        'displayed cell', 'document( (edited|rect|view))?',
+                        'double value', 'dragged column', 'dragged distance',
+                        'dragged items', 'draws( cell)? background',
+                        'draws grid', 'dynamically scrolls', 'echos bullets',
+                        'edge', 'editable', 'edited( data)? column',
+                        'edited data item', 'edited( data)? row', 'enabled',
+                        'enclosing scroll view', 'ending page',
+                        'error handling', 'event number', 'event type',
+                        'excluded from windows menu', 'executable path',
+                        'expanded', 'fax number', 'field editor', 'file kind',
+                        'file name', 'file type', 'first responder',
+                        'first visible column', 'flipped', 'floating',
+                        'font( panel)?', 'formatter', 'frameworks path',
+                        'frontmost', 'gave up', 'grid color', 'has data items',
+                        'has horizontal ruler', 'has horizontal scroller',
+                        'has parent data item', 'has resize indicator',
+                        'has shadow', 'has sub menu', 'has vertical ruler',
+                        'has vertical scroller', 'header cell', 'header view',
+                        'hidden', 'hides when deactivated', 'highlights by',
+                        'horizontal line scroll', 'horizontal page scroll',
+                        'horizontal ruler view', 'horizontally resizable',
+                        'icon image', 'id', 'identifier',
+                        'ignores multiple clicks',
+                        'image( (alignment|dims when disabled|frame style|scaling))?',
+                        'imports graphics', 'increment value',
+                        'indentation per level', 'indeterminate', 'index',
+                        'integer value', 'intercell spacing', 'item height',
+                        'key( (code|equivalent( modifier)?|window))?',
+                        'knob thickness', 'label', 'last( visible)? column',
+                        'leading offset', 'leaf', 'level', 'line scroll',
+                        'loaded', 'localized sort', 'location', 'loop mode',
+                        'main( (bunde|menu|window))?', 'marker follows cell',
+                        'matrix mode', 'maximum( content)? size',
+                        'maximum visible columns',
+                        'menu( form representation)?', 'miniaturizable',
+                        'miniaturized', 'minimized image', 'minimized title',
+                        'minimum column width', 'minimum( content)? size',
+                        'modal', 'modified', 'mouse down state',
+                        'movie( (controller|file|rect))?', 'muted', 'name',
+                        'needs display', 'next state', 'next text',
+                        'number of tick marks', 'only tick mark values',
+                        'opaque', 'open panel', 'option key down',
+                        'outline table column', 'page scroll', 'pages across',
+                        'pages down', 'palette label', 'pane splitter',
+                        'parent data item', 'parent window', 'pasteboard',
+                        'path( (names|separator))?', 'playing',
+                        'plays every frame', 'plays selection only', 'position',
+                        'preferred edge', 'preferred type', 'pressure',
+                        'previous text', 'prompt', 'properties',
+                        'prototype cell', 'pulls down', 'rate',
+                        'released when closed', 'repeated',
+                        'requested print time', 'required file type',
+                        'resizable', 'resized column', 'resource path',
+                        'returns records', 'reuses columns', 'rich text',
+                        'roll over', 'row height', 'rulers visible',
+                        'save panel', 'scripts path', 'scrollable',
+                        'selectable( identifiers)?', 'selected cell',
+                        'selected( data)? columns?', 'selected data items?',
+                        'selected( data)? rows?', 'selected item identifier',
+                        'selection by rect', 'send action on arrow key',
+                        'sends action when done editing', 'separates columns',
+                        'separator item', 'sequence number', 'services menu',
+                        'shared frameworks path', 'shared support path',
+                        'sheet', 'shift key down', 'shows alpha',
+                        'shows state by', 'size( mode)?',
+                        'smart insert delete enabled', 'sort case sensitivity',
+                        'sort column', 'sort order', 'sort type',
+                        'sorted( data rows)?', 'sound', 'source( mask)?',
+                        'spell checking enabled', 'starting page', 'state',
+                        'string value', 'sub menu', 'super menu', 'super view',
+                        'tab key traverses cells', 'tab state', 'tab type',
+                        'tab view', 'table view', 'tag', 'target( printer)?',
+                        'text color', 'text container insert',
+                        'text container origin', 'text returned',
+                        'tick mark position', 'time stamp',
+                        'title(d| (cell|font|height|position|rect))?',
+                        'tool tip', 'toolbar', 'trailing offset', 'transparent',
+                        'treat packages as directories', 'truncated labels',
+                        'types', 'unmodified characters', 'update views',
+                        'use sort indicator', 'user defaults',
+                        'uses data source', 'uses ruler', 'uses threaded animation',
+                        'uses title from previous column', 'value wraps', 'version',
+                        'vertical( (line scroll|page scroll|ruler view))?', 'vertically resizable', 'view',
+                        'visible( document rect)?', 'volume', 'width', 'window',
+                        'windows menu', 'wraps', 'zoomable', 'zoomed']
+      end
+
+      operators = %r(\b(#{self.operators.to_a.join('|')})\b)
+      classes = %r(\b(as )(#{self.classes.to_a.join('|')})\b)
+      literals = %r(\b(#{self.literals.to_a.join('|')})\b)
+      commands = %r(\b(#{self.commands.to_a.join('|')})\b)
+      controls = %r(\b(#{self.controls.to_a.join('|')})\b)
+      declarations = %r(\b(#{self.declarations.to_a.join('|')})\b)
+      reserved = %r(\b(#{self.reserved.to_a.join('|')})\b)
+      builtins = %r(\b(#{self.builtins.to_a.join('|')})s?\b)
+      handler_params = %r(\b(#{self.handler_params.to_a.join('|')})\b)
+      references = %r(\b(#{self.references.to_a.join('|')})\b)
+      studio_properties = %r(\b(#{self.studio_properties.to_a.join('|')})\b)
+      studio_classes = %r(\b(#{self.studio_classes.to_a.join('|')})s?\b)
+      studio_commands = %r(\b(#{self.studio_commands.to_a.join('|')})\b)
+      identifiers = %r(\b([a-zA-Z]\w*)\b)
+
+      state :root do
+        rule /\s+/, Text::Whitespace
+        rule /¬\n/, Literal::String::Escape
+        rule /'s\s+/, Text
+        rule /(--|#).*?$/, Comment::Single
+        rule /\(\*/, Comment::Multiline
+        rule /[\(\){}!,.:]/, Punctuation
+        rule /(«)([^»]+)(»)/ do |match|
+          token Text, match[1]
+          token Name::Builtin, match[2]
+          token Text, match[3]
+        end
+        rule /\b((?:considering|ignoring)\s*)(application responses|case|diacriticals|hyphens|numeric strings|punctuation|white space)/ do |match|
+          token Keyword, match[1]
+          token Name::Builtin, match[2]
+        end
+        rule /(-|\*|\+|&|≠|>=?|<=?|=|≥|≤|\/|÷|\^)/, Operator
+        rule operators, Operator::Word
+        rule /^(\s*(?:on|end)\s+)'r'(%s)/ do |match|
+          token Keyword, match[1]
+          token Name::Function, match[2]
+        end
+        rule /^(\s*)(in|on|script|to)(\s+)/ do |match|
+          token Text, match[1]
+          token Keyword, match[2]
+          token Text, match[3]
+        end
+        rule classes do |match|
+          token Keyword, match[1]
+          token Name::Class, match[2]
+        end
+        rule commands, Name::Builtin
+        rule controls, Keyword
+        rule declarations, Keyword
+        rule reserved, Name::Builtin
+        rule builtins, Name::Builtin
+        rule handler_params, Name::Builtin
+        rule studio_properties, Name::Attribute
+        rule studio_classes, Name::Builtin
+        rule studio_commands, Name::Builtin
+        rule references, Name::Builtin
+        rule /"(\\\\|\\"|[^"])*"/, Literal::String::Double
+        rule identifiers, Name::Variable
+        rule /[-+]?(\d+\.\d*|\d*\.\d+)(E[-+][0-9]+)?/, Literal::Number::Float
+        rule /[-+]?\d+/, Literal::Number::Integer
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/biml.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/biml.rb
new file mode 100644
index 0000000..edb83fd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/biml.rb
@@ -0,0 +1,41 @@
+module Rouge
+  module Lexers
+    load_lexer 'xml.rb'
+        
+    class BIML < XML
+      title "BIML"
+      desc "BIML, Business Intelligence Markup Language"
+      tag 'biml'
+      filenames '*.biml'
+            
+      def self.analyze_text(text)
+        return 1 if text =~ /<\s*Biml\b/
+      end
+            
+      prepend :root do
+        rule %r(<#@\s*)m, Name::Tag, :directive_tag
+              
+        rule %r(<#[=]?\s*)m, Name::Tag, :directive_as_csharp
+      end
+            
+      prepend :attr do
+        #TODO: how to deal with embedded <# tags inside a attribute string
+        #rule %r("<#[=]?\s*)m, Name::Tag, :directive_as_csharp
+      end
+            
+      state :directive_as_csharp do
+        rule /\s*#>\s*/m, Name::Tag, :pop! 
+        rule %r(.*?(?=\s*#>\s*))m do
+          delegate CSharp
+        end
+      end
+            
+      state :directive_tag do
+        rule /\s+/m, Text
+        rule /[\w.:-]+\s*=/m, Name::Attribute, :attr
+        rule /[\w]+\s*/m, Name::Attribute
+        rule %r(/?\s*#>), Name::Tag, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/c.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/c.rb
new file mode 100644
index 0000000..a3bce77
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/c.rb
@@ -0,0 +1,217 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class C < RegexLexer
+      tag 'c'
+      filenames '*.c', '*.h', '*.idc'
+      mimetypes 'text/x-chdr', 'text/x-csrc'
+
+      title "C"
+      desc "The C programming language"
+
+      # optional comment or whitespace
+      ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+)
+      id = /[a-zA-Z_][a-zA-Z0-9_]*/
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          auto break case const continue default do else enum extern
+          for goto if register restricted return sizeof static struct
+          switch typedef union volatile virtual while
+
+          _Alignas _Alignof _Atomic _Generic _Imaginary
+          _Noreturn _Static_assert _Thread_local
+        )
+      end
+
+      def self.keywords_type
+        @keywords_type ||= Set.new %w(
+          int long float short double char unsigned signed void
+
+          jmp_buf FILE DIR div_t ldiv_t mbstate_t sig_atomic_t fpos_t
+          clock_t time_t va_list size_t ssize_t off_t wchar_t ptrdiff_t
+          wctrans_t wint_t wctype_t
+
+          _Bool _Complex int8_t int16_t int32_t int64_t
+          uint8_t uint16_t uint32_t uint64_t int_least8_t
+          int_least16_t int_least32_t int_least64_t
+          uint_least8_t uint_least16_t uint_least32_t
+          uint_least64_t int_fast8_t int_fast16_t int_fast32_t
+          int_fast64_t uint_fast8_t uint_fast16_t uint_fast32_t
+          uint_fast64_t intptr_t uintptr_t intmax_t
+          uintmax_t
+
+          char16_t char32_t
+        )
+      end
+
+      def self.reserved
+        @reserved ||= Set.new %w(
+          __asm __int8 __based __except __int16 __stdcall __cdecl
+          __fastcall __int32 __declspec __finally __int61 __try __leave
+          inline _inline __inline naked _naked __naked restrict _restrict
+          __restrict thread _thread __thread typename _typename __typename
+        )
+      end
+
+      # high priority for filename matches
+      def self.analyze_text(*)
+        0.3
+      end
+
+      def self.builtins
+        @builtins ||= []
+      end
+
+      start { push :bol }
+
+      state :expr_bol do
+        mixin :inline_whitespace
+
+        rule /#if\s0/, Comment, :if_0
+        rule /#/, Comment::Preproc, :macro
+
+        rule(//) { pop! }
+      end
+
+      # :expr_bol is the same as :bol but without labels, since
+      # labels can only appear at the beginning of a statement.
+      state :bol do
+        rule /#{id}:(?!:)/, Name::Label
+        mixin :expr_bol
+      end
+
+      state :inline_whitespace do
+        rule /[ \t\r]+/, Text
+        rule /\\\n/, Text # line continuation
+        rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline
+      end
+
+      state :whitespace do
+        rule /\n+/m, Text, :bol
+        rule %r(//(\\.|.)*?\n), Comment::Single, :bol
+        mixin :inline_whitespace
+      end
+
+      state :expr_whitespace do
+        rule /\n+/m, Text, :expr_bol
+        mixin :whitespace
+      end
+
+      state :statements do
+        mixin :whitespace
+        rule /(u8|u|U|L)?"/, Str, :string
+        rule %r((u8|u|U|L)?'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, Str::Char
+        rule %r((\d+[.]\d*|[.]?\d+)e[+-]?\d+[lu]*)i, Num::Float
+        rule %r(\d+e[+-]?\d+[lu]*)i, Num::Float
+        rule /0x[0-9a-f]+[lu]*/i, Num::Hex
+        rule /0[0-7]+[lu]*/i, Num::Oct
+        rule /\d+[lu]*/i, Num::Integer
+        rule %r(\*/), Error
+        rule %r([~!%^&*+=\|?:<>/-]), Operator
+        rule /[()\[\],.]/, Punctuation
+        rule /\bcase\b/, Keyword, :case
+        rule /(?:true|false|NULL)\b/, Name::Builtin
+        rule id do |m|
+          name = m[0]
+
+          if self.class.keywords.include? name
+            token Keyword
+          elsif self.class.keywords_type.include? name
+            token Keyword::Type
+          elsif self.class.reserved.include? name
+            token Keyword::Reserved
+          elsif self.class.builtins.include? name
+            token Name::Builtin
+          else
+            token Name
+          end
+        end
+      end
+
+      state :case do
+        rule /:/, Punctuation, :pop!
+        mixin :statements
+      end
+
+      state :root do
+        mixin :expr_whitespace
+
+        # functions
+        rule %r(
+          ([\w*\s]+?[\s*]) # return arguments
+          (#{id})          # function name
+          (\s*\([^;]*?\))  # signature
+          (#{ws})({)         # open brace
+        )mx do |m|
+          # TODO: do this better.
+          recurse m[1]
+          token Name::Function, m[2]
+          recurse m[3]
+          recurse m[4]
+          token Punctuation, m[5]
+          push :function
+        end
+
+        # function declarations
+        rule %r(
+          ([\w*\s]+?[\s*]) # return arguments
+          (#{id})          # function name
+          (\s*\([^;]*?\))  # signature
+          (#{ws})(;)       # semicolon
+        )mx do |m|
+          # TODO: do this better.
+          recurse m[1]
+          token Name::Function, m[2]
+          recurse m[3]
+          recurse m[4]
+          token Punctuation, m[5]
+          push :statement
+        end
+
+        rule(//) { push :statement }
+      end
+
+      state :statement do
+        rule /;/, Punctuation, :pop!
+        mixin :expr_whitespace
+        mixin :statements
+        rule /[{}]/, Punctuation
+      end
+
+      state :function do
+        mixin :whitespace
+        mixin :statements
+        rule /;/, Punctuation
+        rule /{/, Punctuation, :function
+        rule /}/, Punctuation, :pop!
+      end
+
+      state :string do
+        rule /"/, Str, :pop!
+        rule /\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape
+        rule /[^\\"\n]+/, Str
+        rule /\\\n/, Str
+        rule /\\/, Str # stray backslash
+      end
+
+      state :macro do
+        # NB: pop! goes back to :bol
+        rule /\n/, Comment::Preproc, :pop!
+        rule %r([^/\n\\]+), Comment::Preproc
+        rule /\\./m, Comment::Preproc
+        mixin :inline_whitespace
+        rule %r(/), Comment::Preproc
+      end
+
+      state :if_0 do
+        # NB: no \b here, to cover #ifdef and #ifndef
+        rule /^\s*#if/, Comment, :if_0
+        rule /^\s*#\s*el(?:se|if)/, Comment, :pop!
+        rule /^\s*#\s*endif\b.*?(?<!\\)\n/m, Comment, :pop!
+        rule /.*?\n/, Comment
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ceylon.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ceylon.rb
new file mode 100644
index 0000000..e96ac20
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ceylon.rb
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Ceylon < RegexLexer
+      tag 'ceylon'
+      filenames '*.ceylon'
+      mimetypes 'text/x-ceylon'
+
+      title "Ceylon"
+      desc 'Say more, more clearly.'
+
+      keywords = %w(
+        break case catch continue else finally for in
+        if return switch this throw try while is exists dynamic
+        nonempty then outer assert let
+      )
+      
+      keywords_declaration = %w(
+        abstracts extends satisfies super given of out assign
+      )
+      
+      keywords_type = %w(
+        function value void new
+      )
+      
+      keywords_namespace = %w(
+        assembly module package
+      )
+      
+      keywords_constant = %w(
+        true false null
+      )
+
+      annotations = %w(
+        shared abstract formal default actual variable deprecated small
+        late literal doc by see throws optional license tagged final native
+        annotation sealed
+      )
+
+      state :whitespace do
+        rule %r([^\S\n]+), Text
+        rule %r(//.*?\n), Comment::Single
+        rule %r(/\*), Comment::Multiline
+      end
+
+      state :root do
+        mixin :whitespace
+
+        rule %r((shared|abstract|formal|default|actual|variable|deprecated|small|
+          late|literal|doc|by|see|throws|optional|license|tagged|final|native|
+          annotation|sealed)\b), Name::Decorator
+
+        rule %r((break|case|catch|continue|else|finally|for|in|
+          if|return|switch|this|throw|try|while|is|exists|dynamic|
+          nonempty|then|outer|assert|let)\b), Keyword
+
+        rule %r((abstracts|extends|satisfies|super|given|of|out|assign)\b), Keyword::Declaration
+
+        rule %r((function|value|void|new)\b), Keyword::Type
+        
+        rule %r((assembly|module|package)(\s+)) do
+          groups Keyword::Namespace, Text
+          push :import
+        end
+        
+        rule %r((true|false|null)\b), Keyword::Constant
+        
+        rule %r((class|interface|object|alias)(\s+)) do
+          groups Keyword::Declaration, Text
+          push :class
+        end
+
+        rule %r((import)(\s+)) do
+          groups Keyword::Namespace, Text
+          push :import
+        end
+        
+        rule %r("(\\\\|\\"|[^"])*"), Literal::String
+        rule %r('\\.'|'[^\\]'|'\\\{#[0-9a-fA-F]{4}\}'), Literal::String::Char
+        rule %r(".*``.*``.*"', String::Interpol
+        rule %r(\.)([a-z_]\w*)) do
+          groups Operator, Name::Attribute
+        end
+        rule %r([a-zA-Z_]\w*:), Name::Label
+        rule %r((\\I[a-z]|[A-Z])\w*), Name::Decorator
+        rule %r([a-zA-Z_]\w*), Name
+        rule %r([~^*!%&\[\](){}<>|+=:;,./?-`]), Operator
+        rule %r(\d{1,3}(_\d{3})+\.\d{1,3}(_\d{3})+[kMGTPmunpf]?), Literal::Number::Float
+        rule %r(\d{1,3}(_\d{3})+\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?),
+          Literal::Number::Float
+        rule %r([0-9][0-9]*\.\d{1,3}(_\d{3})+[kMGTPmunpf]?), Literal::Number::Float
+        rule %r([0-9][0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?),
+          Literal::Number::Float
+        rule %r(#([0-9a-fA-F]{4})(_[0-9a-fA-F]{4})+), Literal::Number::Hex
+        rule %r(#[0-9a-fA-F]+), Literal::Number::Hex
+        rule %r(\$([01]{4})(_[01]{4})+), Literal::Number::Bin
+        rule %r(\$[01]+), Literal::Number::Bin
+        rule %r(\d{1,3}(_\d{3})+[kMGTP]?), Literal::Number::Integer
+        rule %r([0-9]+[kMGTP]?), Literal::Number::Integer
+        rule %r(\n), Text
+
+      end
+
+      state :class do
+        mixin :whitespace
+        rule %r([A-Za-z_]\w*), Name::Class, :pop!
+      end
+
+      state :import do
+        rule %r([a-z][\w.]*), Name::Namespace, :pop!
+        rule %r("(\\\\|\\"|[^"])*"), Literal::String, :pop!
+      end
+      
+      state :comment do
+        rule %r([^*/]), Comment.Multiline
+        rule %r(/\*), Comment::Multiline, :push!
+        rule %r(\*/), Comment::Multiline, :pop!
+        rule %r([*/]), Comment::Multiline
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/cfscript.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/cfscript.rb
new file mode 100644
index 0000000..d3f65a0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/cfscript.rb
@@ -0,0 +1,153 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+
+    class Cfscript < RegexLexer
+      title "CFScript"
+      desc 'CFScript, the CFML scripting language'
+      tag 'cfscript'
+      aliases 'cfc'
+      filenames '*.cfc'
+
+      def self.keywords
+        @keywords ||= %w(
+          if else var xml default break switch do try catch throw in continue for return while required
+        )
+      end
+
+      def self.declarations
+        @declarations ||= %w(
+          component property function remote public package private
+        )
+      end
+
+      def self.types
+        @types ||= %w(
+          any array binary boolean component date guid numeric query string struct uuid void xml
+        )
+      end
+
+      constants = %w(application session client cookie super this variables arguments cgi)
+
+
+      operators = %w(\+\+ -- && \|\| <= >= < > == != mod eq lt gt lte gte not is and or xor eqv imp equal contains \? )
+      dotted_id = /[$a-zA-Z_][a-zA-Z0-9_.]*/
+
+      state :root do
+        mixin :comments_and_whitespace
+        rule /(?:#{operators.join('|')}|does not contain|greater than(?: or equal to)?|less than(?: or equal to)?)\b/i, Operator, :expr_start
+        rule %r([-<>+*%&|\^/!=]=?), Operator, :expr_start
+
+        rule /[(\[,]/, Punctuation, :expr_start
+        rule /;/, Punctuation, :statement
+        rule /[)\].]/, Punctuation
+
+        rule /[?]/ do
+          token Punctuation
+          push :ternary
+          push :expr_start
+        end
+
+        rule /[{}]/, Punctuation, :statement
+
+        rule /(?:#{constants.join('|')})\b/, Name::Constant
+        rule /(?:true|false|null)\b/, Keyword::Constant
+        rule /import\b/, Keyword::Namespace, :import
+        rule /(#{dotted_id})(\s*)(:)(\s*)/ do
+          groups Name, Text, Punctuation, Text
+          push :expr_start
+        end
+
+        rule /([A-Za-z_$][\w.]*)(\s*)(\()/ do |m|
+          if self.class.keywords.include? m[1]
+            token Keyword, m[1]
+            token Text, m[2]
+            token Punctuation, m[3]
+          else
+            token Name::Function, m[1]
+            token Text, m[2]
+            token Punctuation, m[3]
+          end
+        end
+
+        rule dotted_id do |m|
+          if self.class.declarations.include? m[0]
+            token Keyword::Declaration
+            push :expr_start
+          elsif self.class.keywords.include? m[0]
+            token Keyword
+            push :expr_start
+          elsif self.class.types.include? m[0]
+            token Keyword::Type
+            push :expr_start
+          else
+            token Name::Other
+          end
+        end
+
+        rule /[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, Num::Float
+        rule /0x[0-9a-fA-F]+/, Num::Hex
+        rule /[0-9]+/, Num::Integer
+        rule /"(\\\\|\\"|[^"])*"/, Str::Double
+        rule /'(\\\\|\\'|[^'])*'/, Str::Single
+
+      end
+
+      # same as java, broken out
+      state :comments_and_whitespace do
+        rule /\s+/, Text
+        rule %r(//.*?$), Comment::Single
+        rule %r(/\*.*?\*/)m, Comment::Multiline
+      end
+
+      state :expr_start do
+        mixin :comments_and_whitespace
+
+        rule /[{]/, Punctuation, :object
+
+        rule //, Text, :pop!
+      end
+
+      state :statement do
+
+        rule /[{}]/, Punctuation
+
+        mixin :expr_start
+      end
+
+      # object literals
+      state :object do
+        mixin :comments_and_whitespace
+        rule /[}]/ do
+          token Punctuation
+          push :expr_start
+        end
+
+        rule /(#{dotted_id})(\s*)(:)/ do
+          groups Name::Other, Text, Punctuation
+          push :expr_start
+        end
+
+        rule /:/, Punctuation
+        mixin :root
+      end
+
+      # ternary expressions, where <dotted_id>: is not a label!
+      state :ternary do
+        rule /:/ do
+          token Punctuation
+          goto :expr_start
+        end
+
+        mixin :root
+      end
+
+      state :import do
+        rule /\s+/m, Text
+        rule /[a-z0-9_.]+\*?/i, Name::Namespace, :pop!
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/clojure.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/clojure.rb
new file mode 100644
index 0000000..699b1d4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/clojure.rb
@@ -0,0 +1,112 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Clojure < RegexLexer
+      title "Clojure"
+      desc "The Clojure programming language (clojure.org)"
+
+      tag 'clojure'
+      aliases 'clj', 'cljs'
+
+      filenames '*.clj', '*.cljs', '*.cljc'
+
+      mimetypes 'text/x-clojure', 'application/x-clojure'
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          fn def defn defmacro defmethod defmulti defn- defstruct if
+          cond let for
+        )
+      end
+
+      def self.builtins
+        @builtins ||= Set.new %w(
+          . ..  * + - -> / < <= = == > >= accessor agent agent-errors
+          aget alength all-ns alter and append-child apply array-map
+          aset aset-boolean aset-byte aset-char aset-double aset-float
+          aset-int aset-long aset-short assert assoc await await-for bean
+          binding bit-and bit-not bit-or bit-shift-left bit-shift-right
+          bit-xor boolean branch?  butlast byte cast char children
+          class clear-agent-errors comment commute comp comparator
+          complement concat conj cons constantly construct-proxy
+          contains? count create-ns create-struct cycle dec  deref
+          difference disj dissoc distinct doall doc dorun doseq dosync
+          dotimes doto double down drop drop-while edit end? ensure eval
+          every? false? ffirst file-seq filter find find-doc find-ns
+          find-var first float flush fnseq frest gensym get-proxy-class
+          get hash-map hash-set identical? identity if-let import in-ns
+          inc index insert-child insert-left insert-right inspect-table
+          inspect-tree instance? int interleave intersection into
+          into-array iterate join key keys keyword keyword? last lazy-cat
+          lazy-cons left lefts line-seq list* list load load-file locking
+          long loop macroexpand macroexpand-1 make-array make-node map
+          map-invert map? mapcat max max-key memfn merge merge-with meta
+          min min-key name namespace neg? new newline next nil? node not
+          not-any? not-every? not= ns-imports ns-interns ns-map ns-name
+          ns-publics ns-refers ns-resolve ns-unmap nth nthrest or parse
+          partial path peek pop pos? pr pr-str print print-str println
+          println-str prn prn-str project proxy proxy-mappings quot
+          rand rand-int range re-find re-groups re-matcher re-matches
+          re-pattern re-seq read read-line reduce ref ref-set refer rem
+          remove remove-method remove-ns rename rename-keys repeat replace
+          replicate resolve rest resultset-seq reverse rfirst right
+          rights root rrest rseq second select select-keys send send-off
+          seq seq-zip seq? set short slurp some sort sort-by sorted-map
+          sorted-map-by sorted-set special-symbol? split-at split-with
+          str string?  struct struct-map subs subvec symbol symbol?
+          sync take take-nth take-while test time to-array to-array-2d
+          tree-seq true? union up update-proxy val vals var-get var-set
+          var? vector vector-zip vector? when when-first when-let
+          when-not with-local-vars with-meta with-open with-out-str
+          xml-seq xml-zip zero? zipmap zipper'
+        )
+      end
+
+      identifier = %r([\w!$%*+,<=>?/.-]+)
+      keyword = %r([\w!\#$%*+,<=>?/.-]+)
+
+      def name_token(name)
+        return Keyword if self.class.keywords.include?(name)
+        return Name::Builtin if self.class.builtins.include?(name)
+        nil
+      end
+
+      state :root do
+        rule /;.*?\n/, Comment::Single
+        rule /\s+/m, Text::Whitespace
+
+        rule /-?\d+\.\d+/, Num::Float
+        rule /-?\d+/, Num::Integer
+        rule /0x-?[0-9a-fA-F]+/, Num::Hex
+
+        rule /"(\\.|[^"])*"/, Str
+        rule /'#{keyword}/, Str::Symbol
+        rule /::?#{keyword}/, Name::Constant
+        rule /\\(.|[a-z]+)/i, Str::Char
+
+
+        rule /~@|[`\'#^~&]/, Operator
+
+        rule /(\()(\s*)(#{identifier})/m do |m|
+          token Punctuation, m[1]
+          token Text::Whitespace, m[2]
+          token(name_token(m[3]) || Name::Function, m[3])
+        end
+
+        rule identifier do |m|
+          token name_token(m[0]) || Name
+        end
+
+        # vectors
+        rule /[\[\]]/, Punctuation
+
+        # maps
+        rule /[{}]/, Punctuation
+
+        # parentheses
+        rule /[()]/, Punctuation
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/cmake.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/cmake.rb
new file mode 100644
index 0000000..57342e3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/cmake.rb
@@ -0,0 +1,206 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class CMake < RegexLexer
+      title 'CMake'
+      desc 'The cross-platform, open-source build system'
+      tag 'cmake'
+      filenames 'CMakeLists.txt', '*.cmake'
+      mimetypes 'text/x-cmake'
+
+      SPACE = '[ \t]'
+      BRACKET_OPEN = '\[=*\['
+
+      STATES_MAP = {
+        :root => Text,
+        :bracket_string => Str::Double,
+        :quoted_argument => Str::Double,
+        :bracket_comment => Comment::Multiline,
+        :variable_reference => Name::Variable,
+      }
+
+      BUILTIN_COMMANDS = Set.new %w[
+        add_compile_options
+        add_custom_command
+        add_custom_target
+        add_definitions
+        add_dependencies
+        add_executable
+        add_library
+        add_subdirectory
+        add_test
+        aux_source_directory
+        break
+        build_command
+        build_name
+        cmake_host_system_information
+        cmake_minimum_required
+        cmake_policy
+        configure_file
+        create_test_sourcelist
+        define_property
+        else
+        elseif
+        enable_language
+        enable_testing
+        endforeach
+        endfunction
+        endif
+        endmacro
+        endwhile
+        exec_program
+        execute_process
+        export
+        export_library_dependencies
+        file
+        find_file
+        find_library
+        find_package
+        find_path
+        find_program
+        fltk_wrap_ui
+        foreach
+        function
+        get_cmake_property
+        get_directory_property
+        get_filename_component
+        get_property
+        get_source_file_property
+        get_target_property
+        get_test_property
+        if
+        include
+        include_directories
+        include_external_msproject
+        include_regular_expression
+        install
+        install_files
+        install_programs
+        install_targets
+        link_directories
+        link_libraries
+        list
+        load_cache
+        load_command
+        macro
+        make_directory
+        mark_as_advanced
+        math
+        message
+        option
+        output_required_files
+        project
+        qt_wrap_cpp
+        qt_wrap_ui
+        remove
+        remove_definitions
+        return
+        separate_arguments
+        set
+        set_directory_properties
+        set_property
+        set_source_files_properties
+        set_target_properties
+        set_tests_properties
+        site_name
+        source_group
+        string
+        subdir_depends
+        subdirs
+        target_compile_definitions
+        target_compile_options
+        target_include_directories
+        target_link_libraries
+        try_compile
+        try_run
+        unset
+        use_mangled_mesa
+        utility_source
+        variable_requires
+        variable_watch
+        while
+        write_file
+      ]
+
+      state :default do
+        rule /\r\n?|\n/ do
+          token STATES_MAP[state.name.to_sym]
+        end
+        rule /./ do
+          token STATES_MAP[state.name.to_sym]
+        end
+      end
+
+      state :variable_interpolation do
+        rule /\$\{/ do
+          token Str::Interpol
+          push :variable_reference
+        end
+      end
+
+      state :bracket_close do
+        rule /\]=*\]/ do |m|
+          token STATES_MAP[state.name.to_sym]
+          goto :root if m[0].length == @bracket_len
+        end
+      end
+
+      state :root do
+        mixin :variable_interpolation
+
+        rule /#{SPACE}/, Text
+        rule /[()]/, Punctuation
+
+        rule /##{BRACKET_OPEN}/ do |m|
+          token Comment::Multiline
+          @bracket_len = m[0].length - 1 # decount '#'
+          goto :bracket_comment
+        end
+        rule /#{BRACKET_OPEN}/ do |m|
+          token Str::Double
+          @bracket_len = m[0].length
+          goto :bracket_string
+        end
+
+        rule /"/, Str::Double, :quoted_argument
+
+        rule /([A-Za-z_][A-Za-z0-9_]*)(#{SPACE}*)(\()/ do |m|
+          groups BUILTIN_COMMANDS.include?(m[1]) ? Name::Builtin : Name::Function, Text, Punctuation
+        end
+
+        rule /#.*/, Comment::Single
+
+        mixin :default
+      end
+
+      state :bracket_string do
+        mixin :bracket_close
+        mixin :variable_interpolation
+        mixin :default
+      end
+
+      state :bracket_comment do
+        mixin :bracket_close
+        mixin :default
+      end
+
+      state :variable_reference do
+        mixin :variable_interpolation
+
+        rule /}/, Str::Interpol, :pop!
+
+        mixin :default
+      end
+
+      state :quoted_argument do
+        mixin :variable_interpolation
+
+        rule /"/, Str::Double, :root
+        rule /\\[()#" \\$@^trn;]/, Str::Escape
+
+        mixin :default
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/coffeescript.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/coffeescript.rb
new file mode 100644
index 0000000..190abf4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/coffeescript.rb
@@ -0,0 +1,174 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Coffeescript < RegexLexer
+      tag 'coffeescript'
+      aliases 'coffee', 'coffee-script'
+      filenames '*.coffee', 'Cakefile'
+      mimetypes 'text/coffeescript'
+
+      title "CoffeeScript"
+      desc 'The Coffeescript programming language (coffeescript.org)'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'coffee'
+      end
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          for in of while break return continue switch when then if else
+          throw try catch finally new delete typeof instanceof super
+          extends this class by
+        )
+      end
+
+      def self.constants
+        @constants ||= Set.new %w(
+          true false yes no on off null NaN Infinity undefined
+        )
+      end
+
+      def self.builtins
+        @builtins ||= Set.new %w(
+          Array Boolean Date Error Function Math netscape Number Object
+          Packages RegExp String sun decodeURI decodeURIComponent
+          encodeURI encodeURIComponent eval isFinite isNaN parseFloat
+          parseInt document window
+        )
+      end
+
+      id = /[$a-zA-Z_][a-zA-Z0-9_]*/
+
+      state :comments_and_whitespace do
+        rule /\s+/m, Text
+        rule /###.*?###/m, Comment::Multiline
+        rule /#.*$/, Comment::Single
+      end
+
+      state :multiline_regex do
+        # this order is important, so that #{ isn't interpreted
+        # as a comment
+        mixin :has_interpolation
+        mixin :comments_and_whitespace
+
+        rule %r(///([gim]+\b|\B)), Str::Regex, :pop!
+        rule %r(/), Str::Regex
+        rule %r([^/#]+), Str::Regex
+      end
+
+      state :slash_starts_regex do
+        mixin :comments_and_whitespace
+        rule %r(///) do
+          token Str::Regex
+          goto :multiline_regex
+        end
+
+        rule %r(
+          /(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/ # a regex
+          ([gim]+\b|\B)
+        )x, Str::Regex, :pop!
+
+        rule(//) { pop! }
+      end
+
+      state :root do
+        rule(%r(^(?=\s|/|<!--))) { push :slash_starts_regex }
+        mixin :comments_and_whitespace
+        rule %r(
+          [+][+]|--|~|&&|\band\b|\bor\b|\bis\b|\bisnt\b|\bnot\b|[?]|:|=|
+          [|][|]|\\(?=\n)|(<<|>>>?|==?|!=?|[-<>+*`%&|^/])=?
+        )x, Operator, :slash_starts_regex
+
+        rule /[-=]>/, Name::Function
+
+        rule /(@)([ \t]*)(#{id})/ do
+          groups Name::Variable::Instance, Text, Name::Attribute
+          push :slash_starts_regex
+        end
+
+        rule /([.])([ \t]*)(#{id})/ do
+          groups Punctuation, Text, Name::Attribute
+          push :slash_starts_regex
+        end
+
+        rule /#{id}(?=\s*:)/, Name::Attribute, :slash_starts_regex
+
+        rule /#{id}/ do |m|
+          if self.class.keywords.include? m[0]
+            token Keyword
+          elsif self.class.constants.include? m[0]
+            token Name::Constant
+          elsif self.class.builtins.include? m[0]
+            token Name::Builtin
+          else
+            token Name::Other
+          end
+
+          push :slash_starts_regex
+        end
+
+        rule /[{(\[;,]/, Punctuation, :slash_starts_regex
+        rule /[})\].]/, Punctuation
+
+        rule /\d+[.]\d+([eE]\d+)?[fd]?/, Num::Float
+        rule /0x[0-9a-fA-F]+/, Num::Hex
+        rule /\d+/, Num::Integer
+        rule /"""/, Str, :tdqs
+        rule /'''/, Str, :tsqs
+        rule /"/, Str, :dqs
+        rule /'/, Str, :sqs
+      end
+
+      state :strings do
+        # all coffeescript strings are multi-line
+        rule /[^#\\'"]+/m, Str
+
+        rule /\\./, Str::Escape
+        rule /#/, Str
+      end
+
+      state :double_strings do
+        rule /'/, Str
+        mixin :has_interpolation
+        mixin :strings
+      end
+
+      state :single_strings do
+        rule /"/, Str
+        mixin :strings
+      end
+
+      state :interpolation do
+        rule /}/, Str::Interpol, :pop!
+        mixin :root
+      end
+
+      state :has_interpolation do
+        rule /[#][{]/, Str::Interpol, :interpolation
+      end
+
+      state :dqs do
+        rule /"/, Str, :pop!
+        mixin :double_strings
+      end
+
+      state :tdqs do
+        rule /"""/, Str, :pop!
+        rule /"/, Str
+        mixin :double_strings
+      end
+
+      state :sqs do
+        rule /'/, Str, :pop!
+        mixin :single_strings
+      end
+
+      state :tsqs do
+        rule /'''/, Str, :pop!
+        rule /'/, Str
+        mixin :single_strings
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/common_lisp.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/common_lisp.rb
new file mode 100644
index 0000000..cce55ee
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/common_lisp.rb
@@ -0,0 +1,345 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class CommonLisp < RegexLexer
+      title "Common Lisp"
+      desc "The Common Lisp variant of Lisp (common-lisp.net)"
+      tag 'common_lisp'
+      aliases 'cl', 'common-lisp', 'elisp', 'emacs-lisp'
+
+      filenames '*.cl', '*.lisp', '*.el' # used for Elisp too
+      mimetypes 'text/x-common-lisp'
+
+      # 638 functions
+      BUILTIN_FUNCTIONS = Set.new %w(
+        < <= = > >= - / /= * + 1- 1+ abort abs acons acos acosh add-method
+        adjoin adjustable-array-p adjust-array allocate-instance
+        alpha-char-p alphanumericp append apply apropos apropos-list
+        aref arithmetic-error-operands arithmetic-error-operation
+        array-dimension array-dimensions array-displacement
+        array-element-type array-has-fill-pointer-p array-in-bounds-p
+        arrayp array-rank array-row-major-index array-total-size
+        ash asin asinh assoc assoc-if assoc-if-not atan atanh atom
+        bit bit-and bit-andc1 bit-andc2 bit-eqv bit-ior bit-nand
+        bit-nor bit-not bit-orc1 bit-orc2 bit-vector-p bit-xor boole
+        both-case-p boundp break broadcast-stream-streams butlast
+        byte byte-position byte-size caaaar caaadr caaar caadar
+        caaddr caadr caar cadaar cadadr cadar caddar cadddr caddr
+        cadr call-next-method car cdaaar cdaadr cdaar cdadar cdaddr
+        cdadr cdar cddaar cddadr cddar cdddar cddddr cdddr cddr cdr
+        ceiling cell-error-name cerror change-class char char< char<=
+        char= char> char>= char/= character characterp char-code
+        char-downcase char-equal char-greaterp char-int char-lessp
+        char-name char-not-equal char-not-greaterp char-not-lessp
+        char-upcase cis class-name class-of clear-input clear-output
+        close clrhash code-char coerce compile compiled-function-p
+        compile-file compile-file-pathname compiler-macro-function
+        complement complex complexp compute-applicable-methods
+        compute-restarts concatenate concatenated-stream-streams conjugate
+        cons consp constantly constantp continue copy-alist copy-list
+        copy-pprint-dispatch copy-readtable copy-seq copy-structure
+        copy-symbol copy-tree cos cosh count count-if count-if-not
+        decode-float decode-universal-time delete delete-duplicates
+        delete-file delete-if delete-if-not delete-package denominator
+        deposit-field describe describe-object digit-char digit-char-p
+        directory directory-namestring disassemble documentation dpb
+        dribble echo-stream-input-stream echo-stream-output-stream
+        ed eighth elt encode-universal-time endp enough-namestring
+        ensure-directories-exist ensure-generic-function eq
+        eql equal equalp error eval evenp every exp export expt
+        fboundp fceiling fdefinition ffloor fifth file-author
+        file-error-pathname file-length file-namestring file-position
+        file-string-length file-write-date fill fill-pointer find
+        find-all-symbols find-class find-if find-if-not find-method
+        find-package find-restart find-symbol finish-output first
+        float float-digits floatp float-precision float-radix
+        float-sign floor fmakunbound force-output format fourth
+        fresh-line fround ftruncate funcall function-keywords
+        function-lambda-expression functionp gcd gensym gentemp get
+        get-decoded-time get-dispatch-macro-character getf gethash
+        get-internal-real-time get-internal-run-time get-macro-character
+        get-output-stream-string get-properties get-setf-expansion
+        get-universal-time graphic-char-p hash-table-count hash-table-p
+        hash-table-rehash-size hash-table-rehash-threshold
+        hash-table-size hash-table-test host-namestring identity
+        imagpart import initialize-instance input-stream-p inspect
+        integer-decode-float integer-length integerp interactive-stream-p
+        intern intersection invalid-method-error invoke-debugger
+        invoke-restart invoke-restart-interactively isqrt keywordp
+        last lcm ldb ldb-test ldiff length lisp-implementation-type
+        lisp-implementation-version list list* list-all-packages listen
+        list-length listp load load-logical-pathname-translations
+        log logand logandc1 logandc2 logbitp logcount logeqv
+        logical-pathname logical-pathname-translations logior
+        lognand lognor lognot logorc1 logorc2 logtest logxor
+        long-site-name lower-case-p machine-instance machine-type
+        machine-version macroexpand macroexpand-1 macro-function
+        make-array make-broadcast-stream make-concatenated-stream
+        make-condition make-dispatch-macro-character make-echo-stream
+        make-hash-table make-instance make-instances-obsolete make-list
+        make-load-form make-load-form-saving-slots make-package
+        make-pathname make-random-state make-sequence make-string
+        make-string-input-stream make-string-output-stream make-symbol
+        make-synonym-stream make-two-way-stream makunbound map mapc
+        mapcan mapcar mapcon maphash map-into mapl maplist mask-field
+        max member member-if member-if-not merge merge-pathnames
+        method-combination-error method-qualifiers min minusp mismatch mod
+        muffle-warning name-char namestring nbutlast nconc next-method-p
+        nintersection ninth no-applicable-method no-next-method not notany
+        notevery nreconc nreverse nset-difference nset-exclusive-or
+        nstring-capitalize nstring-downcase nstring-upcase nsublis
+        nsubst nsubst-if nsubst-if-not nsubstitute nsubstitute-if
+        nsubstitute-if-not nth nthcdr null numberp numerator nunion
+        oddp open open-stream-p output-stream-p package-error-package
+        package-name package-nicknames packagep package-shadowing-symbols
+        package-used-by-list package-use-list pairlis parse-integer
+        parse-namestring pathname pathname-device pathname-directory
+        pathname-host pathname-match-p pathname-name pathnamep
+        pathname-type pathname-version peek-char phase plusp
+        position position-if position-if-not pprint pprint-dispatch
+        pprint-fill pprint-indent pprint-linear pprint-newline pprint-tab
+        pprint-tabular prin1 prin1-to-string princ princ-to-string print
+        print-object probe-file proclaim provide random random-state-p
+        rassoc rassoc-if rassoc-if-not rational rationalize rationalp
+        read read-byte read-char read-char-no-hang read-delimited-list
+        read-from-string read-line read-preserving-whitespace
+        read-sequence readtable-case readtablep realp realpart
+        reduce reinitialize-instance rem remhash remove
+        remove-duplicates remove-if remove-if-not remove-method
+        remprop rename-file rename-package replace require rest
+        restart-name revappend reverse room round row-major-aref
+        rplaca rplacd sbit scale-float schar search second set
+        set-difference set-dispatch-macro-character set-exclusive-or
+        set-macro-character set-pprint-dispatch set-syntax-from-char
+        seventh shadow shadowing-import shared-initialize
+        short-site-name signal signum simple-bit-vector-p
+        simple-condition-format-arguments simple-condition-format-control
+        simple-string-p simple-vector-p sin sinh sixth sleep slot-boundp
+        slot-exists-p slot-makunbound slot-missing slot-unbound slot-value
+        software-type software-version some sort special-operator-p
+        sqrt stable-sort standard-char-p store-value stream-element-type
+        stream-error-stream stream-external-format streamp string string<
+        string<= string= string> string>= string/= string-capitalize
+        string-downcase string-equal string-greaterp string-left-trim
+        string-lessp string-not-equal string-not-greaterp string-not-lessp
+        stringp string-right-trim string-trim string-upcase sublis subseq
+        subsetp subst subst-if subst-if-not substitute substitute-if
+        substitute-if-not subtypepsvref sxhash symbol-function
+        symbol-name symbolp symbol-package symbol-plist symbol-value
+        synonym-stream-symbol syntax: tailp tan tanh tenth terpri third
+        translate-logical-pathname translate-pathname tree-equal truename
+        truncate two-way-stream-input-stream two-way-stream-output-stream
+        type-error-datum type-error-expected-type type-of
+        typep unbound-slot-instance unexport unintern union
+        unread-char unuse-package update-instance-for-different-class
+        update-instance-for-redefined-class upgraded-array-element-type
+        upgraded-complex-part-type upper-case-p use-package
+        user-homedir-pathname use-value values values-list vector vectorp
+        vector-pop vector-push vector-push-extend warn wild-pathname-p
+        write write-byte write-char write-line write-sequence write-string
+        write-to-string yes-or-no-p y-or-n-p zerop
+      ).freeze
+
+      SPECIAL_FORMS = Set.new %w(
+        block catch declare eval-when flet function go if labels lambda
+        let let* load-time-value locally macrolet multiple-value-call
+        multiple-value-prog1 progn progv quote return-from setq
+        symbol-macrolet tagbody the throw unwind-protect
+      )
+
+      MACROS = Set.new %w(
+        and assert call-method case ccase check-type cond ctypecase decf
+        declaim defclass defconstant defgeneric define-compiler-macro
+        define-condition define-method-combination define-modify-macro
+        define-setf-expander define-symbol-macro defmacro defmethod
+        defpackage defparameter defsetf defstruct deftype defun defvar
+        destructuring-bind do do* do-all-symbols do-external-symbols
+        dolist do-symbols dotimes ecase etypecase formatter
+        handler-bind handler-case ignore-errors incf in-package
+        lambda loop loop-finish make-method multiple-value-bind
+        multiple-value-list multiple-value-setq nth-value or pop
+        pprint-exit-if-list-exhausted pprint-logical-block pprint-pop
+        print-unreadable-object prog prog* prog1 prog2 psetf psetq
+        push pushnew remf restart-bind restart-case return rotatef
+        setf shiftf step time trace typecase unless untrace when
+        with-accessors with-compilation-unit with-condition-restarts
+        with-hash-table-iterator with-input-from-string with-open-file
+        with-open-stream with-output-to-string with-package-iterator
+        with-simple-restart with-slots with-standard-io-syntax
+      )
+
+      LAMBDA_LIST_KEYWORDS = Set.new %w(
+        &allow-other-keys &aux &body &environment &key &optional &rest
+        &whole
+      )
+
+      DECLARATIONS = Set.new %w(
+        dynamic-extent ignore optimize ftype inline special ignorable
+        notinline type
+      )
+
+      BUILTIN_TYPES = Set.new %w(
+        atom boolean base-char base-string bignum bit compiled-function
+        extended-char fixnum keyword nil signed-byte short-float
+        single-float double-float long-float simple-array
+        simple-base-string simple-bit-vector simple-string simple-vector
+        standard-char unsigned-byte
+
+        arithmetic-error cell-error condition control-error
+        division-by-zero end-of-file error file-error
+        floating-point-inexact floating-point-overflow
+        floating-point-underflow floating-point-invalid-operation
+        parse-error package-error print-not-readable program-error
+        reader-error serious-condition simple-condition simple-error
+        simple-type-error simple-warning stream-error storage-condition
+        style-warning type-error unbound-variable unbound-slot
+        undefined-function warning
+      )
+
+      BUILTIN_CLASSES = Set.new %w(
+        array broadcast-stream bit-vector built-in-class character
+        class complex concatenated-stream cons echo-stream file-stream
+        float function generic-function hash-table integer list
+        logical-pathname method-combination method null number package
+        pathname ratio rational readtable real random-state restart
+        sequence standard-class standard-generic-function standard-method
+        standard-object string-stream stream string structure-class
+        structure-object symbol synonym-stream t two-way-stream vector
+      )
+
+      nonmacro = /\\.|[a-zA-Z0-9!$%&*+-\/<=>?@\[\]^_{}~]/
+      constituent = /#{nonmacro}|[#.:]/
+      terminated = /(?=[ "'()\n,;`])/ # whitespace or terminating macro chars
+      symbol = /(\|[^\|]+\||#{nonmacro}#{constituent}*)/
+
+      state :root do
+        rule /\s+/m, Text
+        rule /;.*$/, Comment::Single
+        rule /#\|/, Comment::Multiline, :multiline_comment
+
+        # encoding comment
+        rule /#\d*Y.*$/, Comment::Special
+        rule /"(\\.|[^"\\])*"/, Str
+
+        rule /[:']#{symbol}/, Str::Symbol
+        rule /['`]/, Operator
+
+        # numbers
+        rule /[-+]?\d+\.?#{terminated}/, Num::Integer
+        rule %r([-+]?\d+/\d+#{terminated}), Num::Integer
+        rule %r(
+          [-+]?
+          (\d*\.\d+([defls][-+]?\d+)?
+          |\d+(\.\d*)?[defls][-+]?\d+)
+          #{terminated}
+        )x, Num::Float
+
+        # sharpsign strings and characters
+        rule /#\\.#{terminated}/, Str::Char
+        rule /#\\#{symbol}/, Str::Char
+
+        rule /#\(/, Operator, :root
+
+        # bitstring
+        rule /#\d*\*[01]*/, Other
+
+        # uninterned symbol
+        rule /#:#{symbol}/, Str::Symbol
+
+        # read-time and load-time evaluation
+        rule /#[.,]/, Operator
+
+        # function shorthand
+        rule /#'/, Name::Function
+
+        # binary rational
+        rule /#b[+-]?[01]+(\/[01]+)?/i, Num
+
+        # octal rational
+        rule /#o[+-]?[0-7]+(\/[0-7]+)?/i, Num::Oct
+
+        # hex rational
+        rule /#x[+-]?[0-9a-f]+(\/[0-9a-f]+)?/i, Num
+
+        # complex
+        rule /(#c)(\()/i do
+          groups Num, Punctuation
+          push :root
+        end
+
+        # arrays and structures
+        rule /(#(?:\d+a|s))(\()/i do
+          groups Str::Other, Punctuation
+          push :root
+        end
+
+        # path
+        rule /#p?"(\\.|[^"])*"/i, Str::Symbol
+
+        # reference
+        rule /#\d+[=#]/, Operator
+
+        # read-time comment
+        rule /#+nil#{terminated}\s*\(/, Comment, :commented_form
+
+        # read-time conditional
+        rule /#[+-]/, Operator
+
+        # special operators that should have been parsed already
+        rule /(,@|,|\.)/, Operator
+
+        # special constants
+        rule /(t|nil)#{terminated}/, Name::Constant
+
+        # functions and variables
+        # note that these get filtered through in stream_tokens
+        rule /\*#{symbol}\*/, Name::Variable::Global
+        rule symbol do |m|
+          sym = m[0]
+
+          if BUILTIN_FUNCTIONS.include? sym
+            token Name::Builtin
+          elsif SPECIAL_FORMS.include? sym
+            token Keyword
+          elsif MACROS.include? sym
+            token Name::Builtin
+          elsif LAMBDA_LIST_KEYWORDS.include? sym
+            token Keyword
+          elsif DECLARATIONS.include? sym
+            token Keyword
+          elsif BUILTIN_TYPES.include? sym
+            token Keyword::Type
+          elsif BUILTIN_CLASSES.include? sym
+            token Name::Class
+          else
+            token Name::Variable
+          end
+        end
+
+        rule /\(/, Punctuation, :root
+        rule /\)/, Punctuation do
+          if stack.empty?
+            token Error
+          else
+            token Punctuation
+            pop!
+          end
+        end
+      end
+
+      state :multiline_comment do
+        rule /#\|/, Comment::Multiline, :multiline_comment
+        rule /\|#/, Comment::Multiline, :pop!
+        rule /[^\|#]+/, Comment::Multiline
+        rule /[\|#]/, Comment::Multiline
+      end
+
+      state :commented_form do
+        rule /\(/, Comment, :commented_form
+        rule /\)/, Comment, :pop!
+        rule /[^()]+/, Comment
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/conf.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/conf.rb
new file mode 100644
index 0000000..6815c46
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/conf.rb
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Conf < RegexLexer
+      tag 'conf'
+      aliases 'config', 'configuration'
+
+      title "Config File"
+      desc 'A generic lexer for configuration files'
+      filenames '*.conf', '*.config'
+
+      # short and sweet
+      state :root do
+        rule /#.*?\n/, Comment
+        rule /".*?"/, Str::Double
+        rule /'.*?'/, Str::Single
+        rule /[a-z]\w*/i, Name
+        rule /\d+/, Num
+        rule /[^\d\w#"']+/, Text
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/coq.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/coq.rb
new file mode 100644
index 0000000..6766bc8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/coq.rb
@@ -0,0 +1,187 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Coq < RegexLexer
+      title "Coq"
+      desc 'Coq (coq.inria.fr)'
+      tag 'coq'
+      mimetypes 'text/x-coq'
+
+      def self.analyze_text(text)
+        return 0.3 if text.include? "Require"
+      end
+
+      def self.gallina
+        @gallina ||= Set.new %w(
+          as fun if in let match then else return end Type Set Prop
+          forall
+        )
+      end
+
+      def self.coq
+        @coq ||= Set.new %w(
+          Definition Theorem Lemma Remark Example Fixpoint CoFixpoint
+          Record Inductive CoInductive Corollary Goal Proof
+          Ltac Require Import Export Module Section End Variable
+          Context Polymorphic Monomorphic Universe Universes
+          Variables Class Instance Global Local Include
+          Printing Notation Infix Arguments Hint Rewrite Immediate
+          Qed Defined Opaque Transparent Existing
+          Compute Eval Print SearchAbout Search About Check
+        )
+      end
+
+      def self.ltac
+        @ltac ||= Set.new %w(
+          apply eapply auto eauto rewrite setoid_rewrite
+          with in as at destruct split inversion injection
+          intro intros unfold fold cbv cbn lazy subst
+          clear symmetry transitivity etransitivity erewrite
+          edestruct constructor econstructor eexists exists
+          f_equal refine instantiate revert simpl
+          specialize generalize dependent red induction
+          beta iota zeta delta exfalso autorewrite setoid_rewrite
+          compute vm_compute native_compute
+        )
+      end
+
+      def self.tacticals
+        @tacticals ||= Set.new %w(
+          repeat first try
+        )
+      end
+
+      def self.terminators
+        @terminators ||= Set.new %w(
+          omega solve congruence reflexivity exact
+          assumption eassumption
+        )
+      end
+
+      def self.keyopts
+        @keyopts ||= Set.new %w(
+          := => -> /\\ \\/ _ ; :> :
+        )
+      end
+
+      def self.end_sentence
+        @end_sentence ||= Punctuation::Indicator
+      end
+
+      def self.classify(x)
+        if self.coq.include? x
+          return Keyword
+        elsif self.gallina.include? x
+          return Keyword::Reserved
+        elsif self.ltac.include? x
+          return Keyword::Pseudo
+        elsif self.terminators.include? x
+          return Name::Exception
+        elsif self.tacticals.include? x
+          return Keyword::Pseudo
+        else
+          return Name::Constant
+        end
+      end
+
+      operator = %r([\[\];,{}_()!$%&*+./:<=>?@^|~#-]+)
+      id = /(?:[a-z][\w']*)|(?:[_a-z][\w']+)/i
+      dot_id = /\.((?:[a-z][\w']*)|(?:[_a-z][\w']+))/i
+      dot_space = /\.(\s+)/
+      module_type = /Module(\s+)Type(\s+)/
+      set_options = /(Set|Unset)(\s+)(Universe|Printing|Implicit|Strict)(\s+)(Polymorphism|All|Notations|Arguments|Universes|Implicit)(\s*)\./m
+
+      state :root do
+        rule /[(][*](?![)])/, Comment, :comment
+        rule /\s+/m, Text::Whitespace
+        rule module_type do |m|
+          token Keyword , 'Module'
+          token Text::Whitespace , m[1]
+          token Keyword , 'Type'
+          token Text::Whitespace , m[2]
+        end
+        rule set_options do |m|
+          token Keyword , m[1]
+          i = 2
+          while m[i] != ''
+            token Text::Whitespace , m[i]
+            token Keyword , m[i+1]
+            i += 2
+          end
+          token self.class.end_sentence , '.'
+        end
+        rule id do |m|
+          @name = m[0]
+          @continue = false
+          push :continue_id
+        end
+        rule /\/\\/, Operator
+        rule /\\\//, Operator
+        rule operator do |m|
+          match = m[0]
+          if self.class.keyopts.include? match
+            token Punctuation
+          else
+            token Operator
+          end
+        end
+
+        rule /-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float
+        rule /\d[\d_]*/, Num::Integer
+
+        rule /'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char
+        rule /'/, Keyword
+        rule /"/, Str::Double, :string
+        rule /[~?]#{id}/, Name::Variable
+      end
+
+      state :comment do
+        rule /[^(*)]+/, Comment
+        rule(/[(][*]/) { token Comment; push }
+        rule /[*][)]/, Comment, :pop!
+        rule /[(*)]/, Comment
+      end
+
+      state :string do
+        rule /[^\\"]+/, Str::Double
+        mixin :escape_sequence
+        rule /\\\n/, Str::Double
+        rule /"/, Str::Double, :pop!
+      end
+
+      state :continue_id do
+        # the stream starts with an id (stored in @name) and continues here
+        rule dot_id do |m|
+          token Name::Namespace , @name
+          token Punctuation , '.'
+          @continue = true
+          @name = m[1]
+        end
+        rule dot_space do |m|
+          if @continue
+            token Name::Constant , @name
+          else
+            token self.class.classify(@name) , @name
+          end
+          token self.class.end_sentence , '.'
+          token Text::Whitespace , m[1]
+          @name = false
+          @continue = false
+          pop!
+        end
+        rule // do
+          if @continue
+            token Name::Constant , @name
+          else
+            token self.class.classify(@name) , @name
+          end
+          @name = false
+          @continue = false
+          pop!
+        end
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/cpp.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/cpp.rb
new file mode 100644
index 0000000..ed270c7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/cpp.rb
@@ -0,0 +1,77 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    load_lexer 'c.rb'
+
+    class Cpp < C
+      title "C++"
+      desc "The C++ programming language"
+
+      tag 'cpp'
+      aliases 'c++'
+      # the many varied filenames of c++ source files...
+      filenames '*.cpp', '*.hpp',
+                '*.c++', '*.h++',
+                '*.cc',  '*.hh',
+                '*.cxx', '*.hxx',
+                '*.pde', '*.ino'
+      mimetypes 'text/x-c++hdr', 'text/x-c++src'
+
+      def self.keywords
+        @keywords ||= super + Set.new(%w(
+          asm catch const_cast delete dynamic_cast explicit export
+          friend mutable namespace new operator private protected public
+          reinterpret_cast restrict static_cast template this throw
+          throws typeid typename using virtual
+
+          alignas alignof constexpr decltype noexcept static_assert
+          thread_local try
+        ))
+      end
+
+      def self.keywords_type
+        @keywords_type ||= super + Set.new(%w(
+          bool
+        ))
+      end
+
+      def self.reserved
+        @reserved ||= super + Set.new(%w(
+          __virtual_inheritance __uuidof __super __single_inheritance
+          __multiple_inheritance __interface __event
+        ))
+      end
+
+      id = /[a-zA-Z_][a-zA-Z0-9_]*/
+
+      prepend :root do
+        # Offload C++ extensions, http://offload.codeplay.com/
+        rule /(?:__offload|__blockingoffload|__outer)\b/, Keyword::Pseudo
+      end
+
+      # digits with optional inner quotes
+      # see www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3781.pdf
+      dq = /\d('?\d)*/
+
+      prepend :statements do
+        rule /class\b/, Keyword, :classname
+        rule %r((#{dq}[.]#{dq}?|[.]#{dq})(e[+-]?#{dq}[lu]*)?)i, Num::Float
+        rule %r(#{dq}e[+-]?#{dq}[lu]*)i, Num::Float
+        rule /0x\h('?\h)*[lu]*/i, Num::Hex
+        rule /0[0-7]('?[0-7])*[lu]*/i, Num::Oct
+        rule /#{dq}[lu]*/i, Num::Integer
+        rule /\bnullptr\b/, Name::Builtin
+        rule /(?:u8|u|U|L)?R"([a-zA-Z0-9_{}\[\]#<>%:;.?*\+\-\/\^&|~!=,"']{,16})\(.*?\)\1"/m, Str
+      end
+
+      state :classname do
+        rule id, Name::Class, :pop!
+
+        # template specification
+        rule /\s*(?=>)/m, Text, :pop!
+        mixin :whitespace
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/csharp.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/csharp.rb
new file mode 100644
index 0000000..8cec04a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/csharp.rb
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class CSharp < RegexLexer
+      tag 'csharp'
+      aliases 'c#', 'cs'
+      filenames '*.cs'
+      mimetypes 'text/x-csharp'
+
+      title "C#"
+      desc 'a multi-paradigm language targeting .NET'
+
+      # TODO: support more of unicode
+      id = /@?[_a-z]\w*/i
+
+      #Reserved Identifiers
+      #Contextual Keywords
+      #LINQ Query Expressions
+      keywords = %w(
+        abstract as base break case catch checked const continue
+        default delegate do else enum event explicit extern false
+        finally fixed for foreach goto if implicit in interface
+        internal is lock new null operator out override params private
+        protected public readonly ref return sealed sizeof stackalloc
+        static switch this throw true try typeof unchecked unsafe
+        virtual void volatile while
+        add alias async await get global partial remove set value where
+        yield
+        ascending by descending equals from group in into join let on
+        orderby select
+      )
+
+      keywords_type = %w(
+        bool byte char decimal double dynamic float int long object
+        sbyte short string uint ulong ushort var
+      )
+
+      cpp_keywords = %w(
+        if endif else elif define undef line error warning region
+        endregion pragma
+      )
+
+      state :whitespace do
+        rule /\s+/m, Text
+        rule %r(//.*?\n), Comment::Single
+        rule %r(/[*].*?[*]/)m, Comment::Multiline
+      end
+
+      state :root do
+        mixin :whitespace
+
+        rule /^\s*\[.*?\]/, Name::Attribute
+        # rule /[$]\s*"/, Str, :splice_string
+        # rule /[$]\s*<#/, Str, :splice_recstring
+        # rule /<#/, Str, :recstring
+
+        rule /(<\[)\s*(#{id}:)?/, Keyword
+        rule /\]>/, Keyword
+
+        rule /[~!%^&*()+=|\[\]{}:;,.<>\/?-]/, Punctuation
+        rule /@"(\\.|.)*?"/, Str
+        rule /"(\\.|.)*?["\n]/, Str
+        rule /'(\\.|.)'/, Str::Char
+        rule /0x[0-9a-f]+[lu]?/i, Num
+        rule %r(
+          [0-9]
+          ([.][0-9]*)? # decimal
+          (e[+-][0-9]+)? # exponent
+          [fldu]? # type
+        )ix, Num
+        rule /^#[ \t]*(#{cpp_keywords.join('|')})\b.*?\n/,
+          Comment::Preproc
+        rule /\b(#{keywords.join('|')})\b/, Keyword
+        rule /\b(#{keywords_type.join('|')})\b/, Keyword::Type
+        rule /class|struct/, Keyword, :class
+        rule /namespace|using/, Keyword, :namespace
+        rule /#{id}(?=\s*[(])/, Name::Function
+        rule id, Name
+      end
+
+      state :class do
+        mixin :whitespace
+        rule id, Name::Class, :pop!
+      end
+
+      state :namespace do
+        mixin :whitespace
+        rule /(?=[(])/, Text, :pop!
+        rule /(#{id}|[.])+/, Name::Namespace, :pop!
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/css.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/css.rb
new file mode 100644
index 0000000..eb86093
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/css.rb
@@ -0,0 +1,273 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class CSS < RegexLexer
+      title "CSS"
+      desc "Cascading Style Sheets, used to style web pages"
+
+      tag 'css'
+      filenames '*.css'
+      mimetypes 'text/css'
+
+      identifier = /[a-zA-Z0-9_-]+/
+      number = /-?(?:[0-9]+(\.[0-9]+)?|\.[0-9]+)/
+
+      def self.attributes
+        @attributes ||= Set.new %w(
+          align-content align-items align-self alignment-adjust
+          alignment-baseline all anchor-point animation
+          animation-delay animation-direction animation-duration
+          animation-fill-mode animation-iteration-count animation-name
+          animation-play-state animation-timing-function appearance
+          azimuth backface-visibility background background-attachment
+          background-clip background-color background-image
+          background-origin background-position background-repeat
+          background-size baseline-shift binding bleed bookmark-label
+          bookmark-level bookmark-state bookmark-target border
+          border-bottom border-bottom-color border-bottom-left-radius
+          border-bottom-right-radius border-bottom-style
+          border-bottom-width border-collapse border-color
+          border-image border-image-outset border-image-repeat
+          border-image-slice border-image-source border-image-width
+          border-left border-left-color border-left-style
+          border-left-width border-radius border-right
+          border-right-color border-right-style border-right-width
+          border-spacing border-style border-top border-top-color
+          border-top-left-radius border-top-right-radius
+          border-top-style border-top-width border-width bottom
+          box-align box-decoration-break box-direction box-flex
+          box-flex-group box-lines box-ordinal-group box-orient
+          box-pack box-shadow box-sizing break-after break-before
+          break-inside caption-side clear clip clip-path
+          clip-rule color color-profile columns column-count
+          column-fill column-gap column-rule column-rule-color
+          column-rule-style column-rule-width column-span
+          column-width content counter-increment counter-reset
+          crop cue cue-after cue-before cursor direction display
+          dominant-baseline drop-initial-after-adjust
+          drop-initial-after-align drop-initial-before-adjust
+          drop-initial-before-align drop-initial-size
+          drop-initial-value elevation empty-cells filter fit
+          fit-position flex flex-basis flex-direction flex-flow
+          flex-grow flex-shrink flex-wrap float float-offset
+          font font-family font-feature-settings
+          font-kerning font-language-override font-size
+          font-size-adjust font-stretch font-style font-synthesis
+          font-variant font-variant-alternates font-variant-caps
+          font-variant-east-asian font-variant-ligatures
+          font-variant-numeric font-variant-position font-weight
+          grid-cell grid-column grid-column-align grid-column-sizing
+          grid-column-span grid-columns grid-flow grid-row
+          grid-row-align grid-row-sizing grid-row-span
+          grid-rows grid-template hanging-punctuation height
+          hyphenate-after hyphenate-before hyphenate-character
+          hyphenate-lines hyphenate-resource hyphens icon
+          image-orientation image-rendering image-resolution
+          ime-mode inline-box-align justify-content
+          left letter-spacing line-break line-height
+          line-stacking line-stacking-ruby line-stacking-shift
+          line-stacking-strategy list-style list-style-image
+          list-style-position list-style-type margin
+          margin-bottom margin-left margin-right margin-top
+          mark marker-offset marks mark-after mark-before
+          marquee-direction marquee-loop marquee-play-count
+          marquee-speed marquee-style mask max-height max-width
+          min-height min-width move-to nav-down
+          nav-index nav-left nav-right nav-up object-fit
+          object-position opacity order orphans outline
+          outline-color outline-offset outline-style
+          outline-width overflow overflow-style overflow-wrap
+          overflow-x overflow-y padding padding-bottom
+          padding-left padding-right padding-top
+          page page-break-after page-break-before
+          page-break-inside page-policy pause pause-after
+          pause-before perspective perspective-origin
+          phonemes pitch pitch-range play-during pointer-events
+          position presentation-level punctuation-trim quotes
+          rendering-intent resize rest rest-after rest-before
+          richness right rotation rotation-point ruby-align
+          ruby-overhang ruby-position ruby-span size speak
+          speak-as speak-header speak-numeral speak-punctuation
+          speech-rate src stress string-set
+          tab-size table-layout target target-name
+          target-new target-position text-align
+          text-align-last text-combine-horizontal
+          text-decoration text-decoration-color
+          text-decoration-line text-decoration-skip
+          text-decoration-style text-emphasis
+          text-emphasis-color text-emphasis-position
+          text-emphasis-style text-height text-indent
+          text-justify text-orientation text-outline
+          text-overflow text-rendering text-shadow
+          text-space-collapse text-transform
+          text-underline-position text-wrap top
+          transform transform-origin transform-style
+          transition transition-delay transition-duration
+          transition-property transition-timing-function
+          unicode-bidi vertical-align
+          visibility voice-balance voice-duration
+          voice-family voice-pitch voice-pitch-range
+          voice-range voice-rate voice-stress voice-volume
+          volume white-space widows width word-break
+          word-spacing word-wrap writing-mode z-index
+        )
+      end
+
+      def self.builtins
+        @builtins ||= Set.new %w(
+          above absolute always armenian aural auto avoid left bottom
+          baseline behind below bidi-override blink block bold bolder
+          both bottom capitalize center center-left center-right circle
+          cjk-ideographic close-quote collapse condensed continuous crop
+          cross crosshair cursive dashed decimal decimal-leading-zero
+          default digits disc dotted double e-resize embed expanded
+          extra-condensed extra-expanded fantasy far-left far-right fast
+          faster fixed georgian groove hebrew help hidden hide high higher
+          hiragana hiragana-iroha icon inherit inline inline-table inset
+          inside invert italic justify katakana katakana-iroha landscape
+          large larger left left-side leftwards level lighter line-through
+          list-item loud low lower lower-alpha lower-greek lower-roman
+          lowercase ltr medium message-box middle mix monospace n-resize
+          narrower ne-resize no-close-quote no-open-quote no-repeat none
+          normal nowrap nw-resize oblique once open-quote outset outside
+          overline pointer portrait px relative repeat repeat-x repeat-y
+          rgb ridge right right-side rightwards s-resize sans-serif scroll
+          se-resize semi-condensed semi-expanded separate serif show
+          silent slow slower small-caps small-caption smaller soft solid
+          spell-out square static status-bar super sw-resize table-caption
+          table-cell table-column table-column-group table-footer-group
+          table-header-group table-row table-row-group text text-bottom
+          text-top thick thin top transparent ultra-condensed
+          ultra-expanded underline upper-alpha upper-latin upper-roman
+          uppercase url visible w-resize wait wider x-fast x-high x-large
+          x-loud x-low x-small x-soft xx-large xx-small yes
+        )
+      end
+
+      def self.constants
+        @constants ||= Set.new %w(
+          indigo gold firebrick indianred yellow darkolivegreen
+          darkseagreen mediumvioletred mediumorchid chartreuse
+          mediumslateblue black springgreen crimson lightsalmon brown
+          turquoise olivedrab cyan silver skyblue gray darkturquoise
+          goldenrod darkgreen darkviolet darkgray lightpink teal
+          darkmagenta lightgoldenrodyellow lavender yellowgreen thistle
+          violet navy orchid blue ghostwhite honeydew cornflowerblue
+          darkblue darkkhaki mediumpurple cornsilk red bisque slategray
+          darkcyan khaki wheat deepskyblue darkred steelblue aliceblue
+          gainsboro mediumturquoise floralwhite coral purple lightgrey
+          lightcyan darksalmon beige azure lightsteelblue oldlace
+          greenyellow royalblue lightseagreen mistyrose sienna lightcoral
+          orangered navajowhite lime palegreen burlywood seashell
+          mediumspringgreen fuchsia papayawhip blanchedalmond peru
+          aquamarine white darkslategray ivory dodgerblue lemonchiffon
+          chocolate orange forestgreen slateblue olive mintcream
+          antiquewhite darkorange cadetblue moccasin limegreen saddlebrown
+          darkslateblue lightskyblue deeppink plum aqua darkgoldenrod
+          maroon sandybrown magenta tan rosybrown pink lightblue
+          palevioletred mediumseagreen dimgray powderblue seagreen snow
+          mediumblue midnightblue paleturquoise palegoldenrod whitesmoke
+          darkorchid salmon lightslategray lawngreen lightgreen tomato
+          hotpink lightyellow lavenderblush linen mediumaquamarine green
+          blueviolet peachpuff
+        )
+      end
+
+      # source: http://www.w3.org/TR/CSS21/syndata.html#vendor-keyword-history
+      def self.vendor_prefixes
+        @vendor_prefixes ||= Set.new %w(
+          -ah- -atsc- -hp- -khtml- -moz- -ms- -o- -rim- -ro- -tc- -wap-
+          -webkit- -xv- mso- prince-
+        )
+      end
+
+      state :root do
+        mixin :basics
+        rule /{/, Punctuation, :stanza
+        rule /:[:]?#{identifier}/, Name::Decorator
+        rule /\.#{identifier}/, Name::Class
+        rule /##{identifier}/, Name::Function
+        rule /@#{identifier}/, Keyword, :at_rule
+        rule identifier, Name::Tag
+        rule %r([~^*!%&\[\]()<>|+=@:;,./?-]), Operator
+        rule /"(\\\\|\\"|[^"])*"/, Str::Single
+        rule /'(\\\\|\\'|[^'])*'/, Str::Double
+      end
+
+      state :value do
+        mixin :basics
+        rule /url\(.*?\)/, Str::Other
+        rule /#[0-9a-f]{1,6}/i, Num # colors
+        rule /#{number}(?:%|(?:em|px|pt|pc|in|mm|cm|ex|rem|ch|vw|vh|vmin|vmax|dpi|dpcm|dppx|deg|grad|rad|turn|s|ms|Hz|kHz)\b)?/, Num
+        rule /[\[\]():\/.,]/, Punctuation
+        rule /"(\\\\|\\"|[^"])*"/, Str::Single
+        rule /'(\\\\|\\'|[^'])*'/, Str::Double
+        rule(identifier) do |m|
+          if self.class.constants.include? m[0]
+            token Name::Constant
+          elsif self.class.builtins.include? m[0]
+            token Name::Builtin
+          else
+            token Name
+          end
+        end
+      end
+
+      state :at_rule do
+        rule /{(?=\s*#{identifier}\s*:)/m, Punctuation, :at_stanza
+        rule /{/, Punctuation, :at_body
+        rule /;/, Punctuation, :pop!
+        mixin :value
+      end
+
+      state :at_body do
+        mixin :at_content
+        mixin :root
+      end
+
+      state :at_stanza do
+        mixin :at_content
+        mixin :stanza
+      end
+
+      state :at_content do
+        rule /}/ do
+          token Punctuation
+          pop! 2
+        end
+      end
+
+      state :basics do
+        rule /\s+/m, Text
+        rule %r(/\*(?:.*?)\*/)m, Comment
+      end
+
+      state :stanza do
+        mixin :basics
+        rule /}/, Punctuation, :pop!
+        rule /(#{identifier})(\s*)(:)/m do |m|
+          name_tok = if self.class.attributes.include? m[1]
+            Name::Label
+          elsif self.class.vendor_prefixes.any? { |p| m[1].start_with?(p) }
+            Name::Label
+          else
+            Name::Property
+          end
+
+          groups name_tok, Text, Punctuation
+
+          push :stanza_value
+        end
+      end
+
+      state :stanza_value do
+        rule /;/, Punctuation, :pop!
+        rule(/(?=})/) { pop! }
+        rule /!important\b/, Comment::Preproc
+        rule /^@.*?$/, Comment::Preproc
+        mixin :value
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/d.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/d.rb
new file mode 100644
index 0000000..a985e1d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/d.rb
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class D < RegexLexer
+      tag 'd'
+      aliases 'dlang'
+      filenames '*.d', '*.di'
+      mimetypes 'application/x-dsrc', 'text/x-dsrc'
+
+      title "D"
+      desc 'The D programming language(dlang.org)'
+
+      keywords = %w(
+        abstract alias align asm assert auto body
+        break case cast catch class const continue
+        debug default delegate delete deprecated do else
+        enum export extern finally final foreach_reverse
+        foreach for function goto if immutable import
+        interface invariant inout in is lazy mixin
+        module new nothrow out override package pragma
+        private protected public pure ref return scope
+        shared static struct super switch synchronized
+        template this throw try typedef typeid typeof
+        union unittest version volatile while with
+        __gshared __traits __vector __parameters
+      )
+
+      keywords_type = %w(
+        bool byte cdouble cent cfloat char creal
+        dchar double float idouble ifloat int ireal
+        long real short ubyte ucent uint ulong
+        ushort void wchar
+      )
+
+      keywords_pseudo = %w(
+        __FILE__ __MODULE__ __LINE__ __FUNCTION__ __PRETTY_FUNCTION__
+         __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__
+        __VERSION__
+      )
+
+      state :whitespace do
+        rule /\n/m, Text
+        rule /\s+/m, Text
+      end
+
+      state :root do
+        mixin :whitespace
+        # Comments
+        rule %r(//(.*?)\n), Comment::Single
+        rule %r(/(\\\n)?[*](.|\n)*?[*](\\\n)?/), Comment::Multiline
+        rule %r(/\+), Comment::Multiline, :nested_comment
+        # Keywords
+        rule /(#{keywords.join('|')})\b/, Keyword
+        rule /(#{keywords_type.join('|')})\b/, Keyword::Type
+        rule /(false|true|null)\b/, Keyword::Constant
+        rule /(#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo
+        rule /macro\b/, Keyword::Reserved
+        rule /(string|wstring|dstring|size_t|ptrdiff_t)\b/, Name::Builtin
+        # Literals
+        # HexFloat
+        rule /0[xX]([0-9a-fA-F_]*\.[0-9a-fA-F_]+|[0-9a-fA-F_]+)[pP][+\-]?[0-9_]+[fFL]?[i]?/, Num::Float
+        # DecimalFloat
+        rule /[0-9_]+(\.[0-9_]+[eE][+\-]?[0-9_]+|\.[0-9_]*|[eE][+\-]?[0-9_]+)[fFL]?[i]?/, Num::Float
+        rule /\.(0|[1-9][0-9_]*)([eE][+\-]?[0-9_]+)?[fFL]?[i]?/, Num::Float
+        # IntegerLiteral
+        # Binary
+        rule /0[Bb][01_]+/, Num::Bin
+        # Octal
+        # TODO: 0[0-7] isn't supported use octal![0-7] instead
+        rule /0[0-7_]+/, Num::Oct
+        # Hexadecimal
+        rule /0[xX][0-9a-fA-F_]+/, Num::Hex
+        # Decimal
+        rule /(0|[1-9][0-9_]*)([LUu]|Lu|LU|uL|UL)?/, Num::Integer
+        # CharacterLiteral
+        rule /'(\\['"?\\abfnrtv]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|\\&\w+;|.)'/, Str::Char
+        # StringLiteral
+        # WysiwygString
+        rule /r"[^"]*"[cwd]?/, Str
+        # Alternate WysiwygString
+        rule /`[^`]*`[cwd]?/, Str
+        # DoubleQuotedString
+        rule /"(\\\\|\\"|[^"])*"[cwd]?/, Str
+        # EscapeSequence
+        rule /\\(['\"?\\abfnrtv]|x[0-9a-fA-F]{2}|[0-7]{1,3}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|&\w+;)/, Str
+        # HexString
+        rule /x"[0-9a-fA-F_\s]*"[cwd]?/, Str
+        # DelimitedString
+        rule /q"\[/, Str, :delimited_bracket
+        rule /q"\(/, Str, :delimited_parenthesis
+        rule /q"</, Str, :delimited_angle
+        rule /q"\{/, Str, :delimited_curly
+        rule /q"([a-zA-Z_]\w*)\n.*?\n\1"/, Str
+        rule /q"(.).*?\1"/, Str
+        # TokenString
+        rule /q\{/, Str, :token_string
+        # Attributes
+        rule /@([a-zA-Z_]\w*)?/, Name::Decorator
+        # Tokens
+        rule %r`(~=|\^=|%=|\*=|==|!>=|!<=|!<>=|!<>|!<|!>|!=|>>>=|>>>|>>=|>>|>=|<>=|<>|<<=|<<|<=|\+\+|\+=|--|-=|\|\||\|=|&&|&=|\.\.\.|\.\.|/=)|[/.&|\-+<>!()\[\]{}?,;:$=*%^~]`, Punctuation
+        # Identifier
+        rule /[a-zA-Z_]\w*/, Name
+        # Line
+        rule /#line\s.*\n/, Comment::Special
+      end
+
+      state :nested_comment do
+        rule %r([^+/]+), Comment::Multiline
+        rule %r(/\+), Comment::Multiline, :push
+        rule %r(\+/), Comment::Multiline, :pop!
+        rule %r([+/]), Comment::Multiline
+      end
+
+      state :token_string do
+        rule /\{/, Punctuation, :token_string_nest
+        rule /\}/, Str, :pop!
+        mixin :root
+      end
+
+      state :token_string_nest do
+        rule /\{/, Punctuation, :push
+        rule /\}/, Punctuation, :pop!
+        mixin :root
+      end
+
+      state :delimited_bracket do
+        rule /[^\[\]]+/, Str
+        rule /\[/, Str, :delimited_inside_bracket
+        rule /\]"/, Str, :pop!
+      end
+
+      state :delimited_inside_bracket do
+        rule /[^\[\]]+/, Str
+        rule /\[/, Str, :push
+        rule /\]/, Str, :pop!
+      end
+
+      state :delimited_parenthesis do
+        rule /[^()]+/, Str
+        rule /\(/, Str, :delimited_inside_parenthesis
+        rule /\)"/, Str, :pop!
+      end
+
+      state :delimited_inside_parenthesis do
+        rule /[^()]+/, Str
+        rule /\(/, Str, :push
+        rule /\)/, Str, :pop!
+      end
+
+      state :delimited_angle do
+        rule /[^<>]+/, Str
+        rule /</, Str, :delimited_inside_angle
+        rule />"/, Str, :pop!
+      end
+
+      state :delimited_inside_angle do
+        rule /[^<>]+/, Str
+        rule /</, Str, :push
+        rule />/, Str, :pop!
+      end
+
+      state :delimited_curly do
+        rule /[^{}]+/, Str
+        rule /\{/, Str, :delimited_inside_curly
+        rule /\}"/, Str, :pop!
+      end
+
+      state :delimited_inside_curly do
+        rule /[^{}]+/, Str
+        rule /\{/, Str, :push
+        rule /\}/, Str, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/dart.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/dart.rb
new file mode 100644
index 0000000..e1884a1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/dart.rb
@@ -0,0 +1,104 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Dart < RegexLexer
+      title "Dart"
+      desc "The Dart programming language (dartlang.com)"
+
+      tag 'dart'
+      filenames '*.dart'
+      mimetypes 'text/x-dart'
+
+      keywords = %w(
+        as assert break case catch continue default do else finally for
+        if in is new rethrow return super switch this throw try while with
+      )
+
+      declarations = %w(
+        abstract dynamic const external extends factory final get implements
+        native operator set static typedef var
+      )
+
+      types = %w(bool double Dynamic enum int num Object Set String void)
+
+      imports = %w(import export library part\s*of part source)
+
+      id = /[a-zA-Z_]\w*/
+
+      state :root do
+        rule %r(^
+          (\s*(?:[a-zA-Z_][a-zA-Z\d_.\[\]]*\s+)+?) # return arguments
+          ([a-zA-Z_][\w]*)                          # method name
+          (\s*)(\()                                 # signature start
+        )mx do |m|
+          # TODO: do this better, this shouldn't need a delegation
+          delegate Dart, m[1]
+          token Name::Function, m[2]
+          token Text, m[3]
+          token Punctuation, m[4]
+        end
+
+        rule /\s+/, Text
+        rule %r(//.*?$), Comment::Single
+        rule %r(/\*.*?\*/)m, Comment::Multiline
+        rule /"/, Str, :dqs
+        rule /'/, Str, :sqs
+        rule /r"[^"]*"/, Str::Other
+        rule /r'[^']*'/, Str::Other
+        rule /##{id}*/i, Str::Symbol
+        rule /@#{id}/, Name::Decorator
+        rule /(?:#{keywords.join('|')})\b/, Keyword
+        rule /(?:#{declarations.join('|')})\b/, Keyword::Declaration
+        rule /(?:#{types.join('|')})\b/, Keyword::Type
+        rule /(?:true|false|null)\b/, Keyword::Constant
+        rule /(?:class|interface)\b/, Keyword::Declaration, :class
+        rule /(?:#{imports.join('|')})\b/, Keyword::Namespace, :import
+        rule /(\.)(#{id})/ do
+          groups Operator, Name::Attribute
+        end
+
+        rule /#{id}:/, Name::Label
+        rule /\$?#{id}/, Name
+        rule /[~^*!%&\[\](){}<>\|+=:;,.\/?-]/, Operator
+        rule /\d*\.\d+([eE]\-?\d+)?/, Num::Float
+        rule /0x[\da-fA-F]+/, Num::Hex
+        rule /\d+L?/, Num::Integer
+        rule /\n/, Text
+      end
+
+      state :class do
+        rule /\s+/m, Text
+        rule id, Name::Class, :pop!
+      end
+
+      state :dqs do
+        rule /"/, Str, :pop!
+        rule /[^\\\$"]+/, Str
+        mixin :string
+      end
+
+      state :sqs do
+        rule /'/, Str, :pop!
+        rule /[^\\\$']+/, Str
+        mixin :string
+      end
+
+      state :import do
+        rule /;/, Operator, :pop!
+        rule /(?:show|hide)\b/, Keyword::Declaration
+        mixin :root
+      end
+
+      state :string do
+        mixin :interpolation
+        rule /\\[nrt\"\'\\]/, Str::Escape
+      end
+
+      state :interpolation do
+        rule /\$#{id}/, Str::Interpol
+        rule /\$\{[^\}]+\}/, Str::Interpol
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/diff.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/diff.rb
new file mode 100644
index 0000000..ba23a71
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/diff.rb
@@ -0,0 +1,31 @@
+module Rouge
+  module Lexers
+    class Diff < RegexLexer
+      title 'diff'
+      desc 'Lexes unified diffs or patches'
+
+      tag 'diff'
+      aliases 'patch', 'udiff'
+      filenames '*.diff', '*.patch'
+      mimetypes 'text/x-diff', 'text/x-patch'
+
+      def self.analyze_text(text)
+        return 1   if text.start_with?('Index: ')
+        return 1   if text.start_with?('diff ')
+        return 0.9 if text.start_with?('--- ')
+      end
+
+      state :root do
+        rule(/^ .*$\n?/, Text)
+        rule(/^---$\n?/, Text)
+        rule(/^\+.*$\n?/, Generic::Inserted)
+        rule(/^-+.*$\n?/, Generic::Deleted)
+        rule(/^!.*$\n?/, Generic::Strong)
+        rule(/^@.*$\n?/, Generic::Subheading)
+        rule(/^([Ii]ndex|diff).*$\n?/, Generic::Heading)
+        rule(/^=.*$\n?/, Generic::Heading)
+        rule(/.*$\n?/, Text)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/eiffel.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/eiffel.rb
new file mode 100644
index 0000000..67ae667
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/eiffel.rb
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Eiffel < RegexLexer
+      title "Eiffel"
+      desc "Eiffel programming language"
+
+      tag 'eiffel'
+      filenames '*.e'
+      mimetypes 'text/x-eiffel'
+
+      LanguageKeywords = %w(
+        across agent alias all and attached as assign attribute check
+        class convert create debug deferred detachable do else elseif end
+        ensure expanded export external feature from frozen if implies  inherit
+        inspect invariant like local loop not note obsolete old once or
+        Precursor redefine rename require rescue retry select separate
+        some then undefine until variant Void when xor
+      )
+
+      BooleanConstants = %w(True False)
+
+      LanguageVariables = %w(Current Result)
+
+      SimpleString = /(?:[^"%\b\f\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)+?/
+
+      state :root do
+        rule /"\[/, Str::Other, :aligned_verbatim_string
+        rule /"\{/, Str::Other, :non_aligned_verbatim_string
+        rule /"(?:[^%\b\f\n\r\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)*?"/, Str::Double
+        rule /--.*/, Comment::Single
+        rule /'(?:[^%\b\f\n\r\t\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)'/, Str::Char
+
+        rule /(?:#{LanguageKeywords.join('|')})\b/, Keyword
+        rule /(?:#{LanguageVariables.join('|')})\b/, Keyword::Variable
+        rule /(?:#{BooleanConstants.join('|')})\b/, Keyword::Constant
+
+        rule  /\b0[xX][\da-fA-F](?:_*[\da-fA-F])*b/, Num::Hex
+        rule /\b0[cC][0-7](?:_*[0-7])*\b/, Num::Oct
+        rule /\b0[bB][01](?:_*[01])*\b/, Num::Bin
+        rule /\d(?:_*\d)*/, Num::Integer
+        rule /(?:\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?[eE][+-]?)?\d(?:_*\d)*|\d(?:_*\d)*\.?/, Num::Float
+
+        rule /:=|<<|>>|\(\||\|\)|->|\.|[{}\[\];(),:?]/, Punctuation::Indicator
+        rule /\\\\|\|\.\.\||\.\.|\/[~\/]?|[><\/]=?|[-+*^=~]/, Operator
+
+        rule /[A-Z][\dA-Z_]*/, Name::Class
+        rule /[A-Za-z][\dA-Za-z_]*/, Name
+        rule /\s+/, Text
+      end
+
+      state :aligned_verbatim_string do
+        rule /]"/, Str::Other, :pop!
+        rule SimpleString, Str::Other
+      end
+
+      state :non_aligned_verbatim_string do
+        rule /}"/, Str::Other, :pop!
+        rule SimpleString, Str::Other
+      end
+    end
+  end
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/elixir.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/elixir.rb
new file mode 100644
index 0000000..abdc301
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/elixir.rb
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    # Direct port of pygments Lexer.
+    # See: https://bitbucket.org/birkenfeld/pygments-main/src/7304e4759ae65343d89a51359ca538912519cc31/pygments/lexers/functional.py?at=default#cl-2362
+    class Elixir < RegexLexer
+      title "Elixir"
+      desc "Elixir language (elixir-lang.org)"
+
+      tag 'elixir'
+      aliases 'elixir', 'exs'
+
+      filenames '*.ex', '*.exs'
+
+      mimetypes 'text/x-elixir', 'application/x-elixir'
+
+      BRACES = [
+        ['\{', '\}', 'cb'],
+        ['\[', '\]', 'sb'],
+        ['\(', '\)', 'pa'],
+        ['\<', '\>', 'lt']
+      ]
+
+      state :root do
+        rule /\s+/m, Text
+        rule /#.*$/, Comment::Single
+        rule %r{\b(case|cond|end|bc|lc|if|unless|try|loop|receive|fn|defmodule|
+             defp?|defprotocol|defimpl|defrecord|defmacrop?|defdelegate|
+             defexception|exit|raise|throw|unless|after|rescue|catch|else)\b(?![?!])|
+             (?<!\.)\b(do|\-\>)\b}x, Keyword
+        rule /\b(import|require|use|recur|quote|unquote|super|refer)\b(?![?!])/, Keyword::Namespace
+        rule /(?<!\.)\b(and|not|or|when|xor|in)\b/, Operator::Word
+        rule %r{%=|\*=|\*\*=|\+=|\-=|\^=|\|\|=|
+             <=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|(?=[\s\t])\?|
+             (?<=[\s\t])!+|&(&&?|(?!\d))|\|\||\^|\*|\+|\-|/|
+             \||\+\+|\-\-|\*\*|\/\/|\<\-|\<\>|<<|>>|=|\.|~~~}x, Operator
+        rule %r{(?<!:)(:)([a-zA-Z_]\w*([?!]|=(?![>=]))?|\<\>|===?|>=?|<=?|
+             <=>|&&?|%\(\)|%\[\]|%\{\}|\+\+?|\-\-?|\|\|?|\!|//|[%&`/\|]|
+             \*\*?|=?~|<\-)|([a-zA-Z_]\w*([?!])?)(:)(?!:)}, Str::Symbol
+        rule /:"/, Str::Symbol, :interpoling_symbol
+        rule /\b(nil|true|false)\b(?![?!])|\b[A-Z]\w*\b/, Name::Constant
+        rule /\b(__(FILE|LINE|MODULE|MAIN|FUNCTION)__)\b(?![?!])/, Name::Builtin::Pseudo
+        rule /[a-zA-Z_!][\w_]*[!\?]?/, Name
+        rule %r{::|[%(){};,/\|:\\\[\]]}, Punctuation
+        rule /@[a-zA-Z_]\w*|&\d/, Name::Variable
+        rule %r{\b(0[xX][0-9A-Fa-f]+|\d(_?\d)*(\.(?![^\d\s])
+             (_?\d)*)?([eE][-+]?\d(_?\d)*)?|0[bB][01]+)\b}x, Num
+        rule %r{~r\/.*\/}, Str::Regex
+
+        mixin :strings
+      end
+
+      state :strings do
+        rule /(%[A-Ba-z])?"""(?:.|\n)*?"""/, Str::Doc
+        rule /'''(?:.|\n)*?'''/, Str::Doc
+        rule /"/, Str::Doc, :dqs
+        rule /'.*?'/, Str::Single
+        rule %r{(?<!\w)\?(\\(x\d{1,2}|\h{1,2}(?!\h)\b|0[0-7]{0,2}(?![0-7])\b[^x0MC])|(\\[MC]-)+\w|[^\s\\])}, Str::Other
+
+        BRACES.each do |_, _, name|
+          mixin :"braces_#{name}"
+        end
+      end
+
+      BRACES.each do |lbrace, rbrace, name|
+        state :"braces_#{name}" do
+          rule /%[a-z]#{lbrace}/, Str::Double, :"braces_#{name}_intp"
+          rule /%[A-Z]#{lbrace}/, Str::Double, :"braces_#{name}_no_intp"
+        end
+
+        state :"braces_#{name}_intp" do
+          rule /#{rbrace}[a-z]*/, Str::Double, :pop!
+          mixin :enddoublestr
+        end
+
+        state :"braces_#{name}_no_intp" do
+          rule /.*#{rbrace}[a-z]*/, Str::Double, :pop!
+        end
+      end
+
+      state :dqs do
+        rule /"/, Str::Double, :pop!
+        mixin :enddoublestr
+      end
+
+      state :interpoling do
+        rule /#\{/, Str::Interpol, :interpoling_string
+      end
+
+      state :interpoling_string do
+        rule /\}/, Str::Interpol, :pop!
+        mixin :root
+      end
+
+      state :interpoling_symbol do
+        rule /"/, Str::Symbol, :pop!
+        mixin :interpoling
+        rule /[^#"]+/, Str::Symbol
+      end
+
+      state :enddoublestr do
+        mixin :interpoling
+        rule /[^#"]+/, Str::Double
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/erb.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/erb.rb
new file mode 100644
index 0000000..9ca0284
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/erb.rb
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class ERB < TemplateLexer
+      title "ERB"
+      desc "Embedded ruby template files"
+
+      tag 'erb'
+      aliases 'eruby', 'rhtml'
+
+      filenames '*.erb', '*.erubis', '*.rhtml', '*.eruby'
+
+      def self.analyze_text(text)
+        return 0.4 if text =~ /<%.*%>/
+      end
+
+      def initialize(opts={})
+        @ruby_lexer = Ruby.new(opts)
+
+        super(opts)
+      end
+
+      start do
+        parent.reset!
+        @ruby_lexer.reset!
+      end
+
+      open  = /<%%|<%=|<%#|<%-|<%/
+      close = /%%>|-%>|%>/
+
+      state :root do
+        rule /<%#/, Comment, :comment
+
+        rule open, Comment::Preproc, :ruby
+
+        rule /.+?(?=#{open})|.+/m do
+          delegate parent
+        end
+      end
+
+      state :comment do
+        rule close, Comment, :pop!
+        rule /.+(?=#{close})|.+/m, Comment
+      end
+
+      state :ruby do
+        rule close, Comment::Preproc, :pop!
+
+        rule /.+?(?=#{close})|.+/m do
+          delegate @ruby_lexer
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/erlang.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/erlang.rb
new file mode 100644
index 0000000..aa0825b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/erlang.rb
@@ -0,0 +1,118 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Erlang < RegexLexer
+      title "Erlang"
+      desc "The Erlang programming language (erlang.org)"
+      tag 'erlang'
+      aliases 'erl'
+      filenames '*.erl', '*.hrl'
+
+      mimetypes 'text/x-erlang', 'application/x-erlang'
+
+      def self.analyze_text(text)
+        return 0.3 if text =~ /^-module[(]\w+[)][.]/
+      end
+
+      keywords = %w(
+        after begin case catch cond end fun if
+        let of query receive try when
+      )
+
+      builtins = %w(
+        abs append_element apply atom_to_list binary_to_list
+        bitstring_to_list binary_to_term bit_size bump_reductions
+        byte_size cancel_timer check_process_code delete_module
+        demonitor disconnect_node display element erase exit
+        float float_to_list fun_info fun_to_list
+        function_exported garbage_collect get get_keys
+        group_leader hash hd integer_to_list iolist_to_binary
+        iolist_size is_atom is_binary is_bitstring is_boolean
+        is_builtin is_float is_function is_integer is_list
+        is_number is_pid is_port is_process_alive is_record
+        is_reference is_tuple length link list_to_atom
+        list_to_binary list_to_bitstring list_to_existing_atom
+        list_to_float list_to_integer list_to_pid list_to_tuple
+        load_module localtime_to_universaltime make_tuple md5
+        md5_final md5_update memory module_loaded monitor
+        monitor_node node nodes open_port phash phash2
+        pid_to_list port_close port_command port_connect
+        port_control port_call port_info port_to_list
+        process_display process_flag process_info purge_module
+        put read_timer ref_to_list register resume_process
+        round send send_after send_nosuspend set_cookie
+        setelement size spawn spawn_link spawn_monitor
+        spawn_opt split_binary start_timer statistics
+        suspend_process system_flag system_info system_monitor
+        system_profile term_to_binary tl trace trace_delivered
+        trace_info trace_pattern trunc tuple_size tuple_to_list
+        universaltime_to_localtime unlink unregister whereis
+      )
+
+      operators = %r{(\+\+?|--?|\*|/|<|>|/=|=:=|=/=|=<|>=|==?|<-|!|\?)}
+      word_operators = %w(
+        and andalso band bnot bor bsl bsr bxor
+        div not or orelse rem xor
+      )
+
+      atom_re = %r{(?:[a-z][a-zA-Z0-9_]*|'[^\n']*[^\\]')}
+
+      variable_re = %r{(?:[A-Z_][a-zA-Z0-9_]*)}
+
+      escape_re = %r{(?:\\(?:[bdefnrstv\'"\\/]|[0-7][0-7]?[0-7]?|\^[a-zA-Z]))}
+
+      macro_re = %r{(?:#{variable_re}|#{atom_re})}
+
+      base_re = %r{(?:[2-9]|[12][0-9]|3[0-6])}
+
+      state :root do
+        rule(/\s+/, Text)
+        rule(/%.*\n/, Comment)
+        rule(%r{(#{keywords.join('|')})\b}, Keyword)
+        rule(%r{(#{builtins.join('|')})\b}, Name::Builtin)
+        rule(%r{(#{word_operators.join('|')})\b}, Operator::Word)
+        rule(/^-/, Punctuation, :directive)
+        rule(operators, Operator)
+        rule(/"/, Str, :string)
+        rule(/<</, Name::Label)
+        rule(/>>/, Name::Label)
+        rule %r{(#{atom_re})(:)} do
+          groups Name::Namespace, Punctuation
+        end
+        rule %r{(?:^|(?<=:))(#{atom_re})(\s*)(\()} do
+          groups Name::Function, Text, Punctuation
+        end
+        rule(%r{[+-]?#{base_re}#[0-9a-zA-Z]+}, Num::Integer)
+        rule(/[+-]?\d+/, Num::Integer)
+        rule(/[+-]?\d+.\d+/, Num::Float)
+        rule(%r{[\]\[:_@\".{}()|;,]}, Punctuation)
+        rule(variable_re, Name::Variable)
+        rule(atom_re, Name)
+        rule(%r{\?#{macro_re}}, Name::Constant)
+        rule(%r{\$(?:#{escape_re}|\\[ %]|[^\\])}, Str::Char)
+        rule(%r{##{atom_re}(:?\.#{atom_re})?}, Name::Label)
+      end
+
+      state :string do
+        rule(escape_re, Str::Escape)
+        rule(/"/, Str, :pop!)
+        rule(%r{~[0-9.*]*[~#+bBcdefginpPswWxX]}, Str::Interpol)
+        rule(%r{[^"\\~]+}, Str)
+        rule(/~/, Str)
+      end
+
+      state :directive do
+        rule %r{(define)(\s*)(\()(#{macro_re})} do
+          groups Name::Entity, Text, Punctuation, Name::Constant
+          pop!
+        end
+        rule %r{(record)(\s*)(\()(#{macro_re})} do
+          groups Name::Entity, Text, Punctuation, Name::Label
+          pop!
+        end
+        rule(atom_re, Name::Entity, :pop!)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/factor.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/factor.rb
new file mode 100644
index 0000000..84a3cbf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/factor.rb
@@ -0,0 +1,302 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Factor < RegexLexer
+      title "Factor"
+      desc "Factor, the practical stack language (factorcode.org)"
+      tag 'factor'
+      filenames '*.factor'
+      mimetypes 'text/x-factor'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'factor'
+      end
+
+      def self.builtins
+        @builtins ||= {}.tap do |builtins|
+          builtins[:kernel] = Set.new %w(
+            or 2bi 2tri while wrapper nip 4dip wrapper? bi*
+            callstack>array both? hashcode die dupd callstack
+            callstack? 3dup tri@ pick curry build ?execute 3bi prepose
+            >boolean if clone eq? tri* ? = swapd 2over 2keep 3keep clear
+            2dup when not tuple? dup 2bi* 2tri* call tri-curry object bi@
+            do unless* if* loop bi-curry* drop when* assert= retainstack
+            assert? -rot execute 2bi@ 2tri@ boa with either? 3drop bi
+            curry?  datastack until 3dip over 3curry tri-curry* tri-curry@
+            swap and 2nip throw bi-curry (clone) hashcode* compose 2dip if
+            3tri unless compose? tuple keep 2curry equal? assert tri 2drop
+            most <wrapper> boolean? identity-hashcode identity-tuple?
+            null new dip bi-curry@ rot xor identity-tuple boolean
+          )
+
+          builtins[:assocs] = Set.new %w(
+            ?at assoc? assoc-clone-like assoc= delete-at* assoc-partition
+            extract-keys new-assoc value? assoc-size map>assoc push-at
+            assoc-like key? assoc-intersect assoc-refine update
+            assoc-union assoc-combine at* assoc-empty? at+ set-at
+            assoc-all? assoc-subset?  assoc-hashcode change-at assoc-each
+            assoc-diff zip values value-at rename-at inc-at enum? at cache
+            assoc>map <enum> assoc assoc-map enum value-at* assoc-map-as
+            >alist assoc-filter-as clear-assoc assoc-stack maybe-set-at
+            substitute assoc-filter 2cache delete-at assoc-find keys
+            assoc-any? unzip
+          )
+
+          builtins[:combinators] = Set.new %w(
+            case execute-effect no-cond no-case? 3cleave>quot 2cleave
+            cond>quot wrong-values? no-cond? cleave>quot no-case case>quot
+            3cleave wrong-values to-fixed-point alist>quot case-find
+            cond cleave call-effect 2cleave>quot recursive-hashcode
+            linear-case-quot spread spread>quot
+          )
+
+          builtins[:math] = Set.new %w(
+            number= if-zero next-power-of-2 each-integer ?1+
+            fp-special? imaginary-part unless-zero float>bits number?
+            fp-infinity? bignum? fp-snan? denominator fp-bitwise= *
+            + power-of-2? - u>= / >= bitand log2-expects-positive <
+            log2 > integer? number bits>double 2/ zero? (find-integer)
+            bits>float float? shift ratio? even? ratio fp-sign bitnot
+            >fixnum complex? /i /f byte-array>bignum when-zero sgn >bignum
+            next-float u< u> mod recip rational find-last-integer >float
+            (all-integers?) 2^ times integer fixnum? neg fixnum sq bignum
+            (each-integer) bit? fp-qnan? find-integer complex <fp-nan>
+            real double>bits bitor rem fp-nan-payload all-integers?
+            real-part log2-expects-positive? prev-float align unordered?
+            float fp-nan? abs bitxor u<= odd? <= /mod rational? >integer
+            real? numerator
+          )
+
+          builtins[:sequences] = Set.new %w(
+            member-eq? append assert-sequence= find-last-from
+            trim-head-slice clone-like 3sequence assert-sequence? map-as
+            last-index-from reversed index-from cut* pad-tail
+            remove-eq! concat-as but-last snip trim-tail nths
+            nth 2selector sequence slice?  <slice> partition
+            remove-nth tail-slice empty? tail* if-empty
+            find-from virtual-sequence? member? set-length
+            drop-prefix unclip unclip-last-slice iota map-sum
+            bounds-error? sequence-hashcode-step selector-for
+            accumulate-as map start midpoint@ (accumulate) rest-slice
+            prepend fourth sift accumulate! new-sequence follow map! like
+            first4 1sequence reverse slice unless-empty padding virtual@
+            repetition? set-last index 4sequence max-length set-second
+            immutable-sequence first2 first3 replicate-as reduce-index
+            unclip-slice supremum suffix! insert-nth trim-tail-slice
+            tail 3append short count suffix concat flip filter sum
+            immutable? reverse! 2sequence map-integers delete-all start*
+            indices snip-slice check-slice sequence?  head map-find
+            filter! append-as reduce sequence= halves collapse-slice
+            interleave 2map filter-as binary-reduce slice-error? product
+            bounds-check? bounds-check harvest immutable virtual-exemplar
+            find produce remove pad-head last replicate set-fourth
+            remove-eq shorten reversed?  map-find-last 3map-as
+            2unclip-slice shorter? 3map find-last head-slice pop* 2map-as
+            tail-slice* but-last-slice 2map-reduce iota? collector-for
+            accumulate each selector append! new-resizable cut-slice
+            each-index head-slice* 2reverse-each sequence-hashcode
+            pop set-nth ?nth <flat-slice> second join when-empty
+            collector immutable-sequence? <reversed> all? 3append-as
+            virtual-sequence subseq? remove-nth! push-either new-like
+            length last-index push-if 2all? lengthen assert-sequence
+            copy map-reduce move third first 3each tail? set-first prefix
+            bounds-error any? <repetition> trim-slice exchange surround
+            2reduce cut change-nth min-length set-third produce-as
+            push-all head? delete-slice rest sum-lengths 2each head*
+            infimum remove! glue slice-error subseq trim replace-slice
+            push repetition map-index trim-head unclip-last mismatch
+          )
+
+          builtins[:namespaces] = Set.new %w(
+            global +@ change set-namestack change-global init-namespaces
+            on off set-global namespace set with-scope bind with-variable
+            inc dec counter initialize namestack get get-global make-assoc
+          )
+
+          builtins[:arrays] = Set.new %w(
+            <array> 2array 3array pair >array 1array 4array pair?
+            array resize-array array?
+          )
+
+          builtins[:io] = Set.new %w(
+            +character+ bad-seek-type? readln each-morsel
+            stream-seek read print with-output-stream contents
+            write1 stream-write1 stream-copy stream-element-type
+            with-input-stream stream-print stream-read stream-contents
+            stream-tell tell-output bl seek-output bad-seek-type nl
+            stream-nl write flush stream-lines +byte+ stream-flush
+            read1 seek-absolute? stream-read1 lines stream-readln
+            stream-read-until each-line seek-end with-output-stream*
+            seek-absolute with-streams seek-input seek-relative?
+            input-stream stream-write read-partial seek-end?
+            seek-relative error-stream read-until with-input-stream*
+            with-streams* tell-input each-block output-stream
+            stream-read-partial each-stream-block each-stream-line
+          )
+
+          builtins[:strings] = Set.new %w(
+            resize-string >string <string> 1string string string?
+          )
+
+          builtins[:vectors] = Set.new %w(
+            with-return restarts return-continuation with-datastack
+            recover rethrow-restarts <restart> ifcc set-catchstack
+            >continuation< cleanup ignore-errors restart?
+            compute-restarts attempt-all-error error-thread
+            continue <continuation> attempt-all-error? condition?
+            <condition> throw-restarts error catchstack continue-with
+            thread-error-hook continuation rethrow callcc1
+            error-continuation callcc0 attempt-all condition
+            continuation? restart return
+          )
+
+          builtins[:continuations] = Set.new %w(
+            with-return restarts return-continuation with-datastack
+            recover rethrow-restarts <restart> ifcc set-catchstack
+            >continuation< cleanup ignore-errors restart?
+            compute-restarts attempt-all-error error-thread
+            continue <continuation> attempt-all-error? condition?
+            <condition> throw-restarts error catchstack continue-with
+            thread-error-hook continuation rethrow callcc1
+            error-continuation callcc0 attempt-all condition
+            continuation? restart return
+          )
+        end
+      end
+
+      state :root do
+        rule /\s+/m, Text
+
+        rule /(:|::|MACRO:|MEMO:|GENERIC:|HELP:)(\s+)(\S+)/m do
+          groups Keyword, Text, Name::Function
+        end
+
+        rule /(M:|HOOK:|GENERIC#)(\s+)(\S+)(\s+)(\S+)/m do
+          groups Keyword, Text, Name::Class, Text, Name::Function
+        end
+
+        rule /\((?=\s)/, Name::Function, :stack_effect
+        rule /;(?=\s)/, Keyword
+
+        rule /(USING:)((?:\s|\\\s)+)/m do
+          groups Keyword::Namespace, Text
+          push :import
+        end
+
+        rule /(IN:|USE:|UNUSE:|QUALIFIED:|QUALIFIED-WITH:)(\s+)(\S+)/m do
+          groups Keyword::Namespace, Text, Name::Namespace
+        end
+
+        rule /(FROM:|EXCLUDE:)(\s+)(\S+)(\s+)(=>)/m do
+          groups Keyword::Namespace, Text, Name::Namespace, Text, Punctuation
+        end
+
+        rule /(?:ALIAS|DEFER|FORGET|POSTPONE):/, Keyword::Namespace
+
+        rule /(TUPLE:)(\s+)(\S+)(\s+)(<)(\s+)(\S+)/m do
+          groups(
+            Keyword, Text,
+            Name::Class, Text,
+            Punctuation, Text,
+            Name::Class
+          )
+          push :slots
+        end
+
+        rule /(TUPLE:)(\s+)(\S+)/m do
+          groups Keyword, Text, Name::Class
+          push :slots
+        end
+
+        rule /(UNION:|INTERSECTION:)(\s+)(\S+)/m do
+          groups Keyword, Text, Name::Class
+        end
+
+        rule /(PREDICATE:)(\s+)(\S+)(\s+)(<)(\s+)(\S+)/m do
+          groups(
+            Keyword, Text,
+            Name::Class, Text,
+            Punctuation, Text,
+            Name::Class
+          )
+        end
+
+        rule /(C:)(\s+)(\S+)(\s+)(\S+)/m do
+          groups(
+            Keyword, Text,
+            Name::Function, Text,
+            Name::Class
+          )
+        end
+
+        rule %r(
+          (INSTANCE|SLOT|MIXIN|SINGLETONS?|CONSTANT|SYMBOLS?|ERROR|SYNTAX
+           |ALIEN|TYPEDEF|FUNCTION|STRUCT):
+        )x, Keyword
+
+        rule /(?:<PRIVATE|PRIVATE>)/, Keyword::Namespace
+
+        rule /(MAIN:)(\s+)(\S+)/ do
+          groups Keyword::Namespace, Text, Name::Function
+        end
+
+        # strings
+        rule /"""\s+.*?\s+"""/, Str
+        rule /"(\\.|[^\\])*?"/, Str
+        rule /(CHAR:)(\s+)(\\[\\abfnrstv]*|\S)(?=\s)/, Str::Char
+
+        # comments
+        rule /!\s+.*$/, Comment
+        rule /#!\s+.*$/, Comment
+
+        # booleans
+        rule /[tf](?=\s)/, Name::Constant
+
+        # numbers
+        rule /-?\d+\.\d+(?=\s)/, Num::Float
+        rule /-?\d+(?=\s)/, Num::Integer
+
+        rule /HEX:\s+[a-fA-F\d]+(?=\s)/m, Num::Hex
+        rule /BIN:\s+[01]+(?=\s)/, Num::Bin
+        rule /OCT:\s+[0-7]+(?=\s)/, Num::Oct
+
+        rule %r([-+/*=<>^](?=\s)), Operator
+
+        rule /(?:deprecated|final|foldable|flushable|inline|recursive)(?=\s)/,
+          Keyword
+
+        rule /\S+/ do |m|
+          name = m[0]
+
+          if self.class.builtins.values.any? { |b| b.include? name }
+            token Name::Builtin
+          else
+            token Name
+          end
+        end
+      end
+
+      state :stack_effect do
+        rule /\s+/, Text
+        rule /\(/, Name::Function, :stack_effect
+        rule /\)/, Name::Function, :pop!
+
+        rule /--/, Name::Function
+        rule /\S+/, Name::Variable
+      end
+
+      state :slots do
+        rule /\s+/, Text
+        rule /;(?=\s)/, Keyword, :pop!
+        rule /\S+/, Name::Variable
+      end
+
+      state :import do
+        rule /;(?=\s)/, Keyword, :pop!
+        rule /\s+/, Text
+        rule /\S+/, Name::Namespace
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/fortran.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/fortran.rb
new file mode 100644
index 0000000..bf04f04
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/fortran.rb
@@ -0,0 +1,142 @@
+# -*- coding: utf-8 -*- #
+# vim: set ts=2 sw=2 et:
+
+# TODO: Implement format list support.
+
+module Rouge
+  module Lexers
+    class Fortran < RegexLexer
+      title "Fortran"
+      desc "Fortran 95 Programming Language"
+
+      tag 'fortran'
+      filenames '*.f90', '*.f95',
+                '*.F90', '*.F95'
+      mimetypes 'text/x-fortran'
+
+      name = /[A-Z][_A-Z0-9]*/i
+      kind_param = /(\d+|#{name})/
+      exponent = /[ED][+-]\d+/
+
+      def self.keywords
+        # Fortran allows to omit whitespace between certain keywords...
+        @keywords ||= Set.new %w(
+          allocatable allocate assignment backspace block blockdata call case
+          close common contains continue cycle data deallocate default
+          dimension do elemental else elseif elsewhere end endblockdata enddo
+          endfile endforall endfunction endif endinterface endmodule endprogram
+          endselect endsubroutine endtype endwhere entry equivalence exit
+          external forall format function go goto if implicit in include inout
+          inquire intent interface intrinsic module namelist none nullify only
+          open operator optional out parameter pointer print private procedure
+          program public pure read recursive result return rewind save select
+          selectcase sequence stop subroutine target then to type use where
+          while write
+        )
+      end
+
+      def self.types
+        @types ||= Set.new %w(
+          character complex double precision doubleprecision integer logical real
+        )
+      end
+
+      def self.intrinsics
+        @intrinsics ||= Set.new %w(
+          abs achar acos adjustl adjustr aimag aint all allocated anint any
+          asin associated atan atan2 bit_size btest ceiling char cmplx conjg
+          cos cosh count cpu_time cshift date_and_time dble digits dim
+          dot_product dprod eoshift epsilon exp exponent floor fraction huge
+          iachar iand ibclr ibits ibset ichar ieor index int ior ishift ishiftc
+          kind lbound len len_trim lge lgt lle llt log log10 logical matmul max
+          maxexponent maxloc maxval merge min minexponent minloc minval mod
+          modulo mvbits nearest nint not null pack precision present product
+          radix random_number random_seed range real repeat reshape rrspacing
+          scale scan selected_int_kind selected_real_kind set_exponent shape
+          sign sin sinh size spacing spread sqrt sum system_clock tan tanh tiny
+          transfer transpose trim ubound unpack verify
+        )
+      end
+
+      state :root do
+        rule /[\s\n]+/, Text::Whitespace
+        rule /!.*$/, Comment::Single
+        rule /^#.*$/, Comment::Preproc
+
+        rule /::|[()\/;,:&]/, Punctuation
+
+        # TODO: This does not take into account line continuation.
+        rule /^(\s*)([0-9]+)\b/m do |m|
+          token Text::Whitespace, m[1]
+          token Name::Label, m[2]
+        end
+
+        # Format statements are quite a strange beast.
+        # Better process them in their own state.
+        rule /\b(FORMAT)(\s*)(\()/mi do |m|
+          token Keyword, m[1]
+          token Text::Whitespace, m[2]
+          token Punctuation, m[3]
+          push :format_spec
+        end
+
+        rule %r(
+          [+-]? # sign
+          (
+            (\d+[.]\d*|[.]\d+)(#{exponent})?
+            | \d+#{exponent} # exponent is mandatory
+          )
+          (_#{kind_param})? # kind parameter
+        )xi, Num::Float
+
+        rule /[+-]?\d+(_#{kind_param})?/i, Num::Integer
+        rule /B'[01]+'|B"[01]+"/i, Num::Bin
+        rule /O'[0-7]+'|O"[0-7]+"/i, Num::Oct
+        rule /Z'[0-9A-F]+'|Z"[0-9A-F]+"/i, Num::Hex
+        rule /(#{kind_param}_)?'/, Str::Single, :string_single
+        rule /(#{kind_param}_)?"/, Str::Double, :string_double
+        rule /[.](TRUE|FALSE)[.](_#{kind_param})?/i, Keyword::Constant
+
+        rule %r{\*\*|//|==|/=|<=|>=|=>|[-+*/<>=%]}, Operator
+        rule /\.(?:EQ|NE|LT|LE|GT|GE|NOT|AND|OR|EQV|NEQV|[A-Z]+)\./i, Operator::Word
+
+        rule /#{name}/m do |m|
+          match = m[0].downcase
+          if self.class.keywords.include? match
+            token Keyword
+          elsif self.class.types.include? match
+            token Keyword::Type
+          elsif self.class.intrinsics.include? match
+            token Name::Builtin
+          else
+            token Name
+          end
+        end
+
+      end
+
+      state :string_single do
+        rule /[^']+/, Str::Single
+        rule /''/, Str::Escape
+        rule /'/, Str::Single, :pop!
+      end
+
+      state :string_double do
+        rule /[^"]+/, Str::Double
+        rule /""/, Str::Escape
+        rule /"/, Str::Double, :pop!
+      end
+
+      state :format_spec do
+        rule /'/, Str::Single, :string_single
+        rule /"/, Str::Double, :string_double
+        rule /\(/, Punctuation, :format_spec
+        rule /\)/, Punctuation, :pop!
+        rule /,/, Punctuation
+        rule /[\s\n]+/, Text::Whitespace
+        # Edit descriptors could be seen as a kind of "format literal".
+        rule /[^\s'"(),]+/, Literal
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/gherkin.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/gherkin.rb
new file mode 100644
index 0000000..6edee5e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/gherkin.rb
@@ -0,0 +1,137 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Gherkin < RegexLexer
+      tag 'gherkin'
+      aliases 'cucumber', 'behat'
+
+      title "Gherkin"
+      desc 'A business-readable spec DSL ( github.com/cucumber/cucumber/wiki/Gherkin )'
+
+      filenames '*.feature'
+      mimetypes 'text/x-gherkin'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'cucumber'
+      end
+
+      # self-modifying method that loads the keywords file
+      def self.keywords
+        load Pathname.new(__FILE__).dirname.join('gherkin/keywords.rb')
+        keywords
+      end
+
+      def self.step_regex
+        # in Gherkin's config, keywords that end in < don't
+        # need word boundaries at the ends - all others do.
+        @step_regex ||= Regexp.new(
+          keywords[:step].map do |w|
+            if w.end_with? '<'
+              Regexp.escape(w.chop)
+            else
+              "#{Regexp.escape(w)}\\b"
+            end
+          end.join('|')
+        )
+      end
+
+      rest_of_line = /.*?(?=[#\n])/
+
+      state :basic do
+        rule %r(#.*$), Comment
+        rule /[ \r\t]+/, Text
+      end
+
+      state :root do
+        mixin :basic
+        rule %r(\n), Text
+        rule %r(""".*?""")m, Str
+        rule %r(@[^\s@]+), Name::Tag
+        mixin :has_table
+        mixin :has_examples
+      end
+
+      state :has_scenarios do
+        rule %r((.*?)(:)) do |m|
+          reset_stack
+
+          keyword = m[1]
+          keyword_tok = if self.class.keywords[:element].include? keyword
+            push :description; Keyword::Namespace
+          elsif self.class.keywords[:feature].include? keyword
+            push :feature_description; Keyword::Declaration
+          elsif self.class.keywords[:examples].include? keyword
+            push :example_description; Name::Namespace
+          else
+            Error
+          end
+
+          groups keyword_tok, Punctuation
+        end
+      end
+
+      state :has_examples do
+        mixin :has_scenarios
+        rule Gherkin.step_regex, Name::Function do
+          token Name::Function
+          reset_stack; push :step
+        end
+      end
+
+      state :has_table do
+        rule(/(?=[|])/) { push :table_header }
+      end
+
+      state :table_header do
+        rule /[^|\s]+/, Name::Variable
+        rule /\n/ do
+          token Text
+          goto :table
+        end
+        mixin :table
+      end
+
+      state :table do
+        mixin :basic
+        rule /\n/, Text, :table_bol
+        rule /[|]/, Punctuation
+        rule /[^|\s]+/, Name
+      end
+
+      state :table_bol do
+        rule(/(?=\s*[^\s|])/) { reset_stack }
+        rule(//) { pop! }
+      end
+
+      state :description do
+        mixin :basic
+        mixin :has_examples
+        rule /\n/, Text
+        rule rest_of_line, Text
+      end
+
+      state :feature_description do
+        mixin :basic
+        mixin :has_scenarios
+        rule /\n/, Text
+        rule rest_of_line, Text
+      end
+
+      state :example_description do
+        mixin :basic
+        mixin :has_table
+        rule /\n/, Text
+        rule rest_of_line, Text
+      end
+
+      state :step do
+        mixin :basic
+        rule /<.*?>/, Name::Variable
+        rule /".*?"/, Str
+        rule /\S+/, Text
+        rule rest_of_line, Text, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/gherkin/keywords.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/gherkin/keywords.rb
new file mode 100644
index 0000000..4f5ab35
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/gherkin/keywords.rb
@@ -0,0 +1,14 @@
+# -*- coding: utf-8 -*- #
+# automatically generated by `rake builtins:gherkin`
+module Rouge
+  module Lexers
+    def Gherkin.keywords
+      @keywords ||= {}.tap do |k|
+        k[:feature] = Set.new ["Ability", "Ahoy matey!", "Arwedd", "Aspekt", "Besigheid Behoefte", "Business Need", "Caracteristica", "Característica", "Egenskab", "Egenskap", "Eiginleiki", "Feature", "Fitur", "Fonctionnalité", "Fonksyonalite", "Funcionalidade", "Funcionalitat", "Functionalitate", "Functionaliteit", "Funcţionalitate", "Funcționalitate", "Fungsi", "Funkcia", "Funkcija", "Funkcionalitāte", "Funkcionalnost", "Funkcja", "Funksie", "Funktionalität", "Funktionalitéit", "Funzionalità", "Fīča", "Hwaet", "Hwæt", "Jellemző", "Karakteristik", "Lastnost", "Mak", "Mogucnost", "Mogućnost", "Moznosti", "Možnosti", "OH HAI", "Omadus", "Ominaisuus", "Osobina", "Potrzeba biznesowa", "Požadavek", "Požiadavka", "Pretty much", "Qap", "Qu'meH 'ut", "Savybė", "Trajto", "Tính năng", "Vermoë", "Vlastnosť", "Właściwość", "Značilnost", "laH", "perbogh", "poQbogh malja'", "Özellik", "Δυνατότητα", "Λειτουργία", "Могућност", "Мөмкинлек", "Особина", "Свойство", "Функционал", "Функционалност", "Функция", "Функціонал", "Үзенчәлеклелек", "תכונה", "خاصية", "خصوصیت", "صلاحیت", "وِیژگی", "کاروبار کی ضرورت", "रूप लेख", "ਖਾਸੀਅਤ", "ਨਕਸ਼ ਨੁਹਾਰ", "ਮੁਹਾਂਦਰਾ", "గుణము", "ಹೆಚ್ಚಳ", "ความต้องการทางธุรกิจ", "ความสามารถ", "โครงหลัก", "フィーチャ", "功能", "機能", "기능"]
+        k[:element] = Set.new ["Abstract Scenario", "Abstrakt Scenario", "Achtergrond", "Aer", "Agtergrond", "All y'all", "Antecedentes", "Antecedents", "Atburðarás", "Awww, look mate", "B4", "Background", "Baggrund", "Bakgrund", "Bakgrunn", "Bakgrunnur", "Bối cảnh", "Cefndir", "Cenario", "Cenario de Fundo", "Cenário", "Cenário de Fundo", "Contesto", "Context", "Contexte", "Contexto", "Dasar", "Delineacao do Cenario", "Delineação do Cenário", "Dis is what went down", "Dyagram Senaryo", "Dyagram senaryo", "Esbozo do escenario", "Escenari", "Escenario", "Esquema de l'escenari", "Esquema del escenario", "Esquema do Cenario", "Esquema do Cenário", "First off", "Fono", "Forgatókönyv", "Forgatókönyv vázlat", "Fundo", "Geçmiş", "Grundlage", "Hannergrond", "Heave to", "Háttér", "Istorik", "Keadaan", "Khung kịch bản", "Khung tình huống", "Koncept", "Konsep skenario", "Kontekst", "Kontekstas", "Konteksts", "Kontext", "Konturo de la scenaro", "Kontèks", "Kịch bản", "Latar Belakang", "Lýsing Atburðarásar", "Lýsing Dæma", "MISHUN", "MISHUN SRSLY", "Menggariskan Senario", "Náčrt Scenára", "Náčrt Scenáru", "Náčrt Scénáře", "Oris scenarija", "Osnova", "Osnova Scenára", "Osnova scénáře", "Osnutek", "Ozadje", "Plan Senaryo", "Plan du Scénario", "Plan du scénario", "Plan senaryo", "Plang vum Szenario", "Pozadie", "Pozadina", "Pozadí", "Primer", "Raamstsenaarium", "Reckon it's like", "Rerefons", "Scenarie", "Scenarij", "Scenarijaus šablonas", "Scenarijus", "Scenario", "Scenario Amlinellol", "Scenario Outline", "Scenario Template", "Scenariomal", "Scenariomall", "Scenariu", "Scenariusz", "Scenaro", "Scenár", "Scenārijs", "Scenārijs pēc parauga", "Schema dello scenario", "Scénario", "Scénář", "Senario", "Senaryo", "Senaryo Deskripsyon", "Senaryo deskripsyon", "Senaryo taslağı", "Shiver me timbers", "Situai", "Situasie", "Situasie Uiteensetting", "Situācija", "Skenario", "Skenario konsep", "Skica", "Structura scenariu", "Structură scenariu", "Struktura scenarija", "Stsenaarium", "Swa", "Swa hwaer swa", "Swa hwær swa", "Szablon scenariusza", "Szenario", "Szenariogrundriss", "Tapaus", "Tapausaihio", "Taust", "Tausta", "Template Keadaan", "Template Senario", "Template Situai", "The thing of it is", "Tình huống", "Wharrimean is", "Yo-ho-ho", "Założenia", "lut", "lut chovnatlh", "mo'", "Ær", "Περιγραφή Σεναρίου", "Σενάριο", "Υπόβαθρο", "Кереш", "Контекст", "Концепт", "Основа", "Передумова", "Позадина", "Предистория", "Предыстория", "Пример", "Рамка на сценарий", "Скица", "Структура сценария", "Структура сценарија", "Структура сценарію", "Сценарий", "Сценарий структураси", "Сценарийның төзелеше", "Сценарио", "Сценарій", "Тарих", "רקע", "תבנית תרחיש", "תרחיש", "الخلفية", "الگوی سناریو", "زمینه", "سناریو", "سيناريو", "سيناريو مخطط", "منظر نامے کا خاکہ", "منظرنامہ", "پس منظر", "परिदृश्य", "परिदृश्य रूपरेखा", "पृष्ठभूमि", "ਪਟਕਥਾ", "ਪਟਕਥਾ ਢਾਂਚਾ", "ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ", "ਪਿਛੋਕੜ", "కథనం", "నేపథ్యం", "సన్నివేశం", "ಕಥಾಸಾರಾಂಶ", "ವಿವರಣೆ", "ಹಿನ್ನೆಲೆ", "สรุปเหตุการณ์", "เหตุการณ์", "แนวคิด", "โครงสร้างของเหตุการณ์", "シナリオ", "シナリオアウトライン", "シナリオテンプレ", "シナリオテンプレート", "テンプレ", "剧本", "剧本大纲", "劇本", "劇本大綱", "场景", "场景大纲", "場景", "場景大綱", "背景", "배경", "시나리오", "시나리오 개요"]
+        k[:examples] = Set.new ["Atburðarásir", "Beispiele", "Beispiller", "Cenarios", "Cenários", "Conto", "Contoh", "Contone", "Dead men tell no tales", "Dæmi", "Dữ liệu", "EXAMPLZ", "Egzanp", "Ejemplos", "Eksempler", "Ekzemploj", "Enghreifftiau", "Esempi", "Examples", "Exempel", "Exemple", "Exemples", "Exemplos", "Juhtumid", "Paraugs", "Pavyzdžiai", "Piemēri", "Primeri", "Primjeri", "Przykłady", "Príklady", "Példák", "Příklady", "Scenarijai", "Scenariji", "Scenarios", "Se the", "Se ðe", "Se þe", "Tapaukset", "Variantai", "Voorbeelde", "Voorbeelden", "You'll wanna", "ghantoH", "lutmey", "Örnekler", "Παραδείγματα", "Σενάρια", "Мисаллар", "Мисоллар", "Приклади", "Примери", "Примеры", "Сценарији", "Үрнәкләр", "דוגמאות", "امثلة", "مثالیں", "نمونه ها", "उदाहरण", "ਉਦਾਹਰਨਾਂ", "ఉదాహరణలు", "ಉದಾಹರಣೆಗಳು", "ชุดของตัวอย่าง", "ชุดของเหตุการณ์", "サンプル", "例", "例子", "예"]
+        k[:step] = Set.new ["'a", "'ach", "'ej", "*", "7", "A", "A taktiež", "A také", "A tiež", "A zároveň", "AN", "Aber", "Ac", "Adott", "Ak", "Akkor", "Ale", "Aleshores", "Ali", "Allora", "Alors", "Als", "Ama", "Amennyiben", "Amikor", "Ampak", "An", "Ananging", "And", "And y'all", "Angenommen", "Anrhegedig a", "Apabila", "Atesa", "Atunci", "Atès", "Avast!", "Aye", "BUT", "Bagi", "Banjur", "Bet", "Biết", "Blimey!", "Buh", "But", "But at the end of the day I reckon", "But y'all", "Cal", "Cand", "Cando", "Ce", "Cho", "Cuando", "Când", "DEN", "DaH ghu' bejlu'", "Dada", "Dadas", "Dado", "Dados", "Dan", "Dann", "Dano", "Dar", "Dat fiind", "Data", "Date", "Date fiind", "Dati", "Dati fiind", "Dato", "Daţi fiind", "Dați fiind", "De", "Den youse gotta", "Dengan", "Diberi", "Diyelim ki", "Do", "Donada", "Donat", "Donitaĵo", "Dun", "Duota", "E", "Eeldades", "Ef", "En", "Entao", "Entonces", "Então", "Entón", "Epi", "Et", "Etant donné", "Etant donnée", "Etant données", "Etant donnés", "Eğer ki", "Fakat", "Gangway!", "Gdy", "Gegeben sei", "Gegeben seien", "Gegeven", "Gegewe", "Gitt", "Given", "Given y'all", "Givet", "Givun", "Ha", "I", "I CAN HAZ", "In", "Ir", "It's just unbelievable", "Ja", "Jeśli", "Jeżeli", "Kad", "Kada", "Kadar", "Kai", "Kaj", "Když", "Kemudian", "Ketika", "Keď", "Khi", "Kiedy", "Ko", "Kui", "Kuid", "Kun", "Lan", "Le", "Le sa a", "Let go and haul", "Logo", "Lorsqu'<", "Lorsque", "Lè", "Lè sa a", "Ma", "Maar", "Mais", "Majd", "Mając", "Maka", "Manawa", "Mas", "Men", "Menawa", "Mutta", "Nalika", "Nalikaning", "Nanging", "Nato", "Nhưng", "Niin", "Njuk", "När", "Når", "O zaman", "Och", "Og", "Oletetaan", "Ond", "Onda", "Oraz", "Pak", "Pero", "Però", "Podano", "Pokiaľ", "Pokud", "Potem", "Potom", "Privzeto", "Pryd", "Quan", "Quand", "Quando", "Se", "Sed", "Si", "Siis", "Sipoze", "Sipoze Ke", "Sipoze ke", "Soit", "Stel", "Så", "Tad", "Tada", "Tak", "Takrat", "Tapi", "Ter", "Tetapi", "Tha", "Tha the", "Then", "Then y'all", "Thurh", "Thì", "Toda", "Too right", "Un", "Und", "Ve", "Vendar", "Và", "WEN", "Wanneer", "Wenn", "When", "When y'all", "Wtedy", "Wun", "Y", "Y'know", "Yeah nah", "Yna", "Youse know like when", "Youse know when youse got", "Za predpokladu", "Za předpokladu", "Zadan", "Zadani", "Zadano", "Zadate", "Zadato", "Zakładając", "Zaradi", "Zatati", "a", "an", "awer", "dann", "ghu' noblu'", "latlh", "mä", "qaSDI'", "ugeholl", "vaj", "wann", "És", "Étant donné", "Étant donnée", "Étant données", "Étant donnés", "Ða", "Ða ðe", "Ðurh", "Þa", "Þa þe", "Þegar", "Þurh", "Þá", "Če", "Şi", "Și", "Όταν", "Αλλά", "Δεδομένου", "Και", "Τότε", "І", "А", "А також", "Агар", "Але", "Али", "Аммо", "Бирок", "Ва", "Вә", "Дадено", "Дано", "Допустим", "Если", "Задате", "Задати", "Задато", "И", "К тому же", "Кад", "Када", "Когато", "Когда", "Коли", "Лекин", "Ләкин", "Нехай", "Но", "Нәтиҗәдә", "Онда", "Припустимо", "Припустимо, що", "Пусть", "Та", "Также", "То", "Тогда", "Тоді", "Унда", "Якщо", "Һәм", "Әгәр", "Әйтик", "Әмма", "אבל", "אז", "אזי", "בהינתן", "וגם", "כאשר", "آنگاه", "اذاً", "اما", "اور", "اگر", "با فرض", "بالفرض", "بفرض", "تب", "ثم", "جب", "عندما", "فرض کیا", "لكن", "لیکن", "متى", "هنگامی", "و", "پھر", "अगर", "और", "कदा", "किन्तु", "चूंकि", "जब", "तथा", "तदा", "तब", "पर", "परन्तु", "यदि", "ਅਤੇ", "ਜਦੋਂ", "ਜਿਵੇਂ ਕਿ", "ਜੇਕਰ", "ਤਦ", "ਪਰ", "అప్పుడు", "ఈ పరిస్థితిలో", "కాని", "చెప్పబడినది", "మరియు", "ಆದರೆ", "ನಂತರ", "ನೀಡಿದ", "ಮತ್ತು", "ಸ್ಥಿತಿಯನ್ನು", "กำหนดให้", "ดังนั้น", "เมื่อ", "แต่", "และ", "かつ<", "しかし<", "ただし<", "ならば<", "もし<", "並且<", "但し<", "但是<", "假如<", "假定<", "假設<", "假设<", "前提<", "同时<", "同時<", "并且<", "当<", "當<", "而且<", "那么<", "那麼<", "그러면<", "그리고<", "단<", "만약<", "만일<", "먼저<", "조건<", "하지만<"]
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/glsl.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/glsl.rb
new file mode 100644
index 0000000..792706a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/glsl.rb
@@ -0,0 +1,135 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    load_lexer 'c.rb'
+
+    # This file defines the GLSL language lexer to the Rouge
+    # syntax highlighter.
+    #
+    # Author: Sri Harsha Chilakapati
+    class Glsl < C
+      tag 'glsl'
+      filenames '*.glsl', '*.frag', '*.vert', '*.geom', '*.fs', '*.vs', '*.gs', '*.shader'
+      mimetypes 'x-shader/x-vertex', 'x-shader/x-fragment', 'x-shader/x-geometry'
+
+      title "GLSL"
+      desc "The GLSL shader language"
+
+      # optional comment or whitespace
+      ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+)
+      id = /[a-zA-Z_][a-zA-Z0-9_]*/
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          attribute const uniform varying
+          layout
+          centroid flat smooth noperspective
+          patch sample
+          break continue do for while switch case default
+          if else
+          subroutine
+          in out inout
+          invariant
+          discard return struct precision
+        )
+      end
+
+      def self.keywords_type
+        @keywords_type ||= Set.new %w(
+          float double int void bool true false
+          lowp mediump highp
+          mat2 mat3 mat4 dmat2 dmat3 dmat4
+          mat2x2 mat2x3 mat2x4 dmat2x2 dmat2x3 dmat2x4
+          mat3x2 mat3x3 mat3x4 dmat3x2 dmat3x3 dmat3x4
+          mat4x2 mat4x3 mat4x4 dmat4x2 dmat4x3 dmat4x4
+          vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 dvec2 dvec3 dvec4
+          uint uvec2 uvec3 uvec4
+          sampler1D sampler2D sampler3D samplerCube
+          sampler1DShadow sampler2DShadow samplerCubeShadow
+          sampler1DArray sampler2DArray
+          sampler1DArrayShadow sampler2DArrayShadow
+          isampler1D isampler2D isampler3D isamplerCube
+          isampler1DArray isampler2DArray
+          usampler1D usampler2D usampler3D usamplerCube
+          usampler1DArray usampler2DArray
+          sampler2DRect sampler2DRectShadow isampler2DRect usampler2DRect
+          samplerBuffer isamplerBuffer usamplerBuffer
+          sampler2DMS isampler2DMS usampler2DMS
+          sampler2DMSArray isampler2DMSArray usampler2DMSArray
+          samplerCubeArray samplerCubeArrayShadow isamplerCubeArray usamplerCubeArray
+        )
+      end
+
+      def self.reserved
+        @reserved ||= Set.new %w(
+          common partition active
+          asm
+          class union enum typedef template this packed
+          goto
+          inline noinline volatile public static extern external interface
+          long short half fixed unsigned superp
+          input output
+          hvec2 hvec3 hvec4 fvec2 fvec3 fvec4
+          sampler3DRect
+          filter
+          image1D image2D image3D imageCube
+          iimage1D iimage2D iimage3D iimageCube
+          uimage1D uimage2D uimage3D uimageCube
+          image1DArray image2DArray
+          iimage1DArray iimage2DArray uimage1DArray uimage2DArray
+          image1DShadow image2DShadow
+          image1DArrayShadow image2DArrayShadow
+          imageBuffer iimageBuffer uimageBuffer
+          sizeof cast
+          namespace using
+          row_major
+        )
+      end
+
+      def self.builtins
+        @builtins ||= Set.new %w(
+          gl_VertexID gl_InstanceID gl_PerVertex gl_Position gl_PointSize gl_ClipDistance
+          gl_PrimitiveIDIn gl_InvocationID gl_PrimitiveID gl_Layer gl_ViewportIndex
+          gl_MaxPatchVertices gl_PatchVerticesIn gl_TessLevelOuter gl_TessLevelInner
+          gl_TessCoord gl_FragCoord gl_FrontFacing gl_PointCoord gl_SampleID gl_SamplePosition
+          gl_FragColor gl_FragData gl_MaxDrawBuffers gl_FragDepth gl_SampleMask
+          gl_ClipVertex gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor
+          gl_TexCoord gl_FogFragCoord gl_Color gl_SecondaryColor gl_Normal gl_VertexID
+          gl_MultiTexCord0 gl_MultiTexCord1 gl_MultiTexCord2 gl_MultiTexCord3
+          gl_MultiTexCord4 gl_MultiTexCord5 gl_MultiTexCord6 gl_MultiTexCord7
+          gl_FogCoord gl_MaxVertexAttribs gl_MaxVertexUniformComponents 
+          gl_MaxVaryingFloats gl_MaxVaryingComponents gl_MaxVertexOutputComponents
+          gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents
+          gl_MaxFragmentInputComponents gl_MaxVertexTextureImageUnits
+          gl_MaxCombinedTextureImageUnits gl_MaxTextureImageUnits
+          gl_MaxFragmentUniformComponents gl_MaxClipDistances
+          gl_MaxGeometryTextureImageUnits gl_MaxGeometryUniformComponents
+          gl_MaxGeometryVaryingComponents gl_MaxTessControlInputComponents
+          gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits
+          gl_MaxTessControlUniformComponents gl_MaxTessControlTotalOutputComponents
+          gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents
+          gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents
+          gl_MaxTessPatchComponents gl_MaxTessGenLevel gl_MaxViewports
+          gl_MaxVertexUniformVectors gl_MaxFragmentUniformVectors gl_MaxVaryingVectors
+          gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxClipPlanes gl_DepthRange
+          gl_DepthRangeParameters gl_ModelViewMatrix gl_ProjectionMatrix
+          gl_ModelViewProjectionMatrix gl_TextureMatrix gl_NormalMatrix
+          gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse
+          gl_TextureMatrixInverse gl_ModelViewMatrixTranspose
+          gl_ModelViewProjectionMatrixTranspose gl_TextureMatrixTranspose
+          gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose
+          gl_ModelViewProjectionMatrixInverseTranspose
+          gl_TextureMatrixInverseTranspose gl_NormalScale gl_ClipPlane gl_PointParameters
+          gl_Point gl_MaterialParameters gl_FrontMaterial gl_BackMaterial
+          gl_LightSourceParameters gl_LightSource gl_MaxLights gl_LightModelParameters
+          gl_LightModel gl_LightModelProducts gl_FrontLightModelProduct
+          gl_BackLightModelProduct gl_LightProducts gl_FrontLightProduct
+          gl_BackLightProduct gl_TextureEnvColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR
+          gl_EyePlaneQ gl_ObjectPlaneS gl_ObjectPlaneT gl_ObjectPlaneR gl_ObjectPlaneQ
+          gl_FogParameters gl_Fog
+        )
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/go.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/go.rb
new file mode 100644
index 0000000..f4986f6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/go.rb
@@ -0,0 +1,178 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Go < RegexLexer
+      title "Go"
+      desc 'The Go programming language (http://golang.org)'
+      tag 'go'
+      aliases 'go', 'golang'
+      filenames '*.go'
+
+      mimetypes 'text/x-go', 'application/x-go'
+
+      def self.analyze_text(text)
+        return 0
+      end
+
+      # Characters
+
+      WHITE_SPACE            = /[\s\t\r\n]+/
+
+      NEWLINE                = /\n/
+      UNICODE_CHAR           = /[^\n]/
+      UNICODE_LETTER         = /[[:alpha:]]/
+      UNICODE_DIGIT          = /[[:digit:]]/
+
+      # Letters and digits
+
+      LETTER                 = /#{UNICODE_LETTER}|_/
+      DECIMAL_DIGIT          = /[0-9]/
+      OCTAL_DIGIT            = /[0-7]/
+      HEX_DIGIT              = /[0-9A-Fa-f]/
+
+      # Comments
+
+      LINE_COMMENT           = /\/\/(?:(?!#{NEWLINE}).)*/
+      GENERAL_COMMENT        = /\/\*(?:(?!\*\/).)*\*\//m
+      COMMENT                = /#{LINE_COMMENT}|#{GENERAL_COMMENT}/
+
+      # Keywords
+
+      KEYWORD                = /\b(?:
+                                 break       | default     | func
+                               | interface   | select      | case
+                               | defer       | go          | map
+                               | struct      | chan        | else
+                               | goto        | package     | switch
+                               | const       | fallthrough | if
+                               | range       | type        | continue
+                               | for         | import      | return
+                               | var
+                               )\b/x
+
+      # Identifiers
+
+      IDENTIFIER             = / (?!#{KEYWORD})
+                                 #{LETTER}(?:#{LETTER}|#{UNICODE_DIGIT})* /x
+
+      # Operators and delimiters
+
+      OPERATOR               = / \+=    | \+\+   | \+     | &\^=   | &\^
+                               | &=     | &&     | &      | ==     | =
+                               | \!=    | \!     | -=     | --     | -
+                               | \|=    | \|\|   | \|     | <=     | <-
+                               | <<=    | <<     | <      | \*=    | \*
+                               | \^=    | \^     | >>=    | >>     | >=
+                               | >      | \/     | \/=    | :=     | %
+                               | %=     | \.\.\. | \.     | :
+                               /x
+
+      SEPARATOR              = / \(     | \)     | \[     | \]     | \{
+                               | \}     | ,      | ;
+                               /x
+
+      # Integer literals
+
+      DECIMAL_LIT            = /[0-9]#{DECIMAL_DIGIT}*/
+      OCTAL_LIT              = /0#{OCTAL_DIGIT}*/
+      HEX_LIT                = /0[xX]#{HEX_DIGIT}+/
+      INT_LIT                = /#{HEX_LIT}|#{DECIMAL_LIT}|#{OCTAL_LIT}/
+
+      # Floating-point literals
+
+      DECIMALS               = /#{DECIMAL_DIGIT}+/
+      EXPONENT               = /[eE][+\-]?#{DECIMALS}/
+      FLOAT_LIT              = / #{DECIMALS} \. #{DECIMALS}? #{EXPONENT}?
+                               | #{DECIMALS} #{EXPONENT}
+                               | \. #{DECIMALS} #{EXPONENT}?
+                               /x
+
+      # Imaginary literals
+
+      IMAGINARY_LIT          = /(?:#{DECIMALS}|#{FLOAT_LIT})i/
+
+      # Rune literals
+
+      ESCAPED_CHAR           = /\\[abfnrtv\\'"]/
+      LITTLE_U_VALUE         = /\\u#{HEX_DIGIT}{4}/
+      BIG_U_VALUE            = /\\U#{HEX_DIGIT}{8}/
+      UNICODE_VALUE          = / #{UNICODE_CHAR} | #{LITTLE_U_VALUE}
+                               | #{BIG_U_VALUE}  | #{ESCAPED_CHAR}
+                               /x
+      OCTAL_BYTE_VALUE       = /\\#{OCTAL_DIGIT}{3}/
+      HEX_BYTE_VALUE         = /\\x#{HEX_DIGIT}{2}/
+      BYTE_VALUE             = /#{OCTAL_BYTE_VALUE}|#{HEX_BYTE_VALUE}/
+      CHAR_LIT               = /'(?:#{UNICODE_VALUE}|#{BYTE_VALUE})'/
+      ESCAPE_SEQUENCE        = / #{ESCAPED_CHAR}
+                               | #{LITTLE_U_VALUE}
+                               | #{BIG_U_VALUE}
+                               | #{HEX_BYTE_VALUE}
+                               /x
+
+      # String literals
+
+      RAW_STRING_LIT         = /`(?:#{UNICODE_CHAR}|#{NEWLINE})*`/
+      INTERPRETED_STRING_LIT = / "(?: (?!")
+                                      (?: #{UNICODE_VALUE} | #{BYTE_VALUE} )
+                                  )*" /x
+      STRING_LIT             = /#{RAW_STRING_LIT}|#{INTERPRETED_STRING_LIT}/
+
+      # Predeclared identifiers
+
+      PREDECLARED_TYPES      = /\b(?:
+                                 bool       | byte       | complex64
+                               | complex128 | error      | float32
+                               | float64    | int8       | int16
+                               | int32      | int64      | int
+                               | rune       | string     | uint8
+                               | uint16     | uint32     | uint64
+                               | uintptr    | uint
+      	                       )\b/x
+
+      PREDECLARED_CONSTANTS  = /\b(?:true|false|iota|nil)\b/
+
+      PREDECLARED_FUNCTIONS  = /\b(?:
+                                 append  | cap     | close   | complex
+                               | copy    | delete  | imag    | len
+                               | make    | new     | panic   | print
+                               | println | real    | recover
+                               )\b/x
+
+      state :simple_tokens do
+        rule(COMMENT,               Comment)
+        rule(KEYWORD,               Keyword)
+        rule(PREDECLARED_TYPES,     Keyword::Type)
+        rule(PREDECLARED_FUNCTIONS, Name::Builtin)
+        rule(PREDECLARED_CONSTANTS, Name::Constant)
+        rule(IMAGINARY_LIT,         Num)
+        rule(FLOAT_LIT,             Num)
+        rule(INT_LIT,               Num)
+        rule(CHAR_LIT,              Str::Char)
+        rule(OPERATOR,              Operator)
+        rule(SEPARATOR,             Punctuation)
+        rule(IDENTIFIER,            Name)
+        rule(WHITE_SPACE,           Other)
+      end
+
+      state :root do
+        mixin :simple_tokens
+
+        rule(/`/,             Str, :raw_string)
+        rule(/"/,             Str, :interpreted_string)
+      end
+
+      state :interpreted_string do
+        rule(ESCAPE_SEQUENCE, Str::Escape)
+        rule(/\\./,           Error)
+        rule(/"/,             Str, :pop!)
+        rule(/[^"\\]+/,       Str)
+      end
+
+      state :raw_string do
+        rule(/`/,             Str, :pop!)
+        rule(/[^`]+/m,        Str)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/gradle.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/gradle.rb
new file mode 100644
index 0000000..8bf12cc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/gradle.rb
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    load_lexer 'groovy.rb'
+
+    class Gradle < Groovy
+      title "Gradle"
+      desc "A powerful build system for the JVM"
+
+      tag 'gradle'
+      filenames '*.gradle'
+      mimetypes 'text/x-gradle'
+
+      def self.keywords
+        @keywords ||= super + Set.new(%w(
+          allprojects artifacts buildscript configuration dependencies
+          repositories sourceSets subprojects publishing
+        ))
+      end
+
+      def self.types
+        @types ||= super + Set.new(%w(
+          Project Task Gradle Settings Script JavaToolChain SourceSet
+          SourceSetOutput IncrementalTaskInputs Configuration
+          ResolutionStrategy ArtifactResolutionQuery ComponentSelection
+          ComponentSelectionRules ConventionProperty ExtensionAware
+          ExtraPropertiesExtension PublishingExtension IvyPublication
+          IvyArtifact IvyArtifactSet IvyModuleDescriptorSpec
+          MavenPublication MavenArtifact MavenArtifactSet MavenPom
+          PluginDependenciesSpec PluginDependencySpec ResourceHandler
+          TextResourceFactory
+        ))
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/groovy.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/groovy.rb
new file mode 100644
index 0000000..130b641
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/groovy.rb
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Groovy < RegexLexer
+      title "Groovy"
+      desc 'The Groovy programming language (http://www.groovy-lang.org/)'
+      tag 'groovy'
+      filenames '*.groovy'
+      mimetypes 'text/x-groovy'
+
+      ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+)
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          assert break case catch continue default do else finally for
+          if goto instanceof new return switch this throw try while in as
+        )
+      end
+
+      def self.declarations
+        @declarations ||= Set.new %w(
+          abstract const enum extends final implements native private
+          protected public static strictfp super synchronized throws
+          transient volatile
+        )
+      end
+
+      def self.types
+        @types ||= Set.new %w(
+          def boolean byte char double float int long short void
+        )
+      end
+
+      def self.constants
+        @constants ||= Set.new %w(true false null)
+      end
+
+      state :root do
+        rule %r(^
+          (\s*(?:\w[\w\d.\[\]]*\s+)+?) # return arguments
+          (\w[\w\d]*) # method name
+          (\s*) (\() # signature start
+        )x do |m|
+          delegate self.clone, m[1]
+          token Name::Function, m[2]
+          token Text, m[3]
+          token Operator, m[4]
+        end
+
+        # whitespace
+        rule /[^\S\n]+/, Text
+        rule %r(//.*?$), Comment::Single
+        rule %r(/[*].*?[*]/)m, Comment::Multiline
+        rule /@\w[\w\d.]*/, Name::Decorator
+        rule /(class|interface|trait)\b/,  Keyword::Declaration, :class
+        rule /package\b/, Keyword::Namespace, :import
+        rule /import\b/, Keyword::Namespace, :import
+
+        # TODO: highlight backslash escapes
+        rule /""".*?"""/m, Str::Double
+        rule /'''.*?'''/m, Str::Single
+
+        rule /"(\\.|\\\n|.)*?"/, Str::Double
+        rule /'(\\.|\\\n|.)*?'/, Str::Single
+        rule %r(\$/(\$.|.)*?/\$)m, Str
+        rule %r(/(\\.|\\\n|.)*?/), Str
+        rule /'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'/, Str::Char
+        rule /(\.)([a-zA-Z_][a-zA-Z0-9_]*)/ do
+          groups Operator, Name::Attribute
+        end
+
+        rule /[a-zA-Z_][a-zA-Z0-9_]*:/, Name::Label
+        rule /[a-zA-Z_\$][a-zA-Z0-9_]*/ do |m|
+          if self.class.keywords.include? m[0]
+            token Keyword
+          elsif self.class.declarations.include? m[0]
+            token Keyword::Declaration
+          elsif self.class.types.include? m[0]
+            token Keyword::Type
+          elsif self.class.constants.include? m[0]
+            token Keyword::Constant
+          else
+            token Name
+          end
+        end
+
+        rule %r([~^*!%&\[\](){}<>\|+=:;,./?-]), Operator
+
+        # numbers
+        rule /\d+\.\d+([eE]\d+)?[fd]?/, Num::Float
+        rule /0x[0-9a-f]+/, Num::Hex
+        rule /[0-9]+L?/, Num::Integer
+        rule /\n/, Text
+      end
+
+      state :class do
+        rule /\s+/, Text
+        rule /\w[\w\d]*/, Name::Class, :pop!
+      end
+
+      state :import do
+        rule /\s+/, Text
+        rule /[\w\d.]+[*]?/, Name::Namespace, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/haml.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/haml.rb
new file mode 100644
index 0000000..706217f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/haml.rb
@@ -0,0 +1,228 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    # A lexer for the Haml templating system for Ruby.
+    # @see http://haml.info
+    class Haml < RegexLexer
+      include Indentation
+
+      title "Haml"
+      desc "The Haml templating system for Ruby (haml.info)"
+
+      tag 'haml'
+      aliases 'HAML'
+
+      filenames '*.haml'
+      mimetypes 'text/x-haml'
+
+      def self.analyze_text(text)
+        return 0.1 if text.start_with? '!!!'
+      end
+
+      # @option opts :filters
+      #   A hash of filter name to lexer of how various filters should be
+      #   highlighted.  By default, :javascript, :css, :ruby, and :erb
+      #   are supported.
+      def initialize(opts={})
+        (opts.delete(:filters) || {}).each do |name, lexer|
+          unless lexer.respond_to? :lex
+            lexer = Lexer.find(lexer) or raise "unknown lexer: #{lexer}"
+            lexer = lexer.new(options)
+          end
+
+          self.filters[name.to_s] = lexer
+        end
+
+        super(opts)
+      end
+
+      def ruby
+        @ruby ||= Ruby.new(options)
+      end
+
+      def html
+        @html ||= HTML.new(options)
+      end
+
+      def filters
+        @filters ||= {
+          'javascript' => Javascript.new(options),
+          'css' => CSS.new(options),
+          'ruby' => ruby,
+          'erb' => ERB.new(options),
+          'markdown' => Markdown.new(options),
+          # TODO
+          # 'sass' => Sass.new(options),
+          # 'textile' => Textile.new(options),
+          # 'maruku' => Maruku.new(options),
+        }
+      end
+
+      start { ruby.reset!; html.reset! }
+
+      identifier = /[\w:-]+/
+      ruby_var = /[a-z]\w*/
+
+      # Haml can include " |\n" anywhere,
+      # which is ignored and used to wrap long lines.
+      # To accomodate this, use this custom faux dot instead.
+      dot = /[ ]\|\n(?=.*[ ]\|)|./
+
+      # In certain places, a comma at the end of the line
+      # allows line wrapping as well.
+      comma_dot = /,\s*\n|#{dot}/
+
+      state :root do
+        rule /\s*\n/, Text
+        rule(/\s*/) { |m| token Text; indentation(m[0]) }
+      end
+
+      state :content do
+        mixin :css
+        rule(/%#{identifier}/) { token Name::Tag; goto :tag }
+        rule /!!!#{dot}*\n/, Name::Namespace, :pop!
+        rule %r(
+          (/) (\[#{dot}*?\]) (#{dot}*\n)
+        )x do
+          groups Comment, Comment::Special, Comment
+          pop!
+        end
+
+        rule %r(/#{dot}*\n) do
+          token Comment
+          pop!
+          starts_block :html_comment_block
+        end
+
+        rule /-##{dot}*\n/ do
+          token Comment
+          pop!
+          starts_block :haml_comment_block
+        end
+
+        rule /-/ do
+          token Punctuation
+          reset_stack
+          push :ruby_line
+        end
+
+        # filters
+        rule /:(#{dot}*)\n/ do |m|
+          token Name::Decorator
+          pop!
+          starts_block :filter_block
+
+          filter_name = m[1].strip
+
+          @filter_lexer = self.filters[filter_name]
+          @filter_lexer.reset! unless @filter_lexer.nil?
+
+          puts "    haml: filter #{filter_name.inspect} #{@filter_lexer.inspect}" if @debug
+        end
+
+        mixin :eval_or_plain
+      end
+
+      state :css do
+        rule(/\.#{identifier}/) { token Name::Class; goto :tag }
+        rule(/##{identifier}/) { token Name::Function; goto :tag }
+      end
+
+      state :tag do
+        mixin :css
+        rule(/\{#{comma_dot}*?\}/) { delegate ruby }
+        rule(/\[#{dot}*?\]/) { delegate ruby }
+        rule /\(/, Punctuation, :html_attributes
+        rule /\s*\n/, Text, :pop!
+
+        # whitespace chompers
+        rule /[<>]{1,2}(?=[ \t=])/, Punctuation
+
+        mixin :eval_or_plain
+      end
+
+      state :plain do
+        rule(/([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/) { delegate html }
+        mixin :interpolation
+        rule(/\n/) { token Text; reset_stack }
+      end
+
+      state :eval_or_plain do
+        rule /[&!]?==/, Punctuation, :plain
+        rule /[&!]?[=!]/ do
+          token Punctuation
+          reset_stack
+          push :ruby_line
+        end
+
+        rule(//) { push :plain }
+      end
+
+      state :ruby_line do
+        rule /\n/, Text, :pop!
+        rule(/,[ \t]*\n/) { delegate ruby }
+        rule /[ ]\|[ \t]*\n/, Str::Escape
+        rule(/.*?(?=(,$| \|)?[ \t]*$)/) { delegate ruby }
+      end
+
+      state :html_attributes do
+        rule /\s+/, Text
+        rule /#{identifier}\s*=/, Name::Attribute, :html_attribute_value
+        rule identifier, Name::Attribute
+        rule /\)/, Text, :pop!
+      end
+
+      state :html_attribute_value do
+        rule /\s+/, Text
+        rule ruby_var, Name::Variable, :pop!
+        rule /@#{ruby_var}/, Name::Variable::Instance, :pop!
+        rule /\$#{ruby_var}/, Name::Variable::Global, :pop!
+        rule /'(\\\\|\\'|[^'\n])*'/, Str, :pop!
+        rule /"(\\\\|\\"|[^"\n])*"/, Str, :pop!
+      end
+
+      state :html_comment_block do
+        rule /#{dot}+/, Comment
+        mixin :indented_block
+      end
+
+      state :haml_comment_block do
+        rule /#{dot}+/, Comment::Preproc
+        mixin :indented_block
+      end
+
+      state :filter_block do
+        rule /([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/ do
+          if @filter_lexer
+            delegate @filter_lexer
+          else
+            token Name::Decorator
+          end
+        end
+
+        mixin :interpolation
+        mixin :indented_block
+      end
+
+      state :interpolation do
+        rule /#[{]/, Str::Interpol, :ruby
+      end
+
+      state :ruby do
+        rule /[}]/, Str::Interpol, :pop!
+        mixin :ruby_inner
+      end
+
+      state :ruby_inner do
+        rule(/[{]/) { delegate ruby; push :ruby_inner }
+        rule(/[}]/) { delegate ruby; pop! }
+        rule(/[^{}]+/) { delegate ruby }
+      end
+
+      state :indented_block do
+        rule(/\n/) { token Text; reset_stack }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/handlebars.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/handlebars.rb
new file mode 100644
index 0000000..5ac8618
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/handlebars.rb
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Handlebars < TemplateLexer
+      title "Handlebars"
+      desc 'the Handlebars and Mustache templating languages'
+      tag 'handlebars'
+      aliases 'hbs', 'mustache'
+      filenames '*.handlebars', '*.hbs', '*.mustache'
+      mimetypes 'text/x-handlebars', 'text/x-mustache'
+
+      id = %r([\w$-]+)
+
+      state :root do
+        # escaped slashes
+        rule(/\\{+/) { delegate parent }
+
+        # block comments
+        rule /{{!--/, Comment, :comment
+        rule /{{!.*?}}/, Comment
+
+        rule /{{{?/ do
+          token Keyword
+          push :stache
+          push :open_sym
+        end
+
+        rule(/(.+?)(?=\\|{{)/m) { delegate parent }
+
+        # if we get here, there's no more mustache tags, so we eat
+        # the rest of the doc
+        rule(/.+/m) { delegate parent }
+      end
+
+      state :comment do
+        rule(/{{/) { token Comment; push }
+        rule(/}}/) { token Comment; pop! }
+        rule(/[^{}]+/m) { token Comment }
+        rule(/[{}]/) { token Comment }
+      end
+
+      state :stache do
+        rule /}}}?/, Keyword, :pop!
+        rule /\s+/m, Text
+        rule /[=]/, Operator
+        rule /[\[\]]/, Punctuation
+        rule /[.](?=[}\s])/, Name::Variable
+        rule /[.][.]/, Name::Variable
+        rule %r([/.]), Punctuation
+        rule /"(\\.|.)*?"/, Str::Double
+        rule /'(\\.|.)*?'/, Str::Single
+        rule /\d+(?=}\s)/, Num
+        rule /(true|false)(?=[}\s])/, Keyword::Constant
+        rule /else(?=[}\s])/, Keyword
+        rule /this(?=[}\s])/, Name::Builtin::Pseudo
+        rule /@#{id}/, Name::Attribute
+        rule id, Name::Variable
+      end
+
+      state :open_sym do
+        rule %r([#/]) do
+          token Keyword
+          goto :block_name
+        end
+
+        rule /[>^&]/, Keyword
+
+        rule(//) { pop! }
+      end
+
+      state :block_name do
+        rule /if(?=[}\s])/, Keyword
+        rule id, Name::Namespace, :pop!
+        rule(//) { pop! }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/haskell.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/haskell.rb
new file mode 100644
index 0000000..0018664
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/haskell.rb
@@ -0,0 +1,183 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Haskell < RegexLexer
+      title "Haskell"
+      desc "The Haskell programming language (haskell.org)"
+
+      tag 'haskell'
+      aliases 'hs'
+      filenames '*.hs'
+      mimetypes 'text/x-haskell'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang?('runhaskell')
+      end
+
+      reserved = %w(
+        _ case class data default deriving do else if in
+        infix[lr]? instance let newtype of then type where
+      )
+
+      ascii = %w(
+        NUL SOH [SE]TX EOT ENQ ACK BEL BS HT LF VT FF CR S[OI] DLE
+        DC[1-4] NAK SYN ETB CAN EM SUB ESC [FGRU]S SP DEL
+      )
+
+      state :basic do
+        rule /\s+/m, Text
+        rule /{-#/, Comment::Preproc, :comment_preproc
+        rule /{-/, Comment::Multiline, :comment
+        rule /^--\s+\|.*?$/, Comment::Doc
+        # this is complicated in order to support custom symbols
+        # like -->
+        rule /--(?![!#\$\%&*+.\/<=>?@\^\|_~]).*?$/, Comment::Single
+      end
+
+      # nested commenting
+      state :comment do
+        rule /-}/, Comment::Multiline, :pop!
+        rule /{-/, Comment::Multiline, :comment
+        rule /[^-{}]+/, Comment::Multiline
+        rule /[-{}]/, Comment::Multiline
+      end
+
+      state :comment_preproc do
+        rule /-}/, Comment::Preproc, :pop!
+        rule /{-/, Comment::Preproc, :comment
+        rule /[^-{}]+/, Comment::Preproc
+        rule /[-{}]/, Comment::Preproc
+      end
+
+      state :root do
+        mixin :basic
+
+        rule /\bimport\b/, Keyword::Reserved, :import
+        rule /\bmodule\b/, Keyword::Reserved, :module
+        rule /\berror\b/, Name::Exception
+        rule /\b(?:#{reserved.join('|')})\b/, Keyword::Reserved
+        # not sure why, but ^ doesn't work here
+        # rule /^[_a-z][\w']*/, Name::Function
+        rule /[_a-z][\w']*/, Name
+        rule /[A-Z][\w']*/, Keyword::Type
+
+        # lambda operator
+        rule %r(\\(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)), Name::Function
+        # special operators
+        rule %r((<-|::|->|=>|=)(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)), Operator
+        # constructor/type operators
+        rule %r(:[:!#\$\%&*+.\\/<=>?@^\|~-]*), Operator
+        # other operators
+        rule %r([:!#\$\%&*+.\\/<=>?@^\|~-]+), Operator
+
+        rule /\d+e[+-]?\d+/i, Num::Float
+        rule /\d+\.\d+(e[+-]?\d+)?/i, Num::Float
+        rule /0o[0-7]+/i, Num::Oct
+        rule /0x[\da-f]+/i, Num::Hex
+        rule /\d+/, Num::Integer
+
+        rule /'/, Str::Char, :character
+        rule /"/, Str, :string
+
+        rule /\[\s*\]/, Keyword::Type
+        rule /\(\s*\)/, Name::Builtin
+        rule /[\[\](),;`{}]/, Punctuation
+      end
+
+      state :import do
+        rule /\s+/, Text
+        rule /"/, Str, :string
+        rule /\bqualified\b/, Keyword
+        # import X as Y
+        rule /([A-Z][\w.]*)(\s+)(as)(\s+)([A-Z][a-zA-Z0-9_.]*)/ do
+          groups(
+            Name::Namespace, # X
+            Text, Keyword, # as
+            Text, Name # Y
+          )
+          pop!
+        end
+
+        # import X hiding (functions)
+        rule /([A-Z][\w.]*)(\s+)(hiding)(\s+)(\()/ do
+          groups(
+            Name::Namespace, # X
+            Text, Keyword, # hiding
+            Text, Punctuation # (
+          )
+          goto :funclist
+        end
+
+        # import X (functions)
+        rule /([A-Z][\w.]*)(\s+)(\()/ do
+          groups(
+            Name::Namespace, # X
+            Text,
+            Punctuation # (
+          )
+          goto :funclist
+        end
+
+        rule /[\w.]+/, Name::Namespace, :pop!
+      end
+
+      state :module do
+        rule /\s+/, Text
+        # module Foo (functions)
+        rule /([A-Z][\w.]*)(\s+)(\()/ do
+          groups Name::Namespace, Text, Punctuation
+          push :funclist
+        end
+
+        rule /\bwhere\b/, Keyword::Reserved, :pop!
+
+        rule /[A-Z][a-zA-Z0-9_.]*/, Name::Namespace, :pop!
+      end
+
+      state :funclist do
+        mixin :basic
+        rule /[A-Z]\w*/, Keyword::Type
+        rule /(_[\w\']+|[a-z][\w\']*)/, Name::Function
+        rule /,/, Punctuation
+        rule /[:!#\$\%&*+.\\\/<=>?@^\|~-]+/, Operator
+        rule /\(/, Punctuation, :funclist
+        rule /\)/, Punctuation, :pop!
+      end
+
+      state :character do
+        rule /\\/ do
+          token Str::Escape
+          push :character_end
+          push :escape
+        end
+
+        rule /./ do
+          token Str::Char
+          goto :character_end
+        end
+      end
+
+      state :character_end do
+        rule /'/, Str::Char, :pop!
+        rule /./, Error, :pop!
+      end
+
+      state :string do
+        rule /"/, Str, :pop!
+        rule /\\/, Str::Escape, :escape
+        rule /[^\\"]+/, Str
+      end
+
+      state :escape do
+        rule /[abfnrtv"'&\\]/, Str::Escape, :pop!
+        rule /\^[\]\[A-Z@\^_]/, Str::Escape, :pop!
+        rule /#{ascii.join('|')}/, Str::Escape, :pop!
+        rule /o[0-7]+/i, Str::Escape, :pop!
+        rule /x[\da-f]/i, Str::Escape, :pop!
+        rule /\d+/, Str::Escape, :pop!
+        rule /\s+\\/, Str::Escape, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/html.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/html.rb
new file mode 100644
index 0000000..f80da2f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/html.rb
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class HTML < RegexLexer
+      title "HTML"
+      desc "HTML, the markup language of the web"
+      tag 'html'
+      filenames '*.htm', '*.html', '*.xhtml'
+      mimetypes 'text/html', 'application/xhtml+xml'
+
+      def self.analyze_text(text)
+        return 1 if text.doctype?(/\bhtml\b/i)
+        return 1 if text =~ /<\s*html\b/
+      end
+
+      state :root do
+        rule /[^<&]+/m, Text
+        rule /&\S*?;/, Name::Entity
+        rule /<!DOCTYPE .*?>/im, Comment::Preproc
+        rule /<!\[CDATA\[.*?\]\]>/m, Comment::Preproc
+        rule /<!--/, Comment, :comment
+        rule /<\?.*?\?>/m, Comment::Preproc # php? really?
+
+        rule /<\s*script\s*/m do
+          token Name::Tag
+          push :script_content
+          push :tag
+        end
+
+        rule /<\s*style\s*/m do
+          token Name::Tag
+          push :style_content
+          push :tag
+        end
+
+        rule %r(<\s*[a-zA-Z0-9:-]+), Name::Tag, :tag # opening tags
+        rule %r(<\s*/\s*[a-zA-Z0-9:-]+\s*>), Name::Tag # closing tags
+      end
+
+      state :comment do
+        rule /[^-]+/, Comment
+        rule /-->/, Comment, :pop!
+        rule /-/, Comment
+      end
+
+      state :tag do
+        rule /\s+/m, Text
+        rule /[a-zA-Z0-9_:-]+\s*=/m, Name::Attribute, :attr
+        rule /[a-zA-Z0-9_:-]+/, Name::Attribute
+        rule %r(/?\s*>)m, Name::Tag, :pop!
+      end
+
+      state :attr do
+        # TODO: are backslash escapes valid here?
+        rule /"/ do
+          token Str
+          goto :dq
+        end
+
+        rule /'/ do
+          token Str
+          goto :sq
+        end
+
+        rule /[^\s>]+/, Str, :pop!
+      end
+
+      state :dq do
+        rule /"/, Str, :pop!
+        rule /[^"]+/, Str
+      end
+
+      state :sq do
+        rule /'/, Str, :pop!
+        rule /[^']+/, Str
+      end
+
+      state :script_content do
+        rule %r(<\s*/\s*script\s*>)m, Name::Tag, :pop!
+        rule %r(.*?(?=<\s*/\s*script\s*>))m do
+          delegate Javascript
+        end
+      end
+
+      state :style_content do
+        rule %r(<\s*/\s*style\s*>)m, Name::Tag, :pop!
+        rule %r(.*(?=<\s*/\s*style\s*>))m do
+          delegate CSS
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/http.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/http.rb
new file mode 100644
index 0000000..4ea1021
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/http.rb
@@ -0,0 +1,80 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class HTTP < RegexLexer
+      tag 'http'
+      title "HTTP"
+      desc 'http requests and responses'
+
+      def self.http_methods
+        @http_methods ||= %w(GET POST PUT DELETE HEAD OPTIONS TRACE PATCH)
+      end
+
+      def content_lexer
+        return Lexers::PlainText unless @content_type
+
+        @content_lexer ||= Lexer.guess_by_mimetype(@content_type)
+      rescue Lexer::AmbiguousGuess
+        @content_lexer = Lexers::PlainText
+      end
+
+      start { @content_type = 'text/plain' }
+
+      state :root do
+        # request
+        rule %r(
+          (#{HTTP.http_methods.join('|')})([ ]+) # method
+          ([^ ]+)([ ]+)                     # path
+          (HTTPS?)(/)(1[.][01])(\r?\n|$)  # http version
+        )ox do
+          groups(
+            Name::Function, Text,
+            Name::Namespace, Text,
+            Keyword, Operator, Num, Text
+          )
+
+          push :headers
+        end
+
+        # response
+        rule %r(
+          (HTTPS?)(/)(1[.][01])([ ]+) # http version
+          (\d{3})([ ]+)               # status
+          ([^\r\n]+)(\r?\n|$)       # status message
+        )x do
+          groups(
+            Keyword, Operator, Num, Text,
+            Num, Text,
+            Name::Exception, Text
+          )
+          push :headers
+        end
+      end
+
+      state :headers do
+        rule /([^\s:]+)( *)(:)( *)([^\r\n]+)(\r?\n|$)/ do |m|
+          key = m[1]
+          value = m[5]
+          if key.strip.downcase == 'content-type'
+            @content_type = value.split(';')[0].downcase
+          end
+
+          groups Name::Attribute, Text, Punctuation, Text, Str, Text
+        end
+
+        rule /([^\r\n]+)(\r?\n|$)/ do
+          groups Str, Text
+        end
+
+        rule /\r?\n/, Text, :content
+      end
+
+      state :content do
+        rule /.+/m do |m|
+          delegate(content_lexer)
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ini.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ini.rb
new file mode 100644
index 0000000..b949d60
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ini.rb
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class INI < RegexLexer
+      title "INI"
+      desc 'the INI configuration format'
+      tag 'ini'
+
+      # TODO add more here
+      filenames '*.ini', '*.INI', '*.gitconfig'
+      mimetypes 'text/x-ini'
+
+      def self.analyze_text(text)
+        return 0.1 if text =~ /\A\[[\w\-.]+\]\s*[\w\-]+=\w+/
+      end
+
+      identifier = /[\w\-.]+/
+
+      state :basic do
+        rule /[;#].*?\n/, Comment
+        rule /\s+/, Text
+        rule /\\\n/, Str::Escape
+      end
+
+      state :root do
+        mixin :basic
+
+        rule /(#{identifier})(\s*)(=)/ do
+          groups Name::Property, Text, Punctuation
+          push :value
+        end
+
+        rule /\[.*?\]/, Name::Namespace
+      end
+
+      state :value do
+        rule /\n/, Text, :pop!
+        mixin :basic
+        rule /"/, Str, :dq
+        rule /'.*?'/, Str
+        mixin :esc_str
+        rule /[^\\\n]+/, Str
+      end
+
+      state :dq do
+        rule /"/, Str, :pop!
+        mixin :esc_str
+        rule /[^\\"]+/m, Str
+      end
+
+      state :esc_str do
+        rule /\\./m, Str::Escape
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/io.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/io.rb
new file mode 100644
index 0000000..b3154c3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/io.rb
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class IO < RegexLexer
+      tag 'io'
+      title "Io"
+      desc 'The IO programming language (http://iolanguage.com)'
+      mimetypes 'text/x-iosrc'
+      filenames '*.io'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'io'
+      end
+
+      def self.constants
+        @constants ||= Set.new %w(nil false true)
+      end
+
+      def self.builtins
+        @builtins ||= Set.new %w(
+          args call clone do doFile doString else elseif for if list
+          method return super then
+        )
+      end
+
+      state :root do
+        rule /\s+/m, Text
+        rule %r(//.*?\n), Comment::Single
+        rule %r(#.*?\n), Comment::Single
+        rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline
+        rule %r(/[+]), Comment::Multiline, :nested_comment
+
+        rule /"(\\\\|\\"|[^"])*"/, Str
+
+        rule %r(:?:=), Keyword
+        rule /[()]/, Punctuation
+
+        rule %r([-=;,*+><!/|^.%&\[\]{}]), Operator
+
+        rule /[A-Z]\w*/, Name::Class
+
+        rule /[a-z_]\w*/ do |m|
+          name = m[0]
+
+          if self.class.constants.include? name
+            token Keyword::Constant
+          elsif self.class.builtins.include? name
+            token Name::Builtin
+          else
+            token Name
+          end
+        end
+
+        rule %r((\d+[.]?\d*|\d*[.]\d+)(e[+-]?[0-9]+)?)i, Num::Float
+        rule /\d+/, Num::Integer
+
+        rule /@@?/, Keyword
+      end
+
+      state :nested_comment do
+        rule %r([^/+]+)m, Comment::Multiline
+        rule %r(/[+]), Comment::Multiline, :nested_comment
+        rule %r([+]/), Comment::Multiline, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/java.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/java.rb
new file mode 100644
index 0000000..8a142b2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/java.rb
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Java < RegexLexer
+      title "Java"
+      desc "The Java programming language (java.com)"
+
+      tag 'java'
+      filenames '*.java'
+      mimetypes 'text/x-java'
+
+      keywords = %w(
+        assert break case catch continue default do else finally for
+        if goto instanceof new return switch this throw try while
+      )
+
+      declarations = %w(
+        abstract const enum extends final implements native private protected
+        public static strictfp super synchronized throws transient volatile
+      )
+
+      types = %w(boolean byte char double float int long short void)
+
+      id = /[a-zA-Z_][a-zA-Z0-9_]*/
+
+      state :root do
+        rule /[^\S\n]+/, Text
+        rule %r(//.*?$), Comment::Single
+        rule %r(/\*.*?\*/)m, Comment::Multiline
+        # keywords: go before method names to avoid lexing "throw new XYZ"
+        # as a method signature
+        rule /(?:#{keywords.join('|')})\b/, Keyword
+
+        rule %r(
+          (\s*(?:[a-zA-Z_][a-zA-Z0-9_.\[\]<>]*\s+)+?) # return arguments
+          ([a-zA-Z_][a-zA-Z0-9_]*)                  # method name
+          (\s*)(\()                                 # signature start
+        )mx do |m|
+          # TODO: do this better, this shouldn't need a delegation
+          delegate Java, m[1]
+          token Name::Function, m[2]
+          token Text, m[3]
+          token Operator, m[4]
+        end
+
+        rule /@#{id}/, Name::Decorator
+        rule /(?:#{declarations.join('|')})\b/, Keyword::Declaration
+        rule /(?:#{types.join('|')})\b/, Keyword::Type
+        rule /package\b/, Keyword::Namespace
+        rule /(?:true|false|null)\b/, Keyword::Constant
+        rule /(?:class|interface)\b/, Keyword::Declaration, :class
+        rule /import\b/, Keyword::Namespace, :import
+        rule /"(\\\\|\\"|[^"])*"/, Str
+        rule /'(?:\\.|[^\\]|\\u[0-9a-f]{4})'/, Str::Char
+        rule /(\.)(#{id})/ do
+          groups Operator, Name::Attribute
+        end
+        rule /#{id}:/, Name::Label
+        rule /\$?#{id}/, Name
+        rule /[~^*!%&\[\](){}<>\|+=:;,.\/?-]/, Operator
+        rule /[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, Num::Float
+        rule /0x[0-9a-f]+/, Num::Hex
+        rule /[0-9]+L?/, Num::Integer
+        rule /\n/, Text
+      end
+
+      state :class do
+        rule /\s+/m, Text
+        rule id, Name::Class, :pop!
+      end
+
+      state :import do
+        rule /\s+/m, Text
+        rule /[a-z0-9_.]+\*?/i, Name::Namespace, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/javascript.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/javascript.rb
new file mode 100644
index 0000000..923a95c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/javascript.rb
@@ -0,0 +1,313 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    # IMPORTANT NOTICE:
+    #
+    # Please do not copy this lexer and open a pull request
+    # for a new language. It will not get merged, you will
+    # be unhappy, and kittens will cry.
+    #
+    class Javascript < RegexLexer
+      title "JavaScript"
+      desc "JavaScript, the browser scripting language"
+
+      tag 'javascript'
+      aliases 'js'
+      filenames '*.js'
+      mimetypes 'application/javascript', 'application/x-javascript',
+                'text/javascript', 'text/x-javascript'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang?('node')
+        return 1 if text.shebang?('jsc')
+        # TODO: rhino, spidermonkey, etc
+      end
+
+      state :comments_and_whitespace do
+        rule /\s+/, Text
+        rule /<!--/, Comment # really...?
+        rule %r(//.*?$), Comment::Single
+        rule %r(/\*.*?\*/)m, Comment::Multiline
+      end
+
+      state :expr_start do
+        mixin :comments_and_whitespace
+
+        rule %r(/) do
+          token Str::Regex
+          goto :regex
+        end
+
+        rule /[{]/ do
+          token Punctuation
+          goto :object
+        end
+
+        rule //, Text, :pop!
+      end
+
+      state :regex do
+        rule %r(/) do
+          token Str::Regex
+          goto :regex_end
+        end
+
+        rule %r([^/]\n), Error, :pop!
+
+        rule /\n/, Error, :pop!
+        rule /\[\^/, Str::Escape, :regex_group
+        rule /\[/, Str::Escape, :regex_group
+        rule /\\./, Str::Escape
+        rule %r{[(][?][:=<!]}, Str::Escape
+        rule /[{][\d,]+[}]/, Str::Escape
+        rule /[()?]/, Str::Escape
+        rule /./, Str::Regex
+      end
+
+      state :regex_end do
+        rule /[gim]+/, Str::Regex, :pop!
+        rule(//) { pop! }
+      end
+
+      state :regex_group do
+        # specially highlight / in a group to indicate that it doesn't
+        # close the regex
+        rule /\//, Str::Escape
+
+        rule %r([^/]\n) do
+          token Error
+          pop! 2
+        end
+
+        rule /\]/, Str::Escape, :pop!
+        rule /\\./, Str::Escape
+        rule /./, Str::Regex
+      end
+
+      state :bad_regex do
+        rule /[^\n]+/, Error, :pop!
+      end
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          for in while do break return continue switch case default
+          if else throw try catch finally new delete typeof instanceof
+          void this yield
+        )
+      end
+
+      def self.declarations
+        @declarations ||= Set.new %w(var let with function)
+      end
+
+      def self.reserved
+        @reserved ||= Set.new %w(
+          abstract boolean byte char class const debugger double enum
+          export extends final float goto implements import int interface
+          long native package private protected public short static
+          super synchronized throws transient volatile
+        )
+      end
+
+      def self.constants
+        @constants ||= Set.new %w(true false null NaN Infinity undefined)
+      end
+
+      def self.builtins
+        @builtins ||= %w(
+          Array Boolean Date Error Function Math netscape
+          Number Object Packages RegExp String sun decodeURI
+          decodeURIComponent encodeURI encodeURIComponent
+          Error eval isFinite isNaN parseFloat parseInt document this
+          window
+        )
+      end
+
+      id = /[$a-zA-Z_][a-zA-Z0-9_]*/
+
+      state :root do
+        rule /\A\s*#!.*?\n/m, Comment::Preproc, :statement
+        rule /\n/, Text, :statement
+        rule %r((?<=\n)(?=\s|/|<!--)), Text, :expr_start
+        mixin :comments_and_whitespace
+        rule %r(\+\+ | -- | ~ | && | \|\| | \\(?=\n) | << | >>>? | ===
+               | !== )x,
+          Operator, :expr_start
+        rule %r([-<>+*%&|\^/!=]=?), Operator, :expr_start
+        rule /[(\[,]/, Punctuation, :expr_start
+        rule /;/, Punctuation, :statement
+        rule /[)\].]/, Punctuation
+
+        rule /[?]/ do
+          token Punctuation
+          push :ternary
+          push :expr_start
+        end
+
+        rule /[{}]/, Punctuation, :statement
+
+        rule id do |m|
+          if self.class.keywords.include? m[0]
+            token Keyword
+            push :expr_start
+          elsif self.class.declarations.include? m[0]
+            token Keyword::Declaration
+            push :expr_start
+          elsif self.class.reserved.include? m[0]
+            token Keyword::Reserved
+          elsif self.class.constants.include? m[0]
+            token Keyword::Constant
+          elsif self.class.builtins.include? m[0]
+            token Name::Builtin
+          else
+            token Name::Other
+          end
+        end
+
+        rule /[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?/, Num::Float
+        rule /0x[0-9a-fA-F]+/, Num::Hex
+        rule /[0-9]+/, Num::Integer
+        rule /"(\\\\|\\"|[^"])*"/, Str::Double
+        rule /'(\\\\|\\'|[^'])*'/, Str::Single
+      end
+
+      # braced parts that aren't object literals
+      state :statement do
+        rule /(#{id})(\s*)(:)/ do
+          groups Name::Label, Text, Punctuation
+        end
+
+        rule /[{}]/, Punctuation
+
+        mixin :expr_start
+      end
+
+      # object literals
+      state :object do
+        mixin :comments_and_whitespace
+
+        rule /[{]/ do
+          token Punctuation
+          push
+        end
+
+        rule /[}]/ do
+          token Punctuation
+          goto :statement
+        end
+
+        rule /(#{id})(\s*)(:)/ do
+          groups Name::Attribute, Text, Punctuation
+          push :expr_start
+        end
+
+        rule /:/, Punctuation
+        mixin :root
+      end
+
+      # ternary expressions, where <id>: is not a label!
+      state :ternary do
+        rule /:/ do
+          token Punctuation
+          goto :expr_start
+        end
+
+        mixin :root
+      end
+    end
+
+    class JSON < RegexLexer
+      desc "JavaScript Object Notation (json.org)"
+      tag 'json'
+      filenames '*.json'
+      mimetypes 'application/json', 'application/vnd.api+json',
+                'application/hal+json'
+
+      # TODO: is this too much of a performance hit?  JSON is quite simple,
+      # so I'd think this wouldn't be too bad, but for large documents this
+      # could mean doing two full lexes.
+      def self.analyze_text(text)
+        return 0.8 if text =~ /\A\s*{/m && text.lexes_cleanly?(self)
+      end
+
+      string = /"(\\.|[^"])*"/
+
+      state :root do
+        mixin :whitespace
+        rule /(?:true|false|null)\b/, Keyword::Constant
+        rule /{/,  Punctuation, :object_key_initial
+        rule /\[/, Punctuation, :array
+        rule /-?(?:0|[1-9]\d*)\.\d+(?:e[+-]\d+)?/i, Num::Float
+        rule /-?(?:0|[1-9]\d*)(?:e[+-]\d+)?/i, Num::Integer
+        mixin :has_string
+      end
+
+      state :whitespace do
+        rule /\s+/m, Text::Whitespace
+      end
+
+      state :has_string do
+        rule string, Str::Double
+      end
+
+      # in object_key_initial it's allowed to immediately close the object again
+      state :object_key_initial do
+        mixin :whitespace
+        rule string do
+          token Name::Tag
+          goto :object_key
+        end
+        rule /}/, Punctuation, :pop!
+      end
+
+      # in object_key at least one more name/value pair is required
+      state :object_key do
+        mixin :whitespace
+        rule string, Name::Tag
+        rule /:/, Punctuation, :object_val
+        rule /}/, Error, :pop!
+      end
+
+      state :object_val do
+        rule /,/, Punctuation, :pop!
+        rule(/}/) { token Punctuation; pop!(2) }
+        mixin :root
+      end
+
+      state :array do
+        rule /\]/, Punctuation, :pop!
+        rule /,/, Punctuation
+        mixin :root
+      end
+    end
+
+    class JSONDOC < JSON
+      desc "JavaScript Object Notation with extenstions for documentation"
+      tag 'json-doc'
+
+      prepend :root do
+        mixin :comments
+        rule /(\.\.\.)/, Comment::Single
+      end
+
+      prepend :object_key_initial do
+        mixin :comments
+        rule /(\.\.\.)/, Comment::Single
+      end
+
+      prepend :object_key do
+        mixin :comments
+        rule /(\.\.\.)/ do
+          token Comment::Single
+          goto :object_key_initial
+        end
+      end
+
+      state :comments do
+        rule %r(//.*?$), Comment::Single
+      end
+    end
+
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/jinja.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/jinja.rb
new file mode 100644
index 0000000..f159c26
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/jinja.rb
@@ -0,0 +1,137 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Jinja < TemplateLexer
+      title "Jinja"
+      desc "Django/Jinja template engine (jinja.pocoo.org)"
+
+      tag 'jinja'
+      aliases 'django'
+
+      mimetypes 'application/x-django-templating', 'application/x-jinja',
+                'text/html+django', 'text/html+jinja'
+
+      def self.keywords
+        @@keywords ||= %w(as context do else extends from ignore missing
+                          import include reversed recursive scoped
+                          autoescape endautoescape block endblock call endcall
+                          filter endfilter for endfor if endif macro endmacro
+                          set endset trans endtrans with endwith without)
+      end
+
+      def self.tests
+        @@tests ||= %w(callable defined divisibleby equalto escaped even iterable
+                       lower mapping none number odd sameas sequence string
+                       undefined upper)
+      end
+
+      def self.pseudo_keywords
+        @@pseudo_keywords ||= %w(true false none True False None)
+      end
+
+      def self.word_operators
+        @@word_operators ||= %w(is in and or not)
+      end
+
+      state :root do
+        # Comments
+        rule /{#/, Comment, :comment
+
+        # Statements
+        rule /\{\%/ do
+          token Comment::Preproc
+          push :statement
+        end
+
+        # Expressions
+        rule /\{\{/ do
+          token Comment::Preproc
+          push :expression
+        end
+
+        rule(/(.+?)(?=\\|{{|{%|{#)/m) { delegate parent }
+        rule(/.+/m) { delegate parent }
+      end
+
+      state :filter do
+        # Filters are called like variable|foo(arg1, ...)
+        rule /(\|)(\w+)/ do
+          groups Operator, Name::Function
+        end
+      end
+
+      state :function do
+        rule /(\w+)(\()/ do
+          groups Name::Function, Punctuation
+        end
+      end
+
+      state :text do
+        rule /\s+/m, Text
+      end
+
+      state :literal do
+        # Strings
+        rule /"(\\.|.)*?"/, Str::Double
+        rule /'(\\.|.)*?'/, Str::Single
+
+        # Numbers
+        rule /\d+(?=}\s)/, Num
+
+        # Arithmetic operators (+, -, *, **, //, /)
+        # TODO : implement modulo (%)
+        rule /(\+|\-|\*|\/\/?|\*\*?)/, Operator
+
+        # Comparisons operators (<=, <, >=, >, ==, ===, !=)
+        rule /(<=?|>=?|===?|!=)/, Operator
+
+        # Punctuation (the comma, [], ())
+        rule /,/,  Punctuation
+        rule /\[/, Punctuation
+        rule /\]/, Punctuation
+        rule /\(/, Punctuation
+        rule /\)/, Punctuation
+      end
+
+      state :comment do
+        rule(/[^{#]+/m) { token Comment }
+        rule(/#}/) { token Comment; pop! }
+      end
+
+      state :expression do
+        rule /\w+\.?/m, Name::Variable
+
+        mixin :filter
+        mixin :function
+        mixin :literal
+        mixin :text
+
+        rule /%}|}}/, Comment::Preproc, :pop!
+      end
+
+      state :statement do
+        rule /(\w+\.?)/ do |m|
+          if self.class.keywords.include?(m[0])
+            groups Keyword
+          elsif self.class.pseudo_keywords.include?(m[0])
+            groups Keyword::Pseudo
+          elsif self.class.word_operators.include?(m[0])
+            groups Operator::Word
+          elsif self.class.tests.include?(m[0])
+            groups Name::Builtin
+          else
+            groups Name::Variable
+          end
+        end
+
+        mixin :filter
+        mixin :function
+        mixin :literal
+        mixin :text
+
+        rule /\%\}/, Comment::Preproc, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/jsonnet.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/jsonnet.rb
new file mode 100644
index 0000000..9502f19
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/jsonnet.rb
@@ -0,0 +1,151 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Jsonnet < RegexLexer
+      title 'Jsonnet'
+      desc 'An elegant, formally-specified config language for JSON'
+      tag 'jsonnet'
+      filenames '*.jsonnet'
+      mimetypes 'text/x-jsonnet'
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          self super local for in if then else import importstr error
+          tailstrict assert
+        )
+      end
+
+      def self.declarations
+        @declarations ||= Set.new %w(
+          function
+        )
+      end
+
+      def self.constants
+        @constants ||= Set.new %w(
+          null true false
+        )
+      end
+
+      def self.builtins
+        @builtins ||= Set.new %w(
+          acos
+          asin
+          atan
+          ceil
+          char
+          codepoint
+          cos
+          exp
+          exponent
+          filter
+          floor
+          force
+          length
+          log
+          makeArray
+          mantissa
+          objectFields
+          objectHas
+          pow
+          sin
+          sqrt
+          tan
+          thisFile
+          type
+          abs
+          assertEqual
+          escapeStringBash
+          escapeStringDollars
+          escapeStringJson
+          escapeStringPython
+          filterMap
+          flattenArrays
+          foldl
+          foldr
+          format
+          join
+          lines
+          manifestIni
+          manifestPython
+          manifestPythonVars
+          map
+          max
+          min
+          mod
+          range
+          set
+          setDiff
+          setInter
+          setMember
+          setUnion
+          sort
+          split
+          stringChars
+          substr
+          toString
+          uniq
+        )
+      end
+
+      identifier = /[a-zA-Z_][a-zA-Z0-9_]*/
+
+      state :root do
+        rule /\s+/, Text
+        rule %r(//.*?$), Comment::Single
+        rule %r(#.*?$), Comment::Single
+        rule %r(/\*.*?\*/)m, Comment::Multiline
+
+        rule /-?(?:0|[1-9]\d*)\.\d+(?:e[+-]\d+)?/i, Num::Float
+        rule /-?(?:0|[1-9]\d*)(?:e[+-]\d+)?/i, Num::Integer
+
+        rule /[{}:\.,;+\[\]=%\(\)]/, Punctuation
+
+        rule /"/, Str, :string_double
+        rule /'/, Str, :string_single
+        rule /\|\|\|/, Str, :string_block
+
+        rule /\$/, Keyword
+
+        rule identifier do |m|
+          if self.class.keywords.include? m[0]
+            token Keyword
+          elsif self.class.declarations.include? m[0]
+            token Keyword::Declaration
+          elsif self.class.constants.include? m[0]
+            token Keyword::Constant
+          elsif self.class.builtins.include? m[0]
+            token Name::Builtin
+          else
+            token Name::Other
+          end
+        end
+      end
+
+      state :string do
+        rule /\\([\\\/bfnrt]|(u[0-9a-fA-F]{4}))/, Str::Escape
+      end
+
+      state :string_double do
+        mixin :string
+        rule /\\"/, Str::Escape
+        rule /"/, Str, :pop!
+        rule /[^\\"]+/, Str
+      end
+
+      state :string_single do
+        mixin :string
+        rule /\\'/, Str::Escape
+        rule /'/, Str, :pop!
+        rule /[^\\']+/, Str
+      end
+
+      state :string_block do
+        mixin :string
+        rule /\|\|\|/, Str, :pop!
+        rule /.*/, Str
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/julia.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/julia.rb
new file mode 100644
index 0000000..c4b4753
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/julia.rb
@@ -0,0 +1,172 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Julia < RegexLexer
+      title "Julia"
+      desc "The Julia programming language"
+      tag 'julia'
+      aliases 'jl'
+      filenames '*.jl'
+      mimetypes 'text/x-julia', 'application/x-julia'
+
+      def self.analyze_text(text)
+        1 if text.shebang? 'julia'
+      end
+
+      BUILTINS            = /\b(?:
+                              applicable      | assert    | convert
+                            | dlopen          | dlsym     | edit
+                            | eps             | error     | exit
+                            | finalizer       | hash      | im
+                            | Inf             | invoke    | is
+                            | isa             | isequal   | load
+                            | method_exists   | Nan       | new
+                            | ntuple          | pi        | promote
+                            | promote_type    | realmax   | realmin
+                            | sizeof          | subtype   | system
+                            | throw           | tuple     | typemax
+                            | typemin         | typeof    | uid
+                            | whos
+                            )\b/x
+
+      KEYWORDS            = /\b(?:
+                              function | return | module | import | export
+                            | if       | else   | elseif | end    | for
+                            | in       | while  | try    | catch  | super
+                            | const
+                            )\b/x
+
+      TYPES               = /\b(?:
+                              Int         | UInt           | Int8
+                            | UInt8       | Int16          | UInt16
+                            | Int32       | UInt32         | Int64
+                            | UInt64      | Int128         | UInt128
+                            | Float16     | Float32        | Float64
+                            | Bool        | Inf            | Inf16
+                            | Inf32       | NaN            | NaN16
+                            | NaN32       | BigInt         | BigFloat
+                            | Char        | ASCIIString    | UTF8String
+                            | UTF16String | UTF32String    | AbstractString
+                            | WString     | String         | Regex
+                            | RegexMatch  | Complex64      | Complex128
+                            | Any         | Nothing        | None
+                            )\b/x
+
+      OPERATORS           = / \+      | =        | -     | \*   | \/
+                              | \\    | &        | \|    | \$   | ~
+                              | \^    | %        | !     | >>>  | >>
+                              | <<    | &&       | \|\|  | \+=  | -=
+                              | \*=   | \/=      | \\=   | ÷=   | %=
+                              | \^=   | &=       | \|=   | \$=  | >>>=
+                              | >>=   | <<=      | ==    | !=   | ≠
+                              | <=    | ≤        | >=    | ≥    | \.
+                              | ::    | <:       | ->    | \?   | \.\*
+                              | \.\^  | \.\\     | \.\/  | \\   | <
+                              | >
+                            /x
+
+      PUNCTUATION         = / [ \[ \] { } : \( \) , ; @ ] /x
+
+
+      state :root do
+        rule /\n/, Text
+        rule /[^\S\n]+/, Text
+        rule /#=/, Comment::Multiline, :blockcomment
+        rule /#.*$/, Comment
+        rule OPERATORS, Operator
+        rule /\\\n/, Text
+        rule /\\/, Text
+
+
+        # functions
+        rule /(function)((?:\s|\\\s)+)/ do
+          groups Keyword, Name::Function
+          push :funcname
+        end
+
+        # types
+        rule /(type|typealias|abstract)((?:\s|\\\s)+)/ do
+          groups Keyword, Name::Class
+          push :typename
+        end
+        rule TYPES, Keyword::Type
+
+        # keywords
+        rule /(local|global|const)\b/, Keyword::Declaration
+        rule KEYWORDS, Keyword
+
+        rule BUILTINS, Name::Builtin
+
+        # backticks
+        rule /`.*?`/, Literal::String::Backtick
+
+        # chars
+        rule /'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,3}|\\u[a-fA-F0-9]{1,4}|\\U[a-fA-F0-9]{1,6}|[^\\\'\n])'/, Literal::String::Char
+
+        # try to match trailing transpose
+        rule /(?<=[.\w)\]])\'+/, Operator
+
+        # strings
+        rule /(?:[IL])"/, Literal::String, :string
+        rule /[E]?"/, Literal::String, :string
+
+        # names
+        rule /@[\w.]+/, Name::Decorator
+        rule /(?:[a-zA-Z_\u00A1-\uffff]|[\u1000-\u10ff])(?:[a-zA-Z_0-9\u00A1-\uffff]|[\u1000-\u10ff])*!*/, Name
+
+        rule PUNCTUATION, Other
+
+        # numbers
+        rule /(\d+(_\d+)+\.\d*|\d*\.\d+(_\d+)+)([eEf][+-]?[0-9]+)?/, Literal::Number::Float
+        rule /(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?/, Literal::Number::Float
+        rule /\d+(_\d+)+[eEf][+-]?[0-9]+/, Literal::Number::Float
+        rule /\d+[eEf][+-]?[0-9]+/, Literal::Number::Float
+        rule /0b[01]+(_[01]+)+/, Literal::Number::Bin
+        rule /0b[01]+/, Literal::Number::Bin
+        rule /0o[0-7]+(_[0-7]+)+/, Literal::Number::Oct
+        rule /0o[0-7]+/, Literal::Number::Oct
+        rule /0x[a-fA-F0-9]+(_[a-fA-F0-9]+)+/, Literal::Number::Hex
+        rule /0x[a-fA-F0-9]+/, Literal::Number::Hex
+        rule /\d+(_\d+)+/, Literal::Number::Integer
+        rule /\d+/, Literal::Number::Integer
+      end
+
+
+      state :funcname do
+        rule /[a-zA-Z_]\w*/, Name::Function, :pop!
+        rule /\([^\s\w{]{1,2}\)/, Operator, :pop!
+        rule /[^\s\w{]{1,2}/, Operator, :pop!
+      end
+
+      state :typename do
+        rule /[a-zA-Z_]\w*/, Name::Class, :pop!
+      end
+
+      state :stringescape do
+        rule /\\([\\abfnrtv"\']|\n|N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|x[a-fA-F0-9]{2}|[0-7]{1,3})/,
+          Literal::String::Escape
+      end
+
+      state :blockcomment do
+        rule /[^=#]/, Comment::Multiline
+        rule /#=/, Comment::Multiline, :blockcomment
+        rule /\=#/, Comment::Multiline, :pop!
+        rule /[=#]/, Comment::Multiline
+      end
+
+      state :string do
+        mixin :stringescape
+
+        rule /"/, Literal::String, :pop!
+        rule /\\\\|\\"|\\\n/, Literal::String::Escape  # included here for raw strings
+        rule /\$(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?/, Literal::String::Interpol
+        rule /[^\\"$]+/, Literal::String
+        # quotes, dollar signs, and backslashes must be parsed one at a time
+        rule /["\\]/, Literal::String
+        # unhandled string formatting sign
+        rule /\$/, Literal::String
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/kotlin.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/kotlin.rb
new file mode 100644
index 0000000..5ce4542
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/kotlin.rb
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Kotlin < RegexLexer
+      title "Kotlin"
+      desc "Kotlin <http://kotlinlang.org>"
+
+      tag 'kotlin'
+      filenames '*.kt'
+      mimetypes 'text/x-kotlin'
+
+      keywords = %w(
+        abstract annotation as break by catch class companion const
+        constructor continue crossinline do dynamic else enum
+        external false final finally for fun get if import in infix
+        inline inner interface internal is lateinit noinline null
+        object open operator out override package private protected
+        public reified return sealed set super tailrec this throw
+        true try typealias typeof val var vararg when where while
+        yield
+      )
+
+      name = %r'@?[_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}][\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Nl}\p{Nd}\p{Pc}\p{Cf}\p{Mn}\p{Mc}]*'
+
+      id = %r'(#{name}|`#{name}`)'
+
+      state :root do
+        rule %r'^\s*\[.*?\]', Name::Attribute
+        rule %r'[^\S\n]+', Text
+        rule %r'\\\n', Text # line continuation
+        rule %r'//.*?\n', Comment::Single
+        rule %r'/[*].*?[*]/'m, Comment::Multiline
+        rule %r'\n', Text
+        rule %r'::|!!|\?[:.]', Operator
+        rule %r"(\.\.)", Operator
+        rule %r'[~!%^&*()+=|\[\]:;,.<>/?-]', Punctuation
+        rule %r'[{}]', Punctuation
+        rule %r'@"(""|[^"])*"'m, Str
+        rule %r'""".*?"""'m, Str
+        rule %r'"(\\\\|\\"|[^"\n])*["\n]'m, Str
+        rule %r"'\\.'|'[^\\]'", Str::Char
+        rule %r"[0-9](\.[0-9]+)?([eE][+-][0-9]+)?[flFL]?|0[xX][0-9a-fA-F]+[Ll]?", Num
+        rule %r'(class)(\s+)(object)' do
+          groups Keyword, Text, Keyword
+        end
+        rule %r'(class|data\s+class|interface|object)(\s+)' do
+          groups Keyword::Declaration, Text
+          push :class
+        end
+        rule %r'(package|import)(\s+)' do
+          groups Keyword, Text
+          push :package
+        end
+        rule %r'(val|var)(\s+)' do
+          groups Keyword::Declaration, Text
+          push :property
+        end
+        rule %r'(fun)(\s+)' do
+          groups Keyword, Text
+          push :function
+        end
+        rule /(?:#{keywords.join('|')})\b/, Keyword
+        rule id, Name
+      end
+
+      state :package do
+        rule /\S+/, Name::Namespace, :pop!
+      end
+
+      state :class do
+        rule id, Name::Class, :pop!
+      end
+
+      state :property do
+        rule id, Name::Property, :pop!
+      end
+
+      state :function do
+        rule id, Name::Function, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/liquid.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/liquid.rb
new file mode 100644
index 0000000..071181e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/liquid.rb
@@ -0,0 +1,287 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Liquid < RegexLexer
+      title "Liquid"
+      desc 'Liquid is a templating engine for Ruby (liquidmarkup.org)'
+      tag 'liquid'
+      filenames '*.liquid'
+
+      state :root do
+        rule /[^\{]+/, Text
+
+        rule /(\{%)(\s*)/ do
+          groups Punctuation, Text::Whitespace
+          push :tag_or_block
+        end
+
+        rule /(\{\{)(\s*)/ do
+          groups Punctuation, Text::Whitespace
+          push :output
+        end
+
+        rule /\{/, Text
+      end
+
+      state :tag_or_block do
+        # builtin logic blocks
+        rule /(if|unless|elsif|case)(?=\s+)/, Keyword::Reserved, :condition
+
+        rule /(when)(\s+)/ do
+          groups Keyword::Reserved, Text::Whitespace
+          push :when
+        end
+
+        rule /(else)(\s*)(%\})/ do
+          groups Keyword::Reserved, Text::Whitespace, Punctuation
+          pop!
+        end
+
+        # other builtin blocks
+        rule /(capture)(\s+)([^\s%]+)(\s*)(%\})/ do
+          groups Name::Tag, Text::Whitespace, Name::Attribute, Text::Whitespace, Punctuation
+          pop!
+        end
+
+        rule /(comment)(\s*)(%\})/ do
+          groups Name::Tag, Text::Whitespace, Punctuation
+          push :comment
+        end
+
+        rule /(raw)(\s*)(%\})/ do
+          groups Name::Tag, Text::Whitespace, Punctuation
+          push :raw
+        end
+
+        rule /assign/, Name::Tag, :assign
+        rule /include/, Name::Tag, :include
+
+        # end of block
+        rule /(end(case|unless|if))(\s*)(%\})/ do
+          groups Keyword::Reserved, nil, Text::Whitespace, Punctuation
+          pop!
+        end
+
+        rule /(end([^\s%]+))(\s*)(%\})/ do
+          groups Name::Tag, nil, Text::Whitespace, Punctuation
+          pop!
+        end
+
+        # builtin tags
+        rule /(cycle)(\s+)(([^\s:]*)(:))?(\s*)/ do |m|
+          token Name::Tag, m[1]
+          token Text::Whitespace, m[2]
+
+          if m[4] =~ /'[^']*'/
+            token Str::Single, m[4]
+          elsif m[4] =~ /"[^"]*"/
+            token Str::Double, m[4]
+          else
+            token Name::Attribute, m[4]
+          end
+
+          token Punctuation, m[5]
+          token Text::Whitespace, m[6]
+
+          push :variable_tag_markup
+        end
+
+        # other tags or blocks
+        rule /([^\s%]+)(\s*)/ do
+          groups Name::Tag, Text::Whitespace
+          push :tag_markup
+        end
+      end
+
+      state :output do
+        mixin :whitespace
+        mixin :generic
+
+        rule /\}\}/, Punctuation, :pop!
+        rule /\|/, Punctuation, :filters
+      end
+
+      state :filters do
+        mixin :whitespace
+
+        rule (/\}\}/) { token Punctuation; reset_stack }
+
+        rule /([^\s\|:]+)(:?)(\s*)/ do
+          groups Name::Function, Punctuation, Text::Whitespace
+          push :filter_markup
+        end
+      end
+
+      state :filter_markup do
+        rule /\|/, Punctuation, :pop!
+
+        mixin :end_of_tag
+        mixin :end_of_block
+        mixin :default_param_markup
+      end
+
+      state :condition do
+        mixin :end_of_block
+        mixin :whitespace
+
+        rule /([=!><]=?)/, Operator
+
+        rule /\b((!)|(not\b))/ do
+          groups nil, Operator, Operator::Word
+        end
+
+        rule /(contains)/, Operator::Word
+
+        mixin :generic
+        mixin :whitespace
+      end
+
+      state :when do
+        mixin :end_of_block
+        mixin :whitespace
+        mixin :generic
+      end
+
+      state :operator do
+        rule /(\s*)((=|!|>|<)=?)(\s*)/ do
+          groups Text::Whitespace, Operator, nil, Text::Whitespace
+          pop!
+        end
+
+        rule /(\s*)(\bcontains\b)(\s*)/ do
+          groups Text::Whitespace, Operator::Word, Text::Whitespace
+          pop!
+        end
+      end
+
+      state :end_of_tag do
+        rule (/\}\}/) { token Punctuation; reset_stack }
+      end
+
+      state :end_of_block do
+        rule (/%\}/) { token Punctuation; reset_stack }
+      end
+
+      # states for unknown markup
+      state :param_markup do
+        mixin :whitespace
+        mixin :string
+
+        rule /([^\s=:]+)(\s*)(=|:)/ do
+          groups Name::Attribute, Text::Whitespace, Operator
+        end
+
+        rule /(\{\{)(\s*)([^\s\}])(\s*)(\}\})/ do
+          groups Punctuation, Text::Whitespace, nil, Text::Whitespace, Punctuation
+        end
+
+        mixin :number
+        mixin :keyword
+
+        rule /,/, Punctuation
+      end
+
+      state :default_param_markup do
+        mixin :param_markup
+        rule /./, Text
+      end
+
+      state :variable_param_markup do
+        mixin :param_markup
+        mixin :variable
+        rule /./, Text
+      end
+
+      state :tag_markup do
+        mixin :end_of_block
+        mixin :default_param_markup
+      end
+
+      state :variable_tag_markup do
+        mixin :end_of_block
+        mixin :variable_param_markup
+      end
+
+      # states for different values types
+      state :keyword do
+        rule /\b(false|true)\b/, Keyword::Constant
+      end
+
+      state :variable do
+        rule /\.(?=\w)/, Punctuation
+        rule /[a-zA-Z_]\w*/, Name::Variable
+      end
+
+      state :string do
+        rule /'[^']*'/, Str::Single
+        rule /"[^"]*"/, Str::Double
+      end
+
+      state :number do
+        rule /\d+\.\d+/, Num::Float
+        rule /\d+/, Num::Integer
+      end
+
+      state :array_index do
+        rule /\[/, Punctuation
+        rule /\]/, Punctuation
+      end
+
+      state :generic do
+        mixin :array_index
+        mixin :keyword
+        mixin :string
+        mixin :variable
+        mixin :number
+      end
+
+      state :whitespace do
+        rule /[ \t]+/, Text::Whitespace
+      end
+
+      state :comment do
+        rule /(\{%)(\s*)(endcomment)(\s*)(%\})/ do
+          groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation
+          reset_stack
+        end
+
+        rule /./, Comment
+      end
+
+      state :raw do
+        rule /[^\{]+/, Text
+
+        rule /(\{%)(\s*)(endraw)(\s*)(%\})/ do
+          groups Punctuation, Text::Whitespace, Name::Tag, Text::Whitespace, Punctuation
+          reset_stack
+        end
+
+        rule /\{/, Text
+      end
+
+      state :assign do
+        mixin :whitespace
+        mixin :end_of_block
+
+        rule /(\s*)(=)(\s*)/ do
+          groups Text::Whitespace, Operator, Text::Whitespace
+        end
+
+        rule /\|/, Punctuation, :filters
+
+        mixin :generic
+      end
+
+      state :include do
+        mixin :whitespace
+
+        rule /([^\.]+)(\.)(html|liquid)/ do
+          groups Name::Attribute, Punctuation, Name::Attribute
+        end
+
+        mixin :variable_tag_markup
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/literate_coffeescript.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/literate_coffeescript.rb
new file mode 100644
index 0000000..0c546ca
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/literate_coffeescript.rb
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class LiterateCoffeescript < RegexLexer
+      tag 'literate_coffeescript'
+      title "Literate CoffeeScript"
+      desc 'Literate coffeescript'
+      aliases 'litcoffee'
+      filenames '*.litcoffee'
+
+      def markdown
+        @markdown ||= Markdown.new(options)
+      end
+
+      def coffee
+        @coffee ||= Coffeescript.new(options)
+      end
+
+      start { markdown.reset!; coffee.reset! }
+
+      state :root do
+        rule /^(    .*?\n)+/m do
+          delegate coffee
+        end
+
+        rule /^([ ]{0,3}(\S.*?|)\n)*/m do
+          delegate markdown
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/literate_haskell.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/literate_haskell.rb
new file mode 100644
index 0000000..d8708aa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/literate_haskell.rb
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class LiterateHaskell < RegexLexer
+      title "Literate Haskell"
+      desc 'Literate haskell'
+      tag 'literate_haskell'
+      aliases 'lithaskell', 'lhaskell', 'lhs'
+      filenames '*.lhs'
+      mimetypes 'text/x-literate-haskell'
+
+      def haskell
+        @haskell ||= Haskell.new(options)
+      end
+
+      start { haskell.reset! }
+
+      # TODO: support TeX versions as well.
+      state :root do
+        rule /\s*?\n(?=>)/, Text, :code
+        rule /.*?\n/, Text
+        rule /.+\z/, Text
+      end
+
+      state :code do
+        rule /(>)( .*?(\n|\z))/ do |m|
+          token Name::Label, m[1]
+          delegate haskell, m[2]
+        end
+
+        rule /\s*\n(?=\s*[^>])/, Text, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/llvm.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/llvm.rb
new file mode 100644
index 0000000..55f9ba4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/llvm.rb
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class LLVM < RegexLexer
+      title "LLVM"
+      desc 'The LLVM Compiler Infrastructure (http://llvm.org/)'
+      tag 'llvm'
+
+      filenames '*.ll'
+      mimetypes 'text/x-llvm'
+
+      def self.analyze_text(text)
+        return 0.1 if text =~ /\A%\w+\s=\s/
+      end
+
+      string = /"[^"]*?"/
+      identifier = /([-a-zA-Z$._][-a-zA-Z$._0-9]*|#{string})/
+
+      state :basic do
+        rule /;.*?$/, Comment::Single
+        rule /\s+/, Text
+
+        rule /#{identifier}\s*:/, Name::Label
+
+        rule /@(#{identifier}|\d+)/, Name::Variable::Global
+        rule /(%|!)#{identifier}/, Name::Variable
+        rule /(%|!)\d+/, Name::Variable
+
+        rule /c?#{string}/, Str
+
+        rule /0[xX][a-fA-F0-9]+/, Num
+        rule /-?\d+(?:[.]\d+)?(?:[eE][-+]?\d+(?:[.]\d+)?)?/, Num
+
+        rule /[=<>{}\[\]()*.,!]|x/, Punctuation
+      end
+
+      builtin_types = %w(
+        void float double half x86_fp80 x86mmx fp128 ppc_fp128 label metadata
+      )
+
+      state :types do
+        rule /i[1-9]\d*/, Keyword::Type
+        rule /#{builtin_types.join('|')}/, Keyword::Type
+      end
+
+      builtin_keywords = %w(
+        begin end true false declare define global constant personality private
+        landingpad linker_private internal available_externally linkonce_odr
+        linkonce weak weak_odr appending dllimport dllexport common default
+        hidden protected extern_weak external thread_local zeroinitializer
+        undef null to tail target triple datalayout volatile nuw nsw nnan ninf
+        nsz arcp fast exact inbounds align addrspace section alias module asm
+        sideeffect gc dbg ccc fastcc coldcc x86_stdcallcc x86_fastcallcc
+        arm_apcscc arm_aapcscc arm_aapcs_vfpcc ptx_device ptx_kernel cc
+        c signext zeroext inreg sret nounwind noreturn noalias nocapture byval
+        nest readnone readonly inlinehint noinline alwaysinline optsize ssp
+        sspreq noredzone noimplicitfloat naked type opaque eq ne slt sgt sle
+        sge ult ugt ule uge oeq one olt ogt ole oge ord uno unnamed_addr ueq
+        une uwtable x
+      )
+
+      builtin_instructions = %w(
+        add fadd sub fsub mul fmul udiv sdiv fdiv urem srem frem shl lshr ashr
+        and or xor icmp fcmp phi call catch trunc zext sext fptrunc fpext
+        uitofp sitofp fptoui fptosi inttoptr ptrtoint bitcast select va_arg ret
+        br switch invoke unwind unreachable malloc alloca free load store
+        getelementptr extractelement insertelement shufflevector getresult
+        extractvalue insertvalue cleanup resume
+      )
+
+      state :keywords do
+        rule /#{builtin_instructions.join('|')}/, Keyword
+        rule /#{builtin_keywords.join('|')}/, Keyword
+      end
+
+      state :root do
+        mixin :basic
+        mixin :keywords
+        mixin :types
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/lua.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/lua.rb
new file mode 100644
index 0000000..9da3dbf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/lua.rb
@@ -0,0 +1,122 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Lua < RegexLexer
+      title "Lua"
+      desc "Lua (http://www.lua.org)"
+      tag 'lua'
+      filenames '*.lua', '*.wlua'
+
+      mimetypes 'text/x-lua', 'application/x-lua'
+
+      def initialize(opts={})
+        @function_highlighting = opts.delete(:function_highlighting) { true }
+        @disabled_modules = opts.delete(:disabled_modules) { [] }
+        super(opts)
+      end
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'lua'
+      end
+
+      def self.builtins
+        load Pathname.new(__FILE__).dirname.join('lua/builtins.rb')
+        self.builtins
+      end
+
+      def builtins
+        return [] unless @function_highlighting
+
+        @builtins ||= Set.new.tap do |builtins|
+          self.class.builtins.each do |mod, fns|
+            next if @disabled_modules.include? mod
+            builtins.merge(fns)
+          end
+        end
+      end
+
+      state :root do
+        # lua allows a file to start with a shebang
+        rule %r(#!(.*?)$), Comment::Preproc
+        rule //, Text, :base
+      end
+
+      state :base do
+        rule %r(--\[(=*)\[.*?\]\1\])m, Comment::Multiline
+        rule %r(--.*$), Comment::Single
+
+        rule %r((?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?'), Num::Float
+        rule %r((?i)\d+e[+-]?\d+), Num::Float
+        rule %r((?i)0x[0-9a-f]*), Num::Hex
+        rule %r(\d+), Num::Integer
+
+        rule %r(\n), Text
+        rule %r([^\S\n]), Text
+        # multiline strings
+        rule %r(\[(=*)\[.*?\]\1\])m, Str
+
+        rule %r((==|~=|<=|>=|\.\.\.|\.\.|[=+\-*/%^<>#])), Operator
+        rule %r([\[\]\{\}\(\)\.,:;]), Punctuation
+        rule %r((and|or|not)\b), Operator::Word
+
+        rule %r((break|do|else|elseif|end|for|if|in|repeat|return|then|until|while)\b), Keyword
+        rule %r((local)\b), Keyword::Declaration
+        rule %r((true|false|nil)\b), Keyword::Constant
+
+        rule %r((function)\b), Keyword, :function_name
+
+        rule %r([A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?) do |m|
+          name = m[0]
+          if self.builtins.include?(name)
+            token Name::Builtin
+          elsif name =~ /\./
+            a, b = name.split('.', 2)
+            token Name, a
+            token Punctuation, '.'
+            token Name, b
+          else
+            token Name
+          end
+        end
+
+        rule %r('), Str::Single, :escape_sqs
+        rule %r("), Str::Double, :escape_dqs
+      end
+
+      state :function_name do
+        rule /\s+/, Text
+        rule %r((?:([A-Za-z_][A-Za-z0-9_]*)(\.))?([A-Za-z_][A-Za-z0-9_]*)) do
+          groups Name::Class, Punctuation, Name::Function
+          pop!
+        end
+        # inline function
+        rule %r(\(), Punctuation, :pop!
+      end
+
+      state :escape_sqs do
+        mixin :string_escape
+        mixin :sqs
+      end
+
+      state :escape_dqs do
+        mixin :string_escape
+        mixin :dqs
+      end
+
+      state :string_escape do
+        rule %r(\\([abfnrtv\\"']|\d{1,3})), Str::Escape
+      end
+
+      state :sqs do
+        rule %r('), Str::Single, :pop!
+        rule %r([^']+), Str::Single
+      end
+
+      state :dqs do
+        rule %r("), Str::Double, :pop!
+        rule %r([^"]+), Str::Double
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/lua/builtins.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/lua/builtins.rb
new file mode 100644
index 0000000..0ac1551
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/lua/builtins.rb
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*- #
+# automatically generated by `rake builtins:lua`
+module Rouge
+  module Lexers
+    class Lua
+      def self.builtins
+        @builtins ||= {}.tap do |b|
+          b["basic"] = Set.new %w(_G _VERSION assert collectgarbage dofile error getmetatable ipairs load loadfile next pairs pcall print rawequal rawget rawlen rawset select setmetatable tonumber tostring type xpcall file:close file:flush file:lines file:read file:seek file:setvbuf file:write)
+          b["modules"] = Set.new %w(require package.config package.cpath package.loaded package.loadlib package.path package.preload package.searchers package.searchpath)
+          b["bit32"] = Set.new %w(bit32.arshift bit32.band bit32.bnot bit32.bor bit32.btest bit32.bxor bit32.extract bit32.lrotate bit32.lshift bit32.replace bit32.rrotate bit32.rshift)
+          b["coroutine"] = Set.new %w(coroutine.create coroutine.resume coroutine.running coroutine.status coroutine.wrap coroutine.yield)
+          b["debug"] = Set.new %w(debug.debug debug.getuservalue debug.gethook debug.getinfo debug.getlocal debug.getmetatable debug.getregistry debug.getupvalue debug.setuservalue debug.sethook debug.setlocal debug.setmetatable debug.setupvalue debug.traceback debug.upvalueid debug.upvaluejoin)
+          b["io"] = Set.new %w(io.close io.flush io.input io.lines io.open io.output io.popen io.read io.stderr io.stdin io.stdout io.tmpfile io.type io.write)
+          b["math"] = Set.new %w(math.abs math.acos math.asin math.atan math.atan2 math.ceil math.cos math.cosh math.deg math.exp math.floor math.fmod math.frexp math.huge math.ldexp math.log math.max math.min math.modf math.pi math.pow math.rad math.random math.randomseed math.sin math.sinh math.sqrt math.tan math.tanh)
+          b["os"] = Set.new %w(os.clock os.date os.difftime os.execute os.exit os.getenv os.remove os.rename os.setlocale os.time os.tmpname)
+          b["string"] = Set.new %w(string.byte string.char string.dump string.find string.format string.gmatch string.gsub string.len string.lower string.match string.rep string.reverse string.sub string.upper)
+          b["table"] = Set.new %w(table.concat table.insert table.pack table.remove table.sort table.unpack)
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/make.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/make.rb
new file mode 100644
index 0000000..45862e9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/make.rb
@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Make < RegexLexer
+      title "Make"
+      desc "Makefile syntax"
+      tag 'make'
+      aliases 'makefile', 'mf', 'gnumake', 'bsdmake'
+      filenames '*.make', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile'
+      mimetypes 'text/x-makefile'
+
+      def self.analyze_text(text)
+        return 0.6 if text =~ /^\.PHONY:/
+      end
+
+      bsd_special = %w(
+        include undef error warning if else elif endif for endfor
+      )
+
+      gnu_special = %w(
+        ifeq ifneq ifdef ifndef else endif include -include define endef :
+      )
+
+      line = /(?:\\.|\\\n|[^\\\n])*/m
+
+      def initialize(opts={})
+        super
+        @shell = Shell.new(opts)
+      end
+
+      start { @shell.reset! }
+
+      state :root do
+        rule /\s+/, Text
+
+        rule /#.*?\n/, Comment
+
+        rule /(export)(\s+)(?=[a-zA-Z0-9_\${}\t -]+\n)/ do
+          groups Keyword, Text
+          push :export
+        end
+
+        rule /export\s+/, Keyword
+
+        # assignment
+        rule /([a-zA-Z0-9_${}.-]+)(\s*)([!?:+]?=)/m do |m|
+          token Name::Variable, m[1]
+          token Text, m[2]
+          token Operator, m[3]
+          push :shell_line
+        end
+
+        rule /"(\\\\|\\.|[^"\\])*"/, Str::Double
+        rule /'(\\\\|\\.|[^'\\])*'/, Str::Single
+        rule /([^\n:]+)(:+)([ \t]*)/ do
+          groups Name::Label, Operator, Text
+          push :block_header
+        end
+      end
+
+      state :export do
+        rule /[\w\${}-]/, Name::Variable
+        rule /\n/, Text, :pop!
+        rule /\s+/, Text
+      end
+
+      state :block_header do
+        rule /[^,\\\n#]+/, Name::Function
+        rule /,/, Punctuation
+        rule /#.*?/, Comment
+        rule /\\\n/, Text
+        rule /\\./, Text
+        rule /\n/ do
+          token Text
+          goto :block_body
+        end
+      end
+
+      state :block_body do
+        rule /(\t[\t ]*)([@-]?)/ do |m|
+          groups Text, Punctuation
+          push :shell_line
+        end
+
+        rule(//) { @shell.reset!; pop! }
+      end
+
+      state :shell do
+        # macro interpolation
+        rule /\$\(\s*[a-z_]\w*\s*\)/i, Name::Variable
+        # $(shell ...)
+        rule /(\$\()(\s*)(shell)(\s+)/m do
+          groups Name::Function, Text, Name::Builtin, Text
+          push :shell_expr
+        end
+
+        rule(/\\./m) { delegate @shell }
+        stop = /\$\(|\(|\)|\n|\\/
+        rule(/.+?(?=#{stop})/m) { delegate @shell }
+        rule(stop) { delegate @shell }
+      end
+
+      state :shell_expr do
+        rule(/\(/) { delegate @shell; push }
+        rule /\)/, Name::Variable, :pop!
+        mixin :shell
+      end
+
+      state :shell_line do
+        rule /\n/, Text, :pop!
+        mixin :shell
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/markdown.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/markdown.rb
new file mode 100644
index 0000000..446d27b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/markdown.rb
@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Markdown < RegexLexer
+      title "Markdown"
+      desc "Markdown, a light-weight markup language for authors"
+
+      tag 'markdown'
+      aliases 'md', 'mkd'
+      filenames '*.markdown', '*.md', '*.mkd'
+      mimetypes 'text/x-markdown'
+
+      def html
+        @html ||= HTML.new(options)
+      end
+
+      start { html.reset! }
+
+      edot = /\\.|[^\\\n]/
+
+      state :root do
+        # YAML frontmatter
+        rule(/\A(---\s*\n.*?\n?)^(---\s*$\n?)/m) { delegate YAML }
+
+        rule /\\./, Str::Escape
+
+        rule /^[\S ]+\n(?:---*)\n/, Generic::Heading
+        rule /^[\S ]+\n(?:===*)\n/, Generic::Subheading
+
+        rule /^#(?=[^#]).*?$/, Generic::Heading
+        rule /^##*.*?$/, Generic::Subheading
+
+        # TODO: syntax highlight the code block, github style
+        rule /(\n[ \t]*)(```|~~~)(.*?)(\n.*?)(\2)/m do |m|
+          sublexer = Lexer.find_fancy(m[3].strip, m[4])
+          sublexer ||= PlainText.new(:token => Str::Backtick)
+          sublexer.reset!
+
+          token Text, m[1]
+          token Punctuation, m[2]
+          token Name::Label, m[3]
+          delegate sublexer, m[4]
+          token Punctuation, m[5]
+        end
+
+        rule /\n\n((    |\t).*?\n|\n)+/, Str::Backtick
+
+        rule /(`+)#{edot}*\1/, Str::Backtick
+
+        # various uses of * are in order of precedence
+
+        # line breaks
+        rule /^(\s*[*]){3,}\s*$/, Punctuation
+        rule /^(\s*[-]){3,}\s*$/, Punctuation
+
+        # bulleted lists
+        rule /^\s*[*+-](?=\s)/, Punctuation
+
+        # numbered lists
+        rule /^\s*\d+\./, Punctuation
+
+        # blockquotes
+        rule /^\s*>.*?$/, Generic::Traceback
+
+        # link references
+        # [foo]: bar "baz"
+        rule %r(^
+          (\s*) # leading whitespace
+          (\[) (#{edot}+?) (\]) # the reference
+          (\s*) (:) # colon
+        )x do
+          groups Text, Punctuation, Str::Symbol, Punctuation, Text, Punctuation
+
+          push :title
+          push :url
+        end
+
+        # links and images
+        rule /(!?\[)(#{edot}+?)(\])/ do
+          groups Punctuation, Name::Variable, Punctuation
+          push :link
+        end
+
+        rule /[*][*]#{edot}*?[*][*]/, Generic::Strong
+        rule /__#{edot}*?__/, Generic::Strong
+
+        rule /[*]#{edot}*?[*]/, Generic::Emph
+        rule /_#{edot}*?_/, Generic::Emph
+
+        # Automatic links
+        rule /<.*?@.+[.].+>/, Name::Variable
+        rule %r[<(https?|mailto|ftp)://#{edot}*?>], Name::Variable
+
+
+        rule /[^\\`\[*\n&<]+/, Text
+
+        # inline html
+        rule(/&\S*;/) { delegate html }
+        rule(/<#{edot}*?>/) { delegate html }
+        rule /[&<]/, Text
+
+        rule /\n/, Text
+      end
+
+      state :link do
+        rule /(\[)(#{edot}*?)(\])/ do
+          groups Punctuation, Str::Symbol, Punctuation
+          pop!
+        end
+
+        rule /[(]/ do
+          token Punctuation
+          push :inline_title
+          push :inline_url
+        end
+
+        rule /[ \t]+/, Text
+
+        rule(//) { pop! }
+      end
+
+      state :url do
+        rule /[ \t]+/, Text
+
+        # the url
+        rule /(<)(#{edot}*?)(>)/ do
+          groups Name::Tag, Str::Other, Name::Tag
+          pop!
+        end
+
+        rule /\S+/, Str::Other, :pop!
+      end
+
+      state :title do
+        rule /"#{edot}*?"/, Name::Namespace
+        rule /'#{edot}*?'/, Name::Namespace
+        rule /[(]#{edot}*?[)]/, Name::Namespace
+        rule /\s*(?=["'()])/, Text
+        rule(//) { pop! }
+      end
+
+      state :inline_title do
+        rule /[)]/, Punctuation, :pop!
+        mixin :title
+      end
+
+      state :inline_url do
+        rule /[^<\s)]+/, Str::Other, :pop!
+        rule /\s+/m, Text
+        mixin :url
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/matlab.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/matlab.rb
new file mode 100644
index 0000000..994abbd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/matlab.rb
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Matlab < RegexLexer
+      title "MATLAB"
+      desc "Matlab"
+      tag 'matlab'
+      aliases 'm'
+      filenames '*.m'
+      mimetypes 'text/x-matlab', 'application/x-matlab'
+
+      def self.analyze_text(text)
+        return 0.4 if text.match(/^\s*% /) # % comments are a dead giveaway
+      end
+
+      def self.keywords
+        @keywords = Set.new %w(
+          break case catch classdef continue else elseif end for function
+          global if otherwise parfor persistent return spmd switch try while
+        )
+      end
+
+      def self.builtins
+        load Pathname.new(__FILE__).dirname.join('matlab/builtins.rb')
+        self.builtins
+      end
+
+      state :root do
+        rule /\s+/m, Text # Whitespace
+        rule %r([{]%.*?%[}])m, Comment::Multiline
+        rule /%.*$/, Comment::Single
+        rule /([.][.][.])(.*?)$/ do
+          groups(Keyword, Comment)
+        end
+
+        rule /^(!)(.*?)(?=%|$)/ do |m|
+          token Keyword, m[1]
+          delegate Shell, m[2]
+        end
+
+
+        rule /[a-zA-Z][_a-zA-Z0-9]*/m do |m|
+          match = m[0]
+          if self.class.keywords.include? match
+            token Keyword
+          elsif self.class.builtins.include? match
+            token Name::Builtin
+          else
+            token Name
+          end
+        end
+
+        rule %r{[(){};:,\/\\\]\[]}, Punctuation
+
+        rule /~=|==|<<|>>|[-~+\/*%=<>&^|.@]/, Operator
+
+
+        rule /(\d+\.\d*|\d*\.\d+)(e[+-]?[0-9]+)?/i, Num::Float
+        rule /\d+e[+-]?[0-9]+/i, Num::Float
+        rule /\d+L/, Num::Integer::Long
+        rule /\d+/, Num::Integer
+
+        rule /'(?=(.*'))/, Str::Single, :string
+        rule /'/, Operator
+      end
+
+      state :string do
+        rule /[^']+/, Str::Single
+        rule /''/, Str::Escape
+        rule /'/, Str::Single, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/matlab/builtins.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/matlab/builtins.rb
new file mode 100644
index 0000000..3b78998
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/matlab/builtins.rb
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*- #
+# automatically generated by `rake builtins:matlab`
+module Rouge
+  module Lexers
+    class Matlab
+      def self.builtins
+        @builtins ||= Set.new %w(ans clc diary format home iskeyword more accumarray blkdiag diag eye false freqspace linspace logspace meshgrid ndgrid ones rand true zeros cat horzcat vertcat colon end ind2sub sub2ind length ndims numel size height width iscolumn isempty ismatrix isrow isscalar isvector blkdiag circshift ctranspose diag flip fliplr flipud ipermute permute repmat reshape rot90 shiftdim issorted sort sortrows squeeze transpose vectorize plus uplus minus uminus times rdivide ldivide power mtimes mrdivide mldivide mpower cumprod cumsum diff prod sum ceil fix floor idivide mod rem round relationaloperators eq ge gt le lt ne isequal isequaln logicaloperatorsshortcircuit and not or xor all any false find islogical logical true intersect ismember issorted setdiff setxor union unique join innerjoin outerjoin bitand bitcmp bitget bitor bitset bitshift bitxor swapbytes specialcharacters colon double single int8 int16 int32 int64 uint8 uint16 uint32 uint64 cast typecast isinteger isfloat isnumeric isreal isfinite isinf isnan eps flintmax inf intmax intmin nan realmax realmin blanks cellstr char iscellstr ischar sprintf strcat strjoin ischar isletter isspace isstrprop sscanf strfind strrep strsplit strtok validatestring symvar regexp regexpi regexprep regexptranslate strcmp strcmpi strncmp strncmpi blanks deblank strtrim lower upper strjust categorical iscategorical categories iscategory isordinal isprotected addcats mergecats removecats renamecats reordercats summary countcats isundefined table array2table cell2table struct2table table2array table2cell table2struct readtable writetable istable height width summary intersect ismember setdiff setxor unique union join innerjoin outerjoin sortrows stack unstack ismissing standardizemissing varfun rowfun struct fieldnames getfield isfield isstruct orderfields rmfield setfield arrayfun structfun table2struct struct2table cell2struct struct2cell cell cell2mat cell2struct cell2table celldisp cellfun cellplot cellstr iscell iscellstr mat2cell num2cell strjoin strsplit struct2cell table2cell function_handle feval func2str str2func localfunctions functions addevent delevent gettsafteratevent gettsafterevent gettsatevent gettsbeforeatevent gettsbeforeevent gettsbetweenevents gettscollection isemptytscollection lengthtscollection settscollection sizetscollection tscollection addsampletocollection addts delsamplefromcollection getabstimetscollection getsampleusingtimetscollection gettimeseriesnames horzcattscollection removets resampletscollection setabstimetscollection settimeseriesnames vertcattscollection is isa iscategorical iscell iscellstr ischar isfield isfloat ishghandle isinteger isjava islogical isnumeric isobject isreal isscalar isstr isstruct istable isvector class validateattributes whos char int2str mat2str num2str str2double str2num native2unicode unicode2native base2dec bin2dec dec2base dec2bin dec2hex hex2dec hex2num num2hex table2array table2cell table2struct array2table cell2table struct2table cell2mat cell2struct cellstr mat2cell num2cell struct2cell datenum datevec datestr now clock date calendar eomday weekday addtodate etime plus uplus minus uminus times rdivide ldivide power mtimes mrdivide mldivide mpower cumprod cumsum diff prod sum ceil fix floor idivide mod rem round sin sind asin asind sinh asinh cos cosd acos acosd cosh acosh tan tand atan atand atan2 atan2d tanh atanh csc cscd acsc acscd csch acsch sec secd asec asecd sech asech cot cotd acot acotd coth acoth hypot exp expm1 log log10 log1p log2 nextpow2 nthroot pow2 reallog realpow realsqrt sqrt abs angle complex conj cplxpair i imag isreal j real sign unwrap factor factorial gcd isprime lcm nchoosek perms primes rat rats poly polyder polyeig polyfit polyint polyval polyvalm residue roots airy besselh besseli besselj besselk bessely beta betainc betaincinv betaln ellipj ellipke erf erfc erfcinv erfcx erfinv expint gamma gammainc gammaincinv gammaln legendre psi cart2pol cart2sph pol2cart sph2cart eps flintmax i j inf pi nan isfinite isinf isnan compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson cross dot kron surfnorm tril triu transpose cond condest funm inv linsolve lscov lsqnonneg pinv rcond sylvester mldivide mrdivide chol ichol cholupdate ilu lu qr qrdelete qrinsert qrupdate planerot ldl cdf2rdf rsf2csf gsvd svd balance cdf2rdf condeig eig eigs gsvd hess ordeig ordqz ordschur poly polyeig qz rsf2csf schur sqrtm ss2tf svd svds bandwidth cond condeig det isbanded isdiag ishermitian issymmetric istril istriu norm normest null orth rank rcond rref subspace trace expm logm sqrtm bsxfun arrayfun accumarray mpower corrcoef cov max mean median min mode std var rand randn randi randperm rng interp1 pchip spline ppval mkpp unmkpp padecoef interpft interp2 interp3 interpn ndgrid meshgrid griddata griddatan fminbnd fminsearch fzero lsqnonneg optimget optimset ode45 ode15s ode23 ode113 ode23t ode23tb ode23s ode15i decic odextend odeget odeset deval bvp4c bvp5c bvpinit bvpxtend bvpget bvpset deval dde23 ddesd ddensd ddeget ddeset deval pdepe pdeval integral integral2 integral3 quadgk quad2d cumtrapz trapz polyint del2 diff gradient polyder abs angle cplxpair fft fft2 fftn fftshift fftw ifft ifft2 ifftn ifftshift nextpow2 unwrap conv conv2 convn deconv detrend filter filter2 spdiags speye sprand sprandn sprandsym sparse spconvert issparse nnz nonzeros nzmax spalloc spfun spones spparms spy find full amd colamd colperm dmperm randperm symamd symrcm condest eigs ichol ilu normest spaugment sprank svds bicg bicgstab bicgstabl cgs gmres lsqr minres pcg qmr symmlq tfqmr etree etreeplot gplot symbfact treelayout treeplot unmesh tetramesh trimesh triplot trisurf delaunay delaunayn tetramesh trimesh triplot trisurf dsearchn tsearchn delaunay delaunayn convhull convhulln patch trisurf patch voronoi voronoin polyarea inpolygon rectint plot plotyy plot3 loglog semilogx semilogy errorbar fplot ezplot ezplot3 linespec colorspec bar bar3 barh bar3h hist histc rose pareto area pie pie3 stem stairs stem3 scatter scatter3 spy plotmatrix polar rose compass ezpolar linespec colorspec contour contourf contourc contour3 contourslice ezcontour ezcontourf feather quiver compass quiver3 streamslice streamline surf surfc surface surfl surfnorm mesh meshc meshz waterfall ribbon contour3 peaks cylinder ellipsoid sphere pcolor surf2patch ezsurf ezsurfc ezmesh ezmeshc contourslice flow isocaps isocolors isonormals isosurface reducepatch reducevolume shrinkfaces slice smooth3 subvolume volumebounds coneplot curl divergence interpstreamspeed stream2 stream3 streamline streamparticles streamribbon streamslice streamtube fill fill3 patch surf2patch movie noanimate drawnow refreshdata frame2im getframe im2frame comet comet3 title xlabel ylabel zlabel clabel datetick texlabel legend colorbar xlim ylim zlim box grid daspect pbaspect axes axis subplot hold gca cla annotation text legend title xlabel ylabel zlabel datacursormode ginput gtext colormap colormapeditor colorbar brighten contrast shading graymon caxis hsv2rgb rgb2hsv rgbplot spinmap colordef whitebg hidden pan reset rotate rotate3d selectmoveresize zoom datacursormode figurepalette plotbrowser plotedit plottools propertyeditor showplottool brush datacursormode linkdata refreshdata view makehgtform viewmtx cameratoolbar campan camzoom camdolly camlookat camorbit campos camproj camroll camtarget camup camva camlight light lightangle lighting diffuse material specular alim alpha alphamap image imagesc imread imwrite imfinfo imformats frame2im im2frame im2java ind2rgb rgb2ind imapprox dither cmpermute cmunique print printopt printdlg printpreview orient savefig openfig hgexport hgsave hgload saveas gca gcf gcbf gcbo gco ancestor allchild findall findfigs findobj gobjects ishghandle ishandle copyobj delete get set propedit rootobject figure axes image light line patch rectangle surface text annotation set get hggroup hgtransform makehgtform figure gcf close clf refresh newplot shg closereq dragrect drawnow rbbox opengl axes hold ishold newplot linkaxes linkprop refreshdata waitfor get set if for parfor switch try while break continue end pause return edit input publish notebook grabcode snapnow function nargin nargout varargin varargout narginchk nargoutchk validateattributes validatestring inputname persistent isvarname namelengthmax assignin global isglobal try error warning lastwarn assert oncleanup dbclear dbcont dbdown dbquit dbstack dbstatus dbstep dbstop dbtype dbup checkcode keyboard mlintrpt edit echo eval evalc evalin feval run builtin mfilename pcode clear clearvars disp openvar who whos load save matfile importdata uiimport csvread csvwrite dlmread dlmwrite textscan readtable writetable type xlsfinfo xlsread xlswrite readtable writetable fclose feof ferror fgetl fgets fileread fopen fprintf fread frewind fscanf fseek ftell fwrite im2java imfinfo imread imwrite nccreate ncdisp ncinfo ncread ncreadatt ncwrite ncwriteatt ncwriteschema netcdf h5create h5disp h5info h5read h5readatt h5write h5writeatt hdfinfo hdfread imread imwrite hdfan hdfhx hdfh hdfhd hdfhe hdfml hdfpt hdfv hdfvf hdfvh hdfvs hdfdf24 hdfdfr8 fitsdisp fitsinfo fitsread fitswrite multibandread multibandwrite cdfepoch cdfinfo cdfread cdfwrite todatenum cdflib audioinfo audioread audiowrite mmfileinfo movie2avi audiodevinfo audioplayer audiorecorder sound soundsc beep lin2mu mu2lin xmlread xmlwrite xslt memmapfile dir ls pwd fileattrib exist isdir type visdiff what which cd copyfile delete recycle mkdir movefile rmdir open winopen fileparts fullfile filemarker filesep tempdir tempname matlabroot toolboxdir zip unzip gzip gunzip tar untar addpath rmpath path savepath userpath genpath pathsep pathtool restoredefaultpath clipboard computer dos getenv perl setenv system unix winqueryreg sendmail urlread urlwrite web instrcallback instrfind instrfindall readasync record serial serialbreak stopasync supportpackageinstaller raspi_examples targetupdater raspi raspi writeled showleds raspi configuredigitalpin readdigitalpin writedigitalpin showpins raspi raspi scani2cbus i2cdev readregister writeregister enablei2c disablei2c raspi spidev writeread enablespi disablespi raspi cameraboard raspi openshell getfile putfile deletefile webcamlist webcam preview snapshot closepreview guide inspect figure axes uicontrol uitable uipanel uibuttongroup actxcontrol uimenu uicontextmenu uitoolbar uipushtool uitoggletool dialog errordlg helpdlg msgbox questdlg uigetpref uisetpref waitbar warndlg export2wsdlg inputdlg listdlg uisetcolor uisetfont printdlg printpreview uigetdir uigetfile uiopen uiputfile uisave menu align movegui getpixelposition setpixelposition listfonts textwrap uistack uiwait uiresume waitfor waitforbuttonpress getappdata setappdata isappdata rmappdata guidata guihandles classdef class isa isequal isobject enumeration events methods properties classdef import properties isprop dynamicprops methods ismethod handle hgsetget dynamicprops isa events empty superclasses enumeration save load saveobj loadobj cat horzcat vertcat empty disp display numel size end subsref subsasgn subsindex substruct disp display details metaclass mexext inmem loadlibrary unloadlibrary libisloaded calllib libfunctions libfunctionsview libstruct libpointer javaarray javaclasspath javaaddpath javarmpath javachk isjava usejava javamethod javamethodedt javaobject javaobjectedt cell class clear depfun exist fieldnames im2java import inmem inspect isa methods methodsview which net enablenetfromnetworkdrive cell begininvoke endinvoke combine remove removeall bitand bitor bitxor bitnot actxserver actxcontrol actxcontrollist actxcontrolselect iscom addproperty deleteproperty inspect fieldnames methods methodsview invoke isevent eventlisteners registerevent unregisterallevents unregisterevent isinterface interfaces release move callsoapservice createclassfromwsdl createsoapmessage parsesoapresponse try addcausemexception getreportmexception lastmexception rethrowmexception throwmexception throwascallermexception mexception functiontests runtests bench cputime memory profile profsave tic timeit toc clear inmem memory pack whos commandhistory commandwindow filebrowser workspace getpref setpref addpref rmpref ispref builddocsearchdb mex execute getchararray putchararray getfullmatrix putfullmatrix getvariable getworkspacedata putworkspacedata maximizecommandwindow minimizecommandwindow actxgetrunningserver enableservice mex dbmex mexext inmem ver computer mexext dbmex inmem mex mexext checkin checkout cmopts customverctrl undocheckout verctrl matlabwindows matlabunix exit quit matlabrc startup finish prefdir preferences ismac ispc isstudent isunix javachk license usejava ver verlessthan version doc help docsearch lookfor demo echodemo)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/moonscript.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/moonscript.rb
new file mode 100644
index 0000000..6d57407
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/moonscript.rb
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    load_lexer 'lua.rb'
+
+    class Moonscript < RegexLexer
+      title "MoonScript"
+      desc "Moonscript (http://www.moonscript.org)"
+      tag 'moonscript'
+      aliases 'moon'
+      filenames '*.moon'
+      mimetypes 'text/x-moonscript', 'application/x-moonscript'
+
+      def initialize(opts={})
+        @function_highlighting = opts.delete(:function_highlighting) { true }
+        @disabled_modules = opts.delete(:disabled_modules) { [] }
+        super(opts)
+      end
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'moon'
+      end
+
+      def builtins
+        return [] unless @function_highlighting
+
+        @builtins ||= Set.new.tap do |builtins|
+          Rouge::Lexers::Lua.builtins.each do |mod, fns|
+            next if @disabled_modules.include? mod
+            builtins.merge(fns)
+          end
+        end
+      end
+
+      state :root do
+        rule %r(#!(.*?)$), Comment::Preproc # shebang
+        rule //, Text, :main
+      end
+
+      state :base do
+        ident = '(?:[\w_][\w\d_]*)'
+
+        rule %r((?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?'), Num::Float
+        rule %r((?i)\d+e[+-]?\d+), Num::Float
+        rule %r((?i)0x[0-9a-f]*), Num::Hex
+        rule %r(\d+), Num::Integer
+        rule %r(@#{ident}*), Name::Variable::Instance
+        rule %r([A-Z][\w\d_]*), Name::Class
+        rule %r("?[^"]+":), Literal::String::Symbol
+        rule %r(#{ident}:), Literal::String::Symbol
+        rule %r(:#{ident}), Literal::String::Symbol
+
+        rule %r(\s+), Text::Whitespace
+        rule %r((==|~=|!=|<=|>=|\.\.\.|\.\.|->|=>|[=+\-*/%^<>#!\\])), Operator
+        rule %r([\[\]\{\}\(\)\.,:;]), Punctuation
+        rule %r((and|or|not)\b), Operator::Word
+
+        keywords = %w{
+          break class continue do else elseif end extends for if import in
+          repeat return switch super then unless until using when with while
+        }
+        rule %r((#{keywords.join('|')})\b), Keyword
+        rule %r((local|export)\b), Keyword::Declaration
+        rule %r((true|false|nil)\b), Keyword::Constant
+
+        rule %r([A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?) do |m|
+          name = m[0]
+          if self.builtins.include?(name)
+            token Name::Builtin
+          elsif name =~ /\./
+            a, b = name.split('.', 2)
+            token Name, a
+            token Punctuation, '.'
+            token Name, b
+          else
+            token Name
+          end
+        end
+      end
+
+      state :main do
+        rule %r(--.*$), Comment::Single
+        rule %r(\[(=*)\[.*?\]\1\])m, Str::Heredoc
+
+        mixin :base
+
+        rule %r('), Str::Single, :sqs
+        rule %r("), Str::Double, :dqs
+      end
+
+      state :sqs do
+        rule %r('), Str::Single, :pop!
+        rule %r([^']+), Str::Single
+      end
+
+      state :interpolation do
+        rule %r(\}), Str::Interpol, :pop!
+        mixin :base
+      end
+
+      state :dqs do
+        rule %r(#\{), Str::Interpol, :interpolation
+        rule %r("), Str::Double, :pop!
+        rule %r(#[^{]), Str::Double
+        rule %r([^"#]+), Str::Double
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/nasm.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/nasm.rb
new file mode 100644
index 0000000..04aafbc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/nasm.rb
@@ -0,0 +1,203 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Nasm < RegexLexer
+      tag 'nasm'
+      filenames '*.asm'
+      #mimetypes 'text/x-chdr', 'text/x-csrc'
+
+      title "Nasm"
+      desc "Netwide Assembler"
+
+      ws = %r((?:\s|;.*?\n/)+)
+      id = /[a-zA-Z_][a-zA-Z0-9_]*/
+
+      #todo: pull more instructions from: http://www.nasm.us/doc/nasmdocb.html
+      #so far, we have sections 1.1 and 1.2
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+           aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts
+           call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg
+           cmpxchg16b cmpxchg486 cmpxchg8b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div
+           dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove
+           fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp
+           fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr
+           fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e
+           fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw
+           fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos
+           fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip
+           fucomp fucompp fwait fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc
+           incbin insb insd insw int int01 int03 int1 int3 into invd invlpg invlpga invpcid iret
+           iretd iretq iretw jcxz jecxz jmp jmpe jrcxz lahf lar lds lea leave les lfence lfs
+           lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne
+           loopnz loopz lsl lss ltr mfence monitor monitorx mov movd movq movsb movsd movsq movsw
+           movsx movsxd movzx mul mwait mwaitx neg nop not or out outsb outsd outsw packssdw
+           packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn
+           pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc
+           pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt
+           pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw
+           pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch
+           prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw
+           psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd
+           push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdm rdmsr rdpmc rdshr
+           rdtsc rdtscp ret retf retn rol ror rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd
+           scasq scasw sfence sgdt shl shld shr shrd sidt skinit sldt smi smint smintold smsw
+           stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter
+           sysexit sysret test ud0 ud1 ud2 ud2a ud2b umov verr verw wbinvd wrmsr wrshr xadd xbts
+           xchg xlat xlatb xor
+
+           cmova cmovae cmovb cmovbe cmovc cmove cmovg cmovge cmovl cmovle cmovna cmovnae cmovnb cmovnbe cmovnc cmovne cmovng cmovnge cmovnl cmovnle cmovno cmovnp cmovns cmovnz cmovo cmovp cmovpe cmovpo cmovs cmovz
+
+           ja jae jb jbe jc jcxz jecxz je jg jge jl jle jna jnae jnb jnbe jnc jne jng jnge jnl jnle jno jnp jns jnz jo jp jpe jpo js jz
+
+           seta setae setb setbe setc sete setg setge setl setle setna setnae setnb setnbe setnc setne setng setnge setnl setnle setno setnp setns setnz seto setp setpe setpo sets setz
+
+           AAA AAD AAM AAS ADC ADD AND ARPL BB0_RESET BB1_RESET BOUND BSF BSR BSWAP BT BTC BTR BTS
+           CALL CBW CDQ CDQE CLC CLD CLI CLTS CMC  CMP CMPSB CMPSD CMPSQ CMPSW CMPXCHG
+           CMPXCHG16B CMPXCHG486 CMPXCHG8B CPUID CPU_READ CPU_WRITE CQO CWD CWDE DAA DAS DEC DIV
+           DMINT EMMS ENTER EQU F2XM1 FABS FADD FADDP FBLD FBSTP FCHS FCLEX FCMOVB FCMOVBE FCMOVE
+           FCMOVNB FCMOVNBE FCMOVNE FCMOVNU FCMOVU FCOM FCOMI FCOMIP FCOMP FCOMPP FCOS FDECSTP
+           FDISI FDIV FDIVP FDIVR FDIVRP FEMMS FENI FFREE FFREEP FIADD FICOM FICOMP FIDIV FIDIVR
+           FILD FIMUL FINCSTP FINIT FIST FISTP FISTTP FISUB FISUBR FLD FLD1 FLDCW FLDENV FLDL2E
+           FLDL2T FLDLG2 FLDLN2 FLDPI FLDZ FMUL FMULP FNCLEX FNDISI FNENI FNINIT FNOP FNSAVE FNSTCW
+           FNSTENV FNSTSW FPATAN FPREM FPREM1 FPTAN FRNDINT FRSTOR FSAVE FSCALE FSETPM FSIN FSINCOS
+           FSQRT FST FSTCW FSTENV FSTP FSTSW FSUB FSUBP FSUBR FSUBRP FTST FUCOM FUCOMI FUCOMIP
+           FUCOMP FUCOMPP FWAIT FXAM FXCH FXTRACT FYL2X FYL2XP1 HLT IBTS ICEBP IDIV IMUL IN INC
+           INCBIN INSB INSD INSW INT INT01 INT03 INT1 INT3 INTO INVD INVLPG INVLPGA INVPCID IRET
+           IRETD IRETQ IRETW JCXZ JECXZ JMP JMPE JRCXZ LAHF LAR LDS LEA LEAVE LES LFENCE LFS
+           LGDT LGS LIDT LLDT LMSW LOADALL LOADALL286 LODSB LODSD LODSQ LODSW LOOP LOOPE LOOPNE
+           LOOPNZ LOOPZ LSL LSS LTR MFENCE MONITOR MONITORX MOV MOVD MOVQ MOVSB MOVSD MOVSQ MOVSW
+           MOVSX MOVSXD MOVZX MUL MWAIT MWAITX NEG NOP NOT OR OUT OUTSB OUTSD OUTSW PACKSSDW
+           PACKSSWB PACKUSWB PADDB PADDD PADDSB PADDSIW PADDSW PADDUSB PADDUSW PADDW PAND PANDN
+           PAUSE PAVEB PAVGUSB PCMPEQB PCMPEQD PCMPEQW PCMPGTB PCMPGTD PCMPGTW PDISTIB PF2ID PFACC
+           PFADD PFCMPEQ PFCMPGE PFCMPGT PFMAX PFMIN PFMUL PFRCP PFRCPIT1 PFRCPIT2 PFRSQIT1 PFRSQRT
+           PFSUB PFSUBR PI2FD PMACHRIW PMADDWD PMAGW PMULHRIW PMULHRWA PMULHRWC PMULHW PMULLW
+           PMVGEZB PMVLZB PMVNZB PMVZB POP POPA POPAD POPAW POPF POPFD POPFQ POPFW POR PREFETCH
+           PREFETCHW PSLLD PSLLQ PSLLW PSRAD PSRAW PSRLD PSRLQ PSRLW PSUBB PSUBD PSUBSB PSUBSIW
+           PSUBSW PSUBUSB PSUBUSW PSUBW PUNPCKHBW PUNPCKHDQ PUNPCKHWD PUNPCKLBW PUNPCKLDQ PUNPCKLWD
+           PUSH PUSHA PUSHAD PUSHAW PUSHF PUSHFD PUSHFQ PUSHFW PXOR RCL RCR RDM RDMSR RDPMC RDSHR
+           RDTSC RDTSCP RET RETF RETN ROL ROR RSDC RSLDT RSM RSTS SAHF SAL SALC SAR SBB SCASB SCASD
+           SCASQ SCASW  SFENCE SGDT SHL SHLD SHR SHRD SIDT SKINIT SLDT SMI SMINT SMINTOLD SMSW
+           STC STD STI STOSB STOSD STOSQ STOSW STR SUB SVDC SVLDT SVTS SWAPGS SYSCALL SYSENTER
+           SYSEXIT SYSRET TEST UD0 UD1 UD2 UD2A UD2B UMOV VERR VERW WBINVD WRMSR WRSHR XADD XBTS
+           XCHG XLAT XLATB XOR
+
+           CMOVA CMOVAE CMOVB CMOVBE CMOVC CMOVE CMOVG CMOVGE CMOVL CMOVLE CMOVNA CMOVNAE CMOVNB CMOVNBE CMOVNC CMOVNE CMOVNG CMOVNGE CMOVNL CMOVNLE CMOVNO CMOVNP CMOVNS CMOVNZ CMOVO CMOVP CMOVPE CMOVPO CMOVS CMOVZ
+
+           JA JAE JB JBE JC JCXZ JECXZ JE JG JGE JL JLE JNA JNAE JNB JNBE JNC JNE JNG JNGE JNL JNLE JNO JNP JNS JNZ JO JP JPE JPO JS JZ
+
+           SETA SETAE SETB SETBE SETC SETE SETG SETGE SETL SETLE SETNA SETNAE SETNB SETNBE SETNC SETNE SETNG SETNGE SETNL SETNLE SETNO SETNP SETNS SETNZ SETO SETP SETPE SETPO SETS SETZ
+        )
+      end
+
+      def self.keywords_type
+        @keywords_type ||= Set.new %w(
+          DB DW DD DQ DT DO DY DZ RESB RESW RESD RESQ REST RESO RESY RESZ
+          db dq dd dq dt do dy dz resb resw resd resq rest reso resy resz
+        )
+      end
+
+      def self.reserved
+        @reserved ||= Set.new %w(
+          global extern macro endmacro assign rep endrep section
+          GLOBAL EXTERN MACRO ENDMACRO ASSIGN REP ENDREP SECTION
+        )
+      end
+
+      # high priority for filename matches
+      def self.analyze_text(*)
+        0.3
+      end
+
+      def self.builtins
+        @builtins ||= []
+      end
+
+      start { push :expr_bol }
+
+      state :expr_bol do
+        mixin :inline_whitespace
+        rule(//) { pop! }
+      end
+
+      state :inline_whitespace do
+        rule /[ \t\r]+/, Text
+      end
+
+      state :whitespace do
+        rule /\n+/m, Text, :expr_bol
+        rule %r(//(\\.|.)*?\n), Comment::Single, :expr_bol
+        mixin :inline_whitespace
+      end
+
+      state :expr_whitespace do
+        rule /\n+/m, Text, :expr_bol
+        mixin :whitespace
+      end
+
+      state :root do
+        mixin :expr_whitespace
+        rule (//) { push :statement }
+        rule /^%[a-zA-Z0-9]+/, Comment::Preproc, :statement
+
+        rule(
+          %r(&=|[*]=|/=|\\=|\^=|\+=|-=|<<=|>>=|<<|>>|:=|<=|>=|<>|[-&*/\\^+=<>.]),
+          Operator
+        )
+        rule /;.*/, Comment, :statement
+        rule /^[a-zA-Z]+[a-zA-Z0-9]*:/, Name::Function
+        rule /;.*/, Comment
+      end
+
+      state :statement do
+        mixin :expr_whitespace
+        mixin :statements
+        rule /;.*/, Comment
+        rule /^%[a-zA-Z0-9]+/, Comment::Preproc
+        rule /[a-zA-Z]+%[0-9]+:/, Name::Function
+      end
+
+      state :statements do
+        mixin :whitespace
+        rule /L?"/, Str, :string
+        rule /[a-zA-Z]+%[0-9]+:/, Name::Function  #labels/subroutines/functions
+        rule %r(L?'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, Str::Char
+        rule /0x[0-9a-f]+[lu]*/i, Num::Hex
+        rule /\d+[lu]*/i, Num::Integer
+        rule %r(\*/), Error
+        rule %r([~&*+=\|?:<>/-]), Operator
+        rule /[(),.]/, Punctuation
+        rule /\[[a-zA-Z0-9]*\]/, Punctuation
+        rule /%[0-9]+/, Keyword::Reserved
+        rule /[a-zA-Z]+%[0-9]+/, Name::Function  #labels/subroutines/functions
+
+        #rule /(?<!\.)#{id}/ do |m|
+        rule id do |m|
+          name = m[0]
+
+          if self.class.keywords.include? name
+            token Keyword
+          elsif self.class.keywords_type.include? name
+            token Keyword::Type
+          elsif self.class.reserved.include? name
+            token Keyword::Reserved
+          elsif self.class.builtins.include? name
+            token Name::Builtin
+          else
+            token Name
+          end
+        end
+      end
+
+      state :string do
+        rule /"/, Str, :pop!
+        rule /\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape
+        rule /[^\\"\n]+/, Str
+        rule /\\\n/, Str
+        rule /\\/, Str # stray backslash
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/nginx.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/nginx.rb
new file mode 100644
index 0000000..ac361a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/nginx.rb
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Nginx < RegexLexer
+      title "nginx"
+      desc 'configuration files for the nginx web server (nginx.org)'
+      tag 'nginx'
+      mimetypes 'text/x-nginx-conf'
+      filenames 'nginx.conf'
+
+      id = /[^\s$;{}()#]+/
+
+      state :root do
+        rule /(include)(\s+)([^\s;]+)/ do
+          groups Keyword, Text, Name
+        end
+
+        rule id, Keyword, :statement
+
+        mixin :base
+      end
+
+      state :block do
+        rule /}/, Punctuation, :pop!
+        rule id, Keyword::Namespace, :statement
+        mixin :base
+      end
+
+      state :statement do
+        rule /{/ do
+          token Punctuation; pop!; push :block
+        end
+
+        rule /;/, Punctuation, :pop!
+
+        mixin :base
+      end
+
+      state :base do
+        rule /\s+/, Text
+
+        rule /#.*?\n/, Comment::Single
+        rule /(?:on|off)\b/, Name::Constant
+        rule /[$][\w-]+/, Name::Variable
+
+        # host/port
+        rule /([a-z0-9.-]+)(:)([0-9]+)/i do
+          groups Name::Function, Punctuation, Num::Integer
+        end
+
+        # mimetype
+        rule %r([a-z-]+/[a-z-]+)i, Name::Class
+
+        rule /[0-9]+[kmg]?\b/i, Num::Integer
+        rule /(~)(\s*)([^\s{]+)/ do
+          groups Punctuation, Text, Str::Regex
+        end
+
+        rule /[:=~]/, Punctuation
+
+        # pathname
+        rule %r(/#{id}?), Name
+
+        rule /[^#\s;{}$\\]+/, Str # catchall
+
+        rule /[$;]/, Text
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/nim.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/nim.rb
new file mode 100644
index 0000000..8a470df
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/nim.rb
@@ -0,0 +1,152 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Nim < RegexLexer
+      # This is pretty much a 1-1 port of the pygments NimrodLexer class
+      title "Nim"
+      desc "The Nim programming language (http://nim-lang.org/)"
+
+      tag 'nim'
+      aliases 'nimrod'
+      filenames '*.nim'
+
+      KEYWORDS = %w(
+        addr as asm atomic bind block break case cast const continue
+        converter defer discard distinct do elif else end enum except export
+        func finally for from generic if import include interface iterator let
+        macro method mixin nil object of out proc ptr raise ref return static
+        template try tuple type using var when while with without yield
+      )
+
+      OPWORDS = %w(
+        and or not xor shl shr div mod in notin is isnot
+      )
+
+      PSEUDOKEYWORDS = %w(
+        nil true false
+      )
+
+      TYPES = %w(
+       int int8 int16 int32 int64 float float32 float64 bool char range array
+       seq set string
+      )
+
+      NAMESPACE = %w(
+        from import include
+      )
+
+      def self.underscorize(words)
+        words.map do |w|
+          w.gsub(/./) { |x| "#{Regexp.escape(x)}_?" }
+        end.join('|')
+      end
+
+      state :chars do
+        rule(/\\([\\abcefnrtvl"\']|x[a-fA-F0-9]{2}|[0-9]{1,3})/, Str::Escape)
+        rule(/'/, Str::Char, :pop!)
+        rule(/./, Str::Char)
+      end
+
+      state :strings do
+        rule(/(?<!\$)\$(\d+|#|\w+)+/, Str::Interpol)
+        rule(/[^\\\'"\$\n]+/,         Str)
+        rule(/[\'"\\]/,               Str)
+        rule(/\$/,                    Str)
+      end
+
+      state :dqs do
+        rule(/\\([\\abcefnrtvl"\']|\n|x[a-fA-F0-9]{2}|[0-9]{1,3})/,
+             Str::Escape)
+        rule(/"/, Str, :pop!)
+        mixin :strings
+      end
+
+      state :rdqs do
+        rule(/"(?!")/, Str, :pop!)
+        rule(/"/,      Str::Escape, :pop!)
+        mixin :strings
+      end
+
+      state :tdqs do
+        rule(/"""(?!")/, Str, :pop!)
+        mixin :strings
+        mixin :nl
+      end
+
+      state :funcname do
+        rule(/((?![\d_])\w)(((?!_)\w)|(_(?!_)\w))*/, Name::Function, :pop!)
+        rule(/`.+`/,                                 Name::Function, :pop!)
+      end
+
+      state :nl do
+        rule(/\n/, Str)
+      end
+
+      state :floatnumber do
+        rule(/\.(?!\.)[0-9_]*/,       Num::Float)
+        rule(/[eE][+-]?[0-9][0-9_]*/, Num::Float)
+        rule(//,                      Text, :pop!)
+      end
+
+      # Making apostrophes optional, as only hexadecimal with type suffix
+      # possibly ambiguous.
+      state :floatsuffix do
+        rule(/'?[fF](32|64)/,          Num::Float)
+        rule(//,                      Text, :pop!)
+      end
+
+      state :intsuffix do
+        rule(/'?[iI](32|64)/,          Num::Integer::Long)
+        rule(/'?[iI](8|16)/,           Num::Integer)
+        rule(/'?[uU]/,                 Num::Integer)
+        rule(//,                      Text, :pop!)
+      end
+
+      state :root do
+        rule(/##.*$/, Str::Doc)
+        rule(/#.*$/,  Comment)
+        rule(/\*|=|>|<|\+|-|\/|@|\$|~|&|%|\!|\?|\||\\|\[|\]/, Operator)
+        rule(/\.\.|\.|,|\[\.|\.\]|{\.|\.}|\(\.|\.\)|{|}|\(|\)|:|\^|`|;/,
+             Punctuation)
+
+        # Strings
+        rule(/(?:[\w]+)"/,Str, :rdqs)
+        rule(/"""/,       Str, :tdqs)
+        rule(/"/,         Str, :dqs)
+
+        # Char
+        rule(/'/, Str::Char, :chars)
+
+        # Keywords
+        rule(%r[(#{Nim.underscorize(OPWORDS)})\b], Operator::Word)
+        rule(/(p_?r_?o_?c_?\s)(?![\(\[\]])/, Keyword, :funcname)
+        rule(%r[(#{Nim.underscorize(KEYWORDS)})\b],  Keyword)
+        rule(%r[(#{Nim.underscorize(NAMESPACE)})\b], Keyword::Namespace)
+        rule(/(v_?a_?r)\b/, Keyword::Declaration)
+        rule(%r[(#{Nim.underscorize(TYPES)})\b],          Keyword::Type)
+        rule(%r[(#{Nim.underscorize(PSEUDOKEYWORDS)})\b], Keyword::Pseudo)
+        # Identifiers
+        rule(/\b((?![_\d])\w)(((?!_)\w)|(_(?!_)\w))*/, Name)
+
+        # Numbers
+        # Note: Have to do this with a block to push multiple states first,
+        #       since we can't pass array of states like w/ Pygments.
+        rule(/[0-9][0-9_]*(?=([eE.]|'?[fF](32|64)))/) do |number|
+         push :floatsuffix
+         push :floatnumber
+         token Num::Float
+        end
+        rule(/0[xX][a-fA-F0-9][a-fA-F0-9_]*/, Num::Hex,     :intsuffix)
+        rule(/0[bB][01][01_]*/,               Num,          :intsuffix)
+        rule(/0o[0-7][0-7_]*/,                Num::Oct,     :intsuffix)
+        rule(/[0-9][0-9_]*/,                  Num::Integer, :intsuffix)
+
+        # Whitespace
+        rule(/\s+/, Text)
+        rule(/.+$/, Error)
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/objective_c.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/objective_c.rb
new file mode 100644
index 0000000..daa2aac
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/objective_c.rb
@@ -0,0 +1,208 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    load_lexer 'c.rb'
+
+    class ObjectiveC < C
+      tag 'objective_c'
+      title "Objective-C"
+      desc 'an extension of C commonly used to write Apple software'
+      aliases 'objc'
+      filenames '*.m', '*.h'
+
+      mimetypes 'text/x-objective_c', 'application/x-objective_c'
+
+      def self.at_keywords
+        @at_keywords ||= %w(
+          selector private protected public encode synchronized try
+          throw catch finally end property synthesize dynamic optional
+          interface implementation import
+        )
+      end
+
+      def self.at_builtins
+        @at_builtins ||= %w(true false YES NO)
+      end
+
+      def self.builtins
+        @builtins ||= %w(YES NO nil)
+      end
+
+      def self.analyze_text(text)
+        return 1 if text =~ /@(end|implementation|protocol|property)\b/
+
+        id = /[a-z$_][a-z0-9$_]*/i
+        return 0.4 if text =~ %r(
+          \[ \s* #{id} \s+
+          (?:
+            #{id} \s* \]
+            | #{id}? :
+          )
+        )x
+        return 0.4 if text.include? '@"'
+      end
+
+      id = /[a-z$_][a-z0-9$_]*/i
+
+      prepend :statements do
+        rule /@"/, Str, :string
+        rule /@'(\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|\\.|[^\\'\n]')/,
+          Str::Char
+        rule /@(\d+[.]\d*|[.]\d+|\d+)e[+-]?\d+l?/i,
+          Num::Float
+        rule /@(\d+[.]\d*|[.]\d+|\d+f)f?/i, Num::Float
+        rule /@0x\h+[lL]?/, Num::Hex
+        rule /@0[0-7]+l?/i, Num::Oct
+        rule /@\d+l?/, Num::Integer
+        rule /\bin\b/, Keyword
+
+        rule /@(?:interface|implementation)\b/ do
+          token Keyword
+          goto :classname
+        end
+
+        rule /@(?:class|protocol)\b/ do
+          token Keyword
+          goto :forward_classname
+        end
+
+        rule /@([[:alnum:]]+)/ do |m|
+          if self.class.at_keywords.include? m[1]
+            token Keyword
+          elsif self.class.at_builtins.include? m[1]
+            token Name::Builtin
+          else
+            token Error
+          end
+        end
+
+        rule /[?]/, Punctuation, :ternary
+        rule /\[/,  Punctuation, :message
+        rule /@\[/, Punctuation, :array_literal
+        rule /@\{/, Punctuation, :dictionary_literal
+      end
+
+      state :ternary do
+        rule /:/, Punctuation, :pop!
+        mixin :statements
+      end
+
+      state :message_shared do
+        rule /\]/, Punctuation, :pop!
+        rule /\{/, Punctuation, :pop!
+        rule /;/, Error
+
+        mixin :statement
+      end
+
+      state :message do
+        rule /(#{id})(\s*)(:)/ do
+          groups(Name::Function, Text, Punctuation)
+          goto :message_with_args
+        end
+
+        rule /(#{id})(\s*)(\])/ do
+          groups(Name::Function, Text, Punctuation)
+          pop!
+        end
+
+        mixin :message_shared
+      end
+
+      state :message_with_args do
+        rule /\{/, Punctuation, :function
+        rule /(#{id})(\s*)(:)/ do
+          groups(Name::Function, Text, Punctuation)
+          pop!
+        end
+
+        mixin :message_shared
+      end
+
+      state :array_literal do
+        rule /]/, Punctuation, :pop!
+        rule /,/, Punctuation
+        mixin :statements
+      end
+
+      state :dictionary_literal do
+        rule /}/, Punctuation, :pop!
+        rule /,/, Punctuation
+        mixin :statements
+      end
+
+      state :classname do
+        mixin :whitespace
+
+        rule /(#{id})(\s*)(:)(\s*)(#{id})/ do
+          groups(Name::Class, Text,
+                 Punctuation, Text,
+                 Name::Class)
+          pop!
+        end
+
+        rule /(#{id})(\s*)([(])(\s*)(#{id})(\s*)([)])/ do
+          groups(Name::Class, Text,
+                 Punctuation, Text,
+                 Name::Label, Text,
+                 Punctuation)
+          pop!
+        end
+
+        rule id, Name::Class, :pop!
+      end
+
+      state :forward_classname do
+        mixin :whitespace
+
+        rule /(#{id})(\s*)(,)(\s*)/ do
+          groups(Name::Class, Text, Punctuation, Text)
+          push
+        end
+
+        rule /(#{id})(\s*)(;?)/ do
+          groups(Name::Class, Text, Punctuation)
+          pop!
+        end
+      end
+
+      prepend :root do
+        rule %r(
+          ([-+])(\s*)
+          ([(].*?[)])?(\s*)
+          (?=#{id}:?)
+        )ix do |m|
+          token Keyword, m[1]; token Text, m[2]
+          recurse m[3]; token Text, m[4]
+          push :method_definition
+        end
+      end
+
+      state :method_definition do
+        rule /,/, Punctuation
+        rule /[.][.][.]/, Punctuation
+        rule /([(].*?[)])(#{id})/ do |m|
+          recurse m[1]; token Name::Variable, m[2]
+        end
+
+        rule /(#{id})(\s*)(:)/m do
+          groups(Name::Function, Text, Punctuation)
+        end
+
+        rule /;/, Punctuation, :pop!
+
+        rule /{/ do
+          token Punctuation
+          goto :function
+        end
+
+        mixin :inline_whitespace
+        rule %r(//.*?\n), Comment::Single
+        rule /\s+/m, Text
+
+        rule(//) { pop! }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ocaml.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ocaml.rb
new file mode 100644
index 0000000..3ee2c4c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ocaml.rb
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class OCaml < RegexLexer
+      title "OCaml"
+      desc 'Objective CAML (ocaml.org)'
+      tag 'ocaml'
+      filenames '*.ml', '*.mli', '*.mll', '*.mly'
+      mimetypes 'text/x-ocaml'
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          as assert begin class constraint do done downto else end
+          exception external false for fun function functor if in include
+          inherit initializer lazy let match method module mutable new
+          object of open private raise rec sig struct then to true try
+          type value val virtual when while with
+        )
+      end
+
+      def self.keyopts
+        @keyopts ||= Set.new %w(
+          != # & && ( ) * \+ , - -. -> . .. : :: := :> ; ;; < <- =
+          > >] >} ? ?? [ [< [> [| ] _ ` { {< | |] } ~
+        )
+      end
+
+      def self.word_operators
+        @word_operators ||= Set.new %w(and asr land lor lsl lxor mod or)
+      end
+
+      def self.primitives
+        @primitives ||= Set.new %w(unit int float bool string char list array)
+      end
+
+      operator = %r([\[\];,{}_()!$%&*+./:<=>?@^|~#-]+)
+      id = /[a-z][\w']*/i
+      upper_id = /[A-Z][\w']*/
+
+      state :root do
+        rule /\s+/m, Text
+        rule /false|true|[(][)]|\[\]/, Name::Builtin::Pseudo
+        rule /#{upper_id}(?=\s*[.])/, Name::Namespace, :dotted
+        rule upper_id, Name::Class
+        rule /[(][*](?![)])/, Comment, :comment
+        rule id do |m|
+          match = m[0]
+          if self.class.keywords.include? match
+            token Keyword
+          elsif self.class.word_operators.include? match
+            token Operator::Word
+          elsif self.class.primitives.include? match
+            token Keyword::Type
+          else
+            token Name
+          end
+        end
+
+        rule operator do |m|
+          match = m[0]
+          if self.class.keyopts.include? match
+            token Punctuation
+          else
+            token Operator
+          end
+        end
+
+        rule /-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float
+        rule /0x\h[\h_]*/i, Num::Hex
+        rule /0o[0-7][0-7_]*/i, Num::Oct
+        rule /0b[01][01_]*/i, Num::Bin
+        rule /\d[\d_]*/, Num::Integer
+
+        rule /'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char
+        rule /'[.]'/, Str::Char
+        rule /'/, Keyword
+        rule /"/, Str::Double, :string
+        rule /[~?]#{id}/, Name::Variable
+      end
+
+      state :comment do
+        rule /[^(*)]+/, Comment
+        rule(/[(][*]/) { token Comment; push }
+        rule /[*][)]/, Comment, :pop!
+        rule /[(*)]/, Comment
+      end
+
+      state :string do
+        rule /[^\\"]+/, Str::Double
+        mixin :escape_sequence
+        rule /\\\n/, Str::Double
+        rule /"/, Str::Double, :pop!
+      end
+
+      state :escape_sequence do
+        rule /\\[\\"'ntbr]/, Str::Escape
+        rule /\\\d{3}/, Str::Escape
+        rule /\\x\h{2}/, Str::Escape
+      end
+
+      state :dotted do
+        rule /\s+/m, Text
+        rule /[.]/, Punctuation
+        rule /#{upper_id}(?=\s*[.])/, Name::Namespace
+        rule upper_id, Name::Class, :pop!
+        rule id, Name, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/pascal.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/pascal.rb
new file mode 100644
index 0000000..98f06cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/pascal.rb
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Pascal < RegexLexer
+      tag 'pascal'
+      title "Pascal"
+      desc 'a procedural programming language commonly used as a teaching language.'
+      filenames '*.pas'
+
+      mimetypes 'text/x-pascal'
+
+      id = /@?[_a-z]\w*/i
+
+      keywords = %w(
+        absolute abstract all and and_then array as asm assembler attribute
+        begin bindable case class const constructor delay destructor div do
+        downto else end except exit export exports external far file finalization
+        finally for forward function goto if implementation import in inc index
+        inherited initialization inline interface interrupt is label library
+        message mod module near nil not object of on only operator or or_else
+        otherwise out overload override packed pascal pow private procedure program
+        property protected public published qualified raise read record register
+        repeat resident resourcestring restricted safecall segment set shl shr
+        stdcall stored string then threadvar to try type unit until uses value var
+        view virtual while with write writeln xor
+      )
+
+      keywords_type = %w(
+        ansichar ansistring bool boolean byte bytebool cardinal char comp currency
+        double dword extended int64 integer iunknown longbool longint longword pansichar
+        pansistring pbool pboolean pbyte pbytearray pcardinal pchar pcomp pcurrency
+        pdate pdatetime pdouble pdword pextended phandle pint64 pinteger plongint plongword
+        pointer ppointer pshortint pshortstring psingle psmallint pstring pvariant pwidechar
+        pwidestring pword pwordarray pwordbool real real48 shortint shortstring single
+        smallint string tclass tdate tdatetime textfile thandle tobject ttime variant
+        widechar widestring word wordbool
+      )
+
+      state :whitespace do
+        # Spaces
+        rule /\s+/m, Text
+        # // Comments
+        rule %r((//).*$\n?), Comment::Single
+        # -- Comments
+        rule %r((--).*$\n?), Comment::Single
+        # (* Comments *)
+        rule %r(\(\*.*?\*\))m, Comment::Multiline
+        # { Comments }
+        rule %r(\{.*?\})m, Comment::Multiline
+      end
+
+      state :root do
+        mixin :whitespace
+
+        rule %r{((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?}, Num
+        rule %r{[~!@#\$%\^&\*\(\)\+`\-={}\[\]:;<>\?,\.\/\|\\]}, Punctuation
+        rule %r{'([^']|'')*'}, Str
+        rule /(true|false|nil)\b/i, Name::Builtin
+        rule /\b(#{keywords.join('|')})\b/i, Keyword
+        rule /\b(#{keywords_type.join('|')})\b/i, Keyword::Type
+        rule id, Name
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/perl.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/perl.rb
new file mode 100644
index 0000000..2eb28fb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/perl.rb
@@ -0,0 +1,197 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Perl < RegexLexer
+      title "Perl"
+      desc "The Perl scripting language (perl.org)"
+
+      tag 'perl'
+      aliases 'pl'
+
+      filenames '*.pl', '*.pm'
+      mimetypes 'text/x-perl', 'application/x-perl'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'perl'
+        return 0.4 if text.include? 'my $'
+      end
+
+      keywords = %w(
+        case continue do else elsif for foreach if last my next our
+        redo reset then unless until while use print new BEGIN CHECK
+        INIT END return
+      )
+
+      builtins = %w(
+        abs accept alarm atan2 bind binmode bless caller chdir chmod
+        chomp chop chown chr chroot close closedir connect continue cos
+        crypt dbmclose dbmopen defined delete die dump each endgrent
+        endhostent endnetent endprotoent endpwent endservent eof eval
+        exec exists exit exp fcntl fileno flock fork format formline getc
+        getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent
+        getlogin getnetbyaddr getnetbyname getnetent getpeername
+        getpgrp getppid getpriority getprotobyname getprotobynumber
+        getprotoent getpwent getpwnam getpwuid getservbyname getservbyport
+        getservent getsockname getsockopt glob gmtime goto grep hex
+        import index int ioctl join keys kill last lc lcfirst length
+        link listen local localtime log lstat map mkdir msgctl msgget
+        msgrcv msgsnd my next no oct open opendir ord our pack package
+        pipe pop pos printf prototype push quotemeta rand read readdir
+        readline readlink readpipe recv redo ref rename require reverse
+        rewinddir rindex rmdir scalar seek seekdir select semctl semget
+        semop send setgrent sethostent setnetent setpgrp setpriority
+        setprotoent setpwent setservent setsockopt shift shmctl shmget
+        shmread shmwrite shutdown sin sleep socket socketpair sort splice
+        split sprintf sqrt srand stat study substr symlink syscall sysopen
+        sysread sysseek system syswrite tell telldir tie tied time times
+        tr truncate uc ucfirst umask undef unlink unpack unshift untie
+        utime values vec wait waitpid wantarray warn write
+      )
+
+      re_tok = Str::Regex
+
+      state :balanced_regex do
+        rule %r(/(\\\\|\\/|[^/])*/[egimosx]*)m, re_tok, :pop!
+        rule %r(!(\\\\|\\!|[^!])*![egimosx]*)m, re_tok, :pop!
+        rule %r(\\(\\\\|[^\\])*\\[egimosx]*)m, re_tok, :pop!
+        rule %r({(\\\\|\\}|[^}])*}[egimosx]*), re_tok, :pop!
+        rule %r(<(\\\\|\\>|[^>])*>[egimosx]*), re_tok, :pop!
+        rule %r(\[(\\\\|\\\]|[^\]])*\][egimosx]*), re_tok, :pop!
+        rule %r[\((\\\\|\\\)|[^\)])*\)[egimosx]*], re_tok, :pop!
+        rule %r(@(\\\\|\\\@|[^\@])*@[egimosx]*), re_tok, :pop!
+        rule %r(%(\\\\|\\\%|[^\%])*%[egimosx]*), re_tok, :pop!
+        rule %r(\$(\\\\|\\\$|[^\$])*\$[egimosx]*), re_tok, :pop!
+      end
+
+      state :root do
+        rule /#.*?$/, Comment::Single
+        rule /^=[a-zA-Z0-9]+\s+.*?\n=cut/, Comment::Multiline
+        rule /(?:#{keywords.join('|')})\b/, Keyword
+
+        rule /(format)(\s+)([a-zA-Z0-9_]+)(\s*)(=)(\s*\n)/ do
+          groups Keyword, Text, Name, Text, Punctuation, Text
+
+          push :format
+        end
+
+        rule /(?:eq|lt|gt|le|ge|ne|not|and|or|cmp)\b/, Operator::Word
+
+        # common delimiters
+        rule %r(s/(\\\\|\\/|[^/])*/(\\\\|\\/|[^/])*/[egimosx]*), re_tok
+        rule %r(s!(\\\\|\\!|[^!])*!(\\\\|\\!|[^!])*![egimosx]*), re_tok
+        rule %r(s\\(\\\\|[^\\])*\\(\\\\|[^\\])*\\[egimosx]*), re_tok
+        rule %r(s@(\\\\|\\@|[^@])*@(\\\\|\\@|[^@])*@[egimosx]*), re_tok
+        rule %r(s%(\\\\|\\%|[^%])*%(\\\\|\\%|[^%])*%[egimosx]*), re_tok
+
+        # balanced delimiters
+        rule %r(s{(\\\\|\\}|[^}])*}\s*), re_tok, :balanced_regex
+        rule %r(s<(\\\\|\\>|[^>])*>\s*), re_tok, :balanced_regex
+        rule %r(s\[(\\\\|\\\]|[^\]])*\]\s*), re_tok, :balanced_regex
+        rule %r[s\((\\\\|\\\)|[^\)])*\)\s*], re_tok, :balanced_regex
+
+        rule %r(m?/(\\\\|\\/|[^/\n])*/[gcimosx]*), re_tok
+        rule %r(m(?=[/!\\{<\[\(@%\$])), re_tok, :balanced_regex
+        rule %r(((?<==~)|(?<=\())\s*/(\\\\|\\/|[^/])*/[gcimosx]*),
+          re_tok, :balanced_regex
+
+        rule /\s+/, Text
+        rule /(?:#{builtins.join('|')})\b/, Name::Builtin
+        rule /((__(DATA|DIE|WARN)__)|(STD(IN|OUT|ERR)))\b/,
+          Name::Builtin::Pseudo
+
+        rule /<<([\'"]?)([a-zA-Z_][a-zA-Z0-9_]*)\1;?\n.*?\n\2\n/m, Str
+
+        rule /__END__\b/, Comment::Preproc, :end_part
+        rule /\$\^[ADEFHILMOPSTWX]/, Name::Variable::Global
+        rule /\$[\\"'\[\]&`+*.,;=%~?@$!<>(^\|\/-](?!\w)/, Name::Variable::Global
+        rule /[$@%#]+/, Name::Variable, :varname
+
+        rule /0_?[0-7]+(_[0-7]+)*/, Num::Oct
+        rule /0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*/, Num::Hex
+        rule /0b[01]+(_[01]+)*/, Num::Bin
+        rule /(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?/i,
+          Num::Float
+        rule /\d+(_\d*)*e[+-]?\d+(_\d*)*/i, Num::Float
+        rule /\d+(_\d+)*/, Num::Integer
+
+        rule /'(\\\\|\\'|[^'])*'/, Str
+        rule /"(\\\\|\\"|[^"])*"/, Str
+        rule /`(\\\\|\\`|[^`])*`/, Str::Backtick
+        rule /<([^\s>]+)>/, re_tok
+        rule /(q|qq|qw|qr|qx)\{/, Str::Other, :cb_string
+        rule /(q|qq|qw|qr|qx)\(/, Str::Other, :rb_string
+        rule /(q|qq|qw|qr|qx)\[/, Str::Other, :sb_string
+        rule /(q|qq|qw|qr|qx)</, Str::Other, :lt_string
+        rule /(q|qq|qw|qr|qx)([^a-zA-Z0-9])(.|\n)*?\2/, Str::Other
+
+        rule /package\s+/, Keyword, :modulename
+        rule /sub\s+/, Keyword, :funcname
+        rule /\[\]|\*\*|::|<<|>>|>=|<=|<=>|={3}|!=|=~|!~|&&?|\|\||\.{1,3}/,
+          Operator
+        rule /[-+\/*%=<>&^\|!\\~]=?/, Operator
+        rule /[()\[\]:;,<>\/?{}]/, Punctuation
+        rule(/(?=\w)/) { push :name }
+      end
+
+      state :format do
+        rule /\.\n/, Str::Interpol, :pop!
+        rule /.*?\n/, Str::Interpol
+      end
+
+      state :name_common do
+        rule /\w+::/, Name::Namespace
+        rule /[\w:]+/, Name::Variable, :pop!
+      end
+
+      state :varname do
+        rule /\s+/, Text
+        rule /\{/, Punctuation, :pop! # hash syntax
+        rule /\)|,/, Punctuation, :pop! # arg specifier
+        mixin :name_common
+      end
+
+      state :name do
+        mixin :name_common
+        rule /[A-Z_]+(?=[^a-zA-Z0-9_])/, Name::Constant, :pop!
+        rule(/(?=\W)/) { pop! }
+      end
+
+      state :modulename do
+        rule /[a-z_]\w*/i, Name::Namespace, :pop!
+      end
+
+      state :funcname do
+        rule /[a-zA-Z_]\w*[!?]?/, Name::Function
+        rule /\s+/, Text
+
+        # argument declaration
+        rule /(\([$@%]*\))(\s*)/ do
+          groups Punctuation, Text
+        end
+
+        rule /.*?{/, Punctuation, :pop!
+        rule /;/, Punctuation, :pop!
+      end
+
+      [[:cb, '\{', '\}'],
+       [:rb, '\(', '\)'],
+       [:sb, '\[', '\]'],
+       [:lt, '<',  '>']].each do |name, open, close|
+        tok = Str::Other
+        state :"#{name}_string" do
+          rule /\\[#{open}#{close}\\]/, tok
+          rule /\\/, tok
+          rule(/#{open}/) { token tok; push }
+          rule /#{close}/, tok, :pop!
+          rule /[^#{open}#{close}\\]+/, tok
+        end
+      end
+
+      state :end_part do
+        # eat the rest of the stream
+        rule /.+/m, Comment::Preproc, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/php.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/php.rb
new file mode 100644
index 0000000..934a08c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/php.rb
@@ -0,0 +1,173 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class PHP < TemplateLexer
+      title "PHP"
+      desc "The PHP scripting language (php.net)"
+      tag 'php'
+      aliases 'php', 'php3', 'php4', 'php5'
+      filenames '*.php', '*.php[345t]','*.phtml',
+                # Support Drupal file extensions, see:
+                # https://github.com/gitlabhq/gitlabhq/issues/8900
+                '*.module', '*.inc', '*.profile', '*.install', '*.test'
+      mimetypes 'text/x-php'
+
+      default_options :parent => 'html'
+
+      def initialize(opts={})
+        # if truthy, the lexer starts highlighting with php code
+        # (no <?php required)
+        @start_inline = opts.delete(:start_inline)
+        @funcnamehighlighting = opts.delete(:funcnamehighlighting) { true }
+        @disabledmodules = opts.delete(:disabledmodules) { [] }
+
+        super(opts)
+      end
+
+      def self.builtins
+        load Pathname.new(__FILE__).dirname.join('php/builtins.rb')
+        self.builtins
+      end
+
+      def builtins
+        return [] unless @funcnamehighlighting
+
+        @builtins ||= Set.new.tap do |builtins|
+          self.class.builtins.each do |mod, fns|
+            next if @disabledmodules.include? mod
+            builtins.merge(fns)
+          end
+        end
+      end
+
+      def start_inline?
+        !!@start_inline
+      end
+
+      start do
+        push :php if start_inline?
+      end
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          and E_PARSE old_function E_ERROR or as E_WARNING parent eval
+          PHP_OS break exit case extends PHP_VERSION cfunction FALSE
+          print for require continue foreach require_once declare return
+          default static do switch die stdClass echo else TRUE elseif
+          var empty if xor enddeclare include virtual endfor include_once
+          while endforeach global __FILE__ endif list __LINE__ endswitch
+          new __sleep endwhile not array __wakeup E_ALL NULL final
+          php_user_filter interface implements public private protected
+          abstract clone try catch throw this use namespace yield
+        )
+      end
+
+      def self.analyze_text(text)
+        return 1 if text.shebang?('php')
+        return 0.3 if /<\?(?!xml)/ =~ text
+        0
+      end
+
+      state :root do
+        rule /<\?(php|=)?/, Comment::Preproc, :php
+        rule(/.*?(?=<\?)|.*/m) { delegate parent }
+      end
+
+      state :php do
+        rule /\?>/, Comment::Preproc, :pop!
+        # heredocs
+        rule /<<<('?)([a-z_]\w*)\1\n.*?\n\2;?\n/im, Str::Heredoc
+        rule /\s+/, Text
+        rule /#.*?\n/, Comment::Single
+        rule %r(//.*?\n), Comment::Single
+        # empty comment, otherwise seen as the start of a docstring
+        rule %r(/\*\*/), Comment::Multiline
+        rule %r(/\*\*.*?\*/)m, Str::Doc
+        rule %r(/\*.*?\*/)m, Comment::Multiline
+        rule /(->|::)(\s*)([a-zA-Z_][a-zA-Z0-9_]*)/ do
+          groups Operator, Text, Name::Attribute
+        end
+
+        rule /[~!%^&*+=\|:.<>\/?@-]+/, Operator
+        rule /[\[\]{}();,]+/, Punctuation
+        rule /class\b/, Keyword, :classname
+        # anonymous functions
+        rule /(function)(\s*)(?=\()/ do
+          groups Keyword, Text
+        end
+
+        # named functions
+        rule /(function)(\s+)(&?)(\s*)/ do
+          groups Keyword, Text, Operator, Text
+          push :funcname
+        end
+
+        rule /(const)(\s+)([a-zA-Z_]\w*)/i do
+          groups Keyword, Text, Name::Constant
+        end
+
+        rule /(true|false|null)\b/, Keyword::Constant
+        rule /\$\{\$+[a-z_]\w*\}/i, Name::Variable
+        rule /\$+[a-z_]\w*/i, Name::Variable
+
+        # may be intercepted for builtin highlighting
+        rule /[\\a-z_][\\\w]*/i do |m|
+          name = m[0]
+
+          if self.class.keywords.include? name
+            token Keyword
+          elsif self.builtins.include? name
+            token Name::Builtin
+          else
+            token Name::Other
+          end
+        end
+
+        rule /(\d+\.\d*|\d*\.\d+)(e[+-]?\d+)?/i, Num::Float
+        rule /\d+e[+-]?\d+/i, Num::Float
+        rule /0[0-7]+/, Num::Oct
+        rule /0x[a-f0-9]+/i, Num::Hex
+        rule /\d+/, Num::Integer
+        rule /'([^'\\]*(?:\\.[^'\\]*)*)'/, Str::Single
+        rule /`([^`\\]*(?:\\.[^`\\]*)*)`/, Str::Backtick
+        rule /"/, Str::Double, :string
+      end
+
+      state :classname do
+        rule /\s+/, Text
+        rule /[a-z_][\\\w]*/i, Name::Class, :pop!
+      end
+
+      state :funcname do
+        rule /[a-z_]\w*/i, Name::Function, :pop!
+      end
+
+      state :string do
+        rule /"/, Str::Double, :pop!
+        rule /[^\\{$"]+/, Str::Double
+        rule /\\([nrt\"$\\]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})/,
+          Str::Escape
+        rule /\$[a-zA-Z_][a-zA-Z0-9_]*(\[\S+\]|->[a-zA-Z_][a-zA-Z0-9_]*)?/, Name::Variable
+
+        rule /\{\$\{/, Str::Interpol, :interp_double
+        rule /\{(?=\$)/, Str::Interpol, :interp_single
+        rule /(\{)(\S+)(\})/ do
+          groups Str::Interpol, Name::Variable, Str::Interpol
+        end
+
+        rule /[${\\]+/, Str::Double
+      end
+
+      state :interp_double do
+        rule /\}\}/, Str::Interpol, :pop!
+        mixin :php
+      end
+
+      state :interp_single do
+        rule /\}/, Str::Interpol, :pop!
+        mixin :php
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/php/builtins.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/php/builtins.rb
new file mode 100644
index 0000000..9939ee6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/php/builtins.rb
@@ -0,0 +1,204 @@
+# -*- coding: utf-8 -*- #
+# automatically generated by `rake builtins:php`
+module Rouge
+  module Lexers
+    class PHP
+      def self.builtins
+        @builtins ||= {}.tap do |b|
+          b["Apache"] = Set.new %w(apache_child_terminate apache_child_terminate apache_get_modules apache_get_version apache_getenv apache_lookup_uri apache_note apache_request_headers apache_reset_timeout apache_response_headers apache_setenv getallheaders virtual apache_child_terminate)
+          b["APC"] = Set.new %w(apc_add apc_add apc_bin_dump apc_bin_dumpfile apc_bin_load apc_bin_loadfile apc_cache_info apc_cas apc_clear_cache apc_compile_file apc_dec apc_define_constants apc_delete_file apc_delete apc_exists apc_fetch apc_inc apc_load_constants apc_sma_info apc_store apc_add)
+          b["APD"] = Set.new %w(apd_breakpoint apd_breakpoint apd_callstack apd_clunk apd_continue apd_croak apd_dump_function_table apd_dump_persistent_resources apd_dump_regular_resources apd_echo apd_get_active_symbols apd_set_pprof_trace apd_set_session_trace_socket apd_set_session_trace apd_set_session override_function rename_function apd_breakpoint)
+          b["Array"] = Set.new %w(array_change_key_case array_change_key_case array_chunk array_column array_combine array_count_values array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_diff array_fill_keys array_fill array_filter array_flip array_intersect_assoc array_intersect_key array_intersect_uassoc array_intersect_ukey array_intersect array_key_exists array_keys array_map array_merge_recursive array_merge array_multisort array_pad array_pop array_product array_push array_rand array_reduce array_replace_recursive array_replace array_reverse array_search array_shift array_slice array_splice array_sum array_udiff_assoc array_udiff_uassoc array_udiff array_uintersect_assoc array_uintersect_uassoc array_uintersect array_unique array_unshift array_values array_walk_recursive array_walk array arsort asort compact count current each end extract in_array key_exists key krsort ksort list natcasesort natsort next pos prev range reset rsort shuffle sizeof sort uasort uksort usort array_change_key_case)
+          b["BBCode"] = Set.new %w(bbcode_add_element bbcode_add_element bbcode_add_smiley bbcode_create bbcode_destroy bbcode_parse bbcode_set_arg_parser bbcode_set_flags bbcode_add_element)
+          b["BC Math"] = Set.new %w(bcadd bcadd bccomp bcdiv bcmod bcmul bcpow bcpowmod bcscale bcsqrt bcsub bcadd)
+          b["bcompiler"] = Set.new %w(bcompiler_load_exe bcompiler_load_exe bcompiler_load bcompiler_parse_class bcompiler_read bcompiler_write_class bcompiler_write_constant bcompiler_write_exe_footer bcompiler_write_file bcompiler_write_footer bcompiler_write_function bcompiler_write_functions_from_file bcompiler_write_header bcompiler_write_included_filename bcompiler_load_exe)
+          b["Blenc"] = Set.new %w(blenc_encrypt blenc_encrypt blenc_encrypt)
+          b["Bzip2"] = Set.new %w(bzclose bzclose bzcompress bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite bzclose)
+          b["Cairo"] = Set.new %w(cairo_create cairo_create cairo_font_face_get_type cairo_font_face_status cairo_font_options_create cairo_font_options_equal cairo_font_options_get_antialias cairo_font_options_get_hint_metrics cairo_font_options_get_hint_style cairo_font_options_get_subpixel_order cairo_font_options_hash cairo_font_options_merge cairo_font_options_set_antialias cairo_font_options_set_hint_metrics cairo_font_options_set_hint_style cairo_font_options_set_subpixel_order cairo_font_options_status cairo_format_stride_for_width cairo_image_surface_create_for_data cairo_image_surface_create_from_png cairo_image_surface_create cairo_image_surface_get_data cairo_image_surface_get_format cairo_image_surface_get_height cairo_image_surface_get_stride cairo_image_surface_get_width cairo_matrix_create_scale cairo_matrix_create_translate cairo_matrix_invert cairo_matrix_multiply cairo_matrix_rotate cairo_matrix_transform_distance cairo_matrix_transform_point cairo_matrix_translate cairo_pattern_add_color_stop_rgb cairo_pattern_add_color_stop_rgba cairo_pattern_create_for_surface cairo_pattern_create_linear cairo_pattern_create_radial cairo_pattern_create_rgb cairo_pattern_create_rgba cairo_pattern_get_color_stop_count cairo_pattern_get_color_stop_rgba cairo_pattern_get_extend cairo_pattern_get_filter cairo_pattern_get_linear_points cairo_pattern_get_matrix cairo_pattern_get_radial_circles cairo_pattern_get_rgba cairo_pattern_get_surface cairo_pattern_get_type cairo_pattern_set_extend cairo_pattern_set_filter cairo_pattern_set_matrix cairo_pattern_status cairo_pdf_surface_create cairo_pdf_surface_set_size cairo_ps_get_levels cairo_ps_level_to_string cairo_ps_surface_create cairo_ps_surface_dsc_begin_page_setup cairo_ps_surface_dsc_begin_setup cairo_ps_surface_dsc_comment cairo_ps_surface_get_eps cairo_ps_surface_restrict_to_level cairo_ps_surface_set_eps cairo_ps_surface_set_size cairo_scaled_font_create cairo_scaled_font_extents cairo_scaled_font_get_ctm cairo_scaled_font_get_font_face cairo_scaled_font_get_font_matrix cairo_scaled_font_get_font_options cairo_scaled_font_get_scale_matrix cairo_scaled_font_get_type cairo_scaled_font_glyph_extents cairo_scaled_font_status cairo_scaled_font_text_extents cairo_surface_copy_page cairo_surface_create_similar cairo_surface_finish cairo_surface_flush cairo_surface_get_content cairo_surface_get_device_offset cairo_surface_get_font_options cairo_surface_get_type cairo_surface_mark_dirty_rectangle cairo_surface_mark_dirty cairo_surface_set_device_offset cairo_surface_set_fallback_resolution cairo_surface_show_page cairo_surface_status cairo_surface_write_to_png cairo_svg_surface_create cairo_svg_surface_restrict_to_version cairo_svg_version_to_string cairo_create)
+          b["Calendar"] = Set.new %w(cal_days_in_month cal_days_in_month cal_from_jd cal_info cal_to_jd easter_date easter_days FrenchToJD GregorianToJD JDDayOfWeek JDMonthName JDToFrench JDToGregorian jdtojewish JDToJulian jdtounix JewishToJD JulianToJD unixtojd cal_days_in_month)
+          b["chdb"] = Set.new %w(chdb_create chdb_create chdb_create)
+          b["Classkit"] = Set.new %w(classkit_import classkit_import classkit_method_add classkit_method_copy classkit_method_redefine classkit_method_remove classkit_method_rename classkit_import)
+          b["Classes/Object"] = Set.new %w(__autoload __autoload call_user_method_array call_user_method class_alias class_exists get_called_class get_class_methods get_class_vars get_class get_declared_classes get_declared_interfaces get_declared_traits get_object_vars get_parent_class interface_exists is_a is_subclass_of method_exists property_exists trait_exists __autoload)
+          b["COM"] = Set.new %w(com_addref com_addref com_create_guid com_event_sink com_get_active_object com_get com_invoke com_isenum com_load_typelib com_load com_message_pump com_print_typeinfo com_propget com_propput com_propset com_release com_set variant_abs variant_add variant_and variant_cast variant_cat variant_cmp variant_date_from_timestamp variant_date_to_timestamp variant_div variant_eqv variant_fix variant_get_type variant_idiv variant_imp variant_int variant_mod variant_mul variant_neg variant_not variant_or variant_pow variant_round variant_set_type variant_set variant_sub variant_xor com_addref)
+          b["Crack"] = Set.new %w(crack_check crack_check crack_closedict crack_getlastmessage crack_opendict crack_check)
+          b["Ctype"] = Set.new %w(ctype_alnum ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_graph ctype_lower ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit ctype_alnum)
+          b["CUBRID"] = Set.new %w(cubrid_bind cubrid_bind cubrid_close_prepare cubrid_close_request cubrid_col_get cubrid_col_size cubrid_column_names cubrid_column_types cubrid_commit cubrid_connect_with_url cubrid_connect cubrid_current_oid cubrid_disconnect cubrid_drop cubrid_error_code_facility cubrid_error_code cubrid_error_msg cubrid_execute cubrid_fetch cubrid_free_result cubrid_get_autocommit cubrid_get_charset cubrid_get_class_name cubrid_get_client_info cubrid_get_db_parameter cubrid_get_query_timeout cubrid_get_server_info cubrid_get cubrid_insert_id cubrid_is_instance cubrid_lob_close cubrid_lob_export cubrid_lob_get cubrid_lob_send cubrid_lob_size cubrid_lob2_bind cubrid_lob2_close cubrid_lob2_export cubrid_lob2_import cubrid_lob2_new cubrid_lob2_read cubrid_lob2_seek64 cubrid_lob2_seek cubrid_lob2_size64 cubrid_lob2_size cubrid_lob2_tell64 cubrid_lob2_tell cubrid_lob2_write cubrid_lock_read cubrid_lock_write cubrid_move_cursor cubrid_next_result cubrid_num_cols cubrid_num_rows cubrid_pconnect_with_url cubrid_pconnect cubrid_prepare cubrid_put cubrid_rollback cubrid_schema cubrid_seq_drop cubrid_seq_insert cubrid_seq_put cubrid_set_add cubrid_set_autocommit cubrid_set_db_parameter cubrid_set_drop cubrid_set_query_timeout cubrid_version cubrid_bind)
+          b["cURL"] = Set.new %w(curl_close curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version curl_close)
+          b["Cyrus"] = Set.new %w(cyrus_authenticate cyrus_authenticate cyrus_bind cyrus_close cyrus_connect cyrus_query cyrus_unbind cyrus_authenticate)
+          b["Date/Time"] = Set.new %w(checkdate checkdate date_add date_create_from_format date_create_immutable_from_format date_create_immutable date_create date_date_set date_default_timezone_get date_default_timezone_set date_diff date_format date_get_last_errors date_interval_create_from_date_string date_interval_format date_isodate_set date_modify date_offset_get date_parse_from_format date_parse date_sub date_sun_info date_sunrise date_sunset date_time_set date_timestamp_get date_timestamp_set date_timezone_get date_timezone_set date getdate gettimeofday gmdate gmmktime gmstrftime idate localtime microtime mktime strftime strptime strtotime time timezone_abbreviations_list timezone_identifiers_list timezone_location_get timezone_name_from_abbr timezone_name_get timezone_offset_get timezone_open timezone_transitions_get timezone_version_get checkdate)
+          b["DBA"] = Set.new %w(dba_close dba_close dba_delete dba_exists dba_fetch dba_firstkey dba_handlers dba_insert dba_key_split dba_list dba_nextkey dba_open dba_optimize dba_popen dba_replace dba_sync dba_close)
+          b["dBase"] = Set.new %w(dbase_add_record dbase_add_record dbase_close dbase_create dbase_delete_record dbase_get_header_info dbase_get_record_with_names dbase_get_record dbase_numfields dbase_numrecords dbase_open dbase_pack dbase_replace_record dbase_add_record)
+          b["DB++"] = Set.new %w(dbplus_add dbplus_add dbplus_aql dbplus_chdir dbplus_close dbplus_curr dbplus_errcode dbplus_errno dbplus_find dbplus_first dbplus_flush dbplus_freealllocks dbplus_freelock dbplus_freerlocks dbplus_getlock dbplus_getunique dbplus_info dbplus_last dbplus_lockrel dbplus_next dbplus_open dbplus_prev dbplus_rchperm dbplus_rcreate dbplus_rcrtexact dbplus_rcrtlike dbplus_resolve dbplus_restorepos dbplus_rkeys dbplus_ropen dbplus_rquery dbplus_rrename dbplus_rsecindex dbplus_runlink dbplus_rzap dbplus_savepos dbplus_setindex dbplus_setindexbynumber dbplus_sql dbplus_tcl dbplus_tremove dbplus_undo dbplus_undoprepare dbplus_unlockrel dbplus_unselect dbplus_update dbplus_xlockrel dbplus_xunlockrel dbplus_add)
+          b["dbx"] = Set.new %w(dbx_close dbx_close dbx_compare dbx_connect dbx_error dbx_escape_string dbx_fetch_row dbx_query dbx_sort dbx_close)
+          b["Direct IO"] = Set.new %w(dio_close dio_close dio_fcntl dio_open dio_read dio_seek dio_stat dio_tcsetattr dio_truncate dio_write dio_close)
+          b["Directory"] = Set.new %w(chdir chdir chroot closedir dir getcwd opendir readdir rewinddir scandir chdir)
+          b["DOM"] = Set.new %w(dom_import_simplexml dom_import_simplexml dom_import_simplexml)
+          b[".NET"] = Set.new %w(dotnet_load dotnet_load dotnet_load)
+          b["Eio"] = Set.new %w(eio_busy eio_busy eio_cancel eio_chmod eio_chown eio_close eio_custom eio_dup2 eio_event_loop eio_fallocate eio_fchmod eio_fchown eio_fdatasync eio_fstat eio_fstatvfs eio_fsync eio_ftruncate eio_futime eio_get_event_stream eio_get_last_error eio_grp_add eio_grp_cancel eio_grp_limit eio_grp eio_init eio_link eio_lstat eio_mkdir eio_mknod eio_nop eio_npending eio_nready eio_nreqs eio_nthreads eio_open eio_poll eio_read eio_readahead eio_readdir eio_readlink eio_realpath eio_rename eio_rmdir eio_seek eio_sendfile eio_set_max_idle eio_set_max_parallel eio_set_max_poll_reqs eio_set_max_poll_time eio_set_min_parallel eio_stat eio_statvfs eio_symlink eio_sync_file_range eio_sync eio_syncfs eio_truncate eio_unlink eio_utime eio_write eio_busy)
+          b["Enchant"] = Set.new %w(enchant_broker_describe enchant_broker_describe enchant_broker_dict_exists enchant_broker_free_dict enchant_broker_free enchant_broker_get_error enchant_broker_init enchant_broker_list_dicts enchant_broker_request_dict enchant_broker_request_pwl_dict enchant_broker_set_ordering enchant_dict_add_to_personal enchant_dict_add_to_session enchant_dict_check enchant_dict_describe enchant_dict_get_error enchant_dict_is_in_session enchant_dict_quick_check enchant_dict_store_replacement enchant_dict_suggest enchant_broker_describe)
+          b["Error Handling"] = Set.new %w(debug_backtrace debug_backtrace debug_print_backtrace error_get_last error_log error_reporting restore_error_handler restore_exception_handler set_error_handler set_exception_handler trigger_error user_error debug_backtrace)
+          b["Program execution"] = Set.new %w(escapeshellarg escapeshellarg escapeshellcmd exec passthru proc_close proc_get_status proc_nice proc_open proc_terminate shell_exec system escapeshellarg)
+          b["Exif"] = Set.new %w(exif_imagetype exif_imagetype exif_read_data exif_tagname exif_thumbnail read_exif_data exif_imagetype)
+          b["Expect"] = Set.new %w(expect_expectl expect_expectl expect_popen expect_expectl)
+          b["FAM"] = Set.new %w(fam_cancel_monitor fam_cancel_monitor fam_close fam_monitor_collection fam_monitor_directory fam_monitor_file fam_next_event fam_open fam_pending fam_resume_monitor fam_suspend_monitor fam_cancel_monitor)
+          b["Fann"] = Set.new %w(fann_cascadetrain_on_data fann_cascadetrain_on_data fann_cascadetrain_on_file fann_clear_scaling_params fann_copy fann_create_from_file fann_create_shortcut_array fann_create_shortcut fann_create_sparse_array fann_create_sparse fann_create_standard_array fann_create_standard fann_create_train_from_callback fann_create_train fann_descale_input fann_descale_output fann_descale_train fann_destroy_train fann_destroy fann_duplicate_train_data fann_get_activation_function fann_get_activation_steepness fann_get_bias_array fann_get_bit_fail_limit fann_get_bit_fail fann_get_cascade_activation_functions_count fann_get_cascade_activation_functions fann_get_cascade_activation_steepnesses_count fann_get_cascade_activation_steepnesses fann_get_cascade_candidate_change_fraction fann_get_cascade_candidate_limit fann_get_cascade_candidate_stagnation_epochs fann_get_cascade_max_cand_epochs fann_get_cascade_max_out_epochs fann_get_cascade_min_cand_epochs fann_get_cascade_min_out_epochs fann_get_cascade_num_candidate_groups fann_get_cascade_num_candidates fann_get_cascade_output_change_fraction fann_get_cascade_output_stagnation_epochs fann_get_cascade_weight_multiplier fann_get_connection_array fann_get_connection_rate fann_get_errno fann_get_errstr fann_get_layer_array fann_get_learning_momentum fann_get_learning_rate fann_get_MSE fann_get_network_type fann_get_num_input fann_get_num_layers fann_get_num_output fann_get_quickprop_decay fann_get_quickprop_mu fann_get_rprop_decrease_factor fann_get_rprop_delta_max fann_get_rprop_delta_min fann_get_rprop_delta_zero fann_get_rprop_increase_factor fann_get_sarprop_step_error_shift fann_get_sarprop_step_error_threshold_factor fann_get_sarprop_temperature fann_get_sarprop_weight_decay_shift fann_get_total_connections fann_get_total_neurons fann_get_train_error_function fann_get_train_stop_function fann_get_training_algorithm fann_init_weights fann_length_train_data fann_merge_train_data fann_num_input_train_data fann_num_output_train_data fann_print_error fann_randomize_weights fann_read_train_from_file fann_reset_errno fann_reset_errstr fann_reset_MSE fann_run fann_save_train fann_save fann_scale_input_train_data fann_scale_input fann_scale_output_train_data fann_scale_output fann_scale_train_data fann_scale_train fann_set_activation_function_hidden fann_set_activation_function_layer fann_set_activation_function_output fann_set_activation_function fann_set_activation_steepness_hidden fann_set_activation_steepness_layer fann_set_activation_steepness_output fann_set_activation_steepness fann_set_bit_fail_limit fann_set_callback fann_set_cascade_activation_functions fann_set_cascade_activation_steepnesses fann_set_cascade_candidate_change_fraction fann_set_cascade_candidate_limit fann_set_cascade_candidate_stagnation_epochs fann_set_cascade_max_cand_epochs fann_set_cascade_max_out_epochs fann_set_cascade_min_cand_epochs fann_set_cascade_min_out_epochs fann_set_cascade_num_candidate_groups fann_set_cascade_output_change_fraction fann_set_cascade_output_stagnation_epochs fann_set_cascade_weight_multiplier fann_set_error_log fann_set_input_scaling_params fann_set_learning_momentum fann_set_learning_rate fann_set_output_scaling_params fann_set_quickprop_decay fann_set_quickprop_mu fann_set_rprop_decrease_factor fann_set_rprop_delta_max fann_set_rprop_delta_min fann_set_rprop_delta_zero fann_set_rprop_increase_factor fann_set_sarprop_step_error_shift fann_set_sarprop_step_error_threshold_factor fann_set_sarprop_temperature fann_set_sarprop_weight_decay_shift fann_set_scaling_params fann_set_train_error_function fann_set_train_stop_function fann_set_training_algorithm fann_set_weight_array fann_set_weight fann_shuffle_train_data fann_subset_train_data fann_test_data fann_test fann_train_epoch fann_train_on_data fann_train_on_file fann_train fann_cascadetrain_on_data)
+          b["FrontBase"] = Set.new %w(fbsql_affected_rows fbsql_affected_rows fbsql_autocommit fbsql_blob_size fbsql_change_user fbsql_clob_size fbsql_close fbsql_commit fbsql_connect fbsql_create_blob fbsql_create_clob fbsql_create_db fbsql_data_seek fbsql_database_password fbsql_database fbsql_db_query fbsql_db_status fbsql_drop_db fbsql_errno fbsql_error fbsql_fetch_array fbsql_fetch_assoc fbsql_fetch_field fbsql_fetch_lengths fbsql_fetch_object fbsql_fetch_row fbsql_field_flags fbsql_field_len fbsql_field_name fbsql_field_seek fbsql_field_table fbsql_field_type fbsql_free_result fbsql_get_autostart_info fbsql_hostname fbsql_insert_id fbsql_list_dbs fbsql_list_fields fbsql_list_tables fbsql_next_result fbsql_num_fields fbsql_num_rows fbsql_password fbsql_pconnect fbsql_query fbsql_read_blob fbsql_read_clob fbsql_result fbsql_rollback fbsql_rows_fetched fbsql_select_db fbsql_set_characterset fbsql_set_lob_mode fbsql_set_password fbsql_set_transaction fbsql_start_db fbsql_stop_db fbsql_table_name fbsql_tablename fbsql_username fbsql_warnings fbsql_affected_rows)
+          b["FDF"] = Set.new %w(fdf_add_doc_javascript fdf_add_doc_javascript fdf_add_template fdf_close fdf_create fdf_enum_values fdf_errno fdf_error fdf_get_ap fdf_get_attachment fdf_get_encoding fdf_get_file fdf_get_flags fdf_get_opt fdf_get_status fdf_get_value fdf_get_version fdf_header fdf_next_field_name fdf_open_string fdf_open fdf_remove_item fdf_save_string fdf_save fdf_set_ap fdf_set_encoding fdf_set_file fdf_set_flags fdf_set_javascript_action fdf_set_on_import_javascript fdf_set_opt fdf_set_status fdf_set_submit_form_action fdf_set_target_frame fdf_set_value fdf_set_version fdf_add_doc_javascript)
+          b["Fileinfo"] = Set.new %w(finfo_buffer finfo_buffer finfo_close finfo_file finfo_open finfo_set_flags mime_content_type finfo_buffer)
+          b["filePro"] = Set.new %w(filepro_fieldcount filepro_fieldcount filepro_fieldname filepro_fieldtype filepro_fieldwidth filepro_retrieve filepro_rowcount filepro filepro_fieldcount)
+          b["Filesystem"] = Set.new %w(basename basename chgrp chmod chown clearstatcache copy delete dirname disk_free_space disk_total_space diskfreespace fclose feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents file fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype flock fnmatch fopen fpassthru fputcsv fputs fread fscanf fseek fstat ftell ftruncate fwrite glob is_dir is_executable is_file is_link is_readable is_uploaded_file is_writable is_writeable lchgrp lchown link linkinfo lstat mkdir move_uploaded_file parse_ini_file parse_ini_string pathinfo pclose popen readfile readlink realpath_cache_get realpath_cache_size realpath rename rewind rmdir set_file_buffer stat symlink tempnam tmpfile touch umask unlink basename)
+          b["Filter"] = Set.new %w(filter_has_var filter_has_var filter_id filter_input_array filter_input filter_list filter_var_array filter_var filter_has_var)
+          b["FPM"] = Set.new %w(fastcgi_finish_request fastcgi_finish_request fastcgi_finish_request)
+          b["FriBiDi"] = Set.new %w(fribidi_log2vis fribidi_log2vis fribidi_log2vis)
+          b["FTP"] = Set.new %w(ftp_alloc ftp_alloc ftp_cdup ftp_chdir ftp_chmod ftp_close ftp_connect ftp_delete ftp_exec ftp_fget ftp_fput ftp_get_option ftp_get ftp_login ftp_mdtm ftp_mkdir ftp_nb_continue ftp_nb_fget ftp_nb_fput ftp_nb_get ftp_nb_put ftp_nlist ftp_pasv ftp_put ftp_pwd ftp_quit ftp_raw ftp_rawlist ftp_rename ftp_rmdir ftp_set_option ftp_site ftp_size ftp_ssl_connect ftp_systype ftp_alloc)
+          b["Function handling"] = Set.new %w(call_user_func_array call_user_func_array call_user_func create_function forward_static_call_array forward_static_call func_get_arg func_get_args func_num_args function_exists get_defined_functions register_shutdown_function register_tick_function unregister_tick_function call_user_func_array)
+          b["GeoIP"] = Set.new %w(geoip_asnum_by_name geoip_asnum_by_name geoip_continent_code_by_name geoip_country_code_by_name geoip_country_code3_by_name geoip_country_name_by_name geoip_database_info geoip_db_avail geoip_db_filename geoip_db_get_all_info geoip_domain_by_name geoip_id_by_name geoip_isp_by_name geoip_netspeedcell_by_name geoip_org_by_name geoip_record_by_name geoip_region_by_name geoip_region_name_by_code geoip_setup_custom_directory geoip_time_zone_by_country_and_region geoip_asnum_by_name)
+          b["Gettext"] = Set.new %w(bind_textdomain_codeset bind_textdomain_codeset bindtextdomain dcgettext dcngettext dgettext dngettext gettext ngettext textdomain bind_textdomain_codeset)
+          b["GMP"] = Set.new %w(gmp_abs gmp_abs gmp_add gmp_and gmp_clrbit gmp_cmp gmp_com gmp_div_q gmp_div_qr gmp_div_r gmp_div gmp_divexact gmp_fact gmp_gcd gmp_gcdext gmp_hamdist gmp_init gmp_intval gmp_invert gmp_jacobi gmp_legendre gmp_mod gmp_mul gmp_neg gmp_nextprime gmp_or gmp_perfect_square gmp_popcount gmp_pow gmp_powm gmp_prob_prime gmp_random gmp_scan0 gmp_scan1 gmp_setbit gmp_sign gmp_sqrt gmp_sqrtrem gmp_strval gmp_sub gmp_testbit gmp_xor gmp_abs)
+          b["GnuPG"] = Set.new %w(gnupg_adddecryptkey gnupg_adddecryptkey gnupg_addencryptkey gnupg_addsignkey gnupg_cleardecryptkeys gnupg_clearencryptkeys gnupg_clearsignkeys gnupg_decrypt gnupg_decryptverify gnupg_encrypt gnupg_encryptsign gnupg_export gnupg_geterror gnupg_getprotocol gnupg_import gnupg_init gnupg_keyinfo gnupg_setarmor gnupg_seterrormode gnupg_setsignmode gnupg_sign gnupg_verify gnupg_adddecryptkey)
+          b["Gupnp"] = Set.new %w(gupnp_context_get_host_ip gupnp_context_get_host_ip gupnp_context_get_port gupnp_context_get_subscription_timeout gupnp_context_host_path gupnp_context_new gupnp_context_set_subscription_timeout gupnp_context_timeout_add gupnp_context_unhost_path gupnp_control_point_browse_start gupnp_control_point_browse_stop gupnp_control_point_callback_set gupnp_control_point_new gupnp_device_action_callback_set gupnp_device_info_get_service gupnp_device_info_get gupnp_root_device_get_available gupnp_root_device_get_relative_location gupnp_root_device_new gupnp_root_device_set_available gupnp_root_device_start gupnp_root_device_stop gupnp_service_action_get gupnp_service_action_return_error gupnp_service_action_return gupnp_service_action_set gupnp_service_freeze_notify gupnp_service_info_get_introspection gupnp_service_info_get gupnp_service_introspection_get_state_variable gupnp_service_notify gupnp_service_proxy_action_get gupnp_service_proxy_action_set gupnp_service_proxy_add_notify gupnp_service_proxy_callback_set gupnp_service_proxy_get_subscribed gupnp_service_proxy_remove_notify gupnp_service_proxy_set_subscribed gupnp_service_thaw_notify gupnp_context_get_host_ip)
+          b["Hash"] = Set.new %w(hash_algos hash_algos hash_copy hash_file hash_final hash_hmac_file hash_hmac hash_init hash_pbkdf2 hash_update_file hash_update_stream hash_update hash hash_algos)
+          b["HTTP"] = Set.new %w(http_cache_etag http_cache_etag http_cache_last_modified http_chunked_decode http_deflate http_inflate http_build_cookie http_date http_get_request_body_stream http_get_request_body http_get_request_headers http_match_etag http_match_modified http_match_request_header http_support http_negotiate_charset http_negotiate_content_type http_negotiate_language ob_deflatehandler ob_etaghandler ob_inflatehandler http_parse_cookie http_parse_headers http_parse_message http_parse_params http_persistent_handles_clean http_persistent_handles_count http_persistent_handles_ident http_get http_head http_post_data http_post_fields http_put_data http_put_file http_put_stream http_request_body_encode http_request_method_exists http_request_method_name http_request_method_register http_request_method_unregister http_request http_redirect http_send_content_disposition http_send_content_type http_send_data http_send_file http_send_last_modified http_send_status http_send_stream http_throttle http_build_str http_build_url http_cache_etag)
+          b["Hyperwave"] = Set.new %w(hw_Array2Objrec hw_Array2Objrec hw_changeobject hw_Children hw_ChildrenObj hw_Close hw_Connect hw_connection_info hw_cp hw_Deleteobject hw_DocByAnchor hw_DocByAnchorObj hw_Document_Attributes hw_Document_BodyTag hw_Document_Content hw_Document_SetContent hw_Document_Size hw_dummy hw_EditText hw_Error hw_ErrorMsg hw_Free_Document hw_GetAnchors hw_GetAnchorsObj hw_GetAndLock hw_GetChildColl hw_GetChildCollObj hw_GetChildDocColl hw_GetChildDocCollObj hw_GetObject hw_GetObjectByQuery hw_GetObjectByQueryColl hw_GetObjectByQueryCollObj hw_GetObjectByQueryObj hw_GetParents hw_GetParentsObj hw_getrellink hw_GetRemote hw_getremotechildren hw_GetSrcByDestObj hw_GetText hw_getusername hw_Identify hw_InCollections hw_Info hw_InsColl hw_InsDoc hw_insertanchors hw_InsertDocument hw_InsertObject hw_mapid hw_Modifyobject hw_mv hw_New_Document hw_objrec2array hw_Output_Document hw_pConnect hw_PipeDocument hw_Root hw_setlinkroot hw_stat hw_Unlock hw_Who hw_Array2Objrec)
+          b["Hyperwave API"] = Set.new %w(hwapi_attribute_new hwapi_content_new hwapi_hgcsp hwapi_object_new)
+          b["Firebird/InterBase"] = Set.new %w(ibase_add_user ibase_add_user ibase_affected_rows ibase_backup ibase_blob_add ibase_blob_cancel ibase_blob_close ibase_blob_create ibase_blob_echo ibase_blob_get ibase_blob_import ibase_blob_info ibase_blob_open ibase_close ibase_commit_ret ibase_commit ibase_connect ibase_db_info ibase_delete_user ibase_drop_db ibase_errcode ibase_errmsg ibase_execute ibase_fetch_assoc ibase_fetch_object ibase_fetch_row ibase_field_info ibase_free_event_handler ibase_free_query ibase_free_result ibase_gen_id ibase_maintain_db ibase_modify_user ibase_name_result ibase_num_fields ibase_num_params ibase_param_info ibase_pconnect ibase_prepare ibase_query ibase_restore ibase_rollback_ret ibase_rollback ibase_server_info ibase_service_attach ibase_service_detach ibase_set_event_handler ibase_trans ibase_wait_event ibase_add_user)
+          b["IBM DB2"] = Set.new %w(db2_autocommit db2_autocommit db2_bind_param db2_client_info db2_close db2_column_privileges db2_columns db2_commit db2_conn_error db2_conn_errormsg db2_connect db2_cursor_type db2_escape_string db2_exec db2_execute db2_fetch_array db2_fetch_assoc db2_fetch_both db2_fetch_object db2_fetch_row db2_field_display_size db2_field_name db2_field_num db2_field_precision db2_field_scale db2_field_type db2_field_width db2_foreign_keys db2_free_result db2_free_stmt db2_get_option db2_last_insert_id db2_lob_read db2_next_result db2_num_fields db2_num_rows db2_pclose db2_pconnect db2_prepare db2_primary_keys db2_procedure_columns db2_procedures db2_result db2_rollback db2_server_info db2_set_option db2_special_columns db2_statistics db2_stmt_error db2_stmt_errormsg db2_table_privileges db2_tables db2_autocommit)
+          b["iconv"] = Set.new %w(iconv_get_encoding iconv_get_encoding iconv_mime_decode_headers iconv_mime_decode iconv_mime_encode iconv_set_encoding iconv_strlen iconv_strpos iconv_strrpos iconv_substr iconv ob_iconv_handler iconv_get_encoding)
+          b["ID3"] = Set.new %w(id3_get_frame_long_name id3_get_frame_long_name id3_get_frame_short_name id3_get_genre_id id3_get_genre_list id3_get_genre_name id3_get_tag id3_get_version id3_remove_tag id3_set_tag id3_get_frame_long_name)
+          b["Informix"] = Set.new %w(ifx_affected_rows ifx_affected_rows ifx_blobinfile_mode ifx_byteasvarchar ifx_close ifx_connect ifx_copy_blob ifx_create_blob ifx_create_char ifx_do ifx_error ifx_errormsg ifx_fetch_row ifx_fieldproperties ifx_fieldtypes ifx_free_blob ifx_free_char ifx_free_result ifx_get_blob ifx_get_char ifx_getsqlca ifx_htmltbl_result ifx_nullformat ifx_num_fields ifx_num_rows ifx_pconnect ifx_prepare ifx_query ifx_textasvarchar ifx_update_blob ifx_update_char ifxus_close_slob ifxus_create_slob ifxus_free_slob ifxus_open_slob ifxus_read_slob ifxus_seek_slob ifxus_tell_slob ifxus_write_slob ifx_affected_rows)
+          b["IIS"] = Set.new %w(iis_add_server iis_add_server iis_get_dir_security iis_get_script_map iis_get_server_by_comment iis_get_server_by_path iis_get_server_rights iis_get_service_state iis_remove_server iis_set_app_settings iis_set_dir_security iis_set_script_map iis_set_server_rights iis_start_server iis_start_service iis_stop_server iis_stop_service iis_add_server)
+          b["GD and Image"] = Set.new %w(gd_info gd_info getimagesize getimagesizefromstring image_type_to_extension image_type_to_mime_type image2wbmp imageaffine imageaffinematrixconcat imageaffinematrixget imagealphablending imageantialias imagearc imagechar imagecharup imagecolorallocate imagecolorallocatealpha imagecolorat imagecolorclosest imagecolorclosestalpha imagecolorclosesthwb imagecolordeallocate imagecolorexact imagecolorexactalpha imagecolormatch imagecolorresolve imagecolorresolvealpha imagecolorset imagecolorsforindex imagecolorstotal imagecolortransparent imageconvolution imagecopy imagecopymerge imagecopymergegray imagecopyresampled imagecopyresized imagecreate imagecreatefromgd2 imagecreatefromgd2part imagecreatefromgd imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromstring imagecreatefromwbmp imagecreatefromwebp imagecreatefromxbm imagecreatefromxpm imagecreatetruecolor imagecrop imagecropauto imagedashedline imagedestroy imageellipse imagefill imagefilledarc imagefilledellipse imagefilledpolygon imagefilledrectangle imagefilltoborder imagefilter imageflip imagefontheight imagefontwidth imageftbbox imagefttext imagegammacorrect imagegd2 imagegd imagegif imagegrabscreen imagegrabwindow imageinterlace imageistruecolor imagejpeg imagelayereffect imageline imageloadfont imagepalettecopy imagepalettetotruecolor imagepng imagepolygon imagepsbbox imagepsencodefont imagepsextendfont imagepsfreefont imagepsloadfont imagepsslantfont imagepstext imagerectangle imagerotate imagesavealpha imagescale imagesetbrush imagesetinterpolation imagesetpixel imagesetstyle imagesetthickness imagesettile imagestring imagestringup imagesx imagesy imagetruecolortopalette imagettfbbox imagettftext imagetypes imagewbmp imagewebp imagexbm iptcembed iptcparse jpeg2wbmp png2wbmp gd_info)
+          b["IMAP"] = Set.new %w(imap_8bit imap_8bit imap_alerts imap_append imap_base64 imap_binary imap_body imap_bodystruct imap_check imap_clearflag_full imap_close imap_create imap_createmailbox imap_delete imap_deletemailbox imap_errors imap_expunge imap_fetch_overview imap_fetchbody imap_fetchheader imap_fetchmime imap_fetchstructure imap_fetchtext imap_gc imap_get_quota imap_get_quotaroot imap_getacl imap_getmailboxes imap_getsubscribed imap_header imap_headerinfo imap_headers imap_last_error imap_list imap_listmailbox imap_listscan imap_listsubscribed imap_lsub imap_mail_compose imap_mail_copy imap_mail_move imap_mail imap_mailboxmsginfo imap_mime_header_decode imap_msgno imap_num_msg imap_num_recent imap_open imap_ping imap_qprint imap_rename imap_renamemailbox imap_reopen imap_rfc822_parse_adrlist imap_rfc822_parse_headers imap_rfc822_write_address imap_savebody imap_scan imap_scanmailbox imap_search imap_set_quota imap_setacl imap_setflag_full imap_sort imap_status imap_subscribe imap_thread imap_timeout imap_uid imap_undelete imap_unsubscribe imap_utf7_decode imap_utf7_encode imap_utf8 imap_8bit)
+          b["inclued"] = Set.new %w(inclued_get_data inclued_get_data inclued_get_data)
+          b["PHP Options/Info"] = Set.new %w(assert_options assert_options assert cli_get_process_title cli_set_process_title dl extension_loaded gc_collect_cycles gc_disable gc_enable gc_enabled get_cfg_var get_current_user get_defined_constants get_extension_funcs get_include_path get_included_files get_loaded_extensions get_magic_quotes_gpc get_magic_quotes_runtime get_required_files getenv getlastmod getmygid getmyinode getmypid getmyuid getopt getrusage ini_alter ini_get_all ini_get ini_restore ini_set magic_quotes_runtime main memory_get_peak_usage memory_get_usage php_ini_loaded_file php_ini_scanned_files php_logo_guid php_sapi_name php_uname phpcredits phpinfo phpversion putenv restore_include_path set_include_path set_magic_quotes_runtime set_time_limit sys_get_temp_dir version_compare zend_logo_guid zend_thread_id zend_version assert_options)
+          b["Ingres"] = Set.new %w(ingres_autocommit_state ingres_autocommit_state ingres_autocommit ingres_charset ingres_close ingres_commit ingres_connect ingres_cursor ingres_errno ingres_error ingres_errsqlstate ingres_escape_string ingres_execute ingres_fetch_array ingres_fetch_assoc ingres_fetch_object ingres_fetch_proc_return ingres_fetch_row ingres_field_length ingres_field_name ingres_field_nullable ingres_field_precision ingres_field_scale ingres_field_type ingres_free_result ingres_next_error ingres_num_fields ingres_num_rows ingres_pconnect ingres_prepare ingres_query ingres_result_seek ingres_rollback ingres_set_environment ingres_unbuffered_query ingres_autocommit_state)
+          b["Inotify"] = Set.new %w(inotify_add_watch inotify_add_watch inotify_init inotify_queue_len inotify_read inotify_rm_watch inotify_add_watch)
+          b["Grapheme"] = Set.new %w(grapheme_extract grapheme_extract grapheme_stripos grapheme_stristr grapheme_strlen grapheme_strpos grapheme_strripos grapheme_strrpos grapheme_strstr grapheme_substr grapheme_extract)
+          b["intl"] = Set.new %w(intl_error_name intl_error_name intl_get_error_code intl_get_error_message intl_is_failure intl_error_name)
+          b["IDN"] = Set.new %w(grapheme_substr idn_to_ascii idn_to_ascii idn_to_unicode idn_to_utf8 grapheme_substr idn_to_ascii)
+          b["Java"] = Set.new %w(java_last_exception_clear java_last_exception_clear java_last_exception_get java_last_exception_clear)
+          b["JSON"] = Set.new %w(json_decode json_decode json_encode json_last_error_msg json_last_error json_decode)
+          b["Judy"] = Set.new %w(judy_type judy_type judy_version judy_type)
+          b["KADM5"] = Set.new %w(kadm5_chpass_principal kadm5_chpass_principal kadm5_create_principal kadm5_delete_principal kadm5_destroy kadm5_flush kadm5_get_policies kadm5_get_principal kadm5_get_principals kadm5_init_with_password kadm5_modify_principal kadm5_chpass_principal)
+          b["LDAP"] = Set.new %w(ldap_8859_to_t61 ldap_8859_to_t61 ldap_add ldap_bind ldap_close ldap_compare ldap_connect ldap_control_paged_result_response ldap_control_paged_result ldap_count_entries ldap_delete ldap_dn2ufn ldap_err2str ldap_errno ldap_error ldap_explode_dn ldap_first_attribute ldap_first_entry ldap_first_reference ldap_free_result ldap_get_attributes ldap_get_dn ldap_get_entries ldap_get_option ldap_get_values_len ldap_get_values ldap_list ldap_mod_add ldap_mod_del ldap_mod_replace ldap_modify ldap_next_attribute ldap_next_entry ldap_next_reference ldap_parse_reference ldap_parse_result ldap_read ldap_rename ldap_sasl_bind ldap_search ldap_set_option ldap_set_rebind_proc ldap_sort ldap_start_tls ldap_t61_to_8859 ldap_unbind ldap_8859_to_t61)
+          b["Libevent"] = Set.new %w(event_add event_add event_base_free event_base_loop event_base_loopbreak event_base_loopexit event_base_new event_base_priority_init event_base_reinit event_base_set event_buffer_base_set event_buffer_disable event_buffer_enable event_buffer_fd_set event_buffer_free event_buffer_new event_buffer_priority_set event_buffer_read event_buffer_set_callback event_buffer_timeout_set event_buffer_watermark_set event_buffer_write event_del event_free event_new event_priority_set event_set event_timer_add event_timer_del event_timer_new event_timer_set event_add)
+          b["libxml"] = Set.new %w(libxml_clear_errors libxml_clear_errors libxml_disable_entity_loader libxml_get_errors libxml_get_last_error libxml_set_external_entity_loader libxml_set_streams_context libxml_use_internal_errors libxml_clear_errors)
+          b["LZF"] = Set.new %w(lzf_compress lzf_compress lzf_decompress lzf_optimized_for lzf_compress)
+          b["Mail"] = Set.new %w(ezmlm_hash ezmlm_hash mail ezmlm_hash)
+          b["Mailparse"] = Set.new %w(mailparse_determine_best_xfer_encoding mailparse_determine_best_xfer_encoding mailparse_msg_create mailparse_msg_extract_part_file mailparse_msg_extract_part mailparse_msg_extract_whole_part_file mailparse_msg_free mailparse_msg_get_part_data mailparse_msg_get_part mailparse_msg_get_structure mailparse_msg_parse_file mailparse_msg_parse mailparse_rfc822_parse_addresses mailparse_stream_encode mailparse_uudecode_all mailparse_determine_best_xfer_encoding)
+          b["Math"] = Set.new %w(abs abs acos acosh asin asinh atan2 atan atanh base_convert bindec ceil cos cosh decbin dechex decoct deg2rad exp expm1 floor fmod getrandmax hexdec hypot is_finite is_infinite is_nan lcg_value log10 log1p log max min mt_getrandmax mt_rand mt_srand octdec pi pow rad2deg rand round sin sinh sqrt srand tan tanh abs)
+          b["MaxDB"] = Set.new %w(maxdb_affected_rows maxdb_affected_rows maxdb_autocommit maxdb_bind_param maxdb_bind_result maxdb_change_user maxdb_character_set_name maxdb_client_encoding maxdb_close_long_data maxdb_close maxdb_commit maxdb_connect_errno maxdb_connect_error maxdb_connect maxdb_data_seek maxdb_debug maxdb_disable_reads_from_master maxdb_disable_rpl_parse maxdb_dump_debug_info maxdb_embedded_connect maxdb_enable_reads_from_master maxdb_enable_rpl_parse maxdb_errno maxdb_error maxdb_escape_string maxdb_execute maxdb_fetch_array maxdb_fetch_assoc maxdb_fetch_field_direct maxdb_fetch_field maxdb_fetch_fields maxdb_fetch_lengths maxdb_fetch_object maxdb_fetch_row maxdb_fetch maxdb_field_count maxdb_field_seek maxdb_field_tell maxdb_free_result maxdb_get_client_info maxdb_get_client_version maxdb_get_host_info maxdb_get_metadata maxdb_get_proto_info maxdb_get_server_info maxdb_get_server_version maxdb_info maxdb_init maxdb_insert_id maxdb_kill maxdb_master_query maxdb_more_results maxdb_multi_query maxdb_next_result maxdb_num_fields maxdb_num_rows maxdb_options maxdb_param_count maxdb_ping maxdb_prepare maxdb_query maxdb_real_connect maxdb_real_escape_string maxdb_real_query maxdb_report maxdb_rollback maxdb_rpl_parse_enabled maxdb_rpl_probe maxdb_rpl_query_type maxdb_select_db maxdb_send_long_data maxdb_send_query maxdb_server_end maxdb_server_init maxdb_set_opt maxdb_sqlstate maxdb_ssl_set maxdb_stat maxdb_stmt_affected_rows maxdb_stmt_bind_param maxdb_stmt_bind_result maxdb_stmt_close_long_data maxdb_stmt_close maxdb_stmt_data_seek maxdb_stmt_errno maxdb_stmt_error maxdb_stmt_execute maxdb_stmt_fetch maxdb_stmt_free_result maxdb_stmt_init maxdb_stmt_num_rows maxdb_stmt_param_count maxdb_stmt_prepare maxdb_stmt_reset maxdb_stmt_result_metadata maxdb_stmt_send_long_data maxdb_stmt_sqlstate maxdb_stmt_store_result maxdb_store_result maxdb_thread_id maxdb_thread_safe maxdb_use_result maxdb_warning_count maxdb_affected_rows)
+          b["Multibyte String"] = Set.new %w(mb_check_encoding mb_check_encoding mb_convert_case mb_convert_encoding mb_convert_kana mb_convert_variables mb_decode_mimeheader mb_decode_numericentity mb_detect_encoding mb_detect_order mb_encode_mimeheader mb_encode_numericentity mb_encoding_aliases mb_ereg_match mb_ereg_replace_callback mb_ereg_replace mb_ereg_search_getpos mb_ereg_search_getregs mb_ereg_search_init mb_ereg_search_pos mb_ereg_search_regs mb_ereg_search_setpos mb_ereg_search mb_ereg mb_eregi_replace mb_eregi mb_get_info mb_http_input mb_http_output mb_internal_encoding mb_language mb_list_encodings mb_output_handler mb_parse_str mb_preferred_mime_name mb_regex_encoding mb_regex_set_options mb_send_mail mb_split mb_strcut mb_strimwidth mb_stripos mb_stristr mb_strlen mb_strpos mb_strrchr mb_strrichr mb_strripos mb_strrpos mb_strstr mb_strtolower mb_strtoupper mb_strwidth mb_substitute_character mb_substr_count mb_substr mb_check_encoding)
+          b["Mcrypt"] = Set.new %w(mcrypt_cbc mcrypt_cbc mcrypt_cfb mcrypt_create_iv mcrypt_decrypt mcrypt_ecb mcrypt_enc_get_algorithms_name mcrypt_enc_get_block_size mcrypt_enc_get_iv_size mcrypt_enc_get_key_size mcrypt_enc_get_modes_name mcrypt_enc_get_supported_key_sizes mcrypt_enc_is_block_algorithm_mode mcrypt_enc_is_block_algorithm mcrypt_enc_is_block_mode mcrypt_enc_self_test mcrypt_encrypt mcrypt_generic_deinit mcrypt_generic_end mcrypt_generic_init mcrypt_generic mcrypt_get_block_size mcrypt_get_cipher_name mcrypt_get_iv_size mcrypt_get_key_size mcrypt_list_algorithms mcrypt_list_modes mcrypt_module_close mcrypt_module_get_algo_block_size mcrypt_module_get_algo_key_size mcrypt_module_get_supported_key_sizes mcrypt_module_is_block_algorithm_mode mcrypt_module_is_block_algorithm mcrypt_module_is_block_mode mcrypt_module_open mcrypt_module_self_test mcrypt_ofb mdecrypt_generic mcrypt_cbc)
+          b["MCVE"] = Set.new %w(m_checkstatus m_checkstatus m_completeauthorizations m_connect m_connectionerror m_deletetrans m_destroyconn m_destroyengine m_getcell m_getcellbynum m_getcommadelimited m_getheader m_initconn m_initengine m_iscommadelimited m_maxconntimeout m_monitor m_numcolumns m_numrows m_parsecommadelimited m_responsekeys m_responseparam m_returnstatus m_setblocking m_setdropfile m_setip m_setssl_cafile m_setssl_files m_setssl m_settimeout m_sslcert_gen_hash m_transactionssent m_transinqueue m_transkeyval m_transnew m_transsend m_uwait m_validateidentifier m_verifyconnection m_verifysslcert m_checkstatus)
+          b["Memcache"] = Set.new %w(memcache_debug memcache_debug memcache_debug)
+          b["Mhash"] = Set.new %w(mhash_count mhash_count mhash_get_block_size mhash_get_hash_name mhash_keygen_s2k mhash mhash_count)
+          b["Ming"] = Set.new %w(ming_keypress ming_keypress ming_setcubicthreshold ming_setscale ming_setswfcompression ming_useconstants ming_useswfversion ming_keypress)
+          b["Misc."] = Set.new %w(connection_aborted connection_aborted connection_status connection_timeout constant define defined die eval exit get_browser __halt_compiler highlight_file highlight_string ignore_user_abort pack php_check_syntax php_strip_whitespace show_source sleep sys_getloadavg time_nanosleep time_sleep_until uniqid unpack usleep connection_aborted)
+          b["mnoGoSearch"] = Set.new %w(udm_add_search_limit udm_add_search_limit udm_alloc_agent_array udm_alloc_agent udm_api_version udm_cat_list udm_cat_path udm_check_charset udm_check_stored udm_clear_search_limits udm_close_stored udm_crc32 udm_errno udm_error udm_find udm_free_agent udm_free_ispell_data udm_free_res udm_get_doc_count udm_get_res_field udm_get_res_param udm_hash32 udm_load_ispell_data udm_open_stored udm_set_agent_param udm_add_search_limit)
+          b["Mongo"] = Set.new %w(bson_decode bson_decode bson_encode bson_decode)
+          b["mqseries"] = Set.new %w(mqseries_back mqseries_back mqseries_begin mqseries_close mqseries_cmit mqseries_conn mqseries_connx mqseries_disc mqseries_get mqseries_inq mqseries_open mqseries_put1 mqseries_put mqseries_set mqseries_strerror mqseries_back)
+          b["Msession"] = Set.new %w(msession_connect msession_connect msession_count msession_create msession_destroy msession_disconnect msession_find msession_get_array msession_get_data msession_get msession_inc msession_list msession_listvar msession_lock msession_plugin msession_randstr msession_set_array msession_set_data msession_set msession_timeout msession_uniq msession_unlock msession_connect)
+          b["mSQL"] = Set.new %w(msql_affected_rows msql_affected_rows msql_close msql_connect msql_create_db msql_createdb msql_data_seek msql_db_query msql_dbname msql_drop_db msql_error msql_fetch_array msql_fetch_field msql_fetch_object msql_fetch_row msql_field_flags msql_field_len msql_field_name msql_field_seek msql_field_table msql_field_type msql_fieldflags msql_fieldlen msql_fieldname msql_fieldtable msql_fieldtype msql_free_result msql_list_dbs msql_list_fields msql_list_tables msql_num_fields msql_num_rows msql_numfields msql_numrows msql_pconnect msql_query msql_regcase msql_result msql_select_db msql_tablename msql msql_affected_rows)
+          b["Mssql"] = Set.new %w(mssql_bind mssql_bind mssql_close mssql_connect mssql_data_seek mssql_execute mssql_fetch_array mssql_fetch_assoc mssql_fetch_batch mssql_fetch_field mssql_fetch_object mssql_fetch_row mssql_field_length mssql_field_name mssql_field_seek mssql_field_type mssql_free_result mssql_free_statement mssql_get_last_message mssql_guid_string mssql_init mssql_min_error_severity mssql_min_message_severity mssql_next_result mssql_num_fields mssql_num_rows mssql_pconnect mssql_query mssql_result mssql_rows_affected mssql_select_db mssql_bind)
+          b["MySQL"] = Set.new %w(mysql_affected_rows mysql_affected_rows mysql_client_encoding mysql_close mysql_connect mysql_create_db mysql_data_seek mysql_db_name mysql_db_query mysql_drop_db mysql_errno mysql_error mysql_escape_string mysql_fetch_array mysql_fetch_assoc mysql_fetch_field mysql_fetch_lengths mysql_fetch_object mysql_fetch_row mysql_field_flags mysql_field_len mysql_field_name mysql_field_seek mysql_field_table mysql_field_type mysql_free_result mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql_insert_id mysql_list_dbs mysql_list_fields mysql_list_processes mysql_list_tables mysql_num_fields mysql_num_rows mysql_pconnect mysql_ping mysql_query mysql_real_escape_string mysql_result mysql_select_db mysql_set_charset mysql_stat mysql_tablename mysql_thread_id mysql_unbuffered_query mysql_affected_rows)
+          b["Aliases and deprecated Mysqli"] = Set.new %w(mysqli_bind_param mysqli_bind_param mysqli_bind_result mysqli_client_encoding mysqli_connect mysqli::disable_reads_from_master mysqli_disable_rpl_parse mysqli_enable_reads_from_master mysqli_enable_rpl_parse mysqli_escape_string mysqli_execute mysqli_fetch mysqli_get_cache_stats mysqli_get_metadata mysqli_master_query mysqli_param_count mysqli_report mysqli_rpl_parse_enabled mysqli_rpl_probe mysqli_send_long_data mysqli::set_opt mysqli_slave_query mysqli_bind_param)
+          b["Mysqlnd_memcache"] = Set.new %w(mysqlnd_memcache_get_config mysqlnd_memcache_get_config mysqlnd_memcache_set mysqlnd_memcache_get_config)
+          b["Mysqlnd_ms"] = Set.new %w(mysqlnd_ms_dump_servers mysqlnd_ms_dump_servers mysqlnd_ms_fabric_select_global mysqlnd_ms_fabric_select_shard mysqlnd_ms_get_last_gtid mysqlnd_ms_get_last_used_connection mysqlnd_ms_get_stats mysqlnd_ms_match_wild mysqlnd_ms_query_is_select mysqlnd_ms_set_qos mysqlnd_ms_set_user_pick_server mysqlnd_ms_xa_begin mysqlnd_ms_xa_commit mysqlnd_ms_xa_gc mysqlnd_ms_xa_rollback mysqlnd_ms_dump_servers)
+          b["mysqlnd_qc"] = Set.new %w(mysqlnd_qc_clear_cache mysqlnd_qc_clear_cache mysqlnd_qc_get_available_handlers mysqlnd_qc_get_cache_info mysqlnd_qc_get_core_stats mysqlnd_qc_get_normalized_query_trace_log mysqlnd_qc_get_query_trace_log mysqlnd_qc_set_cache_condition mysqlnd_qc_set_is_select mysqlnd_qc_set_storage_handler mysqlnd_qc_set_user_handlers mysqlnd_qc_clear_cache)
+          b["Mysqlnd_uh"] = Set.new %w(mysqlnd_uh_convert_to_mysqlnd mysqlnd_uh_convert_to_mysqlnd mysqlnd_uh_set_connection_proxy mysqlnd_uh_set_statement_proxy mysqlnd_uh_convert_to_mysqlnd)
+          b["Ncurses"] = Set.new %w(ncurses_addch ncurses_addch ncurses_addchnstr ncurses_addchstr ncurses_addnstr ncurses_addstr ncurses_assume_default_colors ncurses_attroff ncurses_attron ncurses_attrset ncurses_baudrate ncurses_beep ncurses_bkgd ncurses_bkgdset ncurses_border ncurses_bottom_panel ncurses_can_change_color ncurses_cbreak ncurses_clear ncurses_clrtobot ncurses_clrtoeol ncurses_color_content ncurses_color_set ncurses_curs_set ncurses_def_prog_mode ncurses_def_shell_mode ncurses_define_key ncurses_del_panel ncurses_delay_output ncurses_delch ncurses_deleteln ncurses_delwin ncurses_doupdate ncurses_echo ncurses_echochar ncurses_end ncurses_erase ncurses_erasechar ncurses_filter ncurses_flash ncurses_flushinp ncurses_getch ncurses_getmaxyx ncurses_getmouse ncurses_getyx ncurses_halfdelay ncurses_has_colors ncurses_has_ic ncurses_has_il ncurses_has_key ncurses_hide_panel ncurses_hline ncurses_inch ncurses_init_color ncurses_init_pair ncurses_init ncurses_insch ncurses_insdelln ncurses_insertln ncurses_insstr ncurses_instr ncurses_isendwin ncurses_keyok ncurses_keypad ncurses_killchar ncurses_longname ncurses_meta ncurses_mouse_trafo ncurses_mouseinterval ncurses_mousemask ncurses_move_panel ncurses_move ncurses_mvaddch ncurses_mvaddchnstr ncurses_mvaddchstr ncurses_mvaddnstr ncurses_mvaddstr ncurses_mvcur ncurses_mvdelch ncurses_mvgetch ncurses_mvhline ncurses_mvinch ncurses_mvvline ncurses_mvwaddstr ncurses_napms ncurses_new_panel ncurses_newpad ncurses_newwin ncurses_nl ncurses_nocbreak ncurses_noecho ncurses_nonl ncurses_noqiflush ncurses_noraw ncurses_pair_content ncurses_panel_above ncurses_panel_below ncurses_panel_window ncurses_pnoutrefresh ncurses_prefresh ncurses_putp ncurses_qiflush ncurses_raw ncurses_refresh ncurses_replace_panel ncurses_reset_prog_mode ncurses_reset_shell_mode ncurses_resetty ncurses_savetty ncurses_scr_dump ncurses_scr_init ncurses_scr_restore ncurses_scr_set ncurses_scrl ncurses_show_panel ncurses_slk_attr ncurses_slk_attroff ncurses_slk_attron ncurses_slk_attrset ncurses_slk_clear ncurses_slk_color ncurses_slk_init ncurses_slk_noutrefresh ncurses_slk_refresh ncurses_slk_restore ncurses_slk_set ncurses_slk_touch ncurses_standend ncurses_standout ncurses_start_color ncurses_termattrs ncurses_termname ncurses_timeout ncurses_top_panel ncurses_typeahead ncurses_ungetch ncurses_ungetmouse ncurses_update_panels ncurses_use_default_colors ncurses_use_env ncurses_use_extended_names ncurses_vidattr ncurses_vline ncurses_waddch ncurses_waddstr ncurses_wattroff ncurses_wattron ncurses_wattrset ncurses_wborder ncurses_wclear ncurses_wcolor_set ncurses_werase ncurses_wgetch ncurses_whline ncurses_wmouse_trafo ncurses_wmove ncurses_wnoutrefresh ncurses_wrefresh ncurses_wstandend ncurses_wstandout ncurses_wvline ncurses_addch)
+          b["Gopher"] = Set.new %w(gopher_parsedir gopher_parsedir gopher_parsedir)
+          b["Network"] = Set.new %w(checkdnsrr checkdnsrr closelog define_syslog_variables dns_check_record dns_get_mx dns_get_record fsockopen gethostbyaddr gethostbyname gethostbynamel gethostname getmxrr getprotobyname getprotobynumber getservbyname getservbyport header_register_callback header_remove header headers_list headers_sent http_response_code inet_ntop inet_pton ip2long long2ip openlog pfsockopen setcookie setrawcookie socket_get_status socket_set_blocking socket_set_timeout syslog checkdnsrr)
+          b["Newt"] = Set.new %w(newt_bell newt_bell newt_button_bar newt_button newt_centered_window newt_checkbox_get_value newt_checkbox_set_flags newt_checkbox_set_value newt_checkbox_tree_add_item newt_checkbox_tree_find_item newt_checkbox_tree_get_current newt_checkbox_tree_get_entry_value newt_checkbox_tree_get_multi_selection newt_checkbox_tree_get_selection newt_checkbox_tree_multi newt_checkbox_tree_set_current newt_checkbox_tree_set_entry_value newt_checkbox_tree_set_entry newt_checkbox_tree_set_width newt_checkbox_tree newt_checkbox newt_clear_key_buffer newt_cls newt_compact_button newt_component_add_callback newt_component_takes_focus newt_create_grid newt_cursor_off newt_cursor_on newt_delay newt_draw_form newt_draw_root_text newt_entry_get_value newt_entry_set_filter newt_entry_set_flags newt_entry_set newt_entry newt_finished newt_form_add_component newt_form_add_components newt_form_add_hot_key newt_form_destroy newt_form_get_current newt_form_run newt_form_set_background newt_form_set_height newt_form_set_size newt_form_set_timer newt_form_set_width newt_form_watch_fd newt_form newt_get_screen_size newt_grid_add_components_to_form newt_grid_basic_window newt_grid_free newt_grid_get_size newt_grid_h_close_stacked newt_grid_h_stacked newt_grid_place newt_grid_set_field newt_grid_simple_window newt_grid_v_close_stacked newt_grid_v_stacked newt_grid_wrapped_window_at newt_grid_wrapped_window newt_init newt_label_set_text newt_label newt_listbox_append_entry newt_listbox_clear_selection newt_listbox_clear newt_listbox_delete_entry newt_listbox_get_current newt_listbox_get_selection newt_listbox_insert_entry newt_listbox_item_count newt_listbox_select_item newt_listbox_set_current_by_key newt_listbox_set_current newt_listbox_set_data newt_listbox_set_entry newt_listbox_set_width newt_listbox newt_listitem_get_data newt_listitem_set newt_listitem newt_open_window newt_pop_help_line newt_pop_window newt_push_help_line newt_radio_get_current newt_radiobutton newt_redraw_help_line newt_reflow_text newt_refresh newt_resize_screen newt_resume newt_run_form newt_scale_set newt_scale newt_scrollbar_set newt_set_help_callback newt_set_suspend_callback newt_suspend newt_textbox_get_num_lines newt_textbox_reflowed newt_textbox_set_height newt_textbox_set_text newt_textbox newt_vertical_scrollbar newt_wait_for_key newt_win_choice newt_win_entries newt_win_menu newt_win_message newt_win_messagev newt_win_ternary newt_bell)
+          b["YP/NIS"] = Set.new %w(yp_all yp_all yp_cat yp_err_string yp_errno yp_first yp_get_default_domain yp_master yp_match yp_next yp_order yp_all)
+          b["Lotus Notes"] = Set.new %w(notes_body notes_body notes_copy_db notes_create_db notes_create_note notes_drop_db notes_find_note notes_header_info notes_list_msgs notes_mark_read notes_mark_unread notes_nav_create notes_search notes_unread notes_version notes_body)
+          b["NSAPI"] = Set.new %w(nsapi_request_headers nsapi_request_headers nsapi_response_headers nsapi_virtual nsapi_request_headers)
+          b["OAuth"] = Set.new %w(oauth_get_sbs oauth_get_sbs oauth_urlencode oauth_get_sbs)
+          b["Object Aggregation"] = Set.new %w(aggregate_info aggregate_info aggregate_methods_by_list aggregate_methods_by_regexp aggregate_methods aggregate_properties_by_list aggregate_properties_by_regexp aggregate_properties aggregate aggregation_info deaggregate aggregate_info)
+          b["OCI8"] = Set.new %w(oci_bind_array_by_name oci_bind_array_by_name oci_bind_by_name oci_cancel oci_client_version oci_close oci_commit oci_connect oci_define_by_name oci_error oci_execute oci_fetch_all oci_fetch_array oci_fetch_assoc oci_fetch_object oci_fetch_row oci_fetch oci_field_is_null oci_field_name oci_field_precision oci_field_scale oci_field_size oci_field_type_raw oci_field_type oci_free_descriptor oci_free_statement oci_get_implicit_resultset oci_internal_debug oci_lob_copy oci_lob_is_equal oci_new_collection oci_new_connect oci_new_cursor oci_new_descriptor oci_num_fields oci_num_rows oci_parse oci_password_change oci_pconnect oci_result oci_rollback oci_server_version oci_set_action oci_set_client_identifier oci_set_client_info oci_set_edition oci_set_module_name oci_set_prefetch oci_statement_type oci_bind_array_by_name)
+          b["OPcache"] = Set.new %w(opcache_compile_file opcache_compile_file opcache_get_configuration opcache_get_status opcache_invalidate opcache_reset opcache_compile_file)
+          b["OpenAL"] = Set.new %w(openal_buffer_create openal_buffer_create openal_buffer_data openal_buffer_destroy openal_buffer_get openal_buffer_loadwav openal_context_create openal_context_current openal_context_destroy openal_context_process openal_context_suspend openal_device_close openal_device_open openal_listener_get openal_listener_set openal_source_create openal_source_destroy openal_source_get openal_source_pause openal_source_play openal_source_rewind openal_source_set openal_source_stop openal_stream openal_buffer_create)
+          b["OpenSSL"] = Set.new %w(openssl_cipher_iv_length openssl_cipher_iv_length openssl_csr_export_to_file openssl_csr_export openssl_csr_get_public_key openssl_csr_get_subject openssl_csr_new openssl_csr_sign openssl_decrypt openssl_dh_compute_key openssl_digest openssl_encrypt openssl_error_string openssl_free_key openssl_get_cipher_methods openssl_get_md_methods openssl_get_privatekey openssl_get_publickey openssl_open openssl_pbkdf2 openssl_pkcs12_export_to_file openssl_pkcs12_export openssl_pkcs12_read openssl_pkcs7_decrypt openssl_pkcs7_encrypt openssl_pkcs7_sign openssl_pkcs7_verify openssl_pkey_export_to_file openssl_pkey_export openssl_pkey_free openssl_pkey_get_details openssl_pkey_get_private openssl_pkey_get_public openssl_pkey_new openssl_private_decrypt openssl_private_encrypt openssl_public_decrypt openssl_public_encrypt openssl_random_pseudo_bytes openssl_seal openssl_sign openssl_spki_export_challenge openssl_spki_export openssl_spki_new openssl_spki_verify openssl_verify openssl_x509_check_private_key openssl_x509_checkpurpose openssl_x509_export_to_file openssl_x509_export openssl_x509_free openssl_x509_parse openssl_x509_read openssl_cipher_iv_length)
+          b["Output Control"] = Set.new %w(flush flush ob_clean ob_end_clean ob_end_flush ob_flush ob_get_clean ob_get_contents ob_get_flush ob_get_length ob_get_level ob_get_status ob_gzhandler ob_implicit_flush ob_list_handlers ob_start output_add_rewrite_var output_reset_rewrite_vars flush)
+          b["Ovrimos SQL"] = Set.new %w(ovrimos_close ovrimos_close ovrimos_commit ovrimos_connect ovrimos_cursor ovrimos_exec ovrimos_execute ovrimos_fetch_into ovrimos_fetch_row ovrimos_field_len ovrimos_field_name ovrimos_field_num ovrimos_field_type ovrimos_free_result ovrimos_longreadlen ovrimos_num_fields ovrimos_num_rows ovrimos_prepare ovrimos_result_all ovrimos_result ovrimos_rollback ovrimos_close)
+          b["Paradox"] = Set.new %w(px_close px_close px_create_fp px_date2string px_delete_record px_delete px_get_field px_get_info px_get_parameter px_get_record px_get_schema px_get_value px_insert_record px_new px_numfields px_numrecords px_open_fp px_put_record px_retrieve_record px_set_blob_file px_set_parameter px_set_tablename px_set_targetencoding px_set_value px_timestamp2string px_update_record px_close)
+          b["Parsekit"] = Set.new %w(parsekit_compile_file parsekit_compile_file parsekit_compile_string parsekit_func_arginfo parsekit_compile_file)
+          b["Password Hashing"] = Set.new %w(password_get_info password_get_info password_hash password_needs_rehash password_verify password_get_info)
+          b["PCNTL"] = Set.new %w(pcntl_alarm pcntl_alarm pcntl_errno pcntl_exec pcntl_fork pcntl_get_last_error pcntl_getpriority pcntl_setpriority pcntl_signal_dispatch pcntl_signal pcntl_sigprocmask pcntl_sigtimedwait pcntl_sigwaitinfo pcntl_strerror pcntl_wait pcntl_waitpid pcntl_wexitstatus pcntl_wifexited pcntl_wifsignaled pcntl_wifstopped pcntl_wstopsig pcntl_wtermsig pcntl_alarm)
+          b["PCRE"] = Set.new %w(preg_filter preg_filter preg_grep preg_last_error preg_match_all preg_match preg_quote preg_replace_callback preg_replace preg_split preg_filter)
+          b["PDF"] = Set.new %w(PDF_activate_item PDF_activate_item PDF_add_annotation PDF_add_bookmark PDF_add_launchlink PDF_add_locallink PDF_add_nameddest PDF_add_note PDF_add_outline PDF_add_pdflink PDF_add_table_cell PDF_add_textflow PDF_add_thumbnail PDF_add_weblink PDF_arc PDF_arcn PDF_attach_file PDF_begin_document PDF_begin_font PDF_begin_glyph PDF_begin_item PDF_begin_layer PDF_begin_page_ext PDF_begin_page PDF_begin_pattern PDF_begin_template_ext PDF_begin_template PDF_circle PDF_clip PDF_close_image PDF_close_pdi_page PDF_close_pdi PDF_close PDF_closepath_fill_stroke PDF_closepath_stroke PDF_closepath PDF_concat PDF_continue_text PDF_create_3dview PDF_create_action PDF_create_annotation PDF_create_bookmark PDF_create_field PDF_create_fieldgroup PDF_create_gstate PDF_create_pvf PDF_create_textflow PDF_curveto PDF_define_layer PDF_delete_pvf PDF_delete_table PDF_delete_textflow PDF_delete PDF_encoding_set_char PDF_end_document PDF_end_font PDF_end_glyph PDF_end_item PDF_end_layer PDF_end_page_ext PDF_end_page PDF_end_pattern PDF_end_template PDF_endpath PDF_fill_imageblock PDF_fill_pdfblock PDF_fill_stroke PDF_fill_textblock PDF_fill PDF_findfont PDF_fit_image PDF_fit_pdi_page PDF_fit_table PDF_fit_textflow PDF_fit_textline PDF_get_apiname PDF_get_buffer PDF_get_errmsg PDF_get_errnum PDF_get_font PDF_get_fontname PDF_get_fontsize PDF_get_image_height PDF_get_image_width PDF_get_majorversion PDF_get_minorversion PDF_get_parameter PDF_get_pdi_parameter PDF_get_pdi_value PDF_get_value PDF_info_font PDF_info_matchbox PDF_info_table PDF_info_textflow PDF_info_textline PDF_initgraphics PDF_lineto PDF_load_3ddata PDF_load_font PDF_load_iccprofile PDF_load_image PDF_makespotcolor PDF_moveto PDF_new PDF_open_ccitt PDF_open_file PDF_open_gif PDF_open_image_file PDF_open_image PDF_open_jpeg PDF_open_memory_image PDF_open_pdi_document PDF_open_pdi_page PDF_open_pdi PDF_open_tiff PDF_pcos_get_number PDF_pcos_get_stream PDF_pcos_get_string PDF_place_image PDF_place_pdi_page PDF_process_pdi PDF_rect PDF_restore PDF_resume_page PDF_rotate PDF_save PDF_scale PDF_set_border_color PDF_set_border_dash PDF_set_border_style PDF_set_char_spacing PDF_set_duration PDF_set_gstate PDF_set_horiz_scaling PDF_set_info_author PDF_set_info_creator PDF_set_info_keywords PDF_set_info_subject PDF_set_info_title PDF_set_info PDF_set_layer_dependency PDF_set_leading PDF_set_parameter PDF_set_text_matrix PDF_set_text_pos PDF_set_text_rendering PDF_set_text_rise PDF_set_value PDF_set_word_spacing PDF_setcolor PDF_setdash PDF_setdashpattern PDF_setflat PDF_setfont PDF_setgray_fill PDF_setgray_stroke PDF_setgray PDF_setlinecap PDF_setlinejoin PDF_setlinewidth PDF_setmatrix PDF_setmiterlimit PDF_setpolydash PDF_setrgbcolor_fill PDF_setrgbcolor_stroke PDF_setrgbcolor PDF_shading_pattern PDF_shading PDF_shfill PDF_show_boxed PDF_show_xy PDF_show PDF_skew PDF_stringwidth PDF_stroke PDF_suspend_page PDF_translate PDF_utf16_to_utf8 PDF_utf32_to_utf16 PDF_utf8_to_utf16 PDF_activate_item)
+          b["PostgreSQL"] = Set.new %w(pg_affected_rows pg_affected_rows pg_cancel_query pg_client_encoding pg_close pg_connect pg_connection_busy pg_connection_reset pg_connection_status pg_convert pg_copy_from pg_copy_to pg_dbname pg_delete pg_end_copy pg_escape_bytea pg_escape_identifier pg_escape_literal pg_escape_string pg_execute pg_fetch_all_columns pg_fetch_all pg_fetch_array pg_fetch_assoc pg_fetch_object pg_fetch_result pg_fetch_row pg_field_is_null pg_field_name pg_field_num pg_field_prtlen pg_field_size pg_field_table pg_field_type_oid pg_field_type pg_free_result pg_get_notify pg_get_pid pg_get_result pg_host pg_insert pg_last_error pg_last_notice pg_last_oid pg_lo_close pg_lo_create pg_lo_export pg_lo_import pg_lo_open pg_lo_read_all pg_lo_read pg_lo_seek pg_lo_tell pg_lo_truncate pg_lo_unlink pg_lo_write pg_meta_data pg_num_fields pg_num_rows pg_options pg_parameter_status pg_pconnect pg_ping pg_port pg_prepare pg_put_line pg_query_params pg_query pg_result_error_field pg_result_error pg_result_seek pg_result_status pg_select pg_send_execute pg_send_prepare pg_send_query_params pg_send_query pg_set_client_encoding pg_set_error_verbosity pg_trace pg_transaction_status pg_tty pg_unescape_bytea pg_untrace pg_update pg_version pg_affected_rows)
+          b["POSIX"] = Set.new %w(posix_access posix_access posix_ctermid posix_errno posix_get_last_error posix_getcwd posix_getegid posix_geteuid posix_getgid posix_getgrgid posix_getgrnam posix_getgroups posix_getlogin posix_getpgid posix_getpgrp posix_getpid posix_getppid posix_getpwnam posix_getpwuid posix_getrlimit posix_getsid posix_getuid posix_initgroups posix_isatty posix_kill posix_mkfifo posix_mknod posix_setegid posix_seteuid posix_setgid posix_setpgid posix_setsid posix_setuid posix_strerror posix_times posix_ttyname posix_uname posix_access)
+          b["Printer"] = Set.new %w(printer_abort printer_abort printer_close printer_create_brush printer_create_dc printer_create_font printer_create_pen printer_delete_brush printer_delete_dc printer_delete_font printer_delete_pen printer_draw_bmp printer_draw_chord printer_draw_elipse printer_draw_line printer_draw_pie printer_draw_rectangle printer_draw_roundrect printer_draw_text printer_end_doc printer_end_page printer_get_option printer_list printer_logical_fontheight printer_open printer_select_brush printer_select_font printer_select_pen printer_set_option printer_start_doc printer_start_page printer_write printer_abort)
+          b["Proctitle"] = Set.new %w(setproctitle setproctitle setthreadtitle setproctitle)
+          b["PS"] = Set.new %w(ps_add_bookmark ps_add_bookmark ps_add_launchlink ps_add_locallink ps_add_note ps_add_pdflink ps_add_weblink ps_arc ps_arcn ps_begin_page ps_begin_pattern ps_begin_template ps_circle ps_clip ps_close_image ps_close ps_closepath_stroke ps_closepath ps_continue_text ps_curveto ps_delete ps_end_page ps_end_pattern ps_end_template ps_fill_stroke ps_fill ps_findfont ps_get_buffer ps_get_parameter ps_get_value ps_hyphenate ps_include_file ps_lineto ps_makespotcolor ps_moveto ps_new ps_open_file ps_open_image_file ps_open_image ps_open_memory_image ps_place_image ps_rect ps_restore ps_rotate ps_save ps_scale ps_set_border_color ps_set_border_dash ps_set_border_style ps_set_info ps_set_parameter ps_set_text_pos ps_set_value ps_setcolor ps_setdash ps_setflat ps_setfont ps_setgray ps_setlinecap ps_setlinejoin ps_setlinewidth ps_setmiterlimit ps_setoverprintmode ps_setpolydash ps_shading_pattern ps_shading ps_shfill ps_show_boxed ps_show_xy2 ps_show_xy ps_show2 ps_show ps_string_geometry ps_stringwidth ps_stroke ps_symbol_name ps_symbol_width ps_symbol ps_translate ps_add_bookmark)
+          b["Pspell"] = Set.new %w(pspell_add_to_personal pspell_add_to_personal pspell_add_to_session pspell_check pspell_clear_session pspell_config_create pspell_config_data_dir pspell_config_dict_dir pspell_config_ignore pspell_config_mode pspell_config_personal pspell_config_repl pspell_config_runtogether pspell_config_save_repl pspell_new_config pspell_new_personal pspell_new pspell_save_wordlist pspell_store_replacement pspell_suggest pspell_add_to_personal)
+          b["qtdom"] = Set.new %w(qdom_error qdom_error qdom_tree qdom_error)
+          b["Radius"] = Set.new %w(radius_acct_open radius_acct_open radius_add_server radius_auth_open radius_close radius_config radius_create_request radius_cvt_addr radius_cvt_int radius_cvt_string radius_demangle_mppe_key radius_demangle radius_get_attr radius_get_tagged_attr_data radius_get_tagged_attr_tag radius_get_vendor_attr radius_put_addr radius_put_attr radius_put_int radius_put_string radius_put_vendor_addr radius_put_vendor_attr radius_put_vendor_int radius_put_vendor_string radius_request_authenticator radius_salt_encrypt_attr radius_send_request radius_server_secret radius_strerror radius_acct_open)
+          b["Rar"] = Set.new %w(rar_wrapper_cache_stats rar_wrapper_cache_stats rar_wrapper_cache_stats)
+          b["Readline"] = Set.new %w(readline_add_history readline_add_history readline_callback_handler_install readline_callback_handler_remove readline_callback_read_char readline_clear_history readline_completion_function readline_info readline_list_history readline_on_new_line readline_read_history readline_redisplay readline_write_history readline readline_add_history)
+          b["Recode"] = Set.new %w(recode_file recode_file recode_string recode recode_file)
+          b["POSIX Regex"] = Set.new %w(ereg_replace ereg_replace ereg eregi_replace eregi split spliti sql_regcase ereg_replace)
+          b["RPM Reader"] = Set.new %w(rpm_close rpm_close rpm_get_tag rpm_is_valid rpm_open rpm_version rpm_close)
+          b["RRD"] = Set.new %w(rrd_create rrd_create rrd_error rrd_fetch rrd_first rrd_graph rrd_info rrd_last rrd_lastupdate rrd_restore rrd_tune rrd_update rrd_version rrd_xport rrdc_disconnect rrd_create)
+          b["runkit"] = Set.new %w(runkit_class_adopt runkit_class_emancipate runkit_constant_add runkit_constant_redefine runkit_constant_remove runkit_function_add runkit_function_copy runkit_function_redefine runkit_function_remove runkit_function_rename runkit_import runkit_lint_file runkit_lint runkit_method_add runkit_method_copy runkit_method_redefine runkit_method_remove runkit_method_rename runkit_return_value_used runkit_sandbox_output_handler runkit_superglobals)
+          b["SAM"] = Set.new %w()
+          b["SCA"] = Set.new %w()
+          b["SDO DAS XML"] = Set.new %w()
+          b["SDO"] = Set.new %w()
+          b["SDO-DAS-Relational"] = Set.new %w()
+          b["Semaphore"] = Set.new %w(ftok ftok msg_get_queue msg_queue_exists msg_receive msg_remove_queue msg_send msg_set_queue msg_stat_queue sem_acquire sem_get sem_release sem_remove shm_attach shm_detach shm_get_var shm_has_var shm_put_var shm_remove_var shm_remove ftok)
+          b["Session PgSQL"] = Set.new %w(session_pgsql_add_error session_pgsql_add_error session_pgsql_get_error session_pgsql_get_field session_pgsql_reset session_pgsql_set_field session_pgsql_status session_pgsql_add_error)
+          b["Session"] = Set.new %w(session_cache_expire session_cache_expire session_cache_limiter session_commit session_decode session_destroy session_encode session_get_cookie_params session_id session_is_registered session_module_name session_name session_regenerate_id session_register_shutdown session_register session_save_path session_set_cookie_params session_set_save_handler session_start session_status session_unregister session_unset session_write_close session_cache_expire)
+          b["Shared Memory"] = Set.new %w(shmop_close shmop_close shmop_delete shmop_open shmop_read shmop_size shmop_write shmop_close)
+          b["SimpleXML"] = Set.new %w(simplexml_import_dom simplexml_import_dom simplexml_load_file simplexml_load_string simplexml_import_dom)
+          b["SNMP"] = Set.new %w(snmp_get_quick_print snmp_get_quick_print snmp_get_valueretrieval snmp_read_mib snmp_set_enum_print snmp_set_oid_numeric_print snmp_set_oid_output_format snmp_set_quick_print snmp_set_valueretrieval snmp2_get snmp2_getnext snmp2_real_walk snmp2_set snmp2_walk snmp3_get snmp3_getnext snmp3_real_walk snmp3_set snmp3_walk snmpget snmpgetnext snmprealwalk snmpset snmpwalk snmpwalkoid snmp_get_quick_print)
+          b["SOAP"] = Set.new %w(is_soap_fault is_soap_fault use_soap_error_handler is_soap_fault)
+          b["Socket"] = Set.new %w(socket_accept socket_accept socket_bind socket_clear_error socket_close socket_cmsg_space socket_connect socket_create_listen socket_create_pair socket_create socket_get_option socket_getpeername socket_getsockname socket_import_stream socket_last_error socket_listen socket_read socket_recv socket_recvfrom socket_recvmsg socket_select socket_send socket_sendmsg socket_sendto socket_set_block socket_set_nonblock socket_set_option socket_shutdown socket_strerror socket_write socket_accept)
+          b["Solr"] = Set.new %w(solr_get_version solr_get_version solr_get_version)
+          b["SPL"] = Set.new %w(class_implements class_implements class_parents class_uses iterator_apply iterator_count iterator_to_array spl_autoload_call spl_autoload_extensions spl_autoload_functions spl_autoload_register spl_autoload_unregister spl_autoload spl_classes spl_object_hash class_implements)
+          b["SPPLUS"] = Set.new %w(calcul_hmac calcul_hmac calculhmac nthmac signeurlpaiement calcul_hmac)
+          b["SQLite"] = Set.new %w(sqlite_array_query sqlite_array_query sqlite_busy_timeout sqlite_changes sqlite_close sqlite_column sqlite_create_aggregate sqlite_create_function sqlite_current sqlite_error_string sqlite_escape_string sqlite_exec sqlite_factory sqlite_fetch_all sqlite_fetch_array sqlite_fetch_column_types sqlite_fetch_object sqlite_fetch_single sqlite_fetch_string sqlite_field_name sqlite_has_more sqlite_has_prev sqlite_key sqlite_last_error sqlite_last_insert_rowid sqlite_libencoding sqlite_libversion sqlite_next sqlite_num_fields sqlite_num_rows sqlite_open sqlite_popen sqlite_prev sqlite_query sqlite_rewind sqlite_seek sqlite_single_query sqlite_udf_decode_binary sqlite_udf_encode_binary sqlite_unbuffered_query sqlite_valid sqlite_array_query)
+          b["SQLSRV"] = Set.new %w(sqlsrv_begin_transaction sqlsrv_begin_transaction sqlsrv_cancel sqlsrv_client_info sqlsrv_close sqlsrv_commit sqlsrv_configure sqlsrv_connect sqlsrv_errors sqlsrv_execute sqlsrv_fetch_array sqlsrv_fetch_object sqlsrv_fetch sqlsrv_field_metadata sqlsrv_free_stmt sqlsrv_get_config sqlsrv_get_field sqlsrv_has_rows sqlsrv_next_result sqlsrv_num_fields sqlsrv_num_rows sqlsrv_prepare sqlsrv_query sqlsrv_rollback sqlsrv_rows_affected sqlsrv_send_stream_data sqlsrv_server_info sqlsrv_begin_transaction)
+          b["ssdeep"] = Set.new %w(ssdeep_fuzzy_compare ssdeep_fuzzy_compare ssdeep_fuzzy_hash_filename ssdeep_fuzzy_hash ssdeep_fuzzy_compare)
+          b["SSH2"] = Set.new %w(ssh2_auth_agent ssh2_auth_agent ssh2_auth_hostbased_file ssh2_auth_none ssh2_auth_password ssh2_auth_pubkey_file ssh2_connect ssh2_exec ssh2_fetch_stream ssh2_fingerprint ssh2_methods_negotiated ssh2_publickey_add ssh2_publickey_init ssh2_publickey_list ssh2_publickey_remove ssh2_scp_recv ssh2_scp_send ssh2_sftp_chmod ssh2_sftp_lstat ssh2_sftp_mkdir ssh2_sftp_readlink ssh2_sftp_realpath ssh2_sftp_rename ssh2_sftp_rmdir ssh2_sftp_stat ssh2_sftp_symlink ssh2_sftp_unlink ssh2_sftp ssh2_shell ssh2_tunnel ssh2_auth_agent)
+          b["Statistic"] = Set.new %w(stats_absolute_deviation stats_absolute_deviation stats_cdf_beta stats_cdf_binomial stats_cdf_cauchy stats_cdf_chisquare stats_cdf_exponential stats_cdf_f stats_cdf_gamma stats_cdf_laplace stats_cdf_logistic stats_cdf_negative_binomial stats_cdf_noncentral_chisquare stats_cdf_noncentral_f stats_cdf_poisson stats_cdf_t stats_cdf_uniform stats_cdf_weibull stats_covariance stats_den_uniform stats_dens_beta stats_dens_cauchy stats_dens_chisquare stats_dens_exponential stats_dens_f stats_dens_gamma stats_dens_laplace stats_dens_logistic stats_dens_negative_binomial stats_dens_normal stats_dens_pmf_binomial stats_dens_pmf_hypergeometric stats_dens_pmf_poisson stats_dens_t stats_dens_weibull stats_harmonic_mean stats_kurtosis stats_rand_gen_beta stats_rand_gen_chisquare stats_rand_gen_exponential stats_rand_gen_f stats_rand_gen_funiform stats_rand_gen_gamma stats_rand_gen_ibinomial_negative stats_rand_gen_ibinomial stats_rand_gen_int stats_rand_gen_ipoisson stats_rand_gen_iuniform stats_rand_gen_noncenral_chisquare stats_rand_gen_noncentral_f stats_rand_gen_noncentral_t stats_rand_gen_normal stats_rand_gen_t stats_rand_get_seeds stats_rand_phrase_to_seeds stats_rand_ranf stats_rand_setall stats_skew stats_standard_deviation stats_stat_binomial_coef stats_stat_correlation stats_stat_gennch stats_stat_independent_t stats_stat_innerproduct stats_stat_noncentral_t stats_stat_paired_t stats_stat_percentile stats_stat_powersum stats_variance stats_absolute_deviation)
+          b["Stomp"] = Set.new %w(stomp_connect_error stomp_connect_error stomp_version stomp_connect_error)
+          b["Stream"] = Set.new %w(set_socket_blocking set_socket_blocking stream_bucket_append stream_bucket_make_writeable stream_bucket_new stream_bucket_prepend stream_context_create stream_context_get_default stream_context_get_options stream_context_get_params stream_context_set_default stream_context_set_option stream_context_set_params stream_copy_to_stream stream_encoding stream_filter_append stream_filter_prepend stream_filter_register stream_filter_remove stream_get_contents stream_get_filters stream_get_line stream_get_meta_data stream_get_transports stream_get_wrappers stream_is_local stream_notification_callback stream_register_wrapper stream_resolve_include_path stream_select stream_set_blocking stream_set_chunk_size stream_set_read_buffer stream_set_timeout stream_set_write_buffer stream_socket_accept stream_socket_client stream_socket_enable_crypto stream_socket_get_name stream_socket_pair stream_socket_recvfrom stream_socket_sendto stream_socket_server stream_socket_shutdown stream_supports_lock stream_wrapper_register stream_wrapper_restore stream_wrapper_unregister set_socket_blocking)
+          b["String"] = Set.new %w(addcslashes addcslashes addslashes bin2hex chop chr chunk_split convert_cyr_string convert_uudecode convert_uuencode count_chars crc32 crypt echo explode fprintf get_html_translation_table hebrev hebrevc hex2bin html_entity_decode htmlentities htmlspecialchars_decode htmlspecialchars implode join lcfirst levenshtein localeconv ltrim md5_file md5 metaphone money_format nl_langinfo nl2br number_format ord parse_str print printf quoted_printable_decode quoted_printable_encode quotemeta rtrim setlocale sha1_file sha1 similar_text soundex sprintf sscanf str_getcsv str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split str_word_count strcasecmp strchr strcmp strcoll strcspn strip_tags stripcslashes stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk strpos strrchr strrev strripos strrpos strspn strstr strtok strtolower strtoupper strtr substr_compare substr_count substr_replace substr trim ucfirst ucwords vfprintf vprintf vsprintf wordwrap addcslashes)
+          b["SVN"] = Set.new %w(svn_add svn_add svn_auth_get_parameter svn_auth_set_parameter svn_blame svn_cat svn_checkout svn_cleanup svn_client_version svn_commit svn_delete svn_diff svn_export svn_fs_abort_txn svn_fs_apply_text svn_fs_begin_txn2 svn_fs_change_node_prop svn_fs_check_path svn_fs_contents_changed svn_fs_copy svn_fs_delete svn_fs_dir_entries svn_fs_file_contents svn_fs_file_length svn_fs_is_dir svn_fs_is_file svn_fs_make_dir svn_fs_make_file svn_fs_node_created_rev svn_fs_node_prop svn_fs_props_changed svn_fs_revision_prop svn_fs_revision_root svn_fs_txn_root svn_fs_youngest_rev svn_import svn_log svn_ls svn_mkdir svn_repos_create svn_repos_fs_begin_txn_for_commit svn_repos_fs_commit_txn svn_repos_fs svn_repos_hotcopy svn_repos_open svn_repos_recover svn_revert svn_status svn_update svn_add)
+          b["SWF"] = Set.new %w(swf_actiongeturl swf_actiongeturl swf_actiongotoframe swf_actiongotolabel swf_actionnextframe swf_actionplay swf_actionprevframe swf_actionsettarget swf_actionstop swf_actiontogglequality swf_actionwaitforframe swf_addbuttonrecord swf_addcolor swf_closefile swf_definebitmap swf_definefont swf_defineline swf_definepoly swf_definerect swf_definetext swf_endbutton swf_enddoaction swf_endshape swf_endsymbol swf_fontsize swf_fontslant swf_fonttracking swf_getbitmapinfo swf_getfontinfo swf_getframe swf_labelframe swf_lookat swf_modifyobject swf_mulcolor swf_nextid swf_oncondition swf_openfile swf_ortho2 swf_ortho swf_perspective swf_placeobject swf_polarview swf_popmatrix swf_posround swf_pushmatrix swf_removeobject swf_rotate swf_scale swf_setfont swf_setframe swf_shapearc swf_shapecurveto3 swf_shapecurveto swf_shapefillbitmapclip swf_shapefillbitmaptile swf_shapefilloff swf_shapefillsolid swf_shapelinesolid swf_shapelineto swf_shapemoveto swf_showframe swf_startbutton swf_startdoaction swf_startshape swf_startsymbol swf_textwidth swf_translate swf_viewport swf_actiongeturl)
+          b["Swish"] = Set.new %w()
+          b["Sybase"] = Set.new %w(sybase_affected_rows sybase_affected_rows sybase_close sybase_connect sybase_data_seek sybase_deadlock_retry_count sybase_fetch_array sybase_fetch_assoc sybase_fetch_field sybase_fetch_object sybase_fetch_row sybase_field_seek sybase_free_result sybase_get_last_message sybase_min_client_severity sybase_min_error_severity sybase_min_message_severity sybase_min_server_severity sybase_num_fields sybase_num_rows sybase_pconnect sybase_query sybase_result sybase_select_db sybase_set_message_handler sybase_unbuffered_query sybase_affected_rows)
+          b["Taint"] = Set.new %w(is_tainted is_tainted taint untaint is_tainted)
+          b["TCP"] = Set.new %w(tcpwrap_check tcpwrap_check tcpwrap_check)
+          b["Tidy"] = Set.new %w(ob_tidyhandler ob_tidyhandler tidy_access_count tidy_config_count tidy_error_count tidy_get_output tidy_load_config tidy_reset_config tidy_save_config tidy_set_encoding tidy_setopt tidy_warning_count ob_tidyhandler)
+          b["Tokenizer"] = Set.new %w(token_get_all token_get_all token_name token_get_all)
+          b["Trader"] = Set.new %w(trader_acos trader_acos trader_ad trader_add trader_adosc trader_adx trader_adxr trader_apo trader_aroon trader_aroonosc trader_asin trader_atan trader_atr trader_avgprice trader_bbands trader_beta trader_bop trader_cci trader_cdl2crows trader_cdl3blackcrows trader_cdl3inside trader_cdl3linestrike trader_cdl3outside trader_cdl3starsinsouth trader_cdl3whitesoldiers trader_cdlabandonedbaby trader_cdladvanceblock trader_cdlbelthold trader_cdlbreakaway trader_cdlclosingmarubozu trader_cdlconcealbabyswall trader_cdlcounterattack trader_cdldarkcloudcover trader_cdldoji trader_cdldojistar trader_cdldragonflydoji trader_cdlengulfing trader_cdleveningdojistar trader_cdleveningstar trader_cdlgapsidesidewhite trader_cdlgravestonedoji trader_cdlhammer trader_cdlhangingman trader_cdlharami trader_cdlharamicross trader_cdlhighwave trader_cdlhikkake trader_cdlhikkakemod trader_cdlhomingpigeon trader_cdlidentical3crows trader_cdlinneck trader_cdlinvertedhammer trader_cdlkicking trader_cdlkickingbylength trader_cdlladderbottom trader_cdllongleggeddoji trader_cdllongline trader_cdlmarubozu trader_cdlmatchinglow trader_cdlmathold trader_cdlmorningdojistar trader_cdlmorningstar trader_cdlonneck trader_cdlpiercing trader_cdlrickshawman trader_cdlrisefall3methods trader_cdlseparatinglines trader_cdlshootingstar trader_cdlshortline trader_cdlspinningtop trader_cdlstalledpattern trader_cdlsticksandwich trader_cdltakuri trader_cdltasukigap trader_cdlthrusting trader_cdltristar trader_cdlunique3river trader_cdlupsidegap2crows trader_cdlxsidegap3methods trader_ceil trader_cmo trader_correl trader_cos trader_cosh trader_dema trader_div trader_dx trader_ema trader_errno trader_exp trader_floor trader_get_compat trader_get_unstable_period trader_ht_dcperiod trader_ht_dcphase trader_ht_phasor trader_ht_sine trader_ht_trendline trader_ht_trendmode trader_kama trader_linearreg_angle trader_linearreg_intercept trader_linearreg_slope trader_linearreg trader_ln trader_log10 trader_ma trader_macd trader_macdext trader_macdfix trader_mama trader_mavp trader_max trader_maxindex trader_medprice trader_mfi trader_midpoint trader_midprice trader_min trader_minindex trader_minmax trader_minmaxindex trader_minus_di trader_minus_dm trader_mom trader_mult trader_natr trader_obv trader_plus_di trader_plus_dm trader_ppo trader_roc trader_rocp trader_rocr100 trader_rocr trader_rsi trader_sar trader_sarext trader_set_compat trader_set_unstable_period trader_sin trader_sinh trader_sma trader_sqrt trader_stddev trader_stoch trader_stochf trader_stochrsi trader_sub trader_sum trader_t3 trader_tan trader_tanh trader_tema trader_trange trader_trima trader_trix trader_tsf trader_typprice trader_ultosc trader_var trader_wclprice trader_willr trader_wma trader_acos)
+          b["ODBC"] = Set.new %w(odbc_autocommit odbc_autocommit odbc_binmode odbc_close_all odbc_close odbc_columnprivileges odbc_columns odbc_commit odbc_connect odbc_cursor odbc_data_source odbc_do odbc_error odbc_errormsg odbc_exec odbc_execute odbc_fetch_array odbc_fetch_into odbc_fetch_object odbc_fetch_row odbc_field_len odbc_field_name odbc_field_num odbc_field_precision odbc_field_scale odbc_field_type odbc_foreignkeys odbc_free_result odbc_gettypeinfo odbc_longreadlen odbc_next_result odbc_num_fields odbc_num_rows odbc_pconnect odbc_prepare odbc_primarykeys odbc_procedurecolumns odbc_procedures odbc_result_all odbc_result odbc_rollback odbc_setoption odbc_specialcolumns odbc_statistics odbc_tableprivileges odbc_tables odbc_autocommit)
+          b["Uopz"] = Set.new %w(uopz_backup uopz_backup uopz_compose uopz_copy uopz_delete uopz_extend uopz_flags uopz_function uopz_implement uopz_overload uopz_redefine uopz_rename uopz_restore uopz_undefine uopz_backup)
+          b["URL"] = Set.new %w(base64_decode base64_decode base64_encode get_headers get_meta_tags http_build_query parse_url rawurldecode rawurlencode urldecode urlencode base64_decode)
+          b["Variable handling"] = Set.new %w(boolval boolval debug_zval_dump doubleval empty floatval get_defined_vars get_resource_type gettype import_request_variables intval is_array is_bool is_callable is_double is_float is_int is_integer is_long is_null is_numeric is_object is_real is_resource is_scalar is_string isset print_r serialize settype strval unserialize unset var_dump var_export boolval)
+          b["vpopmail"] = Set.new %w(vpopmail_add_alias_domain_ex vpopmail_add_alias_domain_ex vpopmail_add_alias_domain vpopmail_add_domain_ex vpopmail_add_domain vpopmail_add_user vpopmail_alias_add vpopmail_alias_del_domain vpopmail_alias_del vpopmail_alias_get_all vpopmail_alias_get vpopmail_auth_user vpopmail_del_domain_ex vpopmail_del_domain vpopmail_del_user vpopmail_error vpopmail_passwd vpopmail_set_user_quota vpopmail_add_alias_domain_ex)
+          b["W32api"] = Set.new %w(w32api_deftype w32api_deftype w32api_init_dtype w32api_invoke_function w32api_register_function w32api_set_call_method w32api_deftype)
+          b["WDDX"] = Set.new %w(wddx_add_vars wddx_add_vars wddx_deserialize wddx_packet_end wddx_packet_start wddx_serialize_value wddx_serialize_vars wddx_add_vars)
+          b["win32ps"] = Set.new %w(win32_ps_list_procs win32_ps_list_procs win32_ps_stat_mem win32_ps_stat_proc win32_ps_list_procs)
+          b["win32service"] = Set.new %w(win32_continue_service win32_continue_service win32_create_service win32_delete_service win32_get_last_control_message win32_pause_service win32_query_service_status win32_set_service_status win32_start_service_ctrl_dispatcher win32_start_service win32_stop_service win32_continue_service)
+          b["WinCache"] = Set.new %w(wincache_fcache_fileinfo wincache_fcache_fileinfo wincache_fcache_meminfo wincache_lock wincache_ocache_fileinfo wincache_ocache_meminfo wincache_refresh_if_changed wincache_rplist_fileinfo wincache_rplist_meminfo wincache_scache_info wincache_scache_meminfo wincache_ucache_add wincache_ucache_cas wincache_ucache_clear wincache_ucache_dec wincache_ucache_delete wincache_ucache_exists wincache_ucache_get wincache_ucache_inc wincache_ucache_info wincache_ucache_meminfo wincache_ucache_set wincache_unlock wincache_fcache_fileinfo)
+          b["xattr"] = Set.new %w(xattr_get xattr_get xattr_list xattr_remove xattr_set xattr_supported xattr_get)
+          b["xdiff"] = Set.new %w(xdiff_file_bdiff_size xdiff_file_bdiff_size xdiff_file_bdiff xdiff_file_bpatch xdiff_file_diff_binary xdiff_file_diff xdiff_file_merge3 xdiff_file_patch_binary xdiff_file_patch xdiff_file_rabdiff xdiff_string_bdiff_size xdiff_string_bdiff xdiff_string_bpatch xdiff_string_diff_binary xdiff_string_diff xdiff_string_merge3 xdiff_string_patch_binary xdiff_string_patch xdiff_string_rabdiff xdiff_file_bdiff_size)
+          b["Xhprof"] = Set.new %w(xhprof_disable xhprof_disable xhprof_enable xhprof_sample_disable xhprof_sample_enable xhprof_disable)
+          b["XML Parser"] = Set.new %w(utf8_decode utf8_decode utf8_encode xml_error_string xml_get_current_byte_index xml_get_current_column_number xml_get_current_line_number xml_get_error_code xml_parse_into_struct xml_parse xml_parser_create_ns xml_parser_create xml_parser_free xml_parser_get_option xml_parser_set_option xml_set_character_data_handler xml_set_default_handler xml_set_element_handler xml_set_end_namespace_decl_handler xml_set_external_entity_ref_handler xml_set_notation_decl_handler xml_set_object xml_set_processing_instruction_handler xml_set_start_namespace_decl_handler xml_set_unparsed_entity_decl_handler utf8_decode)
+          b["XML-RPC"] = Set.new %w(xmlrpc_decode_request xmlrpc_decode_request xmlrpc_decode xmlrpc_encode_request xmlrpc_encode xmlrpc_get_type xmlrpc_is_fault xmlrpc_parse_method_descriptions xmlrpc_server_add_introspection_data xmlrpc_server_call_method xmlrpc_server_create xmlrpc_server_destroy xmlrpc_server_register_introspection_callback xmlrpc_server_register_method xmlrpc_set_type xmlrpc_decode_request)
+          b["XMLWriter"] = Set.new %w(XMLWriter::endAttribute XMLWriter::endAttribute XMLWriter::endCData XMLWriter::endComment XMLWriter::endDocument XMLWriter::endDTDAttlist XMLWriter::endDTDElement XMLWriter::endDTDEntity XMLWriter::endDTD XMLWriter::endElement XMLWriter::endPI XMLWriter::flush XMLWriter::fullEndElement XMLWriter::openMemory XMLWriter::openURI XMLWriter::outputMemory XMLWriter::setIndentString XMLWriter::setIndent XMLWriter::startAttributeNS XMLWriter::startAttribute XMLWriter::startCData XMLWriter::startComment XMLWriter::startDocument XMLWriter::startDTDAttlist XMLWriter::startDTDElement XMLWriter::startDTDEntity XMLWriter::startDTD XMLWriter::startElementNS XMLWriter::startElement XMLWriter::startPI XMLWriter::text XMLWriter::writeAttributeNS XMLWriter::writeAttribute XMLWriter::writeCData XMLWriter::writeComment XMLWriter::writeDTDAttlist XMLWriter::writeDTDElement XMLWriter::writeDTDEntity XMLWriter::writeDTD XMLWriter::writeElementNS XMLWriter::writeElement XMLWriter::writePI XMLWriter::writeRaw XMLWriter::endAttribute)
+          b["XSLT (PHP 4)"] = Set.new %w(xslt_backend_info xslt_backend_info xslt_backend_name xslt_backend_version xslt_create xslt_errno xslt_error xslt_free xslt_getopt xslt_process xslt_set_base xslt_set_encoding xslt_set_error_handler xslt_set_log xslt_set_object xslt_set_sax_handler xslt_set_sax_handlers xslt_set_scheme_handler xslt_set_scheme_handlers xslt_setopt xslt_backend_info)
+          b["Yaml"] = Set.new %w(yaml_emit_file yaml_emit_file yaml_emit yaml_parse_file yaml_parse_url yaml_parse yaml_emit_file)
+          b["YAZ"] = Set.new %w(yaz_addinfo yaz_addinfo yaz_ccl_conf yaz_ccl_parse yaz_close yaz_connect yaz_database yaz_element yaz_errno yaz_error yaz_es_result yaz_es yaz_get_option yaz_hits yaz_itemorder yaz_present yaz_range yaz_record yaz_scan_result yaz_scan yaz_schema yaz_search yaz_set_option yaz_sort yaz_syntax yaz_wait yaz_addinfo)
+          b["Zip"] = Set.new %w(zip_close zip_close zip_entry_close zip_entry_compressedsize zip_entry_compressionmethod zip_entry_filesize zip_entry_name zip_entry_open zip_entry_read zip_open zip_read zip_close)
+          b["Zlib"] = Set.new %w(gzclose gzclose gzcompress gzdecode gzdeflate gzencode gzeof gzfile gzgetc gzgets gzgetss gzinflate gzopen gzpassthru gzputs gzread gzrewind gzseek gztell gzuncompress gzwrite readgzfile zlib_decode zlib_encode zlib_get_coding_type gzclose)
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/plain_text.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/plain_text.rb
new file mode 100644
index 0000000..43f257c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/plain_text.rb
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class PlainText < Lexer
+      title "Plain Text"
+      desc "A boring lexer that doesn't highlight anything"
+
+      tag 'plaintext'
+      aliases 'text'
+      filenames '*.txt'
+      mimetypes 'text/plain'
+
+      default_options :token => 'Text'
+
+      def token
+        @token ||= Token[option :token]
+      end
+
+      def stream_tokens(string, &b)
+        yield self.token, string
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/powershell.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/powershell.rb
new file mode 100755
index 0000000..d7bbc8a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/powershell.rb
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    load_lexer 'shell.rb'
+
+    class Powershell < Shell
+      title 'powershell'
+      desc 'powershell'
+      tag 'powershell'
+      aliases 'posh'
+      filenames '*.ps1', '*.psm1', '*.psd1'
+      mimetypes 'text/x-powershell'
+
+      ATTRIBUTES = %w(
+        CmdletBinding ConfirmImpact DefaultParameterSetName HelpURI SupportsPaging
+        SupportsShouldProcess PositionalBinding
+      ).join('|')
+
+      KEYWORDS = %w(
+        Begin Exit Process Break Filter Return Catch Finally Sequence Class For
+        Switch Continue ForEach Throw Data From Trap Define Function Try Do If
+        Until DynamicParam In Using Else InlineScript Var ElseIf Parallel While
+        End Param Workflow
+      ).join('|')
+
+      KEYWORDS_TYPE = %w(
+        bool byte char decimal double float int long object sbyte
+        short string uint ulong ushort
+      ).join('|')
+
+      OPERATORS = %w(
+        -split -isplit -csplit -join -is -isnot -as -eq -ieq -ceq -ne -ine
+        -cne -gt -igt -cgt -ge -ige -cge -lt -ilt -clt -le -ile -cle -like
+        -ilike -clike -notlike -inotlike -cnotlike -match -imatch -cmatch
+        -notmatch -inotmatch -cnotmatch -contains -icontains -ccontains
+        -notcontains -inotcontains -cnotcontains -replace -ireplace
+        -creplace -band -bor -bxor -and -or -xor \. & = \+= -= \*= \/= %=
+      ).join('|')
+
+      BUILTINS = %w(
+        Add-Content Add-History Add-Member Add-PSSnapin Clear-Content
+        Clear-Item Clear-Item Property Clear-Variable Compare-Object
+        ConvertFrom-SecureString Convert-Path ConvertTo-Html
+        ConvertTo-SecureString Copy-Item Copy-ItemProperty Export-Alias
+        Export-Clixml Export-Console Export-Csv ForEach-Object
+        Format-Custom Format-List Format-Table Format-Wide
+        Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem
+        Get-Command Get-Content Get-Credential Get-Culture Get-Date
+        Get-EventLog Get-ExecutionPolicy Get-Help Get-History
+        Get-Host Get-Item Get-ItemProperty Get-Location Get-Member
+        Get-PfxCertificate Get-Process Get-PSDrive Get-PSProvider
+        Get-PSSnapin Get-Service Get-TraceSource Get-UICulture
+        Get-Unique Get-Variable Get-WmiObject Group-Object
+        Import-Alias Import-Clixml Import-Csv Invoke-Expression
+        Invoke-History Invoke-Item Join-Path Measure-Command
+        Measure-Object Move-Item Move-ItemProperty New-Alias
+        New-Item New-ItemProperty New-Object New-PSDrive New-Service
+        New-TimeSpan New-Variable Out-Default Out-File Out-Host Out-Null
+        Out-Printer Out-String Pop-Location Push-Location Read-Host
+        Remove-Item Remove-ItemProperty Remove-PSDrive Remove-PSSnapin
+        Remove-Variable Rename-Item Rename-ItemProperty Resolve-Path
+        Restart-Service Resume-Service Select-Object Select-String
+        Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content Set-Date
+        Set-ExecutionPolicy Set-Item Set-ItemProperty Set-Location
+        Set-PSDebug Set-Service Set-TraceSource Set-Variable Sort-Object
+        Split-Path Start-Service Start-Sleep Start-Transcript Stop-Process
+        Stop-Service Stop-Transcript Suspend-Service Tee-Object Test-Path
+        Trace-Command Update-FormatData Update-TypeData Where-Object
+        Write-Debug Write-Error Write-Host Write-Output Write-Progress
+        Write-Verbose Write-Warning ac asnp cat cd chdir clc clear clhy
+        cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del
+        diff dir dnsn ebp echo epal epcsv epsn erase etsn exsn fc fl
+        foreach ft fw gal gbp gc gci gcm gcs gdr ghy gi gjb gl gm gmo
+        gp gps group gsn gsnp gsv gu gv gwmi h history icm iex ihy ii
+        ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure
+        mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps
+        pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp
+        rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc select
+        set shcm si sl sleep sls sort sp spjb spps spsv start sujb sv
+        swmi tee trcm type wget where wjb write \% \?
+      ).join('|')
+
+      prepend :basic do
+        rule %r(<#[\s,\S]*?#>)m, Comment::Multiline
+        rule /#.*$/, Comment::Single
+        rule /\b(#{OPERATORS})\s*\b/i, Operator
+        rule /\b(#{ATTRIBUTES})\s*\b/i, Name::Attribute
+        rule /\b(#{KEYWORDS})\s*\b/i, Keyword
+        rule /\b(#{KEYWORDS_TYPE})\s*\b/i, Keyword::Type
+        rule /\bcase\b/, Keyword, :case
+        rule /\b(#{BUILTINS})\s*\b(?!\.)/i, Name::Builtin
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/praat.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/praat.rb
new file mode 100644
index 0000000..089340c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/praat.rb
@@ -0,0 +1,347 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Praat < RegexLexer
+      title "Praat"
+      desc "The Praat scripting language (praat.org)"
+
+      tag 'praat'
+
+      filenames '*.praat', '*.proc', '*.psc'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'praat'
+      end
+
+      keywords = %w(
+        if then else elsif elif endif fi for from to endfor endproc while
+        endwhile repeat until select plus minus demo assert stopwatch
+        nocheck nowarn noprogress editor endeditor clearinfo
+      )
+
+      functions_string = %w(
+        backslashTrigraphsToUnicode chooseDirectory chooseReadFile
+        chooseWriteFile date demoKey do environment extractLine extractWord
+        fixed info left mid percent readFile replace replace_regex right
+        selected string unicodeToBackslashTrigraphs
+      )
+
+      functions_numeric = %w(
+        abs appendFile appendFileLine appendInfo appendInfoLine arccos arccosh
+        arcsin arcsinh arctan arctan2 arctanh barkToHertz beginPause
+        beginSendPraat besselI besselK beta beta2 binomialP binomialQ boolean
+        ceiling chiSquareP chiSquareQ choice comment cos cosh createDirectory
+        deleteFile demoClicked demoClickedIn demoCommandKeyPressed
+        demoExtraControlKeyPressed demoInput demoKeyPressed
+        demoOptionKeyPressed demoShiftKeyPressed demoShow demoWaitForInput
+        demoWindowTitle demoX demoY differenceLimensToPhon do editor endPause
+        endSendPraat endsWith erb erbToHertz erf erfc exitScript exp
+        extractNumber fileReadable fisherP fisherQ floor gaussP gaussQ
+        hertzToBark hertzToErb hertzToMel hertzToSemitones imax imin
+        incompleteBeta incompleteGammaP index index_regex integer invBinomialP
+        invBinomialQ invChiSquareQ invFisherQ invGaussQ invSigmoid invStudentQ
+        length ln lnBeta lnGamma log10 log2 max melToHertz min minusObject
+        natural number numberOfColumns numberOfRows numberOfSelected
+        objectsAreIdentical option optionMenu pauseScript
+        phonToDifferenceLimens plusObject positive randomBinomial randomGauss
+        randomInteger randomPoisson randomUniform real readFile removeObject
+        rindex rindex_regex round runScript runSystem runSystem_nocheck
+        selectObject selected semitonesToHertz sentence sentencetext sigmoid
+        sin sinc sincpi sinh soundPressureToPhon sqrt startsWith studentP
+        studentQ tan tanh text variableExists word writeFile writeFileLine
+        writeInfo writeInfoLine
+      )
+
+      functions_array = %w(
+        linear randomGauss randomInteger randomUniform zero
+      )
+
+      objects = %w(
+        Activation AffineTransform AmplitudeTier Art Artword Autosegment
+        BarkFilter BarkSpectrogram CCA Categories Cepstrogram Cepstrum
+        Cepstrumc ChebyshevSeries ClassificationTable Cochleagram Collection
+        ComplexSpectrogram Configuration Confusion ContingencyTable Corpus
+        Correlation Covariance CrossCorrelationTable CrossCorrelationTableList
+        CrossCorrelationTables DTW DataModeler Diagonalizer Discriminant
+        Dissimilarity Distance Distributions DurationTier EEG ERP ERPTier
+        EditCostsTable EditDistanceTable Eigen Excitation Excitations
+        ExperimentMFC FFNet FeatureWeights FileInMemory FilesInMemory Formant
+        FormantFilter FormantGrid FormantModeler FormantPoint FormantTier
+        GaussianMixture HMM HMM_Observation HMM_ObservationSequence HMM_State
+        HMM_StateSequence HMMObservation HMMObservationSequence HMMState
+        HMMStateSequence Harmonicity ISpline Index Intensity IntensityTier
+        IntervalTier KNN KlattGrid KlattTable LFCC LPC Label LegendreSeries
+        LinearRegression LogisticRegression LongSound Ltas MFCC MSpline ManPages
+        Manipulation Matrix MelFilter MelSpectrogram MixingMatrix Movie Network
+        OTGrammar OTHistory OTMulti PCA PairDistribution ParamCurve Pattern
+        Permutation Photo Pitch PitchModeler PitchTier PointProcess Polygon
+        Polynomial PowerCepstrogram PowerCepstrum Procrustes RealPoint RealTier
+        ResultsMFC Roots SPINET SSCP SVD Salience ScalarProduct Similarity
+        SimpleString SortedSetOfString Sound Speaker Spectrogram Spectrum
+        SpectrumTier SpeechSynthesizer SpellingChecker Strings StringsIndex
+        Table TableOfReal TextGrid TextInterval TextPoint TextTier Tier
+        Transition VocalTract VocalTractTier Weight WordList
+      )
+
+      variables_numeric = %w(
+        all average e left macintosh mono pi praatVersion right stereo
+        undefined unix windows
+      )
+
+      variables_string = %w(
+        praatVersion tab shellDirectory homeDirectory
+        preferencesDirectory newline temporaryDirectory
+        defaultDirectory
+      )
+
+      object_attributes = %w(
+        ncol nrow xmin ymin xmax ymax nx ny dx dy
+      )
+
+      state :root do
+        rule /(\s+)(#.*?$)/ do
+          groups Text, Comment::Single
+        end
+
+        rule /^#.*?$/,        Comment::Single
+        rule /;[^\n]*/,       Comment::Single
+        rule /\s+/,           Text
+        rule /\bprocedure\b/, Keyword,        :procedure_definition
+        rule /\bcall\b/,      Keyword,        :procedure_call
+        rule /@/,             Name::Function, :procedure_call
+
+        mixin :function_call
+
+        rule /\b(?:select all)\b/, Keyword
+        rule /\b(?:#{keywords.join('|')})\b/, Keyword
+
+        rule /(\bform\b)(\s+)([^\n]+)/ do
+          groups Keyword, Text, Literal::String
+          push :old_form
+        end
+
+        rule /(print(?:line|tab)?|echo|exit|asserterror|pause|send(?:praat|socket)|include|execute|system(?:_nocheck)?)(\s+)/ do
+          groups Keyword, Text
+          push :string_unquoted
+        end
+
+        rule /(goto|label)(\s+)(\w+)/ do
+          groups Keyword, Text, Name::Label
+        end
+
+        mixin :variable_name
+        mixin :number
+
+        rule /"/, Literal::String, :string
+
+        rule /\b(?:#{objects.join('|')})(?=\s+\S+\n)/, Name::Class, :string_unquoted
+
+        rule /\b(?=[A-Z])/, Text, :command
+        rule /(\.{3}|[)(,\$])/, Punctuation
+      end
+
+      state :command do
+        rule /( ?[\w()-]+ ?)/, Keyword
+        mixin :string_interpolated
+
+        rule /\.{3}/ do
+          token Keyword
+          pop!
+          push :old_arguments
+        end
+
+        rule /:/ do
+          token Keyword
+          pop!
+          push :comma_list
+        end
+
+        rule /[\s\n]/,    Text, :pop!
+      end
+
+      state :procedure_call do
+        rule /\s+/, Text
+
+        rule /([\w.]+)(:|\s*\()/ do
+          groups Name::Function, Punctuation
+          pop!
+        end
+
+        rule /([\w.]+)/ do
+          token Name::Function
+          pop!
+          push :old_arguments
+        end
+      end
+
+      state :procedure_definition do
+        rule /\s/, Text
+
+        rule /([\w.]+)(\s*?[(:])/ do
+          groups Name::Function, Text
+          pop!
+        end
+
+        rule /([\w.]+)([^\n]*)/ do
+          groups Name::Function, Text
+          pop!
+        end
+      end
+
+      state :function_call do
+        rule /\b(#{functions_string.join('|')})\$(?=\s*[:(])/, Name::Function, :function
+        rule /\b(#{functions_array.join('|')})#(?=\s*[:(])/,   Name::Function, :function
+        rule /\b(#{functions_numeric.join('|')})(?=\s*[:(])/,  Name::Function, :function
+      end
+
+      state :function do
+        rule /\s+/, Text
+
+        rule /(?::|\s*\()/ do
+          token Text
+          pop!
+          push :comma_list
+        end
+      end
+
+      state :comma_list do
+        rule /(\s*\n\s*)(\.{3})/ do
+          groups Text, Punctuation
+        end
+
+        rule /\s*[\])\n]/, Text, :pop!
+
+        rule /\s+/, Text
+        rule /"/,   Literal::String, :string
+        rule /\b(if|then|else|fi|endif)\b/, Keyword
+
+        mixin :function_call
+        mixin :variable_name
+        mixin :operator
+        mixin :number
+
+        rule /[()]/, Text
+        rule /,/, Punctuation
+      end
+
+      state :old_arguments do
+        rule /\n/, Text, :pop!
+
+        mixin :variable_name
+        mixin :operator
+        mixin :number
+
+        rule /"/, Literal::String, :string
+        rule /[^\n]/, Text
+      end
+
+      state :number do
+        rule /\n/, Text, :pop!
+        rule /\b\d+(\.\d*)?([eE][-+]?\d+)?%?/, Literal::Number
+      end
+
+      state :variable_name do
+        mixin :operator
+        mixin :number
+
+        rule /\b(?:#{variables_string.join('|')})\$/,  Name::Builtin
+        rule /\b(?:#{variables_numeric.join('|')})(?!\$)\b/, Name::Builtin
+
+        rule /\b(Object|#{objects.join('|')})_/ do
+          token Name::Builtin
+          push :object_reference
+        end
+
+        rule /\.?[a-z][a-zA-Z0-9_.]*(\$|#)?/, Text
+        rule /[\[\]]/, Text, :comma_list
+        mixin :string_interpolated
+      end
+
+      state :object_reference do
+        mixin :string_interpolated
+        rule /([a-z][a-zA-Z0-9_]*|\d+)/, Name::Builtin
+
+        rule /\.(#{object_attributes.join('|')})\b/, Name::Builtin, :pop!
+
+        rule /\$/, Name::Builtin
+        rule /\[/, Text, :pop!
+      end
+
+      state :operator do
+        # This rule incorrectly matches === or +++++, which are not operators
+        rule /([+\/*<>=!-]=?|[&*|][&*|]?|\^|<>)/,       Operator
+        rule /(?<![\w.])(and|or|not|div|mod)(?![\w.])/, Operator::Word
+      end
+
+      state :string_interpolated do
+        rule /'[\._a-z][^\[\]'":]*(\[([\d,]+|"[\w\d,]+")\])?(:[0-9]+)?'/, Literal::String::Interpol
+      end
+
+      state :string_unquoted do
+        rule /\n\s*\.{3}/, Punctuation
+        rule /\n/,         Text, :pop!
+        rule /\s/,         Text
+
+        mixin :string_interpolated
+
+        rule /'/,          Literal::String
+        rule /[^'\n]+/,    Literal::String
+      end
+
+      state :string do
+        rule /\n\s*\.{3}/, Punctuation
+        rule /"/,          Literal::String,           :pop!
+
+        mixin :string_interpolated
+
+        rule /'/,          Literal::String
+        rule /[^'"\n]+/,   Literal::String
+      end
+
+      state :old_form do
+        rule /(\s+)(#.*?$)/ do
+          groups Text, Comment::Single
+        end
+
+        rule /\s+/, Text
+
+        rule /(optionmenu|choice)([ \t]+\S+:[ \t]+)/ do
+          groups Keyword, Text
+          push :number
+        end
+
+        rule /(option|button)([ \t]+)/ do
+          groups Keyword, Text
+          push :string_unquoted
+        end
+
+        rule /(sentence|text)([ \t]+\S+)/ do
+          groups Keyword, Text
+          push :string_unquoted
+        end
+
+        rule /(word)([ \t]+\S+[ \t]*)(\S+)?([ \t]+.*)?/ do
+          groups Keyword, Text, Literal::String, Text
+        end
+
+        rule /(boolean)(\s+\S+\s*)(0|1|"?(?:yes|no)"?)/ do
+          groups Keyword, Text, Name::Variable
+        end
+
+        rule /(real|natural|positive|integer)([ \t]+\S+[ \t]*)([+-]?)/ do
+          groups Keyword, Text, Operator
+          push :number
+        end
+
+        rule /(comment)(\s+)/ do
+          groups Keyword, Text
+          push :string_unquoted
+        end
+
+        rule /\bendform\b/, Keyword, :pop!
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/prolog.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/prolog.rb
new file mode 100644
index 0000000..afdd766
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/prolog.rb
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Prolog < RegexLexer
+      title "Prolog"
+      desc "The Prolog programming language (http://en.wikipedia.org/wiki/Prolog)"
+      tag 'prolog'
+      aliases 'prolog'
+      filenames '*.pro', '*.P', '*.prolog', '*.pl'
+      mimetypes 'text/x-prolog'
+
+      def self.analyze_text(text)
+        return 0.1 if text =~ /\A\w+(\(\w+\,\s*\w+\))*\./
+        return 0.1 if text.include? ':-'
+      end
+
+      state :basic do
+        rule /\s+/, Text
+        rule /^#.*/, Comment::Single
+        rule /\/\*/, Comment::Multiline, :nested_comment
+
+        rule /[\[\](){}|.,;!]/, Punctuation
+        rule /:-|-->/, Punctuation
+
+        rule /"[^"]*"/, Str::Double
+
+        rule /\d+\.\d+/, Num::Float
+        rule /\d+/, Num
+      end
+
+      state :atoms do
+        rule /[[:lower:]]([_[:word:][:digit:]])*/, Str::Symbol
+        rule /'[^']*'/, Str::Symbol
+      end
+
+      state :operators do
+        rule /(<|>|=<|>=|==|=:=|=|\/|\/\/|\*|\+|-)(?=\s|[a-zA-Z0-9\[])/,
+          Operator
+        rule /is/, Operator
+        rule /(mod|div|not)/, Operator
+        rule /[#&*+-.\/:<=>?@^~]+/, Operator
+      end
+
+      state :variables do
+        rule /[A-Z]+\w*/, Name::Variable
+        rule /_[[:word:]]*/, Name::Variable
+      end
+
+      state :root do
+        mixin :basic
+        mixin :atoms
+        mixin :variables
+        mixin :operators
+      end
+
+      state :nested_comment do
+        rule /\/\*/, Comment::Multiline, :push
+        rule /\s*\*[^*\/]+/, Comment::Multiline
+        rule /\*\//, Comment::Multiline, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/properties.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/properties.rb
new file mode 100644
index 0000000..48b82b6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/properties.rb
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Properties < RegexLexer
+      title ".properties"
+      desc '.properties config files for Java'
+      tag 'properties'
+
+      filenames '*.properties'
+      mimetypes 'text/x-java-properties'
+
+      def self.analyze_text(text)
+        return 0.1 if text =~ /\A\[[\w.]+\]\s*\w+=\w+/
+      end
+
+      identifier = /[\w.]+/
+
+      state :basic do
+        rule /[!#].*?\n/, Comment
+        rule /\s+/, Text
+        rule /\\\n/, Str::Escape
+      end
+
+      state :root do
+        mixin :basic
+
+        rule /(#{identifier})(\s*)([=:])/ do
+          groups Name::Property, Text, Punctuation
+          push :value
+        end
+      end
+
+      state :value do
+        rule /\n/, Text, :pop!
+        mixin :basic
+        rule /"/, Str, :dq
+        rule /'.*?'/, Str
+        mixin :esc_str
+        rule /[^\\\n]+/, Str
+      end
+
+      state :dq do
+        rule /"/, Str, :pop!
+        mixin :esc_str
+        rule /[^\\"]+/m, Str
+      end
+
+      state :esc_str do
+        rule /\\u[0-9]{4}/, Str::Escape
+        rule /\\./m, Str::Escape
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/protobuf.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/protobuf.rb
new file mode 100644
index 0000000..dda6703
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/protobuf.rb
@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Protobuf < RegexLexer
+      title 'Protobuf'
+      desc 'Google\'s language-neutral, platform-neutral, extensible mechanism for serializing structured data'
+      tag 'protobuf'
+      aliases 'proto'
+      filenames '*.proto'
+      mimetypes 'text/x-proto'
+
+      kw = /\b(ctype|default|extensions|import|max|oneof|option|optional|packed|repeated|required|returns|rpc|to)\b/
+      datatype = /\b(bool|bytes|double|fixed32|fixed64|float|int32|int64|sfixed32|sfixed64|sint32|sint64|string|uint32|uint64)\b/
+
+      state :root do
+        rule /[\s]+/, Text
+        rule /[,;{}\[\]()]/, Punctuation
+        rule /\/(\\\n)?\/(\n|(.|\n)*?[^\\]\n)/, Comment::Single
+        rule /\/(\\\n)?\*(.|\n)*?\*(\\\n)?\//, Comment::Multiline
+        rule kw, Keyword
+        rule datatype, Keyword::Type
+        rule /true|false/, Keyword::Constant
+        rule /(package)(\s+)/ do
+          groups Keyword::Namespace, Text
+          push :package
+        end
+
+        rule /(message|extend)(\s+)/ do
+          groups Keyword::Declaration, Text
+          push :message
+        end
+
+        rule /(enum|group|service)(\s+)/ do
+          groups Keyword::Declaration, Text
+          push :type
+        end
+
+        rule /".*?"/, Str
+        rule /'.*?'/, Str
+        rule /(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*/, Num::Float
+        rule /(\d+\.\d*|\.\d+|\d+[fF])[fF]?/, Num::Float
+        rule /(\-?(inf|nan))\b/, Num::Float
+        rule /0x[0-9a-fA-F]+[LlUu]*/, Num::Hex
+        rule /0[0-7]+[LlUu]*/, Num::Oct
+        rule /\d+[LlUu]*/, Num::Integer
+        rule /[+-=]/, Operator
+        rule /([a-zA-Z_][\w.]*)([ \t]*)(=)/ do
+          groups Name::Attribute, Text, Operator
+        end
+        rule /[a-zA-Z_][\w.]*/, Name
+      end
+
+      state :package do
+        rule /[a-zA-Z_]\w*/, Name::Namespace, :pop!
+        rule (//) { pop! }
+      end
+
+      state :message do
+        rule /[a-zA-Z_]\w*/, Name::Class, :pop!
+        rule (//) { pop! }
+      end
+
+      state :type do
+        rule /[a-zA-Z_]\w*/, Name, :pop!
+        rule (//) { pop! }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/puppet.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/puppet.rb
new file mode 100644
index 0000000..d7c59cc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/puppet.rb
@@ -0,0 +1,128 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Puppet < RegexLexer
+      title "Puppet"
+      desc 'The Puppet configuration management language (puppetlabs.org)'
+      tag 'puppet'
+      aliases 'pp'
+      filenames '*.pp'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'puppet-apply'
+        return 1 if text.shebang? 'puppet'
+      end
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          and case class default define else elsif if in import inherits
+          node unless
+        )
+      end
+
+      def self.constants
+        @constants ||= Set.new %w(
+          false true undef
+        )
+      end
+
+      def self.metaparameters
+        @metaparameters ||= Set.new %w(
+          before require notify subscribe
+        )
+      end
+
+      id = /[a-z]\w*/
+      cap_id = /[A-Z]\w*/
+      qualname = /(::)?(#{id}::)*\w+/
+
+      state :whitespace do
+        rule /\s+/m, Text
+        rule /#.*?\n/, Comment
+      end
+
+      state :root do
+        mixin :whitespace
+
+        rule /[$]#{qualname}/, Name::Variable
+        rule /(#{id})(?=\s*[=+]>)/m do |m|
+          if self.class.metaparameters.include? m[0]
+            token Keyword::Pseudo
+          else
+            token Name::Property
+          end
+        end
+
+        rule /(#{qualname})(?=\s*[(])/m, Name::Function
+        rule cap_id, Name::Class
+
+        rule /[+=|~-]>|<[|~-]/, Punctuation
+        rule /[:}();\[\]]/, Punctuation
+
+        # HACK for case statements and selectors
+        rule /{/, Punctuation, :regex_allowed
+        rule /,/, Punctuation, :regex_allowed
+
+        rule /(in|and|or)\b/, Operator::Word
+        rule /[=!<>]=/, Operator
+        rule /[=!]~/, Operator, :regex_allowed
+        rule %r([<>!+*/-]), Operator
+
+        rule /(class|include)(\s*)(#{qualname})/ do
+          groups Keyword, Text, Name::Class
+        end
+
+        rule /node\b/, Keyword, :regex_allowed
+
+        rule /'(\\[\\']|[^'])*'/m, Str::Single
+        rule /"/, Str::Double, :dquotes
+
+        rule /\d+([.]\d+)?(e[+-]\d+)?/, Num
+
+        # a valid regex.  TODO: regexes are only allowed
+        # in certain places in puppet.
+        rule qualname do |m|
+          if self.class.keywords.include? m[0]
+            token Keyword
+          elsif self.class.constants.include? m[0]
+            token Keyword::Constant
+          else
+            token Name
+          end
+        end
+      end
+
+      state :regex_allowed do
+        mixin :whitespace
+        rule %r(/), Str::Regex, :regex
+
+        rule(//) { pop! }
+      end
+
+      state :regex do
+        rule %r(/), Str::Regex, :pop!
+        rule /\\./, Str::Escape
+        rule /[(){}]/, Str::Interpol
+        rule /\[/, Str::Interpol, :regex_class
+        rule /./, Str::Regex
+      end
+
+      state :regex_class do
+        rule /\]/, Str::Interpol, :pop!
+        rule /(?<!\[)-(?=\])/, Str::Regex
+        rule /-/, Str::Interpol
+        rule /\\./, Str::Escape
+        rule /[^\\\]-]+/, Str::Regex
+      end
+
+      state :dquotes do
+        rule /"/, Str::Double, :pop!
+        rule /[^$\\"]+/m, Str::Double
+        rule /\\./m, Str::Escape
+        rule /[$]#{qualname}/, Name::Variable
+        rule /[$][{]#{qualname}[}]/, Name::Variable
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/python.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/python.rb
new file mode 100644
index 0000000..8072171
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/python.rb
@@ -0,0 +1,251 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Python < RegexLexer
+      title "Python"
+      desc "The Python programming language (python.org)"
+      tag 'python'
+      aliases 'py'
+      filenames '*.py', '*.pyw', '*.sc', 'SConstruct', 'SConscript', '*.tac'
+      mimetypes 'text/x-python', 'application/x-python'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang?(/pythonw?(3|2(\.\d)?)?/)
+      end
+
+      def self.keywords
+        @keywords ||= %w(
+          assert break continue del elif else except exec
+          finally for global if lambda pass print raise
+          return try while yield as with
+        )
+      end
+
+      def self.builtins
+        @builtins ||= %w(
+          __import__ abs all any apply basestring bin bool buffer
+          bytearray bytes callable chr classmethod cmp coerce compile
+          complex delattr dict dir divmod enumerate eval execfile exit
+          file filter float frozenset getattr globals hasattr hash hex id
+          input int intern isinstance issubclass iter len list locals
+          long map max min next object oct open ord pow property range
+          raw_input reduce reload repr reversed round set setattr slice
+          sorted staticmethod str sum super tuple type unichr unicode
+          vars xrange zip
+        )
+      end
+
+      def self.builtins_pseudo
+        @builtins_pseudo ||= %w(self None Ellipsis NotImplemented False True)
+      end
+
+      def self.exceptions
+        @exceptions ||= %w(
+          ArithmeticError AssertionError AttributeError
+          BaseException DeprecationWarning EOFError EnvironmentError
+          Exception FloatingPointError FutureWarning GeneratorExit IOError
+          ImportError ImportWarning IndentationError IndexError KeyError
+          KeyboardInterrupt LookupError MemoryError NameError
+          NotImplemented NotImplementedError OSError OverflowError
+          OverflowWarning PendingDeprecationWarning ReferenceError
+          RuntimeError RuntimeWarning StandardError StopIteration
+          SyntaxError SyntaxWarning SystemError SystemExit TabError
+          TypeError UnboundLocalError UnicodeDecodeError
+          UnicodeEncodeError UnicodeError UnicodeTranslateError
+          UnicodeWarning UserWarning ValueError VMSError Warning
+          WindowsError ZeroDivisionError
+        )
+      end
+
+      identifier =        /[a-z_][a-z0-9_]*/i
+      dotted_identifier = /[a-z_.][a-z0-9_.]*/i
+      state :root do
+        rule /\n+/m, Text
+        rule /^(:)(\s*)([ru]{,2}""".*?""")/mi do
+          groups Punctuation, Text, Str::Doc
+        end
+
+        rule /[^\S\n]+/, Text
+        rule /#.*$/, Comment
+        rule /[\[\]{}:(),;]/, Punctuation
+        rule /\\\n/, Text
+        rule /\\/, Text
+
+        rule /(in|is|and|or|not)\b/, Operator::Word
+        rule /!=|==|<<|>>|[-~+\/*%=<>&^|.]/, Operator
+
+        rule /(def)((?:\s|\\\s)+)/ do
+          groups Keyword, Text
+          push :funcname
+        end
+
+        rule /(class)((?:\s|\\\s)+)/ do
+          groups Keyword, Text
+          push :classname
+        end
+
+        rule /(yield)((?:\s|\\\s)+)/ do
+           groups Keyword, Text
+           push :raise
+        end
+
+        rule /(raise)((?:\s|\\\s)+)/ do
+           groups Keyword, Text
+           push :raise
+        end
+
+        rule /(from)((?:\s|\\\s)+)/ do
+          groups Keyword::Namespace, Text
+          push :fromimport
+        end
+
+        rule /(import)((?:\s|\\\s)+)/ do
+          groups Keyword::Namespace, Text
+          push :import
+        end
+
+        # TODO: not in python 3
+        rule /`.*?`/, Str::Backtick
+        rule /(?:r|ur|ru)"""/i, Str, :tdqs
+        rule /(?:r|ur|ru)'''/i, Str, :tsqs
+        rule /(?:r|ur|ru)"/i,   Str, :dqs
+        rule /(?:r|ur|ru)'/i,   Str, :sqs
+        rule /u?"""/i,          Str, :escape_tdqs
+        rule /u?'''/i,          Str, :escape_tsqs
+        rule /u?"/i,            Str, :escape_dqs
+        rule /u?'/i,            Str, :escape_sqs
+
+        rule /@#{dotted_identifier}/i, Name::Decorator
+
+        # using negative lookbehind so we don't match property names
+        rule /(?<!\.)#{identifier}/ do |m|
+          if self.class.keywords.include? m[0]
+            token Keyword
+          elsif self.class.exceptions.include? m[0]
+            token Name::Builtin
+          elsif self.class.builtins.include? m[0]
+            token Name::Builtin
+          elsif self.class.builtins_pseudo.include? m[0]
+            token Name::Builtin::Pseudo
+          else
+            token Name
+          end
+        end
+
+        rule identifier, Name
+
+        rule /(\d+\.\d*|\d*\.\d+)(e[+-]?[0-9]+)?/i, Num::Float
+        rule /\d+e[+-]?[0-9]+/i, Num::Float
+        rule /0[0-7]+/, Num::Oct
+        rule /0x[a-f0-9]+/i, Num::Hex
+        rule /\d+L/, Num::Integer::Long
+        rule /\d+/, Num::Integer
+      end
+
+      state :funcname do
+        rule identifier, Name::Function, :pop!
+      end
+
+      state :classname do
+        rule identifier, Name::Class, :pop!
+      end
+
+      state :raise do
+        rule /from\b/, Keyword
+        rule /raise\b/, Keyword
+        rule /yield\b/, Keyword
+        rule /\n/, Text, :pop!
+        rule /;/, Punctuation, :pop!
+        mixin :root
+      end
+
+      state :yield do
+        mixin :raise
+      end
+
+      state :import do
+        # non-line-terminating whitespace
+        rule /(?:[ \t]|\\\n)+/, Text
+
+        rule /as\b/, Keyword::Namespace
+        rule /,/, Operator
+        rule dotted_identifier, Name::Namespace
+        rule(//) { pop! } # anything else -> go back
+      end
+
+      state :fromimport do
+        # non-line-terminating whitespace
+        rule /(?:[ \t]|\\\n)+/, Text
+
+        rule /import\b/, Keyword::Namespace, :pop!
+        rule dotted_identifier, Name::Namespace
+      end
+
+      state :strings do
+        rule /%(\([a-z0-9_]+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?/i, Str::Interpol
+      end
+
+      state :strings_double do
+        rule /[^\\"%\n]+/, Str
+        mixin :strings
+      end
+
+      state :strings_single do
+        rule /[^\\'%\n]+/, Str
+        mixin :strings
+      end
+
+      state :nl do
+        rule /\n/, Str
+      end
+
+      state :escape do
+        rule %r(\\
+          ( [\\abfnrtv"']
+          | \n
+          | N{.*?}
+          | u[a-fA-F0-9]{4}
+          | U[a-fA-F0-9]{8}
+          | x[a-fA-F0-9]{2}
+          | [0-7]{1,3}
+          )
+        )x, Str::Escape
+      end
+
+      state :dqs do
+        rule /"/, Str, :pop!
+        rule /\\\\|\\"|\\\n/, Str::Escape
+        mixin :strings_double
+      end
+
+      state :sqs do
+        rule /'/, Str, :pop!
+        rule /\\\\|\\'|\\\n/, Str::Escape
+        mixin :strings_single
+      end
+
+      state :tdqs do
+        rule /"""/, Str, :pop!
+        rule /"/, Str
+        mixin :strings_double
+        mixin :nl
+      end
+
+      state :tsqs do
+        rule /'''/, Str, :pop!
+        rule /'/, Str
+        mixin :strings_single
+        mixin :nl
+      end
+
+      %w(tdqs tsqs dqs sqs).each do |qtype|
+        state :"escape_#{qtype}" do
+          mixin :escape
+          mixin :"#{qtype}"
+        end
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/qml.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/qml.rb
new file mode 100644
index 0000000..51dbac7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/qml.rb
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    load_lexer 'javascript.rb'
+
+    class Qml < Javascript
+      title "QML"
+      desc 'QML, a UI markup language'
+      tag 'qml'
+      aliases 'qml'
+      filenames '*.qml'
+
+      mimetypes 'application/x-qml', 'text/x-qml'
+
+      id_with_dots = /[$a-zA-Z_][a-zA-Z0-9_.]*/
+
+      prepend :root do
+        rule /(#{id_with_dots})(\s*)({)/ do
+          groups Keyword::Type, Text, Punctuation
+          push :type_block
+        end
+        rule /(#{id_with_dots})(\s+)(on)(\s+)(#{id_with_dots})(\s*)({)/ do
+          groups Keyword::Type, Text, Keyword, Text, Name::Label, Text, Punctuation
+          push :type_block
+        end
+
+        rule /[{]/, Punctuation, :push
+      end
+
+      state :type_block do
+        rule /(id)(\s*)(:)(\s*)(#{id_with_dots})/ do
+          groups Name::Label, Text, Punctuation, Text, Keyword::Declaration
+        end
+
+        rule /(#{id_with_dots})(\s*)(:)/ do
+          groups Name::Label, Text, Punctuation
+          push :expr_start
+        end
+
+        rule /(signal)(\s+)(#{id_with_dots})/ do
+          groups Keyword::Declaration, Text, Name::Label
+          push :signal
+        end
+
+        rule /(property)(\s+)(#{id_with_dots})(\s+)(#{id_with_dots})(\s*)(:?)/ do
+          groups Keyword::Declaration, Text, Keyword::Type, Text, Name::Label, Text, Punctuation
+          push :expr_start
+        end
+
+        rule /[}]/, Punctuation, :pop!
+        mixin :root
+      end
+
+      state :signal do
+        mixin :comments_and_whitespace
+        rule /\(/ do
+          token Punctuation
+          goto :signal_args
+        end
+        rule //, Text, :pop!
+      end
+
+      state :signal_args do
+        mixin :comments_and_whitespace
+        rule /(#{id_with_dots})(\s+)(#{id_with_dots})(\s*)(,?)/ do
+          groups Keyword::Type, Text, Name, Text, Punctuation
+        end
+        rule /\)/ , Punctuation, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/r.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/r.rb
new file mode 100644
index 0000000..e70e896
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/r.rb
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class R < RegexLexer
+      title "R"
+      desc 'The R statistics language (r-project.org)'
+      tag 'r'
+      aliases 'r', 'R', 's', 'S'
+      filenames '*.R', '*.r', '.Rhistory', '.Rprofile'
+      mimetypes 'text/x-r-source', 'text/x-r', 'text/x-R'
+
+      mimetypes 'text/x-r', 'application/x-r'
+
+      KEYWORDS = %w(if else for while repeat in next break function)
+
+      KEYWORD_CONSTANTS = %w(
+        NULL Inf TRUE FALSE NaN NA
+        NA_integer_ NA_real_ NA_complex_ NA_character_
+      )
+
+      BUILTIN_CONSTANTS = %w(LETTERS letters month.abb month.name pi T F)
+
+      # These are all the functions in `base` that are implemented as a
+      # `.Primitive`, minus those functions that are also keywords.
+      PRIMITIVE_FUNCTIONS = %w(
+        abs acos acosh all any anyNA Arg as.call as.character
+        as.complex as.double as.environment as.integer as.logical
+        as.null.default as.numeric as.raw asin asinh atan atanh attr
+        attributes baseenv browser c call ceiling class Conj cos cosh
+        cospi cummax cummin cumprod cumsum digamma dim dimnames
+        emptyenv exp expression floor forceAndCall gamma gc.time
+        globalenv Im interactive invisible is.array is.atomic is.call
+        is.character is.complex is.double is.environment is.expression
+        is.finite is.function is.infinite is.integer is.language
+        is.list is.logical is.matrix is.na is.name is.nan is.null
+        is.numeric is.object is.pairlist is.raw is.recursive is.single
+        is.symbol lazyLoadDBfetch length lgamma list log max min
+        missing Mod names nargs nzchar oldClass on.exit pos.to.env
+        proc.time prod quote range Re rep retracemem return round
+        seq_along seq_len seq.int sign signif sin sinh sinpi sqrt
+        standardGeneric substitute sum switch tan tanh tanpi tracemem
+        trigamma trunc unclass untracemem UseMethod xtfrm
+      )
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'Rscript'
+      end
+
+      state :root do
+        rule /#'.*?\n/, Comment::Doc
+        rule /#.*?\n/, Comment::Single
+        rule /\s+/m, Text::Whitespace
+
+        rule /`[^`]+?`/, Name
+        rule /'(\\.|.)*?'/m, Str::Single
+        rule /"(\\.|.)*?"/m, Str::Double
+
+        rule /%[^%]*?%/, Operator
+
+        rule /0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?/, Num::Hex
+        rule /[+-]?(\d+([.]\d+)?|[.]\d+)([eE][+-]?\d+)?[Li]?/,
+          Num
+
+        # Only recognize built-in functions when they are actually used as a
+        # function call, i.e. followed by an opening parenthesis.
+        # `Name::Builtin` would be more logical, but is usually not
+        # highlighted specifically; thus use `Name::Function`.
+        rule /\b(?<!.)(#{PRIMITIVE_FUNCTIONS.join('|')})(?=\()/, Name::Function
+
+        rule /[a-zA-Z.]([a-zA-Z_][\w.]*)?/ do |m|
+          if KEYWORDS.include? m[0]
+            token Keyword
+          elsif KEYWORD_CONSTANTS.include? m[0]
+            token Keyword::Constant
+          elsif BUILTIN_CONSTANTS.include? m[0]
+            token Name::Builtin
+          else
+            token Name
+          end
+        end
+
+        rule /[\[\]{}();,]/, Punctuation
+
+        rule %r([-<>?*+^/!=~$@:%&|]), Operator
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/racket.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/racket.rb
new file mode 100644
index 0000000..242d283
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/racket.rb
@@ -0,0 +1,542 @@
+# -*- coding: utf-8 -*- #
+module Rouge
+  module Lexers
+    class Racket < RegexLexer
+      title "Racket"
+      desc "Racket is a Lisp descended from Scheme (racket-lang.org)"
+
+      tag 'racket'
+      filenames '*.rkt', '*.rktd', '*.rktl'
+      mimetypes 'text/x-racket', 'application/x-racket'
+
+      def self.analyze_text(text)
+        text = text.strip
+        return 1 if text.start_with? '#lang racket'
+        return 0.6 if text =~ %r(\A#lang [a-z/-]+$)i
+      end
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          ... and begin begin-for-syntax begin0 case case-lambda cond
+          datum->syntax-object define define-for-syntax define-logger
+          define-struct define-syntax define-syntax-rule
+          define-syntaxes define-values define-values-for-syntax delay
+          do expand-path fluid-let force hash-table-copy
+          hash-table-count hash-table-for-each hash-table-get
+          hash-table-iterate-first hash-table-iterate-key
+          hash-table-iterate-next hash-table-iterate-value
+          hash-table-map hash-table-put! hash-table-remove!
+          hash-table? if lambda let let* let*-values let-struct
+          let-syntax let-syntaxes let-values let/cc let/ec letrec
+          letrec-syntax letrec-syntaxes letrec-syntaxes+values
+          letrec-values list-immutable make-hash-table
+          make-immutable-hash-table make-namespace module module*
+          module-identifier=? module-label-identifier=?
+          module-template-identifier=? module-transformer-identifier=?
+          namespace-transformer-require or parameterize parameterize*
+          parameterize-break promise? prop:method-arity-error provide
+          provide-for-label provide-for-syntax quasiquote quasisyntax
+          quasisyntax/loc quote quote-syntax quote-syntax/prune
+          require require-for-label require-for-syntax
+          require-for-template set! set!-values syntax syntax-case
+          syntax-case* syntax-id-rules syntax-object->datum
+          syntax-rules syntax/loc tcp-abandon-port tcp-accept
+          tcp-accept-evt tcp-accept-ready? tcp-accept/enable-break
+          tcp-addresses tcp-close tcp-connect tcp-connect/enable-break
+          tcp-listen tcp-listener? tcp-port? time transcript-off
+          transcript-on udp-addresses udp-bind! udp-bound? udp-close
+          udp-connect! udp-connected? udp-multicast-interface
+          udp-multicast-join-group! udp-multicast-leave-group!
+          udp-multicast-loopback? udp-multicast-set-interface!
+          udp-multicast-set-loopback! udp-multicast-set-ttl!
+          udp-multicast-ttl udp-open-socket udp-receive! udp-receive!*
+          udp-receive!-evt udp-receive!/enable-break
+          udp-receive-ready-evt udp-send udp-send* udp-send-evt
+          udp-send-ready-evt udp-send-to udp-send-to* udp-send-to-evt
+          udp-send-to/enable-break udp-send/enable-break udp? unless
+          unquote unquote-splicing unsyntax unsyntax-splicing when
+          with-continuation-mark with-handlers with-handlers*
+          with-syntax λ)
+      end
+
+      def self.builtins
+        @builtins ||= Set.new %w(
+          * + - / < <= = > >=
+          abort-current-continuation abs absolute-path? acos add1
+          alarm-evt always-evt andmap angle append apply
+          arithmetic-shift arity-at-least arity-at-least-value
+          arity-at-least? asin assoc assq assv atan banner bitwise-and
+          bitwise-bit-field bitwise-bit-set? bitwise-ior bitwise-not
+          bitwise-xor boolean? bound-identifier=? box box-cas!
+          box-immutable box? break-enabled break-thread build-path
+          build-path/convention-type byte-pregexp byte-pregexp?
+          byte-ready? byte-regexp byte-regexp? byte? bytes
+          bytes->immutable-bytes bytes->list bytes->path
+          bytes->path-element bytes->string/latin-1
+          bytes->string/locale bytes->string/utf-8 bytes-append
+          bytes-close-converter bytes-convert bytes-convert-end
+          bytes-converter? bytes-copy bytes-copy!
+          bytes-environment-variable-name? bytes-fill! bytes-length
+          bytes-open-converter bytes-ref bytes-set! bytes-utf-8-index
+          bytes-utf-8-length bytes-utf-8-ref bytes<? bytes=? bytes>?
+          bytes? caaaar caaadr caaar caadar caaddr caadr caar cadaar
+          cadadr cadar caddar cadddr caddr cadr call-in-nested-thread
+          call-with-break-parameterization
+          call-with-composable-continuation
+          call-with-continuation-barrier call-with-continuation-prompt
+          call-with-current-continuation
+          call-with-default-reading-parameterization
+          call-with-escape-continuation call-with-exception-handler
+          call-with-immediate-continuation-mark call-with-input-file
+          call-with-output-file call-with-parameterization
+          call-with-semaphore call-with-semaphore/enable-break
+          call-with-values call/cc call/ec car cdaaar cdaadr cdaar
+          cdadar cdaddr cdadr cdar cddaar cddadr cddar cdddar cddddr
+          cdddr cddr cdr ceiling channel-get channel-put
+          channel-put-evt channel-put-evt? channel-try-get channel?
+          chaperone-box chaperone-continuation-mark-key chaperone-evt
+          chaperone-hash chaperone-of? chaperone-procedure
+          chaperone-prompt-tag chaperone-struct chaperone-struct-type
+          chaperone-vector chaperone? char->integer char-alphabetic?
+          char-blank? char-ci<=? char-ci<? char-ci=? char-ci>=?
+          char-ci>? char-downcase char-foldcase char-general-category
+          char-graphic? char-iso-control? char-lower-case?
+          char-numeric? char-punctuation? char-ready? char-symbolic?
+          char-title-case? char-titlecase char-upcase char-upper-case?
+          char-utf-8-length char-whitespace? char<=? char<? char=?
+          char>=? char>? char? check-duplicate-identifier
+          checked-procedure-check-and-extract choice-evt cleanse-path
+          close-input-port close-output-port collect-garbage
+          collection-file-path collection-path compile
+          compile-allow-set!-undefined
+          compile-context-preservation-enabled
+          compile-enforce-module-constants compile-syntax
+          compiled-expression? compiled-module-expression?
+          complete-path? complex? cons continuation-mark-key?
+          continuation-mark-set->context continuation-mark-set->list
+          continuation-mark-set->list* continuation-mark-set-first
+          continuation-mark-set? continuation-marks
+          continuation-prompt-available? continuation-prompt-tag?
+          continuation? copy-file cos current-break-parameterization
+          current-code-inspector current-command-line-arguments
+          current-compile current-compiled-file-roots
+          current-continuation-marks current-custodian
+          current-directory current-directory-for-user current-drive
+          current-environment-variables current-error-port
+          current-eval current-evt-pseudo-random-generator
+          current-gc-milliseconds current-get-interaction-input-port
+          current-inexact-milliseconds current-input-port
+          current-inspector current-library-collection-paths
+          current-load current-load-extension
+          current-load-relative-directory current-load/use-compiled
+          current-locale current-memory-use current-milliseconds
+          current-module-declare-name current-module-declare-source
+          current-module-name-resolver current-module-path-for-load
+          current-namespace current-output-port
+          current-parameterization
+          current-preserved-thread-cell-values current-print
+          current-process-milliseconds current-prompt-read
+          current-pseudo-random-generator current-read-interaction
+          current-reader-guard current-readtable current-seconds
+          current-security-guard current-subprocess-custodian-mode
+          current-thread current-thread-group
+          current-thread-initial-stack-size
+          current-write-relative-directory custodian-box-value
+          custodian-box? custodian-limit-memory custodian-managed-list
+          custodian-memory-accounting-available?
+          custodian-require-memory custodian-shutdown-all custodian?
+          custom-print-quotable-accessor custom-print-quotable?
+          custom-write-accessor custom-write? date date*
+          date*-nanosecond date*-time-zone-name date*? date-day
+          date-dst? date-hour date-minute date-month date-second
+          date-time-zone-offset date-week-day date-year date-year-day
+          date? datum-intern-literal default-continuation-prompt-tag
+          delete-directory delete-file denominator directory-exists?
+          directory-list display displayln dump-memory-stats
+          dynamic-require dynamic-require-for-syntax dynamic-wind
+          environment-variables-copy environment-variables-names
+          environment-variables-ref environment-variables-set!
+          environment-variables? eof eof-object? ephemeron-value
+          ephemeron? eprintf eq-hash-code eq? equal-hash-code
+          equal-secondary-hash-code equal? equal?/recur eqv-hash-code
+          eqv? error error-display-handler error-escape-handler
+          error-print-context-length error-print-source-location
+          error-print-width error-value->string-handler eval
+          eval-jit-enabled eval-syntax even? evt? exact->inexact
+          exact-integer? exact-nonnegative-integer?
+          exact-positive-integer? exact? executable-yield-handler exit
+          exit-handler exn exn-continuation-marks exn-message
+          exn:break exn:break-continuation exn:break:hang-up
+          exn:break:hang-up? exn:break:terminate exn:break:terminate?
+          exn:break? exn:fail exn:fail:contract
+          exn:fail:contract:arity exn:fail:contract:arity?
+          exn:fail:contract:continuation
+          exn:fail:contract:continuation?
+          exn:fail:contract:divide-by-zero
+          exn:fail:contract:divide-by-zero?
+          exn:fail:contract:non-fixnum-result
+          exn:fail:contract:non-fixnum-result?
+          exn:fail:contract:variable exn:fail:contract:variable-id
+          exn:fail:contract:variable? exn:fail:contract?
+          exn:fail:filesystem exn:fail:filesystem:errno
+          exn:fail:filesystem:errno-errno exn:fail:filesystem:errno?
+          exn:fail:filesystem:exists exn:fail:filesystem:exists?
+          exn:fail:filesystem:missing-module
+          exn:fail:filesystem:missing-module-path
+          exn:fail:filesystem:missing-module?
+          exn:fail:filesystem:version exn:fail:filesystem:version?
+          exn:fail:filesystem? exn:fail:network exn:fail:network:errno
+          exn:fail:network:errno-errno exn:fail:network:errno?
+          exn:fail:network? exn:fail:out-of-memory
+          exn:fail:out-of-memory? exn:fail:read exn:fail:read-srclocs
+          exn:fail:read:eof exn:fail:read:eof? exn:fail:read:non-char
+          exn:fail:read:non-char? exn:fail:read? exn:fail:syntax
+          exn:fail:syntax-exprs exn:fail:syntax:missing-module
+          exn:fail:syntax:missing-module-path
+          exn:fail:syntax:missing-module? exn:fail:syntax:unbound
+          exn:fail:syntax:unbound? exn:fail:syntax?
+          exn:fail:unsupported exn:fail:unsupported? exn:fail:user
+          exn:fail:user? exn:fail? exn:missing-module-accessor
+          exn:missing-module? exn:srclocs-accessor exn:srclocs? exn?
+          exp expand expand-once expand-syntax expand-syntax-once
+          expand-syntax-to-top-form expand-to-top-form
+          expand-user-path explode-path expt file-exists?
+          file-or-directory-identity file-or-directory-modify-seconds
+          file-or-directory-permissions file-position file-position*
+          file-size file-stream-buffer-mode file-stream-port?
+          file-truncate filesystem-change-evt
+          filesystem-change-evt-cancel filesystem-change-evt?
+          filesystem-root-list find-executable-path
+          find-library-collection-paths find-system-path fixnum?
+          floating-point-bytes->real flonum? floor flush-output
+          for-each format fprintf free-identifier=? gcd
+          generate-temporaries gensym get-output-bytes
+          get-output-string getenv global-port-print-handler guard-evt
+          handle-evt handle-evt? hash hash-equal? hash-eqv?
+          hash-has-key? hash-placeholder? hash-ref! hasheq hasheqv
+          identifier-binding identifier-binding-symbol
+          identifier-label-binding identifier-prune-lexical-context
+          identifier-prune-to-source-module
+          identifier-remove-from-definition-context
+          identifier-template-binding identifier-transformer-binding
+          identifier? imag-part immutable? impersonate-box
+          impersonate-continuation-mark-key impersonate-hash
+          impersonate-procedure impersonate-prompt-tag
+          impersonate-struct impersonate-vector impersonator-ephemeron
+          impersonator-of? impersonator-prop:application-mark
+          impersonator-property-accessor-procedure?
+          impersonator-property? impersonator? inexact->exact
+          inexact-real? inexact? input-port? inspector? integer->char
+          integer->integer-bytes integer-bytes->integer integer-length
+          integer-sqrt integer-sqrt/remainder integer?
+          internal-definition-context-seal
+          internal-definition-context? keyword->string keyword<?
+          keyword? kill-thread lcm length liberal-define-context?
+          link-exists? list list* list->bytes list->string
+          list->vector list-ref list-tail list? load load-extension
+          load-on-demand-enabled load-relative load-relative-extension
+          load/cd load/use-compiled local-expand
+          local-expand/capture-lifts local-transformer-expand
+          local-transformer-expand/capture-lifts
+          locale-string-encoding log log-max-level magnitude
+          make-arity-at-least make-bytes make-channel
+          make-continuation-mark-key make-continuation-prompt-tag
+          make-custodian make-custodian-box make-date make-date*
+          make-derived-parameter make-directory
+          make-environment-variables make-ephemeron make-exn
+          make-exn:break make-exn:break:hang-up
+          make-exn:break:terminate make-exn:fail
+          make-exn:fail:contract make-exn:fail:contract:arity
+          make-exn:fail:contract:continuation
+          make-exn:fail:contract:divide-by-zero
+          make-exn:fail:contract:non-fixnum-result
+          make-exn:fail:contract:variable make-exn:fail:filesystem
+          make-exn:fail:filesystem:errno
+          make-exn:fail:filesystem:exists
+          make-exn:fail:filesystem:missing-module
+          make-exn:fail:filesystem:version make-exn:fail:network
+          make-exn:fail:network:errno make-exn:fail:out-of-memory
+          make-exn:fail:read make-exn:fail:read:eof
+          make-exn:fail:read:non-char make-exn:fail:syntax
+          make-exn:fail:syntax:missing-module
+          make-exn:fail:syntax:unbound make-exn:fail:unsupported
+          make-exn:fail:user make-file-or-directory-link
+          make-hash-placeholder make-hasheq-placeholder make-hasheqv
+          make-hasheqv-placeholder make-immutable-hasheqv
+          make-impersonator-property make-input-port make-inspector
+          make-known-char-range-list make-output-port make-parameter
+          make-phantom-bytes make-pipe make-placeholder make-polar
+          make-prefab-struct make-pseudo-random-generator
+          make-reader-graph make-readtable make-rectangular
+          make-rename-transformer make-resolved-module-path
+          make-security-guard make-semaphore make-set!-transformer
+          make-shared-bytes make-sibling-inspector
+          make-special-comment make-srcloc make-string
+          make-struct-field-accessor make-struct-field-mutator
+          make-struct-type make-struct-type-property
+          make-syntax-delta-introducer make-syntax-introducer
+          make-thread-cell make-thread-group make-vector make-weak-box
+          make-weak-hasheqv make-will-executor map max mcar mcdr mcons
+          member memq memv min module->exports module->imports
+          module->language-info module->namespace
+          module-compiled-cross-phase-persistent?
+          module-compiled-exports module-compiled-imports
+          module-compiled-language-info module-compiled-name
+          module-compiled-submodules module-declared?
+          module-path-index-join module-path-index-resolve
+          module-path-index-split module-path-index-submodule
+          module-path-index? module-path? module-predefined?
+          module-provide-protected? modulo mpair? nack-guard-evt
+          namespace-attach-module namespace-attach-module-declaration
+          namespace-base-phase namespace-mapped-symbols
+          namespace-module-identifier namespace-module-registry
+          namespace-require namespace-require/constant
+          namespace-require/copy namespace-require/expansion-time
+          namespace-set-variable-value! namespace-symbol->identifier
+          namespace-syntax-introduce namespace-undefine-variable!
+          namespace-unprotect-module namespace-variable-value
+          namespace? negative? never-evt newline normal-case-path not
+          null null? number->string number? numerator object-name odd?
+          open-input-bytes open-input-file open-input-output-file
+          open-input-string open-output-bytes open-output-file
+          open-output-string ormap output-port? pair?
+          parameter-procedure=? parameter? parameterization?
+          path->bytes path->complete-path path->directory-path
+          path->string path-add-suffix path-convention-type
+          path-element->bytes path-element->string
+          path-for-some-system? path-list-string->path-list
+          path-replace-suffix path-string? path? peek-byte
+          peek-byte-or-special peek-bytes peek-bytes!
+          peek-bytes-avail! peek-bytes-avail!*
+          peek-bytes-avail!/enable-break peek-char
+          peek-char-or-special peek-string peek-string! phantom-bytes?
+          pipe-content-length placeholder-get placeholder-set!
+          placeholder? poll-guard-evt port-closed-evt port-closed?
+          port-commit-peeked port-count-lines!
+          port-count-lines-enabled port-counts-lines?
+          port-display-handler port-file-identity port-file-unlock
+          port-next-location port-print-handler port-progress-evt
+          port-provides-progress-evts? port-read-handler
+          port-try-file-lock? port-write-handler port-writes-atomic?
+          port-writes-special? port? positive? prefab-key->struct-type
+          prefab-key? prefab-struct-key pregexp pregexp?
+          primitive-closure? primitive-result-arity primitive? print
+          print-as-expression print-boolean-long-form print-box
+          print-graph print-hash-table print-mpair-curly-braces
+          print-pair-curly-braces print-reader-abbreviations
+          print-struct print-syntax-width print-unreadable
+          print-vector-length printf procedure->method procedure-arity
+          procedure-arity-includes? procedure-arity?
+          procedure-closure-contents-eq? procedure-extract-target
+          procedure-reduce-arity procedure-rename
+          procedure-struct-type? procedure? progress-evt?
+          prop:arity-string prop:checked-procedure
+          prop:custom-print-quotable prop:custom-write prop:equal+hash
+          prop:evt prop:exn:missing-module prop:exn:srclocs
+          prop:impersonator-of prop:input-port
+          prop:liberal-define-context prop:output-port prop:procedure
+          prop:rename-transformer prop:set!-transformer
+          pseudo-random-generator->vector
+          pseudo-random-generator-vector? pseudo-random-generator?
+          putenv quotient quotient/remainder raise
+          raise-argument-error raise-arguments-error raise-arity-error
+          raise-mismatch-error raise-range-error raise-result-error
+          raise-syntax-error raise-type-error raise-user-error random
+          random-seed rational? rationalize read read-accept-bar-quote
+          read-accept-box read-accept-compiled read-accept-dot
+          read-accept-graph read-accept-infix-dot read-accept-lang
+          read-accept-quasiquote read-accept-reader read-byte
+          read-byte-or-special read-bytes read-bytes!
+          read-bytes-avail! read-bytes-avail!*
+          read-bytes-avail!/enable-break read-bytes-line
+          read-case-sensitive read-char read-char-or-special
+          read-curly-brace-as-paren read-decimal-as-inexact
+          read-eval-print-loop read-language read-line
+          read-on-demand-source read-square-bracket-as-paren
+          read-string read-string! read-syntax read-syntax/recursive
+          read/recursive readtable-mapping readtable?
+          real->double-flonum real->floating-point-bytes
+          real->single-flonum real-part real? regexp regexp-match
+          regexp-match-peek regexp-match-peek-immediate
+          regexp-match-peek-positions
+          regexp-match-peek-positions-immediate
+          regexp-match-peek-positions-immediate/end
+          regexp-match-peek-positions/end regexp-match-positions
+          regexp-match-positions/end regexp-match/end regexp-match?
+          regexp-max-lookbehind regexp-replace regexp-replace* regexp?
+          relative-path? remainder rename-file-or-directory
+          rename-transformer-target rename-transformer? reroot-path
+          resolve-path resolved-module-path-name resolved-module-path?
+          reverse round seconds->date security-guard?
+          semaphore-peek-evt semaphore-peek-evt? semaphore-post
+          semaphore-try-wait? semaphore-wait
+          semaphore-wait/enable-break semaphore?
+          set!-transformer-procedure set!-transformer? set-box!
+          set-mcar! set-mcdr! set-phantom-bytes!
+          set-port-next-location! shared-bytes shell-execute
+          simplify-path sin single-flonum? sleep special-comment-value
+          special-comment? split-path sqrt srcloc srcloc->string
+          srcloc-column srcloc-line srcloc-position srcloc-source
+          srcloc-span srcloc? string string->bytes/latin-1
+          string->bytes/locale string->bytes/utf-8
+          string->immutable-string string->keyword string->list
+          string->number string->path string->path-element
+          string->symbol string->uninterned-symbol
+          string->unreadable-symbol string-append string-ci<=?
+          string-ci<? string-ci=? string-ci>=? string-ci>? string-copy
+          string-copy! string-downcase
+          string-environment-variable-name? string-fill!
+          string-foldcase string-length string-locale-ci<?
+          string-locale-ci=? string-locale-ci>? string-locale-downcase
+          string-locale-upcase string-locale<? string-locale=?
+          string-locale>? string-normalize-nfc string-normalize-nfd
+          string-normalize-nfkc string-normalize-nfkd string-ref
+          string-set! string-titlecase string-upcase
+          string-utf-8-length string<=? string<? string=? string>=?
+          string>? string? struct->vector struct-accessor-procedure?
+          struct-constructor-procedure? struct-info
+          struct-mutator-procedure? struct-predicate-procedure?
+          struct-type-info struct-type-make-constructor
+          struct-type-make-predicate
+          struct-type-property-accessor-procedure?
+          struct-type-property? struct-type? struct:arity-at-least
+          struct:date struct:date* struct:exn struct:exn:break
+          struct:exn:break:hang-up struct:exn:break:terminate
+          struct:exn:fail struct:exn:fail:contract
+          struct:exn:fail:contract:arity
+          struct:exn:fail:contract:continuation
+          struct:exn:fail:contract:divide-by-zero
+          struct:exn:fail:contract:non-fixnum-result
+          struct:exn:fail:contract:variable struct:exn:fail:filesystem
+          struct:exn:fail:filesystem:errno
+          struct:exn:fail:filesystem:exists
+          struct:exn:fail:filesystem:missing-module
+          struct:exn:fail:filesystem:version struct:exn:fail:network
+          struct:exn:fail:network:errno struct:exn:fail:out-of-memory
+          struct:exn:fail:read struct:exn:fail:read:eof
+          struct:exn:fail:read:non-char struct:exn:fail:syntax
+          struct:exn:fail:syntax:missing-module
+          struct:exn:fail:syntax:unbound struct:exn:fail:unsupported
+          struct:exn:fail:user struct:srcloc struct? sub1 subbytes
+          subprocess subprocess-group-enabled subprocess-kill
+          subprocess-pid subprocess-status subprocess-wait subprocess?
+          substring symbol->string symbol-interned? symbol-unreadable?
+          symbol? sync sync/enable-break sync/timeout
+          sync/timeout/enable-break syntax->list syntax-arm
+          syntax-column syntax-disarm syntax-e syntax-line
+          syntax-local-bind-syntaxes syntax-local-certifier
+          syntax-local-context syntax-local-expand-expression
+          syntax-local-get-shadower syntax-local-introduce
+          syntax-local-lift-context syntax-local-lift-expression
+          syntax-local-lift-module-end-declaration
+          syntax-local-lift-provide syntax-local-lift-require
+          syntax-local-lift-values-expression
+          syntax-local-make-definition-context
+          syntax-local-make-delta-introducer
+          syntax-local-module-defined-identifiers
+          syntax-local-module-exports
+          syntax-local-module-required-identifiers syntax-local-name
+          syntax-local-phase-level syntax-local-submodules
+          syntax-local-transforming-module-provides?
+          syntax-local-value syntax-local-value/immediate
+          syntax-original? syntax-position syntax-property
+          syntax-property-symbol-keys syntax-protect syntax-rearm
+          syntax-recertify syntax-shift-phase-level syntax-source
+          syntax-source-module syntax-span syntax-taint
+          syntax-tainted? syntax-track-origin
+          syntax-transforming-module-expression? syntax-transforming?
+          syntax? system-big-endian? system-idle-evt
+          system-language+country system-library-subpath
+          system-path-convention-type system-type tan terminal-port?
+          thread thread-cell-ref thread-cell-set! thread-cell-values?
+          thread-cell? thread-dead-evt thread-dead? thread-group?
+          thread-resume thread-resume-evt thread-rewind-receive
+          thread-running? thread-suspend thread-suspend-evt
+          thread-wait thread/suspend-to-kill thread? time-apply
+          truncate unbox uncaught-exception-handler
+          use-collection-link-paths use-compiled-file-paths
+          use-user-specific-search-paths values
+          variable-reference->empty-namespace
+          variable-reference->module-base-phase
+          variable-reference->module-declaration-inspector
+          variable-reference->module-path-index
+          variable-reference->module-source
+          variable-reference->namespace variable-reference->phase
+          variable-reference->resolved-module-path
+          variable-reference-constant? variable-reference? vector
+          vector->immutable-vector vector->list
+          vector->pseudo-random-generator
+          vector->pseudo-random-generator! vector->values vector-fill!
+          vector-immutable vector-length vector-ref vector-set!
+          vector-set-performance-stats! vector? version void void?
+          weak-box-value weak-box? will-execute will-executor?
+          will-register will-try-execute with-input-from-file
+          with-output-to-file wrap-evt write write-byte write-bytes
+          write-bytes-avail write-bytes-avail* write-bytes-avail-evt
+          write-bytes-avail/enable-break write-char write-special
+          write-special-avail* write-special-evt write-string zero?
+        )
+      end
+
+      # Since Racket allows identifiers to consist of nearly anything,
+      # it's simpler to describe what an ID is _not_.
+      id = /[^\s\(\)\[\]\{\}'`,.]+/i
+
+      state :root do
+        # comments
+        rule /;.*$/, Comment::Single
+        rule /\s+/m, Text
+
+        rule /[+-]inf[.][f0]/, Num::Float
+        rule /[+-]nan[.]0/, Num::Float
+        rule /[-]min[.]0/, Num::Float
+        rule /[+]max[.]0/, Num::Float
+
+        rule /-?\d+\.\d+/, Num::Float
+        rule /-?\d+/, Num::Integer
+
+        rule /#:#{id}+/, Name::Tag  # keyword
+
+        rule /#b[01]+/, Num::Bin
+        rule /#o[0-7]+/, Num::Oct
+        rule /#d[0-9]+/, Num::Integer
+        rule /#x[0-9a-f]+/i, Num::Hex
+        rule /#[ei][\d.]+/, Num::Other
+
+        rule /"(\\\\|\\"|[^"])*"/, Str
+        rule /['`]#{id}/i, Str::Symbol
+        rule /#\\([()\/'"._!\$%& ?=+-]{1}|[a-z0-9]+)/i,
+          Str::Char
+        rule /#t|#f/, Name::Constant
+        rule /(?:'|#|`|,@|,|\.)/, Operator
+
+        rule /(['#])(\s*)(\()/m do
+          groups Str::Symbol, Text, Punctuation
+        end
+
+        # () [] {} are all permitted as like pairs
+        rule /\(|\[|\{/, Punctuation, :command
+        rule /\)|\]|\}/, Punctuation
+
+        rule id, Name::Variable
+      end
+
+      state :command do
+        rule id, Name::Function do |m|
+          if self.class.keywords.include? m[0]
+            token Keyword
+          elsif self.class.builtins.include? m[0]
+            token Name::Builtin
+          else
+            token Name::Function
+          end
+
+          pop!
+        end
+
+        rule(//) { pop! }
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ruby.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ruby.rb
new file mode 100644
index 0000000..9ddca75
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/ruby.rb
@@ -0,0 +1,415 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Ruby < RegexLexer
+      title "Ruby"
+      desc "The Ruby programming language (ruby-lang.org)"
+      tag 'ruby'
+      aliases 'rb'
+      filenames '*.rb', '*.ruby', '*.rbw', '*.rake', '*.gemspec', '*.podspec',
+                'Rakefile', 'Guardfile', 'Gemfile', 'Capfile', 'Podfile',
+                'Vagrantfile', '*.ru', '*.prawn', 'Berksfile'
+
+      mimetypes 'text/x-ruby', 'application/x-ruby'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'ruby'
+      end
+
+      state :symbols do
+        # symbols
+        rule %r(
+          :  # initial :
+          @{0,2} # optional ivar, for :@foo and :@@foo
+          [a-z_]\w*[!?]? # the symbol
+        )xi, Str::Symbol
+
+        # special symbols
+        rule %r(:(?:\*\*|[-+]@|[/\%&\|^`~]|\[\]=?|<<|>>|<=?>|<=?|===?)),
+          Str::Symbol
+
+        rule /:'(\\\\|\\'|[^'])*'/, Str::Symbol
+        rule /:"/, Str::Symbol, :simple_sym
+      end
+
+      state :sigil_strings do
+        # %-sigiled strings
+        # %(abc), %[abc], %<abc>, %.abc., %r.abc., etc
+        delimiter_map = { '{' => '}', '[' => ']', '(' => ')', '<' => '>' }
+        rule /%([rqswQWxiI])?([^\w\s])/ do |m|
+          open = Regexp.escape(m[2])
+          close = Regexp.escape(delimiter_map[m[2]] || m[2])
+          interp = /[rQWxI]/ === m[1]
+          toktype = Str::Other
+
+          puts "    open: #{open.inspect}" if @debug
+          puts "    close: #{close.inspect}" if @debug
+
+          # regexes
+          if m[1] == 'r'
+            toktype = Str::Regex
+            push :regex_flags
+          end
+
+          token toktype
+
+          push do
+            rule /\\[##{open}#{close}\\]/, Str::Escape
+            # nesting rules only with asymmetric delimiters
+            if open != close
+              rule /#{open}/ do
+                token toktype
+                push
+              end
+            end
+            rule /#{close}/, toktype, :pop!
+
+            if interp
+              mixin :string_intp_escaped
+              rule /#/, toktype
+            else
+              rule /[\\#]/, toktype
+            end
+
+            rule /[^##{open}#{close}\\]+/m, toktype
+          end
+        end
+      end
+
+      state :strings do
+        mixin :symbols
+        rule /\b[a-z_]\w*?:\s+/, Str::Symbol, :expr_start
+        rule /'(\\\\|\\'|[^'])*'/, Str::Single
+        rule /"/, Str::Double, :simple_string
+        rule /(?<!\.)`/, Str::Backtick, :simple_backtick
+      end
+
+      state :regex_flags do
+        rule /[mixounse]*/, Str::Regex, :pop!
+      end
+
+      # double-quoted string and symbol
+      [[:string, Str::Double, '"'],
+       [:sym, Str::Symbol, '"'],
+       [:backtick, Str::Backtick, '`']].each do |name, tok, fin|
+        state :"simple_#{name}" do
+          mixin :string_intp_escaped
+          rule /[^\\#{fin}#]+/m, tok
+          rule /[\\#]/, tok
+          rule /#{fin}/, tok, :pop!
+        end
+      end
+
+      keywords = %w(
+        BEGIN END alias begin break case defined\? do else elsif end
+        ensure for if in next redo rescue raise retry return super then
+        undef unless until when while yield
+      )
+
+      keywords_pseudo = %w(
+        initialize new loop include extend raise attr_reader attr_writer
+        attr_accessor alias_method attr catch throw private module_function
+        public protected true false nil __FILE__ __LINE__
+      )
+
+      builtins_g = %w(
+        __id__ __send__ abort ancestors at_exit autoload binding callcc
+        caller catch chomp chop class_eval class_variables clone
+        const_defined\? const_get const_missing const_set constants
+        display dup eval exec exit extend fail fork format freeze
+        getc gets global_variables gsub hash id included_modules
+        inspect instance_eval instance_method instance_methods
+        instance_variable_get instance_variable_set instance_variables
+        lambda load local_variables loop method method_missing
+        methods module_eval name object_id open p print printf
+        private_class_method private_instance_methods private_methods proc
+        protected_instance_methods protected_methods public_class_method
+        public_instance_methods public_methods putc puts raise rand
+        readline readlines require require_relative scan select self send set_trace_func
+        singleton_methods sleep split sprintf srand sub syscall system
+        taint test throw to_a to_s trace_var trap untaint untrace_var warn
+      )
+
+      builtins_q = %w(
+        autoload block_given const_defined eql equal frozen
+        include instance_of is_a iterator kind_of method_defined
+        nil private_method_defined protected_method_defined
+        public_method_defined respond_to tainted
+      )
+
+      builtins_b = %w(chomp chop exit gsub sub)
+
+      start do
+        push :expr_start
+        @heredoc_queue = []
+      end
+
+      state :whitespace do
+        mixin :inline_whitespace
+        rule /\n\s*/m, Text, :expr_start
+        rule /#.*$/, Comment::Single
+
+        rule %r(=begin\b.*?end\b)m, Comment::Multiline
+      end
+
+      state :inline_whitespace do
+        rule /[ \t\r]+/, Text
+      end
+
+      state :root do
+        mixin :whitespace
+        rule /__END__/, Comment::Preproc, :end_part
+
+        rule /0_?[0-7]+(?:_[0-7]+)*/, Num::Oct
+        rule /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Hex
+        rule /0b[01]+(?:_[01]+)*/, Num::Bin
+        rule /[\d]+(?:_\d+)*/, Num::Integer
+
+        # names
+        rule /@@[a-z_]\w*/i, Name::Variable::Class
+        rule /@[a-z_]\w*/i, Name::Variable::Instance
+        rule /\$\w+/, Name::Variable::Global
+        rule %r(\$[!@&`'+~=/\\,;.<>_*\$?:"]), Name::Variable::Global
+        rule /\$-[0adFiIlpvw]/, Name::Variable::Global
+        rule /::/, Operator
+
+        mixin :strings
+
+        rule /(?:#{keywords.join('|')})\b/, Keyword, :expr_start
+        rule /(?:#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo, :expr_start
+
+        rule %r(
+          (module)
+          (\s+)
+          ([a-zA-Z_][a-zA-Z0-9_]*(::[a-zA-Z_][a-zA-Z0-9_]*)*)
+        )x do
+          groups Keyword, Text, Name::Namespace
+        end
+
+        rule /(def\b)(\s*)/ do
+          groups Keyword, Text
+          push :funcname
+        end
+
+        rule /(class\b)(\s*)/ do
+          groups Keyword, Text
+          push :classname
+        end
+
+        rule /(?:#{builtins_q.join('|')})[?]/, Name::Builtin, :expr_start
+        rule /(?:#{builtins_b.join('|')})!/,  Name::Builtin, :expr_start
+        rule /(?<!\.)(?:#{builtins_g.join('|')})\b/,
+          Name::Builtin, :method_call
+
+        # char operator.  ?x evaulates to "x", unless there's a digit
+        # beforehand like x>=0?n[x]:""
+        rule %r(
+          [?](\\[MC]-)*     # modifiers
+          (\\([\\abefnrstv\#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)
+          (?!\w)
+        )x, Str::Char
+
+        mixin :has_heredocs
+
+        rule /[A-Z][a-zA-Z0-9_]*/, Name::Constant, :method_call
+        rule /(\.|::)(\s*)([a-z_]\w*[!?]?|[*%&^`~+-\/\[<>=])/ do
+          groups Punctuation, Text, Name::Function
+          push :method_call
+        end
+
+        rule /[a-zA-Z_]\w*[?!]/, Name, :expr_start
+        rule /[a-zA-Z_]\w*/, Name, :method_call
+        rule /\*\*|<<?|>>?|>=|<=|<=>|=~|={3}|!~|&&?|\|\||\.{1,3}/,
+          Operator, :expr_start
+        rule /[-+\/*%=<>&!^|~]=?/, Operator, :expr_start
+        rule %r<[\[({,?:\\;/]>, Punctuation, :expr_start
+        rule %r<[\])}]>, Punctuation
+      end
+
+      state :has_heredocs do
+        rule /(?<!\w)(<<[-~]?)(["`']?)([a-zA-Z_]\w*)(\2)/ do |m|
+          token Operator, m[1]
+          token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
+          @heredoc_queue << [['<<-', '<<~'].include?(m[1]), m[3]]
+          push :heredoc_queue unless state? :heredoc_queue
+        end
+
+        rule /(<<[-~]?)(["'])(\2)/ do |m|
+          token Operator, m[1]
+          token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
+          @heredoc_queue << [['<<-', '<<~'].include?(m[1]), '']
+          push :heredoc_queue unless state? :heredoc_queue
+        end
+      end
+
+      state :heredoc_queue do
+        rule /(?=\n)/ do
+          goto :resolve_heredocs
+        end
+
+        mixin :root
+      end
+
+      state :resolve_heredocs do
+        mixin :string_intp_escaped
+
+        rule /(\n)([^#\\\n]*)$/ do |m|
+          tolerant, heredoc_name = @heredoc_queue.first
+          check = tolerant ? m[2].strip : m[2].rstrip
+
+          # check if we found the end of the heredoc
+          line_tok = if check == heredoc_name
+            @heredoc_queue.shift
+            # if there's no more, we're done looking.
+            pop! if @heredoc_queue.empty?
+            Name::Constant
+          else
+            Str::Heredoc
+          end
+
+          groups(Str::Heredoc, line_tok)
+        end
+
+        rule /[#\\\n]/, Str::Heredoc
+        rule /[^#\\\n]+/, Str::Heredoc
+      end
+
+      state :funcname do
+        rule /\s+/, Text
+        rule /\(/, Punctuation, :defexpr
+        rule %r(
+          (?:([a-zA-Z_][\w_]*)(\.))?
+          (
+            [a-zA-Z_][\w_]*[!?]? |
+            \*\*? | [-+]@? | [/%&\|^`~] | \[\]=? |
+            <<? | >>? | <=>? | >= | ===?
+          )
+        )x do |m|
+          puts "matches: #{[m[0], m[1], m[2], m[3]].inspect}" if @debug
+          groups Name::Class, Operator, Name::Function
+          pop!
+        end
+
+        rule(//) { pop! }
+      end
+
+      state :classname do
+        rule /\s+/, Text
+        rule /\(/ do
+          token Punctuation
+          push :defexpr
+          push :expr_start
+        end
+
+        # class << expr
+        rule /<</ do
+          token Operator
+          goto :expr_start
+        end
+
+        rule /[A-Z_]\w*/, Name::Class
+
+        rule(//) { pop! }
+      end
+
+      state :defexpr do
+        rule /(\))(\.|::)?/ do
+          groups Punctuation, Operator
+          pop!
+        end
+        rule /\(/ do
+          token Punctuation
+          push :defexpr
+          push :expr_start
+        end
+
+        mixin :root
+      end
+
+      state :in_interp do
+        rule /}/, Str::Interpol, :pop!
+        mixin :root
+      end
+
+      state :string_intp do
+        rule /[#][{]/, Str::Interpol, :in_interp
+        rule /#(@@?|\$)[a-z_]\w*/i, Str::Interpol
+      end
+
+      state :string_intp_escaped do
+        mixin :string_intp
+        rule /\\([\\abefnrstv#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})/,
+          Str::Escape
+        rule /\\./, Str::Escape
+      end
+
+      state :method_call do
+        rule %r(/) do
+          token Operator
+          goto :expr_start
+        end
+
+        rule(//) { goto :method_call_spaced }
+      end
+
+      state :method_call_spaced do
+        mixin :whitespace
+
+        rule %r([%/]=) do
+          token Operator
+          goto :expr_start
+        end
+
+        rule %r((/)(?=\S|\s*/)) do
+          token Str::Regex
+          goto :slash_regex
+        end
+
+        mixin :sigil_strings
+
+        rule(%r((?=\s*/))) { pop! }
+
+        rule(/\s+/) { token Text; goto :expr_start }
+        rule(//) { pop! }
+      end
+
+      state :expr_start do
+        mixin :inline_whitespace
+
+        rule %r(/) do
+          token Str::Regex
+          goto :slash_regex
+        end
+
+        # special case for using a single space.  Ruby demands that
+        # these be in a single line, otherwise it would make no sense.
+        rule /(\s*)(%[rqswQWxiI]? \S* )/ do
+          groups Text, Str::Other
+          pop!
+        end
+
+        mixin :sigil_strings
+
+        rule(//) { pop! }
+      end
+
+      state :slash_regex do
+        mixin :string_intp
+        rule %r(\\\\), Str::Regex
+        rule %r(\\/), Str::Regex
+        rule %r([\\#]), Str::Regex
+        rule %r([^\\/#]+)m, Str::Regex
+        rule %r(/) do
+          token Str::Regex
+          goto :regex_flags
+        end
+      end
+
+      state :end_part do
+        # eat up the rest of the stream as Comment::Preproc
+        rule /.+/m, Comment::Preproc, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/rust.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/rust.rb
new file mode 100644
index 0000000..97fd2da
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/rust.rb
@@ -0,0 +1,190 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Rust < RegexLexer
+      title "Rust"
+      desc 'The Rust programming language (rust-lang.org)'
+      tag 'rust'
+      aliases 'rs'
+      filenames '*.rs'
+      mimetypes 'text/x-rust'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'rustc'
+      end
+
+      def self.keywords
+        @keywords ||= %w(
+          as assert break const copy do drop else enum extern fail false
+          fn for if impl let log loop match mod move mut priv pub pure
+          ref return self static struct true trait type unsafe use while
+          box
+        )
+      end
+
+      def self.builtins
+        @builtins ||= Set.new %w(
+          Add BitAnd BitOr BitXor bool c_char c_double c_float char
+          c_int clock_t c_long c_longlong Cons Const Copy c_schar c_short
+          c_uchar c_uint c_ulong c_ulonglong c_ushort c_void dev_t DIR
+          dirent Div Either Eq Err f32 f64 Failure FILE float fpos_t
+          i16 i32 i64 i8 isize Index ino_t int intptr_t Left mode_t Modulo Mul
+          Neg Nil None Num off_t Ok Option Ord Owned pid_t Ptr ptrdiff_t
+          Right Send Shl Shr size_t Some ssize_t str Sub Success time_t
+          u16 u32 u64 u8 usize uint uintptr_t
+          Box Vec String Gc Rc Arc
+        )
+      end
+
+      def macro_closed?
+        @macro_delims.values.all?(&:zero?)
+      end
+
+      start {
+        @macro_delims = { ']' => 0, ')' => 0, '}' => 0 }
+      }
+
+      delim_map = { '[' => ']', '(' => ')', '{' => '}' }
+
+      id = /[a-z_]\w*/i
+      hex = /[0-9a-f]/i
+      escapes = %r(
+        \\ ([nrt'\\] | x#{hex}{2} | u#{hex}{4} | U#{hex}{8})
+      )x
+      size = /8|16|32|64/
+
+      state :start_line do
+        mixin :whitespace
+        rule /\s+/, Text
+        rule /#\[/ do
+          token Comment::Preproc; push :attribute
+        end
+        rule(//) { pop! }
+      end
+
+      state :attribute do
+        mixin :whitespace
+        mixin :has_literals
+        rule /[(,)=]/, Comment::Preproc
+        rule /\]/, Comment::Preproc, :pop!
+        rule id, Comment::Preproc
+      end
+
+      state :whitespace do
+        rule /\s+/, Text
+        rule %r(//[^\n]*), Comment
+        rule %r(/[*].*?[*]/)m, Comment::Multiline
+      end
+
+      state :root do
+        rule /\n/, Text, :start_line
+        mixin :whitespace
+        rule /\b(?:#{Rust.keywords.join('|')})\b/, Keyword
+        mixin :has_literals
+
+        rule %r([=-]>), Keyword
+        rule %r(<->), Keyword
+        rule /[()\[\]{}|,:;]/, Punctuation
+        rule /[*!@~&+%^<>=-]/, Operator
+
+        rule /([.]\s*)?#{id}(?=\s*[(])/m, Name::Function
+        rule /[.]\s*#{id}/, Name::Property
+        rule /(#{id})(::)/m do
+          groups Name::Namespace, Punctuation
+        end
+
+        # macros
+        rule /\bmacro_rules!/, Name::Decorator, :macro_rules
+        rule /#{id}!/, Name::Decorator, :macro
+
+        rule /#{id}/ do |m|
+          name = m[0]
+          if self.class.builtins.include? name
+            token Name::Builtin
+          else
+            token Name
+          end
+        end
+      end
+
+      state :macro do
+        mixin :has_literals
+
+        rule /[\[{(]/ do |m|
+          @macro_delims[delim_map[m[0]]] += 1
+          puts "    macro_delims: #{@macro_delims.inspect}" if @debug
+          token Punctuation
+        end
+
+        rule /[\]})]/ do |m|
+          @macro_delims[m[0]] -= 1
+          puts "    macro_delims: #{@macro_delims.inspect}" if @debug
+          pop! if macro_closed?
+          token Punctuation
+        end
+
+        # same as the rule in root, but don't push another macro state
+        rule /#{id}!/, Name::Decorator
+        mixin :root
+
+        # No syntax errors in macros
+        rule /./, Text
+      end
+
+      state :macro_rules do
+        rule /[$]#{id}(:#{id})?/, Name::Variable
+        rule /[$]/, Name::Variable
+
+        mixin :macro
+      end
+
+      state :has_literals do
+        # constants
+        rule /\b(?:true|false|nil)\b/, Keyword::Constant
+        # characters
+        rule %r(
+          ' (?: #{escapes} | [^\\] ) '
+        )x, Str::Char
+
+        rule /"/, Str, :string
+
+        # numbers
+        dot = /[.][0-9_]+/
+        exp = /e[-+]?[0-9_]+/
+        flt = /f32|f64/
+
+        rule %r(
+          [0-9]+
+          (#{dot}  #{exp}? #{flt}?
+          |#{dot}? #{exp}  #{flt}?
+          |#{dot}? #{exp}? #{flt}
+          )
+        )x, Num::Float
+
+        rule %r(
+          ( 0b[10_]+
+          | 0x[0-9a-fA-F-]+
+          | [0-9]+
+          ) (u#{size}?|i#{size})?
+        )x, Num::Integer
+
+      end
+
+      state :string do
+        rule /"/, Str, :pop!
+        rule escapes, Str::Escape
+        rule /%%/, Str::Interpol
+        rule %r(
+          %
+          ( [0-9]+ [$] )?  # Parameter
+          [0#+-]*          # Flag
+          ( [0-9]+ [$]? )? # Width
+          ( [.] [0-9]+ )?  # Precision
+          [bcdfiostuxX?]   # Type
+        )x, Str::Interpol
+        rule /[^%"\\]+/m, Str
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sass.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sass.rb
new file mode 100644
index 0000000..ea765fc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sass.rb
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    load_lexer 'sass/common.rb'
+
+    class Sass < SassCommon
+      include Indentation
+
+      title "Sass"
+      desc 'The Sass stylesheet language language (sass-lang.com)'
+
+      tag 'sass'
+      filenames '*.sass'
+      mimetypes 'text/x-sass'
+
+      id = /[\w-]+/
+
+      state :root do
+        rule /[ \t]*\n/, Text
+        rule(/[ \t]*/) { |m| token Text; indentation(m[0]) }
+      end
+
+      state :content do
+        # block comments
+        rule %r(//.*?\n) do
+          token Comment::Single
+          pop!; starts_block :single_comment
+        end
+
+        rule %r(/[*].*?\n) do
+          token Comment::Multiline
+          pop!; starts_block :multi_comment
+        end
+
+        rule /@import\b/, Keyword, :import
+
+        mixin :content_common
+
+        rule %r(=#{id}), Name::Function, :value
+        rule %r([+]#{id}), Name::Decorator, :value
+
+        rule /:/, Name::Attribute, :old_style_attr
+
+        rule(/(?=.+?:([^a-z]|$))/) { push :attribute }
+
+        rule(//) { push :selector }
+      end
+
+      state :single_comment do
+        rule /.*?\n/, Comment::Single, :pop!
+      end
+
+      state :multi_comment do
+        rule /.*?\n/, Comment::Multiline, :pop!
+      end
+
+      state :import do
+        rule /[ \t]+/, Text
+        rule /\S+/, Str
+        rule /\n/, Text, :pop!
+      end
+
+      state :old_style_attr do
+        mixin :attr_common
+        rule(//) { pop!; push :value }
+      end
+
+      state :end_section do
+        rule(/\n/) { token Text; reset_stack }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sass/common.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sass/common.rb
new file mode 100644
index 0000000..25bb546
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sass/common.rb
@@ -0,0 +1,180 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    # shared states with SCSS
+    class SassCommon < RegexLexer
+      id = /[\w-]+/
+
+      state :content_common do
+        rule /@for\b/, Keyword, :for
+        rule /@(debug|warn|if|each|while|else|return|media)/, Keyword, :value
+
+        rule /(@mixin)(\s+)(#{id})/ do
+          groups Keyword, Text, Name::Function
+          push :value
+        end
+
+        rule /(@function)(\s+)(#{id})/ do
+          groups Keyword, Text, Name::Function
+          push :value
+        end
+
+        rule /@extend\b/, Keyword, :selector
+
+        rule /(@include)(\s+)(#{id})/ do
+          groups Keyword, Text, Name::Decorator
+          push :value
+        end
+
+        rule /@#{id}/, Keyword, :selector
+
+        # $variable: assignment
+        rule /([$]#{id})([ \t]*)(:)/ do
+          groups Name::Variable, Text, Punctuation
+          push :value
+        end
+      end
+
+      state :value do
+        mixin :end_section
+        rule /[ \t]+/, Text
+        rule /[$]#{id}/, Name::Variable
+        rule /url[(]/, Str::Other, :string_url
+        rule /#{id}(?=\s*[(])/, Name::Function
+        rule /%#{id}/, Name::Decorator
+
+        # named literals
+        rule /(true|false)\b/, Name::Builtin::Pseudo
+        rule /(and|or|not)\b/, Operator::Word
+
+        # colors and numbers
+        rule /#[a-z0-9]{1,6}/i, Num::Hex
+        rule /-?\d+(%|[a-z]+)?/, Num
+        rule /-?\d*\.\d+(%|[a-z]+)?/, Num::Integer
+
+        mixin :has_strings
+        mixin :has_interp
+
+        rule /[~^*!&%<>\|+=@:,.\/?-]+/, Operator
+        rule /[\[\]()]+/, Punctuation
+        rule %r(/[*]), Comment::Multiline, :inline_comment
+        rule %r(//[^\n]*), Comment::Single
+
+        # identifiers
+        rule(id) do |m|
+          if CSS.builtins.include? m[0]
+            token Name::Builtin
+          elsif CSS.constants.include? m[0]
+            token Name::Constant
+          else
+            token Name
+          end
+        end
+      end
+
+      state :has_interp do
+        rule /[#][{]/, Str::Interpol, :interpolation
+      end
+
+      state :has_strings do
+        rule /"/, Str::Double, :dq
+        rule /'/, Str::Single, :sq
+      end
+
+      state :interpolation do
+        rule /}/, Str::Interpol, :pop!
+        mixin :value
+      end
+
+      state :selector do
+        mixin :end_section
+
+        mixin :has_strings
+        mixin :has_interp
+        rule /[ \t]+/, Text
+        rule /:/, Name::Decorator, :pseudo_class
+        rule /[.]/, Name::Class, :class
+        rule /#/, Name::Namespace, :id
+        rule /%/, Name::Variable, :placeholder
+        rule id, Name::Tag
+        rule /&/, Keyword
+        rule /[~^*!&\[\]()<>\|+=@:;,.\/?-]/, Operator
+      end
+
+      state :dq do
+        rule /"/, Str::Double, :pop!
+        mixin :has_interp
+        rule /(\\.|#(?![{])|[^\n"#])+/, Str::Double
+      end
+
+      state :sq do
+        rule /'/, Str::Single, :pop!
+        mixin :has_interp
+        rule /(\\.|#(?![{])|[^\n'#])+/, Str::Single
+      end
+
+      state :string_url do
+        rule /[)]/, Str::Other, :pop!
+        rule /(\\.|#(?![{])|[^\n)#])+/, Str::Other
+        mixin :has_interp
+      end
+
+      state :selector_piece do
+        mixin :has_interp
+        rule(//) { pop! }
+      end
+
+      state :pseudo_class do
+        rule id, Name::Decorator
+        mixin :selector_piece
+      end
+
+      state :class do
+        rule id, Name::Class
+        mixin :selector_piece
+      end
+
+      state :id do
+        rule id, Name::Namespace
+        mixin :selector_piece
+      end
+
+      state :placeholder do
+        rule id, Name::Variable
+        mixin :selector_piece
+      end
+
+      state :for do
+        rule /(from|to|through)/, Operator::Word
+        mixin :value
+      end
+
+      state :attr_common do
+        mixin :has_interp
+        rule id do |m|
+          if CSS.attributes.include? m[0]
+            token Name::Label
+          else
+            token Name::Attribute
+          end
+        end
+      end
+
+      state :attribute do
+        mixin :attr_common
+
+        rule /([ \t]*)(:)/ do
+          groups Text, Punctuation
+          push :value
+        end
+      end
+
+      state :inline_comment do
+        rule /(\\#|#(?=[^\n{])|\*(?=[^\n\/])|[^\n#*])+/, Comment::Multiline
+        mixin :has_interp
+        rule %r([*]/), Comment::Multiline, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/scala.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/scala.rb
new file mode 100644
index 0000000..f8ba463
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/scala.rb
@@ -0,0 +1,142 @@
+# -*- coding: utf-8 #
+
+module Rouge
+  module Lexers
+    class Scala < RegexLexer
+      title "Scala"
+      desc "The Scala programming language (scala-lang.org)"
+      tag 'scala'
+      aliases 'scala'
+      filenames '*.scala', '*.sbt'
+
+      mimetypes 'text/x-scala', 'application/x-scala'
+
+      # As documented in the ENBF section of the scala specification
+      # http://www.scala-lang.org/docu/files/ScalaReference.pdf
+      whitespace = /\p{Space}/
+      letter = /[\p{L}$_]/
+      upper = /[\p{Lu}$_]/
+      digits = /[0-9]/
+      parens = /[(){}\[\]]/
+      delims = %r([‘’".;,])
+
+      # negative lookahead to filter out other classes
+      op = %r(
+        (?!#{whitespace}|#{letter}|#{digits}|#{parens}|#{delims})
+        [\u0020-\u007F\p{Sm}\p{So}]
+      )x
+
+      idrest = %r(#{letter}(?:#{letter}|#{digits})*(?:(?<=_)#{op}+)?)x
+
+      keywords = %w(
+        abstract case catch def do else extends final finally for forSome
+        if implicit lazy match new override private protected requires return
+        sealed super this throw try val var while with yield
+      )
+
+      state :root do
+        rule /(class|trait|object)(\s+)/ do
+          groups Keyword, Text
+          push :class
+        end
+        rule /'#{idrest}[^']/, Str::Symbol
+        rule /[^\S\n]+/, Text
+
+        rule %r(//.*?\n), Comment::Single
+        rule %r(/\*), Comment::Multiline, :comment
+
+        rule /@#{idrest}/, Name::Decorator
+        rule %r(
+          (#{keywords.join("|")})\b|
+          (<[%:-]|=>|>:|[#=@_\u21D2\u2190])(\b|(?=\s)|$)
+        )x, Keyword
+        rule /:(?!#{op})/, Keyword, :type
+        rule /#{upper}#{idrest}\b/, Name::Class
+        rule /(true|false|null)\b/, Keyword::Constant
+        rule /(import|package)(\s+)/ do
+          groups Keyword, Text
+          push :import
+        end
+
+        rule /(type)(\s+)/ do
+          groups Keyword, Text
+          push :type
+        end
+
+        rule /""".*?"""(?!")/m, Str
+        rule /"(\\\\|\\"|[^"])*"/, Str
+        rule /'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'/, Str::Char
+
+        rule idrest, Name
+        rule /`[^`]+`/, Name
+
+        rule /\[/, Operator, :typeparam
+        rule /[\(\)\{\};,.#]/, Operator
+        rule /#{op}+/, Operator
+
+        rule /([0-9][0-9]*\.[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?[fFdD]?/, Num::Float
+        rule /([0-9][0-9]*[fFdD])/, Num::Float
+        rule /0x[0-9a-fA-F]+/, Num::Hex
+        rule /[0-9]+L?/, Num::Integer
+        rule /\n/, Text
+      end
+
+      state :class do
+        rule /(#{idrest}|#{op}+|`[^`]+`)(\s*)(\[)/ do
+          groups Name::Class, Text, Operator
+          push :typeparam
+        end
+
+        rule /\s+/, Text
+        rule /{/, Operator, :pop!
+        rule /\(/, Operator, :pop!
+        rule %r(//.*?\n), Comment::Single, :pop!
+        rule %r(#{idrest}|#{op}+|`[^`]+`), Name::Class, :pop!
+      end
+
+      state :type do
+        rule /\s+/, Text
+        rule /<[%:]|>:|[#_\u21D2]|forSome|type/, Keyword
+        rule /([,\);}]|=>|=)(\s*)/ do
+          groups Operator, Text
+          pop!
+        end
+        rule /[\(\{]/, Operator, :type
+
+        typechunk = /(?:#{idrest}|#{op}+\`[^`]+`)/
+        rule /(#{typechunk}(?:\.#{typechunk})*)(\s*)(\[)/ do
+          groups Keyword::Type, Text, Operator
+          pop!
+          push :typeparam
+        end
+
+        rule /(#{typechunk}(?:\.#{typechunk})*)(\s*)$/ do
+          groups Keyword::Type, Text
+          pop!
+        end
+
+        rule %r(//.*?\n), Comment::Single, :pop!
+        rule /\.|#{idrest}|#{op}+|`[^`]+`/, Keyword::Type
+      end
+
+      state :typeparam do
+        rule /[\s,]+/, Text
+        rule /<[%:]|=>|>:|[#_\u21D2]|forSome|type/, Keyword
+        rule /([\]\)\}])/, Operator, :pop!
+        rule /[\(\[\{]/, Operator, :typeparam
+        rule /\.|#{idrest}|#{op}+|`[^`]+`/, Keyword::Type
+      end
+
+      state :comment do
+        rule %r([^/\*]+), Comment::Multiline
+        rule %r(/\*), Comment::Multiline, :comment
+        rule %r(\*/), Comment::Multiline, :pop!
+        rule %r([*/]), Comment::Multiline
+      end
+
+      state :import do
+        rule %r((#{idrest}|\.)+), Name::Namespace, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/scheme.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/scheme.rb
new file mode 100644
index 0000000..eef986e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/scheme.rb
@@ -0,0 +1,112 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Scheme < RegexLexer
+      title "Scheme"
+      desc "The Scheme variant of Lisp"
+
+      tag 'scheme'
+      filenames '*.scm', '*.ss'
+      mimetypes 'text/x-scheme', 'application/x-scheme'
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          lambda define if else cond and or case let let* letrec begin
+          do delay set! => quote quasiquote unquote unquote-splicing
+          define-syntax let-syntax letrec-syntax syntax-rules
+        )
+      end
+
+      def self.builtins
+        @builtins ||= Set.new %w(
+          * + - / < <= = > >= abs acos angle append apply asin
+          assoc assq assv atan boolean? caaaar caaadr caaar caadar
+          caaddr caadr caar cadaar cadadr cadar caddar cadddr caddr
+          cadr call-with-current-continuation call-with-input-file
+          call-with-output-file call-with-values call/cc car cdaaar cdaadr
+          cdaar cdadar cdaddr cdadr cdar cddaar cddadr cddar cdddar cddddr
+          cdddr cddr cdr ceiling char->integer char-alphabetic? char-ci<=?
+          char-ci<? char-ci=? char-ci>=? char-ci>? char-downcase
+          char-lower-case? char-numeric? char-ready? char-upcase
+          char-upper-case? char-whitespace? char<=? char<? char=? char>=?
+          char>? char? close-input-port close-output-port complex? cons
+          cos current-input-port current-output-port denominator
+          display dynamic-wind eof-object? eq?  equal? eqv? eval
+          even? exact->inexact exact? exp expt floor for-each force gcd
+          imag-part inexact->exact inexact? input-port? integer->char
+          integer? interaction-environment lcm length list list->string
+          list->vector list-ref list-tail list?  load log magnitude
+          make-polar make-rectangular make-string make-vector map
+          max member memq memv min modulo negative? newline not
+          null-environment null? number->string number? numerator odd?
+          open-input-file open-output-file output-port? pair?  peek-char
+          port? positive? procedure? quotient rational? rationalize
+          read read-char real-part real?  remainder reverse round
+          scheme-report-environment set-car! set-cdr! sin sqrt string
+          string->list string->number string->symbol string-append
+          string-ci<=?  string-ci<? string-ci=? string-ci>=? string-ci>?
+          string-copy string-fill! string-length string-ref
+          string-set! string<=? string<? string=? string>=?
+          string>? string? substring symbol->string symbol?
+          tan transcript-off transcript-on truncate values vector
+          vector->list vector-fill! vector-length vector-ref
+          vector-set! vector? with-input-from-file with-output-to-file
+          write write-char zero?
+        )
+      end
+
+      id = /[a-z0-9!$\%&*+,\/:<=>?@^_~|-]+/i
+
+      state :root do
+        # comments
+        rule /;.*$/, Comment::Single
+        rule /\s+/m, Text
+        rule /-?\d+\.\d+/, Num::Float
+        rule /-?\d+/, Num::Integer
+
+        # Racket infinitites
+        rule /[+-]inf[.][f0]/, Num
+
+        rule /#b[01]+/, Num::Bin
+        rule /#o[0-7]+/, Num::Oct
+        rule /#d[0-9]+/, Num::Integer
+        rule /#x[0-9a-f]+/i, Num::Hex
+        rule /#[ei][\d.]+/, Num::Other
+
+        rule /"(\\\\|\\"|[^"])*"/, Str
+        rule /'#{id}/i, Str::Symbol
+        rule /#\\([()\/'"._!\$%& ?=+-]{1}|[a-z0-9]+)/i,
+          Str::Char
+        rule /#t|#f/, Name::Constant
+        rule /(?:'|#|`|,@|,|\.)/, Operator
+
+        rule /(['#])(\s*)(\()/m do
+          groups Str::Symbol, Text, Punctuation
+        end
+
+        rule /\(/, Punctuation, :command
+        rule /\)/, Punctuation
+
+        rule id, Name::Variable
+      end
+
+      state :command do
+        rule id, Name::Function do |m|
+          if self.class.keywords.include? m[0]
+            token Keyword
+          elsif self.class.builtins.include? m[0]
+            token Name::Builtin
+          else
+            token Name::Function
+          end
+
+          pop!
+        end
+
+        rule(//) { pop! }
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/scss.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/scss.rb
new file mode 100644
index 0000000..8e270e0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/scss.rb
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    load_lexer 'sass/common.rb'
+
+    class Scss < SassCommon
+      title "SCSS"
+      desc "SCSS stylesheets (sass-lang.com)"
+      tag 'scss'
+      filenames '*.scss'
+      mimetypes 'text/x-scss'
+
+      state :root do
+        rule /\s+/, Text
+        rule %r(//.*?\n), Comment::Single
+        rule %r(/[*].*?[*]/)m, Comment::Multiline
+        rule /@import\b/, Keyword, :value
+
+        mixin :content_common
+
+        rule(/(?=[^;{}][;}])/) { push :attribute }
+        rule(/(?=[^;{}:]+:[^a-z])/) { push :attribute }
+
+        rule(//) { push :selector }
+      end
+
+      state :end_section do
+        rule /\n/, Text
+        rule(/[;{}]/) { token Punctuation; reset_stack }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sed.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sed.rb
new file mode 100644
index 0000000..ff5e256
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sed.rb
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Sed < RegexLexer
+      title "sed"
+      desc 'sed, the ultimate stream editor'
+
+      tag 'sed'
+      filenames '*.sed'
+      mimetypes 'text/x-sed'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'sed'
+      end
+
+      class Regex < RegexLexer
+        state :root do
+          rule /\\./, Str::Escape
+          rule /\[/, Punctuation, :brackets
+          rule /[$^.*]/, Operator
+          rule /[()]/, Punctuation
+          rule /./, Str::Regex
+        end
+
+        state :brackets do
+          rule /\^?/ do
+            token Punctuation
+            goto :brackets_int
+          end
+        end
+
+        state :brackets_int do
+          # ranges
+          rule /.-./, Name::Variable
+          rule /\]/, Punctuation, :pop!
+          rule /./, Str::Regex
+        end
+      end
+
+      class Replacement < RegexLexer
+        state :root do
+          rule /\\./m, Str::Escape
+          rule /&/, Operator
+          rule /[^\\&]+/m, Text
+        end
+      end
+
+      def regex
+        @regex ||= Regex.new(options)
+      end
+
+      def replacement
+        @replacement ||= Replacement.new(options)
+      end
+
+      start { regex.reset!; replacement.reset! }
+
+      state :whitespace do
+        rule /\s+/m, Text
+        rule(/#.*?\n/) { token Comment; reset_stack }
+        rule(/\n/) { token Text; reset_stack }
+        rule(/;/) { token Punctuation; reset_stack }
+      end
+
+      state :root do
+        mixin :addr_range
+      end
+
+      edot = /\\.|./m
+
+      state :command do
+        mixin :whitespace
+
+        # subst and transliteration
+        rule /(s)(.)(#{edot}*?)(\2)(#{edot}*?)(\2)/m do |m|
+          token Keyword, m[1]
+          token Punctuation, m[2]
+          delegate regex, m[3]
+          token Punctuation, m[4]
+          delegate replacement, m[5]
+          token Punctuation, m[6]
+
+
+          goto :flags
+        end
+
+        rule /(y)(.)(#{edot}*?)(\2)(#{edot}*?)(\2)/m do |m|
+          token Keyword, m[1]
+          token Punctuation, m[2]
+          delegate replacement, m[3]
+          token Punctuation, m[4]
+          delegate replacement, m[5]
+          token Punctuation, m[6]
+
+          pop!
+        end
+
+        # commands that take a text segment as an argument
+        rule /([aic])(\s*)/ do
+          groups Keyword, Text; goto :text
+        end
+
+        rule /[pd]/, Keyword
+
+        # commands that take a number argument
+        rule /([qQl])(\s+)(\d+)/i do
+          groups Keyword, Text, Num
+          pop!
+        end
+
+        # no-argument commands
+        rule /[={}dDgGhHlnpPqx]/, Keyword, :pop!
+
+        # commands that take a filename argument
+        rule /([rRwW])(\s+)(\S+)/ do
+          groups Keyword, Text, Name
+          pop!
+        end
+
+        # commands that take a label argument
+        rule /([:btT])(\s+)(\S+)/ do
+          groups Keyword, Text, Name::Label
+          pop!
+        end
+      end
+
+      state :addr_range do
+        mixin :whitespace
+
+        ### address ranges ###
+        addr_tok = Keyword::Namespace
+        rule /\d+/, addr_tok
+        rule /[$,~+!]/, addr_tok
+
+        rule %r((/)(\\.|.)*?(/)) do |m|
+          token addr_tok, m[1]; delegate regex, m[2]; token addr_tok, m[3]
+        end
+
+        # alternate regex rage delimiters
+        rule %r((\\)(.)(\\.|.)*?(\2)) do |m|
+          token addr_tok, m[1] + m[2]
+          delegate regex, m[3]
+          token addr_tok, m[4]
+        end
+
+        rule(//) { push :command }
+      end
+
+      state :text do
+        rule /[^\\\n]+/, Str
+        rule /\\\n/, Str::Escape
+        rule /\\/, Str
+        rule /\n/, Text, :pop!
+      end
+
+      state :flags do
+        rule /[gp]+/, Keyword, :pop!
+
+        # writing to a file with the subst command.
+        # who'da thunk...?
+        rule /([wW])(\s+)(\S+)/ do
+          token Keyword; token Text; token Name
+        end
+
+        rule(//) { pop! }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/shell.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/shell.rb
new file mode 100644
index 0000000..8b7134e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/shell.rb
@@ -0,0 +1,152 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Shell < RegexLexer
+      title "shell"
+      desc "Various shell languages, including sh and bash"
+
+      tag 'shell'
+      aliases 'bash', 'zsh', 'ksh', 'sh'
+      filenames '*.sh', '*.bash', '*.zsh', '*.ksh',
+                '.bashrc', '.zshrc', '.kshrc', '.profile', 'PKGBUILD'
+
+      mimetypes 'application/x-sh', 'application/x-shellscript'
+
+      def self.analyze_text(text)
+        text.shebang?(/(ba|z|k)?sh/) ? 1 : 0
+      end
+
+      KEYWORDS = %w(
+        if fi else while do done for then return function
+        select continue until esac elif in
+      ).join('|')
+
+      BUILTINS = %w(
+        alias bg bind break builtin caller cd command compgen
+        complete declare dirs disown echo enable eval exec exit
+        export false fc fg getopts hash help history jobs kill let
+        local logout popd printf pushd pwd read readonly set shift
+        shopt source suspend test time times trap true type typeset
+        ulimit umask unalias unset wait
+      ).join('|')
+
+      state :basic do
+        rule /#.*$/, Comment
+
+        rule /\b(#{KEYWORDS})\s*\b/, Keyword
+        rule /\bcase\b/, Keyword, :case
+
+        rule /\b(#{BUILTINS})\s*\b(?!\.)/, Name::Builtin
+
+        rule /^\S*[\$%>#] +/, Generic::Prompt
+
+        rule /(\b\w+)(=)/ do |m|
+          groups Name::Variable, Operator
+        end
+
+        rule /[\[\]{}()=]/, Operator
+        rule /&&|\|\|/, Operator
+        # rule /\|\|/, Operator
+
+        rule /<<</, Operator # here-string
+        rule /<<-?\s*(\'?)\\?(\w+)\1/ do |m|
+          lsh = Str::Heredoc
+          token lsh
+          heredocstr = Regexp.escape(m[2])
+
+          push do
+            rule /\s*#{heredocstr}\s*\n/, lsh, :pop!
+            rule /.*?\n/, lsh
+          end
+        end
+      end
+
+      state :double_quotes do
+        # NB: "abc$" is literally the string abc$.
+        # Here we prevent :interp from interpreting $" as a variable.
+        rule /(?:\$#?)?"/, Str::Double, :pop!
+        mixin :interp
+        rule /[^"`\\$]+/, Str::Double
+      end
+
+      state :single_quotes do
+        rule /'/, Str::Single, :pop!
+        rule /[^']+/, Str::Single
+      end
+
+      state :data do
+        rule /\s+/, Text
+        rule /\\./, Str::Escape
+        rule /\$?"/, Str::Double, :double_quotes
+
+        # single quotes are much easier than double quotes - we can
+        # literally just scan until the next single quote.
+        # POSIX: Enclosing characters in single-quotes ( '' )
+        # shall preserve the literal value of each character within the
+        # single-quotes. A single-quote cannot occur within single-quotes.
+        rule /$?'/, Str::Single, :single_quotes
+
+        rule /\*/, Keyword
+
+        rule /;/, Text
+        rule /[^=\*\s{}()$"'`\\<]+/, Text
+        rule /\d+(?= |\Z)/, Num
+        rule /</, Text
+        mixin :interp
+      end
+
+      state :curly do
+        rule /}/, Keyword, :pop!
+        rule /:-/, Keyword
+        rule /[a-zA-Z0-9_]+/, Name::Variable
+        rule /[^}:"`'$]+/, Punctuation
+        mixin :root
+      end
+
+      state :paren do
+        rule /\)/, Keyword, :pop!
+        mixin :root
+      end
+
+      state :math do
+        rule /\)\)/, Keyword, :pop!
+        rule %r([-+*/%^|&]|\*\*|\|\|), Operator
+        rule /\d+/, Num
+        mixin :root
+      end
+
+      state :case do
+        rule /\besac\b/, Keyword, :pop!
+        rule /\|/, Punctuation
+        rule /\)/, Punctuation, :case_stanza
+        mixin :root
+      end
+
+      state :case_stanza do
+        rule /;;/, Punctuation, :pop!
+        mixin :root
+      end
+
+      state :backticks do
+        rule /`/, Str::Backtick, :pop!
+        mixin :root
+      end
+
+      state :interp do
+        rule /\\$/, Str::Escape # line continuation
+        rule /\\./, Str::Escape
+        rule /\$\(\(/, Keyword, :math
+        rule /\$\(/, Keyword, :paren
+        rule /\${#?/, Keyword, :curly
+        rule /`/, Str::Backtick, :backticks
+        rule /\$#?(\w+|.)/, Name::Variable
+      end
+
+      state :root do
+        mixin :basic
+        mixin :data
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/shell_session.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/shell_session.rb
new file mode 100644
index 0000000..80d0058
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/shell_session.rb
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class ShellSession < RegexLexer
+      tag 'shell_session'
+      title "Shell Session"
+      desc 'A generic lexer for shell session and command line'
+      aliases 'terminal', 'console'
+      filenames '*.cap'
+
+      state :root do
+        rule /^([^ \n]*# )([^ \n]*)(.*(\n|$))/ do |m|
+          token Name::Entity, m[1]
+          token Name::Class, m[2]
+          token Keyword::Variable, m[3]
+        end
+        rule /^([^ \n]*\$ )([^ \n]*)(.*(\n|$))/ do |m|
+          token Text::Whitespace, m[1]
+          token Name::Class, m[2]
+          token Keyword::Variable, m[3]
+        end
+        rule /^<...>$/, Comment
+        rule /.*\n/, Text
+      end
+    end
+  end
+end
+### tag function class label
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/slim.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/slim.rb
new file mode 100644
index 0000000..6dea393
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/slim.rb
@@ -0,0 +1,228 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    # A lexer for the Slim tempalte language
+    # @see http://slim-lang.org
+    class Slim < RegexLexer
+      include Indentation
+
+      title "Slim"
+      desc 'The Slim template language'
+
+      tag 'slim'
+
+      filenames '*.slim'
+
+      # Ruby identifier characters
+      ruby_chars = /[\w\!\?\@\$]/
+
+      # Since you are allowed to wrap lines with a backslash, include \\\n in characters
+      dot = /(\\\n|.)/
+
+      def ruby
+        @ruby ||= Ruby.new(options)
+      end
+
+      def html
+        @html ||= HTML.new(options)
+      end
+
+      def filters
+        @filters ||= {
+          'ruby' => ruby,
+          'erb' => ERB.new(options),
+          'javascript' => Javascript.new(options),
+          'css' => CSS.new(options),
+          'coffee' => Coffeescript.new(options),
+          'markdown' => Markdown.new(options),
+          'scss' => Scss.new(options),
+          'sass' => Sass.new(options)
+        }
+      end
+
+      start { ruby.reset!; html.reset! }
+
+      state :root do
+        rule /\s*\n/, Text
+        rule(/\s*/) { |m| token Text; indentation(m[0]) }
+      end
+
+      state :content do
+        mixin :css
+
+        rule /\/#{dot}*/, Comment, :indented_block
+
+        rule /(doctype)(\s+)(.*)/ do
+          groups Name::Namespace, Text::Whitespace, Text
+          pop!
+        end
+
+        # filters, shamelessly ripped from HAML
+        rule /(\w*):\s*\n/ do |m|
+          token Name::Decorator
+          pop!
+          starts_block :filter_block
+
+          filter_name = m[1].strip
+
+          @filter_lexer = self.filters[filter_name]
+          @filter_lexer.reset! unless @filter_lexer.nil?
+
+          puts "    slim: filter #{filter_name.inspect} #{@filter_lexer.inspect}" if @debug
+        end
+
+        # Text
+        rule %r([\|'](?=\s)) do
+          token Punctuation
+          pop!
+          starts_block :plain_block
+          goto :plain_block
+        end
+
+        rule /-|==|=/, Punctuation, :ruby_line
+
+        # Dynamic tags
+        rule /(\*)(#{ruby_chars}+\(.*?\))/ do |m|
+          token Punctuation, m[1]
+          delegate ruby, m[2]
+          push :tag
+        end
+
+        rule /(\*)(#{ruby_chars}+)/ do |m|
+          token Punctuation, m[1]
+          delegate ruby, m[2]
+          push :tag
+        end
+
+        #rule /<\w+(?=.*>)/, Keyword::Constant, :tag # Maybe do this, look ahead and stuff
+        rule %r((</?[\w\s\=\'\"]+?/?>)) do |m| # Dirty html
+          delegate html, m[1]
+          pop!
+        end
+
+        # Ordinary slim tags
+        rule /\w+/, Name::Tag, :tag
+
+      end
+
+      state :tag do
+        mixin :css
+        mixin :indented_block
+        mixin :interpolation
+
+        # Whitespace control
+        rule /[<>]/, Punctuation
+
+        # Trim whitespace
+        rule /\s+?/, Text::Whitespace
+
+        # Splats, these two might be mergable?
+        rule /(\*)(#{ruby_chars}+)/ do |m|
+          token Punctuation, m[1]
+          delegate ruby, m[2]
+        end
+
+        rule /(\*)(\{#{dot}+?\})/ do |m|
+          token Punctuation, m[1]
+          delegate ruby, m[2]
+        end
+
+        # Attributes
+        rule /([\w\-]+)(\s*)(\=)/ do |m|
+          token Name::Attribute, m[1]
+          token Text::Whitespace, m[2]
+          token Punctuation, m[3]
+          push :html_attr
+        end
+
+        # Ruby value
+        rule /(\=)(#{dot}+)/ do |m|
+          token Punctuation, m[1]
+          #token Keyword::Constant, m[2]
+          delegate ruby, m[2]
+        end
+
+        # HTML Entities
+        rule(/&\S*?;/, Name::Entity)
+
+        rule /#{dot}+?/, Text
+
+        rule /\s*\n/, Text::Whitespace, :pop!
+      end
+
+      state :css do
+        rule(/\.[\w-]*/) { token Name::Class; goto :tag }
+        rule(/#[a-zA-Z][\w:-]*/) { token Name::Function; goto :tag }
+      end
+
+      state :html_attr do
+        # Strings, double/single quoted
+        rule(/\s*(['"])#{dot}*?\1/, Literal::String, :pop!)
+
+        # Ruby stuff
+        rule(/(#{ruby_chars}+\(.*?\))/) { |m| delegate ruby, m[1]; pop! }
+        rule(/(#{ruby_chars}+)/) { |m| delegate ruby, m[1]; pop! }
+
+        rule /\s+/, Text::Whitespace
+      end
+
+      state :ruby_line do
+        # Need at top
+        mixin :indented_block
+
+        rule(/,\s*\n/) { delegate ruby }
+        rule /[ ]\|[ \t]*\n/, Str::Escape
+        rule(/.*?(?=(,$| \|)?[ \t]*$)/) { delegate ruby }
+      end
+
+      state :filter_block do
+        rule /([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/ do
+          if @filter_lexer
+            delegate @filter_lexer
+          else
+            token Name::Decorator
+          end
+        end
+
+        mixin :interpolation
+        mixin :indented_block
+      end
+
+      state :plain_block do
+        mixin :interpolation
+
+        rule %r((</?[\w\s\=\'\"]+?/?>)) do |m| # Dirty html
+          delegate html, m[1]
+        end
+
+        # HTML Entities
+        rule(/&\S*?;/, Name::Entity)
+
+        #rule /([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/ do
+        rule /#{dot}+?/, Text
+
+        mixin :indented_block
+      end
+
+      state :interpolation do
+        rule /#[{]/, Str::Interpol, :ruby_interp
+      end
+
+      state :ruby_interp do
+        rule /[}]/, Str::Interpol, :pop!
+        mixin :ruby_interp_inner
+      end
+
+      state :ruby_interp_inner do
+        rule(/[{]/) { delegate ruby; push :ruby_interp_inner }
+        rule(/[}]/) { delegate ruby; pop! }
+        rule(/[^{}]+/) { delegate ruby }
+      end
+
+      state :indented_block do
+        rule(/(?<!\\)\n/) { token Text; reset_stack }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/smalltalk.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/smalltalk.rb
new file mode 100644
index 0000000..6f448c1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/smalltalk.rb
@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Smalltalk < RegexLexer
+      title "Smalltalk"
+      desc 'The Smalltalk programming language'
+
+      tag 'smalltalk'
+      aliases 'st', 'squeak'
+      filenames '*.st'
+      mimetypes 'text/x-smalltalk'
+
+      ops = %r([-+*/\\~<>=|&!?,@%])
+
+      state :root do
+        rule /(<)(\w+:)(.*?)(>)/ do
+          groups Punctuation, Keyword, Text, Punctuation
+        end
+
+        # mixin :squeak_fileout
+        mixin :whitespaces
+        mixin :method_definition
+        rule /([|])([\w\s]*)([|])/ do
+          groups Punctuation, Name::Variable, Punctuation
+        end
+        mixin :objects
+        rule /\^|:=|_/, Operator
+
+        rule /[)}\]]/, Punctuation, :after_object
+        rule /[({\[!]/, Punctuation
+      end
+
+      state :method_definition do
+        rule /([a-z]\w*:)(\s*)(\w+)/i do
+          groups Name::Function, Text, Name::Variable
+        end
+
+        rule /^(\s*)(\b[a-z]\w*\b)(\s*)$/i do
+          groups Text, Name::Function, Text
+        end
+
+        rule %r(^(\s*)(#{ops}+)(\s*)(\w+)(\s*)$) do
+          groups Text, Name::Function, Text, Name::Variable, Text
+        end
+      end
+
+      state :block_variables do
+        mixin :whitespaces
+        rule /(:)(\s*)(\w+)/ do
+          groups Operator, Text, Name::Variable
+        end
+
+        rule /[|]/, Punctuation, :pop!
+
+        rule(//) { pop! }
+      end
+
+      state :literals do
+        rule /'(''|.)*?'/m, Str, :after_object
+        rule /[$]./, Str::Char, :after_object
+        rule /#[(]/, Str::Symbol, :parenth
+        rule /(\d+r)?-?\d+(\.\d+)?(e-?\d+)?/,
+          Num, :after_object
+        rule /#("[^"]*"|#{ops}+|[\w:]+)/,
+          Str::Symbol, :after_object
+      end
+
+      state :parenth do
+        rule /[)]/ do
+          token Str::Symbol
+          goto :after_object
+        end
+
+        mixin :inner_parenth
+      end
+
+      state :inner_parenth do
+        rule /#[(]/, Str::Symbol, :inner_parenth
+        rule /[)]/, Str::Symbol, :pop!
+        mixin :whitespaces
+        mixin :literals
+        rule /(#{ops}|[\w:])+/, Str::Symbol
+      end
+
+      state :whitespaces do
+        rule /! !$/, Keyword # squeak chunk delimiter
+        rule /\s+/m, Text
+        rule /".*?"/m, Comment
+      end
+
+      state :objects do
+        rule /\[/, Punctuation, :block_variables
+        rule /(self|super|true|false|nil|thisContext)\b/,
+          Name::Builtin::Pseudo, :after_object
+        rule /[A-Z]\w*(?!:)\b/, Name::Class, :after_object
+        rule /[a-z]\w*(?!:)\b/, Name::Variable, :after_object
+        mixin :literals
+      end
+
+      state :after_object do
+        mixin :whitespaces
+        rule /(ifTrue|ifFalse|whileTrue|whileFalse|timesRepeat):/,
+          Name::Builtin, :pop!
+        rule /new(?!:)\b/, Name::Builtin
+        rule /:=|_/, Operator, :pop!
+        rule /[a-z]+\w*:/i, Name::Function, :pop!
+        rule /[a-z]+\w*/i, Name::Function
+        rule /#{ops}+/, Name::Function, :pop!
+        rule /[.]/, Punctuation, :pop!
+        rule /;/, Punctuation
+        rule(//) { pop! }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/smarty.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/smarty.rb
new file mode 100644
index 0000000..2669dca
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/smarty.rb
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Smarty < TemplateLexer
+      title "Smarty"
+      desc 'Smarty Template Engine'
+      tag 'smarty'
+      aliases 'smarty'
+      filenames '*.tpl', '*.smarty'
+      mimetypes 'application/x-smarty', 'text/x-smarty'
+
+      def self.analyze_text(text)
+        rv = 0.0
+        rv += 0.15 if text =~ /\{if\s+.*?\}.*?\{\/if\}/
+        rv += 0.15 if text =~ /\{include\s+file=.*?\}/
+        rv += 0.15 if text =~ /\{foreach\s+.*?\}.*?\{\/foreach\}/
+        rv += 0.01 if text =~ /\{\$.*?\}/
+        return rv
+      end
+
+
+
+      def self.builtins
+        @builtins ||= %w(
+          append assign block call capture config_load debug extends
+          for foreach foreachelse break continue function if elseif
+          else include include_php insert ldelim rdelim literal nocache
+          php section sectionelse setfilter strip while
+          counter cycle eval fetch html_checkboxes html_image html_options
+          html_radios html_select_date html_select_time html_table
+          mailto math textformat
+          capitalize cat count_characters count_paragraphs
+          count_sentences count_words date_format default escape
+          from_charset indent lower nl2br regex_replace replace spacify
+          string_format strip strip_tags to_charset truncate unescape
+          upper wordwrap
+        )
+      end
+
+
+      state :root do
+        rule(/\{\s+/) { delegate parent }
+
+        # block comments
+        rule /\{\*.*?\*\}/m, Comment
+
+        rule /\{\/?(?![\s*])/ do
+          token Keyword
+          push :smarty
+        end
+
+
+        rule(/.*?(?={[\/a-zA-Z0-9$#*"'])|.*/m) { delegate parent }
+        rule(/.+/m) { delegate parent }
+      end
+
+      state :comment do
+        rule(/{\*/) { token Comment; push }
+        rule(/\*}/) { token Comment; pop! }
+        rule(/[^{}]+/m) { token Comment }
+      end
+
+      state :smarty do
+        # allow nested tags
+        rule /\{\/?(?![\s*])/ do
+          token Keyword
+          push :smarty
+        end
+
+        rule /}/, Keyword, :pop!
+        rule /\s+/m, Text
+        rule %r([~!%^&*()+=|\[\]:;,.<>/@?-]), Operator
+        rule /#[a-zA-Z_]\w*#/, Name::Variable
+        rule /\$[a-zA-Z_]\w*(\.\w+)*/, Name::Variable
+        rule /(true|false|null)\b/, Keyword::Constant
+	rule /[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?/, Num
+	rule /"(\\.|.)*?"/, Str::Double
+        rule /'(\\.|.)*?'/, Str::Single
+	rule /([a-zA-Z_]\w*)/ do |m|
+	  if self.class.builtins.include? m[0]
+	    token Name::Builtin
+	  else
+	    token Name::Attribute
+	  end
+	end
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sml.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sml.rb
new file mode 100644
index 0000000..f99158a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sml.rb
@@ -0,0 +1,347 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class SML < RegexLexer
+      title "SML"
+      desc 'Standard ML'
+      tag 'sml'
+      aliases 'ml'
+      filenames '*.sml', '*.sig', '*.fun'
+
+      mimetypes 'text/x-standardml', 'application/x-standardml'
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          abstype and andalso as case datatype do else end exception
+          fn fun handle if in infix infixr let local nonfix of op open
+          orelse raise rec then type val with withtype while
+          eqtype functor include sharing sig signature struct structure
+          where
+        )
+      end
+
+      def self.symbolic_reserved
+        @symbolic_reserved ||= Set.new %w(: | = => -> # :>)
+      end
+
+      id = /[\w']+/i
+      symbol = %r([!%&$#/:<=>?@\\~`^|*+-]+)
+
+      def self.analyze_text(text)
+        return 0
+      end
+
+      state :whitespace do
+        rule /\s+/m, Text
+        rule /[(][*]/, Comment, :comment
+      end
+
+      state :delimiters do
+        rule /[(\[{]/, Punctuation, :main
+        rule /[)\]}]/, Punctuation, :pop!
+
+        rule /\b(let|if|local)\b(?!')/, Keyword::Reserved do
+          push; push
+        end
+
+        rule /\b(struct|sig|while)\b(?!')/ do
+          token Keyword::Reserved
+          push
+        end
+
+        rule /\b(do|else|end|in|then)\b(?!')/, Keyword::Reserved, :pop!
+      end
+
+      def token_for_id_with_dot(id)
+        if self.class.keywords.include? id
+          Error
+        else
+          Name::Namespace
+        end
+      end
+
+      def token_for_final_id(id)
+        if self.class.keywords.include? id or self.class.symbolic_reserved.include? id
+          Error
+        else
+          Name
+        end
+      end
+
+      def token_for_id(id)
+        if self.class.keywords.include? id
+          Keyword::Reserved
+        elsif self.class.symbolic_reserved.include? id
+          Punctuation
+        else
+          Name
+        end
+      end
+
+      state :core do
+        rule /[()\[\]{},;_]|[.][.][.]/, Punctuation
+        rule /#"/, Str::Char, :char
+        rule /"/, Str::Double, :string
+        rule /~?0x[0-9a-fA-F]+/, Num::Hex
+        rule /0wx[0-9a-fA-F]+/, Num::Hex
+        rule /0w\d+/, Num::Integer
+        rule /~?\d+([.]\d+)?[eE]~?\d+/, Num::Float
+        rule /~?\d+[.]\d+/, Num::Float
+        rule /~?\d+/, Num::Integer
+
+        rule /#\s*[1-9][0-9]*/, Name::Label
+        rule /#\s*#{id}/, Name::Label
+        rule /#\s+#{symbol}/, Name::Label
+
+        rule /\b(datatype|abstype)\b(?!')/, Keyword::Reserved, :dname
+        rule(/(?=\bexception\b(?!'))/) { push :ename }
+        rule /\b(functor|include|open|signature|structure)\b(?!')/,
+          Keyword::Reserved, :sname
+        rule /\b(type|eqtype)\b(?!')/, Keyword::Reserved, :tname
+
+        rule /'#{id}/, Name::Decorator
+        rule /(#{id})([.])/ do |m|
+          groups(token_for_id_with_dot(m[1]), Punctuation)
+          push :dotted
+        end
+
+        rule id do |m|
+          token token_for_id(m[0])
+        end
+
+        rule symbol do |m|
+          token token_for_id(m[0])
+        end
+      end
+
+      state :dotted do
+        rule /(#{id})([.])/ do |m|
+          groups(token_for_id_with_dot(m[1]), Punctuation)
+        end
+
+        rule id do |m|
+          token token_for_id(m[0])
+          pop!
+        end
+
+        rule symbol do |m|
+          token token_for_id(m[0])
+          pop!
+        end
+      end
+
+      state :root do
+        rule /#!.*?\n/, Comment::Preproc
+        rule(//) { push :main }
+      end
+
+      state :main do
+        mixin :whitespace
+
+        rule /\b(val|and)\b(?!')/, Keyword::Reserved, :vname
+        rule /\b(fun)\b(?!')/ do
+          token Keyword::Reserved
+          goto :main_fun
+          push :fname
+        end
+
+        mixin :delimiters
+        mixin :core
+      end
+
+      state :main_fun do
+        mixin :whitespace
+        rule /\b(fun|and)\b(?!')/, Keyword::Reserved, :fname
+        rule /\bval\b(?!')/ do
+          token Keyword::Reserved
+          goto :main
+          push :vname
+        end
+
+        rule /[|]/, Punctuation, :fname
+        rule /\b(case|handle)\b(?!')/ do
+          token Keyword::Reserved
+          goto :main
+        end
+
+        mixin :delimiters
+        mixin :core
+      end
+
+      state :has_escapes do
+        rule /\\[\\"abtnvfr]/, Str::Escape
+        rule /\\\^[\x40-\x5e]/, Str::Escape
+        rule /\\[0-9]{3}/, Str::Escape
+        rule /\\u\h{4}/, Str::Escape
+        rule /\\\s+\\/, Str::Interpol
+      end
+
+      state :string do
+        rule /[^"\\]+/, Str::Double
+        rule /"/, Str::Double, :pop!
+        mixin :has_escapes
+      end
+
+      state :char do
+        rule /[^"\\]+/, Str::Char
+        rule /"/, Str::Char, :pop!
+        mixin :has_escapes
+      end
+
+      state :breakout do
+        rule /(?=\w+\b(#{SML.keywords.to_a.join('|')})\b(?!'))/ do
+          pop!
+        end
+      end
+
+      state :sname do
+        mixin :whitespace
+        mixin :breakout
+        rule id, Name::Namespace
+        rule(//) { pop! }
+      end
+
+      state :has_annotations do
+        rule /'[\w']*/, Name::Decorator
+        rule /[(]/, Punctuation, :tyvarseq
+      end
+
+      state :fname do
+        mixin :whitespace
+        mixin :has_annotations
+
+        rule id, Name::Function, :pop!
+        rule symbol, Name::Function, :pop!
+      end
+
+      state :vname do
+        mixin :whitespace
+        mixin :has_annotations
+
+        rule /(#{id})(\s*)(=(?!#{symbol}))/m do
+          groups Name::Variable, Text, Punctuation
+          pop!
+        end
+
+        rule /(#{symbol})(\s*)(=(?!#{symbol}))/m do
+          groups Name::Variable, Text, Punctuation
+        end
+
+        rule id, Name::Variable, :pop!
+        rule symbol, Name::Variable, :pop!
+
+        rule(//) { pop! }
+      end
+
+      state :tname do
+        mixin :whitespace
+        mixin :breakout
+        mixin :has_annotations
+
+        rule /'[\w']*/, Name::Decorator
+        rule /[(]/, Punctuation, :tyvarseq
+
+        rule %r(=(?!#{symbol})) do
+          token Punctuation
+          goto :typbind
+        end
+
+        rule id, Keyword::Type
+        rule symbol, Keyword::Type
+      end
+
+      state :typbind do
+        mixin :whitespace
+
+        rule /\b(and)\b(?!')/ do
+          token Keyword::Reserved
+          goto :tname
+        end
+
+        mixin :breakout
+        mixin :core
+      end
+
+      state :dname do
+        mixin :whitespace
+        mixin :breakout
+        mixin :has_annotations
+
+        rule /(=)(\s*)(datatype)\b/ do
+          groups Punctuation, Text, Keyword::Reserved
+          pop!
+        end
+
+        rule %r(=(?!#{symbol})) do
+          token Punctuation
+          goto :datbind
+          push :datcon
+        end
+
+        rule id, Keyword::Type
+        rule symbol, Keyword::Type
+      end
+
+      state :datbind do
+        mixin :whitespace
+        rule /\b(and)\b(?!')/ do
+          token Keyword::Reserved; goto :dname
+        end
+        rule /\b(withtype)\b(?!')/ do
+          token Keyword::Reserved; goto :tname
+        end
+        rule /\bof\b(?!')/, Keyword::Reserved
+        rule /([|])(\s*)(#{id})/ do
+          groups(Punctuation, Text, Name::Class)
+        end
+
+        rule /([|])(\s+)(#{symbol})/ do
+          groups(Punctuation, Text, Name::Class)
+        end
+
+        mixin :breakout
+        mixin :core
+      end
+
+      state :ename do
+        mixin :whitespace
+        rule /(exception|and)(\s+)(#{id})/ do
+          groups Keyword::Reserved, Text, Name::Class
+        end
+
+        rule /(exception|and)(\s*)(#{symbol})/ do
+          groups Keyword::Reserved, Text, Name::Class
+        end
+
+        rule /\b(of)\b(?!')/, Keyword::Reserved
+        mixin :breakout
+        mixin :core
+      end
+
+      state :datcon do
+        mixin :whitespace
+        rule id, Name::Class, :pop!
+        rule symbol, Name::Class, :pop!
+      end
+
+      state :tyvarseq do
+        mixin :whitespace
+        rule /'[\w']*/, Name::Decorator
+        rule id, Name
+        rule /,/, Punctuation
+        rule /[)]/, Punctuation, :pop!
+        rule symbol, Name
+      end
+
+      state :comment do
+        rule /[^(*)]+/, Comment::Multiline
+        rule /[(][*]/ do
+          token Comment::Multiline; push
+        end
+        rule /[*][)]/, Comment::Multiline, :pop!
+        rule /[(*)]/, Comment::Multiline
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sql.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sql.rb
new file mode 100644
index 0000000..23ec1cf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/sql.rb
@@ -0,0 +1,140 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class SQL < RegexLexer
+      title "SQL"
+      desc "Structured Query Language, for relational databases"
+      tag 'sql'
+      filenames '*.sql'
+      mimetypes 'text/x-sql'
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          ABORT ABS ABSOLUTE ACCESS ADA ADD ADMIN AFTER AGGREGATE ALIAS
+          ALL ALLOCATE ALTER ANALYSE ANALYZE AND ANY ARE AS ASC ASENSITIVE
+          ASSERTION ASSIGNMENT ASYMMETRIC AT ATOMIC AUTHORIZATION
+          AVG BACKWARD BEFORE BEGIN BETWEEN BITVAR BIT_LENGTH BOTH
+          BREADTH BY C CACHE CALL CALLED CARDINALITY CASCADE CASCADED
+          CASE CAST CATALOG CATALOG_NAME CHAIN CHARACTERISTICS
+          CHARACTER_LENGTH CHARACTER_SET_CATALOG CHARACTER_SET_NAME
+          CHARACTER_SET_SCHEMA CHAR_LENGTH CHECK CHECKED CHECKPOINT
+          CLASS CLASS_ORIGIN CLOB CLOSE CLUSTER COALSECE COBOL COLLATE
+          COLLATION COLLATION_CATALOG COLLATION_NAME COLLATION_SCHEMA
+          COLUMN COLUMN_NAME COMMAND_FUNCTION COMMAND_FUNCTION_CODE
+          COMMENT COMMIT COMMITTED COMPLETION CONDITION_NUMBER
+          CONNECT CONNECTION CONNECTION_NAME CONSTRAINT CONSTRAINTS
+          CONSTRAINT_CATALOG CONSTRAINT_NAME CONSTRAINT_SCHEMA
+          CONSTRUCTOR CONTAINS CONTINUE CONVERSION CONVERT COPY
+          CORRESPONTING COUNT CREATE CREATEDB CREATEUSER CROSS CUBE
+          CURRENT CURRENT_DATE CURRENT_PATH CURRENT_ROLE CURRENT_TIME
+          CURRENT_TIMESTAMP CURRENT_USER CURSOR CURSOR_NAME CYCLE DATA
+          DATABASE DATETIME_INTERVAL_CODE DATETIME_INTERVAL_PRECISION
+          DAY DEALLOCATE DECLARE DEFAULT DEFAULTS DEFERRABLE DEFERRED
+          DEFINED DEFINER DELETE DELIMITER DELIMITERS DEREF DESC DESCRIBE
+          DESCRIPTOR DESTROY DESTRUCTOR DETERMINISTIC DIAGNOSTICS
+          DICTIONARY DISCONNECT DISPATCH DISTINCT DO DOMAIN DROP
+          DYNAMIC DYNAMIC_FUNCTION DYNAMIC_FUNCTION_CODE EACH ELSE
+          ENCODING ENCRYPTED END END-EXEC EQUALS ESCAPE EVERY EXCEPT
+          ESCEPTION EXCLUDING EXCLUSIVE EXEC EXECUTE EXISTING EXISTS
+          EXPLAIN EXTERNAL EXTRACT FALSE FETCH FINAL FIRST FOR FORCE
+          FOREIGN FORTRAN FORWARD FOUND FREE FREEZE FROM FULL FUNCTION
+          G GENERAL GENERATED GET GLOBAL GO GOTO GRANT GRANTED GROUP
+          GROUPING HANDLER HAVING HIERARCHY HOLD HOST IDENTITY IGNORE
+          ILIKE IMMEDIATE IMMUTABLE IMPLEMENTATION IMPLICIT IN INCLUDING
+          INCREMENT INDEX INDITCATOR INFIX INHERITS INITIALIZE INITIALLY
+          INNER INOUT INPUT INSENSITIVE INSERT INSTANTIABLE INSTEAD
+          INTERSECT INTO INVOKER IS ISNULL ISOLATION ITERATE JOIN KEY
+          KEY_MEMBER KEY_TYPE LANCOMPILER LANGUAGE LARGE LAST LATERAL
+          LEADING LEFT LENGTH LESS LEVEL LIKE LIMIT LISTEN LOAD LOCAL
+          LOCALTIME LOCALTIMESTAMP LOCATION LOCATOR LOCK LOWER MAP MATCH
+          MAX MAXVALUE MESSAGE_LENGTH MESSAGE_OCTET_LENGTH MESSAGE_TEXT
+          METHOD MIN MINUTE MINVALUE MOD MODE MODIFIES MODIFY MONTH
+          MORE MOVE MUMPS NAMES NATIONAL NATURAL NCHAR NCLOB NEW NEXT
+          NO NOCREATEDB NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL
+          NULL NULLABLE NULLIF OBJECT OCTET_LENGTH OF OFF OFFSET OIDS
+          OLD ON ONLY OPEN OPERATION OPERATOR OPTION OPTIONS OR ORDER
+          ORDINALITY OUT OUTER OUTPUT OVERLAPS OVERLAY OVERRIDING
+          OWNER PAD PARAMETER PARAMETERS PARAMETER_MODE PARAMATER_NAME
+          PARAMATER_ORDINAL_POSITION PARAMETER_SPECIFIC_CATALOG
+          PARAMETER_SPECIFIC_NAME PARAMATER_SPECIFIC_SCHEMA PARTIAL PASCAL
+          PENDANT PLACING PLI POSITION POSTFIX PRECISION PREFIX PREORDER
+          PREPARE PRESERVE PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE
+          PUBLIC READ READS RECHECK RECURSIVE REF REFERENCES REFERENCING
+          REINDEX RELATIVE RENAME REPEATABLE REPLACE RESET RESTART
+          RESTRICT RESULT RETURN RETURNED_LENGTH RETURNED_OCTET_LENGTH
+          RETURNED_SQLSTATE RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP
+          ROUTINE ROUTINE_CATALOG ROUTINE_NAME ROUTINE_SCHEMA ROW ROWS
+          ROW_COUNT RULE SAVE_POINT SCALE SCHEMA SCHEMA_NAME SCOPE SCROLL
+          SEARCH SECOND SECURITY SELECT SELF SENSITIVE SERIALIZABLE
+          SERVER_NAME SESSION SESSION_USER SET SETOF SETS SHARE SHOW
+          SIMILAR SIMPLE SIZE SOME SOURCE SPACE SPECIFIC SPECIFICTYPE
+          SPECIFIC_NAME SQL SQLCODE SQLERROR SQLEXCEPTION SQLSTATE
+          SQLWARNINIG STABLE START STATE STATEMENT STATIC STATISTICS
+          STDIN STDOUT STORAGE STRICT STRUCTURE STYPE SUBCLASS_ORIGIN
+          SUBLIST SUBSTRING SUM SYMMETRIC SYSID SYSTEM SYSTEM_USER
+          TABLE TABLE_NAME  TEMP TEMPLATE TEMPORARY TERMINATE THAN THEN
+          TIMESTAMP TIMEZONE_HOUR TIMEZONE_MINUTE TO TOAST TRAILING
+          TRANSATION TRANSACTIONS_COMMITTED TRANSACTIONS_ROLLED_BACK
+          TRANSATION_ACTIVE TRANSFORM TRANSFORMS TRANSLATE TRANSLATION
+          TREAT TRIGGER TRIGGER_CATALOG TRIGGER_NAME TRIGGER_SCHEMA TRIM
+          TRUE TRUNCATE TRUSTED TYPE UNCOMMITTED UNDER UNENCRYPTED UNION
+          UNIQUE UNKNOWN UNLISTEN UNNAMED UNNEST UNTIL UPDATE UPPER
+          USAGE USER USER_DEFINED_TYPE_CATALOG USER_DEFINED_TYPE_NAME
+          USER_DEFINED_TYPE_SCHEMA USING VACUUM VALID VALIDATOR VALUES
+          VARIABLE VERBOSE VERSION VIEW VOLATILE WHEN WHENEVER WHERE
+          WITH WITHOUT WORK WRITE YEAR ZONE
+        )
+      end
+
+      state :root do
+        rule /\s+/m, Text
+        rule /--.*/, Comment::Single
+        rule %r(/\*), Comment::Multiline, :multiline_comments
+        rule /\d+/, Num::Integer
+        rule /'/, Str::Single, :single_string
+        rule /"/, Name::Variable, :double_string
+        rule /`/, Name::Variable, :backtick
+
+        rule /\w[\w\d]*/ do |m|
+          if self.class.keywords.include? m[0].upcase
+            token Keyword
+          else
+            token Name
+          end
+        end
+
+        rule %r([+*/<>=~!@#%^&|?^-]), Operator
+        rule /[;:()\[\],.]/, Punctuation
+      end
+
+      state :multiline_comments do
+        rule %r(/[*]), Comment::Multiline, :multiline_comments
+        rule %r([*]/), Comment::Multiline, :pop!
+        rule %r([^/*]+), Comment::Multiline
+        rule %r([/*]), Comment::Multiline
+      end
+
+      state :backtick do
+        rule /\\./, Str::Escape
+        rule /``/, Str::Escape
+        rule /`/, Name::Variable, :pop!
+        rule /[^\\`]+/, Name::Variable
+      end
+
+      state :single_string do
+        rule /\\./, Str::Escape
+        rule /''/, Str::Escape
+        rule /'/, Str::Single, :pop!
+        rule /[^\\']+/, Str::Single
+      end
+
+      state :double_string do
+        rule /\\./, Str::Escape
+        rule /""/, Str::Escape
+        rule /"/, Name::Variable, :pop!
+        rule /[^\\"]+/, Name::Variable
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/swift.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/swift.rb
new file mode 100644
index 0000000..6bc5b94
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/swift.rb
@@ -0,0 +1,159 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Swift < RegexLexer
+      tag 'swift'
+      filenames '*.swift'
+
+      title "Swift"
+      desc 'Multi paradigm, compiled programming language developed by Apple for iOS and OS X development. (developer.apple.com/swift)'
+
+      id_head = /_|(?!\p{Mc})\p{Alpha}|[^\u0000-\uFFFF]/
+      id_rest = /[\p{Alnum}_]|[^\u0000-\uFFFF]/
+      id = /#{id_head}#{id_rest}*/
+
+      keywords = Set.new %w(
+        break case continue default do else fallthrough if in for return switch where while try catch throw guard defer repeat
+
+        as dynamicType is new super self Self Type __COLUMN__ __FILE__ __FUNCTION__ __LINE__
+
+        associativity didSet get infix inout left mutating none nonmutating operator override postfix precedence prefix right set unowned weak willSet throws rethrows associatedtype
+      )
+
+      declarations = Set.new %w(
+        class deinit enum extension final func import init internal lazy let optional private protocol public required static struct subscript typealias var dynamic indirect associatedtype
+      )
+
+      constants = Set.new %w(
+        true false nil
+      )
+
+      start { push :bol }
+
+      # beginning of line
+      state :bol do
+        rule /#.*/, Comment::Preproc
+
+        mixin :inline_whitespace
+
+        rule(//) { pop! }
+      end
+
+      state :inline_whitespace do
+        rule /\s+/m, Text
+        mixin :has_comments
+      end
+
+      state :whitespace do
+        rule /\n+/m, Text, :bol
+        rule %r(\/\/.*?$), Comment::Single, :bol
+        mixin :inline_whitespace
+      end
+
+      state :has_comments do
+        rule %r(/[*]), Comment::Multiline, :nested_comment
+      end
+
+      state :nested_comment do
+        mixin :has_comments
+        rule %r([*]/), Comment::Multiline, :pop!
+        rule %r([^*/]+)m, Comment::Multiline
+        rule /./, Comment::Multiline
+      end
+
+      state :root do
+        mixin :whitespace
+        rule /\$(([1-9]\d*)?\d)/, Name::Variable
+
+        rule %r{[()\[\]{}:;,?]}, Punctuation
+        rule %r([-/=+*%<>!&|^.~]+), Operator
+        rule /@?"/, Str, :dq
+        rule /'(\\.|.)'/, Str::Char
+        rule /(\d+\*|\d*\.\d+)(e[+-]?[0-9]+)?/i, Num::Float
+        rule /\d+e[+-]?[0-9]+/i, Num::Float
+        rule /0_?[0-7]+(?:_[0-7]+)*/, Num::Oct
+        rule /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Hex
+        rule /0b[01]+(?:_[01]+)*/, Num::Bin
+        rule %r{[\d]+(?:_\d+)*}, Num::Integer
+
+        rule /@#{id}(\([^)]+\))?/, Keyword::Declaration
+
+        rule /(private|internal)(\([ ]*)(\w+)([ ]*\))/ do |m|
+          if m[3] == 'set'
+            token Keyword::Declaration
+          else
+            groups Keyword::Declaration, Keyword::Declaration, Error, Keyword::Declaration
+          end
+        end
+
+        rule /(unowned\([ ]*)(\w+)([ ]*\))/ do |m|
+          if m[2] == 'safe' || m[2] == 'unsafe'
+            token Keyword::Declaration
+          else
+            groups Keyword::Declaration, Error, Keyword::Declaration
+          end
+        end
+        
+        rule /#available\([^)]+\)/, Keyword::Declaration
+        
+        rule /(#selector\()([^)]+?(?:[(].*?[)])?)(\))/ do
+          groups Keyword::Declaration, Name::Function, Keyword::Declaration
+        end
+
+        rule /(let|var)\b(\s*)(#{id})/ do
+          groups Keyword, Text, Name::Variable
+        end
+
+        rule /(?!\b(if|while|for|private|internal|unowned|switch|case)\b)\b#{id}(?=(\?|!)?\s*[(])/ do |m|
+          if m[0] =~ /^[[:upper:]]/
+            token Keyword::Type
+          else
+            token Name::Function
+          end
+        end
+        
+        rule /as[?!]?(?=\s)/, Keyword
+        rule /try[!]?(?=\s)/, Keyword
+
+        rule /(#?(?!default)(?![[:upper:]])#{id})(\s*)(:)/ do
+          groups Name::Variable, Text, Punctuation
+        end
+
+        rule id do |m|
+          if keywords.include? m[0]
+            token Keyword
+          elsif declarations.include? m[0]
+            token Keyword::Declaration
+          elsif constants.include? m[0]
+            token Keyword::Constant
+          elsif m[0] =~ /^[[:upper:]]/
+            token Keyword::Type
+          else
+            token Name
+          end
+        end
+      end
+
+      state :dq do
+        rule /\\[\\0tnr'"]/, Str::Escape
+        rule /\\[(]/, Str::Escape, :interp
+        rule /\\u\{\h{1,8}\}/, Str::Escape
+        rule /[^\\"]+/, Str
+        rule /"/, Str, :pop!
+      end
+
+      state :interp do
+        rule /[(]/, Punctuation, :interp_inner
+        rule /[)]/, Str::Escape, :pop!
+        mixin :root
+      end
+
+      state :interp_inner do
+        rule /[(]/, Punctuation, :push
+        rule /[)]/, Punctuation, :pop!
+        mixin :root
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tap.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tap.rb
new file mode 100644
index 0000000..6c834e3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tap.rb
@@ -0,0 +1,91 @@
+module Rouge
+  module Lexers
+    class Tap < RegexLexer
+      title 'TAP'
+      desc 'Test Anything Protocol'
+      tag 'tap'
+      aliases 'tap'
+      filenames '*.tap'
+
+      mimetypes 'text/x-tap', 'application/x-tap'
+
+      def self.analyze_text(text)
+        return 0
+      end
+
+      state :root do
+        # A TAP version may be specified.
+        rule /^TAP version \d+\n/, Name::Namespace
+
+        # Specify a plan with a plan line.
+        rule /^1\.\.\d+/, Keyword::Declaration, :plan
+
+        # A test failure
+        rule /^(not ok)([^\S\n]*)(\d*)/ do
+          groups Generic::Error, Text, Literal::Number::Integer
+          push :test
+        end
+
+        # A test success
+        rule /^(ok)([^\S\n]*)(\d*)/ do
+          groups Keyword::Reserved, Text, Literal::Number::Integer
+          push :test
+        end
+
+        # Diagnostics start with a hash.
+        rule /^#.*\n/, Comment
+
+        # TAP's version of an abort statement.
+        rule /^Bail out!.*\n/, Generic::Error
+
+        # # TAP ignores any unrecognized lines.
+        rule /^.*\n/, Text
+      end
+
+      state :plan do
+        # Consume whitespace (but not newline).
+        rule /[^\S\n]+/, Text
+
+        # A plan may have a directive with it.
+        rule /#/, Comment, :directive
+
+        # Or it could just end.
+        rule /\n/, Comment, :pop!
+
+        # Anything else is wrong.
+        rule /.*\n/, Generic::Error, :pop!
+      end
+
+      state :test do
+        # Consume whitespace (but not newline).
+        rule /[^\S\n]+/, Text
+
+        # A test may have a directive with it.
+        rule /#/, Comment, :directive
+
+        rule /\S+/, Text
+
+        rule /\n/, Text, :pop!
+      end
+
+      state :directive do
+        # Consume whitespace (but not newline).
+        rule /[^\S\n]+/, Comment
+
+        # Extract todo items.
+        rule /(?i)\bTODO\b/, Comment::Preproc
+
+        # Extract skip items.
+        rule /(?i)\bSKIP\S*/, Comment::Preproc
+
+        rule /\S+/, Comment
+
+        rule /\n/ do
+          token Comment
+          pop! 2
+        end
+      end
+    end
+  end
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tcl.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tcl.rb
new file mode 100644
index 0000000..240ac6a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tcl.rb
@@ -0,0 +1,192 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class TCL < RegexLexer
+      title "Tcl"
+      desc "The Tool Command Language (tcl.tk)"
+      tag 'tcl'
+      filenames '*.tcl'
+      mimetypes 'text/x-tcl', 'text/x-script.tcl', 'application/x-tcl'
+
+      def self.analyze_text(text)
+        return 1 if text.shebang? 'tclsh'
+        return 1 if text.shebang? 'wish'
+        return 1 if text.shebang? 'jimsh'
+      end
+
+      KEYWORDS = %w(
+        after apply array break catch continue elseif else error
+        eval expr for foreach global if namespace proc rename return
+        set switch then trace unset update uplevel upvar variable
+        vwait while
+      )
+
+      BUILTINS = %w(
+        append bgerror binary cd chan clock close concat dde dict
+        encoding eof exec exit fblocked fconfigure fcopy file
+        fileevent flush format gets glob history http incr info interp
+        join lappend lassign lindex linsert list llength load loadTk
+        lrange lrepeat lreplace lreverse lsearch lset lsort mathfunc
+        mathop memory msgcat open package pid pkg::create pkg_mkIndex
+        platform platform::shell puts pwd re_syntax read refchan
+        regexp registry regsub scan seek socket source split string
+        subst tell time tm unknown unload
+      )
+
+      OPEN =  %w| \( \[ \{ " |
+      CLOSE = %w| \) \] \} |
+      ALL = OPEN + CLOSE
+      END_LINE = CLOSE + %w(; \n)
+      END_WORD = END_LINE + %w(\s)
+
+      CHARS =     lambda { |list| Regexp.new %/[#{list.join}]/  }
+      NOT_CHARS = lambda { |list| Regexp.new %/[^#{list.join}]/ }
+
+      state :word do
+        rule /\{\*\}/, Keyword
+
+        mixin :brace_abort
+        mixin :interp
+        rule /\{/, Punctuation, :brace
+        rule /\(/, Punctuation,   :paren
+        rule /"/,  Str::Double, :string
+        rule /#{NOT_CHARS[END_WORD]}+?(?=#{CHARS[OPEN+['\\\\']]})/, Text
+      end
+
+      def self.gen_command_state(name='')
+        state(:"command#{name}") do
+          mixin :word
+
+          rule /##{NOT_CHARS[END_LINE]}+/, Comment::Single
+
+          rule /(?=#{CHARS[END_WORD]})/ do
+            push :"params#{name}"
+          end
+
+          rule /#{NOT_CHARS[END_WORD]}+/ do |m|
+            if KEYWORDS.include? m[0]
+              token Keyword
+            elsif BUILTINS.include? m[0]
+              token Name::Builtin
+            else
+              token Text
+            end
+          end
+
+          mixin :whitespace
+        end
+      end
+
+      def self.gen_delimiter_states(name, close, opts={})
+        gen_command_state("_in_#{name}")
+
+        state :"params_in_#{name}" do
+          rule close do
+            token Punctuation
+            pop! 2
+          end
+
+          # mismatched delimiters.  Braced strings with mismatched
+          # closing delimiters should be okay, since this is standard
+          # practice, like {]]]]}
+          if opts[:strict]
+            rule CHARS[CLOSE - [close]], Error
+          else
+            rule CHARS[CLOSE - [close]], Text
+          end
+
+          mixin :params
+        end
+
+        state name do
+          rule close, Punctuation, :pop!
+          mixin :"command_in_#{name}"
+        end
+      end
+
+
+      # tcl is freaking impossible.  If we're in braces and we encounter
+      # a close brace, we have to drop everything and close the brace.
+      # This is so silly things like {abc"def} and {abc]def} don't b0rk
+      # everything after them.
+
+      # TODO: TCL seems to have this aborting behavior quite a lot.
+      # such things as [ abc" ] are a runtime error, but will still
+      # parse.  Currently something like this will muck up the lex.
+      state :brace_abort do
+        rule /}/ do
+          if in_state? :brace
+            pop! until state? :brace
+            pop!
+            token Punctuation
+          else
+            token Error
+          end
+        end
+      end
+
+      state :params do
+        rule /;/, Punctuation, :pop!
+        rule /\n/, Text, :pop!
+        rule /else|elseif|then/, Keyword
+        mixin :word
+        mixin :whitespace
+        rule /#{NOT_CHARS[END_WORD]}+/, Text
+      end
+
+      gen_delimiter_states :brace,   /\}/, :strict => false
+      gen_delimiter_states :paren,   /\)/, :strict => true
+      gen_delimiter_states :bracket, /\]/, :strict => true
+      gen_command_state
+
+      state :root do
+        mixin :command
+      end
+
+      state :whitespace do
+        # not a multiline regex because we want to capture \n sometimes
+        rule /\s+/, Text
+      end
+
+      state :interp do
+        rule /\[/, Punctuation, :bracket
+        rule /\$[a-z0-9.:-]+/, Name::Variable
+        rule /\$\{.*?\}/m, Name::Variable
+        rule /\$/, Text
+
+        # escape sequences
+        rule /\\[0-7]{3}/, Str::Escape
+        rule /\\x[0-9a-f]{2}/i, Str::Escape
+        rule /\\u[0-9a-f]{4}/i, Str::Escape
+        rule /\\./m, Str::Escape
+      end
+
+      state :string do
+        rule /"/, Str::Double, :pop!
+        mixin :interp
+        rule /[^\\\[\$"{}]+/m, Str::Double
+
+        # strings have to keep count of their internal braces, to support
+        # for example { "{ }" }.
+        rule /{/ do
+          @brace_count ||= 0
+          @brace_count += 1
+
+          token Str::Double
+        end
+
+        rule /}/ do
+          if in_state? :brace and @brace_count.to_i == 0
+            pop! until state? :brace
+            pop!
+            token Punctuation
+          else
+            @brace_count -= 1
+            token Str::Double
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tex.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tex.rb
new file mode 100644
index 0000000..903a941
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tex.rb
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class TeX < RegexLexer
+      title "TeX"
+      desc "The TeX typesetting system"
+      tag 'tex'
+      aliases 'TeX', 'LaTeX', 'latex'
+
+      filenames '*.tex', '*.aux', '*.toc'
+      mimetypes 'text/x-tex', 'text/x-latex'
+
+      def self.analyze_text(text)
+        return 1 if text =~ /\A\s*\\documentclass/
+        return 1 if text =~ /\A\s*\\input/
+        return 1 if text =~ /\A\s*\\documentstyle/
+        return 1 if text =~ /\A\s*\\relax/
+      end
+
+      command = /\\([a-z]+|\s+|.)/i
+
+      state :general do
+        rule /%.*$/, Comment
+        rule /[{}&_^]/, Punctuation
+      end
+
+      state :root do
+        rule /\\\[/, Punctuation, :displaymath
+        rule /\\\(/, Punctuation, :inlinemath
+        rule /\$\$/, Punctuation, :displaymath
+        rule /\$/, Punctuation, :inlinemath
+        rule /\\(begin|end)\{.*?\}/, Name::Tag
+
+        rule /(\\verb)\b(\S)(.*?)(\2)/ do |m|
+          groups Name::Builtin, Keyword::Pseudo, Str::Other, Keyword::Pseudo
+        end
+
+        rule command, Keyword, :command
+        mixin :general
+        rule /[^\\$%&_^{}]+/, Text
+      end
+
+      state :math do
+        rule command, Name::Variable
+        mixin :general
+        rule /[0-9]+/, Num
+        rule /[-=!+*\/()\[\]]/, Operator
+        rule /[^=!+*\/()\[\]\\$%&_^{}0-9-]+/, Name::Builtin
+      end
+
+      state :inlinemath do
+        rule /\\\)/, Punctuation, :pop!
+        rule /\$/, Punctuation, :pop!
+        mixin :math
+      end
+
+      state :displaymath do
+        rule /\\\]/, Punctuation, :pop!
+        rule /\$\$/, Punctuation, :pop!
+        rule /\$/, Name::Builtin
+        mixin :math
+      end
+
+      state :command do
+        rule /\[.*?\]/, Name::Attribute
+        rule /\*/, Keyword
+        rule(//) { pop! }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/toml.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/toml.rb
new file mode 100644
index 0000000..984ade2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/toml.rb
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class TOML < RegexLexer
+      title "TOML"
+      desc 'the TOML configuration format (https://github.com/mojombo/toml)'
+      tag 'toml'
+
+      filenames '*.toml'
+      mimetypes 'text/x-toml'
+
+      def self.analyze_text(text)
+        return 0.1 if text =~ /\A\[[\w.]+\]\s*\w+\s*=\s*("\w+")+/
+      end
+
+      identifier = /[\w.\S]+/
+
+      state :basic do
+        rule /\s+/, Text
+        rule /#.*?$/, Comment
+        rule /(true|false)/, Keyword::Constant
+        rule /(?<!=)\s*\[[\w\d\S]+\]/, Name::Namespace
+
+        rule /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z/, Literal::Date
+
+        rule /(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?/, Num::Float
+        rule /\d+[eE][+-]?[0-9]+j?/, Num::Float
+        rule /\-?\d+/, Num::Integer
+      end
+
+      state :root do
+        mixin :basic
+
+        rule /(#{identifier})(\s*)(=)/ do
+          groups Name::Property, Text, Punctuation
+          push :value
+        end
+
+      end
+
+      state :value do
+        rule /\n/, Text, :pop!
+        mixin :content
+      end
+
+      state :content do
+        mixin :basic
+        rule /"/, Str, :dq
+        mixin :esc_str
+        rule /\,/, Punctuation
+        rule /\[/, Punctuation, :array
+      end
+
+      state :dq do
+        rule /"/, Str, :pop!
+        mixin :esc_str
+        rule /[^\\"]+/, Str
+      end
+
+      state :esc_str do
+        rule /\\[0t\tn\n "\\ r]/, Str::Escape
+      end
+
+      state :array do
+        mixin :content
+        rule /\]/, Punctuation, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tulip.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tulip.rb
new file mode 100644
index 0000000..a43dd55
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/tulip.rb
@@ -0,0 +1,75 @@
+module Rouge
+  module Lexers
+    class Tulip < RegexLexer
+      tag 'tulip'
+      aliases 'tlp'
+      filenames '*.tlp'
+      desc 'The tulip programming language http://github.com/jneen/tulip'
+
+      id = /\w[\w-]*/
+
+      def self.analyze_text(text)
+        return 1 if text.shebang?('tulip')
+      end
+
+      state :root do
+        rule /\s+/, Text
+        rule /#.*?\n/, Comment
+        rule /%#{id}/, Keyword::Type
+        rule /@#{id}/, Keyword
+        rule /[.][.]?#{id}/, Name::Label
+        rule /-#{id}[?]?/, Str::Symbol
+        rule /\d+/, Num
+        rule %r(/#{id}?), Name::Decorator
+        rule %r((#{id}/)(#{id})) do
+          groups Name::Namespace, Name::Variable
+        end
+
+        rule /"{/, Str, :string_interp
+        rule /'?{/, Str, :string
+        rule /['"][^\s)\]]+/, Str
+
+        rule /[$]/, Name::Variable
+
+        rule /[-+:;~!()\[\]=?>|_%,]/, Punctuation
+        rule /[.][.][.]/, Punctuation
+        rule id, Name
+      end
+
+      state :string_base do
+        rule /{/ do
+          token Str; push
+        end
+
+        rule /}/, Str, :pop!
+        rule /[$]/, Str
+        rule /[^${}\\]+/, Str
+      end
+
+      state :string do
+        mixin :string_base
+        rule /\\/, Str
+      end
+
+      state :interp do
+        rule(/[(]/) { token Punctuation; push }
+        rule /[)]/, Punctuation, :pop!
+        mixin :root
+      end
+
+      state :interp_root do
+        rule /[(]/, Str::Interpol, :interp
+        rule /[)]/, Str::Interpol, :pop!
+        mixin :root
+      end
+
+      state :string_interp do
+        rule /\\./, Str::Escape
+        rule /[$][(]/, Str::Interpol, :interp_root
+        rule /[$]#{id}?/, Name::Variable
+        mixin :string_base
+      end
+    end
+  end
+end
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/twig.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/twig.rb
new file mode 100644
index 0000000..5fcf069
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/twig.rb
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    load_lexer 'jinja.rb'
+
+    class Twig < Jinja
+      title "Twig"
+      desc "Twig template engine (twig.sensiolabs.org)"
+
+      tag "twig"
+
+      mimetypes 'application/x-twig', 'text/html+twig'
+
+      def self.keywords
+        @@keywords ||= %w(as do extends flush from import include use else starts
+                          ends with without autoescape endautoescape block endblock
+                          embed endembed filter endfilter for endfor if endif
+                          macro endmacro sandbox endsandbox set endset
+                          spaceless endspaceless verbatim endverbatim)
+      end
+
+      def self.tests
+        @@tests ||= %w(constant defined divisibleby empty even iterable null odd
+                       sameas)
+      end
+
+      def self.pseudo_keywords
+        @@pseudo_keywords ||= %w(true false none)
+      end
+
+      def self.word_operators
+        @@word_operators ||= %w(b-and b-or b-xor is in and or not)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/typescript.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/typescript.rb
new file mode 100644
index 0000000..d2a15c0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/typescript.rb
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    load_lexer 'javascript.rb'
+
+    class Typescript < Javascript
+      title "TypeScript"
+      desc "TypeScript, a superset of JavaScript"
+
+      tag 'typescript'
+      aliases 'ts'
+      
+      filenames '*.ts', '*.d.ts'
+                
+      mimetypes 'text/typescript'
+
+      def self.keywords
+        @keywords ||= super + Set.new(%w(
+          import export from as is
+          namespace new static private protected public
+          super async await extends implements readonly
+        ))
+      end
+      
+      def self.declarations
+        @declarations ||= super + Set.new(%w(
+          const type constructor abstract
+        ))
+      end
+
+      def self.reserved
+        @reserved ||= super + Set.new(%w(
+          string any number namespace module
+          declare default interface         
+        ))
+      end
+      
+      def self.builtins
+        @builtins ||= super + %w(
+          Promise Set Map WeakSet WeakMap Symbol
+        )
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/vb.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/vb.rb
new file mode 100644
index 0000000..b7f3d5f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/vb.rb
@@ -0,0 +1,164 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class VisualBasic < RegexLexer
+      title "Visual Basic"
+      desc "Visual Basic"
+      tag 'vb'
+      aliases 'visualbasic'
+      filenames '*.vbs', '*.vb'
+      mimetypes 'text/x-visualbasic', 'application/x-visualbasic'
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          AddHandler Alias ByRef ByVal CBool CByte CChar CDate CDbl CDec
+          CInt CLng CObj CSByte CShort CSng CStr CType CUInt CULng CUShort
+          Call Case Catch Class Const Continue Declare Default Delegate
+          Dim DirectCast Do Each Else ElseIf End EndIf Enum Erase Error
+          Event Exit False Finally For Friend Function Get Global GoSub
+          GoTo Handles If Implements Imports Inherits Interface Let
+          Lib Loop Me Module MustInherit MustOverride MyBase MyClass
+          Namespace Narrowing New Next Not NotInheritable NotOverridable
+          Nothing Of On Operator Option Optional Overloads Overridable
+          Overrides ParamArray Partial Private Property Protected Public
+          RaiseEvent ReDim ReadOnly RemoveHandler Resume Return Select Set
+          Shadows Shared Single Static Step Stop Structure Sub SyncLock
+          Then Throw To True Try TryCast Using Wend When While Widening
+          With WithEvents WriteOnly
+        )
+      end
+
+      def self.keywords_type
+        @keywords_type ||= Set.new %w(
+          Boolean Byte Char Date Decimal Double Integer Long Object
+          SByte Short Single String Variant UInteger ULong UShort
+        )
+      end
+
+      def self.operator_words
+        @operator_words ||= Set.new %w(
+          AddressOf And AndAlso As GetType In Is IsNot Like Mod Or OrElse
+          TypeOf Xor
+        )
+      end
+
+      def self.builtins
+        @builtins ||= Set.new %w(
+          Console ConsoleColor
+        )
+      end
+
+      id = /[a-z_]\w*/i
+      upper_id = /[A-Z]\w*/
+
+      state :whitespace do
+        rule /\s+/, Text
+        rule /\n/, Text, :bol
+        rule /rem\b.*?$/i, Comment::Single
+        rule %r(%\{.*?%\})m, Comment::Multiline
+        rule /'.*$/, Comment::Single
+      end
+
+      state :bol do
+        rule /\s+/, Text
+        rule /<.*?>/, Name::Attribute
+        rule(//) { :pop! }
+      end
+
+      state :root do
+        mixin :whitespace
+        rule %r(
+            [#]If\b .*? \bThen
+          | [#]ElseIf\b .*? \bThen
+          | [#]End \s+ If
+          | [#]Const
+          | [#]ExternalSource .*? \n
+          | [#]End \s+ ExternalSource
+          | [#]Region .*? \n
+          | [#]End \s+ Region
+          | [#]ExternalChecksum
+        )x, Comment::Preproc
+        rule /[.]/, Punctuation, :dotted
+        rule /[(){}!#,:]/, Punctuation
+        rule /Option\s+(Strict|Explicit|Compare)\s+(On|Off|Binary|Text)/,
+          Keyword::Declaration
+        rule /End\b/, Keyword, :end
+        rule /(Dim|Const)\b/, Keyword, :dim
+        rule /(Function|Sub|Property)\b/, Keyword, :funcname
+        rule /(Class|Structure|Enum)\b/, Keyword, :classname
+        rule /(Module|Namespace|Imports)\b/, Keyword, :namespace
+
+        rule upper_id do |m|
+          match = m[0]
+          if self.class.keywords.include? match
+            token Keyword
+          elsif self.class.keywords_type.include? match
+            token Keyword::Type
+          elsif self.class.operator_words.include? match
+            token Operator::Word
+          elsif self.class.builtins.include? match
+            token Name::Builtin
+          else
+            token Name
+          end
+        end
+
+        rule(
+          %r(&=|[*]=|/=|\\=|\^=|\+=|-=|<<=|>>=|<<|>>|:=|<=|>=|<>|[-&*/\\^+=<>.]),
+          Operator
+        )
+
+        rule /"/, Str, :string
+        rule /#{id}[%&@!#\$]?/, Name
+        rule /#.*?#/, Literal::Date
+
+        rule /(\d+\.\d*|\d*\.\d+)(f[+-]?\d+)?/i, Num::Float
+        rule /\d+([SILDFR]|US|UI|UL)?/, Num::Integer
+        rule /&H[0-9a-f]+([SILDFR]|US|UI|UL)?/, Num::Integer
+        rule /&O[0-7]+([SILDFR]|US|UI|UL)?/, Num::Integer
+
+        rule /_\n/, Keyword
+      end
+
+      state :dotted do
+        mixin :whitespace
+        rule id, Name, :pop!
+      end
+
+      state :string do
+        rule /""/, Str::Escape
+        rule /"C?/, Str, :pop!
+        rule /[^"]+/, Str
+      end
+
+      state :dim do
+        mixin :whitespace
+        rule id, Name::Variable, :pop!
+        rule(//) { pop! }
+      end
+
+      state :funcname do
+        mixin :whitespace
+        rule id, Name::Function, :pop!
+      end
+
+      state :classname do
+        mixin :whitespace
+        rule id, Name::Class, :pop!
+      end
+
+      state :namespace do
+        mixin :whitespace
+        rule /#{id}([.]#{id})*/, Name::Namespace, :pop!
+      end
+
+      state :end do
+        mixin :whitespace
+        rule /(Function|Sub|Property|Class|Structure|Enum|Module|Namespace)\b/,
+          Keyword, :pop!
+        rule(//) { pop! }
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/verilog.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/verilog.rb
new file mode 100644
index 0000000..bc56f00
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/verilog.rb
@@ -0,0 +1,164 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class Verilog < RegexLexer
+      title "Verilog and System Verilog"
+      desc "The System Verilog hardware description language"
+      tag 'verilog'
+      filenames '*.v', '*.sv', '*.svh'
+      mimetypes 'text/x-verilog', 'text/x-systemverilog'
+
+      # optional comment or whitespace
+      ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+)
+      id = /[a-zA-Z_][a-zA-Z0-9_]*/
+
+      def self.keywords
+        @keywords ||= Set.new %w(
+          alias always always_comb always_ff always_latch assert assert_strobe
+          assign assume automatic attribute before begin bind bins binsof break
+          case casex casez clocking config constraint context continue cover
+          covergroup coverpoint cross deassign defparam default design dist do
+          else end endattribute endcase endclass endclocking endconfig
+          endfunction endgenerate endgroup endinterface endmodule endpackage
+          endprimitive endprogram endproperty endspecify endsequence endtable
+          endtask expect export extends extern final first_match for force
+          foreach fork forkjoin forever function generate genvar if iff ifnone
+          ignore_bins illegal_bins import incdir include initial inside instance
+          interface intersect join join_any join_none liblist library local
+          localparam  matches module modport new noshowcancelled null package
+          parameter primitive priority program property protected
+          pulsestyle_onevent  pulsestyle_ondetect pure rand randc randcase
+          randsequence release return sequence showcancelled solve specify super
+          table task this throughout timeprecision timeunit type typedef unique
+          use wait wait_order while wildcard with within
+        )
+      end
+
+      def self.keywords_type
+        @keywords_type ||= Set.new %w(
+          and bit buf bufif0 bufif1 byte cell chandle class cmos const disable
+          edge enum event highz0 highz1 initial inout input int integer join
+          logic longint macromodule medium nand negedge nmos nor not
+          notif0 notif1 or output packed parameter pmos posedge pull0 pull1
+          pulldown pullup rcmos real realtime ref reg repeat rnmos rpmos rtran
+          rtranif0 rtranif1 scalared shortint shortreal signed  specparam
+          static string strength strong0 strong1 struct supply0 supply1 tagged
+          time tran tranif0 tranif1 tri tri0 tri1 triand trior trireg union
+          unsigned uwire var vectored virtual void wait wand weak[01] wire wor
+          xnor xor
+        )
+      end
+
+      def self.keywords_system_task
+        @keyword_system_task ||= Set.new %w(
+          acos acosh asin asinh assertfailoff assertfailon  assertkill
+          assertnonvacuouson assertoff asserton assertpassoff assertpasson
+          assertvacuousoff atan atan2 atanh bits bitstoreal  bitstoshortreal
+          cast ceil changed changed_gclk changing_gclk clog2 cos cosh countones
+          coverage_control coverage_get coverage_get_max coverage_merge
+          coverage_save dimensions display displayb displayh displayo
+          dist_chi_square dist_erlang dist_exponential dist_normal dist_poisson
+          dist_t dist_uniform dumpall dumpfile dumpflush dumplimit dumpoff
+          dumpon dumpports dumpportsall dumpportsflush dumpportslimit
+          dumpportsoff dumpportson dumpvars error exit exp falling_gclk fclose
+          fdisplay fdisplayb fdisplayh fdisplayo fell fell_gclk feof ferror
+          fflush fgetc fgets finish floor fmonitor fmonitorb fmonitorh fmonitoro
+          fopen fread fscanf fseek fstrobe fstrobeb fstrobeh fstrobeo ftell
+          future_gclk fwrite fwriteb fwriteh fwriteo get_coverage high hypot
+          increment info isunbounded isunknown itor left ln load_coverage_db
+          log10 low monitor monitorb monitorh monitoro monitoroff monitoron
+          onehot onehot0 past past_gclk pow printtimescale q_add q_exam q_full
+          q_initialize q_remove random readmemb readmemh realtime realtobits
+          rewind right rising_gclk rose rose_gclk rtoi sampled
+          set_coverage_db_name sformat sformatf shortrealtobits signed sin sinh
+          size sqrt sscanf stable stable_gclk steady_gclk stime stop strobe
+          strobeb strobeh strobeo swrite swriteb swriteh swriteo system tan tanh
+          time timeformat typename ungetc unpacked_dimensions unsigned warning
+          write writeb writeh writememb writememh writeo
+        )
+      end
+
+      state :expr_bol do
+        mixin :inline_whitespace
+        rule /`define/, Comment::Preproc, :macro
+
+        rule(//) { pop! }
+      end
+
+      # :expr_bol is the same as :bol but without labels, since
+      # labels can only appear at the beginning of a statement.
+      state :bol do
+        rule /#{id}:(?!:)/, Name::Label
+        mixin :expr_bol
+      end
+
+      state :inline_whitespace do
+        rule /[ \t\r]+/, Text
+        rule /\\\n/, Text # line continuation
+        rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline
+      end
+
+      state :whitespace do
+        rule /\n+/m, Text, :bol
+        rule %r(//(\\.|.)*?\n), Comment::Single, :bol
+        mixin :inline_whitespace
+      end
+
+      state :expr_whitespace do
+        rule /\n+/m, Text, :expr_bol
+        mixin :whitespace
+      end
+
+      state :string do
+        rule /"/, Str, :pop!
+        rule /\\([\\abfnrtv"']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})/, Str::Escape
+        rule /[^\\"\n]+/, Str
+        rule /\\\n/, Str
+        rule /\\/, Str # stray backslash
+      end
+
+      state :statement do
+        mixin :whitespace
+        rule /L?"/, Str, :string
+        rule /(\d+\.\d*|\d*\.\d+)(e[+-]?[0-9]+)?/i, Num::Float
+        rule /\d+e[+-]?[0-9]+/i, Num::Float
+        rule /[0-9]*'h[0-9a-fA-F]+/, Num::Hex
+        rule /[0-9]*'b?[01xz]+/, Num::Bin
+        rule /[0-9]*'d[0-9]+/, Num::Integer
+        rule /\d+[lu]*/i, Num::Integer
+        rule %r([~!%^&*+-=\|?:<>/@{}]), Operator
+        rule /[()\[\],.$\#]/, Punctuation
+        rule /`(\w+)/, Comment::Preproc
+
+        rule id do |m|
+          name = m[0]
+
+          if self.class.keywords.include? name
+            token Keyword
+          elsif self.class.keywords_type.include? name
+            token Keyword::Type
+          elsif self.class.keywords_system_task.include? name
+            token Name::Builtin
+          else
+            token Name
+          end
+        end
+      end
+
+      state :root do
+        mixin :expr_whitespace
+        rule(//) { push :statement }
+      end
+
+      state :macro do
+        rule /\n/, Comment::Preproc, :pop!
+        mixin :inline_whitespace
+        rule /;/, Punctuation
+        rule /\=/, Operator
+        rule /(\w+)/, Text
+      end
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/viml.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/viml.rb
new file mode 100644
index 0000000..109e2cf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/viml.rb
@@ -0,0 +1,101 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class VimL < RegexLexer
+      title "VimL"
+      desc "VimL, the scripting language for the Vim editor (vim.org)"
+      tag 'viml'
+      aliases 'vim', 'vimscript', 'ex'
+      filenames '*.vim', '*.vba', '.vimrc', '.exrc', '.gvimrc',
+                '_vimrc', '_exrc', '_gvimrc' # _ names for windows
+
+      mimetypes 'text/x-vim'
+
+      def self.keywords
+        load Pathname.new(__FILE__).dirname.join('viml/keywords.rb')
+        self.keywords
+      end
+
+      state :root do
+        rule /^(\s*)(".*?)$/ do
+          groups Text, Comment
+        end
+
+        rule /^\s*\\/, Str::Escape
+
+        rule /[ \t]+/, Text
+
+        # TODO: regexes can have other delimiters
+        rule %r(/(\\\\|\\/|[^\n/])*/), Str::Regex
+        rule %r("(\\\\|\\"|[^\n"])*"), Str::Double
+        rule %r('(\\\\|\\'|[^\n'])*'), Str::Single
+
+        # if it's not a string, it's a comment.
+        rule /(?<=\s)"[^-:.%#=*].*?$/, Comment
+
+        rule /-?\d+/, Num
+        rule /#[0-9a-f]{6}/i, Num::Hex
+        rule /^:/, Punctuation
+        rule /[():<>+=!\[\]{}\|,~.-]/, Punctuation
+        rule /\b(let|if|else|endif|elseif|fun|function|endfunction)\b/,
+          Keyword
+
+        rule /\b(NONE|bold|italic|underline|dark|light)\b/, Name::Builtin
+
+        rule /[absg]:\w+\b/, Name::Variable
+        rule /\b\w+\b/ do |m|
+          name = m[0]
+          keywords = self.class.keywords
+
+          if mapping_contains?(keywords[:command], name)
+            token Keyword
+          elsif mapping_contains?(keywords[:option], name)
+            token Name::Builtin
+          elsif mapping_contains?(keywords[:auto], name)
+            token Name::Builtin
+          else
+            token Text
+          end
+        end
+
+        # no errors in VimL!
+        rule /./m, Text
+      end
+
+      def mapping_contains?(mapping, word)
+        shortest, longest = find_likely_mapping(mapping, word)
+
+        shortest and word.start_with?(shortest) and
+        longest and longest.start_with?(word)
+      end
+
+      # binary search through the mappings to find the one that's likely
+      # to actually work.
+      def find_likely_mapping(mapping, word)
+        min = 0
+        max = mapping.size
+
+        until max == min
+          mid = (max + min) / 2
+
+          cmp, _ = mapping[mid]
+
+          case word <=> cmp
+          when 1
+            # too low
+            min = mid + 1
+          when -1
+            # too high
+            max = mid
+          when 0
+            # just right, abort!
+            return mapping[mid]
+          end
+        end
+
+        mapping[max - 1]
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/viml/keywords.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/viml/keywords.rb
new file mode 100644
index 0000000..6dbba0e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/viml/keywords.rb
@@ -0,0 +1,12 @@
+# encoding: utf-8
+# DO NOT EDIT: automatically generated by `rake builtins:vim`.
+# see tasks/vim.rake for more info.
+module Rouge
+  module Lexers
+    class VimL
+      def self.keywords
+        @keywords ||= {:command=>[["a", "a"], ["ab", "ab"], ["abc", "abclear"], ["abo", "aboveleft"], ["al", "all"], ["ar", "ar"], ["ar", "args"], ["arga", "argadd"], ["argd", "argdelete"], ["argdo", "argdo"], ["arge", "argedit"], ["argg", "argglobal"], ["argl", "arglocal"], ["argu", "argument"], ["as", "ascii"], ["au", "au"], ["b", "buffer"], ["bN", "bNext"], ["ba", "ball"], ["bad", "badd"], ["bd", "bdelete"], ["bel", "belowright"], ["bf", "bfirst"], ["bl", "blast"], ["bm", "bmodified"], ["bn", "bnext"], ["bo", "botright"], ["bp", "bprevious"], ["br", "br"], ["br", "brewind"], ["brea", "break"], ["breaka", "breakadd"], ["breakd", "breakdel"], ["breakl", "breaklist"], ["bro", "browse"], ["bu", "bu"], ["buf", "buf"], ["bufdo", "bufdo"], ["buffers", "buffers"], ["bun", "bunload"], ["bw", "bwipeout"], ["c", "c"], ["c", "change"], ["cN", "cN"], ["cN", "cNext"], ["cNf", "cNf"], ["cNf", "cNfile"], ["cabc", "cabclear"], ["cad", "cad"], ["cad", "caddexpr"], ["caddb", "caddbuffer"], ["caddf", "caddfile"], ["cal", "call"], ["cat", "catch"], ["cb", "cbuffer"], ["cc", "cc"], ["ccl", "cclose"], ["cd", "cd"], ["ce", "center"], ["cex", "cexpr"], ["cf", "cfile"], ["cfir", "cfirst"], ["cg", "cgetfile"], ["cgetb", "cgetbuffer"], ["cgete", "cgetexpr"], ["changes", "changes"], ["chd", "chdir"], ["che", "checkpath"], ["checkt", "checktime"], ["cl", "cl"], ["cl", "clist"], ["cla", "clast"], ["clo", "close"], ["cmapc", "cmapclear"], ["cn", "cn"], ["cn", "cnext"], ["cnew", "cnewer"], ["cnf", "cnf"], ["cnf", "cnfile"], ["co", "copy"], ["col", "colder"], ["colo", "colorscheme"], ["com", "com"], ["comc", "comclear"], ["comp", "compiler"], ["con", "con"], ["con", "continue"], ["conf", "confirm"], ["cope", "copen"], ["cp", "cprevious"], ["cpf", "cpfile"], ["cq", "cquit"], ["cr", "crewind"], ["cs", "cs"], ["cscope", "cscope"], ["cstag", "cstag"], ["cuna", "cunabbrev"], ["cw", "cwindow"], ["d", "d"], ["d", "delete"], ["de", "de"], ["debug", "debug"], ["debugg", "debuggreedy"], ["del", "del"], ["delc", "delcommand"], ["delel", "delel"], ["delep", "delep"], ["deletel", "deletel"], ["deletep", "deletep"], ["deletl", "deletl"], ["deletp", "deletp"], ["delf", "delf"], ["delf", "delfunction"], ["dell", "dell"], ["delm", "delmarks"], ["delp", "delp"], ["dep", "dep"], ["di", "di"], ["di", "display"], ["diffg", "diffget"], ["diffo", "diffoff"], ["diffp", "diffpatch"], ["diffpu", "diffput"], ["diffs", "diffsplit"], ["difft", "diffthis"], ["diffu", "diffupdate"], ["dig", "dig"], ["dig", "digraphs"], ["dir", "dir"], ["dj", "djump"], ["dl", "dl"], ["dli", "dlist"], ["do", "do"], ["doau", "doau"], ["dp", "dp"], ["dr", "drop"], ["ds", "dsearch"], ["dsp", "dsplit"], ["e", "e"], ["e", "edit"], ["ea", "ea"], ["earlier", "earlier"], ["ec", "ec"], ["echoe", "echoerr"], ["echom", "echomsg"], ["echon", "echon"], ["el", "else"], ["elsei", "elseif"], ["em", "emenu"], ["en", "en"], ["en", "endif"], ["endf", "endf"], ["endf", "endfunction"], ["endfo", "endfor"], ["endfun", "endfun"], ["endt", "endtry"], ["endw", "endwhile"], ["ene", "enew"], ["ex", "ex"], ["exi", "exit"], ["exu", "exusage"], ["f", "f"], ["f", "file"], ["files", "files"], ["filet", "filet"], ["filetype", "filetype"], ["fin", "fin"], ["fin", "find"], ["fina", "finally"], ["fini", "finish"], ["fir", "first"], ["fix", "fixdel"], ["fo", "fold"], ["foldc", "foldclose"], ["foldd", "folddoopen"], ["folddoc", "folddoclosed"], ["foldo", "foldopen"], ["for", "for"], ["fu", "fu"], ["fu", "function"], ["fun", "fun"], ["g", "g"], ["go", "goto"], ["gr", "grep"], ["grepa", "grepadd"], ["gui", "gui"], ["gvim", "gvim"], ["h", "h"], ["h", "help"], ["ha", "hardcopy"], ["helpf", "helpfind"], ["helpg", "helpgrep"], ["helpt", "helptags"], ["hi", "hi"], ["hid", "hide"], ["his", "history"], ["i", "i"], ["ia", "ia"], ["iabc", "iabclear"], ["if", "if"], ["ij", "ijump"], ["il", "ilist"], ["imapc", "imapclear"], ["in", "in"], ["intro", "intro"], ["is", "isearch"], ["isp", "isplit"], ["iuna", "iunabbrev"], ["j", "join"], ["ju", "jumps"], ["k", "k"], ["kee", "keepmarks"], ["keepa", "keepa"], ["keepalt", "keepalt"], ["keepj", "keepjumps"], ["keepp", "keeppatterns"], ["l", "l"], ["l", "list"], ["lN", "lN"], ["lN", "lNext"], ["lNf", "lNf"], ["lNf", "lNfile"], ["la", "la"], ["la", "last"], ["lad", "lad"], ["lad", "laddexpr"], ["laddb", "laddbuffer"], ["laddf", "laddfile"], ["lan", "lan"], ["lan", "language"], ["lat", "lat"], ["later", "later"], ["lb", "lbuffer"], ["lc", "lcd"], ["lch", "lchdir"], ["lcl", "lclose"], ["lcs", "lcs"], ["lcscope", "lcscope"], ["le", "left"], ["lefta", "leftabove"], ["lex", "lexpr"], ["lf", "lfile"], ["lfir", "lfirst"], ["lg", "lgetfile"], ["lgetb", "lgetbuffer"], ["lgete", "lgetexpr"], ["lgr", "lgrep"], ["lgrepa", "lgrepadd"], ["lh", "lhelpgrep"], ["ll", "ll"], ["lla", "llast"], ["lli", "llist"], ["lmak", "lmake"], ["lmapc", "lmapclear"], ["lne", "lne"], ["lne", "lnext"], ["lnew", "lnewer"], ["lnf", "lnf"], ["lnf", "lnfile"], ["lo", "lo"], ["lo", "loadview"], ["loadk", "loadk"], ["loadkeymap", "loadkeymap"], ["loc", "lockmarks"], ["lockv", "lockvar"], ["lol", "lolder"], ["lop", "lopen"], ["lp", "lprevious"], ["lpf", "lpfile"], ["lr", "lrewind"], ["ls", "ls"], ["lt", "ltag"], ["lua", "lua"], ["luado", "luado"], ["luafile", "luafile"], ["lv", "lvimgrep"], ["lvimgrepa", "lvimgrepadd"], ["lw", "lwindow"], ["m", "move"], ["ma", "ma"], ["ma", "mark"], ["mak", "make"], ["marks", "marks"], ["mat", "match"], ["menut", "menut"], ["menut", "menutranslate"], ["mes", "mes"], ["messages", "messages"], ["mk", "mk"], ["mk", "mkexrc"], ["mks", "mksession"], ["mksp", "mkspell"], ["mkv", "mkv"], ["mkv", "mkvimrc"], ["mkvie", "mkview"], ["mo", "mo"], ["mod", "mode"], ["mz", "mz"], ["mz", "mzscheme"], ["mzf", "mzfile"], ["n", "n"], ["n", "next"], ["nb", "nbkey"], ["nbc", "nbclose"], ["nbs", "nbstart"], ["ne", "ne"], ["new", "new"], ["nmapc", "nmapclear"], ["noa", "noa"], ["noautocmd", "noautocmd"], ["noh", "nohlsearch"], ["nu", "number"], ["o", "o"], ["o", "open"], ["ol", "oldfiles"], ["omapc", "omapclear"], ["on", "only"], ["opt", "options"], ["ownsyntax", "ownsyntax"], ["p", "p"], ["p", "print"], ["pc", "pclose"], ["pe", "pe"], ["pe", "perl"], ["ped", "pedit"], ["perld", "perldo"], ["po", "pop"], ["popu", "popu"], ["popu", "popup"], ["pp", "ppop"], ["pr", "pr"], ["pre", "preserve"], ["prev", "previous"], ["pro", "pro"], ["prof", "profile"], ["profd", "profdel"], ["promptf", "promptfind"], ["promptr", "promptrepl"], ["ps", "psearch"], ["ptN", "ptN"], ["ptN", "ptNext"], ["pta", "ptag"], ["ptf", "ptfirst"], ["ptj", "ptjump"], ["ptl", "ptlast"], ["ptn", "ptn"], ["ptn", "ptnext"], ["ptp", "ptprevious"], ["ptr", "ptrewind"], ["pts", "ptselect"], ["pu", "put"], ["pw", "pwd"], ["py", "py"], ["py", "python"], ["py3", "py3"], ["py3", "py3"], ["py3do", "py3do"], ["pydo", "pydo"], ["pyf", "pyfile"], ["python3", "python3"], ["q", "q"], ["q", "quit"], ["qa", "qall"], ["quita", "quitall"], ["r", "r"], ["r", "read"], ["re", "re"], ["rec", "recover"], ["red", "red"], ["red", "redo"], ["redi", "redir"], ["redr", "redraw"], ["redraws", "redrawstatus"], ["reg", "registers"], ["res", "resize"], ["ret", "retab"], ["retu", "return"], ["rew", "rewind"], ["ri", "right"], ["rightb", "rightbelow"], ["ru", "ru"], ["ru", "runtime"], ["rub", "ruby"], ["rubyd", "rubydo"], ["rubyf", "rubyfile"], ["rundo", "rundo"], ["rv", "rviminfo"], ["sN", "sNext"], ["sa", "sargument"], ["sal", "sall"], ["san", "sandbox"], ["sav", "saveas"], ["sb", "sbuffer"], ["sbN", "sbNext"], ["sba", "sball"], ["sbf", "sbfirst"], ["sbl", "sblast"], ["sbm", "sbmodified"], ["sbn", "sbnext"], ["sbp", "sbprevious"], ["sbr", "sbrewind"], ["scrip", "scrip"], ["scrip", "scriptnames"], ["scripte", "scriptencoding"], ["scs", "scs"], ["scscope", "scscope"], ["se", "set"], ["setf", "setfiletype"], ["setg", "setglobal"], ["setl", "setlocal"], ["sf", "sfind"], ["sfir", "sfirst"], ["sh", "shell"], ["si", "si"], ["sig", "sig"], ["sign", "sign"], ["sil", "silent"], ["sim", "simalt"], ["sl", "sl"], ["sl", "sleep"], ["sla", "slast"], ["sm", "smagic"], ["sm", "smap"], ["sme", "sme"], ["smenu", "smenu"], ["sn", "snext"], ["sni", "sniff"], ["sno", "snomagic"], ["snoreme", "snoreme"], ["snoremenu", "snoremenu"], ["so", "so"], ["so", "source"], ["sor", "sort"], ["sp", "split"], ["spe", "spe"], ["spe", "spellgood"], ["spelld", "spelldump"], ["spelli", "spellinfo"], ["spellr", "spellrepall"], ["spellu", "spellundo"], ["spellw", "spellwrong"], ["spr", "sprevious"], ["sre", "srewind"], ["st", "st"], ["st", "stop"], ["sta", "stag"], ["star", "star"], ["star", "startinsert"], ["start", "start"], ["startg", "startgreplace"], ["startr", "startreplace"], ["stj", "stjump"], ["stopi", "stopinsert"], ["sts", "stselect"], ["sun", "sunhide"], ["sunme", "sunme"], ["sunmenu", "sunmenu"], ["sus", "suspend"], ["sv", "sview"], ["sw", "swapname"], ["sy", "sy"], ["syn", "syn"], ["sync", "sync"], ["syncbind", "syncbind"], ["syntime", "syntime"], ["t", "t"], ["tN", "tN"], ["tN", "tNext"], ["ta", "ta"], ["ta", "tag"], ["tab", "tab"], ["tabN", "tabN"], ["tabN", "tabNext"], ["tabc", "tabclose"], ["tabd", "tabdo"], ["tabe", "tabedit"], ["tabf", "tabfind"], ["tabfir", "tabfirst"], ["tabl", "tablast"], ["tabm", "tabmove"], ["tabn", "tabnext"], ["tabnew", "tabnew"], ["tabo", "tabonly"], ["tabp", "tabprevious"], ["tabr", "tabrewind"], ["tabs", "tabs"], ["tags", "tags"], ["tc", "tcl"], ["tcld", "tcldo"], ["tclf", "tclfile"], ["te", "tearoff"], ["tf", "tfirst"], ["th", "throw"], ["tj", "tjump"], ["tl", "tlast"], ["tm", "tm"], ["tm", "tmenu"], ["tn", "tn"], ["tn", "tnext"], ["to", "topleft"], ["tp", "tprevious"], ["tr", "tr"], ["tr", "trewind"], ["try", "try"], ["ts", "tselect"], ["tu", "tu"], ["tu", "tunmenu"], ["u", "u"], ["u", "undo"], ["un", "un"], ["una", "unabbreviate"], ["undoj", "undojoin"], ["undol", "undolist"], ["unh", "unhide"], ["unl", "unl"], ["unlo", "unlockvar"], ["uns", "unsilent"], ["up", "update"], ["v", "v"], ["ve", "ve"], ["ve", "version"], ["verb", "verbose"], ["vert", "vertical"], ["vi", "vi"], ["vi", "visual"], ["vie", "view"], ["vim", "vimgrep"], ["vimgrepa", "vimgrepadd"], ["viu", "viusage"], ["vmapc", "vmapclear"], ["vne", "vnew"], ["vs", "vsplit"], ["w", "w"], ["w", "write"], ["wN", "wNext"], ["wa", "wall"], ["wh", "while"], ["win", "win"], ["win", "winsize"], ["winc", "wincmd"], ["windo", "windo"], ["winp", "winpos"], ["wn", "wnext"], ["wp", "wprevious"], ["wq", "wq"], ["wqa", "wqall"], ["ws", "wsverb"], ["wundo", "wundo"], ["wv", "wviminfo"], ["x", "x"], ["x", "xit"], ["xa", "xall"], ["xmapc", "xmapclear"], ["xme", "xme"], ["xmenu", "xmenu"], ["xnoreme", "xnoreme"], ["xnoremenu", "xnoremenu"], ["xunme", "xunme"], ["xunmenu", "xunmenu"], ["xwininfo", "xwininfo"], ["y", "yank"]], :option=>[], :auto=>[["BufAdd", "BufAdd"], ["BufCreate", "BufCreate"], ["BufDelete", "BufDelete"], ["BufEnter", "BufEnter"], ["BufFilePost", "BufFilePost"], ["BufFilePre", "BufFilePre"], ["BufHidden", "BufHidden"], ["BufLeave", "BufLeave"], ["BufNew", "BufNew"], ["BufNewFile", "BufNewFile"], ["BufRead", "BufRead"], ["BufReadCmd", "BufReadCmd"], ["BufReadPost", "BufReadPost"], ["BufReadPre", "BufReadPre"], ["BufUnload", "BufUnload"], ["BufWinEnter", "BufWinEnter"], ["BufWinLeave", "BufWinLeave"], ["BufWipeout", "BufWipeout"], ["BufWrite", "BufWrite"], ["BufWriteCmd", "BufWriteCmd"], ["BufWritePost", "BufWritePost"], ["BufWritePre", "BufWritePre"], ["Cmd", "Cmd"], ["CmdwinEnter", "CmdwinEnter"], ["CmdwinLeave", "CmdwinLeave"], ["ColorScheme", "ColorScheme"], ["CompleteDone", "CompleteDone"], ["CursorHold", "CursorHold"], ["CursorHoldI", "CursorHoldI"], ["CursorMoved", "CursorMoved"], ["CursorMovedI", "CursorMovedI"], ["EncodingChanged", "EncodingChanged"], ["FileAppendCmd", "FileAppendCmd"], ["FileAppendPost", "FileAppendPost"], ["FileAppendPre", "FileAppendPre"], ["FileChangedRO", "FileChangedRO"], ["FileChangedShell", "FileChangedShell"], ["FileChangedShellPost", "FileChangedShellPost"], ["FileEncoding", "FileEncoding"], ["FileReadCmd", "FileReadCmd"], ["FileReadPost", "FileReadPost"], ["FileReadPre", "FileReadPre"], ["FileType", "FileType"], ["FileWriteCmd", "FileWriteCmd"], ["FileWritePost", "FileWritePost"], ["FileWritePre", "FileWritePre"], ["FilterReadPost", "FilterReadPost"], ["FilterReadPre", "FilterReadPre"], ["FilterWritePost", "FilterWritePost"], ["FilterWritePre", "FilterWritePre"], ["FocusGained", "FocusGained"], ["FocusLost", "FocusLost"], ["FuncUndefined", "FuncUndefined"], ["GUIEnter", "GUIEnter"], ["GUIFailed", "GUIFailed"], ["InsertChange", "InsertChange"], ["InsertCharPre", "InsertCharPre"], ["InsertEnter", "InsertEnter"], ["InsertLeave", "InsertLeave"], ["MenuPopup", "MenuPopup"], ["QuickFixCmdPost", "QuickFixCmdPost"], ["QuickFixCmdPre", "QuickFixCmdPre"], ["QuitPre", "QuitPre"], ["RemoteReply", "RemoteReply"], ["SessionLoadPost", "SessionLoadPost"], ["ShellCmdPost", "ShellCmdPost"], ["ShellFilterPost", "ShellFilterPost"], ["SourceCmd", "SourceCmd"], ["SourcePre", "SourcePre"], ["SpellFileMissing", "SpellFileMissing"], ["StdinReadPost", "StdinReadPost"], ["StdinReadPre", "StdinReadPre"], ["SwapExists", "SwapExists"], ["Syntax", "Syntax"], ["TabEnter", "TabEnter"], ["TabLeave", "TabLeave"], ["TermChanged", "TermChanged"], ["TermResponse", "TermResponse"], ["TextChanged", "TextChanged"], ["TextChangedI", "TextChangedI"], ["User", "User"], ["UserGettingBored", "UserGettingBored"], ["VimEnter", "VimEnter"], ["VimLeave", "VimLeave"], ["VimLeavePre", "VimLeavePre"], ["VimResized", "VimResized"], ["WinEnter", "WinEnter"], ["WinLeave", "WinLeave"], ["event", "event"]]}
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/xml.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/xml.rb
new file mode 100644
index 0000000..8702379
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/xml.rb
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class XML < RegexLexer
+      title "XML"
+      desc %q(<desc for="this-lexer">XML</desc>)
+      tag 'xml'
+      filenames *%w(*.xml *.xsl *.rss *.xslt *.xsd *.wsdl)
+      mimetypes *%w(
+        text/xml
+        application/xml
+        image/svg+xml
+        application/rss+xml
+        application/atom+xml
+      )
+
+      def self.analyze_text(text)
+        return 0.9 if text.doctype?
+        return 0.8 if text =~ /\A<\?xml\b/
+        start = text[0..1000]
+        return 0.6 if start =~ %r(<xml\b)
+        return 0.3 if start =~ %r(<.+?>.*?</.+?>)m
+      end
+
+      state :root do
+        rule /[^<&]+/, Text
+        rule /&\S*?;/, Name::Entity
+        rule /<!\[CDATA\[.*?\]\]\>/, Comment::Preproc
+        rule /<!--/, Comment, :comment
+        rule /<\?.*?\?>/, Comment::Preproc
+        rule /<![^>]*>/, Comment::Preproc
+
+        # open tags
+        rule %r(<\s*[\w:.-]+)m, Name::Tag, :tag
+
+        # self-closing tags
+        rule %r(<\s*/\s*[\w:.-]+\s*>)m, Name::Tag
+      end
+
+      state :comment do
+        rule /[^-]+/m, Comment
+        rule /-->/, Comment, :pop!
+        rule /-/, Comment
+      end
+
+      state :tag do
+        rule /\s+/m, Text
+        rule /[\w.:-]+\s*=/m, Name::Attribute, :attr
+        rule %r(/?\s*>), Name::Tag, :pop!
+      end
+
+      state :attr do
+        rule /\s+/m, Text
+        rule /".*?"|'.*?'|[^\s>]+/, Str, :pop!
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/yaml.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/yaml.rb
new file mode 100644
index 0000000..dc14cf9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/lexers/yaml.rb
@@ -0,0 +1,364 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Lexers
+    class YAML < RegexLexer
+      title "YAML"
+      desc "Yaml Ain't Markup Language (yaml.org)"
+      mimetypes 'text/x-yaml'
+      tag 'yaml'
+      aliases 'yml'
+
+      def self.analyze_text(text)
+        # look for the %YAML directive
+        return 1 if text =~ /\A\s*%YAML/m
+      end
+
+      filenames '*.yaml', '*.yml'
+      # NB: Tabs are forbidden in YAML, which is why you see things
+      # like /[ ]+/.
+
+      # reset the indentation levels
+      def reset_indent
+        puts "    yaml: reset_indent" if @debug
+        @indent_stack = [0]
+        @next_indent = 0
+        @block_scalar_indent = nil
+      end
+
+      def indent
+        raise 'empty indent stack!' if @indent_stack.empty?
+        @indent_stack.last
+      end
+
+      def dedent?(level)
+        level < self.indent
+      end
+
+      def indent?(level)
+        level > self.indent
+      end
+
+      # Save a possible indentation level
+      def save_indent(match)
+        @next_indent = match.size
+        puts "    yaml: indent: #{self.indent}/#@next_indent" if @debug
+        puts "    yaml: popping indent stack - before: #@indent_stack" if @debug
+        if dedent?(@next_indent)
+          @indent_stack.pop while dedent?(@next_indent)
+          puts "    yaml: popping indent stack - after: #@indent_stack" if @debug
+          puts "    yaml: indent: #{self.indent}/#@next_indent" if @debug
+
+          # dedenting to a state not previously indented to is an error
+          [match[0...self.indent], match[self.indent..-1]]
+        else
+          [match, '']
+        end
+      end
+
+      def continue_indent(match)
+        puts "    yaml: continue_indent" if @debug
+        @next_indent += match.size
+      end
+
+      def set_indent(match, opts={})
+        if indent < @next_indent
+          @indent_stack << @next_indent
+        end
+
+        @next_indent += match.size unless opts[:implicit]
+      end
+
+      plain_scalar_start = /[^ \t\n\r\f\v?:,\[\]{}#&*!\|>'"%@`]/
+
+      start { reset_indent }
+
+      state :basic do
+        rule /#.*$/, Comment::Single
+      end
+
+      state :root do
+        mixin :basic
+
+        rule /\n+/, Text
+
+        # trailing or pre-comment whitespace
+        rule /[ ]+(?=#|$)/, Text
+
+        rule /^%YAML\b/ do
+          token Name::Tag
+          reset_indent
+          push :yaml_directive
+        end
+
+        rule /^%TAG\b/ do
+          token Name::Tag
+          reset_indent
+          push :tag_directive
+        end
+
+        # doc-start and doc-end indicators
+        rule /^(?:---|\.\.\.)(?= |$)/ do
+          token Name::Namespace
+          reset_indent
+          push :block_line
+        end
+
+        # indentation spaces
+        rule /[ ]*(?!\s|$)/ do |m|
+          text, err = save_indent(m[0])
+          token Text, text
+          token Error, err
+          push :block_line; push :indentation
+        end
+      end
+
+      state :indentation do
+        rule(/\s*?\n/) { token Text; pop! 2 }
+        # whitespace preceding block collection indicators
+        rule /[ ]+(?=[-:?](?:[ ]|$))/ do |m|
+          token Text
+          continue_indent(m[0])
+        end
+
+        # block collection indicators
+        rule(/[?:-](?=[ ]|$)/) { |m| token Punctuation::Indicator; set_indent m[0] }
+
+        # the beginning of a block line
+        rule(/[ ]*/) { |m| token Text; continue_indent(m[0]); pop! }
+      end
+
+      # indented line in the block context
+      state :block_line do
+        # line end
+        rule /[ ]*(?=#|$)/, Text, :pop!
+        rule /[ ]+/, Text
+        # tags, anchors, and aliases
+        mixin :descriptors
+        # block collections and scalars
+        mixin :block_nodes
+        # flow collections and quoed scalars
+        mixin :flow_nodes
+
+        # a plain scalar
+        rule /(?=#{plain_scalar_start}|[?:-][^ \t\n\r\f\v])/ do
+          token Name::Variable
+          push :plain_scalar_in_block_context
+        end
+      end
+
+      state :descriptors do
+        # a full-form tag
+        rule /!<[0-9A-Za-z;\/?:@&=+$,_.!~*'()\[\]%-]+>/, Keyword::Type
+
+        # a tag in the form '!', '!suffix' or '!handle!suffix'
+        rule %r(
+          (?:![\w-]+)? # handle
+          !(?:[\w;/?:@&=+$,.!~*\'()\[\]%-]*) # suffix
+        )x, Keyword::Type
+
+        # an anchor
+        rule /&[\w-]+/, Name::Label
+
+        # an alias
+        rule /\*[\w-]+/, Name::Variable
+      end
+
+      state :block_nodes do
+        # implicit key
+        rule /:(?=\s|$)/ do |m|
+          token Punctuation::Indicator
+          set_indent m[0], :implicit => true
+        end
+
+        # literal and folded scalars
+        rule /[\|>]/ do
+          token Punctuation::Indicator
+          push :block_scalar_content
+          push :block_scalar_header
+        end
+      end
+
+      state :flow_nodes do
+        rule /\[/, Punctuation::Indicator, :flow_sequence
+        rule /\{/, Punctuation::Indicator, :flow_mapping
+        rule /'/, Str::Single, :single_quoted_scalar
+        rule /"/, Str::Double, :double_quoted_scalar
+      end
+
+      state :flow_collection do
+        rule /\s+/m, Text
+        mixin :basic
+        rule /[?:,]/, Punctuation::Indicator
+        mixin :descriptors
+        mixin :flow_nodes
+
+        rule /(?=#{plain_scalar_start})/ do
+          push :plain_scalar_in_flow_context
+        end
+      end
+
+      state :flow_sequence do
+        rule /\]/, Punctuation::Indicator, :pop!
+        mixin :flow_collection
+      end
+
+      state :flow_mapping do
+        rule /\}/, Punctuation::Indicator, :pop!
+        mixin :flow_collection
+      end
+
+      state :block_scalar_content do
+        rule /\n+/, Text
+
+        # empty lines never dedent, but they might be part of the scalar.
+        rule /^[ ]+$/ do |m|
+          text = m[0]
+          indent_size = text.size
+
+          indent_mark = @block_scalar_indent || indent_size
+
+          token Text, text[0...indent_mark]
+          token Name::Constant, text[indent_mark..-1]
+        end
+
+        # TODO: ^ doesn't actually seem to affect the match at all.
+        # Find a way to work around this limitation.
+        rule /^[ ]*/ do |m|
+          token Text
+
+          indent_size = m[0].size
+
+          dedent_level = @block_scalar_indent || self.indent
+          @block_scalar_indent ||= indent_size
+
+          if indent_size < dedent_level
+            pop! 2
+          end
+        end
+
+        rule /[^\n\r\f\v]+/, Name::Constant
+      end
+
+      state :block_scalar_header do
+        # optional indentation indicator and chomping flag, in either order
+        rule %r(
+          (
+            ([1-9])[+-]? | [+-]?([1-9])?
+          )(?=[ ]|$)
+        )x do |m|
+          @block_scalar_indent = nil
+          goto :ignored_line
+          next if m[0].empty?
+
+          increment = m[1] || m[2]
+          if increment
+            @block_scalar_indent = indent + increment.to_i
+          end
+
+          token Punctuation::Indicator
+        end
+      end
+
+      state :ignored_line do
+        mixin :basic
+        rule /[ ]+/, Text
+        rule /\n/, Text, :pop!
+      end
+
+      state :quoted_scalar_whitespaces do
+        # leading and trailing whitespace is ignored
+        rule /^[ ]+/, Text
+        rule /[ ]+$/, Text
+
+        rule /\n+/m, Text
+
+        rule /[ ]+/, Name::Variable
+      end
+
+      state :single_quoted_scalar do
+        mixin :quoted_scalar_whitespaces
+        rule /\\'/, Str::Escape
+        rule /'/, Str, :pop!
+        rule /[^\s']+/, Str
+      end
+
+      state :double_quoted_scalar do
+        rule /"/, Str, :pop!
+        mixin :quoted_scalar_whitespaces
+        # escapes
+        rule /\\[0abt\tn\nvfre "\\N_LP]/, Str::Escape
+        rule /\\(?:x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
+          Str::Escape
+        rule /[^ \t\n\r\f\v"\\]+/, Str
+      end
+
+      state :plain_scalar_in_block_context_new_line do
+        rule /^[ ]+\n/, Text
+        rule /\n+/m, Text
+        rule /^(?=---|\.\.\.)/ do
+          pop! 3
+        end
+
+        # dedent detection
+        rule /^[ ]*/ do |m|
+          token Text
+          pop!
+
+          indent_size = m[0].size
+
+          # dedent = end of scalar
+          if indent_size <= self.indent
+            pop!
+            save_indent(m[0])
+            push :indentation
+          end
+        end
+      end
+
+      state :plain_scalar_in_block_context do
+        # the : indicator ends a scalar
+        rule /[ ]*(?=:[ \n]|:$)/, Text, :pop!
+        rule /[ ]*:/, Str
+        rule /[ ]+(?=#)/, Text, :pop!
+        rule /[ ]+$/, Text
+        # check for new documents or dedents at the new line
+        rule /\n+/ do
+          token Text
+          push :plain_scalar_in_block_context_new_line
+        end
+
+        rule /[ ]+/, Str
+        # regular non-whitespace characters
+        rule /[^\s:]+/, Str
+      end
+
+      state :plain_scalar_in_flow_context do
+        rule /[ ]*(?=[,:?\[\]{}])/, Text, :pop!
+        rule /[ ]+(?=#)/, Text, :pop!
+        rule /^[ ]+/, Text
+        rule /[ ]+$/, Text
+        rule /\n+/, Text
+        rule /[ ]+/, Name::Variable
+        rule /[^\s,:?\[\]{}]+/, Name::Variable
+      end
+
+      state :yaml_directive do
+        rule /([ ]+)(\d+\.\d+)/ do
+          groups Text, Num
+          goto :ignored_line
+        end
+      end
+
+      state :tag_directive do
+        rule %r(
+          ([ ]+)(!|![\w-]*!) # prefix
+          ([ ]+)(!|!?[\w;/?:@&=+$,.!~*'()\[\]%-]+) # tag handle
+        )x do
+          groups Text, Keyword::Type, Text, Keyword::Type
+          goto :ignored_line
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/plugins/redcarpet.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/plugins/redcarpet.rb
new file mode 100644
index 0000000..f27511b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/plugins/redcarpet.rb
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*- #
+
+# this file is not require'd from the root.  To use this plugin, run:
+#
+#    require 'rouge/plugins/redcarpet'
+
+module Rouge
+  module Plugins
+    module Redcarpet
+      def block_code(code, language)
+        lexer = Lexer.find_fancy(language, code) || Lexers::PlainText
+
+        # XXX HACK: Redcarpet strips hard tabs out of code blocks,
+        # so we assume you're not using leading spaces that aren't tabs,
+        # and just replace them here.
+        if lexer.tag == 'make'
+          code.gsub! /^    /, "\t"
+        end
+
+        formatter = rouge_formatter(lexer)
+        formatter.format(lexer.lex(code))
+      end
+
+      # override this method for custom formatting behavior
+      def rouge_formatter(lexer)
+        Formatters::HTML.new(:css_class => "highlight #{lexer.tag}")
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/regex_lexer.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/regex_lexer.rb
new file mode 100644
index 0000000..1459589
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/regex_lexer.rb
@@ -0,0 +1,439 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  # @abstract
+  # A stateful lexer that uses sets of regular expressions to
+  # tokenize a string.  Most lexers are instances of RegexLexer.
+  class RegexLexer < Lexer
+    # A rule is a tuple of a regular expression to test, and a callback
+    # to perform if the test succeeds.
+    #
+    # @see StateDSL#rule
+    class Rule
+      attr_reader :callback
+      attr_reader :re
+      attr_reader :beginning_of_line
+      def initialize(re, callback)
+        @re = re
+        @callback = callback
+        @beginning_of_line = re.source[0] == ?^
+      end
+
+      def inspect
+        "#<Rule #{@re.inspect}>"
+      end
+    end
+
+    # a State is a named set of rules that can be tested for or
+    # mixed in.
+    #
+    # @see RegexLexer.state
+    class State
+      attr_reader :name, :rules
+      def initialize(name, rules)
+        @name = name
+        @rules = rules
+      end
+
+      def inspect
+        "#<#{self.class.name} #{@name.inspect}>"
+      end
+    end
+
+    class StateDSL
+      attr_reader :rules
+      def initialize(name, &defn)
+        @name = name
+        @defn = defn
+        @rules = []
+      end
+
+      def to_state(lexer_class)
+        load!
+        rules = @rules.map do |rule|
+          rule.is_a?(String) ? lexer_class.get_state(rule) : rule
+        end
+        State.new(@name, rules)
+      end
+
+      def prepended(&defn)
+        parent_defn = @defn
+        StateDSL.new(@name) do
+          instance_eval(&defn)
+          instance_eval(&parent_defn)
+        end
+      end
+
+      def appended(&defn)
+        parent_defn = @defn
+        StateDSL.new(@name) do
+          instance_eval(&parent_defn)
+          instance_eval(&defn)
+        end
+      end
+
+    protected
+      # Define a new rule for this state.
+      #
+      # @overload rule(re, token, next_state=nil)
+      # @overload rule(re, &callback)
+      #
+      # @param [Regexp] re
+      #   a regular expression for this rule to test.
+      # @param [String] tok
+      #   the token type to yield if `re` matches.
+      # @param [#to_s] next_state
+      #   (optional) a state to push onto the stack if `re` matches.
+      #   If `next_state` is `:pop!`, the state stack will be popped
+      #   instead.
+      # @param [Proc] callback
+      #   a block that will be evaluated in the context of the lexer
+      #   if `re` matches.  This block has access to a number of lexer
+      #   methods, including {RegexLexer#push}, {RegexLexer#pop!},
+      #   {RegexLexer#token}, and {RegexLexer#delegate}.  The first
+      #   argument can be used to access the match groups.
+      def rule(re, tok=nil, next_state=nil, &callback)
+        if tok.nil? && callback.nil?
+          raise "please pass `rule` a token to yield or a callback"
+        end
+
+        callback ||= case next_state
+        when :pop!
+          proc do |stream|
+            puts "    yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
+            @output_stream.call(tok, stream[0])
+            puts "    popping stack: #{1}" if @debug
+            @stack.pop or raise 'empty stack!'
+          end
+        when :push
+          proc do |stream|
+            puts "    yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
+            @output_stream.call(tok, stream[0])
+            puts "    pushing #{@stack.last.name}" if @debug
+            @stack.push(@stack.last)
+          end
+        when Symbol
+          proc do |stream|
+            puts "    yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
+            @output_stream.call(tok, stream[0])
+            state = @states[next_state] || self.class.get_state(next_state)
+            puts "    pushing #{state.name}" if @debug
+            @stack.push(state)
+          end
+        when nil
+          proc do |stream|
+            puts "    yielding #{tok.qualname}, #{stream[0].inspect}" if @debug
+            @output_stream.call(tok, stream[0])
+          end
+        else
+          raise "invalid next state: #{next_state.inspect}"
+        end
+
+        rules << Rule.new(re, callback)
+      end
+
+      # Mix in the rules from another state into this state.  The rules
+      # from the mixed-in state will be tried in order before moving on
+      # to the rest of the rules in this state.
+      def mixin(state)
+        rules << state.to_s
+      end
+
+    private
+      def load!
+        return if @loaded
+        @loaded = true
+        instance_eval(&@defn)
+      end
+    end
+
+    # The states hash for this lexer.
+    # @see state
+    def self.states
+      @states ||= {}
+    end
+
+    def self.state_definitions
+      @state_definitions ||= InheritableHash.new(superclass.state_definitions)
+    end
+    @state_definitions = {}
+
+    def self.replace_state(name, new_defn)
+      states[name] = nil
+      state_definitions[name] = new_defn
+    end
+
+    # The routines to run at the beginning of a fresh lex.
+    # @see start
+    def self.start_procs
+      @start_procs ||= InheritableList.new(superclass.start_procs)
+    end
+    @start_procs = []
+
+    # Specify an action to be run every fresh lex.
+    #
+    # @example
+    #   start { puts "I'm lexing a new string!" }
+    def self.start(&b)
+      start_procs << b
+    end
+
+    # Define a new state for this lexer with the given name.
+    # The block will be evaluated in the context of a {StateDSL}.
+    def self.state(name, &b)
+      name = name.to_s
+      state_definitions[name] = StateDSL.new(name, &b)
+    end
+
+    def self.prepend(name, &b)
+      name = name.to_s
+      dsl = state_definitions[name] or raise "no such state #{name.inspect}"
+      replace_state(name, dsl.prepended(&b))
+    end
+
+    def self.append(name, &b)
+      name = name.to_s
+      dsl = state_definitions[name] or raise "no such state #{name.inspect}"
+      replace_state(name, dsl.appended(&b))
+    end
+
+    # @private
+    def self.get_state(name)
+      return name if name.is_a? State
+
+      states[name.to_sym] ||= begin
+        defn = state_definitions[name.to_s] or raise "unknown state: #{name.inspect}"
+        defn.to_state(self)
+      end
+    end
+
+    # @private
+    def get_state(state_name)
+      self.class.get_state(state_name)
+    end
+
+    # The state stack.  This is initially the single state `[:root]`.
+    # It is an error for this stack to be empty.
+    # @see #state
+    def stack
+      @stack ||= [get_state(:root)]
+    end
+
+    # The current state - i.e. one on top of the state stack.
+    #
+    # NB: if the state stack is empty, this will throw an error rather
+    # than returning nil.
+    def state
+      stack.last or raise 'empty stack!'
+    end
+
+    # reset this lexer to its initial state.  This runs all of the
+    # start_procs.
+    def reset!
+      @stack = nil
+      @current_stream = nil
+
+      self.class.start_procs.each do |pr|
+        instance_eval(&pr)
+      end
+    end
+
+    # This implements the lexer protocol, by yielding [token, value] pairs.
+    #
+    # The process for lexing works as follows, until the stream is empty:
+    #
+    # 1. We look at the state on top of the stack (which by default is
+    #    `[:root]`).
+    # 2. Each rule in that state is tried until one is successful.  If one
+    #    is found, that rule's callback is evaluated - which may yield
+    #    tokens and manipulate the state stack.  Otherwise, one character
+    #    is consumed with an `'Error'` token, and we continue at (1.)
+    #
+    # @see #step #step (where (2.) is implemented)
+    def stream_tokens(str, &b)
+      stream = StringScanner.new(str)
+
+      @current_stream = stream
+      @output_stream  = b
+      @states         = self.class.states
+      @null_steps     = 0
+
+      until stream.eos?
+        if @debug
+          puts "lexer: #{self.class.tag}"
+          puts "stack: #{stack.map(&:name).inspect}"
+          puts "stream: #{stream.peek(20).inspect}"
+        end
+
+        success = step(state, stream)
+
+        if !success
+          puts "    no match, yielding Error" if @debug
+          b.call(Token::Tokens::Error, stream.getch)
+        end
+      end
+    end
+
+    # The number of successive scans permitted without consuming
+    # the input stream.  If this is exceeded, the match fails.
+    MAX_NULL_SCANS = 5
+
+    # Runs one step of the lex.  Rules in the current state are tried
+    # until one matches, at which point its callback is called.
+    #
+    # @return true if a rule was tried successfully
+    # @return false otherwise.
+    def step(state, stream)
+      state.rules.each do |rule|
+        if rule.is_a?(State)
+          puts "  entering mixin #{rule.name}" if @debug
+          return true if step(rule, stream)
+          puts "  exiting  mixin #{rule.name}" if @debug
+        else
+          puts "  trying #{rule.inspect}" if @debug
+
+          # XXX HACK XXX
+          # StringScanner's implementation of ^ is b0rken.
+          # see http://bugs.ruby-lang.org/issues/7092
+          # TODO: this doesn't cover cases like /(a|^b)/, but it's
+          # the most common, for now...
+          next if rule.beginning_of_line && !stream.beginning_of_line?
+
+          if size = stream.skip(rule.re)
+            puts "    got #{stream[0].inspect}" if @debug
+
+            instance_exec(stream, &rule.callback)
+
+            if size.zero?
+              @null_steps += 1
+              if @null_steps > MAX_NULL_SCANS
+                puts "    too many scans without consuming the string!" if @debug
+                return false
+              end
+            else
+              @null_steps = 0
+            end
+
+            return true
+          end
+        end
+      end
+
+      false
+    end
+
+    # Yield a token.
+    #
+    # @param tok
+    #   the token type
+    # @param val
+    #   (optional) the string value to yield.  If absent, this defaults
+    #   to the entire last match.
+    def token(tok, val=@current_stream[0])
+      yield_token(tok, val)
+    end
+
+    # @deprecated
+    #
+    # Yield a token with the next matched group.  Subsequent calls
+    # to this method will yield subsequent groups.
+    def group(tok)
+      raise "RegexLexer#group is deprecated: use #groups instead"
+    end
+
+    # Yield tokens corresponding to the matched groups of the current
+    # match.
+    def groups(*tokens)
+      tokens.each_with_index do |tok, i|
+        yield_token(tok, @current_stream[i+1])
+      end
+    end
+
+    # Delegate the lex to another lexer.  The #lex method will be called
+    # with `:continue` set to true, so that #reset! will not be called.
+    # In this way, a single lexer can be repeatedly delegated to while
+    # maintaining its own internal state stack.
+    #
+    # @param [#lex] lexer
+    #   The lexer or lexer class to delegate to
+    # @param [String] text
+    #   The text to delegate.  This defaults to the last matched string.
+    def delegate(lexer, text=nil)
+      puts "    delegating to #{lexer.inspect}" if @debug
+      text ||= @current_stream[0]
+
+      lexer.lex(text, :continue => true) do |tok, val|
+        puts "    delegated token: #{tok.inspect}, #{val.inspect}" if @debug
+        yield_token(tok, val)
+      end
+    end
+
+    def recurse(text=nil)
+      delegate(self.class, text)
+    end
+
+    # Push a state onto the stack.  If no state name is given and you've
+    # passed a block, a state will be dynamically created using the
+    # {StateDSL}.
+    def push(state_name=nil, &b)
+      push_state = if state_name
+        get_state(state_name)
+      elsif block_given?
+        StateDSL.new(b.inspect, &b).to_state(self.class)
+      else
+        # use the top of the stack by default
+        self.state
+      end
+
+      puts "    pushing #{push_state.name}" if @debug
+      stack.push(push_state)
+    end
+
+    # Pop the state stack.  If a number is passed in, it will be popped
+    # that number of times.
+    def pop!(times=1)
+      raise 'empty stack!' if stack.empty?
+
+      puts "    popping stack: #{times}" if @debug
+
+      stack.pop(times)
+
+      nil
+    end
+
+    # replace the head of the stack with the given state
+    def goto(state_name)
+      raise 'empty stack!' if stack.empty?
+
+      puts "    going to state #{state_name} " if @debug
+      stack[-1] = get_state(state_name)
+    end
+
+    # reset the stack back to `[:root]`.
+    def reset_stack
+      puts '    resetting stack' if @debug
+      stack.clear
+      stack.push get_state(:root)
+    end
+
+    # Check if `state_name` is in the state stack.
+    def in_state?(state_name)
+      state_name = state_name.to_s
+      stack.any? do |state|
+        state.name == state_name.to_s
+      end
+    end
+
+    # Check if `state_name` is the state on top of the state stack.
+    def state?(state_name)
+      state_name.to_s == state.name
+    end
+
+  private
+    def yield_token(tok, val)
+      return if val.nil? || val.empty?
+      puts "    yielding #{tok.qualname}, #{val.inspect}" if @debug
+      @output_stream.yield(tok, val)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/template_lexer.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/template_lexer.rb
new file mode 100644
index 0000000..11f69fc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/template_lexer.rb
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  # @abstract
+  # A TemplateLexer is one that accepts a :parent option, to specify
+  # which language is being templated.  The lexer class can specify its
+  # own default for the parent lexer, which is otherwise defaulted to
+  # HTML.
+  class TemplateLexer < RegexLexer
+    # the parent lexer - the one being templated.
+    def parent
+      return @parent if instance_variable_defined? :@parent
+      @parent = option(:parent) || 'html'
+      if @parent.is_a? ::String
+        lexer_class = Lexer.find(@parent)
+        @parent = lexer_class.new(self.options)
+      end
+    end
+
+    start { parent.reset! }
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/text_analyzer.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/text_analyzer.rb
new file mode 100644
index 0000000..f4434d3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/text_analyzer.rb
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  class TextAnalyzer < String
+    # Find a shebang.  Returns nil if no shebang is present.
+    def shebang
+      return @shebang if instance_variable_defined? :@shebang
+
+      self =~ /\A\s*#!(.*)$/
+      @shebang = $1
+    end
+
+    # Check if the given shebang is present.
+    #
+    # This normalizes things so that `text.shebang?('bash')` will detect
+    # `#!/bash`, '#!/bin/bash', '#!/usr/bin/env bash', and '#!/bin/bash -x'
+    def shebang?(match)
+      match = /\b#{match}(\s|$)/
+      match === shebang
+    end
+
+    # Return the contents of the doctype tag if present, nil otherwise.
+    def doctype
+      return @doctype if instance_variable_defined? :@doctype
+
+      self =~ %r(\A\s*
+        (?:<\?.*?\?>\s*)? # possible <?xml...?> tag
+        <!DOCTYPE\s+(.+?)>
+      )xm
+      @doctype = $1
+    end
+
+    # Check if the doctype matches a given regexp or string
+    def doctype?(type=//)
+      type === doctype
+    end
+
+    # Return true if the result of lexing with the given lexer contains no
+    # error tokens.
+    def lexes_cleanly?(lexer)
+      lexer.lex(self) do |(tok, _)|
+        return false if tok.name == 'Error'
+      end
+
+      true
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/theme.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/theme.rb
new file mode 100644
index 0000000..d6d2ddf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/theme.rb
@@ -0,0 +1,195 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  class Theme
+    include Token::Tokens
+
+    class Style < Hash
+      def initialize(theme, hsh={})
+        super()
+        @theme = theme
+        merge!(hsh)
+      end
+
+      [:fg, :bg].each do |mode|
+        define_method mode do
+          return self[mode] unless @theme
+          @theme.palette(self[mode]) if self[mode]
+        end
+      end
+
+      def render(selector, &b)
+        return enum_for(:render, selector).to_a.join("\n") unless b
+
+        return if empty?
+
+        yield "#{selector} {"
+        rendered_rules.each do |rule|
+          yield "  #{rule};"
+        end
+        yield "}"
+      end
+
+      def rendered_rules(&b)
+        return enum_for(:rendered_rules) unless b
+        yield "color: #{fg}" if fg
+        yield "background-color: #{bg}" if bg
+        yield "font-weight: bold" if self[:bold]
+        yield "font-style: italic" if self[:italic]
+        yield "text-decoration: underline" if self[:underline]
+
+        (self[:rules] || []).each(&b)
+      end
+    end
+
+    def styles
+      @styles ||= self.class.styles.dup
+    end
+
+    @palette = {}
+    def self.palette(arg={})
+      @palette ||= InheritableHash.new(superclass.palette)
+
+      if arg.is_a? Hash
+        @palette.merge! arg
+        @palette
+      else
+        case arg
+        when /#[0-9a-f]+/i
+          arg
+        else
+          @palette[arg] or raise "not in palette: #{arg.inspect}"
+        end
+      end
+    end
+
+    def palette(*a) self.class.palette(*a) end
+
+    @styles = {}
+    def self.styles
+      @styles ||= InheritableHash.new(superclass.styles)
+    end
+
+    def self.render(opts={}, &b)
+      new(opts).render(&b)
+    end
+
+    class << self
+      def style(*tokens)
+        style = tokens.last.is_a?(Hash) ? tokens.pop : {}
+
+        tokens.each do |tok|
+          styles[tok] = style
+        end
+      end
+
+      def get_own_style(token)
+        token.token_chain.reverse_each do |anc|
+          return Style.new(self, styles[anc]) if styles[anc]
+        end
+
+        nil
+      end
+
+      def get_style(token)
+        get_own_style(token) || base_style
+      end
+
+      def base_style
+        get_own_style(Token::Tokens::Text)
+      end
+
+      def name(n=nil)
+        return @name if n.nil?
+
+        @name = n.to_s
+        Theme.registry[@name] = self
+      end
+
+      def find(n)
+        registry[n.to_s]
+      end
+
+      def registry
+        @registry ||= {}
+      end
+    end
+  end
+
+  module HasModes
+    def mode(arg=:absent)
+      return @mode if arg == :absent
+
+      @modes ||= {}
+      @modes[arg] ||= get_mode(arg)
+    end
+
+    def get_mode(mode)
+      return self if self.mode == mode
+
+      new_name = "#{self.name}.#{mode}"
+      Class.new(self) { name(new_name); mode!(mode) }
+    end
+
+    def mode!(arg)
+      @mode = arg
+      send("make_#{arg}!")
+    end
+  end
+
+  class CSSTheme < Theme
+    def initialize(opts={})
+      @scope = opts[:scope] || '.highlight'
+    end
+
+    def render(&b)
+      return enum_for(:render).to_a.join("\n") unless b
+
+      # shared styles for tableized line numbers
+      yield "#{@scope} table td { padding: 5px; }"
+      yield "#{@scope} table pre { margin: 0; }"
+
+      styles.each do |tok, style|
+        Style.new(self, style).render(css_selector(tok), &b)
+      end
+    end
+
+    def render_base(selector, &b)
+      self.class.base_style.render(selector, &b)
+    end
+
+    def style_for(tok)
+      self.class.get_style(tok)
+    end
+
+  private
+    def css_selector(token)
+      inflate_token(token).map do |tok|
+        raise "unknown token: #{tok.inspect}" if tok.shortname.nil?
+
+        single_css_selector(tok)
+      end.join(', ')
+    end
+
+    def single_css_selector(token)
+      return @scope if token == Text
+
+      "#{@scope} .#{token.shortname}"
+    end
+
+    # yield all of the tokens that should be styled the same
+    # as the given token.  Essentially this recursively all of
+    # the subtokens, except those which are more specifically
+    # styled.
+    def inflate_token(tok, &b)
+      return enum_for(:inflate_token, tok) unless block_given?
+
+      yield tok
+      tok.sub_tokens.each do |(_, st)|
+        next if styles[st]
+
+        inflate_token(st, &b)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/base16.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/base16.rb
new file mode 100644
index 0000000..9fea1c8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/base16.rb
@@ -0,0 +1,130 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Themes
+    # default base16 theme
+    # by Chris Kempson (http://chriskempson.com)
+    class Base16 < CSSTheme
+      name 'base16'
+
+      palette base00: "#151515"
+      palette base01: "#202020"
+      palette base02: "#303030"
+      palette base03: "#505050"
+      palette base04: "#b0b0b0"
+      palette base05: "#d0d0d0"
+      palette base06: "#e0e0e0"
+      palette base07: "#f5f5f5"
+      palette base08: "#ac4142"
+      palette base09: "#d28445"
+      palette base0A: "#f4bf75"
+      palette base0B: "#90a959"
+      palette base0C: "#75b5aa"
+      palette base0D: "#6a9fb5"
+      palette base0E: "#aa759f"
+      palette base0F: "#8f5536"
+
+      extend HasModes
+
+      def self.light!
+        mode :dark # indicate that there is a dark variant
+        mode! :light
+      end
+
+      def self.dark!
+        mode :light # indicate that there is a light variant
+        mode! :dark
+      end
+
+      def self.make_dark!
+        style Text, :fg => :base05, :bg => :base00
+      end
+
+      def self.make_light!
+        style Text, :fg => :base02
+      end
+
+      light!
+
+      style Error, :fg => :base00, :bg => :base08
+      style Comment, :fg => :base03
+
+      style Comment::Preproc,
+            Name::Tag, :fg => :base0A
+
+      style Operator,
+            Punctuation, :fg => :base05
+
+      style Generic::Inserted, :fg => :base0B
+      style Generic::Deleted, :fg => :base08
+      style Generic::Heading, :fg => :base0D, :bg => :base00, :bold => true
+
+      style Keyword, :fg => :base0E
+      style Keyword::Constant,
+            Keyword::Type, :fg => :base09
+
+      style Keyword::Declaration, :fg => :base09
+
+      style Literal::String, :fg => :base0B
+      style Literal::String::Regex, :fg => :base0C
+
+      style Literal::String::Interpol,
+            Literal::String::Escape, :fg => :base0F
+
+      style Name::Namespace,
+            Name::Class,
+            Name::Constant, :fg => :base0A
+
+      style Name::Attribute, :fg => :base0D
+
+      style Literal::Number,
+            Literal::String::Symbol, :fg => :base0B
+
+      class Solarized < Base16
+        name 'base16.solarized'
+        light!
+        # author "Ethan Schoonover (http://ethanschoonover.com/solarized)"
+
+        palette base00: "#002b36"
+        palette base01: "#073642"
+        palette base02: "#586e75"
+        palette base03: "#657b83"
+        palette base04: "#839496"
+        palette base05: "#93a1a1"
+        palette base06: "#eee8d5"
+        palette base07: "#fdf6e3"
+        palette base08: "#dc322f"
+        palette base09: "#cb4b16"
+        palette base0A: "#b58900"
+        palette base0B: "#859900"
+        palette base0C: "#2aa198"
+        palette base0D: "#268bd2"
+        palette base0E: "#6c71c4"
+        palette base0F: "#d33682"
+      end
+
+      class Monokai < Base16
+        name 'base16.monokai'
+        dark!
+
+        # author "Wimer Hazenberg (http://www.monokai.nl)"
+        palette base00: "#272822"
+        palette base01: "#383830"
+        palette base02: "#49483e"
+        palette base03: "#75715e"
+        palette base04: "#a59f85"
+        palette base05: "#f8f8f2"
+        palette base06: "#f5f4f1"
+        palette base07: "#f9f8f5"
+        palette base08: "#f92672"
+        palette base09: "#fd971f"
+        palette base0A: "#f4bf75"
+        palette base0B: "#a6e22e"
+        palette base0C: "#a1efe4"
+        palette base0D: "#66d9ef"
+        palette base0E: "#ae81ff"
+        palette base0F: "#cc6633"
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/colorful.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/colorful.rb
new file mode 100644
index 0000000..b108fe6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/colorful.rb
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Themes
+    # stolen from pygments
+    class Colorful < CSSTheme
+      name 'colorful'
+
+      style Text,                        :fg => "#bbbbbb", :bg => '#000'
+
+      style Comment,                     :fg => "#888"
+      style Comment::Preproc,            :fg => "#579"
+      style Comment::Special,            :fg => "#cc0000", :bold => true
+
+      style Keyword,                     :fg => "#080", :bold => true
+      style Keyword::Pseudo,             :fg => "#038"
+      style Keyword::Type,               :fg => "#339"
+
+      style Operator,                    :fg => "#333"
+      style Operator::Word,              :fg => "#000", :bold => true
+
+      style Name::Builtin,               :fg => "#007020"
+      style Name::Function,              :fg => "#06B", :bold => true
+      style Name::Class,                 :fg => "#B06", :bold => true
+      style Name::Namespace,             :fg => "#0e84b5", :bold => true
+      style Name::Exception,             :fg => "#F00", :bold => true
+      style Name::Variable,              :fg => "#963"
+      style Name::Variable::Instance,    :fg => "#33B"
+      style Name::Variable::Class,       :fg => "#369"
+      style Name::Variable::Global,      :fg => "#d70", :bold => true
+      style Name::Constant,              :fg => "#036", :bold => true
+      style Name::Label,                 :fg => "#970", :bold => true
+      style Name::Entity,                :fg => "#800", :bold => true
+      style Name::Attribute,             :fg => "#00C"
+      style Name::Tag,                   :fg => "#070"
+      style Name::Decorator,             :fg => "#555", :bold => true
+
+      style Literal::String,             :bg => "#fff0f0"
+      style Literal::String::Char,       :fg => "#04D"
+      style Literal::String::Doc,        :fg => "#D42"
+      style Literal::String::Interpol,   :bg => "#eee"
+      style Literal::String::Escape,     :fg => "#666", :bold => true
+      style Literal::String::Regex,      :fg => "#000", :bg => "#fff0ff"
+      style Literal::String::Symbol,     :fg => "#A60"
+      style Literal::String::Other,      :fg => "#D20"
+
+      style Literal::Number,             :fg => "#60E", :bold => true
+      style Literal::Number::Integer,    :fg => "#00D", :bold => true
+      style Literal::Number::Float,      :fg => "#60E", :bold => true
+      style Literal::Number::Hex,        :fg => "#058", :bold => true
+      style Literal::Number::Oct,        :fg => "#40E", :bold => true
+
+      style Generic::Heading,            :fg => "#000080", :bold => true
+      style Generic::Subheading,         :fg => "#800080", :bold => true
+      style Generic::Deleted,            :fg => "#A00000"
+      style Generic::Inserted,           :fg => "#00A000"
+      style Generic::Error,              :fg => "#FF0000"
+      style Generic::Emph,               :italic => true
+      style Generic::Strong,             :bold => true
+      style Generic::Prompt,             :fg => "#c65d09", :bold => true
+      style Generic::Output,             :fg => "#888"
+      style Generic::Traceback,          :fg => "#04D"
+
+      style Error,                       :fg => "#F00", :bg => "#FAA"
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/github.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/github.rb
new file mode 100644
index 0000000..bc875a8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/github.rb
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Themes
+    class Github < CSSTheme
+      name 'github'
+
+      style Comment::Multiline,               :fg => '#999988', :italic => true
+      style Comment::Preproc,                 :fg => '#999999', :bold => true
+      style Comment::Single,                  :fg => '#999988', :italic => true
+      style Comment::Special,                 :fg => '#999999', :italic => true, :bold => true
+      style Comment,                          :fg => '#999988', :italic => true
+      style Error,                            :fg => '#a61717', :bg => '#e3d2d2'
+      style Generic::Deleted,                 :fg => '#000000', :bg => '#ffdddd'
+      style Generic::Emph,                    :fg => '#000000', :italic => true
+      style Generic::Error,                   :fg => '#aa0000'
+      style Generic::Heading,                 :fg => '#999999'
+      style Generic::Inserted,                :fg => '#000000', :bg => '#ddffdd'
+      style Generic::Output,                  :fg => '#888888'
+      style Generic::Prompt,                  :fg => '#555555'
+      style Generic::Strong,                  :bold => true
+      style Generic::Subheading,              :fg => '#aaaaaa'
+      style Generic::Traceback,               :fg => '#aa0000'
+      style Keyword::Constant,                :fg => '#000000', :bold => true
+      style Keyword::Declaration,             :fg => '#000000', :bold => true
+      style Keyword::Namespace,               :fg => '#000000', :bold => true
+      style Keyword::Pseudo,                  :fg => '#000000', :bold => true
+      style Keyword::Reserved,                :fg => '#000000', :bold => true
+      style Keyword::Type,                    :fg => '#445588', :bold => true
+      style Keyword,                          :fg => '#000000', :bold => true
+      style Literal::Number::Float,           :fg => '#009999'
+      style Literal::Number::Hex,             :fg => '#009999'
+      style Literal::Number::Integer::Long,   :fg => '#009999'
+      style Literal::Number::Integer,         :fg => '#009999'
+      style Literal::Number::Oct,             :fg => '#009999'
+      style Literal::Number,                  :fg => '#009999'
+      style Literal::String::Backtick,        :fg => '#d14'
+      style Literal::String::Char,            :fg => '#d14'
+      style Literal::String::Doc,             :fg => '#d14'
+      style Literal::String::Double,          :fg => '#d14'
+      style Literal::String::Escape,          :fg => '#d14'
+      style Literal::String::Heredoc,         :fg => '#d14'
+      style Literal::String::Interpol,        :fg => '#d14'
+      style Literal::String::Other,           :fg => '#d14'
+      style Literal::String::Regex,           :fg => '#009926'
+      style Literal::String::Single,          :fg => '#d14'
+      style Literal::String::Symbol,          :fg => '#990073'
+      style Literal::String,                  :fg => '#d14'
+      style Name::Attribute,                  :fg => '#008080'
+      style Name::Builtin::Pseudo,            :fg => '#999999'
+      style Name::Builtin,                    :fg => '#0086B3'
+      style Name::Class,                      :fg => '#445588', :bold => true
+      style Name::Constant,                   :fg => '#008080'
+      style Name::Decorator,                  :fg => '#3c5d5d', :bold => true
+      style Name::Entity,                     :fg => '#800080'
+      style Name::Exception,                  :fg => '#990000', :bold => true
+      style Name::Function,                   :fg => '#990000', :bold => true
+      style Name::Label,                      :fg => '#990000', :bold => true
+      style Name::Namespace,                  :fg => '#555555'
+      style Name::Tag,                        :fg => '#000080'
+      style Name::Variable::Class,            :fg => '#008080'
+      style Name::Variable::Global,           :fg => '#008080'
+      style Name::Variable::Instance,         :fg => '#008080'
+      style Name::Variable,                   :fg => '#008080'
+      style Operator::Word,                   :fg => '#000000', :bold => true
+      style Operator,                         :fg => '#000000', :bold => true
+      style Text::Whitespace,                 :fg => '#bbbbbb'
+      style Text,                             :bg => '#f8f8f8'
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/gruvbox.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/gruvbox.rb
new file mode 100644
index 0000000..330803d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/gruvbox.rb
@@ -0,0 +1,167 @@
+# -*- coding: utf-8 -*- #
+
+# TODO how are we going to handle soft/hard contrast?
+
+module Rouge
+  module Themes
+    # Based on https://github.com/morhetz/gruvbox, with help from
+    # https://github.com/daveyarwood/gruvbox-pygments
+    class Gruvbox < CSSTheme
+      name 'gruvbox'
+
+      # global Gruvbox colours {{{
+      C_dark0_hard = '#1d2021'
+      C_dark0 ='#282828'
+      C_dark0_soft = '#32302f'
+      C_dark1 = '#3c3836'
+      C_dark2 = '#504945'
+      C_dark3 = '#665c54'
+      C_dark4 = '#7c6f64'
+      C_dark4_256 = '#7c6f64'
+
+      C_gray_245 = '#928374'
+      C_gray_244 = '#928374'
+
+      C_light0_hard = '#f9f5d7'
+      C_light0 = '#fbf1c7'
+      C_light0_soft = '#f2e5bc'
+      C_light1 = '#ebdbb2'
+      C_light2 = '#d5c4a1'
+      C_light3 = '#bdae93'
+      C_light4 = '#a89984'
+      C_light4_256 = '#a89984'
+
+      C_bright_red = '#fb4934'
+      C_bright_green = '#b8bb26'
+      C_bright_yellow = '#fabd2f'
+      C_bright_blue = '#83a598'
+      C_bright_purple = '#d3869b'
+      C_bright_aqua = '#8ec07c'
+      C_bright_orange = '#fe8019'
+
+      C_neutral_red = '#cc241d'
+      C_neutral_green = '#98971a'
+      C_neutral_yellow = '#d79921'
+      C_neutral_blue = '#458588'
+      C_neutral_purple = '#b16286'
+      C_neutral_aqua = '#689d6a'
+      C_neutral_orange = '#d65d0e'
+
+      C_faded_red = '#9d0006'
+      C_faded_green = '#79740e'
+      C_faded_yellow = '#b57614'
+      C_faded_blue = '#076678'
+      C_faded_purple = '#8f3f71'
+      C_faded_aqua = '#427b58'
+      C_faded_orange = '#af3a03'
+      # }}}
+
+      extend HasModes
+
+      def self.light!
+        mode :dark # indicate that there is a dark variant
+        mode! :light
+      end
+
+      def self.dark!
+        mode :light # indicate that there is a light variant
+        mode! :dark
+      end
+
+      def self.make_dark!
+        palette bg0: C_dark0
+        palette bg1: C_dark1
+        palette bg2: C_dark2
+        palette bg3: C_dark3
+        palette bg4: C_dark4
+
+        palette gray: C_gray_245
+
+        palette fg0: C_light0
+        palette fg1: C_light1
+        palette fg2: C_light2
+        palette fg3: C_light3
+        palette fg4: C_light4
+
+        palette fg4_256: C_light4_256
+
+        palette red: C_bright_red
+        palette green: C_bright_green
+        palette yellow: C_bright_yellow
+        palette blue: C_bright_blue
+        palette purple: C_bright_purple
+        palette aqua: C_bright_aqua
+        palette orange: C_bright_orange
+
+      end
+
+      def self.make_light!
+        palette bg0: C_light0
+        palette bg1: C_light1
+        palette bg2: C_light2
+        palette bg3: C_light3
+        palette bg4: C_light4
+
+        palette gray: C_gray_244
+
+        palette fg0: C_dark0
+        palette fg1: C_dark1
+        palette fg2: C_dark2
+        palette fg3: C_dark3
+        palette fg4: C_dark4
+
+        palette fg4_256: C_dark4_256
+
+        palette red: C_faded_red
+        palette green: C_faded_green
+        palette yellow: C_faded_yellow
+        palette blue: C_faded_blue
+        palette purple: C_faded_purple
+        palette aqua: C_faded_aqua
+        palette orange: C_faded_orange
+      end
+
+      dark!
+      mode :light
+
+      style Text, :fg => :fg0, :bg => :bg0
+      style Error, :fg => :red, :bg => :bg0, :bold => true
+      style Comment, :fg => :gray, :italic => true
+
+      style Comment::Preproc, :fg => :aqua
+
+      style Name::Tag, :fg => :red
+
+      style Operator,
+            Punctuation, :fg => :fg0
+
+      style Generic::Inserted, :fg => :green, :bg => :bg0
+      style Generic::Deleted, :fg => :red, :bg => :bg0
+      style Generic::Heading, :fg => :green, :bold => true
+
+      style Keyword, :fg => :red
+      style Keyword::Constant, :fg => :purple
+      style Keyword::Type, :fg => :yellow
+
+      style Keyword::Declaration, :fg => :orange
+
+      style Literal::String,
+            Literal::String::Interpol,
+            Literal::String::Regex, :fg => :green, :italic => true
+
+      style Literal::String::Escape, :fg => :orange
+
+      style Name::Namespace,
+            Name::Class, :fg => :aqua
+
+      style Name::Constant, :fg => :purple
+
+      style Name::Attribute, :fg => :green
+
+      style Literal::Number, :fg => :purple
+
+      style Literal::String::Symbol, :fg => :blue
+
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/molokai.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/molokai.rb
new file mode 100644
index 0000000..6f14aa7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/molokai.rb
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Themes
+    class Molokai < CSSTheme
+      name 'molokai'
+
+      palette :black          => '#1b1d1e'
+      palette :white          => '#f8f8f2'
+      palette :blue           => '#66d9ef'
+      palette :green          => '#a6e22e'
+      palette :grey           => '#403d3d'
+      palette :red            => '#f92672'
+      palette :light_grey     => '#465457'
+      palette :dark_blue      => '#5e5d83'
+      palette :violet         => '#af87ff'
+      palette :yellow         => '#d7d787'
+
+      style Comment,
+            Comment::Multiline,
+            Comment::Single,                  :fg => :dark_blue, :italic => true
+      style Comment::Preproc,                 :fg => :light_grey, :bold => true
+      style Comment::Special,                 :fg => :light_grey, :italic => true, :bold => true
+      style Error,                            :fg => :white, :bg => :grey
+      style Generic::Inserted,                :fg => :green
+      style Generic::Deleted,                 :fg => :red
+      style Generic::Emph,                    :fg => :black, :italic => true
+      style Generic::Error,
+            Generic::Traceback,               :fg => :red
+      style Generic::Heading,                 :fg => :grey
+      style Generic::Output,                  :fg => :grey
+      style Generic::Prompt,                  :fg => :blue
+      style Generic::Strong,                  :bold => true
+      style Generic::Subheading,              :fg => :light_grey
+      style Keyword,
+            Keyword::Constant,
+            Keyword::Declaration,
+            Keyword::Pseudo,
+            Keyword::Reserved,
+            Keyword::Type,                    :fg => :blue, :bold => true
+      style Keyword::Namespace,
+            Operator::Word,
+            Operator,                         :fg => :red, :bold => true
+      style Literal::Number::Float,
+            Literal::Number::Hex,
+            Literal::Number::Integer::Long,
+            Literal::Number::Integer,
+            Literal::Number::Oct,
+            Literal::Number,
+            Literal::String::Escape,          :fg => :violet
+      style Literal::String::Backtick,
+            Literal::String::Char,
+            Literal::String::Doc,
+            Literal::String::Double,
+            Literal::String::Heredoc,
+            Literal::String::Interpol,
+            Literal::String::Other,
+            Literal::String::Regex,
+            Literal::String::Single,
+            Literal::String::Symbol,
+            Literal::String,                  :fg => :yellow
+      style Name::Attribute,                  :fg => :green
+      style Name::Class,
+            Name::Decorator,
+            Name::Exception,
+            Name::Function,                   :fg => :green, :bold => true
+      style Name::Constant,                   :fg => :blue
+      style Name::Builtin::Pseudo,
+            Name::Builtin,
+            Name::Entity,
+            Name::Namespace,
+            Name::Variable::Class,
+            Name::Variable::Global,
+            Name::Variable::Instance,
+            Name::Variable,
+            Text::Whitespace,                 :fg => :white
+      style Name::Label,                      :fg => :white, :bold => true
+      style Name::Tag,                        :fg => :red
+      style Text,                             :fg => :white, :bg => :black
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/monokai.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/monokai.rb
new file mode 100644
index 0000000..3273f7d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/monokai.rb
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Themes
+    class Monokai < CSSTheme
+      name 'monokai'
+
+      palette :black          => '#000000'
+      palette :bright_green   => '#a6e22e'
+      palette :bright_pink    => '#f92672'
+      palette :carmine        => '#960050'
+      palette :dark           => '#49483e'
+      palette :dark_grey      => '#888888'
+      palette :dark_red       => '#aa0000'
+      palette :dimgrey        => '#75715e'
+      palette :dimgreen       => '#324932'
+      palette :dimred         => '#493131'
+      palette :emperor        => '#555555'
+      palette :grey           => '#999999'
+      palette :light_grey     => '#aaaaaa'
+      palette :light_violet   => '#ae81ff'
+      palette :soft_cyan      => '#66d9ef'
+      palette :soft_yellow    => '#e6db74'
+      palette :very_dark      => '#1e0010'
+      palette :whitish        => '#f8f8f2'
+      palette :orange         => '#f6aa11'
+      palette :white          => '#ffffff'
+
+      style Comment,
+            Comment::Multiline,
+            Comment::Single,                  :fg => :dimgrey, :italic => true
+      style Comment::Preproc,                 :fg => :dimgrey, :bold => true
+      style Comment::Special,                 :fg => :dimgrey, :italic => true, :bold => true
+      style Error,                            :fg => :carmine, :bg => :very_dark
+      style Generic::Inserted,                :fg => :white, :bg => :dimgreen
+      style Generic::Deleted,                 :fg => :white, :bg => :dimred
+      style Generic::Emph,                    :fg => :black, :italic => true
+      style Generic::Error,
+            Generic::Traceback,               :fg => :dark_red
+      style Generic::Heading,                 :fg => :grey
+      style Generic::Output,                  :fg => :dark_grey
+      style Generic::Prompt,                  :fg => :emperor
+      style Generic::Strong,                  :bold => true
+      style Generic::Subheading,              :fg => :light_grey
+      style Keyword,
+            Keyword::Constant,
+            Keyword::Declaration,
+            Keyword::Pseudo,
+            Keyword::Reserved,
+            Keyword::Type,                    :fg => :soft_cyan, :bold => true
+      style Keyword::Namespace,
+            Operator::Word,
+            Operator,                         :fg => :bright_pink, :bold => true
+      style Literal::Number::Float,
+            Literal::Number::Hex,
+            Literal::Number::Integer::Long,
+            Literal::Number::Integer,
+            Literal::Number::Oct,
+            Literal::Number,
+            Literal::String::Escape,          :fg => :light_violet
+      style Literal::String::Backtick,
+            Literal::String::Char,
+            Literal::String::Doc,
+            Literal::String::Double,
+            Literal::String::Heredoc,
+            Literal::String::Interpol,
+            Literal::String::Other,
+            Literal::String::Regex,
+            Literal::String::Single,
+            Literal::String::Symbol,
+            Literal::String,                  :fg => :soft_yellow
+      style Name::Attribute,                  :fg => :bright_green
+      style Name::Class,
+            Name::Decorator,
+            Name::Exception,
+            Name::Function,                   :fg => :bright_green, :bold => true
+      style Name::Constant,                   :fg => :soft_cyan
+      style Name::Builtin::Pseudo,
+            Name::Builtin,
+            Name::Entity,
+            Name::Namespace,
+            Name::Variable::Class,
+            Name::Variable::Global,
+            Name::Variable::Instance,
+            Name::Variable,
+            Text::Whitespace,                 :fg => :whitish
+      style Name::Label,                      :fg => :whitish, :bold => true
+      style Name::Tag,                        :fg => :bright_pink
+      style Text,                             :fg => :whitish, :bg => :dark
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/monokai_sublime.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/monokai_sublime.rb
new file mode 100644
index 0000000..5c700e7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/monokai_sublime.rb
@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*- #
+module Rouge
+  module Themes
+    class MonokaiSublime < CSSTheme
+      name 'monokai.sublime'
+
+      palette :black          => '#000000'
+      palette :bright_green   => '#a6e22e'
+      palette :bright_pink    => '#f92672'
+      palette :carmine        => '#960050'
+      palette :dark           => '#49483e'
+      palette :dark_grey      => '#888888'
+      palette :dark_red       => '#aa0000'
+      palette :dimgrey        => '#75715e'
+      palette :emperor        => '#555555'
+      palette :grey           => '#999999'
+      palette :light_grey     => '#aaaaaa'
+      palette :light_violet   => '#ae81ff'
+      palette :soft_cyan      => '#66d9ef'
+      palette :soft_yellow    => '#e6db74'
+      palette :very_dark      => '#1e0010'
+      palette :whitish        => '#f8f8f2'
+      palette :orange         => '#f6aa11'
+      palette :white          => '#ffffff'
+
+      style Generic::Heading,                 :fg => :grey
+      style Literal::String::Regex,           :fg => :orange
+      style Generic::Output,                  :fg => :dark_grey
+      style Generic::Prompt,                  :fg => :emperor
+      style Generic::Strong,                  :bold => false
+      style Generic::Subheading,              :fg => :light_grey
+      style Name::Builtin,                    :fg => :orange
+      style Comment::Multiline,
+            Comment::Preproc,
+            Comment::Single,
+            Comment::Special,
+            Comment,                          :fg => :dimgrey
+      style Error,
+            Generic::Error,
+            Generic::Traceback,               :fg => :carmine
+      style Generic::Deleted,
+            Generic::Inserted,
+            Generic::Emph,                    :fg => :dark
+      style Keyword::Constant,
+            Keyword::Declaration,
+            Keyword::Reserved,
+            Name::Constant,
+            Keyword::Type,                    :fg => :soft_cyan
+      style Literal::Number::Float,
+            Literal::Number::Hex,
+            Literal::Number::Integer::Long,
+            Literal::Number::Integer,
+            Literal::Number::Oct,
+            Literal::Number,
+            Literal::String::Char,
+            Literal::String::Escape,
+            Literal::String::Symbol,          :fg => :light_violet
+      style Literal::String::Doc,
+            Literal::String::Double,
+            Literal::String::Backtick,
+            Literal::String::Heredoc,
+            Literal::String::Interpol,
+            Literal::String::Other,
+            Literal::String::Single,
+            Literal::String,                  :fg => :soft_yellow
+      style Name::Attribute,
+            Name::Class,
+            Name::Decorator,
+            Name::Exception,
+            Name::Function,                   :fg => :bright_green
+      style Name::Variable::Class,
+            Name::Namespace,
+            Name::Label,
+            Name::Entity,
+            Name::Builtin::Pseudo,
+            Name::Variable::Global,
+            Name::Variable::Instance,
+            Name::Variable,
+            Text::Whitespace,
+            Text,
+            Name,                             :fg => :white
+      style Operator::Word,
+            Name::Tag,
+            Keyword,
+            Keyword::Namespace,
+            Keyword::Pseudo,
+            Operator,                         :fg => :bright_pink
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/thankful_eyes.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/thankful_eyes.rb
new file mode 100644
index 0000000..d041b38
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/themes/thankful_eyes.rb
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  module Themes
+    class ThankfulEyes < CSSTheme
+      name 'thankful_eyes'
+
+      # pallette, from GTKSourceView's ThankfulEyes
+      palette :cool_as_ice    => '#6c8b9f'
+      palette :slate_blue     => '#4e5d62'
+      palette :eggshell_cloud => '#dee5e7'
+      palette :krasna         => '#122b3b'
+      palette :aluminum1      => '#fefeec'
+      palette :scarletred2    => '#cc0000'
+      palette :butter3        => '#c4a000'
+      palette :go_get_it      => '#b2fd6d'
+      palette :chilly         => '#a8e1fe'
+      palette :unicorn        => '#faf6e4'
+      palette :sandy          => '#f6dd62'
+      palette :pink_merengue  => '#f696db'
+      palette :dune           => '#fff0a6'
+      palette :backlit        => '#4df4ff'
+      palette :schrill        => '#ffb000'
+
+      style Text, :fg => :unicorn, :bg => :krasna
+      style Generic::Lineno, :fg => :eggshell_cloud, :bg => :slate_blue
+
+      style Comment, :fg => :cool_as_ice, :italic => true
+      style Comment::Preproc, :fg => :go_get_it, :bold => true, :italic => true
+      style Error,
+            Generic::Error, :fg => :aluminum1, :bg => :scarletred2
+      style Keyword, :fg => :sandy, :bold => true
+      style Operator,
+            Punctuation, :fg => :backlit
+      style Generic::Deleted, :fg => :scarletred2
+      style Generic::Inserted, :fg => :go_get_it
+      style Generic::Emph, :italic => true
+      style Generic::Strong, :bold => true
+      style Generic::Traceback, :fg => :eggshell_cloud, :bg => :slate_blue
+      style Keyword::Constant, :fg => :pink_merengue, :bold => true
+      style Keyword::Namespace,
+            Keyword::Pseudo,
+            Keyword::Reserved,
+            Generic::Heading,
+            Generic::Subheading, :fg => :schrill, :bold => true
+      style Keyword::Type,
+            Name::Constant,
+            Name::Class,
+            Name::Decorator,
+            Name::Namespace,
+            Name::Builtin::Pseudo,
+            Name::Exception, :fg => :go_get_it, :bold => true
+      style Name::Label,
+            Name::Tag, :fg => :schrill, :bold => true
+      style Literal::Number,
+            Literal::Date,
+            Literal::String::Symbol, :fg => :pink_merengue, :bold => true
+      style Literal::String, :fg => :dune, :bold => true
+      style Literal::String::Escape,
+            Literal::String::Char,
+            Literal::String::Interpol, :fg => :backlit, :bold => true
+      style Name::Builtin, :bold => true
+      style Name::Entity, :fg => '#999999', :bold => true
+      style Text::Whitespace, :fg => '#BBBBBB'
+      style Name::Function,
+            Name::Property,
+            Name::Attribute, :fg => :chilly
+      style Name::Variable, :fg => :chilly, :bold => true
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/token.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/token.rb
new file mode 100644
index 0000000..ce044a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/token.rb
@@ -0,0 +1,182 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  class Token
+    class << self
+      attr_reader :name
+      attr_reader :parent
+      attr_reader :shortname
+
+      def cache
+        @cache ||= {}
+      end
+
+      def sub_tokens
+        @sub_tokens ||= {}
+      end
+
+      def [](qualname)
+        return qualname unless qualname.is_a? ::String
+
+        Token.cache[qualname]
+      end
+
+      def inspect
+        "<Token #{qualname}>"
+      end
+
+      def matches?(other)
+        other.token_chain.include? self
+      end
+
+      def token_chain
+        @token_chain ||= ancestors.take_while { |x| x != Token }.reverse
+      end
+
+      def qualname
+        @qualname ||= token_chain.map(&:name).join('.')
+      end
+
+      def register!
+        Token.cache[self.qualname] = self
+        parent.sub_tokens[self.name] = self
+      end
+
+      def make_token(name, shortname, &b)
+        parent = self
+        Class.new(parent) do
+          @parent = parent
+          @name = name
+          @shortname = shortname
+          register!
+          class_eval(&b) if b
+        end
+      end
+
+      def token(name, shortname, &b)
+        tok = make_token(name, shortname, &b)
+        const_set(name, tok)
+      end
+
+      def each_token(&b)
+        Token.cache.each do |(_, t)|
+          b.call(t)
+        end
+      end
+    end
+
+    module Tokens
+      def self.token(name, shortname, &b)
+        tok = Token.make_token(name, shortname, &b)
+        const_set(name, tok)
+      end
+
+      # XXX IMPORTANT XXX
+      # For compatibility, this list must be kept in sync with
+      # pygments.token.STANDARD_TYPES
+      # please see https://github.com/jneen/rouge/wiki/List-of-tokens
+      token :Text, '' do
+        token :Whitespace, 'w'
+      end
+
+      token :Error, 'err'
+      token :Other, 'x'
+
+      token :Keyword, 'k' do
+        token :Constant,    'kc'
+        token :Declaration, 'kd'
+        token :Namespace,   'kn'
+        token :Pseudo,      'kp'
+        token :Reserved,    'kr'
+        token :Type,        'kt'
+        token :Variable,    'kv'
+      end
+
+      token :Name, 'n' do
+        token :Attribute,    'na'
+        token :Builtin,      'nb' do
+          token :Pseudo,     'bp'
+        end
+        token :Class,        'nc'
+        token :Constant,     'no'
+        token :Decorator,    'nd'
+        token :Entity,       'ni'
+        token :Exception,    'ne'
+        token :Function,     'nf'
+        token :Property,     'py'
+        token :Label,        'nl'
+        token :Namespace,    'nn'
+        token :Other,        'nx'
+        token :Tag,          'nt'
+        token :Variable,     'nv' do
+          token :Class,      'vc'
+          token :Global,     'vg'
+          token :Instance,   'vi'
+        end
+      end
+
+      token :Literal,      'l' do
+        token :Date,       'ld'
+
+        token :String,     's' do
+          token :Backtick, 'sb'
+          token :Char,     'sc'
+          token :Doc,      'sd'
+          token :Double,   's2'
+          token :Escape,   'se'
+          token :Heredoc,  'sh'
+          token :Interpol, 'si'
+          token :Other,    'sx'
+          token :Regex,    'sr'
+          token :Single,   's1'
+          token :Symbol,   'ss'
+        end
+
+        token :Number,     'm' do
+          token :Float,    'mf'
+          token :Hex,      'mh'
+          token :Integer,  'mi' do
+            token :Long,   'il'
+          end
+          token :Oct,      'mo'
+          token :Bin,      'mb'
+          token :Other,    'mx'
+        end
+      end
+
+      token :Operator, 'o' do
+        token :Word,   'ow'
+      end
+
+      token :Punctuation, 'p' do
+        token :Indicator, 'pi'
+      end
+
+      token :Comment,     'c' do
+        token :Doc,       'cd'
+        token :Multiline, 'cm'
+        token :Preproc,   'cp'
+        token :Single,    'c1'
+        token :Special,   'cs'
+      end
+
+      token :Generic,      'g' do
+        token :Deleted,    'gd'
+        token :Emph,       'ge'
+        token :Error,      'gr'
+        token :Heading,    'gh'
+        token :Inserted,   'gi'
+        token :Output,     'go'
+        token :Prompt,     'gp'
+        token :Strong,     'gs'
+        token :Subheading, 'gu'
+        token :Traceback,  'gt'
+        token :Lineno,     'gl'
+      end
+
+      # convenience
+      Num = Literal::Number
+      Str = Literal::String
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/util.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/util.rb
new file mode 100644
index 0000000..77168f6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/util.rb
@@ -0,0 +1,101 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  class InheritableHash < Hash
+    def initialize(parent=nil)
+      @parent = parent
+    end
+
+    def [](k)
+      _sup = super
+      return _sup if own_keys.include?(k)
+
+      _sup || parent[k]
+    end
+
+    def parent
+      @parent ||= {}
+    end
+
+    def include?(k)
+      super or parent.include?(k)
+    end
+
+    def each(&b)
+      keys.each do |k|
+        b.call(k, self[k])
+      end
+    end
+
+    alias own_keys keys
+    def keys
+      keys = own_keys.concat(parent.keys)
+      keys.uniq!
+      keys
+    end
+  end
+
+  class InheritableList
+    include Enumerable
+
+    def initialize(parent=nil)
+      @parent = parent
+    end
+
+    def parent
+      @parent ||= []
+    end
+
+    def each(&b)
+      return enum_for(:each) unless block_given?
+
+      parent.each(&b)
+      own_entries.each(&b)
+    end
+
+    def own_entries
+      @own_entries ||= []
+    end
+
+    def push(o)
+      own_entries << o
+    end
+    alias << push
+  end
+
+  # shared methods for some indentation-sensitive lexers
+  module Indentation
+    def reset!
+      super
+      @block_state = @block_indentation = nil
+    end
+
+    # push a state for the next indented block
+    def starts_block(block_state)
+      @block_state = block_state
+      @block_indentation = @last_indentation || ''
+      puts "    starts_block #{block_state.inspect}" if @debug
+      puts "    block_indentation: #{@block_indentation.inspect}" if @debug
+    end
+
+    # handle a single indented line
+    def indentation(indent_str)
+      puts "    indentation #{indent_str.inspect}" if @debug
+      puts "    block_indentation: #{@block_indentation.inspect}" if @debug
+      @last_indentation = indent_str
+
+      # if it's an indent and we know where to go next,
+      # push that state.  otherwise, push content and
+      # clear the block state.
+      if (@block_state &&
+          indent_str.start_with?(@block_indentation) &&
+          indent_str != @block_indentation
+      )
+        push @block_state
+      else
+        @block_state = @block_indentation = nil
+        push :content
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/version.rb b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/version.rb
new file mode 100644
index 0000000..11e795d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/lib/rouge/version.rb
@@ -0,0 +1,7 @@
+# -*- coding: utf-8 -*- #
+
+module Rouge
+  def self.version
+    "1.11.1"
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/rouge.gemspec b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/rouge.gemspec
new file mode 100644
index 0000000..f1d56c0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/rouge-1.11.1/rouge.gemspec
@@ -0,0 +1,18 @@
+require './lib/rouge/version'
+
+Gem::Specification.new do |s|
+  s.name = "rouge"
+  s.version = Rouge.version
+  s.authors = ["Jeanine Adkisson"]
+  s.email = ["jneen@jneen.net"]
+  s.summary = "A pure-ruby colorizer based on pygments"
+  s.description = <<-desc.strip.gsub(/\s+/, ' ')
+    Rouge aims to a be a simple, easy-to-extend drop-in replacement
+    for pygments.
+  desc
+  s.homepage = "http://rouge.jneen.net/"
+  s.rubyforge_project = "rouge"
+  s.files = Dir['Gemfile', 'LICENSE', 'rouge.gemspec', 'lib/**/*.rb', 'lib/**/*.yml', 'bin/rougify', 'lib/rouge/demos/*']
+  s.executables = %w(rougify)
+  s.license = 'MIT, 2-clause BSD'
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/.gitignore b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/.gitignore
new file mode 100644
index 0000000..b844b14
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/.gitignore
@@ -0,0 +1 @@
+Gemfile.lock
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/.travis.yml b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/.travis.yml
new file mode 100644
index 0000000..231fdba
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/.travis.yml
@@ -0,0 +1,48 @@
+language:
+  ruby
+
+before_install:
+  gem install bundler
+
+script:
+  bundle exec rake spec
+
+rvm:
+  - ruby-head
+  - 2.0.0
+  - 1.9.3
+  - 1.9.2
+  - 1.8.7
+  - rbx-19mode
+  - rbx-18mode
+  - jruby-head
+  - jruby-19mode
+  - jruby-18mode
+  - ree
+
+env:
+  - YAMLER=syck
+  - YAMLER=psych
+
+matrix:
+  allow_failures:
+    - rvm: ruby-head
+    - rvm: rbx-19mode
+    - rvm: rbx-18mode
+    - rvm: jruby-head
+    - rvm: ree
+
+  exclude:
+    - rvm: 1.8.7
+      env: YAMLER=psych
+    - rvm: jruby-head
+      env: YAMLER=syck
+    - rvm: jruby-19mode
+      env: YAMLER=syck
+    - rvm: jruby-18mode
+      env: YAMLER=syck
+
+branches:
+  only:
+    - master
+
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/CHANGES.md b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/CHANGES.md
new file mode 100644
index 0000000..2587b47
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/CHANGES.md
@@ -0,0 +1,149 @@
+1.0.2
+-----
+
+- added warning when using Psych + an older version of libyaml
+
+1.0.1
+-----
+
+- fixed handling for strings that look like (invalid) dates
+
+1.0.0
+-----
+
+- updated date parsing to use local timezone
+- **now requiring "safe_yaml/load" provides `SafeYAML.load` without clobbering `YAML`**
+- fixed handling of empty files
+- fixed some (edge case) integer parsing bugs
+- fixed some JRuby-specific issues
+
+0.9.7
+-----
+
+- made handling of document frontmatter more robust
+- added more descriptive message to the warning for omitting the :safe option
+
+0.9.6
+-----
+
+- fixed handling of files with trailing content (after closing `---`)
+
+0.9.5
+-----
+
+- fixed permissions AGAIN
+
+0.9.4
+-----
+
+- corrected handling of symbols
+
+0.9.3
+-----
+
+- fixed permissions :(
+
+0.9.2
+-----
+
+- fixed error w/ parsing "!" when whitelisting tags
+- fixed parsing of the number 0 (d'oh!)
+
+0.9.1
+-----
+
+- added Yecht support (JRuby)
+- more bug fixes
+
+0.9.0
+-----
+
+- added `whitelist!` method for easily whitelisting tags
+- added support for call-specific options
+- removed deprecated methods
+
+0.8.6
+-----
+
+- fixed bug in float matcher
+
+0.8.5
+-----
+
+- performance improvements
+- made less verbose by default
+- bug fixes
+
+0.8.4
+-----
+
+- enhancements to parsing of integers, floats, and dates
+- updated built-in whitelist
+- more bug fixes
+
+0.8.3
+-----
+
+- fixed exception on parsing empty document
+- fixed handling of octal & hexadecimal numbers
+
+0.8.2
+-----
+
+- bug fixes
+
+0.8.1
+-----
+
+- added `:raise_on_unknown_tag` option
+- renamed `reset_defaults!` to `restore_defaults!`
+
+0.8
+---
+
+- added tag whitelisting
+- more API changes
+
+0.7
+---
+
+- separated YAML engine support from Ruby version
+- added support for binary scalars
+- numerous bug fixes and enhancements
+
+0.6
+---
+
+- several API changes
+- added `SafeYAML::OPTIONS` for specifying default behavior
+
+0.5
+---
+
+Added support for dates
+
+0.4
+---
+
+- efficiency improvements
+- made `YAML.load` use `YAML.safe_load` by default
+- made symbol deserialization optional
+
+0.3
+---
+
+Added Syck support
+
+0.2
+---
+
+Added support for:
+
+- anchors & aliases
+- booleans
+- nils
+
+0.1
+---
+
+Initial release
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/Gemfile b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/Gemfile
new file mode 100644
index 0000000..24d7e3e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/Gemfile
@@ -0,0 +1,11 @@
+source "https://rubygems.org"
+
+gemspec
+
+group :development do
+  gem "hashie"
+  gem "heredoc_unindent"
+  gem "rake"
+  gem "rspec"
+  gem "travis-lint"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/LICENSE.txt b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/LICENSE.txt
new file mode 100644
index 0000000..4b276dd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2013 Dan Tao
+
+MIT License
+
+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/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/README.md b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/README.md
new file mode 100644
index 0000000..a7b7bdc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/README.md
@@ -0,0 +1,191 @@
+SafeYAML
+========
+
+[![Build Status](https://travis-ci.org/dtao/safe_yaml.png)](http://travis-ci.org/dtao/safe_yaml)
+[![Gem Version](https://badge.fury.io/rb/safe_yaml.png)](http://badge.fury.io/rb/safe_yaml)
+
+The **SafeYAML** gem provides an alternative implementation of `YAML.load` suitable for accepting user input in Ruby applications. Unlike Ruby's built-in implementation of `YAML.load`, SafeYAML's version will not expose apps to arbitrary code execution exploits (such as [the ones discovered](http://www.reddit.com/r/netsec/comments/167c11/serious_vulnerability_in_ruby_on_rails_allowing/) [in Rails in early 2013](http://www.h-online.com/open/news/item/Rails-developers-close-another-extremely-critical-flaw-1793511.html)).
+
+**If you encounter any issues with SafeYAML, check out the 'Common Issues' section below.** If you don't see anything that addresses the problem you're experiencing, by all means, [create an issue](https://github.com/dtao/safe_yaml/issues/new)!
+
+Installation
+------------
+
+Add this line to your application's Gemfile:
+
+```ruby
+gem "safe_yaml"
+```
+
+Configuration
+-------------
+
+If *all you do* is add SafeYAML to your project, then `YAML.load` will operate in "safe" mode, which means it won't deserialize arbitrary objects. However, it will issue a warning the first time you call it because you haven't explicitly specified whether you want safe or unsafe behavior by default. To specify this behavior (e.g., in a Rails initializer):
+
+```ruby
+SafeYAML::OPTIONS[:default_mode] = :safe # or :unsafe
+```
+
+Another important option you might want to specify on startup is whether or not to allow *symbols* to be deserialized. The default setting is `false`, since symbols are not garbage collected in Ruby and so deserializing them from YAML may render your application vulnerable to a DOS (denial of service) attack. To allow symbol deserialization by default:
+
+```ruby
+SafeYAML::OPTIONS[:deserialize_symbols] = true
+```
+
+For more information on these and other options, see the "Usage" section down below.
+
+What is this gem for, exactly?
+------------------------------
+
+Suppose your application were to use a popular open source library which contained code like this:
+
+```ruby
+class ClassBuilder
+  def []=(key, value)
+    @class ||= Class.new
+
+    @class.class_eval <<-EOS
+      def #{key}
+        #{value}
+      end
+    EOS
+  end
+
+  def create
+    @class.new
+  end
+end
+```
+
+Now, if you were to use `YAML.load` on user input anywhere in your application without the SafeYAML gem installed, an attacker who suspected you were using this library could send a request with a carefully-crafted YAML string to execute arbitrary code (yes, including `system("unix command")`) on your servers.
+
+This simple example demonstrates the vulnerability:
+
+```ruby
+yaml = <<-EOYAML
+--- !ruby/hash:ClassBuilder
+"foo; end; puts %(I'm in yr system!); def bar": "baz"
+EOYAML
+```
+
+    > YAML.load(yaml)
+    I'm in yr system!
+    => #<ClassBuilder:0x007fdbbe2e25d8 @class=#<Class:0x007fdbbe2e2510>>
+
+With SafeYAML, the same attacker would be thwarted:
+
+    > require "safe_yaml"
+    => true
+    > YAML.load(yaml, :safe => true)
+    => {"foo; end; puts %(I'm in yr system!); def bar"=>"baz"}
+
+Usage
+-----
+
+When you require the safe_yaml gem in your project, `YAML.load` is patched to accept one additional (optional) `options` parameter. This changes the method signature as follows:
+
+- for Syck and Psych prior to Ruby 1.9.3: `YAML.load(yaml, options={})`
+- for Psych in 1.9.3 and later: `YAML.load(yaml, filename=nil, options={})`
+
+The most important option is the `:safe` option (default: `true`), which controls whether or not to deserialize arbitrary objects when parsing a YAML document. The other options, along with explanations, are as follows.
+
+- `:deserialize_symbols` (default: `false`): Controls whether or not YAML will deserialize symbols. It is probably best to only enable this option where necessary, e.g. to make trusted libraries work. Symbols receive special treatment in Ruby and are not garbage collected, which means deserializing them indiscriminately may render your site vulnerable to a DOS attack.
+
+- `:whitelisted_tags`: Accepts an array of YAML tags that designate trusted types, e.g., ones that can be deserialized without worrying about any resulting security vulnerabilities. When any of the given tags are encountered in a YAML document, the associated data will be parsed by the underlying YAML engine (Syck or Psych) for the version of Ruby you are using. See the "Whitelisting Trusted Types" section below for more information.
+
+- `:custom_initializers`: Similar to the `:whitelisted_tags` option, but allows you to provide your own initializers for specified tags rather than using Syck or Psyck. Accepts a hash with string tags for keys and lambdas for values.
+
+- `:raise_on_unknown_tag` (default: `false`): Represents the highest possible level of paranoia. If the YAML engine encounters any tag other than ones that are automatically trusted by SafeYAML or that you've explicitly whitelisted, it will raise an exception. This may be a good choice if you expect to always be dealing with perfectly safe YAML and want your application to fail loudly upon encountering questionable data.
+
+All of the above options can be set at the global level via `SafeYAML::OPTIONS`. You can also set each one individually per call to `YAML.load`; an option explicitly passed to `load` will take precedence over an option specified globally.
+
+What if I don't *want* to patch `YAML`?
+---------------------------------------
+
+[Excellent question](https://github.com/dtao/safe_yaml/issues/47)! You can also get the methods `SafeYAML.load` and `SafeYAML.load_file` without touching the `YAML` module at all like this:
+
+```ruby
+require "safe_yaml/load" # instead of require "safe_yaml"
+```
+
+This way, you can use `SafeYAML.load` to parse YAML that *you* don't trust, without affecting the rest of an application (if you're developing a library, for example).
+
+Supported Types
+---------------
+
+The way that SafeYAML works is by restricting the kinds of objects that can be deserialized via `YAML.load`. More specifically, only the following types of objects can be deserialized by default:
+
+- Hashes
+- Arrays
+- Strings
+- Numbers
+- Dates
+- Times
+- Booleans
+- Nils
+
+Again, deserialization of symbols can be enabled globally by setting `SafeYAML::OPTIONS[:deserialize_symbols] = true`, or in a specific call to `YAML.load([some yaml], :deserialize_symbols => true)`.
+
+Whitelisting Trusted Types
+--------------------------
+
+SafeYAML supports whitelisting certain YAML tags for trusted types. This is handy when your application uses YAML to serialize and deserialize certain types not listed above, which you know to be free of any deserialization-related vulnerabilities.
+
+The easiest way to whitelist types is by calling `SafeYAML.whitelist!`, which can accept a variable number of safe types, e.g.:
+
+```ruby
+SafeYAML.whitelist!(Foo, Bar)
+```
+
+You can also whitelist YAML *tags* via the `:whitelisted_tags` option:
+
+```ruby
+# Using Syck
+SafeYAML::OPTIONS[:whitelisted_tags] = ["tag:ruby.yaml.org,2002:object:OpenStruct"]
+
+# Using Psych
+SafeYAML::OPTIONS[:whitelisted_tags] = ["!ruby/object:OpenStruct"]
+```
+
+And in case you were wondering: no, this feature will *not* allow would-be attackers to embed untrusted types within trusted types:
+
+```ruby
+yaml = <<-EOYAML
+--- !ruby/object:OpenStruct 
+table: 
+  :backdoor: !ruby/hash:ClassBuilder 
+    "foo; end; puts %(I'm in yr system!); def bar": "baz"
+EOYAML
+```
+
+    > YAML.safe_load(yaml)
+    => #<OpenStruct :backdoor={"foo; end; puts %(I'm in yr system!); def bar"=>"baz"}>
+
+Known Issues
+------------
+
+If you add SafeYAML to your project and start seeing any errors about missing keys, or you notice mysterious strings that look like `":foo"` (i.e., start with a colon), it's likely you're seeing errors from symbols being saved in YAML format. If you are able to modify the offending code, you might want to consider changing your YAML content to use plain vanilla strings instead of symbols. If not, you may need to set the `:deserialize_symbols` option to `true`, either in calls to `YAML.load` or---as a last resort---globally, with `SafeYAML::OPTIONS[:deserialize_symbols]`.
+
+Also be aware that some Ruby libraries, particularly those requiring inter-process communication, leverage YAML's object deserialization functionality and therefore may break or otherwise be impacted by SafeYAML. The following list includes known instances of SafeYAML's interaction with other Ruby gems:
+
+- [**ActiveRecord**](https://github.com/rails/rails/tree/master/activerecord): uses YAML to control serialization of model objects using the `serialize` class method. If you find that accessing serialized properties on your ActiveRecord models is causing errors, chances are you may need to:
+  1. set the `:deserialize_symbols` option to `true`,
+  2. whitelist some of the types in your serialized data via `SafeYAML.whitelist!` or the `:whitelisted_tags` option, or
+  3. both
+- [**delayed_job**](https://github.com/collectiveidea/delayed_job): Uses YAML to serialize the objects on which delayed methods are invoked (with `delay`). The safest solution in this case is to use `SafeYAML.whitelist!` to whitelist the types you need to serialize.
+- [**Guard**](https://github.com/guard/guard): Uses YAML as a serialization format for notifications. The data serialized uses symbolic keys, so setting `SafeYAML::OPTIONS[:deserialize_symbols] = true` is necessary to allow Guard to work.
+- [**sidekiq**](https://github.com/mperham/sidekiq): Uses a YAML configiuration file with symbolic keys, so setting `SafeYAML::OPTIONS[:deserialize_symbols] = true` should allow it to work.
+
+The above list will grow over time, as more issues are discovered.
+
+Versioning
+----------
+
+SafeYAML will follow [semantic versioning](http://semver.org/) so any updates to the first major version will maintain backwards compatability. So expect primarily bug fixes and feature enhancements (if anything!) from here on out... unless it makes sense to break the interface at some point and introduce a version 2.0, which I honestly think is unlikely.
+
+Requirements
+------------
+
+SafeYAML requires Ruby 1.8.7 or newer and works with both [Syck](http://www.ruby-doc.org/stdlib-1.8.7/libdoc/yaml/rdoc/YAML.html) and [Psych](http://github.com/tenderlove/psych).
+
+If you are using a version of Ruby where Psych is the default YAML engine (e.g., 1.9.3) but you want to use Syck, be sure to set `YAML::ENGINE.yamler = "syck"` **before** requiring the safe_yaml gem.
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/Rakefile b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/Rakefile
new file mode 100644
index 0000000..2d9dbc3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/Rakefile
@@ -0,0 +1,26 @@
+require "rspec/core/rake_task"
+
+desc "Run specs"
+task :spec => ['spec:app', 'spec:lib']
+
+namespace :spec do
+  desc "Run only specs tagged 'solo'"
+  RSpec::Core::RakeTask.new(:solo) do |t|
+    t.verbose = false
+    t.rspec_opts = %w(--color --tag solo)
+  end
+
+  desc "Run only specs tagged NOT tagged 'libraries' (for applications)"
+  RSpec::Core::RakeTask.new(:app) do |t|
+    t.verbose = false
+    ENV["MONKEYPATCH_YAML"] = "true"
+    t.rspec_opts = %w(--color --tag ~libraries)
+  end
+
+  desc "Run only specs tagged 'libraries'"
+  RSpec::Core::RakeTask.new(:lib) do |t|
+    t.verbose = false
+    ENV["MONKEYPATCH_YAML"] = "false"
+    t.rspec_opts = %w(--color --tag libraries)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/bin/safe_yaml b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/bin/safe_yaml
new file mode 100755
index 0000000..1751a72
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/bin/safe_yaml
@@ -0,0 +1,75 @@
+#!/usr/bin/env ruby
+
+$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
+
+require 'optparse'
+require 'safe_yaml/load'
+
+options = {}
+option_parser = OptionParser.new do |opts|
+  opts.banner = "Usage: safe_yaml [options]"
+
+  opts.on("-f", "--file=<path>", "Parse the given YAML file, dump the result to STDOUT") do |file|
+    options[:file] = file
+  end
+
+  opts.on("--libyaml-check", "Check for libyaml vulnerability CVE-2014-2525 on your system") do
+    options[:libyaml_check] = true
+  end
+end
+
+option_parser.parse!
+
+def report_libyaml_ok
+  puts "\e[32mGood news! You definitely have either a patched or up-to-date libyaml version :)\e[39m"
+end
+
+def check_for_overflow_bug
+  YAML.load("--- !#{'%20' * 100}")
+  report_libyaml_ok
+end
+
+def perform_libyaml_check(force=false)
+  unless SafeYAML::LibyamlChecker.libyaml_version_ok?
+    warn <<-EOM.gsub(/^ +/, '  ')
+
+      \e[33mSafeYAML Warning\e[39m
+      \e[33m----------------\e[39m
+
+      \e[31mYou may have an outdated version of libyaml (#{SafeYAML::LibyamlChecker::LIBYAML_VERSION}) installed on your system.\e[39m
+
+      Prior to 0.1.6, libyaml is vulnerable to a heap overflow exploit from malicious YAML payloads.
+
+      For more info, see:
+      https://www.ruby-lang.org/en/news/2014/03/29/heap-overflow-in-yaml-uri-escape-parsing-cve-2014-2525/
+    EOM
+  end
+
+  puts <<-EOM.gsub(/^ +/, '  ')
+
+    Hit Enter to check if your version of libyaml is vulnerable. This will run a test \e[31mwhich may crash\e[39m
+    \e[31mthe current process\e[39m. If it does, your system is vulnerable and you should do something about it.
+
+    Type "nm" and hit Enter if you don't want to run the check.
+
+    See the project wiki for more info:
+
+    https://github.com/dtao/safe_yaml/wiki/The-libyaml-vulnerability
+  EOM
+
+  if STDIN.readline.chomp("\n") != 'nm'
+    check_for_overflow_bug
+  end
+end
+
+if options[:libyaml_check]
+  perform_libyaml_check(options[:force_libyaml_check])
+
+elsif options[:file]
+  yaml = File.read(options[:file])
+  result = SafeYAML.load(yaml)
+  puts result.inspect
+
+else
+  puts option_parser.help
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/bundle_install_all_ruby_versions.sh b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/bundle_install_all_ruby_versions.sh
new file mode 100755
index 0000000..902d127
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/bundle_install_all_ruby_versions.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
+
+declare -a versions=("1.8.7" "1.9.2" "1.9.3" "2.0.0" "2.1.0" "2.1.1" "2.1.2" "ruby-head" "jruby")
+
+for i in "${versions[@]}"
+do
+  rvm use $i
+  bundle install
+done
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml.rb
new file mode 100644
index 0000000..db1957d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml.rb
@@ -0,0 +1,94 @@
+require "safe_yaml/load"
+
+module YAML
+  def self.load_with_options(yaml, *original_arguments)
+    filename, options = filename_and_options_from_arguments(original_arguments)
+    safe_mode = safe_mode_from_options("load", options)
+    arguments = [yaml]
+
+    if safe_mode == :safe
+      arguments << filename if SafeYAML::YAML_ENGINE == "psych"
+      arguments << options_for_safe_load(options)
+      safe_load(*arguments)
+    else
+      arguments << filename if SafeYAML::MULTI_ARGUMENT_YAML_LOAD
+      unsafe_load(*arguments)
+    end
+  end
+
+  def self.load_file_with_options(file, options={})
+    safe_mode = safe_mode_from_options("load_file", options)
+    if safe_mode == :safe
+      safe_load_file(file, options_for_safe_load(options))
+    else
+      unsafe_load_file(file)
+    end
+  end
+
+  def self.safe_load(*args)
+    SafeYAML.load(*args)
+  end
+
+  def self.safe_load_file(*args)
+    SafeYAML.load_file(*args)
+  end
+
+  if SafeYAML::MULTI_ARGUMENT_YAML_LOAD
+    def self.unsafe_load_file(filename)
+      # https://github.com/tenderlove/psych/blob/v1.3.2/lib/psych.rb#L296-298
+      File.open(filename, 'r:bom|utf-8') { |f| self.unsafe_load(f, filename) }
+    end
+
+  else
+    def self.unsafe_load_file(filename)
+      # https://github.com/tenderlove/psych/blob/v1.2.2/lib/psych.rb#L231-233
+      self.unsafe_load File.open(filename)
+    end
+  end
+
+  class << self
+    alias_method :unsafe_load, :load
+    alias_method :load, :load_with_options
+    alias_method :load_file, :load_file_with_options
+
+    private
+    def filename_and_options_from_arguments(arguments)
+      if arguments.count == 1
+        if arguments.first.is_a?(String)
+          return arguments.first, {}
+        else
+          return nil, arguments.first || {}
+        end
+
+      else
+        return arguments.first, arguments.last || {}
+      end
+    end
+
+    def safe_mode_from_options(method, options={})
+      if options[:safe].nil?
+        safe_mode = SafeYAML::OPTIONS[:default_mode] || :safe
+
+        if SafeYAML::OPTIONS[:default_mode].nil? && !SafeYAML::OPTIONS[:suppress_warnings]
+
+          Kernel.warn <<-EOWARNING.gsub(/^\s+/, '')
+            Called '#{method}' without the :safe option -- defaulting to #{safe_mode} mode.
+            You can avoid this warning in the future by setting the SafeYAML::OPTIONS[:default_mode] option (to :safe or :unsafe).
+          EOWARNING
+
+          SafeYAML::OPTIONS[:suppress_warnings] = true
+        end
+
+        return safe_mode
+      end
+
+      options[:safe] ? :safe : :unsafe
+    end
+
+    def options_for_safe_load(base_options)
+      options = base_options.dup
+      options.delete(:safe)
+      options
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/deep.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/deep.rb
new file mode 100644
index 0000000..6a5e037
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/deep.rb
@@ -0,0 +1,34 @@
+module SafeYAML
+  class Deep
+    def self.freeze(object)
+      object.each do |*entry|
+        value = entry.last
+        case value
+        when String, Regexp
+          value.freeze
+        when Enumerable
+          Deep.freeze(value)
+        end
+      end
+
+      return object.freeze
+    end
+
+    def self.copy(object)
+      duplicate = object.dup rescue object
+
+      case object
+      when Array
+        (0...duplicate.count).each do |i|
+          duplicate[i] = Deep.copy(duplicate[i])
+        end
+      when Hash
+        duplicate.keys.each do |key|
+          duplicate[key] = Deep.copy(duplicate[key])
+        end
+      end
+
+      duplicate
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/libyaml_checker.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/libyaml_checker.rb
new file mode 100644
index 0000000..1ae2423
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/libyaml_checker.rb
@@ -0,0 +1,36 @@
+require "set"
+
+module SafeYAML
+  class LibyamlChecker
+    LIBYAML_VERSION = Psych::LIBYAML_VERSION rescue nil
+
+    # Do proper version comparison (e.g. so 0.1.10 is >= 0.1.6)
+    SAFE_LIBYAML_VERSION = Gem::Version.new("0.1.6")
+
+    KNOWN_PATCHED_LIBYAML_VERSIONS = Set.new([
+      # http://people.canonical.com/~ubuntu-security/cve/2014/CVE-2014-2525.html
+      "0.1.4-2ubuntu0.12.04.3",
+      "0.1.4-2ubuntu0.12.10.3",
+      "0.1.4-2ubuntu0.13.10.3",
+      "0.1.4-3ubuntu3",
+
+      # https://security-tracker.debian.org/tracker/CVE-2014-2525
+      "0.1.3-1+deb6u4",
+      "0.1.4-2+deb7u4",
+      "0.1.4-3.2"
+    ]).freeze
+
+    def self.libyaml_version_ok?
+      return true if YAML_ENGINE != "psych" || defined?(JRUBY_VERSION)
+      return true if Gem::Version.new(LIBYAML_VERSION || "0") >= SAFE_LIBYAML_VERSION
+      return libyaml_patched?
+    end
+
+    def self.libyaml_patched?
+      return false if (`which dpkg` rescue '').empty?
+      libyaml_version = `dpkg -s libyaml-0-2`.match(/^Version: (.*)$/)
+      return false if libyaml_version.nil?
+      KNOWN_PATCHED_LIBYAML_VERSIONS.include?(libyaml_version[1])
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/load.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/load.rb
new file mode 100644
index 0000000..5ea0f60
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/load.rb
@@ -0,0 +1,181 @@
+require "set"
+require "yaml"
+
+# This needs to be defined up front in case any internal classes need to base
+# their behavior off of this.
+module SafeYAML
+  YAML_ENGINE = defined?(YAML::ENGINE) ? YAML::ENGINE.yamler : (defined?(Psych) && YAML == Psych ? "psych" : "syck")
+end
+
+require "safe_yaml/libyaml_checker"
+require "safe_yaml/deep"
+require "safe_yaml/parse/hexadecimal"
+require "safe_yaml/parse/sexagesimal"
+require "safe_yaml/parse/date"
+require "safe_yaml/transform/transformation_map"
+require "safe_yaml/transform/to_boolean"
+require "safe_yaml/transform/to_date"
+require "safe_yaml/transform/to_float"
+require "safe_yaml/transform/to_integer"
+require "safe_yaml/transform/to_nil"
+require "safe_yaml/transform/to_symbol"
+require "safe_yaml/transform"
+require "safe_yaml/resolver"
+require "safe_yaml/syck_hack" if SafeYAML::YAML_ENGINE == "syck" && defined?(JRUBY_VERSION)
+
+module SafeYAML
+  MULTI_ARGUMENT_YAML_LOAD = YAML.method(:load).arity != 1
+
+  DEFAULT_OPTIONS = Deep.freeze({
+    :default_mode         => nil,
+    :suppress_warnings    => false,
+    :deserialize_symbols  => false,
+    :whitelisted_tags     => [],
+    :custom_initializers  => {},
+    :raise_on_unknown_tag => false
+  })
+
+  OPTIONS = Deep.copy(DEFAULT_OPTIONS)
+
+  PREDEFINED_TAGS = {}
+
+  if YAML_ENGINE == "syck"
+    YAML.tagged_classes.each do |tag, klass|
+      PREDEFINED_TAGS[klass] = tag
+    end
+
+  else
+    # Special tags appear to be hard-coded in Psych:
+    # https://github.com/tenderlove/psych/blob/v1.3.4/lib/psych/visitors/to_ruby.rb
+    # Fortunately, there aren't many that SafeYAML doesn't already support.
+    PREDEFINED_TAGS.merge!({
+      Exception => "!ruby/exception",
+      Range     => "!ruby/range",
+      Regexp    => "!ruby/regexp",
+    })
+  end
+
+  Deep.freeze(PREDEFINED_TAGS)
+
+  module_function
+
+  def restore_defaults!
+    OPTIONS.clear.merge!(Deep.copy(DEFAULT_OPTIONS))
+  end
+
+  def tag_safety_check!(tag, options)
+    return if tag.nil? || tag == "!"
+    if options[:raise_on_unknown_tag] && !options[:whitelisted_tags].include?(tag) && !tag_is_explicitly_trusted?(tag)
+      raise "Unknown YAML tag '#{tag}'"
+    end
+  end
+
+  def whitelist!(*classes)
+    classes.each do |klass|
+      whitelist_class!(klass)
+    end
+  end
+
+  def whitelist_class!(klass)
+    raise "#{klass} not a Class" unless klass.is_a?(::Class)
+
+    klass_name = klass.name
+    raise "#{klass} cannot be anonymous" if klass_name.nil? || klass_name.empty?
+
+    # Whitelist any built-in YAML tags supplied by Syck or Psych.
+    predefined_tag = PREDEFINED_TAGS[klass]
+    if predefined_tag
+      OPTIONS[:whitelisted_tags] << predefined_tag
+      return
+    end
+
+    # Exception is exceptional (har har).
+    tag_class  = klass < Exception ? "exception" : "object"
+
+    tag_prefix = case YAML_ENGINE
+                 when "psych" then "!ruby/#{tag_class}"
+                 when "syck"  then "tag:ruby.yaml.org,2002:#{tag_class}"
+                 else raise "unknown YAML_ENGINE #{YAML_ENGINE}"
+                 end
+    OPTIONS[:whitelisted_tags] << "#{tag_prefix}:#{klass_name}"
+  end
+
+  if YAML_ENGINE == "psych"
+    def tag_is_explicitly_trusted?(tag)
+      false
+    end
+
+  else
+    TRUSTED_TAGS = Set.new([
+      "tag:yaml.org,2002:binary",
+      "tag:yaml.org,2002:bool#no",
+      "tag:yaml.org,2002:bool#yes",
+      "tag:yaml.org,2002:float",
+      "tag:yaml.org,2002:float#fix",
+      "tag:yaml.org,2002:int",
+      "tag:yaml.org,2002:map",
+      "tag:yaml.org,2002:null",
+      "tag:yaml.org,2002:seq",
+      "tag:yaml.org,2002:str",
+      "tag:yaml.org,2002:timestamp",
+      "tag:yaml.org,2002:timestamp#ymd"
+    ]).freeze
+
+    def tag_is_explicitly_trusted?(tag)
+      TRUSTED_TAGS.include?(tag)
+    end
+  end
+
+  if SafeYAML::YAML_ENGINE == "psych"
+    require "safe_yaml/psych_handler"
+    require "safe_yaml/psych_resolver"
+    require "safe_yaml/safe_to_ruby_visitor"
+
+    def self.load(yaml, filename=nil, options={})
+      # If the user hasn't whitelisted any tags, we can go with this implementation which is
+      # significantly faster.
+      if (options && options[:whitelisted_tags] || SafeYAML::OPTIONS[:whitelisted_tags]).empty?
+        safe_handler = SafeYAML::PsychHandler.new(options) do |result|
+          return result
+        end
+        arguments_for_parse = [yaml]
+        arguments_for_parse << filename if SafeYAML::MULTI_ARGUMENT_YAML_LOAD
+        Psych::Parser.new(safe_handler).parse(*arguments_for_parse)
+        return safe_handler.result
+
+      else
+        safe_resolver = SafeYAML::PsychResolver.new(options)
+        tree = SafeYAML::MULTI_ARGUMENT_YAML_LOAD ?
+          Psych.parse(yaml, filename) :
+          Psych.parse(yaml)
+        return safe_resolver.resolve_node(tree)
+      end
+    end
+
+    def self.load_file(filename, options={})
+      if SafeYAML::MULTI_ARGUMENT_YAML_LOAD
+        File.open(filename, 'r:bom|utf-8') { |f| self.load(f, filename, options) }
+
+      else
+        # Ruby pukes on 1.9.2 if we try to open an empty file w/ 'r:bom|utf-8';
+        # so we'll not specify those flags here. This mirrors the behavior for
+        # unsafe_load_file so it's probably preferable anyway.
+        self.load File.open(filename), nil, options
+      end
+    end
+
+  else
+    require "safe_yaml/syck_resolver"
+    require "safe_yaml/syck_node_monkeypatch"
+
+    def self.load(yaml, options={})
+      resolver = SafeYAML::SyckResolver.new(SafeYAML::OPTIONS.merge(options || {}))
+      tree = YAML.parse(yaml)
+      return resolver.resolve_node(tree)
+    end
+
+    def self.load_file(filename, options={})
+      File.open(filename) { |f| self.load(f, options) }
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/date.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/date.rb
new file mode 100644
index 0000000..cd3c62a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/date.rb
@@ -0,0 +1,35 @@
+module SafeYAML
+  class Parse
+    class Date
+      # This one's easy enough :)
+      DATE_MATCHER = /\A(\d{4})-(\d{2})-(\d{2})\Z/.freeze
+
+      # This unbelievable little gem is taken basically straight from the YAML spec, but made
+      # slightly more readable (to my poor eyes at least) to me:
+      # http://yaml.org/type/timestamp.html
+      TIME_MATCHER = /\A\d{4}-\d{1,2}-\d{1,2}(?:[Tt]|\s+)\d{1,2}:\d{2}:\d{2}(?:\.\d*)?\s*(?:Z|[-+]\d{1,2}(?::?\d{2})?)?\Z/.freeze
+
+      SECONDS_PER_DAY = 60 * 60 * 24
+      MICROSECONDS_PER_SECOND = 1000000
+
+      # So this is weird. In Ruby 1.8.7, the DateTime#sec_fraction method returned fractional
+      # seconds in units of DAYS for some reason. In 1.9.2, they changed the units -- much more
+      # reasonably -- to seconds.
+      SEC_FRACTION_MULTIPLIER = RUBY_VERSION == "1.8.7" ? (SECONDS_PER_DAY * MICROSECONDS_PER_SECOND) : MICROSECONDS_PER_SECOND
+
+      # The DateTime class has a #to_time method in Ruby 1.9+;
+      # Before that we'll just need to convert DateTime to Time ourselves.
+      TO_TIME_AVAILABLE = DateTime.instance_methods.include?(:to_time)
+
+      def self.value(value)
+        d = DateTime.parse(value)
+
+        return d.to_time if TO_TIME_AVAILABLE
+
+        usec = d.sec_fraction * SEC_FRACTION_MULTIPLIER
+        time = Time.utc(d.year, d.month, d.day, d.hour, d.min, d.sec, usec) - (d.offset * SECONDS_PER_DAY)
+        time.getlocal
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/hexadecimal.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/hexadecimal.rb
new file mode 100644
index 0000000..8da3624
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/hexadecimal.rb
@@ -0,0 +1,12 @@
+module SafeYAML
+  class Parse
+    class Hexadecimal
+      MATCHER = /\A[-+]?0x[0-9a-fA-F_]+\Z/.freeze
+
+      def self.value(value)
+        # This is safe to do since we already validated the value.
+        return Integer(value.gsub(/_/, ""))
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/sexagesimal.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/sexagesimal.rb
new file mode 100644
index 0000000..3fff5bb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/sexagesimal.rb
@@ -0,0 +1,26 @@
+module SafeYAML
+  class Parse
+    class Sexagesimal
+      INTEGER_MATCHER = /\A[-+]?[0-9][0-9_]*(:[0-5]?[0-9])+\Z/.freeze
+      FLOAT_MATCHER = /\A[-+]?[0-9][0-9_]*(:[0-5]?[0-9])+\.[0-9_]*\Z/.freeze
+
+      def self.value(value)
+        before_decimal, after_decimal = value.split(".")
+
+        whole_part = 0
+        multiplier = 1
+
+        before_decimal = before_decimal.split(":")
+        until before_decimal.empty?
+          whole_part += (Float(before_decimal.pop) * multiplier)
+          multiplier *= 60
+        end
+
+        result = whole_part
+        result += Float("." + after_decimal) unless after_decimal.nil?
+        result *= -1 if value[0] == "-"
+        result
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/psych_handler.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/psych_handler.rb
new file mode 100644
index 0000000..cf016a3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/psych_handler.rb
@@ -0,0 +1,99 @@
+require "psych"
+require "base64"
+
+module SafeYAML
+  class PsychHandler < Psych::Handler
+    def initialize(options, &block)
+      @options      = SafeYAML::OPTIONS.merge(options || {})
+      @block        = block
+      @initializers = @options[:custom_initializers] || {}
+      @anchors      = {}
+      @stack        = []
+      @current_key  = nil
+      @result       = nil
+      @begun        = false
+    end
+
+    def result
+      @begun ? @result : false
+    end
+
+    def add_to_current_structure(value, anchor=nil, quoted=nil, tag=nil)
+      value = Transform.to_proper_type(value, quoted, tag, @options)
+
+      @anchors[anchor] = value if anchor
+
+      if !@begun
+        @begun = true
+        @result = value
+        @current_structure = @result
+        return
+      end
+
+      if @current_structure.respond_to?(:<<)
+        @current_structure << value
+
+      elsif @current_structure.respond_to?(:[]=)
+        if @current_key.nil?
+          @current_key = value
+
+        else
+          if @current_key == "<<"
+            @current_structure.merge!(value)
+          else
+            @current_structure[@current_key] = value
+          end
+
+          @current_key = nil
+        end
+
+      else
+        raise "Don't know how to add to a #{@current_structure.class}!"
+      end
+    end
+
+    def end_current_structure
+      @stack.pop
+      @current_structure = @stack.last
+    end
+
+    def streaming?
+      true
+    end
+
+    # event handlers
+    def alias(anchor)
+      add_to_current_structure(@anchors[anchor])
+    end
+
+    def scalar(value, anchor, tag, plain, quoted, style)
+      add_to_current_structure(value, anchor, quoted, tag)
+    end
+
+    def end_document(implicit)
+      @block.call(@result)
+    end
+
+    def start_mapping(anchor, tag, implicit, style)
+      map = @initializers.include?(tag) ? @initializers[tag].call : {}
+      self.add_to_current_structure(map, anchor)
+      @current_structure = map
+      @stack.push(map)
+    end
+
+    def end_mapping
+      self.end_current_structure()
+    end
+
+    def start_sequence(anchor, tag, implicit, style)
+      seq = @initializers.include?(tag) ? @initializers[tag].call : []
+      self.add_to_current_structure(seq, anchor)
+      @current_structure = seq
+      @stack.push(seq)
+    end
+
+    def end_sequence
+      self.end_current_structure()
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/psych_resolver.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/psych_resolver.rb
new file mode 100644
index 0000000..851989b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/psych_resolver.rb
@@ -0,0 +1,52 @@
+module SafeYAML
+  class PsychResolver < Resolver
+    NODE_TYPES = {
+      Psych::Nodes::Document => :root,
+      Psych::Nodes::Mapping  => :map,
+      Psych::Nodes::Sequence => :seq,
+      Psych::Nodes::Scalar   => :scalar,
+      Psych::Nodes::Alias    => :alias
+    }.freeze
+
+    def initialize(options={})
+      super
+      @aliased_nodes = {}
+    end
+
+    def resolve_root(root)
+      resolve_seq(root).first
+    end
+
+    def resolve_alias(node)
+      resolve_node(@aliased_nodes[node.anchor])
+    end
+
+    def native_resolve(node)
+      @visitor ||= SafeYAML::SafeToRubyVisitor.new(self)
+      @visitor.accept(node)
+    end
+
+    def get_node_type(node)
+      NODE_TYPES[node.class]
+    end
+
+    def get_node_tag(node)
+      node.tag
+    end
+
+    def get_node_value(node)
+      @aliased_nodes[node.anchor] = node if node.respond_to?(:anchor) && node.anchor
+
+      case get_node_type(node)
+      when :root, :map, :seq
+        node.children
+      when :scalar
+        node.value
+      end
+    end
+
+    def value_is_quoted?(node)
+      node.quoted
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/resolver.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/resolver.rb
new file mode 100644
index 0000000..e4de157
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/resolver.rb
@@ -0,0 +1,94 @@
+module SafeYAML
+  class Resolver
+    def initialize(options)
+      @options              = SafeYAML::OPTIONS.merge(options || {})
+      @whitelist            = @options[:whitelisted_tags] || []
+      @initializers         = @options[:custom_initializers] || {}
+      @raise_on_unknown_tag = @options[:raise_on_unknown_tag]
+    end
+
+    def resolve_node(node)
+      return node if !node
+      return self.native_resolve(node) if tag_is_whitelisted?(self.get_node_tag(node))
+
+      case self.get_node_type(node)
+      when :root
+        resolve_root(node)
+      when :map
+        resolve_map(node)
+      when :seq
+        resolve_seq(node)
+      when :scalar
+        resolve_scalar(node)
+      when :alias
+        resolve_alias(node)
+      else
+        raise "Don't know how to resolve this node: #{node.inspect}"
+      end
+    end
+
+    def resolve_map(node)
+      tag  = get_and_check_node_tag(node)
+      hash = @initializers.include?(tag) ? @initializers[tag].call : {}
+      map  = normalize_map(self.get_node_value(node))
+
+      # Take the "<<" key nodes first, as these are meant to approximate a form of inheritance.
+      inheritors = map.select { |key_node, value_node| resolve_node(key_node) == "<<" }
+      inheritors.each do |key_node, value_node|
+        merge_into_hash(hash, resolve_node(value_node))
+      end
+
+      # All that's left should be normal (non-"<<") nodes.
+      (map - inheritors).each do |key_node, value_node|
+        hash[resolve_node(key_node)] = resolve_node(value_node)
+      end
+
+      return hash
+    end
+
+    def resolve_seq(node)
+      seq = self.get_node_value(node)
+
+      tag = get_and_check_node_tag(node)
+      arr = @initializers.include?(tag) ? @initializers[tag].call : []
+
+      seq.inject(arr) { |array, n| array << resolve_node(n) }
+    end
+
+    def resolve_scalar(node)
+      Transform.to_proper_type(self.get_node_value(node), self.value_is_quoted?(node), get_and_check_node_tag(node), @options)
+    end
+
+    def get_and_check_node_tag(node)
+      tag = self.get_node_tag(node)
+      SafeYAML.tag_safety_check!(tag, @options)
+      tag
+    end
+
+    def tag_is_whitelisted?(tag)
+      @whitelist.include?(tag)
+    end
+
+    def options
+      @options
+    end
+
+    private
+    def normalize_map(map)
+      # Syck creates Hashes from maps.
+      if map.is_a?(Hash)
+        map.inject([]) { |arr, key_and_value| arr << key_and_value }
+
+      # Psych is really weird; it flattens out a Hash completely into: [key, value, key, value, ...]
+      else
+        map.each_slice(2).to_a
+      end
+    end
+
+    def merge_into_hash(hash, array)
+      array.each do |key, value|
+        hash[key] = value
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/safe_to_ruby_visitor.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/safe_to_ruby_visitor.rb
new file mode 100644
index 0000000..b980445
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/safe_to_ruby_visitor.rb
@@ -0,0 +1,29 @@
+module SafeYAML
+  class SafeToRubyVisitor < Psych::Visitors::ToRuby
+    INITIALIZE_ARITY = superclass.instance_method(:initialize).arity
+
+    def initialize(resolver)
+      case INITIALIZE_ARITY
+      when 2
+        # https://github.com/tenderlove/psych/blob/v2.0.0/lib/psych/visitors/to_ruby.rb#L14-L28
+        loader  = Psych::ClassLoader.new
+        scanner = Psych::ScalarScanner.new(loader)
+        super(scanner, loader)
+
+      else
+        super()
+      end
+
+      @resolver = resolver
+    end
+
+    def accept(node)
+      if node.tag
+        SafeYAML.tag_safety_check!(node.tag, @resolver.options)
+        return super
+      end
+
+      @resolver.resolve_node(node)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_hack.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_hack.rb
new file mode 100644
index 0000000..08a5e47
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_hack.rb
@@ -0,0 +1,36 @@
+# Hack to JRuby 1.8's YAML Parser Yecht
+#
+# This file is always loaded AFTER either syck or psych are already
+# loaded. It then looks at what constants are available and creates
+# a consistent view on all rubys.
+#
+# Taken from rubygems and modified.
+# See https://github.com/rubygems/rubygems/blob/master/lib/rubygems/syck_hack.rb
+
+module YAML
+  # In newer 1.9.2, there is a Syck toplevel constant instead of it
+  # being underneith YAML. If so, reference it back under YAML as
+  # well.
+  if defined? ::Syck
+    # for tests that change YAML::ENGINE
+    # 1.8 does not support the second argument to const_defined?
+    remove_const :Syck rescue nil
+
+    Syck = ::Syck
+
+  # JRuby's "Syck" is called "Yecht"
+  elsif defined? YAML::Yecht
+    Syck = YAML::Yecht
+  end
+end
+
+# Sometime in the 1.9 dev cycle, the Syck constant was moved from under YAML
+# to be a toplevel constant. So gemspecs created under these versions of Syck
+# will have references to Syck::DefaultKey.
+#
+# So we need to be sure that we reference Syck at the toplevel too so that
+# we can always load these kind of gemspecs.
+#
+if !defined?(Syck)
+  Syck = YAML::Syck
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_node_monkeypatch.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_node_monkeypatch.rb
new file mode 100644
index 0000000..c026376
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_node_monkeypatch.rb
@@ -0,0 +1,43 @@
+# This is, admittedly, pretty insane. Fundamentally the challenge here is this: if we want to allow
+# whitelisting of tags (while still leveraging Syck's internal functionality), then we have to
+# change how Syck::Node#transform works. But since we (SafeYAML) do not control instantiation of
+# Syck::Node objects, we cannot, for example, subclass Syck::Node and override #tranform the "easy"
+# way. So the only choice is to monkeypatch, like this. And the only way to make this work
+# recursively with potentially call-specific options (that my feeble brain can think of) is to set
+# pseudo-global options on the first call and unset them once the recursive stack has fully unwound.
+
+monkeypatch = <<-EORUBY
+  class Node
+    @@safe_transform_depth     = 0
+    @@safe_transform_whitelist = nil
+
+    def safe_transform(options={})
+      begin
+        @@safe_transform_depth += 1
+        @@safe_transform_whitelist ||= options[:whitelisted_tags]
+
+        if self.type_id
+          SafeYAML.tag_safety_check!(self.type_id, options)
+          return unsafe_transform if @@safe_transform_whitelist.include?(self.type_id)
+        end
+
+        SafeYAML::SyckResolver.new.resolve_node(self)
+
+      ensure
+        @@safe_transform_depth -= 1
+        if @@safe_transform_depth == 0
+          @@safe_transform_whitelist = nil
+        end
+      end
+    end
+
+    alias_method :unsafe_transform, :transform
+    alias_method :transform, :safe_transform
+  end
+EORUBY
+
+if defined?(YAML::Syck::Node)
+  YAML::Syck.module_eval monkeypatch
+else
+  Syck.module_eval monkeypatch
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_resolver.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_resolver.rb
new file mode 100644
index 0000000..10d55ab
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_resolver.rb
@@ -0,0 +1,38 @@
+module SafeYAML
+  class SyckResolver < Resolver
+    QUOTE_STYLES = [
+      :quote1,
+      :quote2
+    ].freeze
+
+    NODE_TYPES = {
+      Hash   => :map,
+      Array  => :seq,
+      String => :scalar
+    }.freeze
+
+    def initialize(options={})
+      super
+    end
+
+    def native_resolve(node)
+      node.transform(self.options)
+    end
+
+    def get_node_type(node)
+      NODE_TYPES[node.value.class]
+    end
+
+    def get_node_tag(node)
+      node.type_id
+    end
+
+    def get_node_value(node)
+      node.value
+    end
+
+    def value_is_quoted?(node)
+      QUOTE_STYLES.include?(node.instance_variable_get(:@style))
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform.rb
new file mode 100644
index 0000000..d61d1a9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform.rb
@@ -0,0 +1,41 @@
+require 'base64'
+
+module SafeYAML
+  class Transform
+    TRANSFORMERS = [
+      Transform::ToSymbol.new,
+      Transform::ToInteger.new,
+      Transform::ToFloat.new,
+      Transform::ToNil.new,
+      Transform::ToBoolean.new,
+      Transform::ToDate.new
+    ]
+
+    def self.to_guessed_type(value, quoted=false, options=nil)
+      return value if quoted
+
+      if value.is_a?(String)
+        TRANSFORMERS.each do |transformer|
+          success, transformed_value = transformer.method(:transform?).arity == 1 ?
+            transformer.transform?(value) :
+            transformer.transform?(value, options)
+
+          return transformed_value if success
+        end
+      end
+
+      value
+    end
+
+    def self.to_proper_type(value, quoted=false, tag=nil, options=nil)
+      case tag
+      when "tag:yaml.org,2002:binary", "x-private:binary", "!binary"
+        decoded = Base64.decode64(value)
+        decoded = decoded.force_encoding(value.encoding) if decoded.respond_to?(:force_encoding)
+        decoded
+      else
+        self.to_guessed_type(value, quoted, options)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_boolean.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_boolean.rb
new file mode 100644
index 0000000..99dc85e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_boolean.rb
@@ -0,0 +1,21 @@
+module SafeYAML
+  class Transform
+    class ToBoolean
+      include TransformationMap
+
+      set_predefined_values({
+        "yes"   => true,
+        "on"    => true,
+        "true"  => true,
+        "no"    => false,
+        "off"   => false,
+        "false" => false
+      })
+
+      def transform?(value)
+        return false if value.length > 5
+        return PREDEFINED_VALUES.include?(value), PREDEFINED_VALUES[value]
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_date.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_date.rb
new file mode 100644
index 0000000..4bfe552
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_date.rb
@@ -0,0 +1,13 @@
+module SafeYAML
+  class Transform
+    class ToDate
+      def transform?(value)
+        return true, Date.parse(value) if Parse::Date::DATE_MATCHER.match(value)
+        return true, Parse::Date.value(value) if Parse::Date::TIME_MATCHER.match(value)
+        false
+      rescue ArgumentError
+        return true, value
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_float.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_float.rb
new file mode 100644
index 0000000..4ee3f5f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_float.rb
@@ -0,0 +1,33 @@
+module SafeYAML
+  class Transform
+    class ToFloat
+      Infinity = 1.0 / 0.0
+      NaN = 0.0 / 0.0
+
+      PREDEFINED_VALUES = {
+        ".inf"  => Infinity,
+        ".Inf"  => Infinity,
+        ".INF"  => Infinity,
+        "-.inf" => -Infinity,
+        "-.Inf" => -Infinity,
+        "-.INF" => -Infinity,
+        ".nan"  => NaN,
+        ".NaN"  => NaN,
+        ".NAN"  => NaN,
+      }.freeze
+
+      MATCHER = /\A[-+]?(?:\d[\d_]*)?\.[\d_]+(?:[eE][-+][\d]+)?\Z/.freeze
+
+      def transform?(value)
+        return true, Float(value) if MATCHER.match(value)
+        try_edge_cases?(value)
+      end
+
+      def try_edge_cases?(value)
+        return true, PREDEFINED_VALUES[value] if PREDEFINED_VALUES.include?(value)
+        return true, Parse::Sexagesimal.value(value) if Parse::Sexagesimal::FLOAT_MATCHER.match(value)
+        return false
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_integer.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_integer.rb
new file mode 100644
index 0000000..9a5f563
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_integer.rb
@@ -0,0 +1,26 @@
+module SafeYAML
+  class Transform
+    class ToInteger
+      MATCHERS = Deep.freeze([
+        /\A[-+]?(0|([1-9][0-9_,]*))\Z/, # decimal
+        /\A0[0-7]+\Z/,                  # octal
+        /\A0x[0-9a-f]+\Z/i,             # hexadecimal
+        /\A0b[01_]+\Z/                  # binary
+      ])
+
+      def transform?(value)
+        MATCHERS.each_with_index do |matcher, idx|
+          value = value.gsub(/[_,]/, "") if idx == 0
+          return true, Integer(value) if matcher.match(value)
+        end
+        try_edge_cases?(value)
+      end
+
+      def try_edge_cases?(value)
+        return true, Parse::Hexadecimal.value(value) if Parse::Hexadecimal::MATCHER.match(value)
+        return true, Parse::Sexagesimal.value(value) if Parse::Sexagesimal::INTEGER_MATCHER.match(value)
+        return false
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_nil.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_nil.rb
new file mode 100644
index 0000000..1f61756
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_nil.rb
@@ -0,0 +1,18 @@
+module SafeYAML
+  class Transform
+    class ToNil
+      include TransformationMap
+
+      set_predefined_values({
+        ""      => nil,
+        "~"     => nil,
+        "null"  => nil
+      })
+
+      def transform?(value)
+        return false if value.length > 4
+        return PREDEFINED_VALUES.include?(value), PREDEFINED_VALUES[value]
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_symbol.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_symbol.rb
new file mode 100644
index 0000000..36a72bb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_symbol.rb
@@ -0,0 +1,17 @@
+module SafeYAML
+  class Transform
+    class ToSymbol
+      def transform?(value, options=SafeYAML::OPTIONS)
+        if options[:deserialize_symbols] && value =~ /\A:./
+          if value =~ /\A:(["'])(.*)\1\Z/
+            return true, $2.sub(/^:/, "").to_sym
+          else
+            return true, value.sub(/^:/, "").to_sym
+          end
+        end
+
+        return false
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/transformation_map.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/transformation_map.rb
new file mode 100644
index 0000000..d4e45ec
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/transformation_map.rb
@@ -0,0 +1,47 @@
+module SafeYAML
+  class Transform
+    module TransformationMap
+      def self.included(base)
+        base.extend(ClassMethods)
+      end
+
+      class CaseAgnosticMap < Hash
+        def initialize(*args)
+          super
+        end
+
+        def include?(key)
+          super(key.downcase)
+        end
+
+        def [](key)
+          super(key.downcase)
+        end
+
+        # OK, I actually don't think it's all that important that this map be
+        # frozen.
+        def freeze
+          self
+        end
+      end
+
+      module ClassMethods
+        def set_predefined_values(predefined_values)
+          if SafeYAML::YAML_ENGINE == "syck"
+            expanded_map = predefined_values.inject({}) do |hash, (key, value)|
+              hash[key] = value
+              hash[key.capitalize] = value
+              hash[key.upcase] = value
+              hash
+            end
+          else
+            expanded_map = CaseAgnosticMap.new
+            expanded_map.merge!(predefined_values)
+          end
+
+          self.const_set(:PREDEFINED_VALUES, expanded_map.freeze)
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/version.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/version.rb
new file mode 100644
index 0000000..5edb086
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/lib/safe_yaml/version.rb
@@ -0,0 +1,3 @@
+module SafeYAML
+  VERSION = "1.0.4"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/run_specs_all_ruby_versions.sh b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/run_specs_all_ruby_versions.sh
new file mode 100755
index 0000000..54a1f4b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/run_specs_all_ruby_versions.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
+
+rvm use 1.8.7
+bundle exec rake spec
+
+rvm use 1.9.2
+YAMLER=syck bundle exec rake spec
+
+YAMLER=psych bundle exec rake spec
+
+rvm use 1.9.3
+YAMLER=syck bundle exec rake spec
+
+YAMLER=psych bundle exec rake spec
+
+rvm use 2.0.0
+bundle exec rake spec
+
+rvm use 2.1.0
+bundle exec rake spec
+
+rvm use 2.1.1
+bundle exec rake spec
+
+rvm use 2.1.2
+bundle exec rake spec
+
+rvm use ruby-head
+bundle exec rake spec
+
+rvm use jruby
+JRUBY_OPTS=--1.8 bundle exec rake spec
+
+JRUBY_OPTS=--1.9 bundle exec rake spec
+
+JRUBY_OPTS=--2.0 bundle exec rake spec
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/safe_yaml.gemspec b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/safe_yaml.gemspec
new file mode 100644
index 0000000..4f4432a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/safe_yaml.gemspec
@@ -0,0 +1,19 @@
+# -*- encoding: utf-8 -*-
+require File.join(File.dirname(__FILE__), "lib", "safe_yaml", "version")
+
+Gem::Specification.new do |gem|
+  gem.name          = "safe_yaml"
+  gem.version       = SafeYAML::VERSION
+  gem.authors       = "Dan Tao"
+  gem.email         = "daniel.tao@gmail.com"
+  gem.description   = %q{Parse YAML safely}
+  gem.summary       = %q{SameYAML provides an alternative implementation of YAML.load suitable for accepting user input in Ruby applications.}
+  gem.homepage      = "https://github.com/dtao/safe_yaml"
+  gem.license       = "MIT"
+  gem.files         = `git ls-files`.split($\)
+  gem.test_files    = gem.files.grep(%r{^spec/})
+  gem.require_paths = ["lib"]
+  gem.executables   = ["safe_yaml"]
+
+  gem.required_ruby_version = ">= 1.8.7"
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/exploit.1.9.2.yaml b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/exploit.1.9.2.yaml
new file mode 100644
index 0000000..bdd70cc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/exploit.1.9.2.yaml
@@ -0,0 +1,2 @@
+--- !ruby/object:ExploitableBackDoor
+foo: bar
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/exploit.1.9.3.yaml b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/exploit.1.9.3.yaml
new file mode 100644
index 0000000..c24e04b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/exploit.1.9.3.yaml
@@ -0,0 +1,2 @@
+--- !ruby/hash:ExploitableBackDoor
+foo: bar
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/issue48.txt b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/issue48.txt
new file mode 100644
index 0000000..97d1f68
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/issue48.txt
@@ -0,0 +1,20 @@
+---
+title: Blah
+key: value
+---
+
+I'm going to inject a bunch of YAML-looking stuff below and it should all just get ignored.
+
+foo: bar
+
+- foo
+- bar
+
+:foo
+42
+~
+
+---
+text: |
+  Look, I'm another YAML document!
+---
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/issue49.yml b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/issue49.yml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/issue49.yml
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/libyaml_checker_spec.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/libyaml_checker_spec.rb
new file mode 100644
index 0000000..b5b290b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/libyaml_checker_spec.rb
@@ -0,0 +1,69 @@
+require "spec_helper"
+
+describe SafeYAML::LibyamlChecker do
+  describe "check_libyaml_version" do
+    REAL_YAML_ENGINE = SafeYAML::YAML_ENGINE
+    REAL_LIBYAML_VERSION = SafeYAML::LibyamlChecker::LIBYAML_VERSION
+
+    let(:libyaml_patched) { false }
+
+    before :each do
+      allow(SafeYAML::LibyamlChecker).to receive(:libyaml_patched?).and_return(libyaml_patched)
+    end
+
+    after :each do
+      silence_warnings do
+        SafeYAML::YAML_ENGINE = REAL_YAML_ENGINE
+        SafeYAML::LibyamlChecker::LIBYAML_VERSION = REAL_LIBYAML_VERSION
+      end
+    end
+
+    def test_libyaml_version_ok(expected_result, yaml_engine, libyaml_version=nil)
+      silence_warnings do
+        SafeYAML.const_set("YAML_ENGINE", yaml_engine)
+        SafeYAML::LibyamlChecker.const_set("LIBYAML_VERSION", libyaml_version)
+        expect(SafeYAML::LibyamlChecker.libyaml_version_ok?).to eq(expected_result)
+      end
+    end
+
+    unless defined?(JRUBY_VERSION)
+      it "issues no warnings when 'Syck' is the YAML engine" do
+        test_libyaml_version_ok(true, "syck")
+      end
+
+      it "issues a warning if Psych::LIBYAML_VERSION is not defined" do
+        test_libyaml_version_ok(false, "psych")
+      end
+
+      it "issues a warning if Psych::LIBYAML_VERSION is < 0.1.6" do
+        test_libyaml_version_ok(false, "psych", "0.1.5")
+      end
+
+      it "issues no warning if Psych::LIBYAML_VERSION is == 0.1.6" do
+        test_libyaml_version_ok(true, "psych", "0.1.6")
+      end
+
+      it "issues no warning if Psych::LIBYAML_VERSION is > 0.1.6" do
+        test_libyaml_version_ok(true, "psych", "1.0.0")
+      end
+
+      it "does a proper version comparison (not just a string comparison)" do
+        test_libyaml_version_ok(true, "psych", "0.1.10")
+      end
+
+      context "when the system has a known patched libyaml version" do
+        let(:libyaml_patched) { true }
+
+        it "issues no warning, even when Psych::LIBYAML_VERSION < 0.1.6" do
+          test_libyaml_version_ok(true, "psych", "0.1.4")
+        end
+      end
+    end
+
+    if defined?(JRUBY_VERSION)
+      it "issues no warning, as JRuby doesn't use libyaml" do
+        test_libyaml_version_ok(true, "psych", "0.1.4")
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/psych_resolver_spec.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/psych_resolver_spec.rb
new file mode 100644
index 0000000..a9e76b5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/psych_resolver_spec.rb
@@ -0,0 +1,10 @@
+require "spec_helper"
+
+if SafeYAML::YAML_ENGINE == "psych"
+  require "safe_yaml/psych_resolver"
+
+  describe SafeYAML::PsychResolver do
+    include ResolverSpecs
+    let(:resolver) { SafeYAML::PsychResolver.new }
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/resolver_specs.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/resolver_specs.rb
new file mode 100644
index 0000000..1b981e5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/resolver_specs.rb
@@ -0,0 +1,278 @@
+module ResolverSpecs
+  def self.included(base)
+    base.module_eval do
+      let(:resolver) { nil }
+      let(:result) { @result }
+
+      before :each do
+        # See the comment in the first before :each block in safe_yaml_spec.rb.
+        require "safe_yaml"
+      end
+
+      def parse(yaml)
+        tree = YAML.parse(yaml.unindent)
+        @result = resolver.resolve_node(tree)
+      end
+
+      # Isn't this how I should've been doing it all along?
+      def parse_and_test(yaml)
+        safe_result = parse(yaml)
+
+        exception_thrown = nil
+
+        unsafe_result = begin
+          YAML.unsafe_load(yaml)
+        rescue Exception => e
+          exception_thrown = e
+        end
+
+        if exception_thrown
+          # If the underlying YAML parser (e.g. Psych) threw an exception, I'm
+          # honestly not sure what the right thing to do is. For now I'll just
+          # print a warning. Should SafeYAML fail when Psych fails?
+          Kernel.warn "\n"
+          Kernel.warn "Discrepancy between SafeYAML and #{SafeYAML::YAML_ENGINE} on input:\n"
+          Kernel.warn "#{yaml.unindent}\n"
+          Kernel.warn "SafeYAML result:"
+          Kernel.warn "#{safe_result.inspect}\n"
+          Kernel.warn "#{SafeYAML::YAML_ENGINE} result:"
+          Kernel.warn "#{exception_thrown.inspect}\n"
+
+        else
+          expect(safe_result).to eq(unsafe_result)
+        end
+      end
+
+      context "by default" do
+        it "translates maps to hashes" do
+          parse <<-YAML
+            potayto: potahto
+            tomayto: tomahto
+          YAML
+
+          expect(result).to eq({
+            "potayto" => "potahto",
+            "tomayto" => "tomahto"
+          })
+        end
+
+        it "translates sequences to arrays" do
+          parse <<-YAML
+            - foo
+            - bar
+            - baz
+          YAML
+
+          expect(result).to eq(["foo", "bar", "baz"])
+        end
+
+        it "translates most values to strings" do
+          parse "string: value"
+          expect(result).to eq({ "string" => "value" })
+        end
+
+        it "does not deserialize symbols" do
+          parse ":symbol: value"
+          expect(result).to eq({ ":symbol" => "value" })
+        end
+
+        it "translates valid integral numbers to integers" do
+          parse "integer: 1"
+          expect(result).to eq({ "integer" => 1 })
+        end
+
+        it "translates valid decimal numbers to floats" do
+          parse "float: 3.14"
+          expect(result).to eq({ "float" => 3.14 })
+        end
+
+        it "translates valid dates" do
+          parse "date: 2013-01-24"
+          expect(result).to eq({ "date" => Date.parse("2013-01-24") })
+        end
+
+        it "translates valid true/false values to booleans" do
+          parse <<-YAML
+            - yes
+            - true
+            - no
+            - false
+          YAML
+
+          expect(result).to eq([true, true, false, false])
+        end
+
+        it "translates valid nulls to nil" do
+          parse <<-YAML
+            - 
+            - ~
+            - null
+          YAML
+
+          expect(result).to eq([nil] * 3)
+        end
+
+        it "matches the behavior of the underlying YAML engine w/ respect to capitalization of boolean values" do
+          parse_and_test <<-YAML
+            - true
+            - True
+            - TRUE
+            - tRue
+            - TRue
+            - False
+            - FALSE
+            - fAlse
+            - FALse
+          YAML
+
+          # using Syck: [true, true, true, "tRue", "TRue", false, false, "fAlse", "FALse"]
+          # using Psych: all booleans
+        end
+
+        it "matches the behavior of the underlying YAML engine w/ respect to capitalization of nil values" do
+          parse_and_test <<-YAML
+            - Null
+            - NULL
+            - nUll
+            - NUll
+          YAML
+
+          # using Syck: [nil, nil, "nUll", "NUll"]
+          # using Psych: all nils
+        end
+
+        it "translates quoted empty strings to strings (not nil)" do
+          parse "foo: ''"
+          expect(result).to eq({ "foo" => "" })
+        end
+
+        it "correctly reverse-translates strings encoded via #to_yaml" do
+          parse "5.10".to_yaml
+          expect(result).to eq("5.10")
+        end
+
+        it "does not specially parse any double-quoted strings" do
+          parse <<-YAML
+            - "1"
+            - "3.14"
+            - "true"
+            - "false"
+            - "2013-02-03"
+            - "2013-02-03 16:27:00 -0600"
+          YAML
+
+          expect(result).to eq(["1", "3.14", "true", "false", "2013-02-03", "2013-02-03 16:27:00 -0600"])
+        end
+
+        it "does not specially parse any single-quoted strings" do
+          parse <<-YAML
+            - '1'
+            - '3.14'
+            - 'true'
+            - 'false'
+            - '2013-02-03'
+            - '2013-02-03 16:27:00 -0600'
+          YAML
+
+          expect(result).to eq(["1", "3.14", "true", "false", "2013-02-03", "2013-02-03 16:27:00 -0600"])
+        end
+
+        it "deals just fine with nested maps" do
+          parse <<-YAML
+            foo:
+              bar:
+                marco: polo
+          YAML
+
+          expect(result).to eq({ "foo" => { "bar" => { "marco" => "polo" } } })
+        end
+
+        it "deals just fine with nested sequences" do
+          parse <<-YAML
+            - foo
+            -
+              - bar1
+              - bar2
+              -
+                - baz1
+                - baz2
+          YAML
+
+          expect(result).to eq(["foo", ["bar1", "bar2", ["baz1", "baz2"]]])
+        end
+
+        it "applies the same transformations to keys as to values" do
+          parse <<-YAML
+            foo: string
+            :bar: symbol
+            1: integer
+            3.14: float
+            2013-01-24: date
+          YAML
+
+          expect(result).to eq({
+            "foo"  => "string",
+            ":bar" => "symbol",
+            1      => "integer",
+            3.14   => "float",
+            Date.parse("2013-01-24") => "date",
+          })
+        end
+
+        it "applies the same transformations to elements in sequences as to all values" do
+          parse <<-YAML
+            - foo
+            - :bar
+            - 1
+            - 3.14
+            - 2013-01-24
+          YAML
+
+          expect(result).to eq(["foo", ":bar", 1, 3.14, Date.parse("2013-01-24")])
+        end
+      end
+
+      context "for Ruby version #{RUBY_VERSION}" do
+        it "translates valid time values" do
+          parse "time: 2013-01-29 05:58:00 -0800"
+          expect(result).to eq({ "time" => Time.utc(2013, 1, 29, 13, 58, 0) })
+        end
+
+        it "applies the same transformation to elements in sequences" do
+          parse "- 2013-01-29 05:58:00 -0800"
+          expect(result).to eq([Time.utc(2013, 1, 29, 13, 58, 0)])
+        end
+
+        it "applies the same transformation to keys" do
+          parse "2013-01-29 05:58:00 -0800: time"
+          expect(result).to eq({ Time.utc(2013, 1, 29, 13, 58, 0) => "time" })
+        end
+      end
+
+      context "with symbol deserialization enabled" do
+        before :each do
+          SafeYAML::OPTIONS[:deserialize_symbols] = true
+        end
+
+        after :each do
+          SafeYAML.restore_defaults!
+        end
+
+        it "translates values starting with ':' to symbols" do
+          parse "symbol: :value"
+          expect(result).to eq({ "symbol" => :value })
+        end
+
+        it "applies the same transformation to keys" do
+          parse ":bar: symbol"
+          expect(result).to eq({ :bar  => "symbol" })
+        end
+
+        it "applies the same transformation to elements in sequences" do
+          parse "- :bar"
+          expect(result).to eq([:bar])
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/safe_yaml_spec.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/safe_yaml_spec.rb
new file mode 100644
index 0000000..aa701a4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/safe_yaml_spec.rb
@@ -0,0 +1,731 @@
+require "spec_helper"
+
+describe YAML do
+  def safe_load_round_trip(object, options={})
+    yaml = object.to_yaml
+    if SafeYAML::YAML_ENGINE == "psych"
+      YAML.safe_load(yaml, nil, options)
+    else
+      YAML.safe_load(yaml, options)
+    end
+  end
+
+  before :each do
+    # Need to require this here (as opposed to somewhere up higher in the file)
+    # to ensure that safe_yaml isn't loaded and therefore YAML isn't monkey-
+    # patched, for tests that require only safe_yaml/load.
+    require "safe_yaml"
+    require "exploitable_back_door"
+
+    SafeYAML.restore_defaults!
+  end
+
+  after :each do
+    SafeYAML.restore_defaults!
+  end
+
+  describe "unsafe_load" do
+    if SafeYAML::YAML_ENGINE == "psych" && RUBY_VERSION >= "1.9.3"
+      it "allows exploits through objects defined in YAML w/ !ruby/hash via custom :[]= methods" do
+        backdoor = YAML.unsafe_load("--- !ruby/hash:ExploitableBackDoor\nfoo: bar\n")
+        expect(backdoor).to be_exploited_through_setter
+      end
+
+      it "allows exploits through objects defined in YAML w/ !ruby/object via the :init_with method" do
+        backdoor = YAML.unsafe_load("--- !ruby/object:ExploitableBackDoor\nfoo: bar\n")
+        expect(backdoor).to be_exploited_through_init_with
+      end
+    end
+
+    it "allows exploits through objects w/ sensitive instance variables defined in YAML w/ !ruby/object" do
+      backdoor = YAML.unsafe_load("--- !ruby/object:ExploitableBackDoor\nfoo: bar\n")
+      expect(backdoor).to be_exploited_through_ivars
+    end
+
+    context "with special whitelisted tags defined" do
+      before :each do
+        SafeYAML::whitelist!(OpenStruct)
+      end
+
+      it "effectively ignores the whitelist (since everything is whitelisted)" do
+        result = YAML.unsafe_load <<-YAML.unindent
+          --- !ruby/object:OpenStruct 
+          table: 
+            :backdoor: !ruby/object:ExploitableBackDoor 
+              foo: bar
+        YAML
+
+        expect(result).to be_a(OpenStruct)
+        expect(result.backdoor).to be_exploited_through_ivars
+      end
+    end
+  end
+
+  describe "safe_load" do
+    it "does NOT allow exploits through objects defined in YAML w/ !ruby/hash" do
+      object = YAML.safe_load("--- !ruby/hash:ExploitableBackDoor\nfoo: bar\n")
+      expect(object).not_to be_a(ExploitableBackDoor)
+    end
+
+    it "does NOT allow exploits through objects defined in YAML w/ !ruby/object" do
+      object = YAML.safe_load("--- !ruby/object:ExploitableBackDoor\nfoo: bar\n")
+      expect(object).not_to be_a(ExploitableBackDoor)
+    end
+
+    context "for YAML engine #{SafeYAML::YAML_ENGINE}" do
+      if SafeYAML::YAML_ENGINE == "psych"
+        let(:options) { nil }
+        let(:arguments) { ["foo: bar", nil, options] }
+
+        context "when no tags are whitelisted" do
+          it "constructs a SafeYAML::PsychHandler to resolve nodes as they're parsed, for optimal performance" do
+            expect(Psych::Parser).to receive(:new).with an_instance_of(SafeYAML::PsychHandler)
+            # This won't work now; we just want to ensure Psych::Parser#parse was in fact called.
+            YAML.safe_load(*arguments) rescue nil
+          end
+        end
+
+        context "when whitelisted tags are specified" do
+          let(:options) {
+            { :whitelisted_tags => ["foo"] }
+          }
+
+          it "instead uses Psych to construct a full tree before examining the nodes" do
+            expect(Psych).to receive(:parse)
+            # This won't work now; we just want to ensure Psych::Parser#parse was in fact called.
+            YAML.safe_load(*arguments) rescue nil
+          end
+        end
+      end
+
+      if SafeYAML::YAML_ENGINE == "syck"
+        it "uses Syck internally to parse YAML" do
+          expect(YAML).to receive(:parse).with("foo: bar")
+          # This won't work now; we just want to ensure YAML::parse was in fact called.
+          YAML.safe_load("foo: bar") rescue nil
+        end
+      end
+    end
+
+    it "loads a plain ol' YAML document just fine" do
+      result = YAML.safe_load <<-YAML.unindent
+        foo:
+          number: 1
+          boolean: true
+          nil: ~
+          string: Hello, there!
+          symbol: :blah
+          sequence:
+            - hi
+            - bye
+      YAML
+
+      expect(result).to eq({
+        "foo" => {
+          "number"   => 1,
+          "boolean"  => true,
+          "nil"      => nil,
+          "string"   => "Hello, there!",
+          "symbol"   => ":blah",
+          "sequence" => ["hi", "bye"]
+        }
+      })
+    end
+
+    it "works for YAML documents with anchors and aliases" do
+      result = YAML.safe_load <<-YAML
+        - &id001 {}
+        - *id001
+        - *id001
+      YAML
+
+      expect(result).to eq([{}, {}, {}])
+    end
+
+    it "works for YAML documents with binary tagged keys" do
+      result = YAML.safe_load <<-YAML
+        ? !!binary >
+          Zm9v
+        : "bar"
+        ? !!binary >
+          YmFy
+        : "baz"
+      YAML
+
+      expect(result).to eq({"foo" => "bar", "bar" => "baz"})
+    end
+
+    it "works for YAML documents with binary tagged values" do
+      result = YAML.safe_load <<-YAML
+        "foo": !!binary >
+          YmFy
+        "bar": !!binary >
+          YmF6
+      YAML
+
+      expect(result).to eq({"foo" => "bar", "bar" => "baz"})
+    end
+
+    it "works for YAML documents with binary tagged array values" do
+      result = YAML.safe_load <<-YAML
+        - !binary |-
+          Zm9v
+        - !binary |-
+          YmFy
+      YAML
+
+      expect(result).to eq(["foo", "bar"])
+    end
+
+    it "works for YAML documents with sections" do
+      result = YAML.safe_load <<-YAML
+        mysql: &mysql
+          adapter: mysql
+          pool: 30
+        login: &login
+          username: user
+          password: password123
+        development: &development
+          <<: *mysql
+          <<: *login
+          host: localhost
+      YAML
+
+      expect(result).to eq({
+        "mysql" => {
+          "adapter" => "mysql",
+          "pool"    => 30
+        },
+        "login" => {
+          "username" => "user",
+          "password" => "password123"
+        },
+        "development" => {
+          "adapter"  => "mysql",
+          "pool"     => 30,
+          "username" => "user",
+          "password" => "password123",
+          "host"     => "localhost"
+        }
+      })
+    end
+
+    it "correctly prefers explicitly defined values over default values from included sections" do
+      # Repeating this test 100 times to increase the likelihood of running into an issue caused by
+      # non-deterministic hash key enumeration.
+      100.times do
+        result = YAML.safe_load <<-YAML
+          defaults: &defaults
+            foo: foo
+            bar: bar
+            baz: baz
+          custom:
+            <<: *defaults
+            bar: custom_bar
+            baz: custom_baz
+        YAML
+
+        expect(result["custom"]).to eq({
+          "foo" => "foo",
+          "bar" => "custom_bar",
+          "baz" => "custom_baz"
+        })
+      end
+    end
+
+    it "works with multi-level inheritance" do
+      result = YAML.safe_load <<-YAML
+        defaults: &defaults
+          foo: foo
+          bar: bar
+          baz: baz
+        custom: &custom
+          <<: *defaults
+          bar: custom_bar
+          baz: custom_baz
+        grandcustom: &grandcustom
+          <<: *custom
+      YAML
+
+      expect(result).to eq({
+        "defaults"    => { "foo" => "foo", "bar" => "bar", "baz" => "baz" },
+        "custom"      => { "foo" => "foo", "bar" => "custom_bar", "baz" => "custom_baz" },
+        "grandcustom" => { "foo" => "foo", "bar" => "custom_bar", "baz" => "custom_baz" }
+      })
+    end
+
+    it "returns false when parsing an empty document" do
+      expect([
+        YAML.safe_load(""),
+        YAML.safe_load("     "),
+        YAML.safe_load("\n")
+      ]).to eq([false, false, false])
+    end
+
+    it "returns nil when parsing a single value representing nil" do
+      expect([
+        YAML.safe_load("~"),
+        YAML.safe_load("null")
+      ]).to eq([nil, nil])
+    end
+
+    context "with custom initializers defined" do
+      before :each do
+        if SafeYAML::YAML_ENGINE == "psych"
+          SafeYAML::OPTIONS[:custom_initializers] = {
+            "!set" => lambda { Set.new },
+            "!hashiemash" => lambda { Hashie::Mash.new }
+          }
+        else
+          SafeYAML::OPTIONS[:custom_initializers] = {
+            "tag:yaml.org,2002:set" => lambda { Set.new },
+            "tag:yaml.org,2002:hashiemash" => lambda { Hashie::Mash.new }
+          }
+        end
+      end
+
+      it "will use a custom initializer to instantiate an array-like class upon deserialization" do
+        result = YAML.safe_load <<-YAML.unindent
+          --- !set
+          - 1
+          - 2
+          - 3
+        YAML
+
+        expect(result).to be_a(Set)
+        expect(result.to_a).to match_array([1, 2, 3])
+      end
+
+      it "will use a custom initializer to instantiate a hash-like class upon deserialization" do
+        result = YAML.safe_load <<-YAML.unindent
+          --- !hashiemash
+          foo: bar
+        YAML
+
+        expect(result).to be_a(Hashie::Mash)
+        expect(result.to_hash).to eq({ "foo" => "bar" })
+      end
+    end
+
+    context "with special whitelisted tags defined" do
+      before :each do
+        SafeYAML::whitelist!(OpenStruct)
+
+        # Necessary for deserializing OpenStructs properly.
+        SafeYAML::OPTIONS[:deserialize_symbols] = true
+      end
+
+      it "will allow objects to be deserialized for whitelisted tags" do
+        result = YAML.safe_load("--- !ruby/object:OpenStruct\ntable:\n  foo: bar\n")
+        expect(result).to be_a(OpenStruct)
+        expect(result.instance_variable_get(:@table)).to eq({ "foo" => "bar" })
+      end
+
+      it "will not deserialize objects without whitelisted tags" do
+        result = YAML.safe_load("--- !ruby/hash:ExploitableBackDoor\nfoo: bar\n")
+        expect(result).not_to be_a(ExploitableBackDoor)
+        expect(result).to eq({ "foo" => "bar" })
+      end
+
+      it "will not allow non-whitelisted objects to be embedded within objects with whitelisted tags" do
+        result = YAML.safe_load <<-YAML.unindent
+          --- !ruby/object:OpenStruct 
+          table: 
+            :backdoor: !ruby/object:ExploitableBackDoor 
+              foo: bar
+        YAML
+
+        expect(result).to be_a(OpenStruct)
+        expect(result.backdoor).not_to be_a(ExploitableBackDoor)
+        expect(result.backdoor).to eq({ "foo" => "bar" })
+      end
+
+      context "with the :raise_on_unknown_tag option enabled" do
+        before :each do
+          SafeYAML::OPTIONS[:raise_on_unknown_tag] = true
+        end
+
+        after :each do
+          SafeYAML.restore_defaults!
+        end
+
+        it "raises an exception if a non-nil, non-whitelisted tag is encountered" do
+          expect {
+            YAML.safe_load <<-YAML.unindent
+              --- !ruby/object:Unknown
+              foo: bar
+            YAML
+          }.to raise_error
+        end
+
+        it "checks all tags, even those within objects with trusted tags" do
+          expect {
+            YAML.safe_load <<-YAML.unindent
+              --- !ruby/object:OpenStruct
+              table:
+                :backdoor: !ruby/object:Unknown
+                  foo: bar
+            YAML
+          }.to raise_error
+        end
+
+        it "does not raise an exception as long as all tags are whitelisted" do
+          result = YAML.safe_load <<-YAML.unindent
+            --- !ruby/object:OpenStruct
+            table:
+              :backdoor:
+                string: foo
+                integer: 1
+                float: 3.14
+                symbol: :bar
+                date: 2013-02-20
+                array: []
+                hash: {}
+          YAML
+
+          expect(result).to be_a(OpenStruct)
+          expect(result.backdoor).to eq({
+            "string"  => "foo",
+            "integer" => 1,
+            "float"   => 3.14,
+            "symbol"  => :bar,
+            "date"    => Date.parse("2013-02-20"),
+            "array"   => [],
+            "hash"    => {}
+          })
+        end
+
+        it "does not raise an exception on the non-specific '!' tag" do
+          result = nil
+          expect { result = YAML.safe_load "--- ! 'foo'" }.to_not raise_error
+          expect(result).to eq("foo")
+        end
+
+        context "with whitelisted custom class" do
+          class SomeClass
+            attr_accessor :foo
+          end
+          let(:instance) { SomeClass.new }
+
+          before do
+            SafeYAML::whitelist!(SomeClass)
+            instance.foo = 'with trailing whitespace: '
+          end
+
+          it "does not raise an exception on the non-specific '!' tag" do
+            result = nil
+            expect { result = YAML.safe_load(instance.to_yaml) }.to_not raise_error
+            expect(result.foo).to eq('with trailing whitespace: ')
+          end
+        end
+      end
+    end
+
+    context "when options are passed direclty to #load which differ from the defaults" do
+      let(:default_options) { {} }
+
+      before :each do
+        SafeYAML::OPTIONS.merge!(default_options)
+      end
+
+      context "(for example, when symbol deserialization is enabled by default)" do
+        let(:default_options) { { :deserialize_symbols => true } }
+
+        it "goes with the default option when it is not overridden" do
+          silence_warnings do
+            expect(YAML.load(":foo: bar")).to eq({ :foo => "bar" })
+          end
+        end
+
+        it "allows the default option to be overridden on a per-call basis" do
+          silence_warnings do
+            expect(YAML.load(":foo: bar", :deserialize_symbols => false)).to eq({ ":foo" => "bar" })
+            expect(YAML.load(":foo: bar", :deserialize_symbols => true)).to eq({ :foo => "bar" })
+          end
+        end
+      end
+
+      context "(or, for example, when certain tags are whitelisted)" do
+        let(:default_options) {
+          {
+            :deserialize_symbols => true,
+            :whitelisted_tags => SafeYAML::YAML_ENGINE == "psych" ?
+              ["!ruby/object:OpenStruct"] :
+              ["tag:ruby.yaml.org,2002:object:OpenStruct"]
+          }
+        }
+
+        it "goes with the default option when it is not overridden" do
+          result = safe_load_round_trip(OpenStruct.new(:foo => "bar"))
+          expect(result).to be_a(OpenStruct)
+          expect(result.foo).to eq("bar")
+        end
+
+        it "allows the default option to be overridden on a per-call basis" do
+          result = safe_load_round_trip(OpenStruct.new(:foo => "bar"), :whitelisted_tags => [])
+          expect(result).to eq({ "table" => { :foo => "bar" } })
+
+          result = safe_load_round_trip(OpenStruct.new(:foo => "bar"), :deserialize_symbols => false, :whitelisted_tags => [])
+          expect(result).to eq({ "table" => { ":foo" => "bar" } })
+        end
+      end
+    end
+  end
+
+  describe "unsafe_load_file" do
+    if SafeYAML::YAML_ENGINE == "psych" && RUBY_VERSION >= "1.9.3"
+      it "allows exploits through objects defined in YAML w/ !ruby/hash via custom :[]= methods" do
+        backdoor = YAML.unsafe_load_file "spec/exploit.1.9.3.yaml"
+        expect(backdoor).to be_exploited_through_setter
+      end
+    end
+
+    if SafeYAML::YAML_ENGINE == "psych" && RUBY_VERSION >= "1.9.2"
+      it "allows exploits through objects defined in YAML w/ !ruby/object via the :init_with method" do
+        backdoor = YAML.unsafe_load_file "spec/exploit.1.9.2.yaml"
+        expect(backdoor).to be_exploited_through_init_with
+      end
+    end
+
+    it "allows exploits through objects w/ sensitive instance variables defined in YAML w/ !ruby/object" do
+      backdoor = YAML.unsafe_load_file "spec/exploit.1.9.2.yaml"
+      expect(backdoor).to be_exploited_through_ivars
+    end
+  end
+
+  describe "safe_load_file" do
+    it "does NOT allow exploits through objects defined in YAML w/ !ruby/hash" do
+      object = YAML.safe_load_file "spec/exploit.1.9.3.yaml"
+      expect(object).not_to be_a(ExploitableBackDoor)
+    end
+
+    it "does NOT allow exploits through objects defined in YAML w/ !ruby/object" do
+      object = YAML.safe_load_file "spec/exploit.1.9.2.yaml"
+      expect(object).not_to be_a(ExploitableBackDoor)
+    end
+    
+    it "returns false when parsing an empty file" do
+      expect(YAML.safe_load_file("spec/issue49.yml")).to eq(false)
+    end
+  end
+
+  describe "load" do
+    let(:options) { {} }
+
+    let (:arguments) {
+      if SafeYAML::MULTI_ARGUMENT_YAML_LOAD
+        ["foo: bar", nil, options]
+      else
+        ["foo: bar", options]
+      end
+    }
+
+    context "as long as a :default_mode has been specified" do
+      it "doesn't issue a warning for safe mode, since an explicit mode has been set" do
+        SafeYAML::OPTIONS[:default_mode] = :safe
+        expect(Kernel).not_to receive(:warn)
+        YAML.load(*arguments)
+      end
+
+      it "doesn't issue a warning for unsafe mode, since an explicit mode has been set" do
+        SafeYAML::OPTIONS[:default_mode] = :unsafe
+        expect(Kernel).not_to receive(:warn)
+        YAML.load(*arguments)
+      end
+    end
+
+    context "when the :safe options is specified" do
+      let(:safe_mode) { true }
+      let(:options) { { :safe => safe_mode } }
+
+      it "doesn't issue a warning" do
+        expect(Kernel).not_to receive(:warn)
+        YAML.load(*arguments)
+      end
+
+      it "calls #safe_load if the :safe option is set to true" do
+        expect(YAML).to receive(:safe_load)
+        YAML.load(*arguments)
+      end
+
+      context "when the :safe option is set to false" do
+        let(:safe_mode) { false }
+
+        it "calls #unsafe_load if the :safe option is set to false" do
+          expect(YAML).to receive(:unsafe_load)
+          YAML.load(*arguments)
+        end
+      end
+    end
+
+    it "issues a warning when the :safe option is omitted" do
+      silence_warnings do
+        expect(Kernel).to receive(:warn)
+        YAML.load(*arguments)
+      end
+    end
+
+    it "only issues a warning once (to avoid spamming an app's output)" do
+      silence_warnings do
+        expect(Kernel).to receive(:warn).once
+        2.times { YAML.load(*arguments) }
+      end
+    end
+
+    it "defaults to safe mode if the :safe option is omitted" do
+      silence_warnings do
+        expect(YAML).to receive(:safe_load)
+        YAML.load(*arguments)
+      end
+    end
+
+    context "with the default mode set to :unsafe" do
+      before :each do
+        SafeYAML::OPTIONS[:default_mode] = :unsafe
+      end
+
+      it "defaults to unsafe mode if the :safe option is omitted" do
+        silence_warnings do
+          expect(YAML).to receive(:unsafe_load)
+          YAML.load(*arguments)
+        end
+      end
+
+      it "calls #safe_load if the :safe option is set to true" do
+        expect(YAML).to receive(:safe_load)
+        YAML.load(*(arguments + [{ :safe => true }]))
+      end
+    end
+  end
+
+  describe "load_file" do
+    let(:filename) { "spec/exploit.1.9.2.yaml" } # doesn't really matter
+
+    it "issues a warning if the :safe option is omitted" do
+      silence_warnings do
+        expect(Kernel).to receive(:warn)
+        YAML.load_file(filename)
+      end
+    end
+
+    it "doesn't issue a warning as long as the :safe option is specified" do
+      expect(Kernel).not_to receive(:warn)
+      YAML.load_file(filename, :safe => true)
+    end
+
+    it "defaults to safe mode if the :safe option is omitted" do
+      silence_warnings do
+        expect(YAML).to receive(:safe_load_file)
+        YAML.load_file(filename)
+      end
+    end
+
+    it "calls #safe_load_file if the :safe option is set to true" do
+      expect(YAML).to receive(:safe_load_file)
+      YAML.load_file(filename, :safe => true)
+    end
+
+    it "calls #unsafe_load_file if the :safe option is set to false" do
+      expect(YAML).to receive(:unsafe_load_file)
+      YAML.load_file(filename, :safe => false)
+    end
+
+    context "with arbitrary object deserialization enabled by default" do
+      before :each do
+        SafeYAML::OPTIONS[:default_mode] = :unsafe
+      end
+
+      it "defaults to unsafe mode if the :safe option is omitted" do
+        silence_warnings do
+          expect(YAML).to receive(:unsafe_load_file)
+          YAML.load_file(filename)
+        end
+      end
+
+      it "calls #safe_load if the :safe option is set to true" do
+        expect(YAML).to receive(:safe_load_file)
+        YAML.load_file(filename, :safe => true)
+      end
+    end
+
+    it "handles files starting with --- (see issue #48)" do
+      expect(YAML.load_file("spec/issue48.txt", :safe => true)).to eq({
+        "title" => "Blah",
+        "key"   => "value"
+      })
+    end
+
+    it "handles content starting with --- (see issue #48)" do
+      yaml = File.read("spec/issue48.txt")
+      expect(YAML.load(yaml, :safe => true)).to eq({
+        "title" => "Blah",
+        "key"   => "value"
+      })
+    end
+  end
+
+  describe "whitelist!" do
+    context "not a class" do
+      it "should raise" do
+        expect { SafeYAML::whitelist! :foo }.to raise_error(/not a Class/)
+        expect(SafeYAML::OPTIONS[:whitelisted_tags]).to be_empty
+      end
+    end
+
+    context "anonymous class" do
+      it "should raise" do
+        expect { SafeYAML::whitelist! Class.new }.to raise_error(/cannot be anonymous/)
+        expect(SafeYAML::OPTIONS[:whitelisted_tags]).to be_empty
+      end
+    end
+
+    context "with a Class as its argument" do
+      it "should configure correctly" do
+        expect { SafeYAML::whitelist! OpenStruct }.to_not raise_error
+        expect(SafeYAML::OPTIONS[:whitelisted_tags].grep(/OpenStruct\Z/)).not_to be_empty
+      end
+
+      it "successfully deserializes the specified class" do
+        SafeYAML.whitelist!(OpenStruct)
+
+        # necessary for properly assigning OpenStruct attributes
+        SafeYAML::OPTIONS[:deserialize_symbols] = true
+
+        result = safe_load_round_trip(OpenStruct.new(:foo => "bar"))
+        expect(result).to be_a(OpenStruct)
+        expect(result.foo).to eq("bar")
+      end
+
+      it "works for ranges" do
+        SafeYAML.whitelist!(Range)
+        expect(safe_load_round_trip(1..10)).to eq(1..10)
+      end
+
+      it "works for regular expressions" do
+        SafeYAML.whitelist!(Regexp)
+        expect(safe_load_round_trip(/foo/)).to eq(/foo/)
+      end
+
+      it "works for multiple classes" do
+        SafeYAML.whitelist!(Range, Regexp)
+        expect(safe_load_round_trip([(1..10), /bar/])).to eq([(1..10), /bar/])
+      end
+
+      it "works for arbitrary Exception subclasses" do
+        class CustomException < Exception
+          attr_reader :custom_message
+
+          def initialize(custom_message)
+            @custom_message = custom_message
+          end
+        end
+
+        SafeYAML.whitelist!(CustomException)
+
+        ex = safe_load_round_trip(CustomException.new("blah"))
+        expect(ex).to be_a(CustomException)
+        expect(ex.custom_message).to eq("blah")
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/spec_helper.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/spec_helper.rb
new file mode 100644
index 0000000..967b2d3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/spec_helper.rb
@@ -0,0 +1,42 @@
+HERE = File.dirname(__FILE__) unless defined?(HERE)
+ROOT = File.join(HERE, "..") unless defined?(ROOT)
+
+$LOAD_PATH << File.join(ROOT, "lib")
+$LOAD_PATH << File.join(HERE, "support")
+
+require "yaml"
+if ENV["YAMLER"] && defined?(YAML::ENGINE)
+  YAML::ENGINE.yamler = ENV["YAMLER"]
+end
+
+ruby_version = defined?(JRUBY_VERSION) ? "JRuby #{JRUBY_VERSION} in #{RUBY_VERSION} mode" : "Ruby #{RUBY_VERSION}"
+yaml_engine = defined?(YAML::ENGINE) ? YAML::ENGINE.yamler : "syck"
+libyaml_version = yaml_engine == "psych" && Psych.const_defined?("LIBYAML_VERSION", false) ? Psych::LIBYAML_VERSION : "N/A"
+
+env_info = [
+  ruby_version,
+  "YAML: #{yaml_engine} (#{YAML::VERSION}) (libyaml: #{libyaml_version})",
+  "Monkeypatch: #{ENV['MONKEYPATCH_YAML']}"
+]
+
+puts env_info.join(", ")
+
+# Caching references to these methods before loading safe_yaml in order to test
+# that they aren't touched unless you actually require safe_yaml (see yaml_spec.rb).
+ORIGINAL_YAML_LOAD      = YAML.method(:load)
+ORIGINAL_YAML_LOAD_FILE = YAML.method(:load_file)
+
+require "safe_yaml/load"
+require "ostruct"
+require "hashie"
+require "heredoc_unindent"
+
+# Stolen from Rails:
+# https://github.com/rails/rails/blob/3-2-stable/activesupport/lib/active_support/core_ext/kernel/reporting.rb#L10-25
+def silence_warnings
+  $VERBOSE = nil; yield
+ensure
+  $VERBOSE = true
+end
+
+require File.join(HERE, "resolver_specs")
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/support/exploitable_back_door.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/support/exploitable_back_door.rb
new file mode 100644
index 0000000..48754b4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/support/exploitable_back_door.rb
@@ -0,0 +1,29 @@
+class ExploitableBackDoor
+  def exploited?
+    @exploited_through_setter || @exploited_through_init_with || @exploited_through_ivars
+  end
+
+  def exploited_through_setter?
+    @exploited_through_setter
+  end
+
+  def exploited_through_init_with?
+    @exploited_through_init_with
+  end
+
+  def exploited_through_ivars?
+    self.instance_variables.any?
+  end
+
+  def init_with(command)
+    # Note: this is how bad this COULD be.
+    # system("#{command}")
+    @exploited_through_init_with = true
+  end
+
+  def []=(command, arguments)
+    # Note: this is how bad this COULD be.
+    # system("#{command} #{arguments}")
+    @exploited_through_setter = true
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/syck_resolver_spec.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/syck_resolver_spec.rb
new file mode 100644
index 0000000..bec729b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/syck_resolver_spec.rb
@@ -0,0 +1,10 @@
+require "spec_helper"
+
+if SafeYAML::YAML_ENGINE == "syck"
+  require "safe_yaml/syck_resolver"
+
+  describe SafeYAML::SyckResolver do
+    include ResolverSpecs
+    let(:resolver) { SafeYAML::SyckResolver.new }
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/base64_spec.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/base64_spec.rb
new file mode 100644
index 0000000..f4d83d0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/base64_spec.rb
@@ -0,0 +1,11 @@
+require "spec_helper"
+
+describe SafeYAML::Transform do
+  it "should return the same encoding when decoding Base64" do
+    value = "c3VyZS4="
+    decoded = SafeYAML::Transform.to_proper_type(value, false, "!binary")
+
+    expect(decoded).to eq("sure.")
+    expect(decoded.encoding).to eq(value.encoding) if decoded.respond_to?(:encoding)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_date_spec.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_date_spec.rb
new file mode 100644
index 0000000..31bdb41
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_date_spec.rb
@@ -0,0 +1,60 @@
+require "spec_helper"
+
+describe SafeYAML::Transform::ToDate do
+  it "returns true when the value matches a valid Date" do
+    expect(subject.transform?("2013-01-01")).to eq([true, Date.parse("2013-01-01")])
+  end
+
+  it "returns false when the value does not match a valid Date" do
+    expect(subject.transform?("foobar")).to be_falsey
+  end
+
+  it "returns false when the value does not end with a Date" do
+    expect(subject.transform?("2013-01-01\nNOT A DATE")).to be_falsey
+  end
+
+  it "returns false when the value does not begin with a Date" do
+    expect(subject.transform?("NOT A DATE\n2013-01-01")).to be_falsey
+  end
+
+  it "correctly parses the remaining formats of the YAML spec" do
+    equivalent_values = [
+      "2001-12-15T02:59:43.1Z", # canonical
+      "2001-12-14t21:59:43.10-05:00", # iso8601
+      "2001-12-14 21:59:43.10 -5", # space separated
+      "2001-12-15 2:59:43.10" # no time zone (Z)
+    ]
+
+    equivalent_values.each do |value|
+      success, result = subject.transform?(value)
+      expect(success).to be_truthy
+      expect(result).to eq(Time.utc(2001, 12, 15, 2, 59, 43, 100000))
+    end
+  end
+
+  it "converts times to the local timezone" do
+    success, result = subject.transform?("2012-12-01 10:33:45 +11:00")
+    expect(success).to be_truthy
+    expect(result).to eq(Time.utc(2012, 11, 30, 23, 33, 45))
+    expect(result.gmt_offset).to eq(Time.local(2012, 11, 30).gmt_offset)
+  end
+
+  it "returns strings for invalid dates" do
+    expect(subject.transform?("0000-00-00")).to eq([true, "0000-00-00"])
+    expect(subject.transform?("2013-13-01")).to eq([true, "2013-13-01"])
+    expect(subject.transform?("2014-01-32")).to eq([true, "2014-01-32"])
+  end
+
+  it "returns strings for invalid date/times" do
+    expect(subject.transform?("0000-00-00 00:00:00 -0000")).to eq([true, "0000-00-00 00:00:00 -0000"])
+    expect(subject.transform?("2013-13-01 21:59:43 -05:00")).to eq([true, "2013-13-01 21:59:43 -05:00"])
+    expect(subject.transform?("2013-01-32 21:59:43 -05:00")).to eq([true, "2013-01-32 21:59:43 -05:00"])
+    expect(subject.transform?("2013-01-30 25:59:43 -05:00")).to eq([true, "2013-01-30 25:59:43 -05:00"])
+    expect(subject.transform?("2013-01-30 21:69:43 -05:00")).to eq([true, "2013-01-30 21:69:43 -05:00"])
+
+    # Interesting. It seems that in some older Ruby versions, the below actually parses successfully
+    # w/ DateTime.parse; but it fails w/ YAML.load. Whom to follow???
+
+    # subject.transform?("2013-01-30 21:59:63 -05:00").should == [true, "2013-01-30 21:59:63 -05:00"]
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_float_spec.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_float_spec.rb
new file mode 100644
index 0000000..d4d813f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_float_spec.rb
@@ -0,0 +1,42 @@
+require "spec_helper"
+
+describe SafeYAML::Transform::ToFloat do
+  it "returns true when the value matches a valid Float" do
+    expect(subject.transform?("20.00")).to eq([true, 20.0])
+  end
+
+  it "returns false when the value does not match a valid Float" do
+    expect(subject.transform?("foobar")).to be_falsey
+  end
+
+  it "returns false when the value spans multiple lines" do
+    expect(subject.transform?("20.00\nNOT A FLOAT")).to be_falsey
+  end
+
+  it "correctly parses all formats in the YAML spec" do
+    # canonical
+    expect(subject.transform?("6.8523015e+5")).to eq([true, 685230.15])
+
+    # exponentioal
+    expect(subject.transform?("685.230_15e+03")).to eq([true, 685230.15])
+
+    # fixed
+    expect(subject.transform?("685_230.15")).to eq([true, 685230.15])
+
+    # sexagesimal
+    expect(subject.transform?("190:20:30.15")).to eq([true, 685230.15])
+
+    # infinity
+    expect(subject.transform?("-.inf")).to eq([true, (-1.0 / 0.0)])
+
+    # not a number
+    # NOTE: can't use == here since NaN != NaN
+    success, result = subject.transform?(".NaN")
+    expect(success).to be_truthy; expect(result).to be_nan
+  end
+
+  # issue 29
+  it "returns false for the string '.'" do
+    expect(subject.transform?(".")).to be_falsey
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_integer_spec.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_integer_spec.rb
new file mode 100644
index 0000000..6c6723b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_integer_spec.rb
@@ -0,0 +1,64 @@
+require "spec_helper"
+
+describe SafeYAML::Transform::ToInteger do
+  it "returns true when the value matches a valid Integer" do
+    expect(subject.transform?("10")).to eq([true, 10])
+  end
+
+  it "returns false when the value does not match a valid Integer" do
+    expect(subject.transform?("foobar")).to be_falsey
+  end
+
+  it "returns false when the value spans multiple lines" do
+    expect(subject.transform?("10\nNOT AN INTEGER")).to be_falsey
+  end
+
+  it "allows commas in the number" do
+    expect(subject.transform?("1,000")).to eq([true, 1000])
+  end
+
+  it "correctly parses numbers in octal format" do
+    expect(subject.transform?("010")).to eq([true, 8])
+  end
+
+  it "correctly parses numbers in hexadecimal format" do
+    expect(subject.transform?("0x1FF")).to eq([true, 511])
+  end
+
+  it "defaults to a string for a number that resembles octal format but is not" do
+    expect(subject.transform?("09")).to be_falsey
+  end
+
+  it "correctly parses 0 in decimal" do
+    expect(subject.transform?("0")).to eq([true, 0])
+  end
+
+  it "defaults to a string for a number that resembles hexadecimal format but is not" do
+    expect(subject.transform?("0x1G")).to be_falsey
+  end
+
+  it "correctly parses all formats in the YAML spec" do
+    # canonical
+    expect(subject.transform?("685230")).to eq([true, 685230])
+
+    # decimal
+    expect(subject.transform?("+685_230")).to eq([true, 685230])
+
+    # octal
+    expect(subject.transform?("02472256")).to eq([true, 685230])
+
+    # hexadecimal:
+    expect(subject.transform?("0x_0A_74_AE")).to eq([true, 685230])
+
+    # binary
+    expect(subject.transform?("0b1010_0111_0100_1010_1110")).to eq([true, 685230])
+
+    # sexagesimal
+    expect(subject.transform?("190:20:30")).to eq([true, 685230])
+  end
+
+  # see https://github.com/dtao/safe_yaml/pull/51
+  it "strips out underscores before parsing decimal values" do
+    expect(subject.transform?("_850_")).to eq([true, 850])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_symbol_spec.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_symbol_spec.rb
new file mode 100644
index 0000000..59cd242
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/transform/to_symbol_spec.rb
@@ -0,0 +1,51 @@
+require "spec_helper"
+
+describe SafeYAML::Transform::ToSymbol do
+  def with_symbol_deserialization_value(value)
+    symbol_deserialization_flag = SafeYAML::OPTIONS[:deserialize_symbols]
+    SafeYAML::OPTIONS[:deserialize_symbols] = value
+
+    yield
+
+  ensure
+    SafeYAML::OPTIONS[:deserialize_symbols] = symbol_deserialization_flag
+  end
+
+  def with_symbol_deserialization(&block)
+    with_symbol_deserialization_value(true, &block)
+  end
+
+  def without_symbol_deserialization(&block)
+    with_symbol_deserialization_value(false, &block)
+  end
+
+  it "returns true when the value matches a valid Symbol" do
+    with_symbol_deserialization { expect(subject.transform?(":foo")[0]).to be_truthy }
+  end
+
+  it "returns true when the value matches a valid String+Symbol" do
+    with_symbol_deserialization { expect(subject.transform?(':"foo"')[0]).to be_truthy }
+  end
+
+  it "returns true when the value matches a valid String+Symbol with 's" do
+    with_symbol_deserialization { expect(subject.transform?(":'foo'")[0]).to be_truthy }
+  end
+
+  it "returns true when the value has special characters and is wrapped in a String" do
+    with_symbol_deserialization { expect(subject.transform?(':"foo.bar"')[0]).to be_truthy }
+  end
+
+  it "returns false when symbol deserialization is disabled" do
+    without_symbol_deserialization { expect(subject.transform?(":foo")).to be_falsey }
+  end
+
+  it "returns false when the value does not match a valid Symbol" do
+    with_symbol_deserialization { expect(subject.transform?("foo")).to be_falsey }
+  end
+
+  it "returns false when the symbol does not begin the line" do
+    with_symbol_deserialization do
+      expect(subject.transform?("NOT A SYMBOL\n:foo")).to be_falsey
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/yaml_spec.rb b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/yaml_spec.rb
new file mode 100644
index 0000000..2c2bd18
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/safe_yaml-1.0.4/spec/yaml_spec.rb
@@ -0,0 +1,15 @@
+# See https://github.com/dtao/safe_yaml/issues/47
+
+require "spec_helper"
+
+describe YAML do
+  context "when you've only required safe_yaml/load", :libraries => true do
+    it "YAML.load doesn't get monkey patched" do
+      expect(YAML.method(:load)).to eq(ORIGINAL_YAML_LOAD)
+    end
+
+    it "YAML.load_file doesn't get monkey patched" do
+      expect(YAML.method(:load_file)).to eq(ORIGINAL_YAML_LOAD_FILE)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/.yardopts b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/.yardopts
new file mode 100644
index 0000000..a380440
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/.yardopts
@@ -0,0 +1,13 @@
+--readme          README.md
+--markup          markdown
+--markup-provider redcarpet
+--default-return  ""
+--title           "Sass Documentation"
+--query           'object.type != :classvariable'
+--query           'object.type != :constant || @api && @api.text == "public"'
+--hide-void-return
+--protected
+--no-private
+--no-highlight
+--tag             comment
+--hide-tag        comment
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/CODE_OF_CONDUCT.md b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..dfc4c84
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/CODE_OF_CONDUCT.md
@@ -0,0 +1,10 @@
+Sass is more than a technology; Sass is driven by the community of individuals
+that power its development and use every day. As a community, we want to embrace
+the very differences that have made our collaboration so powerful, and work
+together to provide the best environment for learning, growing, and sharing of
+ideas. It is imperative that we keep Sass a fun, welcoming, challenging, and
+fair place to play.
+
+[The full community guidelines can be found on the Sass website.][link]
+
+[link]: http://sass-lang.com/community-guidelines
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/CONTRIBUTING.md b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/CONTRIBUTING.md
new file mode 100644
index 0000000..f3345ea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/CONTRIBUTING.md
@@ -0,0 +1,148 @@
+Contributions are welcomed. Please see the following site for guidelines:
+
+[http://sass-lang.com/community#Contribute](http://sass-lang.com/community#Contribute)
+
+* [Branches](#main-development-branches)
+  * [Feature Branches](#feature-branches)
+  * [Experimental Branches](#experimental-branches)
+  * [Old Stable Branches](#old-stable-branches)
+* [Versioning](#versioning)
+  * [Making Breaking Changes](#making-breaking-changes)
+  * [Exceptional Breakages](#exceptional-breakages)
+
+## Branches
+
+The Sass repository has three primary development branches, each of which tracks
+a different line of releases (see [versioning](#versioning) below). Each branch
+is regularly merged into the one below: `stable` into `next`, `next` into
+`master`.
+
+* The `stable` branch is the default—it's what GitHub shows if you go to
+  [sass/sass](https://github.com/sass/sass), and it's the default place for pull
+  requests to go. This branch is where we work on the next patch release. Bug
+  fixes and documentation improvements belong here, but not new features.
+
+* The `next` branch is where we work on the next minor release. It's where most
+  new features go, as long as they're not breaking changes. Very occasionally
+  breaking changes will go here as well—see
+  [exceptional breakages](#exceptional-breakages) below for details.
+
+* The `master` branch is where we work on the next major release. It's where
+  breaking changes go. We also occasionally decide that a non-breaking feature
+  is big enough to warrant saving until the next major release, in which case it
+  will also be developed here.
+
+Ideally, pull requests would be made against the appropriate
+branch, but don't worry about it too much; if you make a request against the
+wrong branch, the maintainer will take responsibility for rebasing it before
+merging.
+
+### Testing
+
+Tests for changes to the Sass language go in
+[sass-spec](https://github.com/sass/sass-spec) so that other
+implementations (E.g. libSass) can be tested against the same test
+suite. The sass-spec repo follows a "trunk development" model in that
+the tests there test against different version of the Sass language (as
+opposed to having branches that track different Sass versions). When
+contributing changes to Sass, update the Gemfile to use sass-spec from a
+branch or fork that has the new tests. When the feature lands in Sass,
+the committer will also merge the corresponding sass-spec changes.
+
+The [documentation of
+sass-spec](https://github.com/sass/sass-spec/blob/master/README.md)
+explains how to run sass-spec and contribute changes. In development,
+Change the Gemfile(s) to use the `:path` option against the sass-spec gem
+to link your local checkout of sass and sass-spec together in one or
+both directions.
+
+Changes to Sass internals or Ruby Sass specific features (E.g.
+the `sass-convert` tool) should always have tests in the Sass `test`
+directory following the conventions you see there.
+
+### Feature Branches
+
+Sometimes it won't be possible to merge a new feature into `next` or `master`
+immediately. It may require longer-term work before it's complete, or we may not
+want to release it as part of any alpha releases of the branch in question.
+Branches like this are labeled `feature.#{name}` and stay on GitHub until
+they're ready to be merged.
+
+### Experimental Branches
+
+Not all features pan out, and not all code is a good fit for merging into the
+main codebase. Usually when this happens the code is just discarded, but every
+so often it's interesting or promising enough that it's worth keeping around.
+This is what experimental branches (labeled `experimental.#{name}`) are for.
+While they're not currently in use, they contain code that might be useful in
+the future.
+
+### Old Stable Branches
+
+Usually Sass doesn't have the development time to do long-term maintenance of
+old release. But occasionally, very rarely, it becomes necessary. In cases like
+that, a branch named `stable_#{version}` will be created, starting from the last
+tag in that version series.
+
+## Versioning
+
+Starting with version 3.5.0, Sass uses [semantic versioning](http://semver.org/)
+to indicate the evolution of its language semantics as much as possible. This
+means that patch releases (such as 3.5.3) contain only bug fixes, minor releases
+(such as 3.6.0) contain backwards-compatible features, and only major releases
+(such as 4.0.0) are allowed to have backwards-incompatible behavior. There are
+[exceptions](#exceptional-breakages), but we try to follow this rule as closely
+as possible.
+
+Note, however, that the semantic versioning applies only to the language's
+semantics, not to the Ruby APIs. Although we try hard to keep widely-used APIs
+like [`Sass::Engine`][Sass::Engine] stable, we don't have a strong distinction
+between public and private APIs and we need to be able to freely refactor our
+code.
+
+[Sass::Engine]: http://sass-lang.com/documentation/Sass/Engine.html
+
+### Making Breaking Changes
+
+Sometimes the old way of doing something just isn't going to work anymore, and
+the new way just can't be made backwards-compatible. In that case, a breaking
+change is necessary. These changes are rarely pleasant, but they contribute to
+making the language better in the long term.
+
+Our breaking change process tries to make such changes as clear to users and as
+easy to adapt to as possible. We want to ensure that there's a clear path
+forward for users using functionality that will no longer exist, and that they
+are able to understand what's changing and what they need to do. We've developed
+the following process for this:
+
+1. Deprecate the old behavior [in `stable`](#branches). At minimum, deprecating
+   some behavior involves printing a warning when that behavior is used
+   explaining that it's going to go away in the future. Ideally, this message
+   will also include code that will do the same thing in a non-deprecated way.
+   If there's a thorough prose explanation of the change available online, the
+   message should link to that as well.
+
+2. If possible, make `sass-convert` (also in `stable`) convert the deprecated
+   behavior into a non-deprecated form. This allows users to run `sass-convert
+   -R -i` to automatically update their stylesheets.
+
+3. Implement the new behavior in `master`. The sooner this happens, the better:
+   it may be unclear exactly what needs to be deprecated until the new
+   implementation exists.
+
+4. Release an alpha version of `master` that includes the new behavior. This
+   allows users who are dissatisfied with the workaround to use the new
+   behavior early. Normally a maintainer will take care of this.
+
+### Exceptional Breakages
+
+Because Sass's syntax and semantics are closely tied to those of CSS, there are
+occasionally times when CSS syntax is introduced that overlaps with
+previously-valid Sass. In this case in particular, we may introduce a breaking
+change in a minor version to get back to CSS compatibility as soon as possible.
+
+Exceptional breakages still require the full deprecation process; the only
+change is that the new behavior is implemented in `next` rather than `master`.
+Because there are no minor releases between the deprecation and the removal of
+the old behavior, the deprecation warning should be introduced soon as it
+becomes clear that an exceptional breakage is necessary.
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/MIT-LICENSE b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/MIT-LICENSE
new file mode 100644
index 0000000..5c184eb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/MIT-LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2006-2016 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein
+
+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/bundle/ruby/2.4.0/gems/sass-3.5.1/README.md b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/README.md
new file mode 100644
index 0000000..dd5e0b5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/README.md
@@ -0,0 +1,227 @@
+# Sass [![Travis Build Status](https://travis-ci.org/sass/sass.svg?branch=next)](https://travis-ci.org/sass/sass) [![Gem Version](https://badge.fury.io/rb/sass.svg)](http://badge.fury.io/rb/sass) [![Inline docs](http://inch-ci.org/github/sass/sass.svg)](http://inch-ci.org/github/sass/sass)
+
+**Sass makes CSS fun again**. Sass is an extension of CSS,
+adding nested rules, variables, mixins, selector inheritance, and more.
+It's translated to well-formatted, standard CSS
+using the command line tool or a web-framework plugin.
+
+Sass has two syntaxes. The new main syntax (as of Sass 3)
+is known as "SCSS" (for "Sassy CSS"),
+and is a superset of CSS's syntax.
+This means that every valid CSS stylesheet is valid SCSS as well.
+SCSS files use the extension `.scss`.
+
+The second, older syntax is known as the indented syntax (or just "Sass").
+Inspired by Haml's terseness, it's intended for people
+who prefer conciseness over similarity to CSS.
+Instead of brackets and semicolons,
+it uses the indentation of lines to specify blocks.
+Although no longer the primary syntax,
+the indented syntax will continue to be supported.
+Files in the indented syntax use the extension `.sass`.
+
+## Using
+
+Sass can be used from the command line
+or as part of a web framework.
+The first step is to install the gem:
+
+    gem install sass
+
+After you convert some CSS to Sass, you can run
+
+    sass style.scss
+
+to compile it back to CSS.
+For more information on these commands, check out
+
+    sass --help
+
+To install Sass in Rails 2,
+just add `config.gem "sass"` to `config/environment.rb`.
+In Rails 3, add `gem "sass"` to your Gemfile instead.
+`.sass` or `.scss` files should be placed in `public/stylesheets/sass`,
+where they'll be automatically compiled
+to corresponding CSS files in `public/stylesheets` when needed
+(the Sass template directory is customizable...
+see [the Sass reference](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#template_location-option) for details).
+
+Sass can also be used with any Rack-enabled web framework.
+To do so, just add
+
+```ruby
+require 'sass/plugin/rack'
+use Sass::Plugin::Rack
+```
+
+to `config.ru`.
+Then any Sass files in `public/stylesheets/sass`
+will be compiled into CSS files in `public/stylesheets` on every request.
+
+To use Sass programmatically,
+check out the [YARD documentation](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#using_sass).
+
+## Formatting
+
+Sass is an extension of CSS
+that adds power and elegance to the basic language.
+It allows you to use [variables][vars], [nested rules][nested],
+[mixins][mixins], [inline imports][imports],
+and more, all with a fully CSS-compatible syntax.
+Sass helps keep large stylesheets well-organized,
+and get small stylesheets up and running quickly,
+particularly with the help of
+[the Compass style library](http://compass-style.org).
+
+[vars]:    http://sass-lang.com/documentation/file.SASS_REFERENCE.html#variables_
+[nested]:  http://sass-lang.com/documentation/file.SASS_REFERENCE.html#nested_rules
+[mixins]:  http://sass-lang.com/documentation/file.SASS_REFERENCE.html#mixins
+[imports]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#import
+
+Sass has two syntaxes.
+The one presented here, known as "SCSS" (for "Sassy CSS"),
+is fully CSS-compatible.
+The other (older) syntax, known as the indented syntax or just "Sass",
+is whitespace-sensitive and indentation-based.
+For more information, see the [reference documentation][syntax].
+
+[syntax]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#syntax
+
+To run the following examples and see the CSS they produce,
+put them in a file called `test.scss` and run `sass test.scss`.
+
+### Nesting
+
+Sass avoids repetition by nesting selectors within one another.
+The same thing works for properties.
+
+```scss
+table.hl {
+  margin: 2em 0;
+  td.ln { text-align: right; }
+}
+
+li {
+  font: {
+    family: serif;
+    weight: bold;
+    size: 1.2em;
+  }
+}
+```
+
+### Variables
+
+Use the same color all over the place?
+Need to do some math with height and width and text size?
+Sass supports variables, math operations, and many useful functions.
+
+```scss
+$blue: #3bbfce;
+$margin: 16px;
+
+.content_navigation {
+  border-color: $blue;
+  color: darken($blue, 10%);
+}
+
+.border {
+  padding: $margin / 2;
+  margin: $margin / 2;
+  border-color: $blue;
+}
+```
+
+### Mixins
+
+Even more powerful than variables,
+mixins allow you to re-use whole chunks of CSS,
+properties or selectors.
+You can even give them arguments. 
+
+```scss
+@mixin table-scaffolding {
+  th {
+    text-align: center;
+    font-weight: bold;
+  }
+  td, th { padding: 2px; }
+}
+
+@mixin left($dist) {
+  float: left;
+  margin-left: $dist;
+}
+
+#data {
+  @include left(10px);
+  @include table-scaffolding;
+}
+```
+
+A comprehensive list of features is available
+in the [Sass reference](http://sass-lang.com/documentation/file.SASS_REFERENCE.html).
+
+## Executables
+
+The Sass gem includes several executables that are useful
+for dealing with Sass from the command line.
+
+### `sass`
+
+The `sass` executable transforms a source Sass file into CSS.
+See `sass --help` for further information and options.
+
+### `sass-convert`
+
+The `sass-convert` executable converts between CSS, Sass, and SCSS.
+When converting from CSS to Sass or SCSS,
+nesting is applied where appropriate.
+See `sass-convert --help` for further information and options.
+
+### Running locally
+
+To run the Sass executables from a source checkout instead of from rubygems:
+
+```
+$ cd sass
+$ bundle
+$ bundle exec sass ...
+$ bundle exec scss ...
+$ bundle exec sass-convert ...
+```
+
+## Authors
+
+Sass was envisioned by [Hampton Catlin](http://www.hamptoncatlin.com)
+(@hcatlin). However, Hampton doesn't even know his way around the code anymore
+and now occasionally consults on the language issues. Hampton lives in San
+Francisco, California and works as VP of Technology
+at [Moovweb](http://www.moovweb.com/).
+
+[Natalie Weizenbaum](https://twitter.com/nex3) is the primary developer and
+architect of Sass. Her hard work has kept the project alive by endlessly
+answering forum posts, fixing bugs, refactoring, finding speed improvements,
+writing documentation, implementing new features, and designing the language.
+Natalie lives in Seattle, Washington and works on [Dart](http://dartlang.org)
+application libraries at Google.
+
+[Chris Eppstein](http://twitter.com/chriseppstein) is a core contributor to
+Sass and the creator of [Compass](http://compass-style.org/), the first Sass-based framework, and
+[Eyeglass](http://github.com/sass-eyeglass/eyeglass), a node-sass plugin ecosystem for NPM. Chris focuses
+on making Sass more powerful, easy to use, and on ways to speed its adoption
+through the web development community. Chris lives in San Jose, California with
+his wife and two children. He is an Engineer for
+[LinkedIn.com](http://linkedin.com), where his primary responsibility is to
+maintain Sass and many other Sass-related open source projects.
+
+If you use this software, we'd be truly honored if you'd make a
+tax-deductible donation to a non-profit organization and then
+[let us know on twitter](http://twitter.com/SassCSS), so that we can
+thank you. Here's a few that we endorse:
+
+* [Trans Justice Funding Project](http://www.transjusticefundingproject.org/)
+* [United Mitochondrial Disease Foundation](http://umdf.org/compass)
+* [Girl Develop It](https://www.girldevelopit.com/donate)
+
+Sass is licensed under the MIT License.
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/REVISION b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/REVISION
new file mode 100644
index 0000000..54798d6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/REVISION
@@ -0,0 +1 @@
+(release)
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/Rakefile b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/Rakefile
new file mode 100644
index 0000000..7adfd92
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/Rakefile
@@ -0,0 +1,338 @@
+require 'rubygems/package'
+
+# ----- Utility Functions -----
+
+def scope(path)
+  File.join(File.dirname(__FILE__), path)
+end
+
+# ----- Default: Testing ------
+
+task :default => :test
+
+require 'rake/testtask'
+
+LINE_SIZE = 80
+DECORATION_CHAR = '#'
+
+def print_header(string)
+  length = string.length
+  puts DECORATION_CHAR * LINE_SIZE
+  puts string.center(length + 2, ' ').center(LINE_SIZE, DECORATION_CHAR)
+  puts DECORATION_CHAR * LINE_SIZE
+end
+
+desc "Run all tests"
+task :test do
+  test_cases = [
+    {
+      'env'   => {'MATHN' => 'true'},
+      'tasks' => ['test:ruby', 'test:spec', :rubocop]
+    },
+    {
+      'env'   => {'MATHN' => 'false'},
+      'tasks' => ['test:ruby']
+    }
+  ]
+
+  test_cases.each do |test_case|
+    env = test_case['env']
+    tasks = test_case['tasks']
+
+    env.each do |key, value|
+      ENV[key] = value
+    end
+    tasks.each do |task|
+      print_header("Running task: #{task}, env: #{env}")
+      Rake::Task[task].execute
+    end
+  end
+end
+
+namespace :test do
+  desc "Run the ruby tests (without sass-spec)"
+  Rake::TestTask.new("ruby") do |t|
+    t.libs << 'test'
+    test_files = FileList[scope('test/**/*_test.rb')]
+    test_files.exclude(scope('test/rails/*'))
+    test_files.exclude(scope('test/plugins/*'))
+    t.test_files = test_files
+    t.warning = true
+    t.verbose = true
+  end
+
+  desc "Run sass-spec tests against the local code."
+  task :spec do
+    require "yaml"
+    sass_spec_options = YAML.load_file(scope("test/sass-spec.yml"))
+    enabled = sass_spec_options.delete(:enabled)
+    unless enabled
+      puts "SassSpec tests are disabled."
+      next
+    end
+    if ruby_version_at_least?("1.9.2")
+      old_load_path = $:.dup
+      begin
+        $:.unshift(File.join(File.dirname(__FILE__), "lib"))
+        begin
+          require 'sass_spec'
+        rescue LoadError
+          puts "You probably forgot to run: bundle exec rake"
+          raise
+        end
+        default_options = {
+          :spec_directory => SassSpec::SPEC_DIR,
+          :engine_adapter => SassEngineAdapter.new,
+          :generate => false,
+          :tap => false,
+          :skip => false,
+          :verbose => false,
+          :filter => "",
+          :limit => -1,
+          :unexpected_pass => false,
+          :nuke => false,
+        }
+        SassSpec::Runner.new(default_options.merge(sass_spec_options)).run || exit(1)
+      ensure
+        $:.replace(old_load_path)
+      end
+    else
+      "Skipping sass-spec on ruby versions less than 1.9.2"
+    end
+  end
+end
+
+# ----- Code Style Enforcement -----
+
+def ruby_version_at_least?(version_string)
+  ruby_version = Gem::Version.new(RUBY_VERSION.dup)
+  version = Gem::Version.new(version_string)
+  ruby_version >= version
+end
+
+begin
+  require 'rubocop/rake_task'
+  RuboCop = Rubocop unless defined?(RuboCop)
+  RuboCop::RakeTask.new do |t|
+    t.patterns = FileList["lib/**/*"]
+  end
+rescue LoadError
+  task :rubocop do
+    puts "Rubocop is disabled."
+    puts "Passing this check is required in order for your patch to be accepted."
+    puts "Install Rubocop and then run the style check with: rake rubocop."
+  end
+end
+
+# ----- Packaging -----
+
+# Don't use Rake::GemPackageTast because we want prerequisites to run
+# before we load the gemspec.
+desc "Build all the packages."
+task :package => [:revision_file, :date_file, :permissions] do
+  version = get_version
+  File.open(scope('VERSION'), 'w') {|f| f.puts(version)}
+  load scope('sass.gemspec')
+  Gem::Package.build(SASS_GEMSPEC)
+  sh %{git checkout VERSION}
+
+  pkg = "#{SASS_GEMSPEC.name}-#{SASS_GEMSPEC.version}"
+  mkdir_p "pkg"
+  verbose(true) {mv "#{pkg}.gem", "pkg/#{pkg}.gem"}
+
+  sh %{rm -f pkg/#{pkg}.tar.gz}
+  verbose(false) {SASS_GEMSPEC.files.each {|f| sh %{tar rf pkg/#{pkg}.tar #{f}}}}
+  sh %{gzip pkg/#{pkg}.tar}
+end
+
+task :permissions do
+  sh %{chmod -R a+rx bin}
+  sh %{chmod -R a+r .}
+  require 'shellwords'
+  Dir.glob('test/**/*_test.rb') do |file|
+    next if file =~ %r{^test/haml/spec/}
+    sh %{chmod a+rx #{file}}
+  end
+end
+
+task :revision_file do
+  require scope('lib/sass')
+
+  release = Rake.application.top_level_tasks.include?('release') || File.exist?(scope('EDGE_GEM_VERSION'))
+  if Sass.version[:rev] && !release
+    File.open(scope('REVISION'), 'w') { |f| f.puts Sass.version[:rev] }
+  elsif release
+    File.open(scope('REVISION'), 'w') { |f| f.puts "(release)" }
+  else
+    File.open(scope('REVISION'), 'w') { |f| f.puts "(unknown)" }
+  end
+end
+
+task :date_file do
+  File.open(scope('VERSION_DATE'), 'w') do |f|
+    f.puts Time.now.utc.strftime('%d %B %Y %T %Z')
+  end
+end
+
+# We also need to get rid of this file after packaging.
+at_exit do
+  File.delete(scope('REVISION')) rescue nil
+  File.delete(scope('VERSION_DATE')) rescue nil
+end
+
+desc "Install Sass as a gem. Use SUDO=1 to install with sudo."
+task :install => [:package] do
+  gem  = RUBY_PLATFORM =~ /java/  ? 'jgem' : 'gem'
+  sh %{#{'sudo ' if ENV["SUDO"]}#{gem} install --no-ri pkg/sass-#{get_version}}
+end
+
+desc "Release a new Sass package to RubyGems.org."
+task :release => [:check_release, :package] do
+  version = File.read(scope("VERSION")).strip
+  sh %{gem push pkg/sass-#{version}.gem}
+end
+
+# Ensures that the VERSION file has been updated for a new release.
+task :check_release do
+  version = File.read(scope("VERSION")).strip
+  raise "There have been changes since current version (#{version})" if changed_since?(version)
+  raise "VERSION_NAME must not be 'Bleeding Edge'" if File.read(scope("VERSION_NAME")) == "Bleeding Edge"
+end
+
+# Reads a password from the command line.
+#
+# @param name [String] The prompt to use to read the password
+def read_password(prompt)
+  require 'readline'
+  system "stty -echo"
+  Readline.readline("#{prompt}: ").strip
+ensure
+  system "stty echo"
+  puts
+end
+
+# Returns whether or not the repository, or specific files,
+# has/have changed since a given revision.
+#
+# @param rev [String] The revision to check against
+# @param files [Array<String>] The files to check.
+#   If this is empty, checks the entire repository
+def changed_since?(rev, *files)
+  IO.popen("git diff --exit-code #{rev} #{files.join(' ')}") {}
+  return !$?.success?
+end
+
+# Get the version string. If this is being installed from Git,
+# this includes the proper prerelease version.
+def get_version
+  File.read(scope('VERSION').strip)
+end
+
+task :watch_for_update do
+  sh %{ruby extra/update_watch.rb}
+end
+
+# ----- Documentation -----
+
+task :rdoc do
+  puts '=' * 100, <<END, '=' * 100
+Sass uses the YARD documentation system (http://github.com/lsegal/yard).
+Install the yard gem and then run "rake doc".
+END
+end
+
+begin
+  require 'yard'
+
+  namespace :doc do
+    task :sass do
+      require scope('lib/sass')
+      Dir[scope("yard/default/**/*.sass")].each do |sass|
+        File.open(sass.gsub(/sass$/, 'css'), 'w') do |f|
+          f.write(Sass::Engine.new(File.read(sass)).render)
+        end
+      end
+    end
+
+    desc "List all undocumented methods and classes."
+    task :undocumented do
+      opts = ENV["YARD_OPTS"] || ""
+      ENV["YARD_OPTS"] = opts.dup + <<OPTS
+ --list --tag comment --hide-tag comment --query "
+  object.docstring.blank? &&
+  !(object.type == :method && object.is_alias?)"
+OPTS
+      Rake::Task['yard'].execute
+    end
+  end
+
+  YARD::Rake::YardocTask.new do |t|
+    t.files = FileList.new(scope('lib/**/*.rb')) do |list|
+      list.exclude('lib/sass/plugin/merb.rb')
+      list.exclude('lib/sass/plugin/rails.rb')
+    end.to_a
+    t.options << '--incremental' if Rake.application.top_level_tasks.include?('redoc')
+    t.options += FileList.new(scope('yard/*.rb')).to_a.map {|f| ['-e', f]}.flatten
+    files = FileList.new(scope('doc-src/*')).to_a.sort_by {|s| s.size} + %w[MIT-LICENSE VERSION]
+    t.options << '--files' << files.join(',')
+    t.options << '--template-path' << scope('yard')
+    t.options << '--title' << ENV["YARD_TITLE"] if ENV["YARD_TITLE"]
+
+    t.before = lambda do
+      if ENV["YARD_OPTS"]
+        require 'shellwords'
+        t.options.concat(Shellwords.shellwords(ENV["YARD_OPTS"]))
+      end
+    end
+  end
+  Rake::Task['yard'].prerequisites.insert(0, 'doc:sass')
+  Rake::Task['yard'].instance_variable_set('@comment', nil)
+
+  desc "Generate Documentation"
+  task :doc => :yard
+  task :redoc => :yard
+rescue LoadError
+  desc "Generate Documentation"
+  task :doc => :rdoc
+  task :yard => :rdoc
+end
+
+# ----- Coverage -----
+
+begin
+  require 'rcov/rcovtask'
+
+  Rcov::RcovTask.new do |t|
+    t.test_files = FileList[scope('test/**/*_test.rb')]
+    t.rcov_opts << '-x' << '"^\/"'
+    if ENV['NON_NATIVE']
+      t.rcov_opts << "--no-rcovrt"
+    end
+    t.verbose = true
+  end
+rescue LoadError; end
+
+# ----- Profiling -----
+
+begin
+  require 'ruby-prof'
+
+  desc <<END
+Run a profile of sass.
+  TIMES=n sets the number of runs. Defaults to 1000.
+  FILE=str sets the file to profile. Defaults to 'complex'.
+  OUTPUT=str sets the ruby-prof output format.
+    Can be Flat, CallInfo, or Graph. Defaults to Flat. Defaults to Flat.
+END
+  task :profile do
+    times  = (ENV['TIMES'] || '1000').to_i
+    file   = ENV['FILE']
+
+    require 'lib/sass'
+
+    file = File.read(scope("test/sass/templates/#{file || 'complex'}.sass"))
+    result = RubyProf.profile { times.times { Sass::Engine.new(file).render } }
+
+    RubyProf.const_get("#{(ENV['OUTPUT'] || 'Flat').capitalize}Printer").new(result).print
+  end
+rescue LoadError; end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/VERSION b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/VERSION
new file mode 100644
index 0000000..d5c0c99
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/VERSION
@@ -0,0 +1 @@
+3.5.1
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/VERSION_DATE b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/VERSION_DATE
new file mode 100644
index 0000000..a0fba38
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/VERSION_DATE
@@ -0,0 +1 @@
+13 July 2017 22:58:15 UTC
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/VERSION_NAME b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/VERSION_NAME
new file mode 100644
index 0000000..ee5e396
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/VERSION_NAME
@@ -0,0 +1 @@
+Bleeding Edge
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/bin/sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/bin/sass
new file mode 100755
index 0000000..62d6d0c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/bin/sass
@@ -0,0 +1,13 @@
+#!/usr/bin/env ruby
+# The command line Sass parser.
+
+THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
+begin
+  require File.dirname(THIS_FILE) + '/../lib/sass'
+rescue LoadError
+  require 'sass'
+end
+require 'sass/exec'
+
+opts = Sass::Exec::SassScss.new(ARGV, :sass)
+opts.parse!
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/bin/sass-convert b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/bin/sass-convert
new file mode 100755
index 0000000..b276253
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/bin/sass-convert
@@ -0,0 +1,12 @@
+#!/usr/bin/env ruby
+
+THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
+begin
+  require File.dirname(THIS_FILE) + '/../lib/sass'
+rescue LoadError
+  require 'sass'
+end
+require 'sass/exec'
+
+opts = Sass::Exec::SassConvert.new(ARGV)
+opts.parse!
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/bin/scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/bin/scss
new file mode 100755
index 0000000..ce3c4ad
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/bin/scss
@@ -0,0 +1,13 @@
+#!/usr/bin/env ruby
+# The command line Sass parser.
+
+THIS_FILE = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
+begin
+  require File.dirname(THIS_FILE) + '/../lib/sass'
+rescue LoadError
+  require 'sass'
+end
+require 'sass/exec'
+
+opts = Sass::Exec::SassScss.new(ARGV, :scss)
+opts.parse!
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/extra/sass-spec-ref.sh b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/extra/sass-spec-ref.sh
new file mode 100755
index 0000000..d487f7a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/extra/sass-spec-ref.sh
@@ -0,0 +1,32 @@
+#!/bin/bash -e
+# Copyright 2016 Google Inc. Use of this source code is governed by an MIT-style
+# license that can be found in the LICENSE file or at
+# https://opensource.org/licenses/MIT.
+
+# Echoes the sass-spec Git ref that should be checked out for the current Travis
+# run. If we're running specs for a pull request which refers to a sass-spec
+# pull request, we'll run against the latter rather than sass-spec master.
+
+default=master
+
+if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
+  >&2 echo "TRAVIS_PULL_REQUEST: $TRAVIS_PULL_REQUEST."
+  >&2 echo "Ref: $default."
+  echo "$default"
+  exit 0
+fi
+
+>&2 echo "Fetching pull request $TRAVIS_PULL_REQUEST..."
+
+JSON=$(curl -L -sS https://api.github.com/repos/sass/sass/pulls/$TRAVIS_PULL_REQUEST)
+
+RE_SPEC_PR="sass\/sass-spec(#|\/pull\/)([0-9]+)"
+
+if [[ $JSON =~ $RE_SPEC_PR ]]; then
+  ref="pull/${BASH_REMATCH[2]}/head"
+  >&2 echo "Ref: $ref."
+  echo "$ref"
+else
+  >&2 echo "Ref: $default."
+  echo "$default"
+fi
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/extra/update_watch.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/extra/update_watch.rb
new file mode 100644
index 0000000..dc90685
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/extra/update_watch.rb
@@ -0,0 +1,13 @@
+require 'rubygems'
+require 'sinatra'
+require 'json'
+set :port, 3124
+set :environment, :production
+enable :lock
+Dir.chdir(File.dirname(__FILE__) + "/..")
+
+post "/" do
+  puts "Received payload!"
+  puts "Rev: #{`git name-rev HEAD`.strip}"
+  system %{rake handle_update --trace REF=#{JSON.parse(params["payload"])["ref"].inspect}}
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/init.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/init.rb
new file mode 100644
index 0000000..5a3bceb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/init.rb
@@ -0,0 +1,18 @@
+begin
+  require File.join(File.dirname(__FILE__), 'lib', 'sass') # From here
+rescue LoadError
+  begin
+    require 'sass' # From gem
+  rescue LoadError => e
+    # gems:install may be run to install Haml with the skeleton plugin
+    # but not the gem itself installed.
+    # Don't die if this is the case.
+    raise e unless defined?(Rake) &&
+      (Rake.application.top_level_tasks.include?('gems') ||
+        Rake.application.top_level_tasks.include?('gems:install'))
+  end
+end
+
+# Load Sass.
+# Sass may be undefined if we're running gems:install.
+require 'sass/plugin' if defined?(Sass)
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass.rb
new file mode 100644
index 0000000..a569bc3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass.rb
@@ -0,0 +1,102 @@
+dir = File.dirname(__FILE__)
+$LOAD_PATH.unshift dir unless $LOAD_PATH.include?(dir)
+
+require 'sass/version'
+
+# The module that contains everything Sass-related:
+#
+# * {Sass::Engine} is the class used to render Sass/SCSS within Ruby code.
+# * {Sass::Plugin} is interfaces with web frameworks (Rails and Merb in particular).
+# * {Sass::SyntaxError} is raised when Sass encounters an error.
+# * {Sass::CSS} handles conversion of CSS to Sass.
+#
+# Also see the {file:SASS_REFERENCE.md full Sass reference}.
+module Sass
+  class << self
+    # @private
+    attr_accessor :tests_running
+  end
+
+  # The global load paths for Sass files. This is meant for plugins and
+  # libraries to register the paths to their Sass stylesheets to that they may
+  # be `@imported`. This load path is used by every instance of {Sass::Engine}.
+  # They are lower-precedence than any load paths passed in via the
+  # {file:SASS_REFERENCE.md#load_paths-option `:load_paths` option}.
+  #
+  # If the `SASS_PATH` environment variable is set,
+  # the initial value of `load_paths` will be initialized based on that.
+  # The variable should be a colon-separated list of path names
+  # (semicolon-separated on Windows).
+  #
+  # Note that files on the global load path are never compiled to CSS
+  # themselves, even if they aren't partials. They exist only to be imported.
+  #
+  # @example
+  #   Sass.load_paths << File.dirname(__FILE__ + '/sass')
+  # @return [Array<String, Pathname, Sass::Importers::Base>]
+  def self.load_paths
+    @load_paths ||= if ENV['SASS_PATH']
+                      ENV['SASS_PATH'].split(Sass::Util.windows? ? ';' : ':')
+                    else
+                      []
+                    end
+  end
+
+  # Compile a Sass or SCSS string to CSS.
+  # Defaults to SCSS.
+  #
+  # @param contents [String] The contents of the Sass file.
+  # @param options [{Symbol => Object}] An options hash;
+  #   see {file:SASS_REFERENCE.md#Options the Sass options documentation}
+  # @raise [Sass::SyntaxError] if there's an error in the document
+  # @raise [Encoding::UndefinedConversionError] if the source encoding
+  #   cannot be converted to UTF-8
+  # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
+  def self.compile(contents, options = {})
+    options[:syntax] ||= :scss
+    Engine.new(contents, options).to_css
+  end
+
+  # Compile a file on disk to CSS.
+  #
+  # @raise [Sass::SyntaxError] if there's an error in the document
+  # @raise [Encoding::UndefinedConversionError] if the source encoding
+  #   cannot be converted to UTF-8
+  # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
+  #
+  # @overload compile_file(filename, options = {})
+  #   Return the compiled CSS rather than writing it to a file.
+  #
+  #   @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
+  #   @param options [{Symbol => Object}] An options hash;
+  #     see {file:SASS_REFERENCE.md#Options the Sass options documentation}
+  #   @return [String] The compiled CSS.
+  #
+  # @overload compile_file(filename, css_filename, options = {})
+  #   Write the compiled CSS to a file.
+  #
+  #   @param filename [String] The path to the Sass, SCSS, or CSS file on disk.
+  #   @param options [{Symbol => Object}] An options hash;
+  #     see {file:SASS_REFERENCE.md#Options the Sass options documentation}
+  #   @param css_filename [String] The location to which to write the compiled CSS.
+  def self.compile_file(filename, *args)
+    options = args.last.is_a?(Hash) ? args.pop : {}
+    css_filename = args.shift
+    result = Sass::Engine.for_file(filename, options).render
+    if css_filename
+      options[:css_filename] ||= css_filename
+      open(css_filename, "w") {|css_file| css_file.write(result)}
+      nil
+    else
+      result
+    end
+  end
+end
+
+require 'sass/logger'
+require 'sass/util'
+
+require 'sass/engine'
+require 'sass/plugin' if defined?(Merb::Plugins)
+require 'sass/railtie'
+require 'sass/features'
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores.rb
new file mode 100644
index 0000000..62259b3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores.rb
@@ -0,0 +1,15 @@
+require 'stringio'
+
+module Sass
+  # Sass cache stores are in charge of storing cached information,
+  # especially parse trees for Sass documents.
+  #
+  # User-created importers must inherit from {CacheStores::Base}.
+  module CacheStores
+  end
+end
+
+require 'sass/cache_stores/base'
+require 'sass/cache_stores/filesystem'
+require 'sass/cache_stores/memory'
+require 'sass/cache_stores/chain'
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/base.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/base.rb
new file mode 100644
index 0000000..e239666
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/base.rb
@@ -0,0 +1,88 @@
+module Sass
+  module CacheStores
+    # An abstract base class for backends for the Sass cache.
+    # Any key-value store can act as such a backend;
+    # it just needs to implement the
+    # \{#_store} and \{#_retrieve} methods.
+    #
+    # To use a cache store with Sass,
+    # use the {file:SASS_REFERENCE.md#cache_store-option `:cache_store` option}.
+    #
+    # @abstract
+    class Base
+      # Store cached contents for later retrieval
+      # Must be implemented by all CacheStore subclasses
+      #
+      # Note: cache contents contain binary data.
+      #
+      # @param key [String] The key to store the contents under
+      # @param version [String] The current sass version.
+      #                Cached contents must not be retrieved across different versions of sass.
+      # @param sha [String] The sha of the sass source.
+      #                Cached contents must not be retrieved if the sha has changed.
+      # @param contents [String] The contents to store.
+      def _store(key, version, sha, contents)
+        raise "#{self.class} must implement #_store."
+      end
+
+      # Retrieved cached contents.
+      # Must be implemented by all subclasses.
+      #
+      # Note: if the key exists but the sha or version have changed,
+      # then the key may be deleted by the cache store, if it wants to do so.
+      #
+      # @param key [String] The key to retrieve
+      # @param version [String] The current sass version.
+      #                Cached contents must not be retrieved across different versions of sass.
+      # @param sha [String] The sha of the sass source.
+      #                Cached contents must not be retrieved if the sha has changed.
+      # @return [String] The contents that were previously stored.
+      # @return [NilClass] when the cache key is not found or the version or sha have changed.
+      def _retrieve(key, version, sha)
+        raise "#{self.class} must implement #_retrieve."
+      end
+
+      # Store a {Sass::Tree::RootNode}.
+      #
+      # @param key [String] The key to store it under.
+      # @param sha [String] The checksum for the contents that are being stored.
+      # @param root [Object] The root node to cache.
+      def store(key, sha, root)
+        _store(key, Sass::VERSION, sha, Marshal.dump(root))
+      rescue TypeError, LoadError => e
+        Sass::Util.sass_warn "Warning. Error encountered while saving cache #{path_to(key)}: #{e}"
+        nil
+      end
+
+      # Retrieve a {Sass::Tree::RootNode}.
+      #
+      # @param key [String] The key the root element was stored under.
+      # @param sha [String] The checksum of the root element's content.
+      # @return [Object] The cached object.
+      def retrieve(key, sha)
+        contents = _retrieve(key, Sass::VERSION, sha)
+        Marshal.load(contents) if contents
+      rescue EOFError, TypeError, ArgumentError, LoadError => e
+        Sass::Util.sass_warn "Warning. Error encountered while reading cache #{path_to(key)}: #{e}"
+        nil
+      end
+
+      # Return the key for the sass file.
+      #
+      # The `(sass_dirname, sass_basename)` pair
+      # should uniquely identify the Sass document,
+      # but otherwise there are no restrictions on their content.
+      #
+      # @param sass_dirname [String]
+      #   The fully-expanded location of the Sass file.
+      #   This corresponds to the directory name on a filesystem.
+      # @param sass_basename [String] The name of the Sass file that is being referenced.
+      #   This corresponds to the basename on a filesystem.
+      def key(sass_dirname, sass_basename)
+        dir = Digest::SHA1.hexdigest(sass_dirname)
+        filename = "#{sass_basename}c"
+        "#{dir}/#{filename}"
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/chain.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/chain.rb
new file mode 100644
index 0000000..914c111
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/chain.rb
@@ -0,0 +1,34 @@
+module Sass
+  module CacheStores
+    # A meta-cache that chains multiple caches together.
+    # Specifically:
+    #
+    # * All `#store`s are passed to all caches.
+    # * `#retrieve`s are passed to each cache until one has a hit.
+    # * When one cache has a hit, the value is `#store`d in all earlier caches.
+    class Chain < Base
+      # Create a new cache chaining the given caches.
+      #
+      # @param caches [Array<Sass::CacheStores::Base>] The caches to chain.
+      def initialize(*caches)
+        @caches = caches
+      end
+
+      # @see Base#store
+      def store(key, sha, obj)
+        @caches.each {|c| c.store(key, sha, obj)}
+      end
+
+      # @see Base#retrieve
+      def retrieve(key, sha)
+        @caches.each_with_index do |c, i|
+          obj = c.retrieve(key, sha)
+          next unless obj
+          @caches[0...i].each {|prev| prev.store(key, sha, obj)}
+          return obj
+        end
+        nil
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/filesystem.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/filesystem.rb
new file mode 100644
index 0000000..140f5f1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/filesystem.rb
@@ -0,0 +1,60 @@
+require 'fileutils'
+
+module Sass
+  module CacheStores
+    # A backend for the Sass cache using the filesystem.
+    class Filesystem < Base
+      # The directory where the cached files will be stored.
+      #
+      # @return [String]
+      attr_accessor :cache_location
+
+      # @param cache_location [String] see \{#cache\_location}
+      def initialize(cache_location)
+        @cache_location = cache_location
+      end
+
+      # @see Base#\_retrieve
+      def _retrieve(key, version, sha)
+        return unless File.readable?(path_to(key))
+        begin
+          File.open(path_to(key), "rb") do |f|
+            if f.readline("\n").strip == version && f.readline("\n").strip == sha
+              return f.read
+            end
+          end
+          File.unlink path_to(key)
+        rescue Errno::ENOENT
+          # Already deleted. Race condition?
+        end
+        nil
+      rescue EOFError, TypeError, ArgumentError => e
+        Sass::Util.sass_warn "Warning. Error encountered while reading cache #{path_to(key)}: #{e}"
+      end
+
+      # @see Base#\_store
+      def _store(key, version, sha, contents)
+        compiled_filename = path_to(key)
+        FileUtils.mkdir_p(File.dirname(compiled_filename))
+        Sass::Util.atomic_create_and_write_file(compiled_filename) do |f|
+          f.puts(version)
+          f.puts(sha)
+          f.write(contents)
+        end
+      rescue Errno::EACCES
+        # pass
+      end
+
+      private
+
+      # Returns the path to a file for the given key.
+      #
+      # @param key [String]
+      # @return [String] The path to the cache file.
+      def path_to(key)
+        key = key.gsub(/[<>:\\|?*%]/) {|c| "%%%03d" % c.ord}
+        File.join(cache_location, key)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/memory.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/memory.rb
new file mode 100644
index 0000000..ccf64be
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/memory.rb
@@ -0,0 +1,46 @@
+module Sass
+  module CacheStores
+    # A backend for the Sass cache using in-process memory.
+    class Memory < Base
+      # Since the {Memory} store is stored in the Sass tree's options hash,
+      # when the options get serialized as part of serializing the tree,
+      # you get crazy exponential growth in the size of the cached objects
+      # unless you don't dump the cache.
+      #
+      # @private
+      def _dump(depth)
+        ""
+      end
+
+      # If we deserialize this class, just make a new empty one.
+      #
+      # @private
+      def self._load(repr)
+        Memory.new
+      end
+
+      # Create a new, empty cache store.
+      def initialize
+        @contents = {}
+      end
+
+      # @see Base#retrieve
+      def retrieve(key, sha)
+        return unless @contents.has_key?(key)
+        return unless @contents[key][:sha] == sha
+        obj = @contents[key][:obj]
+        obj.respond_to?(:deep_copy) ? obj.deep_copy : obj.dup
+      end
+
+      # @see Base#store
+      def store(key, sha, obj)
+        @contents[key] = {:sha => sha, :obj => obj}
+      end
+
+      # Destructively clear the cache.
+      def reset!
+        @contents = {}
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/null.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/null.rb
new file mode 100644
index 0000000..f14f4c7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/cache_stores/null.rb
@@ -0,0 +1,25 @@
+module Sass
+  module CacheStores
+    # Doesn't store anything, but records what things it should have stored.
+    # This doesn't currently have any use except for testing and debugging.
+    #
+    # @private
+    class Null < Base
+      def initialize
+        @keys = {}
+      end
+
+      def _retrieve(key, version, sha)
+        nil
+      end
+
+      def _store(key, version, sha, contents)
+        @keys[key] = true
+      end
+
+      def was_set?(key)
+        @keys[key]
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/callbacks.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/callbacks.rb
new file mode 100644
index 0000000..a33a509
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/callbacks.rb
@@ -0,0 +1,67 @@
+module Sass
+  # A lightweight infrastructure for defining and running callbacks.
+  # Callbacks are defined using \{#define\_callback\} at the class level,
+  # and called using `run_#{name}` at the instance level.
+  #
+  # Clients can add callbacks by calling the generated `on_#{name}` method,
+  # and passing in a block that's run when the callback is activated.
+  #
+  # @example Define a callback
+  #   class Munger
+  #     extend Sass::Callbacks
+  #     define_callback :string_munged
+  #
+  #     def munge(str)
+  #       res = str.gsub(/[a-z]/, '\1\1')
+  #       run_string_munged str, res
+  #       res
+  #     end
+  #   end
+  #
+  # @example Use a callback
+  #   m = Munger.new
+  #   m.on_string_munged {|str, res| puts "#{str} was munged into #{res}!"}
+  #   m.munge "bar" #=> bar was munged into bbaarr!
+  module Callbacks
+    # Automatically includes {InstanceMethods}
+    # when something extends this module.
+    #
+    # @param base [Module]
+    def self.extended(base)
+      base.send(:include, InstanceMethods)
+    end
+
+    protected
+
+    module InstanceMethods
+      # Removes all callbacks registered against this object.
+      def clear_callbacks!
+        @_sass_callbacks = {}
+      end
+    end
+
+    # Define a callback with the given name.
+    # This will define an `on_#{name}` method
+    # that registers a block,
+    # and a `run_#{name}` method that runs that block
+    # (optionall with some arguments).
+    #
+    # @param name [Symbol] The name of the callback
+    # @return [void]
+    def define_callback(name)
+      class_eval <<RUBY, __FILE__, __LINE__ + 1
+def on_#{name}(&block)
+  @_sass_callbacks = {} unless defined? @_sass_callbacks
+  (@_sass_callbacks[#{name.inspect}] ||= []) << block
+end
+
+def run_#{name}(*args)
+  return unless defined? @_sass_callbacks
+  return unless @_sass_callbacks[#{name.inspect}]
+  @_sass_callbacks[#{name.inspect}].each {|c| c[*args]}
+end
+private :run_#{name}
+RUBY
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/css.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/css.rb
new file mode 100644
index 0000000..47928bd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/css.rb
@@ -0,0 +1,407 @@
+require File.dirname(__FILE__) + '/../sass'
+require 'sass/tree/node'
+require 'sass/scss/css_parser'
+
+module Sass
+  # This class converts CSS documents into Sass or SCSS templates.
+  # It works by parsing the CSS document into a {Sass::Tree} structure,
+  # and then applying various transformations to the structure
+  # to produce more concise and idiomatic Sass/SCSS.
+  #
+  # Example usage:
+  #
+  #     Sass::CSS.new("p { color: blue }").render(:sass) #=> "p\n  color: blue"
+  #     Sass::CSS.new("p { color: blue }").render(:scss) #=> "p {\n  color: blue; }"
+  class CSS
+    # @param template [String] The CSS stylesheet.
+    #   This stylesheet can be encoded using any encoding
+    #   that can be converted to Unicode.
+    #   If the stylesheet contains an `@charset` declaration,
+    #   that overrides the Ruby encoding
+    #   (see {file:SASS_REFERENCE.md#Encodings the encoding documentation})
+    # @option options :old [Boolean] (false)
+    #     Whether or not to output old property syntax
+    #     (`:color blue` as opposed to `color: blue`).
+    #     This is only meaningful when generating Sass code,
+    #     rather than SCSS.
+    # @option options :indent [String] ("  ")
+    #     The string to use for indenting each line. Defaults to two spaces.
+    def initialize(template, options = {})
+      if template.is_a? IO
+        template = template.read
+      end
+
+      @options = options.merge(:_convert => true)
+      # Backwards compatibility
+      @options[:old] = true if @options[:alternate] == false
+      @template = template
+      @checked_encoding = false
+    end
+
+    # Converts the CSS template into Sass or SCSS code.
+    #
+    # @param fmt [Symbol] `:sass` or `:scss`, designating the format to return.
+    # @return [String] The resulting Sass or SCSS code
+    # @raise [Sass::SyntaxError] if there's an error parsing the CSS template
+    def render(fmt = :sass)
+      check_encoding!
+      build_tree.send("to_#{fmt}", @options).strip + "\n"
+    rescue Sass::SyntaxError => err
+      err.modify_backtrace(:filename => @options[:filename] || '(css)')
+      raise err
+    end
+
+    # Returns the original encoding of the document.
+    #
+    # @return [Encoding, nil]
+    # @raise [Encoding::UndefinedConversionError] if the source encoding
+    #   cannot be converted to UTF-8
+    # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
+    def source_encoding
+      check_encoding!
+      @original_encoding
+    end
+
+    private
+
+    def check_encoding!
+      return if @checked_encoding
+      @checked_encoding = true
+      @template, @original_encoding = Sass::Util.check_sass_encoding(@template)
+    end
+
+    # Parses the CSS template and applies various transformations
+    #
+    # @return [Tree::Node] The root node of the parsed tree
+    def build_tree
+      root = Sass::SCSS::CssParser.new(@template, @options[:filename], nil).parse
+      parse_selectors(root)
+      expand_commas(root)
+      nest_seqs(root)
+      parent_ref_rules(root)
+      flatten_rules(root)
+      bubble_subject(root)
+      fold_commas(root)
+      dump_selectors(root)
+      root
+    end
+
+    # Parse all the selectors in the document and assign them to
+    # {Sass::Tree::RuleNode#parsed_rules}.
+    #
+    # @param root [Tree::Node] The parent node
+    def parse_selectors(root)
+      root.children.each do |child|
+        next parse_selectors(child) if child.is_a?(Tree::DirectiveNode)
+        next unless child.is_a?(Tree::RuleNode)
+        parser = Sass::SCSS::CssParser.new(child.rule.first, child.filename, nil, child.line)
+        child.parsed_rules = parser.parse_selector
+      end
+    end
+
+    # Transform
+    #
+    #     foo, bar, baz
+    #       color: blue
+    #
+    # into
+    #
+    #     foo
+    #       color: blue
+    #     bar
+    #       color: blue
+    #     baz
+    #       color: blue
+    #
+    # @param root [Tree::Node] The parent node
+    def expand_commas(root)
+      root.children.map! do |child|
+        # child.parsed_rules.members.size > 1 iff the rule contains a comma
+        unless child.is_a?(Tree::RuleNode) && child.parsed_rules.members.size > 1
+          expand_commas(child) if child.is_a?(Tree::DirectiveNode)
+          next child
+        end
+        child.parsed_rules.members.map do |seq|
+          node = Tree::RuleNode.new([])
+          node.parsed_rules = make_cseq(seq)
+          node.children = child.children
+          node
+        end
+      end
+      root.children.flatten!
+    end
+
+    # Make rules use nesting so that
+    #
+    #     foo
+    #       color: green
+    #     foo bar
+    #       color: red
+    #     foo baz
+    #       color: blue
+    #
+    # becomes
+    #
+    #     foo
+    #       color: green
+    #       bar
+    #         color: red
+    #       baz
+    #         color: blue
+    #
+    # @param root [Tree::Node] The parent node
+    def nest_seqs(root)
+      current_rule = nil
+      root.children.map! do |child|
+        unless child.is_a?(Tree::RuleNode)
+          nest_seqs(child) if child.is_a?(Tree::DirectiveNode)
+          next child
+        end
+
+        seq = first_seq(child)
+        seq.members.reject! {|sseq| sseq == "\n"}
+        first, rest = seq.members.first, seq.members[1..-1]
+
+        if current_rule.nil? || first_sseq(current_rule) != first
+          current_rule = Tree::RuleNode.new([])
+          current_rule.parsed_rules = make_seq(first)
+        end
+
+        if rest.empty?
+          current_rule.children += child.children
+        else
+          child.parsed_rules = make_seq(*rest)
+          current_rule << child
+        end
+
+        current_rule
+      end
+      root.children.compact!
+      root.children.uniq!
+
+      root.children.each {|v| nest_seqs(v)}
+    end
+
+    # Make rules use parent refs so that
+    #
+    #     foo
+    #       color: green
+    #     foo.bar
+    #       color: blue
+    #
+    # becomes
+    #
+    #     foo
+    #       color: green
+    #       &.bar
+    #         color: blue
+    #
+    # @param root [Tree::Node] The parent node
+    def parent_ref_rules(root)
+      current_rule = nil
+      root.children.map! do |child|
+        unless child.is_a?(Tree::RuleNode)
+          parent_ref_rules(child) if child.is_a?(Tree::DirectiveNode)
+          next child
+        end
+
+        sseq = first_sseq(child)
+        next child unless sseq.is_a?(Sass::Selector::SimpleSequence)
+
+        firsts, rest = [sseq.members.first], sseq.members[1..-1]
+        firsts.push rest.shift if firsts.first.is_a?(Sass::Selector::Parent)
+
+        last_simple_subject = rest.empty? && sseq.subject?
+        if current_rule.nil? || first_sseq(current_rule).members != firsts ||
+            !!first_sseq(current_rule).subject? != !!last_simple_subject
+          current_rule = Tree::RuleNode.new([])
+          current_rule.parsed_rules = make_sseq(last_simple_subject, *firsts)
+        end
+
+        if rest.empty?
+          current_rule.children += child.children
+        else
+          rest.unshift Sass::Selector::Parent.new
+          child.parsed_rules = make_sseq(sseq.subject?, *rest)
+          current_rule << child
+        end
+
+        current_rule
+      end
+      root.children.compact!
+      root.children.uniq!
+
+      root.children.each {|v| parent_ref_rules(v)}
+    end
+
+    # Flatten rules so that
+    #
+    #     foo
+    #       bar
+    #         color: red
+    #
+    # becomes
+    #
+    #     foo bar
+    #       color: red
+    #
+    # and
+    #
+    #     foo
+    #       &.bar
+    #         color: blue
+    #
+    # becomes
+    #
+    #     foo.bar
+    #       color: blue
+    #
+    # @param root [Tree::Node] The parent node
+    def flatten_rules(root)
+      root.children.each do |child|
+        case child
+        when Tree::RuleNode
+          flatten_rule(child)
+        when Tree::DirectiveNode
+          flatten_rules(child)
+        end
+      end
+    end
+
+    # Flattens a single rule.
+    #
+    # @param rule [Tree::RuleNode] The candidate for flattening
+    # @see #flatten_rules
+    def flatten_rule(rule)
+      while rule.children.size == 1 && rule.children.first.is_a?(Tree::RuleNode)
+        child = rule.children.first
+
+        if first_simple_sel(child).is_a?(Sass::Selector::Parent)
+          rule.parsed_rules = child.parsed_rules.resolve_parent_refs(rule.parsed_rules)
+        else
+          rule.parsed_rules = make_seq(*(first_seq(rule).members + first_seq(child).members))
+        end
+
+        rule.children = child.children
+      end
+
+      flatten_rules(rule)
+    end
+
+    def bubble_subject(root)
+      root.children.each do |child|
+        bubble_subject(child) if child.is_a?(Tree::RuleNode) || child.is_a?(Tree::DirectiveNode)
+        next unless child.is_a?(Tree::RuleNode) && !child.children.empty?
+        next unless child.children.all? do |c|
+          next unless c.is_a?(Tree::RuleNode)
+          first_simple_sel(c).is_a?(Sass::Selector::Parent) && first_sseq(c).subject?
+        end
+        first_sseq(child).subject = true
+        child.children.each {|c| first_sseq(c).subject = false}
+      end
+    end
+
+    # Transform
+    #
+    #     foo
+    #       bar
+    #         color: blue
+    #       baz
+    #         color: blue
+    #
+    # into
+    #
+    #     foo
+    #       bar, baz
+    #         color: blue
+    #
+    # @param root [Tree::Node] The parent node
+    def fold_commas(root)
+      prev_rule = nil
+      root.children.map! do |child|
+        unless child.is_a?(Tree::RuleNode)
+          fold_commas(child) if child.is_a?(Tree::DirectiveNode)
+          next child
+        end
+
+        if prev_rule && prev_rule.children.map {|c| c.to_sass} == child.children.map {|c| c.to_sass}
+          prev_rule.parsed_rules.members << first_seq(child)
+          next nil
+        end
+
+        fold_commas(child)
+        prev_rule = child
+        child
+      end
+      root.children.compact!
+    end
+
+    # Dump all the parsed {Sass::Tree::RuleNode} selectors to strings.
+    #
+    # @param root [Tree::Node] The parent node
+    def dump_selectors(root)
+      root.children.each do |child|
+        next dump_selectors(child) if child.is_a?(Tree::DirectiveNode)
+        next unless child.is_a?(Tree::RuleNode)
+        child.rule = [child.parsed_rules.to_s]
+        dump_selectors(child)
+      end
+    end
+
+    # Create a {Sass::Selector::CommaSequence}.
+    #
+    # @param seqs [Array<Sass::Selector::Sequence>]
+    # @return [Sass::Selector::CommaSequence]
+    def make_cseq(*seqs)
+      Sass::Selector::CommaSequence.new(seqs)
+    end
+
+    # Create a {Sass::Selector::CommaSequence} containing only a single
+    # {Sass::Selector::Sequence}.
+    #
+    # @param sseqs [Array<Sass::Selector::Sequence, String>]
+    # @return [Sass::Selector::CommaSequence]
+    def make_seq(*sseqs)
+      make_cseq(Sass::Selector::Sequence.new(sseqs))
+    end
+
+    # Create a {Sass::Selector::CommaSequence} containing only a single
+    # {Sass::Selector::Sequence} which in turn contains only a single
+    # {Sass::Selector::SimpleSequence}.
+    #
+    # @param subject [Boolean] Whether this is a subject selector
+    # @param sseqs [Array<Sass::Selector::Sequence, String>]
+    # @return [Sass::Selector::CommaSequence]
+    def make_sseq(subject, *sseqs)
+      make_seq(Sass::Selector::SimpleSequence.new(sseqs, subject))
+    end
+
+    # Return the first {Sass::Selector::Sequence} in a {Sass::Tree::RuleNode}.
+    #
+    # @param rule [Sass::Tree::RuleNode]
+    # @return [Sass::Selector::Sequence]
+    def first_seq(rule)
+      rule.parsed_rules.members.first
+    end
+
+    # Return the first {Sass::Selector::SimpleSequence} in a
+    # {Sass::Tree::RuleNode}.
+    #
+    # @param rule [Sass::Tree::RuleNode]
+    # @return [Sass::Selector::SimpleSequence, String]
+    def first_sseq(rule)
+      first_seq(rule).members.first
+    end
+
+    # Return the first {Sass::Selector::Simple} in a {Sass::Tree::RuleNode},
+    # unless the rule begins with a combinator.
+    #
+    # @param rule [Sass::Tree::RuleNode]
+    # @return [Sass::Selector::Simple?]
+    def first_simple_sel(rule)
+      sseq = first_sseq(rule)
+      return unless sseq.is_a?(Sass::Selector::SimpleSequence)
+      sseq.members.first
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/deprecation.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/deprecation.rb
new file mode 100644
index 0000000..16ccaca
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/deprecation.rb
@@ -0,0 +1,55 @@
+module Sass
+  # A deprecation warning that should only be printed once for a given line in a
+  # given file.
+  #
+  # A global Deprecation instance should be created for each type of deprecation
+  # warning, and `warn` should be called each time a warning is needed.
+  class Deprecation
+    @@allow_double_warnings = false
+
+    # Runs a block in which double deprecation warnings for the same location
+    # are allowed.
+    def self.allow_double_warnings
+      old_allow_double_warnings = @@allow_double_warnings
+      @@allow_double_warnings = true
+      yield
+    ensure
+      @@allow_double_warnings = old_allow_double_warnings
+    end
+
+    def initialize
+      # A set of filename, line pairs for which warnings have been emitted.
+      @seen = Set.new
+    end
+
+    # Prints `message` as a deprecation warning associated with `filename`,
+    # `line`, and optionally `column`.
+    #
+    # This ensures that only one message will be printed for each line of a
+    # given file.
+    #
+    # @overload warn(filename, line, message)
+    #   @param filename [String, nil]
+    #   @param line [Number]
+    #   @param message [String]
+    # @overload warn(filename, line, column, message)
+    #   @param filename [String, nil]
+    #   @param line [Number]
+    #   @param column [Number]
+    #   @param message [String]
+    def warn(filename, line, column_or_message, message = nil)
+      return if !@@allow_double_warnings && @seen.add?([filename, line]).nil?
+      if message
+        column = column_or_message
+      else
+        message = column_or_message
+      end
+
+      location = "line #{line}"
+      location << ", column #{column}" if column
+      location << " of #{filename}" if filename
+
+      Sass::Util.sass_warn("DEPRECATION WARNING on #{location}:\n#{message}")
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/engine.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/engine.rb
new file mode 100644
index 0000000..30504b5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/engine.rb
@@ -0,0 +1,1244 @@
+require 'set'
+require 'digest/sha1'
+require 'sass/cache_stores'
+require 'sass/deprecation'
+require 'sass/source/position'
+require 'sass/source/range'
+require 'sass/source/map'
+require 'sass/tree/node'
+require 'sass/tree/root_node'
+require 'sass/tree/rule_node'
+require 'sass/tree/comment_node'
+require 'sass/tree/prop_node'
+require 'sass/tree/directive_node'
+require 'sass/tree/media_node'
+require 'sass/tree/supports_node'
+require 'sass/tree/css_import_node'
+require 'sass/tree/variable_node'
+require 'sass/tree/mixin_def_node'
+require 'sass/tree/mixin_node'
+require 'sass/tree/trace_node'
+require 'sass/tree/content_node'
+require 'sass/tree/function_node'
+require 'sass/tree/return_node'
+require 'sass/tree/extend_node'
+require 'sass/tree/if_node'
+require 'sass/tree/while_node'
+require 'sass/tree/for_node'
+require 'sass/tree/each_node'
+require 'sass/tree/debug_node'
+require 'sass/tree/warn_node'
+require 'sass/tree/import_node'
+require 'sass/tree/charset_node'
+require 'sass/tree/at_root_node'
+require 'sass/tree/keyframe_rule_node'
+require 'sass/tree/error_node'
+require 'sass/tree/visitors/base'
+require 'sass/tree/visitors/perform'
+require 'sass/tree/visitors/cssize'
+require 'sass/tree/visitors/extend'
+require 'sass/tree/visitors/convert'
+require 'sass/tree/visitors/to_css'
+require 'sass/tree/visitors/deep_copy'
+require 'sass/tree/visitors/set_options'
+require 'sass/tree/visitors/check_nesting'
+require 'sass/selector'
+require 'sass/environment'
+require 'sass/script'
+require 'sass/scss'
+require 'sass/stack'
+require 'sass/error'
+require 'sass/importers'
+require 'sass/shared'
+require 'sass/media'
+require 'sass/supports'
+
+module Sass
+  # A Sass mixin or function.
+  #
+  # `name`: `String`
+  # : The name of the mixin/function.
+  #
+  # `args`: `Array<(Script::Tree::Node, Script::Tree::Node)>`
+  # : The arguments for the mixin/function.
+  #   Each element is a tuple containing the variable node of the argument
+  #   and the parse tree for the default value of the argument.
+  #
+  # `splat`: `Script::Tree::Node?`
+  # : The variable node of the splat argument for this callable, or null.
+  #
+  # `environment`: {Sass::Environment}
+  # : The environment in which the mixin/function was defined.
+  #   This is captured so that the mixin/function can have access
+  #   to local variables defined in its scope.
+  #
+  # `tree`: `Array<Tree::Node>`
+  # : The parse tree for the mixin/function.
+  #
+  # `has_content`: `Boolean`
+  # : Whether the callable accepts a content block.
+  #
+  # `type`: `String`
+  # : The user-friendly name of the type of the callable.
+  #
+  # `origin`: `Symbol`
+  # : From whence comes the callable: `:stylesheet`, `:builtin`, `:css`
+  #   A callable with an origin of `:stylesheet` was defined in the stylesheet itself.
+  #   A callable with an origin of `:builtin` was defined in ruby.
+  #   A callable (function) with an origin of `:css` returns a function call with arguments to CSS.
+  Callable = Struct.new(:name, :args, :splat, :environment, :tree, :has_content, :type, :origin)
+
+  # This class handles the parsing and compilation of the Sass template.
+  # Example usage:
+  #
+  #     template = File.read('stylesheets/sassy.sass')
+  #     sass_engine = Sass::Engine.new(template)
+  #     output = sass_engine.render
+  #     puts output
+  class Engine
+    @@old_property_deprecation = Deprecation.new
+
+    # A line of Sass code.
+    #
+    # `text`: `String`
+    # : The text in the line, without any whitespace at the beginning or end.
+    #
+    # `tabs`: `Integer`
+    # : The level of indentation of the line.
+    #
+    # `index`: `Integer`
+    # : The line number in the original document.
+    #
+    # `offset`: `Integer`
+    # : The number of bytes in on the line that the text begins.
+    #   This ends up being the number of bytes of leading whitespace.
+    #
+    # `filename`: `String`
+    # : The name of the file in which this line appeared.
+    #
+    # `children`: `Array<Line>`
+    # : The lines nested below this one.
+    #
+    # `comment_tab_str`: `String?`
+    # : The prefix indentation for this comment, if it is a comment.
+    class Line < Struct.new(:text, :tabs, :index, :offset, :filename, :children, :comment_tab_str)
+      def comment?
+        text[0] == COMMENT_CHAR && (text[1] == SASS_COMMENT_CHAR || text[1] == CSS_COMMENT_CHAR)
+      end
+    end
+
+    # The character that begins a CSS property.
+    PROPERTY_CHAR  = ?:
+
+    # The character that designates the beginning of a comment,
+    # either Sass or CSS.
+    COMMENT_CHAR = ?/
+
+    # The character that follows the general COMMENT_CHAR and designates a Sass comment,
+    # which is not output as a CSS comment.
+    SASS_COMMENT_CHAR = ?/
+
+    # The character that indicates that a comment allows interpolation
+    # and should be preserved even in `:compressed` mode.
+    SASS_LOUD_COMMENT_CHAR = ?!
+
+    # The character that follows the general COMMENT_CHAR and designates a CSS comment,
+    # which is embedded in the CSS document.
+    CSS_COMMENT_CHAR = ?*
+
+    # The character used to denote a compiler directive.
+    DIRECTIVE_CHAR = ?@
+
+    # Designates a non-parsed rule.
+    ESCAPE_CHAR    = ?\\
+
+    # Designates block as mixin definition rather than CSS rules to output
+    MIXIN_DEFINITION_CHAR = ?=
+
+    # Includes named mixin declared using MIXIN_DEFINITION_CHAR
+    MIXIN_INCLUDE_CHAR    = ?+
+
+    # The regex that matches and extracts data from
+    # properties of the form `:name prop`.
+    PROPERTY_OLD = /^:([^\s=:"]+)\s*(?:\s+|$)(.*)/
+
+    # The default options for Sass::Engine.
+    # @api public
+    DEFAULT_OPTIONS = {
+      :style => :nested,
+      :load_paths => [],
+      :cache => true,
+      :cache_location => './.sass-cache',
+      :syntax => :sass,
+      :filesystem_importer => Sass::Importers::Filesystem
+    }.freeze
+
+    # Converts a Sass options hash into a standard form, filling in
+    # default values and resolving aliases.
+    #
+    # @param options [{Symbol => Object}] The options hash;
+    #   see {file:SASS_REFERENCE.md#Options the Sass options documentation}
+    # @return [{Symbol => Object}] The normalized options hash.
+    # @private
+    def self.normalize_options(options)
+      options = DEFAULT_OPTIONS.merge(options.reject {|_k, v| v.nil?})
+
+      # If the `:filename` option is passed in without an importer,
+      # assume it's using the default filesystem importer.
+      options[:importer] ||= options[:filesystem_importer].new(".") if options[:filename]
+
+      # Tracks the original filename of the top-level Sass file
+      options[:original_filename] ||= options[:filename]
+
+      options[:cache_store] ||= Sass::CacheStores::Chain.new(
+        Sass::CacheStores::Memory.new, Sass::CacheStores::Filesystem.new(options[:cache_location]))
+      # Support both, because the docs said one and the other actually worked
+      # for quite a long time.
+      options[:line_comments] ||= options[:line_numbers]
+
+      options[:load_paths] = (options[:load_paths] + Sass.load_paths).map do |p|
+        next p unless p.is_a?(String) || (defined?(Pathname) && p.is_a?(Pathname))
+        options[:filesystem_importer].new(p.to_s)
+      end
+
+      # Remove any deprecated importers if the location is imported explicitly
+      options[:load_paths].reject! do |importer|
+        importer.is_a?(Sass::Importers::DeprecatedPath) &&
+          options[:load_paths].find do |other_importer|
+            other_importer.is_a?(Sass::Importers::Filesystem) &&
+              other_importer != importer &&
+              other_importer.root == importer.root
+          end
+      end
+
+      # Backwards compatibility
+      options[:property_syntax] ||= options[:attribute_syntax]
+      case options[:property_syntax]
+      when :alternate; options[:property_syntax] = :new
+      when :normal; options[:property_syntax] = :old
+      end
+      options[:sourcemap] = :auto if options[:sourcemap] == true
+      options[:sourcemap] = :none if options[:sourcemap] == false
+
+      options
+    end
+
+    # Returns the {Sass::Engine} for the given file.
+    # This is preferable to Sass::Engine.new when reading from a file
+    # because it properly sets up the Engine's metadata,
+    # enables parse-tree caching,
+    # and infers the syntax from the filename.
+    #
+    # @param filename [String] The path to the Sass or SCSS file
+    # @param options [{Symbol => Object}] The options hash;
+    #   See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
+    # @return [Sass::Engine] The Engine for the given Sass or SCSS file.
+    # @raise [Sass::SyntaxError] if there's an error in the document.
+    def self.for_file(filename, options)
+      had_syntax = options[:syntax]
+
+      if had_syntax
+        # Use what was explicitly specified
+      elsif filename =~ /\.scss$/
+        options.merge!(:syntax => :scss)
+      elsif filename =~ /\.sass$/
+        options.merge!(:syntax => :sass)
+      end
+
+      Sass::Engine.new(File.read(filename), options.merge(:filename => filename))
+    end
+
+    # The options for the Sass engine.
+    # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
+    #
+    # @return [{Symbol => Object}]
+    attr_reader :options
+
+    # Creates a new Engine. Note that Engine should only be used directly
+    # when compiling in-memory Sass code.
+    # If you're compiling a single Sass file from the filesystem,
+    # use \{Sass::Engine.for\_file}.
+    # If you're compiling multiple files from the filesystem,
+    # use {Sass::Plugin}.
+    #
+    # @param template [String] The Sass template.
+    #   This template can be encoded using any encoding
+    #   that can be converted to Unicode.
+    #   If the template contains an `@charset` declaration,
+    #   that overrides the Ruby encoding
+    #   (see {file:SASS_REFERENCE.md#Encodings the encoding documentation})
+    # @param options [{Symbol => Object}] An options hash.
+    #   See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
+    # @see {Sass::Engine.for_file}
+    # @see {Sass::Plugin}
+    def initialize(template, options = {})
+      @options = self.class.normalize_options(options)
+      @template = template
+      @checked_encoding = false
+      @filename = nil
+      @line = nil
+    end
+
+    # Render the template to CSS.
+    #
+    # @return [String] The CSS
+    # @raise [Sass::SyntaxError] if there's an error in the document
+    # @raise [Encoding::UndefinedConversionError] if the source encoding
+    #   cannot be converted to UTF-8
+    # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
+    def render
+      return _to_tree.render unless @options[:quiet]
+      Sass::Util.silence_sass_warnings {_to_tree.render}
+    end
+
+    # Render the template to CSS and return the source map.
+    #
+    # @param sourcemap_uri [String] The sourcemap URI to use in the
+    #   `@sourceMappingURL` comment. If this is relative, it should be relative
+    #   to the location of the CSS file.
+    # @return [(String, Sass::Source::Map)] The rendered CSS and the associated
+    #   source map
+    # @raise [Sass::SyntaxError] if there's an error in the document, or if the
+    #   public URL for this document couldn't be determined.
+    # @raise [Encoding::UndefinedConversionError] if the source encoding
+    #   cannot be converted to UTF-8
+    # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
+    def render_with_sourcemap(sourcemap_uri)
+      return _render_with_sourcemap(sourcemap_uri) unless @options[:quiet]
+      Sass::Util.silence_sass_warnings {_render_with_sourcemap(sourcemap_uri)}
+    end
+
+    alias_method :to_css, :render
+
+    # Parses the document into its parse tree. Memoized.
+    #
+    # @return [Sass::Tree::Node] The root of the parse tree.
+    # @raise [Sass::SyntaxError] if there's an error in the document
+    def to_tree
+      @tree ||= if @options[:quiet]
+                  Sass::Util.silence_sass_warnings {_to_tree}
+                else
+                  _to_tree
+                end
+    end
+
+    # Returns the original encoding of the document.
+    #
+    # @return [Encoding, nil]
+    # @raise [Encoding::UndefinedConversionError] if the source encoding
+    #   cannot be converted to UTF-8
+    # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
+    def source_encoding
+      check_encoding!
+      @source_encoding
+    end
+
+    # Gets a set of all the documents
+    # that are (transitive) dependencies of this document,
+    # not including the document itself.
+    #
+    # @return [[Sass::Engine]] The dependency documents.
+    def dependencies
+      _dependencies(Set.new, engines = Set.new)
+      Sass::Util.array_minus(engines, [self])
+    end
+
+    # Helper for \{#dependencies}.
+    #
+    # @private
+    def _dependencies(seen, engines)
+      key = [@options[:filename], @options[:importer]]
+      return if seen.include?(key)
+      seen << key
+      engines << self
+      to_tree.grep(Tree::ImportNode) do |n|
+        next if n.css_import?
+        n.imported_file._dependencies(seen, engines)
+      end
+    end
+
+    private
+
+    def _render_with_sourcemap(sourcemap_uri)
+      filename = @options[:filename]
+      importer = @options[:importer]
+      sourcemap_dir = @options[:sourcemap_filename] &&
+        File.dirname(File.expand_path(@options[:sourcemap_filename]))
+      if filename.nil?
+        raise Sass::SyntaxError.new(<<ERR)
+Error generating source map: couldn't determine public URL for the source stylesheet.
+  No filename is available so there's nothing for the source map to link to.
+ERR
+      elsif importer.nil?
+        raise Sass::SyntaxError.new(<<ERR)
+Error generating source map: couldn't determine public URL for "#{filename}".
+  Without a public URL, there's nothing for the source map to link to.
+  An importer was not set for this file.
+ERR
+      elsif Sass::Util.silence_warnings do
+              sourcemap_dir = nil if @options[:sourcemap] == :file
+              importer.public_url(filename, sourcemap_dir).nil?
+            end
+        raise Sass::SyntaxError.new(<<ERR)
+Error generating source map: couldn't determine public URL for "#{filename}".
+  Without a public URL, there's nothing for the source map to link to.
+  Custom importers should define the #public_url method.
+ERR
+      end
+
+      rendered, sourcemap = _to_tree.render_with_sourcemap
+      compressed = @options[:style] == :compressed
+      rendered << "\n" if rendered[-1] != ?\n
+      rendered << "\n" unless compressed
+      rendered << "/*# sourceMappingURL="
+      rendered << URI::DEFAULT_PARSER.escape(sourcemap_uri)
+      rendered << " */\n"
+      return rendered, sourcemap
+    end
+
+    def _to_tree
+      check_encoding!
+
+      if (@options[:cache] || @options[:read_cache]) &&
+          @options[:filename] && @options[:importer]
+        key = sassc_key
+        sha = Digest::SHA1.hexdigest(@template)
+
+        if (root = @options[:cache_store].retrieve(key, sha))
+          root.options = @options
+          return root
+        end
+      end
+
+      if @options[:syntax] == :scss
+        root = Sass::SCSS::Parser.new(@template, @options[:filename], @options[:importer]).parse
+      else
+        root = Tree::RootNode.new(@template)
+        append_children(root, tree(tabulate(@template)).first, true)
+      end
+
+      root.options = @options
+      if @options[:cache] && key && sha
+        begin
+          old_options = root.options
+          root.options = {}
+          @options[:cache_store].store(key, sha, root)
+        ensure
+          root.options = old_options
+        end
+      end
+      root
+    rescue SyntaxError => e
+      e.modify_backtrace(:filename => @options[:filename], :line => @line)
+      e.sass_template = @template
+      raise e
+    end
+
+    def sassc_key
+      @options[:cache_store].key(*@options[:importer].key(@options[:filename], @options))
+    end
+
+    def check_encoding!
+      return if @checked_encoding
+      @checked_encoding = true
+      @template, @source_encoding = Sass::Util.check_sass_encoding(@template)
+    end
+
+    def tabulate(string)
+      tab_str = nil
+      comment_tab_str = nil
+      first = true
+      lines = []
+      string.scan(/^[^\n]*?$/).each_with_index do |line, index|
+        index += (@options[:line] || 1)
+        if line.strip.empty?
+          lines.last.text << "\n" if lines.last && lines.last.comment?
+          next
+        end
+
+        line_tab_str = line[/^\s*/]
+        unless line_tab_str.empty?
+          if tab_str.nil?
+            comment_tab_str ||= line_tab_str
+            next if try_comment(line, lines.last, "", comment_tab_str, index)
+            comment_tab_str = nil
+          end
+
+          tab_str ||= line_tab_str
+
+          raise SyntaxError.new("Indenting at the beginning of the document is illegal.",
+            :line => index) if first
+
+          raise SyntaxError.new("Indentation can't use both tabs and spaces.",
+            :line => index) if tab_str.include?(?\s) && tab_str.include?(?\t)
+        end
+        first &&= !tab_str.nil?
+        if tab_str.nil?
+          lines << Line.new(line.strip, 0, index, 0, @options[:filename], [])
+          next
+        end
+
+        comment_tab_str ||= line_tab_str
+        if try_comment(line, lines.last, tab_str * lines.last.tabs, comment_tab_str, index)
+          next
+        else
+          comment_tab_str = nil
+        end
+
+        line_tabs = line_tab_str.scan(tab_str).size
+        if tab_str * line_tabs != line_tab_str
+          message = <<END.strip.tr("\n", ' ')
+Inconsistent indentation: #{Sass::Shared.human_indentation line_tab_str, true} used for indentation,
+but the rest of the document was indented using #{Sass::Shared.human_indentation tab_str}.
+END
+          raise SyntaxError.new(message, :line => index)
+        end
+
+        lines << Line.new(line.strip, line_tabs, index, line_tab_str.size, @options[:filename], [])
+      end
+      lines
+    end
+
+    # @comment
+    def try_comment(line, last, tab_str, comment_tab_str, index)
+      return unless last && last.comment?
+      # Nested comment stuff must be at least one whitespace char deeper
+      # than the normal indentation
+      return unless line =~ /^#{tab_str}\s/
+      unless line =~ /^(?:#{comment_tab_str})(.*)$/
+        raise SyntaxError.new(<<MSG.strip.tr("\n", " "), :line => index)
+Inconsistent indentation:
+previous line was indented by #{Sass::Shared.human_indentation comment_tab_str},
+but this line was indented by #{Sass::Shared.human_indentation line[/^\s*/]}.
+MSG
+      end
+
+      last.comment_tab_str ||= comment_tab_str
+      last.text << "\n" << line
+      true
+    end
+
+    def tree(arr, i = 0)
+      return [], i if arr[i].nil?
+
+      base = arr[i].tabs
+      nodes = []
+      while (line = arr[i]) && line.tabs >= base
+        if line.tabs > base
+          nodes.last.children, i = tree(arr, i)
+        else
+          nodes << line
+          i += 1
+        end
+      end
+      return nodes, i
+    end
+
+    def build_tree(parent, line, root = false)
+      @line = line.index
+      @offset = line.offset
+      node_or_nodes = parse_line(parent, line, root)
+
+      Array(node_or_nodes).each do |node|
+        # Node is a symbol if it's non-outputting, like a variable assignment
+        next unless node.is_a? Tree::Node
+
+        node.line = line.index
+        node.filename = line.filename
+
+        append_children(node, line.children, false)
+      end
+
+      node_or_nodes
+    end
+
+    def append_children(parent, children, root)
+      continued_rule = nil
+      continued_comment = nil
+      children.each do |line|
+        child = build_tree(parent, line, root)
+
+        if child.is_a?(Tree::RuleNode)
+          if child.continued? && child.children.empty?
+            if continued_rule
+              continued_rule.add_rules child
+            else
+              continued_rule = child
+            end
+            next
+          elsif continued_rule
+            continued_rule.add_rules child
+            continued_rule.children = child.children
+            continued_rule, child = nil, continued_rule
+          end
+        elsif continued_rule
+          continued_rule = nil
+        end
+
+        if child.is_a?(Tree::CommentNode) && child.type == :silent
+          if continued_comment &&
+              child.line == continued_comment.line +
+              continued_comment.lines + 1
+            continued_comment.value.last.sub!(%r{ \*/\Z}, '')
+            child.value.first.gsub!(%r{\A/\*}, ' *')
+            continued_comment.value += ["\n"] + child.value
+            next
+          end
+
+          continued_comment = child
+        end
+
+        check_for_no_children(child)
+        validate_and_append_child(parent, child, line, root)
+      end
+
+      parent
+    end
+
+    def validate_and_append_child(parent, child, line, root)
+      case child
+      when Array
+        child.each {|c| validate_and_append_child(parent, c, line, root)}
+      when Tree::Node
+        parent << child
+      end
+    end
+
+    def check_for_no_children(node)
+      return unless node.is_a?(Tree::RuleNode) && node.children.empty?
+      Sass::Util.sass_warn(<<WARNING.strip)
+WARNING on line #{node.line}#{" of #{node.filename}" if node.filename}:
+This selector doesn't have any properties and will not be rendered.
+WARNING
+    end
+
+    def parse_line(parent, line, root)
+      case line.text[0]
+      when PROPERTY_CHAR
+        if line.text[1] == PROPERTY_CHAR ||
+            (@options[:property_syntax] == :new &&
+             line.text =~ PROPERTY_OLD && $2.empty?)
+          # Support CSS3-style pseudo-elements,
+          # which begin with ::,
+          # as well as pseudo-classes
+          # if we're using the new property syntax
+          Tree::RuleNode.new(parse_interp(line.text), full_line_range(line))
+        else
+          name_start_offset = line.offset + 1 # +1 for the leading ':'
+          name, value = line.text.scan(PROPERTY_OLD)[0]
+          raise SyntaxError.new("Invalid property: \"#{line.text}\".",
+            :line => @line) if name.nil? || value.nil?
+
+          @@old_property_deprecation.warn(@options[:filename], @line, <<WARNING)
+Old-style properties like "#{line.text}" are deprecated and will be an error in future versions of Sass.
+Use "#{name}: #{value}" instead.
+WARNING
+
+          value_start_offset = name_end_offset = name_start_offset + name.length
+          unless value.empty?
+            # +1 and -1 both compensate for the leading ':', which is part of line.text
+            value_start_offset = name_start_offset + line.text.index(value, name.length + 1) - 1
+          end
+
+          property = parse_property(name, parse_interp(name), value, :old, line, value_start_offset)
+          property.name_source_range = Sass::Source::Range.new(
+            Sass::Source::Position.new(@line, to_parser_offset(name_start_offset)),
+            Sass::Source::Position.new(@line, to_parser_offset(name_end_offset)),
+            @options[:filename], @options[:importer])
+          property
+        end
+      when ?$
+        parse_variable(line)
+      when COMMENT_CHAR
+        parse_comment(line)
+      when DIRECTIVE_CHAR
+        parse_directive(parent, line, root)
+      when ESCAPE_CHAR
+        Tree::RuleNode.new(parse_interp(line.text[1..-1]), full_line_range(line))
+      when MIXIN_DEFINITION_CHAR
+        parse_mixin_definition(line)
+      when MIXIN_INCLUDE_CHAR
+        if line.text[1].nil? || line.text[1] == ?\s
+          Tree::RuleNode.new(parse_interp(line.text), full_line_range(line))
+        else
+          parse_mixin_include(line, root)
+        end
+      else
+        parse_property_or_rule(line)
+      end
+    end
+
+    def parse_property_or_rule(line)
+      scanner = Sass::Util::MultibyteStringScanner.new(line.text)
+      hack_char = scanner.scan(/[:\*\.]|\#(?!\{)/)
+      offset = line.offset
+      offset += hack_char.length if hack_char
+      parser = Sass::SCSS::Parser.new(scanner,
+        @options[:filename], @options[:importer],
+        @line, to_parser_offset(offset))
+
+      unless (res = parser.parse_interp_ident)
+        parsed = parse_interp(line.text, line.offset)
+        return Tree::RuleNode.new(parsed, full_line_range(line))
+      end
+
+      ident_range = Sass::Source::Range.new(
+        Sass::Source::Position.new(@line, to_parser_offset(line.offset)),
+        Sass::Source::Position.new(@line, parser.offset),
+        @options[:filename], @options[:importer])
+      offset = parser.offset - 1
+      res.unshift(hack_char) if hack_char
+
+      # Handle comments after a property name but before the colon.
+      if (comment = scanner.scan(Sass::SCSS::RX::COMMENT))
+        res << comment
+        offset += comment.length
+      end
+
+      name = line.text[0...scanner.pos]
+      could_be_property =
+        if name.start_with?('--')
+          (scanned = scanner.scan(/\s*:/))
+        else
+          (scanned = scanner.scan(/\s*:(?:\s+|$)/))
+        end
+
+      if could_be_property # test for a property
+        offset += scanned.length
+        property = parse_property(name, res, scanner.rest, :new, line, offset)
+        property.name_source_range = ident_range
+        property
+      else
+        res.pop if comment
+
+        if (trailing = (scanner.scan(/\s*#{Sass::SCSS::RX::COMMENT}/) ||
+                        scanner.scan(/\s*#{Sass::SCSS::RX::SINGLE_LINE_COMMENT}/)))
+          trailing.strip!
+        end
+        interp_parsed = parse_interp(scanner.rest)
+        selector_range = Sass::Source::Range.new(
+          ident_range.start_pos,
+          Sass::Source::Position.new(@line, to_parser_offset(line.offset) + line.text.length),
+          @options[:filename], @options[:importer])
+        rule = Tree::RuleNode.new(res + interp_parsed, selector_range)
+        rule << Tree::CommentNode.new([trailing], :silent) if trailing
+        rule
+      end
+    end
+
+    # @comment
+    #   rubocop:disable ParameterLists
+    def parse_property(name, parsed_name, value, prop, line, start_offset)
+      # rubocop:enable ParameterLists
+
+      if name.start_with?('--')
+        unless line.children.empty?
+          raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath custom properties.",
+            :line => @line + 1)
+        end
+
+        parser = Sass::SCSS::Parser.new(value,
+          @options[:filename], @options[:importer],
+          @line, to_parser_offset(@offset))
+        parsed_value = parser.parse_declaration_value
+        end_offset = start_offset + value.length
+      elsif value.strip.empty?
+        parsed_value = [Sass::Script::Tree::Literal.new(Sass::Script::Value::String.new(""))]
+        end_offset = start_offset
+      else
+        expr = parse_script(value, :offset => to_parser_offset(start_offset))
+        end_offset = expr.source_range.end_pos.offset - 1
+        parsed_value = [expr]
+      end
+      node = Tree::PropNode.new(parse_interp(name), parsed_value, prop)
+      node.value_source_range = Sass::Source::Range.new(
+        Sass::Source::Position.new(line.index, to_parser_offset(start_offset)),
+        Sass::Source::Position.new(line.index, to_parser_offset(end_offset)),
+        @options[:filename], @options[:importer])
+      if !node.custom_property? && value.strip.empty? && line.children.empty?
+        raise SyntaxError.new(
+          "Invalid property: \"#{node.declaration}\" (no value)." +
+          node.pseudo_class_selector_message)
+      end
+
+      node
+    end
+
+    def parse_variable(line)
+      name, value, flags = line.text.scan(Script::MATCH)[0]
+      raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath variable declarations.",
+        :line => @line + 1) unless line.children.empty?
+      raise SyntaxError.new("Invalid variable: \"#{line.text}\".",
+        :line => @line) unless name && value
+      flags = flags ? flags.split(/\s+/) : []
+      if (invalid_flag = flags.find {|f| f != '!default' && f != '!global'})
+        raise SyntaxError.new("Invalid flag \"#{invalid_flag}\".", :line => @line)
+      end
+
+      # This workaround is needed for the case when the variable value is part of the identifier,
+      # otherwise we end up with the offset equal to the value index inside the name:
+      # $red_color: red;
+      var_lhs_length = 1 + name.length # 1 stands for '$'
+      index = line.text.index(value, line.offset + var_lhs_length) || 0
+      expr = parse_script(value, :offset => to_parser_offset(line.offset + index))
+
+      Tree::VariableNode.new(name, expr, flags.include?('!default'), flags.include?('!global'))
+    end
+
+    def parse_comment(line)
+      if line.text[1] == CSS_COMMENT_CHAR || line.text[1] == SASS_COMMENT_CHAR
+        silent = line.text[1] == SASS_COMMENT_CHAR
+        loud = !silent && line.text[2] == SASS_LOUD_COMMENT_CHAR
+        if silent
+          value = [line.text]
+        else
+          value = self.class.parse_interp(
+            line.text, line.index, to_parser_offset(line.offset), :filename => @filename)
+        end
+        value = Sass::Util.with_extracted_values(value) do |str|
+          str = str.gsub(/^#{line.comment_tab_str}/m, '')[2..-1] # get rid of // or /*
+          format_comment_text(str, silent)
+        end
+        type = if silent
+                 :silent
+               elsif loud
+                 :loud
+               else
+                 :normal
+               end
+        comment = Tree::CommentNode.new(value, type)
+        comment.line = line.index
+        text = line.text.rstrip
+        if text.include?("\n")
+          end_offset = text.length - text.rindex("\n")
+        else
+          end_offset = to_parser_offset(line.offset + text.length)
+        end
+        comment.source_range = Sass::Source::Range.new(
+          Sass::Source::Position.new(@line, to_parser_offset(line.offset)),
+          Sass::Source::Position.new(@line + text.count("\n"), end_offset),
+          @options[:filename])
+        comment
+      else
+        Tree::RuleNode.new(parse_interp(line.text), full_line_range(line))
+      end
+    end
+
+    DIRECTIVES = Set[:mixin, :include, :function, :return, :debug, :warn, :for,
+      :each, :while, :if, :else, :extend, :import, :media, :charset, :content,
+      :at_root, :error]
+
+    def parse_directive(parent, line, root)
+      directive, whitespace, value = line.text[1..-1].split(/(\s+)/, 2)
+      raise SyntaxError.new("Invalid directive: '@'.") unless directive
+      offset = directive.size + whitespace.size + 1 if whitespace
+
+      directive_name = directive.tr('-', '_').to_sym
+      if DIRECTIVES.include?(directive_name)
+        return send("parse_#{directive_name}_directive", parent, line, root, value, offset)
+      end
+
+      unprefixed_directive = directive.gsub(/^-[a-z0-9]+-/i, '')
+      if unprefixed_directive == 'supports'
+        parser = Sass::SCSS::Parser.new(value, @options[:filename], @line)
+        return Tree::SupportsNode.new(directive, parser.parse_supports_condition)
+      end
+
+      Tree::DirectiveNode.new(
+        value.nil? ? ["@#{directive}"] : ["@#{directive} "] + parse_interp(value, offset))
+    end
+
+    def parse_while_directive(parent, line, root, value, offset)
+      raise SyntaxError.new("Invalid while directive '@while': expected expression.") unless value
+      Tree::WhileNode.new(parse_script(value, :offset => offset))
+    end
+
+    def parse_if_directive(parent, line, root, value, offset)
+      raise SyntaxError.new("Invalid if directive '@if': expected expression.") unless value
+      Tree::IfNode.new(parse_script(value, :offset => offset))
+    end
+
+    def parse_debug_directive(parent, line, root, value, offset)
+      raise SyntaxError.new("Invalid debug directive '@debug': expected expression.") unless value
+      raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath debug directives.",
+        :line => @line + 1) unless line.children.empty?
+      offset = line.offset + line.text.index(value).to_i
+      Tree::DebugNode.new(parse_script(value, :offset => offset))
+    end
+
+    def parse_error_directive(parent, line, root, value, offset)
+      raise SyntaxError.new("Invalid error directive '@error': expected expression.") unless value
+      raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath error directives.",
+        :line => @line + 1) unless line.children.empty?
+      offset = line.offset + line.text.index(value).to_i
+      Tree::ErrorNode.new(parse_script(value, :offset => offset))
+    end
+
+    def parse_extend_directive(parent, line, root, value, offset)
+      raise SyntaxError.new("Invalid extend directive '@extend': expected expression.") unless value
+      raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath extend directives.",
+        :line => @line + 1) unless line.children.empty?
+      optional = !!value.gsub!(/\s+#{Sass::SCSS::RX::OPTIONAL}$/, '')
+      offset = line.offset + line.text.index(value).to_i
+      interp_parsed = parse_interp(value, offset)
+      selector_range = Sass::Source::Range.new(
+        Sass::Source::Position.new(@line, to_parser_offset(offset)),
+        Sass::Source::Position.new(@line, to_parser_offset(line.offset) + line.text.length),
+        @options[:filename], @options[:importer]
+      )
+      Tree::ExtendNode.new(interp_parsed, optional, selector_range)
+    end
+
+    def parse_warn_directive(parent, line, root, value, offset)
+      raise SyntaxError.new("Invalid warn directive '@warn': expected expression.") unless value
+      raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath warn directives.",
+        :line => @line + 1) unless line.children.empty?
+      offset = line.offset + line.text.index(value).to_i
+      Tree::WarnNode.new(parse_script(value, :offset => offset))
+    end
+
+    def parse_return_directive(parent, line, root, value, offset)
+      raise SyntaxError.new("Invalid @return: expected expression.") unless value
+      raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath return directives.",
+        :line => @line + 1) unless line.children.empty?
+      offset = line.offset + line.text.index(value).to_i
+      Tree::ReturnNode.new(parse_script(value, :offset => offset))
+    end
+
+    def parse_charset_directive(parent, line, root, value, offset)
+      name = value && value[/\A(["'])(.*)\1\Z/, 2] # "
+      raise SyntaxError.new("Invalid charset directive '@charset': expected string.") unless name
+      raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath charset directives.",
+        :line => @line + 1) unless line.children.empty?
+      Tree::CharsetNode.new(name)
+    end
+
+    def parse_media_directive(parent, line, root, value, offset)
+      parser = Sass::SCSS::Parser.new(value,
+        @options[:filename], @options[:importer],
+        @line, to_parser_offset(@offset))
+      offset = line.offset + line.text.index('media').to_i - 1
+      parsed_media_query_list = parser.parse_media_query_list.to_a
+      node = Tree::MediaNode.new(parsed_media_query_list)
+      node.source_range = Sass::Source::Range.new(
+        Sass::Source::Position.new(@line, to_parser_offset(offset)),
+        Sass::Source::Position.new(@line, to_parser_offset(line.offset) + line.text.length),
+        @options[:filename], @options[:importer])
+      node
+    end
+
+    def parse_at_root_directive(parent, line, root, value, offset)
+      return Sass::Tree::AtRootNode.new unless value
+
+      if value.start_with?('(')
+        parser = Sass::SCSS::Parser.new(value,
+          @options[:filename], @options[:importer],
+          @line, to_parser_offset(@offset))
+        offset = line.offset + line.text.index('at-root').to_i - 1
+        return Tree::AtRootNode.new(parser.parse_at_root_query)
+      end
+
+      at_root_node = Tree::AtRootNode.new
+      parsed = parse_interp(value, offset)
+      rule_node = Tree::RuleNode.new(parsed, full_line_range(line))
+
+      # The caller expects to automatically add children to the returned node
+      # and we want it to add children to the rule node instead, so we
+      # manually handle the wiring here and return nil so the caller doesn't
+      # duplicate our efforts.
+      append_children(rule_node, line.children, false)
+      at_root_node << rule_node
+      parent << at_root_node
+      nil
+    end
+
+    def parse_for_directive(parent, line, root, value, offset)
+      var, from_expr, to_name, to_expr =
+        value.scan(/^([^\s]+)\s+from\s+(.+)\s+(to|through)\s+(.+)$/).first
+
+      if var.nil? # scan failed, try to figure out why for error message
+        if value !~ /^[^\s]+/
+          expected = "variable name"
+        elsif value !~ /^[^\s]+\s+from\s+.+/
+          expected = "'from <expr>'"
+        else
+          expected = "'to <expr>' or 'through <expr>'"
+        end
+        raise SyntaxError.new("Invalid for directive '@for #{value}': expected #{expected}.")
+      end
+      raise SyntaxError.new("Invalid variable \"#{var}\".") unless var =~ Script::VALIDATE
+
+      var = var[1..-1]
+      parsed_from = parse_script(from_expr, :offset => line.offset + line.text.index(from_expr))
+      parsed_to = parse_script(to_expr, :offset => line.offset + line.text.index(to_expr))
+      Tree::ForNode.new(var, parsed_from, parsed_to, to_name == 'to')
+    end
+
+    def parse_each_directive(parent, line, root, value, offset)
+      vars, list_expr = value.scan(/^([^\s]+(?:\s*,\s*[^\s]+)*)\s+in\s+(.+)$/).first
+
+      if vars.nil? # scan failed, try to figure out why for error message
+        if value !~ /^[^\s]+/
+          expected = "variable name"
+        elsif value !~ /^[^\s]+(?:\s*,\s*[^\s]+)*[^\s]+\s+from\s+.+/
+          expected = "'in <expr>'"
+        end
+        raise SyntaxError.new("Invalid each directive '@each #{value}': expected #{expected}.")
+      end
+
+      vars = vars.split(',').map do |var|
+        var.strip!
+        raise SyntaxError.new("Invalid variable \"#{var}\".") unless var =~ Script::VALIDATE
+        var[1..-1]
+      end
+
+      parsed_list = parse_script(list_expr, :offset => line.offset + line.text.index(list_expr))
+      Tree::EachNode.new(vars, parsed_list)
+    end
+
+    def parse_else_directive(parent, line, root, value, offset)
+      previous = parent.children.last
+      raise SyntaxError.new("@else must come after @if.") unless previous.is_a?(Tree::IfNode)
+
+      if value
+        if value !~ /^if\s+(.+)/
+          raise SyntaxError.new("Invalid else directive '@else #{value}': expected 'if <expr>'.")
+        end
+        expr = parse_script($1, :offset => line.offset + line.text.index($1))
+      end
+
+      node = Tree::IfNode.new(expr)
+      append_children(node, line.children, false)
+      previous.add_else node
+      nil
+    end
+
+    def parse_import_directive(parent, line, root, value, offset)
+      raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath import directives.",
+        :line => @line + 1) unless line.children.empty?
+
+      scanner = Sass::Util::MultibyteStringScanner.new(value)
+      values = []
+
+      loop do
+        unless (node = parse_import_arg(scanner, offset + scanner.pos))
+          raise SyntaxError.new(
+            "Invalid @import: expected file to import, was #{scanner.rest.inspect}",
+            :line => @line)
+        end
+        values << node
+        break unless scanner.scan(/,\s*/)
+      end
+
+      if scanner.scan(/;/)
+        raise SyntaxError.new("Invalid @import: expected end of line, was \";\".",
+          :line => @line)
+      end
+
+      values
+    end
+
+    # @comment
+    #   rubocop:disable MethodLength
+    def parse_import_arg(scanner, offset)
+      return if scanner.eos?
+
+      if scanner.match?(/url\(/i)
+        script_parser = Sass::Script::Parser.new(scanner, @line, to_parser_offset(offset), @options)
+        str = script_parser.parse_string
+
+        if scanner.eos?
+          end_pos = str.source_range.end_pos
+          node = Tree::CssImportNode.new(str)
+        else
+          supports_parser = Sass::SCSS::Parser.new(scanner,
+            @options[:filename], @options[:importer],
+            @line, str.source_range.end_pos.offset)
+          supports_condition = supports_parser.parse_supports_clause
+
+          if scanner.eos?
+            node = Tree::CssImportNode.new(str, [], supports_condition)
+          else
+            media_parser = Sass::SCSS::Parser.new(scanner,
+              @options[:filename], @options[:importer],
+              @line, str.source_range.end_pos.offset)
+            media = media_parser.parse_media_query_list
+            end_pos = Sass::Source::Position.new(@line, media_parser.offset + 1)
+            node = Tree::CssImportNode.new(str, media.to_a, supports_condition)
+          end
+        end
+
+        node.source_range = Sass::Source::Range.new(
+          str.source_range.start_pos, end_pos,
+          @options[:filename], @options[:importer])
+        return node
+      end
+
+      unless (quoted_val = scanner.scan(Sass::SCSS::RX::STRING))
+        scanned = scanner.scan(/[^,;]+/)
+        node = Tree::ImportNode.new(scanned)
+        start_parser_offset = to_parser_offset(offset)
+        node.source_range = Sass::Source::Range.new(
+          Sass::Source::Position.new(@line, start_parser_offset),
+          Sass::Source::Position.new(@line, start_parser_offset + scanned.length),
+          @options[:filename], @options[:importer])
+        return node
+      end
+
+      start_offset = offset
+      offset += scanner.matched.length
+      val = Sass::Script::Value::String.value(scanner[1] || scanner[2])
+      scanned = scanner.scan(/\s*/)
+      if !scanner.match?(/[,;]|$/)
+        offset += scanned.length if scanned
+        media_parser = Sass::SCSS::Parser.new(scanner,
+          @options[:filename], @options[:importer], @line, offset)
+        media = media_parser.parse_media_query_list
+        node = Tree::CssImportNode.new(quoted_val, media.to_a)
+        node.source_range = Sass::Source::Range.new(
+          Sass::Source::Position.new(@line, to_parser_offset(start_offset)),
+          Sass::Source::Position.new(@line, media_parser.offset),
+          @options[:filename], @options[:importer])
+      elsif val =~ %r{^(https?:)?//}
+        node = Tree::CssImportNode.new(quoted_val)
+        node.source_range = Sass::Source::Range.new(
+          Sass::Source::Position.new(@line, to_parser_offset(start_offset)),
+          Sass::Source::Position.new(@line, to_parser_offset(offset)),
+          @options[:filename], @options[:importer])
+      else
+        node = Tree::ImportNode.new(val)
+        node.source_range = Sass::Source::Range.new(
+          Sass::Source::Position.new(@line, to_parser_offset(start_offset)),
+          Sass::Source::Position.new(@line, to_parser_offset(offset)),
+          @options[:filename], @options[:importer])
+      end
+      node
+    end
+    # @comment
+    #   rubocop:enable MethodLength
+
+    def parse_mixin_directive(parent, line, root, value, offset)
+      parse_mixin_definition(line)
+    end
+
+    MIXIN_DEF_RE = /^(?:=|@mixin)\s*(#{Sass::SCSS::RX::IDENT})(.*)$/
+    def parse_mixin_definition(line)
+      name, arg_string = line.text.scan(MIXIN_DEF_RE).first
+      raise SyntaxError.new("Invalid mixin \"#{line.text[1..-1]}\".") if name.nil?
+
+      offset = line.offset + line.text.size - arg_string.size
+      args, splat = Script::Parser.new(arg_string.strip, @line, to_parser_offset(offset), @options).
+        parse_mixin_definition_arglist
+      Tree::MixinDefNode.new(name, args, splat)
+    end
+
+    CONTENT_RE = /^@content\s*(.+)?$/
+    def parse_content_directive(parent, line, root, value, offset)
+      trailing = line.text.scan(CONTENT_RE).first.first
+      unless trailing.nil?
+        raise SyntaxError.new(
+          "Invalid content directive. Trailing characters found: \"#{trailing}\".")
+      end
+      raise SyntaxError.new("Illegal nesting: Nothing may be nested beneath @content directives.",
+        :line => line.index + 1) unless line.children.empty?
+      Tree::ContentNode.new
+    end
+
+    def parse_include_directive(parent, line, root, value, offset)
+      parse_mixin_include(line, root)
+    end
+
+    MIXIN_INCLUDE_RE = /^(?:\+|@include)\s*(#{Sass::SCSS::RX::IDENT})(.*)$/
+    def parse_mixin_include(line, root)
+      name, arg_string = line.text.scan(MIXIN_INCLUDE_RE).first
+      raise SyntaxError.new("Invalid mixin include \"#{line.text}\".") if name.nil?
+
+      offset = line.offset + line.text.size - arg_string.size
+      args, keywords, splat, kwarg_splat =
+        Script::Parser.new(arg_string.strip, @line, to_parser_offset(offset), @options).
+          parse_mixin_include_arglist
+      Tree::MixinNode.new(name, args, keywords, splat, kwarg_splat)
+    end
+
+    FUNCTION_RE = /^@function\s*(#{Sass::SCSS::RX::IDENT})(.*)$/
+    def parse_function_directive(parent, line, root, value, offset)
+      name, arg_string = line.text.scan(FUNCTION_RE).first
+      raise SyntaxError.new("Invalid function definition \"#{line.text}\".") if name.nil?
+
+      offset = line.offset + line.text.size - arg_string.size
+      args, splat = Script::Parser.new(arg_string.strip, @line, to_parser_offset(offset), @options).
+        parse_function_definition_arglist
+      Tree::FunctionNode.new(name, args, splat)
+    end
+
+    def parse_script(script, options = {})
+      line = options[:line] || @line
+      offset = options[:offset] || @offset + 1
+      Script.parse(script, line, offset, @options)
+    end
+
+    def format_comment_text(text, silent)
+      content = text.split("\n")
+
+      if content.first && content.first.strip.empty?
+        removed_first = true
+        content.shift
+      end
+
+      return "/* */" if content.empty?
+      content.last.gsub!(%r{ ?\*/ *$}, '')
+      first = content.shift unless removed_first
+      content.map! {|l| l.gsub!(/^\*( ?)/, '\1') || (l.empty? ? "" : " ") + l}
+      content.unshift first unless removed_first
+      if silent
+        "/*" + content.join("\n *") + " */"
+      else
+        # The #gsub fixes the case of a trailing */
+        "/*" + content.join("\n *").gsub(/ \*\Z/, '') + " */"
+      end
+    end
+
+    def parse_interp(text, offset = 0)
+      self.class.parse_interp(text, @line, offset, :filename => @filename)
+    end
+
+    # Parser tracks 1-based line and offset, so our offset should be converted.
+    def to_parser_offset(offset)
+      offset + 1
+    end
+
+    def full_line_range(line)
+      Sass::Source::Range.new(
+        Sass::Source::Position.new(@line, to_parser_offset(line.offset)),
+        Sass::Source::Position.new(@line, to_parser_offset(line.offset) + line.text.length),
+        @options[:filename], @options[:importer])
+    end
+
+    # It's important that this have strings (at least)
+    # at the beginning, the end, and between each Script::Tree::Node.
+    #
+    # @private
+    def self.parse_interp(text, line, offset, options)
+      res = []
+      rest = Sass::Shared.handle_interpolation text do |scan|
+        escapes = scan[2].size
+        res << scan.matched[0...-2 - escapes]
+        if escapes.odd?
+          res << "\\" * (escapes - 1) << '#{'
+        else
+          res << "\\" * [0, escapes - 1].max
+          if scan[1].include?("\n")
+            line += scan[1].count("\n")
+            offset = scan.matched_size - scan[1].rindex("\n")
+          else
+            offset += scan.matched_size
+          end
+          node = Script::Parser.new(scan, line, offset, options).parse_interpolated
+          offset = node.source_range.end_pos.offset
+          res << node
+        end
+      end
+      res << rest
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/environment.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/environment.rb
new file mode 100644
index 0000000..04502a8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/environment.rb
@@ -0,0 +1,236 @@
+require 'set'
+
+module Sass
+  # The abstract base class for lexical environments for SassScript.
+  class BaseEnvironment
+    class << self
+      # Note: when updating this,
+      # update sass/yard/inherited_hash.rb as well.
+      def inherited_hash_accessor(name)
+        inherited_hash_reader(name)
+        inherited_hash_writer(name)
+      end
+
+      def inherited_hash_reader(name)
+        class_eval <<-RUBY, __FILE__, __LINE__ + 1
+          def #{name}(name)
+            _#{name}(name.tr('_', '-'))
+          end
+
+          def _#{name}(name)
+            (@#{name}s && @#{name}s[name]) || @parent && @parent._#{name}(name)
+          end
+          protected :_#{name}
+
+          def is_#{name}_global?(name)
+            return !@parent if @#{name}s && @#{name}s.has_key?(name)
+            @parent && @parent.is_#{name}_global?(name)
+          end
+        RUBY
+      end
+
+      def inherited_hash_writer(name)
+        class_eval <<-RUBY, __FILE__, __LINE__ + 1
+          def set_#{name}(name, value)
+            name = name.tr('_', '-')
+            @#{name}s[name] = value unless try_set_#{name}(name, value)
+          end
+
+          def try_set_#{name}(name, value)
+            @#{name}s ||= {}
+            if @#{name}s.include?(name)
+              @#{name}s[name] = value
+              true
+            elsif @parent && !@parent.global?
+              @parent.try_set_#{name}(name, value)
+            else
+              false
+            end
+          end
+          protected :try_set_#{name}
+
+          def set_local_#{name}(name, value)
+            @#{name}s ||= {}
+            @#{name}s[name.tr('_', '-')] = value
+          end
+
+          def set_global_#{name}(name, value)
+            global_env.set_#{name}(name, value)
+          end
+        RUBY
+      end
+    end
+
+    # The options passed to the Sass Engine.
+    attr_reader :options
+
+    attr_writer :caller
+    attr_writer :content
+    attr_writer :selector
+
+    # variable
+    # Script::Value
+    inherited_hash_reader :var
+
+    # mixin
+    # Sass::Callable
+    inherited_hash_reader :mixin
+
+    # function
+    # Sass::Callable
+    inherited_hash_reader :function
+
+    # @param options [{Symbol => Object}] The options hash. See
+    #   {file:SASS_REFERENCE.md#Options the Sass options documentation}.
+    # @param parent [Environment] See \{#parent}
+    def initialize(parent = nil, options = nil)
+      @parent = parent
+      @options = options || (parent && parent.options) || {}
+      @stack = @parent.nil? ? Sass::Stack.new : nil
+      @caller = nil
+      @content = nil
+      @filename = nil
+      @functions = nil
+      @mixins = nil
+      @selector = nil
+      @vars = nil
+    end
+
+    # Returns whether this is the global environment.
+    #
+    # @return [Boolean]
+    def global?
+      @parent.nil?
+    end
+
+    # The environment of the caller of this environment's mixin or function.
+    # @return {Environment?}
+    def caller
+      @caller || (@parent && @parent.caller)
+    end
+
+    # The content passed to this environment. This is naturally only set
+    # for mixin body environments with content passed in.
+    #
+    # @return {[Array<Sass::Tree::Node>, Environment]?} The content nodes and
+    #   the lexical environment of the content block.
+    def content
+      @content || (@parent && @parent.content)
+    end
+
+    # The selector for the current CSS rule, or nil if there is no
+    # current CSS rule.
+    #
+    # @return [Selector::CommaSequence?] The current selector, with any
+    #   nesting fully resolved.
+    def selector
+      @selector || (@caller && @caller.selector) || (@parent && @parent.selector)
+    end
+
+    # The top-level Environment object.
+    #
+    # @return [Environment]
+    def global_env
+      @global_env ||= global? ? self : @parent.global_env
+    end
+
+    # The import/mixin stack.
+    #
+    # @return [Sass::Stack]
+    def stack
+      @stack || global_env.stack
+    end
+  end
+
+  # The lexical environment for SassScript.
+  # This keeps track of variable, mixin, and function definitions.
+  #
+  # A new environment is created for each level of Sass nesting.
+  # This allows variables to be lexically scoped.
+  # The new environment refers to the environment in the upper scope,
+  # so it has access to variables defined in enclosing scopes,
+  # but new variables are defined locally.
+  #
+  # Environment also keeps track of the {Engine} options
+  # so that they can be made available to {Sass::Script::Functions}.
+  class Environment < BaseEnvironment
+    # The enclosing environment,
+    # or nil if this is the global environment.
+    #
+    # @return [Environment]
+    attr_reader :parent
+
+    # variable
+    # Script::Value
+    inherited_hash_writer :var
+
+    # mixin
+    # Sass::Callable
+    inherited_hash_writer :mixin
+
+    # function
+    # Sass::Callable
+    inherited_hash_writer :function
+  end
+
+  # A read-only wrapper for a lexical environment for SassScript.
+  class ReadOnlyEnvironment < BaseEnvironment
+    def initialize(parent = nil, options = nil)
+      super
+      @content_cached = nil
+    end
+    # The read-only environment of the caller of this environment's mixin or function.
+    #
+    # @see BaseEnvironment#caller
+    # @return {ReadOnlyEnvironment}
+    def caller
+      return @caller if @caller
+      env = super
+      @caller ||= env.is_a?(ReadOnlyEnvironment) ? env : ReadOnlyEnvironment.new(env, env.options)
+    end
+
+    # The content passed to this environment. If the content's environment isn't already
+    # read-only, it's made read-only.
+    #
+    # @see BaseEnvironment#content
+    #
+    # @return {[Array<Sass::Tree::Node>, ReadOnlyEnvironment]?} The content nodes and
+    #   the lexical environment of the content block.
+    #   Returns `nil` when there is no content in this environment.
+    def content
+      # Return the cached content from a previous invocation if any
+      return @content if @content_cached
+      # get the content with a read-write environment from the superclass
+      read_write_content = super
+      if read_write_content
+        tree, env = read_write_content
+        # make the content's environment read-only
+        if env && !env.is_a?(ReadOnlyEnvironment)
+          env = ReadOnlyEnvironment.new(env, env.options)
+        end
+        @content_cached = true
+        @content = [tree, env]
+      else
+        @content_cached = true
+        @content = nil
+      end
+    end
+  end
+
+  # An environment that can write to in-scope global variables, but doesn't
+  # create new variables in the global scope. Useful for top-level control
+  # directives.
+  class SemiGlobalEnvironment < Environment
+    def try_set_var(name, value)
+      @vars ||= {}
+      if @vars.include?(name)
+        @vars[name] = value
+        true
+      elsif @parent
+        @parent.try_set_var(name, value)
+      else
+        false
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/error.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/error.rb
new file mode 100644
index 0000000..7ee7460
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/error.rb
@@ -0,0 +1,198 @@
+module Sass
+  # An exception class that keeps track of
+  # the line of the Sass template it was raised on
+  # and the Sass file that was being parsed (if applicable).
+  #
+  # All Sass errors are raised as {Sass::SyntaxError}s.
+  #
+  # When dealing with SyntaxErrors,
+  # it's important to provide filename and line number information.
+  # This will be used in various error reports to users, including backtraces;
+  # see \{#sass\_backtrace} for details.
+  #
+  # Some of this information is usually provided as part of the constructor.
+  # New backtrace entries can be added with \{#add\_backtrace},
+  # which is called when an exception is raised between files (e.g. with `@import`).
+  #
+  # Often, a chunk of code will all have similar backtrace information -
+  # the same filename or even line.
+  # It may also be useful to have a default line number set.
+  # In those situations, the default values can be used
+  # by omitting the information on the original exception,
+  # and then calling \{#modify\_backtrace} in a wrapper `rescue`.
+  # When doing this, be sure that all exceptions ultimately end up
+  # with the information filled in.
+  class SyntaxError < StandardError
+    # The backtrace of the error within Sass files.
+    # This is an array of hashes containing information for a single entry.
+    # The hashes have the following keys:
+    #
+    # `:filename`
+    # : The name of the file in which the exception was raised,
+    #   or `nil` if no filename is available.
+    #
+    # `:mixin`
+    # : The name of the mixin in which the exception was raised,
+    #   or `nil` if it wasn't raised in a mixin.
+    #
+    # `:line`
+    # : The line of the file on which the error occurred. Never nil.
+    #
+    # This information is also included in standard backtrace format
+    # in the output of \{#backtrace}.
+    #
+    # @return [Aray<{Symbol => Object>}]
+    attr_accessor :sass_backtrace
+
+    # The text of the template where this error was raised.
+    #
+    # @return [String]
+    attr_accessor :sass_template
+
+    # @param msg [String] The error message
+    # @param attrs [{Symbol => Object}] The information in the backtrace entry.
+    #   See \{#sass\_backtrace}
+    def initialize(msg, attrs = {})
+      @message = msg
+      @sass_backtrace = []
+      add_backtrace(attrs)
+    end
+
+    # The name of the file in which the exception was raised.
+    # This could be `nil` if no filename is available.
+    #
+    # @return [String, nil]
+    def sass_filename
+      sass_backtrace.first[:filename]
+    end
+
+    # The name of the mixin in which the error occurred.
+    # This could be `nil` if the error occurred outside a mixin.
+    #
+    # @return [String]
+    def sass_mixin
+      sass_backtrace.first[:mixin]
+    end
+
+    # The line of the Sass template on which the error occurred.
+    #
+    # @return [Integer]
+    def sass_line
+      sass_backtrace.first[:line]
+    end
+
+    # Adds an entry to the exception's Sass backtrace.
+    #
+    # @param attrs [{Symbol => Object}] The information in the backtrace entry.
+    #   See \{#sass\_backtrace}
+    def add_backtrace(attrs)
+      sass_backtrace << attrs.reject {|_k, v| v.nil?}
+    end
+
+    # Modify the top Sass backtrace entries
+    # (that is, the most deeply nested ones)
+    # to have the given attributes.
+    #
+    # Specifically, this goes through the backtrace entries
+    # from most deeply nested to least,
+    # setting the given attributes for each entry.
+    # If an entry already has one of the given attributes set,
+    # the pre-existing attribute takes precedence
+    # and is not used for less deeply-nested entries
+    # (even if they don't have that attribute set).
+    #
+    # @param attrs [{Symbol => Object}] The information to add to the backtrace entry.
+    #   See \{#sass\_backtrace}
+    def modify_backtrace(attrs)
+      attrs = attrs.reject {|_k, v| v.nil?}
+      # Move backwards through the backtrace
+      (0...sass_backtrace.size).to_a.reverse_each do |i|
+        entry = sass_backtrace[i]
+        sass_backtrace[i] = attrs.merge(entry)
+        attrs.reject! {|k, _v| entry.include?(k)}
+        break if attrs.empty?
+      end
+    end
+
+    # @return [String] The error message
+    def to_s
+      @message
+    end
+
+    # Returns the standard exception backtrace,
+    # including the Sass backtrace.
+    #
+    # @return [Array<String>]
+    def backtrace
+      return nil if super.nil?
+      return super if sass_backtrace.all? {|h| h.empty?}
+      sass_backtrace.map do |h|
+        "#{h[:filename] || '(sass)'}:#{h[:line]}" +
+          (h[:mixin] ? ":in `#{h[:mixin]}'" : "")
+      end + super
+    end
+
+    # Returns a string representation of the Sass backtrace.
+    #
+    # @param default_filename [String] The filename to use for unknown files
+    # @see #sass_backtrace
+    # @return [String]
+    def sass_backtrace_str(default_filename = "an unknown file")
+      lines = message.split("\n")
+      msg = lines[0] + lines[1..-1].
+        map {|l| "\n" + (" " * "Error: ".size) + l}.join
+      "Error: #{msg}" +
+        sass_backtrace.each_with_index.map do |entry, i|
+          "\n        #{i == 0 ? 'on' : 'from'} line #{entry[:line]}" +
+            " of #{entry[:filename] || default_filename}" +
+            (entry[:mixin] ? ", in `#{entry[:mixin]}'" : "")
+        end.join
+    end
+
+    class << self
+      # Returns an error report for an exception in CSS format.
+      #
+      # @param e [Exception]
+      # @param line_offset [Integer] The number of the first line of the Sass template.
+      # @return [String] The error report
+      # @raise [Exception] `e`, if the
+      #   {file:SASS_REFERENCE.md#full_exception-option `:full_exception`} option
+      #   is set to false.
+      def exception_to_css(e, line_offset = 1)
+        header = header_string(e, line_offset)
+
+        <<END
+/*
+#{header.gsub('*/', '*\\/')}
+
+Backtrace:\n#{e.backtrace.join("\n").gsub('*/', '*\\/')}
+*/
+body:before {
+  white-space: pre;
+  font-family: monospace;
+  content: "#{header.gsub('"', '\"').gsub("\n", '\\A ')}"; }
+END
+      end
+
+      private
+
+      def header_string(e, line_offset)
+        unless e.is_a?(Sass::SyntaxError) && e.sass_line && e.sass_template
+          return "#{e.class}: #{e.message}"
+        end
+
+        line_num = e.sass_line + 1 - line_offset
+        min = [line_num - 6, 0].max
+        section = e.sass_template.rstrip.split("\n")[min...line_num + 5]
+        return e.sass_backtrace_str if section.nil? || section.empty?
+
+        e.sass_backtrace_str + "\n\n" + section.each_with_index.
+          map {|line, i| "#{line_offset + min + i}: #{line}"}.join("\n")
+      end
+    end
+  end
+
+  # The class for Sass errors that are raised due to invalid unit conversions
+  # in SassScript.
+  class UnitConversionError < SyntaxError; end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec.rb
new file mode 100644
index 0000000..8add324
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec.rb
@@ -0,0 +1,9 @@
+module Sass
+  # This module handles the Sass executables (`sass` and `sass-convert`).
+  module Exec
+  end
+end
+
+require 'sass/exec/base'
+require 'sass/exec/sass_scss'
+require 'sass/exec/sass_convert'
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec/base.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec/base.rb
new file mode 100644
index 0000000..8ac2623
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec/base.rb
@@ -0,0 +1,190 @@
+require 'optparse'
+
+module Sass::Exec
+  # The abstract base class for Sass executables.
+  class Base
+    # @param args [Array<String>] The command-line arguments
+    def initialize(args)
+      @args = args
+      @options = {}
+    end
+
+    # Parses the command-line arguments and runs the executable.
+    # Calls `Kernel#exit` at the end, so it never returns.
+    #
+    # @see #parse
+    def parse!
+      # rubocop:disable RescueException
+      begin
+        parse
+      rescue Exception => e
+        # Exit code 65 indicates invalid data per
+        # http://www.freebsd.org/cgi/man.cgi?query=sysexits. Setting it via
+        # at_exit is a bit of a hack, but it allows us to rethrow when --trace
+        # is active and get both the built-in exception formatting and the
+        # correct exit code.
+        at_exit {exit Sass::Util.windows? ? 13 : 65} if e.is_a?(Sass::SyntaxError)
+
+        raise e if @options[:trace] || e.is_a?(SystemExit)
+
+        if e.is_a?(Sass::SyntaxError)
+          $stderr.puts e.sass_backtrace_str("standard input")
+        else
+          $stderr.print "#{e.class}: " unless e.class == RuntimeError
+          $stderr.puts e.message.to_s
+        end
+        $stderr.puts "  Use --trace for backtrace."
+
+        exit 1
+      end
+      exit 0
+      # rubocop:enable RescueException
+    end
+
+    # Parses the command-line arguments and runs the executable.
+    # This does not handle exceptions or exit the program.
+    #
+    # @see #parse!
+    def parse
+      @opts = OptionParser.new(&method(:set_opts))
+      @opts.parse!(@args)
+
+      process_result
+
+      @options
+    end
+
+    # @return [String] A description of the executable
+    def to_s
+      @opts.to_s
+    end
+
+    protected
+
+    # Finds the line of the source template
+    # on which an exception was raised.
+    #
+    # @param exception [Exception] The exception
+    # @return [String] The line number
+    def get_line(exception)
+      # SyntaxErrors have weird line reporting
+      # when there's trailing whitespace
+      if exception.is_a?(::SyntaxError)
+        return (exception.message.scan(/:(\d+)/).first || ["??"]).first
+      end
+      (exception.backtrace[0].scan(/:(\d+)/).first || ["??"]).first
+    end
+
+    # Tells optparse how to parse the arguments
+    # available for all executables.
+    #
+    # This is meant to be overridden by subclasses
+    # so they can add their own options.
+    #
+    # @param opts [OptionParser]
+    def set_opts(opts)
+      Sass::Util.abstract(this)
+    end
+
+    # Set an option for specifying `Encoding.default_external`.
+    #
+    # @param opts [OptionParser]
+    def encoding_option(opts)
+      encoding_desc = 'Specify the default encoding for input files.'
+      opts.on('-E', '--default-encoding ENCODING', encoding_desc) do |encoding|
+        Encoding.default_external = encoding
+      end
+    end
+
+    # Processes the options set by the command-line arguments. In particular,
+    # sets `@options[:input]` and `@options[:output]` to appropriate IO streams.
+    #
+    # This is meant to be overridden by subclasses
+    # so they can run their respective programs.
+    def process_result
+      input, output = @options[:input], @options[:output]
+      args = @args.dup
+      input ||=
+        begin
+          filename = args.shift
+          @options[:filename] = filename
+          open_file(filename) || $stdin
+        end
+      @options[:output_filename] = args.shift
+      output ||= @options[:output_filename] || $stdout
+      @options[:input], @options[:output] = input, output
+    end
+
+    COLORS = {:red => 31, :green => 32, :yellow => 33}
+
+    # Prints a status message about performing the given action,
+    # colored using the given color (via terminal escapes) if possible.
+    #
+    # @param name [#to_s] A short name for the action being performed.
+    #   Shouldn't be longer than 11 characters.
+    # @param color [Symbol] The name of the color to use for this action.
+    #   Can be `:red`, `:green`, or `:yellow`.
+    def puts_action(name, color, arg)
+      return if @options[:for_engine][:quiet]
+      printf color(color, "%11s %s\n"), name, arg
+      STDOUT.flush
+    end
+
+    # Same as `Kernel.puts`, but doesn't print anything if the `--quiet` option is set.
+    #
+    # @param args [Array] Passed on to `Kernel.puts`
+    def puts(*args)
+      return if @options[:for_engine][:quiet]
+      Kernel.puts(*args)
+    end
+
+    # Wraps the given string in terminal escapes
+    # causing it to have the given color.
+    # If terminal escapes aren't supported on this platform,
+    # just returns the string instead.
+    #
+    # @param color [Symbol] The name of the color to use.
+    #   Can be `:red`, `:green`, or `:yellow`.
+    # @param str [String] The string to wrap in the given color.
+    # @return [String] The wrapped string.
+    def color(color, str)
+      raise "[BUG] Unrecognized color #{color}" unless COLORS[color]
+
+      # Almost any real Unix terminal will support color,
+      # so we just filter for Windows terms (which don't set TERM)
+      # and not-real terminals, which aren't ttys.
+      return str if ENV["TERM"].nil? || ENV["TERM"].empty? || !STDOUT.tty?
+      "\e[#{COLORS[color]}m#{str}\e[0m"
+    end
+
+    def write_output(text, destination)
+      if destination.is_a?(String)
+        open_file(destination, 'w') {|file| file.write(text)}
+      else
+        destination.write(text)
+      end
+    end
+
+    private
+
+    def open_file(filename, flag = 'r')
+      return if filename.nil?
+      flag = 'wb' if @options[:unix_newlines] && flag == 'w'
+      file = File.open(filename, flag)
+      return file unless block_given?
+      yield file
+      file.close
+    end
+
+    def handle_load_error(err)
+      dep = err.message[/^no such file to load -- (.*)/, 1]
+      raise err if @options[:trace] || dep.nil? || dep.empty?
+      $stderr.puts <<MESSAGE
+Required dependency #{dep} not found!
+    Run "gem install #{dep}" to get it.
+  Use --trace for backtrace.
+MESSAGE
+      exit 1
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec/sass_convert.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec/sass_convert.rb
new file mode 100644
index 0000000..8e68977
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec/sass_convert.rb
@@ -0,0 +1,283 @@
+require 'optparse'
+require 'fileutils'
+
+module Sass::Exec
+  # The `sass-convert` executable.
+  class SassConvert < Base
+    # @param args [Array<String>] The command-line arguments
+    def initialize(args)
+      super
+      require 'sass'
+      @options[:for_tree] = {}
+      @options[:for_engine] = {:cache => false, :read_cache => true}
+    end
+
+    # Tells optparse how to parse the arguments.
+    #
+    # @param opts [OptionParser]
+    def set_opts(opts)
+      opts.banner = <<END
+Usage: sass-convert [options] [INPUT] [OUTPUT]
+
+Description:
+  Converts between CSS, indented syntax, and SCSS files. For example,
+  this can convert from the indented syntax to SCSS, or from CSS to
+  SCSS (adding appropriate nesting).
+END
+
+      common_options(opts)
+      style(opts)
+      input_and_output(opts)
+      miscellaneous(opts)
+    end
+
+    # Processes the options set by the command-line arguments,
+    # and runs the CSS compiler appropriately.
+    def process_result
+      require 'sass'
+
+      if @options[:recursive]
+        process_directory
+        return
+      end
+
+      super
+      input = @options[:input]
+      if File.directory?(input)
+        raise "Error: '#{input.path}' is a directory (did you mean to use --recursive?)"
+      end
+      output = @options[:output]
+      output = input if @options[:in_place]
+      process_file(input, output)
+    end
+
+    private
+
+    def common_options(opts)
+      opts.separator ''
+      opts.separator 'Common Options:'
+
+      opts.on('-F', '--from FORMAT',
+        'The format to convert from. Can be css, scss, sass.',
+        'By default, this is inferred from the input filename.',
+        'If there is none, defaults to css.') do |name|
+        @options[:from] = name.downcase.to_sym
+        raise "sass-convert no longer supports LessCSS." if @options[:from] == :less
+        unless [:css, :scss, :sass].include?(@options[:from])
+          raise "Unknown format for sass-convert --from: #{name}"
+        end
+      end
+
+      opts.on('-T', '--to FORMAT',
+        'The format to convert to. Can be scss or sass.',
+        'By default, this is inferred from the output filename.',
+        'If there is none, defaults to sass.') do |name|
+        @options[:to] = name.downcase.to_sym
+        unless [:scss, :sass].include?(@options[:to])
+          raise "Unknown format for sass-convert --to: #{name}"
+        end
+      end
+
+      opts.on('-i', '--in-place',
+        'Convert a file to its own syntax.',
+        'This can be used to update some deprecated syntax.') do
+        @options[:in_place] = true
+      end
+
+      opts.on('-R', '--recursive',
+          'Convert all the files in a directory. Requires --from and --to.') do
+        @options[:recursive] = true
+      end
+
+      opts.on("-?", "-h", "--help", "Show this help message.") do
+        puts opts
+        exit
+      end
+
+      opts.on("-v", "--version", "Print the Sass version.") do
+        puts("Sass #{Sass.version[:string]}")
+        exit
+      end
+    end
+
+    def style(opts)
+      opts.separator ''
+      opts.separator 'Style:'
+
+      opts.on('--dasherize', 'Convert underscores to dashes.') do
+        @options[:for_tree][:dasherize] = true
+      end
+
+      opts.on(
+        '--indent NUM',
+        'How many spaces to use for each level of indentation. Defaults to 2.',
+        '"t" means use hard tabs.'
+      ) do |indent|
+        if indent == 't'
+          @options[:for_tree][:indent] = "\t"
+        else
+          @options[:for_tree][:indent] = " " * indent.to_i
+        end
+      end
+
+      opts.on('--old', 'Output the old-style ":prop val" property syntax.',
+                       'Only meaningful when generating Sass.') do
+        @options[:for_tree][:old] = true
+      end
+    end
+
+    def input_and_output(opts)
+      opts.separator ''
+      opts.separator 'Input and Output:'
+
+      opts.on('-s', '--stdin', :NONE,
+              'Read input from standard input instead of an input file.',
+              'This is the default if no input file is specified. Requires --from.') do
+        @options[:input] = $stdin
+      end
+
+      encoding_option(opts)
+
+      opts.on('--unix-newlines', 'Use Unix-style newlines in written files.',
+                                 ('Always true on Unix.' unless Sass::Util.windows?)) do
+        @options[:unix_newlines] = true if Sass::Util.windows?
+      end
+    end
+
+    def miscellaneous(opts)
+      opts.separator ''
+      opts.separator 'Miscellaneous:'
+
+        opts.on('--cache-location PATH',
+                'The path to save parsed Sass files. Defaults to .sass-cache.') do |loc|
+          @options[:for_engine][:cache_location] = loc
+        end
+
+      opts.on('-C', '--no-cache', "Don't cache to sassc files.") do
+        @options[:for_engine][:read_cache] = false
+      end
+
+      opts.on('-q', '--quiet', 'Silence warnings and status messages during conversion.') do |bool|
+        @options[:for_engine][:quiet] = bool
+      end
+
+      opts.on('--trace', :NONE, 'Show a full Ruby stack trace on error') do
+        @options[:trace] = true
+      end
+    end
+
+    def process_directory
+      @options[:input] = @args.shift
+      unless @options[:input]
+        raise "Error: directory required when using --recursive."
+      end
+
+      output = @options[:output] = @args.shift
+      raise "Error: --from required when using --recursive." unless @options[:from]
+      raise "Error: --to required when using --recursive." unless @options[:to]
+      unless File.directory?(@options[:input])
+        raise "Error: '#{@options[:input]}' is not a directory"
+      end
+      if @options[:output] && File.exist?(@options[:output]) &&
+        !File.directory?(@options[:output])
+        raise "Error: '#{@options[:output]}' is not a directory"
+      end
+      @options[:output] ||= @options[:input]
+
+      if @options[:to] == @options[:from] && !@options[:in_place]
+        fmt = @options[:from]
+        raise "Error: converting from #{fmt} to #{fmt} without --in-place"
+      end
+
+      ext = @options[:from]
+      Sass::Util.glob("#{@options[:input]}/**/*.#{ext}") do |f|
+        output =
+          if @options[:in_place]
+            f
+          elsif @options[:output]
+            output_name = f.gsub(/\.(c|sa|sc|le)ss$/, ".#{@options[:to]}")
+            output_name[0...@options[:input].size] = @options[:output]
+            output_name
+          else
+            f.gsub(/\.(c|sa|sc|le)ss$/, ".#{@options[:to]}")
+          end
+
+        unless File.directory?(File.dirname(output))
+          puts_action :directory, :green, File.dirname(output)
+          FileUtils.mkdir_p(File.dirname(output))
+        end
+        puts_action :convert, :green, f
+        if File.exist?(output)
+          puts_action :overwrite, :yellow, output
+        else
+          puts_action :create, :green, output
+        end
+
+        process_file(f, output)
+      end
+    end
+
+    def process_file(input, output)
+      input_path, output_path = path_for(input), path_for(output)
+      if input_path
+        @options[:from] ||=
+          case input_path
+          when /\.scss$/; :scss
+          when /\.sass$/; :sass
+          when /\.less$/; raise "sass-convert no longer supports LessCSS."
+          when /\.css$/; :css
+          end
+      elsif @options[:in_place]
+        raise "Error: the --in-place option requires a filename."
+      end
+
+      if output_path
+        @options[:to] ||=
+          case output_path
+          when /\.scss$/; :scss
+          when /\.sass$/; :sass
+          end
+      end
+
+      @options[:from] ||= :css
+      @options[:to] ||= :sass
+      @options[:for_engine][:syntax] = @options[:from]
+
+      out =
+        Sass::Util.silence_sass_warnings do
+          if @options[:from] == :css
+            require 'sass/css'
+            Sass::CSS.new(read(input), @options[:for_tree]).render(@options[:to])
+          else
+            if input_path
+              Sass::Engine.for_file(input_path, @options[:for_engine])
+            else
+              Sass::Engine.new(read(input), @options[:for_engine])
+            end.to_tree.send("to_#{@options[:to]}", @options[:for_tree])
+          end
+        end
+
+      output = input_path if @options[:in_place]
+      write_output(out, output)
+    rescue Sass::SyntaxError => e
+      raise e if @options[:trace]
+      file = " of #{e.sass_filename}" if e.sass_filename
+      raise "Error on line #{e.sass_line}#{file}: #{e.message}\n  Use --trace for backtrace"
+    rescue LoadError => err
+      handle_load_error(err)
+    end
+
+    def path_for(file)
+      return file.path if file.is_a?(File)
+      return file if file.is_a?(String)
+    end
+
+    def read(file)
+      if file.respond_to?(:read)
+        file.read
+      else
+        open(file, 'rb') {|f| f.read}
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec/sass_scss.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec/sass_scss.rb
new file mode 100644
index 0000000..d00bb12
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/exec/sass_scss.rb
@@ -0,0 +1,440 @@
+module Sass::Exec
+  # The `sass` and `scss` executables.
+  class SassScss < Base
+    attr_reader :default_syntax
+
+    # @param args [Array<String>] The command-line arguments
+    def initialize(args, default_syntax)
+      super(args)
+      @options[:sourcemap] = :auto
+      @options[:for_engine] = {
+        :load_paths => default_sass_path
+      }
+      @default_syntax = default_syntax
+    end
+
+    protected
+
+    # Tells optparse how to parse the arguments.
+    #
+    # @param opts [OptionParser]
+    def set_opts(opts)
+      opts.banner = <<END
+Usage: #{default_syntax} [options] [INPUT] [OUTPUT]
+
+Description:
+  Converts SCSS or Sass files to CSS.
+END
+
+      common_options(opts)
+      watching_and_updating(opts)
+      input_and_output(opts)
+      miscellaneous(opts)
+    end
+
+    # Processes the options set by the command-line arguments,
+    # and runs the Sass compiler appropriately.
+    def process_result
+      require 'sass'
+
+      if !@options[:update] && !@options[:watch] &&
+          @args.first && colon_path?(@args.first)
+        if @args.size == 1
+          @args = split_colon_path(@args.first)
+        else
+          @fake_update = true
+          @options[:update] = true
+        end
+      end
+      load_compass if @options[:compass]
+      return interactive if @options[:interactive]
+      return watch_or_update if @options[:watch] || @options[:update]
+      super
+
+      if @options[:sourcemap] != :none && @options[:output_filename]
+        @options[:sourcemap_filename] = Sass::Util.sourcemap_name(@options[:output_filename])
+      end
+
+      @options[:for_engine][:filename] = @options[:filename]
+      @options[:for_engine][:css_filename] = @options[:output] if @options[:output].is_a?(String)
+      @options[:for_engine][:sourcemap_filename] = @options[:sourcemap_filename]
+      @options[:for_engine][:sourcemap] = @options[:sourcemap]
+
+      run
+    end
+
+    private
+
+    def common_options(opts)
+      opts.separator ''
+      opts.separator 'Common Options:'
+
+      opts.on('-I', '--load-path PATH', 'Specify a Sass import path.') do |path|
+        (@options[:for_engine][:load_paths] ||= []) << path
+      end
+
+      opts.on('-r', '--require LIB', 'Require a Ruby library before running Sass.') do |lib|
+        require lib
+      end
+
+      opts.on('--compass', 'Make Compass imports available and load project configuration.') do
+        @options[:compass] = true
+      end
+
+      opts.on('-t', '--style NAME', 'Output style. Can be nested (default), compact, ' \
+                                    'compressed, or expanded.') do |name|
+        @options[:for_engine][:style] = name.to_sym
+      end
+
+      opts.on("-?", "-h", "--help", "Show this help message.") do
+        puts opts
+        exit
+      end
+
+      opts.on("-v", "--version", "Print the Sass version.") do
+        puts("Sass #{Sass.version[:string]}")
+        exit
+      end
+    end
+
+    def watching_and_updating(opts)
+      opts.separator ''
+      opts.separator 'Watching and Updating:'
+
+      opts.on('--watch', 'Watch files or directories for changes.',
+                         'The location of the generated CSS can be set using a colon:',
+                         "  #{@default_syntax} --watch input.#{@default_syntax}:output.css",
+                         "  #{@default_syntax} --watch input-dir:output-dir") do
+        @options[:watch] = true
+      end
+
+      # Polling is used by default on Windows.
+      unless Sass::Util.windows?
+        opts.on('--poll', 'Check for file changes manually, rather than relying on the OS.',
+                          'Only meaningful for --watch.') do
+          @options[:poll] = true
+        end
+      end
+
+      opts.on('--update', 'Compile files or directories to CSS.',
+                          'Locations are set like --watch.') do
+        @options[:update] = true
+      end
+
+      opts.on('-f', '--force', 'Recompile every Sass file, even if the CSS file is newer.',
+                               'Only meaningful for --update.') do
+        @options[:force] = true
+      end
+
+      opts.on('--stop-on-error', 'If a file fails to compile, exit immediately.',
+                                 'Only meaningful for --watch and --update.') do
+        @options[:stop_on_error] = true
+      end
+    end
+
+    def input_and_output(opts)
+      opts.separator ''
+      opts.separator 'Input and Output:'
+
+      if @default_syntax == :sass
+        opts.on('--scss',
+                'Use the CSS-superset SCSS syntax.') do
+          @options[:for_engine][:syntax] = :scss
+        end
+      else
+        opts.on('--sass',
+                'Use the indented Sass syntax.') do
+          @options[:for_engine][:syntax] = :sass
+        end
+      end
+
+      # This is optional for backwards-compatibility with Sass 3.3, which didn't
+      # enable sourcemaps by default and instead used "--sourcemap" to do so.
+      opts.on(:OPTIONAL, '--sourcemap=TYPE',
+          'How to link generated output to the source files.',
+          '  auto (default): relative paths where possible, file URIs elsewhere',
+          '  file: always absolute file URIs',
+          '  inline: include the source text in the sourcemap',
+          '  none: no sourcemaps') do |type|
+        if type && !%w(auto file inline none).include?(type)
+          $stderr.puts "Unknown sourcemap type #{type}.\n\n"
+          $stderr.puts opts
+          exit
+        elsif type.nil?
+          Sass::Util.sass_warn <<MESSAGE.rstrip
+DEPRECATION WARNING: Passing --sourcemap without a value is deprecated.
+Sourcemaps are now generated by default, so this flag has no effect.
+MESSAGE
+        end
+
+        @options[:sourcemap] = (type || :auto).to_sym
+      end
+
+      opts.on('-s', '--stdin', :NONE,
+              'Read input from standard input instead of an input file.',
+              'This is the default if no input file is specified.') do
+        @options[:input] = $stdin
+      end
+
+      encoding_option(opts)
+
+      opts.on('--unix-newlines', 'Use Unix-style newlines in written files.',
+                                 ('Always true on Unix.' unless Sass::Util.windows?)) do
+        @options[:unix_newlines] = true if Sass::Util.windows?
+      end
+
+      opts.on('-g', '--debug-info',
+              'Emit output that can be used by the FireSass Firebug plugin.') do
+        @options[:for_engine][:debug_info] = true
+      end
+
+      opts.on('-l', '--line-numbers', '--line-comments',
+              'Emit comments in the generated CSS indicating the corresponding source line.') do
+        @options[:for_engine][:line_numbers] = true
+      end
+    end
+
+    def miscellaneous(opts)
+      opts.separator ''
+      opts.separator 'Miscellaneous:'
+
+      opts.on('-i', '--interactive',
+              'Run an interactive SassScript shell.') do
+        @options[:interactive] = true
+      end
+
+      opts.on('-c', '--check', "Just check syntax, don't evaluate.") do
+        require 'stringio'
+        @options[:check_syntax] = true
+        @options[:output] = StringIO.new
+      end
+
+      opts.on('--precision NUMBER_OF_DIGITS', Integer,
+              "How many digits of precision to use when outputting decimal numbers.",
+              "Defaults to #{Sass::Script::Value::Number.precision}.") do |precision|
+        Sass::Script::Value::Number.precision = precision
+      end
+
+      opts.on('--cache-location PATH',
+              'The path to save parsed Sass files. Defaults to .sass-cache.') do |loc|
+        @options[:for_engine][:cache_location] = loc
+      end
+
+      opts.on('-C', '--no-cache', "Don't cache parsed Sass files.") do
+        @options[:for_engine][:cache] = false
+      end
+
+      opts.on('--trace', :NONE, 'Show a full Ruby stack trace on error.') do
+        @options[:trace] = true
+      end
+
+      opts.on('-q', '--quiet', 'Silence warnings and status messages during compilation.') do
+        @options[:for_engine][:quiet] = true
+      end
+    end
+
+    def load_compass
+      begin
+        require 'compass'
+      rescue LoadError
+        require 'rubygems'
+        begin
+          require 'compass'
+        rescue LoadError
+          puts "ERROR: Cannot load compass."
+          exit 1
+        end
+      end
+      Compass.add_project_configuration
+      Compass.configuration.project_path ||= Dir.pwd
+      @options[:for_engine][:load_paths] ||= []
+      @options[:for_engine][:load_paths] += Compass.configuration.sass_load_paths
+    end
+
+    def interactive
+      require 'sass/repl'
+      Sass::Repl.new(@options).run
+    end
+
+    # @comment
+    #   rubocop:disable MethodLength
+    def watch_or_update
+      require 'sass/plugin'
+      Sass::Plugin.options.merge! @options[:for_engine]
+      Sass::Plugin.options[:unix_newlines] = @options[:unix_newlines]
+      Sass::Plugin.options[:poll] = @options[:poll]
+      Sass::Plugin.options[:sourcemap] = @options[:sourcemap]
+
+      if @options[:force]
+        raise "The --force flag may only be used with --update." unless @options[:update]
+        Sass::Plugin.options[:always_update] = true
+      end
+
+      raise <<MSG if @args.empty?
+What files should I watch? Did you mean something like:
+    #{@default_syntax} --watch input.#{@default_syntax}:output.css
+    #{@default_syntax} --watch input-dir:output-dir
+MSG
+
+      if !colon_path?(@args[0]) && probably_dest_dir?(@args[1])
+        flag = @options[:update] ? "--update" : "--watch"
+        err =
+          if !File.exist?(@args[1])
+            "doesn't exist"
+          elsif @args[1] =~ /\.css$/
+            "is a CSS file"
+          end
+        raise <<MSG if err
+File #{@args[1]} #{err}.
+    Did you mean: #{@default_syntax} #{flag} #{@args[0]}:#{@args[1]}
+MSG
+      end
+
+      dirs, files = @args.map {|name| split_colon_path(name)}.
+        partition {|i, _| File.directory? i}
+
+      if @fake_update && !dirs.empty?
+        # Issue 1602.
+        Sass::Util.sass_warn <<WARNING.strip
+DEPRECATION WARNING: Compiling directories without --update or --watch is
+deprecated and won't work in future versions of Sass. Instead use:
+  #{@default_syntax} --update #{@args}
+WARNING
+      end
+
+      files.map! do |from, to|
+        to ||= from.gsub(/\.[^.]*?$/, '.css')
+        sourcemap = Sass::Util.sourcemap_name(to) if @options[:sourcemap]
+        [from, to, sourcemap]
+      end
+      dirs.map! {|from, to| [from, to || from]}
+      Sass::Plugin.options[:template_location] = dirs
+
+      Sass::Plugin.on_updated_stylesheet do |_, css, sourcemap|
+        [css, sourcemap].each do |file|
+          next unless file
+          puts_action :write, :green, file
+        end
+      end
+
+      had_error = false
+      Sass::Plugin.on_creating_directory {|dirname| puts_action :directory, :green, dirname}
+      Sass::Plugin.on_deleting_css {|filename| puts_action :delete, :yellow, filename}
+      Sass::Plugin.on_deleting_sourcemap {|filename| puts_action :delete, :yellow, filename}
+      Sass::Plugin.on_compilation_error do |error, _, _|
+        if error.is_a?(SystemCallError) && !@options[:stop_on_error]
+          had_error = true
+          puts_action :error, :red, error.message
+          STDOUT.flush
+          next
+        end
+
+        raise error unless error.is_a?(Sass::SyntaxError) && !@options[:stop_on_error]
+        had_error = true
+        puts_action :error, :red,
+          "#{error.sass_filename} (Line #{error.sass_line}: #{error.message})"
+        STDOUT.flush
+      end
+
+      if @options[:update]
+        Sass::Plugin.update_stylesheets(files)
+        exit 1 if had_error
+        return
+      end
+
+      puts ">>> Sass is watching for changes. Press Ctrl-C to stop."
+
+      Sass::Plugin.on_template_modified do |template|
+        puts ">>> Change detected to: #{template}"
+        STDOUT.flush
+      end
+      Sass::Plugin.on_template_created do |template|
+        puts ">>> New template detected: #{template}"
+        STDOUT.flush
+      end
+      Sass::Plugin.on_template_deleted do |template|
+        puts ">>> Deleted template detected: #{template}"
+        STDOUT.flush
+      end
+
+      Sass::Plugin.watch(files)
+    end
+    # @comment
+    #   rubocop:enable MethodLength
+
+    def run
+      input = @options[:input]
+      output = @options[:output]
+
+      if input == $stdin
+        # See issue 1745
+        (@options[:for_engine][:load_paths] ||= []) << ::Sass::Importers::DeprecatedPath.new(".")
+      end
+
+      @options[:for_engine][:syntax] ||= :scss if input.is_a?(File) && input.path =~ /\.scss$/
+      @options[:for_engine][:syntax] ||= @default_syntax
+      engine =
+        if input.is_a?(File) && !@options[:check_syntax]
+          Sass::Engine.for_file(input.path, @options[:for_engine])
+        else
+          # We don't need to do any special handling of @options[:check_syntax] here,
+          # because the Sass syntax checking happens alongside evaluation
+          # and evaluation doesn't actually evaluate any code anyway.
+          Sass::Engine.new(input.read, @options[:for_engine])
+        end
+
+      input.close if input.is_a?(File)
+
+      if @options[:sourcemap] != :none && @options[:sourcemap_filename]
+        relative_sourcemap_path = Sass::Util.relative_path_from(
+          @options[:sourcemap_filename], Sass::Util.pathname(@options[:output_filename]).dirname)
+        rendered, mapping = engine.render_with_sourcemap(relative_sourcemap_path.to_s)
+        write_output(rendered, output)
+        write_output(
+          mapping.to_json(
+            :type => @options[:sourcemap],
+            :css_path => @options[:output_filename],
+            :sourcemap_path => @options[:sourcemap_filename]) + "\n",
+          @options[:sourcemap_filename])
+      else
+        write_output(engine.render, output)
+      end
+    rescue Sass::SyntaxError => e
+      write_output(Sass::SyntaxError.exception_to_css(e), output) if output.is_a?(String)
+      raise e
+    ensure
+      output.close if output.is_a? File
+    end
+
+    def colon_path?(path)
+      !split_colon_path(path)[1].nil?
+    end
+
+    def split_colon_path(path)
+      one, two = path.split(':', 2)
+      if one && two && Sass::Util.windows? &&
+          one =~ /\A[A-Za-z]\Z/ && two =~ %r{\A[/\\]}
+        # If we're on Windows and we were passed a drive letter path,
+        # don't split on that colon.
+        one2, two = two.split(':', 2)
+        one = one + ':' + one2
+      end
+      return one, two
+    end
+
+    # Whether path is likely to be meant as the destination
+    # in a source:dest pair.
+    def probably_dest_dir?(path)
+      return false unless path
+      return false if colon_path?(path)
+      Sass::Util.glob(File.join(path, "*.s[ca]ss")).empty?
+    end
+
+    def default_sass_path
+      return unless ENV['SASS_PATH']
+      # The select here prevents errors when the environment's
+      # load paths specified do not exist.
+      ENV['SASS_PATH'].split(File::PATH_SEPARATOR).select {|d| File.directory?(d)}
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/features.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/features.rb
new file mode 100644
index 0000000..78d3299
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/features.rb
@@ -0,0 +1,48 @@
+require 'set'
+module Sass
+  # Provides `Sass.has_feature?` which allows for simple feature detection
+  # by providing a feature name.
+  module Features
+    # This is the set of features that can be detected.
+    #
+    # When this is updated, the documentation of `feature-exists()` should be
+    # updated as well.
+    KNOWN_FEATURES = Set[*%w(
+      global-variable-shadowing
+      extend-selector-pseudoclass
+      units-level-3
+      at-error
+      custom-property
+    )]
+
+    # Check if a feature exists by name. This is used to implement
+    # the Sass function `feature-exists($feature)`
+    #
+    # @param feature_name [String] The case sensitive name of the feature to
+    #   check if it exists in this version of Sass.
+    # @return [Boolean] whether the feature of that name exists.
+    def has_feature?(feature_name)
+      KNOWN_FEATURES.include?(feature_name)
+    end
+
+    # Add a feature to Sass. Plugins can use this to easily expose their
+    # availability to end users. Plugins must prefix their feature
+    # names with a dash to distinguish them from official features.
+    #
+    # @example
+    #   Sass.add_feature("-import-globbing")
+    #   Sass.add_feature("-math-cos")
+    #
+    #
+    # @param feature_name [String] The case sensitive name of the feature to
+    #   to add to Sass. Must begin with a dash.
+    def add_feature(feature_name)
+      unless feature_name[0] == ?-
+        raise ArgumentError.new("Plugin feature names must begin with a dash")
+      end
+      KNOWN_FEATURES << feature_name
+    end
+  end
+
+  extend Features
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers.rb
new file mode 100644
index 0000000..6178b20
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers.rb
@@ -0,0 +1,23 @@
+module Sass
+  # Sass importers are in charge of taking paths passed to `@import`
+  # and finding the appropriate Sass code for those paths.
+  # By default, this code is always loaded from the filesystem,
+  # but importers could be added to load from a database or over HTTP.
+  #
+  # Each importer is in charge of a single load path
+  # (or whatever the corresponding notion is for the backend).
+  # Importers can be placed in the {file:SASS_REFERENCE.md#load_paths-option `:load_paths` array}
+  # alongside normal filesystem paths.
+  #
+  # When resolving an `@import`, Sass will go through the load paths
+  # looking for an importer that successfully imports the path.
+  # Once one is found, the imported file is used.
+  #
+  # User-created importers must inherit from {Importers::Base}.
+  module Importers
+  end
+end
+
+require 'sass/importers/base'
+require 'sass/importers/filesystem'
+require 'sass/importers/deprecated_path'
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers/base.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers/base.rb
new file mode 100644
index 0000000..a634d34
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers/base.rb
@@ -0,0 +1,182 @@
+module Sass
+  module Importers
+    # The abstract base class for Sass importers.
+    # All importers should inherit from this.
+    #
+    # At the most basic level, an importer is given a string
+    # and must return a {Sass::Engine} containing some Sass code.
+    # This string can be interpreted however the importer wants;
+    # however, subclasses are encouraged to use the URI format
+    # for pathnames.
+    #
+    # Importers that have some notion of "relative imports"
+    # should take a single load path in their constructor,
+    # and interpret paths as relative to that.
+    # They should also implement the \{#find\_relative} method.
+    #
+    # Importers should be serializable via `Marshal.dump`.
+    #
+    # @abstract
+    class Base
+      # Find a Sass file relative to another file.
+      # Importers without a notion of "relative paths"
+      # should just return nil here.
+      #
+      # If the importer does have a notion of "relative paths",
+      # it should ignore its load path during this method.
+      #
+      # See \{#find} for important information on how this method should behave.
+      #
+      # The `:filename` option passed to the returned {Sass::Engine}
+      # should be of a format that could be passed to \{#find}.
+      #
+      # @param uri [String] The URI to import. This is not necessarily relative,
+      #   but this method should only return true if it is.
+      # @param base [String] The base filename. If `uri` is relative,
+      #   it should be interpreted as relative to `base`.
+      #   `base` is guaranteed to be in a format importable by this importer.
+      # @param options [{Symbol => Object}] Options for the Sass file
+      #   containing the `@import` that's currently being resolved.
+      # @return [Sass::Engine, nil] An Engine containing the imported file,
+      #   or nil if it couldn't be found or was in the wrong format.
+      def find_relative(uri, base, options)
+        Sass::Util.abstract(self)
+      end
+
+      # Find a Sass file, if it exists.
+      #
+      # This is the primary entry point of the Importer.
+      # It corresponds directly to an `@import` statement in Sass.
+      # It should do three basic things:
+      #
+      # * Determine if the URI is in this importer's format.
+      #   If not, return nil.
+      # * Determine if the file indicated by the URI actually exists and is readable.
+      #   If not, return nil.
+      # * Read the file and place the contents in a {Sass::Engine}.
+      #   Return that engine.
+      #
+      # If this importer's format allows for file extensions,
+      # it should treat them the same way as the default {Filesystem} importer.
+      # If the URI explicitly has a `.sass` or `.scss` filename,
+      # the importer should look for that exact file
+      # and import it as the syntax indicated.
+      # If it doesn't exist, the importer should return nil.
+      #
+      # If the URI doesn't have either of these extensions,
+      # the importer should look for files with the extensions.
+      # If no such files exist, it should return nil.
+      #
+      # The {Sass::Engine} to be returned should be passed `options`,
+      # with a few modifications. `:syntax` should be set appropriately,
+      # `:filename` should be set to `uri`,
+      # and `:importer` should be set to this importer.
+      #
+      # @param uri [String] The URI to import.
+      # @param options [{Symbol => Object}] Options for the Sass file
+      #   containing the `@import` that's currently being resolved.
+      #   This is safe for subclasses to modify destructively.
+      #   Callers should only pass in a value they don't mind being destructively modified.
+      # @return [Sass::Engine, nil] An Engine containing the imported file,
+      #   or nil if it couldn't be found or was in the wrong format.
+      def find(uri, options)
+        Sass::Util.abstract(self)
+      end
+
+      # Returns the time the given Sass file was last modified.
+      #
+      # If the given file has been deleted or the time can't be accessed
+      # for some other reason, this should return nil.
+      #
+      # @param uri [String] The URI of the file to check.
+      #   Comes from a `:filename` option set on an engine returned by this importer.
+      # @param options [{Symbol => Object}] Options for the Sass file
+      #   containing the `@import` currently being checked.
+      # @return [Time, nil]
+      def mtime(uri, options)
+        Sass::Util.abstract(self)
+      end
+
+      # Get the cache key pair for the given Sass URI.
+      # The URI need not be checked for validity.
+      #
+      # The only strict requirement is that the returned pair of strings
+      # uniquely identify the file at the given URI.
+      # However, the first component generally corresponds roughly to the directory,
+      # and the second to the basename, of the URI.
+      #
+      # Note that keys must be unique *across importers*.
+      # Thus it's probably a good idea to include the importer name
+      # at the beginning of the first component.
+      #
+      # @param uri [String] A URI known to be valid for this importer.
+      # @param options [{Symbol => Object}] Options for the Sass file
+      #   containing the `@import` currently being checked.
+      # @return [(String, String)] The key pair which uniquely identifies
+      #   the file at the given URI.
+      def key(uri, options)
+        Sass::Util.abstract(self)
+      end
+
+      # Get the publicly-visible URL for an imported file. This URL is used by
+      # source maps to link to the source stylesheet. This may return `nil` to
+      # indicate that no public URL is available; however, this will cause
+      # sourcemap generation to fail if any CSS is generated from files imported
+      # from this importer.
+      #
+      # If an absolute "file:" URI can be produced for an imported file, that
+      # should be preferred to returning `nil`. However, a URL relative to
+      # `sourcemap_directory` should be preferred over an absolute "file:" URI.
+      #
+      # @param uri [String] A URI known to be valid for this importer.
+      # @param sourcemap_directory [String, NilClass] The absolute path to a
+      #   directory on disk where the sourcemap will be saved. If uri refers to
+      #   a file on disk that's accessible relative to sourcemap_directory, this
+      #   may return a relative URL. This may be `nil` if the sourcemap's
+      #   eventual location is unknown.
+      # @return [String?] The publicly-visible URL for this file, or `nil`
+      #   indicating that no publicly-visible URL exists. This should be
+      #   appropriately URL-escaped.
+      def public_url(uri, sourcemap_directory)
+        return if @public_url_warning_issued
+        @public_url_warning_issued = true
+        Sass::Util.sass_warn <<WARNING
+WARNING: #{self.class.name} should define the #public_url method.
+WARNING
+        nil
+      end
+
+      # A string representation of the importer.
+      # Should be overridden by subclasses.
+      #
+      # This is used to help debugging,
+      # and should usually just show the load path encapsulated by this importer.
+      #
+      # @return [String]
+      def to_s
+        Sass::Util.abstract(self)
+      end
+
+      # If the importer is based on files on the local filesystem
+      # this method should return folders which should be watched
+      # for changes.
+      #
+      # @return [Array<String>] List of absolute paths of directories to watch
+      def directories_to_watch
+        []
+      end
+
+      # If this importer is based on files on the local filesystem This method
+      # should return true if the file, when changed, should trigger a
+      # recompile.
+      #
+      # It is acceptable for non-sass files to be watched and trigger a recompile.
+      #
+      # @param filename [String] The absolute filename for a file that has changed.
+      # @return [Boolean] When the file changed should cause a recompile.
+      def watched_file?(filename)
+        false
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers/deprecated_path.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers/deprecated_path.rb
new file mode 100644
index 0000000..d817c9d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers/deprecated_path.rb
@@ -0,0 +1,51 @@
+module Sass
+  module Importers
+    # This importer emits a deprecation warning the first time it is used to
+    # import a file. It is used to deprecate the current working
+    # directory from the list of automatic sass load paths.
+    class DeprecatedPath < Filesystem
+      # @param root [String] The absolute, expanded path to the folder that is deprecated.
+      def initialize(root)
+        @specified_root = root
+        @warning_given = false
+        super
+      end
+
+      # @see Sass::Importers::Base#find
+      def find(*args)
+        found = super
+        if found && !@warning_given
+          @warning_given = true
+          Sass::Util.sass_warn deprecation_warning
+        end
+        found
+      end
+
+      # @see Base#directories_to_watch
+      def directories_to_watch
+        # The current working directory was not watched in Sass 3.2,
+        # so we continue not to watch it while it's deprecated.
+        []
+      end
+
+      # @see Sass::Importers::Base#to_s
+      def to_s
+        "#{@root} (DEPRECATED)"
+      end
+
+      protected
+
+      # @return [String] The deprecation warning that will be printed the first
+      #   time an import occurs.
+      def deprecation_warning
+        path = @specified_root == "." ? "the current working directory" : @specified_root
+        <<WARNING
+DEPRECATION WARNING: Importing from #{path} will not be
+automatic in future versions of Sass.  To avoid future errors, you can add it
+to your environment explicitly by setting `SASS_PATH=#{@specified_root}`, by using the -I command
+line option, or by changing your Sass configuration options.
+WARNING
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers/filesystem.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers/filesystem.rb
new file mode 100644
index 0000000..754dad9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/importers/filesystem.rb
@@ -0,0 +1,219 @@
+require 'set'
+
+module Sass
+  module Importers
+    # The default importer, used for any strings found in the load path.
+    # Simply loads Sass files from the filesystem using the default logic.
+    class Filesystem < Base
+      attr_accessor :root
+
+      # Creates a new filesystem importer that imports files relative to a given path.
+      #
+      # @param root [String] The root path.
+      #   This importer will import files relative to this path.
+      def initialize(root)
+        @root = File.expand_path(root)
+        @real_root = Sass::Util.realpath(@root).to_s
+        @same_name_warnings = Set.new
+      end
+
+      # @see Base#find_relative
+      def find_relative(name, base, options)
+        _find(File.dirname(base), name, options)
+      end
+
+      # @see Base#find
+      def find(name, options)
+        _find(@root, name, options)
+      end
+
+      # @see Base#mtime
+      def mtime(name, options)
+        file, _ = Sass::Util.destructure(find_real_file(@root, name, options))
+        File.mtime(file) if file
+      rescue Errno::ENOENT
+        nil
+      end
+
+      # @see Base#key
+      def key(name, options)
+        [self.class.name + ":" + File.dirname(File.expand_path(name)),
+         File.basename(name)]
+      end
+
+      # @see Base#to_s
+      def to_s
+        @root
+      end
+
+      def hash
+        @root.hash
+      end
+
+      def eql?(other)
+        !other.nil? && other.respond_to?(:root) && root.eql?(other.root)
+      end
+
+      # @see Base#directories_to_watch
+      def directories_to_watch
+        [root]
+      end
+
+      # @see Base#watched_file?
+      def watched_file?(filename)
+        # Check against the root with symlinks resolved, since Listen
+        # returns fully-resolved paths.
+        filename =~ /\.s[ac]ss$/ && filename.start_with?(@real_root + File::SEPARATOR)
+      end
+
+      def public_url(name, sourcemap_directory)
+        file_pathname = Sass::Util.cleanpath(File.absolute_path(name, @root))
+        return Sass::Util.file_uri_from_path(file_pathname) if sourcemap_directory.nil?
+
+        sourcemap_pathname = Sass::Util.cleanpath(sourcemap_directory)
+        begin
+          Sass::Util.file_uri_from_path(
+            Sass::Util.relative_path_from(file_pathname, sourcemap_pathname))
+        rescue ArgumentError # when a relative path cannot be constructed
+          Sass::Util.file_uri_from_path(file_pathname)
+        end
+      end
+
+      protected
+
+      # If a full uri is passed, this removes the root from it
+      # otherwise returns the name unchanged
+      def remove_root(name)
+        if name.index(@root + "/") == 0
+          name[(@root.length + 1)..-1]
+        else
+          name
+        end
+      end
+
+      # A hash from file extensions to the syntaxes for those extensions.
+      # The syntaxes must be `:sass` or `:scss`.
+      #
+      # This can be overridden by subclasses that want normal filesystem importing
+      # with unusual extensions.
+      #
+      # @return [{String => Symbol}]
+      def extensions
+        {'sass' => :sass, 'scss' => :scss}
+      end
+
+      # Given an `@import`ed path, returns an array of possible
+      # on-disk filenames and their corresponding syntaxes for that path.
+      #
+      # @param name [String] The filename.
+      # @return [Array(String, Symbol)] An array of pairs.
+      #   The first element of each pair is a filename to look for;
+      #   the second element is the syntax that file would be in (`:sass` or `:scss`).
+      def possible_files(name)
+        name = escape_glob_characters(name)
+        dirname, basename, extname = split(name)
+        sorted_exts = extensions.sort
+        syntax = extensions[extname]
+
+        if syntax
+          ret = [["#{dirname}/{_,}#{basename}.#{extensions.invert[syntax]}", syntax]]
+        else
+          ret = sorted_exts.map {|ext, syn| ["#{dirname}/{_,}#{basename}.#{ext}", syn]}
+        end
+
+        # JRuby chokes when trying to import files from JARs when the path starts with './'.
+        ret.map {|f, s| [f.sub(%r{^\./}, ''), s]}
+      end
+
+      def escape_glob_characters(name)
+        name.gsub(/[\*\[\]\{\}\?]/) do |char|
+          "\\#{char}"
+        end
+      end
+
+      REDUNDANT_DIRECTORY = /#{Regexp.escape(File::SEPARATOR)}\.#{Regexp.escape(File::SEPARATOR)}/
+      # Given a base directory and an `@import`ed name,
+      # finds an existent file that matches the name.
+      #
+      # @param dir [String] The directory relative to which to search.
+      # @param name [String] The filename to search for.
+      # @return [(String, Symbol)] A filename-syntax pair.
+      def find_real_file(dir, name, options)
+        # On windows 'dir' or 'name' can be in native File::ALT_SEPARATOR form.
+        dir = dir.gsub(File::ALT_SEPARATOR, File::SEPARATOR) unless File::ALT_SEPARATOR.nil?
+        name = name.gsub(File::ALT_SEPARATOR, File::SEPARATOR) unless File::ALT_SEPARATOR.nil?
+
+        found = possible_files(remove_root(name)).map do |f, s|
+          path = if dir == "." || Sass::Util.pathname(f).absolute?
+                   f
+                 else
+                   "#{escape_glob_characters(dir)}/#{f}"
+                 end
+          Dir[path].map do |full_path|
+            full_path.gsub!(REDUNDANT_DIRECTORY, File::SEPARATOR)
+            [Sass::Util.cleanpath(full_path).to_s, s]
+          end
+        end.flatten(1)
+        return if found.empty?
+
+        if found.size > 1 && !@same_name_warnings.include?(found.first.first)
+          found.each {|(f, _)| @same_name_warnings << f}
+          relative_to = Sass::Util.pathname(dir)
+          if options[:_from_import_node]
+            # If _line exists, we're here due to an actual import in an
+            # import_node and we want to print a warning for a user writing an
+            # ambiguous import.
+            candidates = found.map do |(f, _)|
+              "  " + Sass::Util.pathname(f).relative_path_from(relative_to).to_s
+            end.join("\n")
+            raise Sass::SyntaxError.new(<<MESSAGE)
+It's not clear which file to import for '@import "#{name}"'.
+Candidates:
+#{candidates}
+Please delete or rename all but one of these files.
+MESSAGE
+          else
+            # Otherwise, we're here via StalenessChecker, and we want to print a
+            # warning for a user running `sass --watch` with two ambiguous files.
+            candidates = found.map {|(f, _)| "    " + File.basename(f)}.join("\n")
+            Sass::Util.sass_warn <<WARNING
+WARNING: In #{File.dirname(name)}:
+  There are multiple files that match the name "#{File.basename(name)}":
+#{candidates}
+WARNING
+          end
+        end
+        found.first
+      end
+
+      # Splits a filename into three parts, a directory part, a basename, and an extension
+      # Only the known extensions returned from the extensions method will be recognized as such.
+      def split(name)
+        extension = nil
+        dirname, basename = File.dirname(name), File.basename(name)
+        if basename =~ /^(.*)\.(#{extensions.keys.map {|e| Regexp.escape(e)}.join('|')})$/
+          basename = $1
+          extension = $2
+        end
+        [dirname, basename, extension]
+      end
+
+      private
+
+      def _find(dir, name, options)
+        full_filename, syntax = Sass::Util.destructure(find_real_file(dir, name, options))
+        return unless full_filename && File.readable?(full_filename)
+
+        # TODO: this preserves historical behavior, but it's possible
+        # :filename should be either normalized to the native format
+        # or consistently URI-format.
+        full_filename = full_filename.tr("\\", "/") if Sass::Util.windows?
+
+        options[:syntax] = syntax
+        options[:filename] = full_filename
+        options[:importer] = self
+        Sass::Engine.new(File.read(full_filename), options)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger.rb
new file mode 100644
index 0000000..7b0fdf9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger.rb
@@ -0,0 +1,17 @@
+module Sass::Logger; end
+
+require "sass/logger/log_level"
+require "sass/logger/base"
+require "sass/logger/delayed"
+
+module Sass
+  class << self
+    def logger=(l)
+      Thread.current[:sass_logger] = l
+    end
+
+    def logger
+      Thread.current[:sass_logger] ||= Sass::Logger::Base.new
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger/base.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger/base.rb
new file mode 100644
index 0000000..4c6224c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger/base.rb
@@ -0,0 +1,36 @@
+require 'sass/logger/log_level'
+
+class Sass::Logger::Base
+  include Sass::Logger::LogLevel
+
+  attr_accessor :log_level
+  attr_accessor :disabled
+  attr_accessor :io
+
+  log_level :trace
+  log_level :debug
+  log_level :info
+  log_level :warn
+  log_level :error
+
+  def initialize(log_level = :debug, io = nil)
+    self.log_level = log_level
+    self.io = io
+  end
+
+  def logging_level?(level)
+    !disabled && self.class.log_level?(level, log_level)
+  end
+
+  def log(level, message)
+    _log(level, message) if logging_level?(level)
+  end
+
+  def _log(level, message)
+    if io
+      io.puts(message)
+    else
+      Kernel.warn(message)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger/delayed.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger/delayed.rb
new file mode 100644
index 0000000..393d896
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger/delayed.rb
@@ -0,0 +1,50 @@
+require 'sass/logger/log_level'
+
+# A logger that delays messages until they're explicitly flushed to an inner
+# logger.
+#
+# This can be installed around the current logger by calling \{#install!}, and
+# the original logger can be replaced by calling \{#uninstall!}. The log
+# messages can be flushed by calling \{#flush}.
+class Sass::Logger::Delayed < Sass::Logger::Base
+  # Installs a new delayed logger as the current Sass logger, wrapping the
+  # original logger.
+  #
+  # This can be undone by calling \{#uninstall!}.
+  #
+  # @return [Sass::Logger::Delayed] The newly-created logger.
+  def self.install!
+    logger = Sass::Logger::Delayed.new(Sass.logger)
+    Sass.logger = logger
+    logger
+  end
+
+  # Creates a delayed logger wrapping `inner`.
+  #
+  # @param inner [Sass::Logger::Base] The wrapped logger.
+  def initialize(inner)
+    self.log_level = inner.log_level
+    @inner = inner
+    @messages = []
+  end
+
+  # Flushes all queued logs to the wrapped logger.
+  def flush
+    @messages.each {|(l, m)| @inner.log(l, m)}
+  end
+
+  # Uninstalls this logger from \{Sass.logger\}. This should only be called if
+  # the logger was installed using \{#install!}
+  def uninstall!
+    if Sass.logger != self
+      throw Exception.new("Can't uninstall a logger that's not currently installed.")
+    end
+
+    @inner.log_level = log_level
+    Sass.logger = @inner
+  end
+
+  def _log(level, message)
+    @messages << [level, message]
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger/log_level.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger/log_level.rb
new file mode 100644
index 0000000..39e7cec
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/logger/log_level.rb
@@ -0,0 +1,45 @@
+module Sass
+  module Logger
+    module LogLevel
+      def self.included(base)
+        base.extend(ClassMethods)
+      end
+
+      module ClassMethods
+        def inherited(subclass)
+          subclass.log_levels = subclass.superclass.log_levels.dup
+        end
+
+        attr_writer :log_levels
+
+        def log_levels
+          @log_levels ||= {}
+        end
+
+        def log_level?(level, min_level)
+          log_levels[level] >= log_levels[min_level]
+        end
+
+        def log_level(name, options = {})
+          if options[:prepend]
+            level = log_levels.values.min
+            level = level.nil? ? 0 : level - 1
+          else
+            level = log_levels.values.max
+            level = level.nil? ? 0 : level + 1
+          end
+          log_levels.update(name => level)
+          define_logger(name)
+        end
+
+        def define_logger(name, options = {})
+          class_eval <<-RUBY, __FILE__, __LINE__ + 1
+            def #{name}(message)
+              #{options.fetch(:to, :log)}(#{name.inspect}, message)
+            end
+          RUBY
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/media.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/media.rb
new file mode 100644
index 0000000..dc4542d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/media.rb
@@ -0,0 +1,210 @@
+# A namespace for the `@media` query parse tree.
+module Sass::Media
+  # A comma-separated list of queries.
+  #
+  #     media_query [ ',' S* media_query ]*
+  class QueryList
+    # The queries contained in this list.
+    #
+    # @return [Array<Query>]
+    attr_accessor :queries
+
+    # @param queries [Array<Query>] See \{#queries}
+    def initialize(queries)
+      @queries = queries
+    end
+
+    # Merges this query list with another. The returned query list
+    # queries for the intersection between the two inputs.
+    #
+    # Both query lists should be resolved.
+    #
+    # @param other [QueryList]
+    # @return [QueryList?] The merged list, or nil if there is no intersection.
+    def merge(other)
+      new_queries = queries.map {|q1| other.queries.map {|q2| q1.merge(q2)}}.flatten.compact
+      return if new_queries.empty?
+      QueryList.new(new_queries)
+    end
+
+    # Returns the CSS for the media query list.
+    #
+    # @return [String]
+    def to_css
+      queries.map {|q| q.to_css}.join(', ')
+    end
+
+    # Returns the Sass/SCSS code for the media query list.
+    #
+    # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}).
+    # @return [String]
+    def to_src(options)
+      queries.map {|q| q.to_src(options)}.join(', ')
+    end
+
+    # Returns a representation of the query as an array of strings and
+    # potentially {Sass::Script::Tree::Node}s (if there's interpolation in it).
+    # When the interpolation is resolved and the strings are joined together,
+    # this will be the string representation of this query.
+    #
+    # @return [Array<String, Sass::Script::Tree::Node>]
+    def to_a
+      Sass::Util.intersperse(queries.map {|q| q.to_a}, ', ').flatten
+    end
+
+    # Returns a deep copy of this query list and all its children.
+    #
+    # @return [QueryList]
+    def deep_copy
+      QueryList.new(queries.map {|q| q.deep_copy})
+    end
+  end
+
+  # A single media query.
+  #
+  #     [ [ONLY | NOT]? S* media_type S* | expression ] [ AND S* expression ]*
+  class Query
+    # The modifier for the query.
+    #
+    # When parsed as Sass code, this contains strings and SassScript nodes. When
+    # parsed as CSS, it contains a single string (accessible via
+    # \{#resolved_modifier}).
+    #
+    # @return [Array<String, Sass::Script::Tree::Node>]
+    attr_accessor :modifier
+
+    # The type of the query (e.g. `"screen"` or `"print"`).
+    #
+    # When parsed as Sass code, this contains strings and SassScript nodes. When
+    # parsed as CSS, it contains a single string (accessible via
+    # \{#resolved_type}).
+    #
+    # @return [Array<String, Sass::Script::Tree::Node>]
+    attr_accessor :type
+
+    # The trailing expressions in the query.
+    #
+    # When parsed as Sass code, each expression contains strings and SassScript
+    # nodes. When parsed as CSS, each one contains a single string.
+    #
+    # @return [Array<Array<String, Sass::Script::Tree::Node>>]
+    attr_accessor :expressions
+
+    # @param modifier [Array<String, Sass::Script::Tree::Node>] See \{#modifier}
+    # @param type [Array<String, Sass::Script::Tree::Node>] See \{#type}
+    # @param expressions [Array<Array<String, Sass::Script::Tree::Node>>] See \{#expressions}
+    def initialize(modifier, type, expressions)
+      @modifier = modifier
+      @type = type
+      @expressions = expressions
+    end
+
+    # See \{#modifier}.
+    # @return [String]
+    def resolved_modifier
+      # modifier should contain only a single string
+      modifier.first || ''
+    end
+
+    # See \{#type}.
+    # @return [String]
+    def resolved_type
+      # type should contain only a single string
+      type.first || ''
+    end
+
+    # Merges this query with another. The returned query queries for
+    # the intersection between the two inputs.
+    #
+    # Both queries should be resolved.
+    #
+    # @param other [Query]
+    # @return [Query?] The merged query, or nil if there is no intersection.
+    def merge(other)
+      m1, t1 = resolved_modifier.downcase, resolved_type.downcase
+      m2, t2 = other.resolved_modifier.downcase, other.resolved_type.downcase
+      t1 = t2 if t1.empty?
+      t2 = t1 if t2.empty?
+      if (m1 == 'not') ^ (m2 == 'not')
+        return if t1 == t2
+        type = m1 == 'not' ? t2 : t1
+        mod = m1 == 'not' ? m2 : m1
+      elsif m1 == 'not' && m2 == 'not'
+        # CSS has no way of representing "neither screen nor print"
+        return unless t1 == t2
+        type = t1
+        mod = 'not'
+      elsif t1 != t2
+        return
+      else # t1 == t2, neither m1 nor m2 are "not"
+        type = t1
+        mod = m1.empty? ? m2 : m1
+      end
+      Query.new([mod], [type], other.expressions + expressions)
+    end
+
+    # Returns the CSS for the media query.
+    #
+    # @return [String]
+    def to_css
+      css = ''
+      css << resolved_modifier
+      css << ' ' unless resolved_modifier.empty?
+      css << resolved_type
+      css << ' and ' unless resolved_type.empty? || expressions.empty?
+      css << expressions.map do |e|
+        # It's possible for there to be script nodes in Expressions even when
+        # we're converting to CSS in the case where we parsed the document as
+        # CSS originally (as in css_test.rb).
+        e.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.to_sass : c.to_s}.join
+      end.join(' and ')
+      css
+    end
+
+    # Returns the Sass/SCSS code for the media query.
+    #
+    # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}).
+    # @return [String]
+    def to_src(options)
+      src = ''
+      src << Sass::Media._interp_to_src(modifier, options)
+      src << ' ' unless modifier.empty?
+      src << Sass::Media._interp_to_src(type, options)
+      src << ' and ' unless type.empty? || expressions.empty?
+      src << expressions.map do |e|
+        Sass::Media._interp_to_src(e, options)
+      end.join(' and ')
+      src
+    end
+
+    # @see \{MediaQuery#to\_a}
+    def to_a
+      res = []
+      res += modifier
+      res << ' ' unless modifier.empty?
+      res += type
+      res << ' and ' unless type.empty? || expressions.empty?
+      res += Sass::Util.intersperse(expressions, ' and ').flatten
+      res
+    end
+
+    # Returns a deep copy of this query and all its children.
+    #
+    # @return [Query]
+    def deep_copy
+      Query.new(
+        modifier.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c},
+        type.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c},
+        expressions.map {|e| e.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}})
+    end
+  end
+
+  # Converts an interpolation array to source.
+  #
+  # @param interp [Array<String, Sass::Script::Tree::Node>] The interpolation array to convert.
+  # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}).
+  # @return [String]
+  def self._interp_to_src(interp, options)
+    interp.map {|r| r.is_a?(String) ? r : r.to_sass(options)}.join
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin.rb
new file mode 100644
index 0000000..b558a97
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin.rb
@@ -0,0 +1,134 @@
+require 'fileutils'
+
+require 'sass'
+require 'sass/plugin/compiler'
+
+module Sass
+  # This module provides a single interface to the compilation of Sass/SCSS files
+  # for an application. It provides global options and checks whether CSS files
+  # need to be updated.
+  #
+  # This module is used as the primary interface with Sass
+  # when it's used as a plugin for various frameworks.
+  # All Rack-enabled frameworks are supported out of the box.
+  # The plugin is
+  # {file:SASS_REFERENCE.md#Rack_Rails_Merb_Plugin automatically activated for Rails and Merb}.
+  # Other frameworks must enable it explicitly; see {Sass::Plugin::Rack}.
+  #
+  # This module has a large set of callbacks available
+  # to allow users to run code (such as logging) when certain things happen.
+  # All callback methods are of the form `on_#{name}`,
+  # and they all take a block that's called when the given action occurs.
+  #
+  # Note that this class proxies almost all methods to its {Sass::Plugin::Compiler} instance.
+  # See \{#compiler}.
+  #
+  # @example Using a callback
+  #   Sass::Plugin.on_updating_stylesheet do |template, css|
+  #     puts "Compiling #{template} to #{css}"
+  #   end
+  #   Sass::Plugin.update_stylesheets
+  #     #=> Compiling app/sass/screen.scss to public/stylesheets/screen.css
+  #     #=> Compiling app/sass/print.scss to public/stylesheets/print.css
+  #     #=> Compiling app/sass/ie.scss to public/stylesheets/ie.css
+  # @see Sass::Plugin::Compiler
+  module Plugin
+    extend self
+
+    @checked_for_updates = false
+
+    # Whether or not Sass has **ever** checked if the stylesheets need to be updated
+    # (in this Ruby instance).
+    #
+    # @return [Boolean]
+    attr_accessor :checked_for_updates
+
+    # Same as \{#update\_stylesheets}, but respects \{#checked\_for\_updates}
+    # and the {file:SASS_REFERENCE.md#always_update-option `:always_update`}
+    # and {file:SASS_REFERENCE.md#always_check-option `:always_check`} options.
+    #
+    # @see #update_stylesheets
+    def check_for_updates
+      return unless !Sass::Plugin.checked_for_updates ||
+          Sass::Plugin.options[:always_update] || Sass::Plugin.options[:always_check]
+      update_stylesheets
+    end
+
+    # Returns the singleton compiler instance.
+    # This compiler has been pre-configured according
+    # to the plugin configuration.
+    #
+    # @return [Sass::Plugin::Compiler]
+    def compiler
+      @compiler ||= Compiler.new
+    end
+
+    # Updates out-of-date stylesheets.
+    #
+    # Checks each Sass/SCSS file in
+    # {file:SASS_REFERENCE.md#template_location-option `:template_location`}
+    # to see if it's been modified more recently than the corresponding CSS file
+    # in {file:SASS_REFERENCE.md#css_location-option `:css_location`}.
+    # If it has, it updates the CSS file.
+    #
+    # @param individual_files [Array<(String, String)>]
+    #   A list of files to check for updates
+    #   **in addition to those specified by the
+    #   {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.**
+    #   The first string in each pair is the location of the Sass/SCSS file,
+    #   the second is the location of the CSS file that it should be compiled to.
+    def update_stylesheets(individual_files = [])
+      return if options[:never_update]
+      compiler.update_stylesheets(individual_files)
+    end
+
+    # Updates all stylesheets, even those that aren't out-of-date.
+    # Ignores the cache.
+    #
+    # @param individual_files [Array<(String, String)>]
+    #   A list of files to check for updates
+    #   **in addition to those specified by the
+    #   {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.**
+    #   The first string in each pair is the location of the Sass/SCSS file,
+    #   the second is the location of the CSS file that it should be compiled to.
+    # @see #update_stylesheets
+    def force_update_stylesheets(individual_files = [])
+      Compiler.new(
+        options.dup.merge(
+          :never_update => false,
+          :always_update => true,
+          :cache => false)).update_stylesheets(individual_files)
+    end
+
+    # All other method invocations are proxied to the \{#compiler}.
+    #
+    # @see #compiler
+    # @see Sass::Plugin::Compiler
+    def method_missing(method, *args, &block)
+      if compiler.respond_to?(method)
+        compiler.send(method, *args, &block)
+      else
+        super
+      end
+    end
+
+    # For parity with method_missing
+    def respond_to?(method)
+      super || compiler.respond_to?(method)
+    end
+
+    # There's a small speedup by not using method missing for frequently delegated methods.
+    def options
+      compiler.options
+    end
+  end
+end
+
+if defined?(ActionController)
+  # On Rails 3+ the rails plugin is loaded at the right time in railtie.rb
+  require 'sass/plugin/rails' unless Sass::Util.ap_geq_3?
+elsif defined?(Merb::Plugins)
+  require 'sass/plugin/merb'
+else
+  require 'sass/plugin/generic'
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/compiler.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/compiler.rb
new file mode 100644
index 0000000..f3ae6e3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/compiler.rb
@@ -0,0 +1,552 @@
+require 'fileutils'
+
+require 'sass'
+# XXX CE: is this still necessary now that we have the compiler class?
+require 'sass/callbacks'
+require 'sass/plugin/configuration'
+require 'sass/plugin/staleness_checker'
+
+module Sass::Plugin
+  # The Compiler class handles compilation of multiple files and/or directories,
+  # including checking which CSS files are out-of-date and need to be updated
+  # and calling Sass to perform the compilation on those files.
+  #
+  # {Sass::Plugin} uses this class to update stylesheets for a single application.
+  # Unlike {Sass::Plugin}, though, the Compiler class has no global state,
+  # and so multiple instances may be created and used independently.
+  #
+  # If you need to compile a Sass string into CSS,
+  # please see the {Sass::Engine} class.
+  #
+  # Unlike {Sass::Plugin}, this class doesn't keep track of
+  # whether or how many times a stylesheet should be updated.
+  # Therefore, the following `Sass::Plugin` options are ignored by the Compiler:
+  #
+  # * `:never_update`
+  # * `:always_check`
+  class Compiler
+    include Configuration
+    extend Sass::Callbacks
+
+    # Creates a new compiler.
+    #
+    # @param opts [{Symbol => Object}]
+    #   See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
+    def initialize(opts = {})
+      @watched_files = Set.new
+      options.merge!(opts)
+    end
+
+    # Register a callback to be run before stylesheets are mass-updated.
+    # This is run whenever \{#update\_stylesheets} is called,
+    # unless the \{file:SASS_REFERENCE.md#never_update-option `:never_update` option}
+    # is enabled.
+    #
+    # @yield [files]
+    # @yieldparam files [<(String, String, String)>]
+    #   Individual files to be updated. Files in directories specified are included in this list.
+    #   The first element of each pair is the source file,
+    #   the second is the target CSS file,
+    #   the third is the target sourcemap file.
+    define_callback :updating_stylesheets
+
+    # Register a callback to be run after stylesheets are mass-updated.
+    # This is run whenever \{#update\_stylesheets} is called,
+    # unless the \{file:SASS_REFERENCE.md#never_update-option `:never_update` option}
+    # is enabled.
+    #
+    # @yield [updated_files]
+    # @yieldparam updated_files [<(String, String)>]
+    #   Individual files that were updated.
+    #   The first element of each pair is the source file, the second is the target CSS file.
+    define_callback :updated_stylesheets
+
+    # Register a callback to be run after a single stylesheet is updated.
+    # The callback is only run if the stylesheet is really updated;
+    # if the CSS file is fresh, this won't be run.
+    #
+    # Even if the \{file:SASS_REFERENCE.md#full_exception-option `:full_exception` option}
+    # is enabled, this callback won't be run
+    # when an exception CSS file is being written.
+    # To run an action for those files, use \{#on\_compilation\_error}.
+    #
+    # @yield [template, css, sourcemap]
+    # @yieldparam template [String]
+    #   The location of the Sass/SCSS file being updated.
+    # @yieldparam css [String]
+    #   The location of the CSS file being generated.
+    # @yieldparam sourcemap [String]
+    #   The location of the sourcemap being generated, if any.
+    define_callback :updated_stylesheet
+
+    # Register a callback to be run when compilation starts.
+    #
+    # In combination with on_updated_stylesheet, this could be used
+    # to collect compilation statistics like timing or to take a
+    # diff of the changes to the output file.
+    #
+    # @yield [template, css, sourcemap]
+    # @yieldparam template [String]
+    #   The location of the Sass/SCSS file being updated.
+    # @yieldparam css [String]
+    #   The location of the CSS file being generated.
+    # @yieldparam sourcemap [String]
+    #   The location of the sourcemap being generated, if any.
+    define_callback :compilation_starting
+
+    # Register a callback to be run when Sass decides not to update a stylesheet.
+    # In particular, the callback is run when Sass finds that
+    # the template file and none of its dependencies
+    # have been modified since the last compilation.
+    #
+    # Note that this is **not** run when the
+    # \{file:SASS_REFERENCE.md#never-update_option `:never_update` option} is set,
+    # nor when Sass decides not to compile a partial.
+    #
+    # @yield [template, css]
+    # @yieldparam template [String]
+    #   The location of the Sass/SCSS file not being updated.
+    # @yieldparam css [String]
+    #   The location of the CSS file not being generated.
+    define_callback :not_updating_stylesheet
+
+    # Register a callback to be run when there's an error
+    # compiling a Sass file.
+    # This could include not only errors in the Sass document,
+    # but also errors accessing the file at all.
+    #
+    # @yield [error, template, css]
+    # @yieldparam error [Exception] The exception that was raised.
+    # @yieldparam template [String]
+    #   The location of the Sass/SCSS file being updated.
+    # @yieldparam css [String]
+    #   The location of the CSS file being generated.
+    define_callback :compilation_error
+
+    # Register a callback to be run when Sass creates a directory
+    # into which to put CSS files.
+    #
+    # Note that even if multiple levels of directories need to be created,
+    # the callback may only be run once.
+    # For example, if "foo/" exists and "foo/bar/baz/" needs to be created,
+    # this may only be run for "foo/bar/baz/".
+    # This is not a guarantee, however;
+    # it may also be run for "foo/bar/".
+    #
+    # @yield [dirname]
+    # @yieldparam dirname [String]
+    #   The location of the directory that was created.
+    define_callback :creating_directory
+
+    # Register a callback to be run when Sass detects
+    # that a template has been modified.
+    # This is only run when using \{#watch}.
+    #
+    # @yield [template]
+    # @yieldparam template [String]
+    #   The location of the template that was modified.
+    define_callback :template_modified
+
+    # Register a callback to be run when Sass detects
+    # that a new template has been created.
+    # This is only run when using \{#watch}.
+    #
+    # @yield [template]
+    # @yieldparam template [String]
+    #   The location of the template that was created.
+    define_callback :template_created
+
+    # Register a callback to be run when Sass detects
+    # that a template has been deleted.
+    # This is only run when using \{#watch}.
+    #
+    # @yield [template]
+    # @yieldparam template [String]
+    #   The location of the template that was deleted.
+    define_callback :template_deleted
+
+    # Register a callback to be run when Sass deletes a CSS file.
+    # This happens when the corresponding Sass/SCSS file has been deleted
+    # and when the compiler cleans the output files.
+    #
+    # @yield [filename]
+    # @yieldparam filename [String]
+    #   The location of the CSS file that was deleted.
+    define_callback :deleting_css
+
+    # Register a callback to be run when Sass deletes a sourcemap file.
+    # This happens when the corresponding Sass/SCSS file has been deleted
+    # and when the compiler cleans the output files.
+    #
+    # @yield [filename]
+    # @yieldparam filename [String]
+    #   The location of the sourcemap file that was deleted.
+    define_callback :deleting_sourcemap
+
+    # Updates out-of-date stylesheets.
+    #
+    # Checks each Sass/SCSS file in
+    # {file:SASS_REFERENCE.md#template_location-option `:template_location`}
+    # to see if it's been modified more recently than the corresponding CSS file
+    # in {file:SASS_REFERENCE.md#css_location-option `:css_location`}.
+    # If it has, it updates the CSS file.
+    #
+    # @param individual_files [Array<(String, String[, String])>]
+    #   A list of files to check for updates
+    #   **in addition to those specified by the
+    #   {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.**
+    #   The first string in each pair is the location of the Sass/SCSS file,
+    #   the second is the location of the CSS file that it should be compiled to.
+    #   The third string, if provided, is the location of the Sourcemap file.
+    def update_stylesheets(individual_files = [])
+      Sass::Plugin.checked_for_updates = true
+      staleness_checker = StalenessChecker.new(engine_options)
+
+      files = file_list(individual_files)
+      run_updating_stylesheets(files)
+
+      updated_stylesheets = []
+      files.each do |file, css, sourcemap|
+        # TODO: Does staleness_checker need to check the sourcemap file as well?
+        if options[:always_update] || staleness_checker.stylesheet_needs_update?(css, file)
+          # XXX For consistency, this should return the sourcemap too, but it would
+          # XXX be an API change.
+          updated_stylesheets << [file, css]
+          update_stylesheet(file, css, sourcemap)
+        else
+          run_not_updating_stylesheet(file, css, sourcemap)
+        end
+      end
+      run_updated_stylesheets(updated_stylesheets)
+    end
+
+    # Construct a list of files that might need to be compiled
+    # from the provided individual_files and the template_locations.
+    #
+    # Note: this method does not cache the results as they can change
+    # across invocations when sass files are added or removed.
+    #
+    # @param individual_files [Array<(String, String[, String])>]
+    #   A list of files to check for updates
+    #   **in addition to those specified by the
+    #   {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.**
+    #   The first string in each pair is the location of the Sass/SCSS file,
+    #   the second is the location of the CSS file that it should be compiled to.
+    #   The third string, if provided, is the location of the Sourcemap file.
+    # @return [Array<(String, String, String)>]
+    #   A list of [sass_file, css_file, sourcemap_file] tuples similar
+    #   to what was passed in, but expanded to include the current state
+    #   of the directories being updated.
+    def file_list(individual_files = [])
+      files = individual_files.map do |tuple|
+        if engine_options[:sourcemap] == :none
+          tuple[0..1]
+        elsif tuple.size < 3
+          [tuple[0], tuple[1], Sass::Util.sourcemap_name(tuple[1])]
+        else
+          tuple.dup
+        end
+      end
+
+      template_location_array.each do |template_location, css_location|
+        Sass::Util.glob(File.join(template_location, "**", "[^_]*.s[ca]ss")).sort.each do |file|
+          # Get the relative path to the file
+          name = Sass::Util.relative_path_from(file, template_location).to_s
+          css = css_filename(name, css_location)
+          sourcemap = Sass::Util.sourcemap_name(css) unless engine_options[:sourcemap] == :none
+          files << [file, css, sourcemap]
+        end
+      end
+      files
+    end
+
+    # Watches the template directory (or directories)
+    # and updates the CSS files whenever the related Sass/SCSS files change.
+    # `watch` never returns.
+    #
+    # Whenever a change is detected to a Sass/SCSS file in
+    # {file:SASS_REFERENCE.md#template_location-option `:template_location`},
+    # the corresponding CSS file in {file:SASS_REFERENCE.md#css_location-option `:css_location`}
+    # will be recompiled.
+    # The CSS files of any Sass/SCSS files that import the changed file will also be recompiled.
+    #
+    # Before the watching starts in earnest, `watch` calls \{#update\_stylesheets}.
+    #
+    # Note that `watch` uses the [Listen](http://github.com/guard/listen) library
+    # to monitor the filesystem for changes.
+    # Listen isn't loaded until `watch` is run.
+    # The version of Listen distributed with Sass is loaded by default,
+    # but if another version has already been loaded that will be used instead.
+    #
+    # @param individual_files [Array<(String, String[, String])>]
+    #   A list of files to check for updates
+    #   **in addition to those specified by the
+    #   {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.**
+    #   The first string in each pair is the location of the Sass/SCSS file,
+    #   the second is the location of the CSS file that it should be compiled to.
+    #   The third string, if provided, is the location of the Sourcemap file.
+    # @param options [Hash] The options that control how watching works.
+    # @option options [Boolean] :skip_initial_update
+    #   Don't do an initial update when starting the watcher when true
+    def watch(individual_files = [], options = {})
+      @inferred_directories = []
+      options, individual_files = individual_files, [] if individual_files.is_a?(Hash)
+      update_stylesheets(individual_files) unless options[:skip_initial_update]
+
+      directories = watched_paths
+      individual_files.each do |(source, _, _)|
+        source = File.expand_path(source)
+        @watched_files << Sass::Util.realpath(source).to_s
+        @inferred_directories << File.dirname(source)
+      end
+
+      directories += @inferred_directories
+      directories = remove_redundant_directories(directories)
+
+      # TODO: Keep better track of what depends on what
+      # so we don't have to run a global update every time anything changes.
+      # XXX The :additional_watch_paths option exists for Compass to use until
+      # a deprecated feature is removed. It may be removed without warning.
+      directories += Array(options[:additional_watch_paths])
+
+      options = {
+        :relative_paths => false,
+        # The native windows listener is much slower than the polling option, according to
+        # https://github.com/nex3/sass/commit/a3031856b22bc834a5417dedecb038b7be9b9e3e
+        :force_polling => @options[:poll] || Sass::Util.windows?
+      }
+
+      listener = create_listener(*directories, options) do |modified, added, removed|
+        on_file_changed(individual_files, modified, added, removed)
+        yield(modified, added, removed) if block_given?
+      end
+
+      begin
+        listener.start
+        sleep
+      rescue Interrupt
+        # Squelch Interrupt for clean exit from Listen::Listener
+      end
+    end
+
+    # Non-destructively modifies \{#options} so that default values are properly set,
+    # and returns the result.
+    #
+    # @param additional_options [{Symbol => Object}] An options hash with which to merge \{#options}
+    # @return [{Symbol => Object}] The modified options hash
+    def engine_options(additional_options = {})
+      opts = options.merge(additional_options)
+      opts[:load_paths] = load_paths(opts)
+      options[:sourcemap] = :auto if options[:sourcemap] == true
+      options[:sourcemap] = :none if options[:sourcemap] == false
+      opts
+    end
+
+    # Compass expects this to exist
+    def stylesheet_needs_update?(css_file, template_file)
+      StalenessChecker.stylesheet_needs_update?(css_file, template_file)
+    end
+
+    # Remove all output files that would be created by calling update_stylesheets, if they exist.
+    #
+    # This method runs the deleting_css and deleting_sourcemap callbacks for
+    # the files that are deleted.
+    #
+    # @param individual_files [Array<(String, String[, String])>]
+    #   A list of files to check for updates
+    #   **in addition to those specified by the
+    #   {file:SASS_REFERENCE.md#template_location-option `:template_location` option}.**
+    #   The first string in each pair is the location of the Sass/SCSS file,
+    #   the second is the location of the CSS file that it should be compiled to.
+    #   The third string, if provided, is the location of the Sourcemap file.
+    def clean(individual_files = [])
+      file_list(individual_files).each do |(_, css_file, sourcemap_file)|
+        if File.exist?(css_file)
+          run_deleting_css css_file
+          File.delete(css_file)
+        end
+        if sourcemap_file && File.exist?(sourcemap_file)
+          run_deleting_sourcemap sourcemap_file
+          File.delete(sourcemap_file)
+        end
+      end
+      nil
+    end
+
+    private
+
+    # This is mocked out in compiler_test.rb.
+    def create_listener(*args, &block)
+      require 'sass-listen'
+      SassListen.to(*args, &block)
+    end
+
+    def remove_redundant_directories(directories)
+      dedupped = []
+      directories.each do |new_directory|
+        # no need to add a directory that is already watched.
+        next if dedupped.any? do |existing_directory|
+          child_of_directory?(existing_directory, new_directory)
+        end
+        # get rid of any sub directories of this new directory
+        dedupped.reject! do |existing_directory|
+          child_of_directory?(new_directory, existing_directory)
+        end
+        dedupped << new_directory
+      end
+      dedupped
+    end
+
+    def on_file_changed(individual_files, modified, added, removed)
+      recompile_required = false
+
+      modified.uniq.each do |f|
+        next unless watched_file?(f)
+        recompile_required = true
+        run_template_modified(relative_to_pwd(f))
+      end
+
+      added.uniq.each do |f|
+        next unless watched_file?(f)
+        recompile_required = true
+        run_template_created(relative_to_pwd(f))
+      end
+
+      removed.uniq.each do |f|
+        next unless watched_file?(f)
+        run_template_deleted(relative_to_pwd(f))
+        if (files = individual_files.find {|(source, _, _)| File.expand_path(source) == f})
+          recompile_required = true
+          # This was a file we were watching explicitly and compiling to a particular location.
+          # Delete the corresponding file.
+          try_delete_css files[1]
+        else
+          next unless watched_file?(f)
+          recompile_required = true
+          # Look for the sass directory that contained the sass file
+          # And try to remove the css file that corresponds to it
+          template_location_array.each do |(sass_dir, css_dir)|
+            sass_dir = File.expand_path(sass_dir)
+            next unless child_of_directory?(sass_dir, f)
+            remainder = f[(sass_dir.size + 1)..-1]
+            try_delete_css(css_filename(remainder, css_dir))
+            break
+          end
+        end
+      end
+
+      return unless recompile_required
+
+      # In case a file we're watching is removed and then recreated we
+      # prune out the non-existant files here.
+      watched_files_remaining = individual_files.select {|(source, _, _)| File.exist?(source)}
+      update_stylesheets(watched_files_remaining)
+    end
+
+    def update_stylesheet(filename, css, sourcemap)
+      dir = File.dirname(css)
+      unless File.exist?(dir)
+        run_creating_directory dir
+        FileUtils.mkdir_p dir
+      end
+
+      begin
+        File.read(filename) unless File.readable?(filename) # triggers an error for handling
+        engine_opts = engine_options(:css_filename => css,
+                                     :filename => filename,
+                                     :sourcemap_filename => sourcemap)
+        mapping = nil
+        run_compilation_starting(filename, css, sourcemap)
+        engine = Sass::Engine.for_file(filename, engine_opts)
+        if sourcemap
+          rendered, mapping = engine.render_with_sourcemap(File.basename(sourcemap))
+        else
+          rendered = engine.render
+        end
+      rescue StandardError => e
+        compilation_error_occurred = true
+        run_compilation_error e, filename, css, sourcemap
+        raise e unless options[:full_exception]
+        rendered = Sass::SyntaxError.exception_to_css(e, options[:line] || 1)
+      end
+
+      write_file(css, rendered)
+      if mapping
+        write_file(
+          sourcemap,
+          mapping.to_json(
+            :css_path => css, :sourcemap_path => sourcemap, :type => options[:sourcemap]))
+      end
+      run_updated_stylesheet(filename, css, sourcemap) unless compilation_error_occurred
+    end
+
+    def write_file(fileName, content)
+      flag = 'w'
+      flag = 'wb' if Sass::Util.windows? && options[:unix_newlines]
+      File.open(fileName, flag) do |file|
+        file.set_encoding(content.encoding)
+        file.print(content)
+      end
+    end
+
+    def try_delete_css(css)
+      if File.exist?(css)
+        run_deleting_css css
+        File.delete css
+      end
+      map = Sass::Util.sourcemap_name(css)
+
+      return unless File.exist?(map)
+
+      run_deleting_sourcemap map
+      File.delete map
+    end
+
+    def watched_file?(file)
+      @watched_files.include?(file) ||
+        normalized_load_paths.any? {|lp| lp.watched_file?(file)} ||
+        @inferred_directories.any? {|d| sass_file_in_directory?(d, file)}
+    end
+
+    def sass_file_in_directory?(directory, filename)
+      filename =~ /\.s[ac]ss$/ && filename.start_with?(directory + File::SEPARATOR)
+    end
+
+    def watched_paths
+      @watched_paths ||= normalized_load_paths.map {|lp| lp.directories_to_watch}.compact.flatten
+    end
+
+    def normalized_load_paths
+      @normalized_load_paths ||=
+        Sass::Engine.normalize_options(:load_paths => load_paths)[:load_paths]
+    end
+
+    def load_paths(opts = options)
+      (opts[:load_paths] || []) + template_locations
+    end
+
+    def template_locations
+      template_location_array.to_a.map {|l| l.first}
+    end
+
+    def css_locations
+      template_location_array.to_a.map {|l| l.last}
+    end
+
+    def css_filename(name, path)
+      "#{path}#{File::SEPARATOR unless path.end_with?(File::SEPARATOR)}#{name}".
+        gsub(/\.s[ac]ss$/, '.css')
+    end
+
+    def relative_to_pwd(f)
+      Sass::Util.relative_path_from(f, Dir.pwd).to_s
+    rescue ArgumentError # when a relative path cannot be computed
+      f
+    end
+
+    def child_of_directory?(parent, child)
+      parent_dir = parent.end_with?(File::SEPARATOR) ? parent : (parent + File::SEPARATOR)
+      child.start_with?(parent_dir) || parent == child
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/configuration.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/configuration.rb
new file mode 100644
index 0000000..93a8aa8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/configuration.rb
@@ -0,0 +1,134 @@
+module Sass
+  module Plugin
+    # We keep configuration in its own self-contained file so that we can load
+    # it independently in Rails 3, where the full plugin stuff is lazy-loaded.
+    #
+    # Note that this is not guaranteed to be thread-safe. For guaranteed thread
+    # safety, use a separate {Sass::Plugin} for each thread.
+    module Configuration
+      # Returns the default options for a {Sass::Plugin::Compiler}.
+      #
+      # @return [{Symbol => Object}]
+      def default_options
+        @default_options ||= {
+          :css_location       => './public/stylesheets',
+          :always_update      => false,
+          :always_check       => true,
+          :full_exception     => true,
+          :cache_location     => ".sass-cache"
+        }.freeze
+      end
+
+      # Resets the options and
+      # {Sass::Callbacks::InstanceMethods#clear_callbacks! clears all callbacks}.
+      def reset!
+        @options = nil
+        clear_callbacks!
+      end
+
+      # An options hash. See {file:SASS_REFERENCE.md#Options the Sass options
+      # documentation}.
+      #
+      # @return [{Symbol => Object}]
+      def options
+        @options ||= default_options.dup
+      end
+
+      # Adds a new template-location/css-location mapping.
+      # This means that Sass/SCSS files in `template_location`
+      # will be compiled to CSS files in `css_location`.
+      #
+      # This is preferred over manually manipulating the
+      # {file:SASS_REFERENCE.md#template_location-option `:template_location` option}
+      # since the option can be in multiple formats.
+      #
+      # Note that this method will change `options[:template_location]`
+      # to be in the Array format.
+      # This means that even if `options[:template_location]`
+      # had previously been a Hash or a String,
+      # it will now be an Array.
+      #
+      # @param template_location [String] The location where Sass/SCSS files will be.
+      # @param css_location [String] The location where compiled CSS files will go.
+      def add_template_location(template_location, css_location = options[:css_location])
+        normalize_template_location!
+        template_location_array << [template_location, css_location]
+      end
+
+      # Removes a template-location/css-location mapping.
+      # This means that Sass/SCSS files in `template_location`
+      # will no longer be compiled to CSS files in `css_location`.
+      #
+      # This is preferred over manually manipulating the
+      # {file:SASS_REFERENCE.md#template_location-option `:template_location` option}
+      # since the option can be in multiple formats.
+      #
+      # Note that this method will change `options[:template_location]`
+      # to be in the Array format.
+      # This means that even if `options[:template_location]`
+      # had previously been a Hash or a String,
+      # it will now be an Array.
+      #
+      # @param template_location [String]
+      #   The location where Sass/SCSS files were,
+      #   which is now going to be ignored.
+      # @param css_location [String]
+      #   The location where compiled CSS files went, but will no longer go.
+      # @return [Boolean]
+      #   Non-`nil` if the given mapping already existed and was removed,
+      #   or `nil` if nothing was changed.
+      def remove_template_location(template_location, css_location = options[:css_location])
+        normalize_template_location!
+        template_location_array.delete([template_location, css_location])
+      end
+
+      # Returns the template locations configured for Sass
+      # as an array of `[template_location, css_location]` pairs.
+      # See the {file:SASS_REFERENCE.md#template_location-option `:template_location` option}
+      # for details.
+      #
+      # Modifications to the returned array may not be persistent.  Use {#add_template_location}
+      # and {#remove_template_location} instead.
+      #
+      # @return [Array<(String, String)>]
+      #   An array of `[template_location, css_location]` pairs.
+      def template_location_array
+        convert_template_location(options[:template_location], options[:css_location])
+      end
+
+      private
+
+      # Returns the given template location, as an array. If it's already an array,
+      # it is returned unmodified. Otherwise, a new array is created and returned.
+      #
+      # @param template_location [String, Array<(String, String)>]
+      #   A single template location, or a pre-normalized array of template
+      #   locations and CSS locations.
+      # @param css_location [String?]
+      #   The location for compiled CSS files.
+      # @return [Array<(String, String)>]
+      #   An array of `[template_location, css_location]` pairs.
+      def convert_template_location(template_location, css_location)
+        return template_location if template_location.is_a?(Array)
+
+        case template_location
+        when nil
+          if css_location
+            [[File.join(css_location, 'sass'), css_location]]
+          else
+            []
+          end
+        when String
+          [[template_location, css_location]]
+        else
+          template_location.to_a
+        end
+      end
+
+      def normalize_template_location!
+        options[:template_location] = convert_template_location(
+          options[:template_location], options[:css_location])
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/generic.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/generic.rb
new file mode 100644
index 0000000..3e82d2d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/generic.rb
@@ -0,0 +1,15 @@
+# The reason some options are declared here rather than in sass/plugin/configuration.rb
+# is that otherwise they'd clobber the Rails-specific options.
+# Since Rails' options are lazy-loaded in Rails 3,
+# they're reverse-merged with the default options
+# so that user configuration is preserved.
+# This means that defaults that differ from Rails'
+# must be declared here.
+
+unless defined?(Sass::GENERIC_LOADED)
+  Sass::GENERIC_LOADED = true
+
+  Sass::Plugin.options.merge!(:css_location   => './public/stylesheets',
+                              :always_update  => false,
+                              :always_check   => true)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/merb.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/merb.rb
new file mode 100644
index 0000000..c8f66b1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/merb.rb
@@ -0,0 +1,48 @@
+unless defined?(Sass::MERB_LOADED)
+  Sass::MERB_LOADED = true
+
+  module Sass::Plugin::Configuration
+    # Different default options in a m environment.
+    def default_options
+      @default_options ||= begin
+        version = Merb::VERSION.split('.').map {|n| n.to_i}
+        if version[0] <= 0 && version[1] < 5
+          root = MERB_ROOT
+          env  = MERB_ENV
+        else
+          root = Merb.root.to_s
+          env  = Merb.environment
+        end
+
+        {
+          :always_update     => false,
+          :template_location => root + '/public/stylesheets/sass',
+          :css_location      => root + '/public/stylesheets',
+          :cache_location    => root + '/tmp/sass-cache',
+          :always_check      => env != "production",
+          :quiet             => env != "production",
+          :full_exception    => env != "production"
+        }.freeze
+      end
+    end
+  end
+
+  config = Merb::Plugins.config[:sass] || Merb::Plugins.config["sass"] || {}
+
+  if defined? config.symbolize_keys!
+    config.symbolize_keys!
+  end
+
+  Sass::Plugin.options.merge!(config)
+
+  require 'sass/plugin/rack'
+  class Sass::Plugin::MerbBootLoader < Merb::BootLoader
+    after Merb::BootLoader::RackUpApplication
+
+    def self.run
+      # Apparently there's no better way than this to add Sass
+      # to Merb's Rack stack.
+      Merb::Config[:app] = Sass::Plugin::Rack.new(Merb::Config[:app])
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/rack.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/rack.rb
new file mode 100644
index 0000000..a147aea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/rack.rb
@@ -0,0 +1,60 @@
+module Sass
+  module Plugin
+    # Rack middleware for compiling Sass code.
+    #
+    # ## Activate
+    #
+    #     require 'sass/plugin/rack'
+    #     use Sass::Plugin::Rack
+    #
+    # ## Customize
+    #
+    #     Sass::Plugin.options.merge!(
+    #       :cache_location => './tmp/sass-cache',
+    #       :never_update => environment != :production,
+    #       :full_exception => environment != :production)
+    #
+    # {file:SASS_REFERENCE.md#Options See the Reference for more options}.
+    #
+    # ## Use
+    #
+    # Put your Sass files in `public/stylesheets/sass`.
+    # Your CSS will be generated in `public/stylesheets`,
+    # and regenerated every request if necessary.
+    # The locations and frequency {file:SASS_REFERENCE.md#Options can be customized}.
+    # That's all there is to it!
+    class Rack
+      # The delay, in seconds, between update checks.
+      # Useful when many resources are requested for a single page.
+      # `nil` means no delay at all.
+      #
+      # @return [Float]
+      attr_accessor :dwell
+
+      # Initialize the middleware.
+      #
+      # @param app [#call] The Rack application
+      # @param dwell [Float] See \{#dwell}
+      def initialize(app, dwell = 1.0)
+        @app = app
+        @dwell = dwell
+        @check_after = Time.now.to_f
+      end
+
+      # Process a request, checking the Sass stylesheets for changes
+      # and updating them if necessary.
+      #
+      # @param env The Rack request environment
+      # @return [(#to_i, {String => String}, Object)] The Rack response
+      def call(env)
+        if @dwell.nil? || Time.now.to_f > @check_after
+          Sass::Plugin.check_for_updates
+          @check_after = Time.now.to_f + @dwell if @dwell
+        end
+        @app.call(env)
+      end
+    end
+  end
+end
+
+require 'sass/plugin'
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/rails.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/rails.rb
new file mode 100644
index 0000000..9e1677f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/rails.rb
@@ -0,0 +1,47 @@
+unless defined?(Sass::RAILS_LOADED)
+  Sass::RAILS_LOADED = true
+
+  module Sass::Plugin::Configuration
+    # Different default options in a rails environment.
+    def default_options
+      return @default_options if @default_options
+      opts = {
+        :quiet             => Sass::Util.rails_env != "production",
+        :full_exception    => Sass::Util.rails_env != "production",
+        :cache_location    => Sass::Util.rails_root + '/tmp/sass-cache'
+      }
+
+      opts.merge!(
+        :always_update     => false,
+        :template_location => Sass::Util.rails_root + '/public/stylesheets/sass',
+        :css_location      => Sass::Util.rails_root + '/public/stylesheets',
+        :always_check      => Sass::Util.rails_env == "development")
+
+      @default_options = opts.freeze
+    end
+  end
+
+  Sass::Plugin.options.reverse_merge!(Sass::Plugin.default_options)
+
+  # Rails 3.1 loads and handles Sass all on its own
+  if defined?(ActionController::Metal)
+    # 3.1 > Rails >= 3.0
+    require 'sass/plugin/rack'
+    Rails.configuration.middleware.use(Sass::Plugin::Rack)
+  elsif defined?(ActionController::Dispatcher) &&
+      defined?(ActionController::Dispatcher.middleware)
+    # Rails >= 2.3
+    require 'sass/plugin/rack'
+    ActionController::Dispatcher.middleware.use(Sass::Plugin::Rack)
+  else
+    module ActionController
+      class Base
+        alias_method :sass_old_process, :process
+        def process(*args)
+          Sass::Plugin.check_for_updates
+          sass_old_process(*args)
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/staleness_checker.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/staleness_checker.rb
new file mode 100644
index 0000000..cecc001
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/plugin/staleness_checker.rb
@@ -0,0 +1,199 @@
+require 'thread'
+
+module Sass
+  module Plugin
+    # The class handles `.s[ca]ss` file staleness checks via their mtime timestamps.
+    #
+    # To speed things up two level of caches are employed:
+    #
+    # * A class-level dependency cache which stores @import paths for each file.
+    #   This is a long-lived cache that is reused by every StalenessChecker instance.
+    # * Three short-lived instance-level caches, one for file mtimes,
+    #   one for whether a file is stale during this particular run.
+    #   and one for the parse tree for a file.
+    #   These are only used by a single StalenessChecker instance.
+    #
+    # Usage:
+    #
+    # * For a one-off staleness check of a single `.s[ca]ss` file,
+    #   the class-level {stylesheet_needs_update?} method
+    #   should be used.
+    # * For a series of staleness checks (e.g. checking all files for staleness)
+    #   a StalenessChecker instance should be created,
+    #   and the instance-level \{#stylesheet\_needs\_update?} method should be used.
+    #   the caches should make the whole process significantly faster.
+    #   *WARNING*: It is important not to retain the instance for too long,
+    #   as its instance-level caches are never explicitly expired.
+    class StalenessChecker
+      @dependencies_cache = {}
+      @dependency_cache_mutex = Mutex.new
+
+      class << self
+        # TODO: attach this to a compiler instance.
+        # @private
+        attr_accessor :dependencies_cache
+        attr_reader :dependency_cache_mutex
+      end
+
+      # Creates a new StalenessChecker
+      # for checking the staleness of several stylesheets at once.
+      #
+      # @param options [{Symbol => Object}]
+      #   See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
+      def initialize(options)
+        # URIs that are being actively checked for staleness. Protects against
+        # import loops.
+        @actively_checking = Set.new
+
+        # Entries in the following instance-level caches are never explicitly expired.
+        # Instead they are supposed to automatically go out of scope when a series of staleness
+        # checks (this instance of StalenessChecker was created for) is finished.
+        @mtimes, @dependencies_stale, @parse_trees = {}, {}, {}
+        @options = Sass::Engine.normalize_options(options)
+      end
+
+      # Returns whether or not a given CSS file is out of date
+      # and needs to be regenerated.
+      #
+      # @param css_file [String] The location of the CSS file to check.
+      # @param template_file [String] The location of the Sass or SCSS template
+      #   that is compiled to `css_file`.
+      # @return [Boolean] Whether the stylesheet needs to be updated.
+      def stylesheet_needs_update?(css_file, template_file, importer = nil)
+        template_file = File.expand_path(template_file)
+        begin
+          css_mtime = File.mtime(css_file)
+        rescue Errno::ENOENT
+          return true
+        end
+        stylesheet_modified_since?(template_file, css_mtime, importer)
+      end
+
+      # Returns whether a Sass or SCSS stylesheet has been modified since a given time.
+      #
+      # @param template_file [String] The location of the Sass or SCSS template.
+      # @param mtime [Time] The modification time to check against.
+      # @param importer [Sass::Importers::Base] The importer used to locate the stylesheet.
+      #   Defaults to the filesystem importer.
+      # @return [Boolean] Whether the stylesheet has been modified.
+      def stylesheet_modified_since?(template_file, mtime, importer = nil)
+        importer ||= @options[:filesystem_importer].new(".")
+        dependency_updated?(mtime).call(template_file, importer)
+      end
+
+      # Returns whether or not a given CSS file is out of date
+      # and needs to be regenerated.
+      #
+      # The distinction between this method and the instance-level \{#stylesheet\_needs\_update?}
+      # is that the instance method preserves mtime and stale-dependency caches,
+      # so it's better to use when checking multiple stylesheets at once.
+      #
+      # @param css_file [String] The location of the CSS file to check.
+      # @param template_file [String] The location of the Sass or SCSS template
+      #   that is compiled to `css_file`.
+      # @return [Boolean] Whether the stylesheet needs to be updated.
+      def self.stylesheet_needs_update?(css_file, template_file, importer = nil)
+        new(Plugin.engine_options).stylesheet_needs_update?(css_file, template_file, importer)
+      end
+
+      # Returns whether a Sass or SCSS stylesheet has been modified since a given time.
+      #
+      # The distinction between this method and the instance-level \{#stylesheet\_modified\_since?}
+      # is that the instance method preserves mtime and stale-dependency caches,
+      # so it's better to use when checking multiple stylesheets at once.
+      #
+      # @param template_file [String] The location of the Sass or SCSS template.
+      # @param mtime [Time] The modification time to check against.
+      # @param importer [Sass::Importers::Base] The importer used to locate the stylesheet.
+      #   Defaults to the filesystem importer.
+      # @return [Boolean] Whether the stylesheet has been modified.
+      def self.stylesheet_modified_since?(template_file, mtime, importer = nil)
+        new(Plugin.engine_options).stylesheet_modified_since?(template_file, mtime, importer)
+      end
+
+      private
+
+      def dependencies_stale?(uri, importer, css_mtime)
+        timestamps = @dependencies_stale[[uri, importer]] ||= {}
+        timestamps.each_pair do |checked_css_mtime, is_stale|
+          if checked_css_mtime <= css_mtime && !is_stale
+            return false
+          elsif checked_css_mtime > css_mtime && is_stale
+            return true
+          end
+        end
+        timestamps[css_mtime] = dependencies(uri, importer).any?(&dependency_updated?(css_mtime))
+      rescue Sass::SyntaxError
+        # If there's an error finding dependencies, default to recompiling.
+        true
+      end
+
+      def mtime(uri, importer)
+        @mtimes[[uri, importer]] ||=
+          begin
+            mtime = importer.mtime(uri, @options)
+            if mtime.nil?
+              with_dependency_cache {|cache| cache.delete([uri, importer])}
+              nil
+            else
+              mtime
+            end
+          end
+      end
+
+      def dependencies(uri, importer)
+        stored_mtime, dependencies =
+          with_dependency_cache {|cache| Sass::Util.destructure(cache[[uri, importer]])}
+
+        if !stored_mtime || stored_mtime < mtime(uri, importer)
+          dependencies = compute_dependencies(uri, importer)
+          with_dependency_cache do |cache|
+            cache[[uri, importer]] = [mtime(uri, importer), dependencies]
+          end
+        end
+
+        dependencies
+      end
+
+      def dependency_updated?(css_mtime)
+        proc do |uri, importer|
+          next true if @actively_checking.include?(uri)
+          begin
+            @actively_checking << uri
+            sass_mtime = mtime(uri, importer)
+            !sass_mtime ||
+              sass_mtime > css_mtime ||
+              dependencies_stale?(uri, importer, css_mtime)
+          ensure
+            @actively_checking.delete uri
+          end
+        end
+      end
+
+      def compute_dependencies(uri, importer)
+        tree(uri, importer).grep(Tree::ImportNode) do |n|
+          next if n.css_import?
+          file = n.imported_file
+          key = [file.options[:filename], file.options[:importer]]
+          @parse_trees[key] = file.to_tree
+          key
+        end.compact
+      end
+
+      def tree(uri, importer)
+        @parse_trees[[uri, importer]] ||= importer.find(uri, @options).to_tree
+      end
+
+      # Get access to the global dependency cache in a threadsafe manner.
+      # Inside the block, no other thread can access the dependency cache.
+      #
+      # @yieldparam cache [Hash] The hash that is the global dependency cache
+      # @return The value returned by the block to which this method yields
+      def with_dependency_cache
+        StalenessChecker.dependency_cache_mutex.synchronize do
+          yield StalenessChecker.dependencies_cache
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/railtie.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/railtie.rb
new file mode 100644
index 0000000..ad1f03d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/railtie.rb
@@ -0,0 +1,10 @@
+# Rails 3.0.0.beta.2+, < 3.1
+if defined?(ActiveSupport) && ActiveSupport.public_methods.include?(:on_load) &&
+    !Sass::Util.ap_geq?('3.1.0.beta')
+  require 'sass/plugin/configuration'
+  ActiveSupport.on_load(:before_configuration) do
+    require 'sass'
+    require 'sass/plugin'
+    require 'sass/plugin/rails'
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/repl.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/repl.rb
new file mode 100644
index 0000000..e9b9e6c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/repl.rb
@@ -0,0 +1,57 @@
+require 'readline'
+
+module Sass
+  # Runs a SassScript read-eval-print loop.
+  # It presents a prompt on the terminal,
+  # reads in SassScript expressions,
+  # evaluates them,
+  # and prints the result.
+  class Repl
+    # @param options [{Symbol => Object}] An options hash.
+    def initialize(options = {})
+      @options = options
+    end
+
+    # Starts the read-eval-print loop.
+    def run
+      environment = Environment.new
+      @line = 0
+      loop do
+        @line += 1
+        unless (text = Readline.readline('>> '))
+          puts
+          return
+        end
+
+        Readline::HISTORY << text
+        parse_input(environment, text)
+      end
+    end
+
+    private
+
+    def parse_input(environment, text)
+      case text
+      when Script::MATCH
+        name = $1
+        guarded = !!$3
+        val = Script::Parser.parse($2, @line, text.size - ($3 || '').size - $2.size)
+
+        unless guarded && environment.var(name)
+          environment.set_var(name, val.perform(environment))
+        end
+
+        p environment.var(name)
+      else
+        p Script::Parser.parse(text, @line, 0).perform(environment)
+      end
+    rescue Sass::SyntaxError => e
+      puts "SyntaxError: #{e.message}"
+      if @options[:trace]
+        e.backtrace.each do |line|
+          puts "\tfrom #{line}"
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/root.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/root.rb
new file mode 100644
index 0000000..31e19c5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/root.rb
@@ -0,0 +1,7 @@
+module Sass
+  # The root directory of the Sass source tree.
+  # This may be overridden by the package manager
+  # if the lib directory is separated from the main source tree.
+  # @api public
+  ROOT_DIR = File.expand_path(File.join(__FILE__, "../../.."))
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script.rb
new file mode 100644
index 0000000..c852f06
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script.rb
@@ -0,0 +1,66 @@
+require 'sass/scss/rx'
+
+module Sass
+  # SassScript is code that's embedded in Sass documents
+  # to allow for property values to be computed from variables.
+  #
+  # This module contains code that handles the parsing and evaluation of SassScript.
+  module Script
+    # The regular expression used to parse variables.
+    MATCH = /^\$(#{Sass::SCSS::RX::IDENT})\s*:\s*(.+?)
+      (!#{Sass::SCSS::RX::IDENT}(?:\s+!#{Sass::SCSS::RX::IDENT})*)?$/x
+
+    # The regular expression used to validate variables without matching.
+    VALIDATE = /^\$#{Sass::SCSS::RX::IDENT}$/
+
+    # Parses a string of SassScript
+    #
+    # @param value [String] The SassScript
+    # @param line [Integer] The number of the line on which the SassScript appeared.
+    #   Used for error reporting
+    # @param offset [Integer] The number of characters in on `line` that the SassScript started.
+    #   Used for error reporting
+    # @param options [{Symbol => Object}] An options hash;
+    #   see {file:SASS_REFERENCE.md#Options the Sass options documentation}
+    # @return [Script::Tree::Node] The root node of the parse tree
+    def self.parse(value, line, offset, options = {})
+      Parser.parse(value, line, offset, options)
+    rescue Sass::SyntaxError => e
+      e.message << ": #{value.inspect}." if e.message == "SassScript error"
+      e.modify_backtrace(:line => line, :filename => options[:filename])
+      raise e
+    end
+
+    require 'sass/script/functions'
+    require 'sass/script/parser'
+    require 'sass/script/tree'
+    require 'sass/script/value'
+
+    # @private
+    CONST_RENAMES = {
+      :Literal => Sass::Script::Value::Base,
+      :ArgList => Sass::Script::Value::ArgList,
+      :Bool => Sass::Script::Value::Bool,
+      :Color => Sass::Script::Value::Color,
+      :List => Sass::Script::Value::List,
+      :Null => Sass::Script::Value::Null,
+      :Number => Sass::Script::Value::Number,
+      :String => Sass::Script::Value::String,
+      :Node => Sass::Script::Tree::Node,
+      :Funcall => Sass::Script::Tree::Funcall,
+      :Interpolation => Sass::Script::Tree::Interpolation,
+      :Operation => Sass::Script::Tree::Operation,
+      :StringInterpolation => Sass::Script::Tree::StringInterpolation,
+      :UnaryOperation => Sass::Script::Tree::UnaryOperation,
+      :Variable => Sass::Script::Tree::Variable,
+    }
+
+    # @private
+    def self.const_missing(name)
+      klass = CONST_RENAMES[name]
+      super unless klass
+      CONST_RENAMES.each {|n, k| const_set(n, k)}
+      klass
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/css_lexer.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/css_lexer.rb
new file mode 100644
index 0000000..6362a9d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/css_lexer.rb
@@ -0,0 +1,33 @@
+module Sass
+  module Script
+    # This is a subclass of {Lexer} for use in parsing plain CSS properties.
+    #
+    # @see Sass::SCSS::CssParser
+    class CssLexer < Lexer
+      private
+
+      def token
+        important || super
+      end
+
+      def string(re, *args)
+        if re == :uri
+          uri = scan(URI)
+          return unless uri
+          return [:string, Script::Value::String.new(uri)]
+        end
+
+        return unless scan(STRING)
+        string_value = Sass::Script::Value::String.value(@scanner[1] || @scanner[2])
+        value = Script::Value::String.new(string_value, :string)
+        [:string, value]
+      end
+
+      def important
+        s = scan(IMPORTANT)
+        return unless s
+        [:raw, s]
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/css_parser.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/css_parser.rb
new file mode 100644
index 0000000..c93cdb4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/css_parser.rb
@@ -0,0 +1,33 @@
+require 'sass/script'
+require 'sass/script/css_lexer'
+
+module Sass
+  module Script
+    # This is a subclass of {Parser} for use in parsing plain CSS properties.
+    #
+    # @see Sass::SCSS::CssParser
+    class CssParser < Parser
+      private
+
+      # @private
+      def lexer_class; CssLexer; end
+
+      # We need a production that only does /,
+      # since * and % aren't allowed in plain CSS
+      production :div, :unary_plus, :div
+
+      def string
+        tok = try_tok(:string)
+        return number unless tok
+        return if @lexer.peek && @lexer.peek.type == :begin_interpolation
+        literal_node(tok.value, tok.source_range)
+      end
+
+      # Short-circuit all the SassScript-only productions
+      alias_method :interpolation, :space
+      alias_method :or_expr, :div
+      alias_method :unary_div, :ident
+      alias_method :paren, :string
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/functions.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/functions.rb
new file mode 100644
index 0000000..0723788
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/functions.rb
@@ -0,0 +1,2885 @@
+require 'sass/script/value/helpers'
+
+module Sass::Script
+  # @comment
+  #   YARD can't handle some multiline tags, and we need really long tags for function declarations.
+  #   rubocop:disable LineLength
+  # Methods in this module are accessible from the SassScript context.
+  # For example, you can write
+  #
+  #     $color: hsl(120deg, 100%, 50%)
+  #
+  # and it will call {Functions#hsl}.
+  #
+  # The following functions are provided:
+  #
+  # *Note: These functions are described in more detail below.*
+  #
+  # ## RGB Functions
+  #
+  # \{#rgb rgb($red, $green, $blue)}
+  # : Creates a {Sass::Script::Value::Color Color} from red, green, and blue
+  #   values.
+  #
+  # \{#rgba rgba($red, $green, $blue, $alpha)}
+  # : Creates a {Sass::Script::Value::Color Color} from red, green, blue, and
+  #   alpha values.
+  #
+  # \{#red red($color)}
+  # : Gets the red component of a color.
+  #
+  # \{#green green($color)}
+  # : Gets the green component of a color.
+  #
+  # \{#blue blue($color)}
+  # : Gets the blue component of a color.
+  #
+  # \{#mix mix($color1, $color2, \[$weight\])}
+  # : Mixes two colors together.
+  #
+  # ## HSL Functions
+  #
+  # \{#hsl hsl($hue, $saturation, $lightness)}
+  # : Creates a {Sass::Script::Value::Color Color} from hue, saturation, and
+  #   lightness values.
+  #
+  # \{#hsla hsla($hue, $saturation, $lightness, $alpha)}
+  # : Creates a {Sass::Script::Value::Color Color} from hue, saturation,
+  #   lightness, and alpha values.
+  #
+  # \{#hue hue($color)}
+  # : Gets the hue component of a color.
+  #
+  # \{#saturation saturation($color)}
+  # : Gets the saturation component of a color.
+  #
+  # \{#lightness lightness($color)}
+  # : Gets the lightness component of a color.
+  #
+  # \{#adjust_hue adjust-hue($color, $degrees)}
+  # : Changes the hue of a color.
+  #
+  # \{#lighten lighten($color, $amount)}
+  # : Makes a color lighter.
+  #
+  # \{#darken darken($color, $amount)}
+  # : Makes a color darker.
+  #
+  # \{#saturate saturate($color, $amount)}
+  # : Makes a color more saturated.
+  #
+  # \{#desaturate desaturate($color, $amount)}
+  # : Makes a color less saturated.
+  #
+  # \{#grayscale grayscale($color)}
+  # : Converts a color to grayscale.
+  #
+  # \{#complement complement($color)}
+  # : Returns the complement of a color.
+  #
+  # \{#invert invert($color, \[$weight\])}
+  # : Returns the inverse of a color.
+  #
+  # ## Opacity Functions
+  #
+  # \{#alpha alpha($color)} / \{#opacity opacity($color)}
+  # : Gets the alpha component (opacity) of a color.
+  #
+  # \{#rgba rgba($color, $alpha)}
+  # : Changes the alpha component for a color.
+  #
+  # \{#opacify opacify($color, $amount)} / \{#fade_in fade-in($color, $amount)}
+  # : Makes a color more opaque.
+  #
+  # \{#transparentize transparentize($color, $amount)} / \{#fade_out fade-out($color, $amount)}
+  # : Makes a color more transparent.
+  #
+  # ## Other Color Functions
+  #
+  # \{#adjust_color adjust-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\])}
+  # : Increases or decreases one or more components of a color.
+  #
+  # \{#scale_color scale-color($color, \[$red\], \[$green\], \[$blue\], \[$saturation\], \[$lightness\], \[$alpha\])}
+  # : Fluidly scales one or more properties of a color.
+  #
+  # \{#change_color change-color($color, \[$red\], \[$green\], \[$blue\], \[$hue\], \[$saturation\], \[$lightness\], \[$alpha\])}
+  # : Changes one or more properties of a color.
+  #
+  # \{#ie_hex_str ie-hex-str($color)}
+  # : Converts a color into the format understood by IE filters.
+  #
+  # ## String Functions
+  #
+  # \{#unquote unquote($string)}
+  # : Removes quotes from a string.
+  #
+  # \{#quote quote($string)}
+  # : Adds quotes to a string.
+  #
+  # \{#str_length str-length($string)}
+  # : Returns the number of characters in a string.
+  #
+  # \{#str_insert str-insert($string, $insert, $index)}
+  # : Inserts `$insert` into `$string` at `$index`.
+  #
+  # \{#str_index str-index($string, $substring)}
+  # : Returns the index of the first occurrence of `$substring` in `$string`.
+  #
+  # \{#str_slice str-slice($string, $start-at, [$end-at])}
+  # : Extracts a substring from `$string`.
+  #
+  # \{#to_upper_case to-upper-case($string)}
+  # : Converts a string to upper case.
+  #
+  # \{#to_lower_case to-lower-case($string)}
+  # : Converts a string to lower case.
+  #
+  # ## Number Functions
+  #
+  # \{#percentage percentage($number)}
+  # : Converts a unitless number to a percentage.
+  #
+  # \{#round round($number)}
+  # : Rounds a number to the nearest whole number.
+  #
+  # \{#ceil ceil($number)}
+  # : Rounds a number up to the next whole number.
+  #
+  # \{#floor floor($number)}
+  # : Rounds a number down to the previous whole number.
+  #
+  # \{#abs abs($number)}
+  # : Returns the absolute value of a number.
+  #
+  # \{#min min($numbers...)\}
+  # : Finds the minimum of several numbers.
+  #
+  # \{#max max($numbers...)\}
+  # : Finds the maximum of several numbers.
+  #
+  # \{#random random([$limit])\}
+  # : Returns a random number.
+  #
+  # ## List Functions {#list-functions}
+  #
+  # Lists in Sass are immutable; all list functions return a new list rather
+  # than updating the existing list in-place.
+  #
+  # All list functions work for maps as well, treating them as lists of pairs.
+  #
+  # \{#length length($list)}
+  # : Returns the length of a list.
+  #
+  # \{#nth nth($list, $n)}
+  # : Returns a specific item in a list.
+  #
+  # \{#set-nth set-nth($list, $n, $value)}
+  # : Replaces the nth item in a list.
+  #
+  # \{#join join($list1, $list2, \[$separator, $bracketed\])}
+  # : Joins together two lists into one.
+  #
+  # \{#append append($list1, $val, \[$separator\])}
+  # : Appends a single value onto the end of a list.
+  #
+  # \{#zip zip($lists...)}
+  # : Combines several lists into a single multidimensional list.
+  #
+  # \{#index index($list, $value)}
+  # : Returns the position of a value within a list.
+  #
+  # \{#list_separator list-separator($list)}
+  # : Returns the separator of a list.
+  #
+  # \{#is_bracketed is-bracketed($list)}
+  # : Returns whether a list has square brackets.
+  #
+  # ## Map Functions {#map-functions}
+  #
+  # Maps in Sass are immutable; all map functions return a new map rather than
+  # updating the existing map in-place.
+  #
+  # \{#map_get map-get($map, $key)}
+  # : Returns the value in a map associated with a given key.
+  #
+  # \{#map_merge map-merge($map1, $map2)}
+  # : Merges two maps together into a new map.
+  #
+  # \{#map_remove map-remove($map, $keys...)}
+  # : Returns a new map with keys removed.
+  #
+  # \{#map_keys map-keys($map)}
+  # : Returns a list of all keys in a map.
+  #
+  # \{#map_values map-values($map)}
+  # : Returns a list of all values in a map.
+  #
+  # \{#map_has_key map-has-key($map, $key)}
+  # : Returns whether a map has a value associated with a given key.
+  #
+  # \{#keywords keywords($args)}
+  # : Returns the keywords passed to a function that takes variable arguments.
+  #
+  # ## Selector Functions
+  #
+  # Selector functions are very liberal in the formats they support
+  # for selector arguments. They can take a plain string, a list of
+  # lists as returned by `&` or anything in between:
+  #
+  # * A plain string, such as `".foo .bar, .baz .bang"`.
+  # * A space-separated list of strings such as `(".foo" ".bar")`.
+  # * A comma-separated list of strings such as `(".foo .bar", ".baz .bang")`.
+  # * A comma-separated list of space-separated lists of strings such
+  #   as `((".foo" ".bar"), (".baz" ".bang"))`.
+  #
+  # In general, selector functions allow placeholder selectors
+  # (`%foo`) but disallow parent-reference selectors (`&`).
+  #
+  # \{#selector_nest selector-nest($selectors...)}
+  # : Nests selector beneath one another like they would be nested in the
+  #   stylesheet.
+  #
+  # \{#selector_append selector-append($selectors...)}
+  # : Appends selectors to one another without spaces in between.
+  #
+  # \{#selector_extend selector-extend($selector, $extendee, $extender)}
+  # : Extends `$extendee` with `$extender` within `$selector`.
+  #
+  # \{#selector_replace selector-replace($selector, $original, $replacement)}
+  # : Replaces `$original` with `$replacement` within `$selector`.
+  #
+  # \{#selector_unify selector-unify($selector1, $selector2)}
+  # : Unifies two selectors to produce a selector that matches
+  #   elements matched by both.
+  #
+  # \{#is_superselector is-superselector($super, $sub)}
+  # : Returns whether `$super` matches all the elements `$sub` does, and
+  #   possibly more.
+  #
+  # \{#simple_selectors simple-selectors($selector)}
+  # : Returns the simple selectors that comprise a compound selector.
+  #
+  # \{#selector_parse selector-parse($selector)}
+  # : Parses a selector into the format returned by `&`.
+  #
+  # ## Introspection Functions
+  #
+  # \{#feature_exists feature-exists($feature)}
+  # : Returns whether a feature exists in the current Sass runtime.
+  #
+  # \{#variable_exists variable-exists($name)}
+  # : Returns whether a variable with the given name exists in the current scope.
+  #
+  # \{#global_variable_exists global-variable-exists($name)}
+  # : Returns whether a variable with the given name exists in the global scope.
+  #
+  # \{#function_exists function-exists($name)}
+  # : Returns whether a function with the given name exists.
+  #
+  # \{#mixin_exists mixin-exists($name)}
+  # : Returns whether a mixin with the given name exists.
+  #
+  # \{#content_exists content-exists()}
+  # : Returns whether the current mixin was passed a content block.
+  #
+  # \{#inspect inspect($value)}
+  # : Returns the string representation of a value as it would be represented in Sass.
+  #
+  # \{#type_of type-of($value)}
+  # : Returns the type of a value.
+  #
+  # \{#unit unit($number)}
+  # : Returns the unit(s) associated with a number.
+  #
+  # \{#unitless unitless($number)}
+  # : Returns whether a number has units.
+  #
+  # \{#comparable comparable($number1, $number2)}
+  # : Returns whether two numbers can be added, subtracted, or compared.
+  #
+  # \{#call call($function, $args...)}
+  # : Dynamically calls a Sass function reference returned by `get-function`.
+  #
+  # \{#get_function get-function($name, $css: false)}
+  # : Looks up a function with the given name in the current lexical scope
+  #   and returns a reference to it.
+  #
+  # ## Miscellaneous Functions
+  #
+  # \{#if if($condition, $if-true, $if-false)}
+  # : Returns one of two values, depending on whether or not `$condition` is
+  #   true.
+  #
+  # \{#unique_id unique-id()}
+  # : Returns a unique CSS identifier.
+  #
+  # ## Adding Custom Functions
+  #
+  # New Sass functions can be added by adding Ruby methods to this module.
+  # For example:
+  #
+  #     module Sass::Script::Functions
+  #       def reverse(string)
+  #         assert_type string, :String
+  #         Sass::Script::Value::String.new(string.value.reverse)
+  #       end
+  #       declare :reverse, [:string]
+  #     end
+  #
+  # Calling {declare} tells Sass the argument names for your function.
+  # If omitted, the function will still work, but will not be able to accept keyword arguments.
+  # {declare} can also allow your function to take arbitrary keyword arguments.
+  #
+  # There are a few things to keep in mind when modifying this module.
+  # First of all, the arguments passed are {Value} objects.
+  # Value objects are also expected to be returned.
+  # This means that Ruby values must be unwrapped and wrapped.
+  #
+  # Most Value objects support the {Value::Base#value value} accessor for getting
+  # their Ruby values. Color objects, though, must be accessed using
+  # {Sass::Script::Value::Color#rgb rgb}, {Sass::Script::Value::Color#red red},
+  # {Sass::Script::Value::Color#blue green}, or {Sass::Script::Value::Color#blue
+  # blue}.
+  #
+  # Second, making Ruby functions accessible from Sass introduces the temptation
+  # to do things like database access within stylesheets.
+  # This is generally a bad idea;
+  # since Sass files are by default only compiled once,
+  # dynamic code is not a great fit.
+  #
+  # If you really, really need to compile Sass on each request,
+  # first make sure you have adequate caching set up.
+  # Then you can use {Sass::Engine} to render the code,
+  # using the {file:SASS_REFERENCE.md#custom-option `options` parameter}
+  # to pass in data that {EvaluationContext#options can be accessed}
+  # from your Sass functions.
+  #
+  # Within one of the functions in this module,
+  # methods of {EvaluationContext} can be used.
+  #
+  # ### Caveats
+  #
+  # When creating new {Value} objects within functions, be aware that it's not
+  # safe to call {Value::Base#to_s #to_s} (or other methods that use the string
+  # representation) on those objects without first setting {Tree::Node#options=
+  # the #options attribute}.
+  #
+  # @comment
+  #   rubocop:enable LineLength
+  #   rubocop:disable ModuleLength
+  module Functions
+    @signatures = {}
+
+    # A class representing a Sass function signature.
+    #
+    # @attr args [Array<String>] The names of the arguments to the function.
+    # @attr delayed_args [Array<String>] The names of the arguments whose evaluation should be
+    #   delayed.
+    # @attr var_args [Boolean] Whether the function takes a variable number of arguments.
+    # @attr var_kwargs [Boolean] Whether the function takes an arbitrary set of keyword arguments.
+    Signature = Struct.new(:args, :delayed_args, :var_args, :var_kwargs, :deprecated)
+
+    # Declare a Sass signature for a Ruby-defined function.
+    # This includes the names of the arguments,
+    # whether the function takes a variable number of arguments,
+    # and whether the function takes an arbitrary set of keyword arguments.
+    #
+    # It's not necessary to declare a signature for a function.
+    # However, without a signature it won't support keyword arguments.
+    #
+    # A single function can have multiple signatures declared
+    # as long as each one takes a different number of arguments.
+    # It's also possible to declare multiple signatures
+    # that all take the same number of arguments,
+    # but none of them but the first will be used
+    # unless the user uses keyword arguments.
+    #
+    # @example
+    #   declare :rgba, [:hex, :alpha]
+    #   declare :rgba, [:red, :green, :blue, :alpha]
+    #   declare :accepts_anything, [], :var_args => true, :var_kwargs => true
+    #   declare :some_func, [:foo, :bar, :baz], :var_kwargs => true
+    #
+    # @param method_name [Symbol] The name of the method
+    #   whose signature is being declared.
+    # @param args [Array<Symbol>] The names of the arguments for the function signature.
+    # @option options :var_args [Boolean] (false)
+    #   Whether the function accepts a variable number of (unnamed) arguments
+    #   in addition to the named arguments.
+    # @option options :var_kwargs [Boolean] (false)
+    #   Whether the function accepts other keyword arguments
+    #   in addition to those in `:args`.
+    #   If this is true, the Ruby function will be passed a hash from strings
+    #   to {Value}s as the last argument.
+    #   In addition, if this is true and `:var_args` is not,
+    #   Sass will ensure that the last argument passed is a hash.
+    def self.declare(method_name, args, options = {})
+      delayed_args = []
+      args = args.map do |a|
+        a = a.to_s
+        if a[0] == ?&
+          a = a[1..-1]
+          delayed_args << a
+        end
+        a
+      end
+      # We don't expose this functionality except to certain builtin methods.
+      if delayed_args.any? && method_name != :if
+        raise ArgumentError.new("Delayed arguments are not allowed for method #{method_name}")
+      end
+      @signatures[method_name] ||= []
+      @signatures[method_name] << Signature.new(
+        args,
+        delayed_args,
+        options[:var_args],
+        options[:var_kwargs],
+        options[:deprecated] && options[:deprecated].map {|a| a.to_s})
+    end
+
+    # Determine the correct signature for the number of arguments
+    # passed in for a given function.
+    # If no signatures match, the first signature is returned for error messaging.
+    #
+    # @param method_name [Symbol] The name of the Ruby function to be called.
+    # @param arg_arity [Integer] The number of unnamed arguments the function was passed.
+    # @param kwarg_arity [Integer] The number of keyword arguments the function was passed.
+    #
+    # @return [{Symbol => Object}, nil]
+    #   The signature options for the matching signature,
+    #   or nil if no signatures are declared for this function. See {declare}.
+    def self.signature(method_name, arg_arity, kwarg_arity)
+      return unless @signatures[method_name]
+      @signatures[method_name].each do |signature|
+        sig_arity = signature.args.size
+        return signature if sig_arity == arg_arity + kwarg_arity
+        next unless sig_arity < arg_arity + kwarg_arity
+
+        # We have enough args.
+        # Now we need to figure out which args are varargs
+        # and if the signature allows them.
+        t_arg_arity, t_kwarg_arity = arg_arity, kwarg_arity
+        if sig_arity > t_arg_arity
+          # we transfer some kwargs arity to args arity
+          # if it does not have enough args -- assuming the names will work out.
+          t_kwarg_arity -= (sig_arity - t_arg_arity)
+          t_arg_arity = sig_arity
+        end
+
+        if (t_arg_arity == sig_arity || t_arg_arity > sig_arity && signature.var_args) &&
+           (t_kwarg_arity == 0 || t_kwarg_arity > 0 && signature.var_kwargs)
+          return signature
+        end
+      end
+      @signatures[method_name].first
+    end
+
+    # Sets the random seed used by Sass's internal random number generator.
+    #
+    # This can be used to ensure consistent random number sequences which
+    # allows for consistent results when testing, etc.
+    #
+    # @param seed [Integer]
+    # @return [Integer] The same seed.
+    def self.random_seed=(seed)
+      @random_number_generator = Random.new(seed)
+    end
+
+    # Get Sass's internal random number generator.
+    #
+    # @return [Random]
+    def self.random_number_generator
+      @random_number_generator ||= Random.new
+    end
+
+    # The context in which methods in {Script::Functions} are evaluated.
+    # That means that all instance methods of {EvaluationContext}
+    # are available to use in functions.
+    class EvaluationContext
+      include Functions
+      include Value::Helpers
+
+      # The human-readable names for [Sass::Script::Value::Base]. The default is
+      # just the downcased name of the type.
+      TYPE_NAMES = {:ArgList => 'variable argument list'}
+
+      # The environment for this function. This environment's
+      # {Environment#parent} is the global environment, and its
+      # {Environment#caller} is a read-only view of the local environment of the
+      # caller of this function.
+      #
+      # @return [Environment]
+      attr_reader :environment
+
+      # The options hash for the {Sass::Engine} that is processing the function call
+      #
+      # @return [{Symbol => Object}]
+      attr_reader :options
+
+      # @param environment [Environment] See \{#environment}
+      def initialize(environment)
+        @environment = environment
+        @options = environment.options
+      end
+
+      # Asserts that the type of a given SassScript value
+      # is the expected type (designated by a symbol).
+      #
+      # Valid types are `:Bool`, `:Color`, `:Number`, and `:String`.
+      # Note that `:String` will match both double-quoted strings
+      # and unquoted identifiers.
+      #
+      # @example
+      #   assert_type value, :String
+      #   assert_type value, :Number
+      # @param value [Sass::Script::Value::Base] A SassScript value
+      # @param type [Symbol, Array<Symbol>] The name(s) of the type the value is expected to be
+      # @param name [String, Symbol, nil] The name of the argument.
+      # @raise [ArgumentError] if value is not of the correct type.
+      def assert_type(value, type, name = nil)
+        valid_types = Array(type)
+        found_type = valid_types.find do |t|
+          value.is_a?(Sass::Script::Value.const_get(t)) ||
+            t == :Map && value.is_a?(Sass::Script::Value::List) && value.value.empty?
+        end
+
+        if found_type
+          value.check_deprecated_interp if found_type == :String
+          return
+        end
+
+        err = if valid_types.size == 1
+                "#{value.inspect} is not a #{TYPE_NAMES[type] || type.to_s.downcase}"
+              else
+                type_names = valid_types.map {|t| TYPE_NAMES[t] || t.to_s.downcase}
+                "#{value.inspect} is not any of #{type_names.join(', ')}"
+              end
+        err = "$#{name.to_s.tr('_', '-')}: " + err if name
+        raise ArgumentError.new(err)
+      end
+
+      # Asserts that the unit of the number is as expected.
+      #
+      # @example
+      #   assert_unit number, "px"
+      #   assert_unit number, nil
+      # @param number [Sass::Script::Value::Number] The number to be validated.
+      # @param unit [::String]
+      #   The unit that the number must have.
+      #   If nil, the number must be unitless.
+      # @param name [::String] The name of the parameter being validated.
+      # @raise [ArgumentError] if number is not of the correct unit or is not a number.
+      def assert_unit(number, unit, name = nil)
+        assert_type number, :Number, name
+        return if number.is_unit?(unit)
+        expectation = unit ? "have a unit of #{unit}" : "be unitless"
+        if name
+          raise ArgumentError.new("Expected $#{name} to #{expectation} but got #{number}")
+        else
+          raise ArgumentError.new("Expected #{number} to #{expectation}")
+        end
+      end
+
+      # Asserts that the value is an integer.
+      #
+      # @example
+      #   assert_integer 2px
+      #   assert_integer 2.5px
+      #     => SyntaxError: "Expected 2.5px to be an integer"
+      #   assert_integer 2.5px, "width"
+      #     => SyntaxError: "Expected width to be an integer but got 2.5px"
+      # @param number [Sass::Script::Value::Base] The value to be validated.
+      # @param name [::String] The name of the parameter being validated.
+      # @raise [ArgumentError] if number is not an integer or is not a number.
+      def assert_integer(number, name = nil)
+        assert_type number, :Number, name
+        return if number.int?
+        if name
+          raise ArgumentError.new("Expected $#{name} to be an integer but got #{number}")
+        else
+          raise ArgumentError.new("Expected #{number} to be an integer")
+        end
+      end
+
+      # Performs a node that has been delayed for execution.
+      #
+      # @private
+      # @param node [Sass::Script::Tree::Node,
+      #   Sass::Script::Value::Base] When this is a tree node, it's
+      #   performed in the caller's environment. When it's a value
+      #   (which can happen when the value had to be performed already
+      #   -- like for a splat), it's returned as-is.
+      # @param env [Sass::Environment] The environment within which to perform the node.
+      #   Defaults to the (read-only) environment of the caller.
+      def perform(node, env = environment.caller)
+        if node.is_a?(Sass::Script::Value::Base)
+          node
+        else
+          node.perform(env)
+        end
+      end
+    end
+
+    class << self
+      # Returns whether user function with a given name exists.
+      #
+      # @param function_name [String]
+      # @return [Boolean]
+      alias_method :callable?, :public_method_defined?
+
+      private
+
+      def include(*args)
+        r = super
+        # We have to re-include ourselves into EvaluationContext to work around
+        # an icky Ruby restriction.
+        EvaluationContext.send :include, self
+        r
+      end
+    end
+
+    # Creates a {Sass::Script::Value::Color Color} object from red, green, and
+    # blue values.
+    #
+    # @see #rgba
+    # @overload rgb($red, $green, $blue)
+    #   @param $red [Sass::Script::Value::Number] The amount of red in the color.
+    #     Must be between 0 and 255 inclusive, or between `0%` and `100%`
+    #     inclusive
+    #   @param $green [Sass::Script::Value::Number] The amount of green in the
+    #     color. Must be between 0 and 255 inclusive, or between `0%` and `100%`
+    #     inclusive
+    #   @param $blue [Sass::Script::Value::Number] The amount of blue in the
+    #     color. Must be between 0 and 255 inclusive, or between `0%` and `100%`
+    #     inclusive
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if any parameter is the wrong type or out of bounds
+    def rgb(red, green, blue)
+      if special_number?(red) || special_number?(green) || special_number?(blue)
+        return unquoted_string("rgb(#{red}, #{green}, #{blue})")
+      end
+      assert_type red, :Number, :red
+      assert_type green, :Number, :green
+      assert_type blue, :Number, :blue
+
+      color_attrs = [red, green, blue].map do |c|
+        if c.is_unit?("%")
+          c.value * 255 / 100.0
+        elsif c.unitless?
+          c.value
+        else
+          raise ArgumentError.new("Expected #{c} to be unitless or have a unit of % but got #{c}")
+        end
+      end
+
+      # Don't store the string representation for function-created colors, both
+      # because it's not very useful and because some functions aren't supported
+      # on older browsers.
+      Sass::Script::Value::Color.new(color_attrs)
+    end
+    declare :rgb, [:red, :green, :blue]
+
+    # Creates a {Sass::Script::Value::Color Color} from red, green, blue, and
+    # alpha values.
+    # @see #rgb
+    #
+    # @overload rgba($red, $green, $blue, $alpha)
+    #   @param $red [Sass::Script::Value::Number] The amount of red in the
+    #     color. Must be between 0 and 255 inclusive or 0% and 100% inclusive
+    #   @param $green [Sass::Script::Value::Number] The amount of green in the
+    #     color. Must be between 0 and 255 inclusive or 0% and 100% inclusive
+    #   @param $blue [Sass::Script::Value::Number] The amount of blue in the
+    #     color. Must be between 0 and 255 inclusive or 0% and 100% inclusive
+    #   @param $alpha [Sass::Script::Value::Number] The opacity of the color.
+    #     Must be between 0 and 1 inclusive
+    #   @return [Sass::Script::Value::Color]
+    #   @raise [ArgumentError] if any parameter is the wrong type or out of
+    #     bounds
+    #
+    # @overload rgba($color, $alpha)
+    #   Sets the opacity of an existing color.
+    #
+    #   @example
+    #     rgba(#102030, 0.5) => rgba(16, 32, 48, 0.5)
+    #     rgba(blue, 0.2)    => rgba(0, 0, 255, 0.2)
+    #
+    #   @param $color [Sass::Script::Value::Color] The color whose opacity will
+    #     be changed.
+    #   @param $alpha [Sass::Script::Value::Number] The new opacity of the
+    #     color. Must be between 0 and 1 inclusive
+    #   @return [Sass::Script::Value::Color]
+    #   @raise [ArgumentError] if `$alpha` is out of bounds or either parameter
+    #     is the wrong type
+    def rgba(*args)
+      case args.size
+      when 2
+        color, alpha = args
+
+        assert_type color, :Color, :color
+        if special_number?(alpha)
+          unquoted_string("rgba(#{color.red}, #{color.green}, #{color.blue}, #{alpha})")
+        else
+          assert_type alpha, :Number, :alpha
+          check_alpha_unit alpha, 'rgba'
+          color.with(:alpha => alpha.value)
+        end
+      when 4
+        red, green, blue, alpha = args
+        if special_number?(red) || special_number?(green) ||
+           special_number?(blue) || special_number?(alpha)
+          unquoted_string("rgba(#{red}, #{green}, #{blue}, #{alpha})")
+        else
+          rgba(rgb(red, green, blue), alpha)
+        end
+      else
+        raise ArgumentError.new("wrong number of arguments (#{args.size} for 4)")
+      end
+    end
+    declare :rgba, [:red, :green, :blue, :alpha]
+    declare :rgba, [:color, :alpha]
+
+    # Creates a {Sass::Script::Value::Color Color} from hue, saturation, and
+    # lightness values. Uses the algorithm from the [CSS3 spec][].
+    #
+    # [CSS3 spec]: http://www.w3.org/TR/css3-color/#hsl-color
+    #
+    # @see #hsla
+    # @overload hsl($hue, $saturation, $lightness)
+    #   @param $hue [Sass::Script::Value::Number] The hue of the color. Should be
+    #     between 0 and 360 degrees, inclusive
+    #   @param $saturation [Sass::Script::Value::Number] The saturation of the
+    #     color. Must be between `0%` and `100%`, inclusive
+    #   @param $lightness [Sass::Script::Value::Number] The lightness of the
+    #     color. Must be between `0%` and `100%`, inclusive
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$saturation` or `$lightness` are out of bounds
+    #   or any parameter is the wrong type
+    def hsl(hue, saturation, lightness)
+      if special_number?(hue) || special_number?(saturation) || special_number?(lightness)
+        unquoted_string("hsl(#{hue}, #{saturation}, #{lightness})")
+      else
+        hsla(hue, saturation, lightness, number(1))
+      end
+    end
+    declare :hsl, [:hue, :saturation, :lightness]
+
+    # Creates a {Sass::Script::Value::Color Color} from hue,
+    # saturation, lightness, and alpha values. Uses the algorithm from
+    # the [CSS3 spec][].
+    #
+    # [CSS3 spec]: http://www.w3.org/TR/css3-color/#hsl-color
+    #
+    # @see #hsl
+    # @overload hsla($hue, $saturation, $lightness, $alpha)
+    #   @param $hue [Sass::Script::Value::Number] The hue of the color. Should be
+    #     between 0 and 360 degrees, inclusive
+    #   @param $saturation [Sass::Script::Value::Number] The saturation of the
+    #     color. Must be between `0%` and `100%`, inclusive
+    #   @param $lightness [Sass::Script::Value::Number] The lightness of the
+    #     color. Must be between `0%` and `100%`, inclusive
+    #   @param $alpha [Sass::Script::Value::Number] The opacity of the color. Must
+    #     be between 0 and 1, inclusive
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$saturation`, `$lightness`, or `$alpha` are out
+    #   of bounds or any parameter is the wrong type
+    def hsla(hue, saturation, lightness, alpha)
+      if special_number?(hue) || special_number?(saturation) ||
+         special_number?(lightness) || special_number?(alpha)
+        return unquoted_string("hsla(#{hue}, #{saturation}, #{lightness}, #{alpha})")
+      end
+      assert_type hue, :Number, :hue
+      assert_type saturation, :Number, :saturation
+      assert_type lightness, :Number, :lightness
+      assert_type alpha, :Number, :alpha
+      check_alpha_unit alpha, 'hsla'
+
+      h = hue.value
+      s = saturation.value
+      l = lightness.value
+
+      # Don't store the string representation for function-created colors, both
+      # because it's not very useful and because some functions aren't supported
+      # on older browsers.
+      Sass::Script::Value::Color.new(
+        :hue => h, :saturation => s, :lightness => l, :alpha => alpha.value)
+    end
+    declare :hsla, [:hue, :saturation, :lightness, :alpha]
+
+    # Gets the red component of a color. Calculated from HSL where necessary via
+    # [this algorithm][hsl-to-rgb].
+    #
+    # [hsl-to-rgb]: http://www.w3.org/TR/css3-color/#hsl-color
+    #
+    # @overload red($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @return [Sass::Script::Value::Number] The red component, between 0 and 255
+    #   inclusive
+    # @raise [ArgumentError] if `$color` isn't a color
+    def red(color)
+      assert_type color, :Color, :color
+      number(color.red)
+    end
+    declare :red, [:color]
+
+    # Gets the green component of a color. Calculated from HSL where necessary
+    # via [this algorithm][hsl-to-rgb].
+    #
+    # [hsl-to-rgb]: http://www.w3.org/TR/css3-color/#hsl-color
+    #
+    # @overload green($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @return [Sass::Script::Value::Number] The green component, between 0 and
+    #   255 inclusive
+    # @raise [ArgumentError] if `$color` isn't a color
+    def green(color)
+      assert_type color, :Color, :color
+      number(color.green)
+    end
+    declare :green, [:color]
+
+    # Gets the blue component of a color. Calculated from HSL where necessary
+    # via [this algorithm][hsl-to-rgb].
+    #
+    # [hsl-to-rgb]: http://www.w3.org/TR/css3-color/#hsl-color
+    #
+    # @overload blue($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @return [Sass::Script::Value::Number] The blue component, between 0 and
+    #   255 inclusive
+    # @raise [ArgumentError] if `$color` isn't a color
+    def blue(color)
+      assert_type color, :Color, :color
+      number(color.blue)
+    end
+    declare :blue, [:color]
+
+    # Returns the hue component of a color. See [the CSS3 HSL
+    # specification][hsl]. Calculated from RGB where necessary via [this
+    # algorithm][rgb-to-hsl].
+    #
+    # [hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV
+    # [rgb-to-hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV
+    #
+    # @overload hue($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @return [Sass::Script::Value::Number] The hue component, between 0deg and
+    #   360deg
+    # @raise [ArgumentError] if `$color` isn't a color
+    def hue(color)
+      assert_type color, :Color, :color
+      number(color.hue, "deg")
+    end
+    declare :hue, [:color]
+
+    # Returns the saturation component of a color. See [the CSS3 HSL
+    # specification][hsl]. Calculated from RGB where necessary via [this
+    # algorithm][rgb-to-hsl].
+    #
+    # [hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV
+    # [rgb-to-hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV
+    #
+    # @overload saturation($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @return [Sass::Script::Value::Number] The saturation component, between 0%
+    #   and 100%
+    # @raise [ArgumentError] if `$color` isn't a color
+    def saturation(color)
+      assert_type color, :Color, :color
+      number(color.saturation, "%")
+    end
+    declare :saturation, [:color]
+
+    # Returns the lightness component of a color. See [the CSS3 HSL
+    # specification][hsl]. Calculated from RGB where necessary via [this
+    # algorithm][rgb-to-hsl].
+    #
+    # [hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV
+    # [rgb-to-hsl]: http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV
+    #
+    # @overload lightness($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @return [Sass::Script::Value::Number] The lightness component, between 0%
+    #   and 100%
+    # @raise [ArgumentError] if `$color` isn't a color
+    def lightness(color)
+      assert_type color, :Color, :color
+      number(color.lightness, "%")
+    end
+    declare :lightness, [:color]
+
+    # Returns the alpha component (opacity) of a color. This is 1 unless
+    # otherwise specified.
+    #
+    # This function also supports the proprietary Microsoft `alpha(opacity=20)`
+    # syntax as a special case.
+    #
+    # @overload alpha($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @return [Sass::Script::Value::Number] The alpha component, between 0 and 1
+    # @raise [ArgumentError] if `$color` isn't a color
+    def alpha(*args)
+      if args.all? do |a|
+           a.is_a?(Sass::Script::Value::String) && a.type == :identifier &&
+             a.value =~ /^[a-zA-Z]+\s*=/
+         end
+        # Support the proprietary MS alpha() function
+        return identifier("alpha(#{args.map {|a| a.to_s}.join(', ')})")
+      end
+
+      raise ArgumentError.new("wrong number of arguments (#{args.size} for 1)") if args.size != 1
+
+      assert_type args.first, :Color, :color
+      number(args.first.alpha)
+    end
+    declare :alpha, [:color]
+
+    # Returns the alpha component (opacity) of a color. This is 1 unless
+    # otherwise specified.
+    #
+    # @overload opacity($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @return [Sass::Script::Value::Number] The alpha component, between 0 and 1
+    # @raise [ArgumentError] if `$color` isn't a color
+    def opacity(color)
+      if color.is_a?(Sass::Script::Value::Number)
+        return identifier("opacity(#{color})")
+      end
+      assert_type color, :Color, :color
+      number(color.alpha)
+    end
+    declare :opacity, [:color]
+
+    # Makes a color more opaque. Takes a color and a number between 0 and 1, and
+    # returns a color with the opacity increased by that amount.
+    #
+    # @see #transparentize
+    # @example
+    #   opacify(rgba(0, 0, 0, 0.5), 0.1) => rgba(0, 0, 0, 0.6)
+    #   opacify(rgba(0, 0, 17, 0.8), 0.2) => #001
+    # @overload opacify($color, $amount)
+    #   @param $color [Sass::Script::Value::Color]
+    #   @param $amount [Sass::Script::Value::Number] The amount to increase the
+    #     opacity by, between 0 and 1
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
+    #   is the wrong type
+    def opacify(color, amount)
+      _adjust(color, amount, :alpha, 0..1, :+)
+    end
+    declare :opacify, [:color, :amount]
+
+    alias_method :fade_in, :opacify
+    declare :fade_in, [:color, :amount]
+
+    # Makes a color more transparent. Takes a color and a number between 0 and
+    # 1, and returns a color with the opacity decreased by that amount.
+    #
+    # @see #opacify
+    # @example
+    #   transparentize(rgba(0, 0, 0, 0.5), 0.1) => rgba(0, 0, 0, 0.4)
+    #   transparentize(rgba(0, 0, 0, 0.8), 0.2) => rgba(0, 0, 0, 0.6)
+    # @overload transparentize($color, $amount)
+    #   @param $color [Sass::Script::Value::Color]
+    #   @param $amount [Sass::Script::Value::Number] The amount to decrease the
+    #     opacity by, between 0 and 1
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
+    #   is the wrong type
+    def transparentize(color, amount)
+      _adjust(color, amount, :alpha, 0..1, :-)
+    end
+    declare :transparentize, [:color, :amount]
+
+    alias_method :fade_out, :transparentize
+    declare :fade_out, [:color, :amount]
+
+    # Makes a color lighter. Takes a color and a number between `0%` and `100%`,
+    # and returns a color with the lightness increased by that amount.
+    #
+    # @see #darken
+    # @example
+    #   lighten(hsl(0, 0%, 0%), 30%) => hsl(0, 0, 30)
+    #   lighten(#800, 20%) => #e00
+    # @overload lighten($color, $amount)
+    #   @param $color [Sass::Script::Value::Color]
+    #   @param $amount [Sass::Script::Value::Number] The amount to increase the
+    #     lightness by, between `0%` and `100%`
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
+    #   is the wrong type
+    def lighten(color, amount)
+      _adjust(color, amount, :lightness, 0..100, :+, "%")
+    end
+    declare :lighten, [:color, :amount]
+
+    # Makes a color darker. Takes a color and a number between 0% and 100%, and
+    # returns a color with the lightness decreased by that amount.
+    #
+    # @see #lighten
+    # @example
+    #   darken(hsl(25, 100%, 80%), 30%) => hsl(25, 100%, 50%)
+    #   darken(#800, 20%) => #200
+    # @overload darken($color, $amount)
+    #   @param $color [Sass::Script::Value::Color]
+    #   @param $amount [Sass::Script::Value::Number] The amount to decrease the
+    #     lightness by, between `0%` and `100%`
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
+    #   is the wrong type
+    def darken(color, amount)
+      _adjust(color, amount, :lightness, 0..100, :-, "%")
+    end
+    declare :darken, [:color, :amount]
+
+    # Makes a color more saturated. Takes a color and a number between 0% and
+    # 100%, and returns a color with the saturation increased by that amount.
+    #
+    # @see #desaturate
+    # @example
+    #   saturate(hsl(120, 30%, 90%), 20%) => hsl(120, 50%, 90%)
+    #   saturate(#855, 20%) => #9e3f3f
+    # @overload saturate($color, $amount)
+    #   @param $color [Sass::Script::Value::Color]
+    #   @param $amount [Sass::Script::Value::Number] The amount to increase the
+    #     saturation by, between `0%` and `100%`
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
+    #   is the wrong type
+    def saturate(color, amount = nil)
+      # Support the filter effects definition of saturate.
+      # https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html
+      return identifier("saturate(#{color})") if amount.nil?
+      _adjust(color, amount, :saturation, 0..100, :+, "%")
+    end
+    declare :saturate, [:color, :amount]
+    declare :saturate, [:amount]
+
+    # Makes a color less saturated. Takes a color and a number between 0% and
+    # 100%, and returns a color with the saturation decreased by that value.
+    #
+    # @see #saturate
+    # @example
+    #   desaturate(hsl(120, 30%, 90%), 20%) => hsl(120, 10%, 90%)
+    #   desaturate(#855, 20%) => #726b6b
+    # @overload desaturate($color, $amount)
+    #   @param $color [Sass::Script::Value::Color]
+    #   @param $amount [Sass::Script::Value::Number] The amount to decrease the
+    #     saturation by, between `0%` and `100%`
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$amount` is out of bounds, or either parameter
+    #   is the wrong type
+    def desaturate(color, amount)
+      _adjust(color, amount, :saturation, 0..100, :-, "%")
+    end
+    declare :desaturate, [:color, :amount]
+
+    # Changes the hue of a color. Takes a color and a number of degrees (usually
+    # between `-360deg` and `360deg`), and returns a color with the hue rotated
+    # along the color wheel by that amount.
+    #
+    # @example
+    #   adjust-hue(hsl(120, 30%, 90%), 60deg) => hsl(180, 30%, 90%)
+    #   adjust-hue(hsl(120, 30%, 90%), -60deg) => hsl(60, 30%, 90%)
+    #   adjust-hue(#811, 45deg) => #886a11
+    # @overload adjust_hue($color, $degrees)
+    #   @param $color [Sass::Script::Value::Color]
+    #   @param $degrees [Sass::Script::Value::Number] The number of degrees to
+    #     rotate the hue
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if either parameter is the wrong type
+    def adjust_hue(color, degrees)
+      assert_type color, :Color, :color
+      assert_type degrees, :Number, :degrees
+      color.with(:hue => color.hue + degrees.value)
+    end
+    declare :adjust_hue, [:color, :degrees]
+
+    # Converts a color into the format understood by IE filters.
+    #
+    # @example
+    #   ie-hex-str(#abc) => #FFAABBCC
+    #   ie-hex-str(#3322BB) => #FF3322BB
+    #   ie-hex-str(rgba(0, 255, 0, 0.5)) => #8000FF00
+    # @overload ie_hex_str($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @return [Sass::Script::Value::String] The IE-formatted string
+    #   representation of the color
+    # @raise [ArgumentError] if `$color` isn't a color
+    def ie_hex_str(color)
+      assert_type color, :Color, :color
+      alpha = Sass::Util.round(color.alpha * 255).to_s(16).rjust(2, '0')
+      identifier("##{alpha}#{color.send(:hex_str)[1..-1]}".upcase)
+    end
+    declare :ie_hex_str, [:color]
+
+    # Increases or decreases one or more properties of a color. This can change
+    # the red, green, blue, hue, saturation, value, and alpha properties. The
+    # properties are specified as keyword arguments, and are added to or
+    # subtracted from the color's current value for that property.
+    #
+    # All properties are optional. You can't specify both RGB properties
+    # (`$red`, `$green`, `$blue`) and HSL properties (`$hue`, `$saturation`,
+    # `$value`) at the same time.
+    #
+    # @example
+    #   adjust-color(#102030, $blue: 5) => #102035
+    #   adjust-color(#102030, $red: -5, $blue: 5) => #0b2035
+    #   adjust-color(hsl(25, 100%, 80%), $lightness: -30%, $alpha: -0.4) => hsla(25, 100%, 50%, 0.6)
+    # @overload adjust_color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])
+    #   @param $color [Sass::Script::Value::Color]
+    #   @param $red [Sass::Script::Value::Number] The adjustment to make on the
+    #     red component, between -255 and 255 inclusive
+    #   @param $green [Sass::Script::Value::Number] The adjustment to make on the
+    #     green component, between -255 and 255 inclusive
+    #   @param $blue [Sass::Script::Value::Number] The adjustment to make on the
+    #     blue component, between -255 and 255 inclusive
+    #   @param $hue [Sass::Script::Value::Number] The adjustment to make on the
+    #     hue component, in degrees
+    #   @param $saturation [Sass::Script::Value::Number] The adjustment to make on
+    #     the saturation component, between `-100%` and `100%` inclusive
+    #   @param $lightness [Sass::Script::Value::Number] The adjustment to make on
+    #     the lightness component, between `-100%` and `100%` inclusive
+    #   @param $alpha [Sass::Script::Value::Number] The adjustment to make on the
+    #     alpha component, between -1 and 1 inclusive
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if any parameter is the wrong type or out-of
+    #   bounds, or if RGB properties and HSL properties are adjusted at the
+    #   same time
+    def adjust_color(color, kwargs)
+      assert_type color, :Color, :color
+      with = Sass::Util.map_hash(
+        "red" => [-255..255, ""],
+        "green" => [-255..255, ""],
+        "blue" => [-255..255, ""],
+        "hue" => nil,
+        "saturation" => [-100..100, "%"],
+        "lightness" => [-100..100, "%"],
+        "alpha" => [-1..1, ""]
+      ) do |name, (range, units)|
+        val = kwargs.delete(name)
+        next unless val
+        assert_type val, :Number, name
+        Sass::Util.check_range("$#{name}: Amount", range, val, units) if range
+        adjusted = color.send(name) + val.value
+        adjusted = [0, Sass::Util.restrict(adjusted, range)].max if range
+        [name.to_sym, adjusted]
+      end
+
+      unless kwargs.empty?
+        name, val = kwargs.to_a.first
+        raise ArgumentError.new("Unknown argument $#{name} (#{val})")
+      end
+
+      color.with(with)
+    end
+    declare :adjust_color, [:color], :var_kwargs => true
+
+    # Fluidly scales one or more properties of a color. Unlike
+    # \{#adjust_color adjust-color}, which changes a color's properties by fixed
+    # amounts, \{#scale_color scale-color} fluidly changes them based on how
+    # high or low they already are. That means that lightening an already-light
+    # color with \{#scale_color scale-color} won't change the lightness much,
+    # but lightening a dark color by the same amount will change it more
+    # dramatically. This has the benefit of making `scale-color($color, ...)`
+    # have a similar effect regardless of what `$color` is.
+    #
+    # For example, the lightness of a color can be anywhere between `0%` and
+    # `100%`. If `scale-color($color, $lightness: 40%)` is called, the resulting
+    # color's lightness will be 40% of the way between its original lightness
+    # and 100. If `scale-color($color, $lightness: -40%)` is called instead, the
+    # lightness will be 40% of the way between the original and 0.
+    #
+    # This can change the red, green, blue, saturation, value, and alpha
+    # properties. The properties are specified as keyword arguments. All
+    # arguments should be percentages between `0%` and `100%`.
+    #
+    # All properties are optional. You can't specify both RGB properties
+    # (`$red`, `$green`, `$blue`) and HSL properties (`$saturation`, `$value`)
+    # at the same time.
+    #
+    # @example
+    #   scale-color(hsl(120, 70%, 80%), $lightness: 50%) => hsl(120, 70%, 90%)
+    #   scale-color(rgb(200, 150%, 170%), $green: -40%, $blue: 70%) => rgb(200, 90, 229)
+    #   scale-color(hsl(200, 70%, 80%), $saturation: -90%, $alpha: -30%) => hsla(200, 7%, 80%, 0.7)
+    # @overload scale_color($color, [$red], [$green], [$blue], [$saturation], [$lightness], [$alpha])
+    #   @param $color [Sass::Script::Value::Color]
+    #   @param $red [Sass::Script::Value::Number]
+    #   @param $green [Sass::Script::Value::Number]
+    #   @param $blue [Sass::Script::Value::Number]
+    #   @param $saturation [Sass::Script::Value::Number]
+    #   @param $lightness [Sass::Script::Value::Number]
+    #   @param $alpha [Sass::Script::Value::Number]
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if any parameter is the wrong type or out-of
+    #   bounds, or if RGB properties and HSL properties are adjusted at the
+    #   same time
+    def scale_color(color, kwargs)
+      assert_type color, :Color, :color
+      with = Sass::Util.map_hash(
+        "red" => 255,
+        "green" => 255,
+        "blue" => 255,
+        "saturation" => 100,
+        "lightness" => 100,
+        "alpha" => 1
+      ) do |name, max|
+        val = kwargs.delete(name)
+        next unless val
+        assert_type val, :Number, name
+        assert_unit val, '%', name
+        Sass::Util.check_range("$#{name}: Amount", -100..100, val, '%')
+
+        current = color.send(name)
+        scale = val.value / 100.0
+        diff = scale > 0 ? max - current : current
+        [name.to_sym, current + diff * scale]
+      end
+
+      unless kwargs.empty?
+        name, val = kwargs.to_a.first
+        raise ArgumentError.new("Unknown argument $#{name} (#{val})")
+      end
+
+      color.with(with)
+    end
+    declare :scale_color, [:color], :var_kwargs => true
+
+    # Changes one or more properties of a color. This can change the red, green,
+    # blue, hue, saturation, value, and alpha properties. The properties are
+    # specified as keyword arguments, and replace the color's current value for
+    # that property.
+    #
+    # All properties are optional. You can't specify both RGB properties
+    # (`$red`, `$green`, `$blue`) and HSL properties (`$hue`, `$saturation`,
+    # `$value`) at the same time.
+    #
+    # @example
+    #   change-color(#102030, $blue: 5) => #102005
+    #   change-color(#102030, $red: 120, $blue: 5) => #782005
+    #   change-color(hsl(25, 100%, 80%), $lightness: 40%, $alpha: 0.8) => hsla(25, 100%, 40%, 0.8)
+    # @overload change_color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])
+    #   @param $color [Sass::Script::Value::Color]
+    #   @param $red [Sass::Script::Value::Number] The new red component for the
+    #     color, within 0 and 255 inclusive
+    #   @param $green [Sass::Script::Value::Number] The new green component for
+    #     the color, within 0 and 255 inclusive
+    #   @param $blue [Sass::Script::Value::Number] The new blue component for the
+    #     color, within 0 and 255 inclusive
+    #   @param $hue [Sass::Script::Value::Number] The new hue component for the
+    #     color, in degrees
+    #   @param $saturation [Sass::Script::Value::Number] The new saturation
+    #     component for the color, between `0%` and `100%` inclusive
+    #   @param $lightness [Sass::Script::Value::Number] The new lightness
+    #     component for the color, within `0%` and `100%` inclusive
+    #   @param $alpha [Sass::Script::Value::Number] The new alpha component for
+    #     the color, within 0 and 1 inclusive
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if any parameter is the wrong type or out-of
+    #   bounds, or if RGB properties and HSL properties are adjusted at the
+    #   same time
+    def change_color(color, kwargs)
+      assert_type color, :Color, :color
+      with = Sass::Util.map_hash(
+        'red' => ['Red value', 0..255],
+        'green' => ['Green value', 0..255],
+        'blue' => ['Blue value', 0..255],
+        'hue' => [],
+        'saturation' => ['Saturation', 0..100, '%'],
+        'lightness' => ['Lightness', 0..100, '%'],
+        'alpha' => ['Alpha channel', 0..1]
+      ) do |name, (desc, range, unit)|
+        val = kwargs.delete(name)
+        next unless val
+        assert_type val, :Number, name
+
+        if range
+          val = Sass::Util.check_range(desc, range, val, unit)
+        else
+          val = val.value
+        end
+
+        [name.to_sym, val]
+      end
+
+      unless kwargs.empty?
+        name, val = kwargs.to_a.first
+        raise ArgumentError.new("Unknown argument $#{name} (#{val})")
+      end
+
+      color.with(with)
+    end
+    declare :change_color, [:color], :var_kwargs => true
+
+    # Mixes two colors together. Specifically, takes the average of each of the
+    # RGB components, optionally weighted by the given percentage. The opacity
+    # of the colors is also considered when weighting the components.
+    #
+    # The weight specifies the amount of the first color that should be included
+    # in the returned color. The default, `50%`, means that half the first color
+    # and half the second color should be used. `25%` means that a quarter of
+    # the first color and three quarters of the second color should be used.
+    #
+    # @example
+    #   mix(#f00, #00f) => #7f007f
+    #   mix(#f00, #00f, 25%) => #3f00bf
+    #   mix(rgba(255, 0, 0, 0.5), #00f) => rgba(63, 0, 191, 0.75)
+    # @overload mix($color1, $color2, $weight: 50%)
+    #   @param $color1 [Sass::Script::Value::Color]
+    #   @param $color2 [Sass::Script::Value::Color]
+    #   @param $weight [Sass::Script::Value::Number] The relative weight of each
+    #     color. Closer to `100%` gives more weight to `$color1`, closer to `0%`
+    #     gives more weight to `$color2`
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$weight` is out of bounds or any parameter is
+    #   the wrong type
+    def mix(color1, color2, weight = number(50))
+      assert_type color1, :Color, :color1
+      assert_type color2, :Color, :color2
+      assert_type weight, :Number, :weight
+
+      Sass::Util.check_range("Weight", 0..100, weight, '%')
+
+      # This algorithm factors in both the user-provided weight (w) and the
+      # difference between the alpha values of the two colors (a) to decide how
+      # to perform the weighted average of the two RGB values.
+      #
+      # It works by first normalizing both parameters to be within [-1, 1],
+      # where 1 indicates "only use color1", -1 indicates "only use color2", and
+      # all values in between indicated a proportionately weighted average.
+      #
+      # Once we have the normalized variables w and a, we apply the formula
+      # (w + a)/(1 + w*a) to get the combined weight (in [-1, 1]) of color1.
+      # This formula has two especially nice properties:
+      #
+      #   * When either w or a are -1 or 1, the combined weight is also that number
+      #     (cases where w * a == -1 are undefined, and handled as a special case).
+      #
+      #   * When a is 0, the combined weight is w, and vice versa.
+      #
+      # Finally, the weight of color1 is renormalized to be within [0, 1]
+      # and the weight of color2 is given by 1 minus the weight of color1.
+      p = (weight.value / 100.0).to_f
+      w = p * 2 - 1
+      a = color1.alpha - color2.alpha
+
+      w1 = ((w * a == -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0
+      w2 = 1 - w1
+
+      rgba = color1.rgb.zip(color2.rgb).map {|v1, v2| v1 * w1 + v2 * w2}
+      rgba << color1.alpha * p + color2.alpha * (1 - p)
+      rgb_color(*rgba)
+    end
+    declare :mix, [:color1, :color2]
+    declare :mix, [:color1, :color2, :weight]
+
+    # Converts a color to grayscale. This is identical to `desaturate(color,
+    # 100%)`.
+    #
+    # @see #desaturate
+    # @overload grayscale($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$color` isn't a color
+    def grayscale(color)
+      if color.is_a?(Sass::Script::Value::Number)
+        return identifier("grayscale(#{color})")
+      end
+      desaturate color, number(100)
+    end
+    declare :grayscale, [:color]
+
+    # Returns the complement of a color. This is identical to `adjust-hue(color,
+    # 180deg)`.
+    #
+    # @see #adjust_hue #adjust-hue
+    # @overload complement($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$color` isn't a color
+    def complement(color)
+      adjust_hue color, number(180)
+    end
+    declare :complement, [:color]
+
+    # Returns the inverse (negative) of a color. The red, green, and blue values
+    # are inverted, while the opacity is left alone.
+    #
+    # @overload invert($color)
+    #   @param $color [Sass::Script::Value::Color]
+    # @overload invert($color, $weight: 100%)
+    #   @param $color [Sass::Script::Value::Color]
+    #   @param $weight [Sass::Script::Value::Number] The relative weight of the
+    #     color color's inverse
+    # @return [Sass::Script::Value::Color]
+    # @raise [ArgumentError] if `$color` isn't a color or `$weight`
+    #   isn't a percentage between 0% and 100%
+    def invert(color, weight = number(100))
+      if color.is_a?(Sass::Script::Value::Number)
+        return identifier("invert(#{color})")
+      end
+
+      assert_type color, :Color, :color
+      inv = color.with(
+        :red => (255 - color.red),
+        :green => (255 - color.green),
+        :blue => (255 - color.blue))
+
+      mix(inv, color, weight)
+    end
+    declare :invert, [:color]
+    declare :invert, [:color, :weight]
+
+    # Removes quotes from a string. If the string is already unquoted, this will
+    # return it unmodified.
+    #
+    # @see #quote
+    # @example
+    #   unquote("foo") => foo
+    #   unquote(foo) => foo
+    # @overload unquote($string)
+    #   @param $string [Sass::Script::Value::String]
+    # @return [Sass::Script::Value::String]
+    # @raise [ArgumentError] if `$string` isn't a string
+    def unquote(string)
+      unless string.is_a?(Sass::Script::Value::String)
+        # Don't warn multiple times for the same source line.
+        # rubocop:disable GlobalVars
+        $_sass_warned_for_unquote ||= Set.new
+        frame = environment.stack.frames.last
+        key = [frame.filename, frame.line] if frame
+        return string if frame && $_sass_warned_for_unquote.include?(key)
+        $_sass_warned_for_unquote << key if frame
+        # rubocop:enable GlobalVars
+
+        Sass::Util.sass_warn(<<MESSAGE.strip)
+DEPRECATION WARNING: Passing #{string.to_sass}, a non-string value, to unquote()
+will be an error in future versions of Sass.
+#{environment.stack.to_s.gsub(/^/, ' ' * 8)}
+MESSAGE
+        return string
+      end
+
+      string.check_deprecated_interp
+      return string if string.type == :identifier
+      identifier(string.value)
+    end
+    declare :unquote, [:string]
+
+    # Add quotes to a string if the string isn't quoted,
+    # or returns the same string if it is.
+    #
+    # @see #unquote
+    # @example
+    #   quote("foo") => "foo"
+    #   quote(foo) => "foo"
+    # @overload quote($string)
+    #   @param $string [Sass::Script::Value::String]
+    # @return [Sass::Script::Value::String]
+    # @raise [ArgumentError] if `$string` isn't a string
+    def quote(string)
+      assert_type string, :String, :string
+      if string.type != :string
+        quoted_string(string.value)
+      else
+        string
+      end
+    end
+    declare :quote, [:string]
+
+    # Returns the number of characters in a string.
+    #
+    # @example
+    #   str-length("foo") => 3
+    # @overload str_length($string)
+    #   @param $string [Sass::Script::Value::String]
+    # @return [Sass::Script::Value::Number]
+    # @raise [ArgumentError] if `$string` isn't a string
+    def str_length(string)
+      assert_type string, :String, :string
+      number(string.value.size)
+    end
+    declare :str_length, [:string]
+
+    # Inserts `$insert` into `$string` at `$index`.
+    #
+    # Note that unlike some languages, the first character in a Sass string is
+    # number 1, the second number 2, and so forth.
+    #
+    # @example
+    #   str-insert("abcd", "X", 1) => "Xabcd"
+    #   str-insert("abcd", "X", 4) => "abcXd"
+    #   str-insert("abcd", "X", 5) => "abcdX"
+    #
+    # @overload str_insert($string, $insert, $index)
+    #   @param $string [Sass::Script::Value::String]
+    #   @param $insert [Sass::Script::Value::String]
+    #   @param $index [Sass::Script::Value::Number] The position at which
+    #     `$insert` will be inserted. Negative indices count from the end of
+    #     `$string`. An index that's outside the bounds of the string will insert
+    #     `$insert` at the front or back of the string
+    # @return [Sass::Script::Value::String] The result string. This will be
+    #   quoted if and only if `$string` was quoted
+    # @raise [ArgumentError] if any parameter is the wrong type
+    def str_insert(original, insert, index)
+      assert_type original, :String, :string
+      assert_type insert, :String, :insert
+      assert_integer index, :index
+      assert_unit index, nil, :index
+      insertion_point = if index.to_i > 0
+                          [index.to_i - 1, original.value.size].min
+                        else
+                          [index.to_i, -original.value.size - 1].max
+                        end
+      result = original.value.dup.insert(insertion_point, insert.value)
+      Sass::Script::Value::String.new(result, original.type)
+    end
+    declare :str_insert, [:string, :insert, :index]
+
+    # Returns the index of the first occurrence of `$substring` in `$string`. If
+    # there is no such occurrence, returns `null`.
+    #
+    # Note that unlike some languages, the first character in a Sass string is
+    # number 1, the second number 2, and so forth.
+    #
+    # @example
+    #   str-index(abcd, a)  => 1
+    #   str-index(abcd, ab) => 1
+    #   str-index(abcd, X)  => null
+    #   str-index(abcd, c)  => 3
+    #
+    # @overload str_index($string, $substring)
+    #   @param $string [Sass::Script::Value::String]
+    #   @param $substring [Sass::Script::Value::String]
+    # @return [Sass::Script::Value::Number, Sass::Script::Value::Null]
+    # @raise [ArgumentError] if any parameter is the wrong type
+    def str_index(string, substring)
+      assert_type string, :String, :string
+      assert_type substring, :String, :substring
+      index = string.value.index(substring.value)
+      index ? number(index + 1) : null
+    end
+    declare :str_index, [:string, :substring]
+
+    # Extracts a substring from `$string`. The substring will begin at index
+    # `$start-at` and ends at index `$end-at`.
+    #
+    # Note that unlike some languages, the first character in a Sass string is
+    # number 1, the second number 2, and so forth.
+    #
+    # @example
+    #  str-slice("abcd", 2, 3)   => "bc"
+    #  str-slice("abcd", 2)      => "bcd"
+    #  str-slice("abcd", -3, -2) => "bc"
+    #  str-slice("abcd", 2, -2)  => "bc"
+    #
+    # @overload str_slice($string, $start-at, $end-at: -1)
+    #   @param $start-at [Sass::Script::Value::Number] The index of the first
+    #     character of the substring. If this is negative, it counts from the end
+    #     of `$string`
+    #   @param $end-at [Sass::Script::Value::Number] The index of the last
+    #     character of the substring. If this is negative, it counts from the end
+    #     of `$string`. Defaults to -1
+    #   @return [Sass::Script::Value::String] The substring. This will be quoted
+    #     if and only if `$string` was quoted
+    # @raise [ArgumentError] if any parameter is the wrong type
+    def str_slice(string, start_at, end_at = nil)
+      assert_type string, :String, :string
+      assert_unit start_at, nil, "start-at"
+
+      end_at = number(-1) if end_at.nil?
+      assert_unit end_at, nil, "end-at"
+
+      return Sass::Script::Value::String.new("", string.type) if end_at.value == 0
+      s = start_at.value > 0 ? start_at.value - 1 : start_at.value
+      e = end_at.value > 0 ? end_at.value - 1 : end_at.value
+      s = string.value.length + s if s < 0
+      s = 0 if s < 0
+      e = string.value.length + e if e < 0
+      return Sass::Script::Value::String.new("", string.type) if e < 0
+      extracted = string.value.slice(s..e)
+      Sass::Script::Value::String.new(extracted || "", string.type)
+    end
+    declare :str_slice, [:string, :start_at]
+    declare :str_slice, [:string, :start_at, :end_at]
+
+    # Converts a string to upper case.
+    #
+    # @example
+    #   to-upper-case(abcd) => ABCD
+    #
+    # @overload to_upper_case($string)
+    #   @param $string [Sass::Script::Value::String]
+    # @return [Sass::Script::Value::String]
+    # @raise [ArgumentError] if `$string` isn't a string
+    def to_upper_case(string)
+      assert_type string, :String, :string
+      Sass::Script::Value::String.new(Sass::Util.upcase(string.value), string.type)
+    end
+    declare :to_upper_case, [:string]
+
+    # Convert a string to lower case,
+    #
+    # @example
+    #   to-lower-case(ABCD) => abcd
+    #
+    # @overload to_lower_case($string)
+    #   @param $string [Sass::Script::Value::String]
+    # @return [Sass::Script::Value::String]
+    # @raise [ArgumentError] if `$string` isn't a string
+    def to_lower_case(string)
+      assert_type string, :String, :string
+      Sass::Script::Value::String.new(Sass::Util.downcase(string.value), string.type)
+    end
+    declare :to_lower_case, [:string]
+
+    # Returns the type of a value.
+    #
+    # @example
+    #   type-of(100px)  => number
+    #   type-of(asdf)   => string
+    #   type-of("asdf") => string
+    #   type-of(true)   => bool
+    #   type-of(#fff)   => color
+    #   type-of(blue)   => color
+    #   type-of(null)   => null
+    #   type-of(a b c)  => list
+    #   type-of((a: 1, b: 2)) => map
+    #   type-of(get-function("foo")) => function
+    #
+    # @overload type_of($value)
+    #   @param $value [Sass::Script::Value::Base] The value to inspect
+    # @return [Sass::Script::Value::String] The unquoted string name of the
+    #   value's type
+    def type_of(value)
+      value.check_deprecated_interp if value.is_a?(Sass::Script::Value::String)
+      identifier(value.class.name.gsub(/Sass::Script::Value::/, '').downcase)
+    end
+    declare :type_of, [:value]
+
+    # Returns whether a feature exists in the current Sass runtime.
+    #
+    # The following features are supported:
+    #
+    # * `global-variable-shadowing` indicates that a local variable will shadow
+    #   a global variable unless `!global` is used.
+    #
+    # * `extend-selector-pseudoclass` indicates that `@extend` will reach into
+    #   selector pseudoclasses like `:not`.
+    #
+    # * `units-level-3` indicates full support for unit arithmetic using units
+    #   defined in the [Values and Units Level 3][] spec.
+    #
+    # [Values and Units Level 3]: http://www.w3.org/TR/css3-values/
+    #
+    # * `at-error` indicates that the Sass `@error` directive is supported.
+    #
+    # * `custom-property` indicates that the [Custom Properties Level 1][] spec
+    #   is supported. This means that custom properties are parsed statically,
+    #   with only interpolation treated as SassScript.
+    #
+    # [Custom Properties Level 1]: https://www.w3.org/TR/css-variables-1/
+    #
+    # @example
+    #   feature-exists(some-feature-that-exists) => true
+    #   feature-exists(what-is-this-i-dont-know) => false
+    #
+    # @overload feature_exists($feature)
+    #   @param $feature [Sass::Script::Value::String] The name of the feature
+    # @return [Sass::Script::Value::Bool] Whether the feature is supported in this version of Sass
+    # @raise [ArgumentError] if `$feature` isn't a string
+    def feature_exists(feature)
+      assert_type feature, :String, :feature
+      bool(Sass.has_feature?(feature.value))
+    end
+    declare :feature_exists, [:feature]
+
+    # Returns a reference to a function for later invocation with the `call()` function.
+    #
+    # If `$css` is `false`, the function reference may refer to a function
+    # defined in your stylesheet or built-in to the host environment. If it's
+    # `true` it will refer to a plain-CSS function.
+    #
+    # @example
+    #   get-function("rgb")
+    #
+    #   @function myfunc { @return "something"; }
+    #   get-function("myfunc")
+    #
+    # @overload get_function($name, $css: false)
+    #   @param name [Sass::Script::Value::String] The name of the function being referenced.
+    #   @param css [Sass::Script::Value::Bool] Whether to get a plain CSS function.
+    #
+    # @return [Sass::Script::Value::Function] A function reference.
+    def get_function(name, kwargs = {})
+      assert_type name, :String, :name
+
+      css = if kwargs.has_key?("css")
+              v = kwargs.delete("css")
+              assert_type v, :Bool, :css
+              v.value
+            else
+              false
+            end
+
+      if kwargs.any?
+        raise ArgumentError.new("Illegal keyword argument '#{kwargs.keys.first}'")
+      end
+
+      if css
+        return Sass::Script::Value::Function.new(
+          Sass::Callable.new(name.value, nil, nil, nil, nil, nil, "function", :css))
+      end
+
+      callable = environment.caller.function(name.value) ||
+        (Sass::Script::Functions.callable?(name.value.tr("-", "_")) &&
+         Sass::Callable.new(name.value, nil, nil, nil, nil, nil, "function", :builtin))
+
+      if callable
+        Sass::Script::Value::Function.new(callable)
+      else
+        raise Sass::SyntaxError.new("Function not found: #{name}")
+      end
+    end
+    declare :get_function, [:name], :var_kwargs => true
+
+    # Returns the unit(s) associated with a number. Complex units are sorted in
+    # alphabetical order by numerator and denominator.
+    #
+    # @example
+    #   unit(100) => ""
+    #   unit(100px) => "px"
+    #   unit(3em) => "em"
+    #   unit(10px * 5em) => "em*px"
+    #   unit(10px * 5em / 30cm / 1rem) => "em*px/cm*rem"
+    # @overload unit($number)
+    #   @param $number [Sass::Script::Value::Number]
+    # @return [Sass::Script::Value::String] The unit(s) of the number, as a
+    #   quoted string
+    # @raise [ArgumentError] if `$number` isn't a number
+    def unit(number)
+      assert_type number, :Number, :number
+      quoted_string(number.unit_str)
+    end
+    declare :unit, [:number]
+
+    # Returns whether a number has units.
+    #
+    # @example
+    #   unitless(100) => true
+    #   unitless(100px) => false
+    # @overload unitless($number)
+    #   @param $number [Sass::Script::Value::Number]
+    # @return [Sass::Script::Value::Bool]
+    # @raise [ArgumentError] if `$number` isn't a number
+    def unitless(number)
+      assert_type number, :Number, :number
+      bool(number.unitless?)
+    end
+    declare :unitless, [:number]
+
+    # Returns whether two numbers can added, subtracted, or compared.
+    #
+    # @example
+    #   comparable(2px, 1px) => true
+    #   comparable(100px, 3em) => false
+    #   comparable(10cm, 3mm) => true
+    # @overload comparable($number1, $number2)
+    #   @param $number1 [Sass::Script::Value::Number]
+    #   @param $number2 [Sass::Script::Value::Number]
+    # @return [Sass::Script::Value::Bool]
+    # @raise [ArgumentError] if either parameter is the wrong type
+    def comparable(number1, number2)
+      assert_type number1, :Number, :number1
+      assert_type number2, :Number, :number2
+      bool(number1.comparable_to?(number2))
+    end
+    declare :comparable, [:number1, :number2]
+
+    # Converts a unitless number to a percentage.
+    #
+    # @example
+    #   percentage(0.2) => 20%
+    #   percentage(100px / 50px) => 200%
+    # @overload percentage($number)
+    #   @param $number [Sass::Script::Value::Number]
+    # @return [Sass::Script::Value::Number]
+    # @raise [ArgumentError] if `$number` isn't a unitless number
+    def percentage(number)
+      unless number.is_a?(Sass::Script::Value::Number) && number.unitless?
+        raise ArgumentError.new("$number: #{number.inspect} is not a unitless number")
+      end
+      number(number.value * 100, '%')
+    end
+    declare :percentage, [:number]
+
+    # Rounds a number to the nearest whole number.
+    #
+    # @example
+    #   round(10.4px) => 10px
+    #   round(10.6px) => 11px
+    # @overload round($number)
+    #   @param $number [Sass::Script::Value::Number]
+    # @return [Sass::Script::Value::Number]
+    # @raise [ArgumentError] if `$number` isn't a number
+    def round(number)
+      numeric_transformation(number) {|n| Sass::Util.round(n)}
+    end
+    declare :round, [:number]
+
+    # Rounds a number up to the next whole number.
+    #
+    # @example
+    #   ceil(10.4px) => 11px
+    #   ceil(10.6px) => 11px
+    # @overload ceil($number)
+    #   @param $number [Sass::Script::Value::Number]
+    # @return [Sass::Script::Value::Number]
+    # @raise [ArgumentError] if `$number` isn't a number
+    def ceil(number)
+      numeric_transformation(number) {|n| n.ceil}
+    end
+    declare :ceil, [:number]
+
+    # Rounds a number down to the previous whole number.
+    #
+    # @example
+    #   floor(10.4px) => 10px
+    #   floor(10.6px) => 10px
+    # @overload floor($number)
+    #   @param $number [Sass::Script::Value::Number]
+    # @return [Sass::Script::Value::Number]
+    # @raise [ArgumentError] if `$number` isn't a number
+    def floor(number)
+      numeric_transformation(number) {|n| n.floor}
+    end
+    declare :floor, [:number]
+
+    # Returns the absolute value of a number.
+    #
+    # @example
+    #   abs(10px) => 10px
+    #   abs(-10px) => 10px
+    # @overload abs($number)
+    #   @param $number [Sass::Script::Value::Number]
+    # @return [Sass::Script::Value::Number]
+    # @raise [ArgumentError] if `$number` isn't a number
+    def abs(number)
+      numeric_transformation(number) {|n| n.abs}
+    end
+    declare :abs, [:number]
+
+    # Finds the minimum of several numbers. This function takes any number of
+    # arguments.
+    #
+    # @example
+    #   min(1px, 4px) => 1px
+    #   min(5em, 3em, 4em) => 3em
+    # @overload min($numbers...)
+    #   @param $numbers [[Sass::Script::Value::Number]]
+    # @return [Sass::Script::Value::Number]
+    # @raise [ArgumentError] if any argument isn't a number, or if not all of
+    #   the arguments have comparable units
+    def min(*numbers)
+      numbers.each {|n| assert_type n, :Number}
+      numbers.inject {|min, num| min.lt(num).to_bool ? min : num}
+    end
+    declare :min, [], :var_args => :true
+
+    # Finds the maximum of several numbers. This function takes any number of
+    # arguments.
+    #
+    # @example
+    #   max(1px, 4px) => 4px
+    #   max(5em, 3em, 4em) => 5em
+    # @overload max($numbers...)
+    #   @param $numbers [[Sass::Script::Value::Number]]
+    # @return [Sass::Script::Value::Number]
+    # @raise [ArgumentError] if any argument isn't a number, or if not all of
+    #   the arguments have comparable units
+    def max(*values)
+      values.each {|v| assert_type v, :Number}
+      values.inject {|max, val| max.gt(val).to_bool ? max : val}
+    end
+    declare :max, [], :var_args => :true
+
+    # Return the length of a list.
+    #
+    # This can return the number of pairs in a map as well.
+    #
+    # @example
+    #   length(10px) => 1
+    #   length(10px 20px 30px) => 3
+    #   length((width: 10px, height: 20px)) => 2
+    # @overload length($list)
+    #   @param $list [Sass::Script::Value::Base]
+    # @return [Sass::Script::Value::Number]
+    def length(list)
+      number(list.to_a.size)
+    end
+    declare :length, [:list]
+
+    # Return a new list, based on the list provided, but with the nth
+    # element changed to the value given.
+    #
+    # Note that unlike some languages, the first item in a Sass list is number
+    # 1, the second number 2, and so forth.
+    #
+    # Negative index values address elements in reverse order, starting with the last element
+    # in the list.
+    #
+    # @example
+    #   set-nth($list: 10px 20px 30px, $n: 2, $value: -20px) => 10px -20px 30px
+    # @overload set-nth($list, $n, $value)
+    #   @param $list [Sass::Script::Value::Base] The list that will be copied, having the element
+    #     at index `$n` changed.
+    #   @param $n [Sass::Script::Value::Number] The index of the item to set.
+    #     Negative indices count from the end of the list.
+    #   @param $value [Sass::Script::Value::Base] The new value at index `$n`.
+    # @return [Sass::Script::Value::List]
+    # @raise [ArgumentError] if `$n` isn't an integer between 1 and the length
+    #   of `$list`
+    def set_nth(list, n, value)
+      assert_type n, :Number, :n
+      Sass::Script::Value::List.assert_valid_index(list, n)
+      index = n.to_i > 0 ? n.to_i - 1 : n.to_i
+      new_list = list.to_a.dup
+      new_list[index] = value
+      list.with_contents(new_list)
+    end
+    declare :set_nth, [:list, :n, :value]
+
+    # Gets the nth item in a list.
+    #
+    # Note that unlike some languages, the first item in a Sass list is number
+    # 1, the second number 2, and so forth.
+    #
+    # This can return the nth pair in a map as well.
+    #
+    # Negative index values address elements in reverse order, starting with the last element in
+    # the list.
+    #
+    # @example
+    #   nth(10px 20px 30px, 1) => 10px
+    #   nth((Helvetica, Arial, sans-serif), 3) => sans-serif
+    #   nth((width: 10px, length: 20px), 2) => length, 20px
+    # @overload nth($list, $n)
+    #   @param $list [Sass::Script::Value::Base]
+    #   @param $n [Sass::Script::Value::Number] The index of the item to get.
+    #     Negative indices count from the end of the list.
+    # @return [Sass::Script::Value::Base]
+    # @raise [ArgumentError] if `$n` isn't an integer between 1 and the length
+    #   of `$list`
+    def nth(list, n)
+      assert_type n, :Number, :n
+      Sass::Script::Value::List.assert_valid_index(list, n)
+
+      index = n.to_i > 0 ? n.to_i - 1 : n.to_i
+      list.to_a[index]
+    end
+    declare :nth, [:list, :n]
+
+    # Joins together two lists into one.
+    #
+    # Unless `$separator` is passed, if one list is comma-separated and one is
+    # space-separated, the first parameter's separator is used for the resulting
+    # list. If both lists have fewer than two items, spaces are used for the
+    # resulting list.
+    #
+    # Unless `$bracketed` is passed, the resulting list is bracketed if the
+    # first parameter is.
+    #
+    # Like all list functions, `join()` returns a new list rather than modifying
+    # its arguments in place.
+    #
+    # @example
+    #   join(10px 20px, 30px 40px) => 10px 20px 30px 40px
+    #   join((blue, red), (#abc, #def)) => blue, red, #abc, #def
+    #   join(10px, 20px) => 10px 20px
+    #   join(10px, 20px, comma) => 10px, 20px
+    #   join((blue, red), (#abc, #def), space) => blue red #abc #def
+    #   join([10px], 20px) => [10px 20px]
+    # @overload join($list1, $list2, $separator: auto, $bracketed: auto)
+    #   @param $list1 [Sass::Script::Value::Base]
+    #   @param $list2 [Sass::Script::Value::Base]
+    #   @param $separator [Sass::Script::Value::String] The list separator to use.
+    #     If this is `comma` or `space`, that separator will be used. If this is
+    #     `auto` (the default), the separator is determined as explained above.
+    #   @param $bracketed [Sass::Script::Value::Base] Whether the resulting list
+    #     will be bracketed. If this is `auto` (the default), the separator is
+    #     determined as explained above.
+    # @return [Sass::Script::Value::List]
+    # @comment
+    #   rubocop:disable ParameterLists
+    def join(list1, list2,
+             separator = identifier("auto"), bracketed = identifier("auto"),
+             kwargs = nil, *rest)
+      # rubocop:enable ParameterLists
+      if separator.is_a?(Hash)
+        kwargs = separator
+        separator = identifier("auto")
+      elsif bracketed.is_a?(Hash)
+        kwargs = bracketed
+        bracketed = identifier("auto")
+      elsif rest.last.is_a?(Hash)
+        rest.unshift kwargs
+        kwargs = rest.pop
+      end
+
+      unless rest.empty?
+        # Add 4 to rest.length because we don't want to count the kwargs hash,
+        # which is always passed.
+        raise ArgumentError.new("wrong number of arguments (#{rest.length + 4} for 2..4)")
+      end
+
+      if kwargs
+        separator = kwargs.delete("separator") || separator
+        bracketed = kwargs.delete("bracketed") || bracketed
+
+        unless kwargs.empty?
+          name, val = kwargs.to_a.first
+          raise ArgumentError.new("Unknown argument $#{name} (#{val})")
+        end
+      end
+
+      assert_type separator, :String, :separator
+      unless %w(auto space comma).include?(separator.value)
+        raise ArgumentError.new("Separator name must be space, comma, or auto")
+      end
+
+      list(list1.to_a + list2.to_a,
+        separator:
+          if separator.value == 'auto'
+            list1.separator || list2.separator || :space
+          else
+            separator.value.to_sym
+          end,
+        bracketed:
+          if bracketed.is_a?(Sass::Script::Value::String) && bracketed.value == 'auto'
+            list1.bracketed
+          else
+            bracketed.to_bool
+          end)
+    end
+    # We don't actually take variable arguments or keyword arguments, but this
+    # is the best way to take either `$separator` or `$bracketed` as keywords
+    # without complaining about the other missing.
+    declare :join, [:list1, :list2], :var_args => true, :var_kwargs => true
+
+    # Appends a single value onto the end of a list.
+    #
+    # Unless the `$separator` argument is passed, if the list had only one item,
+    # the resulting list will be space-separated.
+    #
+    # Like all list functions, `append()` returns a new list rather than
+    # modifying its argument in place.
+    #
+    # @example
+    #   append(10px 20px, 30px) => 10px 20px 30px
+    #   append((blue, red), green) => blue, red, green
+    #   append(10px 20px, 30px 40px) => 10px 20px (30px 40px)
+    #   append(10px, 20px, comma) => 10px, 20px
+    #   append((blue, red), green, space) => blue red green
+    # @overload append($list, $val, $separator: auto)
+    #   @param $list [Sass::Script::Value::Base]
+    #   @param $val [Sass::Script::Value::Base]
+    #   @param $separator [Sass::Script::Value::String] The list separator to use.
+    #     If this is `comma` or `space`, that separator will be used. If this is
+    #     `auto` (the default), the separator is determined as explained above.
+    # @return [Sass::Script::Value::List]
+    def append(list, val, separator = identifier("auto"))
+      assert_type separator, :String, :separator
+      unless %w(auto space comma).include?(separator.value)
+        raise ArgumentError.new("Separator name must be space, comma, or auto")
+      end
+      list.with_contents(list.to_a + [val],
+        separator:
+          if separator.value == 'auto'
+            list.separator || :space
+          else
+            separator.value.to_sym
+          end)
+    end
+    declare :append, [:list, :val]
+    declare :append, [:list, :val, :separator]
+
+    # Combines several lists into a single multidimensional list. The nth value
+    # of the resulting list is a space separated list of the source lists' nth
+    # values.
+    #
+    # The length of the resulting list is the length of the
+    # shortest list.
+    #
+    # @example
+    #   zip(1px 1px 3px, solid dashed solid, red green blue)
+    #   => 1px solid red, 1px dashed green, 3px solid blue
+    # @overload zip($lists...)
+    #   @param $lists [[Sass::Script::Value::Base]]
+    # @return [Sass::Script::Value::List]
+    def zip(*lists)
+      length = nil
+      values = []
+      lists.each do |list|
+        array = list.to_a
+        values << array.dup
+        length = length.nil? ? array.length : [length, array.length].min
+      end
+      values.each do |value|
+        value.slice!(length)
+      end
+      new_list_value = values.first.zip(*values[1..-1])
+      list(new_list_value.map {|list| list(list, :space)}, :comma)
+    end
+    declare :zip, [], :var_args => true
+
+    # Returns the position of a value within a list. If the value isn't found,
+    # returns `null` instead.
+    #
+    # Note that unlike some languages, the first item in a Sass list is number
+    # 1, the second number 2, and so forth.
+    #
+    # This can return the position of a pair in a map as well.
+    #
+    # @example
+    #   index(1px solid red, solid) => 2
+    #   index(1px solid red, dashed) => null
+    #   index((width: 10px, height: 20px), (height 20px)) => 2
+    # @overload index($list, $value)
+    #   @param $list [Sass::Script::Value::Base]
+    #   @param $value [Sass::Script::Value::Base]
+    # @return [Sass::Script::Value::Number, Sass::Script::Value::Null] The
+    #   1-based index of `$value` in `$list`, or `null`
+    def index(list, value)
+      index = list.to_a.index {|e| e.eq(value).to_bool}
+      index ? number(index + 1) : null
+    end
+    declare :index, [:list, :value]
+
+    # Returns the separator of a list. If the list doesn't have a separator due
+    # to having fewer than two elements, returns `space`.
+    #
+    # @example
+    #   list-separator(1px 2px 3px) => space
+    #   list-separator(1px, 2px, 3px) => comma
+    #   list-separator('foo') => space
+    # @overload list_separator($list)
+    #   @param $list [Sass::Script::Value::Base]
+    # @return [Sass::Script::Value::String] `comma` or `space`
+    def list_separator(list)
+      identifier((list.separator || :space).to_s)
+    end
+    declare :list_separator, [:list]
+
+    # Returns whether a list uses square brackets.
+    #
+    # @example
+    #   is-bracketed(1px 2px 3px) => false
+    #   is-bracketed([1px, 2px, 3px]) => true
+    # @overload is_bracketed($list)
+    #   @param $list [Sass::Script::Value::Base]
+    # @return [Sass::Script::Value::Bool]
+    def is_bracketed(list)
+      bool(list.bracketed)
+    end
+    declare :is_bracketed, [:list]
+
+    # Returns the value in a map associated with the given key. If the map
+    # doesn't have such a key, returns `null`.
+    #
+    # @example
+    #   map-get(("foo": 1, "bar": 2), "foo") => 1
+    #   map-get(("foo": 1, "bar": 2), "bar") => 2
+    #   map-get(("foo": 1, "bar": 2), "baz") => null
+    # @overload map_get($map, $key)
+    #   @param $map [Sass::Script::Value::Map]
+    #   @param $key [Sass::Script::Value::Base]
+    # @return [Sass::Script::Value::Base] The value indexed by `$key`, or `null`
+    #   if the map doesn't contain the given key
+    # @raise [ArgumentError] if `$map` is not a map
+    def map_get(map, key)
+      assert_type map, :Map, :map
+      map.to_h[key] || null
+    end
+    declare :map_get, [:map, :key]
+
+    # Merges two maps together into a new map. Keys in `$map2` will take
+    # precedence over keys in `$map1`.
+    #
+    # This is the best way to add new values to a map.
+    #
+    # All keys in the returned map that also appear in `$map1` will have the
+    # same order as in `$map1`. New keys from `$map2` will be placed at the end
+    # of the map.
+    #
+    # Like all map functions, `map-merge()` returns a new map rather than
+    # modifying its arguments in place.
+    #
+    # @example
+    #   map-merge(("foo": 1), ("bar": 2)) => ("foo": 1, "bar": 2)
+    #   map-merge(("foo": 1, "bar": 2), ("bar": 3)) => ("foo": 1, "bar": 3)
+    # @overload map_merge($map1, $map2)
+    #   @param $map1 [Sass::Script::Value::Map]
+    #   @param $map2 [Sass::Script::Value::Map]
+    # @return [Sass::Script::Value::Map]
+    # @raise [ArgumentError] if either parameter is not a map
+    def map_merge(map1, map2)
+      assert_type map1, :Map, :map1
+      assert_type map2, :Map, :map2
+      map(map1.to_h.merge(map2.to_h))
+    end
+    declare :map_merge, [:map1, :map2]
+
+    # Returns a new map with keys removed.
+    #
+    # Like all map functions, `map-merge()` returns a new map rather than
+    # modifying its arguments in place.
+    #
+    # @example
+    #   map-remove(("foo": 1, "bar": 2), "bar") => ("foo": 1)
+    #   map-remove(("foo": 1, "bar": 2, "baz": 3), "bar", "baz") => ("foo": 1)
+    #   map-remove(("foo": 1, "bar": 2), "baz") => ("foo": 1, "bar": 2)
+    # @overload map_remove($map, $keys...)
+    #   @param $map  [Sass::Script::Value::Map]
+    #   @param $keys [[Sass::Script::Value::Base]]
+    # @return [Sass::Script::Value::Map]
+    # @raise [ArgumentError] if `$map` is not a map
+    def map_remove(map, *keys)
+      assert_type map, :Map, :map
+      hash = map.to_h.dup
+      hash.delete_if {|key, _| keys.include?(key)}
+      map(hash)
+    end
+    declare :map_remove, [:map, :key], :var_args => true
+
+    # Returns a list of all keys in a map.
+    #
+    # @example
+    #   map-keys(("foo": 1, "bar": 2)) => "foo", "bar"
+    # @overload map_keys($map)
+    #   @param $map [Map]
+    # @return [List] the list of keys, comma-separated
+    # @raise [ArgumentError] if `$map` is not a map
+    def map_keys(map)
+      assert_type map, :Map, :map
+      list(map.to_h.keys, :comma)
+    end
+    declare :map_keys, [:map]
+
+    # Returns a list of all values in a map. This list may include duplicate
+    # values, if multiple keys have the same value.
+    #
+    # @example
+    #   map-values(("foo": 1, "bar": 2)) => 1, 2
+    #   map-values(("foo": 1, "bar": 2, "baz": 1)) => 1, 2, 1
+    # @overload map_values($map)
+    #   @param $map [Map]
+    # @return [List] the list of values, comma-separated
+    # @raise [ArgumentError] if `$map` is not a map
+    def map_values(map)
+      assert_type map, :Map, :map
+      list(map.to_h.values, :comma)
+    end
+    declare :map_values, [:map]
+
+    # Returns whether a map has a value associated with a given key.
+    #
+    # @example
+    #   map-has-key(("foo": 1, "bar": 2), "foo") => true
+    #   map-has-key(("foo": 1, "bar": 2), "baz") => false
+    # @overload map_has_key($map, $key)
+    #   @param $map [Sass::Script::Value::Map]
+    #   @param $key [Sass::Script::Value::Base]
+    # @return [Sass::Script::Value::Bool]
+    # @raise [ArgumentError] if `$map` is not a map
+    def map_has_key(map, key)
+      assert_type map, :Map, :map
+      bool(map.to_h.has_key?(key))
+    end
+    declare :map_has_key, [:map, :key]
+
+    # Returns the map of named arguments passed to a function or mixin that
+    # takes a variable argument list. The argument names are strings, and they
+    # do not contain the leading `$`.
+    #
+    # @example
+    #   @mixin foo($args...) {
+    #     @debug keywords($args); //=> (arg1: val, arg2: val)
+    #   }
+    #
+    #   @include foo($arg1: val, $arg2: val);
+    # @overload keywords($args)
+    #   @param $args [Sass::Script::Value::ArgList]
+    # @return [Sass::Script::Value::Map]
+    # @raise [ArgumentError] if `$args` isn't a variable argument list
+    def keywords(args)
+      assert_type args, :ArgList, :args
+      map(Sass::Util.map_keys(args.keywords.as_stored) {|k| Sass::Script::Value::String.new(k)})
+    end
+    declare :keywords, [:args]
+
+    # Returns one of two values, depending on whether or not `$condition` is
+    # true. Just like in `@if`, all values other than `false` and `null` are
+    # considered to be true.
+    #
+    # @example
+    #   if(true, 1px, 2px) => 1px
+    #   if(false, 1px, 2px) => 2px
+    # @overload if($condition, $if-true, $if-false)
+    #   @param $condition [Sass::Script::Value::Base] Whether the `$if-true` or
+    #     `$if-false` will be returned
+    #   @param $if-true [Sass::Script::Tree::Node]
+    #   @param $if-false [Sass::Script::Tree::Node]
+    # @return [Sass::Script::Value::Base] `$if-true` or `$if-false`
+    def if(condition, if_true, if_false)
+      if condition.to_bool
+        perform(if_true)
+      else
+        perform(if_false)
+      end
+    end
+    declare :if, [:condition, :"&if_true", :"&if_false"]
+
+    # Returns a unique CSS identifier. The identifier is returned as an unquoted
+    # string. The identifier returned is only guaranteed to be unique within the
+    # scope of a single Sass run.
+    #
+    # @overload unique_id()
+    # @return [Sass::Script::Value::String]
+    def unique_id
+      generator = Sass::Script::Functions.random_number_generator
+      Thread.current[:sass_last_unique_id] ||= generator.rand(36**8)
+      # avoid the temptation of trying to guess the next unique value.
+      value = (Thread.current[:sass_last_unique_id] += (generator.rand(10) + 1))
+      # the u makes this a legal identifier if it would otherwise start with a number.
+      identifier("u" + value.to_s(36).rjust(8, '0'))
+    end
+    declare :unique_id, []
+
+    # Dynamically calls a function. This can call user-defined
+    # functions, built-in functions, or plain CSS functions. It will
+    # pass along all arguments, including keyword arguments, to the
+    # called function.
+    #
+    # @example
+    #   call(rgb, 10, 100, 255) => #0a64ff
+    #   call(scale-color, #0a64ff, $lightness: -10%) => #0058ef
+    #
+    #   $fn: nth;
+    #   call($fn, (a b c), 2) => b
+    #
+    # @overload call($function, $args...)
+    #   @param $function [Sass::Script::Value::Function] The function to call.
+    def call(name, *args)
+      unless name.is_a?(Sass::Script::Value::String) ||
+             name.is_a?(Sass::Script::Value::Function)
+        assert_type name, :Function, :function
+      end
+      if name.is_a?(Sass::Script::Value::String)
+        name = if function_exists(name).to_bool
+                 get_function(name)
+               else
+                 get_function(name, "css" => bool(true))
+               end
+        Sass::Util.sass_warn(<<WARNING)
+DEPRECATION WARNING: Passing a string to call() is deprecated and will be illegal
+in Sass 4.0. Use call(#{name.to_sass}) instead.
+WARNING
+      end
+      kwargs = args.last.is_a?(Hash) ? args.pop : {}
+      funcall = Sass::Script::Tree::Funcall.new(
+        name.value,
+        args.map {|a| Sass::Script::Tree::Literal.new(a)},
+        Sass::Util.map_vals(kwargs) {|v| Sass::Script::Tree::Literal.new(v)},
+        nil,
+        nil)
+      funcall.line = environment.stack.frames.last.line
+      funcall.filename = environment.stack.frames.last.filename
+      funcall.options = options
+      perform(funcall)
+    end
+    declare :call, [:name], :var_args => true, :var_kwargs => true
+
+    # This function only exists as a workaround for IE7's [`content:
+    # counter` bug](http://jes.st/2013/ie7s-css-breaking-content-counter-bug/).
+    # It works identically to any other plain-CSS function, except it
+    # avoids adding spaces between the argument commas.
+    #
+    # @example
+    #   counter(item, ".") => counter(item,".")
+    # @overload counter($args...)
+    # @return [Sass::Script::Value::String]
+    def counter(*args)
+      identifier("counter(#{args.map {|a| a.to_s(options)}.join(',')})")
+    end
+    declare :counter, [], :var_args => true
+
+    # This function only exists as a workaround for IE7's [`content:
+    # counter` bug](http://jes.st/2013/ie7s-css-breaking-content-counter-bug/).
+    # It works identically to any other plain-CSS function, except it
+    # avoids adding spaces between the argument commas.
+    #
+    # @example
+    #   counters(item, ".") => counters(item,".")
+    # @overload counters($args...)
+    # @return [Sass::Script::Value::String]
+    def counters(*args)
+      identifier("counters(#{args.map {|a| a.to_s(options)}.join(',')})")
+    end
+    declare :counters, [], :var_args => true
+
+    # Check whether a variable with the given name exists in the current
+    # scope or in the global scope.
+    #
+    # @example
+    #   $a-false-value: false;
+    #   variable-exists(a-false-value) => true
+    #   variable-exists(a-null-value) => true
+    #
+    #   variable-exists(nonexistent) => false
+    #
+    # @overload variable_exists($name)
+    #   @param $name [Sass::Script::Value::String] The name of the variable to
+    #     check. The name should not include the `$`.
+    # @return [Sass::Script::Value::Bool] Whether the variable is defined in
+    #   the current scope.
+    def variable_exists(name)
+      assert_type name, :String, :name
+      bool(environment.caller.var(name.value))
+    end
+    declare :variable_exists, [:name]
+
+    # Check whether a variable with the given name exists in the global
+    # scope (at the top level of the file).
+    #
+    # @example
+    #   $a-false-value: false;
+    #   global-variable-exists(a-false-value) => true
+    #   global-variable-exists(a-null-value) => true
+    #
+    #   .foo {
+    #     $some-var: false;
+    #     @if global-variable-exists(some-var) { /* false, doesn't run */ }
+    #   }
+    #
+    # @overload global_variable_exists($name)
+    #   @param $name [Sass::Script::Value::String] The name of the variable to
+    #     check. The name should not include the `$`.
+    # @return [Sass::Script::Value::Bool] Whether the variable is defined in
+    #   the global scope.
+    def global_variable_exists(name)
+      assert_type name, :String, :name
+      bool(environment.global_env.var(name.value))
+    end
+    declare :global_variable_exists, [:name]
+
+    # Check whether a function with the given name exists.
+    #
+    # @example
+    #   function-exists(lighten) => true
+    #
+    #   @function myfunc { @return "something"; }
+    #   function-exists(myfunc) => true
+    #
+    # @overload function_exists($name)
+    #   @param name [Sass::Script::Value::String] The name of the function to
+    #     check or a function reference.
+    # @return [Sass::Script::Value::Bool] Whether the function is defined.
+    def function_exists(name)
+      assert_type name, :String, :name
+      exists = Sass::Script::Functions.callable?(name.value.tr("-", "_"))
+      exists ||= environment.caller.function(name.value)
+      bool(exists)
+    end
+    declare :function_exists, [:name]
+
+    # Check whether a mixin with the given name exists.
+    #
+    # @example
+    #   mixin-exists(nonexistent) => false
+    #
+    #   @mixin red-text { color: red; }
+    #   mixin-exists(red-text) => true
+    #
+    # @overload mixin_exists($name)
+    #   @param name [Sass::Script::Value::String] The name of the mixin to
+    #     check.
+    # @return [Sass::Script::Value::Bool] Whether the mixin is defined.
+    def mixin_exists(name)
+      assert_type name, :String, :name
+      bool(environment.mixin(name.value))
+    end
+    declare :mixin_exists, [:name]
+
+    # Check whether a mixin was passed a content block.
+    #
+    # Unless `content-exists()` is called directly from a mixin, an error will be raised.
+    #
+    # @example
+    #   @mixin needs-content {
+    #     @if not content-exists() {
+    #       @error "You must pass a content block!"
+    #     }
+    #     @content;
+    #   }
+    #
+    # @overload content_exists()
+    # @return [Sass::Script::Value::Bool] Whether a content block was passed to the mixin.
+    def content_exists
+      # frames.last is the stack frame for this function,
+      # so we use frames[-2] to get the frame before that.
+      mixin_frame = environment.stack.frames[-2]
+      unless mixin_frame && mixin_frame.type == :mixin
+        raise Sass::SyntaxError.new("Cannot call content-exists() except within a mixin.")
+      end
+      bool(!environment.caller.content.nil?)
+    end
+    declare :content_exists, []
+
+    # Return a string containing the value as its Sass representation.
+    #
+    # @overload inspect($value)
+    #   @param $value [Sass::Script::Value::Base] The value to inspect.
+    # @return [Sass::Script::Value::String] A representation of the value as
+    #   it would be written in Sass.
+    def inspect(value)
+      value.check_deprecated_interp if value.is_a?(Sass::Script::Value::String)
+      unquoted_string(value.to_sass)
+    end
+    declare :inspect, [:value]
+
+    # @overload random()
+    #   Return a decimal between 0 and 1, inclusive of 0 but not 1.
+    #   @return [Sass::Script::Value::Number] A decimal value.
+    # @overload random($limit)
+    #   Return an integer between 1 and `$limit`, inclusive of both 1 and `$limit`.
+    #   @param $limit [Sass::Script::Value::Number] The maximum of the random integer to be
+    #     returned, a positive integer.
+    #   @return [Sass::Script::Value::Number] An integer.
+    #   @raise [ArgumentError] if the `$limit` is not 1 or greater
+    def random(limit = nil)
+      generator = Sass::Script::Functions.random_number_generator
+      if limit
+        assert_integer limit, "limit"
+        if limit.to_i < 1
+          raise ArgumentError.new("$limit #{limit} must be greater than or equal to 1")
+        end
+        number(1 + generator.rand(limit.to_i))
+      else
+        number(generator.rand)
+      end
+    end
+    declare :random, []
+    declare :random, [:limit]
+
+    # Parses a user-provided selector into a list of lists of strings
+    # as returned by `&`.
+    #
+    # @example
+    #   selector-parse(".foo .bar, .baz .bang") => ('.foo' '.bar', '.baz' '.bang')
+    #
+    # @overload selector_parse($selector)
+    #   @param $selector [Sass::Script::Value::String, Sass::Script::Value::List]
+    #     The selector to parse. This can be either a string, a list of
+    #     strings, or a list of lists of strings as returned by `&`.
+    #   @return [Sass::Script::Value::List]
+    #     A list of lists of strings representing `$selector`. This is
+    #     in the same format as a selector returned by `&`.
+    def selector_parse(selector)
+      parse_selector(selector, :selector).to_sass_script
+    end
+    declare :selector_parse, [:selector]
+
+    # Return a new selector with all selectors in `$selectors` nested beneath
+    # one another as though they had been nested in the stylesheet as
+    # `$selector1 { $selector2 { ... } }`.
+    #
+    # Unlike most selector functions, `selector-nest` allows the
+    # parent selector `&` to be used in any selector but the first.
+    #
+    # @example
+    #   selector-nest(".foo", ".bar", ".baz") => .foo .bar .baz
+    #   selector-nest(".a .foo", ".b .bar") => .a .foo .b .bar
+    #   selector-nest(".foo", "&.bar") => .foo.bar
+    #
+    # @overload selector_nest($selectors...)
+    #   @param $selectors [[Sass::Script::Value::String, Sass::Script::Value::List]]
+    #     The selectors to nest. At least one selector must be passed. Each of
+    #     these can be either a string, a list of strings, or a list of lists of
+    #     strings as returned by `&`.
+    #   @return [Sass::Script::Value::List]
+    #     A list of lists of strings representing the result of nesting
+    #     `$selectors`. This is in the same format as a selector returned by
+    #     `&`.
+    def selector_nest(*selectors)
+      if selectors.empty?
+        raise ArgumentError.new("$selectors: At least one selector must be passed")
+      end
+
+      parsed = [parse_selector(selectors.first, :selectors)]
+      parsed += selectors[1..-1].map {|sel| parse_selector(sel, :selectors, true)}
+      parsed.inject {|result, child| child.resolve_parent_refs(result)}.to_sass_script
+    end
+    declare :selector_nest, [], :var_args => true
+
+    # Return a new selector with all selectors in `$selectors` appended one
+    # another as though they had been nested in the stylesheet as `$selector1 {
+    # &$selector2 { ... } }`.
+    #
+    # @example
+    #   selector-append(".foo", ".bar", ".baz") => .foo.bar.baz
+    #   selector-append(".a .foo", ".b .bar") => "a .foo.b .bar"
+    #   selector-append(".foo", "-suffix") => ".foo-suffix"
+    #
+    # @overload selector_append($selectors...)
+    #   @param $selectors [[Sass::Script::Value::String, Sass::Script::Value::List]]
+    #     The selectors to append. At least one selector must be passed. Each of
+    #     these can be either a string, a list of strings, or a list of lists of
+    #     strings as returned by `&`.
+    #   @return [Sass::Script::Value::List]
+    #     A list of lists of strings representing the result of appending
+    #     `$selectors`. This is in the same format as a selector returned by
+    #     `&`.
+    #   @raise [ArgumentError] if a selector could not be appended.
+    def selector_append(*selectors)
+      if selectors.empty?
+        raise ArgumentError.new("$selectors: At least one selector must be passed")
+      end
+
+      selectors.map {|sel| parse_selector(sel, :selectors)}.inject do |parent, child|
+        child.members.each do |seq|
+          sseq = seq.members.first
+          unless sseq.is_a?(Sass::Selector::SimpleSequence)
+            raise ArgumentError.new("Can't append \"#{seq}\" to \"#{parent}\"")
+          end
+
+          base = sseq.base
+          case base
+          when Sass::Selector::Universal
+            raise ArgumentError.new("Can't append \"#{seq}\" to \"#{parent}\"")
+          when Sass::Selector::Element
+            unless base.namespace.nil?
+              raise ArgumentError.new("Can't append \"#{seq}\" to \"#{parent}\"")
+            end
+            sseq.members[0] = Sass::Selector::Parent.new(base.name)
+          else
+            sseq.members.unshift Sass::Selector::Parent.new
+          end
+        end
+        child.resolve_parent_refs(parent)
+      end.to_sass_script
+    end
+    declare :selector_append, [], :var_args => true
+
+    # Returns a new version of `$selector` with `$extendee` extended
+    # with `$extender`. This works just like the result of
+    #
+    #     $selector { ... }
+    #     $extender { @extend $extendee }
+    #
+    # @example
+    #   selector-extend(".a .b", ".b", ".foo .bar") => .a .b, .a .foo .bar, .foo .a .bar
+    #
+    # @overload selector_extend($selector, $extendee, $extender)
+    #   @param $selector [Sass::Script::Value::String, Sass::Script::Value::List]
+    #     The selector within which `$extendee` is extended with
+    #     `$extender`. This can be either a string, a list of strings,
+    #     or a list of lists of strings as returned by `&`.
+    #   @param $extendee [Sass::Script::Value::String, Sass::Script::Value::List]
+    #     The selector being extended. This can be either a string, a
+    #     list of strings, or a list of lists of strings as returned
+    #     by `&`.
+    #   @param $extender [Sass::Script::Value::String, Sass::Script::Value::List]
+    #     The selector being injected into `$selector`. This can be
+    #     either a string, a list of strings, or a list of lists of
+    #     strings as returned by `&`.
+    #   @return [Sass::Script::Value::List]
+    #     A list of lists of strings representing the result of the
+    #     extension. This is in the same format as a selector returned
+    #     by `&`.
+    #   @raise [ArgumentError] if the extension fails
+    def selector_extend(selector, extendee, extender)
+      selector = parse_selector(selector, :selector)
+      extendee = parse_selector(extendee, :extendee)
+      extender = parse_selector(extender, :extender)
+
+      extends = Sass::Util::SubsetMap.new
+      begin
+        extender.populate_extends(extends, extendee, nil, [], true)
+        selector.do_extend(extends).to_sass_script
+      rescue Sass::SyntaxError => e
+        raise ArgumentError.new(e.to_s)
+      end
+    end
+    declare :selector_extend, [:selector, :extendee, :extender]
+
+    # Replaces all instances of `$original` with `$replacement` in `$selector`
+    #
+    # This works by using `@extend` and throwing away the original
+    # selector. This means that it can be used to do very advanced
+    # replacements; see the examples below.
+    #
+    # @example
+    #   selector-replace(".foo .bar", ".bar", ".baz") => ".foo .baz"
+    #   selector-replace(".foo.bar.baz", ".foo.baz", ".qux") => ".bar.qux"
+    #
+    # @overload selector_replace($selector, $original, $replacement)
+    #   @param $selector [Sass::Script::Value::String, Sass::Script::Value::List]
+    #     The selector within which `$original` is replaced with
+    #     `$replacement`. This can be either a string, a list of
+    #     strings, or a list of lists of strings as returned by `&`.
+    #   @param $original [Sass::Script::Value::String, Sass::Script::Value::List]
+    #     The selector being replaced. This can be either a string, a
+    #     list of strings, or a list of lists of strings as returned
+    #     by `&`.
+    #   @param $replacement [Sass::Script::Value::String, Sass::Script::Value::List]
+    #     The selector that `$original` is being replaced with. This
+    #     can be either a string, a list of strings, or a list of
+    #     lists of strings as returned by `&`.
+    #   @return [Sass::Script::Value::List]
+    #     A list of lists of strings representing the result of the
+    #     extension. This is in the same format as a selector returned
+    #     by `&`.
+    #   @raise [ArgumentError] if the replacement fails
+    def selector_replace(selector, original, replacement)
+      selector = parse_selector(selector, :selector)
+      original = parse_selector(original, :original)
+      replacement = parse_selector(replacement, :replacement)
+
+      extends = Sass::Util::SubsetMap.new
+      begin
+        replacement.populate_extends(extends, original, nil, [], true)
+        selector.do_extend(extends, [], true).to_sass_script
+      rescue Sass::SyntaxError => e
+        raise ArgumentError.new(e.to_s)
+      end
+    end
+    declare :selector_replace, [:selector, :original, :replacement]
+
+    # Unifies two selectors into a single selector that matches only
+    # elements matched by both input selectors. Returns `null` if
+    # there is no such selector.
+    #
+    # Like the selector unification done for `@extend`, this doesn't
+    # guarantee that the output selector will match *all* elements
+    # matched by both input selectors. For example, if `.a .b` is
+    # unified with `.x .y`, `.a .x .b.y, .x .a .b.y` will be returned,
+    # but `.a.x .b.y` will not. This avoids exponential output size
+    # while matching all elements that are likely to exist in
+    # practice.
+    #
+    # @example
+    #   selector-unify(".a", ".b") => .a.b
+    #   selector-unify(".a .b", ".x .y") => .a .x .b.y, .x .a .b.y
+    #   selector-unify(".a.b", ".b.c") => .a.b.c
+    #   selector-unify("#a", "#b") => null
+    #
+    # @overload selector_unify($selector1, $selector2)
+    #   @param $selector1 [Sass::Script::Value::String, Sass::Script::Value::List]
+    #     The first selector to be unified. This can be either a
+    #     string, a list of strings, or a list of lists of strings as
+    #     returned by `&`.
+    #   @param $selector2 [Sass::Script::Value::String, Sass::Script::Value::List]
+    #     The second selector to be unified. This can be either a
+    #     string, a list of strings, or a list of lists of strings as
+    #     returned by `&`.
+    #   @return [Sass::Script::Value::List, Sass::Script::Value::Null]
+    #     A list of lists of strings representing the result of the
+    #     unification, or null if no unification exists. This is in
+    #     the same format as a selector returned by `&`.
+    def selector_unify(selector1, selector2)
+      selector1 = parse_selector(selector1, :selector1)
+      selector2 = parse_selector(selector2, :selector2)
+      return null unless (unified = selector1.unify(selector2))
+      unified.to_sass_script
+    end
+    declare :selector_unify, [:selector1, :selector2]
+
+    # Returns the [simple
+    # selectors](http://dev.w3.org/csswg/selectors4/#simple) that
+    # comprise the compound selector `$selector`.
+    #
+    # Note that `$selector` **must be** a [compound
+    # selector](http://dev.w3.org/csswg/selectors4/#compound). That
+    # means it cannot contain commas or spaces. It also means that
+    # unlike other selector functions, this takes only strings, not
+    # lists.
+    #
+    # @example
+    #   simple-selectors(".foo.bar") => ".foo", ".bar"
+    #   simple-selectors(".foo.bar.baz") => ".foo", ".bar", ".baz"
+    #
+    # @overload simple_selectors($selector)
+    #   @param $selector [Sass::Script::Value::String]
+    #     The compound selector whose simple selectors will be extracted.
+    #   @return [Sass::Script::Value::List]
+    #     A list of simple selectors in the compound selector.
+    def simple_selectors(selector)
+      selector = parse_compound_selector(selector, :selector)
+      list(selector.members.map {|simple| unquoted_string(simple.to_s)}, :comma)
+    end
+    declare :simple_selectors, [:selector]
+
+    # Returns whether `$super` is a superselector of `$sub`. This means that
+    # `$super` matches all the elements that `$sub` matches, as well as possibly
+    # additional elements. In general, simpler selectors tend to be
+    # superselectors of more complex oned.
+    #
+    # @example
+    #   is-superselector(".foo", ".foo.bar") => true
+    #   is-superselector(".foo.bar", ".foo") => false
+    #   is-superselector(".bar", ".foo .bar") => true
+    #   is-superselector(".foo .bar", ".bar") => false
+    #
+    # @overload is_superselector($super, $sub)
+    #   @param $super [Sass::Script::Value::String, Sass::Script::Value::List]
+    #     The potential superselector. This can be either a string, a list of
+    #     strings, or a list of lists of strings as returned by `&`.
+    #   @param $sub [Sass::Script::Value::String, Sass::Script::Value::List]
+    #     The potential subselector. This can be either a string, a list of
+    #     strings, or a list of lists of strings as returned by `&`.
+    #   @return [Sass::Script::Value::Bool]
+    #     Whether `$selector1` is a superselector of `$selector2`.
+    def is_superselector(sup, sub)
+      sup = parse_selector(sup, :super)
+      sub = parse_selector(sub, :sub)
+      bool(sup.superselector?(sub))
+    end
+    declare :is_superselector, [:super, :sub]
+
+    private
+
+    # This method implements the pattern of transforming a numeric value into
+    # another numeric value with the same units.
+    # It yields a number to a block to perform the operation and return a number
+    def numeric_transformation(value)
+      assert_type value, :Number, :value
+      Sass::Script::Value::Number.new(
+        yield(value.value), value.numerator_units, value.denominator_units)
+    end
+
+    # @comment
+    #   rubocop:disable ParameterLists
+    def _adjust(color, amount, attr, range, op, units = "")
+      # rubocop:enable ParameterLists
+      assert_type color, :Color, :color
+      assert_type amount, :Number, :amount
+      Sass::Util.check_range('Amount', range, amount, units)
+
+      color.with(attr => color.send(attr).send(op, amount.value))
+    end
+
+    def check_alpha_unit(alpha, function)
+      return if alpha.unitless?
+
+      if alpha.is_unit?("%")
+        Sass::Util.sass_warn(<<WARNING)
+DEPRECATION WARNING: Passing a percentage as the alpha value to #{function}() will be
+interpreted differently in future versions of Sass. For now, use #{alpha.value} instead.
+WARNING
+      else
+        Sass::Util.sass_warn(<<WARNING)
+DEPRECATION WARNING: Passing a number with units as the alpha value to #{function}() is
+deprecated and will be an error in future versions of Sass. Use #{alpha.value} instead.
+WARNING
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/lexer.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/lexer.rb
new file mode 100644
index 0000000..4d9cc62
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/lexer.rb
@@ -0,0 +1,475 @@
+require 'sass/scss/rx'
+
+module Sass
+  module Script
+    # The lexical analyzer for SassScript.
+    # It takes a raw string and converts it to individual tokens
+    # that are easier to parse.
+    class Lexer
+      include Sass::SCSS::RX
+
+      # A struct containing information about an individual token.
+      #
+      # `type`: \[`Symbol`\]
+      # : The type of token.
+      #
+      # `value`: \[`Object`\]
+      # : The Ruby object corresponding to the value of the token.
+      #
+      # `source_range`: \[`Sass::Source::Range`\]
+      # : The range in the source file in which the token appeared.
+      #
+      # `pos`: \[`Integer`\]
+      # : The scanner position at which the SassScript token appeared.
+      Token = Struct.new(:type, :value, :source_range, :pos)
+
+      # The line number of the lexer's current position.
+      #
+      # @return [Integer]
+      def line
+        return @line unless @tok
+        @tok.source_range.start_pos.line
+      end
+
+      # The number of bytes into the current line
+      # of the lexer's current position (1-based).
+      #
+      # @return [Integer]
+      def offset
+        return @offset unless @tok
+        @tok.source_range.start_pos.offset
+      end
+
+      # A hash from operator strings to the corresponding token types.
+      OPERATORS = {
+        '+' => :plus,
+        '-' => :minus,
+        '*' => :times,
+        '/' => :div,
+        '%' => :mod,
+        '=' => :single_eq,
+        ':' => :colon,
+        '(' => :lparen,
+        ')' => :rparen,
+        '[' => :lsquare,
+        ']' => :rsquare,
+        ',' => :comma,
+        'and' => :and,
+        'or' => :or,
+        'not' => :not,
+        '==' => :eq,
+        '!=' => :neq,
+        '>=' => :gte,
+        '<=' => :lte,
+        '>' => :gt,
+        '<' => :lt,
+        '#{' => :begin_interpolation,
+        '}' => :end_interpolation,
+        ';' => :semicolon,
+        '{' => :lcurly,
+        '...' => :splat,
+      }
+
+      OPERATORS_REVERSE = Sass::Util.map_hash(OPERATORS) {|k, v| [v, k]}
+
+      TOKEN_NAMES = Sass::Util.map_hash(OPERATORS_REVERSE) {|k, v| [k, v.inspect]}.merge(
+        :const => "variable (e.g. $foo)",
+        :ident => "identifier (e.g. middle)")
+
+      # A list of operator strings ordered with longer names first
+      # so that `>` and `<` don't clobber `>=` and `<=`.
+      OP_NAMES = OPERATORS.keys.sort_by {|o| -o.size}
+
+      # A sub-list of {OP_NAMES} that only includes operators
+      # with identifier names.
+      IDENT_OP_NAMES = OP_NAMES.select {|k, _v| k =~ /^\w+/}
+
+      PARSEABLE_NUMBER = /(?:(\d*\.\d+)|(\d+))(?:[eE]([+-]?\d+))?(#{UNIT})?/
+
+      # A hash of regular expressions that are used for tokenizing.
+      REGULAR_EXPRESSIONS = {
+        :whitespace => /\s+/,
+        :comment => COMMENT,
+        :single_line_comment => SINGLE_LINE_COMMENT,
+        :variable => /(\$)(#{IDENT})/,
+        :ident => /(#{IDENT})(\()?/,
+        :number => PARSEABLE_NUMBER,
+        :unary_minus_number => /-#{PARSEABLE_NUMBER}/,
+        :color => HEXCOLOR,
+        :id => /##{IDENT}/,
+        :selector => /&/,
+        :ident_op => /(#{Regexp.union(*IDENT_OP_NAMES.map do |s|
+          Regexp.new(Regexp.escape(s) + "(?!#{NMCHAR}|\Z)")
+        end)})/,
+        :op => /(#{Regexp.union(*OP_NAMES)})/,
+      }
+
+      class << self
+        private
+
+        def string_re(open, close)
+          /#{open}((?:\\.|\#(?!\{)|[^#{close}\\#])*)(#{close}|#\{)/m
+        end
+      end
+
+      # A hash of regular expressions that are used for tokenizing strings.
+      #
+      # The key is a `[Symbol, Boolean]` pair.
+      # The symbol represents which style of quotation to use,
+      # while the boolean represents whether or not the string
+      # is following an interpolated segment.
+      STRING_REGULAR_EXPRESSIONS = {
+        :double => {
+          false => string_re('"', '"'),
+          true => string_re('', '"')
+        },
+        :single => {
+          false => string_re("'", "'"),
+          true => string_re('', "'")
+        },
+        :uri => {
+          false => /url\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/,
+          true => /(#{URLCHAR}*?)(#{W}\)|#\{)/
+        },
+        # Defined in https://developer.mozilla.org/en/CSS/@-moz-document as a
+        # non-standard version of http://www.w3.org/TR/css3-conditional/
+        :url_prefix => {
+          false => /url-prefix\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/,
+          true => /(#{URLCHAR}*?)(#{W}\)|#\{)/
+        },
+        :domain => {
+          false => /domain\(#{W}(#{URLCHAR}*?)(#{W}\)|#\{)/,
+          true => /(#{URLCHAR}*?)(#{W}\)|#\{)/
+        }
+      }
+
+      # @param str [String, StringScanner] The source text to lex
+      # @param line [Integer] The 1-based line on which the SassScript appears.
+      #   Used for error reporting and sourcemap building
+      # @param offset [Integer] The 1-based character (not byte) offset in the line in the source.
+      #   Used for error reporting and sourcemap building
+      # @param options [{Symbol => Object}] An options hash;
+      #   see {file:SASS_REFERENCE.md#Options the Sass options documentation}
+      def initialize(str, line, offset, options)
+        @scanner = str.is_a?(StringScanner) ? str : Sass::Util::MultibyteStringScanner.new(str)
+        @line = line
+        @offset = offset
+        @options = options
+        @interpolation_stack = []
+        @prev = nil
+        @tok = nil
+        @next_tok = nil
+      end
+
+      # Moves the lexer forward one token.
+      #
+      # @return [Token] The token that was moved past
+      def next
+        @tok ||= read_token
+        @tok, tok = nil, @tok
+        @prev = tok
+        tok
+      end
+
+      # Returns whether or not there's whitespace before the next token.
+      #
+      # @return [Boolean]
+      def whitespace?(tok = @tok)
+        if tok
+          @scanner.string[0...tok.pos] =~ /\s\Z/
+        else
+          @scanner.string[@scanner.pos, 1] =~ /^\s/ ||
+            @scanner.string[@scanner.pos - 1, 1] =~ /\s\Z/
+        end
+      end
+
+      # Returns the given character.
+      #
+      # @return [String]
+      def char(pos = @scanner.pos)
+        @scanner.string[pos, 1]
+      end
+
+      # Returns the next token without moving the lexer forward.
+      #
+      # @return [Token] The next token
+      def peek
+        @tok ||= read_token
+      end
+
+      # Rewinds the underlying StringScanner
+      # to before the token returned by \{#peek}.
+      def unpeek!
+        return unless @tok
+        @scanner.pos = @tok.pos
+        @line = @tok.source_range.start_pos.line
+        @offset = @tok.source_range.start_pos.offset
+      end
+
+      # @return [Boolean] Whether or not there's more source text to lex.
+      def done?
+        return if @next_tok
+        whitespace unless after_interpolation? && !@interpolation_stack.empty?
+        @scanner.eos? && @tok.nil?
+      end
+
+      # @return [Boolean] Whether or not the last token lexed was `:end_interpolation`.
+      def after_interpolation?
+        @prev && @prev.type == :end_interpolation
+      end
+
+      # Raise an error to the effect that `name` was expected in the input stream
+      # and wasn't found.
+      #
+      # This calls \{#unpeek!} to rewind the scanner to immediately after
+      # the last returned token.
+      #
+      # @param name [String] The name of the entity that was expected but not found
+      # @raise [Sass::SyntaxError]
+      def expected!(name)
+        unpeek!
+        Sass::SCSS::Parser.expected(@scanner, name, @line)
+      end
+
+      # Records all non-comment text the lexer consumes within the block
+      # and returns it as a string.
+      #
+      # @yield A block in which text is recorded
+      # @return [String]
+      def str
+        old_pos = @tok ? @tok.pos : @scanner.pos
+        yield
+        new_pos = @tok ? @tok.pos : @scanner.pos
+        @scanner.string[old_pos...new_pos]
+      end
+
+      private
+
+      def read_token
+        if (tok = @next_tok)
+          @next_tok = nil
+          return tok
+        end
+
+        return if done?
+        start_pos = source_position
+        value = token
+        return unless value
+        type, val = value
+        Token.new(type, val, range(start_pos), @scanner.pos - @scanner.matched_size)
+      end
+
+      def whitespace
+        nil while scan(REGULAR_EXPRESSIONS[:whitespace]) ||
+          scan(REGULAR_EXPRESSIONS[:comment]) ||
+          scan(REGULAR_EXPRESSIONS[:single_line_comment])
+      end
+
+      def token
+        if after_interpolation? && (interp = @interpolation_stack.pop)
+          interp_type, interp_value = interp
+          if interp_type == :special_fun
+            return special_fun_body(interp_value)
+          else
+            raise "[BUG]: Unknown interp_type #{interp_type}" unless interp_type == :string
+            return string(interp_value, true)
+          end
+        end
+
+        variable || string(:double, false) || string(:single, false) || number || id || color ||
+          selector || string(:uri, false) || raw(UNICODERANGE) || special_fun || special_val ||
+          ident_op || ident || op
+      end
+
+      def variable
+        _variable(REGULAR_EXPRESSIONS[:variable])
+      end
+
+      def _variable(rx)
+        return unless scan(rx)
+
+        [:const, @scanner[2]]
+      end
+
+      def ident
+        return unless scan(REGULAR_EXPRESSIONS[:ident])
+        [@scanner[2] ? :funcall : :ident, @scanner[1]]
+      end
+
+      def string(re, open)
+        line, offset = @line, @offset
+        return unless scan(STRING_REGULAR_EXPRESSIONS[re][open])
+        if @scanner[0] =~ /([^\\]|^)\n/
+          filename = @options[:filename]
+          Sass::Util.sass_warn <<MESSAGE
+DEPRECATION WARNING on line #{line}, column #{offset}#{" of #{filename}" if filename}:
+Unescaped multiline strings are deprecated and will be removed in a future version of Sass.
+To include a newline in a string, use "\\a" or "\\a " as in CSS.
+MESSAGE
+        end
+
+        if @scanner[2] == '#{' # '
+          @interpolation_stack << [:string, re]
+          start_pos = Sass::Source::Position.new(@line, @offset - 2)
+          @next_tok = Token.new(:string_interpolation, range(start_pos), @scanner.pos - 2)
+        end
+        str =
+          if re == :uri
+            url = "#{'url(' unless open}#{@scanner[1]}#{')' unless @scanner[2] == '#{'}"
+            Script::Value::String.new(url)
+          else
+            Script::Value::String.new(Sass::Script::Value::String.value(@scanner[1]), :string)
+          end
+        [:string, str]
+      end
+
+      def number
+        # Handling unary minus is complicated by the fact that whitespace is an
+        # operator in SassScript. We want "1-2" to be parsed as "1 - 2", but we
+        # want "1 -2" to be parsed as "1 (-2)". To accomplish this, we only
+        # parse a unary minus as part of a number literal if there's whitespace
+        # before and not after it. Cases like "(-2)" are handled by the unary
+        # minus logic in the parser instead.
+        if @scanner.peek(1) == '-'
+          return if @scanner.pos == 0
+          unary_minus_allowed =
+            case @scanner.string[@scanner.pos - 1, 1]
+            when /\s/; true
+            when '/'; @scanner.pos != 1 && @scanner.string[@scanner.pos - 2, 1] == '*'
+            else; false
+            end
+
+          return unless unary_minus_allowed
+          return unless scan(REGULAR_EXPRESSIONS[:unary_minus_number])
+          minus = true
+        else
+          return unless scan(REGULAR_EXPRESSIONS[:number])
+          minus = false
+        end
+
+        value = (@scanner[1] ? @scanner[1].to_f : @scanner[2].to_i) * (minus ? -1 : 1)
+        value *= 10**@scanner[3].to_i if @scanner[3]
+        script_number = Script::Value::Number.new(value, Array(@scanner[4]))
+        [:number, script_number]
+      end
+
+      def id
+        # Colors and ids are tough to tell apart, because they overlap but
+        # neither is a superset of the other. "#xyz" is an id but not a color,
+        # "#000" is a color but not an id, "#abc" is both, and "#0" is neither.
+        # We need to handle all these cases correctly.
+        #
+        # To do so, we first try to parse something as an id. If this works and
+        # the id is also a valid color, we return the color. Otherwise, we
+        # return the id. If it didn't parse as an id, we then try to parse it as
+        # a color. If *this* works, we return the color, and if it doesn't we
+        # give up and throw an error.
+        #
+        # IDs in properties are used in the Basic User Interface Module
+        # (http://www.w3.org/TR/css3-ui/).
+        return unless scan(REGULAR_EXPRESSIONS[:id])
+        if @scanner[0] =~ /^\#[0-9a-fA-F]+$/
+          if @scanner[0].length == 4 || @scanner[0].length == 7
+            return [:color, Script::Value::Color.from_hex(@scanner[0])]
+          elsif @scanner[0].length == 5 || @scanner[0].length == 9
+            filename = @options[:filename]
+            Sass::Util.sass_warn <<MESSAGE
+DEPRECATION WARNING on line #{line}, column #{offset}#{" of #{filename}" if filename}:
+The value "#{@scanner[0]}" is currently parsed as a string, but it will be parsed as a color in
+future versions of Sass. Use "unquote('#{@scanner[0]}')" to continue parsing it as a string.
+MESSAGE
+          end
+        end
+        [:ident, @scanner[0]]
+      end
+
+      def color
+        return unless @scanner.match?(REGULAR_EXPRESSIONS[:color])
+        return unless @scanner[0].length == 4 || @scanner[0].length == 7
+        script_color = Script::Value::Color.from_hex(scan(REGULAR_EXPRESSIONS[:color]))
+        [:color, script_color]
+      end
+
+      def selector
+        start_pos = source_position
+        return unless scan(REGULAR_EXPRESSIONS[:selector])
+        script_selector = Script::Tree::Selector.new
+        script_selector.source_range = range(start_pos)
+        [:selector, script_selector]
+      end
+
+      def special_fun
+        prefix = scan(/((-[\w-]+-)?(calc|element)|expression|progid:[a-z\.]*)\(/i)
+        return unless prefix
+        special_fun_body(1, prefix)
+      end
+
+      def special_fun_body(parens, prefix = nil)
+        str = prefix || ''
+        while (scanned = scan(/.*?([()]|\#\{)/m))
+          str << scanned
+          if scanned[-1] == ?(
+            parens += 1
+            next
+          elsif scanned[-1] == ?)
+            parens -= 1
+            next unless parens == 0
+          else
+            raise "[BUG] Unreachable" unless @scanner[1] == '#{' # '
+            str.slice!(-2..-1)
+            @interpolation_stack << [:special_fun, parens]
+            start_pos = Sass::Source::Position.new(@line, @offset - 2)
+            @next_tok = Token.new(:string_interpolation, range(start_pos), @scanner.pos - 2)
+          end
+
+          return [:special_fun, Sass::Script::Value::String.new(str)]
+        end
+
+        scan(/.*/)
+        expected!('")"')
+      end
+
+      def special_val
+        return unless scan(/!#{W}important/i)
+        [:string, Script::Value::String.new("!important")]
+      end
+
+      def ident_op
+        op = scan(REGULAR_EXPRESSIONS[:ident_op])
+        return unless op
+        [OPERATORS[op]]
+      end
+
+      def op
+        op = scan(REGULAR_EXPRESSIONS[:op])
+        return unless op
+        name = OPERATORS[op]
+        @interpolation_stack << nil if name == :begin_interpolation
+        [name]
+      end
+
+      def raw(rx)
+        val = scan(rx)
+        return unless val
+        [:raw, val]
+      end
+
+      def scan(re)
+        str = @scanner.scan(re)
+        return unless str
+        c = str.count("\n")
+        @line += c
+        @offset = (c == 0 ? @offset + str.size : str.size - str.rindex("\n"))
+        str
+      end
+
+      def range(start_pos, end_pos = source_position)
+        Sass::Source::Range.new(start_pos, end_pos, @options[:filename], @options[:importer])
+      end
+
+      def source_position
+        Sass::Source::Position.new(@line, @offset)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/parser.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/parser.rb
new file mode 100644
index 0000000..fac383f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/parser.rb
@@ -0,0 +1,834 @@
+require 'sass/script/lexer'
+
+module Sass
+  module Script
+    # The parser for SassScript.
+    # It parses a string of code into a tree of {Script::Tree::Node}s.
+    class Parser
+      # The line number of the parser's current position.
+      #
+      # @return [Integer]
+      def line
+        @lexer.line
+      end
+
+      # The column number of the parser's current position.
+      #
+      # @return [Integer]
+      def offset
+        @lexer.offset
+      end
+
+      # @param str [String, StringScanner] The source text to parse
+      # @param line [Integer] The line on which the SassScript appears.
+      #   Used for error reporting and sourcemap building
+      # @param offset [Integer] The character (not byte) offset where the script starts in the line.
+      #   Used for error reporting and sourcemap building
+      # @param options [{Symbol => Object}] An options hash; see
+      #   {file:SASS_REFERENCE.md#Options the Sass options documentation}.
+      #   This supports an additional `:allow_extra_text` option that controls
+      #   whether the parser throws an error when extra text is encountered
+      #   after the parsed construct.
+      def initialize(str, line, offset, options = {})
+        @options = options
+        @allow_extra_text = options.delete(:allow_extra_text)
+        @lexer = lexer_class.new(str, line, offset, options)
+        @stop_at = nil
+      end
+
+      # Parses a SassScript expression within an interpolated segment (`#{}`).
+      # This means that it stops when it comes across an unmatched `}`,
+      # which signals the end of an interpolated segment,
+      # it returns rather than throwing an error.
+      #
+      # @param warn_for_color [Boolean] Whether raw color values passed to
+      #   interoplation should cause a warning.
+      # @return [Script::Tree::Node] The root node of the parse tree
+      # @raise [Sass::SyntaxError] if the expression isn't valid SassScript
+      def parse_interpolated(warn_for_color = false)
+        # Start two characters back to compensate for #{
+        start_pos = Sass::Source::Position.new(line, offset - 2)
+        expr = assert_expr :expr
+        assert_tok :end_interpolation
+        expr = Sass::Script::Tree::Interpolation.new(
+          nil, expr, nil, false, false, :warn_for_color => warn_for_color)
+        check_for_interpolation expr
+        expr.options = @options
+        node(expr, start_pos)
+      rescue Sass::SyntaxError => e
+        e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
+        raise e
+      end
+
+      # Parses a SassScript expression.
+      #
+      # @return [Script::Tree::Node] The root node of the parse tree
+      # @raise [Sass::SyntaxError] if the expression isn't valid SassScript
+      def parse
+        expr = assert_expr :expr
+        assert_done
+        expr.options = @options
+        check_for_interpolation expr
+        expr
+      rescue Sass::SyntaxError => e
+        e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
+        raise e
+      end
+
+      # Parses a SassScript expression,
+      # ending it when it encounters one of the given identifier tokens.
+      #
+      # @param tokens [#include?(String)] A set of strings that delimit the expression.
+      # @return [Script::Tree::Node] The root node of the parse tree
+      # @raise [Sass::SyntaxError] if the expression isn't valid SassScript
+      def parse_until(tokens)
+        @stop_at = tokens
+        expr = assert_expr :expr
+        assert_done
+        expr.options = @options
+        check_for_interpolation expr
+        expr
+      rescue Sass::SyntaxError => e
+        e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
+        raise e
+      end
+
+      # Parses the argument list for a mixin include.
+      #
+      # @return [(Array<Script::Tree::Node>,
+      #          {String => Script::Tree::Node},
+      #          Script::Tree::Node,
+      #          Script::Tree::Node)]
+      #   The root nodes of the positional arguments, keyword arguments, and
+      #   splat argument(s). Keyword arguments are in a hash from names to values.
+      # @raise [Sass::SyntaxError] if the argument list isn't valid SassScript
+      def parse_mixin_include_arglist
+        args, keywords = [], {}
+        if try_tok(:lparen)
+          args, keywords, splat, kwarg_splat = mixin_arglist
+          assert_tok(:rparen)
+        end
+        assert_done
+
+        args.each do |a|
+          check_for_interpolation a
+          a.options = @options
+        end
+
+        keywords.each do |_, v|
+          check_for_interpolation v
+          v.options = @options
+        end
+
+        if splat
+          check_for_interpolation splat
+          splat.options = @options
+        end
+
+        if kwarg_splat
+          check_for_interpolation kwarg_splat
+          kwarg_splat.options = @options
+        end
+
+        return args, keywords, splat, kwarg_splat
+      rescue Sass::SyntaxError => e
+        e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
+        raise e
+      end
+
+      # Parses the argument list for a mixin definition.
+      #
+      # @return [(Array<Script::Tree::Node>, Script::Tree::Node)]
+      #   The root nodes of the arguments, and the splat argument.
+      # @raise [Sass::SyntaxError] if the argument list isn't valid SassScript
+      def parse_mixin_definition_arglist
+        args, splat = defn_arglist!(false)
+        assert_done
+
+        args.each do |k, v|
+          check_for_interpolation k
+          k.options = @options
+
+          if v
+            check_for_interpolation v
+            v.options = @options
+          end
+        end
+
+        if splat
+          check_for_interpolation splat
+          splat.options = @options
+        end
+
+        return args, splat
+      rescue Sass::SyntaxError => e
+        e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
+        raise e
+      end
+
+      # Parses the argument list for a function definition.
+      #
+      # @return [(Array<Script::Tree::Node>, Script::Tree::Node)]
+      #   The root nodes of the arguments, and the splat argument.
+      # @raise [Sass::SyntaxError] if the argument list isn't valid SassScript
+      def parse_function_definition_arglist
+        args, splat = defn_arglist!(true)
+        assert_done
+
+        args.each do |k, v|
+          check_for_interpolation k
+          k.options = @options
+
+          if v
+            check_for_interpolation v
+            v.options = @options
+          end
+        end
+
+        if splat
+          check_for_interpolation splat
+          splat.options = @options
+        end
+
+        return args, splat
+      rescue Sass::SyntaxError => e
+        e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
+        raise e
+      end
+
+      # Parse a single string value, possibly containing interpolation.
+      # Doesn't assert that the scanner is finished after parsing.
+      #
+      # @return [Script::Tree::Node] The root node of the parse tree.
+      # @raise [Sass::SyntaxError] if the string isn't valid SassScript
+      def parse_string
+        unless (peek = @lexer.peek) &&
+            (peek.type == :string ||
+            (peek.type == :funcall && peek.value.downcase == 'url'))
+          lexer.expected!("string")
+        end
+
+        expr = assert_expr :funcall
+        check_for_interpolation expr
+        expr.options = @options
+        @lexer.unpeek!
+        expr
+      rescue Sass::SyntaxError => e
+        e.modify_backtrace :line => @lexer.line, :filename => @options[:filename]
+        raise e
+      end
+
+      # Parses a SassScript expression.
+      #
+      # @overload parse(str, line, offset, filename = nil)
+      # @return [Script::Tree::Node] The root node of the parse tree
+      # @see Parser#initialize
+      # @see Parser#parse
+      def self.parse(*args)
+        new(*args).parse
+      end
+
+      PRECEDENCE = [
+        :comma, :single_eq, :space, :or, :and,
+        [:eq, :neq],
+        [:gt, :gte, :lt, :lte],
+        [:plus, :minus],
+        [:times, :div, :mod],
+      ]
+
+      ASSOCIATIVE = [:plus, :times]
+
+      class << self
+        # Returns an integer representing the precedence
+        # of the given operator.
+        # A lower integer indicates a looser binding.
+        #
+        # @private
+        def precedence_of(op)
+          PRECEDENCE.each_with_index do |e, i|
+            return i if Array(e).include?(op)
+          end
+          raise "[BUG] Unknown operator #{op.inspect}"
+        end
+
+        # Returns whether or not the given operation is associative.
+        #
+        # @private
+        def associative?(op)
+          ASSOCIATIVE.include?(op)
+        end
+
+        private
+
+        # Defines a simple left-associative production.
+        # name is the name of the production,
+        # sub is the name of the production beneath it,
+        # and ops is a list of operators for this precedence level
+        def production(name, sub, *ops)
+          class_eval <<RUBY, __FILE__, __LINE__ + 1
+            def #{name}
+              interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect})
+              return interp if interp
+              return unless e = #{sub}
+              while tok = try_toks(#{ops.map {|o| o.inspect}.join(', ')})
+                if interp = try_op_before_interp(tok, e)
+                  other_interp = try_ops_after_interp(#{ops.inspect}, #{name.inspect}, interp)
+                  return interp unless other_interp
+                  return other_interp
+                end
+
+                e = node(Tree::Operation.new(e, assert_expr(#{sub.inspect}), tok.type),
+                         e.source_range.start_pos)
+              end
+              e
+            end
+RUBY
+        end
+
+        def unary(op, sub)
+          class_eval <<RUBY, __FILE__, __LINE__ + 1
+            def unary_#{op}
+              return #{sub} unless tok = try_tok(:#{op})
+              interp = try_op_before_interp(tok)
+              return interp if interp
+              start_pos = source_position
+              node(Tree::UnaryOperation.new(assert_expr(:unary_#{op}), :#{op}), start_pos)
+            end
+RUBY
+        end
+      end
+
+      private
+
+      def source_position
+        Sass::Source::Position.new(line, offset)
+      end
+
+      def range(start_pos, end_pos = source_position)
+        Sass::Source::Range.new(start_pos, end_pos, @options[:filename], @options[:importer])
+      end
+
+      # @private
+      def lexer_class; Lexer; end
+
+      def map
+        start_pos = source_position
+        e = interpolation
+        return unless e
+        return list e, start_pos unless @lexer.peek && @lexer.peek.type == :colon
+
+        pair = map_pair(e)
+        map = node(Sass::Script::Tree::MapLiteral.new([pair]), start_pos)
+        while try_tok(:comma)
+          pair = map_pair
+          return map unless pair
+          map.pairs << pair
+        end
+        map
+      end
+
+      def map_pair(key = nil)
+        return unless key ||= interpolation
+        assert_tok :colon
+        return key, assert_expr(:interpolation)
+      end
+
+      def expr
+        start_pos = source_position
+        e = interpolation
+        return unless e
+        list e, start_pos
+      end
+
+      def list(first, start_pos)
+        return first unless @lexer.peek && @lexer.peek.type == :comma
+
+        list = node(Sass::Script::Tree::ListLiteral.new([first], separator: :comma), start_pos)
+        while (tok = try_tok(:comma))
+          element_before_interp = list.elements.length == 1 ? list.elements.first : list
+          if (interp = try_op_before_interp(tok, element_before_interp))
+            other_interp = try_ops_after_interp([:comma], :expr, interp)
+            return interp unless other_interp
+            return other_interp
+          end
+          return list unless (e = interpolation)
+          list.elements << e
+          list.source_range.end_pos = list.elements.last.source_range.end_pos
+        end
+        list
+      end
+
+      production :equals, :interpolation, :single_eq
+
+      def try_op_before_interp(op, prev = nil, after_interp = false)
+        return unless @lexer.peek && @lexer.peek.type == :begin_interpolation
+        unary = !prev && !after_interp
+        wb = @lexer.whitespace?(op)
+        str = literal_node(Script::Value::String.new(Lexer::OPERATORS_REVERSE[op.type]),
+                           op.source_range)
+
+        deprecation =
+          case op.type
+          when :comma; :potential
+          when :div, :single_eq; :none
+          when :plus; unary ? :none : :immediate
+          when :minus; @lexer.whitespace?(@lexer.peek) ? :immediate : :none
+          else; :immediate
+          end
+
+        interp = node(
+          Script::Tree::Interpolation.new(
+            prev, str, nil, wb, false, :originally_text => true, :deprecation => deprecation),
+          (prev || str).source_range.start_pos)
+        interpolation(first: interp)
+      end
+
+      def try_ops_after_interp(ops, name, prev = nil)
+        return unless @lexer.after_interpolation?
+        op = try_toks(*ops)
+        return unless op
+        interp = try_op_before_interp(op, prev, :after_interp)
+        return interp if interp
+
+        wa = @lexer.whitespace?
+        str = literal_node(Script::Value::String.new(Lexer::OPERATORS_REVERSE[op.type]),
+                           op.source_range)
+        str.line = @lexer.line
+
+        deprecation =
+          case op.type
+          when :comma; :potential
+          when :div, :single_eq; :none
+          when :minus; @lexer.whitespace?(op) ? :immediate : :none
+          else; :immediate
+          end
+        interp = node(
+          Script::Tree::Interpolation.new(
+            prev, str, assert_expr(name), false, wa,
+            :originally_text => true, :deprecation => deprecation),
+          (prev || str).source_range.start_pos)
+        interp
+      end
+
+      def interpolation(first: nil, inner: :space)
+        e = first || send(inner)
+        while (interp = try_tok(:begin_interpolation))
+          wb = @lexer.whitespace?(interp)
+          char_before = @lexer.char(interp.pos - 1)
+          mid = assert_expr :expr
+          assert_tok :end_interpolation
+          wa = @lexer.whitespace?
+          char_after = @lexer.char
+
+          after = send(inner)
+          before_deprecation = e.is_a?(Script::Tree::Interpolation) ? e.deprecation : :none
+          after_deprecation = after.is_a?(Script::Tree::Interpolation) ? after.deprecation : :none
+
+          deprecation =
+            if before_deprecation == :immediate || after_deprecation == :immediate ||
+               # Warn for #{foo}$var and #{foo}(1) but not #{$foo}1.
+               (after && !wa && char_after =~ /[$(]/) ||
+               # Warn for $var#{foo} and (a)#{foo} but not a#{foo}.
+               (e && !wb && is_unsafe_before?(e, char_before))
+              :immediate
+            else
+              :potential
+            end
+
+          e = node(
+            Script::Tree::Interpolation.new(e, mid, after, wb, wa, :deprecation => deprecation),
+            (e || interp).source_range.start_pos)
+        end
+        e
+      end
+
+      # Returns whether `expr` is unsafe to include before an interpolation.
+      #
+      # @param expr [Node] The expression to check.
+      # @param char_before [String] The character immediately before the
+      #   interpolation being checked (and presumably the last character of
+      #   `expr`).
+      # @return [Boolean]
+      def is_unsafe_before?(expr, char_before)
+        return char_before == ')' if is_safe_value?(expr)
+
+        # Otherwise, it's only safe if it was another interpolation.
+        !expr.is_a?(Script::Tree::Interpolation)
+      end
+
+      # Returns whether `expr` is safe as the value immediately before an
+      # interpolation.
+      #
+      # It's safe as long as the previous expression is an identifier or number,
+      # or a list whose last element is also safe.
+      def is_safe_value?(expr)
+        return is_safe_value?(expr.elements.last) if expr.is_a?(Script::Tree::ListLiteral)
+        return false unless expr.is_a?(Script::Tree::Literal)
+        expr.value.is_a?(Script::Value::Number) ||
+          (expr.value.is_a?(Script::Value::String) && expr.value.type == :identifier)
+      end
+
+      def space
+        start_pos = source_position
+        e = or_expr
+        return unless e
+        arr = [e]
+        while (e = or_expr)
+          arr << e
+        end
+        if arr.size == 1
+          arr.first
+        else
+          node(Sass::Script::Tree::ListLiteral.new(arr, separator: :space), start_pos)
+        end
+      end
+
+      production :or_expr, :and_expr, :or
+      production :and_expr, :eq_or_neq, :and
+      production :eq_or_neq, :relational, :eq, :neq
+      production :relational, :plus_or_minus, :gt, :gte, :lt, :lte
+      production :plus_or_minus, :times_div_or_mod, :plus, :minus
+      production :times_div_or_mod, :unary_plus, :times, :div, :mod
+
+      unary :plus, :unary_minus
+      unary :minus, :unary_div
+      unary :div, :unary_not # For strings, so /foo/bar works
+      unary :not, :ident
+
+      def ident
+        return funcall unless @lexer.peek && @lexer.peek.type == :ident
+        return if @stop_at && @stop_at.include?(@lexer.peek.value)
+
+        name = @lexer.next
+        if (color = Sass::Script::Value::Color::COLOR_NAMES[name.value.downcase])
+          literal_node(Sass::Script::Value::Color.new(color, name.value), name.source_range)
+        elsif name.value == "true"
+          literal_node(Sass::Script::Value::Bool.new(true), name.source_range)
+        elsif name.value == "false"
+          literal_node(Sass::Script::Value::Bool.new(false), name.source_range)
+        elsif name.value == "null"
+          literal_node(Sass::Script::Value::Null.new, name.source_range)
+        else
+          literal_node(Sass::Script::Value::String.new(name.value, :identifier), name.source_range)
+        end
+      end
+
+      def funcall
+        tok = try_tok(:funcall)
+        return raw unless tok
+        args, keywords, splat, kwarg_splat = fn_arglist
+        assert_tok(:rparen)
+        node(Script::Tree::Funcall.new(tok.value, args, keywords, splat, kwarg_splat),
+          tok.source_range.start_pos, source_position)
+      end
+
+      def defn_arglist!(must_have_parens)
+        if must_have_parens
+          assert_tok(:lparen)
+        else
+          return [], nil unless try_tok(:lparen)
+        end
+
+        res = []
+        splat = nil
+        must_have_default = false
+        loop do
+          break if peek_tok(:rparen)
+          c = assert_tok(:const)
+          var = node(Script::Tree::Variable.new(c.value), c.source_range)
+          if try_tok(:colon)
+            val = assert_expr(:space)
+            must_have_default = true
+          elsif try_tok(:splat)
+            splat = var
+            break
+          elsif must_have_default
+            raise SyntaxError.new(
+              "Required argument #{var.inspect} must come before any optional arguments.")
+          end
+          res << [var, val]
+          break unless try_tok(:comma)
+        end
+        assert_tok(:rparen)
+        return res, splat
+      end
+
+      def fn_arglist
+        arglist(:equals, "function argument")
+      end
+
+      def mixin_arglist
+        arglist(:interpolation, "mixin argument")
+      end
+
+      def arglist(subexpr, description)
+        args = []
+        keywords = Sass::Util::NormalizedMap.new
+        splat = nil
+        while (e = send(subexpr))
+          if @lexer.peek && @lexer.peek.type == :colon
+            name = e
+            @lexer.expected!("comma") unless name.is_a?(Tree::Variable)
+            assert_tok(:colon)
+            value = assert_expr(subexpr, description)
+
+            if keywords[name.name]
+              raise SyntaxError.new("Keyword argument \"#{name.to_sass}\" passed more than once")
+            end
+
+            keywords[name.name] = value
+          else
+            if try_tok(:splat)
+              return args, keywords, splat, e if splat
+              splat, e = e, nil
+            elsif splat
+              raise SyntaxError.new("Only keyword arguments may follow variable arguments (...).")
+            elsif !keywords.empty?
+              raise SyntaxError.new("Positional arguments must come before keyword arguments.")
+            end
+            args << e if e
+          end
+
+          return args, keywords, splat unless try_tok(:comma)
+        end
+        return args, keywords
+      end
+
+      def raw
+        tok = try_tok(:raw)
+        return special_fun unless tok
+        literal_node(Script::Value::String.new(tok.value), tok.source_range)
+      end
+
+      def special_fun
+        first = try_tok(:special_fun)
+        return square_list unless first
+        str = literal_node(first.value, first.source_range)
+        return str unless try_tok(:string_interpolation)
+        mid = assert_expr :expr
+        assert_tok :end_interpolation
+        last = assert_expr(:special_fun)
+        node(
+          Tree::Interpolation.new(str, mid, last, false, false),
+          first.source_range.start_pos)
+      end
+
+      def square_list
+        start_pos = source_position
+        return paren unless try_tok(:lsquare)
+
+        space_start_pos = source_position
+        e = interpolation(inner: :or_expr)
+        separator = nil
+        if e
+          elements = [e]
+          while (e = interpolation(inner: :or_expr))
+            elements << e
+          end
+
+          # If there's a comma after a space-separated list, it's actually a
+          # space-separated list nested in a comma-separated list.
+          if try_tok(:comma)
+            e = if elements.length == 1
+                  elements.first
+                else
+                  node(
+                    Sass::Script::Tree::ListLiteral.new(elements, separator: :space),
+                    space_start_pos)
+                end
+            elements = [e]
+
+            while (e = space)
+              elements << e
+              break unless try_tok(:comma)
+            end
+            separator = :comma
+          else
+            separator = :space if elements.length > 1
+          end
+        else
+          elements = []
+        end
+
+        assert_tok(:rsquare)
+        end_pos = source_position
+
+        node(Sass::Script::Tree::ListLiteral.new(elements, separator: separator, bracketed: true),
+             start_pos, end_pos)
+      end
+
+      def paren
+        return variable unless try_tok(:lparen)
+        start_pos = source_position
+        e = map
+        e.force_division! if e
+        end_pos = source_position
+        assert_tok(:rparen)
+        e || node(Sass::Script::Tree::ListLiteral.new([]), start_pos, end_pos)
+      end
+
+      def variable
+        start_pos = source_position
+        c = try_tok(:const)
+        return string unless c
+        node(Tree::Variable.new(*c.value), start_pos)
+      end
+
+      def string
+        first = try_tok(:string)
+        return number unless first
+        str = literal_node(first.value, first.source_range)
+        return str unless try_tok(:string_interpolation)
+        mid = assert_expr :expr
+        assert_tok :end_interpolation
+        last = assert_expr(:string)
+        node(Tree::StringInterpolation.new(str, mid, last), first.source_range.start_pos)
+      end
+
+      def number
+        tok = try_tok(:number)
+        return selector unless tok
+        num = tok.value
+        num.options = @options
+        num.original = num.to_s
+        literal_node(num, tok.source_range.start_pos)
+      end
+
+      def selector
+        tok = try_tok(:selector)
+        return literal unless tok
+        node(tok.value, tok.source_range.start_pos)
+      end
+
+      def literal
+        t = try_tok(:color)
+        return literal_node(t.value, t.source_range) if t
+      end
+
+      # It would be possible to have unified #assert and #try methods,
+      # but detecting the method/token difference turns out to be quite expensive.
+
+      EXPR_NAMES = {
+        :string => "string",
+        :default => "expression (e.g. 1px, bold)",
+        :mixin_arglist => "mixin argument",
+        :fn_arglist => "function argument",
+        :splat => "...",
+        :special_fun => '")"',
+      }
+
+      def assert_expr(name, expected = nil)
+        e = send(name)
+        return e if e
+        @lexer.expected!(expected || EXPR_NAMES[name] || EXPR_NAMES[:default])
+      end
+
+      def assert_tok(name)
+        # Avoids an array allocation caused by argument globbing in assert_toks.
+        t = try_tok(name)
+        return t if t
+        @lexer.expected!(Lexer::TOKEN_NAMES[name] || name.to_s)
+      end
+
+      def assert_toks(*names)
+        t = try_toks(*names)
+        return t if t
+        @lexer.expected!(names.map {|tok| Lexer::TOKEN_NAMES[tok] || tok}.join(" or "))
+      end
+
+      def peek_tok(name)
+        # Avoids an array allocation caused by argument globbing in the try_toks method.
+        peeked = @lexer.peek
+        peeked && name == peeked.type
+      end
+
+      def try_tok(name)
+        peek_tok(name) && @lexer.next
+      end
+
+      def try_toks(*names)
+        peeked = @lexer.peek
+        peeked && names.include?(peeked.type) && @lexer.next
+      end
+
+      def assert_done
+        if @allow_extra_text
+          # If extra text is allowed, just rewind the lexer so that the
+          # StringScanner is pointing to the end of the parsed text.
+          @lexer.unpeek!
+        else
+          return if @lexer.done?
+          @lexer.expected!(EXPR_NAMES[:default])
+        end
+      end
+
+      # @overload node(value, source_range)
+      #   @param value [Sass::Script::Value::Base]
+      #   @param source_range [Sass::Source::Range]
+      # @overload node(value, start_pos, end_pos = source_position)
+      #   @param value [Sass::Script::Value::Base]
+      #   @param start_pos [Sass::Source::Position]
+      #   @param end_pos [Sass::Source::Position]
+      def literal_node(value, source_range_or_start_pos, end_pos = source_position)
+        node(Sass::Script::Tree::Literal.new(value), source_range_or_start_pos, end_pos)
+      end
+
+      # @overload node(node, source_range)
+      #   @param node [Sass::Script::Tree::Node]
+      #   @param source_range [Sass::Source::Range]
+      # @overload node(node, start_pos, end_pos = source_position)
+      #   @param node [Sass::Script::Tree::Node]
+      #   @param start_pos [Sass::Source::Position]
+      #   @param end_pos [Sass::Source::Position]
+      def node(node, source_range_or_start_pos, end_pos = source_position)
+        source_range =
+          if source_range_or_start_pos.is_a?(Sass::Source::Range)
+            source_range_or_start_pos
+          else
+            range(source_range_or_start_pos, end_pos)
+          end
+
+        node.line = source_range.start_pos.line
+        node.source_range = source_range
+        node.filename = @options[:filename]
+        node
+      end
+
+      # Checks a script node for any immediately-deprecated interpolations, and
+      # emits warnings for them.
+      #
+      # @param node [Sass::Script::Tree::Node]
+      def check_for_interpolation(node)
+        nodes = [node]
+        until nodes.empty?
+          node = nodes.pop
+          unless node.is_a?(Sass::Script::Tree::Interpolation) &&
+                 node.deprecation == :immediate
+            nodes.concat node.children
+            next
+          end
+
+          interpolation_deprecation(node)
+        end
+      end
+
+      # Emits a deprecation warning for an interpolation node.
+      #
+      # @param node [Sass::Script::Tree::Node]
+      def interpolation_deprecation(interpolation)
+        return if @options[:_convert]
+        location = "on line #{interpolation.line}"
+        location << " of #{interpolation.filename}" if interpolation.filename
+        Sass::Util.sass_warn <<WARNING
+DEPRECATION WARNING #{location}:
+\#{} interpolation near operators will be simplified in a future version of Sass.
+To preserve the current behavior, use quotes:
+
+  #{interpolation.to_quoted_equivalent.to_sass}
+
+You can use the sass-convert command to automatically fix most cases.
+WARNING
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree.rb
new file mode 100644
index 0000000..8bd4686
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree.rb
@@ -0,0 +1,16 @@
+# The module containing nodes in the SassScript parse tree. These nodes are
+# all subclasses of {Sass::Script::Tree::Node}.
+module Sass::Script::Tree
+end
+
+require 'sass/script/tree/node'
+require 'sass/script/tree/variable'
+require 'sass/script/tree/funcall'
+require 'sass/script/tree/operation'
+require 'sass/script/tree/unary_operation'
+require 'sass/script/tree/interpolation'
+require 'sass/script/tree/string_interpolation'
+require 'sass/script/tree/literal'
+require 'sass/script/tree/list_literal'
+require 'sass/script/tree/map_literal'
+require 'sass/script/tree/selector'
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/funcall.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/funcall.rb
new file mode 100644
index 0000000..70d01ec
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/funcall.rb
@@ -0,0 +1,318 @@
+require 'sass/script/functions'
+require 'sass/util'
+
+module Sass::Script::Tree
+  # A SassScript parse node representing a function call.
+  #
+  # A function call either calls one of the functions in
+  # {Sass::Script::Functions}, or if no function with the given name exists it
+  # returns a string representation of the function call.
+  class Funcall < Node
+    # The name of the function.
+    #
+    # @return [String]
+    attr_reader :name
+
+    # The callable to be invoked
+    #
+    # @return [Sass::Callable] or nil if no callable is provided.
+    attr_reader :callable
+
+    # The arguments to the function.
+    #
+    # @return [Array<Node>]
+    attr_reader :args
+
+    # The keyword arguments to the function.
+    #
+    # @return [Sass::Util::NormalizedMap<Node>]
+    attr_reader :keywords
+
+    # The first splat argument for this function, if one exists.
+    #
+    # This could be a list of positional arguments, a map of keyword
+    # arguments, or an arglist containing both.
+    #
+    # @return [Node?]
+    attr_accessor :splat
+
+    # The second splat argument for this function, if one exists.
+    #
+    # If this exists, it's always a map of keyword arguments, and
+    # \{#splat} is always either a list or an arglist.
+    #
+    # @return [Node?]
+    attr_accessor :kwarg_splat
+
+    # @param name_or_callable [String, Sass::Callable] See \{#name}
+    # @param args [Array<Node>] See \{#args}
+    # @param keywords [Sass::Util::NormalizedMap<Node>] See \{#keywords}
+    # @param splat [Node] See \{#splat}
+    # @param kwarg_splat [Node] See \{#kwarg_splat}
+    def initialize(name_or_callable, args, keywords, splat, kwarg_splat)
+      if name_or_callable.is_a?(Sass::Callable)
+        @callable = name_or_callable
+        @name = name_or_callable.name
+      else
+        @callable = nil
+        @name = name_or_callable
+      end
+      @args = args
+      @keywords = keywords
+      @splat = splat
+      @kwarg_splat = kwarg_splat
+      super()
+    end
+
+    # @return [String] A string representation of the function call
+    def inspect
+      args = @args.map {|a| a.inspect}.join(', ')
+      keywords = @keywords.as_stored.to_a.map {|k, v| "$#{k}: #{v.inspect}"}.join(', ')
+      # rubocop:disable RedundantSelf
+      if self.splat
+        splat = args.empty? && keywords.empty? ? "" : ", "
+        splat = "#{splat}#{self.splat.inspect}..."
+        splat = "#{splat}, #{kwarg_splat.inspect}..." if kwarg_splat
+      end
+      # rubocop:enable RedundantSelf
+      "#{name}(#{args}#{', ' unless args.empty? || keywords.empty?}#{keywords}#{splat})"
+    end
+
+    # @see Node#to_sass
+    def to_sass(opts = {})
+      arg_to_sass = lambda do |arg|
+        sass = arg.to_sass(opts)
+        sass = "(#{sass})" if arg.is_a?(Sass::Script::Tree::ListLiteral) && arg.separator == :comma
+        sass
+      end
+
+      args = @args.map(&arg_to_sass)
+      keywords = @keywords.as_stored.to_a.map {|k, v| "$#{dasherize(k, opts)}: #{arg_to_sass[v]}"}
+
+      # rubocop:disable RedundantSelf
+      if self.splat
+        splat = "#{arg_to_sass[self.splat]}..."
+        kwarg_splat = "#{arg_to_sass[self.kwarg_splat]}..." if self.kwarg_splat
+      end
+      # rubocop:enable RedundantSelf
+
+      arglist = [args, splat, keywords, kwarg_splat].flatten.compact.join(', ')
+      "#{dasherize(name, opts)}(#{arglist})"
+    end
+
+    # Returns the arguments to the function.
+    #
+    # @return [Array<Node>]
+    # @see Node#children
+    def children
+      res = @args + @keywords.values
+      res << @splat if @splat
+      res << @kwarg_splat if @kwarg_splat
+      res
+    end
+
+    # @see Node#deep_copy
+    def deep_copy
+      node = dup
+      node.instance_variable_set('@args', args.map {|a| a.deep_copy})
+      copied_keywords = Sass::Util::NormalizedMap.new
+      @keywords.as_stored.each {|k, v| copied_keywords[k] = v.deep_copy}
+      node.instance_variable_set('@keywords', copied_keywords)
+      node
+    end
+
+    protected
+
+    # Evaluates the function call.
+    #
+    # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
+    # @return [Sass::Script::Value] The SassScript object that is the value of the function call
+    # @raise [Sass::SyntaxError] if the function call raises an ArgumentError
+    def _perform(environment)
+      args = @args.each_with_index.
+        map {|a, i| perform_arg(a, environment, signature && signature.args[i])}
+      keywords = Sass::Util.map_hash(@keywords) do |k, v|
+        [k, perform_arg(v, environment, k.tr('-', '_'))]
+      end
+      splat = Sass::Tree::Visitors::Perform.perform_splat(
+        @splat, keywords, @kwarg_splat, environment)
+
+      fn = @callable || environment.function(@name)
+
+      if fn && fn.origin == :stylesheet
+        environment.stack.with_function(filename, line, name) do
+          return without_original(perform_sass_fn(fn, args, splat, environment))
+        end
+      end
+
+      args = construct_ruby_args(ruby_name, args, splat, environment)
+
+      if Sass::Script::Functions.callable?(ruby_name) && (!fn || fn.origin == :builtin)
+        local_environment = Sass::Environment.new(environment.global_env, environment.options)
+        local_environment.caller = Sass::ReadOnlyEnvironment.new(environment, environment.options)
+        result = local_environment.stack.with_function(filename, line, name) do
+          opts(Sass::Script::Functions::EvaluationContext.new(
+            local_environment).send(ruby_name, *args))
+        end
+        without_original(result)
+      else
+        opts(to_literal(args))
+      end
+    rescue ArgumentError => e
+      reformat_argument_error(e)
+    end
+
+    # Compass historically overrode this before it changed name to {Funcall#to_value}.
+    # We should get rid of it in the future.
+    def to_literal(args)
+      to_value(args)
+    end
+
+    # This method is factored out from `_perform` so that compass can override
+    # it with a cross-browser implementation for functions that require vendor prefixes
+    # in the generated css.
+    def to_value(args)
+      Sass::Script::Value::String.new("#{name}(#{args.join(', ')})")
+    end
+
+    private
+
+    def ruby_name
+      @ruby_name ||= @name.tr('-', '_')
+    end
+
+    def perform_arg(argument, environment, name)
+      return argument if signature && signature.delayed_args.include?(name)
+      argument.perform(environment)
+    end
+
+    def signature
+      @signature ||= Sass::Script::Functions.signature(name.to_sym, @args.size, @keywords.size)
+    end
+
+    def without_original(value)
+      return value unless value.is_a?(Sass::Script::Value::Number)
+      value = value.dup
+      value.original = nil
+      value
+    end
+
+    def construct_ruby_args(name, args, splat, environment)
+      args += splat.to_a if splat
+
+      # All keywords are contained in splat.keywords for consistency,
+      # even if there were no splats passed in.
+      old_keywords_accessed = splat.keywords_accessed
+      keywords = splat.keywords
+      splat.keywords_accessed = old_keywords_accessed
+
+      unless (signature = Sass::Script::Functions.signature(name.to_sym, args.size, keywords.size))
+        return args if keywords.empty?
+        raise Sass::SyntaxError.new("Function #{name} doesn't support keyword arguments")
+      end
+
+      # If the user passes more non-keyword args than the function expects,
+      # but it does expect keyword args, Ruby's arg handling won't raise an error.
+      # Since we don't want to make functions think about this,
+      # we'll handle it for them here.
+      if signature.var_kwargs && !signature.var_args && args.size > signature.args.size
+        raise Sass::SyntaxError.new(
+          "#{args[signature.args.size].inspect} is not a keyword argument for `#{name}'")
+      elsif keywords.empty?
+        args << {} if signature.var_kwargs
+        return args
+      end
+
+      argnames = signature.args[args.size..-1] || []
+      deprecated_argnames = (signature.deprecated && signature.deprecated[args.size..-1]) || []
+      args += argnames.zip(deprecated_argnames).map do |(argname, deprecated_argname)|
+        if keywords.has_key?(argname)
+          keywords.delete(argname)
+        elsif deprecated_argname && keywords.has_key?(deprecated_argname)
+          deprecated_argname = keywords.denormalize(deprecated_argname)
+          Sass::Util.sass_warn("DEPRECATION WARNING: The `$#{deprecated_argname}' argument for " +
+            "`#{@name}()' has been renamed to `$#{argname}'.")
+          keywords.delete(deprecated_argname)
+        else
+          raise Sass::SyntaxError.new("Function #{name} requires an argument named $#{argname}")
+        end
+      end
+
+      if keywords.size > 0
+        if signature.var_kwargs
+          # Don't pass a NormalizedMap to a Ruby function.
+          args << keywords.to_hash
+        else
+          argname = keywords.keys.sort.first
+          if signature.args.include?(argname)
+            raise Sass::SyntaxError.new(
+              "Function #{name} was passed argument $#{argname} both by position and by name")
+          else
+            raise Sass::SyntaxError.new(
+              "Function #{name} doesn't have an argument named $#{argname}")
+          end
+        end
+      end
+
+      args
+    end
+
+    def perform_sass_fn(function, args, splat, environment)
+      Sass::Tree::Visitors::Perform.perform_arguments(function, args, splat, environment) do |env|
+        env.caller = Sass::Environment.new(environment)
+
+        val = catch :_sass_return do
+          function.tree.each {|c| Sass::Tree::Visitors::Perform.visit(c, env)}
+          raise Sass::SyntaxError.new("Function #{@name} finished without @return")
+        end
+        val
+      end
+    end
+
+    def reformat_argument_error(e)
+      message = e.message
+
+      # If this is a legitimate Ruby-raised argument error, re-raise it.
+      # Otherwise, it's an error in the user's stylesheet, so wrap it.
+      if Sass::Util.rbx?
+        # Rubinius has a different error report string than vanilla Ruby. It
+        # also doesn't put the actual method for which the argument error was
+        # thrown in the backtrace, nor does it include `send`, so we look for
+        # `_perform`.
+        if e.message =~ /^method '([^']+)': given (\d+), expected (\d+)/
+          error_name, given, expected = $1, $2, $3
+          raise e if error_name != ruby_name || e.backtrace[0] !~ /:in `_perform'$/
+          message = "wrong number of arguments (#{given} for #{expected})"
+        end
+      elsif Sass::Util.jruby?
+        should_maybe_raise =
+          e.message =~ /^wrong number of arguments calling `[^`]+` \((\d+) for (\d+)\)/
+        given, expected = $1, $2
+
+        if should_maybe_raise
+          # JRuby 1.7 includes __send__ before send and _perform.
+          trace = e.backtrace.dup
+          raise e if trace.shift !~ /:in `__send__'$/
+
+          # JRuby (as of 1.7.2) doesn't put the actual method
+          # for which the argument error was thrown in the backtrace, so we
+          # detect whether our send threw an argument error.
+          if !(trace[0] =~ /:in `send'$/ && trace[1] =~ /:in `_perform'$/)
+            raise e
+          else
+            # JRuby 1.7 doesn't use standard formatting for its ArgumentErrors.
+            message = "wrong number of arguments (#{given} for #{expected})"
+          end
+        end
+      elsif (md = /^wrong number of arguments \(given (\d+), expected (\d+)\)/.match(e.message)) &&
+            e.backtrace[0] =~ /:in `#{ruby_name}'$/
+        # Handle ruby 2.3 error formatting
+        message = "wrong number of arguments (#{md[1]} for #{md[2]})"
+      elsif e.message =~ /^wrong number of arguments/ &&
+            e.backtrace[0] !~ /:in `(block in )?#{ruby_name}'$/
+        raise e
+      end
+      raise Sass::SyntaxError.new("#{message} for `#{name}'")
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/interpolation.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/interpolation.rb
new file mode 100644
index 0000000..35914b4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/interpolation.rb
@@ -0,0 +1,223 @@
+module Sass::Script::Tree
+  # A SassScript object representing `#{}` interpolation outside a string.
+  #
+  # @see StringInterpolation
+  class Interpolation < Node
+    # @return [Node] The SassScript before the interpolation
+    attr_reader :before
+
+    # @return [Node] The SassScript within the interpolation
+    attr_reader :mid
+
+    # @return [Node] The SassScript after the interpolation
+    attr_reader :after
+
+    # @return [Boolean] Whether there was whitespace between `before` and `#{`
+    attr_reader :whitespace_before
+
+    # @return [Boolean] Whether there was whitespace between `}` and `after`
+    attr_reader :whitespace_after
+
+    # @return [Boolean] Whether the original format of the interpolation was
+    #   plain text, not an interpolation. This is used when converting back to
+    #   SassScript.
+    attr_reader :originally_text
+
+    # @return [Boolean] Whether a color value passed to the interpolation should
+    #   generate a warning.
+    attr_reader :warn_for_color
+
+    # The type of interpolation deprecation for this node.
+    #
+    # This can be `:none`, indicating that the node doesn't use deprecated
+    # interpolation; `:immediate`, indicating that a deprecation warning should
+    # be emitted as soon as possible; or `:potential`, indicating that a
+    # deprecation warning should be emitted if the resulting string is used in a
+    # way that would distinguish it from a list.
+    #
+    # @return [Symbol]
+    attr_reader :deprecation
+
+    # Interpolation in a property is of the form `before #{mid} after`.
+    #
+    # @param before [Node] See {Interpolation#before}
+    # @param mid [Node] See {Interpolation#mid}
+    # @param after [Node] See {Interpolation#after}
+    # @param wb [Boolean] See {Interpolation#whitespace_before}
+    # @param wa [Boolean] See {Interpolation#whitespace_after}
+    # @param originally_text [Boolean] See {Interpolation#originally_text}
+    # @param warn_for_color [Boolean] See {Interpolation#warn_for_color}
+    # @comment
+    #   rubocop:disable ParameterLists
+    def initialize(before, mid, after, wb, wa, opts = {})
+      # rubocop:enable ParameterLists
+      @before = before
+      @mid = mid
+      @after = after
+      @whitespace_before = wb
+      @whitespace_after = wa
+      @originally_text = opts[:originally_text] || false
+      @warn_for_color = opts[:warn_for_color] || false
+      @deprecation = opts[:deprecation] || :none
+    end
+
+    # @return [String] A human-readable s-expression representation of the interpolation
+    def inspect
+      "(interpolation #{@before.inspect} #{@mid.inspect} #{@after.inspect})"
+    end
+
+    # @see Node#to_sass
+    def to_sass(opts = {})
+      return to_quoted_equivalent.to_sass if deprecation == :immediate
+
+      res = ""
+      res << @before.to_sass(opts) if @before
+      res << ' ' if @before && @whitespace_before
+      res << '#{' unless @originally_text
+      res << @mid.to_sass(opts)
+      res << '}' unless @originally_text
+      res << ' ' if @after && @whitespace_after
+      res << @after.to_sass(opts) if @after
+      res
+    end
+
+    # Returns an `unquote()` expression that will evaluate to the same value as
+    # this interpolation.
+    #
+    # @return [Sass::Script::Tree::Node]
+    def to_quoted_equivalent
+      Funcall.new(
+        "unquote",
+        [to_string_interpolation(self)],
+        Sass::Util::NormalizedMap.new,
+        nil,
+        nil)
+    end
+
+    # Returns the three components of the interpolation, `before`, `mid`, and `after`.
+    #
+    # @return [Array<Node>]
+    # @see #initialize
+    # @see Node#children
+    def children
+      [@before, @mid, @after].compact
+    end
+
+    # @see Node#deep_copy
+    def deep_copy
+      node = dup
+      node.instance_variable_set('@before', @before.deep_copy) if @before
+      node.instance_variable_set('@mid', @mid.deep_copy)
+      node.instance_variable_set('@after', @after.deep_copy) if @after
+      node
+    end
+
+    protected
+
+    # Converts a script node into a corresponding string interpolation
+    # expression.
+    #
+    # @param node_or_interp [Sass::Script::Tree::Node]
+    # @return [Sass::Script::Tree::StringInterpolation]
+    def to_string_interpolation(node_or_interp)
+      unless node_or_interp.is_a?(Interpolation)
+        node = node_or_interp
+        return string_literal(node.value.to_s) if node.is_a?(Literal)
+        if node.is_a?(StringInterpolation)
+          return concat(string_literal(node.quote), concat(node, string_literal(node.quote)))
+        end
+        return StringInterpolation.new(string_literal(""), node, string_literal(""))
+      end
+
+      interp = node_or_interp
+      after_string_or_interp =
+        if interp.after
+          to_string_interpolation(interp.after)
+        else
+          string_literal("")
+        end
+      if interp.after && interp.whitespace_after
+        after_string_or_interp = concat(string_literal(' '), after_string_or_interp)
+      end
+
+      mid_string_or_interp = to_string_interpolation(interp.mid)
+
+      before_string_or_interp =
+        if interp.before
+          to_string_interpolation(interp.before)
+        else
+          string_literal("")
+        end
+      if interp.before && interp.whitespace_before
+        before_string_or_interp = concat(before_string_or_interp, string_literal(' '))
+      end
+
+      concat(before_string_or_interp, concat(mid_string_or_interp, after_string_or_interp))
+    end
+
+    private
+
+    # Evaluates the interpolation.
+    #
+    # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
+    # @return [Sass::Script::Value::String]
+    #   The SassScript string that is the value of the interpolation
+    def _perform(environment)
+      res = ""
+      res << @before.perform(environment).to_s if @before
+      res << " " if @before && @whitespace_before
+
+      val = @mid.perform(environment)
+      if @warn_for_color && val.is_a?(Sass::Script::Value::Color) && val.name
+        alternative = Operation.new(Sass::Script::Value::String.new("", :string), @mid, :plus)
+        Sass::Util.sass_warn <<MESSAGE
+WARNING on line #{line}, column #{source_range.start_pos.offset}#{" of #{filename}" if filename}:
+You probably don't mean to use the color value `#{val}' in interpolation here.
+It may end up represented as #{val.inspect}, which will likely produce invalid CSS.
+Always quote color names when using them as strings (for example, "#{val}").
+If you really want to use the color value here, use `#{alternative.to_sass}'.
+MESSAGE
+      end
+
+      res << val.to_s(:quote => :none)
+      res << " " if @after && @whitespace_after
+      res << @after.perform(environment).to_s if @after
+      str = Sass::Script::Value::String.new(
+        res, :identifier,
+        (to_quoted_equivalent.to_sass if deprecation == :potential))
+      str.source_range = source_range
+      opts(str)
+    end
+
+    # Concatenates two string literals or string interpolation expressions.
+    #
+    # @param string_or_interp1 [Sass::Script::Tree::Literal|Sass::Script::Tree::StringInterpolation]
+    # @param string_or_interp2 [Sass::Script::Tree::Literal|Sass::Script::Tree::StringInterpolation]
+    # @return [Sass::Script::Tree::StringInterpolation]
+    def concat(string_or_interp1, string_or_interp2)
+      if string_or_interp1.is_a?(Literal) && string_or_interp2.is_a?(Literal)
+        return string_literal(string_or_interp1.value.value + string_or_interp2.value.value)
+      end
+
+      if string_or_interp1.is_a?(Literal)
+        string = string_or_interp1
+        interp = string_or_interp2
+        before = string_literal(string.value.value + interp.before.value.value)
+        return StringInterpolation.new(before, interp.mid, interp.after)
+      end
+
+      StringInterpolation.new(
+        string_or_interp1.before,
+        string_or_interp1.mid,
+        concat(string_or_interp1.after, string_or_interp2))
+    end
+
+    # Returns a string literal with the given contents.
+    #
+    # @param string [String]
+    # @return string [Sass::Script::Tree::Literal]
+    def string_literal(string)
+      Literal.new(Sass::Script::Value::String.new(string, :string))
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/list_literal.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/list_literal.rb
new file mode 100644
index 0000000..9fbaad4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/list_literal.rb
@@ -0,0 +1,119 @@
+module Sass::Script::Tree
+  # A parse tree node representing a list literal. When resolved, this returns a
+  # {Sass::Tree::Value::List}.
+  class ListLiteral < Node
+    # The parse nodes for members of this list.
+    #
+    # @return [Array<Node>]
+    attr_reader :elements
+
+    # The operator separating the values of the list. Either `:comma` or
+    # `:space`.
+    #
+    # @return [Symbol]
+    attr_reader :separator
+
+    # Whether the list is surrounded by square brackets.
+    #
+    # @return [Boolean]
+    attr_reader :bracketed
+
+    # Creates a new list literal.
+    #
+    # @param elements [Array<Node>] See \{#elements}
+    # @param separator [Symbol] See \{#separator}
+    # @param bracketed [Boolean] See \{#bracketed}
+    def initialize(elements, separator: nil, bracketed: false)
+      @elements = elements
+      @separator = separator
+      @bracketed = bracketed
+    end
+
+    # @see Node#children
+    def children; elements; end
+
+    # @see Value#to_sass
+    def to_sass(opts = {})
+      return bracketed ? "[]" : "()" if elements.empty?
+      members = elements.map do |v|
+        if element_needs_parens?(v)
+          "(#{v.to_sass(opts)})"
+        else
+          v.to_sass(opts)
+        end
+      end
+
+      if separator == :comma && members.length == 1
+        return "#{bracketed ? '[' : '('}#{members.first},#{bracketed ? ']' : ')'}"
+      end
+
+      contents = members.join(sep_str(nil))
+      bracketed ? "[#{contents}]" : contents
+    end
+
+    # @see Node#deep_copy
+    def deep_copy
+      node = dup
+      node.instance_variable_set('@elements', elements.map {|e| e.deep_copy})
+      node
+    end
+
+    def inspect
+      (bracketed ? '[' : '(') +
+        elements.map {|e| e.inspect}.join(separator == :space ? ' ' : ', ') +
+        (bracketed ? ']' : ')')
+    end
+
+    def force_division!
+      # Do nothing. Lists prevent division propagation.
+    end
+
+    protected
+
+    def _perform(environment)
+      list = Sass::Script::Value::List.new(
+        elements.map {|e| e.perform(environment)},
+        separator: separator,
+        bracketed: bracketed)
+      list.source_range = source_range
+      list.options = options
+      list
+    end
+
+    private
+
+    # Returns whether an element in the list should be wrapped in parentheses
+    # when serialized to Sass.
+    def element_needs_parens?(element)
+      if element.is_a?(ListLiteral)
+        return false if element.elements.length < 2
+        return false if element.bracketed
+        return Sass::Script::Parser.precedence_of(element.separator || :space) <=
+               Sass::Script::Parser.precedence_of(separator || :space)
+      end
+
+      return false unless separator == :space
+
+      if element.is_a?(UnaryOperation)
+        return element.operator == :minus || element.operator == :plus
+      end
+
+      return false unless element.is_a?(Operation)
+      return true unless element.operator == :div
+      !(is_literal_number?(element.operand1) && is_literal_number?(element.operand2))
+    end
+
+    # Returns whether a value is a number literal that shouldn't be divided.
+    def is_literal_number?(value)
+      value.is_a?(Literal) &&
+        value.value.is_a?((Sass::Script::Value::Number)) &&
+        !value.value.original.nil?
+    end
+
+    def sep_str(opts = options)
+      return ' ' if separator == :space
+      return ',' if opts && opts[:style] == :compressed
+      ', '
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/literal.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/literal.rb
new file mode 100644
index 0000000..d0dd6e3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/literal.rb
@@ -0,0 +1,49 @@
+module Sass::Script::Tree
+  # The parse tree node for a literal scalar value. This wraps an instance of
+  # {Sass::Script::Value::Base}.
+  #
+  # List literals should use {ListLiteral} instead.
+  class Literal < Node
+    # The wrapped value.
+    #
+    # @return [Sass::Script::Value::Base]
+    attr_reader :value
+
+    # Creates a new literal value.
+    #
+    # @param value [Sass::Script::Value::Base]
+    # @see #value
+    def initialize(value)
+      @value = value
+    end
+
+    # @see Node#children
+    def children; []; end
+
+    # @see Node#to_sass
+    def to_sass(opts = {}); value.to_sass(opts); end
+
+    # @see Node#deep_copy
+    def deep_copy; dup; end
+
+    # @see Node#options=
+    def options=(options)
+      value.options = options
+    end
+
+    def inspect
+      value.inspect
+    end
+
+    def force_division!
+      value.original = nil if value.is_a?(Sass::Script::Value::Number)
+    end
+
+    protected
+
+    def _perform(environment)
+      value.source_range = source_range
+      value
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/map_literal.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/map_literal.rb
new file mode 100644
index 0000000..5c2e88f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/map_literal.rb
@@ -0,0 +1,64 @@
+module Sass::Script::Tree
+  # A class representing a map literal. When resolved, this returns a
+  # {Sass::Script::Node::Map}.
+  class MapLiteral < Node
+    # The key/value pairs that make up this map node. This isn't a Hash so that
+    # we can detect key collisions once all the keys have been performed.
+    #
+    # @return [Array<(Node, Node)>]
+    attr_reader :pairs
+
+    # Creates a new map literal.
+    #
+    # @param pairs [Array<(Node, Node)>] See \{#pairs}
+    def initialize(pairs)
+      @pairs = pairs
+    end
+
+    # @see Node#children
+    def children
+      @pairs.flatten
+    end
+
+    # @see Node#to_sass
+    def to_sass(opts = {})
+      return "()" if pairs.empty?
+
+      to_sass = lambda do |value|
+        if value.is_a?(ListLiteral) && value.separator == :comma
+          "(#{value.to_sass(opts)})"
+        else
+          value.to_sass(opts)
+        end
+      end
+
+      "(" + pairs.map {|(k, v)| "#{to_sass[k]}: #{to_sass[v]}"}.join(', ') + ")"
+    end
+    alias_method :inspect, :to_sass
+
+    # @see Node#deep_copy
+    def deep_copy
+      node = dup
+      node.instance_variable_set('@pairs',
+        pairs.map {|(k, v)| [k.deep_copy, v.deep_copy]})
+      node
+    end
+
+    protected
+
+    # @see Node#_perform
+    def _perform(environment)
+      keys = Set.new
+      map = Sass::Script::Value::Map.new(Hash[pairs.map do |(k, v)|
+        k, v = k.perform(environment), v.perform(environment)
+        if keys.include?(k)
+          raise Sass::SyntaxError.new("Duplicate key #{k.inspect} in map #{to_sass}.")
+        end
+        keys << k
+        [k, v]
+      end])
+      map.options = options
+      map
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/node.rb
new file mode 100644
index 0000000..f68dd76
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/node.rb
@@ -0,0 +1,119 @@
+module Sass::Script::Tree
+  # The abstract superclass for SassScript parse tree nodes.
+  #
+  # Use \{#perform} to evaluate a parse tree.
+  class Node
+    # The options hash for this node.
+    #
+    # @return [{Symbol => Object}]
+    attr_reader :options
+
+    # The line of the document on which this node appeared.
+    #
+    # @return [Integer]
+    attr_accessor :line
+
+    # The source range in the document on which this node appeared.
+    #
+    # @return [Sass::Source::Range]
+    attr_accessor :source_range
+
+    # The file name of the document on which this node appeared.
+    #
+    # @return [String]
+    attr_accessor :filename
+
+    # Sets the options hash for this node,
+    # as well as for all child nodes.
+    # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
+    #
+    # @param options [{Symbol => Object}] The options
+    def options=(options)
+      @options = options
+      children.each do |c|
+        if c.is_a? Hash
+          c.values.each {|v| v.options = options}
+        else
+          c.options = options
+        end
+      end
+    end
+
+    # Evaluates the node.
+    #
+    # \{#perform} shouldn't be overridden directly;
+    # instead, override \{#\_perform}.
+    #
+    # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
+    # @return [Sass::Script::Value] The SassScript object that is the value of the SassScript
+    def perform(environment)
+      _perform(environment)
+    rescue Sass::SyntaxError => e
+      e.modify_backtrace(:line => line)
+      raise e
+    end
+
+    # Returns all child nodes of this node.
+    #
+    # @return [Array<Node>]
+    def children
+      Sass::Util.abstract(self)
+    end
+
+    # Returns the text of this SassScript expression.
+    #
+    # @options opts :quote [String]
+    #   The preferred quote style for quoted strings. If `:none`, strings are
+    #   always emitted unquoted.
+    #
+    # @return [String]
+    def to_sass(opts = {})
+      Sass::Util.abstract(self)
+    end
+
+    # Returns a deep clone of this node.
+    # The child nodes are cloned, but options are not.
+    #
+    # @return [Node]
+    def deep_copy
+      Sass::Util.abstract(self)
+    end
+
+    # Forces any division operations with number literals in this expression to
+    # do real division, rather than returning strings.
+    def force_division!
+      children.each {|c| c.force_division!}
+    end
+
+    protected
+
+    # Converts underscores to dashes if the :dasherize option is set.
+    def dasherize(s, opts)
+      if opts[:dasherize]
+        s.tr('_', '-')
+      else
+        s
+      end
+    end
+
+    # Evaluates this node.
+    # Note that all {Sass::Script::Value} objects created within this method
+    # should have their \{#options} attribute set, probably via \{#opts}.
+    #
+    # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
+    # @return [Sass::Script::Value] The SassScript object that is the value of the SassScript
+    # @see #perform
+    def _perform(environment)
+      Sass::Util.abstract(self)
+    end
+
+    # Sets the \{#options} field on the given value and returns it.
+    #
+    # @param value [Sass::Script::Value]
+    # @return [Sass::Script::Value]
+    def opts(value)
+      value.options = options
+      value
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/operation.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/operation.rb
new file mode 100644
index 0000000..d38f6cc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/operation.rb
@@ -0,0 +1,149 @@
+module Sass::Script::Tree
+  # A SassScript parse node representing a binary operation,
+  # such as `$a + $b` or `"foo" + 1`.
+  class Operation < Node
+    @@color_arithmetic_deprecation = Sass::Deprecation.new
+    @@unitless_equals_deprecation = Sass::Deprecation.new
+
+    attr_reader :operand1
+    attr_reader :operand2
+    attr_reader :operator
+
+    # @param operand1 [Sass::Script::Tree::Node] The parse-tree node
+    #   for the right-hand side of the operator
+    # @param operand2 [Sass::Script::Tree::Node] The parse-tree node
+    #   for the left-hand side of the operator
+    # @param operator [Symbol] The operator to perform.
+    #   This should be one of the binary operator names in {Sass::Script::Lexer::OPERATORS}
+    def initialize(operand1, operand2, operator)
+      @operand1 = operand1
+      @operand2 = operand2
+      @operator = operator
+      super()
+    end
+
+    # @return [String] A human-readable s-expression representation of the operation
+    def inspect
+      "(#{@operator.inspect} #{@operand1.inspect} #{@operand2.inspect})"
+    end
+
+    # @see Node#to_sass
+    def to_sass(opts = {})
+      o1 = operand_to_sass @operand1, :left, opts
+      o2 = operand_to_sass @operand2, :right, opts
+      sep =
+        case @operator
+        when :comma; ", "
+        when :space; " "
+        else; " #{Sass::Script::Lexer::OPERATORS_REVERSE[@operator]} "
+        end
+      "#{o1}#{sep}#{o2}"
+    end
+
+    # Returns the operands for this operation.
+    #
+    # @return [Array<Node>]
+    # @see Node#children
+    def children
+      [@operand1, @operand2]
+    end
+
+    # @see Node#deep_copy
+    def deep_copy
+      node = dup
+      node.instance_variable_set('@operand1', @operand1.deep_copy)
+      node.instance_variable_set('@operand2', @operand2.deep_copy)
+      node
+    end
+
+    protected
+
+    # Evaluates the operation.
+    #
+    # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
+    # @return [Sass::Script::Value] The SassScript object that is the value of the operation
+    # @raise [Sass::SyntaxError] if the operation is undefined for the operands
+    def _perform(environment)
+      value1 = @operand1.perform(environment)
+
+      # Special-case :and and :or to support short-circuiting.
+      if @operator == :and
+        return value1.to_bool ? @operand2.perform(environment) : value1
+      elsif @operator == :or
+        return value1.to_bool ? value1 : @operand2.perform(environment)
+      end
+
+      value2 = @operand2.perform(environment)
+
+      if (value1.is_a?(Sass::Script::Value::Null) || value2.is_a?(Sass::Script::Value::Null)) &&
+          @operator != :eq && @operator != :neq
+        raise Sass::SyntaxError.new(
+          "Invalid null operation: \"#{value1.inspect} #{@operator} #{value2.inspect}\".")
+      end
+
+      begin
+        result = opts(value1.send(@operator, value2))
+      rescue NoMethodError => e
+        raise e unless e.name.to_s == @operator.to_s
+        raise Sass::SyntaxError.new("Undefined operation: \"#{value1} #{@operator} #{value2}\".")
+      end
+
+      warn_for_color_arithmetic(value1, value2)
+      warn_for_unitless_equals(value1, value2, result)
+
+      result
+    end
+
+    private
+
+    def warn_for_color_arithmetic(value1, value2)
+      return unless @operator == :plus || @operator == :times || @operator == :minus ||
+                    @operator == :div || @operator == :mod
+
+      if value1.is_a?(Sass::Script::Value::Number)
+        return unless value2.is_a?(Sass::Script::Value::Color)
+      elsif value1.is_a?(Sass::Script::Value::Color)
+        return unless value2.is_a?(Sass::Script::Value::Color) || value2.is_a?(Sass::Script::Value::Number)
+      else
+        return
+      end
+
+      @@color_arithmetic_deprecation.warn(filename, line, <<WARNING)
+The operation `#{value1} #{@operator} #{value2}` is deprecated and will be an error in future versions.
+Consider using Sass's color functions instead.
+http://sass-lang.com/documentation/Sass/Script/Functions.html#other_color_functions
+WARNING
+    end
+
+    def warn_for_unitless_equals(value1, value2, result)
+      return unless @operator == :eq || @operator == :neq
+      return unless value1.is_a?(Sass::Script::Value::Number)
+      return unless value2.is_a?(Sass::Script::Value::Number)
+      return unless value1.unitless? != value2.unitless?
+      return unless result == (if @operator == :eq
+                                 Sass::Script::Value::Bool::TRUE
+                               else
+                                 Sass::Script::Value::Bool::FALSE
+                               end)
+
+      operation = "#{value1.to_sass} #{@operator == :eq ? '==' : '!='} #{value2.to_sass}"
+      future_value = @operator == :neq
+      @@unitless_equals_deprecation.warn(filename, line, <<WARNING)
+The result of `#{operation}` will be `#{future_value}` in future releases of Sass.
+Unitless numbers will no longer be equal to the same numbers with units.
+WARNING
+    end
+
+    def operand_to_sass(op, side, opts)
+      return "(#{op.to_sass(opts)})" if op.is_a?(Sass::Script::Tree::ListLiteral)
+      return op.to_sass(opts) unless op.is_a?(Operation)
+
+      pred = Sass::Script::Parser.precedence_of(@operator)
+      sub_pred = Sass::Script::Parser.precedence_of(op.operator)
+      assoc = Sass::Script::Parser.associative?(@operator)
+      return "(#{op.to_sass(opts)})" if sub_pred < pred ||
+        (side == :right && sub_pred == pred && !assoc)
+      op.to_sass(opts)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/selector.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/selector.rb
new file mode 100644
index 0000000..4a852cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/selector.rb
@@ -0,0 +1,26 @@
+module Sass::Script::Tree
+  # A SassScript node that will resolve to the current selector.
+  class Selector < Node
+    def initialize; end
+
+    def children
+      []
+    end
+
+    def to_sass(opts = {})
+      '&'
+    end
+
+    def deep_copy
+      dup
+    end
+
+    protected
+
+    def _perform(environment)
+      selector = environment.selector
+      return opts(Sass::Script::Value::Null.new) unless selector
+      opts(selector.to_sass_script)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/string_interpolation.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/string_interpolation.rb
new file mode 100644
index 0000000..c373c36
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/string_interpolation.rb
@@ -0,0 +1,125 @@
+module Sass::Script::Tree
+  # A SassScript object representing `#{}` interpolation within a string.
+  #
+  # @see Interpolation
+  class StringInterpolation < Node
+    # @return [Literal] The string literal before this interpolation.
+    attr_reader :before
+
+    # @return [Node] The SassScript within the interpolation
+    attr_reader :mid
+
+    # @return [StringInterpolation, Literal]
+    #     The string literal or string interpolation before this interpolation.
+    attr_reader :after
+
+    # Whether this is a CSS string or a CSS identifier. The difference is that
+    # strings are written with double-quotes, while identifiers aren't.
+    #
+    # String interpolations are only ever identifiers if they're quote-like
+    # functions such as `url()`.
+    #
+    # @return [Symbol] `:string` or `:identifier`
+    def type
+      @before.value.type
+    end
+
+    # Returns the quote character that should be used to wrap a Sass
+    # representation of this interpolation.
+    def quote
+      quote_for(self) || '"'
+    end
+
+    # Interpolation in a string is of the form `"before #{mid} after"`,
+    # where `before` and `after` may include more interpolation.
+    #
+    # @param before [StringInterpolation, Literal] See {StringInterpolation#before}
+    # @param mid [Node] See {StringInterpolation#mid}
+    # @param after [Literal] See {StringInterpolation#after}
+    def initialize(before, mid, after)
+      @before = before
+      @mid = mid
+      @after = after
+    end
+
+    # @return [String] A human-readable s-expression representation of the interpolation
+    def inspect
+      "(string_interpolation #{@before.inspect} #{@mid.inspect} #{@after.inspect})"
+    end
+
+    # @see Node#to_sass
+    def to_sass(opts = {})
+      quote = type == :string ? opts[:quote] || quote_for(self) || '"' : :none
+      opts = opts.merge(:quote => quote)
+
+      res = ""
+      res << quote if quote != :none
+      res << _to_sass(before, opts)
+      res << '#{' << @mid.to_sass(opts.merge(:quote => nil)) << '}'
+      res << _to_sass(after, opts)
+      res << quote if quote != :none
+      res
+    end
+
+    # Returns the three components of the interpolation, `before`, `mid`, and `after`.
+    #
+    # @return [Array<Node>]
+    # @see #initialize
+    # @see Node#children
+    def children
+      [@before, @mid, @after].compact
+    end
+
+    # @see Node#deep_copy
+    def deep_copy
+      node = dup
+      node.instance_variable_set('@before', @before.deep_copy) if @before
+      node.instance_variable_set('@mid', @mid.deep_copy)
+      node.instance_variable_set('@after', @after.deep_copy) if @after
+      node
+    end
+
+    protected
+
+    # Evaluates the interpolation.
+    #
+    # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
+    # @return [Sass::Script::Value::String]
+    #   The SassScript string that is the value of the interpolation
+    def _perform(environment)
+      res = ""
+      before = @before.perform(environment)
+      res << before.value
+      mid = @mid.perform(environment)
+      res << (mid.is_a?(Sass::Script::Value::String) ? mid.value : mid.to_s(:quote => :none))
+      res << @after.perform(environment).value
+      opts(Sass::Script::Value::String.new(res, before.type))
+    end
+
+    private
+
+    def _to_sass(string_or_interp, opts)
+      result = string_or_interp.to_sass(opts)
+      opts[:quote] == :none ? result : result.slice(1...-1)
+    end
+
+    def quote_for(string_or_interp)
+      if string_or_interp.is_a?(Sass::Script::Tree::Literal)
+        return nil if string_or_interp.value.value.empty?
+        return '"' if string_or_interp.value.value.include?("'")
+        return "'" if string_or_interp.value.value.include?('"')
+        return nil
+      end
+
+      # Double-quotes take precedence over single quotes.
+      before_quote = quote_for(string_or_interp.before)
+      return '"' if before_quote == '"'
+      after_quote = quote_for(string_or_interp.after)
+      return '"' if after_quote == '"'
+
+      # Returns "'" if either or both insist on single quotes, and nil
+      # otherwise.
+      before_quote || after_quote
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/unary_operation.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/unary_operation.rb
new file mode 100644
index 0000000..b32da08
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/unary_operation.rb
@@ -0,0 +1,69 @@
+module Sass::Script::Tree
+  # A SassScript parse node representing a unary operation,
+  # such as `-$b` or `not true`.
+  #
+  # Currently only `-`, `/`, and `not` are unary operators.
+  class UnaryOperation < Node
+    # @return [Symbol] The operation to perform
+    attr_reader :operator
+
+    # @return [Script::Node] The parse-tree node for the object of the operator
+    attr_reader :operand
+
+    # @param operand [Script::Node] See \{#operand}
+    # @param operator [Symbol] See \{#operator}
+    def initialize(operand, operator)
+      @operand = operand
+      @operator = operator
+      super()
+    end
+
+    # @return [String] A human-readable s-expression representation of the operation
+    def inspect
+      "(#{@operator.inspect} #{@operand.inspect})"
+    end
+
+    # @see Node#to_sass
+    def to_sass(opts = {})
+      operand = @operand.to_sass(opts)
+      if @operand.is_a?(Operation) ||
+          (@operator == :minus &&
+           (operand =~ Sass::SCSS::RX::IDENT) == 0)
+        operand = "(#{@operand.to_sass(opts)})"
+      end
+      op = Sass::Script::Lexer::OPERATORS_REVERSE[@operator]
+      op + (op =~ /[a-z]/ ? " " : "") + operand
+    end
+
+    # Returns the operand of the operation.
+    #
+    # @return [Array<Node>]
+    # @see Node#children
+    def children
+      [@operand]
+    end
+
+    # @see Node#deep_copy
+    def deep_copy
+      node = dup
+      node.instance_variable_set('@operand', @operand.deep_copy)
+      node
+    end
+
+    protected
+
+    # Evaluates the operation.
+    #
+    # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
+    # @return [Sass::Script::Value] The SassScript object that is the value of the operation
+    # @raise [Sass::SyntaxError] if the operation is undefined for the operand
+    def _perform(environment)
+      operator = "unary_#{@operator}"
+      value = @operand.perform(environment)
+      value.send(operator)
+    rescue NoMethodError => e
+      raise e unless e.name.to_s == operator.to_s
+      raise Sass::SyntaxError.new("Undefined unary operation: \"#{@operator} #{value}\".")
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/variable.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/variable.rb
new file mode 100644
index 0000000..7e19738
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/tree/variable.rb
@@ -0,0 +1,57 @@
+module Sass::Script::Tree
+  # A SassScript parse node representing a variable.
+  class Variable < Node
+    # The name of the variable.
+    #
+    # @return [String]
+    attr_reader :name
+
+    # The underscored name of the variable.
+    #
+    # @return [String]
+    attr_reader :underscored_name
+
+    # @param name [String] See \{#name}
+    def initialize(name)
+      @name = name
+      @underscored_name = name.tr("-", "_")
+      super()
+    end
+
+    # @return [String] A string representation of the variable
+    def inspect(opts = {})
+      "$#{dasherize(name, opts)}"
+    end
+    alias_method :to_sass, :inspect
+
+    # Returns an empty array.
+    #
+    # @return [Array<Node>] empty
+    # @see Node#children
+    def children
+      []
+    end
+
+    # @see Node#deep_copy
+    def deep_copy
+      dup
+    end
+
+    protected
+
+    # Evaluates the variable.
+    #
+    # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
+    # @return [Sass::Script::Value] The SassScript object that is the value of the variable
+    # @raise [Sass::SyntaxError] if the variable is undefined
+    def _perform(environment)
+      val = environment.var(name)
+      raise Sass::SyntaxError.new("Undefined variable: \"$#{name}\".") unless val
+      if val.is_a?(Sass::Script::Value::Number) && val.original
+        val = val.dup
+        val.original = nil
+      end
+      val
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value.rb
new file mode 100644
index 0000000..4f35d63
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value.rb
@@ -0,0 +1,13 @@
+module Sass::Script::Value; end
+
+require 'sass/script/value/base'
+require 'sass/script/value/string'
+require 'sass/script/value/number'
+require 'sass/script/value/color'
+require 'sass/script/value/bool'
+require 'sass/script/value/null'
+require 'sass/script/value/list'
+require 'sass/script/value/arg_list'
+require 'sass/script/value/map'
+require 'sass/script/value/callable'
+require 'sass/script/value/function'
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/arg_list.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/arg_list.rb
new file mode 100644
index 0000000..a68d796
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/arg_list.rb
@@ -0,0 +1,36 @@
+module Sass::Script::Value
+  # A SassScript object representing a variable argument list. This works just
+  # like a normal list, but can also contain keyword arguments.
+  #
+  # The keyword arguments attached to this list are unused except when this is
+  # passed as a glob argument to a function or mixin.
+  class ArgList < List
+    # Whether \{#keywords} has been accessed. If so, we assume that all keywords
+    # were valid for the function that created this ArgList.
+    #
+    # @return [Boolean]
+    attr_accessor :keywords_accessed
+
+    # Creates a new argument list.
+    #
+    # @param value [Array<Value>] See \{List#value}.
+    # @param keywords [Hash<String, Value>, NormalizedMap<Value>] See \{#keywords}
+    # @param separator [String] See \{List#separator}.
+    def initialize(value, keywords, separator)
+      super(value, separator: separator)
+      if keywords.is_a?(Sass::Util::NormalizedMap)
+        @keywords = keywords
+      else
+        @keywords = Sass::Util::NormalizedMap.new(keywords)
+      end
+    end
+
+    # The keyword arguments attached to this list.
+    #
+    # @return [NormalizedMap<Value>]
+    def keywords
+      @keywords_accessed = true
+      @keywords
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/base.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/base.rb
new file mode 100644
index 0000000..6596357
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/base.rb
@@ -0,0 +1,258 @@
+module Sass::Script::Value
+  # The abstract superclass for SassScript objects.
+  #
+  # Many of these methods, especially the ones that correspond to SassScript operations,
+  # are designed to be overridden by subclasses which may change the semantics somewhat.
+  # The operations listed here are just the defaults.
+  class Base
+    # Returns the Ruby value of the value.
+    # The type of this value varies based on the subclass.
+    #
+    # @return [Object]
+    attr_reader :value
+
+    # The source range in the document on which this node appeared.
+    #
+    # @return [Sass::Source::Range]
+    attr_accessor :source_range
+
+    # Creates a new value.
+    #
+    # @param value [Object] The object for \{#value}
+    def initialize(value = nil)
+      value.freeze unless value.nil? || value == true || value == false
+      @value = value
+      @options = nil
+    end
+
+    # Sets the options hash for this node,
+    # as well as for all child nodes.
+    # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
+    #
+    # @param options [{Symbol => Object}] The options
+    attr_writer :options
+
+    # Returns the options hash for this node.
+    #
+    # @return [{Symbol => Object}]
+    # @raise [Sass::SyntaxError] if the options hash hasn't been set.
+    #   This should only happen when the value was created
+    #   outside of the parser and \{#to\_s} was called on it
+    def options
+      return @options if @options
+      raise Sass::SyntaxError.new(<<MSG)
+The #options attribute is not set on this #{self.class}.
+  This error is probably occurring because #to_s was called
+  on this value within a custom Sass function without first
+  setting the #options attribute.
+MSG
+    end
+
+    # The SassScript `==` operation.
+    # **Note that this returns a {Sass::Script::Value::Bool} object,
+    # not a Ruby boolean**.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Sass::Script::Value::Bool] True if this value is the same as the other,
+    #   false otherwise
+    def eq(other)
+      Sass::Script::Value::Bool.new(self.class == other.class && value == other.value)
+    end
+
+    # The SassScript `!=` operation.
+    # **Note that this returns a {Sass::Script::Value::Bool} object,
+    # not a Ruby boolean**.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Sass::Script::Value::Bool] False if this value is the same as the other,
+    #   true otherwise
+    def neq(other)
+      Sass::Script::Value::Bool.new(!eq(other).to_bool)
+    end
+
+    # The SassScript `==` operation.
+    # **Note that this returns a {Sass::Script::Value::Bool} object,
+    # not a Ruby boolean**.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Sass::Script::Value::Bool] True if this value is the same as the other,
+    #   false otherwise
+    def unary_not
+      Sass::Script::Value::Bool.new(!to_bool)
+    end
+
+    # The SassScript `=` operation
+    # (used for proprietary MS syntax like `alpha(opacity=20)`).
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Script::Value::String] A string containing both values
+    #   separated by `"="`
+    def single_eq(other)
+      Sass::Script::Value::String.new("#{self}=#{other}")
+    end
+
+    # The SassScript `+` operation.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Script::Value::String] A string containing both values
+    #   without any separation
+    def plus(other)
+      type = other.is_a?(Sass::Script::Value::String) ? other.type : :identifier
+      Sass::Script::Value::String.new(to_s(:quote => :none) + other.to_s(:quote => :none), type)
+    end
+
+    # The SassScript `-` operation.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Script::Value::String] A string containing both values
+    #   separated by `"-"`
+    def minus(other)
+      Sass::Script::Value::String.new("#{self}-#{other}")
+    end
+
+    # The SassScript `/` operation.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Script::Value::String] A string containing both values
+    #   separated by `"/"`
+    def div(other)
+      Sass::Script::Value::String.new("#{self}/#{other}")
+    end
+
+    # The SassScript unary `+` operation (e.g. `+$a`).
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Script::Value::String] A string containing the value
+    #   preceded by `"+"`
+    def unary_plus
+      Sass::Script::Value::String.new("+#{self}")
+    end
+
+    # The SassScript unary `-` operation (e.g. `-$a`).
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Script::Value::String] A string containing the value
+    #   preceded by `"-"`
+    def unary_minus
+      Sass::Script::Value::String.new("-#{self}")
+    end
+
+    # The SassScript unary `/` operation (e.g. `/$a`).
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Script::Value::String] A string containing the value
+    #   preceded by `"/"`
+    def unary_div
+      Sass::Script::Value::String.new("/#{self}")
+    end
+
+    # Returns the hash code of this value. Two objects' hash codes should be
+    # equal if the objects are equal.
+    #
+    # @return [Integer for Ruby 2.4.0+, Fixnum for earlier Ruby versions] The hash code.
+    def hash
+      value.hash
+    end
+
+    def eql?(other)
+      self == other
+    end
+
+    # @return [String] A readable representation of the value
+    def inspect
+      value.inspect
+    end
+
+    # @return [Boolean] `true` (the Ruby boolean value)
+    def to_bool
+      true
+    end
+
+    # Compares this object with another.
+    #
+    # @param other [Object] The object to compare with
+    # @return [Boolean] Whether or not this value is equivalent to `other`
+    def ==(other)
+      eq(other).to_bool
+    end
+
+    # @return [Integer] The integer value of this value
+    # @raise [Sass::SyntaxError] if this value isn't an integer
+    def to_i
+      raise Sass::SyntaxError.new("#{inspect} is not an integer.")
+    end
+
+    # @raise [Sass::SyntaxError] if this value isn't an integer
+    def assert_int!; to_i; end
+
+    # Returns the separator for this value. For non-list-like values or the
+    # empty list, this will be `nil`. For lists or maps, it will be `:space` or
+    # `:comma`.
+    #
+    # @return [Symbol]
+    def separator; nil; end
+
+    # Whether the value is surrounded by square brackets. For non-list values,
+    # this will be `false`.
+    #
+    # @return [Boolean]
+    def bracketed; false; end
+
+    # Returns the value of this value as a list.
+    # Single values are considered the same as single-element lists.
+    #
+    # @return [Array<Value>] This value as a list
+    def to_a
+      [self]
+    end
+
+    # Returns the value of this value as a hash. Most values don't have hash
+    # representations, but [Map]s and empty [List]s do.
+    #
+    # @return [Hash<Value, Value>] This value as a hash
+    # @raise [Sass::SyntaxError] if this value doesn't have a hash representation
+    def to_h
+      raise Sass::SyntaxError.new("#{inspect} is not a map.")
+    end
+
+    # Returns the string representation of this value
+    # as it would be output to the CSS document.
+    #
+    # @options opts :quote [String]
+    #   The preferred quote style for quoted strings. If `:none`, strings are
+    #   always emitted unquoted.
+    # @return [String]
+    def to_s(opts = {})
+      Sass::Util.abstract(self)
+    end
+    alias_method :to_sass, :to_s
+
+    # Returns whether or not this object is null.
+    #
+    # @return [Boolean] `false`
+    def null?
+      false
+    end
+
+    # Creates a new list containing `contents` but with the same brackets and
+    # separators as this object, when interpreted as a list.
+    #
+    # @param contents [Array<Value>] The contents of the new list.
+    # @param separator [Symbol] The separator of the new list. Defaults to \{#separator}.
+    # @param bracketed [Boolean] Whether the new list is bracketed. Defaults to \{#bracketed}.
+    # @return [Sass::Script::Value::List]
+    def with_contents(contents, separator: self.separator, bracketed: self.bracketed)
+      Sass::Script::Value::List.new(contents, separator: separator, bracketed: bracketed)
+    end
+
+    protected
+
+    # Evaluates the value.
+    #
+    # @param environment [Sass::Environment] The environment in which to evaluate the SassScript
+    # @return [Value] This value
+    def _perform(environment)
+      self
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/bool.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/bool.rb
new file mode 100644
index 0000000..fd1789b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/bool.rb
@@ -0,0 +1,35 @@
+module Sass::Script::Value
+  # A SassScript object representing a boolean (true or false) value.
+  class Bool < Base
+    # The true value in SassScript.
+    #
+    # This is assigned before new is overridden below so that we use the default implementation.
+    TRUE  = new(true)
+
+    # The false value in SassScript.
+    #
+    # This is assigned before new is overridden below so that we use the default implementation.
+    FALSE = new(false)
+
+    # We override object creation so that users of the core API
+    # will not need to know that booleans are specific constants.
+    #
+    # @param value A ruby value that will be tested for truthiness.
+    # @return [Bool] TRUE if value is truthy, FALSE if value is falsey
+    def self.new(value)
+      value ? TRUE : FALSE
+    end
+
+    # The Ruby value of the boolean.
+    #
+    # @return [Boolean]
+    attr_reader :value
+    alias_method :to_bool, :value
+
+    # @return [String] "true" or "false"
+    def to_s(opts = {})
+      @value.to_s
+    end
+    alias_method :to_sass, :to_s
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/callable.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/callable.rb
new file mode 100644
index 0000000..4e10d0d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/callable.rb
@@ -0,0 +1,25 @@
+module Sass::Script::Value
+  # A SassScript object representing a null value.
+  class Callable < Base
+    # Constructs a Callable value for use in SassScript.
+    #
+    # @param callable [Sass::Callable] The callable to be used when the
+    # callable is called.
+    def initialize(callable)
+      super(callable)
+    end
+
+    def to_s(opts = {})
+      raise Sass::SyntaxError.new("#{to_sass} isn't a valid CSS value.")
+    end
+
+    def inspect
+      to_sass
+    end
+
+    # @abstract
+    def to_sass
+      Sass::Util.abstract(self)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/color.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/color.rb
new file mode 100644
index 0000000..34abe83
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/color.rb
@@ -0,0 +1,703 @@
+module Sass::Script::Value
+  # A SassScript object representing a CSS color.
+  #
+  # A color may be represented internally as RGBA, HSLA, or both.
+  # It's originally represented as whatever its input is;
+  # if it's created with RGB values, it's represented as RGBA,
+  # and if it's created with HSL values, it's represented as HSLA.
+  # Once a property is accessed that requires the other representation --
+  # for example, \{#red} for an HSL color --
+  # that component is calculated and cached.
+  #
+  # The alpha channel of a color is independent of its RGB or HSL representation.
+  # It's always stored, as 1 if nothing else is specified.
+  # If only the alpha channel is modified using \{#with},
+  # the cached RGB and HSL values are retained.
+  class Color < Base
+    # @private
+    #
+    # Convert a ruby integer to a rgba components
+    # @param color [Integer]
+    # @return [Array<Integer>] Array of 4 numbers representing r,g,b and alpha
+    def self.int_to_rgba(color)
+      rgba = (0..3).map {|n| color >> (n << 3) & 0xff}.reverse
+      rgba[-1] = rgba[-1] / 255.0
+      rgba
+    end
+
+    ALTERNATE_COLOR_NAMES = Sass::Util.map_vals(
+      {
+        'aqua'                 => 0x00FFFFFF,
+        'darkgrey'             => 0xA9A9A9FF,
+        'darkslategrey'        => 0x2F4F4FFF,
+        'dimgrey'              => 0x696969FF,
+        'fuchsia'              => 0xFF00FFFF,
+        'grey'                 => 0x808080FF,
+        'lightgrey'            => 0xD3D3D3FF,
+        'lightslategrey'       => 0x778899FF,
+        'slategrey'            => 0x708090FF,
+      }, &method(:int_to_rgba))
+
+    # A hash from color names to `[red, green, blue]` value arrays.
+    COLOR_NAMES = Sass::Util.map_vals(
+      {
+        'aliceblue'            => 0xF0F8FFFF,
+        'antiquewhite'         => 0xFAEBD7FF,
+        'aquamarine'           => 0x7FFFD4FF,
+        'azure'                => 0xF0FFFFFF,
+        'beige'                => 0xF5F5DCFF,
+        'bisque'               => 0xFFE4C4FF,
+        'black'                => 0x000000FF,
+        'blanchedalmond'       => 0xFFEBCDFF,
+        'blue'                 => 0x0000FFFF,
+        'blueviolet'           => 0x8A2BE2FF,
+        'brown'                => 0xA52A2AFF,
+        'burlywood'            => 0xDEB887FF,
+        'cadetblue'            => 0x5F9EA0FF,
+        'chartreuse'           => 0x7FFF00FF,
+        'chocolate'            => 0xD2691EFF,
+        'coral'                => 0xFF7F50FF,
+        'cornflowerblue'       => 0x6495EDFF,
+        'cornsilk'             => 0xFFF8DCFF,
+        'crimson'              => 0xDC143CFF,
+        'cyan'                 => 0x00FFFFFF,
+        'darkblue'             => 0x00008BFF,
+        'darkcyan'             => 0x008B8BFF,
+        'darkgoldenrod'        => 0xB8860BFF,
+        'darkgray'             => 0xA9A9A9FF,
+        'darkgreen'            => 0x006400FF,
+        'darkkhaki'            => 0xBDB76BFF,
+        'darkmagenta'          => 0x8B008BFF,
+        'darkolivegreen'       => 0x556B2FFF,
+        'darkorange'           => 0xFF8C00FF,
+        'darkorchid'           => 0x9932CCFF,
+        'darkred'              => 0x8B0000FF,
+        'darksalmon'           => 0xE9967AFF,
+        'darkseagreen'         => 0x8FBC8FFF,
+        'darkslateblue'        => 0x483D8BFF,
+        'darkslategray'        => 0x2F4F4FFF,
+        'darkturquoise'        => 0x00CED1FF,
+        'darkviolet'           => 0x9400D3FF,
+        'deeppink'             => 0xFF1493FF,
+        'deepskyblue'          => 0x00BFFFFF,
+        'dimgray'              => 0x696969FF,
+        'dodgerblue'           => 0x1E90FFFF,
+        'firebrick'            => 0xB22222FF,
+        'floralwhite'          => 0xFFFAF0FF,
+        'forestgreen'          => 0x228B22FF,
+        'gainsboro'            => 0xDCDCDCFF,
+        'ghostwhite'           => 0xF8F8FFFF,
+        'gold'                 => 0xFFD700FF,
+        'goldenrod'            => 0xDAA520FF,
+        'gray'                 => 0x808080FF,
+        'green'                => 0x008000FF,
+        'greenyellow'          => 0xADFF2FFF,
+        'honeydew'             => 0xF0FFF0FF,
+        'hotpink'              => 0xFF69B4FF,
+        'indianred'            => 0xCD5C5CFF,
+        'indigo'               => 0x4B0082FF,
+        'ivory'                => 0xFFFFF0FF,
+        'khaki'                => 0xF0E68CFF,
+        'lavender'             => 0xE6E6FAFF,
+        'lavenderblush'        => 0xFFF0F5FF,
+        'lawngreen'            => 0x7CFC00FF,
+        'lemonchiffon'         => 0xFFFACDFF,
+        'lightblue'            => 0xADD8E6FF,
+        'lightcoral'           => 0xF08080FF,
+        'lightcyan'            => 0xE0FFFFFF,
+        'lightgoldenrodyellow' => 0xFAFAD2FF,
+        'lightgreen'           => 0x90EE90FF,
+        'lightgray'            => 0xD3D3D3FF,
+        'lightpink'            => 0xFFB6C1FF,
+        'lightsalmon'          => 0xFFA07AFF,
+        'lightseagreen'        => 0x20B2AAFF,
+        'lightskyblue'         => 0x87CEFAFF,
+        'lightslategray'       => 0x778899FF,
+        'lightsteelblue'       => 0xB0C4DEFF,
+        'lightyellow'          => 0xFFFFE0FF,
+        'lime'                 => 0x00FF00FF,
+        'limegreen'            => 0x32CD32FF,
+        'linen'                => 0xFAF0E6FF,
+        'magenta'              => 0xFF00FFFF,
+        'maroon'               => 0x800000FF,
+        'mediumaquamarine'     => 0x66CDAAFF,
+        'mediumblue'           => 0x0000CDFF,
+        'mediumorchid'         => 0xBA55D3FF,
+        'mediumpurple'         => 0x9370DBFF,
+        'mediumseagreen'       => 0x3CB371FF,
+        'mediumslateblue'      => 0x7B68EEFF,
+        'mediumspringgreen'    => 0x00FA9AFF,
+        'mediumturquoise'      => 0x48D1CCFF,
+        'mediumvioletred'      => 0xC71585FF,
+        'midnightblue'         => 0x191970FF,
+        'mintcream'            => 0xF5FFFAFF,
+        'mistyrose'            => 0xFFE4E1FF,
+        'moccasin'             => 0xFFE4B5FF,
+        'navajowhite'          => 0xFFDEADFF,
+        'navy'                 => 0x000080FF,
+        'oldlace'              => 0xFDF5E6FF,
+        'olive'                => 0x808000FF,
+        'olivedrab'            => 0x6B8E23FF,
+        'orange'               => 0xFFA500FF,
+        'orangered'            => 0xFF4500FF,
+        'orchid'               => 0xDA70D6FF,
+        'palegoldenrod'        => 0xEEE8AAFF,
+        'palegreen'            => 0x98FB98FF,
+        'paleturquoise'        => 0xAFEEEEFF,
+        'palevioletred'        => 0xDB7093FF,
+        'papayawhip'           => 0xFFEFD5FF,
+        'peachpuff'            => 0xFFDAB9FF,
+        'peru'                 => 0xCD853FFF,
+        'pink'                 => 0xFFC0CBFF,
+        'plum'                 => 0xDDA0DDFF,
+        'powderblue'           => 0xB0E0E6FF,
+        'purple'               => 0x800080FF,
+        'red'                  => 0xFF0000FF,
+        'rebeccapurple'        => 0x663399FF,
+        'rosybrown'            => 0xBC8F8FFF,
+        'royalblue'            => 0x4169E1FF,
+        'saddlebrown'          => 0x8B4513FF,
+        'salmon'               => 0xFA8072FF,
+        'sandybrown'           => 0xF4A460FF,
+        'seagreen'             => 0x2E8B57FF,
+        'seashell'             => 0xFFF5EEFF,
+        'sienna'               => 0xA0522DFF,
+        'silver'               => 0xC0C0C0FF,
+        'skyblue'              => 0x87CEEBFF,
+        'slateblue'            => 0x6A5ACDFF,
+        'slategray'            => 0x708090FF,
+        'snow'                 => 0xFFFAFAFF,
+        'springgreen'          => 0x00FF7FFF,
+        'steelblue'            => 0x4682B4FF,
+        'tan'                  => 0xD2B48CFF,
+        'teal'                 => 0x008080FF,
+        'thistle'              => 0xD8BFD8FF,
+        'tomato'               => 0xFF6347FF,
+        'transparent'          => 0x00000000,
+        'turquoise'            => 0x40E0D0FF,
+        'violet'               => 0xEE82EEFF,
+        'wheat'                => 0xF5DEB3FF,
+        'white'                => 0xFFFFFFFF,
+        'whitesmoke'           => 0xF5F5F5FF,
+        'yellow'               => 0xFFFF00FF,
+        'yellowgreen'          => 0x9ACD32FF
+      }, &method(:int_to_rgba))
+
+    # A hash from `[red, green, blue, alpha]` value arrays to color names.
+    COLOR_NAMES_REVERSE = COLOR_NAMES.invert.freeze
+
+    # We add the alternate color names after inverting because
+    # different ruby implementations and versions vary on the ordering of the result of invert.
+    COLOR_NAMES.update(ALTERNATE_COLOR_NAMES).freeze
+
+    # The user's original representation of the color.
+    #
+    # @return [String]
+    attr_reader :representation
+
+    # Constructs an RGB or HSL color object,
+    # optionally with an alpha channel.
+    #
+    # RGB values are clipped within 0 and 255.
+    # Saturation and lightness values are clipped within 0 and 100.
+    # The alpha value is clipped within 0 and 1.
+    #
+    # @raise [Sass::SyntaxError] if any color value isn't in the specified range
+    #
+    # @overload initialize(attrs)
+    #   The attributes are specified as a hash. This hash must contain either
+    #   `:hue`, `:saturation`, and `:lightness` keys, or `:red`, `:green`, and
+    #   `:blue` keys. It cannot contain both HSL and RGB keys. It may also
+    #   optionally contain an `:alpha` key, and a `:representation` key
+    #   indicating the original representation of the color that the user wrote
+    #   in their stylesheet.
+    #
+    #   @param attrs [{Symbol => Numeric}] A hash of color attributes to values
+    #   @raise [ArgumentError] if not enough attributes are specified,
+    #     or both RGB and HSL attributes are specified
+    #
+    # @overload initialize(rgba, [representation])
+    #   The attributes are specified as an array.
+    #   This overload only supports RGB or RGBA colors.
+    #
+    #   @param rgba [Array<Numeric>] A three- or four-element array
+    #     of the red, green, blue, and optionally alpha values (respectively)
+    #     of the color
+    #   @param representation [String] The original representation of the color
+    #     that the user wrote in their stylesheet.
+    #   @raise [ArgumentError] if not enough attributes are specified
+    def initialize(attrs, representation = nil, allow_both_rgb_and_hsl = false)
+      super(nil)
+
+      if attrs.is_a?(Array)
+        unless (3..4).include?(attrs.size)
+          raise ArgumentError.new("Color.new(array) expects a three- or four-element array")
+        end
+
+        red, green, blue = attrs[0...3].map {|c| Sass::Util.round(c)}
+        @attrs = {:red => red, :green => green, :blue => blue}
+        @attrs[:alpha] = attrs[3] ? attrs[3].to_f : 1
+        @representation = representation
+      else
+        attrs = attrs.reject {|_k, v| v.nil?}
+        hsl = [:hue, :saturation, :lightness] & attrs.keys
+        rgb = [:red, :green, :blue] & attrs.keys
+        if !allow_both_rgb_and_hsl && !hsl.empty? && !rgb.empty?
+          raise ArgumentError.new("Color.new(hash) may not have both HSL and RGB keys specified")
+        elsif hsl.empty? && rgb.empty?
+          raise ArgumentError.new("Color.new(hash) must have either HSL or RGB keys specified")
+        elsif !hsl.empty? && hsl.size != 3
+          raise ArgumentError.new("Color.new(hash) must have all three HSL values specified")
+        elsif !rgb.empty? && rgb.size != 3
+          raise ArgumentError.new("Color.new(hash) must have all three RGB values specified")
+        end
+
+        @attrs = attrs
+        @attrs[:hue] %= 360 if @attrs[:hue]
+        @attrs[:alpha] ||= 1
+        @representation = @attrs.delete(:representation)
+      end
+
+      [:red, :green, :blue].each do |k|
+        next if @attrs[k].nil?
+        @attrs[k] = Sass::Util.restrict(Sass::Util.round(@attrs[k]), 0..255)
+      end
+
+      [:saturation, :lightness].each do |k|
+        next if @attrs[k].nil?
+        @attrs[k] = Sass::Util.restrict(@attrs[k], 0..100)
+      end
+
+      @attrs[:alpha] = Sass::Util.restrict(@attrs[:alpha], 0..1)
+    end
+
+    # Create a new color from a valid CSS hex string.
+    #
+    # The leading hash is optional.
+    #
+    # @return [Color]
+    def self.from_hex(hex_string, alpha = nil)
+      unless hex_string =~ /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i ||
+             hex_string =~ /^#?([0-9a-f])([0-9a-f])([0-9a-f])$/i
+        raise ArgumentError.new("#{hex_string.inspect} is not a valid hex color.")
+      end
+      red   = $1.ljust(2, $1).to_i(16)
+      green = $2.ljust(2, $2).to_i(16)
+      blue  = $3.ljust(2, $3).to_i(16)
+
+      hex_string = "##{hex_string}" unless hex_string[0] == ?#
+      attrs = {:red => red, :green => green, :blue => blue, :representation => hex_string}
+      attrs[:alpha] = alpha if alpha
+      new(attrs)
+    end
+
+    # The red component of the color.
+    #
+    # @return [Integer]
+    def red
+      hsl_to_rgb!
+      @attrs[:red]
+    end
+
+    # The green component of the color.
+    #
+    # @return [Integer]
+    def green
+      hsl_to_rgb!
+      @attrs[:green]
+    end
+
+    # The blue component of the color.
+    #
+    # @return [Integer]
+    def blue
+      hsl_to_rgb!
+      @attrs[:blue]
+    end
+
+    # The hue component of the color.
+    #
+    # @return [Numeric]
+    def hue
+      rgb_to_hsl!
+      @attrs[:hue]
+    end
+
+    # The saturation component of the color.
+    #
+    # @return [Numeric]
+    def saturation
+      rgb_to_hsl!
+      @attrs[:saturation]
+    end
+
+    # The lightness component of the color.
+    #
+    # @return [Numeric]
+    def lightness
+      rgb_to_hsl!
+      @attrs[:lightness]
+    end
+
+    # The alpha channel (opacity) of the color.
+    # This is 1 unless otherwise defined.
+    #
+    # @return [Integer]
+    def alpha
+      @attrs[:alpha].to_f
+    end
+
+    # Returns whether this color object is translucent;
+    # that is, whether the alpha channel is non-1.
+    #
+    # @return [Boolean]
+    def alpha?
+      alpha < 1
+    end
+
+    # Returns the red, green, and blue components of the color.
+    #
+    # @return [Array<Integer>] A frozen three-element array of the red, green, and blue
+    #   values (respectively) of the color
+    def rgb
+      [red, green, blue].freeze
+    end
+
+    # Returns the red, green, blue, and alpha components of the color.
+    #
+    # @return [Array<Integer>] A frozen four-element array of the red, green,
+    #   blue, and alpha values (respectively) of the color
+    def rgba
+      [red, green, blue, alpha].freeze
+    end
+
+    # Returns the hue, saturation, and lightness components of the color.
+    #
+    # @return [Array<Integer>] A frozen three-element array of the
+    #   hue, saturation, and lightness values (respectively) of the color
+    def hsl
+      [hue, saturation, lightness].freeze
+    end
+
+    # Returns the hue, saturation, lightness, and alpha components of the color.
+    #
+    # @return [Array<Integer>] A frozen four-element array of the hue,
+    #   saturation, lightness, and alpha values (respectively) of the color
+    def hsla
+      [hue, saturation, lightness, alpha].freeze
+    end
+
+    # The SassScript `==` operation.
+    # **Note that this returns a {Sass::Script::Value::Bool} object,
+    # not a Ruby boolean**.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Bool] True if this value is the same as the other,
+    #   false otherwise
+    def eq(other)
+      Sass::Script::Value::Bool.new(
+        other.is_a?(Color) && rgb == other.rgb && alpha == other.alpha)
+    end
+
+    def hash
+      [rgb, alpha].hash
+    end
+
+    # Returns a copy of this color with one or more channels changed.
+    # RGB or HSL colors may be changed, but not both at once.
+    #
+    # For example:
+    #
+    #     Color.new([10, 20, 30]).with(:blue => 40)
+    #       #=> rgb(10, 40, 30)
+    #     Color.new([126, 126, 126]).with(:red => 0, :green => 255)
+    #       #=> rgb(0, 255, 126)
+    #     Color.new([255, 0, 127]).with(:saturation => 60)
+    #       #=> rgb(204, 51, 127)
+    #     Color.new([1, 2, 3]).with(:alpha => 0.4)
+    #       #=> rgba(1, 2, 3, 0.4)
+    #
+    # @param attrs [{Symbol => Numeric}]
+    #   A map of channel names (`:red`, `:green`, `:blue`,
+    #   `:hue`, `:saturation`, `:lightness`, or `:alpha`) to values
+    # @return [Color] The new Color object
+    # @raise [ArgumentError] if both RGB and HSL keys are specified
+    def with(attrs)
+      attrs = attrs.reject {|_k, v| v.nil?}
+      hsl = !([:hue, :saturation, :lightness] & attrs.keys).empty?
+      rgb = !([:red, :green, :blue] & attrs.keys).empty?
+      if hsl && rgb
+        raise ArgumentError.new("Cannot specify HSL and RGB values for a color at the same time")
+      end
+
+      if hsl
+        [:hue, :saturation, :lightness].each {|k| attrs[k] ||= send(k)}
+      elsif rgb
+        [:red, :green, :blue].each {|k| attrs[k] ||= send(k)}
+      else
+        # If we're just changing the alpha channel,
+        # keep all the HSL/RGB stuff we've calculated
+        attrs = @attrs.merge(attrs)
+      end
+      attrs[:alpha] ||= alpha
+
+      Color.new(attrs, nil, :allow_both_rgb_and_hsl)
+    end
+
+    # The SassScript `+` operation.
+    # Its functionality depends on the type of its argument:
+    #
+    # {Number}
+    # : Adds the number to each of the RGB color channels.
+    #
+    # {Color}
+    # : Adds each of the RGB color channels together.
+    #
+    # {Value}
+    # : See {Value::Base#plus}.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Color] The resulting color
+    # @raise [Sass::SyntaxError] if `other` is a number with units
+    def plus(other)
+      if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color)
+        piecewise(other, :+)
+      else
+        super
+      end
+    end
+
+    # The SassScript `-` operation.
+    # Its functionality depends on the type of its argument:
+    #
+    # {Number}
+    # : Subtracts the number from each of the RGB color channels.
+    #
+    # {Color}
+    # : Subtracts each of the other color's RGB color channels from this color's.
+    #
+    # {Value}
+    # : See {Value::Base#minus}.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Color] The resulting color
+    # @raise [Sass::SyntaxError] if `other` is a number with units
+    def minus(other)
+      if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color)
+        piecewise(other, :-)
+      else
+        super
+      end
+    end
+
+    # The SassScript `*` operation.
+    # Its functionality depends on the type of its argument:
+    #
+    # {Number}
+    # : Multiplies the number by each of the RGB color channels.
+    #
+    # {Color}
+    # : Multiplies each of the RGB color channels together.
+    #
+    # @param other [Number, Color] The right-hand side of the operator
+    # @return [Color] The resulting color
+    # @raise [Sass::SyntaxError] if `other` is a number with units
+    def times(other)
+      if other.is_a?(Sass::Script::Value::Number) || other.is_a?(Sass::Script::Value::Color)
+        piecewise(other, :*)
+      else
+        raise NoMethodError.new(nil, :times)
+      end
+    end
+
+    # The SassScript `/` operation.
+    # Its functionality depends on the type of its argument:
+    #
+    # {Number}
+    # : Divides each of the RGB color channels by the number.
+    #
+    # {Color}
+    # : Divides each of this color's RGB color channels by the other color's.
+    #
+    # {Value}
+    # : See {Value::Base#div}.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Color] The resulting color
+    # @raise [Sass::SyntaxError] if `other` is a number with units
+    def div(other)
+      if other.is_a?(Sass::Script::Value::Number) ||
+          other.is_a?(Sass::Script::Value::Color)
+        piecewise(other, :/)
+      else
+        super
+      end
+    end
+
+    # The SassScript `%` operation.
+    # Its functionality depends on the type of its argument:
+    #
+    # {Number}
+    # : Takes each of the RGB color channels module the number.
+    #
+    # {Color}
+    # : Takes each of this color's RGB color channels modulo the other color's.
+    #
+    # @param other [Number, Color] The right-hand side of the operator
+    # @return [Color] The resulting color
+    # @raise [Sass::SyntaxError] if `other` is a number with units
+    def mod(other)
+      if other.is_a?(Sass::Script::Value::Number) ||
+          other.is_a?(Sass::Script::Value::Color)
+        piecewise(other, :%)
+      else
+        raise NoMethodError.new(nil, :mod)
+      end
+    end
+
+    # Returns a string representation of the color.
+    # This is usually the color's hex value,
+    # but if the color has a name that's used instead.
+    #
+    # @return [String] The string representation
+    def to_s(opts = {})
+      return smallest if options[:style] == :compressed
+      return representation if representation
+
+      # IE10 doesn't properly support the color name "transparent", so we emit
+      # generated transparent colors as rgba(0, 0, 0, 0) in favor of that. See
+      # #1782.
+      return rgba_str if Number.basically_equal?(alpha, 0)
+      return name if name
+      alpha? ? rgba_str : hex_str
+    end
+    alias_method :to_sass, :to_s
+
+    # Returns a string representation of the color.
+    #
+    # @return [String] The hex value
+    def inspect
+      alpha? ? rgba_str : hex_str
+    end
+
+    # Returns the color's name, if it has one.
+    #
+    # @return [String, nil]
+    def name
+      COLOR_NAMES_REVERSE[rgba]
+    end
+
+    private
+
+    def smallest
+      small_explicit_str = alpha? ? rgba_str : hex_str.gsub(/^#(.)\1(.)\2(.)\3$/, '#\1\2\3')
+      [representation, COLOR_NAMES_REVERSE[rgba], small_explicit_str].
+          compact.min_by {|str| str.size}
+    end
+
+    def rgba_str
+      split = options[:style] == :compressed ? ',' : ', '
+      "rgba(#{rgb.join(split)}#{split}#{Number.round(alpha)})"
+    end
+
+    def hex_str
+      red, green, blue = rgb.map {|num| num.to_s(16).rjust(2, '0')}
+      "##{red}#{green}#{blue}"
+    end
+
+    def operation_name(operation)
+      case operation
+      when :+
+        "add"
+      when :-
+        "subtract"
+      when :*
+        "multiply"
+      when :/
+        "divide"
+      when :%
+        "modulo"
+      end
+    end
+
+    def piecewise(other, operation)
+      other_num = other.is_a? Number
+      if other_num && !other.unitless?
+        raise Sass::SyntaxError.new(
+          "Cannot #{operation_name(operation)} a number with units (#{other}) to a color (#{self})."
+        )
+      end
+
+      result = []
+      (0...3).each do |i|
+        res = rgb[i].to_f.send(operation, other_num ? other.value : other.rgb[i])
+        result[i] = [[res, 255].min, 0].max
+      end
+
+      if !other_num && other.alpha != alpha
+        raise Sass::SyntaxError.new("Alpha channels must be equal: #{self} #{operation} #{other}")
+      end
+
+      with(:red => result[0], :green => result[1], :blue => result[2])
+    end
+
+    def hsl_to_rgb!
+      return if @attrs[:red] && @attrs[:blue] && @attrs[:green]
+
+      h = @attrs[:hue] / 360.0
+      s = @attrs[:saturation] / 100.0
+      l = @attrs[:lightness] / 100.0
+
+      # Algorithm from the CSS3 spec: http://www.w3.org/TR/css3-color/#hsl-color.
+      m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s
+      m1 = l * 2 - m2
+      @attrs[:red], @attrs[:green], @attrs[:blue] = [
+        hue_to_rgb(m1, m2, h + 1.0 / 3),
+        hue_to_rgb(m1, m2, h),
+        hue_to_rgb(m1, m2, h - 1.0 / 3)
+      ].map {|c| Sass::Util.round(c * 0xff)}
+    end
+
+    def hue_to_rgb(m1, m2, h)
+      h += 1 if h < 0
+      h -= 1 if h > 1
+      return m1 + (m2 - m1) * h * 6 if h * 6 < 1
+      return m2 if h * 2 < 1
+      return m1 + (m2 - m1) * (2.0 / 3 - h) * 6 if h * 3 < 2
+      m1
+    end
+
+    def rgb_to_hsl!
+      return if @attrs[:hue] && @attrs[:saturation] && @attrs[:lightness]
+      r, g, b = [:red, :green, :blue].map {|k| @attrs[k] / 255.0}
+
+      # Algorithm from http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_RGB_to_HSL_or_HSV
+      max = [r, g, b].max
+      min = [r, g, b].min
+      d = max - min
+
+      h =
+        case max
+        when min; 0
+        when r; 60 * (g - b) / d
+        when g; 60 * (b - r) / d + 120
+        when b; 60 * (r - g) / d + 240
+        end
+
+      l = (max + min) / 2.0
+
+      s =
+        if max == min
+          0
+        elsif l < 0.5
+          d / (2 * l)
+        else
+          d / (2 - 2 * l)
+        end
+
+      @attrs[:hue] = h % 360
+      @attrs[:saturation] = s * 100
+      @attrs[:lightness] = l * 100
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/function.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/function.rb
new file mode 100644
index 0000000..f0f59a2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/function.rb
@@ -0,0 +1,19 @@
+module Sass::Script::Value
+  # A SassScript object representing a function.
+  class Function < Callable
+    # Constructs a Function value for use in SassScript.
+    #
+    # @param function [Sass::Callable] The callable to be used when the
+    # function is invoked.
+    def initialize(function)
+      unless function.type == "function"
+        raise ArgumentError.new("A callable of type function was expected.")
+      end
+      super
+    end
+
+    def to_sass
+      %{get-function("#{value.name}")}
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/helpers.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/helpers.rb
new file mode 100644
index 0000000..ec216c6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/helpers.rb
@@ -0,0 +1,292 @@
+module Sass::Script::Value
+  # Provides helper functions for creating sass values from within ruby methods.
+  # @since `3.3.0`
+  # @comment
+  #   rubocop:disable ModuleLength
+  module Helpers
+    # Construct a Sass Boolean.
+    #
+    # @param value [Object] A ruby object that will be tested for truthiness.
+    # @return [Sass::Script::Value::Bool] whether the ruby value is truthy.
+    def bool(value)
+      Bool.new(value)
+    end
+
+    # Construct a Sass Color from a hex color string.
+    #
+    # @param value [::String] A string representing a hex color.
+    #   The leading hash ("#") is optional.
+    # @param alpha [::Number] The alpha channel. A number between 0 and 1.
+    # @return [Sass::Script::Value::Color] the color object
+    def hex_color(value, alpha = nil)
+      Color.from_hex(value, alpha)
+    end
+
+    # Construct a Sass Color from hsl values.
+    #
+    # @param hue [::Number] The hue of the color in degrees.
+    #   A non-negative number, usually less than 360.
+    # @param saturation [::Number] The saturation of the color.
+    #   Must be between 0 and 100 inclusive.
+    # @param lightness [::Number] The lightness of the color.
+    #   Must be between 0 and 100 inclusive.
+    # @param alpha [::Number] The alpha channel. A number between 0 and 1.
+    #
+    # @return [Sass::Script::Value::Color] the color object
+    def hsl_color(hue, saturation, lightness, alpha = nil)
+      attrs = {:hue => hue, :saturation => saturation, :lightness => lightness}
+      attrs[:alpha] = alpha if alpha
+      Color.new(attrs)
+    end
+
+    # Construct a Sass Color from rgb values.
+    #
+    # @param red [::Number] The red component. Must be between 0 and 255 inclusive.
+    # @param green [::Number] The green component. Must be between 0 and 255 inclusive.
+    # @param blue [::Number] The blue component. Must be between 0 and 255 inclusive.
+    # @param alpha [::Number] The alpha channel. A number between 0 and 1.
+    #
+    # @return [Sass::Script::Value::Color] the color object
+    def rgb_color(red, green, blue, alpha = nil)
+      attrs = {:red => red, :green => green, :blue => blue}
+      attrs[:alpha] = alpha if alpha
+      Color.new(attrs)
+    end
+
+    # Construct a Sass Number from a ruby number.
+    #
+    # @param number [::Number] A numeric value.
+    # @param unit_string [::String] A unit string of the form
+    #   `numeral_unit1 * numeral_unit2 ... / denominator_unit1 * denominator_unit2 ...`
+    #   this is the same format that is returned by
+    #   {Sass::Script::Value::Number#unit_str the `unit_str` method}
+    #
+    # @see Sass::Script::Value::Number#unit_str
+    #
+    # @return [Sass::Script::Value::Number] The sass number representing the given ruby number.
+    def number(number, unit_string = nil)
+      Number.new(number, *parse_unit_string(unit_string))
+    end
+
+    # @overload list(*elements, separator:, bracketed: false)
+    #   Create a space-separated list from the arguments given.
+    #   @param elements [Array<Sass::Script::Value::Base>] Each argument will be a list element.
+    #   @param separator [Symbol] Either :space or :comma.
+    #   @param bracketed [Boolean] Whether the list uses square brackets.
+    #   @return [Sass::Script::Value::List] The space separated list.
+    #
+    # @overload list(array, separator:, bracketed: false)
+    #   Create a space-separated list from the array given.
+    #   @param array [Array<Sass::Script::Value::Base>] A ruby array of Sass values
+    #     to make into a list.
+    #   @param separator [Symbol] Either :space or :comma.
+    #   @param bracketed [Boolean] Whether the list uses square brackets.
+    #   @return [Sass::Script::Value::List] The space separated list.
+    def list(*elements, separator: nil, bracketed: false)
+      # Support passing separator as the last value in elements for
+      # backwards-compatibility.
+      if separator.nil?
+        if elements.last.is_a?(Symbol)
+          separator = elements.pop
+        else
+          raise ArgumentError.new("A separator of :space or :comma must be specified.")
+        end
+      end
+
+      if elements.size == 1 && elements.first.is_a?(Array)
+        elements = elements.first
+      end
+      Sass::Script::Value::List.new(elements, separator: separator, bracketed: bracketed)
+    end
+
+    # Construct a Sass map.
+    #
+    # @param hash [Hash<Sass::Script::Value::Base,
+    #   Sass::Script::Value::Base>] A Ruby map to convert to a Sass map.
+    # @return [Sass::Script::Value::Map] The map.
+    def map(hash)
+      Map.new(hash)
+    end
+
+    # Create a sass null value.
+    #
+    # @return [Sass::Script::Value::Null]
+    def null
+      Sass::Script::Value::Null.new
+    end
+
+    # Create a quoted string.
+    #
+    # @param str [::String] A ruby string.
+    # @return [Sass::Script::Value::String] A quoted string.
+    def quoted_string(str)
+      Sass::Script::String.new(str, :string)
+    end
+
+    # Create an unquoted string.
+    #
+    # @param str [::String] A ruby string.
+    # @return [Sass::Script::Value::String] An unquoted string.
+    def unquoted_string(str)
+      Sass::Script::String.new(str, :identifier)
+    end
+    alias_method :identifier, :unquoted_string
+
+    # Parses a user-provided selector.
+    #
+    # @param value [Sass::Script::Value::String, Sass::Script::Value::List]
+    #   The selector to parse. This can be either a string, a list of
+    #   strings, or a list of lists of strings as returned by `&`.
+    # @param name [Symbol, nil]
+    #   If provided, the name of the selector argument. This is used
+    #   for error reporting.
+    # @param allow_parent_ref [Boolean]
+    #   Whether the parsed selector should allow parent references.
+    # @return [Sass::Selector::CommaSequence] The parsed selector.
+    # @throw [ArgumentError] if the parse failed for any reason.
+    def parse_selector(value, name = nil, allow_parent_ref = false)
+      str = normalize_selector(value, name)
+      begin
+        Sass::SCSS::StaticParser.new(str, nil, nil, 1, 1, allow_parent_ref).parse_selector
+      rescue Sass::SyntaxError => e
+        err = "#{value.inspect} is not a valid selector: #{e}"
+        err = "$#{name.to_s.tr('_', '-')}: #{err}" if name
+        raise ArgumentError.new(err)
+      end
+    end
+
+    # Parses a user-provided complex selector.
+    #
+    # A complex selector can contain combinators but cannot contain commas.
+    #
+    # @param value [Sass::Script::Value::String, Sass::Script::Value::List]
+    #   The selector to parse. This can be either a string or a list of
+    #   strings.
+    # @param name [Symbol, nil]
+    #   If provided, the name of the selector argument. This is used
+    #   for error reporting.
+    # @param allow_parent_ref [Boolean]
+    #   Whether the parsed selector should allow parent references.
+    # @return [Sass::Selector::Sequence] The parsed selector.
+    # @throw [ArgumentError] if the parse failed for any reason.
+    def parse_complex_selector(value, name = nil, allow_parent_ref = false)
+      selector = parse_selector(value, name, allow_parent_ref)
+      return seq if selector.members.length == 1
+
+      err = "#{value.inspect} is not a complex selector"
+      err = "$#{name.to_s.tr('_', '-')}: #{err}" if name
+      raise ArgumentError.new(err)
+    end
+
+    # Parses a user-provided compound selector.
+    #
+    # A compound selector cannot contain combinators or commas.
+    #
+    # @param value [Sass::Script::Value::String] The selector to parse.
+    # @param name [Symbol, nil]
+    #   If provided, the name of the selector argument. This is used
+    #   for error reporting.
+    # @param allow_parent_ref [Boolean]
+    #   Whether the parsed selector should allow parent references.
+    # @return [Sass::Selector::SimpleSequence] The parsed selector.
+    # @throw [ArgumentError] if the parse failed for any reason.
+    def parse_compound_selector(value, name = nil, allow_parent_ref = false)
+      assert_type value, :String, name
+      selector = parse_selector(value, name, allow_parent_ref)
+      seq = selector.members.first
+      sseq = seq.members.first
+      if selector.members.length == 1 && seq.members.length == 1 &&
+          sseq.is_a?(Sass::Selector::SimpleSequence)
+        return sseq
+      end
+
+      err = "#{value.inspect} is not a compound selector"
+      err = "$#{name.to_s.tr('_', '-')}: #{err}" if name
+      raise ArgumentError.new(err)
+    end
+
+    # Returns true when the literal is a string containing a calc().
+    #
+    # Use \{#special_number?} in preference to this.
+    #
+    # @param literal [Sass::Script::Value::Base] The value to check
+    # @return Boolean
+    def calc?(literal)
+      literal.is_a?(Sass::Script::Value::String) && literal.value =~ /calc\(/
+    end
+
+    # Returns whether the literal is a special CSS value that may evaluate to a
+    # number, such as `calc()` or `var()`.
+    #
+    # @param literal [Sass::Script::Value::Base] The value to check
+    # @return Boolean
+    def special_number?(literal)
+      literal.is_a?(Sass::Script::Value::String) && literal.value =~ /(calc|var)\(/
+    end
+
+    private
+
+    # Converts a user-provided selector into string form or throws an
+    # ArgumentError if it's in an invalid format.
+    def normalize_selector(value, name)
+      if (str = selector_to_str(value))
+        return str
+      end
+
+      err = "#{value.inspect} is not a valid selector: it must be a string,\n" +
+        "a list of strings, or a list of lists of strings"
+      err = "$#{name.to_s.tr('_', '-')}: #{err}" if name
+      raise ArgumentError.new(err)
+    end
+
+    # Converts a user-provided selector into string form or returns
+    # `nil` if it's in an invalid format.
+    def selector_to_str(value)
+      return value.value if value.is_a?(Sass::Script::String)
+      return unless value.is_a?(Sass::Script::List)
+
+      if value.separator == :comma
+        return value.to_a.map do |complex|
+          next complex.value if complex.is_a?(Sass::Script::String)
+          return unless complex.is_a?(Sass::Script::List) && complex.separator == :space
+          return unless (str = selector_to_str(complex))
+          str
+        end.join(', ')
+      end
+
+      value.to_a.map do |compound|
+        return unless compound.is_a?(Sass::Script::String)
+        compound.value
+      end.join(' ')
+    end
+
+    # @private
+    VALID_UNIT = /#{Sass::SCSS::RX::NMSTART}#{Sass::SCSS::RX::NMCHAR}|%*/
+
+    # @example
+    #   parse_unit_string("em*px/in*%") # => [["em", "px], ["in", "%"]]
+    #
+    # @param unit_string [String] A string adhering to the output of a number with complex
+    #   units. E.g. "em*px/in*%"
+    # @return [Array<Array<String>>] A list of numerator units and a list of denominator units.
+    def parse_unit_string(unit_string)
+      denominator_units = numerator_units = Sass::Script::Value::Number::NO_UNITS
+      return numerator_units, denominator_units unless unit_string && unit_string.length > 0
+      num_over_denominator = unit_string.split(%r{ */ *})
+      unless (1..2).include?(num_over_denominator.size)
+        raise ArgumentError.new("Malformed unit string: #{unit_string}")
+      end
+      numerator_units = num_over_denominator[0].split(/ *\* */)
+      denominator_units = (num_over_denominator[1] || "").split(/ *\* */)
+      [[numerator_units, "numerator"], [denominator_units, "denominator"]].each do |units, name|
+        if unit_string =~ %r{/} && units.size == 0
+          raise ArgumentError.new("Malformed unit string: #{unit_string}")
+        end
+        if units.any? {|unit| unit !~ VALID_UNIT}
+          raise ArgumentError.new("Malformed #{name} in unit string: #{unit_string}")
+        end
+      end
+      [numerator_units, denominator_units]
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/list.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/list.rb
new file mode 100644
index 0000000..689fdd0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/list.rb
@@ -0,0 +1,134 @@
+module Sass::Script::Value
+  # A SassScript object representing a CSS list.
+  # This includes both comma-separated lists and space-separated lists.
+  class List < Base
+    # The Ruby array containing the contents of the list.
+    #
+    # @return [Array<Value>]
+    attr_reader :value
+    alias_method :to_a, :value
+
+    # The operator separating the values of the list.
+    # Either `:comma` or `:space`.
+    #
+    # @return [Symbol]
+    attr_reader :separator
+
+    # Whether the list is surrounded by square brackets.
+    #
+    # @return [Boolean]
+    attr_reader :bracketed
+
+    # Creates a new list.
+    #
+    # @param value [Array<Value>] See \{#value}
+    # @param separator [Symbol] See \{#separator}
+    # @param bracketed [Boolean] See \{#bracketed}
+    def initialize(value, separator: nil, bracketed: false)
+      super(value)
+      @separator = separator
+      @bracketed = bracketed
+    end
+
+    # @see Value#options=
+    def options=(options)
+      super
+      value.each {|v| v.options = options}
+    end
+
+    # @see Value#eq
+    def eq(other)
+      Sass::Script::Value::Bool.new(
+        other.is_a?(List) && value == other.value &&
+        separator == other.separator && bracketed == other.bracketed)
+    end
+
+    def hash
+      @hash ||= [value, separator, bracketed].hash
+    end
+
+    # @see Value#to_s
+    def to_s(opts = {})
+      if !bracketed && value.empty?
+        raise Sass::SyntaxError.new("#{inspect} isn't a valid CSS value.")
+      end
+
+      members = value.
+        reject {|e| e.is_a?(Null) || e.is_a?(List) && e.value.empty?}.
+        map {|e| e.to_s(opts)}
+
+      contents = members.join(sep_str)
+      bracketed ? "[#{contents}]" : contents
+    end
+
+    # @see Value#to_sass
+    def to_sass(opts = {})
+      return bracketed ? "[]" : "()" if value.empty?
+      members = value.map do |v|
+        if element_needs_parens?(v)
+          "(#{v.to_sass(opts)})"
+        else
+          v.to_sass(opts)
+        end
+      end
+
+      if separator == :comma && members.length == 1
+        return "#{bracketed ? '[' : '('}#{members.first},#{bracketed ? ']' : ')'}"
+      end
+
+      contents = members.join(sep_str(nil))
+      bracketed ? "[#{contents}]" : contents
+    end
+
+    # @see Value#to_h
+    def to_h
+      return {} if value.empty?
+      super
+    end
+
+    # @see Value#inspect
+    def inspect
+      (bracketed ? '[' : '(') +
+        value.map {|e| e.inspect}.join(sep_str(nil)) +
+        (bracketed ? ']' : ')')
+    end
+
+    # Asserts an index is within the list.
+    #
+    # @private
+    #
+    # @param list [Sass::Script::Value::List] The list for which the index should be checked.
+    # @param n [Sass::Script::Value::Number] The index being checked.
+    def self.assert_valid_index(list, n)
+      if !n.int? || n.to_i == 0
+        raise ArgumentError.new("List index #{n} must be a non-zero integer")
+      elsif list.to_a.size == 0
+        raise ArgumentError.new("List index is #{n} but list has no items")
+      elsif n.to_i.abs > (size = list.to_a.size)
+        raise ArgumentError.new(
+          "List index is #{n} but list is only #{size} item#{'s' if size != 1} long")
+      end
+    end
+
+    private
+
+    def element_needs_parens?(element)
+      if element.is_a?(List)
+        return false if element.value.length < 2
+        return false if element.bracketed
+        precedence = Sass::Script::Parser.precedence_of(separator || :space)
+        return Sass::Script::Parser.precedence_of(element.separator || :space) <= precedence
+      end
+
+      return false unless separator == :space
+      return false unless element.is_a?(Sass::Script::Tree::UnaryOperation)
+      element.operator == :minus || element.operator == :plus
+    end
+
+    def sep_str(opts = options)
+      return ' ' if separator == :space
+      return ',' if opts && opts[:style] == :compressed
+      ', '
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/map.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/map.rb
new file mode 100644
index 0000000..2d1c6a3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/map.rb
@@ -0,0 +1,70 @@
+module Sass::Script::Value
+  # A SassScript object representing a map from keys to values. Both keys and
+  # values can be any SassScript object.
+  class Map < Base
+    # The Ruby hash containing the contents of this map.
+    #
+    # @return [Hash<Node, Node>]
+    attr_reader :value
+    alias_method :to_h, :value
+
+    # Creates a new map.
+    #
+    # @param hash [Hash<Node, Node>]
+    def initialize(hash)
+      super(hash)
+    end
+
+    # @see Value#options=
+    def options=(options)
+      super
+      value.each do |k, v|
+        k.options = options
+        v.options = options
+      end
+    end
+
+    # @see Value#separator
+    def separator
+      :comma unless value.empty?
+    end
+
+    # @see Value#to_a
+    def to_a
+      value.map do |k, v|
+        list = List.new([k, v], separator: :space)
+        list.options = options
+        list
+      end
+    end
+
+    # @see Value#eq
+    def eq(other)
+      Bool.new(other.is_a?(Map) && value == other.value)
+    end
+
+    def hash
+      @hash ||= value.hash
+    end
+
+    # @see Value#to_s
+    def to_s(opts = {})
+      raise Sass::SyntaxError.new("#{inspect} isn't a valid CSS value.")
+    end
+
+    def to_sass(opts = {})
+      return "()" if value.empty?
+
+      to_sass = lambda do |value|
+        if value.is_a?(List) && value.separator == :comma
+          "(#{value.to_sass(opts)})"
+        else
+          value.to_sass(opts)
+        end
+      end
+
+      "(#{value.map {|(k, v)| "#{to_sass[k]}: #{to_sass[v]}"}.join(', ')})"
+    end
+    alias_method :inspect, :to_sass
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/null.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/null.rb
new file mode 100644
index 0000000..f6d573b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/null.rb
@@ -0,0 +1,44 @@
+module Sass::Script::Value
+  # A SassScript object representing a null value.
+  class Null < Base
+    # The null value in SassScript.
+    #
+    # This is assigned before new is overridden below so that we use the default implementation.
+    NULL = new(nil)
+
+    # We override object creation so that users of the core API
+    # will not need to know that null is a specific constant.
+    #
+    # @private
+    # @return [Null] the {NULL} constant.
+    def self.new
+      NULL
+    end
+
+    # @return [Boolean] `false` (the Ruby boolean value)
+    def to_bool
+      false
+    end
+
+    # @return [Boolean] `true`
+    def null?
+      true
+    end
+
+    # @return [String] '' (An empty string)
+    def to_s(opts = {})
+      ''
+    end
+
+    def to_sass(opts = {})
+      'null'
+    end
+
+    # Returns a string representing a null value.
+    #
+    # @return [String]
+    def inspect
+      'null'
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/number.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/number.rb
new file mode 100644
index 0000000..4ad1d86
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/number.rb
@@ -0,0 +1,563 @@
+module Sass::Script::Value
+  # A SassScript object representing a number.
+  # SassScript numbers can have decimal values,
+  # and can also have units.
+  # For example, `12`, `1px`, and `10.45em`
+  # are all valid values.
+  #
+  # Numbers can also have more complex units, such as `1px*em/in`.
+  # These cannot be inputted directly in Sass code at the moment.
+  class Number < Base
+    # The Ruby value of the number.
+    #
+    # @return [Numeric]
+    attr_reader :value
+
+    # A list of units in the numerator of the number.
+    # For example, `1px*em/in*cm` would return `["px", "em"]`
+    # @return [Array<String>]
+    attr_reader :numerator_units
+
+    # A list of units in the denominator of the number.
+    # For example, `1px*em/in*cm` would return `["in", "cm"]`
+    # @return [Array<String>]
+    attr_reader :denominator_units
+
+    # The original representation of this number.
+    # For example, although the result of `1px/2px` is `0.5`,
+    # the value of `#original` is `"1px/2px"`.
+    #
+    # This is only non-nil when the original value should be used as the CSS value,
+    # as in `font: 1px/2px`.
+    #
+    # @return [Boolean, nil]
+    attr_accessor :original
+
+    def self.precision
+      Thread.current[:sass_numeric_precision] || Thread.main[:sass_numeric_precision] || 10
+    end
+
+    # Sets the number of digits of precision
+    # For example, if this is `3`,
+    # `3.1415926` will be printed as `3.142`.
+    # The numeric precision is stored as a thread local for thread safety reasons.
+    # To set for all threads, be sure to set the precision on the main thread.
+    def self.precision=(digits)
+      Thread.current[:sass_numeric_precision] = digits.round
+      Thread.current[:sass_numeric_precision_factor] = nil
+      Thread.current[:sass_numeric_epsilon] = nil
+    end
+
+    # the precision factor used in numeric output
+    # it is derived from the `precision` method.
+    def self.precision_factor
+      Thread.current[:sass_numeric_precision_factor] ||= 10.0**precision
+    end
+
+    # Used in checking equality of floating point numbers. Any
+    # numbers within an `epsilon` of each other are considered functionally equal.
+    # The value for epsilon is one tenth of the current numeric precision.
+    def self.epsilon
+      Thread.current[:sass_numeric_epsilon] ||= 1 / (precision_factor * 10)
+    end
+
+    # Used so we don't allocate two new arrays for each new number.
+    NO_UNITS = []
+
+    # @param value [Numeric] The value of the number
+    # @param numerator_units [::String, Array<::String>] See \{#numerator\_units}
+    # @param denominator_units [::String, Array<::String>] See \{#denominator\_units}
+    def initialize(value, numerator_units = NO_UNITS, denominator_units = NO_UNITS)
+      numerator_units = [numerator_units] if numerator_units.is_a?(::String)
+      denominator_units = [denominator_units] if denominator_units.is_a?(::String)
+      super(value)
+      @numerator_units = numerator_units
+      @denominator_units = denominator_units
+      @options = nil
+      normalize!
+    end
+
+    # The SassScript `+` operation.
+    # Its functionality depends on the type of its argument:
+    #
+    # {Number}
+    # : Adds the two numbers together, converting units if possible.
+    #
+    # {Color}
+    # : Adds this number to each of the RGB color channels.
+    #
+    # {Value}
+    # : See {Value::Base#plus}.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Value] The result of the operation
+    # @raise [Sass::UnitConversionError] if `other` is a number with incompatible units
+    def plus(other)
+      if other.is_a? Number
+        operate(other, :+)
+      elsif other.is_a?(Color)
+        other.plus(self)
+      else
+        super
+      end
+    end
+
+    # The SassScript binary `-` operation (e.g. `$a - $b`).
+    # Its functionality depends on the type of its argument:
+    #
+    # {Number}
+    # : Subtracts this number from the other, converting units if possible.
+    #
+    # {Value}
+    # : See {Value::Base#minus}.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Value] The result of the operation
+    # @raise [Sass::UnitConversionError] if `other` is a number with incompatible units
+    def minus(other)
+      if other.is_a? Number
+        operate(other, :-)
+      else
+        super
+      end
+    end
+
+    # The SassScript unary `+` operation (e.g. `+$a`).
+    #
+    # @return [Number] The value of this number
+    def unary_plus
+      self
+    end
+
+    # The SassScript unary `-` operation (e.g. `-$a`).
+    #
+    # @return [Number] The negative value of this number
+    def unary_minus
+      Number.new(-value, @numerator_units, @denominator_units)
+    end
+
+    # The SassScript `*` operation.
+    # Its functionality depends on the type of its argument:
+    #
+    # {Number}
+    # : Multiplies the two numbers together, converting units appropriately.
+    #
+    # {Color}
+    # : Multiplies each of the RGB color channels by this number.
+    #
+    # @param other [Number, Color] The right-hand side of the operator
+    # @return [Number, Color] The result of the operation
+    # @raise [NoMethodError] if `other` is an invalid type
+    def times(other)
+      if other.is_a? Number
+        operate(other, :*)
+      elsif other.is_a? Color
+        other.times(self)
+      else
+        raise NoMethodError.new(nil, :times)
+      end
+    end
+
+    # The SassScript `/` operation.
+    # Its functionality depends on the type of its argument:
+    #
+    # {Number}
+    # : Divides this number by the other, converting units appropriately.
+    #
+    # {Value}
+    # : See {Value::Base#div}.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Value] The result of the operation
+    def div(other)
+      if other.is_a? Number
+        res = operate(other, :/)
+        if original && other.original
+          res.original = "#{original}/#{other.original}"
+        end
+        res
+      else
+        super
+      end
+    end
+
+    # The SassScript `%` operation.
+    #
+    # @param other [Number] The right-hand side of the operator
+    # @return [Number] This number modulo the other
+    # @raise [NoMethodError] if `other` is an invalid type
+    # @raise [Sass::UnitConversionError] if `other` has incompatible units
+    def mod(other)
+      if other.is_a?(Number)
+        operate(other, :%)
+      else
+        raise NoMethodError.new(nil, :mod)
+      end
+    end
+
+    # The SassScript `==` operation.
+    #
+    # @param other [Value] The right-hand side of the operator
+    # @return [Boolean] Whether this number is equal to the other object
+    def eq(other)
+      return Bool::FALSE unless other.is_a?(Sass::Script::Value::Number)
+      this = self
+      begin
+        if unitless?
+          this = this.coerce(other.numerator_units, other.denominator_units)
+        else
+          other = other.coerce(@numerator_units, @denominator_units)
+        end
+      rescue Sass::UnitConversionError
+        return Bool::FALSE
+      end
+      Bool.new(basically_equal?(this.value, other.value))
+    end
+
+    def hash
+      [value, numerator_units, denominator_units].hash
+    end
+
+    # Hash-equality works differently than `==` equality for numbers.
+    # Hash-equality must be transitive, so it just compares the exact value,
+    # numerator units, and denominator units.
+    def eql?(other)
+      basically_equal?(value, other.value) && numerator_units == other.numerator_units &&
+        denominator_units == other.denominator_units
+    end
+
+    # The SassScript `>` operation.
+    #
+    # @param other [Number] The right-hand side of the operator
+    # @return [Boolean] Whether this number is greater than the other
+    # @raise [NoMethodError] if `other` is an invalid type
+    def gt(other)
+      raise NoMethodError.new(nil, :gt) unless other.is_a?(Number)
+      operate(other, :>)
+    end
+
+    # The SassScript `>=` operation.
+    #
+    # @param other [Number] The right-hand side of the operator
+    # @return [Boolean] Whether this number is greater than or equal to the other
+    # @raise [NoMethodError] if `other` is an invalid type
+    def gte(other)
+      raise NoMethodError.new(nil, :gte) unless other.is_a?(Number)
+      operate(other, :>=)
+    end
+
+    # The SassScript `<` operation.
+    #
+    # @param other [Number] The right-hand side of the operator
+    # @return [Boolean] Whether this number is less than the other
+    # @raise [NoMethodError] if `other` is an invalid type
+    def lt(other)
+      raise NoMethodError.new(nil, :lt) unless other.is_a?(Number)
+      operate(other, :<)
+    end
+
+    # The SassScript `<=` operation.
+    #
+    # @param other [Number] The right-hand side of the operator
+    # @return [Boolean] Whether this number is less than or equal to the other
+    # @raise [NoMethodError] if `other` is an invalid type
+    def lte(other)
+      raise NoMethodError.new(nil, :lte) unless other.is_a?(Number)
+      operate(other, :<=)
+    end
+
+    # @return [String] The CSS representation of this number
+    # @raise [Sass::SyntaxError] if this number has units that can't be used in CSS
+    #   (e.g. `px*in`)
+    def to_s(opts = {})
+      return original if original
+      raise Sass::SyntaxError.new("#{inspect} isn't a valid CSS value.") unless legal_units?
+      inspect
+    end
+
+    # Returns a readable representation of this number.
+    #
+    # This representation is valid CSS (and valid SassScript)
+    # as long as there is only one unit.
+    #
+    # @return [String] The representation
+    def inspect(opts = {})
+      return original if original
+
+      value = self.class.round(self.value)
+      str = value.to_s
+
+      # Ruby will occasionally print in scientific notation if the number is
+      # small enough. That's technically valid CSS, but it's not well-supported
+      # and confusing.
+      str = ("%0.#{self.class.precision}f" % value).gsub(/0*$/, '') if str.include?('e')
+
+      # Sometimes numeric formatting will result in a decimal number with a trailing zero (x.0)
+      if str =~ /(.*)\.0$/
+        str = $1
+      end
+
+      # We omit a leading zero before the decimal point in compressed mode.
+      if @options && options[:style] == :compressed
+        str.sub!(/^(-)?0\./, '\1.')
+      end
+
+      unitless? ? str : "#{str}#{unit_str}"
+    end
+    alias_method :to_sass, :inspect
+
+    # @return [Integer] The integer value of the number
+    # @raise [Sass::SyntaxError] if the number isn't an integer
+    def to_i
+      super unless int?
+      value.to_i
+    end
+
+    # @return [Boolean] Whether or not this number is an integer.
+    def int?
+      basically_equal?(value % 1, 0.0)
+    end
+
+    # @return [Boolean] Whether or not this number has no units.
+    def unitless?
+      @numerator_units.empty? && @denominator_units.empty?
+    end
+
+    # Checks whether the number has the numerator unit specified.
+    #
+    # @example
+    #   number = Sass::Script::Value::Number.new(10, "px")
+    #   number.is_unit?("px") => true
+    #   number.is_unit?(nil) => false
+    #
+    # @param unit [::String, nil] The unit the number should have or nil if the number
+    #   should be unitless.
+    # @see Number#unitless? The unitless? method may be more readable.
+    def is_unit?(unit)
+      if unit
+        denominator_units.size == 0 && numerator_units.size == 1 && numerator_units.first == unit
+      else
+        unitless?
+      end
+    end
+
+    # @return [Boolean] Whether or not this number has units that can be represented in CSS
+    #   (that is, zero or one \{#numerator\_units}).
+    def legal_units?
+      (@numerator_units.empty? || @numerator_units.size == 1) && @denominator_units.empty?
+    end
+
+    # Returns this number converted to other units.
+    # The conversion takes into account the relationship between e.g. mm and cm,
+    # as well as between e.g. in and cm.
+    #
+    # If this number has no units, it will simply return itself
+    # with the given units.
+    #
+    # An incompatible coercion, e.g. between px and cm, will raise an error.
+    #
+    # @param num_units [Array<String>] The numerator units to coerce this number into.
+    #   See {\#numerator\_units}
+    # @param den_units [Array<String>] The denominator units to coerce this number into.
+    #   See {\#denominator\_units}
+    # @return [Number] The number with the new units
+    # @raise [Sass::UnitConversionError] if the given units are incompatible with the number's
+    #   current units
+    def coerce(num_units, den_units)
+      Number.new(if unitless?
+                   value
+                 else
+                   value * coercion_factor(@numerator_units, num_units) /
+                     coercion_factor(@denominator_units, den_units)
+                 end, num_units, den_units)
+    end
+
+    # @param other [Number] A number to decide if it can be compared with this number.
+    # @return [Boolean] Whether or not this number can be compared with the other.
+    def comparable_to?(other)
+      operate(other, :+)
+      true
+    rescue Sass::UnitConversionError
+      false
+    end
+
+    # Returns a human readable representation of the units in this number.
+    # For complex units this takes the form of:
+    # numerator_unit1 * numerator_unit2 / denominator_unit1 * denominator_unit2
+    # @return [String] a string that represents the units in this number
+    def unit_str
+      rv = @numerator_units.sort.join("*")
+      if @denominator_units.any?
+        rv << "/"
+        rv << @denominator_units.sort.join("*")
+      end
+      rv
+    end
+
+    private
+
+    # @private
+    # @see Sass::Script::Number.basically_equal?
+    def basically_equal?(num1, num2)
+      self.class.basically_equal?(num1, num2)
+    end
+
+    # Checks whether two numbers are within an epsilon of each other.
+    # @return [Boolean]
+    def self.basically_equal?(num1, num2)
+      (num1 - num2).abs < epsilon
+    end
+
+    # @private
+    def self.round(num)
+      if num.is_a?(Float) && (num.infinite? || num.nan?)
+        num
+      elsif basically_equal?(num % 1, 0.0)
+        num.round
+      else
+        ((num * precision_factor).round / precision_factor).to_f
+      end
+    end
+
+    OPERATIONS = [:+, :-, :<=, :<, :>, :>=, :%]
+
+    def operate(other, operation)
+      this = self
+      if OPERATIONS.include?(operation)
+        if unitless?
+          this = this.coerce(other.numerator_units, other.denominator_units)
+        else
+          other = other.coerce(@numerator_units, @denominator_units)
+        end
+      end
+      # avoid integer division
+      value = :/ == operation ? this.value.to_f : this.value
+      result = value.send(operation, other.value)
+
+      if result.is_a?(Numeric)
+        Number.new(result, *compute_units(this, other, operation))
+      else # Boolean op
+        Bool.new(result)
+      end
+    end
+
+    def coercion_factor(from_units, to_units)
+      # get a list of unmatched units
+      from_units, to_units = sans_common_units(from_units, to_units)
+
+      if from_units.size != to_units.size || !convertable?(from_units | to_units)
+        raise Sass::UnitConversionError.new(
+          "Incompatible units: '#{from_units.join('*')}' and '#{to_units.join('*')}'.")
+      end
+
+      from_units.zip(to_units).inject(1) {|m, p| m * conversion_factor(p[0], p[1])}
+    end
+
+    def compute_units(this, other, operation)
+      case operation
+      when :*
+        [this.numerator_units + other.numerator_units,
+         this.denominator_units + other.denominator_units]
+      when :/
+        [this.numerator_units + other.denominator_units,
+         this.denominator_units + other.numerator_units]
+      else
+        [this.numerator_units, this.denominator_units]
+      end
+    end
+
+    def normalize!
+      return if unitless?
+      @numerator_units, @denominator_units =
+        sans_common_units(@numerator_units, @denominator_units)
+
+      @denominator_units.each_with_index do |d, i|
+        next unless convertable?(d) && (u = @numerator_units.find(&method(:convertable?)))
+        @value /= conversion_factor(d, u)
+        @denominator_units.delete_at(i)
+        @numerator_units.delete_at(@numerator_units.index(u))
+      end
+    end
+
+    # This is the source data for all the unit logic. It's pre-processed to make
+    # it efficient to figure out whether a set of units is mutually compatible
+    # and what the conversion ratio is between two units.
+    #
+    # These come from http://www.w3.org/TR/2012/WD-css3-values-20120308/.
+    relative_sizes = [
+      {
+        'in' => Rational(1),
+        'cm' => Rational(1, 2.54),
+        'pc' => Rational(1, 6),
+        'mm' => Rational(1, 25.4),
+        'q' => Rational(1, 101.6),
+        'pt' => Rational(1, 72),
+        'px' => Rational(1, 96)
+      },
+      {
+        'deg'  => Rational(1, 360),
+        'grad' => Rational(1, 400),
+        'rad'  => Rational(1, 2 * Math::PI),
+        'turn' => Rational(1)
+      },
+      {
+        's'  => Rational(1),
+        'ms' => Rational(1, 1000)
+      },
+      {
+        'Hz'  => Rational(1),
+        'kHz' => Rational(1000)
+      },
+      {
+        'dpi'  => Rational(1),
+        'dpcm' => Rational(254, 100),
+        'dppx' => Rational(96)
+      }
+    ]
+
+    # A hash from each known unit to the set of units that it's mutually
+    # convertible with.
+    MUTUALLY_CONVERTIBLE = {}
+    relative_sizes.map do |values|
+      set = values.keys.to_set
+      values.keys.each {|name| MUTUALLY_CONVERTIBLE[name] = set}
+    end
+
+    # A two-dimensional hash from two units to the conversion ratio between
+    # them. Multiply `X` by `CONVERSION_TABLE[X][Y]` to convert it to `Y`.
+    CONVERSION_TABLE = {}
+    relative_sizes.each do |values|
+      values.each do |(name1, value1)|
+        CONVERSION_TABLE[name1] ||= {}
+        values.each do |(name2, value2)|
+          value = value1 / value2
+          CONVERSION_TABLE[name1][name2] = value.denominator == 1 ? value.to_i : value.to_f
+        end
+      end
+    end
+
+    def conversion_factor(from_unit, to_unit)
+      CONVERSION_TABLE[from_unit][to_unit]
+    end
+
+    def convertable?(units)
+      units = Array(units).to_set
+      return true if units.empty?
+      return false unless (mutually_convertible = MUTUALLY_CONVERTIBLE[units.first])
+      units.subset?(mutually_convertible)
+    end
+
+    def sans_common_units(units1, units2)
+      units2 = units2.dup
+      # Can't just use -, because we want px*px to coerce properly to px*mm
+      units1 = units1.map do |u|
+        j = units2.index(u)
+        next u unless j
+        units2.delete_at(j)
+        nil
+      end
+      units1.compact!
+      return units1, units2
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/string.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/string.rb
new file mode 100644
index 0000000..9c9b088
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/script/value/string.rb
@@ -0,0 +1,138 @@
+# -*- coding: utf-8 -*-
+module Sass::Script::Value
+  # A SassScript object representing a CSS string *or* a CSS identifier.
+  class String < Base
+    @@interpolation_deprecation = Sass::Deprecation.new
+
+    # The Ruby value of the string.
+    #
+    # @return [String]
+    attr_reader :value
+
+    # Whether this is a CSS string or a CSS identifier.
+    # The difference is that strings are written with double-quotes,
+    # while identifiers aren't.
+    #
+    # @return [Symbol] `:string` or `:identifier`
+    attr_reader :type
+
+    def self.value(contents)
+      contents.gsub("\\\n", "").gsub(/\\(?:([0-9a-fA-F]{1,6})\s?|(.))/) do
+        next $2 if $2
+        # Handle unicode escapes as per CSS Syntax Level 3 section 4.3.8.
+        code_point = $1.to_i(16)
+        if code_point == 0 || code_point > 0x10FFFF ||
+            (code_point >= 0xD800 && code_point <= 0xDFFF)
+          '�'
+        else
+          [code_point].pack("U")
+        end
+      end
+    end
+
+    # Returns the quoted string representation of `contents`.
+    #
+    # @options opts :quote [String]
+    #   The preferred quote style for quoted strings. If `:none`, strings are
+    #   always emitted unquoted. If `nil`, quoting is determined automatically.
+    # @options opts :sass [String]
+    #   Whether to quote strings for Sass source, as opposed to CSS. Defaults to `false`.
+    def self.quote(contents, opts = {})
+      quote = opts[:quote]
+
+      # Short-circuit if there are no characters that need quoting.
+      unless contents =~ /[\n\\"']|\#\{/
+        quote ||= '"'
+        return "#{quote}#{contents}#{quote}"
+      end
+
+      if quote.nil?
+        if contents.include?('"')
+          if contents.include?("'")
+            quote = '"'
+          else
+            quote = "'"
+          end
+        else
+          quote = '"'
+        end
+      end
+
+      # Replace single backslashes with multiples.
+      contents = contents.gsub("\\", "\\\\\\\\")
+
+      # Escape interpolation.
+      contents = contents.gsub('#{', "\\\#{") if opts[:sass]
+
+      if quote == '"'
+        contents = contents.gsub('"', "\\\"")
+      else
+        contents = contents.gsub("'", "\\'")
+      end
+
+      contents = contents.gsub(/\n(?![a-fA-F0-9\s])/, "\\a").gsub("\n", "\\a ")
+      "#{quote}#{contents}#{quote}"
+    end
+
+    # Creates a new string.
+    #
+    # @param value [String] See \{#value}
+    # @param type [Symbol] See \{#type}
+    # @param deprecated_interp_equivalent [String?]
+    #   If this was created via a potentially-deprecated string interpolation,
+    #   this is the replacement expression that should be suggested to the user.
+    def initialize(value, type = :identifier, deprecated_interp_equivalent = nil)
+      super(value)
+      @type = type
+      @deprecated_interp_equivalent = deprecated_interp_equivalent
+    end
+
+    # @see Value#plus
+    def plus(other)
+      other_value = if other.is_a?(Sass::Script::Value::String)
+                      other.value
+                    else
+                      other.to_s(:quote => :none)
+                    end
+      Sass::Script::Value::String.new(value + other_value, type)
+    end
+
+    # @see Value#to_s
+    def to_s(opts = {})
+      return @value.gsub(/\n\s*/, ' ') if opts[:quote] == :none || @type == :identifier
+      String.quote(value, opts)
+    end
+
+    # @see Value#to_sass
+    def to_sass(opts = {})
+      to_s(opts.merge(:sass => true))
+    end
+
+    def separator
+      check_deprecated_interp
+      super
+    end
+
+    def to_a
+      check_deprecated_interp
+      super
+    end
+
+    # Prints a warning if this string was created using potentially-deprecated
+    # interpolation.
+    def check_deprecated_interp
+      return unless @deprecated_interp_equivalent
+
+      @@interpolation_deprecation.warn(source_range.file, source_range.start_pos.line, <<WARNING)
+\#{} interpolation near operators will be simplified in a future version of Sass.
+To preserve the current behavior, use quotes:
+
+  #{@deprecated_interp_equivalent}
+WARNING
+    end
+
+    def inspect
+      String.quote(value)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss.rb
new file mode 100644
index 0000000..f06ecdb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss.rb
@@ -0,0 +1,14 @@
+require 'sass/scss/rx'
+require 'sass/scss/parser'
+require 'sass/scss/static_parser'
+require 'sass/scss/css_parser'
+
+module Sass
+  # SCSS is the CSS syntax for Sass.
+  # It parses into the same syntax tree as Sass,
+  # and generates the same sort of output CSS.
+  #
+  # This module contains code for the parsing of SCSS.
+  # The evaluation is handled by the broader {Sass} module.
+  module SCSS; end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/css_parser.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/css_parser.rb
new file mode 100644
index 0000000..f4592ea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/css_parser.rb
@@ -0,0 +1,56 @@
+require 'sass/script/css_parser'
+
+module Sass
+  module SCSS
+    # This is a subclass of {Parser} which only parses plain CSS.
+    # It doesn't support any Sass extensions, such as interpolation,
+    # parent references, nested selectors, and so forth.
+    # It does support all the same CSS hacks as the SCSS parser, though.
+    class CssParser < StaticParser
+      private
+
+      def placeholder_selector; nil; end
+      def parent_selector; nil; end
+      def interpolation(warn_for_color = false); nil; end
+      def use_css_import?; true; end
+
+      def block_contents(node, context)
+        if node.is_a?(Sass::Tree::DirectiveNode) && node.normalized_name == '@keyframes'
+          context = :keyframes
+        end
+        super(node, context)
+      end
+
+      def block_child(context)
+        case context
+        when :ruleset
+          declaration
+        when :stylesheet
+          directive || ruleset
+        when :directive
+          directive || declaration_or_ruleset
+        when :keyframes
+          keyframes_ruleset
+        end
+      end
+
+      def nested_properties!(node)
+        expected('expression (e.g. 1px, bold)')
+      end
+
+      def ruleset
+        start_pos = source_position
+        return unless (selector = selector_comma_sequence)
+        block(node(Sass::Tree::RuleNode.new(selector, range(start_pos)), start_pos), :ruleset)
+      end
+
+      def keyframes_ruleset
+        start_pos = source_position
+        return unless (selector = keyframes_selector)
+        block(node(Sass::Tree::KeyframeRuleNode.new(selector.strip), start_pos), :ruleset)
+      end
+
+      @sass_script_parser = Sass::Script::CssParser
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/parser.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/parser.rb
new file mode 100644
index 0000000..559266b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/parser.rb
@@ -0,0 +1,1313 @@
+# -*- coding: utf-8 -*-
+require 'set'
+
+module Sass
+  module SCSS
+    # The parser for SCSS.
+    # It parses a string of code into a tree of {Sass::Tree::Node}s.
+    class Parser
+      # Expose for the SASS parser.
+      attr_accessor :offset
+
+      # @param str [String, StringScanner] The source document to parse.
+      #   Note that `Parser` *won't* raise a nice error message if this isn't properly parsed;
+      #   for that, you should use the higher-level {Sass::Engine} or {Sass::CSS}.
+      # @param filename [String] The name of the file being parsed. Used for
+      #   warnings and source maps.
+      # @param importer [Sass::Importers::Base] The importer used to import the
+      #   file being parsed. Used for source maps.
+      # @param line [Integer] The 1-based line on which the source string appeared,
+      #   if it's part of another document.
+      # @param offset [Integer] The 1-based character (not byte) offset in the line on
+      #   which the source string starts. Used for error reporting and sourcemap
+      #   building.
+      def initialize(str, filename, importer, line = 1, offset = 1)
+        @template = str
+        @filename = filename
+        @importer = importer
+        @line = line
+        @offset = offset
+        @strs = []
+        @expected = nil
+        @throw_error = false
+      end
+
+      # Parses an SCSS document.
+      #
+      # @return [Sass::Tree::RootNode] The root node of the document tree
+      # @raise [Sass::SyntaxError] if there's a syntax error in the document
+      def parse
+        init_scanner!
+        root = stylesheet
+        expected("selector or at-rule") unless root && @scanner.eos?
+        root
+      end
+
+      # Parses an identifier with interpolation.
+      # Note that this won't assert that the identifier takes up the entire input string;
+      # it's meant to be used with `StringScanner`s as part of other parsers.
+      #
+      # @return [Array<String, Sass::Script::Tree::Node>, nil]
+      #   The interpolated identifier, or nil if none could be parsed
+      def parse_interp_ident
+        init_scanner!
+        interp_ident
+      end
+
+      # Parses a supports clause for an @import directive
+      def parse_supports_clause
+        init_scanner!
+        ss
+        clause = supports_clause
+        ss
+        clause
+      end
+
+      # Parses a media query list.
+      #
+      # @return [Sass::Media::QueryList] The parsed query list
+      # @raise [Sass::SyntaxError] if there's a syntax error in the query list,
+      #   or if it doesn't take up the entire input string.
+      def parse_media_query_list
+        init_scanner!
+        ql = media_query_list
+        expected("media query list") unless ql && @scanner.eos?
+        ql
+      end
+
+      # Parses an at-root query.
+      #
+      # @return [Array<String, Sass::Script;:Tree::Node>] The interpolated query.
+      # @raise [Sass::SyntaxError] if there's a syntax error in the query,
+      #   or if it doesn't take up the entire input string.
+      def parse_at_root_query
+        init_scanner!
+        query = at_root_query
+        expected("@at-root query list") unless query && @scanner.eos?
+        query
+      end
+
+      # Parses a supports query condition.
+      #
+      # @return [Sass::Supports::Condition] The parsed condition
+      # @raise [Sass::SyntaxError] if there's a syntax error in the condition,
+      #   or if it doesn't take up the entire input string.
+      def parse_supports_condition
+        init_scanner!
+        condition = supports_condition
+        expected("supports condition") unless condition && @scanner.eos?
+        condition
+      end
+
+      # Parses a custom property value.
+      #
+      # @return [Array<String, Sass::Script;:Tree::Node>] The interpolated value.
+      # @raise [Sass::SyntaxError] if there's a syntax error in the value,
+      #   or if it doesn't take up the entire input string.
+      def parse_declaration_value
+        init_scanner!
+        value = declaration_value
+        expected('"}"') unless value && @scanner.eos?
+        value
+      end
+
+      private
+
+      include Sass::SCSS::RX
+
+      def source_position
+        Sass::Source::Position.new(@line, @offset)
+      end
+
+      def range(start_pos, end_pos = source_position)
+        Sass::Source::Range.new(start_pos, end_pos, @filename, @importer)
+      end
+
+      def init_scanner!
+        @scanner =
+          if @template.is_a?(StringScanner)
+            @template
+          else
+            Sass::Util::MultibyteStringScanner.new(@template.tr("\r", ""))
+          end
+      end
+
+      def stylesheet
+        node = node(Sass::Tree::RootNode.new(@scanner.string), source_position)
+        block_contents(node, :stylesheet) {s(node)}
+      end
+
+      def s(node)
+        while tok(S) || tok(CDC) || tok(CDO) || (c = tok(SINGLE_LINE_COMMENT)) || (c = tok(COMMENT))
+          next unless c
+          process_comment c, node
+          c = nil
+        end
+        true
+      end
+
+      def ss
+        nil while tok(S) || tok(SINGLE_LINE_COMMENT) || tok(COMMENT)
+        true
+      end
+
+      def ss_comments(node)
+        while tok(S) || (c = tok(SINGLE_LINE_COMMENT)) || (c = tok(COMMENT))
+          next unless c
+          process_comment c, node
+          c = nil
+        end
+
+        true
+      end
+
+      def whitespace
+        return unless tok(S) || tok(SINGLE_LINE_COMMENT) || tok(COMMENT)
+        ss
+      end
+
+      def process_comment(text, node)
+        silent = text =~ %r{\A//}
+        loud = !silent && text =~ %r{\A/[/*]!}
+        line = @line - text.count("\n")
+        comment_start = @scanner.pos - text.length
+        index_before_line = @scanner.string.rindex("\n", comment_start) || -1
+        offset = comment_start - index_before_line
+
+        if silent
+          value = [text.sub(%r{\A\s*//}, '/*').gsub(%r{^\s*//}, ' *') + ' */']
+        else
+          value = Sass::Engine.parse_interp(text, line, offset, :filename => @filename)
+          line_before_comment = @scanner.string[index_before_line + 1...comment_start]
+          value.unshift(line_before_comment.gsub(/[^\s]/, ' '))
+        end
+
+        type = if silent
+                 :silent
+               elsif loud
+                 :loud
+               else
+                 :normal
+               end
+        start_pos = Sass::Source::Position.new(line, offset)
+        comment = node(Sass::Tree::CommentNode.new(value, type), start_pos)
+        node << comment
+      end
+
+      DIRECTIVES = Set[:mixin, :include, :function, :return, :debug, :warn, :for,
+        :each, :while, :if, :else, :extend, :import, :media, :charset, :content,
+        :_moz_document, :at_root, :error]
+
+      PREFIXED_DIRECTIVES = Set[:supports]
+
+      def directive
+        start_pos = source_position
+        return unless tok(/@/)
+        name = tok!(IDENT)
+        ss
+
+        if (dir = special_directive(name, start_pos))
+          return dir
+        elsif (dir = prefixed_directive(name, start_pos))
+          return dir
+        end
+
+        val = almost_any_value
+        val = val ? ["@#{name} "] + Sass::Util.strip_string_array(val) : ["@#{name}"]
+        directive_body(val, start_pos)
+      end
+
+      def directive_body(value, start_pos)
+        node = Sass::Tree::DirectiveNode.new(value)
+
+        if tok(/\{/)
+          node.has_children = true
+          block_contents(node, :directive)
+          tok!(/\}/)
+        end
+
+        node(node, start_pos)
+      end
+
+      def special_directive(name, start_pos)
+        sym = name.tr('-', '_').to_sym
+        DIRECTIVES.include?(sym) && send("#{sym}_directive", start_pos)
+      end
+
+      def prefixed_directive(name, start_pos)
+        sym = deprefix(name).tr('-', '_').to_sym
+        PREFIXED_DIRECTIVES.include?(sym) && send("#{sym}_directive", name, start_pos)
+      end
+
+      def mixin_directive(start_pos)
+        name = tok! IDENT
+        args, splat = sass_script(:parse_mixin_definition_arglist)
+        ss
+        block(node(Sass::Tree::MixinDefNode.new(name, args, splat), start_pos), :directive)
+      end
+
+      def include_directive(start_pos)
+        name = tok! IDENT
+        args, keywords, splat, kwarg_splat = sass_script(:parse_mixin_include_arglist)
+        ss
+        include_node = node(
+          Sass::Tree::MixinNode.new(name, args, keywords, splat, kwarg_splat), start_pos)
+        if tok?(/\{/)
+          include_node.has_children = true
+          block(include_node, :directive)
+        else
+          include_node
+        end
+      end
+
+      def content_directive(start_pos)
+        ss
+        node(Sass::Tree::ContentNode.new, start_pos)
+      end
+
+      def function_directive(start_pos)
+        name = tok! IDENT
+        args, splat = sass_script(:parse_function_definition_arglist)
+        ss
+        block(node(Sass::Tree::FunctionNode.new(name, args, splat), start_pos), :function)
+      end
+
+      def return_directive(start_pos)
+        node(Sass::Tree::ReturnNode.new(sass_script(:parse)), start_pos)
+      end
+
+      def debug_directive(start_pos)
+        node(Sass::Tree::DebugNode.new(sass_script(:parse)), start_pos)
+      end
+
+      def warn_directive(start_pos)
+        node(Sass::Tree::WarnNode.new(sass_script(:parse)), start_pos)
+      end
+
+      def for_directive(start_pos)
+        tok!(/\$/)
+        var = tok! IDENT
+        ss
+
+        tok!(/from/)
+        from = sass_script(:parse_until, Set["to", "through"])
+        ss
+
+        @expected = '"to" or "through"'
+        exclusive = (tok(/to/) || tok!(/through/)) == 'to'
+        to = sass_script(:parse)
+        ss
+
+        block(node(Sass::Tree::ForNode.new(var, from, to, exclusive), start_pos), :directive)
+      end
+
+      def each_directive(start_pos)
+        tok!(/\$/)
+        vars = [tok!(IDENT)]
+        ss
+        while tok(/,/)
+          ss
+          tok!(/\$/)
+          vars << tok!(IDENT)
+          ss
+        end
+
+        tok!(/in/)
+        list = sass_script(:parse)
+        ss
+
+        block(node(Sass::Tree::EachNode.new(vars, list), start_pos), :directive)
+      end
+
+      def while_directive(start_pos)
+        expr = sass_script(:parse)
+        ss
+        block(node(Sass::Tree::WhileNode.new(expr), start_pos), :directive)
+      end
+
+      def if_directive(start_pos)
+        expr = sass_script(:parse)
+        ss
+        node = block(node(Sass::Tree::IfNode.new(expr), start_pos), :directive)
+        pos = @scanner.pos
+        line = @line
+        ss
+
+        else_block(node) ||
+          begin
+            # Backtrack in case there are any comments we want to parse
+            @scanner.pos = pos
+            @line = line
+            node
+          end
+      end
+
+      def else_block(node)
+        start_pos = source_position
+        return unless tok(/@else/)
+        ss
+        else_node = block(
+          node(Sass::Tree::IfNode.new((sass_script(:parse) if tok(/if/))), start_pos),
+          :directive)
+        node.add_else(else_node)
+        pos = @scanner.pos
+        line = @line
+        ss
+
+        else_block(node) ||
+          begin
+            # Backtrack in case there are any comments we want to parse
+            @scanner.pos = pos
+            @line = line
+            node
+          end
+      end
+
+      def else_directive(start_pos)
+        err("Invalid CSS: @else must come after @if")
+      end
+
+      def extend_directive(start_pos)
+        selector_start_pos = source_position
+        @expected = "selector"
+        selector = Sass::Util.strip_string_array(expr!(:almost_any_value))
+        optional = tok(OPTIONAL)
+        ss
+        node(Sass::Tree::ExtendNode.new(selector, !!optional, range(selector_start_pos)), start_pos)
+      end
+
+      def import_directive(start_pos)
+        values = []
+
+        loop do
+          values << expr!(:import_arg)
+          break if use_css_import?
+          break unless tok(/,/)
+          ss
+        end
+
+        values
+      end
+
+      def import_arg
+        start_pos = source_position
+        return unless (str = string) || (uri = tok?(/url\(/i))
+        if uri
+          str = sass_script(:parse_string)
+          ss
+          supports = supports_clause
+          ss
+          media = media_query_list
+          ss
+          return node(Tree::CssImportNode.new(str, media.to_a, supports), start_pos)
+        end
+        ss
+
+        supports = supports_clause
+        ss
+        media = media_query_list
+        if str =~ %r{^(https?:)?//} || media || supports || use_css_import?
+          return node(
+            Sass::Tree::CssImportNode.new(
+              Sass::Script::Value::String.quote(str), media.to_a, supports), start_pos)
+        end
+
+        node(Sass::Tree::ImportNode.new(str.strip), start_pos)
+      end
+
+      def use_css_import?; false; end
+
+      def media_directive(start_pos)
+        block(node(Sass::Tree::MediaNode.new(expr!(:media_query_list).to_a), start_pos), :directive)
+      end
+
+      # http://www.w3.org/TR/css3-mediaqueries/#syntax
+      def media_query_list
+        query = media_query
+        return unless query
+        queries = [query]
+
+        ss
+        while tok(/,/)
+          ss; queries << expr!(:media_query)
+        end
+        ss
+
+        Sass::Media::QueryList.new(queries)
+      end
+
+      def media_query
+        if (ident1 = interp_ident)
+          ss
+          ident2 = interp_ident
+          ss
+          if ident2 && ident2.length == 1 && ident2[0].is_a?(String) && ident2[0].downcase == 'and'
+            query = Sass::Media::Query.new([], ident1, [])
+          else
+            if ident2
+              query = Sass::Media::Query.new(ident1, ident2, [])
+            else
+              query = Sass::Media::Query.new([], ident1, [])
+            end
+            return query unless tok(/and/i)
+            ss
+          end
+        end
+
+        if query
+          expr = expr!(:media_expr)
+        else
+          expr = media_expr
+          return unless expr
+        end
+        query ||= Sass::Media::Query.new([], [], [])
+        query.expressions << expr
+
+        ss
+        while tok(/and/i)
+          ss; query.expressions << expr!(:media_expr)
+        end
+
+        query
+      end
+
+      def query_expr
+        interp = interpolation
+        return interp if interp
+        return unless tok(/\(/)
+        res = ['(']
+        ss
+        res << sass_script(:parse)
+
+        if tok(/:/)
+          res << ': '
+          ss
+          res << sass_script(:parse)
+        end
+        res << tok!(/\)/)
+        ss
+        res
+      end
+
+      # Aliases allow us to use different descriptions if the same
+      # expression fails in different contexts.
+      alias_method :media_expr, :query_expr
+      alias_method :at_root_query, :query_expr
+
+      def charset_directive(start_pos)
+        name = expr!(:string)
+        ss
+        node(Sass::Tree::CharsetNode.new(name), start_pos)
+      end
+
+      # The document directive is specified in
+      # http://www.w3.org/TR/css3-conditional/, but Gecko allows the
+      # `url-prefix` and `domain` functions to omit quotation marks, contrary to
+      # the standard.
+      #
+      # We could parse all document directives according to Mozilla's syntax,
+      # but if someone's using e.g. @-webkit-document we don't want them to
+      # think WebKit works sans quotes.
+      def _moz_document_directive(start_pos)
+        res = ["@-moz-document "]
+        loop do
+          res << str {ss} << expr!(:moz_document_function)
+          if (c = tok(/,/))
+            res << c
+          else
+            break
+          end
+        end
+        directive_body(res.flatten, start_pos)
+      end
+
+      def moz_document_function
+        val = interp_uri || _interp_string(:url_prefix) ||
+          _interp_string(:domain) || function(false) || interpolation
+        return unless val
+        ss
+        val
+      end
+
+      def at_root_directive(start_pos)
+        if tok?(/\(/) && (expr = at_root_query)
+          return block(node(Sass::Tree::AtRootNode.new(expr), start_pos), :directive)
+        end
+
+        at_root_node = node(Sass::Tree::AtRootNode.new, start_pos)
+        rule_node = ruleset
+        return block(at_root_node, :stylesheet) unless rule_node
+        at_root_node << rule_node
+        at_root_node
+      end
+
+      def at_root_directive_list
+        return unless (first = tok(IDENT))
+        arr = [first]
+        ss
+        while (e = tok(IDENT))
+          arr << e
+          ss
+        end
+        arr
+      end
+
+      def error_directive(start_pos)
+        node(Sass::Tree::ErrorNode.new(sass_script(:parse)), start_pos)
+      end
+
+      # http://www.w3.org/TR/css3-conditional/
+      def supports_directive(name, start_pos)
+        condition = expr!(:supports_condition)
+        node = Sass::Tree::SupportsNode.new(name, condition)
+
+        tok!(/\{/)
+        node.has_children = true
+        block_contents(node, :directive)
+        tok!(/\}/)
+
+        node(node, start_pos)
+      end
+
+      def supports_clause
+        return unless tok(/supports\(/i)
+        ss
+        supports = import_supports_condition
+        ss
+        tok!(/\)/)
+        supports
+      end
+
+      def supports_condition
+        supports_negation || supports_operator || supports_interpolation
+      end
+
+      def import_supports_condition
+        supports_condition || supports_declaration
+      end
+
+      def supports_negation
+        return unless tok(/not/i)
+        ss
+        Sass::Supports::Negation.new(expr!(:supports_condition_in_parens))
+      end
+
+      def supports_operator
+        cond = supports_condition_in_parens
+        return unless cond
+        re = /and|or/i
+        while (op = tok(re))
+          re = /#{op}/i
+          ss
+          cond = Sass::Supports::Operator.new(
+            cond, expr!(:supports_condition_in_parens), op)
+        end
+        cond
+      end
+
+      def supports_declaration
+          name = sass_script(:parse)
+          tok!(/:/); ss
+          value = sass_script(:parse)
+          Sass::Supports::Declaration.new(name, value)
+      end
+
+      def supports_condition_in_parens
+        interp = supports_interpolation
+        return interp if interp
+        return unless tok(/\(/); ss
+        if (cond = supports_condition)
+          tok!(/\)/); ss
+          cond
+        else
+          decl = supports_declaration
+          tok!(/\)/); ss
+          decl
+        end
+      end
+
+      def supports_interpolation
+        interp = interpolation
+        return unless interp
+        ss
+        Sass::Supports::Interpolation.new(interp)
+      end
+
+      def variable
+        return unless tok(/\$/)
+        start_pos = source_position
+        name = tok!(IDENT)
+        ss; tok!(/:/); ss
+
+        expr = sass_script(:parse)
+        while tok(/!/)
+          flag_name = tok!(IDENT)
+          if flag_name == 'default'
+            guarded ||= true
+          elsif flag_name == 'global'
+            global ||= true
+          else
+            raise Sass::SyntaxError.new("Invalid flag \"!#{flag_name}\".", :line => @line)
+          end
+          ss
+        end
+
+        result = Sass::Tree::VariableNode.new(name, expr, guarded, global)
+        node(result, start_pos)
+      end
+
+      def operator
+        # Many of these operators (all except / and ,)
+        # are disallowed by the CSS spec,
+        # but they're included here for compatibility
+        # with some proprietary MS properties
+        str {ss if tok(%r{[/,:.=]})}
+      end
+
+      def ruleset
+        start_pos = source_position
+        return unless (rules = almost_any_value)
+        block(
+          node(
+            Sass::Tree::RuleNode.new(rules, range(start_pos)), start_pos), :ruleset)
+      end
+
+      def block(node, context)
+        node.has_children = true
+        tok!(/\{/)
+        block_contents(node, context)
+        tok!(/\}/)
+        node
+      end
+
+      # A block may contain declarations and/or rulesets
+      def block_contents(node, context)
+        block_given? ? yield : ss_comments(node)
+        node << (child = block_child(context))
+        while tok(/;/) || has_children?(child)
+          block_given? ? yield : ss_comments(node)
+          node << (child = block_child(context))
+        end
+        node
+      end
+
+      def block_child(context)
+        return variable || directive if context == :function
+        return variable || directive || ruleset if context == :stylesheet
+        variable || directive || declaration_or_ruleset
+      end
+
+      def has_children?(child_or_array)
+        return false unless child_or_array
+        return child_or_array.last.has_children if child_or_array.is_a?(Array)
+        child_or_array.has_children
+      end
+
+      # When parsing the contents of a ruleset, it can be difficult to tell
+      # declarations apart from nested rulesets. Since we don't thoroughly parse
+      # selectors until after resolving interpolation, we can share a bunch of
+      # the parsing of the two, but we need to disambiguate them first. We use
+      # the following criteria:
+      #
+      # * If the entity doesn't start with an identifier followed by a colon,
+      #   it's a selector. There are some additional mostly-unimportant cases
+      #   here to support various declaration hacks.
+      #
+      # * If the colon is followed by another colon, it's a selector.
+      #
+      # * Otherwise, if the colon is followed by anything other than
+      #   interpolation or a character that's valid as the beginning of an
+      #   identifier, it's a declaration.
+      #
+      # * If the colon is followed by interpolation or a valid identifier, try
+      #   parsing it as a declaration value. If this fails, backtrack and parse
+      #   it as a selector.
+      #
+      # * If the declaration value value valid but is followed by "{", backtrack
+      #   and parse it as a selector anyway. This ensures that ".foo:bar {" is
+      #   always parsed as a selector and never as a property with nested
+      #   properties beneath it.
+      def declaration_or_ruleset
+        start_pos = source_position
+        declaration = try_declaration
+
+        if declaration.nil?
+          return unless (selector = almost_any_value)
+        elsif declaration.is_a?(Array)
+          selector = declaration
+        else
+          # Declaration should be a PropNode.
+          return declaration
+        end
+
+        if (additional_selector = almost_any_value)
+          selector << additional_selector
+        end
+
+        block(
+          node(
+            Sass::Tree::RuleNode.new(merge(selector), range(start_pos)), start_pos), :ruleset)
+      end
+
+      # Tries to parse a declaration, and returns the value parsed so far if it
+      # fails.
+      #
+      # This has three possible return types. It can return `nil`, indicating
+      # that parsing failed completely and the scanner hasn't moved forward at
+      # all. It can return an Array, indicating that parsing failed after
+      # consuming some text (possibly containing interpolation), which is
+      # returned. Or it can return a PropNode, indicating that parsing
+      # succeeded.
+      def try_declaration
+        # This allows the "*prop: val", ":prop: val", "#prop: val", and ".prop:
+        # val" hacks.
+        name_start_pos = source_position
+        if (s = tok(/[:\*\.]|\#(?!\{)/))
+          name = [s, str {ss}]
+          return name unless (ident = interp_ident)
+          name << ident
+        else
+          return unless (name = interp_ident)
+          name = Array(name)
+        end
+
+        if (comment = tok(COMMENT))
+          name << comment
+        end
+        name_end_pos = source_position
+
+        mid = [str {ss}]
+        return name + mid unless tok(/:/)
+        mid << ':'
+
+        # If this is a CSS variable, parse it as a property no matter what.
+        if name.first.is_a?(String) && name.first.start_with?("--")
+          return css_variable_declaration(name, name_start_pos, name_end_pos)
+        end
+
+        return name + mid + [':'] if tok(/:/)
+        mid << str {ss}
+        post_colon_whitespace = !mid.last.empty?
+        could_be_selector = !post_colon_whitespace && (tok?(IDENT_START) || tok?(INTERP_START))
+
+        value_start_pos = source_position
+        value = nil
+        error = catch_error do
+          value = value!
+          if tok?(/\{/)
+            # Properties that are ambiguous with selectors can't have additional
+            # properties nested beneath them.
+            tok!(/;/) if could_be_selector
+          elsif !tok?(/[;{}]/)
+            # We want an exception if there's no valid end-of-property character
+            # exists, but we don't want to consume it if it does.
+            tok!(/[;{}]/)
+          end
+        end
+
+        if error
+          rethrow error unless could_be_selector
+
+          # If the value would be followed by a semicolon, it's definitely
+          # supposed to be a property, not a selector.
+          additional_selector = almost_any_value
+          rethrow error if tok?(/;/)
+
+          return name + mid + (additional_selector || [])
+        end
+
+        value_end_pos = source_position
+        ss
+        require_block = tok?(/\{/)
+
+        node = node(Sass::Tree::PropNode.new(name.flatten.compact, [value], :new),
+                    name_start_pos, value_end_pos)
+        node.name_source_range = range(name_start_pos, name_end_pos)
+        node.value_source_range = range(value_start_pos, value_end_pos)
+
+        return node unless require_block
+        nested_properties! node
+      end
+
+      def css_variable_declaration(name, name_start_pos, name_end_pos)
+        value_start_pos = source_position
+        value = declaration_value
+        value_end_pos = source_position
+
+        node = node(Sass::Tree::PropNode.new(name.flatten.compact, value, :new),
+                    name_start_pos, value_end_pos)
+        node.name_source_range = range(name_start_pos, name_end_pos)
+        node.value_source_range = range(value_start_pos, value_end_pos)
+        node
+      end
+
+      # This production consumes values that could be a selector, an expression,
+      # or a combination of both. It respects strings and comments and supports
+      # interpolation. It will consume up to "{", "}", ";", or "!".
+      #
+      # Values consumed by this production will usually be parsed more
+      # thoroughly once interpolation has been resolved.
+      def almost_any_value
+        return unless (tok = almost_any_value_token)
+        sel = [tok]
+        while (tok = almost_any_value_token)
+          sel << tok
+        end
+        merge(sel)
+      end
+
+      def almost_any_value_token
+        tok(%r{
+          (
+            \\.
+          |
+            (?!url\()
+            [^"'/\#!;\{\}] # "
+          |
+            # interp_uri will handle most url() calls, but not ones that take strings
+            url\(#{W}(?=")
+          |
+            /(?![/*])
+          |
+            \#(?!\{)
+          |
+            !(?![a-z]) # TODO: never consume "!" when issue 1126 is fixed.
+          )+
+        }xi) || tok(COMMENT) || tok(SINGLE_LINE_COMMENT) || interp_string || interp_uri ||
+                interpolation(:warn_for_color)
+      end
+
+      def declaration_value(top_level: true)
+        return unless (tok = declaration_value_token(top_level))
+        value = [tok]
+        while (tok = declaration_value_token(top_level))
+          value << tok
+        end
+        merge(value)
+      end
+
+      def declaration_value_token(top_level)
+        # This comes, more or less, from the [token consumption algorithm][].
+        # However, since we don't have to worry about the token semantics, we
+        # just consume everything until we come across a token with special
+        # semantics.
+        #
+        # [token consumption algorithm]: https://drafts.csswg.org/css-syntax-3/#consume-token.
+        result = tok(%r{
+          (
+            (?!
+              url\(
+            )
+            [^()\[\]{}"'#/ \t\r\n\f#{top_level ? ";!" : ""}]
+          |
+            \#(?!\{)
+          |
+            /(?!\*)
+          )+
+        }xi) || interp_string || interp_uri || interpolation || tok(COMMENT)
+        return result if result
+
+        # Fold together multiple characters of whitespace that don't include
+        # newlines. The value only cares about the tokenization, so this is safe
+        # as long as we don't delete whitespace entirely. It's important that we
+        # fold here rather than post-processing, since we aren't allowed to fold
+        # whitespace within strings and we lose that context later on.
+        if (ws = tok(S))
+          return ws.include?("\n") ? ws.gsub(/\A[^\n]*/, '') : ' '
+        end
+
+        if tok(/\(/)
+          value = declaration_value(top_level: false)
+          tok!(/\)/)
+          ['(', *value, ')']
+        elsif tok(/\[/)
+          value = declaration_value(top_level: false)
+          tok!(/\]/)
+          ['[', *value, ']']
+        elsif tok(/\{/)
+          value = declaration_value(top_level: false)
+          tok!(/\}/)
+          ['{', *value, '}']
+        end
+      end
+
+      def declaration
+        # This allows the "*prop: val", ":prop: val", "#prop: val", and ".prop:
+        # val" hacks.
+        name_start_pos = source_position
+        if (s = tok(/[:\*\.]|\#(?!\{)/))
+          name = [s, str {ss}, *expr!(:interp_ident)]
+        else
+          return unless (name = interp_ident)
+          name = Array(name)
+        end
+
+        if (comment = tok(COMMENT))
+          name << comment
+        end
+        name_end_pos = source_position
+        ss
+
+        tok!(/:/)
+        ss
+        value_start_pos = source_position
+        value = value!
+        value_end_pos = source_position
+        ss
+        require_block = tok?(/\{/)
+
+        node = node(Sass::Tree::PropNode.new(name.flatten.compact, [value], :new),
+                    name_start_pos, value_end_pos)
+        node.name_source_range = range(name_start_pos, name_end_pos)
+        node.value_source_range = range(value_start_pos, value_end_pos)
+
+        return node unless require_block
+        nested_properties! node
+      end
+
+      def value!
+        if tok?(/\{/)
+          str = Sass::Script::Tree::Literal.new(Sass::Script::Value::String.new(""))
+          str.line = source_position.line
+          str.source_range = range(source_position)
+          return str
+        end
+
+        start_pos = source_position
+        # This is a bit of a dirty trick:
+        # if the value is completely static,
+        # we don't parse it at all, and instead return a plain old string
+        # containing the value.
+        # This results in a dramatic speed increase.
+        if (val = tok(STATIC_VALUE))
+          str = Sass::Script::Tree::Literal.new(Sass::Script::Value::String.new(val.strip))
+          str.line = start_pos.line
+          str.source_range = range(start_pos)
+          return str
+        end
+        sass_script(:parse)
+      end
+
+      def nested_properties!(node)
+        @expected = 'expression (e.g. 1px, bold) or "{"'
+        block(node, :property)
+      end
+
+      def expr(allow_var = true)
+        t = term(allow_var)
+        return unless t
+        res = [t, str {ss}]
+
+        while (o = operator) && (t = term(allow_var))
+          res << o << t << str {ss}
+        end
+
+        res.flatten
+      end
+
+      def term(allow_var)
+        e = tok(NUMBER) ||
+            interp_uri ||
+            function(allow_var) ||
+            interp_string ||
+            tok(UNICODERANGE) ||
+            interp_ident ||
+            tok(HEXCOLOR) ||
+            (allow_var && var_expr)
+        return e if e
+
+        op = tok(/[+-]/)
+        return unless op
+        @expected = "number or function"
+        [op,
+         tok(NUMBER) || function(allow_var) || (allow_var && var_expr) || expr!(:interpolation)]
+      end
+
+      def function(allow_var)
+        name = tok(FUNCTION)
+        return unless name
+        if name == "expression(" || name == "calc("
+          str, _ = Sass::Shared.balance(@scanner, ?(, ?), 1)
+          [name, str]
+        else
+          [name, str {ss}, expr(allow_var), tok!(/\)/)]
+        end
+      end
+
+      def var_expr
+        return unless tok(/\$/)
+        line = @line
+        var = Sass::Script::Tree::Variable.new(tok!(IDENT))
+        var.line = line
+        var
+      end
+
+      def interpolation(warn_for_color = false)
+        return unless tok(INTERP_START)
+        sass_script(:parse_interpolated, warn_for_color)
+      end
+
+      def string
+        return unless tok(STRING)
+        Sass::Script::Value::String.value(@scanner[1] || @scanner[2])
+      end
+
+      def interp_string
+        _interp_string(:double) || _interp_string(:single)
+      end
+
+      def interp_uri
+        _interp_string(:uri)
+      end
+
+      def _interp_string(type)
+        start = tok(Sass::Script::Lexer::STRING_REGULAR_EXPRESSIONS[type][false])
+        return unless start
+        res = [start]
+
+        mid_re = Sass::Script::Lexer::STRING_REGULAR_EXPRESSIONS[type][true]
+        # @scanner[2].empty? means we've started an interpolated section
+        while @scanner[2] == '#{'
+          @scanner.pos -= 2 # Don't consume the #{
+          res.last.slice!(-2..-1)
+          res << expr!(:interpolation) << tok(mid_re)
+        end
+        res
+      end
+
+      def interp_ident(start = IDENT)
+        val = tok(start) || interpolation(:warn_for_color) || tok(IDENT_HYPHEN_INTERP)
+        return unless val
+        res = [val]
+        while (val = tok(NAME) || interpolation(:warn_for_color))
+          res << val
+        end
+        res
+      end
+
+      def interp_ident_or_var
+        id = interp_ident
+        return id if id
+        var = var_expr
+        return [var] if var
+      end
+
+      def str
+        @strs.push String.new("")
+        yield
+        @strs.last
+      ensure
+        @strs.pop
+      end
+
+      def str?
+        pos = @scanner.pos
+        line = @line
+        offset = @offset
+        @strs.push ""
+        throw_error {yield} && @strs.last
+      rescue Sass::SyntaxError
+        @scanner.pos = pos
+        @line = line
+        @offset = offset
+        nil
+      ensure
+        @strs.pop
+      end
+
+      def node(node, start_pos, end_pos = source_position)
+        node.line = start_pos.line
+        node.source_range = range(start_pos, end_pos)
+        node
+      end
+
+      @sass_script_parser = Sass::Script::Parser
+
+      class << self
+        # @private
+        attr_accessor :sass_script_parser
+      end
+
+      def sass_script(*args)
+        parser = self.class.sass_script_parser.new(@scanner, @line, @offset,
+          :filename => @filename, :importer => @importer, :allow_extra_text => true)
+        result = parser.send(*args)
+        unless @strs.empty?
+          # Convert to CSS manually so that comments are ignored.
+          src = result.to_sass
+          @strs.each {|s| s << src}
+        end
+        @line = parser.line
+        @offset = parser.offset
+        result
+      rescue Sass::SyntaxError => e
+        throw(:_sass_parser_error, true) if @throw_error
+        raise e
+      end
+
+      def merge(arr)
+        arr && Sass::Util.merge_adjacent_strings([arr].flatten)
+      end
+
+      EXPR_NAMES = {
+        :media_query => "media query (e.g. print, screen, print and screen)",
+        :media_query_list => "media query (e.g. print, screen, print and screen)",
+        :media_expr => "media expression (e.g. (min-device-width: 800px))",
+        :at_root_query => "@at-root query (e.g. (without: media))",
+        :at_root_directive_list => '* or identifier',
+        :declaration_value => "expression (e.g. fr, 2n+1)",
+        :interp_ident => "identifier",
+        :qualified_name => "identifier",
+        :expr => "expression (e.g. 1px, bold)",
+        :selector_comma_sequence => "selector",
+        :string => "string",
+        :import_arg => "file to import (string or url())",
+        :moz_document_function => "matching function (e.g. url-prefix(), domain())",
+        :supports_condition => "@supports condition (e.g. (display: flexbox))",
+        :supports_condition_in_parens => "@supports condition (e.g. (display: flexbox))",
+        :a_n_plus_b => "An+B expression",
+        :keyframes_selector_component => "from, to, or a percentage",
+        :keyframes_selector => "keyframes selector (e.g. 10%)"
+      }
+
+      TOK_NAMES = Hash[Sass::SCSS::RX.constants.map do |c|
+        [Sass::SCSS::RX.const_get(c), c.downcase]
+      end].merge(
+        IDENT => "identifier",
+        /[;{}]/ => '";"',
+        /\b(without|with)\b/ => '"with" or "without"'
+      )
+
+      def tok?(rx)
+        @scanner.match?(rx)
+      end
+
+      def expr!(name)
+        e = send(name)
+        return e if e
+        expected(EXPR_NAMES[name] || name.to_s)
+      end
+
+      def tok!(rx)
+        t = tok(rx)
+        return t if t
+        name = TOK_NAMES[rx]
+
+        unless name
+          # Display basic regexps as plain old strings
+          source = rx.source.gsub(%r{\\/}, '/')
+          string = rx.source.gsub(/\\(.)/, '\1')
+          name = source == Regexp.escape(string) ? string.inspect : rx.inspect
+        end
+
+        expected(name)
+      end
+
+      def expected(name)
+        throw(:_sass_parser_error, true) if @throw_error
+        self.class.expected(@scanner, @expected || name, @line)
+      end
+
+      def err(msg)
+        throw(:_sass_parser_error, true) if @throw_error
+        raise Sass::SyntaxError.new(msg, :line => @line)
+      end
+
+      def throw_error
+        old_throw_error, @throw_error = @throw_error, false
+        yield
+      ensure
+        @throw_error = old_throw_error
+      end
+
+      def catch_error(&block)
+        old_throw_error, @throw_error = @throw_error, true
+        pos = @scanner.pos
+        line = @line
+        offset = @offset
+        expected = @expected
+
+        logger = Sass::Logger::Delayed.install!
+        if catch(:_sass_parser_error) {yield; false}
+          @scanner.pos = pos
+          @line = line
+          @offset = offset
+          @expected = expected
+          {:pos => pos, :line => line, :expected => @expected, :block => block}
+        else
+          logger.flush
+          nil
+        end
+      ensure
+        logger.uninstall! if logger
+        @throw_error = old_throw_error
+      end
+
+      def rethrow(err)
+        if @throw_error
+          throw :_sass_parser_error, err
+        else
+          @scanner = Sass::Util::MultibyteStringScanner.new(@scanner.string)
+          @scanner.pos = err[:pos]
+          @line = err[:line]
+          @expected = err[:expected]
+          err[:block].call
+        end
+      end
+
+      # @private
+      def self.expected(scanner, expected, line)
+        pos = scanner.pos
+
+        after = scanner.string[0...pos]
+        # Get rid of whitespace between pos and the last token,
+        # but only if there's a newline in there
+        after.gsub!(/\s*\n\s*$/, '')
+        # Also get rid of stuff before the last newline
+        after.gsub!(/.*\n/, '')
+        after = "..." + after[-15..-1] if after.size > 18
+
+        was = scanner.rest.dup
+        # Get rid of whitespace between pos and the next token,
+        # but only if there's a newline in there
+        was.gsub!(/^\s*\n\s*/, '')
+        # Also get rid of stuff after the next newline
+        was.gsub!(/\n.*/, '')
+        was = was[0...15] + "..." if was.size > 18
+
+        raise Sass::SyntaxError.new(
+          "Invalid CSS after \"#{after}\": expected #{expected}, was \"#{was}\"",
+          :line => line)
+      end
+
+      # Avoid allocating lots of new strings for `#tok`.
+      # This is important because `#tok` is called all the time.
+      NEWLINE = "\n"
+
+      def tok(rx)
+        res = @scanner.scan(rx)
+
+        return unless res
+
+        newline_count = res.count(NEWLINE)
+        if newline_count > 0
+          @line += newline_count
+          @offset = res[res.rindex(NEWLINE)..-1].size
+        else
+          @offset += res.size
+        end
+
+        @expected = nil
+        if !@strs.empty? && rx != COMMENT && rx != SINGLE_LINE_COMMENT
+          @strs.each {|s| s << res}
+        end
+        res
+      end
+
+      # Remove a vendor prefix from `str`.
+      def deprefix(str)
+        str.gsub(/^-[a-zA-Z0-9]+-/, '')
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/rx.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/rx.rb
new file mode 100644
index 0000000..2c48a77
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/rx.rb
@@ -0,0 +1,134 @@
+# -*- coding: utf-8 -*-
+module Sass
+  module SCSS
+    # A module containing regular expressions used
+    # for lexing tokens in an SCSS document.
+    # Most of these are taken from [the CSS3 spec](http://www.w3.org/TR/css3-syntax/#lexical),
+    # although some have been modified for various reasons.
+    module RX
+      # Takes a string and returns a CSS identifier
+      # that will have the value of the given string.
+      #
+      # @param str [String] The string to escape
+      # @return [String] The escaped string
+      def self.escape_ident(str)
+        return "" if str.empty?
+        return "\\#{str}" if str == '-' || str == '_'
+        out = ""
+        value = str.dup
+        out << value.slice!(0...1) if value =~ /^[-_]/
+        if value[0...1] =~ NMSTART
+          out << value.slice!(0...1)
+        else
+          out << escape_char(value.slice!(0...1))
+        end
+        out << value.gsub(/[^a-zA-Z0-9_-]/) {|c| escape_char c}
+        out
+      end
+
+      # Escapes a single character for a CSS identifier.
+      #
+      # @param c [String] The character to escape. Should have length 1
+      # @return [String] The escaped character
+      # @private
+      def self.escape_char(c)
+        return "\\%06x" % c.ord unless c =~ %r{[ -/:-~]}
+        "\\#{c}"
+      end
+
+      # Creates a Regexp from a plain text string,
+      # escaping all significant characters.
+      #
+      # @param str [String] The text of the regexp
+      # @param flags [Integer] Flags for the created regular expression
+      # @return [Regexp]
+      # @private
+      def self.quote(str, flags = 0)
+        Regexp.new(Regexp.quote(str), flags)
+      end
+
+      H        = /[0-9a-fA-F]/
+      NL       = /\n|\r\n|\r|\f/
+      UNICODE  = /\\#{H}{1,6}[ \t\r\n\f]?/
+      s = '\u{80}-\u{D7FF}\u{E000}-\u{FFFD}\u{10000}-\u{10FFFF}'
+      NONASCII = /[#{s}]/
+      ESCAPE   = /#{UNICODE}|\\[ -~#{s}]/
+      NMSTART  = /[_a-zA-Z]|#{NONASCII}|#{ESCAPE}/
+      NMCHAR   = /[a-zA-Z0-9_-]|#{NONASCII}|#{ESCAPE}/
+      STRING1  = /\"((?:[^\n\r\f\\"]|\\#{NL}|#{ESCAPE})*)\"/
+      STRING2  = /\'((?:[^\n\r\f\\']|\\#{NL}|#{ESCAPE})*)\'/
+
+      IDENT    = /-*#{NMSTART}#{NMCHAR}*/
+      NAME     = /#{NMCHAR}+/
+      STRING   = /#{STRING1}|#{STRING2}/
+      URLCHAR  = /[#%&*-~]|#{NONASCII}|#{ESCAPE}/
+      URL      = /(#{URLCHAR}*)/
+      W        = /[ \t\r\n\f]*/
+      VARIABLE = /(\$)(#{Sass::SCSS::RX::IDENT})/
+
+      # This is more liberal than the spec's definition,
+      # but that definition didn't work well with the greediness rules
+      RANGE    = /(?:#{H}|\?){1,6}/
+
+      ##
+
+      S = /[ \t\r\n\f]+/
+
+      COMMENT = %r{/\*([^*]|\*+[^/*])*\**\*/}
+      SINGLE_LINE_COMMENT = %r{//.*(\n[ \t]*//.*)*}
+
+      CDO            = quote("<!--")
+      CDC            = quote("-->")
+      INCLUDES       = quote("~=")
+      DASHMATCH      = quote("|=")
+      PREFIXMATCH    = quote("^=")
+      SUFFIXMATCH    = quote("$=")
+      SUBSTRINGMATCH = quote("*=")
+
+      HASH = /##{NAME}/
+
+      IMPORTANT = /!#{W}important/i
+
+      # A unit is like an IDENT, but disallows a hyphen followed by a digit.
+      # This allows "1px-2px" to be interpreted as subtraction rather than "1"
+      # with the unit "px-2px". It also allows "%".
+      UNIT = /-?#{NMSTART}(?:[a-zA-Z0-9_]|#{NONASCII}|#{ESCAPE}|-(?!\.?\d))*|%/
+
+      UNITLESS_NUMBER = /(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?\d+)?/
+      NUMBER = /#{UNITLESS_NUMBER}(?:#{UNIT})?/
+      PERCENTAGE = /#{UNITLESS_NUMBER}%/
+
+      URI = /url\(#{W}(?:#{STRING}|#{URL})#{W}\)/i
+      FUNCTION = /#{IDENT}\(/
+
+      UNICODERANGE = /u\+(?:#{H}{1,6}-#{H}{1,6}|#{RANGE})/i
+
+      # Defined in http://www.w3.org/TR/css3-selectors/#lex
+      PLUS = /#{W}\+/
+      GREATER = /#{W}>/
+      TILDE = /#{W}~/
+      NOT = quote(":not(", Regexp::IGNORECASE)
+
+      # Defined in https://developer.mozilla.org/en/CSS/@-moz-document as a
+      # non-standard version of http://www.w3.org/TR/css3-conditional/
+      URL_PREFIX = /url-prefix\(#{W}(?:#{STRING}|#{URL})#{W}\)/i
+      DOMAIN = /domain\(#{W}(?:#{STRING}|#{URL})#{W}\)/i
+
+      # Custom
+      HEXCOLOR = /\#[0-9a-fA-F]+/
+      INTERP_START = /#\{/
+      ANY = /:(-[-\w]+-)?any\(/i
+      OPTIONAL = /!#{W}optional/i
+      IDENT_START = /-|#{NMSTART}/
+
+      IDENT_HYPHEN_INTERP = /-(?=#\{)/
+      STRING1_NOINTERP = /\"((?:[^\n\r\f\\"#]|#(?!\{)|#{ESCAPE})*)\"/
+      STRING2_NOINTERP = /\'((?:[^\n\r\f\\'#]|#(?!\{)|#{ESCAPE})*)\'/
+      STRING_NOINTERP = /#{STRING1_NOINTERP}|#{STRING2_NOINTERP}/
+
+      STATIC_COMPONENT = /#{IDENT}|#{STRING_NOINTERP}|#{HEXCOLOR}|[+-]?#{NUMBER}|\!important/i
+      STATIC_VALUE = %r(#{STATIC_COMPONENT}(\s*[\s,\/]\s*#{STATIC_COMPONENT})*(?=[;}]))i
+      STATIC_SELECTOR = /(#{NMCHAR}|[ \t]|[,>+*]|[:#.]#{NMSTART}){1,50}([{])/i
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/static_parser.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/static_parser.rb
new file mode 100644
index 0000000..99e2797
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/scss/static_parser.rb
@@ -0,0 +1,354 @@
+require 'sass/script/css_parser'
+
+module Sass
+  module SCSS
+    # A parser for a static SCSS tree.
+    # Parses with SCSS extensions, like nested rules and parent selectors,
+    # but without dynamic SassScript.
+    # This is useful for e.g. \{#parse\_selector parsing selectors}
+    # after resolving the interpolation.
+    class StaticParser < Parser
+      # Parses the text as a selector.
+      #
+      # @param filename [String, nil] The file in which the selector appears,
+      #   or nil if there is no such file.
+      #   Used for error reporting.
+      # @return [Selector::CommaSequence] The parsed selector
+      # @raise [Sass::SyntaxError] if there's a syntax error in the selector
+      def parse_selector
+        init_scanner!
+        seq = expr!(:selector_comma_sequence)
+        expected("selector") unless @scanner.eos?
+        seq.line = @line
+        seq.filename = @filename
+        seq
+      end
+
+      # Parses a static at-root query.
+      #
+      # @return [(Symbol, Array<String>)] The type of the query
+      #   (`:with` or `:without`) and the values that are being filtered.
+      # @raise [Sass::SyntaxError] if there's a syntax error in the query,
+      #   or if it doesn't take up the entire input string.
+      def parse_static_at_root_query
+        init_scanner!
+        tok!(/\(/); ss
+        type = tok!(/\b(without|with)\b/).to_sym; ss
+        tok!(/:/); ss
+        directives = expr!(:at_root_directive_list); ss
+        tok!(/\)/)
+        expected("@at-root query list") unless @scanner.eos?
+        return type, directives
+      end
+
+      def parse_keyframes_selector
+        init_scanner!
+        sel = expr!(:keyframes_selector)
+        expected("keyframes selector") unless @scanner.eos?
+        sel
+      end
+
+      # @see Parser#initialize
+      # @param allow_parent_ref [Boolean] Whether to allow the
+      #   parent-reference selector, `&`, when parsing the document.
+      # @comment
+      #   rubocop:disable ParameterLists
+      def initialize(str, filename, importer, line = 1, offset = 1, allow_parent_ref = true)
+        # rubocop:enable ParameterLists
+        super(str, filename, importer, line, offset)
+        @allow_parent_ref = allow_parent_ref
+      end
+
+      private
+
+      def moz_document_function
+        val = tok(URI) || tok(URL_PREFIX) || tok(DOMAIN) || function(false)
+        return unless val
+        ss
+        [val]
+      end
+
+      def variable; nil; end
+      def script_value; nil; end
+      def interpolation(warn_for_color = false); nil; end
+      def var_expr; nil; end
+      def interp_string; (s = tok(STRING)) && [s]; end
+      def interp_uri; (s = tok(URI)) && [s]; end
+      def interp_ident(ident = IDENT); (s = tok(ident)) && [s]; end
+      def use_css_import?; true; end
+
+      def special_directive(name, start_pos)
+        return unless %w(media import charset -moz-document).include?(name)
+        super
+      end
+
+      def selector_comma_sequence
+        sel = selector
+        return unless sel
+        selectors = [sel]
+        ws = ''
+        while tok(/,/)
+          ws << str {ss}
+          next unless (sel = selector)
+          selectors << sel
+          if ws.include?("\n")
+            selectors[-1] = Selector::Sequence.new(["\n"] + selectors.last.members)
+          end
+          ws = ''
+        end
+        Selector::CommaSequence.new(selectors)
+      end
+
+      def selector_string
+        sel = selector
+        return unless sel
+        sel.to_s
+      end
+
+      def selector
+        start_pos = source_position
+        # The combinator here allows the "> E" hack
+        val = combinator || simple_selector_sequence
+        return unless val
+        nl = str {ss}.include?("\n")
+        res = []
+        res << val
+        res << "\n" if nl
+
+        while (val = combinator || simple_selector_sequence)
+          res << val
+          res << "\n" if str {ss}.include?("\n")
+        end
+        seq = Selector::Sequence.new(res.compact)
+
+        if seq.members.any? {|sseq| sseq.is_a?(Selector::SimpleSequence) && sseq.subject?}
+          location = " of #{@filename}" if @filename
+          Sass::Util.sass_warn <<MESSAGE
+DEPRECATION WARNING on line #{start_pos.line}, column #{start_pos.offset}#{location}:
+The subject selector operator "!" is deprecated and will be removed in a future release.
+This operator has been replaced by ":has()" in the CSS spec.
+For example: #{seq.subjectless}
+MESSAGE
+        end
+
+        seq
+      end
+
+      def combinator
+        tok(PLUS) || tok(GREATER) || tok(TILDE) || reference_combinator
+      end
+
+      def reference_combinator
+        return unless tok(%r{/})
+        res = '/'
+        ns, name = expr!(:qualified_name)
+        res << ns << '|' if ns
+        res << name << tok!(%r{/})
+
+        location = " of #{@filename}" if @filename
+        Sass::Util.sass_warn <<MESSAGE
+DEPRECATION WARNING on line #{@line}, column #{@offset}#{location}:
+The reference combinator #{res} is deprecated and will be removed in a future release.
+MESSAGE
+
+        res
+      end
+
+      def simple_selector_sequence
+        start_pos = source_position
+        e = element_name || id_selector || class_selector || placeholder_selector || attrib ||
+            pseudo || parent_selector
+        return unless e
+        res = [e]
+
+        # The tok(/\*/) allows the "E*" hack
+        while (v = id_selector || class_selector || placeholder_selector ||
+                   attrib || pseudo || (tok(/\*/) && Selector::Universal.new(nil)))
+          res << v
+        end
+
+        pos = @scanner.pos
+        line = @line
+        if (sel = str? {simple_selector_sequence})
+          @scanner.pos = pos
+          @line = line
+          begin
+            # If we see "*E", don't force a throw because this could be the
+            # "*prop: val" hack.
+            expected('"{"') if res.length == 1 && res[0].is_a?(Selector::Universal)
+            throw_error {expected('"{"')}
+          rescue Sass::SyntaxError => e
+            e.message << "\n\n\"#{sel}\" may only be used at the beginning of a compound selector."
+            raise e
+          end
+        end
+
+        Selector::SimpleSequence.new(res, tok(/!/), range(start_pos))
+      end
+
+      def parent_selector
+        return unless @allow_parent_ref && tok(/&/)
+        Selector::Parent.new(tok(NAME))
+      end
+
+      def class_selector
+        return unless tok(/\./)
+        @expected = "class name"
+        Selector::Class.new(tok!(IDENT))
+      end
+
+      def id_selector
+        return unless tok(/#(?!\{)/)
+        @expected = "id name"
+        Selector::Id.new(tok!(NAME))
+      end
+
+      def placeholder_selector
+        return unless tok(/%/)
+        @expected = "placeholder name"
+        Selector::Placeholder.new(tok!(IDENT))
+      end
+
+      def element_name
+        ns, name = Sass::Util.destructure(qualified_name(:allow_star_name))
+        return unless ns || name
+
+        if name == '*'
+          Selector::Universal.new(ns)
+        else
+          Selector::Element.new(name, ns)
+        end
+      end
+
+      def qualified_name(allow_star_name = false)
+        name = tok(IDENT) || tok(/\*/) || (tok?(/\|/) && "")
+        return unless name
+        return nil, name unless tok(/\|/)
+
+        return name, tok!(IDENT) unless allow_star_name
+        @expected = "identifier or *"
+        return name, tok(IDENT) || tok!(/\*/)
+      end
+
+      def attrib
+        return unless tok(/\[/)
+        ss
+        ns, name = attrib_name!
+        ss
+
+        op = tok(/=/) ||
+             tok(INCLUDES) ||
+             tok(DASHMATCH) ||
+             tok(PREFIXMATCH) ||
+             tok(SUFFIXMATCH) ||
+             tok(SUBSTRINGMATCH)
+        if op
+          @expected = "identifier or string"
+          ss
+          val = tok(IDENT) || tok!(STRING)
+          ss
+        end
+        flags = tok(IDENT) || tok(STRING)
+        tok!(/\]/)
+
+        Selector::Attribute.new(name, ns, op, val, flags)
+      end
+
+      def attrib_name!
+        if (name_or_ns = tok(IDENT))
+          # E, E|E
+          if tok(/\|(?!=)/)
+            ns = name_or_ns
+            name = tok(IDENT)
+          else
+            name = name_or_ns
+          end
+        else
+          # *|E or |E
+          ns = tok(/\*/) || ""
+          tok!(/\|/)
+          name = tok!(IDENT)
+        end
+        return ns, name
+      end
+
+      SELECTOR_PSEUDO_CLASSES = %w(not matches current any has host host-context).to_set
+
+      PREFIXED_SELECTOR_PSEUDO_CLASSES = %w(nth-child nth-last-child).to_set
+
+      SELECTOR_PSEUDO_ELEMENTS = %w(slotted).to_set
+
+      def pseudo
+        s = tok(/::?/)
+        return unless s
+        @expected = "pseudoclass or pseudoelement"
+        name = tok!(IDENT)
+        if tok(/\(/)
+          ss
+          deprefixed = deprefix(name)
+          if s == ':' && SELECTOR_PSEUDO_CLASSES.include?(deprefixed)
+            sel = selector_comma_sequence
+          elsif s == ':' && PREFIXED_SELECTOR_PSEUDO_CLASSES.include?(deprefixed)
+            arg, sel = prefixed_selector_pseudo
+          elsif s == '::' && SELECTOR_PSEUDO_ELEMENTS.include?(deprefixed)
+            sel = selector_comma_sequence
+          else
+            arg = expr!(:declaration_value).join
+          end
+
+          tok!(/\)/)
+        end
+        Selector::Pseudo.new(s == ':' ? :class : :element, name, arg, sel)
+      end
+
+      def prefixed_selector_pseudo
+        prefix = str do
+          expr = str {expr!(:a_n_plus_b)}
+          ss
+          return expr, nil unless tok(/of/)
+          ss
+        end
+        return prefix, expr!(:selector_comma_sequence)
+      end
+
+      def a_n_plus_b
+        if (parity = tok(/even|odd/i))
+          return parity
+        end
+
+        if tok(/[+-]?[0-9]+/)
+          ss
+          return true unless tok(/n/)
+        else
+          return unless tok(/[+-]?n/i)
+        end
+        ss
+
+        return true unless tok(/[+-]/)
+        ss
+        @expected = "number"
+        tok!(/[0-9]+/)
+        true
+      end
+
+      def keyframes_selector
+        ss
+        str do
+          return unless keyframes_selector_component
+          ss
+          while tok(/,/)
+            ss
+            expr!(:keyframes_selector_component)
+            ss
+          end
+        end
+      end
+
+      def keyframes_selector_component
+        tok(IDENT) || tok(PERCENTAGE)
+      end
+
+      @sass_script_parser = Class.new(Sass::Script::CssParser)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector.rb
new file mode 100644
index 0000000..cac8de4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector.rb
@@ -0,0 +1,327 @@
+require 'sass/selector/simple'
+require 'sass/selector/abstract_sequence'
+require 'sass/selector/comma_sequence'
+require 'sass/selector/pseudo'
+require 'sass/selector/sequence'
+require 'sass/selector/simple_sequence'
+
+module Sass
+  # A namespace for nodes in the parse tree for selectors.
+  #
+  # {CommaSequence} is the toplevel selector,
+  # representing a comma-separated sequence of {Sequence}s,
+  # such as `foo bar, baz bang`.
+  # {Sequence} is the next level,
+  # representing {SimpleSequence}s separated by combinators (e.g. descendant or child),
+  # such as `foo bar` or `foo > bar baz`.
+  # {SimpleSequence} is a sequence of selectors that all apply to a single element,
+  # such as `foo.bar[attr=val]`.
+  # Finally, {Simple} is the superclass of the simplest selectors,
+  # such as `.foo` or `#bar`.
+  module Selector
+    # The base used for calculating selector specificity. The spec says this
+    # should be "sufficiently high"; it's extremely unlikely that any single
+    # selector sequence will contain 1,000 simple selectors.
+    SPECIFICITY_BASE = 1_000
+
+    # A parent-referencing selector (`&` in Sass).
+    # The function of this is to be replaced by the parent selector
+    # in the nested hierarchy.
+    class Parent < Simple
+      # The identifier following the `&`. `nil` indicates no suffix.
+      #
+      # @return [String, nil]
+      attr_reader :suffix
+
+      # @param name [String, nil] See \{#suffix}
+      def initialize(suffix = nil)
+        @suffix = suffix
+      end
+
+      # @see Selector#to_s
+      def to_s(opts = {})
+        "&" + (@suffix || '')
+      end
+
+      # Always raises an exception.
+      #
+      # @raise [Sass::SyntaxError] Parent selectors should be resolved before unification
+      # @see Selector#unify
+      def unify(sels)
+        raise Sass::SyntaxError.new("[BUG] Cannot unify parent selectors.")
+      end
+    end
+
+    # A class selector (e.g. `.foo`).
+    class Class < Simple
+      # The class name.
+      #
+      # @return [String]
+      attr_reader :name
+
+      # @param name [String] The class name
+      def initialize(name)
+        @name = name
+      end
+
+      # @see Selector#to_s
+      def to_s(opts = {})
+        "." + @name
+      end
+
+      # @see AbstractSequence#specificity
+      def specificity
+        SPECIFICITY_BASE
+      end
+    end
+
+    # An id selector (e.g. `#foo`).
+    class Id < Simple
+      # The id name.
+      #
+      # @return [String]
+      attr_reader :name
+
+      # @param name [String] The id name
+      def initialize(name)
+        @name = name
+      end
+
+      def unique?
+        true
+      end
+
+      # @see Selector#to_s
+      def to_s(opts = {})
+        "#" + @name
+      end
+
+      # Returns `nil` if `sels` contains an {Id} selector
+      # with a different name than this one.
+      #
+      # @see Selector#unify
+      def unify(sels)
+        return if sels.any? {|sel2| sel2.is_a?(Id) && name != sel2.name}
+        super
+      end
+
+      # @see AbstractSequence#specificity
+      def specificity
+        SPECIFICITY_BASE**2
+      end
+    end
+
+    # A placeholder selector (e.g. `%foo`).
+    # This exists to be replaced via `@extend`.
+    # Rulesets using this selector will not be printed, but can be extended.
+    # Otherwise, this acts just like a class selector.
+    class Placeholder < Simple
+      # The placeholder name.
+      #
+      # @return [String]
+      attr_reader :name
+
+      # @param name [String] The placeholder name
+      def initialize(name)
+        @name = name
+      end
+
+      # @see Selector#to_s
+      def to_s(opts = {})
+        "%" + @name
+      end
+
+      # @see AbstractSequence#specificity
+      def specificity
+        SPECIFICITY_BASE
+      end
+    end
+
+    # A universal selector (`*` in CSS).
+    class Universal < Simple
+      # The selector namespace. `nil` means the default namespace, `""` means no
+      # namespace, `"*"` means any namespace.
+      #
+      # @return [String, nil]
+      attr_reader :namespace
+
+      # @param namespace [String, nil] See \{#namespace}
+      def initialize(namespace)
+        @namespace = namespace
+      end
+
+      # @see Selector#to_s
+      def to_s(opts = {})
+        @namespace ? "#{@namespace}|*" : "*"
+      end
+
+      # Unification of a universal selector is somewhat complicated,
+      # especially when a namespace is specified.
+      # If there is no namespace specified
+      # or any namespace is specified (namespace `"*"`),
+      # then `sel` is returned without change
+      # (unless it's empty, in which case `"*"` is required).
+      #
+      # If a namespace is specified
+      # but `sel` does not specify a namespace,
+      # then the given namespace is applied to `sel`,
+      # either by adding this {Universal} selector
+      # or applying this namespace to an existing {Element} selector.
+      #
+      # If both this selector *and* `sel` specify namespaces,
+      # those namespaces are unified via {Simple#unify_namespaces}
+      # and the unified namespace is used, if possible.
+      #
+      # @todo There are lots of cases that this documentation specifies;
+      #   make sure we thoroughly test **all of them**.
+      # @todo Keep track of whether a default namespace has been declared
+      #   and handle namespace-unspecified selectors accordingly.
+      # @todo If any branch of a CommaSequence ends up being just `"*"`,
+      #   then all other branches should be eliminated
+      #
+      # @see Selector#unify
+      def unify(sels)
+        name =
+          case sels.first
+          when Universal; :universal
+          when Element; sels.first.name
+          else
+            return [self] + sels unless namespace.nil? || namespace == '*'
+            return sels unless sels.empty?
+            return [self]
+          end
+
+        ns, accept = unify_namespaces(namespace, sels.first.namespace)
+        return unless accept
+        [name == :universal ? Universal.new(ns) : Element.new(name, ns)] + sels[1..-1]
+      end
+
+      # @see AbstractSequence#specificity
+      def specificity
+        0
+      end
+    end
+
+    # An element selector (e.g. `h1`).
+    class Element < Simple
+      # The element name.
+      #
+      # @return [String]
+      attr_reader :name
+
+      # The selector namespace. `nil` means the default namespace, `""` means no
+      # namespace, `"*"` means any namespace.
+      #
+      # @return [String, nil]
+      attr_reader :namespace
+
+      # @param name [String] The element name
+      # @param namespace [String, nil] See \{#namespace}
+      def initialize(name, namespace)
+        @name = name
+        @namespace = namespace
+      end
+
+      # @see Selector#to_s
+      def to_s(opts = {})
+        @namespace ? "#{@namespace}|#{@name}" : @name
+      end
+
+      # Unification of an element selector is somewhat complicated,
+      # especially when a namespace is specified.
+      # First, if `sel` contains another {Element} with a different \{#name},
+      # then the selectors can't be unified and `nil` is returned.
+      #
+      # Otherwise, if `sel` doesn't specify a namespace,
+      # or it specifies any namespace (via `"*"`),
+      # then it's returned with this element selector
+      # (e.g. `.foo` becomes `a.foo` or `svg|a.foo`).
+      # Similarly, if this selector doesn't specify a namespace,
+      # the namespace from `sel` is used.
+      #
+      # If both this selector *and* `sel` specify namespaces,
+      # those namespaces are unified via {Simple#unify_namespaces}
+      # and the unified namespace is used, if possible.
+      #
+      # @todo There are lots of cases that this documentation specifies;
+      #   make sure we thoroughly test **all of them**.
+      # @todo Keep track of whether a default namespace has been declared
+      #   and handle namespace-unspecified selectors accordingly.
+      #
+      # @see Selector#unify
+      def unify(sels)
+        case sels.first
+        when Universal;
+        when Element; return unless name == sels.first.name
+        else return [self] + sels
+        end
+
+        ns, accept = unify_namespaces(namespace, sels.first.namespace)
+        return unless accept
+        [Element.new(name, ns)] + sels[1..-1]
+      end
+
+      # @see AbstractSequence#specificity
+      def specificity
+        1
+      end
+    end
+
+    # An attribute selector (e.g. `[href^="http://"]`).
+    class Attribute < Simple
+      # The attribute name.
+      #
+      # @return [Array<String, Sass::Script::Tree::Node>]
+      attr_reader :name
+
+      # The attribute namespace. `nil` means the default namespace, `""` means
+      # no namespace, `"*"` means any namespace.
+      #
+      # @return [String, nil]
+      attr_reader :namespace
+
+      # The matching operator, e.g. `"="` or `"^="`.
+      #
+      # @return [String]
+      attr_reader :operator
+
+      # The right-hand side of the operator.
+      #
+      # @return [String]
+      attr_reader :value
+
+      # Flags for the attribute selector (e.g. `i`).
+      #
+      # @return [String]
+      attr_reader :flags
+
+      # @param name [String] The attribute name
+      # @param namespace [String, nil] See \{#namespace}
+      # @param operator [String] The matching operator, e.g. `"="` or `"^="`
+      # @param value [String] See \{#value}
+      # @param flags [String] See \{#flags}
+      def initialize(name, namespace, operator, value, flags)
+        @name = name
+        @namespace = namespace
+        @operator = operator
+        @value = value
+        @flags = flags
+      end
+
+      # @see Selector#to_s
+      def to_s(opts = {})
+        res = "["
+        res << @namespace << "|" if @namespace
+        res << @name
+        res << @operator << @value if @value
+        res << " " << @flags if @flags
+        res << "]"
+      end
+
+      # @see AbstractSequence#specificity
+      def specificity
+        SPECIFICITY_BASE
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/abstract_sequence.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/abstract_sequence.rb
new file mode 100644
index 0000000..ad167a0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/abstract_sequence.rb
@@ -0,0 +1,112 @@
+module Sass
+  module Selector
+    # The abstract parent class of the various selector sequence classes.
+    #
+    # All subclasses should implement a `members` method that returns an array
+    # of object that respond to `#line=` and `#filename=`, as well as a `to_s`
+    # method that returns the string representation of the selector.
+    class AbstractSequence
+      # The line of the Sass template on which this selector was declared.
+      #
+      # @return [Integer]
+      attr_reader :line
+
+      # The name of the file in which this selector was declared.
+      #
+      # @return [String, nil]
+      attr_reader :filename
+
+      # Sets the line of the Sass template on which this selector was declared.
+      # This also sets the line for all child selectors.
+      #
+      # @param line [Integer]
+      # @return [Integer]
+      def line=(line)
+        members.each {|m| m.line = line}
+        @line = line
+      end
+
+      # Sets the name of the file in which this selector was declared,
+      # or `nil` if it was not declared in a file (e.g. on stdin).
+      # This also sets the filename for all child selectors.
+      #
+      # @param filename [String, nil]
+      # @return [String, nil]
+      def filename=(filename)
+        members.each {|m| m.filename = filename}
+        @filename = filename
+      end
+
+      # Returns a hash code for this sequence.
+      #
+      # Subclasses should define `#_hash` rather than overriding this method,
+      # which automatically handles memoizing the result.
+      #
+      # @return [Integer]
+      def hash
+        @_hash ||= _hash
+      end
+
+      # Checks equality between this and another object.
+      #
+      # Subclasses should define `#_eql?` rather than overriding this method,
+      # which handles checking class equality and hash equality.
+      #
+      # @param other [Object] The object to test equality against
+      # @return [Boolean] Whether or not this is equal to `other`
+      def eql?(other)
+        other.class == self.class && other.hash == hash && _eql?(other)
+      end
+      alias_method :==, :eql?
+
+      # Whether or not this selector should be hidden due to containing a
+      # placeholder.
+      def invisible?
+        @invisible ||= members.any? do |m|
+          next m.invisible? if m.is_a?(AbstractSequence) || m.is_a?(Pseudo)
+          m.is_a?(Placeholder)
+        end
+      end
+
+      # Returns the selector string.
+      #
+      # @param opts [Hash] rendering options.
+      # @option opts [Symbol] :style The css rendering style.
+      # @option placeholders [Boolean] :placeholders
+      #   Whether to include placeholder selectors. Defaults to `true`.
+      # @return [String]
+      def to_s(opts = {})
+        Sass::Util.abstract(self)
+      end
+
+      # Returns the specificity of the selector.
+      #
+      # The base is given by {Sass::Selector::SPECIFICITY_BASE}. This can be a
+      # number or a range representing possible specificities.
+      #
+      # @return [Integer, Range]
+      def specificity
+        _specificity(members)
+      end
+
+      protected
+
+      def _specificity(arr)
+        min = 0
+        max = 0
+        arr.each do |m|
+          next if m.is_a?(String)
+          spec = m.specificity
+          if spec.is_a?(Range)
+            min += spec.begin
+            max += spec.end
+          else
+            min += spec
+            max += spec
+          end
+        end
+        min == max ? min : (min..max)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/comma_sequence.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/comma_sequence.rb
new file mode 100644
index 0000000..093c637
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/comma_sequence.rb
@@ -0,0 +1,194 @@
+module Sass
+  module Selector
+    # A comma-separated sequence of selectors.
+    class CommaSequence < AbstractSequence
+      @@compound_extend_deprecation = Sass::Deprecation.new
+
+      # The comma-separated selector sequences
+      # represented by this class.
+      #
+      # @return [Array<Sequence>]
+      attr_reader :members
+
+      # @param seqs [Array<Sequence>] See \{#members}
+      def initialize(seqs)
+        @members = seqs
+      end
+
+      # Resolves the {Parent} selectors within this selector
+      # by replacing them with the given parent selector,
+      # handling commas appropriately.
+      #
+      # @param super_cseq [CommaSequence] The parent selector
+      # @param implicit_parent [Boolean] Whether the the parent
+      #   selector should automatically be prepended to the resolved
+      #   selector if it contains no parent refs.
+      # @return [CommaSequence] This selector, with parent references resolved
+      # @raise [Sass::SyntaxError] If a parent selector is invalid
+      def resolve_parent_refs(super_cseq, implicit_parent = true)
+        if super_cseq.nil?
+          if contains_parent_ref?
+            raise Sass::SyntaxError.new(
+              "Base-level rules cannot contain the parent-selector-referencing character '&'.")
+          end
+          return self
+        end
+
+        CommaSequence.new(Sass::Util.flatten_vertically(@members.map do |seq|
+          seq.resolve_parent_refs(super_cseq, implicit_parent).members
+        end))
+      end
+
+      # Returns whether there's a {Parent} selector anywhere in this sequence.
+      #
+      # @return [Boolean]
+      def contains_parent_ref?
+        @members.any? {|sel| sel.contains_parent_ref?}
+      end
+
+      # Non-destrucively extends this selector with the extensions specified in a hash
+      # (which should come from {Sass::Tree::Visitors::Cssize}).
+      #
+      # @todo Link this to the reference documentation on `@extend`
+      #   when such a thing exists.
+      #
+      # @param extends [Sass::Util::SubsetMap{Selector::Simple =>
+      #                                       Sass::Tree::Visitors::Cssize::Extend}]
+      #   The extensions to perform on this selector
+      # @param parent_directives [Array<Sass::Tree::DirectiveNode>]
+      #   The directives containing this selector.
+      # @param replace [Boolean]
+      #   Whether to replace the original selector entirely or include
+      #   it in the result.
+      # @param seen [Set<Array<Selector::Simple>>]
+      #   The set of simple sequences that are currently being replaced.
+      # @param original [Boolean]
+      #   Whether this is the original selector being extended, as opposed to
+      #   the result of a previous extension that's being re-extended.
+      # @return [CommaSequence] A copy of this selector,
+      #   with extensions made according to `extends`
+      def do_extend(extends, parent_directives = [], replace = false, seen = Set.new,
+          original = true)
+        CommaSequence.new(members.map do |seq|
+          seq.do_extend(extends, parent_directives, replace, seen, original)
+        end.flatten)
+      end
+
+      # Returns whether or not this selector matches all elements
+      # that the given selector matches (as well as possibly more).
+      #
+      # @example
+      #   (.foo).superselector?(.foo.bar) #=> true
+      #   (.foo).superselector?(.bar) #=> false
+      # @param cseq [CommaSequence]
+      # @return [Boolean]
+      def superselector?(cseq)
+        cseq.members.all? {|seq1| members.any? {|seq2| seq2.superselector?(seq1)}}
+      end
+
+      # Populates a subset map that can then be used to extend
+      # selectors. This registers an extension with this selector as
+      # the extender and `extendee` as the extendee.
+      #
+      # @param extends [Sass::Util::SubsetMap{Selector::Simple =>
+      #                                       Sass::Tree::Visitors::Cssize::Extend}]
+      #   The subset map representing the extensions to perform.
+      # @param extendee [CommaSequence] The selector being extended.
+      # @param extend_node [Sass::Tree::ExtendNode]
+      #   The node that caused this extension.
+      # @param parent_directives [Array<Sass::Tree::DirectiveNode>]
+      #   The parent directives containing `extend_node`.
+      # @param allow_compound_target [Boolean]
+      #   Whether `extendee` is allowed to contain compound selectors.
+      # @raise [Sass::SyntaxError] if this extension is invalid.
+      def populate_extends(extends, extendee, extend_node = nil, parent_directives = [],
+          allow_compound_target = false)
+        extendee.members.each do |seq|
+          if seq.members.size > 1
+            raise Sass::SyntaxError.new("Can't extend #{seq}: can't extend nested selectors")
+          end
+
+          sseq = seq.members.first
+          if !sseq.is_a?(Sass::Selector::SimpleSequence)
+            raise Sass::SyntaxError.new("Can't extend #{seq}: invalid selector")
+          elsif sseq.members.any? {|ss| ss.is_a?(Sass::Selector::Parent)}
+            raise Sass::SyntaxError.new("Can't extend #{seq}: can't extend parent selectors")
+          end
+
+          sel = sseq.members
+          if !allow_compound_target && sel.length > 1
+            @@compound_extend_deprecation.warn(sseq.filename, sseq.line, <<WARNING)
+Extending a compound selector, #{sseq}, is deprecated and will not be supported in a future release.
+See https://github.com/sass/sass/issues/1599 for details.
+WARNING
+          end
+
+          members.each do |member|
+            unless member.members.last.is_a?(Sass::Selector::SimpleSequence)
+              raise Sass::SyntaxError.new("#{member} can't extend: invalid selector")
+            end
+
+            extends[sel] = Sass::Tree::Visitors::Cssize::Extend.new(
+              member, sel, extend_node, parent_directives, false)
+          end
+        end
+      end
+
+      # Unifies this with another comma selector to produce a selector
+      # that matches (a subset of) the intersection of the two inputs.
+      #
+      # @param other [CommaSequence]
+      # @return [CommaSequence, nil] The unified selector, or nil if unification failed.
+      # @raise [Sass::SyntaxError] If this selector cannot be unified.
+      #   This will only ever occur when a dynamic selector,
+      #   such as {Parent} or {Interpolation}, is used in unification.
+      #   Since these selectors should be resolved
+      #   by the time extension and unification happen,
+      #   this exception will only ever be raised as a result of programmer error
+      def unify(other)
+        results = members.map {|seq1| other.members.map {|seq2| seq1.unify(seq2)}}.flatten.compact
+        results.empty? ? nil : CommaSequence.new(results.map {|cseq| cseq.members}.flatten)
+      end
+
+      # Returns a SassScript representation of this selector.
+      #
+      # @return [Sass::Script::Value::List]
+      def to_sass_script
+        Sass::Script::Value::List.new(members.map do |seq|
+          Sass::Script::Value::List.new(seq.members.map do |component|
+            next if component == "\n"
+            Sass::Script::Value::String.new(component.to_s)
+          end.compact, separator: :space)
+        end, separator: :comma)
+      end
+
+      # Returns a string representation of the sequence.
+      # This is basically the selector string.
+      #
+      # @return [String]
+      def inspect
+        members.map {|m| m.inspect}.join(", ")
+      end
+
+      # @see AbstractSequence#to_s
+      def to_s(opts = {})
+        @members.map do |m|
+          next if opts[:placeholder] == false && m.invisible?
+          m.to_s(opts)
+        end.compact.
+          join(opts[:style] == :compressed ? "," : ", ").
+          gsub(", \n", ",\n")
+      end
+
+      private
+
+      def _hash
+        members.hash
+      end
+
+      def _eql?(other)
+        other.class == self.class && other.members.eql?(members)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/pseudo.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/pseudo.rb
new file mode 100644
index 0000000..5d9f301
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/pseudo.rb
@@ -0,0 +1,283 @@
+# coding: utf-8
+module Sass
+  module Selector
+    # A pseudoclass (e.g. `:visited`) or pseudoelement (e.g. `::first-line`)
+    # selector. It can have arguments (e.g. `:nth-child(2n+1)`) which can
+    # contain selectors (e.g. `:nth-child(2n+1 of .foo)`).
+    class Pseudo < Simple
+      # Some pseudo-class-syntax selectors are actually considered
+      # pseudo-elements and must be treated differently. This is a list of such
+      # selectors.
+      #
+      # @return [Set<String>]
+      ACTUALLY_ELEMENTS = %w(after before first-line first-letter).to_set
+
+      # Like \{#type}, but returns the type of selector this looks like, rather
+      # than the type it is semantically. This only differs from type for
+      # selectors in \{ACTUALLY\_ELEMENTS}.
+      #
+      # @return [Symbol]
+      attr_reader :syntactic_type
+
+      # The name of the selector.
+      #
+      # @return [String]
+      attr_reader :name
+
+      # The argument to the selector,
+      # or `nil` if no argument was given.
+      #
+      # @return [String, nil]
+      attr_reader :arg
+
+      # The selector argument, or `nil` if no selector exists.
+      #
+      # If this and \{#arg\} are both set, \{#arg\} is considered a non-selector
+      # prefix.
+      #
+      # @return [CommaSequence]
+      attr_reader :selector
+
+      # @param syntactic_type [Symbol] See \{#syntactic_type}
+      # @param name [String] See \{#name}
+      # @param arg [nil, String] See \{#arg}
+      # @param selector [nil, CommaSequence] See \{#selector}
+      def initialize(syntactic_type, name, arg, selector)
+        @syntactic_type = syntactic_type
+        @name = name
+        @arg = arg
+        @selector = selector
+      end
+
+      def unique?
+        type == :class && normalized_name == 'root'
+      end
+
+      # Whether or not this selector should be hidden due to containing a
+      # placeholder.
+      def invisible?
+        # :not() is a special case—if you eliminate all the placeholders from
+        # it, it should match anything.
+        name != 'not' && @selector && @selector.members.all? {|s| s.invisible?}
+      end
+
+      # Returns a copy of this with \{#selector} set to \{#new\_selector}.
+      #
+      # @param new_selector [CommaSequence]
+      # @return [Array<Simple>]
+      def with_selector(new_selector)
+        result = Pseudo.new(syntactic_type, name, arg,
+          CommaSequence.new(new_selector.members.map do |seq|
+            next seq unless seq.members.length == 1
+            sseq = seq.members.first
+            next seq unless sseq.is_a?(SimpleSequence) && sseq.members.length == 1
+            sel = sseq.members.first
+            next seq unless sel.is_a?(Pseudo) && sel.selector
+
+            case normalized_name
+            when 'not'
+              # In theory, if there's a nested :not its contents should be
+              # unified with the return value. For example, if :not(.foo)
+              # extends .bar, :not(.bar) should become .foo:not(.bar). However,
+              # this is a narrow edge case and supporting it properly would make
+              # this code and the code calling it a lot more complicated, so
+              # it's not supported for now.
+              next [] unless sel.normalized_name == 'matches'
+              sel.selector.members
+            when 'matches', 'any', 'current', 'nth-child', 'nth-last-child'
+              # As above, we could theoretically support :not within :matches, but
+              # doing so would require this method and its callers to handle much
+              # more complex cases that likely aren't worth the pain.
+              next [] unless sel.name == name && sel.arg == arg
+              sel.selector.members
+            when 'has', 'host', 'host-context', 'slotted'
+              # We can't expand nested selectors here, because each layer adds an
+              # additional layer of semantics. For example, `:has(:has(img))`
+              # doesn't match `<div><img></div>` but `:has(img)` does.
+              sel
+            else
+              []
+            end
+          end.flatten))
+
+        # Older browsers support :not but only with a single complex selector.
+        # In order to support those browsers, we break up the contents of a :not
+        # unless it originally contained a selector list.
+        return [result] unless normalized_name == 'not'
+        return [result] if selector.members.length > 1
+        result.selector.members.map do |seq|
+          Pseudo.new(syntactic_type, name, arg, CommaSequence.new([seq]))
+        end
+      end
+
+      # The type of the selector. `:class` if this is a pseudoclass selector,
+      # `:element` if it's a pseudoelement.
+      #
+      # @return [Symbol]
+      def type
+        ACTUALLY_ELEMENTS.include?(normalized_name) ? :element : syntactic_type
+      end
+
+      # Like \{#name\}, but without any vendor prefix.
+      #
+      # @return [String]
+      def normalized_name
+        @normalized_name ||= name.gsub(/^-[a-zA-Z0-9]+-/, '')
+      end
+
+      # @see Selector#to_s
+      def to_s(opts = {})
+        # :not() is a special case, because :not(<nothing>) should match
+        # everything.
+        return '' if name == 'not' && @selector && @selector.members.all? {|m| m.invisible?}
+
+        res = (syntactic_type == :class ? ":" : "::") + @name
+        if @arg || @selector
+          res << "("
+          res << @arg.strip if @arg
+          res << " " if @arg && @selector
+          res << @selector.to_s(opts) if @selector
+          res << ")"
+        end
+        res
+      end
+
+      # Returns `nil` if this is a pseudoelement selector
+      # and `sels` contains a pseudoelement selector different than this one.
+      #
+      # @see SimpleSequence#unify
+      def unify(sels)
+        return if type == :element && sels.any? do |sel|
+          sel.is_a?(Pseudo) && sel.type == :element &&
+            (sel.name != name || sel.arg != arg || sel.selector != selector)
+        end
+        super
+      end
+
+      # Returns whether or not this selector matches all elements
+      # that the given selector matches (as well as possibly more).
+      #
+      # @example
+      #   (.foo).superselector?(.foo.bar) #=> true
+      #   (.foo).superselector?(.bar) #=> false
+      # @param their_sseq [SimpleSequence]
+      # @param parents [Array<SimpleSequence, String>] The parent selectors of `their_sseq`, if any.
+      # @return [Boolean]
+      def superselector?(their_sseq, parents = [])
+        case normalized_name
+        when 'matches', 'any'
+          # :matches can be a superselector of another selector in one of two
+          # ways. Either its constituent selectors can be a superset of those of
+          # another :matches in the other selector, or any of its constituent
+          # selectors can individually be a superselector of the other selector.
+          (their_sseq.selector_pseudo_classes[normalized_name] || []).any? do |their_sel|
+            next false unless their_sel.is_a?(Pseudo)
+            next false unless their_sel.name == name
+            selector.superselector?(their_sel.selector)
+          end || selector.members.any? do |our_seq|
+            their_seq = Sequence.new(parents + [their_sseq])
+            our_seq.superselector?(their_seq)
+          end
+        when 'has', 'host', 'host-context', 'slotted'
+          # Like :matches, :has (et al) can be a superselector of another
+          # selector if its constituent selectors are a superset of those of
+          # another :has in the other selector. However, the :matches other case
+          # doesn't work, because :has refers to nested elements.
+          (their_sseq.selector_pseudo_classes[normalized_name] || []).any? do |their_sel|
+            next false unless their_sel.is_a?(Pseudo)
+            next false unless their_sel.name == name
+            selector.superselector?(their_sel.selector)
+          end
+        when 'not'
+          selector.members.all? do |our_seq|
+            their_sseq.members.any? do |their_sel|
+              if their_sel.is_a?(Element) || their_sel.is_a?(Id)
+                # `:not(a)` is a superselector of `h1` and `:not(#foo)` is a
+                # superselector of `#bar`.
+                our_sseq = our_seq.members.last
+                next false unless our_sseq.is_a?(SimpleSequence)
+                our_sseq.members.any? do |our_sel|
+                  our_sel.class == their_sel.class && our_sel != their_sel
+                end
+              else
+                next false unless their_sel.is_a?(Pseudo)
+                next false unless their_sel.name == name
+                # :not(X) is a superselector of :not(Y) exactly when Y is a
+                # superselector of X.
+                their_sel.selector.superselector?(CommaSequence.new([our_seq]))
+              end
+            end
+          end
+        when 'current'
+          (their_sseq.selector_pseudo_classes['current'] || []).any? do |their_current|
+            next false if their_current.name != name
+            # Explicitly don't check for nested superselector relationships
+            # here. :current(.foo) isn't always a superselector of
+            # :current(.foo.bar), since it matches the *innermost* ancestor of
+            # the current element that matches the selector. For example:
+            #
+            #     <div class="foo bar">
+            #       <p class="foo">
+            #         <span>current element</span>
+            #       </p>
+            #     </div>
+            #
+            # Here :current(.foo) would match the p element and *not* the div
+            # element, whereas :current(.foo.bar) would match the div and not
+            # the p.
+            selector == their_current.selector
+          end
+        when 'nth-child', 'nth-last-child'
+          their_sseq.members.any? do |their_sel|
+            # This misses a few edge cases. For example, `:nth-child(n of X)`
+            # is a superselector of `X`, and `:nth-child(2n of X)` is a
+            # superselector of `:nth-child(4n of X)`. These seem rare enough
+            # not to be worth worrying about, though.
+            next false unless their_sel.is_a?(Pseudo)
+            next false unless their_sel.name == name
+            next false unless their_sel.arg == arg
+            selector.superselector?(their_sel.selector)
+          end
+        else
+          throw "[BUG] Unknown selector pseudo class #{name}"
+        end
+      end
+
+      # @see AbstractSequence#specificity
+      def specificity
+        return 1 if type == :element
+        return SPECIFICITY_BASE unless selector
+        @specificity ||=
+          if normalized_name == 'not'
+            min = 0
+            max = 0
+            selector.members.each do |seq|
+              spec = seq.specificity
+              if spec.is_a?(Range)
+                min = Sass::Util.max(spec.begin, min)
+                max = Sass::Util.max(spec.end, max)
+              else
+                min = Sass::Util.max(spec, min)
+                max = Sass::Util.max(spec, max)
+              end
+            end
+            min == max ? max : (min..max)
+          else
+            min = 0
+            max = 0
+            selector.members.each do |seq|
+              spec = seq.specificity
+              if spec.is_a?(Range)
+                min = Sass::Util.min(spec.begin, min)
+                max = Sass::Util.max(spec.end, max)
+              else
+                min = Sass::Util.min(spec, min)
+                max = Sass::Util.max(spec, max)
+              end
+            end
+            min == max ? max : (min..max)
+          end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/sequence.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/sequence.rb
new file mode 100644
index 0000000..ca20fde
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/sequence.rb
@@ -0,0 +1,665 @@
+module Sass
+  module Selector
+    # An operator-separated sequence of
+    # {SimpleSequence simple selector sequences}.
+    class Sequence < AbstractSequence
+      # Sets the line of the Sass template on which this selector was declared.
+      # This also sets the line for all child selectors.
+      #
+      # @param line [Integer]
+      # @return [Integer]
+      def line=(line)
+        members.each {|m| m.line = line if m.is_a?(SimpleSequence)}
+        @line = line
+      end
+
+      # Sets the name of the file in which this selector was declared,
+      # or `nil` if it was not declared in a file (e.g. on stdin).
+      # This also sets the filename for all child selectors.
+      #
+      # @param filename [String, nil]
+      # @return [String, nil]
+      def filename=(filename)
+        members.each {|m| m.filename = filename if m.is_a?(SimpleSequence)}
+        filename
+      end
+
+      # The array of {SimpleSequence simple selector sequences}, operators, and
+      # newlines. The operators are strings such as `"+"` and `">"` representing
+      # the corresponding CSS operators, or interpolated SassScript. Newlines
+      # are also newline strings; these aren't semantically relevant, but they
+      # do affect formatting.
+      #
+      # @return [Array<SimpleSequence, String|Array<Sass::Tree::Node, String>>]
+      attr_reader :members
+
+      # @param seqs_and_ops [Array<SimpleSequence, String|Array<Sass::Tree::Node, String>>]
+      #   See \{#members}
+      def initialize(seqs_and_ops)
+        @members = seqs_and_ops
+      end
+
+      # Resolves the {Parent} selectors within this selector
+      # by replacing them with the given parent selector,
+      # handling commas appropriately.
+      #
+      # @param super_cseq [CommaSequence] The parent selector
+      # @param implicit_parent [Boolean] Whether the the parent
+      #   selector should automatically be prepended to the resolved
+      #   selector if it contains no parent refs.
+      # @return [CommaSequence] This selector, with parent references resolved
+      # @raise [Sass::SyntaxError] If a parent selector is invalid
+      def resolve_parent_refs(super_cseq, implicit_parent)
+        members = @members.dup
+        nl = (members.first == "\n" && members.shift)
+        contains_parent_ref = contains_parent_ref?
+        return CommaSequence.new([self]) if !implicit_parent && !contains_parent_ref
+
+        unless contains_parent_ref
+          old_members, members = members, []
+          members << nl if nl
+          members << SimpleSequence.new([Parent.new], false)
+          members += old_members
+        end
+
+        CommaSequence.new(Sass::Util.paths(members.map do |sseq_or_op|
+          next [sseq_or_op] unless sseq_or_op.is_a?(SimpleSequence)
+          sseq_or_op.resolve_parent_refs(super_cseq).members
+        end).map do |path|
+          path_members = path.map do |seq_or_op|
+            next seq_or_op unless seq_or_op.is_a?(Sequence)
+            seq_or_op.members
+          end
+          if path_members.length == 2 && path_members[1][0] == "\n"
+            path_members[0].unshift path_members[1].shift
+          end
+          Sequence.new(path_members.flatten)
+        end)
+      end
+
+      # Returns whether there's a {Parent} selector anywhere in this sequence.
+      #
+      # @return [Boolean]
+      def contains_parent_ref?
+        members.any? do |sseq_or_op|
+          next false unless sseq_or_op.is_a?(SimpleSequence)
+          next true if sseq_or_op.members.first.is_a?(Parent)
+          sseq_or_op.members.any? do |sel|
+            sel.is_a?(Pseudo) && sel.selector && sel.selector.contains_parent_ref?
+          end
+        end
+      end
+
+      # Non-destructively extends this selector with the extensions specified in a hash
+      # (which should come from {Sass::Tree::Visitors::Cssize}).
+      #
+      # @param extends [Sass::Util::SubsetMap{Selector::Simple =>
+      #                                       Sass::Tree::Visitors::Cssize::Extend}]
+      #   The extensions to perform on this selector
+      # @param parent_directives [Array<Sass::Tree::DirectiveNode>]
+      #   The directives containing this selector.
+      # @param replace [Boolean]
+      #   Whether to replace the original selector entirely or include
+      #   it in the result.
+      # @param seen [Set<Array<Selector::Simple>>]
+      #   The set of simple sequences that are currently being replaced.
+      # @param original [Boolean]
+      #   Whether this is the original selector being extended, as opposed to
+      #   the result of a previous extension that's being re-extended.
+      # @return [Array<Sequence>] A list of selectors generated
+      #   by extending this selector with `extends`.
+      #   These correspond to a {CommaSequence}'s {CommaSequence#members members array}.
+      # @see CommaSequence#do_extend
+      def do_extend(extends, parent_directives, replace, seen, original)
+        extended_not_expanded = members.map do |sseq_or_op|
+          next [[sseq_or_op]] unless sseq_or_op.is_a?(SimpleSequence)
+          extended = sseq_or_op.do_extend(extends, parent_directives, replace, seen)
+
+          # The First Law of Extend says that the generated selector should have
+          # specificity greater than or equal to that of the original selector.
+          # In order to ensure that, we record the original selector's
+          # (`extended.first`) original specificity.
+          extended.first.add_sources!([self]) if original && !invisible?
+
+          extended.map {|seq| seq.members}
+        end
+        weaves = Sass::Util.paths(extended_not_expanded).map {|path| weave(path)}
+        trim(weaves).map {|p| Sequence.new(p)}
+      end
+
+      # Unifies this with another selector sequence to produce a selector
+      # that matches (a subset of) the intersection of the two inputs.
+      #
+      # @param other [Sequence]
+      # @return [CommaSequence, nil] The unified selector, or nil if unification failed.
+      # @raise [Sass::SyntaxError] If this selector cannot be unified.
+      #   This will only ever occur when a dynamic selector,
+      #   such as {Parent} or {Interpolation}, is used in unification.
+      #   Since these selectors should be resolved
+      #   by the time extension and unification happen,
+      #   this exception will only ever be raised as a result of programmer error
+      def unify(other)
+        base = members.last
+        other_base = other.members.last
+        return unless base.is_a?(SimpleSequence) && other_base.is_a?(SimpleSequence)
+        return unless (unified = other_base.unify(base))
+
+        woven = weave([members[0...-1], other.members[0...-1] + [unified]])
+        CommaSequence.new(woven.map {|w| Sequence.new(w)})
+      end
+
+      # Returns whether or not this selector matches all elements
+      # that the given selector matches (as well as possibly more).
+      #
+      # @example
+      #   (.foo).superselector?(.foo.bar) #=> true
+      #   (.foo).superselector?(.bar) #=> false
+      # @param cseq [Sequence]
+      # @return [Boolean]
+      def superselector?(seq)
+        _superselector?(members, seq.members)
+      end
+
+      # @see AbstractSequence#to_s
+      def to_s(opts = {})
+        @members.map {|m| m.is_a?(String) ? m : m.to_s(opts)}.join(" ").gsub(/ ?\n ?/, "\n")
+      end
+
+      # Returns a string representation of the sequence.
+      # This is basically the selector string.
+      #
+      # @return [String]
+      def inspect
+        members.map {|m| m.inspect}.join(" ")
+      end
+
+      # Add to the {SimpleSequence#sources} sets of the child simple sequences.
+      # This destructively modifies this sequence's members array, but not the
+      # child simple sequences.
+      #
+      # @param sources [Set<Sequence>]
+      def add_sources!(sources)
+        members.map! {|m| m.is_a?(SimpleSequence) ? m.with_more_sources(sources) : m}
+      end
+
+      # Converts the subject operator "!", if it exists, into a ":has()"
+      # selector.
+      #
+      # @retur [Sequence]
+      def subjectless
+        pre_subject = []
+        has = []
+        subject = nil
+        members.each do |sseq_or_op|
+          if subject
+            has << sseq_or_op
+          elsif sseq_or_op.is_a?(String) || !sseq_or_op.subject?
+            pre_subject << sseq_or_op
+          else
+            subject = sseq_or_op.dup
+            subject.members = sseq_or_op.members.dup
+            subject.subject = false
+            has = []
+          end
+        end
+
+        return self unless subject
+
+        unless has.empty?
+          subject.members << Pseudo.new(:class, 'has', nil, CommaSequence.new([Sequence.new(has)]))
+        end
+        Sequence.new(pre_subject + [subject])
+      end
+
+      private
+
+      # Conceptually, this expands "parenthesized selectors". That is, if we
+      # have `.A .B {@extend .C}` and `.D .C {...}`, this conceptually expands
+      # into `.D .C, .D (.A .B)`, and this function translates `.D (.A .B)` into
+      # `.D .A .B, .A .D .B`. For thoroughness, `.A.D .B` would also be
+      # required, but including merged selectors results in exponential output
+      # for very little gain.
+      #
+      # @param path [Array<Array<SimpleSequence or String>>]
+      #   A list of parenthesized selector groups.
+      # @return [Array<Array<SimpleSequence or String>>] A list of fully-expanded selectors.
+      def weave(path)
+        # This function works by moving through the selector path left-to-right,
+        # building all possible prefixes simultaneously.
+        prefixes = [[]]
+
+        path.each do |current|
+          next if current.empty?
+          current = current.dup
+          last_current = [current.pop]
+          prefixes = prefixes.map do |prefix|
+            sub = subweave(prefix, current)
+            next [] unless sub
+            sub.map {|seqs| seqs + last_current}
+          end.flatten(1)
+        end
+        prefixes
+      end
+
+      # This interweaves two lists of selectors,
+      # returning all possible orderings of them (including using unification)
+      # that maintain the relative ordering of the input arrays.
+      #
+      # For example, given `.foo .bar` and `.baz .bang`,
+      # this would return `.foo .bar .baz .bang`, `.foo .bar.baz .bang`,
+      # `.foo .baz .bar .bang`, `.foo .baz .bar.bang`, `.foo .baz .bang .bar`,
+      # and so on until `.baz .bang .foo .bar`.
+      #
+      # Semantically, for selectors A and B, this returns all selectors `AB_i`
+      # such that the union over all i of elements matched by `AB_i X` is
+      # identical to the intersection of all elements matched by `A X` and all
+      # elements matched by `B X`. Some `AB_i` are elided to reduce the size of
+      # the output.
+      #
+      # @param seq1 [Array<SimpleSequence or String>]
+      # @param seq2 [Array<SimpleSequence or String>]
+      # @return [Array<Array<SimpleSequence or String>>]
+      def subweave(seq1, seq2)
+        return [seq2] if seq1.empty?
+        return [seq1] if seq2.empty?
+
+        seq1, seq2 = seq1.dup, seq2.dup
+        return unless (init = merge_initial_ops(seq1, seq2))
+        return unless (fin = merge_final_ops(seq1, seq2))
+
+        # Make sure there's only one root selector in the output.
+        root1 = has_root?(seq1.first) && seq1.shift
+        root2 = has_root?(seq2.first) && seq2.shift
+        if root1 && root2
+          return unless (root = root1.unify(root2))
+          seq1.unshift root
+          seq2.unshift root
+        elsif root1
+          seq2.unshift root1
+        elsif root2
+          seq1.unshift root2
+        end
+
+        seq1 = group_selectors(seq1)
+        seq2 = group_selectors(seq2)
+        lcs = Sass::Util.lcs(seq2, seq1) do |s1, s2|
+          next s1 if s1 == s2
+          next unless s1.first.is_a?(SimpleSequence) && s2.first.is_a?(SimpleSequence)
+          next s2 if parent_superselector?(s1, s2)
+          next s1 if parent_superselector?(s2, s1)
+          next unless must_unify?(s1, s2)
+          next unless (unified = Sequence.new(s1).unify(Sequence.new(s2)))
+          unified.members.first.members if unified.members.length == 1
+        end
+
+        diff = [[init]]
+
+        until lcs.empty?
+          diff << chunks(seq1, seq2) {|s| parent_superselector?(s.first, lcs.first)} << [lcs.shift]
+          seq1.shift
+          seq2.shift
+        end
+        diff << chunks(seq1, seq2) {|s| s.empty?}
+        diff += fin.map {|sel| sel.is_a?(Array) ? sel : [sel]}
+        diff.reject! {|c| c.empty?}
+
+        Sass::Util.paths(diff).map {|p| p.flatten}.reject {|p| path_has_two_subjects?(p)}
+      end
+
+      # Extracts initial selector combinators (`"+"`, `">"`, `"~"`, and `"\n"`)
+      # from two sequences and merges them together into a single array of
+      # selector combinators.
+      #
+      # @param seq1 [Array<SimpleSequence or String>]
+      # @param seq2 [Array<SimpleSequence or String>]
+      # @return [Array<String>, nil] If there are no operators in the merged
+      #   sequence, this will be the empty array. If the operators cannot be
+      #   merged, this will be nil.
+      def merge_initial_ops(seq1, seq2)
+        ops1, ops2 = [], []
+        ops1 << seq1.shift while seq1.first.is_a?(String)
+        ops2 << seq2.shift while seq2.first.is_a?(String)
+
+        newline = false
+        newline ||= !!ops1.shift if ops1.first == "\n"
+        newline ||= !!ops2.shift if ops2.first == "\n"
+
+        # If neither sequence is a subsequence of the other, they cannot be
+        # merged successfully
+        lcs = Sass::Util.lcs(ops1, ops2)
+        return unless lcs == ops1 || lcs == ops2
+        (newline ? ["\n"] : []) + (ops1.size > ops2.size ? ops1 : ops2)
+      end
+
+      # Extracts final selector combinators (`"+"`, `">"`, `"~"`) and the
+      # selectors to which they apply from two sequences and merges them
+      # together into a single array.
+      #
+      # @param seq1 [Array<SimpleSequence or String>]
+      # @param seq2 [Array<SimpleSequence or String>]
+      # @return [Array<SimpleSequence or String or
+      #     Array<Array<SimpleSequence or String>>]
+      #   If there are no trailing combinators to be merged, this will be the
+      #   empty array. If the trailing combinators cannot be merged, this will
+      #   be nil. Otherwise, this will contained the merged selector. Array
+      #   elements are [Sass::Util#paths]-style options; conceptually, an "or"
+      #   of multiple selectors.
+      # @comment
+      #   rubocop:disable MethodLength
+      def merge_final_ops(seq1, seq2, res = [])
+        ops1, ops2 = [], []
+        ops1 << seq1.pop while seq1.last.is_a?(String)
+        ops2 << seq2.pop while seq2.last.is_a?(String)
+
+        # Not worth the headache of trying to preserve newlines here. The most
+        # important use of newlines is at the beginning of the selector to wrap
+        # across lines anyway.
+        ops1.reject! {|o| o == "\n"}
+        ops2.reject! {|o| o == "\n"}
+
+        return res if ops1.empty? && ops2.empty?
+        if ops1.size > 1 || ops2.size > 1
+          # If there are multiple operators, something hacky's going on. If one
+          # is a supersequence of the other, use that, otherwise give up.
+          lcs = Sass::Util.lcs(ops1, ops2)
+          return unless lcs == ops1 || lcs == ops2
+          res.unshift(*(ops1.size > ops2.size ? ops1 : ops2).reverse)
+          return res
+        end
+
+        # This code looks complicated, but it's actually just a bunch of special
+        # cases for interactions between different combinators.
+        op1, op2 = ops1.first, ops2.first
+        if op1 && op2
+          sel1 = seq1.pop
+          sel2 = seq2.pop
+          if op1 == '~' && op2 == '~'
+            if sel1.superselector?(sel2)
+              res.unshift sel2, '~'
+            elsif sel2.superselector?(sel1)
+              res.unshift sel1, '~'
+            else
+              merged = sel1.unify(sel2)
+              res.unshift [
+                [sel1, '~', sel2, '~'],
+                [sel2, '~', sel1, '~'],
+                ([merged, '~'] if merged)
+              ].compact
+            end
+          elsif (op1 == '~' && op2 == '+') || (op1 == '+' && op2 == '~')
+            if op1 == '~'
+              tilde_sel, plus_sel = sel1, sel2
+            else
+              tilde_sel, plus_sel = sel2, sel1
+            end
+
+            if tilde_sel.superselector?(plus_sel)
+              res.unshift plus_sel, '+'
+            else
+              merged = plus_sel.unify(tilde_sel)
+              res.unshift [
+                [tilde_sel, '~', plus_sel, '+'],
+                ([merged, '+'] if merged)
+              ].compact
+            end
+          elsif op1 == '>' && %w(~ +).include?(op2)
+            res.unshift sel2, op2
+            seq1.push sel1, op1
+          elsif op2 == '>' && %w(~ +).include?(op1)
+            res.unshift sel1, op1
+            seq2.push sel2, op2
+          elsif op1 == op2
+            merged = sel1.unify(sel2)
+            return unless merged
+            res.unshift merged, op1
+          else
+            # Unknown selector combinators can't be unified
+            return
+          end
+          return merge_final_ops(seq1, seq2, res)
+        elsif op1
+          seq2.pop if op1 == '>' && seq2.last && seq2.last.superselector?(seq1.last)
+          res.unshift seq1.pop, op1
+          return merge_final_ops(seq1, seq2, res)
+        else # op2
+          seq1.pop if op2 == '>' && seq1.last && seq1.last.superselector?(seq2.last)
+          res.unshift seq2.pop, op2
+          return merge_final_ops(seq1, seq2, res)
+        end
+      end
+      # @comment
+      #   rubocop:enable MethodLength
+
+      # Takes initial subsequences of `seq1` and `seq2` and returns all
+      # orderings of those subsequences. The initial subsequences are determined
+      # by a block.
+      #
+      # Destructively removes the initial subsequences of `seq1` and `seq2`.
+      #
+      # For example, given `(A B C | D E)` and `(1 2 | 3 4 5)` (with `|`
+      # denoting the boundary of the initial subsequence), this would return
+      # `[(A B C 1 2), (1 2 A B C)]`. The sequences would then be `(D E)` and
+      # `(3 4 5)`.
+      #
+      # @param seq1 [Array]
+      # @param seq2 [Array]
+      # @yield [a] Used to determine when to cut off the initial subsequences.
+      #   Called repeatedly for each sequence until it returns true.
+      # @yieldparam a [Array] A final subsequence of one input sequence after
+      #   cutting off some initial subsequence.
+      # @yieldreturn [Boolean] Whether or not to cut off the initial subsequence
+      #   here.
+      # @return [Array<Array>] All possible orderings of the initial subsequences.
+      def chunks(seq1, seq2)
+        chunk1 = []
+        chunk1 << seq1.shift until yield seq1
+        chunk2 = []
+        chunk2 << seq2.shift until yield seq2
+        return [] if chunk1.empty? && chunk2.empty?
+        return [chunk2] if chunk1.empty?
+        return [chunk1] if chunk2.empty?
+        [chunk1 + chunk2, chunk2 + chunk1]
+      end
+
+      # Groups a sequence into subsequences. The subsequences are determined by
+      # strings; adjacent non-string elements will be put into separate groups,
+      # but any element adjacent to a string will be grouped with that string.
+      #
+      # For example, `(A B "C" D E "F" G "H" "I" J)` will become `[(A) (B "C" D)
+      # (E "F" G "H" "I" J)]`.
+      #
+      # @param seq [Array]
+      # @return [Array<Array>]
+      def group_selectors(seq)
+        newseq = []
+        tail = seq.dup
+        until tail.empty?
+          head = []
+          begin
+            head << tail.shift
+          end while !tail.empty? && head.last.is_a?(String) || tail.first.is_a?(String)
+          newseq << head
+        end
+        newseq
+      end
+
+      # Given two selector sequences, returns whether `seq1` is a
+      # superselector of `seq2`; that is, whether `seq1` matches every
+      # element `seq2` matches.
+      #
+      # @param seq1 [Array<SimpleSequence or String>]
+      # @param seq2 [Array<SimpleSequence or String>]
+      # @return [Boolean]
+      def _superselector?(seq1, seq2)
+        seq1 = seq1.reject {|e| e == "\n"}
+        seq2 = seq2.reject {|e| e == "\n"}
+        # Selectors with leading or trailing operators are neither
+        # superselectors nor subselectors.
+        return if seq1.last.is_a?(String) || seq2.last.is_a?(String) ||
+          seq1.first.is_a?(String) || seq2.first.is_a?(String)
+        # More complex selectors are never superselectors of less complex ones
+        return if seq1.size > seq2.size
+        return seq1.first.superselector?(seq2.last, seq2[0...-1]) if seq1.size == 1
+
+        _, si = seq2.each_with_index.find do |e, i|
+          return if i == seq2.size - 1
+          next if e.is_a?(String)
+          seq1.first.superselector?(e, seq2[0...i])
+        end
+        return unless si
+
+        if seq1[1].is_a?(String)
+          return unless seq2[si + 1].is_a?(String)
+
+          # .foo ~ .bar is a superselector of .foo + .bar
+          return unless seq1[1] == "~" ? seq2[si + 1] != ">" : seq1[1] == seq2[si + 1]
+
+          # .foo > .baz is not a superselector of .foo > .bar > .baz or .foo >
+          # .bar .baz, despite the fact that .baz is a superselector of .bar >
+          # .baz and .bar .baz. Same goes for + and ~.
+          return if seq1.length == 3 && seq2.length > 3
+
+          return _superselector?(seq1[2..-1], seq2[si + 2..-1])
+        elsif seq2[si + 1].is_a?(String)
+          return unless seq2[si + 1] == ">"
+          return _superselector?(seq1[1..-1], seq2[si + 2..-1])
+        else
+          return _superselector?(seq1[1..-1], seq2[si + 1..-1])
+        end
+      end
+
+      # Like \{#_superselector?}, but compares the selectors in the
+      # context of parent selectors, as though they shared an implicit
+      # base simple selector. For example, `B` is not normally a
+      # superselector of `B A`, since it doesn't match `A` elements.
+      # However, it is a parent superselector, since `B X` is a
+      # superselector of `B A X`.
+      #
+      # @param seq1 [Array<SimpleSequence or String>]
+      # @param seq2 [Array<SimpleSequence or String>]
+      # @return [Boolean]
+      def parent_superselector?(seq1, seq2)
+        base = Sass::Selector::SimpleSequence.new([Sass::Selector::Placeholder.new('<temp>')],
+                                                  false)
+        _superselector?(seq1 + [base], seq2 + [base])
+      end
+
+      # Returns whether two selectors must be unified to produce a valid
+      # combined selector. This is true when both selectors contain the same
+      # unique simple selector such as an id.
+      #
+      # @param seq1 [Array<SimpleSequence or String>]
+      # @param seq2 [Array<SimpleSequence or String>]
+      # @return [Boolean]
+      def must_unify?(seq1, seq2)
+        unique_selectors = seq1.map do |sseq|
+          next [] if sseq.is_a?(String)
+          sseq.members.select {|sel| sel.unique?}
+        end.flatten.to_set
+
+        return false if unique_selectors.empty?
+
+        seq2.any? do |sseq|
+          next false if sseq.is_a?(String)
+          sseq.members.any? do |sel|
+            next unless sel.unique?
+            unique_selectors.include?(sel)
+          end
+        end
+      end
+
+      # Removes redundant selectors from between multiple lists of
+      # selectors. This takes a list of lists of selector sequences;
+      # each individual list is assumed to have no redundancy within
+      # itself. A selector is only removed if it's redundant with a
+      # selector in another list.
+      #
+      # "Redundant" here means that one selector is a superselector of
+      # the other. The more specific selector is removed.
+      #
+      # @param seqses [Array<Array<Array<SimpleSequence or String>>>]
+      # @return [Array<Array<SimpleSequence or String>>]
+      def trim(seqses)
+        # Avoid truly horrific quadratic behavior. TODO: I think there
+        # may be a way to get perfect trimming without going quadratic.
+        return seqses.flatten(1) if seqses.size > 100
+
+        # Keep the results in a separate array so we can be sure we aren't
+        # comparing against an already-trimmed selector. This ensures that two
+        # identical selectors don't mutually trim one another.
+        result = seqses.dup
+
+        # This is n^2 on the sequences, but only comparing between
+        # separate sequences should limit the quadratic behavior.
+        seqses.each_with_index do |seqs1, i|
+          result[i] = seqs1.reject do |seq1|
+            # The maximum specificity of the sources that caused [seq1] to be
+            # generated. In order for [seq1] to be removed, there must be
+            # another selector that's a superselector of it *and* that has
+            # specificity greater or equal to this.
+            max_spec = _sources(seq1).map do |seq|
+              spec = seq.specificity
+              spec.is_a?(Range) ? spec.max : spec
+            end.max || 0
+
+            result.any? do |seqs2|
+              next if seqs1.equal?(seqs2)
+              # Second Law of Extend: the specificity of a generated selector
+              # should never be less than the specificity of the extending
+              # selector.
+              #
+              # See https://github.com/nex3/sass/issues/324.
+              seqs2.any? do |seq2|
+                spec2 = _specificity(seq2)
+                spec2 = spec2.begin if spec2.is_a?(Range)
+                spec2 >= max_spec && _superselector?(seq2, seq1)
+              end
+            end
+          end
+        end
+        result.flatten(1)
+      end
+
+      def _hash
+        members.reject {|m| m == "\n"}.hash
+      end
+
+      def _eql?(other)
+        other.members.reject {|m| m == "\n"}.eql?(members.reject {|m| m == "\n"})
+      end
+
+      def path_has_two_subjects?(path)
+        subject = false
+        path.each do |sseq_or_op|
+          next unless sseq_or_op.is_a?(SimpleSequence)
+          next unless sseq_or_op.subject?
+          return true if subject
+          subject = true
+        end
+        false
+      end
+
+      def _sources(seq)
+        s = Set.new
+        seq.map {|sseq_or_op| s.merge sseq_or_op.sources if sseq_or_op.is_a?(SimpleSequence)}
+        s
+      end
+
+      def extended_not_expanded_to_s(extended_not_expanded)
+        extended_not_expanded.map do |choices|
+          choices = choices.map do |sel|
+            next sel.first.to_s if sel.size == 1
+            "#{sel.join ' '}"
+          end
+          next choices.first if choices.size == 1 && !choices.include?(' ')
+          "(#{choices.join ', '})"
+        end.join ' '
+      end
+
+      def has_root?(sseq)
+        sseq.is_a?(SimpleSequence) &&
+          sseq.members.any? {|sel| sel.is_a?(Pseudo) && sel.normalized_name == "root"}
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/simple.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/simple.rb
new file mode 100644
index 0000000..dff4b8a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/simple.rb
@@ -0,0 +1,124 @@
+module Sass
+  module Selector
+    # The abstract superclass for simple selectors
+    # (that is, those that don't compose multiple selectors).
+    class Simple
+      # The line of the Sass template on which this selector was declared.
+      #
+      # @return [Integer]
+      attr_accessor :line
+
+      # The name of the file in which this selector was declared,
+      # or `nil` if it was not declared in a file (e.g. on stdin).
+      #
+      # @return [String, nil]
+      attr_accessor :filename
+
+      # Whether only one instance of this simple selector is allowed in a given
+      # complex selector.
+      #
+      # @return [Boolean]
+      def unique?
+        false
+      end
+
+      # @see #to_s
+      #
+      # @return [String]
+      def inspect
+        to_s
+      end
+
+      # Returns the selector string.
+      #
+      # @param opts [Hash] rendering options.
+      # @option opts [Symbol] :style The css rendering style.
+      # @return [String]
+      def to_s(opts = {})
+        Sass::Util.abstract(self)
+      end
+
+      # Returns a hash code for this selector object.
+      #
+      # By default, this is based on the value of \{#to\_a},
+      # so if that contains information irrelevant to the identity of the selector,
+      # this should be overridden.
+      #
+      # @return [Integer]
+      def hash
+        @_hash ||= equality_key.hash
+      end
+
+      # Checks equality between this and another object.
+      #
+      # By default, this is based on the value of \{#to\_a},
+      # so if that contains information irrelevant to the identity of the selector,
+      # this should be overridden.
+      #
+      # @param other [Object] The object to test equality against
+      # @return [Boolean] Whether or not this is equal to `other`
+      def eql?(other)
+        other.class == self.class && other.hash == hash && other.equality_key == equality_key
+      end
+      alias_method :==, :eql?
+
+      # Unifies this selector with a {SimpleSequence}'s {SimpleSequence#members members array},
+      # returning another `SimpleSequence` members array
+      # that matches both this selector and the input selector.
+      #
+      # By default, this just appends this selector to the end of the array
+      # (or returns the original array if this selector already exists in it).
+      #
+      # @param sels [Array<Simple>] A {SimpleSequence}'s {SimpleSequence#members members array}
+      # @return [Array<Simple>, nil] A {SimpleSequence} {SimpleSequence#members members array}
+      #   matching both `sels` and this selector,
+      #   or `nil` if this is impossible (e.g. unifying `#foo` and `#bar`)
+      # @raise [Sass::SyntaxError] If this selector cannot be unified.
+      #   This will only ever occur when a dynamic selector,
+      #   such as {Parent} or {Interpolation}, is used in unification.
+      #   Since these selectors should be resolved
+      #   by the time extension and unification happen,
+      #   this exception will only ever be raised as a result of programmer error
+      def unify(sels)
+        return sels.first.unify([self]) if sels.length == 1 && sels.first.is_a?(Universal)
+        return sels if sels.any? {|sel2| eql?(sel2)}
+        if !is_a?(Pseudo) || (sels.last.is_a?(Pseudo) && sels.last.type == :element)
+          _, i = sels.each_with_index.find {|sel, _| sel.is_a?(Pseudo)}
+        end
+        return sels + [self] unless i
+        sels[0...i] + [self] + sels[i..-1]
+      end
+
+      protected
+
+      # Returns the key used for testing whether selectors are equal.
+      #
+      # This is a cached version of \{#to\_s}.
+      #
+      # @return [String]
+      def equality_key
+        @equality_key ||= to_s
+      end
+
+      # Unifies two namespaces,
+      # returning a namespace that works for both of them if possible.
+      #
+      # @param ns1 [String, nil] The first namespace.
+      #   `nil` means none specified, e.g. `foo`.
+      #   The empty string means no namespace specified, e.g. `|foo`.
+      #   `"*"` means any namespace is allowed, e.g. `*|foo`.
+      # @param ns2 [String, nil] The second namespace. See `ns1`.
+      # @return [Array(String or nil, Boolean)]
+      #   The first value is the unified namespace, or `nil` for no namespace.
+      #   The second value is whether or not a namespace that works for both inputs
+      #   could be found at all.
+      #   If the second value is `false`, the first should be ignored.
+      def unify_namespaces(ns1, ns2)
+        return ns2, true if ns1 == '*'
+        return ns1, true if ns2 == '*'
+        return nil, false unless ns1 == ns2
+        [ns1, true]
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/simple_sequence.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/simple_sequence.rb
new file mode 100644
index 0000000..13a65d8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/selector/simple_sequence.rb
@@ -0,0 +1,348 @@
+module Sass
+  module Selector
+    # A unseparated sequence of selectors
+    # that all apply to a single element.
+    # For example, `.foo#bar[attr=baz]` is a simple sequence
+    # of the selectors `.foo`, `#bar`, and `[attr=baz]`.
+    class SimpleSequence < AbstractSequence
+      # The array of individual selectors.
+      #
+      # @return [Array<Simple>]
+      attr_accessor :members
+
+      # The extending selectors that caused this selector sequence to be
+      # generated. For example:
+      #
+      #     a.foo { ... }
+      #     b.bar {@extend a}
+      #     c.baz {@extend b}
+      #
+      # The generated selector `b.foo.bar` has `{b.bar}` as its `sources` set,
+      # and the generated selector `c.foo.bar.baz` has `{b.bar, c.baz}` as its
+      # `sources` set.
+      #
+      # This is populated during the {Sequence#do_extend} process.
+      #
+      # @return {Set<Sequence>}
+      attr_accessor :sources
+
+      # This sequence source range.
+      #
+      # @return [Sass::Source::Range]
+      attr_accessor :source_range
+
+      # @see \{#subject?}
+      attr_writer :subject
+
+      # Returns the element or universal selector in this sequence,
+      # if it exists.
+      #
+      # @return [Element, Universal, nil]
+      def base
+        @base ||= (members.first if members.first.is_a?(Element) || members.first.is_a?(Universal))
+      end
+
+      def pseudo_elements
+        @pseudo_elements ||= members.select {|sel| sel.is_a?(Pseudo) && sel.type == :element}
+      end
+
+      def selector_pseudo_classes
+        @selector_pseudo_classes ||= members.
+          select {|sel| sel.is_a?(Pseudo) && sel.type == :class && sel.selector}.
+          group_by {|sel| sel.normalized_name}
+      end
+
+      # Returns the non-base, non-pseudo-element selectors in this sequence.
+      #
+      # @return [Set<Simple>]
+      def rest
+        @rest ||= Set.new(members - [base] - pseudo_elements)
+      end
+
+      # Whether or not this compound selector is the subject of the parent
+      # selector; that is, whether it is prepended with `$` and represents the
+      # actual element that will be selected.
+      #
+      # @return [Boolean]
+      def subject?
+        @subject
+      end
+
+      # @param selectors [Array<Simple>] See \{#members}
+      # @param subject [Boolean] See \{#subject?}
+      # @param source_range [Sass::Source::Range]
+      def initialize(selectors, subject, source_range = nil)
+        @members = selectors
+        @subject = subject
+        @sources = Set.new
+        @source_range = source_range
+      end
+
+      # Resolves the {Parent} selectors within this selector
+      # by replacing them with the given parent selector,
+      # handling commas appropriately.
+      #
+      # @param super_cseq [CommaSequence] The parent selector
+      # @return [CommaSequence] This selector, with parent references resolved
+      # @raise [Sass::SyntaxError] If a parent selector is invalid
+      def resolve_parent_refs(super_cseq)
+        resolved_members = @members.map do |sel|
+          next sel unless sel.is_a?(Pseudo) && sel.selector
+          sel.with_selector(sel.selector.resolve_parent_refs(super_cseq, false))
+        end.flatten
+
+        # Parent selector only appears as the first selector in the sequence
+        unless (parent = resolved_members.first).is_a?(Parent)
+          return CommaSequence.new([Sequence.new([SimpleSequence.new(resolved_members, subject?)])])
+        end
+
+        return super_cseq if @members.size == 1 && parent.suffix.nil?
+
+        CommaSequence.new(super_cseq.members.map do |super_seq|
+          members = super_seq.members.dup
+          newline = members.pop if members.last == "\n"
+          unless members.last.is_a?(SimpleSequence)
+            raise Sass::SyntaxError.new("Invalid parent selector for \"#{self}\": \"" +
+              super_seq.to_s + '"')
+          end
+
+          parent_sub = members.last.members
+          unless parent.suffix.nil?
+            parent_sub = parent_sub.dup
+            parent_sub[-1] = parent_sub.last.dup
+            case parent_sub.last
+            when Sass::Selector::Class, Sass::Selector::Id, Sass::Selector::Placeholder
+              parent_sub[-1] = parent_sub.last.class.new(parent_sub.last.name + parent.suffix)
+            when Sass::Selector::Element
+              parent_sub[-1] = parent_sub.last.class.new(
+                parent_sub.last.name + parent.suffix,
+                parent_sub.last.namespace)
+            when Sass::Selector::Pseudo
+              if parent_sub.last.arg || parent_sub.last.selector
+                raise Sass::SyntaxError.new("Invalid parent selector for \"#{self}\": \"" +
+                  super_seq.to_s + '"')
+              end
+              parent_sub[-1] = Sass::Selector::Pseudo.new(
+                parent_sub.last.type,
+                parent_sub.last.name + parent.suffix,
+                nil, nil)
+            else
+              raise Sass::SyntaxError.new("Invalid parent selector for \"#{self}\": \"" +
+                super_seq.to_s + '"')
+            end
+          end
+
+          Sequence.new(members[0...-1] +
+            [SimpleSequence.new(parent_sub + resolved_members[1..-1], subject?)] +
+            [newline].compact)
+          end)
+      end
+
+      # Non-destructively extends this selector with the extensions specified in a hash
+      # (which should come from {Sass::Tree::Visitors::Cssize}).
+      #
+      # @param extends [{Selector::Simple =>
+      #                  Sass::Tree::Visitors::Cssize::Extend}]
+      #   The extensions to perform on this selector
+      # @param parent_directives [Array<Sass::Tree::DirectiveNode>]
+      #   The directives containing this selector.
+      # @param seen [Set<Array<Selector::Simple>>]
+      #   The set of simple sequences that are currently being replaced.
+      # @param original [Boolean]
+      #   Whether this is the original selector being extended, as opposed to
+      #   the result of a previous extension that's being re-extended.
+      # @return [Array<Sequence>] A list of selectors generated
+      #   by extending this selector with `extends`.
+      # @see CommaSequence#do_extend
+      def do_extend(extends, parent_directives, replace, seen)
+        seen_with_pseudo_selectors = seen.dup
+
+        modified_original = false
+        members = self.members.map do |sel|
+          next sel unless sel.is_a?(Pseudo) && sel.selector
+          next sel if seen.include?([sel])
+          extended = sel.selector.do_extend(extends, parent_directives, replace, seen, false)
+          next sel if extended == sel.selector
+          extended.members.reject! {|seq| seq.invisible?}
+
+          # For `:not()`, we usually want to get rid of any complex
+          # selectors because that will cause the selector to fail to
+          # parse on all browsers at time of writing. We can keep them
+          # if either the original selector had a complex selector, or
+          # the result of extending has only complex selectors,
+          # because either way we aren't breaking anything that isn't
+          # already broken.
+          if sel.normalized_name == 'not' &&
+              (sel.selector.members.none? {|seq| seq.members.length > 1} &&
+               extended.members.any? {|seq| seq.members.length == 1})
+            extended.members.reject! {|seq| seq.members.length > 1}
+          end
+
+          modified_original = true
+          result = sel.with_selector(extended)
+          result.each {|new_sel| seen_with_pseudo_selectors << [new_sel]}
+          result
+        end.flatten
+
+        groups = extends[members.to_set].group_by {|ex| ex.extender}.to_a
+        groups.map! do |seq, group|
+          sels = group.map {|e| e.target}.flatten
+          # If A {@extend B} and C {...},
+          # seq is A, sels is B, and self is C
+
+          self_without_sel = Sass::Util.array_minus(members, sels)
+          group.each {|e| e.success = true}
+          unified = seq.members.last.unify(SimpleSequence.new(self_without_sel, subject?))
+          next unless unified
+          group.each {|e| check_directives_match!(e, parent_directives)}
+          new_seq = Sequence.new(seq.members[0...-1] + [unified])
+          new_seq.add_sources!(sources + [seq])
+          [sels, new_seq]
+        end
+        groups.compact!
+        groups.map! do |sels, seq|
+          next [] if seen.include?(sels)
+          seq.do_extend(
+            extends, parent_directives, false, seen_with_pseudo_selectors + [sels], false)
+        end
+        groups.flatten!
+
+        if modified_original || !replace || groups.empty?
+          # First Law of Extend: the result of extending a selector should
+          # (almost) always contain the base selector.
+          #
+          # See https://github.com/nex3/sass/issues/324.
+          original = Sequence.new([SimpleSequence.new(members, @subject, source_range)])
+          original.add_sources! sources
+          groups.unshift original
+        end
+        groups.uniq!
+        groups
+      end
+
+      # Unifies this selector with another {SimpleSequence}, returning
+      # another `SimpleSequence` that is a subselector of both input
+      # selectors.
+      #
+      # @param other [SimpleSequence]
+      # @return [SimpleSequence, nil] A {SimpleSequence} matching both `sels` and this selector,
+      #   or `nil` if this is impossible (e.g. unifying `#foo` and `#bar`)
+      # @raise [Sass::SyntaxError] If this selector cannot be unified.
+      #   This will only ever occur when a dynamic selector,
+      #   such as {Parent} or {Interpolation}, is used in unification.
+      #   Since these selectors should be resolved
+      #   by the time extension and unification happen,
+      #   this exception will only ever be raised as a result of programmer error
+      def unify(other)
+        sseq = members.inject(other.members) do |member, sel|
+          return unless member
+          sel.unify(member)
+        end
+        return unless sseq
+        SimpleSequence.new(sseq, other.subject? || subject?)
+      end
+
+      # Returns whether or not this selector matches all elements
+      # that the given selector matches (as well as possibly more).
+      #
+      # @example
+      #   (.foo).superselector?(.foo.bar) #=> true
+      #   (.foo).superselector?(.bar) #=> false
+      # @param their_sseq [SimpleSequence]
+      # @param parents [Array<SimpleSequence, String>] The parent selectors of `their_sseq`, if any.
+      # @return [Boolean]
+      def superselector?(their_sseq, parents = [])
+        return false unless base.nil? || base.eql?(their_sseq.base)
+        return false unless pseudo_elements.eql?(their_sseq.pseudo_elements)
+        our_spcs = selector_pseudo_classes
+        their_spcs = their_sseq.selector_pseudo_classes
+
+        # Some psuedo-selectors can be subselectors of non-pseudo selectors.
+        # Pull those out here so we can efficiently check against them below.
+        their_subselector_pseudos = %w(matches any nth-child nth-last-child).
+          map {|name| their_spcs[name] || []}.flatten
+
+        # If `self`'s non-pseudo simple selectors aren't a subset of `their_sseq`'s,
+        # it's definitely not a superselector. This also considers being matched
+        # by `:matches` or `:any`.
+        return false unless rest.all? do |our_sel|
+          next true if our_sel.is_a?(Pseudo) && our_sel.selector
+          next true if their_sseq.rest.include?(our_sel)
+          their_subselector_pseudos.any? do |their_pseudo|
+            their_pseudo.selector.members.all? do |their_seq|
+              next false unless their_seq.members.length == 1
+              their_sseq = their_seq.members.first
+              next false unless their_sseq.is_a?(SimpleSequence)
+              their_sseq.rest.include?(our_sel)
+            end
+          end
+        end
+
+        our_spcs.all? do |_name, pseudos|
+          pseudos.all? {|pseudo| pseudo.superselector?(their_sseq, parents)}
+        end
+      end
+
+      # @see Simple#to_s
+      def to_s(opts = {})
+        res = @members.map {|m| m.to_s(opts)}.join
+
+        # :not(%foo) may resolve to the empty string, but it should match every
+        # selector so we replace it with "*".
+        res = '*' if res.empty?
+
+        res << '!' if subject?
+        res
+      end
+
+      # Returns a string representation of the sequence.
+      # This is basically the selector string.
+      #
+      # @return [String]
+      def inspect
+        res = members.map {|m| m.inspect}.join
+        res << '!' if subject?
+        res
+      end
+
+      # Return a copy of this simple sequence with `sources` merged into the
+      # {SimpleSequence#sources} set.
+      #
+      # @param sources [Set<Sequence>]
+      # @return [SimpleSequence]
+      def with_more_sources(sources)
+        sseq = dup
+        sseq.members = members.dup
+        sseq.sources = self.sources | sources
+        sseq
+      end
+
+      private
+
+      def check_directives_match!(extend, parent_directives)
+        dirs1 = extend.directives.map {|d| d.resolved_value}
+        dirs2 = parent_directives.map {|d| d.resolved_value}
+        return if Sass::Util.subsequence?(dirs1, dirs2)
+        line = extend.node.line
+        filename = extend.node.filename
+
+        # TODO(nweiz): this should use the Sass stack trace of the extend node,
+        # not the selector.
+        raise Sass::SyntaxError.new(<<MESSAGE)
+You may not @extend an outer selector from within #{extend.directives.last.name}.
+You may only @extend selectors within the same directive.
+From "@extend #{extend.target.join(', ')}" on line #{line}#{" of #{filename}" if filename}.
+MESSAGE
+      end
+
+      def _hash
+        [base, rest.hash].hash
+      end
+
+      def _eql?(other)
+        other.base.eql?(base) && other.pseudo_elements == pseudo_elements &&
+          other.rest.eql?(rest) && other.subject? == subject?
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/shared.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/shared.rb
new file mode 100644
index 0000000..1f50995
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/shared.rb
@@ -0,0 +1,76 @@
+module Sass
+  # This module contains functionality that's shared between Haml and Sass.
+  module Shared
+    extend self
+
+    # Scans through a string looking for the interoplation-opening `#{`
+    # and, when it's found, yields the scanner to the calling code
+    # so it can handle it properly.
+    #
+    # The scanner will have any backslashes immediately in front of the `#{`
+    # as the second capture group (`scan[2]`),
+    # and the text prior to that as the first (`scan[1]`).
+    #
+    # @yieldparam scan [StringScanner] The scanner scanning through the string
+    # @return [String] The text remaining in the scanner after all `#{`s have been processed
+    def handle_interpolation(str)
+      scan = Sass::Util::MultibyteStringScanner.new(str)
+      yield scan while scan.scan(/(.*?)(\\*)\#\{/m)
+      scan.rest
+    end
+
+    # Moves a scanner through a balanced pair of characters.
+    # For example:
+    #
+    #     Foo (Bar (Baz bang) bop) (Bang (bop bip))
+    #     ^                       ^
+    #     from                    to
+    #
+    # @param scanner [StringScanner] The string scanner to move
+    # @param start [Character] The character opening the balanced pair.
+    #   A `Fixnum` in 1.8, a `String` in 1.9
+    # @param finish [Character] The character closing the balanced pair.
+    #   A `Fixnum` in 1.8, a `String` in 1.9
+    # @param count [Integer] The number of opening characters matched
+    #   before calling this method
+    # @return [(String, String)] The string matched within the balanced pair
+    #   and the rest of the string.
+    #   `["Foo (Bar (Baz bang) bop)", " (Bang (bop bip))"]` in the example above.
+    def balance(scanner, start, finish, count = 0)
+      str = ''
+      scanner = Sass::Util::MultibyteStringScanner.new(scanner) unless scanner.is_a? StringScanner
+      regexp = Regexp.new("(.*?)[\\#{start.chr}\\#{finish.chr}]", Regexp::MULTILINE)
+      while scanner.scan(regexp)
+        str << scanner.matched
+        count += 1 if scanner.matched[-1] == start
+        count -= 1 if scanner.matched[-1] == finish
+        return [str, scanner.rest] if count == 0
+      end
+    end
+
+    # Formats a string for use in error messages about indentation.
+    #
+    # @param indentation [String] The string used for indentation
+    # @param was [Boolean] Whether or not to add `"was"` or `"were"`
+    #   (depending on how many characters were in `indentation`)
+    # @return [String] The name of the indentation (e.g. `"12 spaces"`, `"1 tab"`)
+    def human_indentation(indentation, was = false)
+      if !indentation.include?(?\t)
+        noun = 'space'
+      elsif !indentation.include?(?\s)
+        noun = 'tab'
+      else
+        return indentation.inspect + (was ? ' was' : '')
+      end
+
+      singular = indentation.length == 1
+      if was
+        was = singular ? ' was' : ' were'
+      else
+        was = ''
+      end
+
+      "#{indentation.length} #{noun}#{'s' unless singular}#{was}"
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/source/map.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/source/map.rb
new file mode 100644
index 0000000..7506a13
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/source/map.rb
@@ -0,0 +1,213 @@
+module Sass::Source
+  class Map
+    # A mapping from one source range to another. Indicates that `input` was
+    # compiled to `output`.
+    #
+    # @!attribute input
+    #   @return [Sass::Source::Range] The source range in the input document.
+    #
+    # @!attribute output
+    #   @return [Sass::Source::Range] The source range in the output document.
+    class Mapping < Struct.new(:input, :output)
+      # @return [String] A string representation of the mapping.
+      def inspect
+        "#{input.inspect} => #{output.inspect}"
+      end
+    end
+
+    # The mapping data ordered by the location in the target.
+    #
+    # @return [Array<Mapping>]
+    attr_reader :data
+
+    def initialize
+      @data = []
+    end
+
+    # Adds a new mapping from one source range to another. Multiple invocations
+    # of this method should have each `output` range come after all previous ranges.
+    #
+    # @param input [Sass::Source::Range]
+    #   The source range in the input document.
+    # @param output [Sass::Source::Range]
+    #   The source range in the output document.
+    def add(input, output)
+      @data.push(Mapping.new(input, output))
+    end
+
+    # Shifts all output source ranges forward one or more lines.
+    #
+    # @param delta [Integer] The number of lines to shift the ranges forward.
+    def shift_output_lines(delta)
+      return if delta == 0
+      @data.each do |m|
+        m.output.start_pos.line += delta
+        m.output.end_pos.line += delta
+      end
+    end
+
+    # Shifts any output source ranges that lie on the first line forward one or
+    # more characters on that line.
+    #
+    # @param delta [Integer] The number of characters to shift the ranges
+    #   forward.
+    def shift_output_offsets(delta)
+      return if delta == 0
+      @data.each do |m|
+        break if m.output.start_pos.line > 1
+        m.output.start_pos.offset += delta
+        m.output.end_pos.offset += delta if m.output.end_pos.line > 1
+      end
+    end
+
+    # Returns the standard JSON representation of the source map.
+    #
+    # If the `:css_uri` option isn't specified, the `:css_path` and
+    # `:sourcemap_path` options must both be specified. Any options may also be
+    # specified alongside the `:css_uri` option. If `:css_uri` isn't specified,
+    # it will be inferred from `:css_path` and `:sourcemap_path` using the
+    # assumption that the local file system has the same layout as the server.
+    #
+    # Regardless of which options are passed to this method, source stylesheets
+    # that are imported using a non-default importer will only be linked to in
+    # the source map if their importers implement
+    # \{Sass::Importers::Base#public\_url\}.
+    #
+    # @option options :css_uri [String]
+    #   The publicly-visible URI of the CSS output file.
+    # @option options :css_path [String]
+    #   The local path of the CSS output file.
+    # @option options :sourcemap_path [String]
+    #   The (eventual) local path of the sourcemap file.
+    # @option options :type [Symbol]
+    #   `:auto` (default),  `:file`, or `:inline`.
+    # @return [String] The JSON string.
+    # @raise [ArgumentError] If neither `:css_uri` nor `:css_path` and
+    #   `:sourcemap_path` are specified.
+    # @comment
+    #   rubocop:disable MethodLength
+    def to_json(options)
+      css_uri, css_path, sourcemap_path =
+        options[:css_uri], options[:css_path], options[:sourcemap_path]
+      unless css_uri || (css_path && sourcemap_path)
+        raise ArgumentError.new("Sass::Source::Map#to_json requires either " \
+          "the :css_uri option or both the :css_path and :soucemap_path options.")
+      end
+      css_path &&= Sass::Util.pathname(File.absolute_path(css_path))
+      sourcemap_path &&= Sass::Util.pathname(File.absolute_path(sourcemap_path))
+      css_uri ||= Sass::Util.file_uri_from_path(
+        Sass::Util.relative_path_from(css_path, sourcemap_path.dirname))
+
+      result = "{\n"
+      write_json_field(result, "version", 3, true)
+
+      source_uri_to_id = {}
+      id_to_source_uri = {}
+      id_to_contents = {} if options[:type] == :inline
+      next_source_id = 0
+      line_data = []
+      segment_data_for_line = []
+
+      # These track data necessary for the delta coding.
+      previous_target_line = nil
+      previous_target_offset = 1
+      previous_source_line = 1
+      previous_source_offset = 1
+      previous_source_id = 0
+
+      @data.each do |m|
+        file, importer = m.input.file, m.input.importer
+
+        next unless importer
+
+        if options[:type] == :inline
+          source_uri = file
+        else
+          sourcemap_dir = sourcemap_path && sourcemap_path.dirname.to_s
+          sourcemap_dir = nil if options[:type] == :file
+          source_uri = importer.public_url(file, sourcemap_dir)
+          next unless source_uri
+        end
+
+        current_source_id = source_uri_to_id[source_uri]
+        unless current_source_id
+          current_source_id = next_source_id
+          next_source_id += 1
+
+          source_uri_to_id[source_uri] = current_source_id
+          id_to_source_uri[current_source_id] = source_uri
+
+          if options[:type] == :inline
+            id_to_contents[current_source_id] =
+              importer.find(file, {}).instance_variable_get('@template')
+          end
+        end
+
+        [
+          [m.input.start_pos, m.output.start_pos],
+          [m.input.end_pos, m.output.end_pos]
+        ].each do |source_pos, target_pos|
+          if previous_target_line != target_pos.line
+            line_data.push(segment_data_for_line.join(",")) unless segment_data_for_line.empty?
+            (target_pos.line - 1 - (previous_target_line || 0)).times {line_data.push("")}
+            previous_target_line = target_pos.line
+            previous_target_offset = 1
+            segment_data_for_line = []
+          end
+
+          # `segment` is a data chunk for a single position mapping.
+          segment = ""
+
+          # Field 1: zero-based starting offset.
+          segment << Sass::Util.encode_vlq(target_pos.offset - previous_target_offset)
+          previous_target_offset = target_pos.offset
+
+          # Field 2: zero-based index into the "sources" list.
+          segment << Sass::Util.encode_vlq(current_source_id - previous_source_id)
+          previous_source_id = current_source_id
+
+          # Field 3: zero-based starting line in the original source.
+          segment << Sass::Util.encode_vlq(source_pos.line - previous_source_line)
+          previous_source_line = source_pos.line
+
+          # Field 4: zero-based starting offset in the original source.
+          segment << Sass::Util.encode_vlq(source_pos.offset - previous_source_offset)
+          previous_source_offset = source_pos.offset
+
+          segment_data_for_line.push(segment)
+
+          previous_target_line = target_pos.line
+        end
+      end
+      line_data.push(segment_data_for_line.join(","))
+      write_json_field(result, "mappings", line_data.join(";"))
+
+      source_names = []
+      (0...next_source_id).each {|id| source_names.push(id_to_source_uri[id].to_s)}
+      write_json_field(result, "sources", source_names)
+
+      if options[:type] == :inline
+        write_json_field(result, "sourcesContent",
+          (0...next_source_id).map {|id| id_to_contents[id]})
+      end
+
+      write_json_field(result, "names", [])
+      write_json_field(result, "file", css_uri)
+
+      result << "\n}"
+      result
+    end
+    # @comment
+    #   rubocop:enable MethodLength
+
+    private
+
+    def write_json_field(out, name, value, is_first = false)
+      out << (is_first ? "" : ",\n") <<
+        "\"" <<
+        Sass::Util.json_escape_string(name) <<
+        "\": " <<
+        Sass::Util.json_value_of(value)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/source/position.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/source/position.rb
new file mode 100644
index 0000000..a62af45
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/source/position.rb
@@ -0,0 +1,39 @@
+module Sass::Source
+  class Position
+    # The one-based line of the document associated with the position.
+    #
+    # @return [Integer]
+    attr_accessor :line
+
+    # The one-based offset in the line of the document associated with the
+    # position.
+    #
+    # @return [Integer]
+    attr_accessor :offset
+
+    # @param line [Integer] The source line
+    # @param offset [Integer] The source offset
+    def initialize(line, offset)
+      @line = line
+      @offset = offset
+    end
+
+    # @return [String] A string representation of the source position.
+    def inspect
+      "#{line.inspect}:#{offset.inspect}"
+    end
+
+    # @param str [String] The string to move through.
+    # @return [Position] The source position after proceeding forward through
+    #   `str`.
+    def after(str)
+      newlines = str.count("\n")
+      Position.new(line + newlines,
+        if newlines == 0
+          offset + str.length
+        else
+          str.length - str.rindex("\n") - 1
+        end)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/source/range.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/source/range.rb
new file mode 100644
index 0000000..de687f9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/source/range.rb
@@ -0,0 +1,41 @@
+module Sass::Source
+  class Range
+    # The starting position of the range in the document (inclusive).
+    #
+    # @return [Sass::Source::Position]
+    attr_accessor :start_pos
+
+    # The ending position of the range in the document (exclusive).
+    #
+    # @return [Sass::Source::Position]
+    attr_accessor :end_pos
+
+    # The file in which this source range appears. This can be nil if the file
+    # is unknown or not yet generated.
+    #
+    # @return [String]
+    attr_accessor :file
+
+    # The importer that imported the file in which this source range appears.
+    # This is nil for target ranges.
+    #
+    # @return [Sass::Importers::Base]
+    attr_accessor :importer
+
+    # @param start_pos [Sass::Source::Position] See \{#start_pos}
+    # @param end_pos [Sass::Source::Position] See \{#end_pos}
+    # @param file [String] See \{#file}
+    # @param importer [Sass::Importers::Base] See \{#importer}
+    def initialize(start_pos, end_pos, file, importer = nil)
+      @start_pos = start_pos
+      @end_pos = end_pos
+      @file = file
+      @importer = importer
+    end
+
+    # @return [String] A string representation of the source range.
+    def inspect
+      "(#{start_pos.inspect} to #{end_pos.inspect}#{" in #{@file}" if @file})"
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/stack.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/stack.rb
new file mode 100644
index 0000000..fb57a97
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/stack.rb
@@ -0,0 +1,140 @@
+module Sass
+  # A class representing the stack when compiling a Sass file.
+  class Stack
+    # TODO: use this to generate stack information for Sass::SyntaxErrors.
+
+    # A single stack frame.
+    class Frame
+      # The filename of the file in which this stack frame was created.
+      #
+      # @return [String]
+      attr_reader :filename
+
+      # The line number on which this stack frame was created.
+      #
+      # @return [String]
+      attr_reader :line
+
+      # The type of this stack frame. This can be `:import`, `:mixin`, or
+      # `:base`.
+      #
+      # `:base` indicates that this is the bottom-most frame, meaning that it
+      # represents a single line of code rather than a nested context. The stack
+      # will only ever have one base frame, and it will always be the most
+      # deeply-nested frame.
+      #
+      # @return [Symbol?]
+      attr_reader :type
+
+      # The name of the stack frame. For mixin frames, this is the mixin name;
+      # otherwise, it's `nil`.
+      #
+      # @return [String?]
+      attr_reader :name
+
+      def initialize(filename, line, type, name = nil)
+        @filename = filename
+        @line = line
+        @type = type
+        @name = name
+      end
+
+      # Whether this frame represents an import.
+      #
+      # @return [Boolean]
+      def is_import?
+        type == :import
+      end
+
+      # Whether this frame represents a mixin.
+      #
+      # @return [Boolean]
+      def is_mixin?
+        type == :mixin
+      end
+
+      # Whether this is the base frame.
+      #
+      # @return [Boolean]
+      def is_base?
+        type == :base
+      end
+    end
+
+    # The stack frames. The last frame is the most deeply-nested.
+    #
+    # @return [Array<Frame>]
+    attr_reader :frames
+
+    def initialize
+      @frames = []
+    end
+
+    # Pushes a base frame onto the stack.
+    #
+    # @param filename [String] See \{Frame#filename}.
+    # @param line [String] See \{Frame#line}.
+    # @yield [] A block in which the new frame is on the stack.
+    def with_base(filename, line)
+      with_frame(filename, line, :base) {yield}
+    end
+
+    # Pushes an import frame onto the stack.
+    #
+    # @param filename [String] See \{Frame#filename}.
+    # @param line [String] See \{Frame#line}.
+    # @yield [] A block in which the new frame is on the stack.
+    def with_import(filename, line)
+      with_frame(filename, line, :import) {yield}
+    end
+
+    # Pushes a mixin frame onto the stack.
+    #
+    # @param filename [String] See \{Frame#filename}.
+    # @param line [String] See \{Frame#line}.
+    # @param name [String] See \{Frame#name}.
+    # @yield [] A block in which the new frame is on the stack.
+    def with_mixin(filename, line, name)
+      with_frame(filename, line, :mixin, name) {yield}
+    end
+
+    # Pushes a function frame onto the stack.
+    #
+    # @param filename [String] See \{Frame#filename}.
+    # @param line [String] See \{Frame#line}.
+    # @param name [String] See \{Frame#name}.
+    # @yield [] A block in which the new frame is on the stack.
+    def with_function(filename, line, name)
+      with_frame(filename, line, :function, name) {yield}
+    end
+
+    # Pushes a function frame onto the stack.
+    #
+    # @param filename [String] See \{Frame#filename}.
+    # @param line [String] See \{Frame#line}.
+    # @param name [String] See \{Frame#name}.
+    # @yield [] A block in which the new frame is on the stack.
+    def with_directive(filename, line, name)
+      with_frame(filename, line, :directive, name) {yield}
+    end
+
+    def to_s
+      (frames.reverse + [nil]).each_cons(2).each_with_index.
+          map do |(frame, caller), i|
+        "#{i == 0 ? 'on' : 'from'} line #{frame.line}" +
+          " of #{frame.filename || 'an unknown file'}" +
+          (caller && caller.name ? ", in `#{caller.name}'" : "")
+      end.join("\n")
+    end
+
+    private
+
+    def with_frame(filename, line, type, name = nil)
+      @frames.pop if @frames.last && @frames.last.type == :base
+      @frames.push(Frame.new(filename, line, type, name))
+      yield
+    ensure
+      @frames.pop unless type == :base && @frames.last && @frames.last.type != :base
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/supports.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/supports.rb
new file mode 100644
index 0000000..6869c4d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/supports.rb
@@ -0,0 +1,225 @@
+# A namespace for the `@supports` condition parse tree.
+module Sass::Supports
+  # The abstract superclass of all Supports conditions.
+  class Condition
+    # Runs the SassScript in the supports condition.
+    #
+    # @param environment [Sass::Environment] The environment in which to run the script.
+    def perform(environment); Sass::Util.abstract(self); end
+
+    # Returns the CSS for this condition.
+    #
+    # @return [String]
+    def to_css; Sass::Util.abstract(self); end
+
+    # Returns the Sass/CSS code for this condition.
+    #
+    # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}).
+    # @return [String]
+    def to_src(options); Sass::Util.abstract(self); end
+
+    # Returns a deep copy of this condition and all its children.
+    #
+    # @return [Condition]
+    def deep_copy; Sass::Util.abstract(self); end
+
+    # Sets the options hash for the script nodes in the supports condition.
+    #
+    # @param options [{Symbol => Object}] The options has to set.
+    def options=(options); Sass::Util.abstract(self); end
+  end
+
+  # An operator condition (e.g. `CONDITION1 and CONDITION2`).
+  class Operator < Condition
+    # The left-hand condition.
+    #
+    # @return [Sass::Supports::Condition]
+    attr_accessor :left
+
+    # The right-hand condition.
+    #
+    # @return [Sass::Supports::Condition]
+    attr_accessor :right
+
+    # The operator ("and" or "or").
+    #
+    # @return [String]
+    attr_accessor :op
+
+    def initialize(left, right, op)
+      @left = left
+      @right = right
+      @op = op
+    end
+
+    def perform(env)
+      @left.perform(env)
+      @right.perform(env)
+    end
+
+    def to_css
+      "#{parens @left, @left.to_css} #{op} #{parens @right, @right.to_css}"
+    end
+
+    def to_src(options)
+      "#{parens @left, @left.to_src(options)} #{op} #{parens @right, @right.to_src(options)}"
+    end
+
+    def deep_copy
+      copy = dup
+      copy.left = @left.deep_copy
+      copy.right = @right.deep_copy
+      copy
+    end
+
+    def options=(options)
+      @left.options = options
+      @right.options = options
+    end
+
+    private
+
+    def parens(condition, str)
+      if condition.is_a?(Negation) || (condition.is_a?(Operator) && condition.op != op)
+        return "(#{str})"
+      else
+        return str
+      end
+    end
+  end
+
+  # A negation condition (`not CONDITION`).
+  class Negation < Condition
+    # The condition being negated.
+    #
+    # @return [Sass::Supports::Condition]
+    attr_accessor :condition
+
+    def initialize(condition)
+      @condition = condition
+    end
+
+    def perform(env)
+      @condition.perform(env)
+    end
+
+    def to_css
+      "not #{parens @condition.to_css}"
+    end
+
+    def to_src(options)
+      "not #{parens @condition.to_src(options)}"
+    end
+
+    def deep_copy
+      copy = dup
+      copy.condition = condition.deep_copy
+      copy
+    end
+
+    def options=(options)
+      condition.options = options
+    end
+
+    private
+
+    def parens(str)
+      return "(#{str})" if @condition.is_a?(Negation) || @condition.is_a?(Operator)
+      str
+    end
+  end
+
+  # A declaration condition (e.g. `(feature: value)`).
+  class Declaration < Condition
+    # @return [Sass::Script::Tree::Node] The feature name.
+    attr_accessor :name
+
+    # @!attribute resolved_name
+    #   The name of the feature after any SassScript has been resolved.
+    #   Only set once \{Tree::Visitors::Perform} has been run.
+    #
+    #   @return [String]
+    attr_accessor :resolved_name
+
+    # The feature value.
+    #
+    # @return [Sass::Script::Tree::Node]
+    attr_accessor :value
+
+    # The value of the feature after any SassScript has been resolved.
+    # Only set once \{Tree::Visitors::Perform} has been run.
+    #
+    # @return [String]
+    attr_accessor :resolved_value
+
+    def initialize(name, value)
+      @name = name
+      @value = value
+    end
+
+    def perform(env)
+      @resolved_name = name.perform(env)
+      @resolved_value = value.perform(env)
+    end
+
+    def to_css
+      "(#{@resolved_name}: #{@resolved_value})"
+    end
+
+    def to_src(options)
+      "(#{@name.to_sass(options)}: #{@value.to_sass(options)})"
+    end
+
+    def deep_copy
+      copy = dup
+      copy.name = @name.deep_copy
+      copy.value = @value.deep_copy
+      copy
+    end
+
+    def options=(options)
+      @name.options = options
+      @value.options = options
+    end
+  end
+
+  # An interpolation condition (e.g. `#{$var}`).
+  class Interpolation < Condition
+    # The SassScript expression in the interpolation.
+    #
+    # @return [Sass::Script::Tree::Node]
+    attr_accessor :value
+
+    # The value of the expression after it's been resolved.
+    # Only set once \{Tree::Visitors::Perform} has been run.
+    #
+    # @return [String]
+    attr_accessor :resolved_value
+
+    def initialize(value)
+      @value = value
+    end
+
+    def perform(env)
+      @resolved_value = value.perform(env).to_s(:quote => :none)
+    end
+
+    def to_css
+      @resolved_value
+    end
+
+    def to_src(options)
+      @value.to_sass(options)
+    end
+
+    def deep_copy
+      copy = dup
+      copy.value = @value.deep_copy
+      copy
+    end
+
+    def options=(options)
+      @value.options = options
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/at_root_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/at_root_node.rb
new file mode 100644
index 0000000..e44d7aa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/at_root_node.rb
@@ -0,0 +1,83 @@
+module Sass
+  module Tree
+    # A dynamic node representing an `@at-root` directive.
+    #
+    # An `@at-root` directive with a selector is converted to an \{AtRootNode}
+    # containing a \{RuleNode} at parse time.
+    #
+    # @see Sass::Tree
+    class AtRootNode < Node
+      # The query for this node (e.g. `(without: media)`),
+      # interspersed with {Sass::Script::Tree::Node}s representing
+      # `#{}`-interpolation. Any adjacent strings will be merged
+      # together.
+      #
+      # This will be nil if the directive didn't have a query. In this
+      # case, {#resolved\_type} will automatically be set to
+      # `:without` and {#resolved\_rule} will automatically be set to `["rule"]`.
+      #
+      # @return [Array<String, Sass::Script::Tree::Node>]
+      attr_accessor :query
+
+      # The resolved type of this directive. `:with` or `:without`.
+      #
+      # @return [Symbol]
+      attr_accessor :resolved_type
+
+      # The resolved value of this directive -- a list of directives
+      # to either include or exclude.
+      #
+      # @return [Array<String>]
+      attr_accessor :resolved_value
+
+      # The number of additional tabs that the contents of this node
+      # should be indented.
+      #
+      # @return [Number]
+      attr_accessor :tabs
+
+      # Whether the last child of this node should be considered the
+      # end of a group.
+      #
+      # @return [Boolean]
+      attr_accessor :group_end
+
+      def initialize(query = nil)
+        super()
+        @query = Sass::Util.strip_string_array(Sass::Util.merge_adjacent_strings(query)) if query
+        @tabs = 0
+      end
+
+      # Returns whether or not the given directive is excluded by this
+      # node. `directive` may be "rule", which indicates whether
+      # normal CSS rules should be excluded.
+      #
+      # @param directive [String]
+      # @return [Boolean]
+      def exclude?(directive)
+        if resolved_type == :with
+          return false if resolved_value.include?('all')
+          !resolved_value.include?(directive)
+        else # resolved_type == :without
+          return true if resolved_value.include?('all')
+          resolved_value.include?(directive)
+        end
+      end
+
+      # Returns whether the given node is excluded by this node.
+      #
+      # @param node [Sass::Tree::Node]
+      # @return [Boolean]
+      def exclude_node?(node)
+        return exclude?(node.name.gsub(/^@/, '')) if node.is_a?(Sass::Tree::DirectiveNode)
+        return exclude?('keyframes') if node.is_a?(Sass::Tree::KeyframeRuleNode)
+        exclude?('rule') && node.is_a?(Sass::Tree::RuleNode)
+      end
+
+      # @see Node#bubbles?
+      def bubbles?
+        true
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/charset_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/charset_node.rb
new file mode 100644
index 0000000..8204d88
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/charset_node.rb
@@ -0,0 +1,22 @@
+module Sass::Tree
+  # A static node representing an unprocessed Sass `@charset` directive.
+  #
+  # @see Sass::Tree
+  class CharsetNode < Node
+    # The name of the charset.
+    #
+    # @return [String]
+    attr_accessor :name
+
+    # @param name [String] see \{#name}
+    def initialize(name)
+      @name = name
+      super()
+    end
+
+    # @see Node#invisible?
+    def invisible?
+      true
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/comment_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/comment_node.rb
new file mode 100644
index 0000000..1b73a15
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/comment_node.rb
@@ -0,0 +1,82 @@
+require 'sass/tree/node'
+
+module Sass::Tree
+  # A static node representing a Sass comment (silent or loud).
+  #
+  # @see Sass::Tree
+  class CommentNode < Node
+    # The text of the comment, not including `/*` and `*/`.
+    # Interspersed with {Sass::Script::Tree::Node}s representing `#{}`-interpolation
+    # if this is a loud comment.
+    #
+    # @return [Array<String, Sass::Script::Tree::Node>]
+    attr_accessor :value
+
+    # The text of the comment
+    # after any interpolated SassScript has been resolved.
+    # Only set once \{Tree::Visitors::Perform} has been run.
+    #
+    # @return [String]
+    attr_accessor :resolved_value
+
+    # The type of the comment. `:silent` means it's never output to CSS,
+    # `:normal` means it's output in every compile mode except `:compressed`,
+    # and `:loud` means it's output even in `:compressed`.
+    #
+    # @return [Symbol]
+    attr_accessor :type
+
+    # @param value [Array<String, Sass::Script::Tree::Node>] See \{#value}
+    # @param type [Symbol] See \{#type}
+    def initialize(value, type)
+      @value = Sass::Util.with_extracted_values(value) {|str| normalize_indentation str}
+      @type = type
+      super()
+    end
+
+    # Compares the contents of two comments.
+    #
+    # @param other [Object] The object to compare with
+    # @return [Boolean] Whether or not this node and the other object
+    #   are the same
+    def ==(other)
+      self.class == other.class && value == other.value && type == other.type
+    end
+
+    # Returns `true` if this is a silent comment
+    # or the current style doesn't render comments.
+    #
+    # Comments starting with ! are never invisible (and the ! is removed from the output.)
+    #
+    # @return [Boolean]
+    def invisible?
+      case @type
+      when :loud; false
+      when :silent; true
+      else; style == :compressed
+      end
+    end
+
+    # Returns the number of lines in the comment.
+    #
+    # @return [Integer]
+    def lines
+      @value.inject(0) do |s, e|
+        next s + e.count("\n") if e.is_a?(String)
+        next s
+      end
+    end
+
+    private
+
+    def normalize_indentation(str)
+      ind = str.split("\n").inject(str[/^[ \t]*/].split("")) do |pre, line|
+        line[/^[ \t]*/].split("").zip(pre).inject([]) do |arr, (a, b)|
+          break arr if a != b
+          arr << a
+        end
+      end.join
+      str.gsub(/^#{ind}/, '')
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/content_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/content_node.rb
new file mode 100644
index 0000000..3f6528f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/content_node.rb
@@ -0,0 +1,9 @@
+module Sass
+  module Tree
+    # A node representing the placement within a mixin of the include statement's content.
+    #
+    # @see Sass::Tree
+    class ContentNode < Node
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/css_import_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/css_import_node.rb
new file mode 100644
index 0000000..d9a5926
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/css_import_node.rb
@@ -0,0 +1,68 @@
+module Sass::Tree
+  # A node representing an `@import` rule that's importing plain CSS.
+  #
+  # @see Sass::Tree
+  class CssImportNode < DirectiveNode
+    # The URI being imported, either as a plain string or an interpolated
+    # script string.
+    #
+    # @return [String, Sass::Script::Tree::Node]
+    attr_accessor :uri
+
+    # The text of the URI being imported after any interpolated SassScript has
+    # been resolved. Only set once {Tree::Visitors::Perform} has been run.
+    #
+    # @return [String]
+    attr_accessor :resolved_uri
+
+    # The supports condition for this import.
+    #
+    # @return [Sass::Supports::Condition]
+    attr_accessor :supports_condition
+
+    # The media query for this rule, interspersed with
+    # {Sass::Script::Tree::Node}s representing `#{}`-interpolation. Any adjacent
+    # strings will be merged together.
+    #
+    # @return [Array<String, Sass::Script::Tree::Node>]
+    attr_accessor :query
+
+    # The media query for this rule, without any unresolved interpolation.
+    # It's only set once {Tree::Visitors::Perform} has been run.
+    #
+    # @return [Sass::Media::QueryList]
+    attr_accessor :resolved_query
+
+    # @param uri [String, Sass::Script::Tree::Node] See \{#uri}
+    # @param query [Array<String, Sass::Script::Tree::Node>] See \{#query}
+    # @param supports_condition [Sass::Supports::Condition] See \{#supports_condition}
+    def initialize(uri, query = [], supports_condition = nil)
+      @uri = uri
+      @query = query
+      @supports_condition = supports_condition
+      super('')
+    end
+
+    # @param uri [String] See \{#resolved_uri}
+    # @return [CssImportNode]
+    def self.resolved(uri)
+      node = new(uri)
+      node.resolved_uri = uri
+      node
+    end
+
+    # @see DirectiveNode#value
+    def value; raise NotImplementedError; end
+
+    # @see DirectiveNode#resolved_value
+    def resolved_value
+      @resolved_value ||=
+        begin
+          str = "@import #{resolved_uri}"
+          str << " supports(#{supports_condition.to_css})" if supports_condition
+          str << " #{resolved_query.to_css}" if resolved_query
+          str
+        end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/debug_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/debug_node.rb
new file mode 100644
index 0000000..5cc2842
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/debug_node.rb
@@ -0,0 +1,18 @@
+module Sass
+  module Tree
+    # A dynamic node representing a Sass `@debug` statement.
+    #
+    # @see Sass::Tree
+    class DebugNode < Node
+      # The expression to print.
+      # @return [Script::Tree::Node]
+      attr_accessor :expr
+
+      # @param expr [Script::Tree::Node] The expression to print
+      def initialize(expr)
+        @expr = expr
+        super()
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/directive_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/directive_node.rb
new file mode 100644
index 0000000..315bb70
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/directive_node.rb
@@ -0,0 +1,59 @@
+module Sass::Tree
+  # A static node representing an unprocessed Sass `@`-directive.
+  # Directives known to Sass, like `@for` and `@debug`,
+  # are handled by their own nodes;
+  # only CSS directives like `@media` and `@font-face` become {DirectiveNode}s.
+  #
+  # `@import` and `@charset` are special cases;
+  # they become {ImportNode}s and {CharsetNode}s, respectively.
+  #
+  # @see Sass::Tree
+  class DirectiveNode < Node
+    # The text of the directive, `@` and all, with interpolation included.
+    #
+    # @return [Array<String, Sass::Script::Tree::Node>]
+    attr_accessor :value
+
+    # The text of the directive after any interpolated SassScript has been resolved.
+    # Only set once \{Tree::Visitors::Perform} has been run.
+    #
+    # @return [String]
+    attr_accessor :resolved_value
+
+    # @see RuleNode#tabs
+    attr_accessor :tabs
+
+    # @see RuleNode#group_end
+    attr_accessor :group_end
+
+    # @param value [Array<String, Sass::Script::Tree::Node>] See \{#value}
+    def initialize(value)
+      @value = value
+      @tabs = 0
+      super()
+    end
+
+    # @param value [String] See \{#resolved_value}
+    # @return [DirectiveNode]
+    def self.resolved(value)
+      node = new([value])
+      node.resolved_value = value
+      node
+    end
+
+    # @return [String] The name of the directive, including `@`.
+    def name
+      @name ||= value.first.gsub(/ .*$/, '')
+    end
+
+    # Strips out any vendor prefixes and downcases the directive name.
+    # @return [String] The normalized name of the directive.
+    def normalized_name
+      @normalized_name ||= name.gsub(/^(@)(?:-[a-zA-Z0-9]+-)?/, '\1').downcase
+    end
+
+    def bubbles?
+      has_children
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/each_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/each_node.rb
new file mode 100644
index 0000000..586cfa7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/each_node.rb
@@ -0,0 +1,24 @@
+require 'sass/tree/node'
+
+module Sass::Tree
+  # A dynamic node representing a Sass `@each` loop.
+  #
+  # @see Sass::Tree
+  class EachNode < Node
+    # The names of the loop variables.
+    # @return [Array<String>]
+    attr_reader :vars
+
+    # The parse tree for the list.
+    # @return [Script::Tree::Node]
+    attr_accessor :list
+
+    # @param vars [Array<String>] The names of the loop variables
+    # @param list [Script::Tree::Node] The parse tree for the list
+    def initialize(vars, list)
+      @vars = vars
+      @list = list
+      super()
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/error_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/error_node.rb
new file mode 100644
index 0000000..203fd62
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/error_node.rb
@@ -0,0 +1,18 @@
+module Sass
+  module Tree
+    # A dynamic node representing a Sass `@error` statement.
+    #
+    # @see Sass::Tree
+    class ErrorNode < Node
+      # The expression to print.
+      # @return [Script::Tree::Node]
+      attr_accessor :expr
+
+      # @param expr [Script::Tree::Node] The expression to print
+      def initialize(expr)
+        @expr = expr
+        super()
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/extend_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/extend_node.rb
new file mode 100644
index 0000000..817c20c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/extend_node.rb
@@ -0,0 +1,43 @@
+require 'sass/tree/node'
+
+module Sass::Tree
+  # A static node representing an `@extend` directive.
+  #
+  # @see Sass::Tree
+  class ExtendNode < Node
+    # The parsed selector after interpolation has been resolved.
+    # Only set once {Tree::Visitors::Perform} has been run.
+    #
+    # @return [Selector::CommaSequence]
+    attr_accessor :resolved_selector
+
+    # The CSS selector to extend, interspersed with {Sass::Script::Tree::Node}s
+    # representing `#{}`-interpolation.
+    #
+    # @return [Array<String, Sass::Script::Tree::Node>]
+    attr_accessor :selector
+
+    # The extended selector source range.
+    #
+    # @return [Sass::Source::Range]
+    attr_accessor :selector_source_range
+
+    # Whether the `@extend` is allowed to match no selectors or not.
+    #
+    # @return [Boolean]
+    def optional?; @optional; end
+
+    # @param selector [Array<String, Sass::Script::Tree::Node>]
+    #   The CSS selector to extend,
+    #   interspersed with {Sass::Script::Tree::Node}s
+    #   representing `#{}`-interpolation.
+    # @param optional [Boolean] See \{ExtendNode#optional?}
+    # @param selector_source_range [Sass::Source::Range] The extended selector source range.
+    def initialize(selector, optional, selector_source_range)
+      @selector = selector
+      @optional = optional
+      @selector_source_range = selector_source_range
+      super()
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/for_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/for_node.rb
new file mode 100644
index 0000000..da3f655
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/for_node.rb
@@ -0,0 +1,36 @@
+require 'sass/tree/node'
+
+module Sass::Tree
+  # A dynamic node representing a Sass `@for` loop.
+  #
+  # @see Sass::Tree
+  class ForNode < Node
+    # The name of the loop variable.
+    # @return [String]
+    attr_reader :var
+
+    # The parse tree for the initial expression.
+    # @return [Script::Tree::Node]
+    attr_accessor :from
+
+    # The parse tree for the final expression.
+    # @return [Script::Tree::Node]
+    attr_accessor :to
+
+    # Whether to include `to` in the loop or stop just before.
+    # @return [Boolean]
+    attr_reader :exclusive
+
+    # @param var [String] See \{#var}
+    # @param from [Script::Tree::Node] See \{#from}
+    # @param to [Script::Tree::Node] See \{#to}
+    # @param exclusive [Boolean] See \{#exclusive}
+    def initialize(var, from, to, exclusive)
+      @var = var
+      @from = from
+      @to = to
+      @exclusive = exclusive
+      super()
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/function_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/function_node.rb
new file mode 100644
index 0000000..c2ca18a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/function_node.rb
@@ -0,0 +1,44 @@
+module Sass
+  module Tree
+    # A dynamic node representing a function definition.
+    #
+    # @see Sass::Tree
+    class FunctionNode < Node
+      # The name of the function.
+      # @return [String]
+      attr_reader :name
+
+      # The arguments to the function. Each element is a tuple
+      # containing the variable for argument and the parse tree for
+      # the default value of the argument
+      #
+      # @return [Array<Script::Tree::Node>]
+      attr_accessor :args
+
+      # The splat argument for this function, if one exists.
+      #
+      # @return [Script::Tree::Node?]
+      attr_accessor :splat
+
+      # Strips out any vendor prefixes.
+      # @return [String] The normalized name of the directive.
+      def normalized_name
+        @normalized_name ||= name.gsub(/^(?:-[a-zA-Z0-9]+-)?/, '\1')
+      end
+
+      # @param name [String] The function name
+      # @param args [Array<(Script::Tree::Node, Script::Tree::Node)>]
+      #   The arguments for the function.
+      # @param splat [Script::Tree::Node] See \{#splat}
+      def initialize(name, args, splat)
+        @name = name
+        @args = args
+        @splat = splat
+        super()
+
+        return unless %w(and or not).include?(name)
+        raise Sass::SyntaxError.new("Invalid function name \"#{name}\".")
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/if_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/if_node.rb
new file mode 100644
index 0000000..ebfec7c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/if_node.rb
@@ -0,0 +1,52 @@
+require 'sass/tree/node'
+
+module Sass::Tree
+  # A dynamic node representing a Sass `@if` statement.
+  #
+  # {IfNode}s are a little odd, in that they also represent `@else` and `@else if`s.
+  # This is done as a linked list:
+  # each {IfNode} has a link (\{#else}) to the next {IfNode}.
+  #
+  # @see Sass::Tree
+  class IfNode < Node
+    # The conditional expression.
+    # If this is nil, this is an `@else` node, not an `@else if`.
+    #
+    # @return [Script::Expr]
+    attr_accessor :expr
+
+    # The next {IfNode} in the if-else list, or `nil`.
+    #
+    # @return [IfNode]
+    attr_accessor :else
+
+    # @param expr [Script::Expr] See \{#expr}
+    def initialize(expr)
+      @expr = expr
+      @last_else = self
+      super()
+    end
+
+    # Append an `@else` node to the end of the list.
+    #
+    # @param node [IfNode] The `@else` node to append
+    def add_else(node)
+      @last_else.else = node
+      @last_else = node
+    end
+
+    def _dump(f)
+      Marshal.dump([expr, self.else, children])
+    end
+
+    def self._load(data)
+      expr, else_, children = Marshal.load(data)
+      node = IfNode.new(expr)
+      node.else = else_
+      node.children = children
+      node.instance_variable_set('@last_else',
+        node.else ? node.else.instance_variable_get('@last_else') : node)
+      node
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/import_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/import_node.rb
new file mode 100644
index 0000000..955bd39
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/import_node.rb
@@ -0,0 +1,75 @@
+module Sass
+  module Tree
+    # A static node that wraps the {Sass::Tree} for an `@import`ed file.
+    # It doesn't have a functional purpose other than to add the `@import`ed file
+    # to the backtrace if an error occurs.
+    class ImportNode < RootNode
+      # The name of the imported file as it appears in the Sass document.
+      #
+      # @return [String]
+      attr_reader :imported_filename
+
+      # Sets the imported file.
+      attr_writer :imported_file
+
+      # @param imported_filename [String] The name of the imported file
+      def initialize(imported_filename)
+        @imported_filename = imported_filename
+        super(nil)
+      end
+
+      def invisible?; to_s.empty?; end
+
+      # Returns the imported file.
+      #
+      # @return [Sass::Engine]
+      # @raise [Sass::SyntaxError] If no file could be found to import.
+      def imported_file
+        @imported_file ||= import
+      end
+
+      # Returns whether or not this import should emit a CSS @import declaration
+      #
+      # @return [Boolean] Whether or not this is a simple CSS @import declaration.
+      def css_import?
+        if @imported_filename =~ /\.css$/
+          @imported_filename
+        elsif imported_file.is_a?(String) && imported_file =~ /\.css$/
+          imported_file
+        end
+      end
+
+      private
+
+      def import
+        paths = @options[:load_paths]
+
+        if @options[:importer]
+          f = @options[:importer].find_relative(
+            @imported_filename, @options[:filename], options_for_importer)
+          return f if f
+        end
+
+        paths.each do |p|
+          f = p.find(@imported_filename, options_for_importer)
+          return f if f
+        end
+
+        lines = ["File to import not found or unreadable: #{@imported_filename}."]
+
+        if paths.size == 1
+          lines << "Load path: #{paths.first}"
+        elsif !paths.empty?
+          lines << "Load paths:\n  #{paths.join("\n  ")}"
+        end
+        raise SyntaxError.new(lines.join("\n"))
+      rescue SyntaxError => e
+        raise SyntaxError.new(e.message, :line => line, :filename => @filename)
+      end
+
+      def options_for_importer
+        @options.merge(:_from_import_node => true)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/keyframe_rule_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/keyframe_rule_node.rb
new file mode 100644
index 0000000..9f75f94
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/keyframe_rule_node.rb
@@ -0,0 +1,15 @@
+module Sass::Tree
+  class KeyframeRuleNode < Node
+    # The text of the directive after any interpolated SassScript has been resolved.
+    # Since this is only a static node, this is the only value property.
+    #
+    # @return [String]
+    attr_accessor :resolved_value
+
+    # @param resolved_value [String] See \{#resolved_value}
+    def initialize(resolved_value)
+      @resolved_value = resolved_value
+      super()
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/media_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/media_node.rb
new file mode 100644
index 0000000..3178de0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/media_node.rb
@@ -0,0 +1,48 @@
+module Sass::Tree
+  # A static node representing a `@media` rule.
+  # `@media` rules behave differently from other directives
+  # in that when they're nested within rules,
+  # they bubble up to top-level.
+  #
+  # @see Sass::Tree
+  class MediaNode < DirectiveNode
+    # TODO: parse and cache the query immediately if it has no dynamic elements
+
+    # The media query for this rule, interspersed with {Sass::Script::Tree::Node}s
+    # representing `#{}`-interpolation. Any adjacent strings will be merged
+    # together.
+    #
+    # @return [Array<String, Sass::Script::Tree::Node>]
+    attr_accessor :query
+
+    # The media query for this rule, without any unresolved interpolation. It's
+    # only set once {Tree::Visitors::Perform} has been run.
+    #
+    # @return [Sass::Media::QueryList]
+    attr_accessor :resolved_query
+
+    # @param query [Array<String, Sass::Script::Tree::Node>] See \{#query}
+    def initialize(query)
+      @query = query
+      super('')
+    end
+
+    # @see DirectiveNode#value
+    def value; raise NotImplementedError; end
+
+    # @see DirectiveNode#name
+    def name; '@media'; end
+
+    # @see DirectiveNode#resolved_value
+    def resolved_value
+      @resolved_value ||= "@media #{resolved_query.to_css}"
+    end
+
+    # True when the directive has no visible children.
+    #
+    # @return [Boolean]
+    def invisible?
+      children.all? {|c| c.invisible?}
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/mixin_def_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/mixin_def_node.rb
new file mode 100644
index 0000000..9ed8bfb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/mixin_def_node.rb
@@ -0,0 +1,38 @@
+module Sass
+  module Tree
+    # A dynamic node representing a mixin definition.
+    #
+    # @see Sass::Tree
+    class MixinDefNode < Node
+      # The mixin name.
+      # @return [String]
+      attr_reader :name
+
+      # The arguments for the mixin.
+      # Each element is a tuple containing the variable for argument
+      # and the parse tree for the default value of the argument.
+      #
+      # @return [Array<(Script::Tree::Node, Script::Tree::Node)>]
+      attr_accessor :args
+
+      # The splat argument for this mixin, if one exists.
+      #
+      # @return [Script::Tree::Node?]
+      attr_accessor :splat
+
+      # Whether the mixin uses `@content`. Set during the nesting check phase.
+      # @return [Boolean]
+      attr_accessor :has_content
+
+      # @param name [String] The mixin name
+      # @param args [Array<(Script::Tree::Node, Script::Tree::Node)>] See \{#args}
+      # @param splat [Script::Tree::Node] See \{#splat}
+      def initialize(name, args, splat)
+        @name = name
+        @args = args
+        @splat = splat
+        super()
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/mixin_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/mixin_node.rb
new file mode 100644
index 0000000..48592c1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/mixin_node.rb
@@ -0,0 +1,52 @@
+require 'sass/tree/node'
+
+module Sass::Tree
+  # A static node representing a mixin include.
+  # When in a static tree, the sole purpose is to wrap exceptions
+  # to add the mixin to the backtrace.
+  #
+  # @see Sass::Tree
+  class MixinNode < Node
+    # The name of the mixin.
+    # @return [String]
+    attr_reader :name
+
+    # The arguments to the mixin.
+    # @return [Array<Script::Tree::Node>]
+    attr_accessor :args
+
+    # A hash from keyword argument names to values.
+    # @return [Sass::Util::NormalizedMap<Script::Tree::Node>]
+    attr_accessor :keywords
+
+    # The first splat argument for this mixin, if one exists.
+    #
+    # This could be a list of positional arguments, a map of keyword
+    # arguments, or an arglist containing both.
+    #
+    # @return [Node?]
+    attr_accessor :splat
+
+    # The second splat argument for this mixin, if one exists.
+    #
+    # If this exists, it's always a map of keyword arguments, and
+    # \{#splat} is always either a list or an arglist.
+    #
+    # @return [Node?]
+    attr_accessor :kwarg_splat
+
+    # @param name [String] The name of the mixin
+    # @param args [Array<Script::Tree::Node>] See \{#args}
+    # @param splat [Script::Tree::Node] See \{#splat}
+    # @param kwarg_splat [Script::Tree::Node] See \{#kwarg_splat}
+    # @param keywords [Sass::Util::NormalizedMap<Script::Tree::Node>] See \{#keywords}
+    def initialize(name, args, keywords, splat, kwarg_splat)
+      @name = name
+      @args = args
+      @keywords = keywords
+      @splat = splat
+      @kwarg_splat = kwarg_splat
+      super()
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/node.rb
new file mode 100644
index 0000000..06932f5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/node.rb
@@ -0,0 +1,240 @@
+module Sass
+  # A namespace for nodes in the Sass parse tree.
+  #
+  # The Sass parse tree has three states: dynamic, static Sass, and static CSS.
+  #
+  # When it's first parsed, a Sass document is in the dynamic state.
+  # It has nodes for mixin definitions and `@for` loops and so forth,
+  # in addition to nodes for CSS rules and properties.
+  # Nodes that only appear in this state are called **dynamic nodes**.
+  #
+  # {Tree::Visitors::Perform} creates a static Sass tree, which is
+  # different. It still has nodes for CSS rules and properties but it
+  # doesn't have any dynamic-generation-related nodes. The nodes in
+  # this state are in a similar structure to the Sass document: rules
+  # and properties are nested beneath one another, although the
+  # {Tree::RuleNode} selectors are already in their final state. Nodes
+  # that can be in this state or in the dynamic state are called
+  # **static nodes**; nodes that can only be in this state are called
+  # **solely static nodes**.
+  #
+  # {Tree::Visitors::Cssize} is then used to create a static CSS tree.
+  # This is like a static Sass tree,
+  # but the structure exactly mirrors that of the generated CSS.
+  # Rules and properties can't be nested beneath one another in this state.
+  #
+  # Finally, {Tree::Visitors::ToCss} can be called on a static CSS tree
+  # to get the actual CSS code as a string.
+  module Tree
+    # The abstract superclass of all parse-tree nodes.
+    class Node
+      include Enumerable
+
+      def self.inherited(base)
+        node_name = base.name.gsub(/.*::(.*?)Node$/, '\\1').downcase
+        base.instance_eval <<-METHODS
+          # @return [Symbol] The name that is used for this node when visiting.
+          def node_name
+            :#{node_name}
+          end
+
+          # @return [Symbol] The method that is used on the visitor to visit nodes of this type.
+          def visit_method
+            :visit_#{node_name}
+          end
+
+          # @return [Symbol] The method name that determines if the parent is invalid.
+          def invalid_child_method_name
+            :"invalid_#{node_name}_child?"
+          end
+
+          # @return [Symbol] The method name that determines if the node is an invalid parent.
+          def invalid_parent_method_name
+            :"invalid_#{node_name}_parent?"
+          end
+        METHODS
+      end
+
+      # The child nodes of this node.
+      #
+      # @return [Array<Tree::Node>]
+      attr_reader :children
+
+      # Whether or not this node has child nodes.
+      # This may be true even when \{#children} is empty,
+      # in which case this node has an empty block (e.g. `{}`).
+      #
+      # @return [Boolean]
+      attr_accessor :has_children
+
+      # The line of the document on which this node appeared.
+      #
+      # @return [Integer]
+      attr_accessor :line
+
+      # The source range in the document on which this node appeared.
+      #
+      # @return [Sass::Source::Range]
+      attr_accessor :source_range
+
+      # The name of the document on which this node appeared.
+      #
+      # @return [String]
+      attr_writer :filename
+
+      # The options hash for the node.
+      # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
+      #
+      # @return [{Symbol => Object}]
+      attr_reader :options
+
+      def initialize
+        @children = []
+        @filename = nil
+        @options = nil
+      end
+
+      # Sets the options hash for the node and all its children.
+      #
+      # @param options [{Symbol => Object}] The options
+      # @see #options
+      def options=(options)
+        Sass::Tree::Visitors::SetOptions.visit(self, options)
+      end
+
+      # @private
+      def children=(children)
+        self.has_children ||= !children.empty?
+        @children = children
+      end
+
+      # The name of the document on which this node appeared.
+      #
+      # @return [String]
+      def filename
+        @filename || (@options && @options[:filename])
+      end
+
+      # Appends a child to the node.
+      #
+      # @param child [Tree::Node, Array<Tree::Node>] The child node or nodes
+      # @raise [Sass::SyntaxError] if `child` is invalid
+      def <<(child)
+        return if child.nil?
+        if child.is_a?(Array)
+          child.each {|c| self << c}
+        else
+          self.has_children = true
+          @children << child
+        end
+      end
+
+      # Compares this node and another object (only other {Tree::Node}s will be equal).
+      # This does a structural comparison;
+      # if the contents of the nodes and all the child nodes are equivalent,
+      # then the nodes are as well.
+      #
+      # Only static nodes need to override this.
+      #
+      # @param other [Object] The object to compare with
+      # @return [Boolean] Whether or not this node and the other object
+      #   are the same
+      # @see Sass::Tree
+      def ==(other)
+        self.class == other.class && other.children == children
+      end
+
+      # True if \{#to\_s} will return `nil`;
+      # that is, if the node shouldn't be rendered.
+      # Should only be called in a static tree.
+      #
+      # @return [Boolean]
+      def invisible?; false; end
+
+      # The output style. See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
+      #
+      # @return [Symbol]
+      def style
+        @options[:style]
+      end
+
+      # Computes the CSS corresponding to this static CSS tree.
+      #
+      # @return [String] The resulting CSS
+      # @see Sass::Tree
+      def css
+        Sass::Tree::Visitors::ToCss.new.visit(self)
+      end
+
+      # Computes the CSS corresponding to this static CSS tree, along with
+      # the respective source map.
+      #
+      # @return [(String, Sass::Source::Map)] The resulting CSS and the source map
+      # @see Sass::Tree
+      def css_with_sourcemap
+        visitor = Sass::Tree::Visitors::ToCss.new(:build_source_mapping)
+        result = visitor.visit(self)
+        return result, visitor.source_mapping
+      end
+
+      # Returns a representation of the node for debugging purposes.
+      #
+      # @return [String]
+      def inspect
+        return self.class.to_s unless has_children
+        "(#{self.class} #{children.map {|c| c.inspect}.join(' ')})"
+      end
+
+      # Iterates through each node in the tree rooted at this node
+      # in a pre-order walk.
+      #
+      # @yield node
+      # @yieldparam node [Node] a node in the tree
+      def each
+        yield self
+        children.each {|c| c.each {|n| yield n}}
+      end
+
+      # Converts a node to Sass code that will generate it.
+      #
+      # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize})
+      # @return [String] The Sass code corresponding to the node
+      def to_sass(options = {})
+        Sass::Tree::Visitors::Convert.visit(self, options, :sass)
+      end
+
+      # Converts a node to SCSS code that will generate it.
+      #
+      # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize})
+      # @return [String] The Sass code corresponding to the node
+      def to_scss(options = {})
+        Sass::Tree::Visitors::Convert.visit(self, options, :scss)
+      end
+
+      # Return a deep clone of this node.
+      # The child nodes are cloned, but options are not.
+      #
+      # @return [Node]
+      def deep_copy
+        Sass::Tree::Visitors::DeepCopy.visit(self)
+      end
+
+      # Whether or not this node bubbles up through RuleNodes.
+      #
+      # @return [Boolean]
+      def bubbles?
+        false
+      end
+
+      protected
+
+      # @see Sass::Shared.balance
+      # @raise [Sass::SyntaxError] if the brackets aren't balanced
+      def balance(*args)
+        res = Sass::Shared.balance(*args)
+        return res if res
+        raise Sass::SyntaxError.new("Unbalanced brackets.", :line => line)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/prop_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/prop_node.rb
new file mode 100644
index 0000000..7ce8bdd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/prop_node.rb
@@ -0,0 +1,162 @@
+module Sass::Tree
+  # A static node representing a CSS property.
+  #
+  # @see Sass::Tree
+  class PropNode < Node
+    # The name of the property,
+    # interspersed with {Sass::Script::Tree::Node}s
+    # representing `#{}`-interpolation.
+    # Any adjacent strings will be merged together.
+    #
+    # @return [Array<String, Sass::Script::Tree::Node>]
+    attr_accessor :name
+
+    # The name of the property
+    # after any interpolated SassScript has been resolved.
+    # Only set once \{Tree::Visitors::Perform} has been run.
+    #
+    # @return [String]
+    attr_accessor :resolved_name
+
+    # The value of the property.
+    #
+    # For most properties, this will just contain a single Node. However, for
+    # CSS variables, it will contain multiple strings and nodes representing
+    # interpolation. Any adjacent strings will be merged together.
+    #
+    # @return [Array<String, Sass::Script::Tree::Node>]
+    attr_accessor :value
+
+    # The value of the property
+    # after any interpolated SassScript has been resolved.
+    # Only set once \{Tree::Visitors::Perform} has been run.
+    #
+    # @return [String]
+    attr_accessor :resolved_value
+
+    # How deep this property is indented
+    # relative to a normal property.
+    # This is only greater than 0 in the case that:
+    #
+    # * This node is in a CSS tree
+    # * The style is :nested
+    # * This is a child property of another property
+    # * The parent property has a value, and thus will be rendered
+    #
+    # @return [Integer]
+    attr_accessor :tabs
+
+    # The source range in which the property name appears.
+    #
+    # @return [Sass::Source::Range]
+    attr_accessor :name_source_range
+
+    # The source range in which the property value appears.
+    #
+    # @return [Sass::Source::Range]
+    attr_accessor :value_source_range
+
+    # Whether this represents a CSS custom property.
+    #
+    # @return [Boolean]
+    def custom_property?
+      name.first.is_a?(String) && name.first.start_with?("--")
+    end
+
+    # @param name [Array<String, Sass::Script::Tree::Node>] See \{#name}
+    # @param value [Array<String, Sass::Script::Tree::Node>] See \{#value}
+    # @param prop_syntax [Symbol] `:new` if this property uses `a: b`-style syntax,
+    #   `:old` if it uses `:a b`-style syntax
+    def initialize(name, value, prop_syntax)
+      @name = Sass::Util.strip_string_array(
+        Sass::Util.merge_adjacent_strings(name))
+      @value = Sass::Util.merge_adjacent_strings(value)
+      @value = Sass::Util.strip_string_array(@value) unless custom_property?
+      @tabs = 0
+      @prop_syntax = prop_syntax
+      super()
+    end
+
+    # Compares the names and values of two properties.
+    #
+    # @param other [Object] The object to compare with
+    # @return [Boolean] Whether or not this node and the other object
+    #   are the same
+    def ==(other)
+      self.class == other.class && name == other.name && value == other.value && super
+    end
+
+    # Returns a appropriate message indicating how to escape pseudo-class selectors.
+    # This only applies for old-style properties with no value,
+    # so returns the empty string if this is new-style.
+    #
+    # @return [String] The message
+    def pseudo_class_selector_message
+      if @prop_syntax == :new ||
+          custom_property? ||
+          !value.first.is_a?(Sass::Script::Tree::Literal) ||
+          !value.first.value.is_a?(Sass::Script::Value::String) ||
+          !value.first.value.value.empty?
+        return ""
+      end
+
+      "\nIf #{declaration.dump} should be a selector, use \"\\#{declaration}\" instead."
+    end
+
+    # Computes the Sass or SCSS code for the variable declaration.
+    # This is like \{#to\_scss} or \{#to\_sass},
+    # except it doesn't print any child properties or a trailing semicolon.
+    #
+    # @param opts [{Symbol => Object}] The options hash for the tree.
+    # @param fmt [Symbol] `:scss` or `:sass`.
+    def declaration(opts = {:old => @prop_syntax == :old}, fmt = :sass)
+      name = self.name.map {|n| n.is_a?(String) ? n : n.to_sass(opts)}.join
+      value = self.value.map {|n| n.is_a?(String) ? n : n.to_sass(opts)}.join
+      value = "(#{value})" if value_needs_parens?
+
+      if name[0] == ?:
+        raise Sass::SyntaxError.new("The \"#{name}: #{value}\"" +
+                                    " hack is not allowed in the Sass indented syntax")
+      end
+
+      # The indented syntax doesn't support newlines in custom property values,
+      # but we can losslessly convert them to spaces instead.
+      value = value.tr("\n", " ") if fmt == :sass
+
+      old = opts[:old] && fmt == :sass
+      "#{old ? ':' : ''}#{name}#{old ? '' : ':'}#{custom_property? ? '' : ' '}#{value}".rstrip
+    end
+
+    # A property node is invisible if its value is empty.
+    #
+    # @return [Boolean]
+    def invisible?
+      !custom_property? && resolved_value.empty?
+    end
+
+    private
+
+    # Returns whether \{#value} neesd parentheses in order to be parsed
+    # properly as division.
+    def value_needs_parens?
+      return false if custom_property?
+
+      root = value.first
+      root.is_a?(Sass::Script::Tree::Operation) &&
+        root.operator == :div &&
+        root.operand1.is_a?(Sass::Script::Tree::Literal) &&
+        root.operand1.value.is_a?(Sass::Script::Value::Number) &&
+        root.operand1.value.original.nil? &&
+        root.operand2.is_a?(Sass::Script::Tree::Literal) &&
+        root.operand2.value.is_a?(Sass::Script::Value::Number) &&
+        root.operand2.value.original.nil?
+    end
+
+    def check!
+      return unless @options[:property_syntax] && @options[:property_syntax] != @prop_syntax
+      raise Sass::SyntaxError.new(
+        "Illegal property syntax: can't use #{@prop_syntax} syntax when " +
+        ":property_syntax => #{@options[:property_syntax].inspect} is set.")
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/return_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/return_node.rb
new file mode 100644
index 0000000..3056406
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/return_node.rb
@@ -0,0 +1,19 @@
+module Sass
+  module Tree
+    # A dynamic node representing returning from a function.
+    #
+    # @see Sass::Tree
+    class ReturnNode < Node
+      # The expression to return.
+      #
+      # @return [Script::Tree::Node]
+      attr_accessor :expr
+
+      # @param expr [Script::Tree::Node] The expression to return
+      def initialize(expr)
+        @expr = expr
+        super()
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/root_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/root_node.rb
new file mode 100644
index 0000000..1f02cbd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/root_node.rb
@@ -0,0 +1,44 @@
+module Sass
+  module Tree
+    # A static node that is the root node of the Sass document.
+    class RootNode < Node
+      # The Sass template from which this node was created
+      #
+      # @param template [String]
+      attr_reader :template
+
+      # @param template [String] The Sass template from which this node was created
+      def initialize(template)
+        super()
+        @template = template
+      end
+
+      # Runs the dynamic Sass code and computes the CSS for the tree.
+      #
+      # @return [String] The compiled CSS.
+      def render
+        css_tree.css
+      end
+
+      # Runs the dynamic Sass code and computes the CSS for the tree, along with
+      # the sourcemap.
+      #
+      # @return [(String, Sass::Source::Map)] The compiled CSS, as well as
+      #   the source map. @see #render
+      def render_with_sourcemap
+        css_tree.css_with_sourcemap
+      end
+
+      private
+
+      def css_tree
+        Visitors::CheckNesting.visit(self)
+        result = Visitors::Perform.visit(self)
+        Visitors::CheckNesting.visit(result) # Check again to validate mixins
+        result, extends = Visitors::Cssize.visit(result)
+        Visitors::Extend.visit(result, extends)
+        result
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/rule_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/rule_node.rb
new file mode 100644
index 0000000..e3a1404
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/rule_node.rb
@@ -0,0 +1,156 @@
+require 'pathname'
+
+module Sass::Tree
+  # A static node representing a CSS rule.
+  #
+  # @see Sass::Tree
+  class RuleNode < Node
+    # The character used to include the parent selector
+    PARENT = '&'
+
+    # The CSS selector for this rule,
+    # interspersed with {Sass::Script::Tree::Node}s
+    # representing `#{}`-interpolation.
+    # Any adjacent strings will be merged together.
+    #
+    # @return [Array<String, Sass::Script::Tree::Node>]
+    attr_accessor :rule
+
+    # The CSS selector for this rule, without any unresolved
+    # interpolation but with parent references still intact. It's only
+    # guaranteed to be set once {Tree::Visitors::Perform} has been
+    # run, but it may be set before then for optimization reasons.
+    #
+    # @return [Selector::CommaSequence]
+    attr_accessor :parsed_rules
+
+    # The CSS selector for this rule, without any unresolved
+    # interpolation or parent references. It's only set once
+    # {Tree::Visitors::Perform} has been run.
+    #
+    # @return [Selector::CommaSequence]
+    attr_accessor :resolved_rules
+
+    # How deep this rule is indented
+    # relative to a base-level rule.
+    # This is only greater than 0 in the case that:
+    #
+    # * This node is in a CSS tree
+    # * The style is :nested
+    # * This is a child rule of another rule
+    # * The parent rule has properties, and thus will be rendered
+    #
+    # @return [Integer]
+    attr_accessor :tabs
+
+    # The entire selector source range for this rule.
+    # @return [Sass::Source::Range]
+    attr_accessor :selector_source_range
+
+    # Whether or not this rule is the last rule in a nested group.
+    # This is only set in a CSS tree.
+    #
+    # @return [Boolean]
+    attr_accessor :group_end
+
+    # The stack trace.
+    # This is only readable in a CSS tree as it is written during the perform step
+    # and only when the :trace_selectors option is set.
+    #
+    # @return [String]
+    attr_accessor :stack_trace
+
+    # @param rule [Array<String, Sass::Script::Tree::Node>, Sass::Selector::CommaSequence]
+    #   The CSS rule, either unparsed or parsed.
+    # @param selector_source_range [Sass::Source::Range]
+    def initialize(rule, selector_source_range = nil)
+      if rule.is_a?(Sass::Selector::CommaSequence)
+        @rule = [rule.to_s]
+        @parsed_rules = rule
+      else
+        merged = Sass::Util.merge_adjacent_strings(rule)
+        @rule = Sass::Util.strip_string_array(merged)
+        try_to_parse_non_interpolated_rules
+      end
+      @selector_source_range = selector_source_range
+      @tabs = 0
+      super()
+    end
+
+    # If we've precached the parsed selector, set the line on it, too.
+    def line=(line)
+      @parsed_rules.line = line if @parsed_rules
+      super
+    end
+
+    # If we've precached the parsed selector, set the filename on it, too.
+    def filename=(filename)
+      @parsed_rules.filename = filename if @parsed_rules
+      super
+    end
+
+    # Compares the contents of two rules.
+    #
+    # @param other [Object] The object to compare with
+    # @return [Boolean] Whether or not this node and the other object
+    #   are the same
+    def ==(other)
+      self.class == other.class && rule == other.rule && super
+    end
+
+    # Adds another {RuleNode}'s rules to this one's.
+    #
+    # @param node [RuleNode] The other node
+    def add_rules(node)
+      @rule = Sass::Util.strip_string_array(
+        Sass::Util.merge_adjacent_strings(@rule + ["\n"] + node.rule))
+      try_to_parse_non_interpolated_rules
+    end
+
+    # @return [Boolean] Whether or not this rule is continued on the next line
+    def continued?
+      last = @rule.last
+      last.is_a?(String) && last[-1] == ?,
+    end
+
+    # A hash that will be associated with this rule in the CSS document
+    # if the {file:SASS_REFERENCE.md#debug_info-option `:debug_info` option} is enabled.
+    # This data is used by e.g. [the FireSass Firebug
+    # extension](https://addons.mozilla.org/en-US/firefox/addon/103988).
+    #
+    # @return [{#to_s => #to_s}]
+    def debug_info
+      {:filename => filename &&
+         ("file://" + URI::DEFAULT_PARSER.escape(File.expand_path(filename))),
+       :line => line}
+    end
+
+    # A rule node is invisible if it has only placeholder selectors.
+    def invisible?
+      resolved_rules.members.all? {|seq| seq.invisible?}
+    end
+
+    private
+
+    def try_to_parse_non_interpolated_rules
+      @parsed_rules = nil
+      return unless @rule.all? {|t| t.is_a?(String)}
+
+      # We don't use real filename/line info because we don't have it yet.
+      # When we get it, we'll set it on the parsed rules if possible.
+      parser = nil
+      warnings = Sass::Util.silence_warnings do
+        parser = Sass::SCSS::StaticParser.new(@rule.join.strip, nil, nil, 1)
+        # rubocop:disable RescueModifier
+        @parsed_rules = parser.parse_selector rescue nil
+        # rubocop:enable RescueModifier
+
+        $stderr.string
+      end
+
+      # If parsing produces a warning, throw away the result so we can parse
+      # later with the real filename info.
+      @parsed_rules = nil unless warnings.empty?
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/supports_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/supports_node.rb
new file mode 100644
index 0000000..1a2f04b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/supports_node.rb
@@ -0,0 +1,38 @@
+module Sass::Tree
+  # A static node representing a `@supports` rule.
+  #
+  # @see Sass::Tree
+  class SupportsNode < DirectiveNode
+    # The name, which may include a browser prefix.
+    #
+    # @return [String]
+    attr_accessor :name
+
+    # The supports condition.
+    #
+    # @return [Sass::Supports::Condition]
+    attr_accessor :condition
+
+    # @param condition [Sass::Supports::Condition] See \{#condition}
+    def initialize(name, condition)
+      @name = name
+      @condition = condition
+      super('')
+    end
+
+    # @see DirectiveNode#value
+    def value; raise NotImplementedError; end
+
+    # @see DirectiveNode#resolved_value
+    def resolved_value
+      @resolved_value ||= "@#{name} #{condition.to_css}"
+    end
+
+    # True when the directive has no visible children.
+    #
+    # @return [Boolean]
+    def invisible?
+      children.all? {|c| c.invisible?}
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/trace_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/trace_node.rb
new file mode 100644
index 0000000..2c71e88
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/trace_node.rb
@@ -0,0 +1,33 @@
+require 'sass/tree/node'
+
+module Sass::Tree
+  # A solely static node left over after a mixin include or @content has been performed.
+  # Its sole purpose is to wrap exceptions to add to the backtrace.
+  #
+  # @see Sass::Tree
+  class TraceNode < Node
+    # The name of the trace entry to add.
+    #
+    # @return [String]
+    attr_reader :name
+
+    # @param name [String] The name of the trace entry to add.
+    def initialize(name)
+      @name = name
+      self.has_children = true
+      super()
+    end
+
+    # Initializes this node from an existing node.
+    # @param name [String] The name of the trace entry to add.
+    # @param node [Node] The node to copy information from.
+    # @return [TraceNode]
+    def self.from_node(name, node)
+      trace = new(name)
+      trace.line = node.line
+      trace.filename = node.filename
+      trace.options = node.options
+      trace
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/variable_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/variable_node.rb
new file mode 100644
index 0000000..2c0ed55
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/variable_node.rb
@@ -0,0 +1,36 @@
+module Sass
+  module Tree
+    # A dynamic node representing a variable definition.
+    #
+    # @see Sass::Tree
+    class VariableNode < Node
+      # The name of the variable.
+      # @return [String]
+      attr_reader :name
+
+      # The parse tree for the variable value.
+      # @return [Script::Tree::Node]
+      attr_accessor :expr
+
+      # Whether this is a guarded variable assignment (`!default`).
+      # @return [Boolean]
+      attr_reader :guarded
+
+      # Whether this is a global variable assignment (`!global`).
+      # @return [Boolean]
+      attr_reader :global
+
+      # @param name [String] The name of the variable
+      # @param expr [Script::Tree::Node] See \{#expr}
+      # @param guarded [Boolean] See \{#guarded}
+      # @param global [Boolean] See \{#global}
+      def initialize(name, expr, guarded, global)
+        @name = name
+        @expr = expr
+        @guarded = guarded
+        @global = global
+        super()
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/base.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/base.rb
new file mode 100644
index 0000000..2c8e134
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/base.rb
@@ -0,0 +1,72 @@
+# Visitors are used to traverse the Sass parse tree.
+# Visitors should extend {Visitors::Base},
+# which provides a small amount of scaffolding for traversal.
+module Sass::Tree::Visitors
+  # The abstract base class for Sass visitors.
+  # Visitors should extend this class,
+  # then implement `visit_*` methods for each node they care about
+  # (e.g. `visit_rule` for {RuleNode} or `visit_for` for {ForNode}).
+  # These methods take the node in question as argument.
+  # They may `yield` to visit the child nodes of the current node.
+  #
+  # *Note*: due to the unusual nature of {Sass::Tree::IfNode},
+  # special care must be taken to ensure that it is properly handled.
+  # In particular, there is no built-in scaffolding
+  # for dealing with the return value of `@else` nodes.
+  #
+  # @abstract
+  class Base
+    # Runs the visitor on a tree.
+    #
+    # @param root [Tree::Node] The root node of the Sass tree.
+    # @return [Object] The return value of \{#visit} for the root node.
+    def self.visit(root)
+      new.send(:visit, root)
+    end
+
+    protected
+
+    # Runs the visitor on the given node.
+    # This can be overridden by subclasses that need to do something for each node.
+    #
+    # @param node [Tree::Node] The node to visit.
+    # @return [Object] The return value of the `visit_*` method for this node.
+    def visit(node)
+      if respond_to?(node.class.visit_method, true)
+        send(node.class.visit_method, node) {visit_children(node)}
+      else
+        visit_children(node)
+      end
+    end
+
+    # Visit the child nodes for a given node.
+    # This can be overridden by subclasses that need to do something
+    # with the child nodes' return values.
+    #
+    # This method is run when `visit_*` methods `yield`,
+    # and its return value is returned from the `yield`.
+    #
+    # @param parent [Tree::Node] The parent node of the children to visit.
+    # @return [Array<Object>] The return values of the `visit_*` methods for the children.
+    def visit_children(parent)
+      parent.children.map {|c| visit(c)}
+    end
+
+    # Returns the name of a node as used in the `visit_*` method.
+    #
+    # @param [Tree::Node] node The node.
+    # @return [String] The name.
+    def self.node_name(node)
+      Sass::Util.deprecated(self, "Call node.class.node_name instead.")
+      node.class.node_name
+    end
+
+    # `yield`s, then runs the visitor on the `@else` clause if the node has one.
+    # This exists to ensure that the contents of the `@else` clause get visited.
+    def visit_if(node)
+      yield
+      visit(node.else) if node.else
+      node
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/check_nesting.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/check_nesting.rb
new file mode 100644
index 0000000..05541ef
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/check_nesting.rb
@@ -0,0 +1,173 @@
+# A visitor for checking that all nodes are properly nested.
+class Sass::Tree::Visitors::CheckNesting < Sass::Tree::Visitors::Base
+  protected
+
+  def initialize
+    @parents = []
+    @parent = nil
+    @current_mixin_def = nil
+  end
+
+  def visit(node)
+    if (error = @parent && (
+        try_send(@parent.class.invalid_child_method_name, @parent, node) ||
+        try_send(node.class.invalid_parent_method_name, @parent, node)))
+      raise Sass::SyntaxError.new(error)
+    end
+    super
+  rescue Sass::SyntaxError => e
+    e.modify_backtrace(:filename => node.filename, :line => node.line)
+    raise e
+  end
+
+  CONTROL_NODES = [Sass::Tree::EachNode, Sass::Tree::ForNode, Sass::Tree::IfNode,
+                   Sass::Tree::WhileNode, Sass::Tree::TraceNode]
+  SCRIPT_NODES = [Sass::Tree::ImportNode] + CONTROL_NODES
+  def visit_children(parent)
+    old_parent = @parent
+
+    # When checking a static tree, resolve at-roots to be sure they won't send
+    # nodes where they don't belong.
+    if parent.is_a?(Sass::Tree::AtRootNode) && parent.resolved_value
+      old_parents = @parents
+      @parents = @parents.reject {|p| parent.exclude_node?(p)}
+      @parent = @parents.reverse.each_with_index.
+        find {|p, i| !transparent_parent?(p, @parents[-i - 2])}.first
+
+      begin
+        return super
+      ensure
+        @parents = old_parents
+        @parent = old_parent
+      end
+    end
+
+    unless transparent_parent?(parent, old_parent)
+      @parent = parent
+    end
+
+    @parents.push parent
+    begin
+      super
+    ensure
+      @parent = old_parent
+      @parents.pop
+    end
+  end
+
+  def visit_root(node)
+    yield
+  rescue Sass::SyntaxError => e
+    e.sass_template ||= node.template
+    raise e
+  end
+
+  def visit_import(node)
+    yield
+  rescue Sass::SyntaxError => e
+    e.modify_backtrace(:filename => node.children.first.filename)
+    e.add_backtrace(:filename => node.filename, :line => node.line)
+    raise e
+  end
+
+  def visit_mixindef(node)
+    @current_mixin_def, old_mixin_def = node, @current_mixin_def
+    yield
+  ensure
+    @current_mixin_def = old_mixin_def
+  end
+
+  def invalid_content_parent?(parent, child)
+    if @current_mixin_def
+      @current_mixin_def.has_content = true
+      nil
+    else
+      "@content may only be used within a mixin."
+    end
+  end
+
+  def invalid_charset_parent?(parent, child)
+    "@charset may only be used at the root of a document." unless parent.is_a?(Sass::Tree::RootNode)
+  end
+
+  VALID_EXTEND_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::MixinDefNode, Sass::Tree::MixinNode]
+  def invalid_extend_parent?(parent, child)
+    return if is_any_of?(parent, VALID_EXTEND_PARENTS)
+    "Extend directives may only be used within rules."
+  end
+
+  INVALID_IMPORT_PARENTS = CONTROL_NODES +
+    [Sass::Tree::MixinDefNode, Sass::Tree::MixinNode]
+  def invalid_import_parent?(parent, child)
+    unless (@parents.map {|p| p.class} & INVALID_IMPORT_PARENTS).empty?
+      return "Import directives may not be used within control directives or mixins."
+    end
+    return if parent.is_a?(Sass::Tree::RootNode)
+    return "CSS import directives may only be used at the root of a document." if child.css_import?
+  rescue Sass::SyntaxError => e
+    e.modify_backtrace(:filename => child.imported_file.options[:filename])
+    e.add_backtrace(:filename => child.filename, :line => child.line)
+    raise e
+  end
+
+  def invalid_mixindef_parent?(parent, child)
+    return if (@parents.map {|p| p.class} & INVALID_IMPORT_PARENTS).empty?
+    "Mixins may not be defined within control directives or other mixins."
+  end
+
+  def invalid_function_parent?(parent, child)
+    return if (@parents.map {|p| p.class} & INVALID_IMPORT_PARENTS).empty?
+    "Functions may not be defined within control directives or other mixins."
+  end
+
+  VALID_FUNCTION_CHILDREN = [
+    Sass::Tree::CommentNode,  Sass::Tree::DebugNode, Sass::Tree::ReturnNode,
+    Sass::Tree::VariableNode, Sass::Tree::WarnNode, Sass::Tree::ErrorNode
+  ] + CONTROL_NODES
+  def invalid_function_child?(parent, child)
+    return if is_any_of?(child, VALID_FUNCTION_CHILDREN)
+    "Functions can only contain variable declarations and control directives."
+  end
+
+  VALID_PROP_CHILDREN = CONTROL_NODES + [Sass::Tree::CommentNode,
+                                         Sass::Tree::PropNode,
+                                         Sass::Tree::MixinNode]
+  def invalid_prop_child?(parent, child)
+    return if is_any_of?(child, VALID_PROP_CHILDREN)
+    "Illegal nesting: Only properties may be nested beneath properties."
+  end
+
+  VALID_PROP_PARENTS = [Sass::Tree::RuleNode, Sass::Tree::KeyframeRuleNode, Sass::Tree::PropNode,
+                        Sass::Tree::MixinDefNode, Sass::Tree::DirectiveNode, Sass::Tree::MixinNode]
+  def invalid_prop_parent?(parent, child)
+    return if is_any_of?(parent, VALID_PROP_PARENTS)
+    "Properties are only allowed within rules, directives, mixin includes, or other properties." +
+      child.pseudo_class_selector_message
+  end
+
+  def invalid_return_parent?(parent, child)
+    "@return may only be used within a function." unless parent.is_a?(Sass::Tree::FunctionNode)
+  end
+
+  private
+
+  # Whether `parent` should be assigned to `@parent`.
+  def transparent_parent?(parent, grandparent)
+    is_any_of?(parent, SCRIPT_NODES) ||
+      (parent.bubbles? &&
+       !grandparent.is_a?(Sass::Tree::RootNode) &&
+       !grandparent.is_a?(Sass::Tree::AtRootNode))
+  end
+
+  def is_any_of?(val, classes)
+    classes.each do |c|
+      return true if val.is_a?(c)
+    end
+    false
+  end
+
+  def try_send(method, *args)
+    return unless respond_to?(method, true)
+    send(method, *args)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/convert.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/convert.rb
new file mode 100644
index 0000000..ded21a2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/convert.rb
@@ -0,0 +1,350 @@
+# A visitor for converting a Sass tree into a source string.
+class Sass::Tree::Visitors::Convert < Sass::Tree::Visitors::Base
+  # Runs the visitor on a tree.
+  #
+  # @param root [Tree::Node] The root node of the Sass tree.
+  # @param options [{Symbol => Object}] An options hash (see {Sass::CSS#initialize}).
+  # @param format [Symbol] `:sass` or `:scss`.
+  # @return [String] The Sass or SCSS source for the tree.
+  def self.visit(root, options, format)
+    new(options, format).send(:visit, root)
+  end
+
+  protected
+
+  def initialize(options, format)
+    @options = options
+    @format = format
+    @tabs = 0
+    # 2 spaces by default
+    @tab_chars = @options[:indent] || "  "
+    @is_else = false
+  end
+
+  def visit_children(parent)
+    @tabs += 1
+    return @format == :sass ? "\n" : " {}\n" if parent.children.empty?
+
+    res = visit_rule_level(parent.children)
+
+    if @format == :sass
+      "\n" + res.rstrip + "\n"
+    else
+      " {\n" + res.rstrip + "\n#{@tab_chars * (@tabs - 1)}}\n"
+    end
+  ensure
+    @tabs -= 1
+  end
+
+  # Ensures proper spacing between top-level nodes.
+  def visit_root(node)
+    visit_rule_level(node.children)
+  end
+
+  def visit_charset(node)
+    "#{tab_str}@charset \"#{node.name}\"#{semi}\n"
+  end
+
+  def visit_comment(node)
+    value = interp_to_src(node.value)
+    if @format == :sass
+      content = value.gsub(%r{\*/$}, '').rstrip
+      if content =~ /\A[ \t]/
+        # Re-indent SCSS comments like this:
+        #     /* foo
+        #   bar
+        #       baz */
+        content.gsub!(/^/, '   ')
+        content.sub!(%r{\A([ \t]*)/\*}, '/*\1')
+      end
+
+      if content.include?("\n")
+        content.gsub!(/\n \*/, "\n  ")
+        spaces = content.scan(/\n( *)/).map {|s| s.first.size}.min
+        sep = node.type == :silent ? "\n//" : "\n *"
+        if spaces >= 2
+          content.gsub!(/\n  /, sep)
+        else
+          content.gsub!(/\n#{' ' * spaces}/, sep)
+        end
+      end
+
+      content.gsub!(%r{\A/\*}, '//') if node.type == :silent
+      content.gsub!(/^/, tab_str)
+      content = content.rstrip + "\n"
+    else
+      spaces = (@tab_chars * [@tabs - value[/^ */].size, 0].max)
+      content = if node.type == :silent
+                  value.gsub(%r{^[/ ]\*}, '//').gsub(%r{ *\*/$}, '')
+                else
+                  value
+                end.gsub(/^/, spaces) + "\n"
+    end
+    content
+  end
+
+  def visit_debug(node)
+    "#{tab_str}@debug #{node.expr.to_sass(@options)}#{semi}\n"
+  end
+
+  def visit_error(node)
+    "#{tab_str}@error #{node.expr.to_sass(@options)}#{semi}\n"
+  end
+
+  def visit_directive(node)
+    res = "#{tab_str}#{interp_to_src(node.value)}"
+    res.gsub!(/^@import \#\{(.*)\}([^}]*)$/, '@import \1\2')
+    return res + "#{semi}\n" unless node.has_children
+    res + yield
+  end
+
+  def visit_each(node)
+    vars = node.vars.map {|var| "$#{dasherize(var)}"}.join(", ")
+    "#{tab_str}@each #{vars} in #{node.list.to_sass(@options)}#{yield}"
+  end
+
+  def visit_extend(node)
+    "#{tab_str}@extend #{selector_to_src(node.selector).lstrip}" +
+      "#{' !optional' if node.optional?}#{semi}\n"
+  end
+
+  def visit_for(node)
+    "#{tab_str}@for $#{dasherize(node.var)} from #{node.from.to_sass(@options)} " +
+      "#{node.exclusive ? 'to' : 'through'} #{node.to.to_sass(@options)}#{yield}"
+  end
+
+  def visit_function(node)
+    args = node.args.map do |v, d|
+      d ? "#{v.to_sass(@options)}: #{d.to_sass(@options)}" : v.to_sass(@options)
+    end.join(", ")
+    if node.splat
+      args << ", " unless node.args.empty?
+      args << node.splat.to_sass(@options) << "..."
+    end
+
+    "#{tab_str}@function #{dasherize(node.name)}(#{args})#{yield}"
+  end
+
+  def visit_if(node)
+    name =
+      if !@is_else
+        "if"
+      elsif node.expr
+        "else if"
+      else
+        "else"
+      end
+    @is_else = false
+    str = "#{tab_str}@#{name}"
+    str << " #{node.expr.to_sass(@options)}" if node.expr
+    str << yield
+    @is_else = true
+    str << visit(node.else) if node.else
+    str
+  ensure
+    @is_else = false
+  end
+
+  def visit_import(node)
+    quote = @format == :scss ? '"' : ''
+    "#{tab_str}@import #{quote}#{node.imported_filename}#{quote}#{semi}\n"
+  end
+
+  def visit_media(node)
+    "#{tab_str}@media #{query_interp_to_src(node.query)}#{yield}"
+  end
+
+  def visit_supports(node)
+    "#{tab_str}@#{node.name} #{node.condition.to_src(@options)}#{yield}"
+  end
+
+  def visit_cssimport(node)
+    if node.uri.is_a?(Sass::Script::Tree::Node)
+      str = "#{tab_str}@import #{node.uri.to_sass(@options)}"
+    else
+      str = "#{tab_str}@import #{node.uri}"
+    end
+    str << " supports(#{node.supports_condition.to_src(@options)})" if node.supports_condition
+    str << " #{interp_to_src(node.query)}" unless node.query.empty?
+    "#{str}#{semi}\n"
+  end
+
+  def visit_mixindef(node)
+    args =
+      if node.args.empty? && node.splat.nil?
+        ""
+      else
+        str = '('
+        str << node.args.map do |v, d|
+          if d
+            "#{v.to_sass(@options)}: #{d.to_sass(@options)}"
+          else
+            v.to_sass(@options)
+          end
+        end.join(", ")
+
+        if node.splat
+          str << ", " unless node.args.empty?
+          str << node.splat.to_sass(@options) << '...'
+        end
+
+        str << ')'
+      end
+
+    "#{tab_str}#{@format == :sass ? '=' : '@mixin '}#{dasherize(node.name)}#{args}#{yield}"
+  end
+
+  def visit_mixin(node)
+    arg_to_sass = lambda do |arg|
+      sass = arg.to_sass(@options)
+      sass = "(#{sass})" if arg.is_a?(Sass::Script::Tree::ListLiteral) && arg.separator == :comma
+      sass
+    end
+
+    unless node.args.empty? && node.keywords.empty? && node.splat.nil?
+      args = node.args.map(&arg_to_sass)
+      keywords = node.keywords.as_stored.to_a.map {|k, v| "$#{dasherize(k)}: #{arg_to_sass[v]}"}
+
+      if node.splat
+        splat = "#{arg_to_sass[node.splat]}..."
+        kwarg_splat = "#{arg_to_sass[node.kwarg_splat]}..." if node.kwarg_splat
+      end
+
+      arglist = "(#{[args, splat, keywords, kwarg_splat].flatten.compact.join(', ')})"
+    end
+    "#{tab_str}#{@format == :sass ? '+' : '@include '}" +
+      "#{dasherize(node.name)}#{arglist}#{node.has_children ? yield : semi}\n"
+  end
+
+  def visit_content(node)
+    "#{tab_str}@content#{semi}\n"
+  end
+
+  def visit_prop(node)
+    res = tab_str + node.declaration(@options, @format)
+    return res + semi + "\n" if node.children.empty?
+    res + yield.rstrip + semi + "\n"
+  end
+
+  def visit_return(node)
+    "#{tab_str}@return #{node.expr.to_sass(@options)}#{semi}\n"
+  end
+
+  def visit_rule(node)
+    rule = node.parsed_rules ? [node.parsed_rules.to_s] : node.rule
+    if @format == :sass
+      name = selector_to_sass(rule)
+      name = "\\" + name if name[0] == ?:
+      name.gsub(/^/, tab_str) + yield
+    elsif @format == :scss
+      name = selector_to_scss(rule)
+      res = name + yield
+      if node.children.last.is_a?(Sass::Tree::CommentNode) && node.children.last.type == :silent
+        res.slice!(-3..-1)
+        res << "\n" << tab_str << "}\n"
+      end
+      res
+    end
+  end
+
+  def visit_variable(node)
+    "#{tab_str}$#{dasherize(node.name)}: #{node.expr.to_sass(@options)}" +
+      "#{' !global' if node.global}#{' !default' if node.guarded}#{semi}\n"
+  end
+
+  def visit_warn(node)
+    "#{tab_str}@warn #{node.expr.to_sass(@options)}#{semi}\n"
+  end
+
+  def visit_while(node)
+    "#{tab_str}@while #{node.expr.to_sass(@options)}#{yield}"
+  end
+
+  def visit_atroot(node)
+    if node.query
+      "#{tab_str}@at-root #{query_interp_to_src(node.query)}#{yield}"
+    elsif node.children.length == 1 && node.children.first.is_a?(Sass::Tree::RuleNode)
+      rule = node.children.first
+      "#{tab_str}@at-root #{selector_to_src(rule.rule).lstrip}#{visit_children(rule)}"
+    else
+      "#{tab_str}@at-root#{yield}"
+    end
+  end
+
+  def visit_keyframerule(node)
+    "#{tab_str}#{node.resolved_value}#{yield}"
+  end
+
+  private
+
+  # Visit rule-level nodes and return their conversion with appropriate
+  # whitespace added.
+  def visit_rule_level(nodes)
+    (nodes + [nil]).each_cons(2).map do |child, nxt|
+      visit(child) +
+        if nxt &&
+            (child.is_a?(Sass::Tree::CommentNode) && child.line + child.lines + 1 == nxt.line) ||
+            (child.is_a?(Sass::Tree::ImportNode) && nxt.is_a?(Sass::Tree::ImportNode) &&
+              child.line + 1 == nxt.line) ||
+            (child.is_a?(Sass::Tree::VariableNode) && nxt.is_a?(Sass::Tree::VariableNode) &&
+              child.line + 1 == nxt.line) ||
+            (child.is_a?(Sass::Tree::PropNode) && nxt.is_a?(Sass::Tree::PropNode)) ||
+            (child.is_a?(Sass::Tree::MixinNode) && nxt.is_a?(Sass::Tree::MixinNode) &&
+              child.line + 1 == nxt.line)
+          ""
+        else
+          "\n"
+        end
+    end.join.rstrip + "\n"
+  end
+
+  def interp_to_src(interp)
+    interp.map {|r| r.is_a?(String) ? r : r.to_sass(@options)}.join
+  end
+
+  # Like interp_to_src, but removes the unnecessary `#{}` around the keys and
+  # values in query expressions.
+  def query_interp_to_src(interp)
+    interp = interp.map do |e|
+      next e unless e.is_a?(Sass::Script::Tree::Literal)
+      next e unless e.value.is_a?(Sass::Script::Value::String)
+      e.value.value
+    end
+
+    interp_to_src(interp)
+  end
+
+  def selector_to_src(sel)
+    @format == :sass ? selector_to_sass(sel) : selector_to_scss(sel)
+  end
+
+  def selector_to_sass(sel)
+    sel.map do |r|
+      if r.is_a?(String)
+        r.gsub(/(,)?([ \t]*)\n\s*/) {$1 ? "#{$1}#{$2}\n" : " "}
+      else
+        r.to_sass(@options)
+      end
+    end.join
+  end
+
+  def selector_to_scss(sel)
+    interp_to_src(sel).gsub(/^[ \t]*/, tab_str).gsub(/[ \t]*$/, '')
+  end
+
+  def semi
+    @format == :sass ? "" : ";"
+  end
+
+  def tab_str
+    @tab_chars * @tabs
+  end
+
+  def dasherize(s)
+    if @options[:dasherize]
+      s.tr('_', '-')
+    else
+      s
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/cssize.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/cssize.rb
new file mode 100644
index 0000000..6851286
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/cssize.rb
@@ -0,0 +1,362 @@
+# A visitor for converting a static Sass tree into a static CSS tree.
+class Sass::Tree::Visitors::Cssize < Sass::Tree::Visitors::Base
+  # @param root [Tree::Node] The root node of the tree to visit.
+  # @return [(Tree::Node, Sass::Util::SubsetMap)] The resulting tree of static nodes
+  #   *and* the extensions defined for this tree
+  def self.visit(root); super; end
+
+  protected
+
+  # Returns the immediate parent of the current node.
+  # @return [Tree::Node]
+  def parent
+    @parents.last
+  end
+
+  def initialize
+    @parents = []
+    @extends = Sass::Util::SubsetMap.new
+  end
+
+  # If an exception is raised, this adds proper metadata to the backtrace.
+  def visit(node)
+    super(node)
+  rescue Sass::SyntaxError => e
+    e.modify_backtrace(:filename => node.filename, :line => node.line)
+    raise e
+  end
+
+  # Keeps track of the current parent node.
+  def visit_children(parent)
+    with_parent parent do
+      parent.children = visit_children_without_parent(parent)
+      parent
+    end
+  end
+
+  # Like {#visit\_children}, but doesn't set {#parent}.
+  #
+  # @param node [Sass::Tree::Node]
+  # @return [Array<Sass::Tree::Node>] the flattened results of
+  #   visiting all the children of `node`
+  def visit_children_without_parent(node)
+    node.children.map {|c| visit(c)}.flatten
+  end
+
+  # Runs a block of code with the current parent node
+  # replaced with the given node.
+  #
+  # @param parent [Tree::Node] The new parent for the duration of the block.
+  # @yield A block in which the parent is set to `parent`.
+  # @return [Object] The return value of the block.
+  def with_parent(parent)
+    @parents.push parent
+    yield
+  ensure
+    @parents.pop
+  end
+
+  # Converts the entire document to CSS.
+  #
+  # @return [(Tree::Node, Sass::Util::SubsetMap)] The resulting tree of static nodes
+  #   *and* the extensions defined for this tree
+  def visit_root(node)
+    yield
+
+    if parent.nil?
+      imports_to_move = []
+      import_limit = nil
+      i = -1
+      node.children.reject! do |n|
+        i += 1
+        if import_limit
+          next false unless n.is_a?(Sass::Tree::CssImportNode)
+          imports_to_move << n
+          next true
+        end
+
+        if !n.is_a?(Sass::Tree::CommentNode) &&
+            !n.is_a?(Sass::Tree::CharsetNode) &&
+            !n.is_a?(Sass::Tree::CssImportNode)
+          import_limit = i
+        end
+
+        false
+      end
+
+      if import_limit
+        node.children = node.children[0...import_limit] + imports_to_move +
+          node.children[import_limit..-1]
+      end
+    end
+
+    return node, @extends
+  rescue Sass::SyntaxError => e
+    e.sass_template ||= node.template
+    raise e
+  end
+
+  # A simple struct wrapping up information about a single `@extend` instance. A
+  # single {ExtendNode} can have multiple Extends if either the parent node or
+  # the extended selector is a comma sequence.
+  #
+  # @attr extender [Sass::Selector::Sequence]
+  #   The selector of the CSS rule containing the `@extend`.
+  # @attr target [Array<Sass::Selector::Simple>] The selector being `@extend`ed.
+  # @attr node [Sass::Tree::ExtendNode] The node that produced this extend.
+  # @attr directives [Array<Sass::Tree::DirectiveNode>]
+  #   The directives containing the `@extend`.
+  # @attr success [Boolean]
+  #   Whether this extend successfully matched a selector.
+  Extend = Struct.new(:extender, :target, :node, :directives, :success)
+
+  # Registers an extension in the `@extends` subset map.
+  def visit_extend(node)
+    parent.resolved_rules.populate_extends(@extends, node.resolved_selector, node,
+      @parents.select {|p| p.is_a?(Sass::Tree::DirectiveNode)})
+    []
+  end
+
+  # Modifies exception backtraces to include the imported file.
+  def visit_import(node)
+    visit_children_without_parent(node)
+  rescue Sass::SyntaxError => e
+    e.modify_backtrace(:filename => node.children.first.filename)
+    e.add_backtrace(:filename => node.filename, :line => node.line)
+    raise e
+  end
+
+  # Asserts that all the traced children are valid in their new location.
+  def visit_trace(node)
+    visit_children_without_parent(node)
+  rescue Sass::SyntaxError => e
+    e.modify_backtrace(:mixin => node.name, :filename => node.filename, :line => node.line)
+    e.add_backtrace(:filename => node.filename, :line => node.line)
+    raise e
+  end
+
+  # Converts nested properties into flat properties
+  # and updates the indentation of the prop node based on the nesting level.
+  def visit_prop(node)
+    if parent.is_a?(Sass::Tree::PropNode)
+      node.resolved_name = "#{parent.resolved_name}-#{node.resolved_name}"
+      node.tabs = parent.tabs + (parent.resolved_value.empty? ? 0 : 1) if node.style == :nested
+    end
+
+    yield
+
+    result = node.children.dup
+    if !node.resolved_value.empty? || node.children.empty?
+      node.send(:check!)
+      result.unshift(node)
+    end
+
+    result
+  end
+
+  def visit_atroot(node)
+    # If there aren't any more directives or rules that this @at-root needs to
+    # exclude, we can get rid of it and just evaluate the children.
+    if @parents.none? {|n| node.exclude_node?(n)}
+      results = visit_children_without_parent(node)
+      results.each {|c| c.tabs += node.tabs if bubblable?(c)}
+      if !results.empty? && bubblable?(results.last)
+        results.last.group_end = node.group_end
+      end
+      return results
+    end
+
+    # If this @at-root excludes the immediate parent, return it as-is so that it
+    # can be bubbled up by the parent node.
+    return Bubble.new(node) if node.exclude_node?(parent)
+
+    # Otherwise, duplicate the current parent and move it into the @at-root
+    # node. As above, returning an @at-root node signals to the parent directive
+    # that it should be bubbled upwards.
+    bubble(node)
+  end
+
+  # The following directives are visible and have children. This means they need
+  # to be able to handle bubbling up nodes such as @at-root and @media.
+
+  # Updates the indentation of the rule node based on the nesting
+  # level. The selectors were resolved in {Perform}.
+  def visit_rule(node)
+    yield
+
+    rules = node.children.select {|c| bubblable?(c)}
+    props = node.children.reject {|c| bubblable?(c) || c.invisible?}
+
+    unless props.empty?
+      node.children = props
+      rules.each {|r| r.tabs += 1} if node.style == :nested
+      rules.unshift(node)
+    end
+
+    rules = debubble(rules)
+    unless parent.is_a?(Sass::Tree::RuleNode) || rules.empty? || !bubblable?(rules.last)
+      rules.last.group_end = true
+    end
+    rules
+  end
+
+  def visit_keyframerule(node)
+    return node unless node.has_children
+
+    yield
+
+    debubble(node.children, node)
+  end
+
+  # Bubbles a directive up through RuleNodes.
+  def visit_directive(node)
+    return node unless node.has_children
+    if parent.is_a?(Sass::Tree::RuleNode)
+      # @keyframes shouldn't include the rule nodes, so we manually create a
+      # bubble that doesn't have the parent's contents for them.
+      return node.normalized_name == '@keyframes' ? Bubble.new(node) : bubble(node)
+    end
+
+    yield
+
+    # Since we don't know if the mere presence of an unknown directive may be
+    # important, we should keep an empty version around even if all the contents
+    # are removed via @at-root. However, if the contents are just bubbled out,
+    # we don't need to do so.
+    directive_exists = node.children.any? do |child|
+      next true unless child.is_a?(Bubble)
+      next false unless child.node.is_a?(Sass::Tree::DirectiveNode)
+      child.node.resolved_value == node.resolved_value
+    end
+
+    # We know empty @keyframes directives do nothing.
+    if directive_exists || node.name == '@keyframes'
+      []
+    else
+      empty_node = node.dup
+      empty_node.children = []
+      [empty_node]
+    end + debubble(node.children, node)
+  end
+
+  # Bubbles the `@media` directive up through RuleNodes
+  # and merges it with other `@media` directives.
+  def visit_media(node)
+    return bubble(node) if parent.is_a?(Sass::Tree::RuleNode)
+    return Bubble.new(node) if parent.is_a?(Sass::Tree::MediaNode)
+
+    yield
+
+    debubble(node.children, node) do |child|
+      next child unless child.is_a?(Sass::Tree::MediaNode)
+      # Copies of `node` can be bubbled, and we don't want to merge it with its
+      # own query.
+      next child if child.resolved_query == node.resolved_query
+      next child if child.resolved_query = child.resolved_query.merge(node.resolved_query)
+    end
+  end
+
+  # Bubbles the `@supports` directive up through RuleNodes.
+  def visit_supports(node)
+    return node unless node.has_children
+    return bubble(node) if parent.is_a?(Sass::Tree::RuleNode)
+
+    yield
+
+    debubble(node.children, node)
+  end
+
+  private
+
+  # "Bubbles" `node` one level by copying the parent and wrapping `node`'s
+  # children with it.
+  #
+  # @param node [Sass::Tree::Node].
+  # @return [Bubble]
+  def bubble(node)
+    new_rule = parent.dup
+    new_rule.children = node.children
+    node.children = [new_rule]
+    Bubble.new(node)
+  end
+
+  # Pops all bubbles in `children` and intersperses the results with the other
+  # values.
+  #
+  # If `parent` is passed, it's copied and used as the parent node for the
+  # nested portions of `children`.
+  #
+  # @param children [List<Sass::Tree::Node, Bubble>]
+  # @param parent [Sass::Tree::Node]
+  # @yield [node] An optional block for processing bubbled nodes. Each bubbled
+  #   node will be passed to this block.
+  # @yieldparam node [Sass::Tree::Node] A bubbled node.
+  # @yieldreturn [Sass::Tree::Node?] A node to use in place of the bubbled node.
+  #   This can be the node itself, or `nil` to indicate that the node should be
+  #   omitted.
+  # @return [List<Sass::Tree::Node, Bubble>]
+  def debubble(children, parent = nil)
+    # Keep track of the previous parent so that we don't divide `parent`
+    # unnecessarily if the `@at-root` doesn't produce any new nodes (e.g.
+    # `@at-root {@extend %foo}`).
+    previous_parent = nil
+
+    Sass::Util.slice_by(children) {|c| c.is_a?(Bubble)}.map do |(is_bubble, slice)|
+      unless is_bubble
+        next slice unless parent
+        if previous_parent
+          previous_parent.children.push(*slice)
+          next []
+        else
+          previous_parent = new_parent = parent.dup
+          new_parent.children = slice
+          next new_parent
+        end
+      end
+
+      slice.map do |bubble|
+        next unless (node = block_given? ? yield(bubble.node) : bubble.node)
+        node.tabs += bubble.tabs
+        node.group_end = bubble.group_end
+        results = [visit(node)].flatten
+        previous_parent = nil unless results.empty?
+        results
+      end.compact
+    end.flatten
+  end
+
+  # Returns whether or not a node can be bubbled up through the syntax tree.
+  #
+  # @param node [Sass::Tree::Node]
+  # @return [Boolean]
+  def bubblable?(node)
+    node.is_a?(Sass::Tree::RuleNode) || node.bubbles?
+  end
+
+  # A wrapper class for a node that indicates to the parent that it should
+  # treat the wrapped node as a sibling rather than a child.
+  #
+  # Nodes should be wrapped before they're passed to \{Cssize.visit}. They will
+  # be automatically visited upon calling \{#pop}.
+  #
+  # This duck types as a [Sass::Tree::Node] for the purposes of
+  # tree-manipulation operations.
+  class Bubble
+    attr_accessor :node
+    attr_accessor :tabs
+    attr_accessor :group_end
+
+    def initialize(node)
+      @node = node
+      @tabs = 0
+    end
+
+    def bubbles?
+      true
+    end
+
+    def inspect
+      "(Bubble #{node.inspect})"
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/deep_copy.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/deep_copy.rb
new file mode 100644
index 0000000..85d7ba5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/deep_copy.rb
@@ -0,0 +1,107 @@
+# A visitor for copying the full structure of a Sass tree.
+class Sass::Tree::Visitors::DeepCopy < Sass::Tree::Visitors::Base
+  protected
+
+  def visit(node)
+    super(node.dup)
+  end
+
+  def visit_children(parent)
+    parent.children = parent.children.map {|c| visit(c)}
+    parent
+  end
+
+  def visit_debug(node)
+    node.expr = node.expr.deep_copy
+    yield
+  end
+
+  def visit_error(node)
+    node.expr = node.expr.deep_copy
+    yield
+  end
+
+  def visit_each(node)
+    node.list = node.list.deep_copy
+    yield
+  end
+
+  def visit_extend(node)
+    node.selector = node.selector.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}
+    yield
+  end
+
+  def visit_for(node)
+    node.from = node.from.deep_copy
+    node.to = node.to.deep_copy
+    yield
+  end
+
+  def visit_function(node)
+    node.args = node.args.map {|k, v| [k.deep_copy, v && v.deep_copy]}
+    yield
+  end
+
+  def visit_if(node)
+    node.expr = node.expr.deep_copy if node.expr
+    node.else = visit(node.else) if node.else
+    yield
+  end
+
+  def visit_mixindef(node)
+    node.args = node.args.map {|k, v| [k.deep_copy, v && v.deep_copy]}
+    yield
+  end
+
+  def visit_mixin(node)
+    node.args = node.args.map {|a| a.deep_copy}
+    node.keywords = Sass::Util::NormalizedMap.new(Hash[node.keywords.map {|k, v| [k, v.deep_copy]}])
+    yield
+  end
+
+  def visit_prop(node)
+    node.name = node.name.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}
+    node.value = node.value.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}
+    yield
+  end
+
+  def visit_return(node)
+    node.expr = node.expr.deep_copy
+    yield
+  end
+
+  def visit_rule(node)
+    node.rule = node.rule.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}
+    yield
+  end
+
+  def visit_variable(node)
+    node.expr = node.expr.deep_copy
+    yield
+  end
+
+  def visit_warn(node)
+    node.expr = node.expr.deep_copy
+    yield
+  end
+
+  def visit_while(node)
+    node.expr = node.expr.deep_copy
+    yield
+  end
+
+  def visit_directive(node)
+    node.value = node.value.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}
+    yield
+  end
+
+  def visit_media(node)
+    node.query = node.query.map {|c| c.is_a?(Sass::Script::Tree::Node) ? c.deep_copy : c}
+    yield
+  end
+
+  def visit_supports(node)
+    node.condition = node.condition.deep_copy
+    yield
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/extend.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/extend.rb
new file mode 100644
index 0000000..ffc3e21
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/extend.rb
@@ -0,0 +1,64 @@
+# A visitor for performing selector inheritance on a static CSS tree.
+#
+# Destructively modifies the tree.
+class Sass::Tree::Visitors::Extend < Sass::Tree::Visitors::Base
+  # Performs the given extensions on the static CSS tree based in `root`, then
+  # validates that all extends matched some selector.
+  #
+  # @param root [Tree::Node] The root node of the tree to visit.
+  # @param extends [Sass::Util::SubsetMap{Selector::Simple =>
+  #                                       Sass::Tree::Visitors::Cssize::Extend}]
+  #   The extensions to perform on this tree.
+  # @return [Object] The return value of \{#visit} for the root node.
+  def self.visit(root, extends)
+    return if extends.empty?
+    new(extends).send(:visit, root)
+    check_extends_fired! extends
+  end
+
+  protected
+
+  def initialize(extends)
+    @parent_directives = []
+    @extends = extends
+  end
+
+  # If an exception is raised, this adds proper metadata to the backtrace.
+  def visit(node)
+    super(node)
+  rescue Sass::SyntaxError => e
+    e.modify_backtrace(:filename => node.filename, :line => node.line)
+    raise e
+  end
+
+  # Keeps track of the current parent directives.
+  def visit_children(parent)
+    @parent_directives.push parent if parent.is_a?(Sass::Tree::DirectiveNode)
+    super
+  ensure
+    @parent_directives.pop if parent.is_a?(Sass::Tree::DirectiveNode)
+  end
+
+  # Applies the extend to a single rule's selector.
+  def visit_rule(node)
+    node.resolved_rules = node.resolved_rules.do_extend(@extends, @parent_directives)
+  end
+
+  class << self
+    private
+
+    def check_extends_fired!(extends)
+      extends.each_value do |ex|
+        next if ex.success || ex.node.optional?
+        message = "\"#{ex.extender}\" failed to @extend \"#{ex.target.join}\"."
+
+        # TODO(nweiz): this should use the Sass stack trace of the extend node.
+        raise Sass::SyntaxError.new(<<MESSAGE, :filename => ex.node.filename, :line => ex.node.line)
+#{message}
+The selector "#{ex.target.join}" was not found.
+Use "@extend #{ex.target.join} !optional" if the extend should be able to fail.
+MESSAGE
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/perform.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/perform.rb
new file mode 100644
index 0000000..3ca12b0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/perform.rb
@@ -0,0 +1,576 @@
+# A visitor for converting a dynamic Sass tree into a static Sass tree.
+class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
+  @@function_name_deprecation = Sass::Deprecation.new
+
+  class << self
+    # @param root [Tree::Node] The root node of the tree to visit.
+    # @param environment [Sass::Environment] The lexical environment.
+    # @return [Tree::Node] The resulting tree of static nodes.
+    def visit(root, environment = nil)
+      new(environment).send(:visit, root)
+    end
+
+    # @api private
+    # @comment
+    #   rubocop:disable MethodLength
+    def perform_arguments(callable, args, splat, environment)
+      desc = "#{callable.type.capitalize} #{callable.name}"
+      downcase_desc = "#{callable.type} #{callable.name}"
+
+      # All keywords are contained in splat.keywords for consistency,
+      # even if there were no splats passed in.
+      old_keywords_accessed = splat.keywords_accessed
+      keywords = splat.keywords
+      splat.keywords_accessed = old_keywords_accessed
+
+      begin
+        unless keywords.empty?
+          unknown_args = Sass::Util.array_minus(keywords.keys,
+            callable.args.map {|var| var.first.underscored_name})
+          if callable.splat && unknown_args.include?(callable.splat.underscored_name)
+            raise Sass::SyntaxError.new("Argument $#{callable.splat.name} of #{downcase_desc} " +
+                                        "cannot be used as a named argument.")
+          elsif unknown_args.any?
+            description = unknown_args.length > 1 ? 'the following arguments:' : 'an argument named'
+            raise Sass::SyntaxError.new("#{desc} doesn't have #{description} " +
+                                        "#{unknown_args.map {|name| "$#{name}"}.join ', '}.")
+          end
+        end
+      rescue Sass::SyntaxError => keyword_exception
+      end
+
+      # If there's no splat, raise the keyword exception immediately. The actual
+      # raising happens in the ensure clause at the end of this function.
+      return if keyword_exception && !callable.splat
+
+      splat_sep = :comma
+      if splat
+        args += splat.to_a
+        splat_sep = splat.separator
+      end
+
+      if args.size > callable.args.size && !callable.splat
+        extra_args_because_of_splat = splat && args.size - splat.to_a.size <= callable.args.size
+
+        takes = callable.args.size
+        passed = args.size
+        message = "#{desc} takes #{takes} argument#{'s' unless takes == 1} " +
+          "but #{passed} #{passed == 1 ? 'was' : 'were'} passed."
+        raise Sass::SyntaxError.new(message) unless extra_args_because_of_splat
+        # TODO: when the deprecation period is over, make this an error.
+        Sass::Util.sass_warn("WARNING: #{message}\n" +
+          environment.stack.to_s.gsub(/^/m, " " * 8) + "\n" +
+          "This will be an error in future versions of Sass.")
+      end
+
+      env = Sass::Environment.new(callable.environment)
+      callable.args.zip(args[0...callable.args.length]) do |(var, default), value|
+        if value && keywords.has_key?(var.name)
+          raise Sass::SyntaxError.new("#{desc} was passed argument $#{var.name} " +
+                                      "both by position and by name.")
+        end
+
+        value ||= keywords.delete(var.name)
+        value ||= default && default.perform(env)
+        raise Sass::SyntaxError.new("#{desc} is missing argument #{var.inspect}.") unless value
+        env.set_local_var(var.name, value)
+      end
+
+      if callable.splat
+        rest = args[callable.args.length..-1] || []
+        arg_list = Sass::Script::Value::ArgList.new(rest, keywords, splat_sep)
+        arg_list.options = env.options
+        env.set_local_var(callable.splat.name, arg_list)
+      end
+
+      yield env
+    rescue StandardError => e
+    ensure
+      # If there's a keyword exception, we don't want to throw it immediately,
+      # because the invalid keywords may be part of a glob argument that should be
+      # passed on to another function. So we only raise it if we reach the end of
+      # this function *and* the keywords attached to the argument list glob object
+      # haven't been accessed.
+      #
+      # The keyword exception takes precedence over any Sass errors, but not over
+      # non-Sass exceptions.
+      if keyword_exception &&
+          !(arg_list && arg_list.keywords_accessed) &&
+          (e.nil? || e.is_a?(Sass::SyntaxError))
+        raise keyword_exception
+      elsif e
+        raise e
+      end
+    end
+
+    # @api private
+    # @return [Sass::Script::Value::ArgList]
+    def perform_splat(splat, performed_keywords, kwarg_splat, environment)
+      args, kwargs, separator = [], nil, :comma
+
+      if splat
+        splat = splat.perform(environment)
+        separator = splat.separator || separator
+        if splat.is_a?(Sass::Script::Value::ArgList)
+          args = splat.to_a
+          kwargs = splat.keywords
+        elsif splat.is_a?(Sass::Script::Value::Map)
+          kwargs = arg_hash(splat)
+        else
+          args = splat.to_a
+        end
+      end
+      kwargs ||= Sass::Util::NormalizedMap.new
+      kwargs.update(performed_keywords)
+
+      if kwarg_splat
+        kwarg_splat = kwarg_splat.perform(environment)
+        unless kwarg_splat.is_a?(Sass::Script::Value::Map)
+          raise Sass::SyntaxError.new("Variable keyword arguments must be a map " +
+                                      "(was #{kwarg_splat.inspect}).")
+        end
+        kwargs.update(arg_hash(kwarg_splat))
+      end
+
+      Sass::Script::Value::ArgList.new(args, kwargs, separator)
+    end
+
+    private
+
+    def arg_hash(map)
+      Sass::Util.map_keys(map.to_h) do |key|
+        next key.value if key.is_a?(Sass::Script::Value::String)
+        raise Sass::SyntaxError.new("Variable keyword argument map must have string keys.\n" +
+          "#{key.inspect} is not a string in #{map.inspect}.")
+      end
+    end
+  end
+  # @comment
+  #   rubocop:enable MethodLength
+
+  protected
+
+  def initialize(env)
+    @environment = env
+    @in_keyframes = false
+    @at_root_without_rule = false
+  end
+
+  # If an exception is raised, this adds proper metadata to the backtrace.
+  def visit(node)
+    return super(node.dup) unless @environment
+    @environment.stack.with_base(node.filename, node.line) {super(node.dup)}
+  rescue Sass::SyntaxError => e
+    e.modify_backtrace(:filename => node.filename, :line => node.line)
+    raise e
+  end
+
+  # Keeps track of the current environment.
+  def visit_children(parent)
+    with_environment Sass::Environment.new(@environment, parent.options) do
+      parent.children = super.flatten
+      parent
+    end
+  end
+
+  # Runs a block of code with the current environment replaced with the given one.
+  #
+  # @param env [Sass::Environment] The new environment for the duration of the block.
+  # @yield A block in which the environment is set to `env`.
+  # @return [Object] The return value of the block.
+  def with_environment(env)
+    old_env, @environment = @environment, env
+    yield
+  ensure
+    @environment = old_env
+  end
+
+  # Sets the options on the environment if this is the top-level root.
+  def visit_root(node)
+    yield
+  rescue Sass::SyntaxError => e
+    e.sass_template ||= node.template
+    raise e
+  end
+
+  # Removes this node from the tree if it's a silent comment.
+  def visit_comment(node)
+    return [] if node.invisible?
+    node.resolved_value = run_interp_no_strip(node.value)
+    node.resolved_value.gsub!(/\\([\\#])/, '\1')
+    node
+  end
+
+  # Prints the expression to STDERR.
+  def visit_debug(node)
+    res = node.expr.perform(@environment)
+    if res.is_a?(Sass::Script::Value::String)
+      res = res.value
+    else
+      res = res.to_sass
+    end
+    if node.filename
+      Sass::Util.sass_warn "#{node.filename}:#{node.line} DEBUG: #{res}"
+    else
+      Sass::Util.sass_warn "Line #{node.line} DEBUG: #{res}"
+    end
+    []
+  end
+
+  # Throws the expression as an error.
+  def visit_error(node)
+    res = node.expr.perform(@environment)
+    if res.is_a?(Sass::Script::Value::String)
+      res = res.value
+    else
+      res = res.to_sass
+    end
+    raise Sass::SyntaxError.new(res)
+  end
+
+  # Runs the child nodes once for each value in the list.
+  def visit_each(node)
+    list = node.list.perform(@environment)
+
+    with_environment Sass::SemiGlobalEnvironment.new(@environment) do
+      list.to_a.map do |value|
+        if node.vars.length == 1
+          @environment.set_local_var(node.vars.first, value)
+        else
+          node.vars.zip(value.to_a) do |(var, sub_value)|
+            @environment.set_local_var(var, sub_value || Sass::Script::Value::Null.new)
+          end
+        end
+        node.children.map {|c| visit(c)}
+      end.flatten
+    end
+  end
+
+  # Runs SassScript interpolation in the selector,
+  # and then parses the result into a {Sass::Selector::CommaSequence}.
+  def visit_extend(node)
+    parser = Sass::SCSS::StaticParser.new(run_interp(node.selector),
+      node.filename, node.options[:importer], node.line)
+    node.resolved_selector = parser.parse_selector
+    node
+  end
+
+  # Runs the child nodes once for each time through the loop, varying the variable each time.
+  def visit_for(node)
+    from = node.from.perform(@environment)
+    to = node.to.perform(@environment)
+    from.assert_int!
+    to.assert_int!
+
+    to = to.coerce(from.numerator_units, from.denominator_units)
+    direction = from.to_i > to.to_i ? -1 : 1
+    range = Range.new(direction * from.to_i, direction * to.to_i, node.exclusive)
+
+    with_environment Sass::SemiGlobalEnvironment.new(@environment) do
+      range.map do |i|
+        @environment.set_local_var(node.var,
+          Sass::Script::Value::Number.new(direction * i,
+            from.numerator_units, from.denominator_units))
+        node.children.map {|c| visit(c)}
+      end.flatten
+    end
+  end
+
+  # Loads the function into the environment.
+  def visit_function(node)
+    env = Sass::Environment.new(@environment, node.options)
+
+    if node.normalized_name == 'calc' || node.normalized_name == 'element' ||
+        node.name == 'expression' || node.name == 'url'
+      @@function_name_deprecation.warn(node.filename, node.line, <<WARNING)
+Naming a function "#{node.name}" is disallowed and will be an error in future versions of Sass.
+This name conflicts with an existing CSS function with special parse rules.
+WARNING
+    end
+
+    @environment.set_local_function(node.name,
+      Sass::Callable.new(node.name, node.args, node.splat, env,
+                         node.children, false, "function", :stylesheet))
+    []
+  end
+
+  # Runs the child nodes if the conditional expression is true;
+  # otherwise, tries the else nodes.
+  def visit_if(node)
+    if node.expr.nil? || node.expr.perform(@environment).to_bool
+      with_environment Sass::SemiGlobalEnvironment.new(@environment) do
+        node.children.map {|c| visit(c)}
+      end.flatten
+    elsif node.else
+      visit(node.else)
+    else
+      []
+    end
+  end
+
+  # Returns a static DirectiveNode if this is importing a CSS file,
+  # or parses and includes the imported Sass file.
+  def visit_import(node)
+    if (path = node.css_import?)
+      resolved_node = Sass::Tree::CssImportNode.resolved("url(#{path})")
+      resolved_node.options = node.options
+      resolved_node.source_range = node.source_range
+      return resolved_node
+    end
+    file = node.imported_file
+    if @environment.stack.frames.any? {|f| f.is_import? && f.filename == file.options[:filename]}
+      handle_import_loop!(node)
+    end
+
+    begin
+      @environment.stack.with_import(node.filename, node.line) do
+        root = file.to_tree
+        Sass::Tree::Visitors::CheckNesting.visit(root)
+        node.children = root.children.map {|c| visit(c)}.flatten
+        node
+      end
+    rescue Sass::SyntaxError => e
+      e.modify_backtrace(:filename => node.imported_file.options[:filename])
+      e.add_backtrace(:filename => node.filename, :line => node.line)
+      raise e
+    end
+  end
+
+  # Loads a mixin into the environment.
+  def visit_mixindef(node)
+    env = Sass::Environment.new(@environment, node.options)
+    @environment.set_local_mixin(node.name,
+      Sass::Callable.new(node.name, node.args, node.splat, env,
+                         node.children, node.has_content, "mixin", :stylesheet))
+    []
+  end
+
+  # Runs a mixin.
+  def visit_mixin(node)
+    @environment.stack.with_mixin(node.filename, node.line, node.name) do
+      mixin = @environment.mixin(node.name)
+      raise Sass::SyntaxError.new("Undefined mixin '#{node.name}'.") unless mixin
+
+      if node.children.any? && !mixin.has_content
+        raise Sass::SyntaxError.new(%(Mixin "#{node.name}" does not accept a content block.))
+      end
+
+      args = node.args.map {|a| a.perform(@environment)}
+      keywords = Sass::Util.map_vals(node.keywords) {|v| v.perform(@environment)}
+      splat = self.class.perform_splat(node.splat, keywords, node.kwarg_splat, @environment)
+
+      self.class.perform_arguments(mixin, args, splat, @environment) do |env|
+        env.caller = Sass::Environment.new(@environment)
+        env.content = [node.children, @environment] if node.has_children
+
+        trace_node = Sass::Tree::TraceNode.from_node(node.name, node)
+        with_environment(env) {trace_node.children = mixin.tree.map {|c| visit(c)}.flatten}
+        trace_node
+      end
+    end
+  rescue Sass::SyntaxError => e
+    e.modify_backtrace(:mixin => node.name, :line => node.line)
+    e.add_backtrace(:line => node.line)
+    raise e
+  end
+
+  def visit_content(node)
+    content, content_env = @environment.content
+    return [] unless content
+    @environment.stack.with_mixin(node.filename, node.line, '@content') do
+      trace_node = Sass::Tree::TraceNode.from_node('@content', node)
+      content_env = Sass::Environment.new(content_env)
+      content_env.caller = Sass::Environment.new(@environment)
+      with_environment(content_env) do
+        trace_node.children = content.map {|c| visit(c.dup)}.flatten
+      end
+      trace_node
+    end
+  rescue Sass::SyntaxError => e
+    e.modify_backtrace(:mixin => '@content', :line => node.line)
+    e.add_backtrace(:line => node.line)
+    raise e
+  end
+
+  # Runs any SassScript that may be embedded in a property.
+  def visit_prop(node)
+    node.resolved_name = run_interp(node.name)
+
+    # If the node's value is just a variable or similar, we may get a useful
+    # source range from evaluating it.
+    if node.value.length == 1 && node.value.first.is_a?(Sass::Script::Tree::Node)
+      result = node.value.first.perform(@environment)
+      node.resolved_value = result.to_s
+      node.value_source_range = result.source_range if result.source_range
+    elsif node.custom_property?
+      node.resolved_value = run_interp_no_strip(node.value)
+    else
+      node.resolved_value = run_interp(node.value)
+    end
+
+    yield
+  end
+
+  # Returns the value of the expression.
+  def visit_return(node)
+    throw :_sass_return, node.expr.perform(@environment)
+  end
+
+  # Runs SassScript interpolation in the selector,
+  # and then parses the result into a {Sass::Selector::CommaSequence}.
+  def visit_rule(node)
+    old_at_root_without_rule = @at_root_without_rule
+    parser = Sass::SCSS::StaticParser.new(run_interp(node.rule),
+      node.filename, node.options[:importer], node.line)
+    if @in_keyframes
+      keyframe_rule_node = Sass::Tree::KeyframeRuleNode.new(parser.parse_keyframes_selector)
+      keyframe_rule_node.options = node.options
+      keyframe_rule_node.line = node.line
+      keyframe_rule_node.filename = node.filename
+      keyframe_rule_node.source_range = node.source_range
+      keyframe_rule_node.has_children = node.has_children
+      with_environment Sass::Environment.new(@environment, node.options) do
+        keyframe_rule_node.children = node.children.map {|c| visit(c)}.flatten
+      end
+      keyframe_rule_node
+    else
+      @at_root_without_rule = false
+      node.parsed_rules ||= parser.parse_selector
+      node.resolved_rules = node.parsed_rules.resolve_parent_refs(
+        @environment.selector, !old_at_root_without_rule)
+      node.stack_trace = @environment.stack.to_s if node.options[:trace_selectors]
+      with_environment Sass::Environment.new(@environment, node.options) do
+        @environment.selector = node.resolved_rules
+        node.children = node.children.map {|c| visit(c)}.flatten
+      end
+      node
+    end
+  ensure
+    @at_root_without_rule = old_at_root_without_rule
+  end
+
+  # Sets a variable that indicates that the first level of rule nodes
+  # shouldn't include the parent selector by default.
+  def visit_atroot(node)
+    if node.query
+      parser = Sass::SCSS::StaticParser.new(run_interp(node.query),
+        node.filename, node.options[:importer], node.line)
+      node.resolved_type, node.resolved_value = parser.parse_static_at_root_query
+    else
+      node.resolved_type, node.resolved_value = :without, ['rule']
+    end
+
+    old_at_root_without_rule = @at_root_without_rule
+    old_in_keyframes = @in_keyframes
+    @at_root_without_rule = true if node.exclude?('rule')
+    @in_keyframes = false if node.exclude?('keyframes')
+    yield
+  ensure
+    @in_keyframes = old_in_keyframes
+    @at_root_without_rule = old_at_root_without_rule
+  end
+
+  # Loads the new variable value into the environment.
+  def visit_variable(node)
+    env = @environment
+    env = env.global_env if node.global
+    if node.guarded
+      var = env.var(node.name)
+      return [] if var && !var.null?
+    end
+
+    val = node.expr.perform(@environment)
+    if node.expr.source_range
+      val.source_range = node.expr.source_range
+    else
+      val.source_range = node.source_range
+    end
+    env.set_var(node.name, val)
+    []
+  end
+
+  # Prints the expression to STDERR with a stylesheet trace.
+  def visit_warn(node)
+    res = node.expr.perform(@environment)
+    res = res.value if res.is_a?(Sass::Script::Value::String)
+    @environment.stack.with_directive(node.filename, node.line, "@warn") do
+      msg = "WARNING: #{res}\n         "
+      msg << @environment.stack.to_s.gsub("\n", "\n         ") << "\n"
+      Sass::Util.sass_warn msg
+    end
+    []
+  end
+
+  # Runs the child nodes until the continuation expression becomes false.
+  def visit_while(node)
+    children = []
+    with_environment Sass::SemiGlobalEnvironment.new(@environment) do
+      children += node.children.map {|c| visit(c)} while node.expr.perform(@environment).to_bool
+    end
+    children.flatten
+  end
+
+  def visit_directive(node)
+    node.resolved_value = run_interp(node.value)
+    old_in_keyframes, @in_keyframes = @in_keyframes, node.normalized_name == "@keyframes"
+    with_environment Sass::Environment.new(@environment) do
+      node.children = node.children.map {|c| visit(c)}.flatten
+      node
+    end
+  ensure
+    @in_keyframes = old_in_keyframes
+  end
+
+  def visit_media(node)
+    parser = Sass::SCSS::StaticParser.new(run_interp(node.query),
+      node.filename, node.options[:importer], node.line)
+    node.resolved_query ||= parser.parse_media_query_list
+    yield
+  end
+
+  def visit_supports(node)
+    node.condition = node.condition.deep_copy
+    node.condition.perform(@environment)
+    yield
+  end
+
+  def visit_cssimport(node)
+    node.resolved_uri = run_interp([node.uri])
+    if node.query && !node.query.empty?
+      parser = Sass::SCSS::StaticParser.new(run_interp(node.query),
+        node.filename, node.options[:importer], node.line)
+      node.resolved_query ||= parser.parse_media_query_list
+    end
+    if node.supports_condition
+      node.supports_condition.perform(@environment)
+    end
+    yield
+  end
+
+  private
+
+  def run_interp_no_strip(text)
+    text.map do |r|
+      next r if r.is_a?(String)
+      r.perform(@environment).to_s(:quote => :none)
+    end.join
+  end
+
+  def run_interp(text)
+    run_interp_no_strip(text).strip
+  end
+
+  def handle_import_loop!(node)
+    msg = "An @import loop has been found:"
+    files = @environment.stack.frames.select {|f| f.is_import?}.map {|f| f.filename}.compact
+    if node.filename == node.imported_file.options[:filename]
+      raise Sass::SyntaxError.new("#{msg} #{node.filename} imports itself")
+    end
+
+    files << node.filename << node.imported_file.options[:filename]
+    msg << "\n" << files.each_cons(2).map do |m1, m2|
+      "    #{m1} imports #{m2}"
+    end.join("\n")
+    raise Sass::SyntaxError.new(msg)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/set_options.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/set_options.rb
new file mode 100644
index 0000000..75f4a2b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/set_options.rb
@@ -0,0 +1,139 @@
+# A visitor for setting options on the Sass tree
+class Sass::Tree::Visitors::SetOptions < Sass::Tree::Visitors::Base
+  # @param root [Tree::Node] The root node of the tree to visit.
+  # @param options [{Symbol => Object}] The options has to set.
+  def self.visit(root, options); new(options).send(:visit, root); end
+
+  protected
+
+  def initialize(options)
+    @options = options
+  end
+
+  def visit(node)
+    node.instance_variable_set('@options', @options)
+    super
+  end
+
+  def visit_comment(node)
+    node.value.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)}
+    yield
+  end
+
+  def visit_debug(node)
+    node.expr.options = @options
+    yield
+  end
+
+  def visit_error(node)
+    node.expr.options = @options
+    yield
+  end
+
+  def visit_each(node)
+    node.list.options = @options
+    yield
+  end
+
+  def visit_extend(node)
+    node.selector.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)}
+    yield
+  end
+
+  def visit_for(node)
+    node.from.options = @options
+    node.to.options = @options
+    yield
+  end
+
+  def visit_function(node)
+    node.args.each do |k, v|
+      k.options = @options
+      v.options = @options if v
+    end
+    node.splat.options = @options if node.splat
+    yield
+  end
+
+  def visit_if(node)
+    node.expr.options = @options if node.expr
+    visit(node.else) if node.else
+    yield
+  end
+
+  def visit_import(node)
+    # We have no good way of propagating the new options through an Engine
+    # instance, so we just null it out. This also lets us avoid caching an
+    # imported Engine along with the importing source tree.
+    node.imported_file = nil
+    yield
+  end
+
+  def visit_mixindef(node)
+    node.args.each do |k, v|
+      k.options = @options
+      v.options = @options if v
+    end
+    node.splat.options = @options if node.splat
+    yield
+  end
+
+  def visit_mixin(node)
+    node.args.each {|a| a.options = @options}
+    node.keywords.each {|_k, v| v.options = @options}
+    node.splat.options = @options if node.splat
+    node.kwarg_splat.options = @options if node.kwarg_splat
+    yield
+  end
+
+  def visit_prop(node)
+    node.name.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)}
+    node.value.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)}
+    yield
+  end
+
+  def visit_return(node)
+    node.expr.options = @options
+    yield
+  end
+
+  def visit_rule(node)
+    node.rule.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)}
+    yield
+  end
+
+  def visit_variable(node)
+    node.expr.options = @options
+    yield
+  end
+
+  def visit_warn(node)
+    node.expr.options = @options
+    yield
+  end
+
+  def visit_while(node)
+    node.expr.options = @options
+    yield
+  end
+
+  def visit_directive(node)
+    node.value.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)}
+    yield
+  end
+
+  def visit_media(node)
+    node.query.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)}
+    yield
+  end
+
+  def visit_cssimport(node)
+    node.query.each {|c| c.options = @options if c.is_a?(Sass::Script::Tree::Node)} if node.query
+    yield
+  end
+
+  def visit_supports(node)
+    node.condition.options = @options
+    yield
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/to_css.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/to_css.rb
new file mode 100644
index 0000000..3aca7a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/visitors/to_css.rb
@@ -0,0 +1,443 @@
+# A visitor for converting a Sass tree into CSS.
+class Sass::Tree::Visitors::ToCss < Sass::Tree::Visitors::Base
+  # The source mapping for the generated CSS file. This is only set if
+  # `build_source_mapping` is passed to the constructor and \{Sass::Engine#render} has been
+  # run.
+  attr_reader :source_mapping
+
+  # @param build_source_mapping [Boolean] Whether to build a
+  #   \{Sass::Source::Map} while creating the CSS output. The mapping will
+  #   be available from \{#source\_mapping} after the visitor has completed.
+  def initialize(build_source_mapping = false)
+    @tabs = 0
+    @line = 1
+    @offset = 1
+    @result = String.new("")
+    @source_mapping = build_source_mapping ? Sass::Source::Map.new : nil
+    @lstrip = nil
+    @in_directive = false
+  end
+
+  # Runs the visitor on `node`.
+  #
+  # @param node [Sass::Tree::Node] The root node of the tree to convert to CSS>
+  # @return [String] The CSS output.
+  def visit(node)
+    super
+  rescue Sass::SyntaxError => e
+    e.modify_backtrace(:filename => node.filename, :line => node.line)
+    raise e
+  end
+
+  protected
+
+  def with_tabs(tabs)
+    old_tabs, @tabs = @tabs, tabs
+    yield
+  ensure
+    @tabs = old_tabs
+  end
+
+  # Associate all output produced in a block with a given node. Used for source
+  # mapping.
+  def for_node(node, attr_prefix = nil)
+    return yield unless @source_mapping
+    start_pos = Sass::Source::Position.new(@line, @offset)
+    yield
+
+    range_attr = attr_prefix ? :"#{attr_prefix}_source_range" : :source_range
+    return if node.invisible? || !node.send(range_attr)
+    source_range = node.send(range_attr)
+    target_end_pos = Sass::Source::Position.new(@line, @offset)
+    target_range = Sass::Source::Range.new(start_pos, target_end_pos, nil)
+    @source_mapping.add(source_range, target_range)
+  end
+
+  def trailing_semicolon?
+   @result.end_with?(";") && !@result.end_with?('\;')
+  end
+
+  # Move the output cursor back `chars` characters.
+  def erase!(chars)
+    return if chars == 0
+    str = @result.slice!(-chars..-1)
+    newlines = str.count("\n")
+    if newlines > 0
+      @line -= newlines
+      @offset = @result[@result.rindex("\n") || 0..-1].size
+    else
+      @offset -= chars
+    end
+  end
+
+  # Avoid allocating lots of new strings for `#output`. This is important
+  # because `#output` is called all the time.
+  NEWLINE = "\n"
+
+  # Add `s` to the output string and update the line and offset information
+  # accordingly.
+  def output(s)
+    if @lstrip
+      s = s.gsub(/\A\s+/, "")
+      @lstrip = false
+    end
+
+    newlines = s.count(NEWLINE)
+    if newlines > 0
+      @line += newlines
+      @offset = s[s.rindex(NEWLINE)..-1].size
+    else
+      @offset += s.size
+    end
+
+    @result << s
+  end
+
+  # Strip all trailing whitespace from the output string.
+  def rstrip!
+    erase! @result.length - 1 - (@result.rindex(/[^\s]/) || -1)
+  end
+
+  # lstrip the first output in the given block.
+  def lstrip
+    old_lstrip = @lstrip
+    @lstrip = true
+    yield
+  ensure
+    @lstrip &&= old_lstrip
+  end
+
+  # Prepend `prefix` to the output string.
+  def prepend!(prefix)
+    @result.insert 0, prefix
+    return unless @source_mapping
+
+    line_delta = prefix.count("\n")
+    offset_delta = prefix.gsub(/.*\n/, '').size
+    @source_mapping.shift_output_offsets(offset_delta)
+    @source_mapping.shift_output_lines(line_delta)
+  end
+
+  def visit_root(node)
+    node.children.each do |child|
+      next if child.invisible?
+      visit(child)
+      next if node.style == :compressed
+      output "\n"
+      next unless child.is_a?(Sass::Tree::DirectiveNode) && child.has_children && !child.bubbles?
+      output "\n"
+    end
+    rstrip!
+    if node.style == :compressed && trailing_semicolon?
+      erase! 1
+    end
+    return "" if @result.empty?
+
+    output "\n"
+
+    unless @result.ascii_only?
+      if node.style == :compressed
+        # A byte order mark is sufficient to tell browsers that this
+        # file is UTF-8 encoded, and will override any other detection
+        # methods as per http://encoding.spec.whatwg.org/#decode-and-encode.
+        prepend! "\uFEFF"
+      else
+        prepend! "@charset \"UTF-8\";\n"
+      end
+    end
+
+    @result
+  rescue Sass::SyntaxError => e
+    e.sass_template ||= node.template
+    raise e
+  end
+
+  def visit_charset(node)
+    for_node(node) {output("@charset \"#{node.name}\";")}
+  end
+
+  def visit_comment(node)
+    return if node.invisible?
+    spaces = ('  ' * [@tabs - node.resolved_value[/^ */].size, 0].max)
+    output(spaces)
+
+    content = node.resolved_value.split("\n").join("\n" + spaces)
+    if node.type == :silent
+      content.gsub!(%r{^(\s*)//(.*)$}) {"#{$1}/*#{$2} */"}
+    end
+    if (node.style == :compact || node.style == :compressed) && node.type != :loud
+      content.gsub!(%r{\n +(\* *(?!/))?}, ' ')
+    end
+    for_node(node) {output(content)}
+  end
+
+  # @comment
+  #   rubocop:disable MethodLength
+  def visit_directive(node)
+    was_in_directive = @in_directive
+    tab_str = '  ' * @tabs
+    if !node.has_children || node.children.empty?
+      output(tab_str)
+      for_node(node) {output(node.resolved_value)}
+      if node.has_children
+        output("#{' ' unless node.style == :compressed}{}")
+      elsif node.children.empty?
+        output(";")
+      end
+      return
+    end
+
+    @in_directive ||= !node.is_a?(Sass::Tree::MediaNode)
+    output(tab_str) if node.style != :compressed
+    for_node(node) {output(node.resolved_value)}
+    output(node.style == :compressed ? "{" : " {")
+    output(node.style == :compact ? ' ' : "\n") if node.style != :compressed
+
+    had_children = true
+    first = true
+    node.children.each do |child|
+      next if child.invisible?
+      if node.style == :compact
+        if child.is_a?(Sass::Tree::PropNode)
+          with_tabs(first || !had_children ? 0 : @tabs + 1) do
+            visit(child)
+            output(' ')
+          end
+        else
+          unless had_children
+            erase! 1
+            output "\n"
+          end
+
+          if first
+            lstrip {with_tabs(@tabs + 1) {visit(child)}}
+          else
+            with_tabs(@tabs + 1) {visit(child)}
+          end
+
+          rstrip!
+          output "\n"
+        end
+        had_children = child.has_children
+        first = false
+      elsif node.style == :compressed
+        unless had_children
+          output(";") unless trailing_semicolon?
+        end
+        with_tabs(0) {visit(child)}
+        had_children = child.has_children
+      else
+        with_tabs(@tabs + 1) {visit(child)}
+        output "\n"
+      end
+    end
+    rstrip!
+    if node.style == :compressed && trailing_semicolon?
+      erase! 1
+    end
+    if node.style == :expanded
+      output("\n#{tab_str}")
+    elsif node.style != :compressed
+      output(" ")
+    end
+    output("}")
+  ensure
+    @in_directive = was_in_directive
+  end
+  # @comment
+  #   rubocop:enable MethodLength
+
+  def visit_media(node)
+    with_tabs(@tabs + node.tabs) {visit_directive(node)}
+    output("\n") if node.style != :compressed && node.group_end
+  end
+
+  def visit_supports(node)
+    visit_media(node)
+  end
+
+  def visit_cssimport(node)
+    visit_directive(node)
+  end
+
+  def visit_prop(node)
+    return if node.resolved_value.empty? && !node.custom_property?
+    tab_str = '  ' * (@tabs + node.tabs)
+    output(tab_str)
+    for_node(node, :name) {output(node.resolved_name)}
+    output(":")
+    output(" ") unless node.style == :compressed || node.custom_property?
+    for_node(node, :value) do
+      output(if node.custom_property?
+               format_custom_property_value(node)
+             else
+               node.resolved_value
+             end)
+    end
+    output(";") unless node.style == :compressed
+  end
+
+  # @comment
+  #   rubocop:disable MethodLength
+  def visit_rule(node)
+    with_tabs(@tabs + node.tabs) do
+      rule_separator = node.style == :compressed ? ',' : ', '
+      line_separator =
+        case node.style
+        when :nested, :expanded; "\n"
+        when :compressed; ""
+        else; " "
+        end
+      rule_indent = '  ' * @tabs
+      per_rule_indent, total_indent = if [:nested, :expanded].include?(node.style)
+                                        [rule_indent, '']
+                                      else
+                                        ['', rule_indent]
+                                      end
+
+      joined_rules = node.resolved_rules.members.map do |seq|
+        next if seq.invisible?
+        rule_part = seq.to_s(style: node.style, placeholder: false)
+        if node.style == :compressed
+          rule_part.gsub!(/([^,])\s*\n\s*/m, '\1 ')
+          rule_part.gsub!(/\s*([+>])\s*/m, '\1')
+          rule_part.gsub!(/nth([^( ]*)\(([^)]*)\)/m) do |match|
+            match.tr(" \t\n", "")
+          end
+          rule_part.strip!
+        end
+        rule_part
+      end.compact.join(rule_separator)
+
+      joined_rules.lstrip!
+      joined_rules.gsub!(/\s*\n\s*/, "#{line_separator}#{per_rule_indent}")
+
+      old_spaces = '  ' * @tabs
+      if node.style != :compressed
+        if node.options[:debug_info] && !@in_directive
+          visit(debug_info_rule(node.debug_info, node.options))
+          output "\n"
+        elsif node.options[:trace_selectors]
+          output("#{old_spaces}/* ")
+          output(node.stack_trace.gsub("\n", "\n   #{old_spaces}"))
+          output(" */\n")
+        elsif node.options[:line_comments]
+          output("#{old_spaces}/* line #{node.line}")
+
+          if node.filename
+            relative_filename =
+              if node.options[:css_filename]
+                begin
+                  Sass::Util.relative_path_from(
+                    node.filename, File.dirname(node.options[:css_filename])).to_s
+                rescue ArgumentError
+                  nil
+                end
+              end
+            relative_filename ||= node.filename
+            output(", #{relative_filename}")
+          end
+
+          output(" */\n")
+        end
+      end
+
+      end_props, trailer, tabs = '', '', 0
+      if node.style == :compact
+        separator, end_props, bracket = ' ', ' ', ' { '
+        trailer = "\n" if node.group_end
+      elsif node.style == :compressed
+        separator, bracket = ';', '{'
+      else
+        tabs = @tabs + 1
+        separator, bracket = "\n", " {\n"
+        trailer = "\n" if node.group_end
+        end_props = (node.style == :expanded ? "\n" + old_spaces : ' ')
+      end
+      output(total_indent + per_rule_indent)
+      for_node(node, :selector) {output(joined_rules)}
+      output(bracket)
+
+      with_tabs(tabs) do
+        node.children.each_with_index do |child, i|
+          if i > 0
+            if separator.start_with?(";") && trailing_semicolon?
+              erase! 1
+            end
+            output(separator)
+          end
+          visit(child)
+        end
+      end
+      if node.style == :compressed && trailing_semicolon?
+        erase! 1
+      end
+
+      output(end_props)
+      output("}" + trailer)
+    end
+  end
+  # @comment
+  #   rubocop:enable MethodLength
+
+  def visit_keyframerule(node)
+    visit_directive(node)
+  end
+
+  private
+
+  # Reformats the value of `node` so that it's nicely indented, preserving its
+  # existing relative indentation.
+  #
+  # @param node [Sass::Script::Tree::PropNode] A custom property node.
+  # @return [String]
+  def format_custom_property_value(node)
+    if node.style == :compact || node.style == :compressed || !node.resolved_value.include?("\n")
+      # Folding not involving newlines was done in the parser. We can safely
+      # fold newlines here because tokens like strings can't contain literal
+      # newlines, so we know any adjacent whitespace is tokenized as whitespace.
+      return node.resolved_value.gsub(/[ \t\r\f]*\n[ \t\r\f\n]*/, ' ')
+    end
+
+    # Find the smallest amount of indentation in the custom property and use
+    # that as the base indentation level.
+    lines = node.resolved_value.split("\n")
+    indented_lines = lines[1..-1]
+    min_indentation = indented_lines.
+      map {|line| line[/^[ \t]*/]}.
+      reject {|line| line.empty?}.
+      min_by {|line| line.length}
+
+    # Limit the base indentation to the same indentation level as the node name
+    # so that if *every* line is indented relative to the property name that's
+    # preserved.
+    if node.name_source_range
+      base_indentation = min_indentation[0...node.name_source_range.start_pos.offset - 1]
+    end
+
+    lines.first + "\n" + indented_lines.join("\n").gsub(/^#{base_indentation}/, '  ' * @tabs)
+  end
+
+  def debug_info_rule(debug_info, options)
+    node = Sass::Tree::DirectiveNode.resolved("@media -sass-debug-info")
+    debug_info.map {|k, v| [k.to_s, v.to_s]}.to_a.each do |k, v|
+      rule = Sass::Tree::RuleNode.new([""])
+      rule.resolved_rules = Sass::Selector::CommaSequence.new(
+        [Sass::Selector::Sequence.new(
+          [Sass::Selector::SimpleSequence.new(
+            [Sass::Selector::Element.new(k.to_s.gsub(/[^\w-]/, "\\\\\\0"), nil)],
+            false)
+          ])
+        ])
+      prop = Sass::Tree::PropNode.new([""], [""], :new)
+      prop.resolved_name = "font-family"
+      prop.resolved_value = Sass::SCSS::RX.escape_ident(v.to_s)
+      rule << prop
+      node << rule
+    end
+    node.options = options.merge(:debug_info => false,
+                                 :line_comments => false,
+                                 :style => :compressed)
+    node
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/warn_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/warn_node.rb
new file mode 100644
index 0000000..4af4789
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/warn_node.rb
@@ -0,0 +1,18 @@
+module Sass
+  module Tree
+    # A dynamic node representing a Sass `@warn` statement.
+    #
+    # @see Sass::Tree
+    class WarnNode < Node
+      # The expression to print.
+      # @return [Script::Tree::Node]
+      attr_accessor :expr
+
+      # @param expr [Script::Tree::Node] The expression to print
+      def initialize(expr)
+        @expr = expr
+        super()
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/while_node.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/while_node.rb
new file mode 100644
index 0000000..93529f0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/tree/while_node.rb
@@ -0,0 +1,18 @@
+require 'sass/tree/node'
+
+module Sass::Tree
+  # A dynamic node representing a Sass `@while` loop.
+  #
+  # @see Sass::Tree
+  class WhileNode < Node
+    # The parse tree for the continuation expression.
+    # @return [Script::Tree::Node]
+    attr_accessor :expr
+
+    # @param expr [Script::Tree::Node] See \{#expr}
+    def initialize(expr)
+      @expr = expr
+      super()
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util.rb
new file mode 100644
index 0000000..56ba141
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util.rb
@@ -0,0 +1,1097 @@
+# -*- coding: utf-8 -*-
+require 'erb'
+require 'set'
+require 'enumerator'
+require 'stringio'
+require 'rbconfig'
+require 'uri'
+require 'thread'
+require 'pathname'
+
+require 'sass/root'
+require 'sass/util/subset_map'
+
+module Sass
+  # A module containing various useful functions.
+  # @comment
+  #   rubocop:disable ModuleLength
+  module Util
+    extend self
+
+    # An array of ints representing the Ruby version number.
+    # @api public
+    RUBY_VERSION_COMPONENTS = RUBY_VERSION.split(".").map {|s| s.to_i}
+
+    # The Ruby engine we're running under. Defaults to `"ruby"`
+    # if the top-level constant is undefined.
+    # @api public
+    RUBY_ENGINE = defined?(::RUBY_ENGINE) ? ::RUBY_ENGINE : "ruby"
+
+    # Returns the path of a file relative to the Sass root directory.
+    #
+    # @param file [String] The filename relative to the Sass root
+    # @return [String] The filename relative to the the working directory
+    def scope(file)
+      File.join(Sass::ROOT_DIR, file)
+    end
+
+    # Maps the keys in a hash according to a block.
+    #
+    # @example
+    #   map_keys({:foo => "bar", :baz => "bang"}) {|k| k.to_s}
+    #     #=> {"foo" => "bar", "baz" => "bang"}
+    # @param hash [Hash] The hash to map
+    # @yield [key] A block in which the keys are transformed
+    # @yieldparam key [Object] The key that should be mapped
+    # @yieldreturn [Object] The new value for the key
+    # @return [Hash] The mapped hash
+    # @see #map_vals
+    # @see #map_hash
+    def map_keys(hash)
+      map_hash(hash) {|k, v| [yield(k), v]}
+    end
+
+    # Maps the values in a hash according to a block.
+    #
+    # @example
+    #   map_values({:foo => "bar", :baz => "bang"}) {|v| v.to_sym}
+    #     #=> {:foo => :bar, :baz => :bang}
+    # @param hash [Hash] The hash to map
+    # @yield [value] A block in which the values are transformed
+    # @yieldparam value [Object] The value that should be mapped
+    # @yieldreturn [Object] The new value for the value
+    # @return [Hash] The mapped hash
+    # @see #map_keys
+    # @see #map_hash
+    def map_vals(hash)
+      # We don't delegate to map_hash for performance here
+      # because map_hash does more than is necessary.
+      rv = hash.class.new
+      hash = hash.as_stored if hash.is_a?(NormalizedMap)
+      hash.each do |k, v|
+        rv[k] = yield(v)
+      end
+      rv
+    end
+
+    # Maps the key-value pairs of a hash according to a block.
+    #
+    # @example
+    #   map_hash({:foo => "bar", :baz => "bang"}) {|k, v| [k.to_s, v.to_sym]}
+    #     #=> {"foo" => :bar, "baz" => :bang}
+    # @param hash [Hash] The hash to map
+    # @yield [key, value] A block in which the key-value pairs are transformed
+    # @yieldparam [key] The hash key
+    # @yieldparam [value] The hash value
+    # @yieldreturn [(Object, Object)] The new value for the `[key, value]` pair
+    # @return [Hash] The mapped hash
+    # @see #map_keys
+    # @see #map_vals
+    def map_hash(hash)
+      # Copy and modify is more performant than mapping to an array and using
+      # to_hash on the result.
+      rv = hash.class.new
+      hash.each do |k, v|
+        new_key, new_value = yield(k, v)
+        new_key = hash.denormalize(new_key) if hash.is_a?(NormalizedMap) && new_key == k
+        rv[new_key] = new_value
+      end
+      rv
+    end
+
+    # Computes the powerset of the given array.
+    # This is the set of all subsets of the array.
+    #
+    # @example
+    #   powerset([1, 2, 3]) #=>
+    #     Set[Set[], Set[1], Set[2], Set[3], Set[1, 2], Set[2, 3], Set[1, 3], Set[1, 2, 3]]
+    # @param arr [Enumerable]
+    # @return [Set<Set>] The subsets of `arr`
+    def powerset(arr)
+      arr.inject([Set.new].to_set) do |powerset, el|
+        new_powerset = Set.new
+        powerset.each do |subset|
+          new_powerset << subset
+          new_powerset << subset + [el]
+        end
+        new_powerset
+      end
+    end
+
+    # Restricts a number to falling within a given range.
+    # Returns the number if it falls within the range,
+    # or the closest value in the range if it doesn't.
+    #
+    # @param value [Numeric]
+    # @param range [Range<Numeric>]
+    # @return [Numeric]
+    def restrict(value, range)
+      [[value, range.first].max, range.last].min
+    end
+
+    # Like [Fixnum.round], but leaves rooms for slight floating-point
+    # differences.
+    #
+    # @param value [Numeric]
+    # @return [Numeric]
+    def round(value)
+      # If the number is within epsilon of X.5, round up (or down for negative
+      # numbers).
+      return value.round if (value % 1) - 0.5 <= -1 * Script::Value::Number.epsilon
+      value > 0 ? value.ceil : value.floor
+    end
+
+    # Concatenates all strings that are adjacent in an array,
+    # while leaving other elements as they are.
+    #
+    # @example
+    #   merge_adjacent_strings([1, "foo", "bar", 2, "baz"])
+    #     #=> [1, "foobar", 2, "baz"]
+    # @param arr [Array]
+    # @return [Array] The enumerable with strings merged
+    def merge_adjacent_strings(arr)
+      # Optimize for the common case of one element
+      return arr if arr.size < 2
+      arr.inject([]) do |a, e|
+        if e.is_a?(String)
+          if a.last.is_a?(String)
+            a.last << e
+          else
+            a << e.dup
+          end
+        else
+          a << e
+        end
+        a
+      end
+    end
+
+    # Non-destructively replaces all occurrences of a subsequence in an array
+    # with another subsequence.
+    #
+    # @example
+    #   replace_subseq([1, 2, 3, 4, 5], [2, 3], [:a, :b])
+    #     #=> [1, :a, :b, 4, 5]
+    #
+    # @param arr [Array] The array whose subsequences will be replaced.
+    # @param subseq [Array] The subsequence to find and replace.
+    # @param replacement [Array] The sequence that `subseq` will be replaced with.
+    # @return [Array] `arr` with `subseq` replaced with `replacement`.
+    def replace_subseq(arr, subseq, replacement)
+      new = []
+      matched = []
+      i = 0
+      arr.each do |elem|
+        if elem != subseq[i]
+          new.push(*matched)
+          matched = []
+          i = 0
+          new << elem
+          next
+        end
+
+        if i == subseq.length - 1
+          matched = []
+          i = 0
+          new.push(*replacement)
+        else
+          matched << elem
+          i += 1
+        end
+      end
+      new.push(*matched)
+      new
+    end
+
+    # Intersperses a value in an enumerable, as would be done with `Array#join`
+    # but without concatenating the array together afterwards.
+    #
+    # @param enum [Enumerable]
+    # @param val
+    # @return [Array]
+    def intersperse(enum, val)
+      enum.inject([]) {|a, e| a << e << val}[0...-1]
+    end
+
+    def slice_by(enum)
+      results = []
+      enum.each do |value|
+        key = yield(value)
+        if !results.empty? && results.last.first == key
+          results.last.last << value
+        else
+          results << [key, [value]]
+        end
+      end
+      results
+    end
+
+    # Substitutes a sub-array of one array with another sub-array.
+    #
+    # @param ary [Array] The array in which to make the substitution
+    # @param from [Array] The sequence of elements to replace with `to`
+    # @param to [Array] The sequence of elements to replace `from` with
+    def substitute(ary, from, to)
+      res = ary.dup
+      i = 0
+      while i < res.size
+        if res[i...i + from.size] == from
+          res[i...i + from.size] = to
+        end
+        i += 1
+      end
+      res
+    end
+
+    # Destructively strips whitespace from the beginning and end
+    # of the first and last elements, respectively,
+    # in the array (if those elements are strings).
+    #
+    # @param arr [Array]
+    # @return [Array] `arr`
+    def strip_string_array(arr)
+      arr.first.lstrip! if arr.first.is_a?(String)
+      arr.last.rstrip! if arr.last.is_a?(String)
+      arr
+    end
+
+    # Return an array of all possible paths through the given arrays.
+    #
+    # @param arrs [Array<Array>]
+    # @return [Array<Arrays>]
+    #
+    # @example
+    #   paths([[1, 2], [3, 4], [5]]) #=>
+    #     # [[1, 3, 5],
+    #     #  [2, 3, 5],
+    #     #  [1, 4, 5],
+    #     #  [2, 4, 5]]
+    def paths(arrs)
+      arrs.inject([[]]) do |paths, arr|
+        arr.map {|e| paths.map {|path| path + [e]}}.flatten(1)
+      end
+    end
+
+    # Computes a single longest common subsequence for `x` and `y`.
+    # If there are more than one longest common subsequences,
+    # the one returned is that which starts first in `x`.
+    #
+    # @param x [Array]
+    # @param y [Array]
+    # @yield [a, b] An optional block to use in place of a check for equality
+    #   between elements of `x` and `y`.
+    # @yieldreturn [Object, nil] If the two values register as equal,
+    #   this will return the value to use in the LCS array.
+    # @return [Array] The LCS
+    def lcs(x, y, &block)
+      x = [nil, *x]
+      y = [nil, *y]
+      block ||= proc {|a, b| a == b && a}
+      lcs_backtrace(lcs_table(x, y, &block), x, y, x.size - 1, y.size - 1, &block)
+    end
+
+    # Like `String.upcase`, but only ever upcases ASCII letters.
+    def upcase(string)
+      return string.upcase unless ruby2_4?
+      string.upcase(:ascii)
+    end
+
+    # Like `String.downcase`, but only ever downcases ASCII letters.
+    def downcase(string)
+      return string.downcase unless ruby2_4?
+      string.downcase(:ascii)
+    end
+
+    # Returns a sub-array of `minuend` containing only elements that are also in
+    # `subtrahend`. Ensures that the return value has the same order as
+    # `minuend`, even on Rubinius where that's not guaranteed by `Array#-`.
+    #
+    # @param minuend [Array]
+    # @param subtrahend [Array]
+    # @return [Array]
+    def array_minus(minuend, subtrahend)
+      return minuend - subtrahend unless rbx?
+      set = Set.new(minuend) - subtrahend
+      minuend.select {|e| set.include?(e)}
+    end
+
+    # Returns the maximum of `val1` and `val2`. We use this over \{Array.max} to
+    # avoid unnecessary garbage collection.
+    def max(val1, val2)
+      val1 > val2 ? val1 : val2
+    end
+
+    # Returns the minimum of `val1` and `val2`. We use this over \{Array.min} to
+    # avoid unnecessary garbage collection.
+    def min(val1, val2)
+      val1 <= val2 ? val1 : val2
+    end
+
+    # Returns a string description of the character that caused an
+    # `Encoding::UndefinedConversionError`.
+    #
+    # @param e [Encoding::UndefinedConversionError]
+    # @return [String]
+    def undefined_conversion_error_char(e)
+      # Rubinius (as of 2.0.0.rc1) pre-quotes the error character.
+      return e.error_char if rbx?
+      # JRuby (as of 1.7.2) doesn't have an error_char field on
+      # Encoding::UndefinedConversionError.
+      return e.error_char.dump unless jruby?
+      e.message[/^"[^"]+"/] # "
+    end
+
+    # Asserts that `value` falls within `range` (inclusive), leaving
+    # room for slight floating-point errors.
+    #
+    # @param name [String] The name of the value. Used in the error message.
+    # @param range [Range] The allowed range of values.
+    # @param value [Numeric, Sass::Script::Value::Number] The value to check.
+    # @param unit [String] The unit of the value. Used in error reporting.
+    # @return [Numeric] `value` adjusted to fall within range, if it
+    #   was outside by a floating-point margin.
+    def check_range(name, range, value, unit = '')
+      grace = (-0.00001..0.00001)
+      str = value.to_s
+      value = value.value if value.is_a?(Sass::Script::Value::Number)
+      return value if range.include?(value)
+      return range.first if grace.include?(value - range.first)
+      return range.last if grace.include?(value - range.last)
+      raise ArgumentError.new(
+        "#{name} #{str} must be between #{range.first}#{unit} and #{range.last}#{unit}")
+    end
+
+    # Returns whether or not `seq1` is a subsequence of `seq2`. That is, whether
+    # or not `seq2` contains every element in `seq1` in the same order (and
+    # possibly more elements besides).
+    #
+    # @param seq1 [Array]
+    # @param seq2 [Array]
+    # @return [Boolean]
+    def subsequence?(seq1, seq2)
+      i = j = 0
+      loop do
+        return true if i == seq1.size
+        return false if j == seq2.size
+        i += 1 if seq1[i] == seq2[j]
+        j += 1
+      end
+    end
+
+    # Returns information about the caller of the previous method.
+    #
+    # @param entry [String] An entry in the `#caller` list, or a similarly formatted string
+    # @return [[String, Integer, (String, nil)]]
+    #   An array containing the filename, line, and method name of the caller.
+    #   The method name may be nil
+    def caller_info(entry = nil)
+      # JRuby evaluates `caller` incorrectly when it's in an actual default argument.
+      entry ||= caller[1]
+      info = entry.scan(/^((?:[A-Za-z]:)?.*?):(-?.*?)(?::.*`(.+)')?$/).first
+      info[1] = info[1].to_i
+      # This is added by Rubinius to designate a block, but we don't care about it.
+      info[2].sub!(/ \{\}\Z/, '') if info[2]
+      info
+    end
+
+    # Returns whether one version string represents a more recent version than another.
+    #
+    # @param v1 [String] A version string.
+    # @param v2 [String] Another version string.
+    # @return [Boolean]
+    def version_gt(v1, v2)
+      # Construct an array to make sure the shorter version is padded with nil
+      Array.new([v1.length, v2.length].max).zip(v1.split("."), v2.split(".")) do |_, p1, p2|
+        p1 ||= "0"
+        p2 ||= "0"
+        release1 = p1 =~ /^[0-9]+$/
+        release2 = p2 =~ /^[0-9]+$/
+        if release1 && release2
+          # Integer comparison if both are full releases
+          p1, p2 = p1.to_i, p2.to_i
+          next if p1 == p2
+          return p1 > p2
+        elsif !release1 && !release2
+          # String comparison if both are prereleases
+          next if p1 == p2
+          return p1 > p2
+        else
+          # If only one is a release, that one is newer
+          return release1
+        end
+      end
+    end
+
+    # Returns whether one version string represents the same or a more
+    # recent version than another.
+    #
+    # @param v1 [String] A version string.
+    # @param v2 [String] Another version string.
+    # @return [Boolean]
+    def version_geq(v1, v2)
+      version_gt(v1, v2) || !version_gt(v2, v1)
+    end
+
+    # Throws a NotImplementedError for an abstract method.
+    #
+    # @param obj [Object] `self`
+    # @raise [NotImplementedError]
+    def abstract(obj)
+      raise NotImplementedError.new("#{obj.class} must implement ##{caller_info[2]}")
+    end
+
+    # Prints a deprecation warning for the caller method.
+    #
+    # @param obj [Object] `self`
+    # @param message [String] A message describing what to do instead.
+    def deprecated(obj, message = nil)
+      obj_class = obj.is_a?(Class) ? "#{obj}." : "#{obj.class}#"
+      full_message = "DEPRECATION WARNING: #{obj_class}#{caller_info[2]} " +
+        "will be removed in a future version of Sass.#{("\n" + message) if message}"
+      Sass::Util.sass_warn full_message
+    end
+
+    # Silence all output to STDERR within a block.
+    #
+    # @yield A block in which no output will be printed to STDERR
+    def silence_warnings
+      the_real_stderr, $stderr = $stderr, StringIO.new
+      yield
+    ensure
+      $stderr = the_real_stderr
+    end
+
+    # Silences all Sass warnings within a block.
+    #
+    # @yield A block in which no Sass warnings will be printed
+    def silence_sass_warnings
+      old_level, Sass.logger.log_level = Sass.logger.log_level, :error
+      yield
+    ensure
+      Sass.logger.log_level = old_level
+    end
+
+    # The same as `Kernel#warn`, but is silenced by \{#silence\_sass\_warnings}.
+    #
+    # @param msg [String]
+    def sass_warn(msg)
+      Sass.logger.warn("#{msg}\n")
+    end
+
+    ## Cross Rails Version Compatibility
+
+    # Returns the root of the Rails application,
+    # if this is running in a Rails context.
+    # Returns `nil` if no such root is defined.
+    #
+    # @return [String, nil]
+    def rails_root
+      if defined?(::Rails.root)
+        return ::Rails.root.to_s if ::Rails.root
+        raise "ERROR: Rails.root is nil!"
+      end
+      return RAILS_ROOT.to_s if defined?(RAILS_ROOT)
+      nil
+    end
+
+    # Returns the environment of the Rails application,
+    # if this is running in a Rails context.
+    # Returns `nil` if no such environment is defined.
+    #
+    # @return [String, nil]
+    def rails_env
+      return ::Rails.env.to_s if defined?(::Rails.env)
+      return RAILS_ENV.to_s if defined?(RAILS_ENV)
+      nil
+    end
+
+    # Returns whether this environment is using ActionPack
+    # version 3.0.0 or greater.
+    #
+    # @return [Boolean]
+    def ap_geq_3?
+      ap_geq?("3.0.0.beta1")
+    end
+
+    # Returns whether this environment is using ActionPack
+    # of a version greater than or equal to that specified.
+    #
+    # @param version [String] The string version number to check against.
+    #   Should be greater than or equal to Rails 3,
+    #   because otherwise ActionPack::VERSION isn't autoloaded
+    # @return [Boolean]
+    def ap_geq?(version)
+      # The ActionPack module is always loaded automatically in Rails >= 3
+      return false unless defined?(ActionPack) && defined?(ActionPack::VERSION) &&
+        defined?(ActionPack::VERSION::STRING)
+
+      version_geq(ActionPack::VERSION::STRING, version)
+    end
+
+    # Returns an ActionView::Template* class.
+    # In pre-3.0 versions of Rails, most of these classes
+    # were of the form `ActionView::TemplateFoo`,
+    # while afterwards they were of the form `ActionView;:Template::Foo`.
+    #
+    # @param name [#to_s] The name of the class to get.
+    #   For example, `:Error` will return `ActionView::TemplateError`
+    #   or `ActionView::Template::Error`.
+    def av_template_class(name)
+      return ActionView.const_get("Template#{name}") if ActionView.const_defined?("Template#{name}")
+      ActionView::Template.const_get(name.to_s)
+    end
+
+    ## Cross-OS Compatibility
+    #
+    # These methods are cached because some of them are called quite frequently
+    # and even basic checks like String#== are too costly to be called repeatedly.
+
+    # Whether or not this is running on Windows.
+    #
+    # @return [Boolean]
+    def windows?
+      return @windows if defined?(@windows)
+      @windows = (RbConfig::CONFIG['host_os'] =~ /mswin|windows|mingw/i)
+    end
+
+    # Whether or not this is running on IronRuby.
+    #
+    # @return [Boolean]
+    def ironruby?
+      return @ironruby if defined?(@ironruby)
+      @ironruby = RUBY_ENGINE == "ironruby"
+    end
+
+    # Whether or not this is running on Rubinius.
+    #
+    # @return [Boolean]
+    def rbx?
+      return @rbx if defined?(@rbx)
+      @rbx = RUBY_ENGINE == "rbx"
+    end
+
+    # Whether or not this is running on JRuby.
+    #
+    # @return [Boolean]
+    def jruby?
+      return @jruby if defined?(@jruby)
+      @jruby = RUBY_PLATFORM =~ /java/
+    end
+
+    # Returns an array of ints representing the JRuby version number.
+    #
+    # @return [Array<Integer>]
+    def jruby_version
+      @jruby_version ||= ::JRUBY_VERSION.split(".").map {|s| s.to_i}
+    end
+
+    # Like `Dir.glob`, but works with backslash-separated paths on Windows.
+    #
+    # @param path [String]
+    def glob(path)
+      path = path.tr('\\', '/') if windows?
+      if block_given?
+        Dir.glob(path) {|f| yield(f)}
+      else
+        Dir.glob(path)
+      end
+    end
+
+    # Like `Pathname.new`, but normalizes Windows paths to always use backslash
+    # separators.
+    #
+    # `Pathname#relative_path_from` can break if the two pathnames aren't
+    # consistent in their slash style.
+    #
+    # @param path [String]
+    # @return [Pathname]
+    def pathname(path)
+      path = path.tr("/", "\\") if windows?
+      Pathname.new(path)
+    end
+
+    # Like `Pathname#cleanpath`, but normalizes Windows paths to always use
+    # backslash separators. Normally, `Pathname#cleanpath` actually does the
+    # reverse -- it will convert backslashes to forward slashes, which can break
+    # `Pathname#relative_path_from`.
+    #
+    # @param path [String, Pathname]
+    # @return [Pathname]
+    def cleanpath(path)
+      path = Pathname.new(path) unless path.is_a?(Pathname)
+      pathname(path.cleanpath.to_s)
+    end
+
+    # Returns `path` with all symlinks resolved.
+    #
+    # @param path [String, Pathname]
+    # @return [Pathname]
+    def realpath(path)
+      path = Pathname.new(path) unless path.is_a?(Pathname)
+
+      # Explicitly DON'T run #pathname here. We don't want to convert
+      # to Windows directory separators because we're comparing these
+      # against the paths returned by Listen, which use forward
+      # slashes everywhere.
+      begin
+        path.realpath
+      rescue SystemCallError
+        # If [path] doesn't actually exist, don't bail, just
+        # return the original.
+        path
+      end
+    end
+
+    # Returns `path` relative to `from`.
+    #
+    # This is like `Pathname#relative_path_from` except it accepts both strings
+    # and pathnames, it handles Windows path separators correctly, and it throws
+    # an error rather than crashing if the paths use different encodings
+    # (https://github.com/ruby/ruby/pull/713).
+    #
+    # @param path [String, Pathname]
+    # @param from [String, Pathname]
+    # @return [Pathname?]
+    def relative_path_from(path, from)
+      pathname(path.to_s).relative_path_from(pathname(from.to_s))
+    rescue NoMethodError => e
+      raise e unless e.name == :zero?
+
+      # Work around https://github.com/ruby/ruby/pull/713.
+      path = path.to_s
+      from = from.to_s
+      raise ArgumentError("Incompatible path encodings: #{path.inspect} is #{path.encoding}, " +
+        "#{from.inspect} is #{from.encoding}")
+    end
+
+    # Converts `path` to a "file:" URI. This handles Windows paths correctly.
+    #
+    # @param path [String, Pathname]
+    # @return [String]
+    def file_uri_from_path(path)
+      path = path.to_s if path.is_a?(Pathname)
+      path = path.tr('\\', '/') if windows?
+      path = URI::DEFAULT_PARSER.escape(path)
+      return path.start_with?('/') ? "file://" + path : path unless windows?
+      return "file:///" + path.tr("\\", "/") if path =~ %r{^[a-zA-Z]:[/\\]}
+      return "file:" + path.tr("\\", "/") if path =~ %r{\\\\[^\\]+\\[^\\/]+}
+      path.tr("\\", "/")
+    end
+
+    # Retries a filesystem operation if it fails on Windows. Windows
+    # has weird and flaky locking rules that can cause operations to fail.
+    #
+    # @yield [] The filesystem operation.
+    def retry_on_windows
+      return yield unless windows?
+
+      begin
+        yield
+      rescue SystemCallError
+        sleep 0.1
+        yield
+      end
+    end
+
+    # Prepare a value for a destructuring assignment (e.g. `a, b =
+    # val`). This works around a performance bug when using
+    # ActiveSupport, and only needs to be called when `val` is likely
+    # to be `nil` reasonably often.
+    #
+    # See [this bug report](http://redmine.ruby-lang.org/issues/4917).
+    #
+    # @param val [Object]
+    # @return [Object]
+    def destructure(val)
+      val || []
+    end
+
+    CHARSET_REGEXP = /\A@charset "([^"]+)"/
+    bom = "\uFEFF"
+    UTF_8_BOM = bom.encode("UTF-8").force_encoding('BINARY')
+    UTF_16BE_BOM = bom.encode("UTF-16BE").force_encoding('BINARY')
+    UTF_16LE_BOM = bom.encode("UTF-16LE").force_encoding('BINARY')
+
+    ## Cross-Ruby-Version Compatibility
+
+    # Whether or not this is running under Ruby 2.4 or higher.
+    #
+    # @return [Boolean]
+    def ruby2_4?
+      return @ruby2_4 if defined?(@ruby2_4)
+      @ruby2_4 =
+        if RUBY_VERSION_COMPONENTS[0] == 2
+          RUBY_VERSION_COMPONENTS[1] >= 4
+        else
+          RUBY_VERSION_COMPONENTS[0] > 2
+        end
+    end
+
+    # Like {\#check\_encoding}, but also checks for a `@charset` declaration
+    # at the beginning of the file and uses that encoding if it exists.
+    #
+    # Sass follows CSS's decoding rules.
+    #
+    # @param str [String] The string of which to check the encoding
+    # @return [(String, Encoding)] The original string encoded as UTF-8,
+    #   and the source encoding of the string
+    # @raise [Encoding::UndefinedConversionError] if the source encoding
+    #   cannot be converted to UTF-8
+    # @raise [ArgumentError] if the document uses an unknown encoding with `@charset`
+    # @raise [Sass::SyntaxError] If the document declares an encoding that
+    #   doesn't match its contents, or it doesn't declare an encoding and its
+    #   contents are invalid in the native encoding.
+    def check_sass_encoding(str)
+      # Determine the fallback encoding following section 3.2 of CSS Syntax Level 3 and Encodings:
+      # http://www.w3.org/TR/2013/WD-css-syntax-3-20130919/#determine-the-fallback-encoding
+      # http://encoding.spec.whatwg.org/#decode
+      binary = str.dup.force_encoding("BINARY")
+      if binary.start_with?(UTF_8_BOM)
+        binary.slice! 0, UTF_8_BOM.length
+        str = binary.force_encoding('UTF-8')
+      elsif binary.start_with?(UTF_16BE_BOM)
+        binary.slice! 0, UTF_16BE_BOM.length
+        str = binary.force_encoding('UTF-16BE')
+      elsif binary.start_with?(UTF_16LE_BOM)
+        binary.slice! 0, UTF_16LE_BOM.length
+        str = binary.force_encoding('UTF-16LE')
+      elsif binary =~ CHARSET_REGEXP
+        charset = $1.force_encoding('US-ASCII')
+        encoding = Encoding.find(charset)
+        if encoding.name == 'UTF-16' || encoding.name == 'UTF-16BE'
+          encoding = Encoding.find('UTF-8')
+        end
+        str = binary.force_encoding(encoding)
+      elsif str.encoding.name == "ASCII-8BIT"
+        # Normally we want to fall back on believing the Ruby string
+        # encoding, but if that's just binary we want to make sure
+        # it's valid UTF-8.
+        str = str.force_encoding('utf-8')
+      end
+
+      find_encoding_error(str) unless str.valid_encoding?
+
+      begin
+        # If the string is valid, preprocess it according to section 3.3 of CSS Syntax Level 3.
+        return str.encode("UTF-8").gsub(/\r\n?|\f/, "\n").tr("\u0000", "�"), str.encoding
+      rescue EncodingError
+        find_encoding_error(str)
+      end
+    end
+
+    # Destructively removes all elements from an array that match a block, and
+    # returns the removed elements.
+    #
+    # @param array [Array] The array from which to remove elements.
+    # @yield [el] Called for each element.
+    # @yieldparam el [*] The element to test.
+    # @yieldreturn [Boolean] Whether or not to extract the element.
+    # @return [Array] The extracted elements.
+    def extract!(array)
+      out = []
+      array.reject! do |e|
+        next false unless yield e
+        out << e
+        true
+      end
+      out
+    end
+
+    # Flattens the first level of nested arrays in `arrs`. Unlike
+    # `Array#flatten`, this orders the result by taking the first
+    # values from each array in order, then the second, and so on.
+    #
+    # @param arrs [Array] The array to flatten.
+    # @return [Array] The flattened array.
+    def flatten_vertically(arrs)
+      result = []
+      arrs = arrs.map {|sub| sub.is_a?(Array) ? sub.dup : Array(sub)}
+      until arrs.empty?
+        arrs.reject! do |arr|
+          result << arr.shift
+          arr.empty?
+        end
+      end
+      result
+    end
+
+    # Like `Object#inspect`, but preserves non-ASCII characters rather than
+    # escaping them under Ruby 1.9.2.  This is necessary so that the
+    # precompiled Haml template can be `#encode`d into `@options[:encoding]`
+    # before being evaluated.
+    #
+    # @param obj {Object}
+    # @return {String}
+    def inspect_obj(obj)
+      return obj.inspect unless version_geq(RUBY_VERSION, "1.9.2")
+      return ':' + inspect_obj(obj.to_s) if obj.is_a?(Symbol)
+      return obj.inspect unless obj.is_a?(String)
+      '"' + obj.gsub(/[\x00-\x7F]+/) {|s| s.inspect[1...-1]} + '"'
+    end
+
+    # Extracts the non-string vlaues from an array containing both strings and non-strings.
+    # These values are replaced with escape sequences.
+    # This can be undone using \{#inject\_values}.
+    #
+    # This is useful e.g. when we want to do string manipulation
+    # on an interpolated string.
+    #
+    # The precise format of the resulting string is not guaranteed.
+    # However, it is guaranteed that newlines and whitespace won't be affected.
+    #
+    # @param arr [Array] The array from which values are extracted.
+    # @return [(String, Array)] The resulting string, and an array of extracted values.
+    def extract_values(arr)
+      values = []
+      mapped = arr.map do |e|
+        next e.gsub('{', '{{') if e.is_a?(String)
+        values << e
+        next "{#{values.count - 1}}"
+      end
+      return mapped.join, values
+    end
+
+    # Undoes \{#extract\_values} by transforming a string with escape sequences
+    # into an array of strings and non-string values.
+    #
+    # @param str [String] The string with escape sequences.
+    # @param values [Array] The array of values to inject.
+    # @return [Array] The array of strings and values.
+    def inject_values(str, values)
+      return [str.gsub('{{', '{')] if values.empty?
+      # Add an extra { so that we process the tail end of the string
+      result = (str + '{{').scan(/(.*?)(?:(\{\{)|\{(\d+)\})/m).map do |(pre, esc, n)|
+        [pre, esc ? '{' : '', n ? values[n.to_i] : '']
+      end.flatten(1)
+      result[-2] = '' # Get rid of the extra {
+      merge_adjacent_strings(result).reject {|s| s == ''}
+    end
+
+    # Allows modifications to be performed on the string form
+    # of an array containing both strings and non-strings.
+    #
+    # @param arr [Array] The array from which values are extracted.
+    # @yield [str] A block in which string manipulation can be done to the array.
+    # @yieldparam str [String] The string form of `arr`.
+    # @yieldreturn [String] The modified string.
+    # @return [Array] The modified, interpolated array.
+    def with_extracted_values(arr)
+      str, vals = extract_values(arr)
+      str = yield str
+      inject_values(str, vals)
+    end
+
+    # Builds a sourcemap file name given the generated CSS file name.
+    #
+    # @param css [String] The generated CSS file name.
+    # @return [String] The source map file name.
+    def sourcemap_name(css)
+      css + ".map"
+    end
+
+    # Escapes certain characters so that the result can be used
+    # as the JSON string value. Returns the original string if
+    # no escaping is necessary.
+    #
+    # @param s [String] The string to be escaped
+    # @return [String] The escaped string
+    def json_escape_string(s)
+      return s if s !~ /["\\\b\f\n\r\t]/
+
+      result = ""
+      s.split("").each do |c|
+        case c
+        when '"', "\\"
+          result << "\\" << c
+        when "\n" then result << "\\n"
+        when "\t" then result << "\\t"
+        when "\r" then result << "\\r"
+        when "\f" then result << "\\f"
+        when "\b" then result << "\\b"
+        else
+          result << c
+        end
+      end
+      result
+    end
+
+    # Converts the argument into a valid JSON value.
+    #
+    # @param v [Integer, String, Array, Boolean, nil]
+    # @return [String]
+    def json_value_of(v)
+      case v
+      when Integer
+        v.to_s
+      when String
+        "\"" + json_escape_string(v) + "\""
+      when Array
+        "[" + v.map {|x| json_value_of(x)}.join(",") + "]"
+      when NilClass
+        "null"
+      when TrueClass
+        "true"
+      when FalseClass
+        "false"
+      else
+        raise ArgumentError.new("Unknown type: #{v.class.name}")
+      end
+    end
+
+    VLQ_BASE_SHIFT = 5
+    VLQ_BASE = 1 << VLQ_BASE_SHIFT
+    VLQ_BASE_MASK = VLQ_BASE - 1
+    VLQ_CONTINUATION_BIT = VLQ_BASE
+
+    BASE64_DIGITS = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a + ['+', '/']
+    BASE64_DIGIT_MAP = begin
+      map = {}
+      BASE64_DIGITS.each_with_index.map do |digit, i|
+        map[digit] = i
+      end
+      map
+    end
+
+    # Encodes `value` as VLQ (http://en.wikipedia.org/wiki/VLQ).
+    #
+    # @param value [Integer]
+    # @return [String] The encoded value
+    def encode_vlq(value)
+      if value < 0
+        value = ((-value) << 1) | 1
+      else
+        value <<= 1
+      end
+
+      result = ''
+      begin
+        digit = value & VLQ_BASE_MASK
+        value >>= VLQ_BASE_SHIFT
+        if value > 0
+          digit |= VLQ_CONTINUATION_BIT
+        end
+        result << BASE64_DIGITS[digit]
+      end while value > 0
+      result
+    end
+
+    ## Static Method Stuff
+
+    # The context in which the ERB for \{#def\_static\_method} will be run.
+    class StaticConditionalContext
+      # @param set [#include?] The set of variables that are defined for this context.
+      def initialize(set)
+        @set = set
+      end
+
+      # Checks whether or not a variable is defined for this context.
+      #
+      # @param name [Symbol] The name of the variable
+      # @return [Boolean]
+      def method_missing(name, *args)
+        super unless args.empty? && !block_given?
+        @set.include?(name)
+      end
+    end
+
+    # @private
+    ATOMIC_WRITE_MUTEX = Mutex.new
+
+    # This creates a temp file and yields it for writing. When the
+    # write is complete, the file is moved into the desired location.
+    # The atomicity of this operation is provided by the filesystem's
+    # rename operation.
+    #
+    # @param filename [String] The file to write to.
+    # @param perms [Integer] The permissions used for creating this file.
+    #   Will be masked by the process umask. Defaults to readable/writeable
+    #   by all users however the umask usually changes this to only be writable
+    #   by the process's user.
+    # @yieldparam tmpfile [Tempfile] The temp file that can be written to.
+    # @return The value returned by the block.
+    def atomic_create_and_write_file(filename, perms = 0666)
+      require 'tempfile'
+      tmpfile = Tempfile.new(File.basename(filename), File.dirname(filename))
+      tmpfile.binmode if tmpfile.respond_to?(:binmode)
+      result = yield tmpfile
+      tmpfile.close
+      ATOMIC_WRITE_MUTEX.synchronize do
+        begin
+          File.chmod(perms & ~File.umask, tmpfile.path)
+        rescue Errno::EPERM
+          # If we don't have permissions to chmod the file, don't let that crash
+          # the compilation. See issue 1215.
+        end
+        File.rename tmpfile.path, filename
+      end
+      result
+    ensure
+      # close and remove the tempfile if it still exists,
+      # presumably due to an error during write
+      tmpfile.close if tmpfile
+      tmpfile.unlink if tmpfile
+    end
+
+    private
+
+    def find_encoding_error(str)
+      encoding = str.encoding
+      cr = Regexp.quote("\r".encode(encoding).force_encoding('BINARY'))
+      lf = Regexp.quote("\n".encode(encoding).force_encoding('BINARY'))
+      ff = Regexp.quote("\f".encode(encoding).force_encoding('BINARY'))
+      line_break = /#{cr}#{lf}?|#{ff}|#{lf}/
+
+      str.force_encoding("binary").split(line_break).each_with_index do |line, i|
+        begin
+          line.encode(encoding)
+        rescue Encoding::UndefinedConversionError => e
+          raise Sass::SyntaxError.new(
+            "Invalid #{encoding.name} character #{undefined_conversion_error_char(e)}",
+            :line => i + 1)
+        end
+      end
+
+      # We shouldn't get here, but it's possible some weird encoding stuff causes it.
+      return str, str.encoding
+    end
+
+    # Calculates the memoization table for the Least Common Subsequence algorithm.
+    # Algorithm from [Wikipedia](http://en.wikipedia.org/wiki/Longest_common_subsequence_problem#Computing_the_length_of_the_LCS)
+    def lcs_table(x, y)
+      # This method does not take a block as an explicit parameter for performance reasons.
+      c = Array.new(x.size) {[]}
+      x.size.times {|i| c[i][0] = 0}
+      y.size.times {|j| c[0][j] = 0}
+      (1...x.size).each do |i|
+        (1...y.size).each do |j|
+          c[i][j] =
+            if yield x[i], y[j]
+              c[i - 1][j - 1] + 1
+            else
+              [c[i][j - 1], c[i - 1][j]].max
+            end
+        end
+      end
+      c
+    end
+    # rubocop:disable ParameterLists
+
+    # Computes a single longest common subsequence for arrays x and y.
+    # Algorithm from [Wikipedia](http://en.wikipedia.org/wiki/Longest_common_subsequence_problem#Reading_out_an_LCS)
+    def lcs_backtrace(c, x, y, i, j, &block)
+      # rubocop:enable ParameterList
+      return [] if i == 0 || j == 0
+      if (v = yield(x[i], y[j]))
+        return lcs_backtrace(c, x, y, i - 1, j - 1, &block) << v
+      end
+
+      return lcs_backtrace(c, x, y, i, j - 1, &block) if c[i][j - 1] > c[i - 1][j]
+      lcs_backtrace(c, x, y, i - 1, j, &block)
+    end
+
+    singleton_methods.each {|method| module_function method}
+  end
+end
+
+require 'sass/util/multibyte_string_scanner'
+require 'sass/util/normalized_map'
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/multibyte_string_scanner.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/multibyte_string_scanner.rb
new file mode 100644
index 0000000..27e07f0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/multibyte_string_scanner.rb
@@ -0,0 +1,151 @@
+require 'strscan'
+
+if Sass::Util.rbx?
+  # Rubinius's StringScanner class implements some of its methods in terms of
+  # others, which causes us to double-count bytes in some cases if we do
+  # straightforward inheritance. To work around this, we use a delegate class.
+  require 'delegate'
+  class Sass::Util::MultibyteStringScanner < DelegateClass(StringScanner)
+    def initialize(str)
+      super(StringScanner.new(str))
+      @mb_pos = 0
+      @mb_matched_size = nil
+      @mb_last_pos = nil
+    end
+
+    def is_a?(klass)
+      __getobj__.is_a?(klass) || super
+    end
+  end
+else
+  class Sass::Util::MultibyteStringScanner < StringScanner
+    def initialize(str)
+      super
+      @mb_pos = 0
+      @mb_matched_size = nil
+      @mb_last_pos = nil
+    end
+  end
+end
+
+# A wrapper of the native StringScanner class that works correctly with
+# multibyte character encodings. The native class deals only in bytes, not
+# characters, for methods like [#pos] and [#matched_size]. This class deals
+# only in characters, instead.
+class Sass::Util::MultibyteStringScanner
+  def self.new(str)
+    return StringScanner.new(str) if str.ascii_only?
+    super
+  end
+
+  alias_method :byte_pos, :pos
+  alias_method :byte_matched_size, :matched_size
+
+  def check(pattern); _match super; end
+  def check_until(pattern); _matched super; end
+  def getch; _forward _match super; end
+  def match?(pattern); _size check(pattern); end
+  def matched_size; @mb_matched_size; end
+  def peek(len); string[@mb_pos, len]; end
+  alias_method :peep, :peek
+  def pos; @mb_pos; end
+  alias_method :pointer, :pos
+  def rest_size; rest.size; end
+  def scan(pattern); _forward _match super; end
+  def scan_until(pattern); _forward _matched super; end
+  def skip(pattern); _size scan(pattern); end
+  def skip_until(pattern); _matched _size scan_until(pattern); end
+
+  def get_byte
+    raise "MultibyteStringScanner doesn't support #get_byte."
+  end
+
+  def getbyte
+    raise "MultibyteStringScanner doesn't support #getbyte."
+  end
+
+  def pos=(n)
+    @mb_last_pos = nil
+
+    # We set position kind of a lot during parsing, so we want it to be as
+    # efficient as possible. This is complicated by the fact that UTF-8 is a
+    # variable-length encoding, so it's difficult to find the byte length that
+    # corresponds to a given character length.
+    #
+    # Our heuristic here is to try to count the fewest possible characters. So
+    # if the new position is close to the current one, just count the
+    # characters between the two; if the new position is closer to the
+    # beginning of the string, just count the characters from there.
+    if @mb_pos - n < @mb_pos / 2
+      # New position is close to old position
+      byte_delta = @mb_pos > n ? -string[n...@mb_pos].bytesize : string[@mb_pos...n].bytesize
+      super(byte_pos + byte_delta)
+    else
+      # New position is close to BOS
+      super(string[0...n].bytesize)
+    end
+    @mb_pos = n
+  end
+
+  def reset
+    @mb_pos = 0
+    @mb_matched_size = nil
+    @mb_last_pos = nil
+    super
+  end
+
+  def scan_full(pattern, advance_pointer_p, return_string_p)
+    res = _match super(pattern, advance_pointer_p, true)
+    _forward res if advance_pointer_p
+    return res if return_string_p
+  end
+
+  def search_full(pattern, advance_pointer_p, return_string_p)
+    res = super(pattern, advance_pointer_p, true)
+    _forward res if advance_pointer_p
+    _matched((res if return_string_p))
+  end
+
+  def string=(str)
+    @mb_pos = 0
+    @mb_matched_size = nil
+    @mb_last_pos = nil
+    super
+  end
+
+  def terminate
+    @mb_pos = string.size
+    @mb_matched_size = nil
+    @mb_last_pos = nil
+    super
+  end
+  alias_method :clear, :terminate
+
+  def unscan
+    super
+    @mb_pos = @mb_last_pos
+    @mb_last_pos = @mb_matched_size = nil
+  end
+
+  private
+
+  def _size(str)
+    str && str.size
+  end
+
+  def _match(str)
+    @mb_matched_size = str && str.size
+    str
+  end
+
+  def _matched(res)
+    _match matched
+    res
+  end
+
+  def _forward(str)
+    @mb_last_pos = @mb_pos
+    @mb_pos += str.size if str
+    str
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/normalized_map.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/normalized_map.rb
new file mode 100644
index 0000000..d2e3b87
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/normalized_map.rb
@@ -0,0 +1,122 @@
+require 'delegate'
+
+module Sass
+  module Util
+    # A hash that normalizes its string keys while still allowing you to get back
+    # to the original keys that were stored. If several different values normalize
+    # to the same value, whichever is stored last wins.
+    class NormalizedMap
+      # Create a normalized map
+      def initialize(map = nil)
+        @key_strings = {}
+        @map = {}
+
+        map.each {|key, value| self[key] = value} if map
+      end
+
+      # Specifies how to transform the key.
+      #
+      # This can be overridden to create other normalization behaviors.
+      def normalize(key)
+        key.tr("-", "_")
+      end
+
+      # Returns the version of `key` as it was stored before
+      # normalization. If `key` isn't in the map, returns it as it was
+      # passed in.
+      #
+      # @return [String]
+      def denormalize(key)
+        @key_strings[normalize(key)] || key
+      end
+
+      # @private
+      def []=(k, v)
+        normalized = normalize(k)
+        @map[normalized] = v
+        @key_strings[normalized] = k
+        v
+      end
+
+      # @private
+      def [](k)
+        @map[normalize(k)]
+      end
+
+      # @private
+      def has_key?(k)
+        @map.has_key?(normalize(k))
+      end
+
+      # @private
+      def delete(k)
+        normalized = normalize(k)
+        @key_strings.delete(normalized)
+        @map.delete(normalized)
+      end
+
+      # @return [Hash] Hash with the keys as they were stored (before normalization).
+      def as_stored
+        Sass::Util.map_keys(@map) {|k| @key_strings[k]}
+      end
+
+      def empty?
+        @map.empty?
+      end
+
+      def values
+        @map.values
+      end
+
+      def keys
+        @map.keys
+      end
+
+      def each
+        @map.each {|k, v| yield(k, v)}
+      end
+
+      def size
+        @map.size
+      end
+
+      def to_hash
+        @map.dup
+      end
+
+      def to_a
+        @map.to_a
+      end
+
+      def map
+        @map.map {|k, v| yield(k, v)}
+      end
+
+      def dup
+        d = super
+        d.send(:instance_variable_set, "@map", @map.dup)
+        d
+      end
+
+      def sort_by
+        @map.sort_by {|k, v| yield k, v}
+      end
+
+      def update(map)
+        map = map.as_stored if map.is_a?(NormalizedMap)
+        map.each {|k, v| self[k] = v}
+      end
+
+      def method_missing(method, *args, &block)
+        if Sass.tests_running
+          raise ArgumentError.new("The method #{method} must be implemented explicitly")
+        end
+        @map.send(method, *args, &block)
+      end
+
+      def respond_to_missing?(method, include_private = false)
+        @map.respond_to?(method, include_private)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/subset_map.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/subset_map.rb
new file mode 100644
index 0000000..cd401f2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/subset_map.rb
@@ -0,0 +1,109 @@
+require 'set'
+
+module Sass
+  module Util
+    # A map from sets to values.
+    # A value is \{#\[]= set} by providing a set (the "set-set") and a value,
+    # which is then recorded as corresponding to that set.
+    # Values are \{#\[] accessed} by providing a set (the "get-set")
+    # and returning all values that correspond to set-sets
+    # that are subsets of the get-set.
+    #
+    # SubsetMap preserves the order of values as they're inserted.
+    #
+    # @example
+    #   ssm = SubsetMap.new
+    #   ssm[Set[1, 2]] = "Foo"
+    #   ssm[Set[2, 3]] = "Bar"
+    #   ssm[Set[1, 2, 3]] = "Baz"
+    #
+    #   ssm[Set[1, 2, 3]] #=> ["Foo", "Bar", "Baz"]
+    class SubsetMap
+      # Creates a new, empty SubsetMap.
+      def initialize
+        @hash = {}
+        @vals = []
+      end
+
+      # Whether or not this SubsetMap has any key-value pairs.
+      #
+      # @return [Boolean]
+      def empty?
+        @hash.empty?
+      end
+
+      # Associates a value with a set.
+      # When `set` or any of its supersets is accessed,
+      # `value` will be among the values returned.
+      #
+      # Note that if the same `set` is passed to this method multiple times,
+      # all given `value`s will be associated with that `set`.
+      #
+      # This runs in `O(n)` time, where `n` is the size of `set`.
+      #
+      # @param set [#to_set] The set to use as the map key. May not be empty.
+      # @param value [Object] The value to associate with `set`.
+      # @raise [ArgumentError] If `set` is empty.
+      def []=(set, value)
+        raise ArgumentError.new("SubsetMap keys may not be empty.") if set.empty?
+
+        index = @vals.size
+        @vals << value
+        set.each do |k|
+          @hash[k] ||= []
+          @hash[k] << [set, set.to_set, index]
+        end
+      end
+
+      # Returns all values associated with subsets of `set`.
+      #
+      # In the worst case, this runs in `O(m*max(n, log m))` time,
+      # where `n` is the size of `set`
+      # and `m` is the number of associations in the map.
+      # However, unless many keys in the map overlap with `set`,
+      # `m` will typically be much smaller.
+      #
+      # @param set [Set] The set to use as the map key.
+      # @return [Array<(Object, #to_set)>] An array of pairs,
+      #   where the first value is the value associated with a subset of `set`,
+      #   and the second value is that subset of `set`
+      #   (or whatever `#to_set` object was used to set the value)
+      #   This array is in insertion order.
+      # @see #[]
+      def get(set)
+        res = set.map do |k|
+          subsets = @hash[k]
+          next unless subsets
+          subsets.map do |subenum, subset, index|
+            next unless subset.subset?(set)
+            [index, subenum]
+          end
+        end.flatten(1)
+        res.compact!
+        res.uniq!
+        res.sort!
+        res.map! {|i, s| [@vals[i], s]}
+        res
+      end
+
+      # Same as \{#get}, but doesn't return the subsets of the argument
+      # for which values were found.
+      #
+      # @param set [Set] The set to use as the map key.
+      # @return [Array] The array of all values
+      #   associated with subsets of `set`, in insertion order.
+      # @see #get
+      def [](set)
+        get(set).map {|v, _| v}
+      end
+
+      # Iterates over each value in the subset map. Ignores keys completely. If
+      # multiple keys have the same value, this will return them multiple times.
+      #
+      # @yield [Object] Each value in the map.
+      def each_value
+        @vals.each {|v| yield v}
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/test.rb
new file mode 100644
index 0000000..905e81f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/util/test.rb
@@ -0,0 +1,9 @@
+module Sass
+  module Util
+    module Test
+      def skip(msg = nil, bt = caller)
+        super if defined?(super)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/version.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/version.rb
new file mode 100644
index 0000000..def330a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/lib/sass/version.rb
@@ -0,0 +1,122 @@
+require 'date'
+require 'sass/util'
+
+module Sass
+  # Handles Sass version-reporting.
+  # Sass not only reports the standard three version numbers,
+  # but its Git revision hash as well,
+  # if it was installed from Git.
+  module Version
+    # Returns a hash representing the version of Sass.
+    # The `:major`, `:minor`, and `:teeny` keys have their respective numbers as Integers.
+    # The `:name` key has the name of the version.
+    # The `:string` key contains a human-readable string representation of the version.
+    # The `:number` key is the major, minor, and teeny keys separated by periods.
+    # The `:date` key, which is not guaranteed to be defined, is the `DateTime`
+    #   at which this release was cut.
+    # If Sass is checked out from Git, the `:rev` key will have the revision hash.
+    # For example:
+    #
+    #     {
+    #       :string => "2.1.0.9616393",
+    #       :rev    => "9616393b8924ef36639c7e82aa88a51a24d16949",
+    #       :number => "2.1.0",
+    #       :date   => DateTime.parse("Apr 30 13:52:01 2009 -0700"),
+    #       :major  => 2, :minor => 1, :teeny => 0
+    #     }
+    #
+    # If a prerelease version of Sass is being used,
+    # the `:string` and `:number` fields will reflect the full version
+    # (e.g. `"2.2.beta.1"`), and the `:teeny` field will be `-1`.
+    # A `:prerelease` key will contain the name of the prerelease (e.g. `"beta"`),
+    # and a `:prerelease_number` key will contain the rerelease number.
+    # For example:
+    #
+    #     {
+    #       :string => "3.0.beta.1",
+    #       :number => "3.0.beta.1",
+    #       :date   => DateTime.parse("Mar 31 00:38:04 2010 -0700"),
+    #       :major => 3, :minor => 0, :teeny => -1,
+    #       :prerelease => "beta",
+    #       :prerelease_number => 1
+    #     }
+    #
+    # @return [{Symbol => String/Integer}] The version hash
+    # @comment
+    def version
+      return @@version if defined?(@@version)
+
+      numbers = File.read(Sass::Util.scope('VERSION')).strip.split('.').
+        map {|n| n =~ /^[0-9]+$/ ? n.to_i : n}
+      name = File.read(Sass::Util.scope('VERSION_NAME')).strip
+      @@version = {
+        :major => numbers[0],
+        :minor => numbers[1],
+        :teeny => numbers[2],
+        :name => name
+      }
+
+      if (date = version_date)
+        @@version[:date] = date
+      end
+
+      if numbers[3].is_a?(String)
+        @@version[:teeny] = -1
+        @@version[:prerelease] = numbers[3]
+        @@version[:prerelease_number] = numbers[4]
+      end
+
+      @@version[:number] = numbers.join('.')
+      @@version[:string] = @@version[:number].dup
+
+      if (rev = revision_number)
+        @@version[:rev] = rev
+        unless rev[0] == ?(
+          @@version[:string] << "." << rev[0...7]
+        end
+      end
+
+      @@version[:string] << " (#{name})"
+      @@version
+    end
+
+    private
+
+    def revision_number
+      if File.exist?(Sass::Util.scope('REVISION'))
+        rev = File.read(Sass::Util.scope('REVISION')).strip
+        return rev unless rev =~ /^([a-f0-9]+|\(.*\))$/ || rev == '(unknown)'
+      end
+
+      return unless File.exist?(Sass::Util.scope('.git/HEAD'))
+      rev = File.read(Sass::Util.scope('.git/HEAD')).strip
+      return rev unless rev =~ /^ref: (.*)$/
+
+      ref_name = $1
+      ref_file = Sass::Util.scope(".git/#{ref_name}")
+      info_file = Sass::Util.scope(".git/info/refs")
+      return File.read(ref_file).strip if File.exist?(ref_file)
+      return unless File.exist?(info_file)
+      File.open(info_file) do |f|
+        f.each do |l|
+          sha, ref = l.strip.split("\t", 2)
+          next unless ref == ref_name
+          return sha
+        end
+      end
+      nil
+    end
+
+    def version_date
+      return unless File.exist?(Sass::Util.scope('VERSION_DATE'))
+      DateTime.parse(File.read(Sass::Util.scope('VERSION_DATE')).strip)
+    end
+  end
+
+  extend Sass::Version
+
+  # A string representing the version of Sass.
+  # A more fine-grained representation is available from Sass.version.
+  # @api public
+  VERSION = version[:string] unless defined?(Sass::VERSION)
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/rails/init.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/rails/init.rb
new file mode 100644
index 0000000..13d5baa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/rails/init.rb
@@ -0,0 +1 @@
+Kernel.load File.join(File.dirname(__FILE__), '..', 'init.rb')
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass-spec.yml b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass-spec.yml
new file mode 100644
index 0000000..afb5565
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass-spec.yml
@@ -0,0 +1,3 @@
+---
+:enabled: true
+:language_version: '3.5'
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/cache_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/cache_test.rb
new file mode 100755
index 0000000..b460bc6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/cache_test.rb
@@ -0,0 +1,130 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require File.dirname(__FILE__) + '/test_helper'
+require 'sass/engine'
+
+class CacheTest < MiniTest::Test
+  @@cache_dir = "tmp/file_cache"
+
+  def setup
+    FileUtils.mkdir_p @@cache_dir
+  end
+
+  def teardown
+    FileUtils.rm_rf @@cache_dir
+    clean_up_sassc
+  end
+
+  def test_file_cache_writes_a_file
+    file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
+    file_store.store("asdf/foo.scssc", "fakesha1", root_node)
+    assert File.exist?("#{@@cache_dir}/asdf/foo.scssc")
+  end
+
+  def test_file_cache_reads_a_file
+    file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
+    assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
+    file_store.store("asdf/foo.scssc", "fakesha1", root_node)
+    assert File.exist?("#{@@cache_dir}/asdf/foo.scssc")
+    assert_kind_of Sass::Tree::RootNode, file_store.retrieve("asdf/foo.scssc", "fakesha1")
+  end
+
+  def test_file_cache_miss_returns_nil
+    file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
+    assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
+    assert_nil file_store.retrieve("asdf/foo.scssc", "fakesha1")
+  end
+
+  def test_sha_change_invalidates_cache_and_cleans_up
+    file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
+    assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
+    file_store.store("asdf/foo.scssc", "fakesha1", root_node)
+    assert File.exist?("#{@@cache_dir}/asdf/foo.scssc")
+    assert_nil file_store.retrieve("asdf/foo.scssc", "differentsha1")
+    assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
+  end
+
+  def test_version_change_invalidates_cache_and_cleans_up
+    file_store = Sass::CacheStores::Filesystem.new(@@cache_dir)
+    assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
+    file_store.store("asdf/foo.scssc", "fakesha1", root_node)
+    assert File.exist?("#{@@cache_dir}/asdf/foo.scssc")
+    real_version = Sass::VERSION
+    begin
+      Sass::VERSION.replace("a different version")
+      assert_nil file_store.retrieve("asdf/foo.scssc", "fakesha1")
+      assert !File.exist?("#{@@cache_dir}/asdf/foo.scssc")
+    ensure
+      Sass::VERSION.replace(real_version)
+    end
+  end
+
+  def test_arbitrary_objects_can_go_into_cache
+    cache = Sass::CacheStores::Memory.new
+    an_object = {:foo => :bar}
+    cache.store("an_object", "", an_object)
+    assert_equal an_object, cache.retrieve("an_object", "")
+  end
+
+  def test_cache_node_with_unmarshalable_option
+    engine_with_unmarshalable_options("foo {a: b + c}").to_tree
+  end
+
+  # Regression tests
+
+  def test_cache_mixin_def_splat_sass_node_with_unmarshalable_option
+    engine_with_unmarshalable_options(<<SASS, :syntax => :sass).to_tree
+=color($args...)
+  color: red
+SASS
+  end
+
+  def test_cache_mixin_def_splat_scss_node_with_unmarshalable_option
+    engine_with_unmarshalable_options(<<SCSS, :syntax => :scss).to_tree
+@mixin color($args...) {
+  color: red;
+}
+SCSS
+  end
+
+  def test_cache_function_splat_sass_node_with_unmarshalable_option
+    engine_with_unmarshalable_options(<<SASS, :syntax => :sass).to_tree
+@function color($args...)
+  @return red
+SASS
+  end
+
+  def test_cache_function_splat_scss_node_with_unmarshalable_option
+    engine_with_unmarshalable_options(<<SCSS, :syntax => :scss).to_tree
+@function color($args...) {
+  @return red;
+}
+SCSS
+  end
+
+  def test_cache_include_splat_sass_node_with_unmarshalable_option
+    engine_with_unmarshalable_options(<<SASS, :syntax => :sass).to_tree
+@include color($args..., $kwargs...)
+SASS
+  end
+
+  def test_cache_include_splat_scss_node_with_unmarshalable_option
+    engine_with_unmarshalable_options(<<SCSS, :syntax => :scss).to_tree
+@include color($args..., $kwargs...);
+SCSS
+  end
+
+  private
+  def root_node
+    Sass::Engine.new(<<-SCSS, :syntax => :scss).to_tree
+      @mixin color($c) { color: $c}
+      div { @include color(red); }
+    SCSS
+  end
+
+  def engine_with_unmarshalable_options(src, options={})
+    Sass::Engine.new(src, {
+      :syntax => :scss, :object => Class.new.new, :filename => 'file.scss',
+      :importer => Sass::Importers::Filesystem.new(absolutize('templates'))
+    }.merge(options))
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/callbacks_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/callbacks_test.rb
new file mode 100755
index 0000000..6143637
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/callbacks_test.rb
@@ -0,0 +1,60 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'sass/callbacks'
+
+class CallerBack
+  extend Sass::Callbacks
+  define_callback :foo
+  define_callback :bar
+
+  def do_foo
+    run_foo
+  end
+
+  def do_bar
+    run_bar 12
+  end
+end
+
+module ClassLevelCallerBack
+  extend Sass::Callbacks
+  define_callback :foo
+  extend self
+
+  def do_foo
+    run_foo
+  end
+end
+
+class SassCallbacksTest < MiniTest::Test
+  def test_simple_callback
+    cb = CallerBack.new
+    there = false
+    cb.on_foo {there = true}
+    cb.do_foo
+    assert there, "Expected callback to be called."
+  end
+
+  def test_multiple_callbacks
+    cb = CallerBack.new
+    str = ""
+    cb.on_foo {str += "first"}
+    cb.on_foo {str += " second"}
+    cb.do_foo
+    assert_equal "first second", str
+  end
+
+  def test_callback_with_arg
+    cb = CallerBack.new
+    val = nil
+    cb.on_bar {|a| val = a}
+    cb.do_bar
+    assert_equal 12, val
+  end
+
+  def test_class_level_callback
+    there = false
+    ClassLevelCallerBack.on_foo {there = true}
+    ClassLevelCallerBack.do_foo
+    assert there, "Expected callback to be called."
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/compiler_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/compiler_test.rb
new file mode 100755
index 0000000..dee582b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/compiler_test.rb
@@ -0,0 +1,225 @@
+require 'minitest/autorun'
+require File.dirname(__FILE__) + '/../test_helper'
+require 'sass/plugin'
+require 'sass/plugin/compiler'
+
+class CompilerTest < MiniTest::Test
+  class FakeListener
+    attr_accessor :options
+    attr_accessor :directories
+    attr_reader :start_called
+    attr_reader :thread
+
+    def initialize(*args, &on_filesystem_event)
+      self.options = args.last.is_a?(Hash) ? args.pop : {}
+      self.directories = args
+      @on_filesystem_event = on_filesystem_event
+      @start_called = false
+      reset_events!
+    end
+
+    def fire_events!(*args)
+      @on_filesystem_event.call(@modified, @added, @removed)
+      reset_events!
+    end
+
+    def changed(filename)
+      @modified << File.expand_path(filename)
+    end
+
+    def added(filename)
+      @added << File.expand_path(filename)
+    end
+
+    def removed(filename)
+      @removed << File.expand_path(filename)
+    end
+
+    def on_start!(&run_during_start)
+      @run_during_start = run_during_start
+    end
+
+    def start!
+      @run_during_start.call(self) if @run_during_start
+    end
+
+    def start
+      parent = Thread.current
+      @thread = Thread.new do
+        @run_during_start.call(self) if @run_during_start
+        parent.raise Interrupt
+      end
+    end
+
+    def stop
+    end
+
+    def reset_events!
+      @modified = []
+      @added = []
+      @removed = []
+    end
+  end
+
+  module MockWatcher
+    attr_accessor :run_during_start
+    attr_accessor :update_stylesheets_times
+    attr_accessor :update_stylesheets_called_with
+    attr_accessor :deleted_css_files
+
+    def fake_listener
+      @fake_listener
+    end
+
+    def update_stylesheets(individual_files)
+      @update_stylesheets_times ||= 0
+      @update_stylesheets_times += 1
+      (@update_stylesheets_called_with ||= []) << individual_files
+    end
+
+    def try_delete_css(css_filename)
+      (@deleted_css_files ||= []) << css_filename
+    end
+
+    private
+    def create_listener(*args, &on_filesystem_event)
+      args.pop if args.last.is_a?(Hash)
+      @fake_listener = FakeListener.new(*args, &on_filesystem_event)
+      @fake_listener.on_start!(&run_during_start)
+      @fake_listener
+    end
+  end
+
+  def test_initialize
+    watcher
+  end
+
+  def test_watch_starts_the_listener
+    start_called = false
+    c = watcher do |listener|
+      start_called = true
+    end
+    c.watch
+    assert start_called, "start! was not called"
+  end
+
+  def test_sass_callbacks_fire_from_listener_events
+    c = watcher do |listener|
+      listener.changed "changed.scss"
+      listener.added "added.scss"
+      listener.removed "removed.scss"
+      listener.fire_events!
+    end
+
+    modified_fired = false
+    c.on_template_modified do |sass_file|
+      modified_fired = true
+      assert_equal "changed.scss", sass_file
+    end
+
+    added_fired = false
+    c.on_template_created do |sass_file|
+      added_fired = true
+      assert_equal "added.scss", sass_file
+    end
+
+    removed_fired = false
+    c.on_template_deleted do |sass_file|
+      removed_fired = true
+      assert_equal "removed.scss", sass_file
+    end
+
+    c.watch
+
+    assert_equal 2, c.update_stylesheets_times
+    assert modified_fired
+    assert added_fired
+    assert removed_fired
+  end
+
+  def test_removing_a_sass_file_removes_corresponding_css_file
+    c = watcher do |listener|
+      listener.removed "remove_me.scss"
+      listener.fire_events!
+    end
+
+    c.watch
+
+    assert_equal "./remove_me.css", c.deleted_css_files.first
+  end
+
+  def test_an_importer_can_watch_an_image
+    image_importer = Sass::Importers::Filesystem.new(".")
+    class << image_importer
+      def watched_file?(filename)
+        filename =~ /\.png$/
+      end
+    end
+    c = watcher(:load_paths => [image_importer]) do |listener|
+      listener.changed "image.png"
+      listener.fire_events!
+    end
+
+    modified_fired = false
+    c.on_template_modified do |f|
+      modified_fired = true
+      assert_equal "image.png", f
+    end
+
+    c.watch
+
+    assert_equal 2, c.update_stylesheets_times
+    assert modified_fired
+  end
+
+  def test_watching_specific_files_and_one_is_deleted
+    directories = nil
+    c = watcher do |listener|
+      directories = listener.directories
+      listener.removed File.expand_path("./foo.scss")
+      listener.fire_events!
+    end
+    c.watch([[File.expand_path("./foo.scss"), File.expand_path("./foo.css"), nil]])
+    assert directories.include?(File.expand_path(".")), directories.inspect
+    assert_equal File.expand_path("./foo.css"), c.deleted_css_files.first, "the corresponding css file was not deleted"
+    assert_equal [], c.update_stylesheets_called_with[1], "the sass file should not have been compiled"
+  end
+
+  def test_watched_directories_are_dedupped
+    directories = nil
+    c = watcher(:load_paths => [".", "./foo", "."]) do |listener|
+      directories = listener.directories
+    end
+    c.watch
+    assert_equal [File.expand_path(".")], directories
+  end
+
+  def test_a_changed_css_in_a_watched_directory_does_not_force_a_compile
+    c = watcher do |listener|
+      listener.changed "foo.css"
+      listener.fire_events!
+    end
+
+    c.on_template_modified do |f|
+      assert false, "Should not have been called"
+    end
+
+    c.watch
+
+    assert_equal 1, c.update_stylesheets_times
+  end
+
+  private
+
+  def default_options
+    {:template_location => [[".","."]]}
+  end
+
+  def watcher(options = {}, &run_during_start)
+    options = default_options.merge(options)
+    watcher = Sass::Plugin::Compiler.new(options)
+    watcher.extend(MockWatcher)
+    watcher.run_during_start = run_during_start
+    watcher
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/conversion_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/conversion_test.rb
new file mode 100755
index 0000000..337a243
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/conversion_test.rb
@@ -0,0 +1,2138 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ConversionTest < MiniTest::Test
+  def test_basic
+    assert_converts <<SASS, <<SCSS
+foo bar
+  baz: bang
+  bip: bop
+SASS
+foo bar {
+  baz: bang;
+  bip: bop;
+}
+SCSS
+    silence_warnings {assert_converts <<SASS, <<SCSS, options: {old: true}}
+foo bar
+  :baz bang
+  :bip bop
+SASS
+foo bar {
+  baz: bang;
+  bip: bop;
+}
+SCSS
+  end
+
+  def test_empty_selector
+    assert_converts "foo bar", "foo bar {}"
+  end
+
+  def test_empty_directive
+    assert_converts "@media screen", "@media screen {}"
+  end
+
+  def test_empty_control_directive
+    assert_converts "@if false", "@if false {}"
+  end
+
+  def test_nesting
+    assert_converts <<SASS, <<SCSS
+foo bar
+  baz bang
+    baz: bang
+    bip: bop
+
+  blat: boo
+SASS
+foo bar {
+  baz bang {
+    baz: bang;
+    bip: bop;
+  }
+
+  blat: boo;
+}
+SCSS
+  end
+
+  def test_nesting_with_parent_ref
+    assert_converts <<SASS, <<SCSS
+foo bar
+  &:hover
+    baz: bang
+SASS
+foo bar {
+  &:hover {
+    baz: bang;
+  }
+}
+SCSS
+  end
+
+  def test_selector_interpolation
+    assert_converts <<SASS, <<SCSS
+foo \#{$bar + "baz"}.bip
+  baz: bang
+
+foo /\#{$bar + "baz"}/ .bip
+  baz: bang
+SASS
+foo \#{$bar + "baz"}.bip {
+  baz: bang;
+}
+
+foo /\#{$bar + "baz"}/ .bip {
+  baz: bang;
+}
+SCSS
+  end
+
+  def test_multiline_selector_with_commas
+    assert_converts <<SASS, <<SCSS
+foo bar,
+baz bang
+  baz: bang
+SASS
+foo bar,
+baz bang {
+  baz: bang;
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+blat
+  foo bar,
+  baz bang
+    baz: bang
+SASS
+blat {
+  foo bar,
+  baz bang {
+    baz: bang;
+  }
+}
+SCSS
+  end
+
+  def test_multiline_selector_without_commas
+    assert_scss_to_sass <<SASS, <<SCSS
+foo bar baz bang
+  baz: bang
+SASS
+foo bar
+baz bang {
+  baz: bang;
+}
+SCSS
+
+    assert_scss_to_scss <<SCSS
+foo bar
+baz bang {
+  baz: bang;
+}
+SCSS
+  end
+
+  def test_escaped_selector
+    assert_converts <<SASS, <<SCSS
+foo bar
+  \\:hover
+    baz: bang
+SASS
+foo bar {
+  :hover {
+    baz: bang;
+  }
+}
+SCSS
+  end
+
+  def test_property_name_interpolation
+    assert_converts <<SASS, <<SCSS
+foo bar
+  baz\#{$bang}bip\#{$bop}: 12
+SASS
+foo bar {
+  baz\#{$bang}bip\#{$bop}: 12;
+}
+SCSS
+  end
+
+  def test_property_value_interpolation
+    assert_converts <<SASS, <<SCSS
+foo bar
+  baz: 12 \#{$bang} bip \#{"bop"} blat
+SASS
+foo bar {
+  baz: 12 \#{$bang} bip \#{"bop"} blat;
+}
+SCSS
+  end
+
+  def test_dynamic_properties
+    assert_converts <<SASS, <<SCSS
+foo bar
+  baz: 12 $bang "bip"
+SASS
+foo bar {
+  baz: 12 $bang "bip";
+}
+SCSS
+  end
+
+  def test_dynamic_properties_with_old
+    silence_warnings {assert_converts <<SASS, <<SCSS, options: {old: true}}
+foo bar
+  :baz 12 $bang "bip"
+SASS
+foo bar {
+  baz: 12 $bang "bip";
+}
+SCSS
+  end
+
+  def test_multiline_properties
+    assert_scss_to_sass <<SASS, <<SCSS
+foo bar
+  baz: bip bam boon
+SASS
+foo bar {
+  baz:
+    bip
+  bam
+        boon;
+}
+SCSS
+
+    assert_scss_to_scss <<OUT, source: <<IN
+foo bar {
+  baz: bip bam boon;
+}
+OUT
+foo bar {
+  baz:
+    bip
+  bam
+        boon;
+}
+IN
+  end
+
+  def test_multiline_dynamic_properties
+    assert_scss_to_sass <<SASS, <<SCSS
+foo bar
+  baz: $bip "bam" 12px
+SASS
+foo bar {
+  baz:
+    $bip
+  "bam"
+        12px;
+}
+SCSS
+
+    assert_scss_to_scss <<OUT, source: <<IN
+foo bar {
+  baz: $bip "bam" 12px;
+}
+OUT
+foo bar {
+  baz:
+    $bip
+  "bam"
+        12px;
+}
+IN
+  end
+
+  def test_silent_comments
+    assert_converts <<SASS, <<SCSS
+// foo
+
+// bar
+
+// baz
+
+foo bar
+  a: b
+SASS
+// foo
+
+// bar
+
+// baz
+
+foo bar {
+  a: b;
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+// foo
+// bar
+//   baz
+// bang
+
+foo bar
+  a: b
+SASS
+// foo
+// bar
+//   baz
+// bang
+
+foo bar {
+  a: b;
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+// foo
+// bar
+//   baz
+// bang
+
+foo bar
+  a: b
+SASS
+// foo
+// bar
+//   baz
+// bang
+
+foo bar {
+  a: b;
+}
+SCSS
+  end
+
+  def test_nested_silent_comments
+    assert_converts <<SASS, <<SCSS
+foo
+  bar: baz
+
+  // bip bop
+  // beep boop
+  bang: bizz
+
+  // bubble bubble
+  // toil trouble
+SASS
+foo {
+  bar: baz;
+
+  // bip bop
+  // beep boop
+  bang: bizz;
+
+  // bubble bubble
+  // toil trouble
+}
+SCSS
+
+    assert_sass_to_scss <<SCSS, <<SASS
+foo {
+  bar: baz;
+
+  // bip bop
+  // beep boop
+  //   bap blimp
+  bang: bizz;
+
+  // bubble bubble
+  // toil trouble
+  //    gorp
+}
+SCSS
+foo
+  bar: baz
+
+  // bip bop
+     beep boop
+       bap blimp
+  bang: bizz
+
+  // bubble bubble
+    toil trouble
+       gorp
+SASS
+  end
+
+  def test_preserves_triple_slash_comments
+    assert_converts <<SASS, <<SCSS
+/// foo
+/// bar
+foo
+  /// bip bop
+  /// beep boop
+SASS
+/// foo
+/// bar
+foo {
+  /// bip bop
+  /// beep boop
+}
+SCSS
+  end
+
+  def test_loud_comments
+    assert_converts <<SASS, <<SCSS
+/* foo
+
+/* bar
+
+/* baz
+
+foo bar
+  a: b
+SASS
+/* foo */
+
+/* bar */
+
+/* baz */
+
+foo bar {
+  a: b;
+}
+SCSS
+
+    assert_scss_to_sass <<SASS, <<SCSS
+/* foo
+ * bar
+ *   baz
+ * bang
+
+foo bar
+  a: b
+SASS
+/* foo
+   bar
+     baz
+   bang */
+
+foo bar {
+  a: b;
+}
+SCSS
+
+    assert_scss_to_scss <<SCSS
+/* foo
+   bar
+     baz
+   bang */
+
+foo bar {
+  a: b;
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+/* foo
+ * bar
+ *   baz
+ * bang
+
+foo bar
+  a: b
+SASS
+/* foo
+ * bar
+ *   baz
+ * bang */
+
+foo bar {
+  a: b;
+}
+SCSS
+  end
+
+  def test_nested_loud_comments
+    assert_converts <<SASS, <<SCSS
+foo
+  bar: baz
+
+  /* bip bop
+   * beep boop
+  bang: bizz
+
+  /* bubble bubble
+   * toil trouble
+SASS
+foo {
+  bar: baz;
+
+  /* bip bop
+   * beep boop */
+  bang: bizz;
+
+  /* bubble bubble
+   * toil trouble */
+}
+SCSS
+
+    assert_sass_to_scss <<SCSS, <<SASS
+foo {
+  bar: baz;
+
+  /* bip bop
+   * beep boop
+   *   bap blimp */
+  bang: bizz;
+
+  /* bubble bubble
+   * toil trouble
+   *    gorp */
+}
+SCSS
+foo
+  bar: baz
+
+  /* bip bop
+     beep boop
+       bap blimp
+  bang: bizz
+
+  /* bubble bubble
+    toil trouble
+       gorp
+SASS
+  end
+
+  def test_preserves_double_star_comments
+    assert_converts <<SASS, <<SCSS
+/** foo
+ *  bar
+foo
+  /** bip bop
+   *  beep boop
+SASS
+/** foo
+ *  bar */
+foo {
+  /** bip bop
+   *  beep boop */
+}
+SCSS
+  end
+
+  def test_loud_comments_with_weird_indentation
+    assert_scss_to_sass <<SASS, <<SCSS
+foo
+  /*      foo
+   * bar
+   *     baz
+  a: b
+SASS
+foo {
+  /* foo
+bar
+    baz */
+  a: b;
+}
+SCSS
+
+    assert_sass_to_scss <<SCSS, <<SASS
+foo {
+  /*      foo
+   * bar
+   *     baz */
+  a: b;
+}
+SCSS
+foo
+  /*      foo
+     bar
+         baz
+  a: b
+SASS
+  end
+
+  def test_loud_comment_containing_silent_comment
+    assert_scss_to_sass <<SASS, <<SCSS
+/*
+ *// foo bar
+SASS
+/*
+// foo bar
+*/
+SCSS
+  end
+
+  def test_silent_comment_containing_loud_comment
+    assert_scss_to_sass <<SASS, <<SCSS
+// /*
+//  * foo bar
+//  */
+SASS
+// /*
+//  * foo bar
+//  */
+SCSS
+  end
+
+  def test_immediately_preceding_comments
+    assert_converts <<SASS, <<SCSS
+/* Foo
+ * Bar
+ * Baz
+.foo#bar
+  a: b
+SASS
+/* Foo
+ * Bar
+ * Baz */
+.foo#bar {
+  a: b;
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+// Foo
+// Bar
+// Baz
+=foo
+  a: b
+SASS
+// Foo
+// Bar
+// Baz
+@mixin foo {
+  a: b;
+}
+SCSS
+  end
+
+  def test_immediately_following_comments
+    assert_sass_to_scss <<SCSS, <<SASS
+.foobar {
+  // trailing comment
+  a: 1px;
+}
+SCSS
+.foobar // trailing comment
+  a: 1px
+SASS
+
+    assert_sass_to_scss <<SCSS, <<SASS
+.foobar {
+  // trailing comment
+  a: 1px;
+}
+SCSS
+.foobar  /* trailing comment */
+  a: 1px
+SASS
+  end
+
+  def test_debug
+    assert_converts <<SASS, <<SCSS
+foo
+  @debug 12px
+
+  bar: baz
+SASS
+foo {
+  @debug 12px;
+
+  bar: baz;
+}
+SCSS
+  end
+
+  def test_error
+    assert_converts <<SASS, <<SCSS
+foo
+  @error "oh no!"
+
+  bar: baz
+SASS
+foo {
+  @error "oh no!";
+
+  bar: baz;
+}
+SCSS
+  end
+
+  def test_directive_without_children
+    assert_converts <<SASS, <<SCSS
+foo
+  @foo #bar "baz"
+
+  bar: baz
+SASS
+foo {
+  @foo #bar "baz";
+
+  bar: baz;
+}
+SCSS
+  end
+
+  def test_directive_with_prop_children
+    assert_converts <<SASS, <<SCSS
+foo
+  @foo #bar "baz"
+    a: b
+    c: d
+
+  bar: baz
+SASS
+foo {
+  @foo #bar "baz" {
+    a: b;
+    c: d;
+  }
+
+  bar: baz;
+}
+SCSS
+  end
+
+  def test_directive_with_rule_children
+    assert_converts <<SASS, <<SCSS
+foo
+  @foo #bar "baz"
+    #blat
+      a: b
+
+    .bang
+      c: d
+      e: f
+
+  bar: baz
+SASS
+foo {
+  @foo #bar "baz" {
+    #blat {
+      a: b;
+    }
+
+    .bang {
+      c: d;
+      e: f;
+    }
+  }
+
+  bar: baz;
+}
+SCSS
+  end
+
+  def test_directive_with_rule_and_prop_children
+    assert_converts <<SASS, <<SCSS
+foo
+  @foo #bar "baz"
+    g: h
+
+    #blat
+      a: b
+
+    .bang
+      c: d
+      e: f
+
+    i: j
+
+  bar: baz
+SASS
+foo {
+  @foo #bar "baz" {
+    g: h;
+
+    #blat {
+      a: b;
+    }
+
+    .bang {
+      c: d;
+      e: f;
+    }
+
+    i: j;
+  }
+
+  bar: baz;
+}
+SCSS
+  end
+
+  def test_charset
+    assert_converts <<SASS, <<SCSS
+@charset "utf-8"
+SASS
+@charset "utf-8";
+SCSS
+  end
+
+  def test_for
+    assert_converts <<SASS, <<SCSS
+foo
+  @for $a from $b to $c
+    a: b
+
+  @for $c from 1 to 16
+    d: e
+    f: g
+SASS
+foo {
+  @for $a from $b to $c {
+    a: b;
+  }
+
+  @for $c from 1 to 16 {
+    d: e;
+    f: g;
+  }
+}
+SCSS
+  end
+
+  def test_while
+    assert_converts <<SASS, <<SCSS
+foo
+  @while flaz($a + $b)
+    a: b
+
+  @while 1
+    d: e
+    f: g
+SASS
+foo {
+  @while flaz($a + $b) {
+    a: b;
+  }
+
+  @while 1 {
+    d: e;
+    f: g;
+  }
+}
+SCSS
+  end
+
+  def test_if
+    assert_converts <<SASS, <<SCSS
+foo
+  @if $foo or $bar
+    a: b
+
+  @if $baz
+    d: e
+  @else if $bang
+    f: g
+  @else
+    h: i
+SASS
+foo {
+  @if $foo or $bar {
+    a: b;
+  }
+
+  @if $baz {
+    d: e;
+  }
+  @else if $bang {
+    f: g;
+  }
+  @else {
+    h: i;
+  }
+}
+SCSS
+  end
+
+  def test_each
+    assert_converts <<SASS, <<SCSS
+a
+  @each $number in 1px 2px 3px 4px
+    b: $number
+
+c
+  @each $str in foo, bar, baz, bang
+    d: $str
+
+c
+  @each $key, $value in (foo: 1, bar: 2, baz: 3)
+    \#{$key}: $value
+SASS
+a {
+  @each $number in 1px 2px 3px 4px {
+    b: $number;
+  }
+}
+
+c {
+  @each $str in foo, bar, baz, bang {
+    d: $str;
+  }
+}
+
+c {
+  @each $key, $value in (foo: 1, bar: 2, baz: 3) {
+    \#{$key}: $value;
+  }
+}
+SCSS
+  end
+
+  def test_import
+    assert_converts <<SASS, <<SCSS
+@import foo
+
+@import url(bar.css)
+
+foo
+  bar: baz
+SASS
+@import "foo";
+
+@import url(bar.css);
+
+foo {
+  bar: baz;
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+@import foo.css
+
+@import url(bar.css)
+
+foo
+  bar: baz
+SASS
+@import "foo.css";
+
+@import url(bar.css);
+
+foo {
+  bar: baz;
+}
+SCSS
+  end
+
+  def test_import_as_directive_in_sass
+    assert_equal "@import foo.css\n", to_sass('@import "foo.css"')
+  end
+
+  def test_import_as_directive_in_scss
+    assert_converts <<SASS, <<SCSS
+@import "foo.css" print
+SASS
+@import "foo.css" print;
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+@import url(foo.css) screen, print
+SASS
+@import url(foo.css) screen, print;
+SCSS
+  end
+
+  def test_adjacent_imports
+    assert_converts <<SASS, <<SCSS
+@import foo.sass
+@import bar.scss
+@import baz
+SASS
+@import "foo.sass";
+@import "bar.scss";
+@import "baz";
+SCSS
+  end
+
+  def test_non_adjacent_imports
+    assert_converts <<SASS, <<SCSS
+@import foo.sass
+
+@import bar.scss
+
+@import baz
+SASS
+@import "foo.sass";
+
+@import "bar.scss";
+
+@import "baz";
+SCSS
+  end
+
+  def test_import_with_interpolation
+    assert_converts <<SASS, <<SCSS
+$family: unquote("Droid+Sans")
+
+@import url("http://fonts.googleapis.com/css?family=\#{$family}")
+SASS
+$family: unquote("Droid+Sans");
+
+@import url("http://fonts.googleapis.com/css?family=\#{$family}");
+SCSS
+  end
+
+  def test_extend
+    assert_converts <<SASS, <<SCSS
+.foo
+  @extend .bar
+
+  @extend .baz:bang
+SASS
+.foo {
+  @extend .bar;
+
+  @extend .baz:bang;
+}
+SCSS
+  end
+
+  def test_comma_extendee
+    assert_converts <<SASS, <<SCSS
+.baz
+  @extend .foo, .bar
+SASS
+.baz {
+  @extend .foo, .bar;
+}
+SCSS
+  end
+
+  def test_argless_mixin_definition
+    assert_converts <<SASS, <<SCSS
+=foo-bar
+  baz
+    a: b
+SASS
+@mixin foo-bar {
+  baz {
+    a: b;
+  }
+}
+SCSS
+
+    assert_scss_to_sass <<SASS, <<SCSS
+=foo-bar
+  baz
+    a: b
+SASS
+@mixin foo-bar() {
+  baz {
+    a: b;
+  }
+}
+SCSS
+
+    assert_sass_to_scss <<SCSS, <<SASS
+@mixin foo-bar {
+  baz {
+    a: b;
+  }
+}
+SCSS
+=foo-bar()
+  baz
+    a: b
+SASS
+  end
+
+  def test_mixin_definition_without_defaults
+    assert_converts <<SASS, <<SCSS
+=foo-bar($baz, $bang)
+  baz
+    a: $baz $bang
+SASS
+@mixin foo-bar($baz, $bang) {
+  baz {
+    a: $baz $bang;
+  }
+}
+SCSS
+  end
+
+  def test_mixin_definition_with_defaults
+    assert_converts <<SASS, <<SCSS
+=foo-bar($baz, $bang: 12px)
+  baz
+    a: $baz $bang
+SASS
+@mixin foo-bar($baz, $bang: 12px) {
+  baz {
+    a: $baz $bang;
+  }
+}
+SCSS
+
+    assert_sass_to_scss <<SCSS, <<SASS
+@mixin foo-bar($baz, $bang: foo) {
+  baz {
+    a: $baz $bang;
+  }
+}
+SCSS
+=foo-bar($baz, $bang: foo)
+  baz
+    a: $baz $bang
+SASS
+  end
+
+  def test_argless_mixin_include
+    assert_converts <<SASS, <<SCSS
+foo
+  +foo-bar
+
+  a: blip
+SASS
+foo {
+  @include foo-bar;
+
+  a: blip;
+}
+SCSS
+  end
+
+  def test_mixin_include
+    assert_converts <<SASS, <<SCSS
+foo
+  +foo-bar(12px, "blaz")
+
+  a: blip
+SASS
+foo {
+  @include foo-bar(12px, "blaz");
+
+  a: blip;
+}
+SCSS
+  end
+
+  def test_mixin_include_with_keyword_args
+    assert_converts <<SASS, <<SCSS
+foo
+  +foo-bar(12px, "blaz", $blip: blap, $bloop: blop)
+
+  +foo-bar($blip: blap, $bloop: blop)
+
+  a: blip
+SASS
+foo {
+  @include foo-bar(12px, "blaz", $blip: blap, $bloop: blop);
+
+  @include foo-bar($blip: blap, $bloop: blop);
+
+  a: blip;
+}
+SCSS
+  end
+
+  def test_consecutive_mixin_includes
+    assert_converts <<SASS, <<SCSS
+foo
+  +foo-bar
+  +foo-bar
+
+  a: blip
+SASS
+foo {
+  @include foo-bar;
+  @include foo-bar;
+
+  a: blip;
+}
+SCSS
+  end
+
+  def test_mixin_include_with_hyphen_conversion_keyword_arg
+    assert_converts <<SASS, <<SCSS
+foo
+  +foo-bar($a-b_c: val)
+
+  a: blip
+SASS
+foo {
+  @include foo-bar($a-b_c: val);
+
+  a: blip;
+}
+SCSS
+  end
+
+  def test_argless_function_definition
+    assert_converts <<SASS, <<SCSS
+@function foo()
+  $var: 1 + 1
+
+  @return $var
+SASS
+@function foo() {
+  $var: 1 + 1;
+
+  @return $var;
+}
+SCSS
+  end
+
+  def test_function_definition_without_defaults
+    assert_converts <<SASS, <<SCSS
+@function foo($var1, $var2)
+  @if $var1
+    @return $var1 + $var2
+SASS
+@function foo($var1, $var2) {
+  @if $var1 {
+    @return $var1 + $var2;
+  }
+}
+SCSS
+  end
+
+  def test_function_definition_with_defaults
+    assert_converts <<SASS, <<SCSS
+@function foo($var1, $var2: foo)
+  @if $var1
+    @return $var1 + $var2
+SASS
+@function foo($var1, $var2: foo) {
+  @if $var1 {
+    @return $var1 + $var2;
+  }
+}
+SCSS
+  end
+
+  def test_variable_definition
+    assert_converts <<SASS, <<SCSS
+$var1: 12px + 15px
+
+foo
+  $var2: flaz(#abcdef)
+
+  val: $var1 $var2
+SASS
+$var1: 12px + 15px;
+
+foo {
+  $var2: flaz(#abcdef);
+
+  val: $var1 $var2;
+}
+SCSS
+  end
+
+  def test_guarded_variable_definition
+    assert_converts <<SASS, <<SCSS
+$var1: 12px + 15px !default
+
+foo
+  $var2: flaz(#abcdef) !default
+
+  val: $var1 $var2
+SASS
+$var1: 12px + 15px !default;
+
+foo {
+  $var2: flaz(#abcdef) !default;
+
+  val: $var1 $var2;
+}
+SCSS
+  end
+
+  def test_multiple_variable_definitions
+    assert_converts <<SASS, <<SCSS
+$var1: foo
+$var2: bar
+$var3: baz
+
+$var4: bip
+$var5: bap
+SASS
+$var1: foo;
+$var2: bar;
+$var3: baz;
+
+$var4: bip;
+$var5: bap;
+SCSS
+  end
+
+  def test_division_asserted_with_parens
+    assert_converts <<SASS, <<SCSS
+foo
+  a: (1px / 2px)
+SASS
+foo {
+  a: (1px / 2px);
+}
+SCSS
+  end
+
+  def test_division_not_asserted_when_unnecessary
+    assert_converts <<SASS, <<SCSS
+$var: 1px / 2px
+
+foo
+  a: $var
+SASS
+$var: 1px / 2px;
+
+foo {
+  a: $var;
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+$var: 1px
+
+foo
+  a: $var / 2px
+SASS
+$var: 1px;
+
+foo {
+  a: $var / 2px;
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+foo
+  a: 1 + 1px / 2px
+SASS
+foo {
+  a: 1 + 1px / 2px;
+}
+SCSS
+  end
+
+  def test_literal_slash
+    assert_converts <<SASS, <<SCSS
+foo
+  a: 1px / 2px
+SASS
+foo {
+  a: 1px / 2px;
+}
+SCSS
+
+    # Regression test for issue 1787
+    assert_converts <<SASS, <<SCSS
+foo
+  a: 1px / 2px 3px
+SASS
+foo {
+  a: 1px / 2px 3px;
+}
+SCSS
+  end
+
+  def test_directive_with_interpolation
+    assert_converts <<SASS, <<SCSS
+$baz: 12
+
+@foo bar\#{$baz} qux
+  a: b
+SASS
+$baz: 12;
+
+@foo bar\#{$baz} qux {
+  a: b;
+}
+SCSS
+  end
+
+  def test_media_with_interpolation
+    assert_converts <<SASS, <<SCSS
+$baz: 12
+
+@media bar\#{$baz}
+  a: b
+SASS
+$baz: 12;
+
+@media bar\#{$baz} {
+  a: b;
+}
+SCSS
+  end
+
+  def test_media_with_expressions
+    assert_converts <<SASS, <<SCSS
+$media1: screen
+$media2: print
+$var: -webkit-min-device-pixel-ratio
+$val: 20
+
+@media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2}
+  a: b
+SASS
+$media1: screen;
+$media2: print;
+$var: -webkit-min-device-pixel-ratio;
+$val: 20;
+
+@media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2} {
+  a: b;
+}
+SCSS
+  end
+
+  def test_media_with_feature
+    assert_converts <<SASS, <<SCSS
+@media screen and (-webkit-transform-3d)
+  a: b
+SASS
+@media screen and (-webkit-transform-3d) {
+  a: b;
+}
+SCSS
+  end
+
+  def test_supports_with_expressions
+    assert_converts <<SASS, <<SCSS
+$query: "(feature1: val)"
+$feature: feature2
+$val: val
+
+@supports (\#{$query} and ($feature: $val)) or (not ($feature + 3: $val + 4))
+  foo
+    a: b
+SASS
+$query: "(feature1: val)";
+$feature: feature2;
+$val: val;
+
+@supports (\#{$query} and ($feature: $val)) or (not ($feature + 3: $val + 4)) {
+  foo {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  # Hacks
+
+  def test_declaration_hacks
+    assert_converts <<SASS, <<SCSS
+foo
+  _name: val
+  *name: val
+  #name: val
+  .name: val
+  name/**/: val
+  name/*\\**/: val
+  name: val
+SASS
+foo {
+  _name: val;
+  *name: val;
+  #name: val;
+  .name: val;
+  name/**/: val;
+  name/*\\**/: val;
+  name: val;
+}
+SCSS
+  end
+
+  def test_old_declaration_hacks
+    silence_warnings {assert_converts <<SASS, <<SCSS, options: {old: true}}
+foo
+  :_name val
+  :*name val
+  :#name val
+  :.name val
+  :name val
+SASS
+foo {
+  _name: val;
+  *name: val;
+  #name: val;
+  .name: val;
+  name: val;
+}
+SCSS
+  end
+
+  def test_selector_hacks
+    assert_selector_renders = lambda do |s|
+      assert_converts <<SASS, <<SCSS
+#{s}
+  a: b
+SASS
+#{s} {
+  a: b;
+}
+SCSS
+    end
+
+    assert_selector_renders['> E']
+    assert_selector_renders['+ E']
+    assert_selector_renders['~ E']
+    assert_selector_renders['> > E']
+
+    assert_selector_renders['E*']
+    assert_selector_renders['E*.foo']
+    assert_selector_renders['E*:hover']
+  end
+
+  def test_disallowed_colon_hack
+    assert_raise_message(Sass::SyntaxError, 'The ":name: val" hack is not allowed in the Sass indented syntax') do
+      to_sass("foo {:name: val;}", :syntax => :scss)
+    end
+  end
+
+  def test_nested_properties
+    assert_converts <<SASS, <<SCSS
+div
+  before: before
+  background:
+    color: blue
+    repeat: no-repeat
+  after: after
+SASS
+div {
+  before: before;
+  background: {
+    color: blue;
+    repeat: no-repeat;
+  };
+  after: after;
+}
+
+SCSS
+  end
+
+  def test_dasherize
+    assert_sass_to_scss(<<SCSS, <<SASS, options: {dasherize: true})
+@mixin under-scored-mixin($under-scored-arg: $under-scored-default) {
+  bar: $under-scored-arg;
+}
+
+div {
+  foo: under-scored-fn($under-scored-var + "before\#{$another-under-scored-var}after");
+
+  @include under-scored-mixin($passed-arg);
+
+  selector-\#{$under-scored-interp}: bold;
+}
+
+@if $under-scored {
+  @for $for-var from $from-var to $to-var {
+    @while $while-var == true {
+      $while-var: false;
+    }
+  }
+}
+SCSS
+=under_scored_mixin($under_scored_arg: $under_scored_default)
+  bar: $under_scored_arg
+div
+  foo: under_scored_fn($under_scored_var + "before\#{$another_under_scored_var}after")
+  +under_scored_mixin($passed_arg)
+  selector-\#{$under_scored_interp}: bold
+@if $under_scored
+  @for $for_var from $from_var to $to_var
+    @while $while_var == true
+      $while_var : false
+SASS
+  end
+
+  def test_loud_comment_conversion
+    assert_converts(<<SASS, <<SCSS)
+/*! \#{"interpolated"}
+SASS
+/*! \#{"interpolated"} */
+SCSS
+  end
+
+  def test_content_conversion
+    assert_converts(<<SASS, <<SCSS)
+$color: blue
+
+=context($class, $color: red)
+  .\#{$class}
+    background-color: $color
+
+    @content
+
+    border-color: $color
+
++context(parent)
+  +context(child, $color: yellow)
+    color: $color
+SASS
+$color: blue;
+
+@mixin context($class, $color: red) {
+  .\#{$class} {
+    background-color: $color;
+
+    @content;
+
+    border-color: $color;
+  }
+}
+
+@include context(parent) {
+  @include context(child, $color: yellow) {
+    color: $color;
+  }
+}
+SCSS
+
+  end
+
+  def test_empty_content
+    assert_scss_to_scss(<<SCSS)
+@mixin foo {
+  @content;
+}
+
+@include foo {}
+SCSS
+  end
+
+  def test_placeholder_conversion
+    assert_converts(<<SASS, <<SCSS)
+#content a%foo.bar
+  color: blue
+SASS
+#content a%foo.bar {
+  color: blue;
+}
+SCSS
+  end
+
+  def test_reference_selector
+    assert_converts(<<SASS, <<SCSS)
+foo /bar|baz/ bang
+  a: b
+SASS
+foo /bar|baz/ bang {
+  a: b;
+}
+SCSS
+  end
+
+  def test_subject
+    assert_converts(<<SASS, <<SCSS)
+foo bar! baz
+  a: b
+SASS
+foo bar! baz {
+  a: b;
+}
+SCSS
+  end
+
+  def test_placeholder_interoplation_conversion
+    assert_converts(<<SASS, <<SCSS)
+$foo: foo
+
+%\#{$foo}
+  color: blue
+
+.bar
+  @extend %foo
+SASS
+$foo: foo;
+
+%\#{$foo} {
+  color: blue;
+}
+
+.bar {
+  @extend %foo;
+}
+SCSS
+  end
+
+  def test_indent
+    assert_converts <<SASS, <<SCSS, options: {indent: "    "}
+foo bar
+    baz bang
+        baz: bang
+        bip: bop
+
+    blat: boo
+SASS
+foo bar {
+    baz bang {
+        baz: bang;
+        bip: bop;
+    }
+
+    blat: boo;
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS, options: {indent: "\t"}
+foo bar
+	baz bang
+		baz: bang
+		bip: bop
+
+	blat: boo
+SASS
+foo bar {
+	baz bang {
+		baz: bang;
+		bip: bop;
+	}
+
+	blat: boo;
+}
+SCSS
+
+    assert_sass_to_scss <<SCSS, <<SASS, options: {indent: "    "}
+foo bar {
+    baz bang {
+        baz: bang;
+        bip: bop;
+    }
+
+    blat: boo;
+}
+SCSS
+foo bar
+  baz bang
+    baz: bang
+    bip: bop
+
+  blat: boo
+SASS
+
+    assert_sass_to_scss <<SCSS, <<SASS, options: {indent: "\t"}
+foo bar {
+	baz bang {
+		baz: bang;
+		bip: bop;
+	}
+
+	blat: boo;
+}
+SCSS
+foo bar
+  baz bang
+    baz: bang
+    bip: bop
+
+  blat: boo
+SASS
+
+    assert_scss_to_sass <<SASS, <<SCSS, options: {indent: "    "}
+foo bar
+    baz bang
+        baz: bang
+        bip: bop
+
+    blat: boo
+SASS
+foo bar {
+  baz bang {
+    baz: bang;
+    bip: bop;
+  }
+
+  blat: boo;
+}
+SCSS
+
+    assert_scss_to_sass <<SASS, <<SCSS, options: {indent: "\t"}
+foo bar
+	baz bang
+		baz: bang
+		bip: bop
+
+	blat: boo
+SASS
+foo bar {
+  baz bang {
+    baz: bang;
+    bip: bop;
+  }
+
+  blat: boo;
+}
+SCSS
+  end
+
+  def test_extend_with_optional
+    assert_converts <<SASS, <<SCSS
+foo
+  @extend .bar !optional
+SASS
+foo {
+  @extend .bar !optional;
+}
+SCSS
+  end
+
+  def test_mixin_var_args
+    assert_converts <<SASS, <<SCSS
+=foo($args...)
+  a: b
+
+=bar($a, $args...)
+  a: b
+
+.foo
+  +foo($list...)
+
+  +bar(1, $list...)
+SASS
+@mixin foo($args...) {
+  a: b;
+}
+
+@mixin bar($a, $args...) {
+  a: b;
+}
+
+.foo {
+  @include foo($list...);
+
+  @include bar(1, $list...);
+}
+SCSS
+  end
+
+  def test_mixin_var_kwargs
+    assert_converts <<SASS, <<SCSS
+=foo($a: b, $c: d)
+  a: $a
+  c: $c
+
+.foo
+  +foo($list..., $map...)
+
+  +foo(pos, $list..., $kwd: val, $map...)
+SASS
+@mixin foo($a: b, $c: d) {
+  a: $a;
+  c: $c;
+}
+
+.foo {
+  @include foo($list..., $map...);
+
+  @include foo(pos, $list..., $kwd: val, $map...);
+}
+SCSS
+  end
+
+  def test_function_var_args
+    assert_converts <<SASS, <<SCSS
+@function foo($args...)
+  @return foo
+
+@function bar($a, $args...)
+  @return bar
+
+.foo
+  a: foo($list...)
+  b: bar(1, $list...)
+SASS
+@function foo($args...) {
+  @return foo;
+}
+
+@function bar($a, $args...) {
+  @return bar;
+}
+
+.foo {
+  a: foo($list...);
+  b: bar(1, $list...);
+}
+SCSS
+  end
+
+  def test_function_var_kwargs
+    assert_converts <<SASS, <<SCSS
+@function foo($a: b, $c: d)
+  @return foo
+
+.foo
+  a: foo($list..., $map...)
+  b: foo(pos, $list..., $kwd: val, $map...)
+SASS
+@function foo($a: b, $c: d) {
+  @return foo;
+}
+
+.foo {
+  a: foo($list..., $map...);
+  b: foo(pos, $list..., $kwd: val, $map...);
+}
+SCSS
+  end
+
+  def test_at_root
+    assert_converts <<SASS, <<SCSS
+.foo
+  @at-root
+    .bar
+      a: b
+
+    .baz
+      c: d
+SASS
+.foo {
+  @at-root {
+    .bar {
+      a: b;
+    }
+
+    .baz {
+      c: d;
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with_selector
+    assert_converts <<SASS, <<SCSS
+.foo
+  @at-root .bar
+    a: b
+SASS
+.foo {
+  @at-root .bar {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  def test_at_root_without
+    assert_converts <<SASS, <<SCSS
+.foo
+  @at-root (without: media rule)
+    a: b
+SASS
+.foo {
+  @at-root (without: media rule) {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with
+    assert_converts <<SASS, <<SCSS
+.foo
+  @at-root (with: media rule)
+    a: b
+SASS
+.foo {
+  @at-root (with: media rule) {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  def test_function_var_kwargs_with_list
+    assert_converts <<SASS, <<SCSS
+@function foo($a: b, $c: d)
+  @return $a, $c
+
+.foo
+  a: foo($list..., $map...)
+SASS
+@function foo($a: b, $c: d) {
+  @return $a, $c;
+}
+
+.foo {
+  a: foo($list..., $map...);
+}
+SCSS
+  end
+
+  def test_keyframes
+    assert_converts(<<SASS, <<SCSS)
+@keyframes identifier
+  0%
+    top: 0
+    left: 0
+
+  30%
+    top: 50px
+
+  68%, 72%
+    left: 50px
+
+  100%
+    top: 100px
+    left: 100%
+SASS
+@keyframes identifier {
+  0% {
+    top: 0;
+    left: 0;
+  }
+
+  30% {
+    top: 50px;
+  }
+
+  68%, 72% {
+    left: 50px;
+  }
+
+  100% {
+    top: 100px;
+    left: 100%;
+  }
+}
+SCSS
+  end
+
+  ## Regression Tests
+
+  def test_list_in_args
+    assert_converts(<<SASS, <<SCSS)
++mixin((a, b, c))
+
++mixin($arg: (a, b, c))
+
++mixin(a, b, (c, d, e)...)
+SASS
+@include mixin((a, b, c));
+
+@include mixin($arg: (a, b, c));
+
+@include mixin(a, b, (c, d, e)...);
+SCSS
+  end
+
+  def test_media_query_with_expr
+    assert_converts <<SASS, <<SCSS
+@media foo and (bar: baz)
+  a: b
+SASS
+@media foo and (bar: baz) {
+  a: b;
+}
+SCSS
+  end
+
+  def test_nested_if_statements
+    assert_converts(<<SASS, <<SCSS)
+@if $foo
+  one
+    a: b
+@else
+  @if $bar
+    two
+      a: b
+  @else
+    three
+      a: b
+SASS
+@if $foo {
+  one {
+    a: b;
+  }
+}
+@else {
+  @if $bar {
+    two {
+      a: b;
+    }
+  }
+  @else {
+    three {
+      a: b;
+    }
+  }
+}
+SCSS
+  end
+
+  def test_comment_indentation
+    assert_converts(<<SASS, <<SCSS, options: {indent: '    '})
+foo
+    // bar
+    /* baz
+    a: b
+SASS
+foo {
+    // bar
+    /* baz */
+    a: b;
+}
+SCSS
+  end
+
+  def test_keyword_arguments
+    assert_converts(<<SASS, <<SCSS, options: {dasherize: true})
+$foo: foo($dash-ed: 2px)
+SASS
+$foo: foo($dash-ed: 2px);
+SCSS
+    assert_scss_to_sass(<<SASS, <<SCSS, options: {dasherize: true})
+$foo: foo($dash-ed: 2px)
+SASS
+$foo: foo($dash_ed: 2px);
+SCSS
+    assert_sass_to_scss(<<SCSS, <<SASS, options: {dasherize: true})
+$foo: foo($dash-ed: 2px);
+SCSS
+$foo: foo($dash_ed: 2px)
+SASS
+    assert_converts(<<SASS, <<SCSS)
+$foo: foo($under_scored: 1px)
+SASS
+$foo: foo($under_scored: 1px);
+SCSS
+    assert_converts(<<SASS, <<SCSS)
+$foo: foo($dash-ed: 2px, $under_scored: 1px)
+SASS
+$foo: foo($dash-ed: 2px, $under_scored: 1px);
+SCSS
+  end
+
+  def test_ambiguous_negation
+    assert_converts(<<SASS, <<SCSS, options: {indent: '    '})
+foo
+    ok: -$foo
+    comma: 10px, -$foo
+    needs-parens: 10px (-$foo)
+SASS
+foo {
+    ok: -$foo;
+    comma: 10px, -$foo;
+    needs-parens: 10px (-$foo);
+}
+SCSS
+  end
+
+  def test_variable_with_global
+    assert_converts(<<SASS, <<SCSS)
+$var: 1
+
+foo
+  $var: 2 !global
+  $var: 3 !global !default
+SASS
+$var: 1;
+
+foo {
+  $var: 2 !global;
+  $var: 3 !global !default;
+}
+SCSS
+  end
+
+  def test_import_with_supports_clause
+    assert_converts(<<'SASS', <<'SCSS')
+@import url("fallback-layout.css") supports(not (display: #{$display-type}))
+SASS
+@import url("fallback-layout.css") supports(not (display: #{$display-type}));
+SCSS
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/css2sass_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/css2sass_test.rb
new file mode 100755
index 0000000..3561ac7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/css2sass_test.rb
@@ -0,0 +1,523 @@
+require 'minitest/autorun'
+require File.dirname(__FILE__) + '/../test_helper'
+require 'sass/css'
+
+class CSS2SassTest < MiniTest::Test
+  def test_basic
+    css = <<CSS
+h1 {
+  color: red;
+}
+CSS
+    assert_equal(<<SASS, css2sass(css))
+h1
+  color: red
+SASS
+    silence_warnings {assert_equal(<<SASS, css2sass(css, :old => true))}
+h1
+  :color red
+SASS
+  end
+
+  def test_nesting
+    assert_equal(<<SASS, css2sass(<<CSS))
+li
+  display: none
+
+  a
+    text-decoration: none
+
+    span
+      color: yellow
+
+    &:hover
+      text-decoration: underline
+SASS
+li {
+  display: none;
+}
+
+li a {
+  text-decoration: none;
+}
+
+li a span {
+  color: yellow;
+}
+
+li a:hover {
+  text-decoration: underline;
+}
+CSS
+  end
+
+  def test_no_nesting_around_rules
+    assert_equal(<<SASS, css2sass(<<CSS))
+div .warning
+  color: #d21a19
+
+span .debug
+  cursor: crosshair
+
+div .debug
+  cursor: default
+SASS
+div .warning {
+  color: #d21a19; }
+span .debug {
+  cursor: crosshair;}
+div .debug {
+  cursor: default; }
+CSS
+  end
+
+  def test_comments_multiline
+    css = <<CSS
+/* comment */
+elephant.rawr {
+  rampages: excessively;
+}
+
+/* actual multiline
+  comment */
+span.turkey {
+  isdinner: true;
+}
+
+.turducken {
+  /* Sounds funny
+     doesn't it */
+  chimera: not_really;
+}
+
+#overhere {
+  bored: sorta; /* it's for a good
+  cause */
+  better_than: thread_pools;
+}
+
+#one_more {
+  finally: srsly;
+} /* just a line here */
+CSS
+    sass = <<SASS
+/* comment
+
+elephant.rawr
+  rampages: excessively
+
+/* actual multiline
+ *comment
+
+span.turkey
+  isdinner: true
+
+.turducken
+  /* Sounds funny
+   * doesn't it
+  chimera: not_really
+
+#overhere
+  bored: sorta
+
+  /*                  it's for a good
+   * cause
+  better_than: thread_pools
+
+#one_more
+  finally: srsly
+
+/* just a line here
+SASS
+    assert_equal(sass, css2sass(css))
+  end
+
+  def test_fold_commas
+    assert_equal(<<SASS, css2sass(<<CSS))
+li
+  .one, .two
+    color: red
+SASS
+li .one {
+  color: red;
+}
+li .two {
+  color: red;
+}
+CSS
+
+    assert_equal(<<SASS, css2sass(<<CSS))
+.one
+  color: green
+
+.two
+  color: green
+  color: red
+
+.three
+  color: red
+SASS
+.one, .two {
+  color: green;
+}
+
+.two, .three {
+  color: red;
+}
+CSS
+  end
+
+  def test_bad_formatting
+    assert_equal(<<SASS, css2sass(<<CSS))
+hello
+  parent: true
+
+  there
+    parent: false
+
+  who
+    hoo: false
+
+  why
+    y: true
+
+  when
+    wen: nao
+
+down_here
+  yeah: true
+SASS
+hello {
+  parent: true;
+}
+
+hello  there {
+  parent: false;
+}
+hello who  {
+  hoo: false;
+}
+hello why {
+   y: true;
+}
+hello when {
+  wen:  nao;
+}
+
+
+
+down_here { yeah: true; }
+CSS
+  end
+
+  def test_comments_in_selectors
+    assert_equal(<<SASS, css2sass(<<CSS))
+.js
+  #location-navigation-form .form-submit, #business-listing-form .form-submit, #detailTabs ul, #detailsEnhanced #addTags, #locationSearchList, #moreHoods
+    display: none
+
+#navListLeft
+  display: none
+SASS
+.js #location-navigation-form .form-submit,
+.js #business-listing-form .form-submit,
+.js #detailTabs ul,
+/* .js #addReview, */
+/* .js #addTags, */
+.js #detailsEnhanced #addTags,
+.js #locationSearchList,
+.js #moreHoods,
+#navListLeft
+  { display: none; }
+CSS
+  end
+
+  def test_pseudo_classes_are_escaped
+    assert_equal(<<SASS, css2sass(<<CSS))
+\\:focus
+  a: b
+
+  \\:foo
+    bar: baz
+SASS
+:focus {a: b;}
+:focus :foo {bar: baz;}
+CSS
+  end
+
+  def test_subject
+    silence_warnings {assert_equal(<<SASS, css2sass(<<CSS))}
+.foo
+  .bar!
+    .baz
+      a: b
+
+    .bip
+      c: d
+
+  .bar .bonk
+    e: f
+
+.flip!
+  &.bar
+    a: b
+
+  &.baz
+    c: d
+SASS
+.foo .bar! .baz {a: b;}
+.foo .bar! .bip {c: d;}
+.foo .bar .bonk {e: f;}
+
+.flip.bar! {a: b;}
+.flip.baz! {c: d;}
+CSS
+  end
+
+  def test_keyframes
+    assert_equal(<<SASS, css2sass(<<CSS))
+@keyframes dash
+  from
+    stroke-dasharray: 1,200
+    stroke-dashoffset: 0
+
+  50%
+    stroke-dasharray: 89,200
+    stroke-dashoffset: -35
+
+  to
+    stroke-dasharray: 89,200
+    stroke-dashoffset: -124
+SASS
+@keyframes dash {
+  from {
+    stroke-dasharray: 1,200;
+    stroke-dashoffset: 0;
+  }
+  50% {
+    stroke-dasharray: 89,200;
+    stroke-dashoffset: -35;
+  }
+  to {
+    stroke-dasharray: 89,200;
+    stroke-dashoffset: -124;
+  }
+}
+CSS
+  end
+
+  # Regressions
+
+  def test_nesting_with_matching_property
+    assert_equal(<<SASS, css2sass(<<CSS))
+ul
+  width: 10px
+
+  div
+    width: 20px
+
+article
+  width: 10px
+
+  p
+    width: 20px
+SASS
+ul {width: 10px}
+ul div {width: 20px}
+article {width: 10px}
+article p {width: 20px}
+CSS
+  end
+
+  def test_empty_rule
+    assert_equal(<<SASS, css2sass(<<CSS))
+a
+SASS
+a {}
+CSS
+  end
+
+  def test_empty_rule_with_selector_combinator
+    assert_equal(<<SASS, css2sass(<<CSS))
+a
+  color: red
+
+  > b
+SASS
+a {color: red}
+a > b {}
+CSS
+  end
+
+  def test_nesting_within_media
+    assert_equal(<<SASS, css2sass(<<CSS))
+@media all
+  .next .vevent
+    padding-left: 0
+    padding-right: 0
+SASS
+@media all {
+  .next .vevent {
+    padding-left: 0;
+    padding-right: 0; } }
+CSS
+  end
+
+  def test_multiline_selector_within_media_and_with_child_selector
+    assert_equal(<<SASS, css2sass(<<CSS))
+@media all
+  foo bar, baz
+    padding-left: 0
+    padding-right: 0
+SASS
+@media all {
+  foo bar,
+  baz {
+    padding-left: 0;
+    padding-right: 0; } }
+CSS
+  end
+
+  def test_double_comma
+    assert_equal(<<SASS, css2sass(<<CSS))
+foo, bar
+  a: b
+SASS
+foo, , bar { a: b }
+CSS
+  end
+
+  def test_selector_splitting
+    assert_equal(<<SASS, css2sass(<<CSS))
+.foo >
+  .bar
+    a: b
+
+  .baz
+    c: d
+SASS
+.foo>.bar {a: b}
+.foo>.baz {c: d}
+CSS
+
+    assert_equal(<<SASS, css2sass(<<CSS))
+.foo
+  &::bar
+    a: b
+
+  &::baz
+    c: d
+SASS
+.foo::bar {a: b}
+.foo::baz {c: d}
+CSS
+  end
+
+  def test_triple_nesting
+    assert_equal(<<SASS, css2sass(<<CSS))
+.foo .bar .baz
+  a: b
+SASS
+.foo .bar .baz {a: b}
+CSS
+
+    assert_equal(<<SASS, css2sass(<<CSS))
+.bar > .baz
+  c: d
+SASS
+.bar > .baz {c: d}
+CSS
+  end
+
+  # Error reporting
+
+  def test_error_reporting
+    css2sass("foo")
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => err
+    assert_equal(1, err.sass_line)
+    assert_equal('Invalid CSS after "foo": expected "{", was ""', err.message)
+  end
+
+  def test_error_reporting_in_line
+    css2sass("foo\nbar }\nbaz")
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => err
+    assert_equal(2, err.sass_line)
+    assert_equal('Invalid CSS after "bar ": expected "{", was "}"', err.message)
+  end
+
+  def test_error_truncate_after
+    css2sass("#{"a" * 16}foo")
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => err
+    assert_equal(1, err.sass_line)
+    assert_equal('Invalid CSS after "...aaaaaaaaaaaafoo": expected "{", was ""', err.message)
+  end
+
+  def test_error_truncate_was
+    css2sass("foo }foo#{"a" * 15}")
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => err
+    assert_equal(1, err.sass_line)
+    assert_equal('Invalid CSS after "foo ": expected "{", was "}fooaaaaaaaaaaa..."', err.message)
+  end
+
+  def test_error_doesnt_truncate_after_when_elipsis_would_add_length
+    css2sass("#{"a" * 15}foo")
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => err
+    assert_equal(1, err.sass_line)
+    assert_equal('Invalid CSS after "aaaaaaaaaaaaaaafoo": expected "{", was ""', err.message)
+  end
+
+  def test_error_doesnt_truncate_was_when_elipsis_would_add_length
+    css2sass("foo }foo#{"a" * 14}")
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => err
+    assert_equal(1, err.sass_line)
+    assert_equal('Invalid CSS after "foo ": expected "{", was "}fooaaaaaaaaaaaaaa"', err.message)
+  end
+
+  def test_error_gets_rid_of_trailing_newline_for_after
+    css2sass("foo  \n  ")
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => err
+    assert_equal(2, err.sass_line)
+    assert_equal('Invalid CSS after "foo": expected "{", was ""', err.message)
+  end
+
+  def test_error_gets_rid_of_trailing_newline_for_was
+    css2sass("foo \n  }foo")
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => err
+    assert_equal(2, err.sass_line)
+    assert_equal('Invalid CSS after "foo": expected "{", was "}foo"', err.message)
+  end
+
+  # Encodings
+
+  def test_encoding_error
+    css2sass("foo\nbar\nb\xFEaz".force_encoding("utf-8"))
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal(3, e.sass_line)
+    assert_equal('Invalid UTF-8 character "\xFE"', e.message)
+  end
+
+  def test_ascii_incompatible_encoding_error
+    template = "foo\nbar\nb_z".encode("utf-16le")
+    template[9] = "\xFE".force_encoding("utf-16le")
+    css2sass(template)
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal(3, e.sass_line)
+    assert_equal('Invalid UTF-16LE character "\xFE"', e.message)
+  end
+
+  private
+
+  def css2sass(string, opts={})
+    Sass::CSS.new(string, opts).render
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/css_variable_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/css_variable_test.rb
new file mode 100755
index 0000000..af92c52
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/css_variable_test.rb
@@ -0,0 +1,237 @@
+
+require File.dirname(__FILE__) + '/../test_helper'
+require 'sass/engine'
+
+# Most CSS variable tests are in sass-spec, but a few relate to formatting or
+# conversion and so belong here.
+class CssVariableTest < MiniTest::Test
+  def test_folded_inline_whitespace
+    assert_variable_value "foo bar baz", "foo    bar        baz"
+    assert_variable_value "foo bar", "foo \t   bar"
+  end
+
+  def test_folded_multiline_whitespace
+    # We don't want to reformat newlines in nested and expanded mode, so we just
+    # remove trailing whitespace before them.
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  --multiline: foo
+    bar; }
+CSS
+.foo {
+  --multiline: foo\s
+    bar;
+}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  --multiline: foo
+
+
+    bar; }
+CSS
+.foo {
+  --multiline: foo\s
+
+
+    bar;
+}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS, style: :expanded)
+.foo {
+  --multiline: foo
+    bar;
+}
+CSS
+.foo {
+  --multiline: foo\s
+    bar;
+}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS, style: :expanded)
+.foo {
+  --multiline: foo
+
+
+    bar;
+}
+CSS
+.foo {
+  --multiline: foo\s
+
+
+    bar;
+}
+SCSS
+
+    # In compact and compressed mode, we fold all whitespace around newlines
+    # together.
+    assert_equal <<CSS, render(<<SCSS, style: :compact)
+.foo { --multiline: foo bar; }
+CSS
+.foo {
+  --multiline: foo\s
+    bar;
+}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS, style: :compact)
+.foo { --multiline: foo bar; }
+CSS
+.foo {
+  --multiline: foo\s
+
+
+    bar;
+}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS, style: :compressed)
+.foo{--multiline: foo bar}
+CSS
+.foo {
+  --multiline: foo\s
+    bar;
+}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS, style: :compressed)
+.foo{--multiline: foo bar}
+CSS
+.foo {
+  --multiline: foo\s
+
+
+    bar;
+}
+SCSS
+  end
+
+  # Conversion.
+
+  def test_static_values_convert
+    assert_converts <<SASS, <<SCSS
+.foo
+  --bar: baz
+SASS
+.foo {
+  --bar: baz;
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+.foo
+  --bar: [({{([!;])}})]
+SASS
+.foo {
+  --bar: [({{([!;])}})];
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+.foo
+  --bar: {a: b; c: d}
+SASS
+.foo {
+  --bar: {a: b; c: d};
+}
+SCSS
+  end
+
+  def test_dynamic_values_convert
+    assert_converts <<SASS, <<SCSS
+.foo
+  --bar: baz \#{bang} qux
+SASS
+.foo {
+  --bar: baz \#{bang} qux;
+}
+SCSS
+
+    assert_converts <<SASS, <<SCSS
+.foo
+  --bar: "baz \#{bang} qux"
+SASS
+.foo {
+  --bar: "baz \#{bang} qux";
+}
+SCSS
+  end
+
+  def test_multiline_value_converts
+    assert_scss_to_scss <<SCSS
+.foo {
+  --bar: {
+    a: b;
+    c: d;
+  };
+}
+SCSS
+
+    assert_scss_to_sass <<SASS, <<SCSS
+.foo
+  --bar: {     a: b;     c: d;   }
+SASS
+.foo {
+  --bar: {
+    a: b;
+    c: d;
+  };
+}
+SCSS
+  end
+
+  private
+
+  def assert_variable_value(expected, source)
+    expected = <<CSS
+x {
+  --variable: #{expected}; }
+CSS
+
+    assert_equal expected, render_variable(source)
+    assert_equal expected, render_variable(source, syntax: :sass)
+  end
+
+  def render_variable(source, syntax: :scss)
+    render(syntax == :scss ? <<SCSS : <<SASS, :syntax => syntax)
+x {
+  --variable: #{source};
+}
+SCSS
+x
+  --variable: #{source}
+SASS
+  end
+
+  def render(sass, options = {})
+    options[:syntax] ||= :scss
+    options[:cache] = false
+    munge_filename options
+    Sass::Engine.new(sass, options).render
+  end
+
+  def resolve(str, opts = {}, environment = env)
+    munge_filename opts
+    val = eval(str, opts, environment)
+    assert_kind_of Sass::Script::Value::Base, val
+    val.options = opts
+    val.is_a?(Sass::Script::Value::String) ? val.value : val.to_s
+  end
+
+  def eval(str, opts = {}, environment = env)
+    munge_filename opts
+    Sass::Script.parse(str, opts.delete(:line) || 1,
+      opts.delete(:offset) || 0, opts).
+      perform(Sass::Environment.new(environment, opts))
+  end
+
+  def env(hash = {})
+    env = Sass::Environment.new
+    hash.each {|k, v| env.set_var(k, v)}
+    env
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/data/hsl-rgb.txt b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/data/hsl-rgb.txt
new file mode 100644
index 0000000..2e9e470
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/data/hsl-rgb.txt
@@ -0,0 +1,319 @@
+hsl(0, 100%, 50%)
+hsl(60, 100%, 50%)
+hsl(120, 100%, 50%)
+hsl(180, 100%, 50%)
+hsl(240, 100%, 50%)
+hsl(300, 100%, 50%)
+====
+rgb(255, 0, 0)
+rgb(255, 255, 0)
+rgb(0, 255, 0)
+rgb(0, 255, 255)
+rgb(0, 0, 255)
+rgb(255, 0, 255)
+
+hsl(-360, 100%, 50%)
+hsl(-300, 100%, 50%)
+hsl(-240, 100%, 50%)
+hsl(-180, 100%, 50%)
+hsl(-120, 100%, 50%)
+hsl(-60, 100%, 50%)
+====
+rgb(255, 0, 0)
+rgb(255, 255, 0)
+rgb(0, 255, 0)
+rgb(0, 255, 255)
+rgb(0, 0, 255)
+rgb(255, 0, 255)
+
+hsl(360, 100%, 50%)
+hsl(420, 100%, 50%)
+hsl(480, 100%, 50%)
+hsl(540, 100%, 50%)
+hsl(600, 100%, 50%)
+hsl(660, 100%, 50%)
+====
+rgb(255, 0, 0)
+rgb(255, 255, 0)
+rgb(0, 255, 0)
+rgb(0, 255, 255)
+rgb(0, 0, 255)
+rgb(255, 0, 255)
+
+hsl(6120, 100%, 50%)
+hsl(-9660, 100%, 50%)
+hsl(99840, 100%, 50%)
+hsl(-900, 100%, 50%)
+hsl(-104880, 100%, 50%)
+hsl(2820, 100%, 50%)
+====
+rgb(255, 0, 0)
+rgb(255, 255, 0)
+rgb(0, 255, 0)
+rgb(0, 255, 255)
+rgb(0, 0, 255)
+rgb(255, 0, 255)
+
+hsl(0, 100%, 50%)
+hsl(12, 100%, 50%)
+hsl(24, 100%, 50%)
+hsl(36, 100%, 50%)
+hsl(48, 100%, 50%)
+hsl(60, 100%, 50%)
+hsl(72, 100%, 50%)
+hsl(84, 100%, 50%)
+hsl(96, 100%, 50%)
+hsl(108, 100%, 50%)
+hsl(120, 100%, 50%)
+====
+rgb(255, 0, 0)
+rgb(255, 51, 0)
+rgb(255, 102, 0)
+rgb(255, 153, 0)
+rgb(255, 204, 0)
+rgb(255, 255, 0)
+rgb(204, 255, 0)
+rgb(153, 255, 0)
+rgb(102, 255, 0)
+rgb(51, 255, 0)
+rgb(0, 255, 0)
+
+hsl(120, 100%, 50%)
+hsl(132, 100%, 50%)
+hsl(144, 100%, 50%)
+hsl(156, 100%, 50%)
+hsl(168, 100%, 50%)
+hsl(180, 100%, 50%)
+hsl(192, 100%, 50%)
+hsl(204, 100%, 50%)
+hsl(216, 100%, 50%)
+hsl(228, 100%, 50%)
+hsl(240, 100%, 50%)
+====
+rgb(0, 255, 0)
+rgb(0, 255, 51)
+rgb(0, 255, 102)
+rgb(0, 255, 153)
+rgb(0, 255, 204)
+rgb(0, 255, 255)
+rgb(0, 204, 255)
+rgb(0, 153, 255)
+rgb(0, 102, 255)
+rgb(0, 51, 255)
+rgb(0, 0, 255)
+
+hsl(240, 100%, 50%)
+hsl(252, 100%, 50%)
+hsl(264, 100%, 50%)
+hsl(276, 100%, 50%)
+hsl(288, 100%, 50%)
+hsl(300, 100%, 50%)
+hsl(312, 100%, 50%)
+hsl(324, 100%, 50%)
+hsl(336, 100%, 50%)
+hsl(348, 100%, 50%)
+hsl(360, 100%, 50%)
+====
+rgb(0, 0, 255)
+rgb(51, 0, 255)
+rgb(102, 0, 255)
+rgb(153, 0, 255)
+rgb(204, 0, 255)
+rgb(255, 0, 255)
+rgb(255, 0, 204)
+rgb(255, 0, 153)
+rgb(255, 0, 102)
+rgb(255, 0, 51)
+rgb(255, 0, 0)
+
+hsl(0, 20%, 50%)
+hsl(0, 60%, 50%)
+hsl(0, 100%, 50%)
+====
+rgb(153, 102, 102)
+rgb(204, 51, 51)
+rgb(255, 0, 0)
+
+hsl(60, 20%, 50%)
+hsl(60, 60%, 50%)
+hsl(60, 100%, 50%)
+====
+rgb(153, 153, 102)
+rgb(204, 204, 51)
+rgb(255, 255, 0)
+
+hsl(120, 20%, 50%)
+hsl(120, 60%, 50%)
+hsl(120, 100%, 50%)
+====
+rgb(102, 153, 102)
+rgb(51, 204, 51)
+rgb(0, 255, 0)
+
+hsl(180, 20%, 50%)
+hsl(180, 60%, 50%)
+hsl(180, 100%, 50%)
+====
+rgb(102, 153, 153)
+rgb(51, 204, 204)
+rgb(0, 255, 255)
+
+hsl(240, 20%, 50%)
+hsl(240, 60%, 50%)
+hsl(240, 100%, 50%)
+====
+rgb(102, 102, 153)
+rgb(51, 51, 204)
+rgb(0, 0, 255)
+
+hsl(300, 20%, 50%)
+hsl(300, 60%, 50%)
+hsl(300, 100%, 50%)
+====
+rgb(153, 102, 153)
+rgb(204, 51, 204)
+rgb(255, 0, 255)
+
+hsl(0, 100%, 0%)
+hsl(0, 100%, 10%)
+hsl(0, 100%, 20%)
+hsl(0, 100%, 30%)
+hsl(0, 100%, 40%)
+hsl(0, 100%, 50%)
+hsl(0, 100%, 60%)
+hsl(0, 100%, 70%)
+hsl(0, 100%, 80%)
+hsl(0, 100%, 90%)
+hsl(0, 100%, 100%)
+====
+rgb(0, 0, 0)
+rgb(51, 0, 0)
+rgb(102, 0, 0)
+rgb(153, 0, 0)
+rgb(204, 0, 0)
+rgb(255, 0, 0)
+rgb(255, 51, 51)
+rgb(255, 102, 102)
+rgb(255, 153, 153)
+rgb(255, 204, 204)
+rgb(255, 255, 255)
+
+hsl(60, 100%, 0%)
+hsl(60, 100%, 10%)
+hsl(60, 100%, 20%)
+hsl(60, 100%, 30%)
+hsl(60, 100%, 40%)
+hsl(60, 100%, 50%)
+hsl(60, 100%, 60%)
+hsl(60, 100%, 70%)
+hsl(60, 100%, 80%)
+hsl(60, 100%, 90%)
+hsl(60, 100%, 100%)
+====
+rgb(0, 0, 0)
+rgb(51, 51, 0)
+rgb(102, 102, 0)
+rgb(153, 153, 0)
+rgb(204, 204, 0)
+rgb(255, 255, 0)
+rgb(255, 255, 51)
+rgb(255, 255, 102)
+rgb(255, 255, 153)
+rgb(255, 255, 204)
+rgb(255, 255, 255)
+
+hsl(120, 100%, 0%)
+hsl(120, 100%, 10%)
+hsl(120, 100%, 20%)
+hsl(120, 100%, 30%)
+hsl(120, 100%, 40%)
+hsl(120, 100%, 50%)
+hsl(120, 100%, 60%)
+hsl(120, 100%, 70%)
+hsl(120, 100%, 80%)
+hsl(120, 100%, 90%)
+hsl(120, 100%, 100%)
+====
+rgb(0, 0, 0)
+rgb(0, 51, 0)
+rgb(0, 102, 0)
+rgb(0, 153, 0)
+rgb(0, 204, 0)
+rgb(0, 255, 0)
+rgb(51, 255, 51)
+rgb(102, 255, 102)
+rgb(153, 255, 153)
+rgb(204, 255, 204)
+rgb(255, 255, 255)
+
+hsl(180, 100%, 0%)
+hsl(180, 100%, 10%)
+hsl(180, 100%, 20%)
+hsl(180, 100%, 30%)
+hsl(180, 100%, 40%)
+hsl(180, 100%, 50%)
+hsl(180, 100%, 60%)
+hsl(180, 100%, 70%)
+hsl(180, 100%, 80%)
+hsl(180, 100%, 90%)
+hsl(180, 100%, 100%)
+====
+rgb(0, 0, 0)
+rgb(0, 51, 51)
+rgb(0, 102, 102)
+rgb(0, 153, 153)
+rgb(0, 204, 204)
+rgb(0, 255, 255)
+rgb(51, 255, 255)
+rgb(102, 255, 255)
+rgb(153, 255, 255)
+rgb(204, 255, 255)
+rgb(255, 255, 255)
+
+hsl(240, 100%, 0%)
+hsl(240, 100%, 10%)
+hsl(240, 100%, 20%)
+hsl(240, 100%, 30%)
+hsl(240, 100%, 40%)
+hsl(240, 100%, 50%)
+hsl(240, 100%, 60%)
+hsl(240, 100%, 70%)
+hsl(240, 100%, 80%)
+hsl(240, 100%, 90%)
+hsl(240, 100%, 100%)
+====
+rgb(0, 0, 0)
+rgb(0, 0, 51)
+rgb(0, 0, 102)
+rgb(0, 0, 153)
+rgb(0, 0, 204)
+rgb(0, 0, 255)
+rgb(51, 51, 255)
+rgb(102, 102, 255)
+rgb(153, 153, 255)
+rgb(204, 204, 255)
+rgb(255, 255, 255)
+
+hsl(300, 100%, 0%)
+hsl(300, 100%, 10%)
+hsl(300, 100%, 20%)
+hsl(300, 100%, 30%)
+hsl(300, 100%, 40%)
+hsl(300, 100%, 50%)
+hsl(300, 100%, 60%)
+hsl(300, 100%, 70%)
+hsl(300, 100%, 80%)
+hsl(300, 100%, 90%)
+hsl(300, 100%, 100%)
+====
+rgb(0, 0, 0)
+rgb(51, 0, 51)
+rgb(102, 0, 102)
+rgb(153, 0, 153)
+rgb(204, 0, 204)
+rgb(255, 0, 255)
+rgb(255, 51, 255)
+rgb(255, 102, 255)
+rgb(255, 153, 255)
+rgb(255, 204, 255)
+rgb(255, 255, 255)
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/encoding_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/encoding_test.rb
new file mode 100755
index 0000000..8221948
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/encoding_test.rb
@@ -0,0 +1,188 @@
+# -*- coding: utf-8 -*-
+require File.dirname(__FILE__) + '/../test_helper'
+require File.dirname(__FILE__) + '/test_helper'
+require 'sass/util/test'
+
+class EncodingTest < MiniTest::Test
+  include Sass::Util::Test
+
+  def test_encoding_error
+    render("foo\nbar\nb\xFEaz".force_encoding("utf-8"))
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal(3, e.sass_line)
+    assert_equal('Invalid UTF-8 character "\xFE"', e.message)
+  end
+
+  def test_ascii_incompatible_encoding_error
+    template = "foo\nbar\nb_z".encode("utf-16le")
+    template[9] = "\xFE".force_encoding("utf-16le")
+    render(template)
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal(3, e.sass_line)
+    assert_equal('Invalid UTF-16LE character "\xFE"', e.message)
+  end
+
+  def test_prefers_charset_to_ruby_encoding
+    assert_renders_encoded(<<CSS, <<SASS.encode("IBM866").force_encoding("UTF-8"))
+@charset "UTF-8";
+fЖЖ {
+  a: b; }
+CSS
+@charset "ibm866"
+fЖЖ
+  a: b
+SASS
+  end
+
+  def test_uses_ruby_encoding_without_charset
+    assert_renders_encoded(<<CSS, <<SASS.encode("IBM866"))
+@charset "UTF-8";
+тАЬ {
+  a: b; }
+CSS
+тАЬ
+  a: b
+SASS
+  end
+
+  def test_multibyte_charset_without_bom_declared_as_binary
+    engine = Sass::Engine.new(<<SASS.encode("UTF-16LE").force_encoding("BINARY"))
+@charset "utf-16le"
+fóó
+  a: b
+SASS
+    # Since multibyte encodings' @charset declarations aren't
+    # ASCII-compatible, we have to interpret the files as UTF-8 which will
+    # inevitably fail.
+    assert_raise_message(Sass::SyntaxError, "Invalid UTF-8 character \"\\xF3\"") {engine.render}
+  end
+
+  def test_multibyte_charset_without_bom_declared_as_utf_8
+    engine = Sass::Engine.new(<<SASS.encode("UTF-16LE").force_encoding("UTF-8"))
+@charset "utf-16le"
+fóó
+  a: b
+SASS
+    # Since multibyte encodings' @charset declarations aren't
+    # ASCII-compatible, we have to interpret the files as UTF-8 which will
+    # inevitably fail.
+    assert_raise_message(Sass::SyntaxError, "Invalid UTF-8 character \"\\xF3\"") {engine.render}
+  end
+
+  def test_utf_16le_with_bom
+    assert_renders_encoded(<<CSS, <<SASS.encode("UTF-16LE").force_encoding("BINARY"))
+@charset "UTF-8";
+fóó {
+  a: b; }
+CSS
+\uFEFFfóó
+  a: b
+SASS
+  end
+
+  def test_utf_16be_with_bom
+    assert_renders_encoded(<<CSS, <<SASS.encode("UTF-16BE").force_encoding("BINARY"))
+@charset "UTF-8";
+fóó {
+  a: b; }
+CSS
+\uFEFFfóó
+  a: b
+SASS
+  end
+
+  def test_utf_8_with_bom
+    assert_renders_encoded(<<CSS, <<SASS.force_encoding("BINARY"))
+@charset "UTF-8";
+fóó {
+  a: b; }
+CSS
+\uFEFFfóó
+  a: b
+SASS
+  end
+
+  def test_charset_with_multibyte_encoding
+    engine = Sass::Engine.new(<<SASS)
+@charset "utf-32be"
+fóó
+  a: b
+SASS
+    # The charset declaration is just false here, so we should get an
+    # encoding error.
+    assert_raise_message(Sass::SyntaxError, "Invalid UTF-32BE character \"\\xC3\"") {engine.render}
+  end
+
+  def test_charset_with_special_case_encoding
+    # For some reason, a file with an ASCII-compatible UTF-16 charset
+    # declaration is specced to be parsed as UTF-8.
+    assert_renders_encoded(<<CSS, <<SASS.force_encoding("BINARY"))
+@charset "UTF-8";
+fóó {
+  a: b; }
+CSS
+@charset "utf-16"
+fóó
+  a: b
+SASS
+  end
+
+  def test_compressed_output_uses_bom
+    assert_equal("\uFEFFfóó{a:b}\n", render(<<SASS, :style => :compressed))
+fóó
+  a: b
+SASS
+  end
+
+  def test_newline_normalization
+    assert_equal("/* foo\nbar\nbaz\nbang\nqux */\n",
+      render("/* foo\nbar\r\nbaz\fbang\rqux */", :syntax => :scss))
+  end
+
+  def test_null_normalization
+    assert_equal(<<CSS, render("/* foo\x00bar\x00baz */", :syntax => :scss))
+@charset "UTF-8";
+/* foo�bar�baz */
+CSS
+  end
+
+  # Regression
+
+  def test_multibyte_prop_name
+    assert_equal(<<CSS, render(<<SASS))
+@charset "UTF-8";
+#bar {
+  cölor: blue; }
+CSS
+#bar
+  cölor: blue
+SASS
+  end
+
+  def test_multibyte_and_interpolation
+    assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
+#bar {
+  background: a 0%; }
+CSS
+#bar {
+  // 
+  background: \#{a} 0%;
+}
+SCSS
+  end
+
+  private
+
+  def assert_renders_encoded(css, sass)
+    result = render(sass)
+    assert_equal css.encoding, result.encoding
+    assert_equal css, result
+  end
+
+  def render(sass, options = {})
+    munge_filename options
+    Sass::Engine.new(sass, options).render
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/engine_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/engine_test.rb
new file mode 100755
index 0000000..3665580
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/engine_test.rb
@@ -0,0 +1,3499 @@
+# -*- coding: utf-8 -*-
+require File.dirname(__FILE__) + '/../test_helper'
+require File.dirname(__FILE__) + '/test_helper'
+require 'sass/engine'
+require 'stringio'
+require 'mock_importer'
+require 'pathname'
+
+module Sass::Script::Functions::UserFunctions
+  def option(name)
+    Sass::Script::Value::String.new(@options[name.value.to_sym].to_s)
+  end
+
+  def set_a_variable(name, value)
+    environment.set_var(name.value, value)
+    return Sass::Script::Value::Null.new
+  end
+
+  def set_a_global_variable(name, value)
+    environment.set_global_var(name.value, value)
+    return Sass::Script::Value::Null.new
+  end
+
+  def get_a_variable(name)
+    environment.var(name.value) || Sass::Script::Value::String.new("undefined")
+  end
+end
+
+module Sass::Script::Functions
+  include Sass::Script::Functions::UserFunctions
+end
+
+class SassEngineTest < MiniTest::Test
+  FAKE_FILE_NAME = __FILE__.gsub(/rb$/,"sass")
+  # A map of erroneous Sass documents to the error messages they should produce.
+  # The error messages may be arrays;
+  # if so, the second element should be the line number that should be reported for the error.
+  # If this isn't provided, the tests will assume the line number should be the last line of the document.
+  EXCEPTION_MAP = {
+    "$a: 1 + " => 'Invalid CSS after "1 +": expected expression (e.g. 1px, bold), was ""',
+    "$a: 1 + 2 +" => 'Invalid CSS after "1 + 2 +": expected expression (e.g. 1px, bold), was ""',
+    "$a: 1 + 2 + %" => 'Invalid CSS after "1 + 2 + ": expected expression (e.g. 1px, bold), was "%"',
+    "$a: foo(\"bar\"" => 'Invalid CSS after "foo("bar"": expected ")", was ""',
+    "$a: 1 }" => 'Invalid CSS after "1 ": expected expression (e.g. 1px, bold), was "}"',
+    "$a: 1 }foo\"" => 'Invalid CSS after "1 ": expected expression (e.g. 1px, bold), was "}foo""',
+    ":" => 'Invalid property: ":".',
+    ": a" => 'Invalid property: ": a".',
+    "a\n  :b" => <<MSG,
+Invalid property: ":b" (no value).
+If ":b" should be a selector, use "\\:b" instead.
+MSG
+    "a\n  b:" => 'Invalid property: "b:" (no value).',
+    "a\n  :b: c" => 'Invalid property: ":b: c".',
+    "a\n  :b:c d" => 'Invalid property: ":b:c d".',
+    "a\n  :b c;" => 'Invalid CSS after "c": expected expression (e.g. 1px, bold), was ";"',
+    "a\n  b: c;" => 'Invalid CSS after "c": expected expression (e.g. 1px, bold), was ";"',
+    ".foo ^bar\n  a: b" => ['Invalid CSS after ".foo ": expected selector, was "^bar"', 1],
+    "a\n  @extend .foo ^bar" => 'Invalid CSS after ".foo ": expected selector, was "^bar"',
+    "a\n  @extend .foo .bar" => "Can't extend .foo .bar: can't extend nested selectors",
+    "a\n  @extend >" => "Can't extend >: invalid selector",
+    "a\n  @extend &.foo" => "Can't extend &.foo: can't extend parent selectors",
+    "a: b" => 'Properties are only allowed within rules, directives, mixin includes, or other properties.',
+    ":a b" => 'Properties are only allowed within rules, directives, mixin includes, or other properties.',
+    "$" => 'Invalid variable: "$".',
+    "$a" => 'Invalid variable: "$a".',
+    "$ a" => 'Invalid variable: "$ a".',
+    "$a b" => 'Invalid variable: "$a b".',
+    "$a: 1b + 2c" => "Incompatible units: 'c' and 'b'.",
+    "$a: 1b < 2c" => "Incompatible units: 'c' and 'b'.",
+    "$a: 1b > 2c" => "Incompatible units: 'c' and 'b'.",
+    "$a: 1b <= 2c" => "Incompatible units: 'c' and 'b'.",
+    "$a: 1b >= 2c" => "Incompatible units: 'c' and 'b'.",
+    "a\n  b: 1b * 2c" => "2b*c isn't a valid CSS value.",
+    "a\n  b: 1b % 2c" => "Incompatible units: 'c' and 'b'.",
+    "$a: 2px + #ccc" => "Cannot add a number with units (2px) to a color (#ccc).",
+    "$a: #ccc + 2px" => "Cannot add a number with units (2px) to a color (#ccc).",
+    "& a\n  :b c" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
+    "a\n  :b\n    c" => "Illegal nesting: Only properties may be nested beneath properties.",
+    "$a: b\n  :c d\n" => "Illegal nesting: Nothing may be nested beneath variable declarations.",
+    "@import templates/basic\n  foo" => "Illegal nesting: Nothing may be nested beneath import directives.",
+    "foo\n  @import foo.css" => "CSS import directives may only be used at the root of a document.",
+    "@if true\n  @import foo" => "Import directives may not be used within control directives or mixins.",
+    "@if true\n  .foo\n    @import foo" => "Import directives may not be used within control directives or mixins.",
+    "@mixin foo\n  @import foo" => "Import directives may not be used within control directives or mixins.",
+    "@mixin foo\n  .foo\n    @import foo" => "Import directives may not be used within control directives or mixins.",
+    "@import foo;" => "Invalid @import: expected end of line, was \";\".",
+    '$foo: "bar" "baz" !' => %Q{Invalid CSS after ""bar" "baz" ": expected expression (e.g. 1px, bold), was "!"},
+    '$foo: "bar" "baz" $' => %Q{Invalid CSS after ""bar" "baz" ": expected expression (e.g. 1px, bold), was "$"}, #'
+    "=foo\n  :color red\n.bar\n  +bang" => "Undefined mixin 'bang'.",
+    "=foo\n  :color red\n.bar\n  +bang_bop" => "Undefined mixin 'bang_bop'.",
+    "=foo\n  :color red\n.bar\n  +bang-bop" => "Undefined mixin 'bang-bop'.",
+    ".foo\n  =foo\n    :color red\n.bar\n  +foo" => "Undefined mixin 'foo'.",
+    "    a\n  b: c" => ["Indenting at the beginning of the document is illegal.", 1],
+    " \n   \n\t\n  a\n  b: c" => ["Indenting at the beginning of the document is illegal.", 4],
+    "a\n  b: c\n b: c" => ["Inconsistent indentation: 1 space was used for indentation, but the rest of the document was indented using 2 spaces.", 3],
+    "a\n  b: c\na\n b: c" => ["Inconsistent indentation: 1 space was used for indentation, but the rest of the document was indented using 2 spaces.", 4],
+    "a\n\t\tb: c\n\tb: c" => ["Inconsistent indentation: 1 tab was used for indentation, but the rest of the document was indented using 2 tabs.", 3],
+    "a\n  b: c\n   b: c" => ["Inconsistent indentation: 3 spaces were used for indentation, but the rest of the document was indented using 2 spaces.", 3],
+    "a\n  b: c\n  a\n   d: e" => ["Inconsistent indentation: 3 spaces were used for indentation, but the rest of the document was indented using 2 spaces.", 4],
+    "a\n \tb: c" => ["Indentation can't use both tabs and spaces.", 2],
+    "=a(" => 'Invalid CSS after "(": expected variable (e.g. $foo), was ""',
+    "=a(b)" => 'Invalid CSS after "(": expected variable (e.g. $foo), was "b)"',
+    "=a(,)" => 'Invalid CSS after "(": expected variable (e.g. $foo), was ",)"',
+    "=a($)" => 'Invalid CSS after "(": expected variable (e.g. $foo), was "$)"',
+    "=a($foo bar)" => 'Invalid CSS after "($foo ": expected ")", was "bar)"',
+    "=foo\n  bar: baz\n+foo" => ["Properties are only allowed within rules, directives, mixin includes, or other properties.", 2],
+    "a-\#{$b\n  c: d" => ['Invalid CSS after "a-#{$b": expected "}", was ""', 1],
+    "=a($b: 1, $c)" => "Required argument $c must come before any optional arguments.",
+    "=a($b: 1)\n  a: $b\ndiv\n  +a(1,2)" => "Mixin a takes 1 argument but 2 were passed.",
+    "=a($b: 1)\n  a: $b\ndiv\n  +a(1,$c: 3)" => "Mixin a doesn't have an argument named $c.",
+    "=a($b)\n  a: $b\ndiv\n  +a" => "Mixin a is missing argument $b.",
+    "@function foo()\n  1 + 2" => "Functions can only contain variable declarations and control directives.",
+    "@function foo()\n  foo: bar" => "Functions can only contain variable declarations and control directives.",
+    "@function foo()\n  foo: bar\n  @return 3" => ["Functions can only contain variable declarations and control directives.", 2],
+    "@function foo\n  @return 1" => ['Invalid CSS after "": expected "(", was ""', 1],
+    "@function foo(\n  @return 1" => ['Invalid CSS after "(": expected variable (e.g. $foo), was ""', 1],
+    "@function foo(b)\n  @return 1" => ['Invalid CSS after "(": expected variable (e.g. $foo), was "b)"', 1],
+    "@function foo(,)\n  @return 1" => ['Invalid CSS after "(": expected variable (e.g. $foo), was ",)"', 1],
+    "@function foo($)\n  @return 1" => ['Invalid CSS after "(": expected variable (e.g. $foo), was "$)"', 1],
+    "@function foo()\n  @return" => 'Invalid @return: expected expression.',
+    "@function foo()\n  @return 1\n    $var: val" => 'Illegal nesting: Nothing may be nested beneath return directives.',
+    "@function foo($a)\n  @return 1\na\n  b: foo()" => 'Function foo is missing argument $a.',
+    "@function foo()\n  @return 1\na\n  b: foo(2)" => 'Function foo takes 0 arguments but 1 was passed.',
+    "@function foo()\n  @return 1\na\n  b: foo($a: 1)" => "Function foo doesn't have an argument named $a.",
+    "@function foo()\n  @return 1\na\n  b: foo($a: 1, $b: 2)" => "Function foo doesn't have the following arguments: $a, $b.",
+    "@return 1" => '@return may only be used within a function.',
+    "@if true\n  @return 1" => '@return may only be used within a function.',
+    "@mixin foo\n  @return 1\n@include foo" => ['@return may only be used within a function.', 2],
+    "@else\n  a\n    b: c" => ["@else must come after @if.", 1],
+    "@if false\n@else foo" => "Invalid else directive '@else foo': expected 'if <expr>'.",
+    "@if false\n@else if " => "Invalid else directive '@else if': expected 'if <expr>'.",
+    "a\n  $b: 12\nc\n  d: $b" => 'Undefined variable: "$b".',
+    "=foo\n  $b: 12\nc\n  +foo\n  d: $b" => 'Undefined variable: "$b".',
+    "c\n  d: $b-foo" => 'Undefined variable: "$b-foo".',
+    "c\n  d: $b_foo" => 'Undefined variable: "$b_foo".',
+    '@for $a from "foo" to 1' => '"foo" is not an integer.',
+    '@for $a from 1 to "2"' => '"2" is not an integer.',
+    '@for $a from 1 to "foo"' => '"foo" is not an integer.',
+    '@for $a from 1 to 1.23232323232' => '1.2323232323 is not an integer.',
+    '@for $a from 1px to 3em' => "Incompatible units: 'em' and 'px'.",
+    '@if' => "Invalid if directive '@if': expected expression.",
+    '@while' => "Invalid while directive '@while': expected expression.",
+    '@debug' => "Invalid debug directive '@debug': expected expression.",
+    %Q{@debug "a message"\n  "nested message"} => "Illegal nesting: Nothing may be nested beneath debug directives.",
+    '@error' => "Invalid error directive '@error': expected expression.",
+    %Q{@error "a message"\n  "nested message"} => "Illegal nesting: Nothing may be nested beneath error directives.",
+    '@warn' => "Invalid warn directive '@warn': expected expression.",
+    %Q{@warn "a message"\n  "nested message"} => "Illegal nesting: Nothing may be nested beneath warn directives.",
+    "/* foo\n    bar\n  baz" => "Inconsistent indentation: previous line was indented by 4 spaces, but this line was indented by 2 spaces.",
+    '+foo(1 + 1: 2)' => 'Invalid CSS after "(1 + 1": expected comma, was ": 2)"',
+    '+foo($var: )' => 'Invalid CSS after "($var: ": expected mixin argument, was ")"',
+    '+foo($var: a, $var: b)' => 'Keyword argument "$var" passed more than once',
+    '+foo($var-var: a, $var_var: b)' => 'Keyword argument "$var_var" passed more than once',
+    '+foo($var_var: a, $var-var: b)' => 'Keyword argument "$var-var" passed more than once',
+    "a\n  b: foo(1 + 1: 2)" => 'Invalid CSS after "foo(1 + 1": expected comma, was ": 2)"',
+    "a\n  b: foo($var: )" => 'Invalid CSS after "foo($var: ": expected function argument, was ")"',
+    "a\n  b: foo($var: a, $var: b)" => 'Keyword argument "$var" passed more than once',
+    "a\n  b: foo($var-var: a, $var_var: b)" => 'Keyword argument "$var_var" passed more than once',
+    "a\n  b: foo($var_var: a, $var-var: b)" => 'Keyword argument "$var-var" passed more than once',
+    "@if foo\n  @extend .bar" => ["Extend directives may only be used within rules.", 2],
+    "$var: true\n@while $var\n  @extend .bar\n  $var: false" => ["Extend directives may only be used within rules.", 3],
+    "@for $i from 0 to 1\n  @extend .bar" => ["Extend directives may only be used within rules.", 2],
+    "@mixin foo\n  @extend .bar\n@include foo" => ["Extend directives may only be used within rules.", 2],
+    "foo %\n  a: b" => ['Invalid CSS after "foo %": expected placeholder name, was ""', 1],
+    "=foo\n  @content error" => "Invalid content directive. Trailing characters found: \"error\".",
+    "=foo\n  @content\n    b: c" => "Illegal nesting: Nothing may be nested beneath @content directives.",
+    "@content" => '@content may only be used within a mixin.',
+    "=simple\n  .simple\n    color: red\n+simple\n  color: blue" => ['Mixin "simple" does not accept a content block.', 4],
+    "@import \"foo\" // bar" => "Invalid CSS after \"\"foo\" \": expected media query list, was \"// bar\"",
+    "@at-root\n  a: b" => "Properties are only allowed within rules, directives, mixin includes, or other properties.",
+
+    # Regression tests
+    "a\n  b:\n    c\n    d" => ["Illegal nesting: Only properties may be nested beneath properties.", 3],
+    "& foo\n  bar: baz\n  blat: bang" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 1],
+    "a\n  b: c\n& foo\n  bar: baz\n  blat: bang" => ["Base-level rules cannot contain the parent-selector-referencing character '&'.", 3],
+    "@" => "Invalid directive: '@'.",
+    "$r: 20em * #ccc" => ["Cannot multiply a number with units (20em) to a color (#ccc).", 1],
+    "$r: #ccc / 1em" => ["Cannot divide a number with units (1em) to a color (#ccc).", 1],
+  }
+
+  def teardown
+    clean_up_sassc
+  end
+
+  def test_basic_render
+    renders_correctly "basic", { :style => :compact }
+  end
+
+  def test_empty_render
+    assert_equal "", render("")
+  end
+
+  def test_multiple_calls_to_render
+    sass = Sass::Engine.new("a\n  b: c")
+    assert_equal sass.render, sass.render
+  end
+
+  def test_alternate_styles
+    renders_correctly "expanded", { :style => :expanded }
+    renders_correctly "compact", { :style => :compact }
+    renders_correctly "nested", { :style => :nested }
+    renders_correctly "compressed", { :style => :compressed }
+  end
+
+  def test_compile
+    assert_equal "div { hello: world; }\n", Sass.compile("$who: world\ndiv\n  hello: $who", :syntax => :sass, :style => :compact)
+    assert_equal "div { hello: world; }\n", Sass.compile("$who: world; div { hello: $who }", :style => :compact)
+  end
+
+  def test_compile_file
+    FileUtils.mkdir_p(absolutize("tmp"))
+    open(absolutize("tmp/test_compile_file.sass"), "w") {|f| f.write("$who: world\ndiv\n  hello: $who")}
+    open(absolutize("tmp/test_compile_file.scss"), "w") {|f| f.write("$who: world; div { hello: $who }")}
+    assert_equal "div { hello: world; }\n", Sass.compile_file(absolutize("tmp/test_compile_file.sass"), :style => :compact)
+    assert_equal "div { hello: world; }\n", Sass.compile_file(absolutize("tmp/test_compile_file.scss"), :style => :compact)
+  ensure
+    FileUtils.rm_rf(absolutize("tmp"))
+  end
+
+  def test_compile_file_to_css_file
+    FileUtils.mkdir_p(absolutize("tmp"))
+    open(absolutize("tmp/test_compile_file.sass"), "w") {|f| f.write("$who: world\ndiv\n  hello: $who")}
+    open(absolutize("tmp/test_compile_file.scss"), "w") {|f| f.write("$who: world; div { hello: $who }")}
+    Sass.compile_file(absolutize("tmp/test_compile_file.sass"), absolutize("tmp/test_compile_file_sass.css"), :style => :compact)
+    Sass.compile_file(absolutize("tmp/test_compile_file.scss"), absolutize("tmp/test_compile_file_scss.css"), :style => :compact)
+    assert_equal "div { hello: world; }\n", File.read(absolutize("tmp/test_compile_file_sass.css"))
+    assert_equal "div { hello: world; }\n", File.read(absolutize("tmp/test_compile_file_scss.css"))
+  ensure
+    FileUtils.rm_rf(absolutize("tmp"))
+  end
+  
+  def test_flexible_tabulation
+    assert_equal("p {\n  a: b; }\n  p q {\n    c: d; }\n",
+                 render("p\n a: b\n q\n  c: d\n"))
+    assert_equal("p {\n  a: b; }\n  p q {\n    c: d; }\n",
+                 render("p\n\ta: b\n\tq\n\t\tc: d\n"))
+  end
+
+  def test_import_same_name_different_ext
+    assert_raise_message Sass::SyntaxError, <<ERROR do
+It's not clear which file to import for '@import "same_name_different_ext"'.
+Candidates:
+  same_name_different_ext.sass
+  same_name_different_ext.scss
+Please delete or rename all but one of these files.
+ERROR
+      options = {:load_paths => [File.dirname(__FILE__) + '/templates/']}
+      munge_filename options
+      Sass::Engine.new("@import 'same_name_different_ext'", options).render
+    end
+  end
+
+  def test_import_same_name_different_partiality
+    assert_raise_message Sass::SyntaxError, <<ERROR do
+It's not clear which file to import for '@import "same_name_different_partiality"'.
+Candidates:
+  _same_name_different_partiality.scss
+  same_name_different_partiality.scss
+Please delete or rename all but one of these files.
+ERROR
+      options = {:load_paths => [File.dirname(__FILE__) + '/templates/']}
+      munge_filename options
+      Sass::Engine.new("@import 'same_name_different_partiality'", options).render
+    end
+  end
+
+  EXCEPTION_MAP.each do |key, value|
+    define_method("test_exception (#{key.inspect})") do
+      line = 10
+      begin
+        silence_warnings {Sass::Engine.new(key, :filename => FAKE_FILE_NAME, :line => line).render}
+      rescue Sass::SyntaxError => err
+        value = [value] unless value.is_a?(Array)
+
+        assert_equal(value.first.rstrip, err.message, "Line: #{key}")
+        assert_equal(FAKE_FILE_NAME, err.sass_filename)
+        assert_equal((value[1] || key.split("\n").length) + line - 1, err.sass_line, "Line: #{key}")
+        assert_match(/#{Regexp.escape(FAKE_FILE_NAME)}:[0-9]+/, err.backtrace[0], "Line: #{key}")
+      else
+        assert(false, "Exception not raised for\n#{key}")
+      end
+    end
+  end
+
+  def test_exception_line
+    to_render = <<SASS
+rule
+  prop: val
+  // comment!
+
+  broken:
+SASS
+    begin
+      Sass::Engine.new(to_render).render
+    rescue Sass::SyntaxError => err
+      assert_equal(5, err.sass_line)
+    else
+      assert(false, "Exception not raised for '#{to_render}'!")
+    end
+  end
+
+  def test_exception_location
+    to_render = <<SASS
+rule
+  prop: val
+  // comment!
+
+  broken:
+SASS
+    begin
+      Sass::Engine.new(to_render, :filename => FAKE_FILE_NAME, :line => (__LINE__-7)).render
+    rescue Sass::SyntaxError => err
+      assert_equal(FAKE_FILE_NAME, err.sass_filename)
+      assert_equal((__LINE__-6), err.sass_line)
+    else
+      assert(false, "Exception not raised for '#{to_render}'!")
+    end
+  end
+
+  def test_imported_exception
+    [1, 2, 3, 4].each do |i|
+      begin
+        Sass::Engine.new("@import bork#{i}", :load_paths => [File.dirname(__FILE__) + '/templates/']).render
+      rescue Sass::SyntaxError => err
+        assert_equal(2, err.sass_line)
+        assert_match(/(\/|^)bork#{i}\.sass$/, err.sass_filename)
+
+        assert_hash_has(err.sass_backtrace.first,
+          :filename => err.sass_filename, :line => err.sass_line)
+
+        assert_nil(err.sass_backtrace[1][:filename])
+        assert_equal(1, err.sass_backtrace[1][:line])
+
+        assert_match(/(\/|^)bork#{i}\.sass:2$/, err.backtrace.first)
+        assert_equal("(sass):1", err.backtrace[1])
+      else
+        assert(false, "Exception not raised for imported template: bork#{i}")
+      end
+    end
+  end
+
+  def test_double_imported_exception
+    [1, 2, 3, 4].each do |i|
+      begin
+        Sass::Engine.new("@import nested_bork#{i}", :load_paths => [File.dirname(__FILE__) + '/templates/']).render
+      rescue Sass::SyntaxError => err
+        assert_equal(2, err.sass_line)
+        assert_match(/(\/|^)bork#{i}\.sass$/, err.sass_filename)
+
+        assert_hash_has(err.sass_backtrace.first,
+          :filename => err.sass_filename, :line => err.sass_line)
+
+        assert_match(/(\/|^)nested_bork#{i}\.sass$/, err.sass_backtrace[1][:filename])
+        assert_equal(2, err.sass_backtrace[1][:line])
+
+        assert_nil(err.sass_backtrace[2][:filename])
+        assert_equal(1, err.sass_backtrace[2][:line])
+
+        assert_match(/(\/|^)bork#{i}\.sass:2$/, err.backtrace.first)
+        assert_match(/(\/|^)nested_bork#{i}\.sass:2$/, err.backtrace[1])
+        assert_equal("(sass):1", err.backtrace[2])
+      else
+        assert(false, "Exception not raised for imported template: bork#{i}")
+      end
+    end
+  end
+
+  def test_selector_tracing
+    actual_css = render(<<-SCSS, :syntax => :scss, :trace_selectors => true)
+      @mixin mixed {
+        .mixed { color: red; }
+      }
+      .context {
+        @include mixed;
+      }
+    SCSS
+    assert_equal(<<CSS,actual_css)
+/* on line 2 of test_selector_tracing_inline.scss, in `mixed'
+   from line 5 of test_selector_tracing_inline.scss */
+.context .mixed {
+  color: red; }
+CSS
+  end
+
+  def test_mixin_exception
+    render(<<SASS)
+=error-mixin($a)
+  color: $a * 1em * 1px
+
+=outer-mixin($a)
+  +error-mixin($a)
+
+.error
+  +outer-mixin(12)
+SASS
+    assert(false, "Exception not raised")
+  rescue Sass::SyntaxError => err
+    assert_equal(2, err.sass_line)
+    assert_equal(filename_for_test, err.sass_filename)
+    assert_equal("error-mixin", err.sass_mixin)
+
+    assert_hash_has(err.sass_backtrace.first, :line => err.sass_line,
+      :filename => err.sass_filename, :mixin => err.sass_mixin)
+    assert_hash_has(err.sass_backtrace[1], :line => 5,
+      :filename => filename_for_test, :mixin => "outer-mixin")
+    assert_hash_has(err.sass_backtrace[2], :line => 8,
+      :filename => filename_for_test, :mixin => nil)
+
+    assert_equal("#{filename_for_test}:2:in `error-mixin'", err.backtrace.first)
+    assert_equal("#{filename_for_test}:5:in `outer-mixin'", err.backtrace[1])
+    assert_equal("#{filename_for_test}:8", err.backtrace[2])
+  end
+
+  def test_mixin_callsite_exception
+    render(<<SASS)
+=one-arg-mixin($a)
+  color: $a
+
+=outer-mixin($a)
+  +one-arg-mixin($a, 12)
+
+.error
+  +outer-mixin(12)
+SASS
+    assert(false, "Exception not raised")
+  rescue Sass::SyntaxError => err
+    assert_hash_has(err.sass_backtrace.first, :line => 5,
+      :filename => filename_for_test, :mixin => "one-arg-mixin")
+    assert_hash_has(err.sass_backtrace[1], :line => 5,
+      :filename => filename_for_test, :mixin => "outer-mixin")
+    assert_hash_has(err.sass_backtrace[2], :line => 8,
+      :filename => filename_for_test, :mixin => nil)
+  end
+
+  def test_mixin_exception_cssize
+    render(<<SASS)
+=parent-ref-mixin
+  & foo
+    a: b
+
+=outer-mixin
+  +parent-ref-mixin
+
++outer-mixin
+SASS
+    assert(false, "Exception not raised")
+  rescue Sass::SyntaxError => err
+    assert_hash_has(err.sass_backtrace.first, :line => 2,
+      :filename => filename_for_test, :mixin => "parent-ref-mixin")
+    assert_hash_has(err.sass_backtrace[1], :line => 6,
+      :filename => filename_for_test, :mixin => "outer-mixin")
+    assert_hash_has(err.sass_backtrace[2], :line => 8,
+      :filename => filename_for_test, :mixin => nil)
+  end
+
+  def test_mixin_and_import_exception
+    Sass::Engine.new("@import nested_mixin_bork", :load_paths => [File.dirname(__FILE__) + '/templates/']).render
+    assert(false, "Exception not raised")
+  rescue Sass::SyntaxError => err
+    assert_match(/(\/|^)nested_mixin_bork\.sass$/, err.sass_backtrace.first[:filename])
+    assert_hash_has(err.sass_backtrace.first, :mixin => "error-mixin", :line => 4)
+
+    assert_match(/(\/|^)mixin_bork\.sass$/, err.sass_backtrace[1][:filename])
+    assert_hash_has(err.sass_backtrace[1], :mixin => "outer-mixin", :line => 2)
+
+    assert_match(/(\/|^)mixin_bork\.sass$/, err.sass_backtrace[2][:filename])
+    assert_hash_has(err.sass_backtrace[2], :mixin => nil, :line => 5)
+
+    assert_match(/(\/|^)nested_mixin_bork\.sass$/, err.sass_backtrace[3][:filename])
+    assert_hash_has(err.sass_backtrace[3], :mixin => nil, :line => 6)
+
+    assert_hash_has(err.sass_backtrace[4], :filename => nil, :mixin => nil, :line => 1)
+  end
+
+  def test_recursive_mixin
+    assert_equal <<CSS, render(<<SASS)
+.foo .bar .baz {
+  color: blue; }
+.foo .bar .qux {
+  color: red; }
+.foo .zap {
+  color: green; }
+CSS
+@mixin map-to-rule($map-or-color)
+  @if type-of($map-or-color) == map
+    @each $key, $value in $map-or-color
+      .\#{$key}
+        @include map-to-rule($value)
+  @else
+    color: $map-or-color
+
+@include map-to-rule((foo: (bar: (baz: blue, qux: red), zap: green)))
+SASS
+  end
+
+  def test_double_import_loop_exception
+    importer = MockImporter.new
+    importer.add_import("foo", "@import 'bar'")
+    importer.add_import("bar", "@import 'foo'")
+
+    engine = Sass::Engine.new('@import "foo"', :filename => filename_for_test,
+      :load_paths => [importer], :importer => importer)
+
+    assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) {engine.render}
+An @import loop has been found:
+    #{filename_for_test} imports foo
+    foo imports bar
+    bar imports foo
+ERR
+  end
+
+  def test_deep_import_loop_exception
+    importer = MockImporter.new
+    importer.add_import("foo", "@import 'bar'")
+    importer.add_import("bar", "@import 'baz'")
+    importer.add_import("baz", "@import 'foo'")
+
+    engine = Sass::Engine.new('@import "foo"', :filename => filename_for_test,
+      :load_paths => [importer], :importer => importer)
+
+    assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) {engine.render}
+An @import loop has been found:
+    #{filename_for_test} imports foo
+    foo imports bar
+    bar imports baz
+    baz imports foo
+ERR
+  end
+
+  def test_exception_css_with_offset
+    opts = {:full_exception => true, :line => 362}
+    render(("a\n  b: c\n" * 10) + "d\n  e:\n" + ("f\n  g: h\n" * 10), opts)
+  rescue Sass::SyntaxError => e
+    assert_equal(<<CSS, Sass::SyntaxError.exception_to_css(e, opts[:line]).split("\n")[0..15].join("\n"))
+/*
+Error: Invalid property: "e:" (no value).
+        on line 383 of test_exception_css_with_offset_inline.sass
+
+378: a
+379:   b: c
+380: a
+381:   b: c
+382: d
+383:   e:
+384: f
+385:   g: h
+386: f
+387:   g: h
+388: f
+CSS
+  else
+    assert(false, "Exception not raised for test_exception_css_with_offset")
+  end
+
+  def test_exception_css_with_mixins
+    render(<<SASS, :full_exception => true)
+=error-mixin($a)
+  color: $a * 1em * 1px
+
+=outer-mixin($a)
+  +error-mixin($a)
+
+.error
+  +outer-mixin(12)
+SASS
+  rescue Sass::SyntaxError => e
+    assert_equal(<<CSS, Sass::SyntaxError.exception_to_css(e).split("\n")[0..13].join("\n"))
+/*
+Error: 12em*px isn't a valid CSS value.
+        on line 2 of test_exception_css_with_mixins_inline.sass, in `error-mixin'
+        from line 5 of test_exception_css_with_mixins_inline.sass, in `outer-mixin'
+        from line 8 of test_exception_css_with_mixins_inline.sass
+
+1: =error-mixin($a)
+2:   color: $a * 1em * 1px
+3: 
+4: =outer-mixin($a)
+5:   +error-mixin($a)
+6: 
+7: .error
+CSS
+  else
+    assert(false, "Exception not raised")
+  end
+
+  def test_cssize_exception_css
+    render(<<SASS, :full_exception => true)
+.filler
+  stuff: "stuff!"
+
+a: b
+
+.more.filler
+  a: b
+SASS
+  rescue Sass::SyntaxError => e
+    assert_equal(<<CSS, Sass::SyntaxError.exception_to_css(e).split("\n")[0..11].join("\n"))
+/*
+Error: Properties are only allowed within rules, directives, mixin includes, or other properties.
+        on line 4 of test_cssize_exception_css_inline.sass
+
+1: .filler
+2:   stuff: "stuff!"
+3: 
+4: a: b
+5: 
+6: .more.filler
+7:   a: b
+CSS
+  else
+    assert(false, "Exception not raised")
+  end
+
+  def test_css_import
+    assert_equal("@import url(./fonts.css);\n", render("@import \"./fonts.css\""))
+  end
+
+  def test_http_import
+    assert_equal("@import \"http://fonts.googleapis.com/css?family=Droid+Sans\";\n",
+      render("@import \"http://fonts.googleapis.com/css?family=Droid+Sans\""))
+  end
+
+  def test_protocol_relative_import
+    assert_equal("@import \"//fonts.googleapis.com/css?family=Droid+Sans\";\n",
+      render("@import \"//fonts.googleapis.com/css?family=Droid+Sans\""))
+  end
+
+  def test_import_with_interpolation
+    assert_equal(<<CSS, render(<<SASS))
+@import url("http://fonts.googleapis.com/css?family=Droid+Sans");
+CSS
+$family: unquote("Droid+Sans")
+@import url("http://fonts.googleapis.com/css?family=\#{$family}")
+SASS
+  end
+
+  def test_import_with_dynamic_media_query
+    assert_equal(<<CSS, render(<<SASS))
+@import "foo" print and (-webkit-min-device-pixel-ratio-foo: 25);
+CSS
+$media: print
+$key: -webkit-min-device-pixel-ratio
+$value: 20
+@import "foo" \#{$media} and ($key + "-foo": $value + 5)
+SASS
+  end
+
+  def test_url_import
+    assert_equal("@import url(fonts.sass);\n", render("@import url(fonts.sass)"))
+  end
+
+  def test_sass_import
+    sassc_file = sassc_path("importee")
+    assert !File.exist?(sassc_file)
+    renders_correctly "import", { :style => :compact, :load_paths => [File.dirname(__FILE__) + "/templates"] }
+    assert File.exist?(sassc_file)
+  end
+
+  def test_sass_pathname_import
+    sassc_file = sassc_path("importee")
+    assert !File.exist?(sassc_file)
+    renders_correctly("import",
+      :style => :compact,
+      :load_paths => [Pathname.new(File.dirname(__FILE__) + "/templates")])
+    assert File.exist?(sassc_file)
+  end
+
+  def test_import_from_global_load_paths
+    importer = MockImporter.new
+    importer.add_import("imported", "div{color:red}")
+    Sass.load_paths << importer
+
+    assert_equal "div {\n  color: red; }\n", Sass::Engine.new('@import "imported"', :importer => importer).render
+  ensure
+    Sass.load_paths.clear
+  end
+
+  def test_nonexistent_import
+    assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) do
+File to import not found or unreadable: nonexistent.sass.
+ERR
+      render("@import nonexistent.sass")
+    end
+  end
+
+  def test_nonexistent_extensionless_import
+    assert_raise_message(Sass::SyntaxError, <<ERR.rstrip) do
+File to import not found or unreadable: nonexistent.
+ERR
+      render("@import nonexistent")
+    end
+  end
+
+  def test_no_cache
+    assert !File.exist?(sassc_path("importee"))
+    renders_correctly("import", {
+        :style => :compact, :cache => false,
+        :load_paths => [File.dirname(__FILE__) + "/templates"],
+      })
+    assert !File.exist?(sassc_path("importee"))
+  end
+
+  def test_import_in_rule
+    assert_equal(<<CSS, render(<<SASS, :load_paths => [File.dirname(__FILE__) + '/templates/']))
+.foo #foo {
+  background-color: #baf; }
+
+.bar {
+  a: b; }
+  .bar #foo {
+    background-color: #baf; }
+CSS
+.foo
+  @import partial
+
+.bar
+  a: b
+  @import partial
+SASS
+  end
+
+  def test_units
+    renders_correctly "units"
+  end
+
+  def test_default_function
+    assert_equal(<<CSS, render(<<SASS))
+foo {
+  bar: url("foo.png"); }
+CSS
+foo
+  bar: url("foo.png")
+SASS
+    assert_equal("foo {\n  bar: url(); }\n", render("foo\n  bar: url()\n"));
+  end
+
+  def test_string_minus
+    assert_equal("foo {\n  bar: baz-boom-bat; }\n", render(%Q{foo\n  bar: baz-boom-bat}))
+    assert_equal("foo {\n  bar: -baz-boom; }\n", render(%Q{foo\n  bar: -baz-boom}))
+  end
+
+  def test_string_div
+    assert_equal("foo {\n  bar: baz/boom/bat; }\n", render(%Q{foo\n  bar: baz/boom/bat}))
+    assert_equal("foo {\n  bar: /baz/boom; }\n", render(%Q{foo\n  bar: /baz/boom}))
+  end
+
+  def test_basic_multiline_selector
+    assert_equal("#foo #bar,\n#baz #boom {\n  foo: bar; }\n",
+                 render("#foo #bar,\n#baz #boom\n  foo: bar"))
+    assert_equal("#foo #bar,\n#foo #baz {\n  foo: bar; }\n",
+                 render("#foo\n  #bar,\n  #baz\n    foo: bar"))
+    assert_equal("#foo,\n#bar {\n  foo: bar; }\n  #foo #baz,\n  #bar #baz {\n    foo: bar; }\n",
+                 render("#foo,\n#bar\n  foo: bar\n  #baz\n    foo: bar"))
+    assert_equal("#foo #bar, #baz #boom { foo: bar; }\n",
+                 render("#foo #bar,\n#baz #boom\n  foo: bar", :style => :compact))
+                 
+    assert_equal("#foo #bar,#baz #boom{foo:bar}\n",
+                 render("#foo #bar,\n#baz #boom\n  foo: bar", :style => :compressed))
+
+    assert_equal("#foo #bar,\n#baz #boom {\n  foo: bar; }\n",
+                 render("#foo #bar,,\n,#baz #boom,\n  foo: bar"))
+
+    assert_equal("#bip #bop {\n  foo: bar; }\n",
+                 render("#bip #bop,, ,\n  foo: bar"))
+  end
+
+  def test_complex_multiline_selector
+    renders_correctly "multiline"
+  end
+
+  def test_colon_only
+    begin
+      render("a\n  b: c", :property_syntax => :old)
+    rescue Sass::SyntaxError => e
+      assert_equal("Illegal property syntax: can't use new syntax when :property_syntax => :old is set.",
+                   e.message)
+      assert_equal(2, e.sass_line)
+    else
+      assert(false, "SyntaxError not raised for :property_syntax => :old")
+    end
+
+    begin
+      silence_warnings {render("a\n  :b c", :property_syntax => :new)}
+      assert_equal(2, e.sass_line)
+    rescue Sass::SyntaxError => e
+      assert_equal("Illegal property syntax: can't use old syntax when :property_syntax => :new is set.",
+                   e.message)
+    else
+      assert(false, "SyntaxError not raised for :property_syntax => :new")
+    end
+  end
+
+  def test_pseudo_elements
+    assert_equal(<<CSS, render(<<SASS))
+::first-line {
+  size: 10em; }
+CSS
+::first-line
+  size: 10em
+SASS
+  end
+
+  def test_directive
+    assert_equal("@a b;\n", render("@a b"))
+
+    assert_equal("@a {\n  b: c; }\n", render("@a\n  b: c"))
+    assert_equal("@a { b: c; }\n", render("@a\n  b: c", :style => :compact))
+    assert_equal("@a {\n  b: c;\n}\n", render("@a\n  b: c", :style => :expanded))
+    assert_equal("@a{b:c}\n", render("@a\n  b: c", :style => :compressed))
+
+    assert_equal("@a {\n  b: c;\n  d: e; }\n",
+                 render("@a\n  b: c\n  d: e"))
+    assert_equal("@a { b: c; d: e; }\n",
+                 render("@a\n  b: c\n  d: e", :style => :compact))
+    assert_equal("@a {\n  b: c;\n  d: e;\n}\n",
+                 render("@a\n  b: c\n  d: e", :style => :expanded))
+    assert_equal("@a{b:c;d:e}\n",
+                 render("@a\n  b: c\n  d: e", :style => :compressed))
+
+    assert_equal("@a {\n  #b {\n    c: d; } }\n",
+                 render("@a\n  #b\n    c: d"))
+    assert_equal("@a { #b { c: d; } }\n",
+                 render("@a\n  #b\n    c: d", :style => :compact))
+    assert_equal("@a {\n  #b {\n    c: d;\n  }\n}\n",
+                 render("@a\n  #b\n    c: d", :style => :expanded))
+    assert_equal("@a{#b{c:d}}\n",
+                 render("@a\n  #b\n    c: d", :style => :compressed))
+
+    assert_equal("@a {\n  #b {\n    a: b; }\n    #b #c {\n      d: e; } }\n",
+                 render("@a\n  #b\n    a: b\n    #c\n      d: e"))
+    assert_equal("@a { #b { a: b; }\n  #b #c { d: e; } }\n",
+                 render("@a\n  #b\n    a: b\n    #c\n      d: e", :style => :compact))
+    assert_equal("@a {\n  #b {\n    a: b;\n  }\n  #b #c {\n    d: e;\n  }\n}\n",
+                 render("@a\n  #b\n    a: b\n    #c\n      d: e", :style => :expanded))
+    assert_equal("@a{#b{a:b}#b #c{d:e}}\n",
+                 render("@a\n  #b\n    a: b\n    #c\n      d: e", :style => :compressed))
+                 
+    assert_equal("@a {\n  #foo,\n  #bar {\n    b: c; } }\n",
+                 render("@a\n  #foo, \n  #bar\n    b: c"))
+    assert_equal("@a { #foo, #bar { b: c; } }\n",
+                 render("@a\n  #foo, \n  #bar\n    b: c", :style => :compact))
+    assert_equal("@a {\n  #foo,\n  #bar {\n    b: c;\n  }\n}\n",
+                 render("@a\n  #foo, \n  #bar\n    b: c", :style => :expanded))
+    assert_equal("@a{#foo,#bar{b:c}}\n",
+                 render("@a\n  #foo, \n  #bar\n    b: c", :style => :compressed))
+
+    to_render = <<END
+@a
+  b: c
+  #d
+    e: f
+  g: h
+END
+    rendered = <<END
+@a { b: c;
+  #d { e: f; }
+  g: h; }
+END
+    assert_equal(rendered, render(to_render, :style => :compact))
+    
+    assert_equal("@a{b:c;#d{e:f}g:h}\n", render(to_render, :style => :compressed))
+  end
+
+  def test_property_hacks
+    assert_equal(<<CSS, render(<<SASS))
+foo {
+  _name: val;
+  *name: val;
+  #name: val;
+  .name: val;
+  name/**/: val;
+  name/*\\**/: val;
+  name: val; }
+CSS
+foo
+  _name: val
+  *name: val
+  #name: val
+  .name: val
+  name/**/: val
+  name/*\\**/: val
+  name: val
+SASS
+  end
+
+  def test_properties_with_space_after_colon
+    assert_equal <<CSS, render(<<SASS)
+foo {
+  bar: baz;
+  bizz: bap; }
+CSS
+foo
+  bar : baz
+  bizz	: bap
+SASS
+  end
+
+  def test_line_annotations
+    assert_equal(<<CSS, render(<<SASS, :line_comments => true, :style => :compact))
+/* line 2, test_line_annotations_inline.sass */
+foo bar { foo: bar; }
+/* line 5, test_line_annotations_inline.sass */
+foo baz { blip: blop; }
+
+/* line 9, test_line_annotations_inline.sass */
+floodle { flop: blop; }
+
+/* line 18, test_line_annotations_inline.sass */
+bup { mix: on; }
+/* line 15, test_line_annotations_inline.sass */
+bup mixin { moop: mup; }
+
+/* line 22, test_line_annotations_inline.sass */
+bip hop, skip hop { a: b; }
+CSS
+foo
+  bar
+    foo: bar
+
+  baz
+    blip: blop
+
+
+floodle
+
+  flop: blop
+
+=mxn
+  mix: on
+  mixin
+    moop: mup
+
+bup
+  +mxn
+
+bip, skip
+  hop
+    a: b
+SASS
+  end
+
+  def test_line_annotations_with_filename
+    renders_correctly "line_numbers", :line_comments => true, :load_paths => [File.dirname(__FILE__) + "/templates"]
+  end
+
+  def test_debug_info
+    esc_file_name = Sass::SCSS::RX.escape_ident(Sass::Util.scope("test_debug_info_inline.sass"))
+
+    assert_equal(<<CSS, render(<<SASS, :debug_info => true, :style => :compact))
+@media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\000032}}
+foo bar { foo: bar; }
+@media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\000035}}
+foo baz { blip: blop; }
+
+@media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\000039}}
+floodle { flop: blop; }
+
+@media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0000318}}
+bup { mix: on; }
+@media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0000315}}
+bup mixin { moop: mup; }
+
+@media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\0000322}}
+bip hop, skip hop { a: b; }
+CSS
+foo
+  bar
+    foo: bar
+
+  baz
+    blip: blop
+
+
+floodle
+
+  flop: blop
+
+=mxn
+  mix: on
+  mixin
+    moop: mup
+
+bup
+  +mxn
+
+bip, skip
+  hop
+    a: b
+SASS
+  end
+
+  def test_debug_info_without_filename
+    assert_equal(<<CSS, Sass::Engine.new(<<SASS, :debug_info => true).render)
+@media -sass-debug-info{filename{}line{font-family:\\000031}}
+foo {
+  a: b; }
+CSS
+foo
+  a: b
+SASS
+  end
+
+  def test_debug_info_with_compressed
+    assert_equal(<<CSS, render(<<SASS, :debug_info => true, :style => :compressed))
+foo{a:b}
+CSS
+foo
+  a: b
+SASS
+  end
+
+  def test_debug_info_with_line_annotations
+    esc_file_name = Sass::SCSS::RX.escape_ident(Sass::Util.scope("test_debug_info_with_line_annotations_inline.sass"))
+
+    assert_equal(<<CSS, render(<<SASS, :debug_info => true, :line_comments => true))
+@media -sass-debug-info{filename{font-family:file\\:\\/\\/#{esc_file_name}}line{font-family:\\000031}}
+foo {
+  a: b; }
+CSS
+foo
+  a: b
+SASS
+  end
+
+  def test_debug_info_in_keyframes
+    assert_equal(<<CSS, render(<<SASS, :debug_info => true))
+@-webkit-keyframes warm {
+  from {
+    color: black; }
+  to {
+    color: red; } }
+CSS
+@-webkit-keyframes warm
+  from
+    color: black
+  to
+    color: red
+SASS
+  end
+
+  def test_empty_first_line
+    assert_equal("#a {\n  b: c; }\n", render("#a\n\n  b: c"))
+  end
+
+  def test_escaped_rule
+    assert_equal(":focus {\n  a: b; }\n", render("\\:focus\n  a: b"))
+    assert_equal("a {\n  b: c; }\n  a :focus {\n    d: e; }\n", render("\\a\n  b: c\n  \\:focus\n    d: e"))
+  end
+
+  def test_cr_newline
+    assert_equal("foo {\n  a: b;\n  c: d;\n  e: f; }\n", render("foo\r  a: b\r\n  c: d\n\r  e: f"))
+  end
+
+  def test_property_with_content_and_nested_props
+    assert_equal(<<CSS, render(<<SASS))
+foo {
+  a: b;
+    a-c: d;
+      a-c-e: f; }
+CSS
+foo
+  a: b
+    c: d
+      e: f
+SASS
+
+    assert_equal(<<CSS, render(<<SASS))
+foo {
+  a: b;
+    a-c-e: f; }
+CSS
+foo
+  a: b
+    c:
+      e: f
+SASS
+  end
+
+  def test_guarded_assign
+    assert_equal("foo {\n  a: b; }\n", render(%Q{$foo: b\n$foo: c !default\nfoo\n  a: $foo}))
+    assert_equal("foo {\n  a: b; }\n", render(%Q{$foo: b !default\nfoo\n  a: $foo}))
+    assert_equal("foo {\n  a: b; }\n", render(%Q{$foo: null\n$foo: b !default\nfoo\n  a: $foo}))
+  end
+  
+  def test_mixins
+    renders_correctly "mixins", { :style => :expanded }
+  end
+
+  def test_directive_style_mixins
+    assert_equal <<CSS, render(<<SASS)
+bar {
+  prop: baz; }
+CSS
+@mixin foo($arg)
+  prop: $arg
+
+bar
+  @include foo(baz)
+SASS
+  end
+
+  def test_mixins_dont_interfere_with_sibling_combinator
+    assert_equal("foo + bar {\n  a: b; }\nfoo + baz {\n  c: d; }\n",
+                 render("foo\n  +\n    bar\n      a: b\n    baz\n      c: d"))
+  end
+
+  def test_mixin_args
+    assert_equal("blat {\n  baz: hi; }\n", render(<<SASS))
+=foo($bar)
+  baz: $bar
+blat
+  +foo(hi)
+SASS
+    assert_equal("blat {\n  baz: 3; }\n", render(<<SASS))
+=foo($a, $b)
+  baz: $a + $b
+blat
+  +foo(1, 2)
+SASS
+    assert_equal("blat {\n  baz: 4;\n  baz: 3;\n  baz: 5;\n  bang: 3; }\n", render(<<SASS))
+=foo($c: (6 + 4) / 2)
+  baz: $c
+$c: 3
+blat
+  +foo($c + 1)
+  +foo(($c + 3)/2)
+  +foo
+  bang: $c
+SASS
+  end
+
+  def test_default_values_for_mixin_arguments
+    assert_equal(<<CSS, render(<<SASS))
+white {
+  color: #FFF; }
+
+black {
+  color: #000; }
+CSS
+=foo($a: #FFF)
+  color: $a
+white
+  +foo
+black
+  +foo(#000)
+SASS
+    assert_equal(<<CSS, render(<<SASS))
+one {
+  color: #fff;
+  padding: 1px;
+  margin: 4px; }
+
+two {
+  color: #fff;
+  padding: 2px;
+  margin: 5px; }
+
+three {
+  color: #fff;
+  padding: 2px;
+  margin: 3px; }
+CSS
+$a: 5px
+=foo($a, $b: 1px, $c: 3px + $b)
+  color: $a
+  padding: $b
+  margin: $c
+one
+  +foo(#fff)
+two
+  +foo(#fff, 2px)
+three
+  +foo(#fff, 2px, 3px)
+SASS
+    assert_equal(<<CSS, render(<<SASS))
+one {
+  color: #fff;
+  padding: 1px;
+  margin: 4px; }
+
+two {
+  color: #fff;
+  padding: 2px;
+  margin: 5px; }
+
+three {
+  color: #fff;
+  padding: 2px;
+  margin: 3px; }
+CSS
+$a: 5px
+=foo($a, $b: 1px, $c: null)
+  $c: 3px + $b !default
+  color: $a
+  padding: $b
+  margin: $c
+one
+  +foo(#fff)
+two
+  +foo(#fff, 2px)
+three
+  +foo(#fff, 2px, 3px)
+SASS
+  end
+
+  def test_hyphen_underscore_insensitive_mixins
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  b: 12;
+  c: foo; }
+CSS
+=mixin-hyphen
+  b: 12
+
+=mixin_under
+  c: foo
+
+a
+  +mixin_hyphen
+  +mixin-under
+SASS
+  end
+
+  def test_css_identifier_mixin
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  foo: 12; }
+CSS
+=\\{foo\\(12\\)($a)
+  foo: $a
+
+a
+  +\\{foo\\(12\\)(12)
+SASS
+  end
+
+  def test_basic_function
+    assert_equal(<<CSS, render(<<SASS))
+bar {
+  a: 3; }
+CSS
+@function foo()
+  @return 1 + 2
+
+bar
+  a: foo()
+SASS
+  end
+
+  def test_function_args
+    assert_equal(<<CSS, render(<<SASS))
+bar {
+  a: 3; }
+CSS
+@function plus($var1, $var2)
+  @return $var1 + $var2
+
+bar
+  a: plus(1, 2)
+SASS
+  end
+
+  def test_function_arg_default
+    assert_equal(<<CSS, render(<<SASS))
+bar {
+  a: 3; }
+CSS
+@function plus($var1, $var2: 2)
+  @return $var1 + $var2
+
+bar
+  a: plus(1)
+SASS
+  end
+
+  def test_function_arg_keyword
+    assert_equal(<<CSS, render(<<SASS))
+bar {
+  a: 1bar; }
+CSS
+@function plus($var1: 1, $var2: 2)
+  @return $var1 + $var2
+
+bar
+  a: plus($var2: bar)
+SASS
+  end
+
+  def test_function_with_missing_argument
+    render(<<SASS)
+@function plus($var1, $var2)
+  @return $var1 + $var2
+
+bar
+  a: plus($var2: bar)
+SASS
+    flunk("Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal("Function plus is missing argument $var1.", e.message)
+  end
+
+  def test_function_with_extra_argument
+    render(<<SASS)
+@function plus($var1, $var2)
+  @return $var1 + $var2
+
+bar
+  a: plus($var1: foo, $var2: bar, $var3: baz)
+SASS
+    flunk("Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal("Function plus doesn't have an argument named $var3.", e.message)
+  end
+
+  def test_function_with_positional_and_keyword_argument
+    render(<<SASS)
+@function plus($var1, $var2)
+  @return $var1 + $var2
+
+bar
+  a: plus(foo, bar, $var2: baz)
+SASS
+    flunk("Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal("Function plus was passed argument $var2 both by position and by name.", e.message)
+  end
+
+  def test_function_with_keyword_before_positional_argument
+    render(<<SASS)
+@function plus($var1, $var2)
+  @return $var1 + $var2
+
+bar
+  a: plus($var2: foo, bar)
+SASS
+    flunk("Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal("Positional arguments must come before keyword arguments.", e.message)
+  end
+
+  def test_function_with_if
+    assert_equal(<<CSS, render(<<SASS))
+bar {
+  a: foo;
+  b: bar; }
+CSS
+@function my-if($cond, $val1, $val2)
+  @if $cond
+    @return $val1
+  @else
+    @return $val2
+
+bar
+  a: my-if(true, foo, bar)
+  b: my-if(false, foo, bar)
+SASS
+  end
+
+  def test_function_with_var
+    assert_equal(<<CSS, render(<<SASS))
+bar {
+  a: 1; }
+CSS
+@function foo($val1, $val2)
+  $intermediate: $val1 + $val2
+  @return $intermediate/3
+
+bar
+  a: foo(1, 2)
+SASS
+  end
+
+  def test_user_defined_function_variable_scope
+    render(<<SASS)
+bar
+  -no-op: set-a-variable(variable, 5)
+  a: $variable
+SASS
+    flunk("Exception not raised for test_user_defined_function_variable_scope")
+  rescue Sass::SyntaxError => e
+    assert_equal('Undefined variable: "$variable".', e.message)
+  end
+
+  def test_user_defined_function_can_change_global_variable
+    assert_equal(<<CSS, render(<<SASS))
+bar {
+  a: 5; }
+CSS
+$variable: 0
+bar
+  $local: 10
+  -no-op: set-a-global-variable(variable, 5)
+  a: $variable
+SASS
+  end
+
+  def test_user_defined_function_cannot_read_local_variable
+    assert_equal(<<CSS, render(<<SASS))
+bar {
+  global: 0;
+  local: undefined; }
+CSS
+$global: 0
+bar
+  $local: 10
+  global: get-a-variable(global)
+  local: get-a-variable(local)
+SASS
+  end
+
+  def test_control_directive_in_nested_property
+    assert_equal(<<CSS, render(<<SASS))
+foo {
+  a-b: c; }
+CSS
+foo
+  a:
+    @if true
+      b: c
+SASS
+  end
+
+  def test_interpolation
+    assert_equal("a-1 {\n  b-2-3: c-3; }\n", render(<<SASS))
+$a: 1
+$b: 2
+$c: 3
+a-\#{$a}
+  b-\#{$b}-\#{$c}: c-\#{$a + $b}
+SASS
+  end
+
+  def test_complex_property_interpolation
+    assert_equal(<<CSS, render(<<SASS))
+a-1 {
+  b-2 3-fizzap18: c-3; }
+CSS
+$a: 1
+$b: 2
+$c: 3
+a-\#{$a}
+  b-\#{$b $c}-\#{fizzap + ($c + 15)}: c-\#{$a + $b}
+SASS
+  end
+
+  def test_if_directive
+    assert_equal("a {\n  b: 1; }\n", render(<<SASS))
+$var: true
+a
+  @if $var
+    b: 1
+  @if not $var
+    b: 2
+SASS
+
+    assert_equal("a {\n  b: 2; }\n", render(<<SASS))
+$var: null
+a
+  @if $var
+    b: 1
+  @if not $var
+    b: 2
+SASS
+  end
+
+  def test_for
+    assert_equal(<<CSS, render(<<SASS))
+a-0 {
+  two-i: 0; }
+
+a-1 {
+  two-i: 2; }
+
+a-2 {
+  two-i: 4; }
+
+a-3 {
+  two-i: 6; }
+
+b-1 {
+  j-1: 0; }
+
+b-2 {
+  j-1: 1; }
+
+b-3 {
+  j-1: 2; }
+
+b-4 {
+  j-1: 3; }
+CSS
+$a: 3
+@for $i from 0 to $a + 1
+  a-\#{$i}
+    two-i: 2 * $i
+
+@for $j from 1 through 4
+  b-\#{$j}
+    j-1: $j - 1
+SASS
+  end
+
+  def test_while
+    assert_equal(<<CSS, render(<<SASS))
+a-5 {
+  blooble: gloop; }
+
+a-4 {
+  blooble: gloop; }
+
+a-3 {
+  blooble: gloop; }
+
+a-2 {
+  blooble: gloop; }
+
+a-1 {
+  blooble: gloop; }
+CSS
+$a: 5
+@while $a != 0
+  a-\#{$a}
+    blooble: gloop
+  $a: $a - 1 !global
+SASS
+  end
+
+  def test_else
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  t1: t;
+  t2: t;
+  t3: t;
+  t4: t; }
+CSS
+a
+  @if true
+    t1: t
+  @else
+    f1: f
+
+  @if false
+    f2: f
+  @else
+    t2: t
+
+  @if false
+    f3: f1
+  @else if 1 + 1 == 3
+    f3: f2
+  @else
+    t3: t
+
+  @if false
+    f4: f1
+  @else if 1 + 1 == 2
+    t4: t
+  @else
+    f4: f2
+
+  @if false
+    f5: f1
+  @else if false
+    f5: f2
+SASS
+  end
+
+  def test_each
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  b: 1px;
+  b: 2px;
+  b: 3px;
+  b: 4px;
+  c: foo;
+  c: bar;
+  c: baz;
+  c: bang;
+  d: blue; }
+CSS
+a
+  @each $number in 1px 2px 3px 4px
+    b: $number
+  @each $str in foo, bar, baz, bang
+    c: $str
+  @each $single in blue
+    d: $single
+SASS
+  end
+
+  def test_destructuring_each
+    assert_equal <<CSS, render(<<SCSS)
+a {
+  foo: 1px;
+  bar: 2px;
+  baz: 3px; }
+
+c {
+  foo: "Value is bar";
+  bar: "Value is baz";
+  bang: "Value is "; }
+CSS
+a
+  @each $name, $number in (foo: 1px, bar: 2px, baz: 3px)
+    \#{$name}: $number
+c
+  @each $key, $value in (foo bar) (bar, baz) bang
+    \#{$key}: "Value is \#{$value}"
+SCSS
+  end
+
+  def test_variable_reassignment
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  b: 1;
+  c: 2; }
+CSS
+a
+  $a: 1
+  b: $a
+  $a: 2
+  c: $a
+SASS
+  end
+
+  def test_hyphen_underscore_insensitive_variables
+    assert_equal(<<CSS, render(<<SASS))
+d {
+  e: 13;
+  f: foobar; }
+CSS
+$var-hyphen: 12
+$var_under: foo
+
+$var_hyphen: 1 + $var_hyphen
+$var-under: $var-under + bar
+
+d
+  e: $var-hyphen
+  f: $var_under
+SASS
+  end
+
+  def test_css_identifier_variable
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  b: 12; }
+CSS
+$\\{foo\\(12\\): 12
+
+a
+  b: $\\{foo\\(12\\)
+SASS
+  end
+
+  def test_important
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  b: 12px !important; }
+CSS
+$foo: 12px
+a
+  b: $foo !important
+SASS
+  end
+
+  def test_argument_error
+    assert_raises(Sass::SyntaxError) { render("a\n  b: hsl(1)") }
+  end
+
+  def test_comments_at_the_top_of_a_document
+    render(<<SASS)
+//
+  This is a comment that
+  continues to the second line.
+foo
+  bar: baz
+SASS
+  end
+
+  def test_loud_comments_containing_a_comment_close
+    actual_css = render(<<SASS)
+/*
+  This is a comment that
+  continues to the second line. */
+foo
+  bar: baz
+SASS
+assert_equal(<<CSS, actual_css)
+/* This is a comment that
+ * continues to the second line. */
+foo {
+  bar: baz; }
+CSS
+  end
+
+  def test_loud_comments_with_starred_lines
+    assert_equal(<<CSS, render(<<SASS))
+/* This is a comment that
+ * continues to the second line.
+ * And even to the third! */
+CSS
+/* This is a comment that
+ * continues to the second line.
+ * And even to the third!
+SASS
+  end
+
+  def test_loud_comments_with_no_space_after_starred_lines
+    assert_equal(<<CSS, render(<<SASS))
+/*bip bop
+ *beep boop
+ *bap blimp */
+CSS
+/*bip bop
+ *beep boop
+ *bap blimp
+SASS
+  end
+
+  def test_comment_indentation_at_beginning_of_doc
+    assert_equal <<CSS, render(<<SASS)
+/* foo
+ * bar
+ *   baz */
+foo {
+  a: b; }
+CSS
+/* foo
+   bar
+     baz
+foo
+  a: b
+SASS
+  end
+
+  def test_unusual_comment_indentation
+    assert_equal <<CSS, render(<<SASS)
+foo {
+  /* foo
+   * bar
+   *   baz */ }
+CSS
+foo
+  /* foo
+     bar
+       baz
+SASS
+  end
+
+  def test_loud_comment_with_close
+    assert_equal <<CSS, render(<<SASS)
+foo {
+  /* foo
+   * bar */ }
+CSS
+foo
+  /* foo
+     bar */
+SASS
+  end
+
+  def test_loud_comment_with_separate_line_close
+    assert_equal <<CSS, render(<<SASS)
+foo {
+  /* foo
+   * bar
+   */ }
+CSS
+foo
+  /* foo
+   * bar
+   */
+SASS
+  end
+
+  def test_loud_comment_in_compressed_mode
+    assert_equal <<CSS, render(<<SASS, :style => :compressed)
+foo{color:blue;/*! foo
+ * bar
+ */}
+CSS
+foo
+  color: blue
+  /*! foo
+   * bar
+   */
+SASS
+  end
+
+  def test_loud_comment_is_evaluated
+    assert_equal <<CSS, render(<<SASS)
+/*! Hue: 327.2164948454deg */
+CSS
+/*! Hue: \#{hue(#f836a0)}
+SASS
+  end
+
+  def test_attribute_selector_with_spaces
+    assert_equal(<<CSS, render(<<SASS))
+a b[foo=bar] {
+  c: d; }
+CSS
+a
+  b[foo = bar]
+    c: d
+SASS
+  end
+
+  def test_quoted_colon
+    assert_equal(<<CSS, render(<<SASS))
+a b[foo="bar: baz"] {
+  c: d; }
+CSS
+a
+  b[foo="bar: baz"]
+    c: d
+SASS
+  end
+
+  def test_quoted_comma
+    assert_equal(<<CSS, render(<<SASS))
+a b[foo="bar, baz"] {
+  c: d; }
+CSS
+a
+  b[foo="bar, baz"]
+    c: d
+SASS
+  end
+
+  def test_quoted_ampersand
+    assert_equal(<<CSS, render(<<SASS))
+a b[foo="bar & baz"] {
+  c: d; }
+CSS
+a
+  b[foo="bar & baz"]
+    c: d
+SASS
+  end
+
+  def test_empty_selector_warning
+    assert_warning(<<END) {render("foo bar")}
+WARNING on line 1 of test_empty_selector_warning_inline.sass:
+This selector doesn't have any properties and will not be rendered.
+END
+  end
+
+  def test_nonprinting_empty_property
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  c: "";
+  e: f; }
+CSS
+$null-value: null
+$empty-string: ''
+$empty-list: (null)
+a
+  b: $null-value
+  c: $empty-string
+  d: $empty-list
+  e: f
+
+g
+  h: null
+SASS
+  end
+
+  def test_root_level_pseudo_class_with_new_properties
+    assert_equal(<<CSS, render(<<SASS, :property_syntax => :new))
+:focus {
+  outline: 0; }
+CSS
+:focus
+  outline: 0
+SASS
+  end
+
+  def test_pseudo_class_with_new_properties
+    assert_equal(<<CSS, render(<<SASS, :property_syntax => :new))
+p :focus {
+  outline: 0; }
+CSS
+p
+  :focus
+    outline: 0
+SASS
+  end
+
+  def test_nil_option
+    assert_equal(<<CSS, render(<<SASS, :format => nil))
+foo {
+  a: b; }
+CSS
+foo
+  a: b
+SASS
+  end
+
+  def test_interpolation_in_raw_functions
+    assert_equal(<<CSS, render(<<SASS))
+foo {
+  filter: progid:Microsoft.foo.bar.Baz(flip=foobar, bang=#00ff00cc); }
+CSS
+foo
+  filter: progid:Microsoft.foo.bar.Baz(flip=\#{foo + bar}, bang=#00ff00cc)
+SASS
+  end
+
+  # SassScript string behavior
+
+  def test_plus_preserves_quotedness
+    assert_equal(<<CSS, render(<<SASS))
+foo {
+  a: "foo1";
+  b: "1foo";
+  c: foo1;
+  d: 1foo;
+  e: "foobar";
+  f: foobar; }
+CSS
+foo
+  a: "foo" + 1
+  b: 1 + "foo"
+  c: foo + 1
+  d: 1 + foo
+  e: "foo" + bar
+  f: foo + "bar"
+SASS
+  end
+
+  def test_colon_properties_preserve_quotedness
+    assert_equal(<<CSS, render(<<SASS))
+foo {
+  a: "foo";
+  b: bar;
+  c: "foo" bar;
+  d: foo, "bar"; }
+CSS
+foo
+  a: "foo"
+  b: bar
+  c: "foo" bar
+  d: foo, "bar"
+SASS
+  end
+
+  def test_colon_variables_preserve_quotedness
+    assert_equal(<<CSS, render(<<SASS))
+foo {
+  a: "foo";
+  b: bar; }
+CSS
+$a: "foo"
+$b: bar
+
+foo
+  a: $a
+  b: $b
+SASS
+  end
+
+  def test_colon_args_preserve_quotedness
+    assert_equal(<<CSS, render(<<SASS))
+foo {
+  a: "foo";
+  b: bar;
+  c: "foo" bar;
+  d: foo, "bar"; }
+CSS
+=foo($a: "foo", $b: bar, $c: "foo" bar, $d: (foo, "bar"))
+  foo
+    a: $a
+    b: $b
+    c: $c
+    d: $d
+
++foo
+SASS
+  end
+
+  def test_interpolation_unquotes_strings
+    assert_equal(<<CSS, render(<<SASS))
+.foo-bar {
+  a: b; }
+CSS
+.foo-\#{"bar"}
+  a: b
+SASS
+
+    assert_equal(<<CSS, render(<<SASS))
+.foo {
+  a: b c; }
+CSS
+.foo
+  a: b \#{"c"}
+SASS
+  end
+
+  def test_interpolation_unquotes_strings_in_vars
+    assert_equal(<<CSS, render(<<SASS))
+.foo-bar {
+  a: b; }
+CSS
+$var: "bar"
+
+.foo-\#{$var}
+  a: b
+SASS
+  end
+
+  def test_interpolation_deep_unquotes_strings
+    assert_equal(<<CSS, render(<<SASS))
+.foo {
+  a: bar baz; }
+CSS
+.foo
+  a: \#{"bar" "baz"}
+SASS
+  end
+
+  def test_warn_directive
+  expected_warning = <<EXPECTATION
+WARNING: this is a warning
+         on line 4 of test_warn_directive_inline.sass
+
+WARNING: this is a mixin warning
+         on line 2 of test_warn_directive_inline.sass, in `foo'
+         from line 7 of test_warn_directive_inline.sass
+EXPECTATION
+    assert_warning expected_warning do
+      assert_equal <<CSS, render(<<SASS)
+bar {
+  c: d; }
+CSS
+=foo
+  @warn "this is a mixin warning"
+
+@warn "this is a warning"
+bar
+  c: d
+  +foo
+SASS
+    end
+  end
+
+  def test_warn_directive_when_quiet
+    assert_warning "" do
+      assert_equal <<CSS, render(<<SASS, :quiet => true)
+CSS
+@warn "this is a warning"
+SASS
+    end
+  end
+
+  def test_warn_with_imports
+    prefix = Sass::Util.cleanpath(File.dirname(__FILE__)).to_s
+    expected_warning = <<WARN
+WARNING: In the main file
+         on line 1 of #{prefix}/templates/warn.sass
+
+WARNING: Imported
+         on line 1 of #{prefix}/templates/warn_imported.sass
+         from line 2 of #{prefix}/templates/warn.sass
+
+WARNING: In an imported mixin
+         on line 4 of #{prefix}/templates/warn_imported.sass, in `emits-a-warning'
+         from line 3 of #{prefix}/templates/warn.sass
+WARN
+    assert_warning expected_warning do
+      renders_correctly "warn", :style => :compact, :load_paths => ["#{prefix}/templates"]
+    end
+  end
+
+  def test_media_bubbling
+    assert_equal <<CSS, render(<<SASS)
+.foo {
+  a: b; }
+  @media bar {
+    .foo {
+      c: d; } }
+  .foo .baz {
+    e: f; }
+    @media bip {
+      .foo .baz {
+        g: h; } }
+
+.other {
+  i: j; }
+CSS
+.foo
+  a: b
+  @media bar
+    c: d
+  .baz
+    e: f
+    @media bip
+      g: h
+
+.other
+  i: j
+SASS
+
+    assert_equal <<CSS, render(<<SASS, :style => :compact)
+.foo { a: b; }
+@media bar { .foo { c: d; } }
+.foo .baz { e: f; }
+@media bip { .foo .baz { g: h; } }
+
+.other { i: j; }
+CSS
+.foo
+  a: b
+  @media bar
+    c: d
+  .baz
+    e: f
+    @media bip
+      g: h
+
+.other
+  i: j
+SASS
+
+    assert_equal <<CSS, render(<<SASS, :style => :expanded)
+.foo {
+  a: b;
+}
+@media bar {
+  .foo {
+    c: d;
+  }
+}
+.foo .baz {
+  e: f;
+}
+@media bip {
+  .foo .baz {
+    g: h;
+  }
+}
+
+.other {
+  i: j;
+}
+CSS
+.foo
+  a: b
+  @media bar
+    c: d
+  .baz
+    e: f
+    @media bip
+      g: h
+
+.other
+  i: j
+SASS
+  end
+
+  def test_double_media_bubbling
+    assert_equal <<CSS, render(<<SASS)
+@media bar and (a: b) {
+  .foo {
+    c: d; } }
+CSS
+@media bar
+  @media (a: b)
+    .foo
+      c: d
+SASS
+
+    assert_equal <<CSS, render(<<SASS)
+@media bar {
+  .foo {
+    a: b; } }
+  @media bar and (a: b) {
+    .foo {
+      c: d; } }
+CSS
+.foo
+  @media bar
+    a: b
+    @media (a: b)
+      c: d
+SASS
+  end
+
+  def test_double_media_bubbling_with_commas
+    assert_equal <<CSS, render(<<SASS)
+@media (a: b) and (e: f), (c: d) and (e: f), (a: b) and (g: h), (c: d) and (g: h) {
+  .foo {
+    c: d; } }
+CSS
+@media (a: b), (c: d)
+  @media (e: f), (g: h)
+    .foo
+      c: d
+SASS
+  end
+
+  def test_double_media_bubbling_with_surrounding_rules
+    assert_equal <<CSS, render(<<SASS)
+@media (min-width: 0) {
+  a {
+    a: a; }
+
+  b {
+    before: b;
+    after: b; } }
+  @media (min-width: 0) and (max-width: 5000px) {
+    b {
+      x: x; } }
+
+@media (min-width: 0) {
+  c {
+    c: c; } }
+CSS
+@media (min-width: 0)
+  a
+    a: a
+  b
+    before: b
+    @media (max-width: 5000px)
+      x: x
+    after: b
+  c
+    c: c
+SASS
+  end
+
+  def test_rule_media_rule_bubbling
+    assert_equal <<CSS, render(<<SASS)
+@media bar {
+  .foo {
+    a: b;
+    e: f; }
+    .foo .baz {
+      c: d; } }
+CSS
+.foo
+  @media bar
+    a: b
+    .baz
+      c: d
+    e: f
+SASS
+  end
+
+  def test_nested_media_around_properties
+    assert_equal <<CSS, render(<<SASS)
+.outside {
+  color: red;
+  background: blue; }
+  @media print {
+    .outside {
+      color: black; } }
+  @media print and (a: b) {
+    .outside .inside {
+      border: 1px solid black; } }
+
+  .outside .middle {
+    display: block; }
+CSS
+.outside
+  color: red
+  @media print
+    color: black
+    .inside
+      @media (a: b)
+        border: 1px solid black
+  background: blue
+  .middle
+    display: block
+SASS
+  end
+
+  def test_media_with_parent_references
+    sass_str = <<SASS
+.outside
+  @media print
+    &.inside
+      border: 1px solid black
+SASS
+    css_str = <<CSS
+@media print {
+  .outside.inside {
+    border: 1px solid black; } }
+CSS
+    assert_equal css_str, render(sass_str)
+  end
+
+  def test_eliminated_media_bubbling
+    assert_equal <<CSS, render(<<SASS)
+@media screen {
+  a: b; }
+CSS
+@media screen
+  a: b
+  @media print
+    c: d
+SASS
+
+    assert_equal <<CSS, render(<<SASS)
+@media not print {
+  a: b; }
+CSS
+@media not print
+  a: b
+  @media print
+    c: d
+SASS
+
+    assert_equal <<CSS, render(<<SASS)
+@media not print {
+  a: b; }
+CSS
+@media not print
+  a: b
+  @media not screen
+    c: d
+SASS
+  end
+
+  def test_non_eliminated_media_bubbling
+    assert_equal <<CSS, render(<<SASS)
+@media screen {
+  a: b; }
+@media screen and (a: b) {
+  c: d; }
+CSS
+@media screen
+  a: b
+  @media screen and (a: b)
+    c: d
+SASS
+
+    assert_equal <<CSS, render(<<SASS)
+@media not print {
+  a: b; }
+@media screen {
+  c: d; }
+CSS
+@media not print
+  a: b
+  @media screen
+    c: d
+SASS
+
+    assert_equal <<CSS, render(<<SASS)
+@media only screen {
+  a: b; }
+@media only screen and (a: b) {
+  c: d; }
+CSS
+@media only screen
+  a: b
+  @media screen and (a: b)
+    c: d
+SASS
+  end
+
+  def test_directive_interpolation
+    assert_equal <<CSS, render(<<SASS)
+@foo bar12 qux {
+  a: b; }
+CSS
+$baz: 12
+@foo bar\#{$baz} qux
+  a: b
+SASS
+  end
+
+  def test_media_interpolation
+    assert_equal <<CSS, render(<<SASS)
+@media bar12 {
+  a: b; }
+CSS
+$baz: 12
+@media bar\#{$baz}
+  a: b
+SASS
+  end
+
+  def test_variables_in_media
+    assert_equal <<CSS, render(<<SASS)
+@media screen and (-webkit-min-device-pixel-ratio-foo: 25), only print {
+  a: b; }
+CSS
+$media1: screen
+$media2: print
+$var: -webkit-min-device-pixel-ratio
+$val: 20
+@media \#{$media1} and ($var + "-foo": $val + 5), only \#{$media2}
+  a: b
+SASS
+  end
+
+  def test_at_root
+    assert_equal <<CSS, render(<<SASS)
+.bar {
+  a: b; }
+CSS
+.foo
+  @at-root
+    .bar
+      a: b
+SASS
+  end
+
+  def test_at_root_with_selector
+    assert_equal <<CSS, render(<<SASS)
+.bar {
+  a: b; }
+CSS
+.foo
+  @at-root .bar
+    a: b
+SASS
+  end
+
+  def test_at_root_with_query
+    assert_equal <<CSS, render(<<SASS)
+.foo .bar {
+  a: b; }
+CSS
+.foo
+  @media screen
+    @at-root (without: media)
+      .bar
+        a: b
+SASS
+  end
+
+  def test_variable_assignment_with_global
+    assert_no_warning {assert_equal(<<CSS, render(<<SASS))}
+.foo {
+  a: x; }
+
+.bar {
+  b: x; }
+CSS
+$var: 1
+
+.foo
+  $var: x !global
+  a: $var
+
+.bar
+  b: $var
+SASS
+  end
+
+  # Regression tests
+
+  def test_interpolation_in_multiline_selector
+    assert_equal(<<CSS, render(<<SASS))
+.foo,
+.bar {
+  a: b; }
+CSS
+.foo,
+\#{".bar"}
+  a: b
+SASS
+  end
+
+  def test_list_separator_with_arg_list
+    assert_equal(<<CSS, render(<<SASS))
+.test {
+  separator: comma; }
+CSS
+@mixin arglist-test($args...)
+  separator: list-separator($args)
+
+.test
+  @include arglist-test(this, is, comma, separated)
+SASS
+  end
+
+  def test_parent_mixin_in_content_nested
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  b: c; }
+CSS
+=foo
+  @content
+
+=bar
+  +foo
+    +foo
+      a
+        b: c
+
++bar
+SASS
+  end
+
+  def test_supports_bubbles
+    assert_equal <<CSS, render(<<SASS)
+parent {
+  background: orange; }
+  @supports (perspective: 10px) or (-moz-perspective: 10px) {
+    parent child {
+      background: blue; } }
+CSS
+parent
+  background: orange
+  @supports (perspective: 10px) or (-moz-perspective: 10px)
+    child
+      background: blue
+SASS
+  end
+
+  def test_line_numbers_with_dos_line_endings
+    assert_equal <<CSS, render(<<SASS, :line_comments => true)
+/* line 5, test_line_numbers_with_dos_line_endings_inline.sass */
+.foo {
+  a: b; }
+CSS
+\r
+\r
+\r
+\r
+.foo
+  a: b
+SASS
+  end
+
+  def test_variable_in_media_in_mixin
+    assert_equal <<CSS, render(<<SASS)
+@media screen and (min-width: 10px) {
+  body {
+    background: red; } }
+@media screen and (min-width: 20px) {
+  body {
+    background: blue; } }
+CSS
+@mixin respond-to($width)
+  @media screen and (min-width: $width)
+    @content
+
+body
+  @include respond-to(10px)
+    background: red
+  @include respond-to(20px)
+    background: blue
+SASS
+  end
+
+  def test_interpolated_comment_in_mixin
+    assert_equal <<CSS, render(<<SASS)
+/*! color: red */
+.foo {
+  color: red; }
+
+/*! color: blue */
+.foo {
+  color: blue; }
+
+/*! color: green */
+.foo {
+  color: green; }
+CSS
+=foo($var)
+  /*! color: \#{$var}
+  .foo
+    color: $var
+
++foo(red)
++foo(blue)
++foo(green)
+SASS
+  end
+
+  def test_parens_in_mixins
+    assert_equal(<<CSS, render(<<SASS))
+.foo {
+  color: #01ff7f;
+  background-color: #000102; }
+CSS
+=foo($c1, $c2: rgb(0, 1, 2))
+  color: $c1
+  background-color: $c2
+
+.foo
+  +foo(rgb(1,255,127))
+SASS
+  end
+
+  def test_comment_beneath_prop
+    assert_equal(<<RESULT, render(<<SOURCE))
+.box {
+  border-style: solid; }
+RESULT
+.box
+  border:
+    //color: black
+    style: solid
+SOURCE
+
+    assert_equal(<<RESULT, render(<<SOURCE))
+.box {
+  /* color: black */
+  border-style: solid; }
+RESULT
+.box
+  border:
+    /* color: black
+    style: solid
+SOURCE
+
+    assert_equal(<<RESULT, render(<<SOURCE, :style => :compressed))
+.box{border-style:solid}
+RESULT
+.box
+  border:
+    /*color: black
+    style: solid
+SOURCE
+  end
+
+  def test_compressed_comment_beneath_directive
+    assert_equal(<<RESULT, render(<<SOURCE, :style => :compressed))
+@foo{a:b}
+RESULT
+@foo
+  a: b
+  /*b: c
+SOURCE
+  end
+
+  def test_comment_with_crazy_indentation
+    assert_equal(<<CSS, render(<<SASS))
+/* This is a loud comment:
+ *          Where the indentation is wonky. */
+.comment {
+  width: 1px; }
+CSS
+/*
+  This is a loud comment:
+           Where the indentation is wonky.
+//
+  This is a silent comment:
+           Where the indentation is wonky.
+.comment
+  width: 1px
+SASS
+  end
+
+  def test_plus_with_space
+    assert_equal(<<CSS, render(<<SASS))
+a + b {
+  color: green; }
+CSS
+a
+  + b
+    color: green
+SASS
+  end
+
+  def test_empty_line_comment
+    assert_equal(<<CSS, render(<<SASS))
+/* Foo
+ *
+ * Bar */
+CSS
+/*
+  Foo
+
+  Bar
+SASS
+  end
+
+  def test_empty_comment
+    assert_equal(<<CSS, render(<<SASS))
+/* */
+a {
+  /* */
+  b: c; }
+CSS
+/*
+a
+  /*
+  b: c
+SASS
+  end
+
+  def test_options_available_in_environment
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  b: nested; }
+CSS
+a
+  b: option("style")
+SASS
+  end
+
+  def test_import_with_commas_in_url
+    assert_equal <<CSS, render(<<SASS)
+@import url(foo.css?bar,baz);
+CSS
+@import url(foo.css?bar,baz)
+SASS
+  end
+
+  def test_silent_comment_in_prop_val_after_important
+    assert_equal(<<CSS, render(<<SASS))
+.advanced {
+  display: none !important; }
+CSS
+.advanced
+  display: none !important // yeah, yeah. it's not really a style anyway.
+SASS
+  end
+
+  def test_mixin_with_keyword_args
+    assert_equal <<CSS, render(<<SASS)
+.mixed {
+  required: foo;
+  arg1: default-val1;
+  arg2: non-default-val2; }
+CSS
+=a-mixin($required, $arg1: default-val1, $arg2: default-val2)
+  required: $required
+  arg1: $arg1
+  arg2: $arg2
+.mixed
+  +a-mixin(foo, $arg2: non-default-val2)
+SASS
+  end
+
+  def test_mixin_with_keyword_arg_variable_value
+    assert_equal <<CSS, render(<<SASS)
+.mixed {
+  required: foo;
+  arg1: default-val1;
+  arg2: a-value; }
+CSS
+=a-mixin($required, $arg1: default-val1, $arg2: default-val2)
+  required: $required
+  arg1: $arg1
+  arg2: $arg2
+.mixed
+  $a-value: a-value
+  +a-mixin(foo, $arg2: $a-value)
+SASS
+  end
+
+  def test_mixin_keyword_args_handle_variable_underscore_dash_equivalence
+    assert_equal <<CSS, render(<<SASS)
+.mixed {
+  required: foo;
+  arg1: non-default-val1;
+  arg2: non-default-val2; }
+CSS
+=a-mixin($required, $arg-1: default-val1, $arg_2: default-val2)
+  required: $required
+  arg1: $arg_1
+  arg2: $arg-2
+.mixed
+  +a-mixin(foo, $arg-2: non-default-val2, $arg_1: non-default-val1)
+SASS
+  end
+
+  def test_passing_required_args_as_a_keyword_arg
+    assert_equal <<CSS, render(<<SASS)
+.mixed {
+  required: foo;
+  arg1: default-val1;
+  arg2: default-val2; }
+CSS
+=a-mixin($required, $arg1: default-val1, $arg2: default-val2)
+  required: $required
+  arg1: $arg1
+  arg2: $arg2
+.mixed
+  +a-mixin($required: foo)
+SASS
+  end
+
+  def test_passing_all_as_keyword_args_in_opposite_order
+    assert_equal <<CSS, render(<<SASS)
+.mixed {
+  required: foo;
+  arg1: non-default-val1;
+  arg2: non-default-val2; }
+CSS
+=a-mixin($required, $arg1: default-val1, $arg2: default-val2)
+  required: $required
+  arg1: $arg1
+  arg2: $arg2
+.mixed
+  +a-mixin($arg2: non-default-val2, $arg1: non-default-val1, $required: foo)
+SASS
+  end
+
+  def test_function_output_with_comma
+    assert_equal <<CSS, render(<<SASS)
+foo {
+  a: b(c), d(e); }
+CSS
+foo
+  a: b(c), d(e)
+SASS
+  end
+
+  def test_interpolation_with_comma
+    assert_equal <<CSS, render(<<SASS)
+foo {
+  a: foo, bar; }
+CSS
+$foo: foo
+foo
+  a: \#{$foo}, bar
+SASS
+  end
+
+  def test_string_interpolation_with_comma
+    assert_equal <<CSS, render(<<SASS)
+foo {
+  a: "bip foo bap", bar; }
+CSS
+$foo: foo
+foo
+  a: "bip \#{$foo} bap", bar
+SASS
+  end
+
+  def test_unknown_directive
+    assert_equal <<CSS, render(<<SASS)
+@baz {
+  c: d; }
+CSS
+@baz
+  c: d
+SASS
+  end
+
+  def test_loud_comment_interpolations_can_be_escaped
+    assert_equal <<CSS, render(<<SASS)
+/* \#{foo} */
+CSS
+/* \\\#{foo}
+SASS
+    assert_equal <<CSS, render(<<SASS)
+/*! \#{foo} */
+CSS
+/*! \\\#{foo}
+SASS
+  end
+
+  def test_selector_compression
+    assert_equal <<CSS, render(<<SASS, :style => :compressed)
+a>b,c+d,:-moz-any(e,f,g){h:i}
+CSS
+a > b, c + d, :-moz-any(e, f, g)
+  h: i
+SASS
+  end
+
+  def test_comment_like_selector
+    assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "/": expected identifier, was " foo"') {render(<<SASS)}
+/ foo
+  a: b
+SASS
+  end
+
+  def test_nested_empty_directive
+    assert_equal <<CSS, render(<<SASS)
+@media screen {
+  .foo {
+    a: b; }
+
+  @unknown-directive; }
+CSS
+@media screen
+  .foo
+    a: b
+
+  @unknown-directive
+SASS
+  end
+
+  def test_original_filename_set
+    importer = MockImporter.new
+    importer.add_import("imported", "div{color:red}")
+
+    original_filename = filename_for_test
+    engine = Sass::Engine.new('@import "imported"; div{color:blue}',
+      :filename => original_filename, :load_paths => [importer], :syntax => :scss, :importer => importer)
+    engine.render
+
+    assert_equal original_filename, engine.options[:original_filename]
+    assert_equal original_filename, importer.engine("imported").options[:original_filename]
+  end
+
+  def test_changing_precision
+    old_precision = Sass::Script::Value::Number.precision
+    begin
+      Sass::Script::Value::Number.precision = 8
+      assert_equal <<CSS, render(<<SASS)
+div {
+  maximum: 1.00000001;
+  too-much: 1; }
+CSS
+div
+  maximum : 1.00000001
+  too-much: 1.000000001
+SASS
+    ensure
+      Sass::Script::Value::Number.precision = old_precision
+    end
+  end
+
+  def test_content
+    assert_equal <<CSS, render(<<SASS)
+.children {
+  background-color: red;
+  color: blue;
+  border-color: red; }
+CSS
+$color: blue
+=context($class, $color: red)
+  .\#{$class}
+    background-color: $color
+    @content
+    border-color: $color
++context(children)
+  color: $color
+SASS
+  end
+
+  def test_selector_in_content
+    assert_equal <<CSS, render(<<SASS)
+.parent {
+  background-color: red;
+  border-color: red; }
+  .parent .children {
+    color: blue; }
+CSS
+$color: blue
+=context($class, $color: red)
+  .\#{$class}
+    background-color: $color
+    @content
+    border-color: $color
++context(parent)
+  .children
+    color: $color
+SASS
+  end
+
+  def test_using_parent_mixin_in_content
+    assert_equal <<CSS, render(<<SASS)
+.parent {
+  before-color: red;
+  after-color: red; }
+  .parent .sibling {
+    before-color: yellow;
+    after-color: yellow; }
+    .parent .sibling .child {
+      before-color: green;
+      color: blue;
+      after-color: green; }
+CSS
+$color: blue
+=context($class, $color: red)
+  .\#{$class}
+    before-color: $color
+    @content
+    after-color: $color
++context(parent)
+  +context(sibling, $color: yellow)
+    +context(child, $color: green)
+      color: $color
+SASS
+  end
+
+  def test_content_more_than_once
+    assert_equal <<CSS, render(<<SASS)
+.once {
+  color: blue; }
+
+.twice {
+  color: blue; }
+CSS
+$color: blue
+=context($class, $color: red)
+  .once
+    @content
+  .twice
+    @content
++context(parent)
+  color: $color
+SASS
+  end
+
+  def test_content_with_variable
+    assert_equal <<CSS, render(<<SASS)
+.foo {
+  a: 1px; }
+CSS
+=foo
+  .foo
+    @content
++foo
+  $a: 1px
+  a: $a
+SASS
+  end
+
+  def test_nested_content_blocks
+    assert_equal <<CSS, render(<<SASS)
+.foo {
+  a: foo; }
+  .foo .bar {
+    a: bar; }
+    .foo .bar .baz {
+      a: baz; }
+      .foo .bar .baz .outside {
+        a: outside;
+        color: red; }
+CSS
+$a: outside
+=baz($a: baz)
+  .baz
+    a: $a
+    @content
+=bar($a: bar)
+  .bar
+    a: $a
+    +baz
+      @content
+=foo($a: foo)
+  .foo
+    a: $a
+    +bar
+      @content
++foo
+  .outside
+    a: $a
+    color: red
+SASS
+  end
+
+  def test_content_not_seen_through_mixin
+    assert_equal <<CSS, render(<<SASS)
+a foo {
+  mixin: foo;
+  a: b; }
+  a foo bar {
+    mixin: bar; }
+CSS
+=foo
+  foo
+    mixin: foo
+    @content
+    +bar
+=bar
+  bar
+    mixin: bar
+    @content
+a
+  +foo
+    a: b
+SASS
+  end
+
+  def test_content_backtrace_for_perform
+    render(<<SASS)
+=foo
+  @content
+
+a
+  +foo
+    b: 1em + 2px
+SASS
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal([
+        {:mixin => '@content', :line => 6, :filename => 'test_content_backtrace_for_perform_inline.sass'},
+        {:mixin => 'foo', :line => 2, :filename => 'test_content_backtrace_for_perform_inline.sass'},
+        {:line => 5, :filename => 'test_content_backtrace_for_perform_inline.sass'},
+      ], e.sass_backtrace)
+  end
+
+  def test_content_backtrace_for_cssize
+    render(<<SASS)
+=foo
+  @content
+
+a
+  +foo
+    @extend foo bar baz
+SASS
+    assert(false, "Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal([
+        {:mixin => '@content', :line => 6, :filename => 'test_content_backtrace_for_cssize_inline.sass'},
+        {:mixin => 'foo', :line => 2, :filename => 'test_content_backtrace_for_cssize_inline.sass'},
+        {:line => 5, :filename => 'test_content_backtrace_for_cssize_inline.sass'},
+      ], e.sass_backtrace)
+  end
+
+  def test_mixin_with_args_and_varargs_passed_no_var_args
+    assert_equal <<CSS, render(<<SASS, :syntax => :scss)
+.foo {
+  a: 1;
+  b: 2;
+  c: 3; }
+CSS
+@mixin three-or-more-args($a, $b, $c, $rest...) {
+  a: $a;
+  b: $b;
+  c: $c;
+}
+
+.foo {
+  @include three-or-more-args($a: 1, $b: 2, $c: 3);
+}
+SASS
+
+  end
+
+  def test_debug_inspects_sass_objects
+    assert_warning(<<END) {render("@debug (a: 1, b: 2)")}
+test_debug_inspects_sass_objects_inline.sass:1 DEBUG: (a: 1, b: 2)
+END
+    assert_warning(<<END) {render("$map: (a: 1, b: 2); @debug $map", :syntax => :scss)}
+test_debug_inspects_sass_objects_inline.scss:1 DEBUG: (a: 1, b: 2)
+END
+  end
+
+  def test_error_throws_sass_objects
+    assert_raise_message(Sass::SyntaxError, "(a: 1, b: 2)") {render("@error (a: 1, b: 2)")}
+    assert_raise_message(Sass::SyntaxError, "(a: 1, b: 2)") do
+      render("$map: (a: 1, b: 2); @error $map", :syntax => :scss)
+    end
+  end
+
+  def test_default_arg_before_splat
+    assert_equal <<CSS, render(<<SASS, :syntax => :scss)
+.foo-positional {
+  a: 1;
+  b: 2;
+  positional-arguments: 3, 4;
+  keyword-arguments: (); }
+
+.foo-keywords {
+  a: true;
+  positional-arguments: ();
+  keyword-arguments: (c: c, d: d); }
+CSS
+@mixin foo($a: true, $b: null, $arguments...) {
+  a: $a;
+  b: $b;
+  positional-arguments: inspect($arguments);
+  keyword-arguments: inspect(keywords($arguments));
+}
+.foo-positional {
+  @include foo(1, 2, 3, 4);
+}
+.foo-keywords {
+  @include foo($c: c, $d: d);
+}
+SASS
+  end
+
+  def test_keyframes
+    assert_equal <<CSS, render(<<SASS)
+@keyframes identifier {
+  0% {
+    top: 0;
+    left: 0; }
+  30% {
+    top: 50px; }
+  68%, 72% {
+    left: 50px; }
+  100% {
+    top: 100px;
+    left: 100%; } }
+CSS
+@keyframes identifier
+  0%
+    top: 0
+    left: 0
+  \#{"30%"}
+    top: 50px
+  68%, 72%
+    left: 50px
+  100%
+    top: 100px
+    left: 100%
+SASS
+  end
+
+  def test_prefixed_keyframes
+    assert_equal <<CSS, render(<<SASS)
+@-moz-keyframes identifier {
+  0% {
+    top: 0;
+    left: 0; }
+  30% {
+    top: 50px; }
+  68%, 72% {
+    left: 50px; }
+  100% {
+    top: 100px;
+    left: 100%; } }
+CSS
+@-moz-keyframes identifier
+  0%
+    top: 0
+    left: 0
+  \#{"30%"}
+    top: 50px
+  68%, 72%
+    left: 50px
+  100%
+    top: 100px
+    left: 100%
+SASS
+  end
+
+  def test_uppercase_keyframes
+    assert_equal <<CSS, render(<<SASS)
+@KEYFRAMES identifier {
+  0% {
+    top: 0;
+    left: 0; }
+  30% {
+    top: 50px; }
+  68%, 72% {
+    left: 50px; }
+  100% {
+    top: 100px;
+    left: 100%; } }
+CSS
+@KEYFRAMES identifier
+  0%
+    top: 0
+    left: 0
+  \#{"30%"}
+    top: 50px
+  68%, 72%
+    left: 50px
+  100%
+    top: 100px
+    left: 100%
+SASS
+  end
+
+  def test_compressed_unknown_directive
+    assert_equal(<<CSS, render(<<SASS, :style => :compressed))
+x{@foo;a:b;@bar}
+CSS
+x
+  @foo
+  a: b
+  @bar
+SASS
+  end
+
+  def test_compressed_unknown_directive_in_directive
+    assert_equal(<<CSS, render(<<SASS, :style => :compressed))
+@x{@foo;a:b;@bar}
+CSS
+@x
+  @foo
+  a: b
+  @bar
+SASS
+  end
+
+  def test_compressed_unknown_directive_with_children_in_directive
+    assert_equal(<<CSS, render(<<SASS, :style => :compressed))
+@x{@foo{a:b}c:d;@bar{e:f}}
+CSS
+@x
+  @foo
+    a: b
+  c: d
+  @bar
+    e: f
+SASS
+  end
+
+  def test_compressed_rule_in_directive
+    assert_equal(<<CSS, render(<<SASS, :style => :compressed))
+@x{foo{a:b}c:d;bar{e:f}}
+CSS
+@x
+  foo
+    a: b
+  c: d
+  bar
+    e: f
+SASS
+  end
+
+  def test_import_two_css_files_issue_1806
+    assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
+@import url(\"foo.css\");@import url(\"bar.css\");@import url(\"baz.css\")
+CSS
+@import url("foo.css");
+@import url("bar.css");
+@import url("baz.css");
+SASS
+  end
+
+  def test_numeric_formatting_of_integers
+    assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
+a{near:3.0000000001;plus:3;minus:3;negative:-3}
+CSS
+a {
+  near: (3 + 0.0000000001);
+  plus: (3 + 0.000000000001);
+  minus: (3 - 0.000000000001);
+  negative: (-3 + 0.000000000001);
+}
+SASS
+  end
+
+  def test_escaped_semicolons_are_not_compressed
+    assert_equal(<<'CSS', render(<<'SASS', :syntax => :scss, :style => :compressed))
+div{color:#f00000\9\0\;}
+CSS
+div {
+ color: #f00000\9\0\;
+}
+SASS
+  end
+
+  def test_compressed_output_of_nth_selectors
+    assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
+:nth-of-type(2n-1),:nth-child(2n-1),:nth(2n-1),:nth-of-type(2n-1),:nth-of-type(2n-1){color:red}:nth-of-type(2n+1),:nth-child(2n+1),:nth(2n+1),:nth-of-type(2n+1),:nth-of-type(2n+1){color:red}
+CSS
+:nth-of-type(2n-1), :nth-child(2n-  1), :nth(2n  -1), :nth-of-type(2n  -  1), :nth-of-type( 2n  -  1 ) {
+  color: red }
+:nth-of-type(2n+1), :nth-child(2n+  1), :nth(2n  +1), :nth-of-type(2n  +  1), :nth-of-type( 2n  +  1 ) {
+  color: red }
+SASS
+  end
+
+  def test_descendant_selectors_with_leading_dash
+    assert_equal(<<CSS, render(<<SASS, :syntax => :scss, :style => :compressed))
+a -b{color:red}
+CSS
+a -b {
+  color: red }
+SASS
+  end
+
+  def test_import_with_supports_clause_interp
+    assert_equal(<<CSS, render(<<'SASS', :style => :compressed))
+@import url("fallback-layout.css") supports(not (display: flex))
+CSS
+$display-type: flex
+@import url("fallback-layout.css") supports(not (display: #{$display-type}))
+SASS
+  end
+
+  def test_import_with_supports_clause
+    assert_equal(<<CSS, render(<<SASS, :style => :compressed))
+@import url("fallback-layout.css") supports(not (display: flex))
+CSS
+@import url("fallback-layout.css") supports(not (display: flex))
+SASS
+  end
+
+  def test_compressed_commas_in_attribute_selectors
+    assert_equal(<<CSS, render(<<SASS, :style => :compressed))
+.classname[a="1, 2, 3"],.another[b="4, 5, 6"]{color:red}
+CSS
+.classname[a="1, 2, 3"], .another[b="4, 5, 6"]
+  color: red
+SASS
+  end
+
+  def test_trailing_commas_in_arglists
+    assert_equal(<<CSS, render(<<SASS, :style => :nested))
+.includes {
+  one-positional-arg: positional 1 a;
+  two-positional-args: positional 2 a b;
+  one-keyword-arg: keyword 1 z;
+  two-keyword-args: keyword 2 y z;
+  mixed-args: mixed 2 y z; }
+
+.calls {
+  one-positional-arg: positional 1 a;
+  two-positional-args: positional 2 a b;
+  one-keyword-arg: keyword 1 z;
+  two-keyword-args: keyword 2 y z;
+  mixed-args: mixed 2 y z; }
+CSS
+=one-positional-arg($a,)
+  one-positional-arg: positional 1 $a
+
+=two-positional-args($a, $b,)
+  two-positional-args: positional 2 $a $b
+
+=one-keyword-arg($a: a,)
+  one-keyword-arg: keyword 1 $a
+
+=two-keyword-args($a: a, $b: b,)
+  two-keyword-args: keyword 2 $a $b
+
+=mixed-args($a, $b: b,)
+  mixed-args: mixed 2 $a $b
+
+@function one-positional-arg($a)
+  @return positional 1 $a
+
+@function two-positional-args($a, $b)
+  @return positional 2 $a $b
+
+@function one-keyword-arg($a: a)
+  @return keyword 1 $a
+
+@function two-keyword-args($a: a, $b: b)
+  @return keyword 2 $a $b
+
+@function mixed-args($a, $b: b)
+  @return mixed 2 $a $b
+
+
+.includes
+  +one-positional-arg(a,)
+  +two-positional-args(a, b,)
+  +one-keyword-arg($a: z,)
+  +two-keyword-args($a: y, $b: z,)
+  +mixed-args(y, $b: z,)
+
+
+.calls
+  one-positional-arg: one-positional-arg(a)
+  two-positional-args: two-positional-args(a, b)
+  one-keyword-arg: one-keyword-arg($a: z)
+  two-keyword-args: two-keyword-args($a: y, $b: z)
+  mixed-args: mixed-args(y, $b: z)
+SASS
+  end
+
+  private
+
+  def assert_hash_has(hash, expected)
+    expected.each do |k, v|
+      if v.nil?
+        assert_nil(hash[k])
+      else
+        assert_equal(v, hash[k])
+      end
+    end
+  end
+
+  def assert_renders_encoded(css, sass)
+    result = render(sass)
+    assert_equal css.encoding, result.encoding
+    assert_equal css, result
+  end
+
+  def render(sass, options = {})
+    munge_filename options
+    options[:importer] ||= MockImporter.new
+    Sass::Engine.new(sass, options).render
+  end
+
+  def renders_correctly(name, options={})
+    sass_file  = load_file(name, "sass")
+    css_file   = load_file(name, "css")
+    options[:filename] ||= filename(name, "sass")
+    options[:syntax] ||= :sass
+    options[:css_filename] ||= filename(name, "css")
+    css_result = Sass::Engine.new(sass_file, options).render
+    assert_equal css_file, css_result
+  end
+
+  def load_file(name, type = "sass")
+    @result = ''
+    File.new(filename(name, type)).each_line { |l| @result += l }
+    @result
+  end
+
+  def filename(name, type)
+    path = File.dirname(__FILE__) + "/#{type == 'sass' ? 'templates' : 'results'}/#{name}.#{type}"
+    Sass::Util.cleanpath(path).to_s
+  end
+
+  def sassc_path(template)
+    sassc_path = File.join(File.dirname(__FILE__) + "/templates/#{template}.sass")
+    engine = Sass::Engine.new("", :filename => sassc_path,
+      :importer => Sass::Importers::Filesystem.new("."))
+    key = engine.send(:sassc_key)
+    File.join(engine.options[:cache_location], key)
+  end
+end
+ 
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/exec_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/exec_test.rb
new file mode 100755
index 0000000..aa8057e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/exec_test.rb
@@ -0,0 +1,95 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'fileutils'
+require 'sass/util/test'
+require 'tmpdir'
+
+class ExecTest < MiniTest::Test
+  include Sass::Util::Test
+
+  def setup
+    @dir = Dir.mktmpdir
+  end
+
+  def teardown
+    FileUtils.rm_rf(@dir)
+    clean_up_sassc
+  end
+
+  def test_scss_t_expanded
+    src = get_path("src.scss")
+    dest = get_path("dest.css")
+    write(src, ".ruleset { margin: 0 }")
+    assert(exec(*%w[scss --sourcemap=none -t expanded --unix-newlines].push(src, dest)))
+    assert_equal(".ruleset {\n  margin: 0;\n}\n", read(dest))
+  end
+
+  def test_sass_convert_T_sass
+    src = get_path("src.scss")
+    dest = get_path("dest.css")
+    write(src, ".ruleset { margin: 0 }")
+    assert(exec(*%w[sass-convert -T sass --unix-newlines].push(src, dest)))
+    assert_equal(".ruleset\n  margin: 0\n", read(dest))
+  end
+
+  def test_sass_convert_T_sass_in_place
+    src = get_path("src.scss")
+    write(src, ".ruleset { margin: 0 }")
+    assert(exec(*%w[sass-convert -T sass --in-place --unix-newlines].push(src)))
+    assert_equal(".ruleset\n  margin: 0\n", read(src))
+  end
+
+  def test_scss_t_expanded_no_unix_newlines
+    return skip "Can be run on Windows only" unless Sass::Util.windows?
+    src = get_path("src.scss")
+    dest = get_path("dest.css")
+    write(src, ".ruleset { margin: 0 }")
+    assert(exec(*%w[scss -t expanded].push(src, dest)))
+    assert_equal(".ruleset {\r\n  margin: 0;\r\n}\r\n", read(dest))
+  end
+
+  def test_sass_convert_T_sass_no_unix_newlines
+    return skip "Can be run on Windows only" unless Sass::Util.windows?
+    src = get_path("src.scss")
+    dest = get_path("dest.sass")
+    write(src, ".ruleset { margin: 0 }")
+    assert(exec(*%w[sass-convert -T sass].push(src, dest)))
+    assert_equal(".ruleset\r\n  margin: 0\r\n", read(dest))
+  end
+
+  def test_sass_convert_T_sass_in_place_no_unix_newlines
+    return skip "Can be run on Windows only" unless Sass::Util.windows?
+    src = get_path("src.scss")
+    write(src, ".ruleset { margin: 0 }")
+    assert(exec(*%w[sass-convert -T sass --in-place].push(src)))
+    assert_equal(".ruleset\r\n  margin: 0\r\n", read(src))
+  end
+
+  def test_sass_convert_R
+    Dir.chdir(@dir) do
+      src = get_path("styles/src.css")
+      write(src, ".ruleset { margin: 0 }")
+      assert(exec(*%w[sass-convert -Rq --from css --to scss --trace styles]))
+    end
+  end
+
+  private
+
+  def get_path(name)
+    File.join(@dir, name)
+  end
+
+  def read(file)
+    open(file, 'rb') {|f| f.read}
+  end
+
+  def write(file, content)
+    FileUtils.mkdir_p(File.dirname(file))
+    open(file, 'wb') {|f| f.write(content)}
+  end
+
+  def exec(script, *args)
+    script = File.dirname(__FILE__) + '/../../bin/' + script
+    ruby = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'] + RbConfig::CONFIG['EXEEXT'])
+    system(ruby, script, *args)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/extend_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/extend_test.rb
new file mode 100755
index 0000000..de26216
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/extend_test.rb
@@ -0,0 +1,1678 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ExtendTest < MiniTest::Test
+  def test_basic
+    assert_equal <<CSS, render(<<SCSS)
+.foo, .bar {
+  a: b; }
+CSS
+.foo {a: b}
+.bar {@extend .foo}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo, .bar {
+  a: b; }
+CSS
+.bar {@extend .foo}
+.foo {a: b}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo, .bar {
+  a: b; }
+
+.bar {
+  c: d; }
+CSS
+.foo {a: b}
+.bar {c: d; @extend .foo}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo, .bar {
+  a: b; }
+
+.bar {
+  c: d; }
+CSS
+.foo {a: b}
+.bar {@extend .foo; c: d}
+SCSS
+  end
+
+  def test_indented_syntax
+    assert_equal <<CSS, render(<<SASS, :syntax => :sass)
+.foo, .bar {
+  a: b; }
+CSS
+.foo
+  a: b
+.bar
+  @extend .foo
+SASS
+
+    assert_equal <<CSS, render(<<SASS, :syntax => :sass)
+.foo, .bar {
+  a: b; }
+CSS
+.foo
+  a: b
+.bar
+  @extend \#{".foo"}
+SASS
+  end
+
+  def test_multiple_targets
+    assert_equal <<CSS, render(<<SCSS)
+.foo, .bar {
+  a: b; }
+
+.blip .foo, .blip .bar {
+  c: d; }
+CSS
+.foo {a: b}
+.bar {@extend .foo}
+.blip .foo {c: d}
+SCSS
+  end
+
+  def test_multiple_extendees
+    assert_equal <<CSS, render(<<SCSS)
+.foo, .baz {
+  a: b; }
+
+.bar, .baz {
+  c: d; }
+CSS
+.foo {a: b}
+.bar {c: d}
+.baz {@extend .foo; @extend .bar}
+SCSS
+  end
+
+  def test_multiple_extends_with_single_extender_and_single_target
+    assert_extends('.foo .bar', '.baz {@extend .foo; @extend .bar}',
+      '.foo .bar, .baz .bar, .foo .baz, .baz .baz')
+    assert_extends '.foo.bar', '.baz {@extend .foo; @extend .bar}', '.foo.bar, .baz'
+  end
+
+  def test_multiple_extends_with_multiple_extenders_and_single_target
+    assert_equal <<CSS, render(<<SCSS)
+.foo .bar, .baz .bar, .foo .bang, .baz .bang {
+  a: b; }
+CSS
+.foo .bar {a: b}
+.baz {@extend .foo}
+.bang {@extend .bar}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo.bar, .bar.baz, .baz.bang, .foo.bang {
+  a: b; }
+CSS
+.foo.bar {a: b}
+.baz {@extend .foo}
+.bang {@extend .bar}
+SCSS
+  end
+
+  def test_chained_extends
+    assert_equal <<CSS, render(<<SCSS)
+.foo, .bar, .baz, .bip {
+  a: b; }
+CSS
+.foo {a: b}
+.bar {@extend .foo}
+.baz {@extend .bar}
+.bip {@extend .bar}
+SCSS
+  end
+
+  def test_dynamic_extendee
+    assert_extends '.foo', '.bar {@extend #{".foo"}}', '.foo, .bar'
+    assert_extends('[baz^="blip12px"]', '.bar {@extend [baz^="blip#{12px}"]}',
+      '[baz^="blip12px"], .bar')
+  end
+
+  def test_nested_target
+    assert_extends '.foo .bar', '.baz {@extend .bar}', '.foo .bar, .foo .baz'
+  end
+
+  def test_target_with_child
+    assert_extends '.foo .bar', '.baz {@extend .foo}', '.foo .bar, .baz .bar'
+  end
+
+  def test_class_unification
+    assert_unification '.foo.bar', '.baz {@extend .foo}', '.foo.bar, .bar.baz'
+    assert_unification '.foo.baz', '.baz {@extend .foo}', '.baz'
+  end
+
+  def test_id_unification
+    assert_unification '.foo.bar', '#baz {@extend .foo}', '.foo.bar, .bar#baz'
+    assert_unification '.foo#baz', '#baz {@extend .foo}', '#baz'
+    assert_unification '.foo#baz', '#bar {@extend .foo}', '.foo#baz'
+  end
+
+  def test_universal_unification_with_simple_target
+    assert_unification '.foo', '* {@extend .foo}', '.foo, *'
+    assert_unification '.foo', '*|* {@extend .foo}', '.foo, *|*'
+    assert_unification '.foo.bar', '* {@extend .foo}', '.bar'
+    assert_unification '.foo.bar', '*|* {@extend .foo}', '.bar'
+    assert_unification '.foo.bar', 'ns|* {@extend .foo}', '.foo.bar, ns|*.bar'
+  end
+
+  def test_universal_unification_with_namespaceless_universal_target
+    assert_unification '*.foo', 'ns|* {@extend .foo}', '*.foo'
+    assert_unification '*.foo', '* {@extend .foo}', '*'
+    assert_unification '*.foo', '*|* {@extend .foo}', '*'
+    assert_unification '*|*.foo', '* {@extend .foo}', '*|*.foo, *'
+    assert_unification '*|*.foo', '*|* {@extend .foo}', '*|*'
+    assert_unification '*|*.foo', 'ns|* {@extend .foo}', '*|*.foo, ns|*'
+  end
+
+  def test_universal_unification_with_namespaced_universal_target
+    assert_unification 'ns|*.foo', '* {@extend .foo}', 'ns|*.foo'
+    assert_unification 'ns1|*.foo', 'ns2|* {@extend .foo}', 'ns1|*.foo'
+    assert_unification 'ns|*.foo', '*|* {@extend .foo}', 'ns|*'
+    assert_unification 'ns|*.foo', 'ns|* {@extend .foo}', 'ns|*'
+  end
+
+  def test_universal_unification_with_namespaceless_element_target
+    assert_unification 'a.foo', 'ns|* {@extend .foo}', 'a.foo'
+    assert_unification 'a.foo', '* {@extend .foo}', 'a'
+    assert_unification 'a.foo', '*|* {@extend .foo}', 'a'
+    assert_unification '*|a.foo', '* {@extend .foo}', '*|a.foo, a'
+    assert_unification '*|a.foo', '*|* {@extend .foo}', '*|a'
+    assert_unification '*|a.foo', 'ns|* {@extend .foo}', '*|a.foo, ns|a'
+  end
+
+  def test_universal_unification_with_namespaced_element_target
+    assert_unification 'ns|a.foo', '* {@extend .foo}', 'ns|a.foo'
+    assert_unification 'ns1|a.foo', 'ns2|* {@extend .foo}', 'ns1|a.foo'
+    assert_unification 'ns|a.foo', '*|* {@extend .foo}', 'ns|a'
+    assert_unification 'ns|a.foo', 'ns|* {@extend .foo}', 'ns|a'
+  end
+
+  def test_element_unification_with_simple_target
+    assert_unification '.foo', 'a {@extend .foo}', '.foo, a'
+    assert_unification '.foo.bar', 'a {@extend .foo}', '.foo.bar, a.bar'
+    assert_unification '.foo.bar', '*|a {@extend .foo}', '.foo.bar, *|a.bar'
+    assert_unification '.foo.bar', 'ns|a {@extend .foo}', '.foo.bar, ns|a.bar'
+  end
+
+  def test_element_unification_with_namespaceless_universal_target
+    assert_unification '*.foo', 'ns|a {@extend .foo}', '*.foo'
+    assert_unification '*.foo', 'a {@extend .foo}', '*.foo, a'
+    assert_unification '*.foo', '*|a {@extend .foo}', '*.foo, a'
+    assert_unification '*|*.foo', 'a {@extend .foo}', '*|*.foo, a'
+    assert_unification '*|*.foo', '*|a {@extend .foo}', '*|*.foo, *|a'
+    assert_unification '*|*.foo', 'ns|a {@extend .foo}', '*|*.foo, ns|a'
+  end
+
+  def test_element_unification_with_namespaced_universal_target
+    assert_unification 'ns|*.foo', 'a {@extend .foo}', 'ns|*.foo'
+    assert_unification 'ns1|*.foo', 'ns2|a {@extend .foo}', 'ns1|*.foo'
+    assert_unification 'ns|*.foo', '*|a {@extend .foo}', 'ns|*.foo, ns|a'
+    assert_unification 'ns|*.foo', 'ns|a {@extend .foo}', 'ns|*.foo, ns|a'
+  end
+
+  def test_element_unification_with_namespaceless_element_target
+    assert_unification 'a.foo', 'ns|a {@extend .foo}', 'a.foo'
+    assert_unification 'a.foo', 'h1 {@extend .foo}', 'a.foo'
+    assert_unification 'a.foo', 'a {@extend .foo}', 'a'
+    assert_unification 'a.foo', '*|a {@extend .foo}', 'a'
+    assert_unification '*|a.foo', 'a {@extend .foo}', '*|a.foo, a'
+    assert_unification '*|a.foo', '*|a {@extend .foo}', '*|a'
+    assert_unification '*|a.foo', 'ns|a {@extend .foo}', '*|a.foo, ns|a'
+  end
+
+  def test_element_unification_with_namespaced_element_target
+    assert_unification 'ns|a.foo', 'a {@extend .foo}', 'ns|a.foo'
+    assert_unification 'ns1|a.foo', 'ns2|a {@extend .foo}', 'ns1|a.foo'
+    assert_unification 'ns|a.foo', '*|a {@extend .foo}', 'ns|a'
+    assert_unification 'ns|a.foo', 'ns|a {@extend .foo}', 'ns|a'
+  end
+
+  def test_attribute_unification
+    assert_unification '[foo=bar].baz', '[foo=baz] {@extend .baz}', '[foo=bar].baz, [foo=bar][foo=baz]'
+    assert_unification '[foo=bar].baz', '[foo^=bar] {@extend .baz}', '[foo=bar].baz, [foo=bar][foo^=bar]'
+    assert_unification '[foo=bar].baz', '[foot=bar] {@extend .baz}', '[foo=bar].baz, [foo=bar][foot=bar]'
+    assert_unification '[foo=bar].baz', '[ns|foo=bar] {@extend .baz}', '[foo=bar].baz, [foo=bar][ns|foo=bar]'
+    assert_unification '%-a [foo=bar].bar', '[foo=bar] {@extend .bar}', '-a [foo=bar]'
+  end
+
+  def test_pseudo_unification
+    assert_unification ':foo.baz', ':foo(2n+1) {@extend .baz}', ':foo.baz, :foo:foo(2n+1)'
+    assert_unification ':foo.baz', '::foo {@extend .baz}', ':foo.baz, :foo::foo'
+    assert_unification '::foo.baz', '::bar {@extend .baz}', '::foo.baz'
+    assert_unification '::foo.baz', '::foo(2n+1) {@extend .baz}', '::foo.baz'
+    assert_unification '::foo.baz', '::foo {@extend .baz}', '::foo'
+    assert_unification '::foo(2n+1).baz', '::foo(2n+1) {@extend .baz}', '::foo(2n+1)'
+    assert_unification ':foo.baz', ':bar {@extend .baz}', ':foo.baz, :foo:bar'
+    assert_unification '.baz:foo', ':after {@extend .baz}', '.baz:foo, :foo:after'
+    assert_unification '.baz:after', ':foo {@extend .baz}', '.baz:after, :foo:after'
+    assert_unification ':foo.baz', ':foo {@extend .baz}', ':foo'
+  end
+
+  def test_pseudoelement_remains_at_end_of_selector
+    assert_extends '.foo::bar', '.baz {@extend .foo}', '.foo::bar, .baz::bar'
+    assert_extends 'a.foo::bar', '.baz {@extend .foo}', 'a.foo::bar, a.baz::bar'
+  end
+
+  def test_pseudoclass_remains_at_end_of_selector
+    assert_extends '.foo:bar', '.baz {@extend .foo}', '.foo:bar, .baz:bar'
+    assert_extends 'a.foo:bar', '.baz {@extend .foo}', 'a.foo:bar, a.baz:bar'
+  end
+
+  def test_id_unification_again
+    assert_unification('#id.foo .bar', '#id.baz .qux {@extend .bar}',
+        '#id.foo .bar, #id.baz.foo .qux')
+  end
+
+  def test_root_unification
+    assert_extends(
+      ".foo:root .bar",
+      ".baz:root .qux {@extend .bar}",
+      ".foo:root .bar, .baz.foo:root .qux")
+  end
+
+  def test_not_remains_at_end_of_selector
+    assert_extends '.foo:not(.bar)', '.baz {@extend .foo}', '.foo:not(.bar), .baz:not(.bar)'
+  end
+
+  def test_pseudoelement_goes_lefter_than_pseudoclass
+    assert_extends '.foo::bar', '.baz:bang {@extend .foo}', '.foo::bar, .baz:bang::bar'
+    assert_extends '.foo:bar', '.baz::bang {@extend .foo}', '.foo:bar, .baz:bar::bang'
+  end
+
+  def test_pseudoelement_goes_lefter_than_not
+    assert_extends '.foo::bar', '.baz:not(.bang) {@extend .foo}', '.foo::bar, .baz:not(.bang)::bar'
+    assert_extends '.foo:not(.bang)', '.baz::bar {@extend .foo}', '.foo:not(.bang), .baz:not(.bang)::bar'
+  end
+
+  def test_negation_unification
+    assert_extends ':not(.foo).baz', ':not(.bar) {@extend .baz}', ':not(.foo).baz, :not(.foo):not(.bar)'
+    # Unifying to :not(.foo) here would reduce the specificity of the original selector.
+    assert_extends ':not(.foo).baz', ':not(.foo) {@extend .baz}', ':not(.foo).baz, :not(.foo)'
+  end
+
+  def test_prefixed_pseudoclass_unification
+    assert_unification(
+      ':nth-child(2n+1 of .foo).baz',
+      ':nth-child(2n of .foo) {@extend .baz}',
+      ':nth-child(2n+1 of .foo).baz, :nth-child(2n+1 of .foo):nth-child(2n of .foo)')
+
+    assert_unification(
+      ':nth-child(2n+1 of .foo).baz',
+      ':nth-child(2n+1 of .bar) {@extend .baz}',
+      ':nth-child(2n+1 of .foo).baz, :nth-child(2n+1 of .foo):nth-child(2n+1 of .bar)')
+
+    assert_unification(
+      ':nth-child(2n+1 of .foo).baz',
+      ':nth-child(2n+1 of .foo) {@extend .baz}',
+      ':nth-child(2n+1 of .foo)')
+  end
+
+  def test_extend_into_not
+    assert_extends(':not(.foo)', '.x {@extend .foo}', ':not(.foo):not(.x)')
+    assert_extends(':not(.foo.bar)', '.x {@extend .bar}', ':not(.foo.bar):not(.foo.x)')
+    assert_extends(
+      ':not(.foo.bar, .baz.bar)',
+      '.x {@extend .bar}',
+      ':not(.foo.bar, .foo.x, .baz.bar, .baz.x)')
+  end
+
+  def test_extend_into_mergeable_pseudoclasses
+    assert_extends(':matches(.foo)', '.x {@extend .foo}', ':matches(.foo, .x)')
+    assert_extends(':matches(.foo.bar)', '.x {@extend .bar}', ':matches(.foo.bar, .foo.x)')
+    assert_extends(
+      ':matches(.foo.bar, .baz.bar)',
+      '.x {@extend .bar}',
+      ':matches(.foo.bar, .foo.x, .baz.bar, .baz.x)')
+
+    assert_extends(':-moz-any(.foo)', '.x {@extend .foo}', ':-moz-any(.foo, .x)')
+    assert_extends(':current(.foo)', '.x {@extend .foo}', ':current(.foo, .x)')
+    assert_extends(':has(.foo)', '.x {@extend .foo}', ':has(.foo, .x)')
+    assert_extends(':host(.foo)', '.x {@extend .foo}', ':host(.foo, .x)')
+    assert_extends(':host-context(.foo)', '.x {@extend .foo}', ':host-context(.foo, .x)')
+    assert_extends(':nth-child(n of .foo)', '.x {@extend .foo}', ':nth-child(n of .foo, .x)')
+    assert_extends(
+      ':nth-last-child(n of .foo)',
+      '.x {@extend .foo}',
+      ':nth-last-child(n of .foo, .x)')
+  end
+
+  def test_complex_extend_into_pseudoclass
+    # Unlike other selectors, we don't allow complex selectors to be
+    # added to `:not` if they weren't there before. At time of
+    # writing, most browsers don't support that and will throw away
+    # the entire selector if it exists.
+    #assert_extends(':not(.bar)', '.x .y {@extend .bar}', ':not(.bar)')
+
+    # If the `:not()` already has a complex selector, we won't break
+    # anything by adding a new one.
+    assert_extends(':not(.baz .bar)', '.x .y {@extend .bar}',
+      ':not(.baz .bar):not(.baz .x .y):not(.x .baz .y)')
+
+    # If the `:not()` would only contain complex selectors, there's no
+    # harm in letting it continue to exist.
+    assert_extends(':not(%bar)', '.x .y {@extend %bar}', ':not(.x .y)')
+
+    assert_extends(':matches(.bar)', '.x .y {@extend .bar}', ':matches(.bar, .x .y)')
+    assert_extends(':current(.bar)', '.x .y {@extend .bar}', ':current(.bar, .x .y)')
+    assert_extends(':has(.bar)', '.x .y {@extend .bar}', ':has(.bar, .x .y)')
+    assert_extends(':host(.bar)', '.x .y {@extend .bar}', ':host(.bar, .x .y)')
+    assert_extends(':host-context(.bar)', '.x .y {@extend .bar}', ':host-context(.bar, .x .y)')
+    assert_extends(
+      ':-moz-any(.bar)',
+      '.x .y {@extend .bar}',
+      ':-moz-any(.bar, .x .y)')
+    assert_extends(
+      ':nth-child(n of .bar)',
+      '.x .y {@extend .bar}',
+      ':nth-child(n of .bar, .x .y)')
+    assert_extends(
+      ':nth-last-child(n of .bar)',
+      '.x .y {@extend .bar}',
+      ':nth-last-child(n of .bar, .x .y)')
+  end
+
+  def test_extend_over_selector_pseudoclass
+    assert_extends(':not(.foo)', '.x {@extend :not(.foo)}', ':not(.foo), .x')
+    assert_extends(
+      ':matches(.foo, .bar)',
+      '.x {@extend :matches(.foo, .bar)}',
+      ':matches(.foo, .bar), .x')
+  end
+
+  def test_matches_within_not
+    assert_extends(
+      ':not(.foo, .bar)',
+      ':matches(.x, .y) {@extend .foo}',
+      ':not(.foo, .x, .y, .bar)')
+  end
+
+  def test_pseudoclasses_merge
+    assert_extends(':matches(.foo)', ':matches(.bar) {@extend .foo}', ':matches(.foo, .bar)')
+    assert_extends(':-moz-any(.foo)', ':-moz-any(.bar) {@extend .foo}', ':-moz-any(.foo, .bar)')
+    assert_extends(':current(.foo)', ':current(.bar) {@extend .foo}', ':current(.foo, .bar)')
+    assert_extends(
+      ':nth-child(n of .foo)',
+      ':nth-child(n of .bar) {@extend .foo}',
+      ':nth-child(n of .foo, .bar)')
+    assert_extends(
+      ':nth-last-child(n of .foo)',
+      ':nth-last-child(n of .bar) {@extend .foo}',
+      ':nth-last-child(n of .foo, .bar)')
+  end
+
+  def test_nesting_pseudoclasses_merge
+    assert_extends(':has(.foo)', ':has(.bar) {@extend .foo}', ':has(.foo, :has(.bar))')
+    assert_extends(':host(.foo)', ':host(.bar) {@extend .foo}', ':host(.foo, :host(.bar))')
+    assert_extends(
+      ':host-context(.foo)',
+      ':host-context(.bar) {@extend .foo}',
+      ':host-context(.foo, :host-context(.bar))')
+  end
+
+  def test_not_unifies_with_unique_values
+    assert_unification('foo', ':not(bar) {@extend foo}', ':not(bar)')
+    assert_unification('#foo', ':not(#bar) {@extend #foo}', ':not(#bar)')
+  end
+
+  def test_not_adds_no_specificity
+    assert_specificity_equals(':not(.foo)', '.foo')
+  end
+
+  def test_matches_has_a_specificity_range
+    # `:matches(.foo, #bar)` has minimum specificity equal to that of `.foo`,
+    # which means `:matches(.foo, #bar) .a` can have less specificity than
+    # `#b.a`. Thus the selector generated by `#b.a` should be preserved.
+    assert_equal <<CSS, render(<<SCSS)
+:matches(.foo, #bar) .a, :matches(.foo, #bar) #b.a {
+  a: b; }
+CSS
+:matches(.foo, #bar) %x {a: b}
+.a {@extend %x}
+#b.a {@extend %x}
+SCSS
+
+    # `:matches(.foo, #bar)` has maximum specificity equal to that of `#bar`,
+    # which means `:matches(.foo, #bar).b` can have greater specificity than `.a
+    # .b`. Thus the selector generated by `:matches(.foo, #bar).b` should be
+    # preserved.
+    assert_equal <<CSS, render(<<SCSS)
+.a .b, .a .b:matches(.foo, #bar) {
+  a: b; }
+CSS
+.a %x {a: b}
+.b {@extend %x}
+.b:matches(.foo, #bar) {@extend %x}
+SCSS
+  end
+
+  def test_extend_into_not_and_normal_extend
+    assert_equal <<CSS, render(<<SCSS)
+.x:not(.y):not(.bar), .foo:not(.y):not(.bar) {
+  a: b; }
+CSS
+.x:not(.y) {a: b}
+.foo {@extend .x}
+.bar {@extend .y}
+SCSS
+  end
+
+  def test_extend_into_matches_and_normal_extend
+    assert_equal <<CSS, render(<<SCSS)
+.x:matches(.y, .bar), .foo:matches(.y, .bar) {
+  a: b; }
+CSS
+.x:matches(.y) {a: b}
+.foo {@extend .x}
+.bar {@extend .y}
+SCSS
+  end
+
+  def test_multilayer_pseudoclass_extend
+    assert_equal <<CSS, render(<<SCSS)
+:matches(.x, .foo, .bar) {
+  a: b; }
+CSS
+:matches(.x) {a: b}
+.foo {@extend .x}
+.bar {@extend .foo}
+SCSS
+  end
+
+  def test_root_only_allowed_at_root
+    assert_extends(':root .foo', '.bar .baz {@extend .foo}',
+      ':root .foo, :root .bar .baz')
+    assert_extends('.foo:root .bar', '.baz:root .bang {@extend .bar}',
+      '.foo:root .bar, .baz.foo:root .bang')
+    assert_extends('html:root .bar', 'xml:root .bang {@extend .bar}', 'html:root .bar')
+    assert_extends('.foo:root > .bar .x', '.baz:root .bang .y {@extend .x}',
+      '.foo:root > .bar .x, .baz.foo:root > .bar .bang .y')
+  end
+
+  def test_comma_extendee
+    assert_equal <<CSS, render(<<SCSS)
+.foo, .baz {
+  a: b; }
+
+.bar, .baz {
+  c: d; }
+CSS
+.foo {a: b}
+.bar {c: d}
+.baz {@extend .foo, .bar}
+SCSS
+  end
+
+  def test_redundant_selector_elimination
+    assert_equal <<CSS, render(<<SCSS)
+.foo.bar, .x, .y {
+  a: b; }
+CSS
+.foo.bar {a: b}
+.x {@extend .foo, .bar}
+.y {@extend .foo, .bar}
+SCSS
+  end
+
+  def test_nested_pseudo_selectors
+    assert_equal <<CSS, render(<<SCSS)
+.foo .bar:not(.baz), .bang .bar:not(.baz) {
+  a: b; }
+CSS
+.foo {
+  .bar:not(.baz) {a: b}
+}
+.bang {@extend .foo}
+SCSS
+  end
+
+  ## Long Extendees
+
+  def test_long_extendee
+    assert_warning(<<WARNING) {assert_extends '.foo.bar', '.baz {@extend .foo.bar}', '.foo.bar, .baz'}
+DEPRECATION WARNING on line 2 of test_long_extendee_inline.scss:
+Extending a compound selector, .foo.bar, is deprecated and will not be supported in a future release.
+See https://github.com/sass/sass/issues/1599 for details.
+WARNING
+  end
+
+  def test_long_extendee_requires_all_selectors
+    silence_warnings do
+      assert_extend_doesnt_match('.baz', '.foo.bar', :not_found, 2) do
+        render_extends '.foo', '.baz {@extend .foo.bar}'
+      end
+    end
+  end
+
+  def test_long_extendee_matches_supersets
+    silence_warnings {assert_extends '.foo.bar.bap', '.baz {@extend .foo.bar}', '.foo.bar.bap, .bap.baz'}
+  end
+
+  def test_long_extendee_runs_unification
+    silence_warnings {assert_extends 'ns|*.foo.bar', '*|a.baz {@extend .foo.bar}', 'ns|*.foo.bar, ns|a.baz'}
+  end
+
+  ## Long Extenders
+
+  def test_long_extender
+    assert_extends '.foo.bar', '.baz.bang {@extend .foo}', '.foo.bar, .bar.baz.bang'
+  end
+
+  def test_long_extender_runs_unification
+    assert_extends 'ns|*.foo.bar', '*|a.baz {@extend .foo}', 'ns|*.foo.bar, ns|a.bar.baz'
+  end
+
+  def test_long_extender_doesnt_unify
+    assert_extends 'a.foo#bar', 'h1.baz {@extend .foo}', 'a.foo#bar'
+    assert_extends 'a.foo#bar', '.bang#baz {@extend .foo}', 'a.foo#bar'
+  end
+
+  ## Nested Extenders
+
+  def test_nested_extender
+    assert_extends '.foo', 'foo bar {@extend .foo}', '.foo, foo bar'
+  end
+
+  def test_nested_extender_runs_unification
+    assert_extends '.foo.bar', 'foo bar {@extend .foo}', '.foo.bar, foo bar.bar'
+  end
+
+  def test_nested_extender_doesnt_unify
+    assert_extends 'baz.foo', 'foo bar {@extend .foo}', 'baz.foo'
+  end
+
+  def test_nested_extender_alternates_parents
+    assert_extends('.baz .bip .foo', 'foo .grank bar {@extend .foo}',
+      '.baz .bip .foo, .baz .bip foo .grank bar, foo .grank .baz .bip bar')
+  end
+
+  def test_nested_extender_unifies_identical_parents
+    assert_extends('.baz .bip .foo', '.baz .bip bar {@extend .foo}',
+      '.baz .bip .foo, .baz .bip bar')
+  end
+
+  def test_nested_extender_unifies_common_substring
+    assert_extends('.baz .bip .bap .bink .foo', '.brat .bip .bap bar {@extend .foo}',
+      '.baz .bip .bap .bink .foo, .baz .brat .bip .bap .bink bar, .brat .baz .bip .bap .bink bar')
+  end
+
+  def test_nested_extender_unifies_common_subseq
+    assert_extends('.a .x .b .y .foo', '.a .n .b .m bar {@extend .foo}',
+      '.a .x .b .y .foo, .a .x .n .b .y .m bar, .a .n .x .b .y .m bar, .a .x .n .b .m .y bar, .a .n .x .b .m .y bar')
+  end
+
+  def test_nested_extender_chooses_first_subseq
+    assert_extends('.a .b .c .d .foo', '.c .d .a .b .bar {@extend .foo}',
+      '.a .b .c .d .foo, .a .b .c .d .a .b .bar')
+  end
+
+  def test_nested_extender_counts_extended_subselectors
+    assert_extends('.a .bip.bop .foo', '.b .bip .bar {@extend .foo}',
+      '.a .bip.bop .foo, .a .b .bip.bop .bar, .b .a .bip.bop .bar')
+  end
+
+  def test_nested_extender_counts_extended_superselectors
+    assert_extends('.a .bip .foo', '.b .bip.bop .bar {@extend .foo}',
+      '.a .bip .foo, .a .b .bip.bop .bar, .b .a .bip.bop .bar')
+  end
+
+  def test_nested_extender_with_child_selector
+    assert_extends '.baz .foo', 'foo > bar {@extend .foo}', '.baz .foo, .baz foo > bar'
+  end
+
+  def test_nested_extender_finds_common_selectors_around_child_selector
+    assert_extends 'a > b c .c1', 'a c .c2 {@extend .c1}', 'a > b c .c1, a > b c .c2'
+    assert_extends 'a > b c .c1', 'b c .c2 {@extend .c1}', 'a > b c .c1, a > b c .c2'
+  end
+
+  def test_nested_extender_doesnt_find_common_selectors_around_adjacent_sibling_selector
+    assert_extends 'a + b c .c1', 'a c .c2 {@extend .c1}', 'a + b c .c1, a + b a c .c2, a a + b c .c2'
+    assert_extends 'a + b c .c1', 'a b .c2 {@extend .c1}', 'a + b c .c1, a a + b c .c2'
+    assert_extends 'a + b c .c1', 'b c .c2 {@extend .c1}', 'a + b c .c1, a + b c .c2'
+  end
+
+  def test_nested_extender_doesnt_find_common_selectors_around_sibling_selector
+    assert_extends 'a ~ b c .c1', 'a c .c2 {@extend .c1}', 'a ~ b c .c1, a ~ b a c .c2, a a ~ b c .c2'
+    assert_extends 'a ~ b c .c1', 'a b .c2 {@extend .c1}', 'a ~ b c .c1, a a ~ b c .c2'
+    assert_extends 'a ~ b c .c1', 'b c .c2 {@extend .c1}', 'a ~ b c .c1, a ~ b c .c2'
+  end
+
+  def test_nested_extender_doesnt_find_common_selectors_around_reference_selector
+    silence_warnings {assert_extends 'a /for/ b c .c1', 'a c .c2 {@extend .c1}', 'a /for/ b c .c1, a /for/ b a c .c2, a a /for/ b c .c2'}
+    silence_warnings {assert_extends 'a /for/ b c .c1', 'a b .c2 {@extend .c1}', 'a /for/ b c .c1, a a /for/ b c .c2'}
+    silence_warnings {assert_extends 'a /for/ b c .c1', 'b c .c2 {@extend .c1}', 'a /for/ b c .c1, a /for/ b c .c2'}
+  end
+
+  def test_nested_extender_with_early_child_selectors_doesnt_subseq_them
+    assert_extends('.bip > .bap .foo', '.grip > .bap .bar {@extend .foo}',
+      '.bip > .bap .foo, .bip > .bap .grip > .bap .bar, .grip > .bap .bip > .bap .bar')
+    assert_extends('.bap > .bip .foo', '.bap > .grip .bar {@extend .foo}',
+      '.bap > .bip .foo, .bap > .bip .bap > .grip .bar, .bap > .grip .bap > .bip .bar')
+  end
+
+  def test_nested_extender_with_child_selector_unifies
+    assert_extends '.baz.foo', 'foo > bar {@extend .foo}', '.baz.foo, foo > bar.baz'
+
+    assert_equal <<CSS, render(<<SCSS)
+.baz > .foo, .baz > .bar {
+  a: b; }
+CSS
+.baz > {
+  .foo {a: b}
+  .bar {@extend .foo}
+}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo .bar, .foo > .baz {
+  a: b; }
+CSS
+.foo {
+  .bar {a: b}
+  > .baz {@extend .bar}
+}
+SCSS
+  end
+
+  def test_nested_extender_with_early_child_selector
+    assert_equal <<CSS, render(<<SCSS)
+.foo .bar, .foo .bip > .baz {
+  a: b; }
+CSS
+.foo {
+  .bar {a: b}
+  .bip > .baz {@extend .bar}
+}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo .bip .bar, .foo .bip .foo > .baz {
+  a: b; }
+CSS
+.foo {
+  .bip .bar {a: b}
+  > .baz {@extend .bar}
+}
+SCSS
+
+    assert_extends '.foo > .bar', '.bip + .baz {@extend .bar}', '.foo > .bar, .foo > .bip + .baz'
+    assert_extends '.foo + .bar', '.bip > .baz {@extend .bar}', '.foo + .bar, .bip > .foo + .baz'
+    assert_extends '.foo > .bar', '.bip > .baz {@extend .bar}', '.foo > .bar, .bip.foo > .baz'
+  end
+
+  def test_nested_extender_with_trailing_child_selector
+    assert_raises(Sass::SyntaxError, "bar > can't extend: invalid selector") do
+      render("bar > {@extend .baz}")
+    end
+  end
+
+  def test_nested_extender_with_sibling_selector
+    assert_extends '.baz .foo', 'foo + bar {@extend .foo}', '.baz .foo, .baz foo + bar'
+  end
+
+  def test_nested_extender_with_hacky_selector
+    assert_extends('.baz .foo', 'foo + > > + bar {@extend .foo}',
+      '.baz .foo, .baz foo + > > + bar, foo .baz + > > + bar')
+    assert_extends '.baz .foo', '> > bar {@extend .foo}', '.baz .foo, > > .baz bar'
+  end
+
+  def test_nested_extender_merges_with_same_selector
+    assert_equal <<CSS, render(<<SCSS)
+.foo .bar, .foo .baz {
+  a: b; }
+CSS
+.foo {
+  .bar {a: b}
+  .baz {@extend .bar} }
+SCSS
+  end
+
+  def test_nested_extender_with_child_selector_merges_with_same_selector
+    assert_extends('.foo > .bar .baz', '.foo > .bar .bang {@extend .baz}',
+      '.foo > .bar .baz, .foo > .bar .bang')
+  end
+
+  # Combinator Unification
+
+  def test_combinator_unification_for_hacky_combinators
+    assert_extends '.a > + x', '.b y {@extend x}', '.a > + x, .a .b > + y, .b .a > + y'
+    assert_extends '.a x', '.b > + y {@extend x}', '.a x, .a .b > + y, .b .a > + y'
+    assert_extends '.a > + x', '.b > + y {@extend x}', '.a > + x, .a .b > + y, .b .a > + y'
+    assert_extends '.a ~ > + x', '.b > + y {@extend x}', '.a ~ > + x, .a .b ~ > + y, .b .a ~ > + y'
+    assert_extends '.a + > x', '.b > + y {@extend x}', '.a + > x'
+    assert_extends '.a + > x', '.b > + y {@extend x}', '.a + > x'
+    assert_extends '.a ~ > + .b > x', '.c > + .d > y {@extend x}', '.a ~ > + .b > x, .a .c ~ > + .d.b > y, .c .a ~ > + .d.b > y'
+  end
+
+  def test_combinator_unification_double_tilde
+    assert_extends '.a.b ~ x', '.a ~ y {@extend x}', '.a.b ~ x, .a.b ~ y'
+    assert_extends '.a ~ x', '.a.b ~ y {@extend x}', '.a ~ x, .a.b ~ y'
+    assert_extends '.a ~ x', '.b ~ y {@extend x}', '.a ~ x, .a ~ .b ~ y, .b ~ .a ~ y, .b.a ~ y'
+    assert_extends 'a.a ~ x', 'b.b ~ y {@extend x}', 'a.a ~ x, a.a ~ b.b ~ y, b.b ~ a.a ~ y'
+  end
+
+  def test_combinator_unification_tilde_plus
+    assert_extends '.a.b + x', '.a ~ y {@extend x}', '.a.b + x, .a.b + y'
+    assert_extends '.a + x', '.a.b ~ y {@extend x}', '.a + x, .a.b ~ .a + y, .a.b + y'
+    assert_extends '.a + x', '.b ~ y {@extend x}', '.a + x, .b ~ .a + y, .b.a + y'
+    assert_extends 'a.a + x', 'b.b ~ y {@extend x}', 'a.a + x, b.b ~ a.a + y'
+    assert_extends '.a.b ~ x', '.a + y {@extend x}', '.a.b ~ x, .a.b ~ .a + y, .a.b + y'
+    assert_extends '.a ~ x', '.a.b + y {@extend x}', '.a ~ x, .a.b + y'
+    assert_extends '.a ~ x', '.b + y {@extend x}', '.a ~ x, .a ~ .b + y, .a.b + y'
+    assert_extends 'a.a ~ x', 'b.b + y {@extend x}', 'a.a ~ x, a.a ~ b.b + y'
+  end
+
+  def test_combinator_unification_angle_sibling
+    assert_extends '.a > x', '.b ~ y {@extend x}', '.a > x, .a > .b ~ y'
+    assert_extends '.a > x', '.b + y {@extend x}', '.a > x, .a > .b + y'
+    assert_extends '.a ~ x', '.b > y {@extend x}', '.a ~ x, .b > .a ~ y'
+    assert_extends '.a + x', '.b > y {@extend x}', '.a + x, .b > .a + y'
+  end
+
+  def test_combinator_unification_double_angle
+    assert_extends '.a.b > x', '.b > y {@extend x}', '.a.b > x, .b.a > y'
+    assert_extends '.a > x', '.a.b > y {@extend x}', '.a > x, .a.b > y'
+    assert_extends '.a > x', '.b > y {@extend x}', '.a > x, .b.a > y'
+    assert_extends 'a.a > x', 'b.b > y {@extend x}', 'a.a > x'
+  end
+
+  def test_combinator_unification_double_plus
+    assert_extends '.a.b + x', '.b + y {@extend x}', '.a.b + x, .b.a + y'
+    assert_extends '.a + x', '.a.b + y {@extend x}', '.a + x, .a.b + y'
+    assert_extends '.a + x', '.b + y {@extend x}', '.a + x, .b.a + y'
+    assert_extends 'a.a + x', 'b.b + y {@extend x}', 'a.a + x'
+  end
+
+  def test_combinator_unification_angle_space
+    assert_extends '.a.b > x', '.a y {@extend x}', '.a.b > x, .a.b > y'
+    assert_extends '.a > x', '.a.b y {@extend x}', '.a > x, .a.b .a > y'
+    assert_extends '.a > x', '.b y {@extend x}', '.a > x, .b .a > y'
+    assert_extends '.a.b x', '.a > y {@extend x}', '.a.b x, .a.b .a > y'
+    assert_extends '.a x', '.a.b > y {@extend x}', '.a x, .a.b > y'
+    assert_extends '.a x', '.b > y {@extend x}', '.a x, .a .b > y'
+  end
+
+  def test_combinator_unification_plus_space
+    assert_extends '.a.b + x', '.a y {@extend x}', '.a.b + x, .a .a.b + y'
+    assert_extends '.a + x', '.a.b y {@extend x}', '.a + x, .a.b .a + y'
+    assert_extends '.a + x', '.b y {@extend x}', '.a + x, .b .a + y'
+    assert_extends '.a.b x', '.a + y {@extend x}', '.a.b x, .a.b .a + y'
+    assert_extends '.a x', '.a.b + y {@extend x}', '.a x, .a .a.b + y'
+    assert_extends '.a x', '.b + y {@extend x}', '.a x, .a .b + y'
+  end
+
+  def test_combinator_unification_nested
+    assert_extends '.a > .b + x', '.c > .d + y {@extend x}', '.a > .b + x, .c.a > .d.b + y'
+    assert_extends '.a > .b + x', '.c > y {@extend x}', '.a > .b + x, .c.a > .b + y'
+  end
+
+  def test_combinator_unification_with_newlines
+    assert_equal <<CSS, render(<<SCSS)
+.a >
+.b
++ x, .c.a > .d.b + y {
+  a: b; }
+CSS
+.a >
+.b
++ x {a: b}
+.c
+> .d +
+y {@extend x}
+SCSS
+  end
+
+  # Loops
+
+  def test_extend_self_loop
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: b; }
+CSS
+.foo {a: b; @extend .foo}
+SCSS
+  end
+
+  def test_basic_extend_loop
+    assert_equal <<CSS, render(<<SCSS)
+.foo, .bar {
+  a: b; }
+
+.bar, .foo {
+  c: d; }
+CSS
+.foo {a: b; @extend .bar}
+.bar {c: d; @extend .foo}
+SCSS
+  end
+
+  def test_three_level_extend_loop
+    assert_equal <<CSS, render(<<SCSS)
+.foo, .baz, .bar {
+  a: b; }
+
+.bar, .foo, .baz {
+  c: d; }
+
+.baz, .bar, .foo {
+  e: f; }
+CSS
+.foo {a: b; @extend .bar}
+.bar {c: d; @extend .baz}
+.baz {e: f; @extend .foo}
+SCSS
+  end
+
+  def test_nested_extend_loop
+    assert_equal <<CSS, render(<<SCSS)
+.bar, .bar .foo {
+  a: b; }
+  .bar .foo {
+    c: d; }
+CSS
+.bar {
+  a: b;
+  .foo {c: d; @extend .bar}
+}
+SCSS
+  end
+
+  def test_cross_loop
+    # The first law of extend means the selector should stick around.
+    assert_equal <<CSS, render(<<SCSS)
+.foo.bar, .foo, .bar {
+  a: b; }
+CSS
+.foo.bar {a: b}
+.foo {@extend .bar}
+.bar {@extend .foo}
+SCSS
+  end
+
+  def test_multiple_extender_merges_with_superset_selector
+    assert_equal <<CSS, render(<<SCSS)
+a.bar.baz, a.foo {
+  a: b; }
+CSS
+.foo {@extend .bar; @extend .baz}
+a.bar.baz {a: b}
+SCSS
+  end
+
+  def test_control_flow_if
+    assert_equal <<CSS, render(<<SCSS)
+.true, .also-true {
+  color: green; }
+
+.false, .also-false {
+  color: red; }
+CSS
+.true  { color: green; }
+.false { color: red;   }
+.also-true {
+  @if true { @extend .true;  }
+  @else    { @extend .false; }
+}
+.also-false {
+  @if false { @extend .true;  }
+  @else     { @extend .false; }
+}
+SCSS
+  end
+
+  def test_control_flow_for
+    assert_equal <<CSS, render(<<SCSS)
+.base-0, .added {
+  color: green; }
+
+.base-1, .added {
+  display: block; }
+
+.base-2, .added {
+  border: 1px solid blue; }
+CSS
+.base-0  { color: green; }
+.base-1  { display: block; }
+.base-2  { border: 1px solid blue; }
+.added {
+  @for $i from 0 to 3 {
+    @extend .base-\#{$i};
+  }
+}
+SCSS
+  end
+
+  def test_control_flow_while
+    assert_equal <<CSS, render(<<SCSS)
+.base-0, .added {
+  color: green; }
+
+.base-1, .added {
+  display: block; }
+
+.base-2, .added {
+  border: 1px solid blue; }
+CSS
+.base-0  { color: green; }
+.base-1  { display: block; }
+.base-2  { border: 1px solid blue; }
+.added {
+  $i : 0;
+  @while $i < 3 {
+    @extend .base-\#{$i};
+    $i : $i + 1;
+  }
+}
+SCSS
+  end
+
+  def test_basic_placeholder_selector
+    assert_extends '%foo', '.bar {@extend %foo}', '.bar'
+  end
+
+  def test_unused_placeholder_selector
+    assert_equal <<CSS, render(<<SCSS)
+.baz {
+  color: blue; }
+CSS
+%foo {color: blue}
+%bar {color: red}
+.baz {@extend %foo}
+SCSS
+  end
+
+  def test_placeholder_descendant_selector
+    assert_extends '#context %foo a', '.bar {@extend %foo}', '#context .bar a'
+  end
+
+  def test_semi_placeholder_selector
+    assert_equal <<CSS, render(<<SCSS)
+.bar .baz {
+  color: blue; }
+CSS
+#context %foo, .bar .baz {color: blue}
+SCSS
+  end
+
+  def test_placeholder_selector_with_multiple_extenders
+    assert_equal <<CSS, render(<<SCSS)
+.bar, .baz {
+  color: blue; }
+CSS
+%foo {color: blue}
+.bar {@extend %foo}
+.baz {@extend %foo}
+SCSS
+  end
+
+  def test_placeholder_selector_as_modifier
+    assert_equal <<CSS, render(<<SCSS)
+a.baz.bar {
+  color: blue; }
+CSS
+a%foo.baz {color: blue}
+.bar {@extend %foo}
+div {@extend %foo}
+SCSS
+  end
+
+  def test_placeholder_interpolation
+    assert_equal <<CSS, render(<<SCSS)
+.bar {
+  color: blue; }
+CSS
+$foo: foo;
+
+%\#{$foo} {color: blue}
+.bar {@extend %foo}
+SCSS
+  end
+
+  def test_placeholder_in_selector_pseudoclass
+    assert_equal <<CSS, render(<<SCSS)
+:matches(.bar, .baz) {
+  color: blue; }
+CSS
+:matches(%foo) {color: blue}
+.bar {@extend %foo}
+.baz {@extend %foo}
+SCSS
+  end
+
+  def test_media_in_placeholder_selector
+    assert_equal <<CSS, render(<<SCSS)
+.baz {
+  c: d; }
+CSS
+%foo {bar {@media screen {a: b}}}
+.baz {c: d}
+SCSS
+  end
+
+  def test_extend_out_of_media
+    assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
+You may not @extend an outer selector from within @media.
+You may only @extend selectors within the same directive.
+From "@extend .foo" on line 3 of test_extend_out_of_media_inline.scss.
+ERR
+.foo {a: b}
+@media screen {
+  .bar {@extend .foo}
+}
+SCSS
+  end
+
+  def test_extend_out_of_unknown_directive
+    assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
+You may not @extend an outer selector from within @flooblehoof.
+You may only @extend selectors within the same directive.
+From "@extend .foo" on line 3 of test_extend_out_of_unknown_directive_inline.scss.
+ERR
+.foo {a: b}
+@flooblehoof {
+  .bar {@extend .foo}
+}
+SCSS
+  end
+
+  def test_extend_out_of_nested_directives
+    assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
+You may not @extend an outer selector from within @flooblehoof.
+You may only @extend selectors within the same directive.
+From "@extend .foo" on line 4 of test_extend_out_of_nested_directives_inline.scss.
+ERR
+@media screen {
+  .foo {a: b}
+  @flooblehoof {
+    .bar {@extend .foo}
+  }
+}
+SCSS
+  end
+
+  def test_extend_within_media
+    assert_equal(<<CSS, render(<<SCSS))
+@media screen {
+  .foo, .bar {
+    a: b; } }
+CSS
+@media screen {
+  .foo {a: b}
+  .bar {@extend .foo}
+}
+SCSS
+  end
+
+  def test_extend_within_unknown_directive
+    assert_equal(<<CSS, render(<<SCSS))
+@flooblehoof {
+  .foo, .bar {
+    a: b; } }
+CSS
+@flooblehoof {
+  .foo {a: b}
+  .bar {@extend .foo}
+}
+SCSS
+  end
+
+  def test_extend_within_nested_directives
+    assert_equal(<<CSS, render(<<SCSS))
+@media screen {
+  @flooblehoof {
+    .foo, .bar {
+      a: b; } } }
+CSS
+@media screen {
+  @flooblehoof {
+    .foo {a: b}
+    .bar {@extend .foo}
+  }
+}
+SCSS
+  end
+
+  def test_extend_within_disparate_media
+    assert_equal(<<CSS, render(<<SCSS))
+@media screen {
+  .foo, .bar {
+    a: b; } }
+CSS
+@media screen {.foo {a: b}}
+@media screen {.bar {@extend .foo}}
+SCSS
+  end
+
+  def test_extend_within_disparate_unknown_directive
+    assert_equal(<<CSS, render(<<SCSS))
+@flooblehoof {
+  .foo, .bar {
+    a: b; } }
+@flooblehoof {}
+CSS
+@flooblehoof {.foo {a: b}}
+@flooblehoof {.bar {@extend .foo}}
+SCSS
+  end
+
+  def test_extend_within_disparate_nested_directives
+    assert_equal(<<CSS, render(<<SCSS))
+@media screen {
+  @flooblehoof {
+    .foo, .bar {
+      a: b; } } }
+@media screen {
+  @flooblehoof {} }
+CSS
+@media screen {@flooblehoof {.foo {a: b}}}
+@media screen {@flooblehoof {.bar {@extend .foo}}}
+SCSS
+  end
+
+  def test_extend_within_and_without_media
+    assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
+You may not @extend an outer selector from within @media.
+You may only @extend selectors within the same directive.
+From "@extend .foo" on line 4 of test_extend_within_and_without_media_inline.scss.
+ERR
+.foo {a: b}
+@media screen {
+  .foo {c: d}
+  .bar {@extend .foo}
+}
+SCSS
+  end
+
+  def test_extend_within_and_without_unknown_directive
+    assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
+You may not @extend an outer selector from within @flooblehoof.
+You may only @extend selectors within the same directive.
+From "@extend .foo" on line 4 of test_extend_within_and_without_unknown_directive_inline.scss.
+ERR
+.foo {a: b}
+@flooblehoof {
+  .foo {c: d}
+  .bar {@extend .foo}
+}
+SCSS
+  end
+
+  def test_extend_within_and_without_nested_directives
+    assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
+You may not @extend an outer selector from within @flooblehoof.
+You may only @extend selectors within the same directive.
+From "@extend .foo" on line 5 of test_extend_within_and_without_nested_directives_inline.scss.
+ERR
+@media screen {
+  .foo {a: b}
+  @flooblehoof {
+    .foo {c: d}
+    .bar {@extend .foo}
+  }
+}
+SCSS
+  end
+
+  def test_extend_with_subject_transfers_subject_to_extender
+    silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
+foo bar! baz, foo .bip .bap! baz, .bip foo .bap! baz {
+  a: b; }
+CSS
+foo bar! baz {a: b}
+.bip .bap {@extend bar}
+SCSS
+
+    silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
+foo.x bar.y! baz.z, foo.x .bip bar.bap! baz.z, .bip foo.x bar.bap! baz.z {
+  a: b; }
+CSS
+foo.x bar.y! baz.z {a: b}
+.bip .bap {@extend .y}
+SCSS
+  end
+
+  def test_extend_with_subject_retains_subject_on_target
+    silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
+.foo! .bar, .foo! .bip .bap, .bip .foo! .bap {
+  a: b; }
+CSS
+.foo! .bar {a: b}
+.bip .bap {@extend .bar}
+SCSS
+  end
+
+  def test_extend_with_subject_transfers_subject_to_target
+    silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
+a.foo .bar, .bip a.bap! .bar {
+  a: b; }
+CSS
+a.foo .bar {a: b}
+.bip .bap! {@extend .foo}
+SCSS
+  end
+
+  def test_extend_with_subject_retains_subject_on_extender
+    silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
+.foo .bar, .foo .bip! .bap, .bip! .foo .bap {
+  a: b; }
+CSS
+.foo .bar {a: b}
+.bip! .bap {@extend .bar}
+SCSS
+  end
+
+  def test_extend_with_subject_fails_with_conflicting_subject
+    silence_warnings {assert_equal(<<CSS, render(<<SCSS))}
+x! .bar {
+  a: b; }
+CSS
+x! .bar {a: b}
+y! .bap {@extend .bar}
+SCSS
+  end
+
+  def test_extend_warns_when_extendee_doesnt_exist
+    assert_raise_message(Sass::SyntaxError, <<ERR) {render(<<SCSS)}
+".foo" failed to @extend ".bar".
+The selector ".bar" was not found.
+Use "@extend .bar !optional" if the extend should be able to fail.
+ERR
+.foo {@extend .bar}
+SCSS
+  end
+
+  def test_extend_succeeds_when_one_extension_fails_but_others_dont
+    assert_equal(<<CSS, render(<<SCSS))
+a.bar {
+  a: b; }
+
+.bar, b.foo {
+  c: d; }
+CSS
+a.bar {a: b}
+.bar {c: d}
+b.foo {@extend .bar}
+SCSS
+  end
+
+  def test_optional_extend_succeeds_when_extendee_doesnt_exist
+    assert_equal("", render(<<SCSS))
+.foo {@extend .bar !optional}
+SCSS
+  end
+
+  def test_optional_extend_succeeds_when_extension_fails
+    assert_equal(<<CSS, render(<<SCSS))
+a.bar {
+  a: b; }
+CSS
+a.bar {a: b}
+b.foo {@extend .bar !optional}
+SCSS
+  end
+
+  # Regression Tests
+
+  def test_extend_with_middle_pseudo
+    assert_equal(<<CSS, render(<<SCSS))
+.btn:active.focus, :active.focus:before {
+  a: b; }
+CSS
+.btn:active.focus {a: b}
+:before {@extend .btn}
+SCSS
+  end
+
+  def test_extend_parent_selector_suffix
+    assert_equal <<CSS, render(<<SCSS)
+.a-b, .c {
+  x: y; }
+CSS
+.a {&-b {x: y}}
+.c {@extend .a-b}
+SCSS
+  end
+
+  def test_pseudo_element_superselector
+    # Pseudo-elements shouldn't be removed in superselector calculations.
+    assert_equal <<CSS, render(<<SCSS)
+a#bar, a#bar::fblthp {
+  a: b; }
+CSS
+%x#bar {a: b} // Add an id to make the results have high specificity
+%y, %y::fblthp {@extend %x}
+a {@extend %y}
+SCSS
+
+    # Pseudo-classes can be removed when the second law allows.
+    assert_equal <<CSS, render(<<SCSS)
+a#bar {
+  a: b; }
+CSS
+%x#bar {a: b}
+%y, %y:fblthp {@extend %x}
+a {@extend %y}
+SCSS
+
+    # A few pseudo-elements can be written as pseudo-elements for historical
+    # reasons. See http://www.w3.org/TR/selectors4/#pseudo-elements.
+    %w[first-line first-letter before after].each do |pseudo|
+      assert_equal <<CSS, render(<<SCSS)
+a#bar, a#bar:#{pseudo} {
+  a: b; }
+CSS
+%x#bar {a: b}
+%y, %y:#{pseudo} {@extend %x}
+a {@extend %y}
+SCSS
+    end
+  end
+
+  def test_multiple_source_redundancy_elimination
+    assert_equal <<CSS, render(<<SCSS)
+.test-case, .test-case:active {
+  color: red; }
+
+.test-case:hover {
+  color: green; }
+CSS
+%default-color {color: red}
+%alt-color {color: green}
+
+%default-style {
+  @extend %default-color;
+  &:hover {@extend %alt-color}
+  &:active {@extend %default-color}
+}
+
+.test-case {@extend %default-style}
+SCSS
+  end
+
+  def test_nested_sibling_extend
+    assert_equal <<CSS, render(<<SCSS)
+.parent .bar, .parent .foo {
+  width: 2000px; }
+CSS
+.foo {@extend .bar}
+
+.parent {
+  .bar {
+    width: 2000px;
+  }
+  .foo {
+    @extend .bar
+  }
+}
+SCSS
+  end
+
+  def test_parent_and_sibling_extend
+    assert_equal <<CSS, render(<<SCSS)
+.parent1 .parent2 .child1.child2, .parent2 .parent1 .child1.child2 {
+  c: d; }
+CSS
+%foo %bar%baz {c: d}
+
+.parent1 {
+  @extend %foo;
+  .child1 {@extend %bar}
+}
+
+.parent2 {
+  @extend %foo;
+  .child2 {@extend %baz}
+}
+SCSS
+  end
+
+  def test_nested_extend_specificity
+    assert_equal <<CSS, render(<<SCSS)
+a :b, a :b:c {
+  a: b; }
+CSS
+%foo {a: b}
+
+a {
+  :b {@extend %foo}
+  :b:c {@extend %foo}
+}
+SCSS
+  end
+
+  def test_nested_double_extend_optimization
+    assert_equal <<CSS, render(<<SCSS)
+.parent1 .child {
+  a: b; }
+CSS
+%foo %bar {
+  a: b;
+}
+
+.parent1 {
+  @extend %foo;
+
+  .child {
+    @extend %bar;
+  }
+}
+
+.parent2 {
+  @extend %foo;
+}
+SCSS
+  end
+
+  def test_extend_in_double_nested_media_query
+    assert_equal <<CSS, render(<<SCSS)
+@media all and (orientation: landscape) {
+  .bar {
+    color: blue; } }
+CSS
+@media all {
+  @media (orientation: landscape) {
+    %foo {color: blue}
+    .bar {@extend %foo}
+  }
+}
+SCSS
+  end
+
+  def test_partially_failed_extend
+    assert_no_warning {assert_equal(<<CSS, render(<<SCSS))}
+.rc, test {
+  color: white; }
+
+.prices span.pill span.rc {
+  color: red; }
+CSS
+test { @extend .rc; }
+.rc {color: white;}
+.prices span.pill span.rc {color: red;}
+SCSS
+  end
+
+  def test_newline_near_combinator
+    assert_equal <<CSS, render(<<SCSS)
+.a +
+.b x, .a +
+.b .c y, .c .a +
+.b y {
+  a: b; }
+CSS
+.a +
+.b x {a: b}
+.c y {@extend x}
+SCSS
+  end
+
+  def test_duplicated_selector_with_newlines
+    assert_equal(<<CSS, render(<<SCSS))
+.example-1-1,
+.example-1-2,
+.my-page-1 .my-module-1-1,
+.example-1-3 {
+  a: b; }
+CSS
+.example-1-1,
+.example-1-2,
+.example-1-3 {
+  a: b;
+}
+
+.my-page-1 .my-module-1-1 {@extend .example-1-2}
+SCSS
+  end
+
+  def test_nested_selector_with_child_selector_hack_extendee
+    assert_extends '> .foo', 'foo bar {@extend .foo}', '> .foo, > foo bar'
+  end
+
+  def test_nested_selector_with_child_selector_hack_extender
+    assert_extends '.foo .bar', '> foo bar {@extend .bar}', '.foo .bar, > .foo foo bar, > foo .foo bar'
+  end
+
+  def test_nested_selector_with_child_selector_hack_extender_and_extendee
+    assert_extends '> .foo', '> foo bar {@extend .foo}', '> .foo, > foo bar'
+  end
+
+  def test_nested_selector_with_child_selector_hack_extender_and_sibling_selector_extendee
+    assert_extends '~ .foo', '> foo bar {@extend .foo}', '~ .foo'
+  end
+
+  def test_nested_selector_with_child_selector_hack_extender_and_extendee_and_newline
+    assert_equal <<CSS, render(<<SCSS)
+> .foo, > flip,
+> foo bar {
+  a: b; }
+CSS
+> .foo {a: b}
+flip,
+> foo bar {@extend .foo}
+SCSS
+  end
+
+  def test_extended_parent_and_child_redundancy_elimination
+    assert_equal <<CSS, render(<<SCSS)
+a b, d b, a c, d c {
+  a: b; }
+CSS
+a {
+  b {a: b}
+  c {@extend b}
+}
+d {@extend a}
+SCSS
+  end
+
+  def test_extend_redundancy_elimination_when_it_would_reduce_specificity
+    assert_extends 'a', 'a.foo {@extend a}', 'a, a.foo'
+  end
+
+  def test_extend_redundancy_elimination_when_it_would_preserve_specificity
+    assert_extends '.bar a', 'a.foo {@extend a}', '.bar a'
+  end
+
+  def test_extend_redundancy_elimination_never_eliminates_base_selector
+    assert_extends 'a.foo', '.foo {@extend a}', 'a.foo, .foo'
+  end
+
+  def test_extend_cross_branch_redundancy_elimination
+    assert_equal <<CSS, render(<<SCSS)
+.a .c .d, .b .c .a .d {
+  a: b; }
+CSS
+%x .c %y {a: b}
+.a, .b {@extend %x}
+.a .d {@extend %y}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.e .a .c .d, .a .c .e .d, .e .b .c .a .d, .b .c .a .e .d {
+  a: b; }
+CSS
+.e %z {a: b}
+%x .c %y {@extend %z}
+.a, .b {@extend %x}
+.a .d {@extend %y}
+SCSS
+  end
+
+  private
+
+  def assert_extend_doesnt_match(extender, target, reason, line, syntax = :scss)
+    message = "\"#{extender}\" failed to @extend \"#{target}\"."
+    reason = 
+      if reason == :not_found
+        "The selector \"#{target}\" was not found."
+      else
+        "No selectors matching \"#{target}\" could be unified with \"#{extender}\"."
+      end
+
+    assert_raise_message(Sass::SyntaxError, <<ERR) {yield}
+#{message}
+#{reason}
+Use "@extend #{target} !optional" if the extend should be able to fail.
+ERR
+  end
+
+  def assert_unification(selector, extension, unified, nested = true)
+    # Do some trickery so the first law of extend doesn't get in our way.
+    assert_extends(
+      "%-a #{selector}",
+      extension + " -a {@extend %-a}",
+      unified.split(', ').map {|s| "-a #{s}"}.join(', '))
+  end
+
+  def assert_specificity_equals(sel1, sel2)
+    assert_specificity_gte(sel1, sel2)
+    assert_specificity_gte(sel2, sel1)
+  end
+
+  def assert_specificity_gte(sel1, sel2)
+    assert_equal <<CSS, render(<<SCSS)
+#{sel1} .a {
+  a: b; }
+CSS
+#{sel1} %-a {a: b}
+.a {@extend %-a}
+#{sel2}.a {@extend %-a}
+SCSS
+  end
+
+  def render_unification(selector, extension)
+    render_extends(
+      "%-a #{selector}",
+      extension + " -a {@extend %-a}")
+  end
+
+  def assert_extends(selector, extension, result)
+    assert_equal <<CSS, render_extends(selector, extension)
+#{result} {
+  a: b; }
+CSS
+  end
+
+  def assert_extends_to_nothing(selector, extension)
+    assert_equal '', render_extends(selector, extension)
+  end
+
+  def render_extends(selector, extension)
+    render(<<SCSS)
+#{selector} {a: b}
+#{extension}
+SCSS
+  end
+
+  def render(sass, options = {})
+    options = {:syntax => :scss}.merge(options)
+    munge_filename options
+    Sass::Engine.new(sass, options).render
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/fixtures/test_staleness_check_across_importers.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/fixtures/test_staleness_check_across_importers.css
new file mode 100644
index 0000000..77b6225
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/fixtures/test_staleness_check_across_importers.css
@@ -0,0 +1 @@
+.pear { color: green; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/fixtures/test_staleness_check_across_importers.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/fixtures/test_staleness_check_across_importers.scss
new file mode 100644
index 0000000..1468ac9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/fixtures/test_staleness_check_across_importers.scss
@@ -0,0 +1 @@
+@import "apple";
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/functions_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/functions_test.rb
new file mode 100755
index 0000000..f93b383
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/functions_test.rb
@@ -0,0 +1,2021 @@
+require 'minitest/autorun'
+require File.dirname(__FILE__) + '/../test_helper'
+require File.dirname(__FILE__) + '/test_helper'
+require 'sass/script'
+require 'mock_importer'
+
+module Sass::Script::Functions
+  def no_kw_args
+    Sass::Script::Value::String.new("no-kw-args")
+  end
+
+  def only_var_args(*args)
+    Sass::Script::Value::String.new("only-var-args("+args.map{|a| a.plus(Sass::Script::Value::Number.new(1)).to_s }.join(", ")+")")
+  end
+  declare :only_var_args, [], :var_args => true
+
+  def only_kw_args(kwargs)
+    Sass::Script::Value::String.new("only-kw-args(" + kwargs.keys.map {|a| a.to_s}.sort.join(", ") + ")")
+  end
+  declare :only_kw_args, [], :var_kwargs => true
+
+  def deprecated_arg_fn(arg1, arg2, arg3 = nil)
+    Sass::Script::Value::List.new(
+      [arg1, arg2, arg3 || Sass::Script::Value::Null.new],
+      separator: :space)
+  end
+  declare :deprecated_arg_fn, [:arg1, :arg2, :arg3], :deprecated => [:arg_1, :arg_2, :arg3]
+  declare :deprecated_arg_fn, [:arg1, :arg2], :deprecated => [:arg_1, :arg_2]
+end
+
+module Sass::Script::Functions::UserFunctions
+  def call_options_on_new_value
+    str = Sass::Script::Value::String.new("foo")
+    str.options[:foo]
+    str
+  end
+
+  def user_defined
+    Sass::Script::Value::String.new("I'm a user-defined string!")
+  end
+
+  def _preceding_underscore
+    Sass::Script::Value::String.new("I'm another user-defined string!")
+  end
+
+  def fetch_the_variable
+    environment.var('variable')
+  end
+end
+
+module Sass::Script::Functions
+  include Sass::Script::Functions::UserFunctions
+end
+
+class SassFunctionTest < MiniTest::Test
+  # Tests taken from:
+  #   http://www.w3.org/Style/CSS/Test/CSS3/Color/20070927/html4/t040204-hsl-h-rotating-b.htm
+  #   http://www.w3.org/Style/CSS/Test/CSS3/Color/20070927/html4/t040204-hsl-values-b.htm
+  File.read(File.dirname(__FILE__) + "/data/hsl-rgb.txt").split("\n\n").each do |chunk|
+    hsls, rgbs = chunk.strip.split("====")
+    hsls.strip.split("\n").zip(rgbs.strip.split("\n")) do |hsl, rgb|
+      hsl_method = "test_hsl: #{hsl} = #{rgb}"
+      unless method_defined?(hsl_method)
+        define_method(hsl_method) do
+          assert_equal(evaluate(rgb), evaluate(hsl))
+        end
+      end
+
+      rgb_to_hsl_method = "test_rgb_to_hsl: #{rgb} = #{hsl}"
+      unless method_defined?(rgb_to_hsl_method)
+        define_method(rgb_to_hsl_method) do
+          rgb_color = perform(rgb)
+          hsl_color = perform(hsl)
+
+          white = hsl_color.lightness == 100
+          black = hsl_color.lightness == 0
+          grayscale = white || black || hsl_color.saturation == 0
+
+          assert_in_delta(hsl_color.hue, rgb_color.hue, 0.0001,
+            "Hues should be equal") unless grayscale
+          assert_in_delta(hsl_color.saturation, rgb_color.saturation, 0.0001,
+            "Saturations should be equal") unless white || black
+          assert_in_delta(hsl_color.lightness, rgb_color.lightness, 0.0001,
+            "Lightnesses should be equal")
+        end
+      end
+    end
+  end
+
+  def test_hsl_kwargs
+    assert_equal "#33cccc", evaluate("hsl($hue: 180, $saturation: 60%, $lightness: 50%)")
+  end
+
+  def test_hsl_clamps_bounds
+    assert_equal("#1f1f1f", evaluate("hsl(10, -114, 12)"))
+    assert_equal("white", evaluate("hsl(10, 10, 256%)"))
+  end
+
+  def test_hsl_checks_types
+    assert_error_message("$hue: \"foo\" is not a number for `hsl'", "hsl(\"foo\", 10, 12)");
+    assert_error_message("$saturation: \"foo\" is not a number for `hsl'", "hsl(10, \"foo\", 12)");
+    assert_error_message("$lightness: \"foo\" is not a number for `hsl'", "hsl(10, 10, \"foo\")");
+  end
+
+  def test_hsla
+    assert_equal "rgba(51, 204, 204, 0.4)", evaluate("hsla(180, 60%, 50%, 0.4)")
+    assert_equal "#33cccc", evaluate("hsla(180, 60%, 50%, 1)")
+    assert_equal "rgba(51, 204, 204, 0)", evaluate("hsla(180, 60%, 50%, 0)")
+    assert_equal "rgba(51, 204, 204, 0.4)", evaluate("hsla($hue: 180, $saturation: 60%, $lightness: 50%, $alpha: 0.4)")
+  end
+
+  def test_hsla_clamps_bounds
+    assert_equal("#1f1f1f", evaluate("hsla(10, -114, 12, 1)"))
+    assert_equal("rgba(255, 255, 255, 0)", evaluate("hsla(10, 10, 256%, 0)"))
+    assert_equal("rgba(28, 24, 23, 0)", evaluate("hsla(10, 10, 10, -0.1)"))
+    assert_equal("#1c1817", evaluate("hsla(10, 10, 10, 1.1)"))
+  end
+
+  def test_hsla_checks_types
+    assert_error_message("$hue: \"foo\" is not a number for `hsla'", "hsla(\"foo\", 10, 12, 0.3)");
+    assert_error_message("$saturation: \"foo\" is not a number for `hsla'", "hsla(10, \"foo\", 12, 0)");
+    assert_error_message("$lightness: \"foo\" is not a number for `hsla'", "hsla(10, 10, \"foo\", 1)");
+    assert_error_message("$alpha: \"foo\" is not a number for `hsla'", "hsla(10, 10, 10, \"foo\")");
+  end
+
+  def test_hsla_percent_warning
+    assert_warning(<<WARNING) {evaluate("hsla(180, 60%, 50%, 40%)")}
+DEPRECATION WARNING: Passing a percentage as the alpha value to hsla() will be
+interpreted differently in future versions of Sass. For now, use 40 instead.
+WARNING
+  end
+
+  def test_hsla_unit_warning
+    assert_warning(<<WARNING) {evaluate("hsla(180, 60%, 50%, 40em)")}
+DEPRECATION WARNING: Passing a number with units as the alpha value to hsla() is
+deprecated and will be an error in future versions of Sass. Use 40 instead.
+WARNING
+  end
+
+  def test_percentage
+    assert_equal("50%",  evaluate("percentage(.5)"))
+    assert_equal("100%", evaluate("percentage(1)"))
+    assert_equal("25%",  evaluate("percentage(25px / 100px)"))
+    assert_equal("50%",  evaluate("percentage($number: 0.5)"))
+  end
+
+  def test_percentage_checks_types
+    assert_error_message("$number: 25px is not a unitless number for `percentage'", "percentage(25px)")
+    assert_error_message("$number: #cccccc is not a unitless number for `percentage'", "percentage(#ccc)")
+    assert_error_message("$number: \"string\" is not a unitless number for `percentage'", %Q{percentage("string")})
+  end
+
+  def test_round
+    assert_equal("5",   evaluate("round(4.8)"))
+    assert_equal("5px", evaluate("round(4.8px)"))
+    assert_equal("5px", evaluate("round(5.49px)"))
+    assert_equal("5px", evaluate("round($number: 5.49px)"))
+    assert_equal("-6", evaluate("round(-5.5)"))
+  end
+
+  def test_round_checks_types
+    assert_error_message("$value: #cccccc is not a number for `round'", "round(#ccc)")
+  end
+
+  def test_floor
+    assert_equal("4",   evaluate("floor(4.8)"))
+    assert_equal("4px", evaluate("floor(4.8px)"))
+    assert_equal("4px", evaluate("floor($number: 4.8px)"))
+  end
+
+  def test_floor_checks_types
+    assert_error_message("$value: \"foo\" is not a number for `floor'", "floor(\"foo\")")
+  end
+
+  def test_ceil
+    assert_equal("5",   evaluate("ceil(4.1)"))
+    assert_equal("5px", evaluate("ceil(4.8px)"))
+    assert_equal("5px", evaluate("ceil($number: 4.8px)"))
+  end
+
+  def test_ceil_checks_types
+    assert_error_message("$value: \"a\" is not a number for `ceil'", "ceil(\"a\")")
+  end
+
+  def test_abs
+    assert_equal("5",   evaluate("abs(-5)"))
+    assert_equal("5px", evaluate("abs(-5px)"))
+    assert_equal("5",   evaluate("abs(5)"))
+    assert_equal("5px", evaluate("abs(5px)"))
+    assert_equal("5px", evaluate("abs($number: 5px)"))
+  end
+
+  def test_abs_checks_types
+    assert_error_message("$value: #aaaaaa is not a number for `abs'", "abs(#aaa)")
+  end
+
+  def test_min
+    assert_equal("1", evaluate("min(1, 2, 3)"))
+    assert_equal("1", evaluate("min(3px, 2px, 1)"))
+    assert_equal("4em", evaluate("min(4em)"))
+    assert_equal("10cm", evaluate("min(10cm, 6in)"))
+    assert_equal("1q", evaluate("min(1cm, 1q)"))
+
+    assert_error_message("#aaaaaa is not a number for `min'", "min(#aaa)")
+    assert_error_message("Incompatible units: 'px' and 'em'.", "min(3em, 4em, 1px)")
+  end
+
+  def test_max
+    assert_equal("3", evaluate("max(1, 2, 3)"))
+    assert_equal("3", evaluate("max(3, 2px, 1px)"))
+    assert_equal("4em", evaluate("max(4em)"))
+    assert_equal("6in", evaluate("max(10cm, 6in)"))
+    assert_equal("11mm", evaluate("max(11mm, 10q)"))
+
+    assert_error_message("#aaaaaa is not a number for `max'", "max(#aaa)")
+    assert_error_message("Incompatible units: 'px' and 'em'.", "max(3em, 4em, 1px)")
+  end
+
+  def test_rgb
+    assert_equal("#123456", evaluate("rgb(18, 52, 86)"))
+    assert_equal("#beaded", evaluate("rgb(190, 173, 237)"))
+    assert_equal("springgreen", evaluate("rgb(0, 255, 127)"))
+    assert_equal("springgreen", evaluate("rgb($red: 0, $green: 255, $blue: 127)"))
+  end
+
+  def test_rgb_percent
+    assert_equal("#123457", evaluate("rgb(7.1%, 20.4%, 34%)"))
+    assert_equal("#beaded", evaluate("rgb(74.7%, 173, 93%)"))
+    assert_equal("#beaded", evaluate("rgb(190, 68%, 237)"))
+    assert_equal("#00ff80", evaluate("rgb(0%, 100%, 50%)"))
+  end
+
+  def test_rgb_clamps_bounds
+    assert_equal("#ff0101", evaluate("rgb(256, 1, 1)"))
+    assert_equal("#01ff01", evaluate("rgb(1, 256, 1)"))
+    assert_equal("#0101ff", evaluate("rgb(1, 1, 256)"))
+    assert_equal("#01ffff", evaluate("rgb(1, 256, 257)"))
+    assert_equal("#000101", evaluate("rgb(-1, 1, 1)"))
+  end
+
+  def test_rgb_clamps_percent_bounds
+    assert_equal("red", evaluate("rgb(100.1%, 0, 0)"))
+    assert_equal("black", evaluate("rgb(0, -0.1%, 0)"))
+    assert_equal("blue", evaluate("rgb(0, 0, 101%)"))
+  end
+
+  def test_rgb_tests_types
+    assert_error_message("$red: \"foo\" is not a number for `rgb'", "rgb(\"foo\", 10, 12)");
+    assert_error_message("$green: \"foo\" is not a number for `rgb'", "rgb(10, \"foo\", 12)");
+    assert_error_message("$blue: \"foo\" is not a number for `rgb'", "rgb(10, 10, \"foo\")");
+  end
+
+  def test_rgba
+    assert_equal("rgba(18, 52, 86, 0.5)", evaluate("rgba(18, 52, 86, 0.5)"))
+    assert_equal("#beaded", evaluate("rgba(190, 173, 237, 1)"))
+    assert_equal("rgba(0, 255, 127, 0)", evaluate("rgba(0, 255, 127, 0)"))
+    assert_equal("rgba(0, 255, 127, 0)", evaluate("rgba($red: 0, $green: 255, $blue: 127, $alpha: 0)"))
+  end
+
+  def test_rgba_clamps_bounds
+    assert_equal("rgba(255, 1, 1, 0.3)", evaluate("rgba(256, 1, 1, 0.3)"))
+    assert_equal("rgba(1, 255, 1, 0.3)", evaluate("rgba(1, 256, 1, 0.3)"))
+    assert_equal("rgba(1, 1, 255, 0.3)", evaluate("rgba(1, 1, 256, 0.3)"))
+    assert_equal("rgba(1, 255, 255, 0.3)", evaluate("rgba(1, 256, 257, 0.3)"))
+    assert_equal("rgba(0, 1, 1, 0.3)", evaluate("rgba(-1, 1, 1, 0.3)"))
+    assert_equal("rgba(1, 1, 1, 0)", evaluate("rgba(1, 1, 1, -0.2)"))
+    assert_equal("#010101", evaluate("rgba(1, 1, 1, 1.2)"))
+  end
+
+  def test_rgba_tests_types
+    assert_error_message("$red: \"foo\" is not a number for `rgba'", "rgba(\"foo\", 10, 12, 0.2)");
+    assert_error_message("$green: \"foo\" is not a number for `rgba'", "rgba(10, \"foo\", 12, 0.1)");
+    assert_error_message("$blue: \"foo\" is not a number for `rgba'", "rgba(10, 10, \"foo\", 0)");
+    assert_error_message("$alpha: \"foo\" is not a number for `rgba'", "rgba(10, 10, 10, \"foo\")");
+  end
+
+  def test_rgba_with_color
+    assert_equal "rgba(16, 32, 48, 0.5)", evaluate("rgba(#102030, 0.5)")
+    assert_equal "rgba(0, 0, 255, 0.5)", evaluate("rgba(blue, 0.5)")
+    assert_equal "rgba(0, 0, 255, 0.5)", evaluate("rgba($color: blue, $alpha: 0.5)")
+  end
+
+  def test_rgba_with_color_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `rgba'", "rgba(\"foo\", 0.2)");
+    assert_error_message("$alpha: \"foo\" is not a number for `rgba'", "rgba(blue, \"foo\")");
+  end
+
+  def test_rgba_tests_num_args
+    assert_error_message("wrong number of arguments (0 for 4) for `rgba'", "rgba()");
+    assert_error_message("wrong number of arguments (1 for 4) for `rgba'", "rgba(blue)");
+    assert_error_message("wrong number of arguments (3 for 4) for `rgba'", "rgba(1, 2, 3)");
+    assert_error_message("wrong number of arguments (5 for 4) for `rgba'", "rgba(1, 2, 3, 0.4, 5)");
+  end
+
+  def test_rgba_percent_warning
+    assert_warning(<<WARNING) {evaluate("rgba(1, 2, 3, 40%)")}
+DEPRECATION WARNING: Passing a percentage as the alpha value to rgba() will be
+interpreted differently in future versions of Sass. For now, use 40 instead.
+WARNING
+  end
+
+  def test_rgba_unit_warning
+    assert_warning(<<WARNING) {evaluate("rgba(1, 2, 3, 40em)")}
+DEPRECATION WARNING: Passing a number with units as the alpha value to rgba() is
+deprecated and will be an error in future versions of Sass. Use 40 instead.
+WARNING
+  end
+
+  def test_red
+    assert_equal("18", evaluate("red(#123456)"))
+    assert_equal("18", evaluate("red($color: #123456)"))
+  end
+
+  def test_red_exception
+    assert_error_message("$color: 12 is not a color for `red'", "red(12)")
+  end
+
+  def test_green
+    assert_equal("52", evaluate("green(#123456)"))
+    assert_equal("52", evaluate("green($color: #123456)"))
+  end
+
+  def test_green_exception
+    assert_error_message("$color: 12 is not a color for `green'", "green(12)")
+  end
+
+  def test_blue
+    assert_equal("86", evaluate("blue(#123456)"))
+    assert_equal("86", evaluate("blue($color: #123456)"))
+  end
+
+  def test_blue_exception
+    assert_error_message("$color: 12 is not a color for `blue'", "blue(12)")
+  end
+
+  def test_hue
+    assert_equal("18deg", evaluate("hue(hsl(18, 50%, 20%))"))
+    assert_equal("18deg", evaluate("hue($color: hsl(18, 50%, 20%))"))
+  end
+
+  def test_hue_exception
+    assert_error_message("$color: 12 is not a color for `hue'", "hue(12)")
+  end
+
+  def test_saturation
+    assert_equal("52%", evaluate("saturation(hsl(20, 52%, 20%))"))
+    assert_equal("52%", evaluate("saturation(hsl(20, 52, 20%))"))
+    assert_equal("52%", evaluate("saturation($color: hsl(20, 52, 20%))"))
+  end
+
+  def test_saturation_exception
+    assert_error_message("$color: 12 is not a color for `saturation'", "saturation(12)")
+  end
+
+  def test_lightness
+    assert_equal("86%", evaluate("lightness(hsl(120, 50%, 86%))"))
+    assert_equal("86%", evaluate("lightness(hsl(120, 50%, 86))"))
+    assert_equal("86%", evaluate("lightness($color: hsl(120, 50%, 86))"))
+  end
+
+  def test_lightness_exception
+    assert_error_message("$color: 12 is not a color for `lightness'", "lightness(12)")
+  end
+
+  def test_alpha
+    assert_equal("1", evaluate("alpha(#123456)"))
+    assert_equal("0.34", evaluate("alpha(rgba(0, 1, 2, 0.34))"))
+    assert_equal("0", evaluate("alpha(hsla(0, 1, 2, 0))"))
+    assert_equal("0", evaluate("alpha($color: hsla(0, 1, 2, 0))"))
+  end
+
+  def test_alpha_exception
+    assert_error_message("$color: 12 is not a color for `alpha'", "alpha(12)")
+  end
+
+  def test_opacity
+    assert_equal("1", evaluate("opacity(#123456)"))
+    assert_equal("0.34", evaluate("opacity(rgba(0, 1, 2, 0.34))"))
+    assert_equal("0", evaluate("opacity(hsla(0, 1, 2, 0))"))
+    assert_equal("0", evaluate("opacity($color: hsla(0, 1, 2, 0))"))
+    assert_equal("opacity(20%)", evaluate("opacity(20%)"))
+  end
+
+  def test_opacity_exception
+    assert_error_message("$color: \"foo\" is not a color for `opacity'", "opacity(foo)")
+  end
+
+  def test_opacify
+    assert_equal("rgba(0, 0, 0, 0.75)", evaluate("opacify(rgba(0, 0, 0, 0.5), 0.25)"))
+    assert_equal("rgba(0, 0, 0, 0.3)", evaluate("opacify(rgba(0, 0, 0, 0.2), 0.1)"))
+    assert_equal("rgba(0, 0, 0, 0.7)", evaluate("fade-in(rgba(0, 0, 0, 0.2), 0.5px)"))
+    assert_equal("black", evaluate("fade_in(rgba(0, 0, 0, 0.2), 0.8)"))
+    assert_equal("black", evaluate("opacify(rgba(0, 0, 0, 0.2), 1)"))
+    assert_equal("rgba(0, 0, 0, 0.2)", evaluate("opacify(rgba(0, 0, 0, 0.2), 0%)"))
+    assert_equal("rgba(0, 0, 0, 0.2)", evaluate("opacify($color: rgba(0, 0, 0, 0.2), $amount: 0%)"))
+    assert_equal("rgba(0, 0, 0, 0.2)", evaluate("fade-in($color: rgba(0, 0, 0, 0.2), $amount: 0%)"))
+  end
+
+  def test_opacify_tests_bounds
+    assert_error_message("Amount -0.001 must be between 0 and 1 for `opacify'",
+      "opacify(rgba(0, 0, 0, 0.2), -0.001)")
+    assert_error_message("Amount 1.001 must be between 0 and 1 for `opacify'",
+      "opacify(rgba(0, 0, 0, 0.2), 1.001)")
+  end
+
+  def test_opacify_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `opacify'", "opacify(\"foo\", 10%)")
+    assert_error_message("$amount: \"foo\" is not a number for `opacify'", "opacify(#fff, \"foo\")")
+  end
+
+  def test_transparentize
+    assert_equal("rgba(0, 0, 0, 0.3)", evaluate("transparentize(rgba(0, 0, 0, 0.5), 0.2)"))
+    assert_equal("rgba(0, 0, 0, 0.1)", evaluate("transparentize(rgba(0, 0, 0, 0.2), 0.1)"))
+    assert_equal("rgba(0, 0, 0, 0.2)", evaluate("fade-out(rgba(0, 0, 0, 0.5), 0.3px)"))
+    assert_equal("rgba(0, 0, 0, 0)", evaluate("fade_out(rgba(0, 0, 0, 0.2), 0.2)"))
+    assert_equal("rgba(0, 0, 0, 0)", evaluate("transparentize(rgba(0, 0, 0, 0.2), 1)"))
+    assert_equal("rgba(0, 0, 0, 0.2)", evaluate("transparentize(rgba(0, 0, 0, 0.2), 0)"))
+    assert_equal("rgba(0, 0, 0, 0.2)", evaluate("transparentize($color: rgba(0, 0, 0, 0.2), $amount: 0)"))
+    assert_equal("rgba(0, 0, 0, 0.2)", evaluate("fade-out($color: rgba(0, 0, 0, 0.2), $amount: 0)"))
+  end
+
+  def test_transparentize_tests_bounds
+    assert_error_message("Amount -0.001 must be between 0 and 1 for `transparentize'",
+      "transparentize(rgba(0, 0, 0, 0.2), -0.001)")
+    assert_error_message("Amount 1.001 must be between 0 and 1 for `transparentize'",
+      "transparentize(rgba(0, 0, 0, 0.2), 1.001)")
+  end
+
+  def test_transparentize_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `transparentize'", "transparentize(\"foo\", 10%)")
+    assert_error_message("$amount: \"foo\" is not a number for `transparentize'", "transparentize(#fff, \"foo\")")
+  end
+
+  def test_lighten
+    assert_equal("#4d4d4d", evaluate("lighten(hsl(0, 0, 0), 30%)"))
+    assert_equal("#ee0000", evaluate("lighten(#800, 20%)"))
+    assert_equal("white", evaluate("lighten(#fff, 20%)"))
+    assert_equal("white", evaluate("lighten(#800, 100%)"))
+    assert_equal("#880000", evaluate("lighten(#800, 0%)"))
+    assert_equal("rgba(238, 0, 0, 0.5)", evaluate("lighten(rgba(136, 0, 0, 0.5), 20%)"))
+    assert_equal("rgba(238, 0, 0, 0.5)", evaluate("lighten($color: rgba(136, 0, 0, 0.5), $amount: 20%)"))
+  end
+
+  def test_lighten_tests_bounds
+    assert_error_message("Amount -0.001 must be between 0% and 100% for `lighten'",
+      "lighten(#123, -0.001)")
+    assert_error_message("Amount 100.001 must be between 0% and 100% for `lighten'",
+      "lighten(#123, 100.001)")
+  end
+
+  def test_lighten_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `lighten'", "lighten(\"foo\", 10%)")
+    assert_error_message("$amount: \"foo\" is not a number for `lighten'", "lighten(#fff, \"foo\")")
+  end
+
+  def test_darken
+    assert_equal("#ff6a00", evaluate("darken(hsl(25, 100, 80), 30%)"))
+    assert_equal("#220000", evaluate("darken(#800, 20%)"))
+    assert_equal("black", evaluate("darken(#000, 20%)"))
+    assert_equal("black", evaluate("darken(#800, 100%)"))
+    assert_equal("#880000", evaluate("darken(#800, 0%)"))
+    assert_equal("rgba(34, 0, 0, 0.5)", evaluate("darken(rgba(136, 0, 0, 0.5), 20%)"))
+    assert_equal("rgba(34, 0, 0, 0.5)", evaluate("darken($color: rgba(136, 0, 0, 0.5), $amount: 20%)"))
+  end
+
+  def test_darken_tests_bounds
+    assert_error_message("Amount -0.001 must be between 0% and 100% for `darken'",
+      "darken(#123, -0.001)")
+    assert_error_message("Amount 100.001 must be between 0% and 100% for `darken'",
+      "darken(#123, 100.001)")
+  end
+
+  def test_darken_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `darken'", "darken(\"foo\", 10%)")
+    assert_error_message("$amount: \"foo\" is not a number for `darken'", "darken(#fff, \"foo\")")
+  end
+
+  def test_saturate
+    assert_equal("#d9f2d9", evaluate("saturate(hsl(120, 30, 90), 20%)"))
+    assert_equal("#9e3f3f", evaluate("saturate(#855, 20%)"))
+    assert_equal("black", evaluate("saturate(#000, 20%)"))
+    assert_equal("white", evaluate("saturate(#fff, 20%)"))
+    assert_equal("#33ff33", evaluate("saturate(#8a8, 100%)"))
+    assert_equal("#88aa88", evaluate("saturate(#8a8, 0%)"))
+    assert_equal("rgba(158, 63, 63, 0.5)", evaluate("saturate(rgba(136, 85, 85, 0.5), 20%)"))
+    assert_equal("rgba(158, 63, 63, 0.5)", evaluate("saturate($color: rgba(136, 85, 85, 0.5), $amount: 20%)"))
+    assert_equal("saturate(50%)", evaluate("saturate(50%)"))
+  end
+
+  def test_saturate_tests_bounds
+    assert_error_message("Amount -0.001 must be between 0% and 100% for `saturate'",
+      "saturate(#123, -0.001)")
+    assert_error_message("Amount 100.001 must be between 0% and 100% for `saturate'",
+      "saturate(#123, 100.001)")
+  end
+
+  def test_saturate_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `saturate'", "saturate(\"foo\", 10%)")
+    assert_error_message("$amount: \"foo\" is not a number for `saturate'", "saturate(#fff, \"foo\")")
+  end
+
+  def test_desaturate
+    assert_equal("#e3e8e3", evaluate("desaturate(hsl(120, 30, 90), 20%)"))
+    assert_equal("#726b6b", evaluate("desaturate(#855, 20%)"))
+    assert_equal("black", evaluate("desaturate(#000, 20%)"))
+    assert_equal("white", evaluate("desaturate(#fff, 20%)"))
+    assert_equal("#999999", evaluate("desaturate(#8a8, 100%)"))
+    assert_equal("#88aa88", evaluate("desaturate(#8a8, 0%)"))
+    assert_equal("rgba(114, 107, 107, 0.5)", evaluate("desaturate(rgba(136, 85, 85, 0.5), 20%)"))
+    assert_equal("rgba(114, 107, 107, 0.5)", evaluate("desaturate($color: rgba(136, 85, 85, 0.5), $amount: 20%)"))
+  end
+
+  def test_desaturate_tests_bounds
+    assert_error_message("Amount -0.001 must be between 0% and 100% for `desaturate'",
+      "desaturate(#123, -0.001)")
+    assert_error_message("Amount 100.001 must be between 0% and 100% for `desaturate'",
+      "desaturate(#123, 100.001)")
+  end
+
+  def test_desaturate_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `desaturate'", "desaturate(\"foo\", 10%)")
+    assert_error_message("$amount: \"foo\" is not a number for `desaturate'", "desaturate(#fff, \"foo\")")
+  end
+
+  def test_adjust_hue
+    assert_equal("#deeded", evaluate("adjust-hue(hsl(120, 30, 90), 60deg)"))
+    assert_equal("#ededde", evaluate("adjust-hue(hsl(120, 30, 90), -60deg)"))
+    assert_equal("#886a11", evaluate("adjust-hue(#811, 45deg)"))
+    assert_equal("black", evaluate("adjust-hue(#000, 45deg)"))
+    assert_equal("white", evaluate("adjust-hue(#fff, 45deg)"))
+    assert_equal("#88aa88", evaluate("adjust-hue(#8a8, 360deg)"))
+    assert_equal("#88aa88", evaluate("adjust-hue(#8a8, 0deg)"))
+    assert_equal("rgba(136, 106, 17, 0.5)", evaluate("adjust-hue(rgba(136, 17, 17, 0.5), 45deg)"))
+    assert_equal("rgba(136, 106, 17, 0.5)", evaluate("adjust-hue($color: rgba(136, 17, 17, 0.5), $degrees: 45deg)"))
+  end
+
+  def test_adjust_hue_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `adjust-hue'", "adjust-hue(\"foo\", 10%)")
+    assert_error_message("$degrees: \"foo\" is not a number for `adjust-hue'", "adjust-hue(#fff, \"foo\")")
+  end
+
+  def test_adjust_color
+    # HSL
+    assert_equal(evaluate("hsl(180, 30, 90)"),
+      evaluate("adjust-color(hsl(120, 30, 90), $hue: 60deg)"))
+    assert_equal(evaluate("hsl(120, 50, 90)"),
+      evaluate("adjust-color(hsl(120, 30, 90), $saturation: 20%)"))
+    assert_equal(evaluate("hsl(120, 30, 60)"),
+      evaluate("adjust-color(hsl(120, 30, 90), $lightness: -30%)"))
+    # RGB
+    assert_equal(evaluate("rgb(15, 20, 30)"),
+      evaluate("adjust-color(rgb(10, 20, 30), $red: 5)"))
+    assert_equal(evaluate("rgb(10, 15, 30)"),
+      evaluate("adjust-color(rgb(10, 20, 30), $green: -5)"))
+    assert_equal(evaluate("rgb(10, 20, 40)"),
+      evaluate("adjust-color(rgb(10, 20, 30), $blue: 10)"))
+    # Alpha
+    assert_equal(evaluate("hsla(120, 30, 90, 0.65)"),
+      evaluate("adjust-color(hsl(120, 30, 90), $alpha: -0.35)"))
+    assert_equal(evaluate("rgba(10, 20, 30, 0.9)"),
+      evaluate("adjust-color(rgba(10, 20, 30, 0.4), $alpha: 0.5)"))
+
+    # HSL composability
+    assert_equal(evaluate("hsl(180, 20, 90)"),
+      evaluate("adjust-color(hsl(120, 30, 90), $hue: 60deg, $saturation: -10%)"))
+    assert_equal(evaluate("hsl(180, 20, 95)"),
+      evaluate("adjust-color(hsl(120, 30, 90), $hue: 60deg, $saturation: -10%, $lightness: 5%)"))
+    assert_equal(evaluate("hsla(120, 20, 95, 0.3)"),
+      evaluate("adjust-color(hsl(120, 30, 90), $saturation: -10%, $lightness: 5%, $alpha: -0.7)"))
+
+    # RGB composability
+    assert_equal(evaluate("rgb(15, 20, 29)"),
+      evaluate("adjust-color(rgb(10, 20, 30), $red: 5, $blue: -1)"))
+    assert_equal(evaluate("rgb(15, 45, 29)"),
+      evaluate("adjust-color(rgb(10, 20, 30), $red: 5, $green: 25, $blue: -1)"))
+    assert_equal(evaluate("rgba(10, 25, 29, 0.7)"),
+      evaluate("adjust-color(rgb(10, 20, 30), $green: 5, $blue: -1, $alpha: -0.3)"))
+
+    # HSL range restriction
+    assert_equal(evaluate("hsl(120, 30, 90)"),
+      evaluate("adjust-color(hsl(120, 30, 90), $hue: 720deg)"))
+    assert_equal(evaluate("hsl(120, 0, 90)"),
+      evaluate("adjust-color(hsl(120, 30, 90), $saturation: -90%)"))
+    assert_equal(evaluate("hsl(120, 30, 100)"),
+      evaluate("adjust-color(hsl(120, 30, 90), $lightness: 30%)"))
+
+    # RGB range restriction
+    assert_equal(evaluate("rgb(255, 20, 30)"),
+      evaluate("adjust-color(rgb(10, 20, 30), $red: 250)"))
+    assert_equal(evaluate("rgb(10, 0, 30)"),
+      evaluate("adjust-color(rgb(10, 20, 30), $green: -30)"))
+    assert_equal(evaluate("rgb(10, 20, 0)"),
+      evaluate("adjust-color(rgb(10, 20, 30), $blue: -40)"))
+  end
+
+  def test_adjust_color_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `adjust-color'", "adjust-color(foo, $hue: 10)")
+    # HSL
+    assert_error_message("$hue: \"foo\" is not a number for `adjust-color'",
+      "adjust-color(blue, $hue: foo)")
+    assert_error_message("$saturation: \"foo\" is not a number for `adjust-color'",
+      "adjust-color(blue, $saturation: foo)")
+    assert_error_message("$lightness: \"foo\" is not a number for `adjust-color'",
+      "adjust-color(blue, $lightness: foo)")
+    # RGB
+    assert_error_message("$red: \"foo\" is not a number for `adjust-color'",
+      "adjust-color(blue, $red: foo)")
+    assert_error_message("$green: \"foo\" is not a number for `adjust-color'",
+      "adjust-color(blue, $green: foo)")
+    assert_error_message("$blue: \"foo\" is not a number for `adjust-color'",
+      "adjust-color(blue, $blue: foo)")
+    # Alpha
+    assert_error_message("$alpha: \"foo\" is not a number for `adjust-color'",
+      "adjust-color(blue, $alpha: foo)")
+  end
+
+  def test_adjust_color_tests_arg_range
+    # HSL
+    assert_error_message("$saturation: Amount 101% must be between -100% and 100% for `adjust-color'",
+      "adjust-color(blue, $saturation: 101%)")
+    assert_error_message("$saturation: Amount -101% must be between -100% and 100% for `adjust-color'",
+      "adjust-color(blue, $saturation: -101%)")
+    assert_error_message("$lightness: Amount 101% must be between -100% and 100% for `adjust-color'",
+      "adjust-color(blue, $lightness: 101%)")
+    assert_error_message("$lightness: Amount -101% must be between -100% and 100% for `adjust-color'",
+      "adjust-color(blue, $lightness: -101%)")
+    # RGB
+    assert_error_message("$red: Amount 256 must be between -255 and 255 for `adjust-color'",
+      "adjust-color(blue, $red: 256)")
+    assert_error_message("$red: Amount -256 must be between -255 and 255 for `adjust-color'",
+      "adjust-color(blue, $red: -256)")
+    assert_error_message("$green: Amount 256 must be between -255 and 255 for `adjust-color'",
+      "adjust-color(blue, $green: 256)")
+    assert_error_message("$green: Amount -256 must be between -255 and 255 for `adjust-color'",
+      "adjust-color(blue, $green: -256)")
+    assert_error_message("$blue: Amount 256 must be between -255 and 255 for `adjust-color'",
+      "adjust-color(blue, $blue: 256)")
+    assert_error_message("$blue: Amount -256 must be between -255 and 255 for `adjust-color'",
+      "adjust-color(blue, $blue: -256)")
+    # Alpha
+    assert_error_message("$alpha: Amount 1.1 must be between -1 and 1 for `adjust-color'",
+      "adjust-color(blue, $alpha: 1.1)")
+    assert_error_message("$alpha: Amount -1.1 must be between -1 and 1 for `adjust-color'",
+      "adjust-color(blue, $alpha: -1.1)")
+  end
+
+  def test_adjust_color_argument_errors
+    assert_error_message("Unknown argument $hoo (260deg) for `adjust-color'",
+      "adjust-color(blue, $hoo: 260deg)")
+    assert_error_message("Cannot specify HSL and RGB values for a color at the same time for `adjust-color'",
+      "adjust-color(blue, $hue: 120deg, $red: 10)");
+    assert_error_message("10px is not a keyword argument for `adjust_color'",
+      "adjust-color(blue, 10px)")
+    assert_error_message("10px is not a keyword argument for `adjust_color'",
+      "adjust-color(blue, 10px, 20px)")
+    assert_error_message("10px is not a keyword argument for `adjust_color'",
+      "adjust-color(blue, 10px, $hue: 180deg)")
+  end
+
+  def test_scale_color
+    # HSL
+    assert_equal(evaluate("hsl(120, 51, 90)"),
+      evaluate("scale-color(hsl(120, 30, 90), $saturation: 30%)"))
+    assert_equal(evaluate("hsl(120, 30, 76.5)"),
+      evaluate("scale-color(hsl(120, 30, 90), $lightness: -15%)"))
+    # RGB
+    assert_equal(evaluate("rgb(157, 20, 30)"),
+      evaluate("scale-color(rgb(10, 20, 30), $red: 60%)"))
+    assert_equal(evaluate("rgb(10, 38.8, 30)"),
+      evaluate("scale-color(rgb(10, 20, 30), $green: 8%)"))
+    assert_equal(evaluate("rgb(10, 20, 20)"),
+      evaluate("scale-color(rgb(10, 20, 30), $blue: -(1/3)*100%)"))
+    # Alpha
+    assert_equal(evaluate("hsla(120, 30, 90, 0.86)"),
+      evaluate("scale-color(hsl(120, 30, 90), $alpha: -14%)"))
+    assert_equal(evaluate("rgba(10, 20, 30, 0.82)"),
+      evaluate("scale-color(rgba(10, 20, 30, 0.8), $alpha: 10%)"))
+
+    # HSL composability
+    assert_equal(evaluate("hsl(120, 51, 76.5)"),
+      evaluate("scale-color(hsl(120, 30, 90), $saturation: 30%, $lightness: -15%)"))
+    assert_equal(evaluate("hsla(120, 51, 90, 0.2)"),
+      evaluate("scale-color(hsl(120, 30, 90), $saturation: 30%, $alpha: -80%)"))
+
+    # RGB composability
+    assert_equal(evaluate("rgb(157, 38.8, 30)"),
+      evaluate("scale-color(rgb(10, 20, 30), $red: 60%, $green: 8%)"))
+    assert_equal(evaluate("rgb(157, 38.8, 20)"),
+      evaluate("scale-color(rgb(10, 20, 30), $red: 60%, $green: 8%, $blue: -(1/3)*100%)"))
+    assert_equal(evaluate("rgba(10, 38.8, 20, 0.55)"),
+      evaluate("scale-color(rgba(10, 20, 30, 0.5), $green: 8%, $blue: -(1/3)*100%, $alpha: 10%)"))
+
+    # Extremes
+    assert_equal(evaluate("hsl(120, 100, 90)"),
+      evaluate("scale-color(hsl(120, 30, 90), $saturation: 100%)"))
+    assert_equal(evaluate("hsl(120, 30, 90)"),
+      evaluate("scale-color(hsl(120, 30, 90), $saturation: 0%)"))
+    assert_equal(evaluate("hsl(120, 0, 90)"),
+      evaluate("scale-color(hsl(120, 30, 90), $saturation: -100%)"))
+  end
+
+  def test_scale_color_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `scale-color'", "scale-color(foo, $red: 10%)")
+    # HSL
+    assert_error_message("$saturation: \"foo\" is not a number for `scale-color'",
+      "scale-color(blue, $saturation: foo)")
+    assert_error_message("$lightness: \"foo\" is not a number for `scale-color'",
+      "scale-color(blue, $lightness: foo)")
+    # RGB
+    assert_error_message("$red: \"foo\" is not a number for `scale-color'",
+      "scale-color(blue, $red: foo)")
+    assert_error_message("$green: \"foo\" is not a number for `scale-color'",
+      "scale-color(blue, $green: foo)")
+    assert_error_message("$blue: \"foo\" is not a number for `scale-color'",
+      "scale-color(blue, $blue: foo)")
+    # Alpha
+    assert_error_message("$alpha: \"foo\" is not a number for `scale-color'",
+      "scale-color(blue, $alpha: foo)")
+  end
+
+  def test_scale_color_argument_errors
+    # Range
+    assert_error_message("$saturation: Amount 101% must be between -100% and 100% for `scale-color'",
+      "scale-color(blue, $saturation: 101%)")
+    assert_error_message("$red: Amount -101% must be between -100% and 100% for `scale-color'",
+      "scale-color(blue, $red: -101%)")
+    assert_error_message("$alpha: Amount -101% must be between -100% and 100% for `scale-color'",
+      "scale-color(blue, $alpha: -101%)")
+
+    # Unit
+    assert_error_message("Expected $saturation to have a unit of % but got 80 for `scale-color'",
+      "scale-color(blue, $saturation: 80)")
+    assert_error_message("Expected $alpha to have a unit of % but got 0.5 for `scale-color'",
+      "scale-color(blue, $alpha: 0.5)")
+
+    # Unknown argument
+    assert_error_message("Unknown argument $hue (80%) for `scale-color'", "scale-color(blue, $hue: 80%)")
+
+    # Non-keyword arg
+    assert_error_message("10px is not a keyword argument for `scale_color'", "scale-color(blue, 10px)")
+
+    # HSL/RGB
+    assert_error_message("Cannot specify HSL and RGB values for a color at the same time for `scale-color'",
+      "scale-color(blue, $lightness: 10%, $red: 20%)");
+  end
+
+  def test_change_color
+    # HSL
+    assert_equal(evaluate("hsl(195, 30, 90)"),
+      evaluate("change-color(hsl(120, 30, 90), $hue: 195deg)"))
+    assert_equal(evaluate("hsl(120, 50, 90)"),
+      evaluate("change-color(hsl(120, 30, 90), $saturation: 50%)"))
+    assert_equal(evaluate("hsl(120, 30, 40)"),
+      evaluate("change-color(hsl(120, 30, 90), $lightness: 40%)"))
+    # RGB
+    assert_equal(evaluate("rgb(123, 20, 30)"),
+      evaluate("change-color(rgb(10, 20, 30), $red: 123)"))
+    assert_equal(evaluate("rgb(10, 234, 30)"),
+      evaluate("change-color(rgb(10, 20, 30), $green: 234)"))
+    assert_equal(evaluate("rgb(10, 20, 198)"),
+      evaluate("change-color(rgb(10, 20, 30), $blue: 198)"))
+    # Alpha
+    assert_equal(evaluate("rgba(10, 20, 30, 0.76)"),
+      evaluate("change-color(rgb(10, 20, 30), $alpha: 0.76)"))
+
+    # HSL composability
+    assert_equal(evaluate("hsl(56, 30, 47)"),
+      evaluate("change-color(hsl(120, 30, 90), $hue: 56deg, $lightness: 47%)"))
+    assert_equal(evaluate("hsla(56, 30, 47, 0.9)"),
+      evaluate("change-color(hsl(120, 30, 90), $hue: 56deg, $lightness: 47%, $alpha: 0.9)"))
+  end
+
+  def test_change_color_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `change-color'", "change-color(foo, $red: 10%)")
+    # HSL
+    assert_error_message("$saturation: \"foo\" is not a number for `change-color'",
+      "change-color(blue, $saturation: foo)")
+    assert_error_message("$lightness: \"foo\" is not a number for `change-color'",
+      "change-color(blue, $lightness: foo)")
+    # RGB
+    assert_error_message("$red: \"foo\" is not a number for `change-color'", "change-color(blue, $red: foo)")
+    assert_error_message("$green: \"foo\" is not a number for `change-color'", "change-color(blue, $green: foo)")
+    assert_error_message("$blue: \"foo\" is not a number for `change-color'", "change-color(blue, $blue: foo)")
+    # Alpha
+    assert_error_message("$alpha: \"foo\" is not a number for `change-color'", "change-color(blue, $alpha: foo)")
+  end
+
+  def test_change_color_argument_errors
+    # Range
+    assert_error_message("Saturation 101% must be between 0% and 100% for `change-color'",
+      "change-color(blue, $saturation: 101%)")
+    assert_error_message("Lightness 101% must be between 0% and 100% for `change-color'",
+      "change-color(blue, $lightness: 101%)")
+    assert_error_message("Red value -1 must be between 0 and 255 for `change-color'",
+      "change-color(blue, $red: -1)")
+    assert_error_message("Green value 256 must be between 0 and 255 for `change-color'",
+      "change-color(blue, $green: 256)")
+    assert_error_message("Blue value 500 must be between 0 and 255 for `change-color'",
+      "change-color(blue, $blue: 500)")
+
+    # Unknown argument
+    assert_error_message("Unknown argument $hoo (80%) for `change-color'", "change-color(blue, $hoo: 80%)")
+
+    # Non-keyword arg
+    assert_error_message("10px is not a keyword argument for `change_color'", "change-color(blue, 10px)")
+
+    # HSL/RGB
+    assert_error_message("Cannot specify HSL and RGB values for a color at the same time for `change-color'",
+      "change-color(blue, $lightness: 10%, $red: 120)");
+  end
+
+  def test_ie_hex_str
+    assert_equal("#FFAA11CC", evaluate('ie-hex-str(#aa11cc)'))
+    assert_equal("#FFAA11CC", evaluate('ie-hex-str(#a1c)'))
+    assert_equal("#FFAA11CC", evaluate('ie-hex-str(#A1c)'))
+    assert_equal("#80FF0000", evaluate('ie-hex-str(rgba(255, 0, 0, 0.5))'))
+  end
+
+  def test_mix
+    assert_equal("purple", evaluate("mix(#f00, #00f)"))
+    assert_equal("gray", evaluate("mix(#f00, #0ff)"))
+    assert_equal("#809155", evaluate("mix(#f70, #0aa)"))
+    assert_equal("#4000bf", evaluate("mix(#f00, #00f, 25%)"))
+    assert_equal("rgba(64, 0, 191, 0.75)", evaluate("mix(rgba(255, 0, 0, 0.5), #00f)"))
+    assert_equal("red", evaluate("mix(#f00, #00f, 100%)"))
+    assert_equal("blue", evaluate("mix(#f00, #00f, 0%)"))
+    assert_equal("rgba(255, 0, 0, 0.5)", evaluate("mix(#f00, transparentize(#00f, 1))"))
+    assert_equal("rgba(0, 0, 255, 0.5)", evaluate("mix(transparentize(#f00, 1), #00f)"))
+    assert_equal("red", evaluate("mix(#f00, transparentize(#00f, 1), 100%)"))
+    assert_equal("blue", evaluate("mix(transparentize(#f00, 1), #00f, 0%)"))
+    assert_equal("rgba(0, 0, 255, 0)", evaluate("mix(#f00, transparentize(#00f, 1), 0%)"))
+    assert_equal("rgba(255, 0, 0, 0)", evaluate("mix(transparentize(#f00, 1), #00f, 100%)"))
+    assert_equal("rgba(255, 0, 0, 0)", evaluate("mix($color1: transparentize(#f00, 1), $color2: #00f, $weight: 100%)"))
+  end
+
+  def test_mix_tests_types
+    assert_error_message("$color1: \"foo\" is not a color for `mix'", "mix(\"foo\", #f00, 10%)")
+    assert_error_message("$color2: \"foo\" is not a color for `mix'", "mix(#f00, \"foo\", 10%)")
+    assert_error_message("$weight: \"foo\" is not a number for `mix'", "mix(#f00, #baf, \"foo\")")
+  end
+
+  def test_mix_tests_bounds
+    assert_error_message("Weight -0.001 must be between 0% and 100% for `mix'",
+      "mix(#123, #456, -0.001)")
+    assert_error_message("Weight 100.001 must be between 0% and 100% for `mix'",
+      "mix(#123, #456, 100.001)")
+  end
+
+  def test_grayscale
+    assert_equal("#bbbbbb", evaluate("grayscale(#abc)"))
+    assert_equal("gray", evaluate("grayscale(#f00)"))
+    assert_equal("gray", evaluate("grayscale(#00f)"))
+    assert_equal("white", evaluate("grayscale(white)"))
+    assert_equal("black", evaluate("grayscale(black)"))
+    assert_equal("black", evaluate("grayscale($color: black)"))
+
+    assert_equal("grayscale(2)", evaluate("grayscale(2)"))
+    assert_equal("grayscale(-5px)", evaluate("grayscale(-5px)"))
+  end
+
+  def tets_grayscale_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `grayscale'", "grayscale(\"foo\")")
+  end
+
+  def test_complement
+    assert_equal("#ccbbaa", evaluate("complement(#abc)"))
+    assert_equal("cyan", evaluate("complement(red)"))
+    assert_equal("red", evaluate("complement(cyan)"))
+    assert_equal("white", evaluate("complement(white)"))
+    assert_equal("black", evaluate("complement(black)"))
+    assert_equal("black", evaluate("complement($color: black)"))
+  end
+
+  def tets_complement_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `complement'", "complement(\"foo\")")
+  end
+
+  def test_invert
+    assert_equal("#112233", evaluate("invert(#edc)"))
+    assert_equal("#d8cabd", evaluate("invert(#edc, 10%)"))
+    assert_equal("rgba(245, 235, 225, 0.5)", evaluate("invert(rgba(10, 20, 30, 0.5))"))
+    assert_equal("rgba(34, 42, 50, 0.5)", evaluate("invert(rgba(10, 20, 30, 0.5), 10%)"))
+    assert_equal("invert(20%)", evaluate("invert(20%)"))
+  end
+
+  def test_invert_tests_types
+    assert_error_message("$color: \"foo\" is not a color for `invert'", "invert(\"foo\")")
+    assert_error_message("$weight: \"foo\" is not a number for `invert'", "invert(#edc, \"foo\")")
+  end
+
+  def test_invert_tests_bounds
+    assert_error_message("Weight -0.001 must be between 0% and 100% for `invert'",
+      "invert(#edc, -0.001)")
+    assert_error_message("Weight 100.001 must be between 0% and 100% for `invert'",
+      "invert(#edc, 100.001)")
+  end
+
+  def test_unquote
+    assert_equal('foo', evaluate('unquote("foo")'))
+    assert_equal('foo', evaluate('unquote(foo)'))
+    assert_equal('foo', evaluate('unquote($string: foo)'))
+    assert_warning <<MESSAGE do
+DEPRECATION WARNING: Passing blue, a non-string value, to unquote()
+will be an error in future versions of Sass.
+        on line 1 of test_unquote_inline.scss
+MESSAGE
+      assert_equal('blue', evaluate('unquote(blue)'))
+    end
+  end
+
+  def test_quote
+    assert_equal('"foo"', evaluate('quote(foo)'))
+    assert_equal('"foo"', evaluate('quote("foo")'))
+    assert_equal('"foo"', evaluate('quote($string: "foo")'))
+  end
+
+  def test_quote_tests_type
+    assert_error_message("$string: #ff0000 is not a string for `quote'", "quote(#f00)")
+  end
+
+  def test_str_length
+    assert_equal('3', evaluate('str-length(foo)'))
+  end
+
+  def test_str_length_requires_a_string
+    assert_error_message("$string: #ff0000 is not a string for `str-length'", "str-length(#f00)")
+  end
+
+  def test_str_insert
+    assert_equal('Xabcd', evaluate('str-insert(abcd, X, 0)'))
+    assert_equal('Xabcd', evaluate('str-insert(abcd, X, 1)'))
+    assert_equal('abcXd', evaluate('str-insert(abcd, X, 4)'))
+    assert_equal('abcdX', evaluate('str-insert(abcd, X, 100)'))
+    assert_equal('Xabcd', evaluate('str-insert(abcd, X, -100)'))
+    assert_equal('aXbcd', evaluate('str-insert(abcd, X, -4)'))
+    assert_equal('abcdX', evaluate('str-insert(abcd, X, -1)'))
+  end
+
+  def test_str_insert_maintains_quote_of_primary_string
+    assert_equal('"Xfoo"', evaluate('str-insert("foo", X, 1)'))
+    assert_equal('"Xfoo"', evaluate('str-insert("foo", "X", 1)'))
+    assert_equal('Xfoo', evaluate('str-insert(foo, "X", 1)'))
+  end
+
+  def test_str_insert_asserts_types
+    assert_error_message("$string: #ff0000 is not a string for `str-insert'", "str-insert(#f00, X, 1)")
+    assert_error_message("$insert: #ff0000 is not a string for `str-insert'", "str-insert(foo, #f00, 1)")
+    assert_error_message("$index: #ff0000 is not a number for `str-insert'", "str-insert(foo, X, #f00)")
+    assert_error_message("Expected $index to be unitless but got 10px for `str-insert'", "str-insert(foo, X, 10px)")
+  end
+
+  def test_str_index
+    assert_equal('1', evaluate('str-index(abcd, a)'))
+    assert_equal('1', evaluate('str-index(abcd, ab)'))
+    assert_equal(Sass::Script::Value::Null.new, perform('str-index(abcd, X)'))
+    assert_equal('3', evaluate('str-index(abcd, c)'))
+  end
+
+  def test_str_index_asserts_types
+    assert_error_message("$string: #ff0000 is not a string for `str-index'", "str-index(#f00, X)")
+    assert_error_message("$substring: #ff0000 is not a string for `str-index'", "str-index(asdf, #f00)")
+  end
+
+  def test_to_lower_case
+    assert_equal('abcd', evaluate('to-lower-case(ABCD)'))
+    assert_equal('"abcd"', evaluate('to-lower-case("ABCD")'))
+    assert_error_message("$string: #ff0000 is not a string for `to-lower-case'", "to-lower-case(#f00)")
+  end
+
+  def test_to_upper_case
+    assert_equal('ABCD', evaluate('to-upper-case(abcd)'))
+    assert_equal('"ABCD"', evaluate('to-upper-case("abcd")'))
+    assert_error_message("$string: #ff0000 is not a string for `to-upper-case'", "to-upper-case(#f00)")
+  end
+
+  def test_str_slice
+    assert_equal('bc',   evaluate('str-slice(abcd,2,3)'))    # in the middle of the string
+    assert_equal('a',    evaluate('str-slice(abcd,1,1)'))    # when start = end
+    assert_equal('ab',   evaluate('str-slice(abcd,1,2)'))    # for completeness
+    assert_equal('abcd', evaluate('str-slice(abcd,1,4)'))    # at the end points
+    assert_equal('abcd', evaluate('str-slice(abcd,0,4)'))    # when start is before the start of the string
+    assert_equal('',     evaluate('str-slice(abcd,1,0)'))    # when end is before the start of the string
+    assert_equal('abcd', evaluate('str-slice(abcd,1,100)'))  # when end is past the end of the string
+    assert_equal('',     evaluate('str-slice(abcd,2,1)'))    # when end is before start
+    assert_equal('"bc"', evaluate('str-slice("abcd",2,3)'))  # when used with a quoted string
+    assert_equal('bcd',  evaluate('str-slice(abcd,2)'))      # when end is omitted, you get the remainder of the string
+    assert_equal('cd',   evaluate('str-slice(abcd,-2)'))     # when start is negative, it counts from the beginning
+    assert_equal('bc',   evaluate('str-slice(abcd,2,-2)'))   # when end is negative it counts in from the end
+    assert_equal('',     evaluate('str-slice(abcd,3,-3)'))   # when end is negative and comes before the start
+    assert_equal('bc',   evaluate('str-slice(abcd,-3,-2)'))  # when both are negative
+    assert_error_message("$string: #ff0000 is not a string for `str-slice'", "str-slice(#f00,2,3)")
+    assert_error_message("$start-at: #ff0000 is not a number for `str-slice'", "str-slice(abcd,#f00,3)")
+    assert_error_message("$end-at: #ff0000 is not a number for `str-slice'", "str-slice(abcd,2,#f00)")
+    assert_error_message("Expected $end-at to be unitless but got 3px for `str-slice'", "str-slice(abcd,2,3px)")
+    assert_error_message("Expected $start-at to be unitless but got 2px for `str-slice'", "str-slice(abcd,2px,3)")
+  end
+
+  def test_user_defined_function
+    assert_equal("I'm a user-defined string!", evaluate("user_defined()"))
+  end
+
+  def test_user_defined_function_with_preceding_underscore
+    assert_equal("I'm another user-defined string!", evaluate("_preceding_underscore()"))
+    assert_equal("I'm another user-defined string!", evaluate("-preceding-underscore()"))
+  end
+
+  def test_user_defined_function_using_environment
+    environment = env('variable' => Sass::Script::Value::String.new('The variable'))
+    assert_equal("The variable", evaluate("fetch_the_variable()", environment))
+  end
+
+  def test_options_on_new_values_fails
+    assert_error_message(<<MSG, "call-options-on-new-value()")
+The #options attribute is not set on this Sass::Script::Value::String.
+  This error is probably occurring because #to_s was called
+  on this value within a custom Sass function without first
+  setting the #options attribute.
+MSG
+  end
+
+  def test_type_of
+    assert_equal("string", evaluate("type-of(\"asdf\")"))
+    assert_equal("string", evaluate("type-of(asdf)"))
+    assert_equal("number", evaluate("type-of(1px)"))
+    assert_equal("bool", evaluate("type-of(true)"))
+    assert_equal("color", evaluate("type-of(#fff)"))
+    assert_equal("color", evaluate("type-of($value: #fff)"))
+    assert_equal("null", evaluate("type-of(null)"))
+    assert_equal("list", evaluate("type-of(1 2 3)"))
+    assert_equal("list", evaluate("type-of((1, 2, 3))"))
+    assert_equal("list", evaluate("type-of(())"))
+    assert_equal("map", evaluate("type-of((foo: bar))"))
+  end
+
+  def test_feature_exists
+    assert_raises ArgumentError do
+      Sass.add_feature("my-test-feature")
+    end
+    Sass.add_feature("-my-test-feature")
+    assert_equal("true", evaluate("feature-exists(-my-test-feature)"))
+    assert_equal("false", evaluate("feature-exists(whatisthisidontevenknow)"))
+    assert_equal("true", evaluate("feature-exists($feature: -my-test-feature)"))
+  ensure
+    Sass::Features::KNOWN_FEATURES.delete("-my-test-feature")
+  end
+
+  def test_unit
+    assert_equal(%Q{""}, evaluate("unit(100)"))
+    assert_equal(%Q{"px"}, evaluate("unit(100px)"))
+    assert_equal(%Q{"em*px"}, evaluate("unit(10px * 5em)"))
+    assert_equal(%Q{"em*px"}, evaluate("unit(5em * 10px)"))
+    assert_equal(%Q{"em/rem"}, evaluate("unit(10px * 5em / 30cm / 1rem)"))
+    assert_equal(%Q{"em*vh/cm*rem"}, evaluate("unit(10vh * 5em / 30cm / 1rem)"))
+    assert_equal(%Q{"px"}, evaluate("unit($number: 100px)"))
+    assert_error_message("$number: #ff0000 is not a number for `unit'", "unit(#f00)")
+  end
+
+  def test_unitless
+    assert_equal(%Q{true}, evaluate("unitless(100)"))
+    assert_equal(%Q{false}, evaluate("unitless(100px)"))
+    assert_equal(%Q{false}, evaluate("unitless($number: 100px)"))
+    assert_error_message("$number: #ff0000 is not a number for `unitless'", "unitless(#f00)")
+  end
+
+  def test_comparable
+    assert_equal(%Q{true}, evaluate("comparable(2px, 1px)"))
+    assert_equal(%Q{true}, evaluate("comparable(10cm, 3mm)"))
+    assert_equal(%Q{false}, evaluate("comparable(100px, 3em)"))
+    assert_equal(%Q{false}, evaluate("comparable($number1: 100px, $number2: 3em)"))
+  end
+
+  def test_comparable_checks_types
+    assert_error_message("$number1: #ff0000 is not a number for `comparable'", "comparable(#f00, 1px)")
+    assert_error_message("$number2: #ff0000 is not a number for `comparable'", "comparable(1px, #f00)")
+  end
+
+  def test_length
+    assert_equal("5", evaluate("length(1 2 3 4 5)"))
+    assert_equal("4", evaluate("length((foo, bar, baz, bip))"))
+    assert_equal("3", evaluate("length((foo, bar, baz bip))"))
+    assert_equal("3", evaluate("length((foo, bar, (baz, bip)))"))
+    assert_equal("1", evaluate("length(#f00)"))
+    assert_equal("0", evaluate("length(())"))
+    assert_equal("4", evaluate("length(1 2 () 3)"))
+
+    assert_equal("2", evaluate("length((foo: bar, bar: baz))"))
+  end
+
+  def test_nth
+    assert_equal("1", evaluate("nth(1 2 3, 1)"))
+    assert_equal("2", evaluate("nth(1 2 3, 2)"))
+    assert_equal("3", evaluate("nth(1 2 3, -1)"))
+    assert_equal("1", evaluate("nth(1 2 3, -3)"))
+    assert_equal("3", evaluate("nth((1, 2, 3), 3)"))
+    assert_equal("3", evaluate("nth($list: (1, 2, 3), $n: 3)"))
+    assert_equal("foo", evaluate("nth(foo, 1)"))
+    assert_equal("bar baz", evaluate("nth(foo (bar baz) bang, 2)"))
+    assert_error_message("List index 0 must be a non-zero integer for `nth'", "nth(foo, 0)")
+    assert_error_message("List index is -10 but list is only 1 item long for `nth'", "nth(foo, -10)")
+    assert_error_message("List index 1.5 must be a non-zero integer for `nth'", "nth(foo, 1.5)")
+    assert_error_message("List index is 5 but list is only 4 items long for `nth'", "nth(1 2 3 4, 5)")
+    assert_error_message("List index is 2 but list is only 1 item long for `nth'", "nth(foo, 2)")
+    assert_error_message("List index is 1 but list has no items for `nth'", "nth((), 1)")
+    assert_error_message("$n: \"foo\" is not a number for `nth'", "nth(1 2 3, foo)")
+
+    assert_equal("foo bar", evaluate("nth((foo: bar, bar: baz), 1)"))
+    assert_equal("bar baz", evaluate("nth((foo: bar, bar: baz), 2)"))
+  end
+
+  def test_set_nth
+    assert_equal("a 2 3", evaluate("set-nth(1 2 3, 1, a)"))
+    assert_equal("1 a 3", evaluate("set-nth(1 2 3, 2, a)"))
+    assert_equal("1 2 a", evaluate("set-nth(1 2 3, -1, a)"))
+    assert_equal("a 2 3", evaluate("set-nth(1 2 3, -3, a)"))
+    assert_equal("a 2 3", evaluate("set-nth($list: 1 2 3, $n: -3, $value: a)"))
+    assert_equal("1, 2, a", evaluate("set-nth((1, 2, 3), 3, a)"))
+    assert_equal("a", evaluate("set-nth(foo, 1, a)"))
+    assert_equal("foo, a b, baz", evaluate("set-nth((foo, bar, baz), 2, (a b))"))
+    assert_error_message("List index 0 must be a non-zero integer for `set-nth'", "set-nth(foo, 0, a)")
+    assert_error_message("List index is -10 but list is only 1 item long for `set-nth'", "set-nth(foo, -10, a)")
+    assert_error_message("List index 1.5 must be a non-zero integer for `set-nth'", "set-nth(foo, 1.5, a)")
+    assert_error_message("List index is 5 but list is only 4 items long for `set-nth'", "set-nth(1 2 3 4, 5, a)")
+    assert_error_message("List index is 2 but list is only 1 item long for `set-nth'", "set-nth(foo, 2, a)")
+    assert_error_message("List index is 1 but list has no items for `set-nth'", "set-nth((), 1, a)")
+    assert_error_message("$n: \"foo\" is not a number for `set-nth'", "set-nth(1 2 3, foo, a)")
+  end
+
+  def test_join
+    assert_equal("1 2 3", evaluate("join(1 2, 3)"))
+    assert_equal("1 2 3", evaluate("join(1, 2 3)"))
+    assert_equal("1 2 3 4", evaluate("join(1 2, 3 4)"))
+    assert_equal("true", evaluate("(1 2 3 4) == join(1 2, 3 4)"))
+    assert_equal("false", evaluate("(1 2 (3 4)) == join(1 2, 3 4)"))
+    assert_equal("1, 2, 3", evaluate("join((1, 2), 3)"))
+    assert_equal("1, 2, 3", evaluate("join(1, (2, 3))"))
+    assert_equal("1, 2, 3, 4", evaluate("join((1, 2), (3, 4))"))
+    assert_equal("true", evaluate("(1, 2, 3, 4) == join((1, 2), (3, 4))"))
+    assert_equal("false", evaluate("(1, 2, (3, 4)) == join((1, 2), (3, 4))"))
+
+    assert_equal("1 2", evaluate("join(1, 2)"))
+    assert_equal("1 2 3 4", evaluate("join(1 2, (3, 4))"))
+    assert_equal("1, 2, 3, 4", evaluate("join((1, 2), 3 4)"))
+
+    assert_equal("1 2", evaluate("join(1, 2, auto)"))
+    assert_equal("1, 2, 3, 4", evaluate("join(1 2, 3 4, comma)"))
+    assert_equal("1 2 3 4", evaluate("join((1, 2), (3, 4), space)"))
+    assert_equal("1, 2", evaluate("join(1, 2, comma)"))
+
+    assert_equal("1 2", evaluate("join(1 2, ())"))
+    assert_equal("1, 2", evaluate("join((1, 2), ())"))
+    assert_equal("true", evaluate("(1 2) == join(1 2, ())"))
+    assert_equal("true", evaluate("(1, 2) == join((1, 2), ())"))
+    assert_equal("false", evaluate("(1 2 ()) == join(1 2, ())"))
+    assert_equal("false", evaluate("(1, 2, ()) == join((1, 2), ())"))
+
+    assert_equal("1 2", evaluate("join((), 1 2)"))
+    assert_equal("1, 2", evaluate("join((), (1, 2))"))
+    assert_equal("true", evaluate("(1 2) == join((), 1 2)"))
+    assert_equal("true", evaluate("(1, 2) == join((), (1, 2))"))
+    assert_equal("false", evaluate("(1 2 ()) == join((), 1 2)"))
+    assert_equal("false", evaluate("(1, 2, ()) == join((), (1, 2))"))
+
+    assert_error_message("Separator name must be space, comma, or auto for `join'", "join(1, 2, baboon)")
+    assert_error_message("$separator: 12 is not a string for `join'", "join(1, 2, 12)")
+
+    assert_equal("foo bar, bar baz, baz bip, bip bop",
+      perform("join((foo: bar, bar: baz), (baz: bip, bip: bop))").to_sass)
+    assert_equal("(foo bar) (bar baz) (baz bip) (bip bop)",
+      perform("join((foo: bar, bar: baz), (baz: bip, bip: bop), space)").to_sass)
+    assert_equal("foo bar (baz bip) (bip bop)",
+      perform("join(foo bar, (baz: bip, bip: bop))").to_sass)
+    assert_equal("foo bar, bar baz, bip, bop",
+      perform("join((foo: bar, bar: baz), bip bop)").to_sass)
+    assert_equal("baz bip, bip bop",
+      perform("join((), (baz: bip, bip: bop))").to_sass)
+    assert_equal("foo bar, bar baz",
+      perform("join((foo: bar, bar: baz), ())").to_sass)
+  end
+
+  def test_append
+    assert_equal("1 2 3", evaluate("append(1 2, 3)"))
+    assert_equal("1 2 3 4", evaluate("append(1 2, 3 4)"))
+    assert_equal("false", evaluate("(1 2 3 4) == append(1 2, 3 4)"))
+    assert_equal("true", evaluate("(1 2 (3 4)) == append(1 2, 3 4)"))
+    assert_equal("1, 2, 3", evaluate("append((1, 2), 3)"))
+    assert_equal("1, 2, 3, 4", evaluate("append((1, 2), (3, 4))"))
+    assert_equal("false", evaluate("(1, 2, 3, 4) == append((1, 2), (3, 4))"))
+    assert_equal("true", evaluate("(1, 2, (3, 4)) == append((1, 2), (3, 4))"))
+
+    assert_equal("1 2", evaluate("append(1, 2)"))
+    assert_equal("1 2 3, 4", evaluate("append(1 2, (3, 4))"))
+    assert_equal("true", evaluate("(1 2 (3, 4)) == append(1 2, (3, 4))"))
+    assert_equal("1, 2, 3 4", evaluate("append((1, 2), 3 4)"))
+    assert_equal("true", evaluate("(1, 2, 3 4) == append((1, 2), 3 4)"))
+
+    assert_equal("1 2", evaluate("append(1, 2, auto)"))
+    assert_equal("1, 2, 3 4", evaluate("append(1 2, 3 4, comma)"))
+    assert_equal("1 2 3, 4", evaluate("append((1, 2), (3, 4), space)"))
+    assert_equal("1, 2", evaluate("append(1, 2, comma)"))
+
+    assert_equal("1 2", evaluate("append(1 2, ())"))
+    assert_equal("1, 2", evaluate("append((1, 2), ())"))
+    assert_equal("true", evaluate("(1 2 ()) == append(1 2, ())"))
+    assert_equal("true", evaluate("(1, 2, ()) == append((1, 2), ())"))
+
+    assert_equal("1 2", evaluate("append((), 1 2)"))
+    assert_equal("1, 2", evaluate("append((), (1, 2))"))
+    assert_equal("false", evaluate("(1 2) == append((), 1 2)"))
+    assert_equal("true", evaluate("(1 2) == nth(append((), 1 2), 1)"))
+
+    assert_error_message("Separator name must be space, comma, or auto for `append'", "append(1, 2, baboon)")
+    assert_error_message("$separator: 12 is not a string for `append'", "append(1, 2, 12)")
+
+    assert_equal("1 2 (foo: bar)", perform("append(1 2, (foo: bar))").to_sass)
+    assert_equal("foo bar, bar baz, 1", perform("append((foo: bar, bar: baz), 1)").to_sass)
+    assert_equal("foo bar, bar baz, (baz: bip)",
+      perform("append((foo: bar, bar: baz), (baz: bip))").to_sass)
+  end
+
+  def test_zip
+    assert_equal("1 3 5, 2 4 6", evaluate("zip(1 2, 3 4, 5 6)"))
+    assert_equal("1 4 7, 2 5 8", evaluate("zip(1 2 3, 4 5 6, 7 8)"))
+    assert_equal("1 2 3", evaluate("zip(1, 2, 3)"))
+    assert_equal("(foo bar) 1 3, (bar baz) 2 4",
+      perform("zip((foo: bar, bar: baz), 1 2, 3 4)").to_sass)
+  end
+
+  def test_index
+    null = Sass::Script::Value::Null.new
+    assert_equal("1", evaluate("index(1px solid blue, 1px)"))
+    assert_equal("2", evaluate("index(1px solid blue, solid)"))
+    assert_equal("3", evaluate("index(1px solid blue, #00f)"))
+    assert_equal("1", evaluate("index(1px, 1px)"))
+    assert_equal(null, perform("index(1px solid blue, 1em)"))
+    assert_equal(null, perform("index(1px solid blue, notfound)"))
+    assert_equal(null, perform("index(1px, #00f)"))
+
+    assert_equal("1", evaluate("index((foo: bar, bar: baz), (foo bar))"))
+    assert_equal(null, perform("index((foo: bar, bar: baz), (foo: bar))"))
+  end
+
+  def test_list_separator
+    assert_equal("space", evaluate("list-separator(1 2 3 4 5)"))
+    assert_equal("comma", evaluate("list-separator((foo, bar, baz, bip))"))
+    assert_equal("comma", evaluate("list-separator((foo, bar, baz bip))"))
+    assert_equal("comma", evaluate("list-separator((foo, bar, (baz, bip)))"))
+    assert_equal("space", evaluate("list-separator(#f00)"))
+    assert_equal("space", evaluate("list-separator(())"))
+    assert_equal("space", evaluate("list-separator(1 2 () 3)"))
+
+    assert_equal("comma", evaluate("list-separator((foo: bar, bar: baz))"))
+  end
+
+  def test_if
+    assert_equal("1px", evaluate("if(true, 1px, 2px)"))
+    assert_equal("2px", evaluate("if(false, 1px, 2px)"))
+    assert_equal("2px", evaluate("if(null, 1px, 2px)"))
+    assert_equal("1px", evaluate("if(true, 1px, $broken)"))
+    assert_equal("1px", evaluate("if(false, $broken, 1px)"))
+    assert_equal("1px", evaluate("if(false, $if-true: $broken, $if-false: 1px)"))
+    assert_equal("1px", evaluate("if(true, $if-true: 1px, $if-false: $broken)"))
+    assert_equal(<<CSS, render(<<SCSS))
+.if {
+  result: yay; }
+CSS
+.if {
+  $something: yay;
+  result: if(true, $if-true: $something, $if-false: $broken);
+}
+SCSS
+    assert_equal(<<CSS, render(<<SCSS))
+.if {
+  result: 1px; }
+CSS
+.if {
+  $splat: 1px, 2px;
+  result: if(true, $splat...);
+}
+SCSS
+  end
+
+  def test_counter
+    assert_equal("counter(foo)", evaluate("counter(foo)"))
+    assert_equal('counter(item,".")', evaluate('counter(item, ".")'))
+    assert_equal('counter(item,".")', evaluate('counter(item,".")'))
+  end
+
+  def test_counters
+    assert_equal("counters(foo)", evaluate("counters(foo)"))
+    assert_equal('counters(item,".")', evaluate('counters(item, ".")'))
+    assert_equal('counters(item,".")', evaluate('counters(item,".")'))
+  end
+
+  def test_keyword_args_rgb
+    assert_equal(%Q{white}, evaluate("rgb($red: 255, $green: 255, $blue: 255)"))
+  end
+
+  def test_keyword_args_rgba
+    assert_equal(%Q{rgba(255, 255, 255, 0.5)}, evaluate("rgba($red: 255, $green: 255, $blue: 255, $alpha: 0.5)"))
+    assert_equal(%Q{rgba(255, 255, 255, 0.5)}, evaluate("rgba($color: #fff, $alpha: 0.5)"))
+  end
+
+  def test_keyword_args_rgba_with_extra_args
+    evaluate("rgba($red: 255, $green: 255, $blue: 255, $alpha: 0.5, $extra: error)")
+    flunk("Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal("Function rgba doesn't have an argument named $extra", e.message)
+  end
+
+  def test_keyword_args_must_have_signature
+    evaluate("no-kw-args($fake: value)")
+    flunk("Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal("Function no_kw_args doesn't support keyword arguments", e.message)
+  end
+
+  def test_keyword_args_with_missing_argument
+    evaluate("rgb($red: 255, $green: 255)")
+    flunk("Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal("Function rgb requires an argument named $blue", e.message)
+  end
+
+  def test_keyword_args_with_extra_argument
+    evaluate("rgb($red: 255, $green: 255, $blue: 255, $purple: 255)")
+    flunk("Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal("Function rgb doesn't have an argument named $purple", e.message)
+  end
+
+  def test_keyword_args_with_positional_and_keyword_argument
+    evaluate("rgb(255, 255, 255, $red: 255)")
+    flunk("Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal("Function rgb was passed argument $red both by position and by name", e.message)
+  end
+
+  def test_keyword_args_with_keyword_before_positional_argument
+    evaluate("rgb($red: 255, 255, 255)")
+    flunk("Expected exception")
+  rescue Sass::SyntaxError => e
+    assert_equal("Positional arguments must come before keyword arguments.", e.message)
+  end
+
+  def test_only_var_args
+    assert_equal "only-var-args(2px, 3px, 4px)", evaluate("only-var-args(1px, 2px, 3px)")
+  end
+
+  def test_only_kw_args
+    assert_equal "only-kw-args(a, b, c)", evaluate("only-kw-args($a: 1, $b: 2, $c: 3)")
+  end
+
+  def test_unique_id
+    last_id, current_id = nil, evaluate("unique-id()")
+
+    50.times do
+      last_id, current_id = current_id, evaluate("unique-id()")
+      assert_match(/u[a-z0-9]{8}/, current_id)
+      refute_equal last_id, current_id
+    end
+  end
+
+  def test_map_get
+    assert_equal "1", evaluate("map-get((foo: 1, bar: 2), foo)")
+    assert_equal "2", evaluate("map-get((foo: 1, bar: 2), bar)")
+    assert_equal "null", perform("map-get((foo: 1, bar: 2), baz)").to_sass
+    assert_equal "null", perform("map-get((), foo)").to_sass
+  end
+
+  def test_map_get_checks_type
+    assert_error_message("$map: 12 is not a map for `map-get'", "map-get(12, bar)")
+  end
+
+  def test_map_merge
+    assert_equal("(foo: 1, bar: 2, baz: 3)",
+      perform("map-merge((foo: 1, bar: 2), (baz: 3))").to_sass)
+    assert_equal("(foo: 1, bar: 2)",
+      perform("map-merge((), (foo: 1, bar: 2))").to_sass)
+    assert_equal("(foo: 1, bar: 2)",
+      perform("map-merge((foo: 1, bar: 2), ())").to_sass)
+  end
+
+  def test_map_merge_checks_type
+    assert_error_message("$map1: 12 is not a map for `map-merge'", "map-merge(12, (foo: 1))")
+    assert_error_message("$map2: 12 is not a map for `map-merge'", "map-merge((foo: 1), 12)")
+  end
+
+  def test_map_remove
+    assert_equal("(foo: 1, baz: 3)",
+      perform("map-remove((foo: 1, bar: 2, baz: 3), bar)").to_sass)
+    assert_equal("(foo: 1, baz: 3)",
+      perform("map-remove($map: (foo: 1, bar: 2, baz: 3), $key: bar)").to_sass)
+    assert_equal("()",
+      perform("map-remove((foo: 1, bar: 2, baz: 3), foo, bar, baz)").to_sass)
+    assert_equal("()", perform("map-remove((), foo)").to_sass)
+    assert_equal("()", perform("map-remove((), foo, bar)").to_sass)
+  end
+
+  def test_map_remove_checks_type
+    assert_error_message("$map: 12 is not a map for `map-remove'", "map-remove(12, foo)")
+  end
+
+  def test_map_keys
+    assert_equal("foo, bar",
+      perform("map-keys((foo: 1, bar: 2))").to_sass)
+    assert_equal("()", perform("map-keys(())").to_sass)
+  end
+
+  def test_map_keys_checks_type
+    assert_error_message("$map: 12 is not a map for `map-keys'", "map-keys(12)")
+  end
+
+  def test_map_values
+    assert_equal("1, 2", perform("map-values((foo: 1, bar: 2))").to_sass)
+    assert_equal("1, 2, 2",
+      perform("map-values((foo: 1, bar: 2, baz: 2))").to_sass)
+    assert_equal("()", perform("map-values(())").to_sass)
+  end
+
+  def test_map_values_checks_type
+    assert_error_message("$map: 12 is not a map for `map-values'", "map-values(12)")
+  end
+
+  def test_map_has_key
+    assert_equal "true", evaluate("map-has-key((foo: 1, bar: 1), foo)")
+    assert_equal "false", evaluate("map-has-key((foo: 1, bar: 1), baz)")
+    assert_equal "false", evaluate("map-has-key((), foo)")
+  end
+
+  def test_map_has_key_checks_type
+    assert_error_message("$map: 12 is not a map for `map-has-key'", "map-has-key(12, foo)")
+  end
+
+  def test_keywords
+    # The actual functionality is tested in tests where real arglists are passed.
+    assert_error_message("$args: 12 is not a variable argument list for `keywords'", "keywords(12)")
+    assert_error_message(
+      "$args: (1 2 3) is not a variable argument list for `keywords'", "keywords(1 2 3)")
+  end
+
+  def test_partial_list_of_pairs_doesnt_work_as_a_map
+    assert_raises(Sass::SyntaxError) {evaluate("map-get((foo bar, baz bang, bip), 1)")}
+    assert_raises(Sass::SyntaxError) {evaluate("map-get((foo bar, baz bang, bip bap bop), 1)")}
+    assert_raises(Sass::SyntaxError) {evaluate("map-get((foo bar), 1)")}
+  end
+
+  def test_assert_unit
+    ctx = Sass::Script::Functions::EvaluationContext.new(Sass::Environment.new(nil, {}))
+    ctx.assert_unit Sass::Script::Value::Number.new(10, ["px"], []), "px"
+    ctx.assert_unit Sass::Script::Value::Number.new(10, [], []), nil
+
+    begin
+      ctx.assert_unit Sass::Script::Value::Number.new(10, [], []), "px"
+      fail
+    rescue ArgumentError => e
+      assert_equal "Expected 10 to have a unit of px", e.message
+    end
+
+    begin
+      ctx.assert_unit Sass::Script::Value::Number.new(10, ["px"], []), nil
+      fail
+    rescue ArgumentError => e
+      assert_equal "Expected 10px to be unitless", e.message
+    end
+
+    begin
+      ctx.assert_unit Sass::Script::Value::Number.new(10, [], []), "px", "arg"
+      fail
+    rescue ArgumentError => e
+      assert_equal "Expected $arg to have a unit of px but got 10", e.message
+    end
+
+    begin
+      ctx.assert_unit Sass::Script::Value::Number.new(10, ["px"], []), nil, "arg"
+      fail
+    rescue ArgumentError => e
+      assert_equal "Expected $arg to be unitless but got 10px", e.message
+    end
+  end
+
+  def test_call_with_positional_arguments
+    # TODO: Remove this block in 4.0
+    Sass::Util.silence_sass_warnings do
+      assert_equal evaluate("lighten(blue, 5%)"), evaluate("call(lighten, blue, 5%)")
+    end
+    assert_equal evaluate("lighten(blue, 5%)"), evaluate("call(get-function(lighten), blue, 5%)")
+  end
+
+  def test_call_with_keyword_arguments
+    # TODO: Remove this block in 4.0
+    Sass::Util.silence_sass_warnings do
+      assert_equal(
+        evaluate("lighten($color: blue, $amount: 5%)"),
+        evaluate("call(lighten, $color: blue, $amount: 5%)"))
+    end
+    assert_equal(
+      evaluate("lighten($color: blue, $amount: 5%)"),
+      evaluate("call(get-function(lighten), $color: blue, $amount: 5%)"))
+  end
+
+  def test_call_with_keyword_and_positional_arguments
+    # TODO: Remove this block in 4.0
+    Sass::Util.silence_sass_warnings do
+      assert_equal(
+        evaluate("lighten(blue, $amount: 5%)"),
+        evaluate("call(lighten, blue, $amount: 5%)"))
+    end
+    assert_equal(
+      evaluate("lighten(blue, $amount: 5%)"),
+      evaluate("call(get-function(lighten), blue, $amount: 5%)"))
+  end
+
+  def test_call_with_dynamic_name
+    # TODO: Remove this block in 4.0
+    Sass::Util.silence_sass_warnings do
+      assert_equal(
+        evaluate("lighten($color: blue, $amount: 5%)"),
+        evaluate("call($fn, $color: blue, $amount: 5%)",
+          env("fn" => Sass::Script::Value::String.new("lighten"))))
+    end
+    assert_equal(
+      evaluate("lighten($color: blue, $amount: 5%)"),
+      evaluate("call($fn, $color: blue, $amount: 5%)",
+        env("fn" => Sass::Script::Value::Function.new(
+          Sass::Callable.new("lighten", nil, nil, nil, nil, nil, "function", :builtin)))))
+  end
+
+  # TODO: Remove this test in 4.0
+  def test_call_uses_local_scope
+    Sass::Util.silence_sass_warnings do
+      assert_equal <<CSS, render(<<SCSS)
+.first-scope {
+  a: local; }
+
+.second-scope {
+  a: global; }
+CSS
+@function foo() {@return global}
+
+.first-scope {
+  @function foo() {@return local}
+  a: call(foo);
+}
+
+.second-scope {
+  a: call(foo);
+}
+SCSS
+    end
+  end
+
+  def test_call_unknown_function
+    # TODO: Remove this block in 4.0
+    Sass::Util.silence_sass_warnings do
+      assert_equal evaluate("unknown(red, blue)"), evaluate("call(unknown, red, blue)")
+    end
+    assert_equal evaluate("unknown(red, blue)"), evaluate("call(get-function(unknown, $css: true), red, blue)")
+  end
+
+  def test_call_with_non_string_argument
+    assert_error_message "$function: 3px is not a function for `call'", "call(3px)"
+  end
+
+  def test_errors_in_called_function
+    assert_error_message "$color: 3px is not a color for `lighten'",
+      "call(get-function(lighten), 3px, 5%)"
+  end
+
+  def test_variable_exists
+    assert_equal <<CSS, render(<<SCSS)
+.test {
+  false: false;
+  true: true;
+  true: true;
+  true: true;
+  true: true; }
+CSS
+$global-var: has-value;
+.test {
+  false: variable-exists(foo);
+  $foo: has-value;
+  true: variable-exists(foo);
+  true: variable-exists($name: foo);
+  true: variable-exists(global-var);
+  true: variable-exists($name: global-var);
+}
+SCSS
+  end
+
+  def test_variable_exists_checks_type
+    assert_error_message("$name: 1 is not a string for `variable-exists'", "variable-exists(1)")
+  end
+
+  def test_global_variable_exists
+    assert_equal <<CSS, render(<<SCSS)
+.test {
+  false: false;
+  false: false;
+  true: true;
+  true: true;
+  false: false;
+  true: true;
+  true: true; }
+CSS
+$g: something;
+$h: null;
+$false: global-variable-exists(foo);
+$true: global-variable-exists(g);
+$named: global-variable-exists($name: g);
+.test {
+  $foo: locally-defined;
+  false: global-variable-exists(foo);
+  false: global-variable-exists(foo2);
+  true: global-variable-exists(g);
+  true: global-variable-exists(h);
+  false: $false;
+  true: $true;
+  true: $named;
+}
+SCSS
+  end
+
+  def test_global_variable_exists_checks_type
+    assert_error_message("$name: 1 is not a string for `global-variable-exists'",
+      "global-variable-exists(1)")
+  end
+
+  def test_function_exists
+    # built-ins
+    assert_equal "true", evaluate("function-exists(lighten)")
+    # with named argument
+    assert_equal "true", evaluate("function-exists($name: lighten)")
+    # user-defined
+    assert_equal <<CSS, render(<<SCSS)
+.test {
+  foo-exists: true;
+  bar-exists: false; }
+CSS
+@function foo() { @return "foo" }
+.test {
+  foo-exists: function-exists(foo);
+  bar-exists: function-exists(bar);
+}
+SCSS
+  end
+
+  def test_function_exists_checks_type
+    assert_error_message("$name: 1 is not a string for `function-exists'", "function-exists(1)")
+  end
+
+  def test_mixin_exists
+    assert_equal "false", evaluate("mixin-exists(foo)")
+    # with named argument
+    assert_equal "false", evaluate("mixin-exists($name: foo)")
+    assert_equal <<CSS, render(<<SCSS)
+.test {
+  foo-exists: true;
+  bar-exists: false; }
+CSS
+@mixin foo() { foo: exists }
+.test {
+  foo-exists: mixin-exists(foo);
+  bar-exists: mixin-exists(bar);
+}
+SCSS
+  end
+
+  def test_mixin_exists_checks_type
+    assert_error_message("$name: 1 is not a string for `mixin-exists'", "mixin-exists(1)")
+  end
+
+  def test_inspect
+    assert_equal "()", evaluate("inspect(())")
+    assert_equal "null", evaluate("inspect(null)")
+    assert_equal "1px null 3px", evaluate("inspect(1px null 3px)")
+    assert_equal "(a: 1, b: 2)", evaluate("inspect((a: 1, b: 2))")
+    assert_equal "(a: 1, b: (c: 2))", evaluate("inspect((a: 1, b: (c: 2)))")
+    assert_equal "(a: 1, b: (2, 3))", evaluate("inspect((a: 1, b: (2, 3)))")
+    assert_equal "(a: 1, b: 2 3)", evaluate("inspect((a: 1, b: 2 3))")
+  end
+
+  def test_random
+    Sass::Script::Functions.random_seed = 1
+    assert_equal "0.4170220047", evaluate("random()")
+    assert_equal "13", evaluate("random(100)")
+  end
+
+  def test_random_works_without_a_seed
+    if Sass::Script::Functions.instance_variable_defined?("@random_number_generator")
+      Sass::Script::Functions.send(:remove_instance_variable, "@random_number_generator")
+    end
+
+    result = perform("random()")
+    assert_kind_of Sass::Script::Number, result
+    assert result.value >= 0, "Random number was below 0"
+    assert result.value <= 1, "Random number was above 1"
+  end
+
+  def test_random_with_limit_one
+    # Passing 1 as the limit should always return 1, since limit calls return
+    # integers from 1 to the argument, so when the argument is 1, its a predicatble
+    # outcome
+    assert "1", evaluate("random(1)")
+  end
+
+  def test_random_with_limit_too_low
+    assert_error_message("$limit 0 must be greater than or equal to 1 for `random'", "random(0)")
+  end
+
+  def test_random_with_non_integer_limit
+    assert_error_message("Expected $limit to be an integer but got 1.5 for `random'", "random(1.5)")
+  end
+
+  # Regression test for #1638.
+  def test_random_with_float_integer_limit
+    result = perform("random(1.0)")
+    assert_kind_of Sass::Script::Number, result
+    assert result.value >= 0, "Random number was below 0"
+    assert result.value <= 1, "Random number was above 1"
+  end
+
+  # This could *possibly* fail, but exceedingly unlikely
+  def test_random_is_semi_unique
+    if Sass::Script::Functions.instance_variable_defined?("@random_number_generator")
+      Sass::Script::Functions.send(:remove_instance_variable, "@random_number_generator")
+    end
+    refute_equal evaluate("random()"), evaluate("random()")
+  end
+
+  def test_deprecated_arg_names
+    assert_warning <<WARNING do
+DEPRECATION WARNING: The `$arg-1' argument for `deprecated-arg-fn()' has been renamed to `$arg1'.
+DEPRECATION WARNING: The `$arg-2' argument for `deprecated-arg-fn()' has been renamed to `$arg2'.
+WARNING
+      assert_equal("1 2 3",
+        evaluate("deprecated-arg-fn($arg-1: 1, $arg-2: 2, $arg3: 3)"))
+    end
+
+    assert_warning <<WARNING do
+DEPRECATION WARNING: The `$arg-1' argument for `deprecated-arg-fn()' has been renamed to `$arg1'.
+DEPRECATION WARNING: The `$arg-2' argument for `deprecated-arg-fn()' has been renamed to `$arg2'.
+WARNING
+      assert_equal("1 2",
+        evaluate("deprecated-arg-fn($arg-1: 1, $arg-2: 2)"))
+    end
+
+    assert_warning <<WARNING do
+DEPRECATION WARNING: The `$arg_1' argument for `deprecated-arg-fn()' has been renamed to `$arg1'.
+DEPRECATION WARNING: The `$arg_2' argument for `deprecated-arg-fn()' has been renamed to `$arg2'.
+WARNING
+      assert_equal("1 2",
+        evaluate("deprecated-arg-fn($arg_1: 1, $arg_2: 2)"))
+    end
+  end
+
+  def test_non_deprecated_arg_names
+    assert_equal("1 2 3", evaluate("deprecated-arg-fn($arg1: 1, $arg2: 2, $arg3: 3)"))
+    assert_equal("1 2", evaluate("deprecated-arg-fn($arg1: 1, $arg2: 2)"))
+  end
+
+  ## Selector Functions
+
+  def test_selector_argument_parsing
+    assert_equal("true", evaluate("selector-parse('.foo') == (join(('.foo',), (), space),)"))
+    assert_equal("true", evaluate("selector-parse('.foo .bar') == ('.foo' '.bar',)"))
+    assert_equal("true",
+      evaluate("selector-parse('.foo .bar, .baz .bang') == ('.foo' '.bar', '.baz' '.bang')"))
+
+    assert_equal(".foo %bar", evaluate("selector-parse('.foo %bar')"))
+
+    assert_equal("true",
+      evaluate("selector-parse(('.foo', '.bar')) == selector-parse('.foo, .bar')"))
+    assert_equal("true",
+      evaluate("selector-parse('.foo' '.bar') == selector-parse('.foo .bar')"))
+
+    assert_equal("true", evaluate("selector-parse(('.foo' '.bar', '.baz' '.bang')) == " +
+        "selector-parse('.foo .bar, .baz .bang')"))
+    assert_equal("true", evaluate("selector-parse(('.foo .bar', '.baz .bang')) == " +
+        "selector-parse('.foo .bar, .baz .bang')"))
+
+    # This may throw an error in the future.
+    assert_equal("true", evaluate("selector-parse(('.foo, .bar' '.baz, .bang')) == " +
+        "selector-parse('.foo, .bar .baz, .bang')"))
+  end
+
+  def test_selector_argument_validation
+    assert_error_message("$selector: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-parse'", "selector-parse(12)")
+    assert_error_message("$selector: (((\".foo\" \".bar\"), \".baz\") (\".bang\", \".qux\")) is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-parse'",
+      "selector-parse(('.foo' '.bar', '.baz') ('.bang', '.qux'))")
+    assert_error_message("$selector: \".#\" is not a valid selector: Invalid CSS after \".\": " +
+      "expected class name, was \"#\" for `selector-parse'", "selector-parse('.#')")
+    assert_error_message("$selector: \"&.foo\" is not a valid selector: Invalid CSS after \"\": " +
+      "expected selector, was \"&.foo\" for `selector-parse'", "selector-parse('&.foo')")
+  end
+
+  def test_selector_nest
+    assert_equal(".foo", evaluate("selector-nest('.foo')"))
+    assert_equal(".foo .bar", evaluate("selector-nest('.foo', '.bar')"))
+    assert_equal(".foo .bar .baz", evaluate("selector-nest('.foo', '.bar', '.baz')"))
+    assert_equal(".a .foo .b .bar", evaluate("selector-nest('.a .foo', '.b .bar')"))
+    assert_equal(".foo.bar", evaluate("selector-nest('.foo', '&.bar')"))
+    assert_equal(".baz .foo.bar", evaluate("selector-nest('.foo', '&.bar', '.baz &')"))
+  end
+
+  def test_selector_nest_checks_types
+    assert_error_message("$selectors: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-nest'",
+      "selector-nest(12)")
+    assert_error_message("$selectors: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-nest'",
+      "selector-nest('.foo', 12)")
+  end
+
+  def test_selector_nest_argument_validation
+    assert_error_message("$selectors: At least one selector must be passed for `selector-nest'",
+      "selector-nest()")
+  end
+
+  def test_selector_append
+    assert_equal(".foo.bar", evaluate("selector-append('.foo', '.bar')"))
+    assert_equal(".a .foo.b .bar", evaluate("selector-append('.a .foo', '.b .bar')"))
+    assert_equal(".foo-suffix", evaluate("selector-append('.foo', '-suffix')"))
+    assert_equal(".foo.bar, .foo-suffix", evaluate("selector-append('.foo', '.bar, -suffix')"))
+    assert_equal(".foo--suffix", evaluate("selector-append('.foo', '--suffix')"))
+    assert_equal(".foo.bar, .foo--suffix", evaluate("selector-append('.foo', '.bar, --suffix')"))
+  end
+
+  def test_selector_append_checks_types
+    assert_error_message("$selectors: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-append'",
+      "selector-append(12)")
+    assert_error_message("$selectors: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-append'",
+      "selector-append('.foo', 12)")
+  end
+
+  def test_selector_append_errors
+    assert_error_message("$selectors: At least one selector must be passed for `selector-append'",
+      "selector-append()")
+    assert_error_message("Can't append \"> .bar\" to \".foo\" for `selector-append'",
+      "selector-append('.foo', '> .bar')")
+    assert_error_message("Can't append \"*.bar\" to \".foo\" for `selector-append'",
+      "selector-append('.foo', '*.bar')")
+    assert_error_message("Can't append \"ns|suffix\" to \".foo\" for `selector-append'",
+      "selector-append('.foo', 'ns|suffix')")
+  end
+
+  def test_selector_extend
+    assert_equal(".foo .x, .foo .a .bar, .a .foo .bar",
+      evaluate("selector-extend('.foo .x', '.x', '.a .bar')"))
+    assert_equal(".foo .x, .foo .bang, .x.bar, .bar.bang",
+      evaluate("selector-extend('.foo .x, .x.bar', '.x', '.bang')"))
+    assert_equal(".y .x, .foo .x, .y .foo, .foo .foo",
+      evaluate("selector-extend('.y .x', '.x, .y', '.foo')"))
+    assert_equal(".foo .x, .foo .bar, .foo .bang",
+      evaluate("selector-extend('.foo .x', '.x', '.bar, .bang')"))
+    assert_equal(".foo.x, .foo",
+      evaluate("selector-extend('.foo.x', '.x', '.foo')"))
+  end
+
+  def test_selector_extend_checks_types
+    assert_error_message("$selector: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-extend'",
+      "selector-extend(12, '.foo', '.bar')")
+    assert_error_message("$extendee: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-extend'",
+      "selector-extend('.foo', 12, '.bar')")
+    assert_error_message("$extender: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-extend'",
+      "selector-extend('.foo', '.bar', 12)")
+  end
+
+  def test_selector_extend_errors
+    assert_error_message("Can't extend .bar .baz: can't extend nested selectors for " +
+      "`selector-extend'", "selector-extend('.foo', '.bar .baz', '.bang')")
+    assert_error_message("Can't extend >: invalid selector for `selector-extend'",
+      "selector-extend('.foo', '>', '.bang')")
+    assert_error_message(".bang > can't extend: invalid selector for `selector-extend'",
+      "selector-extend('.foo', '.bar', '.bang >')")
+  end
+
+  def test_selector_replace
+    assert_equal(".bar", evaluate("selector-replace('.foo', '.foo', '.bar')"))
+    assert_equal(".foo.baz", evaluate("selector-replace('.foo.bar', '.bar', '.baz')"))
+    assert_equal(".a .foo.baz", evaluate("selector-replace('.foo.bar', '.bar', '.a .baz')"))
+
+    # These shouldn't warn since we still support componud targets for selector
+    # functions.
+    assert_no_warning {assert_equal(".foo.bar", evaluate("selector-replace('.foo.bar', '.baz.bar', '.qux')"))}
+    assert_no_warning {assert_equal(".bar.qux", evaluate("selector-replace('.foo.bar.baz', '.foo.baz', '.qux')"))}
+
+    assert_equal(":not(.bar)", evaluate("selector-replace(':not(.foo)', '.foo', '.bar')"))
+    assert_equal(".bar", evaluate("selector-replace(':not(.foo)', ':not(.foo)', '.bar')"))
+  end
+
+  def test_selector_replace_checks_types
+    assert_error_message("$selector: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-replace'",
+      "selector-replace(12, '.foo', '.bar')")
+    assert_error_message("$original: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-replace'",
+      "selector-replace('.foo', 12, '.bar')")
+    assert_error_message("$replacement: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-replace'",
+      "selector-replace('.foo', '.bar', 12)")
+  end
+
+  def test_selector_replace_errors
+    assert_error_message("Can't extend .bar .baz: can't extend nested selectors for " +
+      "`selector-replace'", "selector-replace('.foo', '.bar .baz', '.bang')")
+    assert_error_message("Can't extend >: invalid selector for `selector-replace'",
+      "selector-replace('.foo', '>', '.bang')")
+    assert_error_message(".bang > can't extend: invalid selector for `selector-replace'",
+      "selector-replace('.foo', '.bar', '.bang >')")
+  end
+
+  def test_selector_unify
+    assert_equal(".foo", evaluate("selector-unify('.foo', '.foo')"))
+    assert_equal(".foo.bar", evaluate("selector-unify('.foo', '.bar')"))
+    assert_equal(".foo.bar.baz", evaluate("selector-unify('.foo.bar', '.bar.baz')"))
+    assert_equal(".a .b .foo.bar, .b .a .foo.bar", evaluate("selector-unify('.a .foo', '.b .bar')"))
+    assert_equal(".a .foo.bar", evaluate("selector-unify('.a .foo', '.a .bar')"))
+    assert_equal("", evaluate("selector-unify('p', 'a')"))
+    assert_equal("", evaluate("selector-unify('.foo >', '.bar')"))
+    assert_equal("", evaluate("selector-unify('.foo', '.bar >')"))
+    assert_equal(".foo.baz, .foo.bang, .bar.baz, .bar.bang",
+      evaluate("selector-unify('.foo, .bar', '.baz, .bang')"))
+  end
+
+  def test_selector_unify_checks_types
+    assert_error_message("$selector1: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-unify'",
+      "selector-unify(12, '.foo')")
+    assert_error_message("$selector2: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `selector-unify'",
+      "selector-unify('.foo', 12)")
+  end
+
+  def test_simple_selectors
+    assert_equal('(.foo,)', evaluate("inspect(simple-selectors('.foo'))"))
+    assert_equal('.foo, .bar', evaluate("inspect(simple-selectors('.foo.bar'))"))
+    assert_equal('.foo, .bar, :pseudo("flip, flap")',
+      evaluate("inspect(simple-selectors('.foo.bar:pseudo(\"flip, flap\")'))"))
+  end
+
+  def test_simple_selectors_checks_types
+    assert_error_message("$selector: 12 is not a string for `simple-selectors'",
+      "simple-selectors(12)")
+  end
+
+  def test_simple_selectors_errors
+    assert_error_message("$selector: \".foo .bar\" is not a compound selector for `simple-selectors'",
+      "simple-selectors('.foo .bar')")
+    assert_error_message("$selector: \".foo,.bar\" is not a compound selector for `simple-selectors'",
+      "simple-selectors('.foo,.bar')")
+    assert_error_message("$selector: \".#\" is not a valid selector: Invalid CSS after \".\": " +
+      "expected class name, was \"#\" for `simple-selectors'", "simple-selectors('.#')")
+  end
+
+  def test_is_superselector
+    assert_equal("true", evaluate("is-superselector('.foo', '.foo.bar')"))
+    assert_equal("false", evaluate("is-superselector('.foo.bar', '.foo')"))
+    assert_equal("true", evaluate("is-superselector('.foo', '.foo')"))
+    assert_equal("true", evaluate("is-superselector('.bar', '.foo .bar')"))
+    assert_equal("false", evaluate("is-superselector('.foo .bar', '.bar')"))
+    assert_equal("true", evaluate("is-superselector('.foo .bar', '.foo > .bar')"))
+    assert_equal("false", evaluate("is-superselector('.foo > .bar', '.foo .bar')"))
+  end
+
+  def test_is_superselector_checks_types
+    assert_error_message("$super: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `is-superselector'",
+      "is-superselector(12, '.foo')")
+    assert_error_message("$sub: 12 is not a valid selector: it must be a string,\n" +
+      "a list of strings, or a list of lists of strings for `is-superselector'",
+      "is-superselector('.foo', 12)")
+  end
+
+  ## Regression Tests
+
+  def test_inspect_nested_empty_lists
+    assert_equal "() ()", evaluate("inspect(() ())")
+  end
+
+  def test_saturation_bounds
+    assert_equal "#fbfdff", evaluate("hsl(hue(#fbfdff), saturation(#fbfdff), lightness(#fbfdff))")
+  end
+
+  private
+  def env(hash = {}, parent = nil)
+    env = Sass::Environment.new(parent)
+    hash.each {|k, v| env.set_var(k, v)}
+    env
+  end
+
+  def evaluate(value, environment = env)
+    result = perform(value, environment)
+    assert_kind_of Sass::Script::Value::Base, result
+    return result.to_s
+  end
+
+  def perform(value, environment = env)
+    Sass::Script::Parser.parse(value, 1, 0, {:filename => "#{test_name}_inline.scss"}).perform(environment)
+  end
+
+  def render(sass, options = {})
+    options[:syntax] ||= :scss
+    munge_filename options
+    options[:importer] ||= MockImporter.new
+    Sass::Engine.new(sass, options).render
+  end
+
+  def assert_error_message(message, value)
+    evaluate(value)
+    flunk("Error message expected but not raised: #{message}")
+  rescue Sass::SyntaxError => e
+    assert_equal(message, e.message)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/importer_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/importer_test.rb
new file mode 100755
index 0000000..d438f8f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/importer_test.rb
@@ -0,0 +1,420 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require File.dirname(__FILE__) + '/test_helper'
+require 'mock_importer'
+require 'sass/plugin'
+
+class ImporterTest < MiniTest::Test
+
+  class FruitImporter < Sass::Importers::Base
+    def find(name, context = nil)
+      fruit = parse(name)
+      return unless fruit
+      color = case fruit
+      when "apple"
+        "red"
+      when "orange"
+        "orange"
+      else
+        "blue"
+      end
+      contents = %Q{
+        $#{fruit}-color: #{color} !default;
+        @mixin #{fruit} {
+          color: $#{fruit}-color;
+        }
+      }
+      Sass::Engine.new(contents, :filename => name, :syntax => :scss, :importer => self)
+    end
+
+    def key(name, context)
+      [self.class.name, name]
+    end
+
+    def public_url(name, sourcemap_directory = nil)
+      "http://#{parse(name)}.example.com/style.scss"
+    end
+
+    private
+
+    def parse(name)
+      name[%r{fruits/(\w+)(\.s[ac]ss)?}, 1]
+    end
+  end
+
+  class NoPublicUrlImporter < FruitImporter
+    def public_url(name, sourcemap_directory = nil)
+      nil
+    end
+
+    private
+
+    def parse(name)
+      name[%r{ephemeral/(\w+)(\.s[ac]ss)?}, 1]
+    end
+  end
+
+  # This class proves that you can override the extension scheme for importers
+  class ReversedExtImporter < Sass::Importers::Filesystem
+    def extensions
+      {"sscs" => :scss, "ssas" => :sass}
+    end
+  end
+
+  # This importer maps one import to another import
+  # based on the mappings passed to importer's constructor.
+  class IndirectImporter < Sass::Importers::Base
+    def initialize(mappings, mtimes)
+      @mappings = mappings
+      @mtimes = mtimes
+    end
+    def find_relative(uri, base, options)
+      nil
+    end
+    def find(name, options)
+      if @mappings.has_key?(name)
+        Sass::Engine.new(
+          %Q[@import "#{@mappings[name]}";],
+          options.merge(
+            :filename => name,
+            :syntax => :scss,
+            :importer => self
+          )
+        )
+      end
+    end
+    def mtime(uri, options)
+      @mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
+    end
+    def key(uri, options)
+      [self.class.name, uri]
+    end
+    def to_s
+      "IndirectImporter(#{@mappings.keys.join(", ")})"
+    end
+  end
+
+  # This importer maps the import to single class
+  # based on the mappings passed to importer's constructor.
+  class ClassImporter < Sass::Importers::Base
+    def initialize(mappings, mtimes)
+      @mappings = mappings
+      @mtimes = mtimes
+    end
+    def find_relative(uri, base, options)
+      nil
+    end
+    def find(name, options)
+      if @mappings.has_key?(name)
+        Sass::Engine.new(
+          %Q[.#{name}{#{@mappings[name]}}],
+          options.merge(
+            :filename => name,
+            :syntax => :scss,
+            :importer => self
+          )
+        )
+      end
+    end
+    def mtime(uri, options)
+      @mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
+    end
+    def key(uri, options)
+      [self.class.name, uri]
+    end
+    def to_s
+      "ClassImporter(#{@mappings.keys.join(", ")})"
+    end
+  end
+
+  def test_can_resolve_generated_imports
+    scss_file = %Q{
+      $pear-color: green;
+      @import "fruits/apple"; @import "fruits/orange"; @import "fruits/pear";
+      .apple { @include apple; }
+      .orange { @include orange; }
+      .pear { @include pear; }
+    }
+    css_file = <<CSS
+.apple { color: red; }
+
+.orange { color: orange; }
+
+.pear { color: green; }
+CSS
+    options = {:style => :compact, :load_paths => [FruitImporter.new], :syntax => :scss}
+    assert_equal css_file, Sass::Engine.new(scss_file, options).render
+  end
+
+  def test_extension_overrides
+    FileUtils.mkdir_p(absolutize("tmp"))
+    open(absolutize("tmp/foo.ssas"), "w") {|f| f.write(".foo\n  reversed: true\n")}
+    open(absolutize("tmp/bar.sscs"), "w") {|f| f.write(".bar {reversed: true}\n")}
+    scss_file = %Q{
+      @import "foo", "bar";
+      @import "foo.ssas", "bar.sscs";
+    }
+    css_file = <<CSS
+.foo { reversed: true; }
+
+.bar { reversed: true; }
+
+.foo { reversed: true; }
+
+.bar { reversed: true; }
+CSS
+    options = {:style => :compact, :load_paths => [ReversedExtImporter.new(absolutize("tmp"))], :syntax => :scss}
+    assert_equal css_file, Sass::Engine.new(scss_file, options).render
+  ensure
+    FileUtils.rm_rf(absolutize("tmp"))
+  end
+
+  def test_staleness_check_across_importers
+    file_system_importer = Sass::Importers::Filesystem.new(fixture_dir)
+    # Make sure the first import is older
+    indirect_importer = IndirectImporter.new({"apple" => "pear"}, {"apple" => Time.now - 1})
+    # Make css file is newer so the dependencies are the only way for the css file to be out of date.
+    FileUtils.touch(fixture_file("test_staleness_check_across_importers.css"))
+    # Make sure the first import is older
+    class_importer = ClassImporter.new({"pear" => %Q{color: green;}}, {"pear" => Time.now + 1})
+
+    options = {
+      :style => :compact,
+      :filename => fixture_file("test_staleness_check_across_importers.scss"),
+      :importer => file_system_importer,
+      :load_paths => [file_system_importer, indirect_importer, class_importer],
+      :syntax => :scss
+    }
+
+    assert_equal File.read(fixture_file("test_staleness_check_across_importers.css")),
+                 Sass::Engine.new(File.read(fixture_file("test_staleness_check_across_importers.scss")), options).render
+
+    checker = Sass::Plugin::StalenessChecker.new(options)
+
+    assert checker.stylesheet_needs_update?(
+      fixture_file("test_staleness_check_across_importers.css"),
+      fixture_file("test_staleness_check_across_importers.scss"),
+      file_system_importer
+    )
+  end
+
+  def test_source_map_with_only_css_uri_supports_public_url_imports
+    fruit_importer = FruitImporter.new
+
+    options = {
+      :filename => 'fruits/orange',
+      :importer => fruit_importer,
+      :syntax => :scss
+    }
+
+    engine = Sass::Engine.new(<<SCSS, options)
+.orchard {
+  color: blue;
+}
+SCSS
+
+    _, sourcemap = engine.render_with_sourcemap('sourcemap_uri')
+    assert_equal <<JSON.strip, sourcemap.to_json(:css_uri => 'css_uri')
+{
+"version": 3,
+"mappings": "AAAA,QAAS;EACP,KAAK,EAAE,IAAI",
+"sources": ["http://orange.example.com/style.scss"],
+"names": [],
+"file": "css_uri"
+}
+JSON
+  end
+
+  def test_source_map_with_only_css_uri_can_have_no_public_url
+    ephemeral_importer = NoPublicUrlImporter.new
+    mock_importer = MockImporter.new
+    def mock_importer.public_url(name, sourcemap_directory = nil)
+      "source_uri"
+    end
+
+    options = {
+      :filename => filename_for_test,
+      :sourcemap_filename => sourcemap_filename_for_test,
+      :importer => mock_importer,
+      :syntax => :scss,
+      :load_paths => [ephemeral_importer],
+      :cache => false
+    }
+
+    engine = Sass::Engine.new(<<SCSS, options)
+@import "ephemeral/orange";
+.orange {
+  @include orange;
+}
+SCSS
+
+    css_output, sourcemap = engine.render_with_sourcemap('sourcemap_uri')
+    assert_equal <<CSS.strip, css_output.strip
+.orange {
+  color: orange; }
+
+/*# sourceMappingURL=sourcemap_uri */
+CSS
+    map = sourcemap.to_json(:css_uri => 'css_uri')
+    assert_equal <<JSON.strip, map
+{
+"version": 3,
+"mappings": "AACA,OAAQ",
+"sources": ["source_uri"],
+"names": [],
+"file": "css_uri"
+}
+JSON
+  end
+
+  def test_source_map_with_only_css_uri_falls_back_to_file_uris
+    file_system_importer = Sass::Importers::Filesystem.new('.')
+    options = {
+      :filename => filename_for_test(:scss),
+      :sourcemap_filename => sourcemap_filename_for_test,
+      :importer => file_system_importer,
+      :syntax => :scss
+    }
+
+    engine = Sass::Engine.new(<<SCSS, options)
+.foo {a: b}
+SCSS
+
+    _, sourcemap = engine.render_with_sourcemap('http://1.example.com/style.map')
+
+    uri = Sass::Util.file_uri_from_path(File.absolute_path(filename_for_test(:scss)))
+    assert_equal <<JSON.strip, sourcemap.to_json(:css_uri => 'css_uri')
+{
+"version": 3,
+"mappings": "AAAA,IAAK;EAAC,CAAC,EAAE,CAAC",
+"sources": ["#{uri}"],
+"names": [],
+"file": "css_uri"
+}
+JSON
+  end
+
+  def test_source_map_with_css_uri_and_css_path_falls_back_to_file_uris
+    file_system_importer = Sass::Importers::Filesystem.new('.')
+    options = {
+      :filename => filename_for_test(:scss),
+      :sourcemap_filename => sourcemap_filename_for_test,
+      :importer => file_system_importer,
+      :syntax => :scss
+    }
+
+    engine = Sass::Engine.new(<<SCSS, options)
+.foo {a: b}
+SCSS
+
+    _, sourcemap = engine.render_with_sourcemap('http://1.example.com/style.map')
+
+    uri = Sass::Util.file_uri_from_path(File.absolute_path(filename_for_test(:scss)))
+    assert_equal <<JSON.strip, sourcemap.to_json(:css_uri => 'css_uri', :css_path => 'css_path')
+{
+"version": 3,
+"mappings": "AAAA,IAAK;EAAC,CAAC,EAAE,CAAC",
+"sources": ["#{uri}"],
+"names": [],
+"file": "css_uri"
+}
+JSON
+  end
+
+  def test_source_map_with_css_uri_and_sourcemap_path_supports_filesystem_importer
+    file_system_importer = Sass::Importers::Filesystem.new('.')
+    css_uri = 'css_uri'
+    sourcemap_path = 'map/style.map'
+    options = {
+      :filename => 'sass/style.scss',
+      :sourcemap_filename => sourcemap_path,
+      :importer => file_system_importer,
+      :syntax => :scss
+    }
+
+    engine = Sass::Engine.new(<<SCSS, options)
+.foo {a: b}
+SCSS
+
+    rendered, sourcemap = engine.render_with_sourcemap('http://1.example.com/style.map')
+
+
+    rendered, sourcemap = engine.render_with_sourcemap('http://map.example.com/map/style.map')
+    assert_equal <<JSON.strip, sourcemap.to_json(:css_uri => css_uri, :sourcemap_path => sourcemap_path)
+{
+"version": 3,
+"mappings": "AAAA,IAAK;EAAC,CAAC,EAAE,CAAC",
+"sources": ["../sass/style.scss"],
+"names": [],
+"file": "css_uri"
+}
+JSON
+  end
+
+  def test_source_map_with_css_path_and_sourcemap_path_supports_file_system_importer
+    file_system_importer = Sass::Importers::Filesystem.new('.')
+    sass_path = 'sass/style.scss'
+    css_path = 'static/style.css'
+    sourcemap_path = 'map/style.map'
+    options = {
+      :filename => sass_path,
+      :sourcemap_filename => sourcemap_path,
+      :importer => file_system_importer,
+      :syntax => :scss
+    }
+
+    engine = Sass::Engine.new(<<SCSS, options)
+.foo {a: b}
+SCSS
+
+    _, sourcemap = engine.render_with_sourcemap('http://map.example.com/map/style.map')
+    assert_equal <<JSON.strip, sourcemap.to_json(:css_path => css_path, :sourcemap_path => sourcemap_path)
+{
+"version": 3,
+"mappings": "AAAA,IAAK;EAAC,CAAC,EAAE,CAAC",
+"sources": ["../sass/style.scss"],
+"names": [],
+"file": "../static/style.css"
+}
+JSON
+  end
+
+  def test_render_with_sourcemap_requires_filename
+    file_system_importer = Sass::Importers::Filesystem.new('.')
+    engine = Sass::Engine.new(".foo {a: b}", :syntax => :scss, :importer => file_system_importer)
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE) {engine.render_with_sourcemap('sourcemap_url')}
+Error generating source map: couldn't determine public URL for the source stylesheet.
+  No filename is available so there's nothing for the source map to link to.
+MESSAGE
+  end
+
+  def test_render_with_sourcemap_requires_importer_with_public_url
+    class_importer = ClassImporter.new({"pear" => "color: green;"}, {"pear" => Time.now})
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE) {class_importer.find("pear", {}).render_with_sourcemap('sourcemap_url')}
+Error generating source map: couldn't determine public URL for "pear".
+  Without a public URL, there's nothing for the source map to link to.
+  Custom importers should define the #public_url method.
+MESSAGE
+  end
+
+  def fixture_dir
+    File.join(File.dirname(__FILE__), "fixtures")
+  end
+
+  def fixture_file(path)
+    File.join(fixture_dir, path)
+  end
+
+  def test_filesystem_importer_eql
+    importer = Sass::Importers::Filesystem.new('.')
+    assert importer.eql?(Sass::Importers::Filesystem.new('.'))
+    assert importer.eql?(ReversedExtImporter.new('.'))
+    assert !importer.eql?(Sass::Importers::Filesystem.new('foo'))
+    assert !importer.eql?(nil)
+    assert !importer.eql?('foo')
+  end
+
+  def test_absolute_files_across_template_locations
+    importer = Sass::Importers::Filesystem.new(absolutize 'templates')
+    refute_nil importer.mtime(absolutize('more_templates/more1.sass'), {})
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/logger_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/logger_test.rb
new file mode 100755
index 0000000..dd32681
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/logger_test.rb
@@ -0,0 +1,57 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'pathname'
+
+class LoggerTest < MiniTest::Test
+
+  class InterceptedLogger < Sass::Logger::Base
+
+    attr_accessor :messages
+
+    def initialize(*args)
+      super
+      self.messages = []
+    end
+
+    def reset!
+      self.messages = []
+    end
+
+    def _log(*args)
+      messages << [args]
+    end
+
+  end
+
+  def test_global_sass_logger_instance_exists
+    assert Sass.logger.respond_to?(:warn)
+  end
+
+  def test_log_level_orders
+    logged_levels = {
+      :trace => [ [], [:trace, :debug, :info, :warn, :error]],
+      :debug => [ [:trace],   [:debug, :info, :warn, :error]],
+      :info  => [ [:trace, :debug],   [:info, :warn, :error]],
+      :warn  => [ [:trace, :debug, :info],   [:warn, :error]],
+      :error => [ [:trace, :debug, :info, :warn],   [:error]]
+    }
+    logged_levels.each do |level, (should_not_be_logged, should_be_logged)|
+      logger = Sass::Logger::Base.new(level)
+      should_not_be_logged.each do |should_level|
+        assert !logger.logging_level?(should_level)
+      end
+      should_be_logged.each do |should_level|
+        assert logger.logging_level?(should_level)
+      end
+    end
+  end
+
+  def test_logging_can_be_disabled
+    logger = InterceptedLogger.new
+    logger.error("message #1")
+    assert_equal 1, logger.messages.size
+    logger.reset!
+    logger.disabled = true
+    logger.error("message #2")
+    assert_equal 0, logger.messages.size
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/mock_importer.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/mock_importer.rb
new file mode 100644
index 0000000..312476d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/mock_importer.rb
@@ -0,0 +1,49 @@
+class MockImporter < Sass::Importers::Base
+  def initialize(name = "mock")
+    @name = name
+    @imports = Hash.new({})
+  end
+
+  def find_relative(uri, base, options)
+    nil
+  end
+
+  def find(uri, options)
+    contents = @imports[uri][:contents]
+    return unless contents
+    options[:syntax] = @imports[uri][:syntax]
+    options[:filename] = uri
+    options[:importer] = self
+    @imports[uri][:engine] = Sass::Engine.new(contents, options)
+  end
+
+  def mtime(uri, options)
+    @imports[uri][:mtime]
+  end
+
+  def key(uri, options)
+    ["mock", uri]
+  end
+
+  def to_s
+    @name
+  end
+
+  # Methods for testing
+
+  def add_import(uri, contents, syntax = :scss, mtime = Time.now - 10)
+    @imports[uri] = {
+      :contents => contents,
+      :mtime => mtime,
+      :syntax => syntax
+    }
+  end
+
+  def touch(uri)
+    @imports[uri][:mtime] = Time.now
+  end
+
+  def engine(uri)
+    @imports[uri][:engine]
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_results/more1.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_results/more1.css
new file mode 100644
index 0000000..b0d1182
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_results/more1.css
@@ -0,0 +1,9 @@
+body { font: Arial; background: blue; }
+
+#page { width: 700px; height: 100; }
+#page #header { height: 300px; }
+#page #header h1 { font-size: 50px; color: blue; }
+
+#content.user.show #container.top #column.left { width: 100px; }
+#content.user.show #container.top #column.right { width: 600px; }
+#content.user.show #container.bottom { background: brown; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_results/more1_with_line_comments.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_results/more1_with_line_comments.css
new file mode 100644
index 0000000..f31dbca
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_results/more1_with_line_comments.css
@@ -0,0 +1,26 @@
+/* line 3, ../more_templates/more1.sass */
+body {
+  font: Arial;
+  background: blue; }
+
+/* line 7, ../more_templates/more1.sass */
+#page {
+  width: 700px;
+  height: 100; }
+  /* line 10, ../more_templates/more1.sass */
+  #page #header {
+    height: 300px; }
+    /* line 12, ../more_templates/more1.sass */
+    #page #header h1 {
+      font-size: 50px;
+      color: blue; }
+
+/* line 18, ../more_templates/more1.sass */
+#content.user.show #container.top #column.left {
+  width: 100px; }
+/* line 20, ../more_templates/more1.sass */
+#content.user.show #container.top #column.right {
+  width: 600px; }
+/* line 22, ../more_templates/more1.sass */
+#content.user.show #container.bottom {
+  background: brown; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_results/more_import.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_results/more_import.css
new file mode 100644
index 0000000..b5dae09
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_results/more_import.css
@@ -0,0 +1,29 @@
+@import url(basic.css);
+@import url(../results/complex.css);
+imported { otherconst: hello; myconst: goodbye; pre-mixin: here; }
+
+body { font: Arial; background: blue; }
+
+#page { width: 700px; height: 100; }
+#page #header { height: 300px; }
+#page #header h1 { font-size: 50px; color: blue; }
+
+#content.user.show #container.top #column.left { width: 100px; }
+#content.user.show #container.top #column.right { width: 600px; }
+#content.user.show #container.bottom { background: brown; }
+
+midrule { inthe: middle; }
+
+body { font: Arial; background: blue; }
+
+#page { width: 700px; height: 100; }
+#page #header { height: 300px; }
+#page #header h1 { font-size: 50px; color: blue; }
+
+#content.user.show #container.top #column.left { width: 100px; }
+#content.user.show #container.top #column.right { width: 600px; }
+#content.user.show #container.bottom { background: brown; }
+
+#foo { background-color: #baf; }
+
+nonimported { myconst: hello; otherconst: goodbye; post-mixin: here; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_templates/_more_partial.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_templates/_more_partial.sass
new file mode 100644
index 0000000..bef627d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_templates/_more_partial.sass
@@ -0,0 +1,2 @@
+#foo
+  :background-color #baf
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_templates/more1.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_templates/more1.sass
new file mode 100644
index 0000000..23b4e87
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_templates/more1.sass
@@ -0,0 +1,23 @@
+
+
+body  
+  font: Arial
+  background: blue
+
+#page
+  width: 700px
+  height: 100
+  #header
+    height: 300px
+    h1
+      font-size: 50px
+      color:     blue
+
+#content.user.show
+  #container.top
+    #column.left
+      width: 100px
+    #column.right
+      width: 600px
+  #container.bottom
+    background: brown
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_templates/more_import.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_templates/more_import.sass
new file mode 100644
index 0000000..f55a39c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/more_templates/more_import.sass
@@ -0,0 +1,11 @@
+$preconst: hello
+
+=premixin
+  pre-mixin: here
+
+@import importee, basic, basic.css, ../results/complex.css, more_partial
+
+nonimported
+  myconst: $preconst
+  otherconst: $postconst
+  +postmixin
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/plugin_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/plugin_test.rb
new file mode 100755
index 0000000..4d1d30b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/plugin_test.rb
@@ -0,0 +1,552 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require File.dirname(__FILE__) + '/test_helper'
+require 'sass/plugin'
+require 'fileutils'
+
+module Sass::Script::Functions
+  def filename
+    filename = options[:filename].gsub(%r{.*((/[^/]+){4})}, '\1')
+    Sass::Script::Value::String.new(filename)
+  end
+
+  def whatever
+    custom = options[:custom]
+    whatever = custom && custom[:whatever]
+    Sass::Script::Value::String.new(whatever || "incorrect")
+  end
+end
+
+class SassPluginTest < MiniTest::Test
+  @@templates = %w{
+    complex script parent_ref import scss_import alt
+    subdir/subdir subdir/nested_subdir/nested_subdir
+    options import_content filename_fn import_charset
+    import_charset_ibm866
+  }
+
+  @@cache_store = Sass::CacheStores::Memory.new
+
+  def setup
+    Sass::Util.retry_on_windows {FileUtils.mkdir_p tempfile_loc}
+    Sass::Util.retry_on_windows {FileUtils.mkdir_p tempfile_loc(nil,"more_")}
+    set_plugin_opts
+    check_for_updates!
+    reset_mtimes
+  end
+
+  def teardown
+    clean_up_sassc
+    Sass::Plugin.reset!
+    Sass::Util.retry_on_windows {FileUtils.rm_r tempfile_loc}
+    Sass::Util.retry_on_windows {FileUtils.rm_r tempfile_loc(nil,"more_")}
+  end
+
+  @@templates.each do |name|
+    define_method("test_template_renders_correctly (#{name})") do
+      silence_warnings {assert_renders_correctly(name)}
+    end
+  end
+
+  def test_no_update
+    File.delete(tempfile_loc('basic'))
+    assert_needs_update 'basic'
+    check_for_updates!
+    assert_stylesheet_updated 'basic'
+  end
+
+  def test_update_needed_when_modified
+    touch 'basic'
+    assert_needs_update 'basic'
+    check_for_updates!
+    assert_stylesheet_updated 'basic'
+  end
+
+  def test_update_needed_when_dependency_modified
+    touch 'basic'
+    assert_needs_update 'import'
+    check_for_updates!
+    assert_stylesheet_updated 'basic'
+    assert_stylesheet_updated 'import'
+  end
+
+  def test_update_needed_when_scss_dependency_modified
+    touch 'scss_importee'
+    assert_needs_update 'import'
+    check_for_updates!
+    assert_stylesheet_updated 'scss_importee'
+    assert_stylesheet_updated 'import'
+  end
+
+  def test_scss_update_needed_when_dependency_modified
+    touch 'basic'
+    assert_needs_update 'scss_import'
+    check_for_updates!
+    assert_stylesheet_updated 'basic'
+    assert_stylesheet_updated 'scss_import'
+  end
+
+  def test_update_needed_when_nested_import_dependency_modified
+    touch 'basic'
+    assert_needs_update 'nested_import'
+    check_for_updates!
+    assert_stylesheet_updated 'basic'
+    assert_stylesheet_updated 'scss_import'
+  end
+
+  def test_no_updates_when_always_check_and_always_update_both_false
+    Sass::Plugin.options[:always_update] = false
+    Sass::Plugin.options[:always_check] = false
+
+    touch 'basic'
+    assert_needs_update 'basic'
+    check_for_updates!
+
+    # Check it's still stale
+    assert_needs_update 'basic'
+  end
+
+  def test_full_exception_handling
+    File.delete(tempfile_loc('bork1'))
+    check_for_updates!
+    File.open(tempfile_loc('bork1')) do |file|
+      assert_equal(<<CSS.strip, file.read.split("\n")[0...6].join("\n"))
+/*
+Error: Undefined variable: "$bork".
+        on line 2 of #{template_loc('bork1')}
+
+1: bork
+2:   bork: $bork
+CSS
+    end
+    File.delete(tempfile_loc('bork1'))
+  end
+
+  def test_full_exception_with_block_comment
+    File.delete(tempfile_loc('bork5'))
+    check_for_updates!
+    File.open(tempfile_loc('bork5')) do |file|
+      assert_equal(<<CSS.strip, file.read.split("\n")[0...7].join("\n"))
+/*
+Error: Undefined variable: "$bork".
+        on line 3 of #{template_loc('bork5')}
+
+1: bork
+2:   /* foo *\\/
+3:   bork: $bork
+CSS
+    end
+    File.delete(tempfile_loc('bork1'))
+  end
+
+  def test_single_level_import_loop
+    File.delete(tempfile_loc('single_import_loop'))
+    check_for_updates!
+    File.open(tempfile_loc('single_import_loop')) do |file|
+      assert_equal(<<CSS.strip, file.read.split("\n")[0...2].join("\n"))
+/*
+Error: An @import loop has been found: #{template_loc('single_import_loop')} imports itself
+CSS
+    end
+  end
+
+  def test_double_level_import_loop
+    File.delete(tempfile_loc('double_import_loop1'))
+    check_for_updates!
+    File.open(tempfile_loc('double_import_loop1')) do |file|
+      assert_equal(<<CSS.strip, file.read.split("\n")[0...4].join("\n"))
+/*
+Error: An @import loop has been found:
+           #{template_loc('double_import_loop1')} imports #{template_loc('_double_import_loop2')}
+           #{template_loc('_double_import_loop2')} imports #{template_loc('double_import_loop1')}
+CSS
+    end
+  end
+
+  def test_import_name_cleanup
+    File.delete(tempfile_loc('subdir/import_up1'))
+    check_for_updates!
+    File.open(tempfile_loc('subdir/import_up1')) do |file|
+      assert_equal(<<CSS.strip, file.read.split("\n")[0...5].join("\n"))
+/*
+Error: File to import not found or unreadable: ../subdir/import_up3.scss.
+       Load path: #{template_loc}
+        on line 1 of #{template_loc 'subdir/import_up2'}
+        from line 1 of #{template_loc 'subdir/import_up1'}
+CSS
+    end
+  end
+
+  def test_nonfull_exception_handling
+    old_full_exception = Sass::Plugin.options[:full_exception]
+    Sass::Plugin.options[:full_exception] = false
+
+    File.delete(tempfile_loc('bork1'))
+    assert_raises(Sass::SyntaxError) {check_for_updates!}
+  ensure
+    Sass::Plugin.options[:full_exception] = old_full_exception
+  end
+
+  def test_two_template_directories
+    set_plugin_opts :template_location => {
+      template_loc => tempfile_loc,
+      template_loc(nil,'more_') => tempfile_loc(nil,'more_')
+    }
+    check_for_updates!
+    ['more1', 'more_import'].each { |name| assert_renders_correctly(name, :prefix => 'more_') }
+  end
+
+  def test_two_template_directories_with_line_annotations
+    set_plugin_opts :line_comments => true,
+                    :style => :nested,
+                    :template_location => {
+                      template_loc => tempfile_loc,
+                      template_loc(nil,'more_') => tempfile_loc(nil,'more_')
+                    }
+    check_for_updates!
+    assert_renders_correctly('more1_with_line_comments', 'more1', :prefix => 'more_')
+  end
+
+  def test_doesnt_render_partials
+    assert !File.exist?(tempfile_loc('_partial'))
+  end
+
+  def test_template_location_array
+    assert_equal [[template_loc, tempfile_loc]], Sass::Plugin.template_location_array
+  end
+
+  def test_add_template_location
+    Sass::Plugin.add_template_location(template_loc(nil, "more_"), tempfile_loc(nil, "more_"))
+    assert_equal(
+      [[template_loc, tempfile_loc], [template_loc(nil, "more_"), tempfile_loc(nil, "more_")]],
+      Sass::Plugin.template_location_array)
+
+    touch 'more1', 'more_'
+    touch 'basic'
+    assert_needs_update "more1", "more_"
+    assert_needs_update "basic"
+    check_for_updates!
+    assert_doesnt_need_update "more1", "more_"
+    assert_doesnt_need_update "basic"
+  end
+
+  def test_remove_template_location
+    Sass::Plugin.add_template_location(template_loc(nil, "more_"), tempfile_loc(nil, "more_"))
+    Sass::Plugin.remove_template_location(template_loc, tempfile_loc)
+    assert_equal(
+      [[template_loc(nil, "more_"), tempfile_loc(nil, "more_")]],
+      Sass::Plugin.template_location_array)
+
+    touch 'more1', 'more_'
+    touch 'basic'
+    assert_needs_update "more1", "more_"
+    assert_needs_update "basic"
+    check_for_updates!
+    assert_doesnt_need_update "more1", "more_"
+    assert_needs_update "basic"
+  end
+
+  def test_import_same_name
+    assert_warning <<WARNING do
+WARNING: In #{template_loc}:
+  There are multiple files that match the name "same_name_different_partiality.scss":
+    _same_name_different_partiality.scss
+    same_name_different_partiality.scss
+WARNING
+      touch "_same_name_different_partiality"
+      assert_needs_update "same_name_different_partiality"
+    end
+  end
+
+  # Callbacks
+
+  def test_updated_stylesheet_callback_for_updated_template
+    Sass::Plugin.options[:always_update] = false
+    touch 'basic'
+    assert_no_callback :updated_stylesheet, template_loc("complex"), tempfile_loc("complex") do
+      assert_callbacks(
+        [:updated_stylesheet, template_loc("basic"), tempfile_loc("basic")],
+        [:updated_stylesheet, template_loc("import"), tempfile_loc("import")])
+    end
+  end
+
+  def test_updated_stylesheet_callback_for_fresh_template
+    Sass::Plugin.options[:always_update] = false
+    assert_no_callback :updated_stylesheet
+  end
+
+  def test_updated_stylesheet_callback_for_error_template
+    Sass::Plugin.options[:always_update] = false
+    touch 'bork1'
+    assert_no_callback :updated_stylesheet
+  end
+
+  def test_not_updating_stylesheet_callback_for_fresh_template
+    Sass::Plugin.options[:always_update] = false
+    assert_callback :not_updating_stylesheet, template_loc("basic"), tempfile_loc("basic")
+  end
+
+  def test_not_updating_stylesheet_callback_for_updated_template
+    Sass::Plugin.options[:always_update] = false
+    assert_callback :not_updating_stylesheet, template_loc("complex"), tempfile_loc("complex") do
+      assert_no_callbacks(
+        [:updated_stylesheet, template_loc("basic"), tempfile_loc("basic")],
+        [:updated_stylesheet, template_loc("import"), tempfile_loc("import")])
+    end
+  end
+
+  def test_not_updating_stylesheet_callback_with_never_update
+    Sass::Plugin.options[:never_update] = true
+    assert_no_callback :not_updating_stylesheet
+  end
+
+  def test_not_updating_stylesheet_callback_for_partial
+    Sass::Plugin.options[:always_update] = false
+    assert_no_callback :not_updating_stylesheet, template_loc("_partial"), tempfile_loc("_partial")
+  end
+
+  def test_not_updating_stylesheet_callback_for_error
+    Sass::Plugin.options[:always_update] = false
+    touch 'bork1'
+    assert_no_callback :not_updating_stylesheet, template_loc("bork1"), tempfile_loc("bork1")
+  end
+
+  def test_compilation_error_callback
+    Sass::Plugin.options[:always_update] = false
+    touch 'bork1'
+    assert_callback(:compilation_error,
+      lambda {|e| e.message == 'Undefined variable: "$bork".'},
+      template_loc("bork1"), tempfile_loc("bork1"))
+  end
+
+  def test_compilation_error_callback_for_file_access
+    Sass::Plugin.options[:always_update] = false
+    assert_callback(:compilation_error,
+      lambda {|e| e.is_a?(Errno::ENOENT)},
+      template_loc("nonexistent"), tempfile_loc("nonexistent")) do
+      Sass::Plugin.update_stylesheets([[template_loc("nonexistent"), tempfile_loc("nonexistent")]])
+    end
+  end
+
+  def test_creating_directory_callback
+    Sass::Plugin.options[:always_update] = false
+    dir = File.join(tempfile_loc, "subdir", "nested_subdir")
+    FileUtils.rm_r dir
+    assert_callback :creating_directory, dir
+  end
+
+  ## Regression
+
+  def test_cached_dependencies_update
+    FileUtils.mv(template_loc("basic"), template_loc("basic", "more_"))
+    set_plugin_opts :load_paths => [template_loc(nil, "more_")]
+
+    touch 'basic', 'more_'
+    assert_needs_update "import"
+    check_for_updates!
+    assert_renders_correctly("import")
+  ensure
+    FileUtils.mv(template_loc("basic", "more_"), template_loc("basic"))
+  end
+
+  def test_cached_relative_import
+    old_always_update = Sass::Plugin.options[:always_update]
+    Sass::Plugin.options[:always_update] = true
+    check_for_updates!
+    assert_renders_correctly('subdir/subdir')
+  ensure
+    Sass::Plugin.options[:always_update] = old_always_update
+  end
+
+  def test_cached_if
+    set_plugin_opts :cache_store => Sass::CacheStores::Filesystem.new(tempfile_loc + '/cache')
+    check_for_updates!
+    assert_renders_correctly 'if'
+    check_for_updates!
+    assert_renders_correctly 'if'
+  ensure
+    set_plugin_opts
+  end
+
+  def test_cached_import_option
+    set_plugin_opts :custom => {:whatever => "correct"}
+    check_for_updates!
+    assert_renders_correctly "cached_import_option"
+
+    @@cache_store.reset!
+    set_plugin_opts :custom => nil, :always_update => false
+    check_for_updates!
+    assert_renders_correctly "cached_import_option"
+
+    set_plugin_opts :custom => {:whatever => "correct"}, :always_update => true
+    check_for_updates!
+    assert_renders_correctly "cached_import_option"
+  ensure
+    set_plugin_opts :custom => nil
+  end
+
+ private
+
+  def assert_renders_correctly(*arguments)
+    options = arguments.last.is_a?(Hash) ? arguments.pop : {}
+    prefix = options[:prefix]
+    result_name = arguments.shift
+    tempfile_name = arguments.shift || result_name
+
+    expected_str = File.read(result_loc(result_name, prefix))
+    actual_str = File.read(tempfile_loc(tempfile_name, prefix))
+    expected_str = expected_str.force_encoding('IBM866') if result_name == 'import_charset_ibm866'
+    actual_str = actual_str.force_encoding('IBM866') if tempfile_name == 'import_charset_ibm866'
+    expected_lines = expected_str.split("\n")
+    actual_lines = actual_str.split("\n")
+
+    if actual_lines.first == "/*" && expected_lines.first != "/*"
+      assert(false, actual_lines[0..actual_lines.each_with_index.find {|l, i| l == "*/"}.last].join("\n"))
+    end
+
+    expected_lines.zip(actual_lines).each_with_index do |pair, line|
+      message = "template: #{result_name}\nline:     #{line + 1}"
+      assert_equal(pair.first, pair.last, message)
+    end
+    if expected_lines.size < actual_lines.size
+      assert(false, "#{actual_lines.size - expected_lines.size} Trailing lines found in #{tempfile_name}.css: #{actual_lines[expected_lines.size..-1].join('\n')}")
+    end
+  end
+
+  def assert_stylesheet_updated(name)
+    assert_doesnt_need_update name
+
+    # Make sure it isn't an exception
+    expected_lines = File.read(result_loc(name)).split("\n")
+    actual_lines = File.read(tempfile_loc(name)).split("\n")
+    if actual_lines.first == "/*" && expected_lines.first != "/*"
+      assert(false, actual_lines[0..actual_lines.each_with_index.find {|l, i| l == "*/"}.last].join("\n"))
+    end
+  end
+
+  def assert_callback(name, *expected_args)
+    run = false
+    received_args = nil
+    Sass::Plugin.send("on_#{name}") do |*args|
+      received_args = args
+      run ||= expected_args.zip(received_args).all? do |ea, ra|
+        ea.respond_to?(:call) ? ea.call(ra) : ea == ra
+      end
+    end
+
+    if block_given?
+      Sass::Util.silence_sass_warnings {yield}
+    else
+      check_for_updates!
+    end
+
+    assert run, "Expected #{name} callback to be run with arguments:\n  #{expected_args.inspect}\nHowever, it got:\n  #{received_args.inspect}"
+  end
+
+  def assert_no_callback(name, *unexpected_args)
+    Sass::Plugin.send("on_#{name}") do |*a|
+      next unless unexpected_args.empty? || a == unexpected_args
+
+      msg = "Expected #{name} callback not to be run"
+      if !unexpected_args.empty?
+        msg << " with arguments #{unexpected_args.inspect}"
+      elsif !a.empty?
+        msg << ",\n  was run with arguments #{a.inspect}"
+      end
+
+      flunk msg
+    end
+
+    if block_given?
+      yield
+    else
+      check_for_updates!
+    end
+  end
+
+  def assert_callbacks(*args)
+    return check_for_updates! if args.empty?
+    assert_callback(*args.pop) {assert_callbacks(*args)}
+  end
+
+  def assert_no_callbacks(*args)
+    return check_for_updates! if args.empty?
+    assert_no_callback(*args.pop) {assert_no_callbacks(*args)}
+  end
+
+  def check_for_updates!
+    Sass::Util.silence_sass_warnings do
+      Sass::Plugin.check_for_updates
+    end
+  end
+
+  def assert_needs_update(*args)
+    assert(Sass::Plugin::StalenessChecker.stylesheet_needs_update?(tempfile_loc(*args), template_loc(*args)),
+      "Expected #{template_loc(*args)} to need an update.")
+  end
+
+  def assert_doesnt_need_update(*args)
+    assert(!Sass::Plugin::StalenessChecker.stylesheet_needs_update?(tempfile_loc(*args), template_loc(*args)),
+      "Expected #{template_loc(*args)} not to need an update.")
+  end
+
+  def touch(*args)
+    FileUtils.touch(template_loc(*args))
+  end
+
+  def reset_mtimes
+    Sass::Plugin::StalenessChecker.dependencies_cache = {}
+    atime = Time.now
+    mtime = Time.now - 5
+    Dir["{#{template_loc},#{tempfile_loc}}/**/*.{css,sass,scss}"].each do |f|
+      Sass::Util.retry_on_windows {File.utime(atime, mtime, f)}
+    end
+  end
+
+  def template_loc(name = nil, prefix = nil)
+    if name
+      scss = absolutize "#{prefix}templates/#{name}.scss"
+      File.exist?(scss) ? scss : absolutize("#{prefix}templates/#{name}.sass")
+    else
+      absolutize "#{prefix}templates"
+    end
+  end
+
+  def tempfile_loc(name = nil, prefix = nil)
+    if name
+      absolutize "#{prefix}tmp/#{name}.css"
+    else
+      absolutize "#{prefix}tmp"
+    end
+  end
+
+  def result_loc(name = nil, prefix = nil)
+    if name
+      absolutize "#{prefix}results/#{name}.css"
+    else
+      absolutize "#{prefix}results"
+    end
+  end
+
+  def set_plugin_opts(overrides = {})
+    Sass::Plugin.options.merge!(
+      :template_location => template_loc,
+      :css_location => tempfile_loc,
+      :style => :compact,
+      :always_update => true,
+      :never_update => false,
+      :full_exception => true,
+      :cache_store => @@cache_store,
+      :sourcemap => :none
+    )
+    Sass::Plugin.options.merge!(overrides)
+  end
+end
+
+class Sass::Engine
+  alias_method :old_render, :render
+
+  def render
+    raise "bork bork bork!" if @template[0] == "{bork now!}"
+    old_render
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/alt.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/alt.css
new file mode 100644
index 0000000..8484343
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/alt.css
@@ -0,0 +1,4 @@
+h1 { float: left; width: 274px; height: 75px; margin: 0; background-repeat: no-repeat; background-image: none; }
+h1 a:hover, h1 a:visited { color: green; }
+h1 b:hover { color: red; background-color: green; }
+h1 const { nosp: 3; sp: 3; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/basic.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/basic.css
new file mode 100644
index 0000000..b0d1182
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/basic.css
@@ -0,0 +1,9 @@
+body { font: Arial; background: blue; }
+
+#page { width: 700px; height: 100; }
+#page #header { height: 300px; }
+#page #header h1 { font-size: 50px; color: blue; }
+
+#content.user.show #container.top #column.left { width: 100px; }
+#content.user.show #container.top #column.right { width: 600px; }
+#content.user.show #container.bottom { background: brown; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/cached_import_option.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/cached_import_option.css
new file mode 100644
index 0000000..331c0e7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/cached_import_option.css
@@ -0,0 +1,3 @@
+partial { value: correct; }
+
+main { value: correct; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/compact.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/compact.css
new file mode 100644
index 0000000..6a4dcb4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/compact.css
@@ -0,0 +1,5 @@
+#main { width: 15em; color: #0000ff; }
+#main p { border-style: dotted; /* Nested comment More nested stuff */ border-width: 2px; }
+#main .cool { width: 100px; }
+
+#left { font-size: 2em; font-weight: bold; float: left; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/complex.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/complex.css
new file mode 100644
index 0000000..d632f1c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/complex.css
@@ -0,0 +1,86 @@
+body { margin: 0; font: 0.85em "Lucida Grande", "Trebuchet MS", Verdana, sans-serif; color: #fff; background: url(/images/global_bg.gif); }
+
+#page { width: 900px; margin: 0 auto; background: #440008; border-top-width: 5px; border-top-style: solid; border-top-color: #ff8500; }
+
+#header { height: 75px; padding: 0; }
+#header h1 { float: left; width: 274px; height: 75px; margin: 0; background-image: url(/images/global_logo.gif); /* Crazy nested comment */ background-repeat: no-repeat; text-indent: -9999px; }
+#header .status { float: right; padding-top: 0.5em; padding-left: 0.5em; padding-right: 0.5em; padding-bottom: 0; }
+#header .status p { float: left; margin-top: 0; margin-right: 0.5em; margin-bottom: 0; margin-left: 0; }
+#header .status ul { float: left; margin: 0; padding: 0; }
+#header .status li { list-style-type: none; display: inline; margin: 0 5px; }
+#header .status a:link, #header .status a:visited { color: #ff8500; text-decoration: none; }
+#header .status a:hover { text-decoration: underline; }
+#header .search { float: right; clear: right; margin: 12px 0 0 0; }
+#header .search form { margin: 0; }
+#header .search input { margin: 0 3px 0 0; padding: 2px; border: none; }
+
+#menu { clear: both; text-align: right; height: 20px; border-bottom: 5px solid #006b95; background: #00a4e4; }
+#menu .contests ul { margin: 0 5px 0 0; padding: 0; }
+#menu .contests ul li { list-style-type: none; margin: 0 5px; padding: 5px 5px 0 5px; display: inline; font-size: 1.1em; color: #fff; background: #00a4e4; }
+#menu .contests a:link, #menu .contests a:visited { color: #fff; text-decoration: none; font-weight: bold; }
+#menu .contests a:hover { text-decoration: underline; }
+
+#content { clear: both; }
+#content .container { clear: both; }
+#content .container .column { float: left; }
+#content .container .column .right { float: right; }
+#content a:link, #content a:visited { color: #93d700; text-decoration: none; }
+#content a:hover { text-decoration: underline; }
+
+#content p, #content div { width: 40em; }
+#content p li, #content p dt, #content p dd, #content div li, #content div dt, #content div dd { color: #ddffdd; background-color: #4792bb; }
+#content .container.video .column.left { width: 200px; }
+#content .container.video .column.left .box { margin-top: 10px; }
+#content .container.video .column.left .box p { margin: 0 1em auto 1em; }
+#content .container.video .column.left .box.participants img { float: left; margin: 0 1em auto 1em; border: 1px solid #6e000d; border-style: solid; }
+#content .container.video .column.left .box.participants h2 { margin: 0 0 10px 0; padding: 0.5em; /* The background image is a gif! */ background: #6e000d url(/images/hdr_participant.gif) 2px 2px no-repeat; /* Okay check this out Multiline comments Wow dude I mean seriously, WOW */ text-indent: -9999px; border-top-width: 5px; border-top-style: solid; border-top-color: #a20013; border-right-width: 1px; border-right-style: dotted; }
+#content .container.video .column.middle { width: 500px; }
+#content .container.video .column.right { width: 200px; }
+#content .container.video .column.right .box { margin-top: 0; }
+#content .container.video .column.right .box p { margin: 0 1em auto 1em; }
+#content .container.video .column p { margin-top: 0; }
+
+#content.contests .container.information .column.right .box { margin: 1em 0; }
+#content.contests .container.information .column.right .box.videos .thumbnail img { width: 200px; height: 150px; margin-bottom: 5px; }
+#content.contests .container.information .column.right .box.videos a:link, #content.contests .container.information .column.right .box.videos a:visited { color: #93d700; text-decoration: none; }
+#content.contests .container.information .column.right .box.videos a:hover { text-decoration: underline; }
+#content.contests .container.information .column.right .box.votes a { display: block; width: 200px; height: 60px; margin: 15px 0; background: url(/images/btn_votenow.gif) no-repeat; text-indent: -9999px; outline: none; border: none; }
+#content.contests .container.information .column.right .box.votes h2 { margin: 52px 0 10px 0; padding: 0.5em; background: #6e000d url(/images/hdr_videostats.gif) 2px 2px no-repeat; text-indent: -9999px; border-top: 5px solid #a20013; }
+
+#content.contests .container.video .box.videos h2 { margin: 0; padding: 0.5em; background: #6e000d url(/images/hdr_newestclips.gif) 2px 2px no-repeat; text-indent: -9999px; border-top: 5px solid #a20013; }
+#content.contests .container.video .box.videos table { width: 100; }
+#content.contests .container.video .box.videos table td { padding: 1em; width: 25; vertical-align: top; }
+#content.contests .container.video .box.videos table td p { margin: 0 0 5px 0; }
+#content.contests .container.video .box.videos table td a:link, #content.contests .container.video .box.videos table td a:visited { color: #93d700; text-decoration: none; }
+#content.contests .container.video .box.videos table td a:hover { text-decoration: underline; }
+#content.contests .container.video .box.videos .thumbnail { float: left; }
+#content.contests .container.video .box.videos .thumbnail img { width: 80px; height: 60px; margin: 0 10px 0 0; border: 1px solid #6e000d; }
+
+#content .container.comments .column { margin-top: 15px; }
+#content .container.comments .column.left { width: 600px; }
+#content .container.comments .column.left .box ol { margin: 0; padding: 0; }
+#content .container.comments .column.left .box li { list-style-type: none; padding: 10px; margin: 0 0 1em 0; background: #6e000d; border-top: 5px solid #a20013; }
+#content .container.comments .column.left .box li div { margin-bottom: 1em; }
+#content .container.comments .column.left .box li ul { text-align: right; }
+#content .container.comments .column.left .box li ul li { display: inline; border: none; padding: 0; }
+#content .container.comments .column.right { width: 290px; padding-left: 10px; }
+#content .container.comments .column.right h2 { margin: 0; padding: 0.5em; background: #6e000d url(/images/hdr_addcomment.gif) 2px 2px no-repeat; text-indent: -9999px; border-top: 5px solid #a20013; }
+#content .container.comments .column.right .box textarea { width: 290px; height: 100px; border: none; }
+
+#footer { margin-top: 10px; padding: 1.2em 1.5em; background: #ff8500; }
+#footer ul { margin: 0; padding: 0; list-style-type: none; }
+#footer ul li { display: inline; margin: 0 0.5em; color: #440008; }
+#footer ul.links { float: left; }
+#footer ul.links a:link, #footer ul.links a:visited { color: #440008; text-decoration: none; }
+#footer ul.links a:hover { text-decoration: underline; }
+#footer ul.copyright { float: right; }
+
+.clear { clear: both; }
+
+.centered { text-align: center; }
+
+img { border: none; }
+
+button.short { width: 60px; height: 22px; padding: 0 0 2px 0; color: #fff; border: none; background: url(/images/btn_short.gif) no-repeat; }
+
+table { border-collapse: collapse; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/compressed.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/compressed.css
new file mode 100644
index 0000000..7c62786
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/compressed.css
@@ -0,0 +1 @@
+#main{width:15em;color:blue}#main p{border-style:dotted;border-width:2px}#main .cool{width:100px}#left{font-size:2em;font-weight:bold;float:left}
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/expanded.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/expanded.css
new file mode 100644
index 0000000..05f91fa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/expanded.css
@@ -0,0 +1,19 @@
+#main {
+  width: 15em;
+  color: #0000ff;
+}
+#main p {
+  border-style: dotted;
+  /* Nested comment
+   * More nested stuff */
+  border-width: 2px;
+}
+#main .cool {
+  width: 100px;
+}
+
+#left {
+  font-size: 2em;
+  font-weight: bold;
+  float: left;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/filename_fn.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/filename_fn.css
new file mode 100644
index 0000000..e55d9a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/filename_fn.css
@@ -0,0 +1,3 @@
+filename { imported: /test/sass/templates/_filename_fn_import.scss; }
+
+filename { local: /test/sass/templates/filename_fn.scss; local-mixin: /test/sass/templates/filename_fn.scss; local-function: /test/sass/templates/filename_fn.scss; imported-mixin: /test/sass/templates/_filename_fn_import.scss; imported-function: /test/sass/templates/_filename_fn_import.scss; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/if.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/if.css
new file mode 100644
index 0000000..31e8813
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/if.css
@@ -0,0 +1,3 @@
+a { branch: if; }
+
+b { branch: else; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import.css
new file mode 100644
index 0000000..e728382
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import.css
@@ -0,0 +1,31 @@
+@import url(basic.css);
+@import url(../results/complex.css);
+imported { otherconst: hello; myconst: goodbye; pre-mixin: here; }
+
+body { font: Arial; background: blue; }
+
+#page { width: 700px; height: 100; }
+#page #header { height: 300px; }
+#page #header h1 { font-size: 50px; color: blue; }
+
+#content.user.show #container.top #column.left { width: 100px; }
+#content.user.show #container.top #column.right { width: 600px; }
+#content.user.show #container.bottom { background: brown; }
+
+midrule { inthe: middle; }
+
+scss { imported: yes; }
+
+body { font: Arial; background: blue; }
+
+#page { width: 700px; height: 100; }
+#page #header { height: 300px; }
+#page #header h1 { font-size: 50px; color: blue; }
+
+#content.user.show #container.top #column.left { width: 100px; }
+#content.user.show #container.top #column.right { width: 600px; }
+#content.user.show #container.bottom { background: brown; }
+
+#foo { background-color: #baf; }
+
+nonimported { myconst: hello; otherconst: goodbye; post-mixin: here; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import_charset.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import_charset.css
new file mode 100644
index 0000000..d7184a3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import_charset.css
@@ -0,0 +1,5 @@
+@charset "UTF-8";
+@import url(foo.css);
+.foo { a: b; }
+
+.bar { a: щ; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import_charset_ibm866.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import_charset_ibm866.css
new file mode 100644
index 0000000..d7184a3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import_charset_ibm866.css
@@ -0,0 +1,5 @@
+@charset "UTF-8";
+@import url(foo.css);
+.foo { a: b; }
+
+.bar { a: щ; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import_content.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import_content.css
new file mode 100644
index 0000000..c67e3f9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/import_content.css
@@ -0,0 +1 @@
+a { b: c; }
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/line_numbers.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/line_numbers.css
new file mode 100644
index 0000000..3c657f9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/line_numbers.css
@@ -0,0 +1,49 @@
+/* line 1, ../templates/line_numbers.sass */
+foo {
+  bar: baz; }
+
+/* line 6, ../templates/importee.sass */
+imported {
+  otherconst: 12;
+  myconst: goodbye; }
+  /* line 5, ../templates/line_numbers.sass */
+  imported squggle {
+    blat: bang; }
+
+/* line 3, ../templates/basic.sass */
+body {
+  font: Arial;
+  background: blue; }
+
+/* line 7, ../templates/basic.sass */
+#page {
+  width: 700px;
+  height: 100; }
+  /* line 10, ../templates/basic.sass */
+  #page #header {
+    height: 300px; }
+    /* line 12, ../templates/basic.sass */
+    #page #header h1 {
+      font-size: 50px;
+      color: blue; }
+
+/* line 18, ../templates/basic.sass */
+#content.user.show #container.top #column.left {
+  width: 100px; }
+/* line 20, ../templates/basic.sass */
+#content.user.show #container.top #column.right {
+  width: 600px; }
+/* line 22, ../templates/basic.sass */
+#content.user.show #container.bottom {
+  background: brown; }
+
+/* line 13, ../templates/importee.sass */
+midrule {
+  inthe: middle; }
+
+/* line 12, ../templates/line_numbers.sass */
+umph {
+  foo: bar; }
+  /* line 18, ../templates/importee.sass */
+  umph baz {
+    blat: bang; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/mixins.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/mixins.css
new file mode 100644
index 0000000..5d87f98
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/mixins.css
@@ -0,0 +1,95 @@
+#main {
+  width: 15em;
+  color: #0000ff;
+}
+#main p {
+  border-top-width: 2px;
+  border-top-color: #fc0;
+  border-left-width: 1px;
+  border-left-color: #000;
+  -moz-border-radius: 10px;
+  border-style: dotted;
+  border-width: 2px;
+}
+#main .cool {
+  width: 100px;
+}
+
+#left {
+  border-top-width: 2px;
+  border-top-color: #fc0;
+  border-left-width: 1px;
+  border-left-color: #000;
+  -moz-border-radius: 10px;
+  font-size: 2em;
+  font-weight: bold;
+  float: left;
+}
+
+#right {
+  border-top-width: 2px;
+  border-top-color: #fc0;
+  border-left-width: 1px;
+  border-left-color: #000;
+  -moz-border-radius: 10px;
+  color: #f00;
+  font-size: 20px;
+  float: right;
+}
+
+.bordered {
+  border-top-width: 2px;
+  border-top-color: #fc0;
+  border-left-width: 1px;
+  border-left-color: #000;
+  -moz-border-radius: 10px;
+}
+
+.complex {
+  color: #f00;
+  font-size: 20px;
+  text-decoration: none;
+}
+.complex:after {
+  content: ".";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+}
+* html .complex {
+  height: 1px;
+  color: #f00;
+  font-size: 20px;
+}
+
+.more-complex {
+  color: #f00;
+  font-size: 20px;
+  text-decoration: none;
+  display: inline;
+  -webkit-nonsense-top-right: 1px;
+  -webkit-nonsense-bottom-left: 1px;
+}
+.more-complex:after {
+  content: ".";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+}
+* html .more-complex {
+  height: 1px;
+  color: #f00;
+  font-size: 20px;
+}
+.more-complex a:hover {
+  text-decoration: underline;
+  color: #f00;
+  font-size: 20px;
+  border-top-width: 2px;
+  border-top-color: #fc0;
+  border-left-width: 1px;
+  border-left-color: #000;
+  -moz-border-radius: 10px;
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/multiline.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/multiline.css
new file mode 100644
index 0000000..8fa9535
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/multiline.css
@@ -0,0 +1,24 @@
+#main,
+#header {
+  height: 50px; }
+  #main div,
+  #header div {
+    width: 100px; }
+    #main div a span,
+    #main div em span,
+    #header div a span,
+    #header div em span {
+      color: pink; }
+
+#one div.nested,
+#one span.nested,
+#one p.nested,
+#two div.nested,
+#two span.nested,
+#two p.nested,
+#three div.nested,
+#three span.nested,
+#three p.nested {
+  font-weight: bold;
+  border-color: red;
+  display: block; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/nested.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/nested.css
new file mode 100644
index 0000000..061e6c1
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/nested.css
@@ -0,0 +1,22 @@
+#main {
+  width: 15em;
+  color: #0000ff; }
+  #main p {
+    border-style: dotted;
+    /* Nested comment
+     * More nested stuff */
+    border-width: 2px; }
+  #main .cool {
+    width: 100px; }
+
+#left {
+  font-size: 2em;
+  font-weight: bold;
+  float: left; }
+
+#right .header {
+  border-style: solid; }
+#right .body {
+  border-style: dotted; }
+#right .footer {
+  border-style: dashed; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/options.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/options.css
new file mode 100644
index 0000000..628f4c3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/options.css
@@ -0,0 +1 @@
+foo { style: compact; }
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/parent_ref.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/parent_ref.css
new file mode 100644
index 0000000..f384cfe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/parent_ref.css
@@ -0,0 +1,13 @@
+a { color: #000; }
+a:hover { color: #f00; }
+
+p, div { width: 100em; }
+p foo, div foo { width: 10em; }
+p:hover, p bar, div:hover, div bar { height: 20em; }
+
+#cool { border-style: solid; border-width: 2em; }
+.ie7 #cool, .ie6 #cool { content: string("Totally not cool."); }
+.firefox #cool { content: string("Quite cool."); }
+
+.wow, .snazzy { font-family: fantasy; }
+.wow:hover, .wow:visited, .snazzy:hover, .snazzy:visited { font-weight: bold; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/script.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/script.css
new file mode 100644
index 0000000..8bcf45f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/script.css
@@ -0,0 +1,16 @@
+#main { content: Hello\!; qstr: 'Quo"ted"!'; hstr: Hyph-en\!; width: 30em; background-color: #000; color: #ffa; short-color: #123; named-color: olive; con: "foo" bar 9 hi there "boom"; con2: "noquo" quo; }
+#main #sidebar { background-color: #00ff98; num-normal: 10; num-dec: 10.2; num-dec0: 99; num-neg: -10; esc: 10\+12; many: 6; order: 7; complex: #4c9db1hi16; }
+
+#plus { num-num: 7; num-num-un: 25em; num-num-un2: 23em; num-num-neg: 9.87; num-str: 100px; num-col: #b7b7b7; num-perc: 31%; str-str: "hi there"; str-str2: "hi there"; str-col: "14em solid #123"; str-num: "times: 13"; col-num: #ff7c9e; col-col: #5173ff; }
+
+#minus { num-num: 900; col-num: #fafaf5; col-col: #000035; unary-num: -1; unary-const: 10; unary-paren: -11; unary-two: 12; unary-many: 12; unary-crazy: -15; }
+
+#times { num-num: 7; num-col: #7496b8; col-num: #092345; col-col: #243648; }
+
+#div { num-num: 3.3333333333; num-num2: 3.3333333333; col-num: #092345; col-col: #0b0e10; comp: 1px; }
+
+#mod { num-num: 2; col-col: #0f0e05; col-num: #020001; }
+
+#const { escaped-quote: \$foo \!bar; default: Hello\! !important; }
+
+#regression { a: 4; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/scss_import.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/scss_import.css
new file mode 100644
index 0000000..e728382
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/scss_import.css
@@ -0,0 +1,31 @@
+@import url(basic.css);
+@import url(../results/complex.css);
+imported { otherconst: hello; myconst: goodbye; pre-mixin: here; }
+
+body { font: Arial; background: blue; }
+
+#page { width: 700px; height: 100; }
+#page #header { height: 300px; }
+#page #header h1 { font-size: 50px; color: blue; }
+
+#content.user.show #container.top #column.left { width: 100px; }
+#content.user.show #container.top #column.right { width: 600px; }
+#content.user.show #container.bottom { background: brown; }
+
+midrule { inthe: middle; }
+
+scss { imported: yes; }
+
+body { font: Arial; background: blue; }
+
+#page { width: 700px; height: 100; }
+#page #header { height: 300px; }
+#page #header h1 { font-size: 50px; color: blue; }
+
+#content.user.show #container.top #column.left { width: 100px; }
+#content.user.show #container.top #column.right { width: 600px; }
+#content.user.show #container.bottom { background: brown; }
+
+#foo { background-color: #baf; }
+
+nonimported { myconst: hello; otherconst: goodbye; post-mixin: here; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/scss_importee.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/scss_importee.css
new file mode 100644
index 0000000..c9fcf41
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/scss_importee.css
@@ -0,0 +1,2 @@
+scss {
+  imported: yes; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/subdir/nested_subdir/nested_subdir.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/subdir/nested_subdir/nested_subdir.css
new file mode 100644
index 0000000..7aadcfe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/subdir/nested_subdir/nested_subdir.css
@@ -0,0 +1 @@
+#pi { width: 314px; }
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/subdir/subdir.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/subdir/subdir.css
new file mode 100644
index 0000000..e404728
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/subdir/subdir.css
@@ -0,0 +1,3 @@
+#nested { relative: true; }
+
+#subdir { font-size: 20px; font-weight: bold; }
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/units.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/units.css
new file mode 100644
index 0000000..2a1102e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/units.css
@@ -0,0 +1,11 @@
+b {
+  foo: 5px;
+  bar: 24px;
+  baz: 66.6666666667%;
+  many-units: 32em;
+  mm: 15mm;
+  pc: 2pc;
+  pt: -72pt;
+  inches: 2in;
+  more-inches: 3.5in;
+  mixed: 2.0416666667in; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/warn.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/warn.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/warn.css
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/warn_imported.css b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/warn_imported.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/results/warn_imported.css
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/script_conversion_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/script_conversion_test.rb
new file mode 100755
index 0000000..ebd9a3a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/script_conversion_test.rb
@@ -0,0 +1,365 @@
+# -*- coding: utf-8 -*-
+require File.dirname(__FILE__) + '/../test_helper'
+require 'sass/engine'
+
+class SassScriptConversionTest < MiniTest::Test
+  def test_bool
+    assert_renders "true"
+    assert_renders "false"
+  end
+
+  def test_color
+    assert_renders "#abcdef"
+    assert_renders "blue"
+    assert_renders "rgba(0, 1, 2, 0.2)"
+    assert_renders "#abc"
+    assert_renders "#0000ff"
+  end
+
+  def test_number
+    assert_renders "10"
+    assert_renders "10.35"
+    assert_renders "12px"
+    assert_renders "12.45px"
+
+    assert_equal "12.3456789013", render("12.34567890129")
+  end
+
+  def test_string
+    assert_renders '"foo"'
+    assert_renders '"bar baz"'
+    assert_equal '"baz bang"', render("'baz bang'")
+  end
+
+  def test_string_quotes
+    assert_equal "'quote\"quote'", render('"quote\\"quote"')
+    assert_equal '"quote\'quote"', render("'quote\\'quote'")
+    assert_renders '"quote\'quote\\"quote"'
+    assert_equal '"quote\'quote\\"quote"', render("'quote\\'quote\"quote'")
+  end
+
+  def test_string_escapes
+    assert_renders '"foo\\\\bar"'
+  end
+
+  def test_funcall
+    assert_renders "foo(true, blue)"
+    assert_renders "hsla(20deg, 30%, 50%, 0.3)"
+    assert_renders "blam()"
+
+    assert_renders "-\xC3\xBFoo(12px)"
+    assert_renders "-foo(12px)"
+  end
+
+  def test_funcall_with_keyword_args
+    assert_renders "foo(arg1, arg2, $karg1: val, $karg2: val2)"
+    assert_renders "foo($karg1: val, $karg2: val2)"
+  end
+
+  def test_funcall_with_hyphen_conversion_keyword_arg
+    assert_renders "foo($a-b_c: val)"
+  end
+
+  def test_url
+    assert_renders "url(foo.gif)"
+    assert_renders "url($var)"
+    assert_renders "url(\#{$var}/flip.gif)"
+  end
+
+  def test_variable
+    assert_renders "$foo-bar"
+    assert_renders "$flaznicate"
+  end
+
+  def test_null
+    assert_renders "null"
+  end
+
+  def test_space_list
+    assert_renders "foo bar baz"
+    assert_renders "foo (bar baz) bip"
+    assert_renders "foo (bar, baz) bip"
+  end
+
+  def test_comma_list
+    assert_renders "foo, bar, baz"
+    assert_renders "foo, (bar, baz), bip"
+    assert_renders "foo, bar baz, bip"
+  end
+
+  def test_space_list_adds_parens_for_clarity
+    assert_renders "(1 + 1) (2 / 4) (3 * 5)"
+  end
+
+  def test_comma_list_doesnt_add_parens
+    assert_renders "1 + 1, 2 / 4, 3 * 5"
+  end
+
+  def test_empty_list
+    assert_renders "()"
+  end
+
+  def test_list_in_args
+    assert_renders "foo((a, b, c))"
+    assert_renders "foo($arg: (a, b, c))"
+    assert_renders "foo(a, b, (a, b, c)...)"
+  end
+
+  def test_singleton_list
+    assert_renders "(1,)"
+    assert_renders "(1 2 3,)"
+    assert_renders "((1, 2, 3),)"
+  end
+
+  def test_map
+    assert_renders "(foo: bar)"
+    assert_renders "(foo: bar, baz: bip)"
+    assert_renders "(foo: bar, baz: (bip: bap))"
+  end
+
+  def test_map_in_list
+    assert_renders "(foo: bar) baz"
+    assert_renders "(foo: bar), (baz: bip)"
+  end
+
+  def test_list_in_map
+    assert_renders "(foo: bar baz)"
+    assert_renders "(foo: (bar, baz), bip: bop)"
+  end
+
+  def test_selector
+    assert_renders "&"
+  end
+
+  def self.test_precedence(outer, inner)
+    op_outer = Sass::Script::Lexer::OPERATORS_REVERSE[outer]
+    op_inner = Sass::Script::Lexer::OPERATORS_REVERSE[inner]
+    class_eval <<RUBY
+      def test_precedence_#{outer}_#{inner}
+        assert_renders "$foo #{op_outer} $bar #{op_inner} $baz"
+        assert_renders "$foo #{op_inner} $bar #{op_outer} $baz"
+
+        assert_renders "($foo #{op_outer} $bar) #{op_inner} $baz"
+        assert_renders "$foo #{op_inner} ($bar #{op_outer} $baz)"
+
+        assert_equal "$foo #{op_outer} $bar #{op_inner} $baz",
+          render("$foo #{op_outer} ($bar #{op_inner} $baz)")
+        assert_equal "$foo #{op_inner} $bar #{op_outer} $baz",
+          render("($foo #{op_inner} $bar) #{op_outer} $baz")
+      end
+RUBY
+  end
+
+  def self.assert_associative(op_name, sibling_name)
+    op = separator_for(op_name)
+    sibling = separator_for(sibling_name)
+    class_eval <<RUBY
+      def test_associative_#{op_name}_#{sibling_name}
+        assert_renders "$foo#{op}$bar#{op}$baz"
+
+        assert_equal "$foo#{op}$bar#{op}$baz",
+          render("$foo#{op}($bar#{op}$baz)")
+        assert_equal "$foo#{op}$bar#{op}$baz",
+          render("($foo#{op}$bar)#{op}$baz")
+
+        assert_equal "$foo#{op}$bar#{sibling}$baz",
+          render("$foo#{op}($bar#{sibling}$baz)")
+        assert_equal "$foo#{sibling}$bar#{op}$baz",
+          render("($foo#{sibling}$bar)#{op}$baz")
+      end
+RUBY
+  end
+
+  def self.separator_for(op_name)
+    case op_name
+    when :comma; ", "
+    when :space; " "
+    else; " #{Sass::Script::Lexer::OPERATORS_REVERSE[op_name]} "
+    end
+  end
+
+  def self.assert_non_associative(op_name, sibling_name)
+    op = Sass::Script::Lexer::OPERATORS_REVERSE[op_name]
+    sibling = Sass::Script::Lexer::OPERATORS_REVERSE[sibling_name]
+    class_eval <<RUBY
+      def test_non_associative_#{op_name}_#{sibling_name}
+        assert_renders "$foo #{op} $bar #{op} $baz"
+
+        assert_renders "$foo #{op} ($bar #{op} $baz)"
+        assert_equal "$foo #{op} $bar #{op} $baz",
+          render("($foo #{op} $bar) #{op} $baz")
+
+        assert_renders "$foo #{op} ($bar #{sibling} $baz)"
+        assert_equal "$foo #{sibling} $bar #{op} $baz",
+          render("($foo #{sibling} $bar) #{op} $baz")
+      end
+RUBY
+  end
+
+  test_precedence :or, :and
+  test_precedence :and, :eq
+  test_precedence :and, :neq
+  test_precedence :eq, :gt
+  test_precedence :eq, :gte
+  test_precedence :eq, :lt
+  test_precedence :eq, :lte
+  test_precedence :gt, :plus
+  test_precedence :gt, :minus
+  test_precedence :plus, :times
+  test_precedence :plus, :div
+  test_precedence :plus, :mod
+
+  assert_associative :plus, :minus
+  assert_associative :times, :div
+  assert_associative :times, :mod
+
+  assert_non_associative :minus, :plus
+  assert_non_associative :div, :times
+  assert_non_associative :mod, :times
+  assert_non_associative :gt, :gte
+  assert_non_associative :gte, :lt
+  assert_non_associative :lt, :lte
+  assert_non_associative :lte, :gt
+
+  def test_comma_precedence
+    assert_renders "$foo, $bar, $baz"
+
+    assert_renders "$foo ($bar, $baz)"
+    assert_renders "($foo, $bar) $baz"
+
+    assert_equal "$foo, $bar $baz", render("$foo, ($bar $baz)")
+    assert_equal "$foo $bar, $baz", render("($foo $bar), $baz")
+
+    assert_equal "$foo, ($bar, $baz)", render("$foo, ($bar, $baz)")
+    assert_equal "($foo, $bar), $baz", render("($foo, $bar), $baz")
+  end
+
+  def test_space_precedence
+    assert_renders "$foo $bar $baz"
+
+    assert_renders "$foo or ($bar $baz)"
+    assert_renders "($foo $bar) or $baz"
+
+    assert_renders "$foo ($bar or $baz)"
+    assert_renders "($foo or $bar) $baz"
+
+    assert_equal "$foo ($bar $baz)", render("$foo ($bar $baz)")
+    assert_equal "($foo $bar) $baz", render("($foo $bar) $baz")
+  end
+
+  def test_unary_op
+    assert_renders "-12px"
+    assert_renders '/"foo"'
+    assert_renders 'not true'
+
+    assert_renders "-(foo(12px))"
+    assert_renders "-(-foo(12px))"
+    assert_renders "-(_foo(12px))"
+    assert_renders "-(\xC3\xBFoo(12px))"
+    assert_renders "-(blue)"
+
+    assert_equal 'not true or false', render('(not true) or false')
+    assert_equal 'not (true or false)', render('not (true or false)')
+  end
+
+  def test_interpolation
+    assert_equal 'unquote("#{$foo}#{$bar}#{$baz}")', render("$foo\#{$bar}$baz")
+    assert_equal 'unquote("#{$foo}#{$bar} #{$baz}")', render("$foo\#{$bar} $baz")
+    assert_equal 'unquote("#{$foo} #{$bar}#{$baz}")', render("$foo \#{$bar}$baz")
+    assert_renders "$foo \#{$bar} $baz"
+    assert_renders "$foo \#{$bar}\#{$bang} $baz"
+    assert_renders "$foo \#{$bar} \#{$bang} $baz"
+    assert_equal 'unquote("#{$bar}#{$baz}")', render("\#{$bar}$baz")
+    assert_equal 'unquote("#{$foo}#{$bar}")', render("$foo\#{$bar}")
+    assert_renders "\#{$bar}"
+  end
+
+  def test_interpolation_in_function
+    assert_renders 'flabnabbit(#{1 + "foo"})'
+    assert_equal 'flabnabbit(unquote("#{$foo} #{1 + "foo"}#{$baz}"))',
+                 render('flabnabbit($foo #{1 + "foo"}$baz)')
+    assert_renders 'flabnabbit($foo #{1 + "foo"}#{2 + "bar"} $baz)'
+  end
+
+  def test_interpolation_in_string_function
+    assert_renders 'calc(#{1 + "foo"})'
+    assert_renders 'calc(foo#{1 + "foo"}baz)'
+  end
+
+  def test_interpolation_near_operators
+    assert_renders '#{1 + 2} , #{3 + 4}'
+    assert_renders '#{1 + 2}, #{3 + 4}'
+    assert_renders '#{1 + 2} ,#{3 + 4}'
+    assert_renders '#{1 + 2},#{3 + 4}'
+    assert_renders '#{1 + 2}, #{3 + 4}, #{5 + 6}'
+    assert_renders '3, #{3 + 4}, 11'
+
+    assert_renders '3 / #{3 + 4}'
+    assert_renders '3 /#{3 + 4}'
+    assert_renders '3/ #{3 + 4}'
+    assert_renders '3/#{3 + 4}'
+
+    assert_equal 'unquote("#{1 + 2} * 7")', render('#{1 + 2} * 7')
+    assert_equal 'unquote("#{1 + 2}* 7")', render('#{1 + 2}* 7')
+    assert_equal 'unquote("#{1 + 2} *7")', render('#{1 + 2} *7')
+    assert_equal 'unquote("#{1 + 2}*7")', render('#{1 + 2}*7')
+
+    assert_renders '-#{1 + 2}'
+    assert_equal 'unquote("- #{1 + 2}")', render('- #{1 + 2}')
+
+    assert_equal 'unquote("5 + #{1 + 2} * #{3 + 4}")', render('5 + #{1 + 2} * #{3 + 4}')
+    assert_equal 'unquote("5 +#{1 + 2} * #{3 + 4}")', render('5 +#{1 + 2} * #{3 + 4}')
+    assert_equal 'unquote("5+#{1 + 2} * #{3 + 4}")', render('5+#{1 + 2} * #{3 + 4}')
+    assert_equal 'unquote("#{1 + 2} * #{3 + 4} + 5")', render('#{1 + 2} * #{3 + 4} + 5')
+    assert_equal 'unquote("#{1 + 2} * #{3 + 4}+ 5")', render('#{1 + 2} * #{3 + 4}+ 5')
+    assert_equal 'unquote("#{1 + 2} * #{3 + 4}+5")', render('#{1 + 2} * #{3 + 4}+5')
+
+    assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 / (#{1 + 2} + #{3 + 4})')
+    assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 /(#{1 + 2} + #{3 + 4})')
+    assert_equal '5 / unquote("#{1 + 2} + #{3 + 4}")', render('5 /( #{1 + 2} + #{3 + 4} )')
+    assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('(#{1 + 2} + #{3 + 4}) / 5')
+    assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('(#{1 + 2} + #{3 + 4})/ 5')
+    assert_equal 'unquote("#{1 + 2} + #{3 + 4}") / 5', render('( #{1 + 2} + #{3 + 4} )/ 5')
+
+    assert_equal 'unquote("#{1 + 2} + #{2 + 3}")', render('#{1 + 2} + 2 + 3')
+    assert_equal 'unquote("#{1 + 2} +#{2 + 3}")', render('#{1 + 2} +2 + 3')
+  end
+
+  def test_string_interpolation
+    assert_renders '"foo#{$bar}baz"'
+    assert_renders '"foo #{$bar}baz"'
+    assert_renders '"foo#{$bar} baz"'
+    assert_renders '"foo #{$bar} baz"'
+    assert_renders '"foo #{$bar}#{$bang} baz"'
+    assert_renders '"foo #{$bar} #{$bang} baz"'
+    assert_renders '"#{$bar}baz"'
+    assert_renders '"foo#{$bar}"'
+    assert_renders '"#{$bar}"'
+
+    assert_renders "'\"\#{\"bar\"}\"'"
+    assert_renders '"\#{bar}"'
+
+    assert_equal '"foo#{$bar}baz"', render("'foo\#{$bar}baz'")
+  end
+
+  def test_bracketed_lists
+    assert_renders("[]")
+    assert_renders("[foo, bar]")
+    assert_renders("[[foo]]")
+    assert_renders("[(foo bar)]")
+    assert_renders("[foo bar,]")
+    assert_renders("[(foo,)]")
+  end
+
+  private
+
+  def assert_renders(script, options = {})
+    assert_equal(script, render(script, options))
+  end
+
+  def render(script, options = {})
+    munge_filename(options)
+    node = Sass::Script.parse(script, 1, 0, options.merge(:_convert => true))
+    node.to_sass
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/script_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/script_test.rb
new file mode 100755
index 0000000..f76755e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/script_test.rb
@@ -0,0 +1,1429 @@
+# -*- coding: utf-8 -*-
+require File.dirname(__FILE__) + '/../test_helper'
+require 'sass/engine'
+
+module Sass::Script::Functions::UserFunctions
+  def assert_options(val)
+    val.options[:foo]
+    Sass::Script::Value::String.new("Options defined!")
+  end
+
+  def arg_error
+    assert_options
+  end
+end
+
+module Sass::Script::Functions
+  include Sass::Script::Functions::UserFunctions
+end
+
+class SassScriptTest < MiniTest::Test
+  include Sass::Script
+
+  def test_color_clamps_input
+    assert_equal 0, Sass::Script::Value::Color.new([1, 2, -1]).blue
+    assert_equal 255, Sass::Script::Value::Color.new([256, 2, 3]).red
+  end
+
+  def test_color_clamps_rgba_input
+    assert_equal 1, Sass::Script::Value::Color.new([1, 2, 3, 1.1]).alpha
+    assert_equal 0, Sass::Script::Value::Color.new([1, 2, 3, -0.1]).alpha
+  end
+
+  def test_color_from_hex
+    assert_equal Sass::Script::Value::Color.new([0,0,0]), Sass::Script::Value::Color.from_hex('000000')
+    assert_equal Sass::Script::Value::Color.new([0,0,0]), Sass::Script::Value::Color.from_hex('#000000')
+  end
+
+  def test_string_escapes
+    assert_equal "'", resolve("\"'\"")
+    assert_equal '"', resolve("\"\\\"\"")
+    assert_equal "\\", resolve("\"\\\\\"")
+    assert_equal "☃", resolve("\"\\2603\"")
+    assert_equal "☃f", resolve("\"\\2603 f\"")
+    assert_equal "☃x", resolve("\"\\2603x\"")
+    assert_equal "\\2603", resolve("\"\\\\2603\"")
+    assert_equal "\#{foo}", resolve("\"\\\#{foo}\"")
+
+    # U+FFFD is the replacement character, "�".
+    assert_equal [0xFFFD].pack("U"), resolve("\"\\0\"")
+    assert_equal [0xFFFD].pack("U"), resolve("\"\\FFFFFF\"")
+    assert_equal [0xFFFD].pack("U"), resolve("\"\\D800\"")
+    assert_equal [0xD7FF].pack("U"), resolve("\"\\D7FF\"")
+    assert_equal [0xFFFD].pack("U"), resolve("\"\\DFFF\"")
+    assert_equal [0xE000].pack("U"), resolve("\"\\E000\"")
+  end
+
+  def test_string_escapes_are_resolved_before_operators
+    assert_equal "true", resolve('"abc" == "\61\62\63"')
+  end
+
+  def test_string_quote
+    assert_equal '"foo"', resolve_quoted('"foo"')
+    assert_equal "'f\"oo'", resolve_quoted('"f\"oo"')
+    assert_equal "\"f'oo\"", resolve_quoted("'f\\'oo'")
+    assert_equal "\"f'o\\\"o\"", resolve_quoted("'f\\'o\"o'")
+    assert_equal '"foo bar"', resolve_quoted('"foo\20 bar"')
+    assert_equal '"foo\a bar"', resolve_quoted('"foo\a bar"')
+    assert_equal '"x\ay"', resolve_quoted('"x\a y"')
+    assert_equal '"\a  "', resolve_quoted('"\a\20"')
+    assert_equal '"\a abcdef"', resolve_quoted('"\a abcdef"')
+    assert_equal '"☃abcdef"', resolve_quoted('"\2603 abcdef"')
+    assert_equal '"\\\\"', resolve_quoted('"\\\\"')
+    assert_equal '"foobar"', resolve_quoted("\"foo\\\nbar\"")
+    assert_equal '"#{foo}"', resolve_quoted("\"\\\#{foo}\"")
+  end
+
+  def test_color_names
+    assert_equal "white", resolve("white")
+    assert_equal "#ffffff", resolve("#ffffff")
+    silence_warnings {assert_equal "#fffffe", resolve("white - #000001")}
+    assert_equal "transparent", resolve("transparent")
+    assert_equal "rgba(0, 0, 0, 0)", resolve("rgba(0, 0, 0, 0)")
+  end
+
+  def test_rgba_color_literals
+    assert_equal Sass::Script::Value::Color.new([1, 2, 3, 0.75]), eval("rgba(1, 2, 3, 0.75)")
+    assert_equal "rgba(1, 2, 3, 0.75)", resolve("rgba(1, 2, 3, 0.75)")
+
+    assert_equal Sass::Script::Value::Color.new([1, 2, 3, 0]), eval("rgba(1, 2, 3, 0)")
+    assert_equal "rgba(1, 2, 3, 0)", resolve("rgba(1, 2, 3, 0)")
+
+    assert_equal Sass::Script::Value::Color.new([1, 2, 3]), eval("rgba(1, 2, 3, 1)")
+    assert_equal Sass::Script::Value::Color.new([1, 2, 3, 1]), eval("rgba(1, 2, 3, 1)")
+    assert_equal "#010203", resolve("rgba(1, 2, 3, 1)")
+    assert_equal "white", resolve("rgba(255, 255, 255, 1)")
+  end
+
+  def test_rgba_color_math
+    silence_warnings {assert_equal "rgba(50, 50, 100, 0.35)", resolve("rgba(1, 1, 2, 0.35) * rgba(50, 50, 50, 0.35)")}
+    silence_warnings {assert_equal "rgba(52, 52, 52, 0.25)", resolve("rgba(2, 2, 2, 0.25) + rgba(50, 50, 50, 0.25)")}
+
+    assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: rgba(1, 2, 3, 0.15) + rgba(50, 50, 50, 0.75)") do
+      silence_warnings {resolve("rgba(1, 2, 3, 0.15) + rgba(50, 50, 50, 0.75)")}
+    end
+    assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: #123456 * rgba(50, 50, 50, 0.75)") do
+      silence_warnings {resolve("#123456 * rgba(50, 50, 50, 0.75)")}
+    end
+    assert_raise_message(Sass::SyntaxError, "Alpha channels must be equal: rgba(50, 50, 50, 0.75) / #123456") do
+      silence_warnings {resolve("rgba(50, 50, 50, 0.75) / #123456")}
+    end
+  end
+
+  def test_rgba_number_math
+    silence_warnings {assert_equal "rgba(49, 49, 49, 0.75)", resolve("rgba(50, 50, 50, 0.75) - 1")}
+    silence_warnings {assert_equal "rgba(100, 100, 100, 0.75)", resolve("rgba(50, 50, 50, 0.75) * 2")}
+  end
+
+  def test_rgba_rounding
+    assert_equal "rgba(10, 1, 0, 0.1234567892)", resolve("rgba(10.0, 1.23456789, 0.0, 0.12345678919)")
+  end
+
+  def test_rgb_calc
+    assert_equal "rgb(calc(255 - 5), 0, 0)", resolve("rgb(calc(255 - 5), 0, 0)")
+  end
+
+  def test_rgba_calc
+    assert_equal "rgba(calc(255 - 5), 0, 0, 0.1)",
+      resolve("rgba(calc(255 - 5), 0, 0, 0.1)")
+    assert_equal "rgba(127, 0, 0, calc(0.1 + 0.5))",
+      resolve("rgba(127, 0, 0, calc(0.1 + 0.5))")
+  end
+
+  def test_rgba_shorthand_calc
+    assert_equal "rgba(255, 0, 0, calc(0.1 + 0.5))",
+      resolve("rgba(red, calc(0.1 + 0.5))")
+  end
+
+  def test_hsl_calc
+    assert_equal "hsl(calc(360 * 5 / 6), 50%, 50%)", resolve("hsl(calc(360 * 5 / 6), 50%, 50%)")
+  end
+
+  def test_hsla_calc
+    assert_equal "hsla(calc(360 * 5 / 6), 50%, 50%, 0.1)",
+      resolve("hsla(calc(360 * 5 / 6), 50%, 50%, 0.1)")
+    assert_equal "hsla(270, 50%, 50%, calc(0.1 + 0.1))",
+      resolve("hsla(270, 50%, 50%, calc(0.1 + 0.1))")
+  end
+
+  def test_compressed_colors
+    assert_equal "#123456", resolve("#123456", :style => :compressed)
+    assert_equal "rgba(1,2,3,0.5)", resolve("rgba(1, 2, 3, 0.5)", :style => :compressed)
+    assert_equal "#123", resolve("#112233", :style => :compressed)
+    assert_equal "#000", resolve("black", :style => :compressed)
+    assert_equal "red", resolve("#f00", :style => :compressed)
+    assert_equal "blue", resolve("blue", :style => :compressed)
+    assert_equal "navy", resolve("#000080", :style => :compressed)
+    assert_equal "navy #fff", resolve("#000080 white", :style => :compressed)
+    assert_equal "This color is #fff", resolve('"This color is #{ white }"', :style => :compressed)
+    assert_equal "transparent", resolve("rgba(0, 0, 0, 0)", :style => :compressed)
+  end
+
+  def test_compressed_comma
+    # assert_equal "foo,bar,baz", resolve("foo, bar, baz", :style => :compressed)
+    # assert_equal "foo,#baf,baz", resolve("foo, #baf, baz", :style => :compressed)
+    assert_equal "foo,#baf,red", resolve("foo, #baf, #f00", :style => :compressed)
+  end
+
+  def test_implicit_strings
+    assert_equal Sass::Script::Value::String.new("foo"), eval("foo")
+    assert_equal Sass::Script::Value::String.new("foo/bar"), eval("foo/bar")
+  end
+
+  def test_basic_interpolation
+    assert_equal "foo3bar", resolve("foo\#{1 + 2}bar")
+    assert_equal "foo3 bar", resolve("foo\#{1 + 2} bar")
+    assert_equal "foo 3bar", resolve("foo \#{1 + 2}bar")
+    assert_equal "foo 3 bar", resolve("foo \#{1 + 2} bar")
+    assert_equal "foo 35 bar", resolve("foo \#{1 + 2}\#{2 + 3} bar")
+    assert_equal "foo 3 5 bar", resolve("foo \#{1 + 2} \#{2 + 3} bar")
+    assert_equal "3bar", resolve("\#{1 + 2}bar")
+    assert_equal "foo3", resolve("foo\#{1 + 2}")
+    assert_equal "3", resolve("\#{1 + 2}")
+  end
+
+  def test_interpolation_in_function
+    assert_equal 'flabnabbit(1foo)', resolve('flabnabbit(#{1 + "foo"})')
+    assert_equal 'flabnabbit(foo 1foobaz)', resolve('flabnabbit(foo #{1 + "foo"}baz)')
+    assert_equal('flabnabbit(foo 1foo2bar baz)',
+      resolve('flabnabbit(foo #{1 + "foo"}#{2 + "bar"} baz)'))
+  end
+
+  def test_interpolation_near_operators
+    silence_warnings do
+      assert_equal '3 , 7', resolve('#{1 + 2} , #{3 + 4}')
+      assert_equal '3, 7', resolve('#{1 + 2}, #{3 + 4}')
+      assert_equal '3 ,7', resolve('#{1 + 2} ,#{3 + 4}')
+      assert_equal '3,7', resolve('#{1 + 2},#{3 + 4}')
+      assert_equal '3, 7, 11', resolve('#{1 + 2}, #{3 + 4}, #{5 + 6}')
+      assert_equal '3, 7, 11', resolve('3, #{3 + 4}, 11')
+      assert_equal '3, 7, 11', resolve('3, 7, #{5 + 6}')
+
+      assert_equal '3 / 7', resolve('3 / #{3 + 4}')
+      assert_equal '3 /7', resolve('3 /#{3 + 4}')
+      assert_equal '3/ 7', resolve('3/ #{3 + 4}')
+      assert_equal '3/7', resolve('3/#{3 + 4}')
+
+      assert_equal '3 * 7', resolve('#{1 + 2} * 7')
+      assert_equal '3* 7', resolve('#{1 + 2}* 7')
+      assert_equal '3 *7', resolve('#{1 + 2} *7')
+      assert_equal '3*7', resolve('#{1 + 2}*7')
+
+      assert_equal '-3', resolve('-#{1 + 2}')
+      assert_equal '- 3', resolve('- #{1 + 2}')
+
+      assert_equal '5 + 3 * 7', resolve('5 + #{1 + 2} * #{3 + 4}')
+      assert_equal '5 +3 * 7', resolve('5 +#{1 + 2} * #{3 + 4}')
+      assert_equal '5+3 * 7', resolve('5+#{1 + 2} * #{3 + 4}')
+      assert_equal '3 * 7 + 5', resolve('#{1 + 2} * #{3 + 4} + 5')
+      assert_equal '3 * 7+ 5', resolve('#{1 + 2} * #{3 + 4}+ 5')
+      assert_equal '3 * 7+5', resolve('#{1 + 2} * #{3 + 4}+5')
+
+      assert_equal '5/3 + 7', resolve('5 / (#{1 + 2} + #{3 + 4})')
+      assert_equal '5/3 + 7', resolve('5 /(#{1 + 2} + #{3 + 4})')
+      assert_equal '5/3 + 7', resolve('5 /( #{1 + 2} + #{3 + 4} )')
+      assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4}) / 5')
+      assert_equal '3 + 7/5', resolve('(#{1 + 2} + #{3 + 4})/ 5')
+      assert_equal '3 + 7/5', resolve('( #{1 + 2} + #{3 + 4} )/ 5')
+
+      assert_equal '3 + 5', resolve('#{1 + 2} + 2 + 3')
+      assert_equal '3 +5', resolve('#{1 + 2} +2 + 3')
+    end
+  end
+
+  def test_string_interpolation
+    assert_equal "foo bar, baz bang", resolve('"foo #{"bar"}, #{"baz"} bang"')
+    assert_equal "foo bar baz bang", resolve('"foo #{"#{"ba" + "r"} baz"} bang"')
+    assert_equal 'foo #{bar baz} bang', resolve('"foo \#{#{"ba" + "r"} baz} bang"')
+    assert_equal 'foo #{baz bang', resolve('"foo #{"\#{" + "baz"} bang"')
+    assert_equal "foo2bar", resolve('\'foo#{1 + 1}bar\'')
+    assert_equal "foo2bar", resolve('"foo#{1 + 1}bar"')
+    assert_equal "foo1bar5baz4bang", resolve('\'foo#{1 + "bar#{2 + 3}baz" + 4}bang\'')
+  end
+
+  def test_interpolation_in_interpolation
+    assert_equal 'foo', resolve('#{#{foo}}')
+    assert_equal 'foo', resolve('"#{#{foo}}"')
+    assert_equal 'foo', resolve('#{"#{foo}"}')
+    assert_equal 'foo', resolve('"#{"#{foo}"}"')
+  end
+
+  def test_interpolation_with_newline
+    assert_equal "\nbang", resolve('"#{"\a "}bang"')
+    assert_equal "\n\nbang", resolve('"#{"\a "}\a bang"')
+  end
+
+  def test_rule_interpolation
+    assert_equal(<<CSS, render(<<SASS))
+foo bar baz bang {
+  a: b; }
+CSS
+foo \#{"\#{"ba" + "r"} baz"} bang
+  a: b
+SASS
+    assert_equal(<<CSS, render(<<SASS))
+foo [bar="\#{bar baz}"] bang {
+  a: b; }
+CSS
+foo [bar="\\\#{\#{"ba" + "r"} baz}"] bang
+  a: b
+SASS
+    assert_equal(<<CSS, render(<<SASS))
+foo [bar="\#{baz"] bang {
+  a: b; }
+CSS
+foo [bar="\#{"\\\#{" + "baz"}"] bang
+  a: b
+SASS
+  end
+
+  def test_inaccessible_functions
+    assert_equal "send(to_s)", resolve("send(to_s)", :line => 2)
+    assert_equal "public_instance_methods()", resolve("public_instance_methods()")
+  end
+
+  def test_adding_functions_directly_to_functions_module
+    assert !Functions.callable?('nonexistent')
+    Functions.class_eval { def nonexistent; end }
+    assert Functions.callable?('nonexistent')
+    Functions.send :remove_method, :nonexistent
+  end
+
+  def test_default_functions
+    assert_equal "url(12)", resolve("url(12)")
+    assert_equal 'blam("foo")', resolve('blam("foo")')
+  end
+
+  def test_function_results_have_options
+    assert_equal "Options defined!", resolve("assert_options(abs(1))")
+    assert_equal "Options defined!", resolve("assert_options(round(1.2))")
+  end
+
+  def test_funcall_requires_no_whitespace_before_lparen
+    assert_equal "no-repeat 15px", resolve("no-repeat (7px + 8px)")
+    assert_equal "no-repeat(15px)", resolve("no-repeat(7px + 8px)")
+  end
+
+  def test_dynamic_url
+    assert_equal "url(foo-bar)", resolve("url($foo)", {}, env('foo' => Sass::Script::Value::String.new("foo-bar")))
+    assert_equal "url(foo-bar baz)", resolve("url($foo $bar)", {}, env('foo' => Sass::Script::Value::String.new("foo-bar"), 'bar' => Sass::Script::Value::String.new("baz")))
+    assert_equal "url(foo baz)", resolve("url(foo $bar)", {}, env('bar' => Sass::Script::Value::String.new("baz")))
+    assert_equal "url(foo bar)", resolve("url(foo    bar)")
+  end
+
+  def test_url_with_interpolation
+    assert_equal "url(http://sass-lang.com/images/foo-bar)", resolve("url(http://sass-lang.com/images/\#{foo-bar})")
+    assert_equal 'url("http://sass-lang.com/images/foo-bar")', resolve("url('http://sass-lang.com/images/\#{foo-bar}')")
+    assert_equal 'url("http://sass-lang.com/images/foo-bar")', resolve('url("http://sass-lang.com/images/#{foo-bar}")')
+    assert_unquoted "url(http://sass-lang.com/images/\#{foo-bar})"
+  end
+
+  def test_hyphenated_variables
+    assert_equal("a-b", resolve("$a-b", {}, env("a-b" => Sass::Script::Value::String.new("a-b"))))
+  end
+
+  def test_ruby_equality
+    assert_equal eval('"foo"'), eval('"foo"')
+    assert_equal eval('1'), eval('1.0')
+    assert_equal eval('1 2 3.0'), eval('1 2 3')
+    assert_equal eval('1, 2, 3.0'), eval('1, 2, 3')
+    assert_equal eval('(1 2), (3, 4), (5 6)'), eval('(1 2), (3, 4), (5 6)')
+    refute_equal eval('1, 2, 3'), eval('1 2 3')
+    refute_equal eval('1'), eval('"1"')
+  end
+
+  def test_booleans
+    assert_equal "true", resolve("true")
+    assert_equal "false", resolve("false")
+  end
+
+  def test_null
+    assert_equal "", resolve("null")
+  end
+
+  def test_boolean_ops
+    assert_equal "true", resolve("true and true")
+    assert_equal "true", resolve("false or true")
+    assert_equal "true", resolve("true or false")
+    assert_equal "true", resolve("true or true")
+    assert_equal "false", resolve("false or false")
+    assert_equal "false", resolve("false and true")
+    assert_equal "false", resolve("true and false")
+    assert_equal "false", resolve("false and false")
+
+    assert_equal "true", resolve("not false")
+    assert_equal "false", resolve("not true")
+    assert_equal "true", resolve("not not true")
+
+    assert_equal "1", resolve("false or 1")
+    assert_equal "false", resolve("false and 1")
+    assert_equal "2", resolve("2 or 3")
+    assert_equal "3", resolve("2 and 3")
+
+    assert_equal "true", resolve("null or true")
+    assert_equal "true", resolve("true or null")
+    assert_equal "", resolve("null or null")
+    assert_equal "", resolve("null and true")
+    assert_equal "", resolve("true and null")
+    assert_equal "", resolve("null and null")
+
+    assert_equal "true", resolve("not null")
+
+    assert_equal "1", resolve("null or 1")
+    assert_equal "", resolve("null and 1")
+  end
+
+  def test_arithmetic_ops
+    assert_equal "2", resolve("1 + 1")
+    assert_equal "0", resolve("1 - 1")
+    assert_equal "8", resolve("2 * 4")
+    assert_equal "0.5", resolve("(2 / 4)")
+    assert_equal "2", resolve("(4 / 2)")
+
+    assert_equal "-1", resolve("-1")
+  end
+
+  def test_subtraction_vs_minus_vs_identifier
+    assert_equal "0.25em", resolve("1em-.75")
+    assert_equal "0.25em", resolve("1em-0.75")
+    assert_equal "1em -0.75", resolve("1em -.75")
+    assert_equal "1em -0.75", resolve("1em -0.75")
+    assert_equal "1em- 0.75", resolve("1em- .75")
+    assert_equal "1em- 0.75", resolve("1em- 0.75")
+    assert_equal "0.25em", resolve("1em - .75")
+    assert_equal "0.25em", resolve("1em - 0.75")
+  end
+
+  def test_string_ops
+    assert_equal '"foo" "bar"', resolve('"foo" "bar"')
+    assert_equal "true 1", resolve('true 1')
+    assert_equal '"foo", "bar"', resolve("'foo' , 'bar'")
+    assert_equal "true, 1", resolve('true , 1')
+    assert_equal "foobar", resolve('"foo" + "bar"')
+    assert_equal "\nfoo\nxyz", resolve('"\a foo" + "\axyz"')
+    assert_equal "true1", resolve('true + 1')
+    assert_equal '"foo"-"bar"', resolve("'foo' - 'bar'")
+    assert_equal "true-1", resolve('true - 1')
+    assert_equal '"foo"/"bar"', resolve('"foo" / "bar"')
+    assert_equal "true/1", resolve('true / 1')
+
+    assert_equal '-"bar"', resolve("- 'bar'")
+    assert_equal "-true", resolve('- true')
+    assert_equal '/"bar"', resolve('/ "bar"')
+    assert_equal "/true", resolve('/ true')
+  end
+
+  def test_relational_ops
+    assert_equal "false", resolve("1 > 2")
+    assert_equal "false", resolve("2 > 2")
+    assert_equal "true", resolve("3 > 2")
+    assert_equal "false", resolve("1 >= 2")
+    assert_equal "true", resolve("2 >= 2")
+    assert_equal "true", resolve("3 >= 2")
+    assert_equal "true", resolve("1 < 2")
+    assert_equal "false", resolve("2 < 2")
+    assert_equal "false", resolve("3 < 2")
+    assert_equal "true", resolve("1 <= 2")
+    assert_equal "true", resolve("2 <= 2")
+    assert_equal "false", resolve("3 <= 2")
+  end
+
+  def test_null_ops
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "null plus 1".') {eval("null + 1")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "null minus 1".') {eval("null - 1")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "null times 1".') {eval("null * 1")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "null div 1".') {eval("null / 1")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "null mod 1".') {eval("null % 1")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "1 plus null".') {eval("1 + null")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "1 minus null".') {eval("1 - null")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "1 times null".') {eval("1 * null")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "1 div null".') {eval("1 / null")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "1 mod null".') {eval("1 % null")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "1 gt null".') {eval("1 > null")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "null lt 1".') {eval("null < 1")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: "null plus null".') {eval("null + null")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid null operation: ""foo" plus null".') {eval("foo + null")}
+  end
+
+  def test_equals
+    assert_equal("true", resolve('"foo" == $foo', {},
+        env("foo" => Sass::Script::Value::String.new("foo"))))
+    assert_equal "true", resolve("1 == 1.0")
+    assert_equal "true", resolve("false != true")
+    assert_equal "false", resolve("1em == 1px")
+    assert_equal "false", resolve("12 != 12")
+    assert_equal "true", resolve("(foo bar baz) == (foo bar baz)")
+    assert_equal "true", resolve("(foo, bar, baz) == (foo, bar, baz)")
+    assert_equal "true", resolve('((1 2), (3, 4), (5 6)) == ((1 2), (3, 4), (5 6))')
+    assert_equal "true", resolve('((1 2), (3 4)) == (1 2, 3 4)')
+    assert_equal "false", resolve('((1 2) 3) == (1 2 3)')
+    assert_equal "false", resolve('(1 (2 3)) == (1 2 3)')
+    assert_equal "false", resolve('((1, 2) (3, 4)) == (1, 2 3, 4)')
+    assert_equal "false", resolve('(1 2 3) == (1, 2, 3)')
+
+    assert_equal "true", resolve('null == null')
+    assert_equal "false", resolve('"null" == null')
+    assert_equal "false", resolve('0 == null')
+    assert_equal "false", resolve('() == null')
+
+    assert_equal "false", resolve('null != null')
+    assert_equal "true", resolve('"null" != null')
+    assert_equal "true", resolve('0 != null')
+    assert_equal "true", resolve('() != null')
+  end
+
+  def test_mod
+    assert_equal "5", resolve("29 % 12")
+    assert_equal "5px", resolve("29px % 12")
+    assert_equal "5px", resolve("29px % 12px")
+  end
+
+  def test_operation_precedence
+    assert_equal "false true", resolve("true and false false or true")
+    assert_equal "true", resolve("false and true or true and true")
+    assert_equal "true", resolve("1 == 2 or 3 == 3")
+    assert_equal "true", resolve("1 < 2 == 3 >= 3")
+    assert_equal "true", resolve("1 + 3 > 4 - 2")
+    assert_equal "11", resolve("1 + 2 * 3 + 4")
+  end
+
+  def test_functions
+    assert_equal "#80ff80", resolve("hsl(120, 100%, 75%)")
+    silence_warnings {assert_equal "#81ff81", resolve("hsl(120, 100%, 75%) + #010001")}
+  end
+
+  def test_operator_unit_conversion
+    assert_equal "1.1cm", resolve("1cm + 1mm")
+    assert_equal "8q", resolve("4q + 1mm")
+    assert_equal "40.025cm", resolve("40cm + 1q")
+    assert_equal "2in", resolve("1in + 96px")
+    assert_equal "true", resolve("2mm < 1cm")
+    assert_equal "true", resolve("10mm == 1cm")
+    assert_equal "true", resolve("1.1cm == 11mm")
+    assert_equal "true", resolve("2mm == 8q")
+    assert_equal "false", resolve("2px > 3q")
+
+    Sass::Deprecation.allow_double_warnings do
+      assert_warning(<<WARNING) {assert_equal "true", resolve("1 == 1cm")}
+DEPRECATION WARNING on line 1 of test_operator_unit_conversion_inline.sass:
+The result of `1 == 1cm` will be `false` in future releases of Sass.
+Unitless numbers will no longer be equal to the same numbers with units.
+WARNING
+
+      assert_warning(<<WARNING) {assert_equal "false", resolve("1 != 1cm")}
+DEPRECATION WARNING on line 1 of test_operator_unit_conversion_inline.sass:
+The result of `1 != 1cm` will be `true` in future releases of Sass.
+Unitless numbers will no longer be equal to the same numbers with units.
+WARNING
+    end
+  end
+
+  def test_length_units
+    assert_equal "2.54", resolve("(1in/1cm)")
+    assert_equal "2.3622047244", resolve("(1cm/1pc)")
+    assert_equal "4.2333333333", resolve("(1pc/1mm)")
+    assert_equal "2.8346456693", resolve("(1mm/1pt)")
+    assert_equal "1.3333333333", resolve("(1pt/1px)")
+    assert_equal "0.0104166667", resolve("(1px/1in)")
+    assert_equal "1.0583333333", resolve("(1px/1q)")
+    assert_equal "0.0590551181", resolve("(1q/1pc)")
+  end
+
+  def test_angle_units
+    assert_equal "1.1111111111", resolve("(1deg/1grad)")
+    assert_equal "0.0157079633", resolve("(1grad/1rad)")
+    assert_equal "0.1591549431", resolve("(1rad/1turn)")
+    assert_equal "360", resolve("(1turn/1deg)")
+  end
+
+  def test_time_units
+    assert_equal "1000", resolve("(1s/1ms)")
+  end
+
+  def test_frequency_units
+    assert_equal "0.001", resolve("(1Hz/1kHz)")
+  end
+
+  def test_resolution_units
+    assert_equal "0.3937007874", resolve("(1dpi/1dpcm)")
+    assert_equal "0.0264583333", resolve("(1dpcm/1dppx)")
+    assert_equal "96", resolve("(1dppx/1dpi)")
+  end
+
+  def test_operations_have_options
+    assert_equal "Options defined!", resolve("assert_options(1 + 1)")
+    assert_equal "Options defined!", resolve("assert_options('bar' + 'baz')")
+  end
+
+  def test_slash_compiles_literally_when_left_alone
+    assert_equal "1px/2px", resolve("1px/2px")
+    assert_equal "1px/2px/3px/4px", resolve("1px/2px/3px/4px")
+
+    assert_equal "1px/2px redpx bluepx", resolve("1px/2px redpx bluepx")
+    assert_equal "foo 1px/2px/3px bar", resolve("foo 1px/2px/3px bar")
+  end
+
+  def test_slash_divides_with_parens
+    assert_equal "0.5", resolve("(1px/2px)")
+    assert_equal "0.5", resolve("(1px)/2px")
+    assert_equal "0.5", resolve("1px/(2px)")
+  end
+
+  def test_slash_divides_with_other_arithmetic
+    assert_equal "0.5px", resolve("1px*1px/2px")
+    assert_equal "0.5px", resolve("1px/2px*1px")
+    assert_equal "0.5", resolve("0+1px/2px")
+    assert_equal "0.5", resolve("1px/2px+0")
+  end
+
+  def test_slash_divides_with_variable
+    assert_equal "0.5", resolve("$var/2px", {}, env("var" => eval("1px")))
+    assert_equal "0.5", resolve("1px/$var", {}, env("var" => eval("2px")))
+    assert_equal "0.5", resolve("$var", {}, env("var" => eval("1px/2px")))
+  end
+
+  # Regression test for issue 1786.
+  def test_slash_division_within_list
+    assert_equal "1 1/2 1/2", resolve("(1 1/2 1/2)")
+    assert_equal "1/2 1/2", resolve("(1/2 1/2)")
+    assert_equal "1/2", resolve("(1/2,)")
+  end
+
+  def test_non_ident_colors_with_wrong_number_of_digits
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#1"') {eval("#1")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#12"') {eval("#12")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#1234"') {eval("#1234")}
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid CSS after "": expected expression (e.g. 1px, bold), was "#12345"') {eval("#12345")}
+    assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "": expected expression (e.g. ' \
+      '1px, bold), was "#1234567"') {eval("#1234567")}
+  end
+
+  def test_case_insensitive_color_names
+    assert_equal "BLUE", resolve("BLUE")
+    assert_equal "rEd", resolve("rEd")
+    assert_equal "#804000", resolve("mix(GrEeN, ReD)")
+  end
+
+  def test_empty_list
+    assert_equal "1 2 3", resolve("1 2 () 3")
+    assert_equal "1 2 3", resolve("1 2 3 ()")
+    assert_equal "1 2 3", resolve("() 1 2 3")
+    assert_raise_message(Sass::SyntaxError, "() isn't a valid CSS value.") {resolve("()")}
+    assert_raise_message(Sass::SyntaxError, "() isn't a valid CSS value.") {resolve("nth(append((), ()), 1)")}
+  end
+
+  def test_list_with_nulls
+    assert_equal "1, 2, 3", resolve("1, 2, null, 3")
+    assert_equal "1 2 3", resolve("1 2 null 3")
+    assert_equal "1, 2, 3", resolve("1, 2, 3, null")
+    assert_equal "1 2 3", resolve("1 2 3 null")
+    assert_equal "1, 2, 3", resolve("null, 1, 2, 3")
+    assert_equal "1 2 3", resolve("null 1 2 3")
+  end
+
+  def test_map_can_have_trailing_comma
+    assert_equal("(foo: 1, bar: 2)", eval("(foo: 1, bar: 2,)").to_sass)
+  end
+
+  def test_list_can_have_trailing_comma
+    assert_equal("1, 2, 3", resolve("1, 2, 3,"))
+  end
+
+  def test_trailing_comma_defines_singleton_list
+    assert_equal("1 2 3", resolve("nth((1 2 3,), 1)"))
+  end
+
+  def test_map_cannot_have_duplicate_keys
+    assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, foo: baz).') do
+      eval("(foo: bar, foo: baz)")
+    end
+    assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, fo + o: baz).') do
+      eval("(foo: bar, fo + o: baz)")
+    end
+    assert_raise_message(Sass::SyntaxError, 'Duplicate key "foo" in map (foo: bar, "foo": baz).') do
+      eval("(foo: bar, 'foo': baz)")
+    end
+    assert_raise_message(Sass::SyntaxError, 'Duplicate key 2px in map (2px: bar, 1px + 1px: baz).') do
+      eval("(2px: bar, 1px + 1px: baz)")
+    end
+    assert_raise_message(Sass::SyntaxError, 'Duplicate key #0000ff in map (blue: bar, #00f: baz).') do
+      eval("(blue: bar, #00f: baz)")
+    end
+  end
+
+  def test_non_duplicate_map_keys
+    # These shouldn't throw errors
+    eval("(foo: foo, bar: bar)")
+    eval("(2px: foo, 2: bar)")
+    eval("(2px: foo, 2em: bar)")
+    eval("('2px': foo, 2px: bar)")
+  end
+
+  def test_map_syntax_errors
+    assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo:": expected expression (e.g. 1px, bold), was ")"') do
+      eval("(foo:)")
+    end
+    assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(": expected ")", was ":bar)"') do
+      eval("(:bar)")
+    end
+    assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo, bar": expected ")", was ": baz)"') do
+      eval("(foo, bar: baz)")
+    end
+    assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "(foo: bar, baz": expected ":", was ")"') do
+      eval("(foo: bar, baz)")
+    end
+  end
+
+  def test_deep_argument_error_not_unwrapped
+    # JRuby (as of 1.6.7.2) offers no way of distinguishing between
+    # argument errors caused by programming errors in a function and
+    # argument errors explicitly thrown within that function.
+    return if RUBY_PLATFORM =~ /java/
+
+    # Don't validate the message; it's different on Rubinius.
+    assert_raises(ArgumentError) {resolve("arg-error()")}
+  end
+
+  def test_shallow_argument_error_unwrapped
+    assert_raise_message(Sass::SyntaxError, "wrong number of arguments (1 for 0) for `arg-error'") {resolve("arg-error(1)")}
+  end
+
+  def test_boolean_ops_short_circuit
+    assert_equal "false", resolve("$ie and $ie <= 7", {}, env('ie' => Sass::Script::Value::Bool.new(false)))
+    assert_equal "true", resolve("$ie or $undef", {}, env('ie' => Sass::Script::Value::Bool.new(true)))
+  end
+
+  def test_selector
+    env = Sass::Environment.new
+    assert_equal "true", resolve("& == null", {}, env)
+
+    env.selector = selector('.foo.bar .baz.bang, .bip.bop')
+    assert_equal ".foo.bar .baz.bang, .bip.bop", resolve("&", {}, env)
+    assert_equal ".foo.bar .baz.bang", resolve("nth(&, 1)", {}, env)
+    assert_equal ".bip.bop", resolve("nth(&, 2)", {}, env)
+    assert_equal ".foo.bar", resolve("nth(nth(&, 1), 1)", {}, env)
+    assert_equal ".baz.bang", resolve("nth(nth(&, 1), 2)", {}, env)
+    assert_equal ".bip.bop", resolve("nth(nth(&, 2), 1)", {}, env)
+    assert_equal "string", resolve("type-of(nth(nth(&, 1), 1))", {}, env)
+
+    env.selector = selector('.foo > .bar')
+    assert_equal ".foo > .bar", resolve("&", {}, env)
+    assert_equal ".foo > .bar", resolve("nth(&, 1)", {}, env)
+    assert_equal ".foo", resolve("nth(nth(&, 1), 1)", {}, env)
+    assert_equal ">", resolve("nth(nth(&, 1), 2)", {}, env)
+    assert_equal ".bar", resolve("nth(nth(&, 1), 3)", {}, env)
+  end
+
+  def test_selector_with_newlines
+    env = Sass::Environment.new
+    env.selector = selector(".foo.bar\n.baz.bang,\n\n.bip.bop")
+    assert_equal ".foo.bar .baz.bang, .bip.bop", resolve("&", {}, env)
+    assert_equal ".foo.bar .baz.bang", resolve("nth(&, 1)", {}, env)
+    assert_equal ".bip.bop", resolve("nth(&, 2)", {}, env)
+    assert_equal ".foo.bar", resolve("nth(nth(&, 1), 1)", {}, env)
+    assert_equal ".baz.bang", resolve("nth(nth(&, 1), 2)", {}, env)
+    assert_equal ".bip.bop", resolve("nth(nth(&, 2), 1)", {}, env)
+    assert_equal "string", resolve("type-of(nth(nth(&, 1), 1))", {}, env)
+  end
+
+  def test_setting_global_variable_globally
+    assert_no_warning {assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))}
+.foo {
+  a: 1; }
+
+.bar {
+  b: 2; }
+CSS
+$var: 1;
+
+.foo {
+  a: $var;
+}
+
+$var: 2;
+
+.bar {
+  b: $var;
+}
+SCSS
+  end
+
+  def test_setting_global_variable_locally
+    assert_no_warning {assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))}
+.bar {
+  a: x;
+  b: y;
+  c: z; }
+CSS
+$var1: 1;
+$var3: 3;
+
+.foo {
+  $var1: x !global;
+  $var2: y !global;
+  @each $var3 in _ {
+    $var3: z !global;
+  }
+}
+
+.bar {
+  a: $var1;
+  b: $var2;
+  c: $var3;
+}
+SCSS
+  end
+
+  def test_setting_global_variable_locally_with_default
+    assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
+.bar {
+  a: 1;
+  b: y;
+  c: z; }
+CSS
+$var1: 1;
+
+.foo {
+  $var1: x !global !default;
+  $var2: y !global !default;
+  @each $var3 in _ {
+    $var3: z !global !default;
+  }
+}
+
+.bar {
+  a: $var1;
+  b: $var2;
+  c: $var3;
+}
+SCSS
+  end
+
+  def test_setting_local_variable
+    assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
+.a {
+  value: inside; }
+
+.b {
+  value: outside; }
+CSS
+$var: outside;
+
+.a {
+  $var: inside;
+  value: $var;
+}
+
+.b {
+  value: $var;
+}
+SCSS
+  end
+
+  def test_setting_local_variable_from_inner_scope
+    assert_equal(<<CSS, render(<<SCSS, :syntax => :scss))
+.a .b {
+  value: inside; }
+.a .c {
+  value: inside; }
+CSS
+.a {
+  $var: outside;
+
+  .b {
+    $var: inside;
+    value: $var;
+  }
+
+  .c {
+    value: $var;
+  }
+}
+SCSS
+  end
+
+  def test_if_can_assign_to_global_variables
+    assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
+.a {
+  b: 2; }
+CSS
+$var: 1;
+@if true {$var: 2}
+.a {b: $var}
+SCSS
+  end
+
+  def test_else_can_assign_to_global_variables
+    assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
+.a {
+  b: 2; }
+CSS
+$var: 1;
+@if false {}
+@else {$var: 2}
+.a {b: $var}
+SCSS
+  end
+
+  def test_for_can_assign_to_global_variables
+    assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
+.a {
+  b: 2; }
+CSS
+$var: 1;
+@for $i from 1 to 2 {$var: 2}
+.a {b: $var}
+SCSS
+  end
+
+  def test_each_can_assign_to_global_variables
+    assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
+.a {
+  b: 2; }
+CSS
+$var: 1;
+@each $a in 1 {$var: 2}
+.a {b: $var}
+SCSS
+  end
+
+  def test_while_can_assign_to_global_variables
+    assert_equal <<CSS, render(<<SCSS, :syntax => :scss)
+.a {
+  b: 2; }
+CSS
+$var: 1;
+@while $var != 2 {$var: 2}
+.a {b: $var}
+SCSS
+  end
+
+  def test_if_doesnt_leak_local_variables
+    assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
+      render(<<SCSS, :syntax => :scss)
+@if true {$var: 1}
+.a {b: $var}
+SCSS
+    end
+  end
+
+  def test_else_doesnt_leak_local_variables
+    assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
+      render(<<SCSS, :syntax => :scss)
+@if false {}
+@else {$var: 1}
+.a {b: $var}
+SCSS
+    end
+  end
+
+  def test_for_doesnt_leak_local_variables
+    assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
+      render(<<SCSS, :syntax => :scss)
+@for $i from 1 to 2 {$var: 1}
+.a {b: $var}
+SCSS
+    end
+  end
+
+  def test_each_doesnt_leak_local_variables
+    assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
+      render(<<SCSS, :syntax => :scss)
+@each $a in 1 {$var: 1}
+.a {b: $var}
+SCSS
+    end
+  end
+
+  def test_while_doesnt_leak_local_variables
+    assert_raise_message(Sass::SyntaxError, 'Undefined variable: "$var".') do
+      render(<<SCSS, :syntax => :scss)
+$iter: true;
+@while $iter {
+  $var: 1;
+  $iter: false;
+}
+.a {b: $var}
+SCSS
+    end
+  end
+
+  def test_color_format_is_preserved_by_default
+    assert_equal "blue", resolve("blue")
+    assert_equal "bLuE", resolve("bLuE")
+    assert_equal "#00f", resolve("#00f")
+    assert_equal "blue #00F", resolve("blue #00F")
+    assert_equal "blue", resolve("nth(blue #00F, 1)")
+    assert_equal "#00F", resolve("nth(blue #00F, 2)")
+  end
+
+  def test_color_format_isnt_always_preserved_in_compressed_style
+    assert_equal "red", resolve("red", :style => :compressed)
+    assert_equal "red", resolve("#f00", :style => :compressed)
+    assert_equal "red red", resolve("red #f00", :style => :compressed)
+    assert_equal "red", resolve("nth(red #f00, 2)", :style => :compressed)
+  end
+
+  def test_color_format_is_sometimes_preserved_in_compressed_style
+    assert_equal "ReD", resolve("ReD", :style => :compressed)
+    assert_equal "blue", resolve("blue", :style => :compressed)
+    assert_equal "#00f", resolve("#00f", :style => :compressed)
+  end
+
+  def test_color_format_isnt_preserved_when_modified
+    assert_equal "magenta", resolve("change-color(#f00, $blue: 255)")
+  end
+
+  def test_ids
+    assert_equal "#foo", resolve("#foo")
+    assert_equal "#abcd", resolve("#abcd")
+    assert_equal "#abc-def", resolve("#abc-def")
+    assert_equal "#abc_def", resolve("#abc_def")
+    assert_equal "#uvw-xyz", resolve("#uvw-xyz")
+    assert_equal "#uvw_xyz", resolve("#uvw_xyz")
+    assert_equal "#uvwxyz", resolve("#uvw + xyz")
+  end
+
+  def test_scientific_notation
+    assert_equal "2000", resolve("2e3")
+    assert_equal "2000", resolve("2E3")
+    assert_equal "2000", resolve("2e+3")
+    assert_equal "2000em", resolve("2e3em")
+    assert_equal "25000000000", resolve("2.5e10")
+    assert_equal "0.1234", resolve("1234e-4")
+    assert_equal "12.34", resolve("1.234e1")
+  end
+
+  def test_identifier_units
+    assert_equal "5-foo", resolve("2-foo + 3-foo")
+    assert_equal "5-foo-", resolve("2-foo- + 3-foo-")
+    assert_equal "5-\\u2603", resolve("2-\\u2603 + 3-\\u2603")
+  end
+
+  def test_backslash_newline_in_string
+    assert_equal 'foobar', resolve("\"foo\\\nbar\"")
+    assert_equal 'foobar', resolve("'foo\\\nbar'")
+  end
+
+  def test_unclosed_special_fun
+    assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(foo()": expected ")", was ""') do
+      resolve("calc(foo()")
+    end
+    assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(#{\')\'}": expected ")", was ""') do
+      resolve("calc(\#{')'}")
+    end
+    assert_raise_message(Sass::SyntaxError, 'Invalid CSS after "calc(#{foo": expected "}", was ""') do
+      resolve("calc(\#{foo")
+    end
+  end
+
+  def test_special_fun_with_interpolation
+    assert_equal "calc())", resolve("calc(\#{')'})")
+    assert_equal "calc(# {foo})", resolve("calc(# {foo})")
+  end
+
+  # Regression Tests
+
+  def test_interpolation_after_string
+    assert_equal '"foobar" 2', resolve('"foobar" #{2}')
+    assert_equal "calc(1 + 2) 3", resolve('calc(1 + 2) #{3}')
+  end
+
+  def test_repeatedly_modified_color
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  link-color: #161C14;
+  link-color-hover: black;
+  link-color-tap: rgba(22, 28, 20, 0.3); }
+CSS
+$green: #161C14
+$link-color: $green
+$link-color-hover: darken($link-color, 10%)
+$link-color-tap: rgba($green, 0.3)
+
+a
+  link-color: $link-color
+  link-color-hover: $link-color-hover
+  link-color-tap: $link-color-tap
+SASS
+  end
+
+  def test_inspect_divided_numbers
+    assert_equal "1px/2px", resolve("inspect(1px/2px)")
+    assert_equal "0.5", resolve("inspect((1px/2px))")
+  end
+
+  def test_minus_without_whitespace
+    assert_equal "5px", resolve("15px-10px")
+    assert_equal "5px-", resolve("15px--10px-")
+  end
+
+  def test_minus_preceded_by_comment
+    assert_equal "15px -10px", resolve("15px/**/-10px")
+  end
+
+  def test_user_defined_function_forces_division
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  b: 10px; }
+CSS
+@function foo()
+  @return 20px
+
+a
+  b: (foo() / 2)
+SASS
+
+    assert_equal(<<CSS, render(<<SASS))
+a {
+  b: 10px; }
+CSS
+@function foo()
+  @return 20px
+
+a
+  b: foo() / 2
+SASS
+  end
+
+  def test_funcall_has_higher_precedence_than_color_name
+    assert_equal "teal(12)", resolve("teal(12)")
+    assert_equal "tealbang(12)", resolve("tealbang(12)")
+    assert_equal "teal-bang(12)", resolve("teal-bang(12)")
+    assert_equal "teal\\+bang(12)", resolve("teal\\+bang(12)")
+  end
+
+  def test_funcall_has_higher_precedence_than_true_false_null
+    assert_equal "teal(12)", resolve("teal(12)")
+    assert_equal "tealbang(12)", resolve("tealbang(12)")
+    assert_equal "teal-bang(12)", resolve("teal-bang(12)")
+    assert_equal "teal\\+bang(12)", resolve("teal\\+bang(12)")
+  end
+
+  def test_and_or_not_disallowed_as_function_names
+    %w[and or not].each do |name|
+      assert_raise_message(Sass::SyntaxError, "Invalid function name \"#{name}\".") do
+        render(<<SASS)
+@function #{name}()
+  @return null
+SASS
+      end
+    end
+  end
+
+  def test_interpolation_after_hash
+    assert_equal "#2", resolve('"##{1 + 1}"')
+  end
+
+  def test_func_call_arglist_trailing_comma
+    assert_equal eval('foo(bar)'), eval('foo(bar, )')
+  end
+
+  def test_color_prefixed_identifier
+    assert_equal "tealbang", resolve("tealbang")
+    assert_equal "teal-bang", resolve("teal-bang")
+  end
+
+  def test_op_prefixed_identifier
+    assert_equal "notbang", resolve("notbang")
+    assert_equal "not-bang", resolve("not-bang")
+    assert_equal "or-bang", resolve("or-bang")
+    assert_equal "and-bang", resolve("and-bang")
+  end
+
+  def test_number_initialization
+    assert_equal Sass::Script::Value::Number.new(10, ["px"]), Sass::Script::Value::Number.new(10, "px")
+    assert_equal Sass::Script::Value::Number.new(10, ["px"], ["em"]), Sass::Script::Value::Number.new(10, "px", "em")
+  end
+
+  def test_is_unit
+    assert Sass::Script::Value::Number.new(10, "px").is_unit?("px")
+    assert Sass::Script::Value::Number.new(10).is_unit?(nil)
+    assert !Sass::Script::Value::Number.new(10, "px", "em").is_unit?("px")
+    assert !Sass::Script::Value::Number.new(10, [], "em").is_unit?("em")
+    assert !Sass::Script::Value::Number.new(10, ["px", "em"]).is_unit?("px")
+  end
+
+  def test_rename_redirect
+    assert_no_warning do
+      assert_equal Sass::Script::Value::Base, Sass::Script::Literal
+      assert_equal Sass::Script::Tree::Node, Sass::Script::Node
+      assert_equal Sass::Script::Tree::Operation, Sass::Script::Operation
+      assert_equal Sass::Script::Value::String, Sass::Script::String
+    end
+  end
+
+  def test_number_printing
+    assert_equal "1", resolve("1")
+    assert_equal "1", resolve("1.0")
+    assert_equal "1000000000", resolve("1000000000")
+    assert_equal "0.00001", resolve("0.00001")
+    assert_equal "1.1212121212", resolve("1.12121212124")
+    assert_equal "1.1212121213", resolve("1.12121212125")
+    assert_equal "Infinity", resolve("(1.0/0.0)")
+    assert_equal "-Infinity", resolve("(-1.0/0.0)")
+    assert_equal "NaN", resolve("(0.0/0.0)")
+  end
+
+  def test_equality_uses_an_epsilon
+    # At least on my machine, this calculation introduces a floating point error:
+    # 29.0 / 7 * 7
+    # => 29.000000000000004
+    assert_equal "true", resolve("29 == (29 / 7 * 7)")
+  end
+
+  def test_compressed_output_of_numbers_with_leading_zeros
+    assert_equal "1.5", resolve("1.5", :style => :compressed)
+    assert_equal ".5", resolve("0.5", :style => :compressed)
+    assert_equal "-.5", resolve("-0.5", :style => :compressed)
+    assert_equal "0.5", resolve("0.5", :style => :compact)
+  end
+
+  def test_interpolation_without_deprecation_warning
+    assert_no_warning {assert_equal "a", resolve('#{a}')}
+    assert_no_warning {assert_equal "abc", resolve('a#{b}c')}
+    assert_no_warning {assert_equal "+ a", resolve('+ #{a}')}
+    assert_no_warning {assert_equal "/ a", resolve('/ #{a}')}
+    assert_no_warning {assert_equal "1 / a", resolve('1 / #{a}')}
+    assert_no_warning {assert_equal "a / b", resolve('#{a} / #{b}')}
+    assert_no_warning {assert_equal "foo(1 = a)", resolve('foo(1 = #{a})')}
+    assert_no_warning {assert_equal "foo(a = b)", resolve('foo(#{a} = #{b})')}
+    assert_no_warning {assert_equal "-a", resolve('-#{a}')}
+    assert_no_warning {assert_equal "1-a", resolve('1-#{a}')}
+    assert_no_warning {assert_equal "a- 1", resolve('#{a}- 1')}
+    assert_no_warning {assert_equal "a-1", resolve('#{a}-1')}
+    assert_no_warning {assert_equal "a-b", resolve('#{a}-#{b}')}
+    assert_no_warning {assert_equal "a1", resolve('#{a}1')}
+    assert_no_warning {assert_equal "ab", resolve('#{a}b')}
+    assert_no_warning {assert_equal "1a", resolve('1#{a}')}
+    assert_no_warning {assert_equal "ba", resolve('b#{a}')}
+  end
+
+  def test_leading_interpolation_with_deprecation_warning
+    assert_equal "ab == 1", resolve_with_interp_warning('#{a + b} == 1')
+    assert_equal "ab != 1", resolve_with_interp_warning('#{a + b} != 1')
+    assert_equal "ab > 1", resolve_with_interp_warning('#{a + b} > 1')
+    assert_equal "ab >= 1", resolve_with_interp_warning('#{a + b} >= 1')
+    assert_equal "ab < 1", resolve_with_interp_warning('#{a + b} < 1')
+    assert_equal "ab <= 1", resolve_with_interp_warning('#{a + b} <= 1')
+    assert_equal "ab + 1", resolve_with_interp_warning('#{a + b} + 1')
+    assert_equal "ab * 1", resolve_with_interp_warning('#{a + b} * 1')
+    assert_equal "ab - 1", resolve_with_interp_warning('#{a + b} - 1')
+    assert_equal "ab % 1", resolve_with_interp_warning('#{a + b} % 1')
+    assert_equal(
+      "abvar",
+      resolve_with_interp_warning(
+        '#{a + b}$var', '"#{a + b}#{$var}"',
+        env('var' => Sass::Script::Value::String.new("var"))))
+    assert_equal(
+      "varab",
+      resolve_with_interp_warning(
+        '$var#{a + b}', '"#{$var}#{a + b}"',
+        env('var' => Sass::Script::Value::String.new("var"))))
+    assert_equal "ab1", resolve_with_interp_warning('#{a + b}(1)', '"#{a + b}1"')
+    assert_equal "1ab", resolve_with_interp_warning('(1)#{a + b}', '"1#{a + b}"')
+  end
+
+  def test_trailing_interpolation_with_deprecation_warning
+    assert_equal "not ab", resolve_with_interp_warning('not #{a + b}')
+    assert_equal "1 and ab", resolve_with_interp_warning('1 and #{a + b}')
+    assert_equal "1 or ab", resolve_with_interp_warning('1 or #{a + b}')
+    assert_equal "1 == ab", resolve_with_interp_warning('1 == #{a + b}')
+    assert_equal "1 != ab", resolve_with_interp_warning('1 != #{a + b}')
+    assert_equal "1 > ab", resolve_with_interp_warning('1 > #{a + b}')
+    assert_equal "1 >= ab", resolve_with_interp_warning('1 >= #{a + b}')
+    assert_equal "1 < ab", resolve_with_interp_warning('1 < #{a + b}')
+    assert_equal "1 <= ab", resolve_with_interp_warning('1 <= #{a + b}')
+    assert_equal "1 + ab", resolve_with_interp_warning('1 + #{a + b}')
+    assert_equal "1 * ab", resolve_with_interp_warning('1 * #{a + b}')
+    assert_equal "1 - ab", resolve_with_interp_warning('1 - #{a + b}')
+    assert_equal "1 % ab", resolve_with_interp_warning('1 % #{a + b}')
+    assert_equal "- ab", resolve_with_interp_warning('- #{a + b}')
+    assert_equal "1- ab", resolve_with_interp_warning('1- #{a + b}')
+    assert_equal "- ab 2 3", resolve_with_interp_warning('- #{a + b} 2 3', '"- #{a + b} #{2 3}"')
+  end
+
+  def test_brackteing_interpolation_with_deprecation_warning
+    assert_equal "ab == cd", resolve_with_interp_warning('#{a + b} == #{c + d}')
+    assert_equal "ab != cd", resolve_with_interp_warning('#{a + b} != #{c + d}')
+    assert_equal "ab > cd", resolve_with_interp_warning('#{a + b} > #{c + d}')
+    assert_equal "ab >= cd", resolve_with_interp_warning('#{a + b} >= #{c + d}')
+    assert_equal "ab < cd", resolve_with_interp_warning('#{a + b} < #{c + d}')
+    assert_equal "ab <= cd", resolve_with_interp_warning('#{a + b} <= #{c + d}')
+    assert_equal "ab + cd", resolve_with_interp_warning('#{a + b} + #{c + d}')
+    assert_equal "ab * cd", resolve_with_interp_warning('#{a + b} * #{c + d}')
+    assert_equal "ab - cd", resolve_with_interp_warning('#{a + b} - #{c + d}')
+    assert_equal "ab % cd", resolve_with_interp_warning('#{a + b} % #{c + d}')
+  end
+
+  def test_interp_warning_formatting
+    resolve_with_interp_warning('#{1} + 1', '"1 + 1"')
+    resolve_with_interp_warning('#{1} + "foo"', '\'1 + "foo"\'')
+    resolve_with_interp_warning('#{1} + \'foo\'', '\'1 + "foo"\'')
+
+    resolve_with_interp_warning('#{1} + "#{a + b}"', '\'1 + "#{a + b}"\'')
+    resolve_with_interp_warning('"#{a + b}" + #{1}', '\'"#{a + b}" + 1\'')
+    resolve_with_interp_warning('"#{a + b}" + #{1} + "#{c + d}"', '\'"#{a + b}" + 1 + "#{c + d}"\'')
+
+    resolve_with_interp_warning('#{1} + "\'"', '"1 + \\"\'\\""')
+    resolve_with_interp_warning('#{1} + \'"\'', '"1 + \'\\"\'"')
+    resolve_with_interp_warning('#{1} + "\'\\""', '"1 + \\"\'\\\\\\"\\""')
+  end
+
+  def test_inactive_lazy_interpolation_deprecation_warning
+    assert_equal '1, 2, 3', assert_no_warning {resolve('1, #{2}, 3')}
+    assert_equal '1, 2, 3', assert_no_warning {resolve('1, 2, #{3}')}
+    assert_equal '1,2,3', assert_no_warning {resolve('1,#{2},3')}
+    assert_equal '1 2 3', assert_no_warning {resolve('#{1} 2 3')}
+    assert_equal '1 2 3', assert_no_warning {resolve('1 #{2} 3')}
+    assert_equal '1 2 3', assert_no_warning {resolve('1 2 #{3}')}
+
+    assert_equal '+1 2 3', assert_no_warning {resolve('+#{1} 2 3')}
+    assert_equal '-1 2 3', assert_no_warning {resolve('-#{1} 2 3')}
+    assert_equal '/1 2 3', assert_no_warning {resolve('/#{1} 2 3')}
+
+    assert_equal '1, 2, 31', assert_no_warning {resolve('(1, #{2}, 3) + 1')}
+    assert_equal '11, 2, 3', assert_no_warning {resolve('1 + (1, #{2}, 3)')}
+
+    assert_equal 'a, b, c', assert_no_warning {resolve('selector-parse((a, #{b}, c))')}
+  end
+
+  def test_active_lazy_interpolation_deprecation_warning
+    Sass::Deprecation.allow_double_warnings do
+      assert_equal "1, 2, 3", resolve_with_lazy_interp_warning('quote((1, #{2}, 3))', '"1, 2, 3"')
+      assert_equal "1", resolve_with_lazy_interp_warning('length((1, #{2}, 3))', '"1, 2, 3"')
+      assert_equal "1, 2, 3", resolve_with_lazy_interp_warning('inspect((1, #{2}, 3))', '"1, 2, 3"')
+      assert_equal "string", resolve_with_lazy_interp_warning('type-of((1, #{2}, 3))', '"1, 2, 3"')
+
+      assert_equal "+1 2 3", resolve_with_lazy_interp_warning('quote((+#{1} 2 3))', '"+1 #{2 3}"')
+      assert_equal "/1 2 3", resolve_with_lazy_interp_warning('quote((/#{1} 2 3))', '"/1 #{2 3}"')
+      assert_equal "-1 2 3", resolve_with_lazy_interp_warning('quote((-#{1} 2 3))', '"-1 #{2 3}"')
+    end
+  end
+
+  def test_comparison_of_complex_units
+    # Tests for issue #1960
+    Sass::Deprecation.allow_double_warnings do
+      assert_warning(<<WARNING) do
+DEPRECATION WARNING on line 1 of test_comparison_of_complex_units_inline.sass:
+The result of `10 == 10px` will be `false` in future releases of Sass.
+Unitless numbers will no longer be equal to the same numbers with units.
+WARNING
+        assert_equal "true", resolve("10 == 2 * 5px")
+      end
+      assert_warning(<<WARNING) do
+DEPRECATION WARNING on line 1 of test_comparison_of_complex_units_inline.sass:
+The result of `10 == 10px*px` will be `false` in future releases of Sass.
+Unitless numbers will no longer be equal to the same numbers with units.
+WARNING
+        assert_equal "true", resolve("10 == 2px * 5px")
+      end
+    end
+
+    assert_equal "true", resolve("10px * 1px == 2px * 5px")
+    assert_equal "true", resolve("5px * 1px < 2px * 5px")
+  end
+
+  private
+
+  def resolve_with_lazy_interp_warning(str, contents = nil, environment = env)
+    contents ||= "\"#{str}\""
+    result = assert_warning(<<WARNING) {resolve(str, {}, environment)}
+DEPRECATION WARNING on line 1 of #{filename_for_test}:
+\#{} interpolation near operators will be simplified in a future version of Sass.
+To preserve the current behavior, use quotes:
+
+  unquote(#{contents})
+WARNING
+    $_sass_deprecated_interp_warnings = nil
+    result
+  end
+
+  def resolve_with_interp_warning(str, contents = nil, environment = env)
+    contents ||= "\"#{str}\""
+    assert_warning(<<WARNING) {resolve(str, {}, environment)}
+DEPRECATION WARNING on line 1 of #{filename_for_test}:
+\#{} interpolation near operators will be simplified in a future version of Sass.
+To preserve the current behavior, use quotes:
+
+  unquote(#{contents})
+
+You can use the sass-convert command to automatically fix most cases.
+WARNING
+  end
+
+  def resolve(str, opts = {}, environment = env)
+    munge_filename opts
+    val = eval(str, opts, environment)
+    assert_kind_of Sass::Script::Value::Base, val
+    val.options = opts
+    val.is_a?(Sass::Script::Value::String) ? val.value : val.to_s
+  end
+
+  def resolve_quoted(str, opts = {}, environment = env)
+    munge_filename opts
+    val = eval(str, opts, environment)
+    assert_kind_of Sass::Script::Value::Base, val
+    val.to_s
+  end
+
+  def assert_unquoted(str, opts = {}, environment = env)
+    munge_filename opts
+    val = eval(str, opts, environment)
+    assert_kind_of Sass::Script::Value::String, val
+    assert_equal :identifier, val.type
+  end
+
+  def assert_quoted(str, opts = {}, environment = env)
+    munge_filename opts
+    val = eval(str, opts, environment)
+    assert_kind_of Sass::Script::Value::String, val
+    assert_equal :string, val.type
+  end
+
+  def eval(str, opts = {}, environment = env)
+    munge_filename opts
+    Sass::Script.parse(str, opts.delete(:line) || 1,
+      opts.delete(:offset) || 0, opts).
+      perform(Sass::Environment.new(environment, opts))
+  end
+
+  def render(sass, options = {})
+    munge_filename options
+    Sass::Engine.new(sass, options).render
+  end
+
+  def env(hash = {})
+    env = Sass::Environment.new
+    hash.each {|k, v| env.set_var(k, v)}
+    env
+  end
+
+  def selector(str)
+    parser = Sass::SCSS::StaticParser.new(
+      str, filename_for_test, Sass::Importers::Filesystem.new('.'))
+    parser.parse_selector
+  end
+
+  def test_null_is_a_singleton
+    assert_same Sass::Script::Value::Null.new, Sass::Script::Value::Null.new
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/css_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/css_test.rb
new file mode 100755
index 0000000..f551256
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/css_test.rb
@@ -0,0 +1,1266 @@
+# -*- coding: utf-8 -*-
+require File.dirname(__FILE__) + '/test_helper'
+require 'sass/scss/css_parser'
+
+# These tests just test the parsing of CSS
+# (both standard and any hacks we intend to support).
+# Tests of SCSS-specific behavior go in scss_test.rb.
+class ScssCssTest < MiniTest::Test
+  include ScssTestHelper
+
+  def test_basic_scss
+    assert_parses <<SCSS
+selector {
+  property: value;
+  property2: value; }
+SCSS
+
+    assert_equal <<CSS, render('sel{p:v}')
+sel {
+  p: v; }
+CSS
+  end
+
+  def test_empty_rule
+    assert_equal "", render("#foo .bar {}")
+    assert_equal "", render(<<SCSS)
+#foo .bar {
+}
+SCSS
+  end
+
+  def test_cdo_and_cdc_ignored_at_toplevel
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bar: baz; }
+
+bar {
+  bar: baz; }
+
+baz {
+  bar: baz; }
+CSS
+foo {bar: baz}
+<!--
+bar {bar: baz}
+-->
+baz {bar: baz}
+SCSS
+  end
+
+  def test_unicode
+    assert_parses <<SCSS
+@charset "UTF-8";
+foo {
+  bar: föö bâr; }
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+@charset "UTF-8";
+foo {
+  bar: föö bâr; }
+CSS
+foo {
+  bar: föö bâr; }
+SCSS
+  end
+
+  def test_invisible_comments
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: d; }
+CSS
+foo {a: /* b; c: */ d}
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: d; }
+CSS
+foo {a /*: b; c */: d}
+SCSS
+  end
+
+  def test_crazy_comments
+    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/t040109-c17-comments-00-b.xht
+    assert_equal <<CSS, render(<<SCSS)
+/* This is a CSS comment. */
+.one {
+  color: green; }
+
+/* Another comment */
+/* The following should not be used:
+.two {color: red;} */
+.three {
+  color: green;
+  /* color: red; */ }
+
+/**
+.four {color: red;} */
+.five {
+  color: green; }
+
+/**/
+.six {
+  color: green; }
+
+/*********/
+.seven {
+  color: green; }
+
+/* a comment **/
+.eight {
+  color: green; }
+CSS
+/* This is a CSS comment. */
+.one {color: green;} /* Another comment */
+/* The following should not be used:
+.two {color: red;} */
+.three {color: green; /* color: red; */}
+/**
+.four {color: red;} */
+.five {color: green;}
+/**/
+.six {color: green;}
+/*********/
+.seven {color: green;}
+/* a comment **/
+.eight {color: green;}
+SCSS
+  end
+
+  def test_rule_comments
+    assert_parses <<SCSS
+/* Foo */
+.foo {
+  a: b; }
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+/* Foo
+ * Bar */
+.foo {
+  a: b; }
+CSS
+/* Foo
+ * Bar */.foo {
+  a: b; }
+SCSS
+  end
+
+  def test_property_comments
+    assert_parses <<SCSS
+.foo {
+  /* Foo */
+  a: b; }
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  /* Foo
+   * Bar */
+  a: b; }
+CSS
+.foo {
+  /* Foo
+   * Bar */a: b; }
+SCSS
+  end
+
+  def test_selector_comments
+    assert_equal <<CSS, render(<<SCSS)
+.foo #bar:baz(bip) {
+  a: b; }
+CSS
+.foo /* .a #foo */ #bar:baz(/* bang )*/ bip) {
+  a: b; }
+SCSS
+  end
+
+  def test_lonely_comments
+    assert_parses <<SCSS
+/* Foo
+ * Bar */
+SCSS
+    assert_parses <<SCSS
+.foo {
+  /* Foo
+   * Bar */ }
+SCSS
+  end
+
+  def test_multiple_comments
+    assert_parses <<SCSS
+/* Foo
+ * Bar */
+/* Baz
+ * Bang */
+SCSS
+    assert_parses <<SCSS
+.foo {
+  /* Foo
+   * Bar */
+  /* Baz
+   * Bang */ }
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  /* Foo Bar */
+  /* Baz Bang */ }
+CSS
+.foo {
+  /* Foo Bar *//* Baz Bang */ }
+SCSS
+  end
+
+  def test_bizarrely_formatted_comments
+    assert_parses <<SCSS
+.foo {
+  /* Foo
+Bar
+  Baz */
+  a: b; }
+SCSS
+    assert_parses <<SCSS
+.foo {
+    /* Foo
+Bar
+  Baz */
+  a: b; }
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+   /* Foo
+Bar */
+  a: b; }
+CSS
+.foo {/* Foo
+   Bar */
+  a: b; }
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+    /* Foo
+ Bar
+Baz */
+  a: b; }
+CSS
+.foo {/* Foo
+   Bar
+  Baz */
+  a: b; }
+SCSS
+  end
+
+  ## Declarations
+
+  def test_vendor_properties
+    assert_parses <<SCSS
+foo {
+  -moz-foo-bar: blat;
+  -o-flat-blang: wibble; }
+SCSS
+  end
+
+  def test_empty_declarations
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bar: baz; }
+CSS
+foo {;;;;
+  bar: baz;;;;
+  ;;}
+SCSS
+  end
+
+  def test_basic_property_types
+    assert_parses <<SCSS
+foo {
+  a: 2;
+  b: 2.3em;
+  c: 50%;
+  d: "fraz bran";
+  e: flanny-blanny-blan;
+  f: url(http://sass-lang.com);
+  g: U+ffa?;
+  h: #aabbcc; }
+SCSS
+  end
+
+  def test_functions
+    assert_parses <<SCSS
+foo {
+  a: foo-bar(12);
+  b: -foo-bar-baz(13, 14 15); }
+SCSS
+  end
+
+  def test_unary_minus
+    assert_parses <<SCSS
+foo {
+  a: -2;
+  b: -2.3em;
+  c: -50%;
+  d: -foo(bar baz); }
+SCSS
+  end
+
+  def test_operators
+    assert_parses <<SCSS
+foo {
+  a: foo bar baz;
+  b: foo, #aabbcc, -12;
+  c: 1px/2px/-3px;
+  d: foo bar, baz/bang; }
+SCSS
+  end
+
+  def test_important
+    assert_parses <<SCSS
+foo {
+  a: foo !important;
+  b: foo bar !important;
+  b: foo, bar !important; }
+SCSS
+  end
+
+  def test_initial_hyphen
+    assert_parses <<SCSS
+foo {
+  a: -moz-bar-baz;
+  b: foo -o-bar-baz; }
+SCSS
+  end
+
+  def test_ms_long_filter_syntax
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr=#c0ff3300, endColorstr=#ff000000);
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr=#c0ff3300, endColorstr=#ff000000); }
+CSS
+foo {
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr=#c0ff3300, endColorstr=#ff000000);
+  filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr=#c0ff3300, endColorstr=#ff000000); }
+SCSS
+  end
+
+  def test_ms_short_filter_syntax
+    assert_parses <<SCSS
+foo {
+  filter: alpha(opacity=20);
+  filter: alpha(opacity=20, enabled=true);
+  filter: blaznicate(foo=bar, baz=bang bip, bart=#fa4600); }
+SCSS
+  end
+
+  def test_declaration_hacks
+    assert_parses <<SCSS
+foo {
+  _name: val;
+  *name: val;
+  :name: val;
+  .name: val;
+  #name: val;
+  name/**/: val;
+  name/*\\**/: val;
+  name: val; }
+SCSS
+  end
+
+  def test_trailing_hash_hack
+    assert_parses <<SCSS
+foo {
+  foo: bar;
+  #baz: bang;
+  #bip: bop; }
+SCSS
+  end
+
+  def test_zero_arg_functions
+    assert_parses <<SCSS
+foo {
+  a: foo();
+  b: bar baz-bang() bip; }
+SCSS
+  end
+
+  def test_expression_function
+    assert_parses <<SCSS
+foo {
+  a: 12px expression(1 + (3 / Foo.bar("baz" + "bang") + function() {return 12;}) % 12); }
+SCSS
+  end
+
+  def test_calc_function
+    assert_parses <<SCSS
+foo {
+  a: 12px calc(100%/3 - 2*1em - 2*1px);
+  b: 12px -moz-calc(100%/3 - 2*1em - 2*1px);
+  b: 12px -webkit-calc(100%/3 - 2*1em - 2*1px);
+  b: 12px -foobar-calc(100%/3 - 2*1em - 2*1px); }
+SCSS
+  end
+
+  def test_element_function
+    assert_parses <<SCSS
+foo {
+  a: -moz-element(#foo);
+  b: -webkit-element(#foo);
+  b: -foobar-element(#foo); }
+SCSS
+  end
+
+  def test_unary_ops
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: -0.5em;
+  b: +0.5em;
+  c: -foo(12px);
+  d: +foo(12px); }
+CSS
+foo {
+  a: -0.5em;
+  b: +0.5em;
+  c: -foo(12px);
+  d: +foo(12px); }
+SCSS
+  end
+
+  def test_css_string_escapes
+    assert_parses <<SCSS
+foo {
+  a: "\\foo bar";
+  b: "foo\\ bar";
+  c: "\\2022 \\0020";
+  d: "foo\\\\bar";
+  e: "foo\\"'bar"; }
+SCSS
+  end
+
+  def test_css_ident_escapes
+    assert_parses <<SCSS
+foo {
+  a: \\foo bar;
+  b: foo\\ bar;
+  c: \\2022 \\0020;
+  d: foo\\\\bar;
+  e: foo\\"\\'bar; }
+SCSS
+  end
+
+  ## Directives
+
+  def test_namespace_directive
+    assert_parses '@namespace "http://www.w3.org/Profiles/xhtml1-strict";'
+    assert_parses '@namespace url(http://www.w3.org/Profiles/xhtml1-strict);'
+    assert_parses '@namespace html url("http://www.w3.org/Profiles/xhtml1-strict");'
+  end
+
+  def test_media_directive
+    assert_parses <<SCSS
+@media all {
+  rule1 {
+    prop: val; }
+
+  rule2 {
+    prop: val; } }
+SCSS
+    assert_parses <<SCSS
+@media screen, print {
+  rule1 {
+    prop: val; }
+
+  rule2 {
+    prop: val; } }
+SCSS
+  end
+
+  def test_media_directive_with_keywords
+    assert_parses <<SCSS
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  a: b; }
+SCSS
+    assert_parses <<SCSS
+@media only screen, print and (foo: 0px) and (bar: flam(12px solid)) {
+  a: b; }
+SCSS
+  end
+
+  def test_import_directive
+    assert_parses '@import "foo.css";'
+    assert_parses '@import url("foo.css");'
+    assert_parses "@import url('foo.css');"
+    assert_parses '@import url(foo.css);'
+
+    assert_equal <<CSS, render(<<SCSS)
+@import "foo.css";
+CSS
+@import 'foo.css';
+SCSS
+  end
+
+  def test_import_directive_with_backslash_newline
+    assert_equal <<CSS, render(<<SCSS)
+@import "foobar.css";
+CSS
+@import "foo\\
+bar.css";
+SCSS
+  end
+
+  def test_string_import_directive_with_media
+    assert_parses '@import "foo.css" screen;'
+    assert_parses '@import "foo.css" screen, print;'
+    assert_parses '@import "foo.css" screen, print and (foo: 0);'
+    assert_parses '@import "foo.css" screen, only print, screen and (foo: 0);'
+  end
+
+  def test_url_import_directive_with_media
+    assert_parses '@import url("foo.css") screen;'
+    assert_parses '@import url("foo.css") screen, print;'
+    assert_parses '@import url("foo.css") screen, print and (foo: 0);'
+    assert_parses '@import url("foo.css") screen, only print, screen and (foo: 0);'
+  end
+
+  def test_page_directive
+    assert_parses <<SCSS
+@page {
+  prop1: val;
+  prop2: val; }
+SCSS
+    assert_parses <<SCSS
+@page flap {
+  prop1: val;
+  prop2: val; }
+SCSS
+    assert_parses <<SCSS
+@page :first {
+  prop1: val;
+  prop2: val; }
+SCSS
+    assert_parses <<SCSS
+@page flap:first {
+  prop1: val;
+  prop2: val; }
+SCSS
+  end
+
+  def test_blockless_directive_without_semicolon
+    assert_equal "@foo \"bar\";\n", render('@foo "bar"')
+  end
+
+  def test_directive_with_lots_of_whitespace
+    assert_equal "@foo \"bar\";\n", render('@foo    "bar"  ;')
+  end
+
+  def test_empty_blockless_directive
+    assert_parses "@foo;"
+  end
+
+  def test_multiple_blockless_directives
+    assert_parses <<SCSS
+@foo bar;
+@bar baz;
+SCSS
+  end
+
+  def test_empty_block_directive
+    assert_parses "@foo {}"
+    assert_equal "@foo {}\n", render(<<SCSS)
+@foo {
+}
+SCSS
+  end
+
+  def test_multiple_block_directives
+    assert_parses <<SCSS
+@foo bar {
+  a: b; }
+@bar baz {
+  c: d; }
+SCSS
+  end
+
+  def test_block_directive_with_rule_and_property
+    assert_parses <<SCSS
+@foo {
+  rule {
+    a: b; }
+
+  a: b; }
+SCSS
+  end
+
+  def test_block_directive_with_semicolon
+    assert_equal <<CSS, render(<<SCSS)
+@foo {
+  a: b; }
+@bar {
+  a: b; }
+CSS
+@foo {a:b};
+@bar {a:b};
+SCSS
+  end
+
+  def test_moz_document_directive
+    assert_equal <<CSS, render(<<SCSS)
+@-moz-document url(http://www.w3.org/),
+               url-prefix(http://www.w3.org/Style/),
+               domain(mozilla.org),
+               regexp("^https:.*") {
+  .foo {
+    a: b; } }
+CSS
+@-moz-document url(http://www.w3.org/),
+               url-prefix(http://www.w3.org/Style/),
+               domain(mozilla.org),
+               regexp("^https:.*") {
+  .foo {a: b}
+}
+SCSS
+  end
+
+  def test_supports
+    assert_equal <<CSS, render(<<SCSS)
+@supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
+  .foo {
+    a: b; } }
+@supports (a: b) {
+  .foo {
+    a: b; } }
+CSS
+@supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
+  .foo {
+    a: b;
+  }
+}
+
+@supports (a: b) {
+  .foo {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  def test_supports_with_prefix
+    assert_equal <<CSS, render(<<SCSS)
+@-prefix-supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
+  .foo {
+    a: b; } }
+CSS
+@-prefix-supports (((a: b) and (c: d)) or (not (d: e))) and ((not (f: g)) or (not ((h: i) and (j: k)))) {
+  .foo {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  def test_supports_allows_similar_operators_without_parens
+    assert_equal <<CSS, render(<<SCSS)
+@supports (a: b) and (c: d) and (e: f) {
+  .foo {
+    a: b; } }
+@supports (a: b) or (c: d) or (e: f) {
+  .foo {
+    a: b; } }
+CSS
+@supports (a: b) and (c: d) and (e: f) {
+  .foo {
+    a: b;
+  }
+}
+
+@supports (a: b) or (c: d) or (e: f) {
+  .foo {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  def test_keyframes
+    assert_equal <<CSS, render(<<SCSS)
+@keyframes identifier {
+  0% {
+    top: 0;
+    left: 0; }
+  30% {
+    top: 50px; }
+  68%, 72% {
+    left: 50px; }
+  100% {
+    top: 100px;
+    left: 100%; } }
+CSS
+@keyframes identifier {
+  0% {top: 0; left: 0}
+  30% {top: 50px}
+  68%, 72% {left: 50px}
+  100% {top: 100px; left: 100%}
+}
+SCSS
+  end
+
+  def test_keyframes_with_empty_rules
+    assert_equal <<CSS, render(<<SCSS)
+@keyframes identifier {
+  50% {
+    background-color: black; } }
+CSS
+@keyframes identifier {
+  0% {}
+  50% {background-color: black}
+  100% {}
+}
+SCSS
+  end
+
+  def test_keyframes_with_custom_identifiers
+    assert_equal <<CSS, render(<<SCSS)
+@-skrollr-keyframes identifier {
+  center-top {
+    left: 100%; }
+  top-bottom {
+    left: 0%; } }
+CSS
+@-skrollr-keyframes identifier {
+  center-top {
+    left: 100%;
+  }
+
+  top-bottom {
+    left: 0%;
+  }
+}
+
+SCSS
+  end
+
+  ## Selectors
+
+  # Taken from http://dev.w3.org/csswg/selectors4/#overview
+  def test_summarized_selectors_with_element
+    assert_selector_parses('*')
+    assert_selector_parses('E')
+    assert_selector_parses('E:not(s)')
+    assert_selector_parses('E:not(s1, s2)')
+    assert_selector_parses('E:matches(s1, s2)')
+    assert_selector_parses('E:has(s1, s2)')
+    assert_selector_parses('E:has(> s1, > s2)')
+    assert_selector_parses('E.warning')
+    assert_selector_parses('E#myid')
+    assert_selector_parses('E[foo]')
+    assert_selector_parses('E[foo="bar"]')
+    assert_selector_parses('E[foo="bar" i]')
+    assert_selector_parses('E[foo~="bar"]')
+    assert_selector_parses('E[foo^="bar"]')
+    assert_selector_parses('E[foo$="bar"]')
+    assert_selector_parses('E[foo*="bar"]')
+    assert_selector_parses('E[foo|="en"]')
+    assert_selector_parses('E:dir(ltr)')
+    assert_selector_parses('E:lang(fr)')
+    assert_selector_parses('E:lang(zh, *-hant)')
+    assert_selector_parses('E:any-link')
+    assert_selector_parses('E:link')
+    assert_selector_parses('E:visited')
+    assert_selector_parses('E:local-link')
+    assert_selector_parses('E:local-link(0)')
+    assert_selector_parses('E:target')
+    assert_selector_parses('E:scope')
+    assert_selector_parses('E:current')
+    assert_selector_parses('E:current(s)')
+    assert_selector_parses('E:past')
+    assert_selector_parses('E:future')
+    assert_selector_parses('E:active')
+    assert_selector_parses('E:hover')
+    assert_selector_parses('E:focus')
+    assert_selector_parses('E:enabled')
+    assert_selector_parses('E:disabled')
+    assert_selector_parses('E:checked')
+    assert_selector_parses('E:indeterminate')
+    assert_selector_parses('E:default')
+    assert_selector_parses('E:in-range')
+    assert_selector_parses('E:out-of-range')
+    assert_selector_parses('E:required')
+    assert_selector_parses('E:optional')
+    assert_selector_parses('E:read-only')
+    assert_selector_parses('E:read-write')
+    assert_selector_parses('E:root')
+    assert_selector_parses('E:empty')
+    assert_selector_parses('E:first-child')
+    assert_selector_parses('E:nth-child(n)')
+    assert_selector_parses('E:last-child')
+    assert_selector_parses('E:nth-last-child(n)')
+    assert_selector_parses('E:only-child')
+    assert_selector_parses('E:first-of-type')
+    assert_selector_parses('E:nth-of-type(n)')
+    assert_selector_parses('E:last-of-type')
+    assert_selector_parses('E:nth-last-of-type(n)')
+    assert_selector_parses('E:only-of-type')
+    assert_selector_parses('E:nth-child(n of selector)')
+    assert_selector_parses('E:nth-last-child(n of selector)')
+    assert_selector_parses('E:nth-child(n)')
+    assert_selector_parses('E:nth-last-child(n)')
+    assert_selector_parses('E F')
+    assert_selector_parses('E > F')
+    assert_selector_parses('E + F')
+    assert_selector_parses('E ~ F')
+    silence_warnings {assert_selector_parses('E /foo/ F')}
+    silence_warnings {assert_selector_parses('E! > F')}
+
+    silence_warnings {assert_selector_parses('E /ns|foo/ F')}
+
+    # From http://dev.w3.org/csswg/css-scoping-1/
+    assert_selector_parses('E:host(s)')
+    assert_selector_parses('E:host-context(s)')
+  end
+
+  # Taken from http://dev.w3.org/csswg/selectors4/#overview, but without element
+  # names.
+  def test_more_summarized_selectors
+    assert_selector_parses(':not(s)')
+    assert_selector_parses(':not(s1, s2)')
+    assert_selector_parses(':matches(s1, s2)')
+    assert_selector_parses(':has(s1, s2)')
+    assert_selector_parses(':has(> s1, > s2)')
+    assert_selector_parses('.warning')
+    assert_selector_parses('#myid')
+    assert_selector_parses('[foo]')
+    assert_selector_parses('[foo="bar"]')
+    assert_selector_parses('[foo="bar" i]')
+    assert_selector_parses('[foo~="bar"]')
+    assert_selector_parses('[foo^="bar"]')
+    assert_selector_parses('[foo$="bar"]')
+    assert_selector_parses('[foo*="bar"]')
+    assert_selector_parses('[foo|="en"]')
+    assert_selector_parses(':dir(ltr)')
+    assert_selector_parses(':lang(fr)')
+    assert_selector_parses(':lang(zh, *-hant)')
+    assert_selector_parses(':any-link')
+    assert_selector_parses(':link')
+    assert_selector_parses(':visited')
+    assert_selector_parses(':local-link')
+    assert_selector_parses(':local-link(0)')
+    assert_selector_parses(':target')
+    assert_selector_parses(':scope')
+    assert_selector_parses(':current')
+    assert_selector_parses(':current(s)')
+    assert_selector_parses(':past')
+    assert_selector_parses(':future')
+    assert_selector_parses(':active')
+    assert_selector_parses(':hover')
+    assert_selector_parses(':focus')
+    assert_selector_parses(':enabled')
+    assert_selector_parses(':disabled')
+    assert_selector_parses(':checked')
+    assert_selector_parses(':indeterminate')
+    assert_selector_parses(':default')
+    assert_selector_parses(':in-range')
+    assert_selector_parses(':out-of-range')
+    assert_selector_parses(':required')
+    assert_selector_parses(':optional')
+    assert_selector_parses(':read-only')
+    assert_selector_parses(':read-write')
+    assert_selector_parses(':root')
+    assert_selector_parses(':empty')
+    assert_selector_parses(':first-child')
+    assert_selector_parses(':nth-child(n)')
+    assert_selector_parses(':last-child')
+    assert_selector_parses(':nth-last-child(n)')
+    assert_selector_parses(':only-child')
+    assert_selector_parses(':first-of-type')
+    assert_selector_parses(':nth-of-type(n)')
+    assert_selector_parses(':last-of-type')
+    assert_selector_parses(':nth-last-of-type(n)')
+    assert_selector_parses(':only-of-type')
+    assert_selector_parses(':nth-child(n of selector)')
+    assert_selector_parses(':nth-last-child(n of selector)')
+    assert_selector_parses(':nth-child(n)')
+    assert_selector_parses(':nth-last-child(n)')
+
+    # From http://dev.w3.org/csswg/css-scoping-1/
+    assert_selector_parses(':host(s)')
+    assert_selector_parses(':host-context(s)')
+  end
+
+  def test_attribute_selectors_with_identifiers
+    assert_selector_parses('[foo~=bar]')
+    assert_selector_parses('[foo^=bar]')
+    assert_selector_parses('[foo$=bar]')
+    assert_selector_parses('[foo*=bar]')
+    assert_selector_parses('[foo|=en]')
+  end
+
+  def test_nth_selectors
+    assert_selector_parses(':nth-child(-n)')
+    assert_selector_parses(':nth-child(+n)')
+
+    assert_selector_parses(':nth-child(even)')
+    assert_selector_parses(':nth-child(odd)')
+
+    assert_selector_parses(':nth-child(50)')
+    assert_selector_parses(':nth-child(-50)')
+    assert_selector_parses(':nth-child(+50)')
+
+    assert_selector_parses(':nth-child(2n+3)')
+    assert_selector_parses(':nth-child(2n-3)')
+    assert_selector_parses(':nth-child(+2n-3)')
+    assert_selector_parses(':nth-child(-2n+3)')
+    assert_selector_parses(':nth-child(-2n+ 3)')
+
+    assert_equal(<<CSS, render(<<SCSS))
+:nth-child(2n + 3) {
+  a: b; }
+CSS
+:nth-child( 2n + 3 ) {
+  a: b; }
+SCSS
+  end
+
+  def test_selectors_containing_selectors
+    assert_selector_can_contain_selectors(':not(<sel>)')
+    assert_selector_can_contain_selectors(':current(<sel>)')
+    assert_selector_can_contain_selectors(':nth-child(n of <sel>)')
+    assert_selector_can_contain_selectors(':nth-last-child(n of <sel>)')
+    assert_selector_can_contain_selectors(':-moz-any(<sel>)')
+    assert_selector_can_contain_selectors(':has(<sel>)')
+    assert_selector_can_contain_selectors(':has(+ <sel>)')
+    assert_selector_can_contain_selectors(':host(<sel>)')
+    assert_selector_can_contain_selectors(':host-context(<sel>)')
+  end
+
+  def assert_selector_can_contain_selectors(sel)
+    try = lambda {|subsel| assert_selector_parses(sel.gsub('<sel>', subsel))}
+
+    try['foo|bar']
+    try['*|bar']
+
+    try['foo|*']
+    try['*|*']
+
+    try['#blah']
+    try['.blah']
+
+    try['[foo]']
+    try['[foo^="bar"]']
+    try['[baz|foo~="bar"]']
+
+    try[':hover']
+    try[':nth-child(2n + 3)']
+
+    try['h1, h2, h3']
+    try['#foo, bar, [baz]']
+
+    # Not technically allowed for most selectors, but what the heck
+    try[':not(#foo)']
+    try['a#foo.bar']
+    try['#foo .bar > baz']
+  end
+
+  def test_namespaced_selectors
+    assert_selector_parses('foo|E')
+    assert_selector_parses('*|E')
+    assert_selector_parses('foo|*')
+    assert_selector_parses('*|*')
+  end
+
+  def test_namespaced_attribute_selectors
+    assert_selector_parses('[foo|bar=baz]')
+    assert_selector_parses('[*|bar=baz]')
+    assert_selector_parses('[foo|bar|=baz]')
+  end
+
+  def test_comma_selectors
+    assert_selector_parses('E, F')
+    assert_selector_parses('E F, G H')
+    assert_selector_parses('E > F, G > H')
+  end
+
+  def test_selectors_with_newlines
+    assert_selector_parses("E,\nF")
+    assert_selector_parses("E\nF")
+    assert_selector_parses("E, F\nG, H")
+  end
+
+  def test_expression_fallback_selectors
+    assert_directive_parses('0%')
+    assert_directive_parses('60%')
+    assert_directive_parses('100%')
+    assert_directive_parses('12px')
+    assert_directive_parses('"foo"')
+  end
+
+  def test_functional_pseudo_selectors
+    assert_selector_parses(':foo("bar")')
+    assert_selector_parses(':foo(bar)')
+    assert_selector_parses(':foo(12px)')
+    assert_selector_parses(':foo(+)')
+    assert_selector_parses(':foo(-)')
+    assert_selector_parses(':foo(+"bar")')
+    assert_selector_parses(':foo(-++--baz-"bar"12px)')
+  end
+
+  def test_selector_hacks
+    assert_selector_parses('> E')
+    assert_selector_parses('+ E')
+    assert_selector_parses('~ E')
+    assert_selector_parses('> > E')
+    assert_equal <<CSS, render(<<SCSS)
+> > E {
+  a: b; }
+CSS
+>> E {
+  a: b; }
+SCSS
+
+    assert_selector_parses('E*')
+    assert_selector_parses('E*.foo')
+    assert_selector_parses('E*:hover')
+  end
+
+  def test_spaceless_combo_selectors
+    assert_equal "E > F {\n  a: b; }\n", render("E>F { a: b;} ")
+    assert_equal "E ~ F {\n  a: b; }\n", render("E~F { a: b;} ")
+    assert_equal "E + F {\n  a: b; }\n", render("E+F { a: b;} ")
+  end
+
+  def test_escapes_in_selectors
+    assert_selector_parses('.\!foo')
+    assert_selector_parses('.\66 foo')
+    assert_selector_parses('.\21 foo')
+  end
+
+  def test_subject_selector_deprecation
+    assert_warning(<<WARNING) {render(".foo .bar! .baz {a: b}")}
+DEPRECATION WARNING on line 1, column 1:
+The subject selector operator "!" is deprecated and will be removed in a future release.
+This operator has been replaced by ":has()" in the CSS spec.
+For example: .foo .bar:has(.baz)
+WARNING
+
+    assert_warning(<<WARNING) {render(".foo .bar! > .baz {a: b}")}
+DEPRECATION WARNING on line 1, column 1:
+The subject selector operator "!" is deprecated and will be removed in a future release.
+This operator has been replaced by ":has()" in the CSS spec.
+For example: .foo .bar:has(> .baz)
+WARNING
+
+    assert_warning(<<WARNING) {render(".foo .bar! {a: b}")}
+DEPRECATION WARNING on line 1, column 1:
+The subject selector operator "!" is deprecated and will be removed in a future release.
+This operator has been replaced by ":has()" in the CSS spec.
+For example: .foo .bar
+WARNING
+  end
+
+  ## Errors
+
+  def test_invalid_directives
+    assert_not_parses("identifier", '@<err> import "foo";')
+    assert_not_parses("identifier", '@<err>12 "foo";')
+  end
+
+  def test_invalid_classes
+    assert_not_parses("class name", 'p.<err> foo {a: b}')
+    assert_not_parses("class name", 'p.<err>1foo {a: b}')
+  end
+
+  def test_invalid_ids
+    assert_not_parses("id name", 'p#<err> foo {a: b}')
+  end
+
+  def test_no_properties_at_toplevel
+    assert_not_parses('pseudoclass or pseudoelement', 'a:<err> b;')
+  end
+
+  def test_no_scss_directives
+    assert_parses('@import "foo.sass";')
+    assert_parses <<SCSS
+@mixin foo {
+  a: b; }
+SCSS
+  end
+
+  def test_no_variables
+    assert_not_parses("selector or at-rule", "<err>$var = 12;")
+    assert_not_parses('"}"', "foo { <err>!var = 12; }")
+  end
+
+  def test_no_parent_selectors
+    assert_not_parses('"{"', "foo <err>&.bar {a: b}")
+  end
+
+  def test_no_selector_interpolation
+    assert_not_parses('"{"', 'foo <err>#{"bar"}.baz {a: b}')
+  end
+
+  def test_no_prop_name_interpolation
+    assert_not_parses('":"', 'foo {a<err>#{"bar"}baz: b}')
+  end
+
+  def test_no_prop_val_interpolation
+    assert_not_parses('"}"', 'foo {a: b <err>#{"bar"} c}')
+  end
+
+  def test_no_string_interpolation
+    assert_parses <<SCSS
+foo {
+  a: "bang \#{1 +    " bar "} bip"; }
+SCSS
+  end
+
+  def test_no_sass_script_values
+    assert_not_parses('"}"', 'foo {a: b <err>* c}')
+  end
+
+  def test_no_nested_rules
+    assert_not_parses('":"', 'foo {bar <err>{a: b}}')
+    assert_not_parses('"}"', 'foo {<err>[bar=baz] {a: b}}')
+  end
+
+  def test_no_nested_properties
+    assert_not_parses('expression (e.g. 1px, bold)', 'foo {bar: <err>{a: b}}')
+    assert_not_parses('expression (e.g. 1px, bold)', 'foo {bar: bang <err>{a: b}}')
+  end
+
+  def test_no_nested_directives
+    assert_not_parses('"}"', 'foo {<err>@bar {a: b}}')
+  end
+
+  def test_error_with_windows_newlines
+    render <<SCSS
+foo {bar}\r
+baz {a: b}
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "foo {bar": expected ":", was "}"', e.message
+    assert_equal 1, e.sass_line
+  end
+
+  def test_newline_in_property_value
+    assert_equal(<<CSS, render(<<SCSS))
+.foo {
+  bar: "bazbang"; }
+CSS
+.foo {
+  bar: "baz\\
+bang";
+}
+SCSS
+  end
+
+  ## Regressions
+
+  def test_very_long_comment_doesnt_take_forever
+    string = 'asdf' * (100000)
+    assert_equal(<<CSS, render(<<SCSS))
+/*
+  #{string}
+*/
+CSS
+/*
+  #{string}
+*/
+SCSS
+  end
+
+  def test_long_unclosed_comment_doesnt_take_forever
+    assert_raise_message(Sass::SyntaxError,
+      'Invalid CSS after "/*": expected "/", was "//*************..."') {render(<<SCSS)}
+/*
+//**************************************************************************
+SCSS
+  end
+
+  def test_double_space_string
+    assert_equal(<<CSS, render(<<SCSS))
+.a {
+  content: "  a"; }
+CSS
+.a {
+  content: "  a";
+}
+SCSS
+  end
+
+  def test_very_long_number_with_important_doesnt_take_forever
+    assert_equal(<<CSS, render(<<SCSS))
+.foo {
+  width: 97.916666666666666666666666666667% !important; }
+CSS
+.foo {
+  width: 97.916666666666666666666666666667% !important;
+}
+SCSS
+  end
+
+  def test_selector_without_closing_bracket
+    assert_not_parses('"]"', "foo[bar <err>{a: b}")
+  end
+
+  def test_closing_line_comment_end_with_compact_output
+    assert_equal(<<CSS, render(<<SCSS, :style => :compact))
+/* foo */
+bar { baz: bang; }
+CSS
+/*
+ * foo
+ */
+bar {baz: bang}
+SCSS
+  end
+
+  def test_single_line_comment_within_multiline_comment
+    assert_equal(<<CSS, render(<<SCSS))
+body {
+  /*
+  //comment here
+  */ }
+CSS
+body {
+  /*
+  //comment here
+  */
+}
+SCSS
+  end
+
+  def test_malformed_media
+    render <<SCSS
+@media {
+  margin: 0;
+}
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "@media ": expected media query (e.g. print, screen, print and screen), was "{"', e.message
+    assert_equal 1, e.sass_line
+  end
+
+  private
+
+  def assert_selector_parses(selector)
+    assert_parses <<SCSS
+#{selector} {
+  a: b; }
+SCSS
+
+    assert_parses <<SCSS
+:not(#{selector}) {
+  a: b; }
+SCSS
+  end
+
+  def assert_directive_parses(param)
+    assert_parses <<SCSS
+@unknown #{param} {
+  a: b; }
+SCSS
+  end
+
+  def render(scss, options = {})
+    tree = Sass::SCSS::CssParser.new(scss, options[:filename], nil).parse
+    tree.options = Sass::Engine::DEFAULT_OPTIONS.merge(options)
+    tree.render
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/rx_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/rx_test.rb
new file mode 100755
index 0000000..d923d85
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/rx_test.rb
@@ -0,0 +1,159 @@
+# -*- coding: utf-8 -*-
+require File.dirname(__FILE__) + '/../../test_helper'
+require 'sass/engine'
+
+class ScssRxTest < MiniTest::Test
+  include Sass::SCSS::RX
+
+  def test_identifiers
+    assert_match IDENT, "foo"
+    assert_match IDENT, "\xC3\xBFoo" # Initial char can be nonascii
+    assert_match IDENT, "\\123abcoo" # Initial char can be unicode escape
+    assert_match IDENT, "\\f oo" # Unicode escapes can be followed by whitespace
+    assert_match IDENT, "\\fa\too"
+    assert_match IDENT, "\\ff2\roo"
+    assert_match IDENT, "\\f13a\foo"
+    assert_match IDENT, "\\f13abcoo"
+    assert_match IDENT, "\\ oo" # Initial char can be a plain escape as well
+    assert_match IDENT, "\\~oo"
+    assert_match IDENT, "\\\\oo"
+    assert_match IDENT, "\\{oo"
+    assert_match IDENT, "\\\xC3\xBFoo"
+    assert_match IDENT, "-foo" # Can put a - before anything
+    assert_match IDENT, "-\xC3\xBFoo"
+    assert_match IDENT, "-\\f oo"
+    assert_match IDENT, "_foo" # Can put a _ before anything
+    assert_match IDENT, "_\xC3\xBFoo"
+    assert_match IDENT, "_\\f oo"
+    assert_match IDENT, "--foo" # "Custom" identifier
+
+    assert_match IDENT, "foo-bar"
+    assert_match IDENT, "f012-23"
+    assert_match IDENT, "foo_-_bar"
+    assert_match IDENT, "f012_23"
+
+    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/escapes-003.xht
+    assert_match IDENT, "c\\lass"
+    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/escapes-004.xht
+    assert_match IDENT, "c\\00006Cas\\000073"
+    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-001.xht
+    assert_match IDENT, "IdE6n-3t0_6"
+    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-006.xht
+    assert_match IDENT, "\\6000ident"
+    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-007.xht
+    assert_match IDENT, "iden\\6000t\\6000"
+    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-013.xht
+    assert_match IDENT, "\\-ident"
+  end
+
+  def test_underscores_in_identifiers
+    assert_match IDENT, "foo_bar"
+    assert_match IDENT, "_\xC3\xBFfoo"
+    assert_match IDENT, "__foo"
+    assert_match IDENT, "_1foo"
+    assert_match IDENT, "-_foo"
+    assert_match IDENT, "_-foo"
+  end
+
+  def test_invalid_identifiers
+    assert_no_match IDENT, ""
+    assert_no_match IDENT, "1foo"
+    assert_no_match IDENT, "-1foo"
+    assert_no_match IDENT, "foo bar"
+    assert_no_match IDENT, "foo~bar"
+
+    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/escapes-008.xht
+    assert_no_match IDENT, "c\\06C  ass"
+    assert_no_match IDENT, "back\\67\n round"
+  end
+
+  def test_double_quote_strings
+    assert_match STRING, '"foo bar"'
+    assert_match STRING, '"foo\\\nbar"'
+    assert_match STRING, "\"\\\"\""
+    assert_match STRING, '"\t !#$%&(-~()*+,-./0123456789~"'
+  end
+
+  def test_single_quote_strings
+    assert_match STRING, "'foo bar'"
+    assert_match STRING, "'foo\\\nbar'"
+    assert_match STRING, "'\\''"
+    assert_match STRING, "'\t !#\$%&(-~()*+,-./0123456789~'"
+  end
+
+  def test_invalid_strings
+    assert_no_match STRING, "\"foo\nbar\""
+    assert_no_match STRING, "\"foo\"bar\""
+    assert_no_match STRING, "'foo\nbar'"
+    assert_no_match STRING, "'foo'bar'"
+  end
+
+  def test_uri
+    assert_match URI, 'url("foo bar)")'
+    assert_match URI, "url('foo bar)')"
+    assert_match URI, 'url( "foo bar)" )'
+    assert_match URI, "url(#\\%&**+,-./0123456789~)"
+  end
+
+  def test_invalid_uri
+    assert_no_match URI, 'url(foo)bar)'
+  end
+
+  def test_unicode_range
+    assert_match UNICODERANGE, 'U+00-Ff'
+    assert_match UNICODERANGE, 'u+980-9FF'
+    assert_match UNICODERANGE, 'U+9aF??'
+    assert_match UNICODERANGE, 'U+??'
+  end
+
+  def test_escape_empty_ident
+    assert_equal "", Sass::SCSS::RX.escape_ident("")
+  end
+
+  def test_escape_just_prefix_ident
+    assert_equal "\\-", Sass::SCSS::RX.escape_ident("-")
+    assert_equal "\\_", Sass::SCSS::RX.escape_ident("_")
+  end
+
+  def test_escape_plain_ident
+    assert_equal "foo", Sass::SCSS::RX.escape_ident("foo")
+    assert_equal "foo-1bar", Sass::SCSS::RX.escape_ident("foo-1bar")
+    assert_equal "-foo-bar", Sass::SCSS::RX.escape_ident("-foo-bar")
+    assert_equal "f2oo_bar", Sass::SCSS::RX.escape_ident("f2oo_bar")
+    assert_equal "_foo_bar", Sass::SCSS::RX.escape_ident("_foo_bar")
+  end
+
+  def test_escape_initial_funky_ident
+    assert_equal "\\000035foo", Sass::SCSS::RX.escape_ident("5foo")
+    assert_equal "-\\000035foo", Sass::SCSS::RX.escape_ident("-5foo")
+    assert_equal "_\\000035foo", Sass::SCSS::RX.escape_ident("_5foo")
+
+    assert_equal "\\&foo", Sass::SCSS::RX.escape_ident("&foo")
+    assert_equal "-\\&foo", Sass::SCSS::RX.escape_ident("-&foo")
+
+    assert_equal "-\\ foo", Sass::SCSS::RX.escape_ident("- foo")
+  end
+
+  def test_escape_mid_funky_ident
+    assert_equal "foo\\&bar", Sass::SCSS::RX.escape_ident("foo&bar")
+    assert_equal "foo\\ \\ bar", Sass::SCSS::RX.escape_ident("foo  bar")
+    assert_equal "foo\\00007fbar", Sass::SCSS::RX.escape_ident("foo\177bar")
+  end
+
+  def test_no_static_hyphenated_units
+    assert_no_match STATIC_VALUE, "20px-20px"
+  end
+
+  private
+
+  def assert_match(rx, str)
+    refute_nil(match = rx.match(str))
+    assert_equal str.size, match[0].size
+  end
+
+  def assert_no_match(rx, str)
+    match = rx.match(str)
+    refute_equal str.size, match && match[0].size
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/scss_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/scss_test.rb
new file mode 100755
index 0000000..2d07dda
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/scss_test.rb
@@ -0,0 +1,4238 @@
+# -*- coding: utf-8 -*-
+require File.dirname(__FILE__) + '/test_helper'
+
+class ScssTest < MiniTest::Test
+  include ScssTestHelper
+
+  ## One-Line Comments
+
+  def test_one_line_comments
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  baz: bang; }
+CSS
+.foo {// bar: baz;}
+  baz: bang; //}
+}
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+.foo bar[val="//"] {
+  baz: bang; }
+CSS
+.foo bar[val="//"] {
+  baz: bang; //}
+}
+SCSS
+  end
+
+  ## Script
+
+  def test_variables
+    assert_equal <<CSS, render(<<SCSS)
+blat {
+  a: foo; }
+CSS
+$var: foo;
+
+blat {a: $var}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: 2;
+  b: 6; }
+CSS
+foo {
+  $var: 2;
+  $another-var: 4;
+  a: $var;
+  b: $var + $another-var;}
+SCSS
+  end
+
+  def test_unicode_variables
+    assert_equal <<CSS, render(<<SCSS)
+blat {
+  a: foo; }
+CSS
+$vär: foo;
+
+blat {a: $vär}
+SCSS
+  end
+
+  def test_guard_assign
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: 1; }
+CSS
+$var: 1;
+$var: 2 !default;
+
+foo {a: $var}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: 2; }
+CSS
+$var: 2 !default;
+
+foo {a: $var}
+SCSS
+  end
+
+  def test_sass_script
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: 3;
+  b: -1;
+  c: foobar;
+  d: 12px; }
+CSS
+foo {
+  a: 1 + 2;
+  b: 1 - 2;
+  c: foo + bar;
+  d: floor(12.3px); }
+SCSS
+  end
+
+  def test_debug_directive
+    assert_warning "test_debug_directive_inline.scss:2 DEBUG: hello world!" do
+      assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: b; }
+
+bar {
+  c: d; }
+CSS
+foo {a: b}
+@debug "hello world!";
+bar {c: d}
+SCSS
+    end
+  end
+
+  def test_error_directive
+    assert_raise_message(Sass::SyntaxError, "hello world!") {render(<<SCSS)}
+foo {a: b}
+@error "hello world!";
+bar {c: d}
+SCSS
+  end
+
+  def test_warn_directive
+    expected_warning = <<EXPECTATION
+WARNING: this is a warning
+         on line 2 of test_warn_directive_inline.scss
+
+WARNING: this is a mixin
+         on line 1 of test_warn_directive_inline.scss, in `foo'
+         from line 3 of test_warn_directive_inline.scss
+EXPECTATION
+    assert_warning expected_warning do
+      assert_equal <<CSS, render(<<SCSS)
+bar {
+  c: d; }
+CSS
+@mixin foo { @warn "this is a mixin";}
+@warn "this is a warning";
+bar {c: d; @include foo;}
+SCSS
+    end
+  end
+
+  def test_for_directive
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  a: 2;
+  a: 3;
+  a: 4; }
+CSS
+.foo {
+  @for $var from 1 to 5 {a: $var;}
+}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  a: 2;
+  a: 3;
+  a: 4;
+  a: 5; }
+CSS
+.foo {
+  @for $var from 1 through 5 {a: $var;}
+}
+SCSS
+  end
+
+  def test_for_directive_with_same_start_and_end
+    assert_equal <<CSS, render(<<SCSS)
+CSS
+.foo {
+  @for $var from 1 to 1 {a: $var;}
+}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1; }
+CSS
+.foo {
+  @for $var from 1 through 1 {a: $var;}
+}
+SCSS
+  end
+
+  def test_decrementing_estfor_directive
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 5;
+  a: 4;
+  a: 3;
+  a: 2;
+  a: 1; }
+CSS
+.foo {
+  @for $var from 5 through 1 {a: $var;}
+}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 5;
+  a: 4;
+  a: 3;
+  a: 2; }
+CSS
+.foo {
+  @for $var from 5 to 1 {a: $var;}
+}
+SCSS
+  end
+
+  def test_if_directive
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: b; }
+CSS
+@if "foo" == "foo" {foo {a: b}}
+@if "foo" != "foo" {bar {a: b}}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+bar {
+  a: b; }
+CSS
+@if "foo" != "foo" {foo {a: b}}
+@else if "foo" == "foo" {bar {a: b}}
+@else if true {baz {a: b}}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+bar {
+  a: b; }
+CSS
+@if "foo" != "foo" {foo {a: b}}
+@else {bar {a: b}}
+SCSS
+  end
+
+  def test_comment_after_if_directive
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: b;
+  /* This is a comment */
+  c: d; }
+CSS
+foo {
+  @if true {a: b}
+  /* This is a comment */
+  c: d }
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: b;
+  /* This is a comment */
+  c: d; }
+CSS
+foo {
+  @if true {a: b}
+  @else {x: y}
+  /* This is a comment */
+  c: d }
+SCSS
+  end
+
+  def test_while_directive
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  a: 2;
+  a: 3;
+  a: 4; }
+CSS
+$i: 1;
+
+.foo {
+  @while $i != 5 {
+    a: $i;
+    $i: $i + 1 !global;
+  }
+}
+SCSS
+  end
+
+  def test_each_directive
+    assert_equal <<CSS, render(<<SCSS)
+a {
+  b: 1px;
+  b: 2px;
+  b: 3px;
+  b: 4px; }
+
+c {
+  d: foo;
+  d: bar;
+  d: baz;
+  d: bang; }
+CSS
+a {
+  @each $number in 1px 2px 3px 4px {
+    b: $number;
+  }
+}
+c {
+  @each $str in foo, bar, baz, bang {
+    d: $str;
+  }
+}
+SCSS
+  end
+
+  def test_destructuring_each_directive
+    assert_equal <<CSS, render(<<SCSS)
+a {
+  foo: 1px;
+  bar: 2px;
+  baz: 3px; }
+
+c {
+  foo: "Value is bar";
+  bar: "Value is baz";
+  bang: "Value is "; }
+CSS
+a {
+  @each $name, $number in (foo: 1px, bar: 2px, baz: 3px) {
+    \#{$name}: $number;
+  }
+}
+c {
+  @each $key, $value in (foo bar) (bar, baz) bang {
+    \#{$key}: "Value is \#{$value}";
+  }
+}
+SCSS
+  end
+
+  def test_css_import_directive
+    assert_equal "@import url(foo.css);\n", render('@import "foo.css";')
+    assert_equal "@import url(foo.css);\n", render("@import 'foo.css';")
+    assert_equal "@import url(\"foo.css\");\n", render('@import url("foo.css");')
+    assert_equal "@import url(\"foo.css\");\n", render('@import url("foo.css");')
+    assert_equal "@import url(foo.css);\n", render('@import url(foo.css);')
+  end
+
+  def test_css_string_import_directive_with_media
+    assert_parses '@import "foo.css" screen;'
+    assert_parses '@import "foo.css" screen, print;'
+    assert_parses '@import "foo.css" screen, print and (foo: 0);'
+    assert_parses '@import "foo.css" screen, only print, screen and (foo: 0);'
+  end
+
+  def test_css_url_import_directive_with_media
+    assert_parses '@import url("foo.css") screen;'
+    assert_parses '@import url("foo.css") screen, print;'
+    assert_parses '@import url("foo.css") screen, print and (foo: 0);'
+    assert_parses '@import url("foo.css") screen, only print, screen and (foo: 0);'
+  end
+
+  def test_media_import
+    assert_equal("@import \"./fonts.sass\" all;\n", render("@import \"./fonts.sass\" all;"))
+  end
+
+  def test_dynamic_media_import
+    assert_equal(<<CSS, render(<<SCSS))
+@import "foo" print and (-webkit-min-device-pixel-ratio-foo: 25);
+CSS
+$media: print;
+$key: -webkit-min-device-pixel-ratio;
+$value: 20;
+@import "foo" \#{$media} and ($key + "-foo": $value + 5);
+SCSS
+  end
+
+  def test_http_import
+    assert_equal("@import \"http://fonts.googleapis.com/css?family=Droid+Sans\";\n",
+      render("@import \"http://fonts.googleapis.com/css?family=Droid+Sans\";"))
+  end
+
+  def test_protocol_relative_import
+    assert_equal("@import \"//fonts.googleapis.com/css?family=Droid+Sans\";\n",
+      render("@import \"//fonts.googleapis.com/css?family=Droid+Sans\";"))
+  end
+
+  def test_import_with_interpolation
+    assert_equal <<CSS, render(<<SCSS)
+@import url("http://fonts.googleapis.com/css?family=Droid+Sans");
+CSS
+$family: unquote("Droid+Sans");
+@import url("http://fonts.googleapis.com/css?family=\#{$family}");
+SCSS
+  end
+
+  def test_url_import
+    assert_equal("@import url(fonts.sass);\n", render("@import url(fonts.sass);"))
+  end
+
+  def test_css_import_doesnt_move_through_comments
+    assert_equal <<CSS, render(<<SCSS)
+/* Comment 1 */
+@import url("foo.css");
+/* Comment 2 */
+@import url("bar.css");
+CSS
+/* Comment 1 */
+@import url("foo.css");
+
+/* Comment 2 */
+@import url("bar.css");
+SCSS
+  end
+
+  def test_css_import_movement_stops_at_comments
+    assert_equal <<CSS, render(<<SCSS)
+/* Comment 1 */
+@import url("foo.css");
+/* Comment 2 */
+@import url("bar.css");
+.foo {
+  a: b; }
+
+/* Comment 3 */
+CSS
+/* Comment 1 */
+@import url("foo.css");
+
+/* Comment 2 */
+
+.foo {a: b}
+
+/* Comment 3 */
+@import url("bar.css");
+SCSS
+  end
+
+  def test_block_comment_in_script
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: 1bar; }
+CSS
+foo {a: 1 + /* flang */ bar}
+SCSS
+  end
+
+  def test_line_comment_in_script
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: 1blang; }
+CSS
+foo {a: 1 + // flang }
+  blang }
+SCSS
+  end
+
+  def test_static_hyphenated_unit
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: 0px; }
+CSS
+foo {a: 10px-10px }
+SCSS
+  end
+
+  ## Nested Rules
+
+  def test_nested_rules
+    assert_equal <<CSS, render(<<SCSS)
+foo bar {
+  a: b; }
+CSS
+foo {bar {a: b}}
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+foo bar {
+  a: b; }
+foo baz {
+  b: c; }
+CSS
+foo {
+  bar {a: b}
+  baz {b: c}}
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+foo bar baz {
+  a: b; }
+foo bang bip {
+  a: b; }
+CSS
+foo {
+  bar {baz {a: b}}
+  bang {bip {a: b}}}
+SCSS
+  end
+
+  def test_nested_rules_with_declarations
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: b; }
+  foo bar {
+    c: d; }
+CSS
+foo {
+  a: b;
+  bar {c: d}}
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: b; }
+  foo bar {
+    c: d; }
+CSS
+foo {
+  bar {c: d}
+  a: b}
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  ump: nump;
+  grump: clump; }
+  foo bar {
+    blat: bang;
+    habit: rabbit; }
+    foo bar baz {
+      a: b; }
+    foo bar bip {
+      c: d; }
+  foo bibble bap {
+    e: f; }
+CSS
+foo {
+  ump: nump;
+  grump: clump;
+  bar {
+    blat: bang;
+    habit: rabbit;
+    baz {a: b}
+    bip {c: d}}
+  bibble {
+    bap {e: f}}}
+SCSS
+  end
+
+  def test_nested_rules_with_fancy_selectors
+    assert_equal <<CSS, render(<<SCSS)
+foo .bar {
+  a: b; }
+foo :baz {
+  c: d; }
+foo bang:bop {
+  e: f; }
+foo ::qux {
+  g: h; }
+foo zap::fblthp {
+  i: j; }
+CSS
+foo {
+  .bar {a: b}
+  :baz {c: d}
+  bang:bop {e: f}
+  ::qux {g: h}
+  zap::fblthp {i: j}}
+SCSS
+  end
+
+  def test_almost_ambiguous_nested_rules_and_declarations
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bar: baz bang bop biddle woo look at all these elems; }
+  foo bar:baz:bang:bop:biddle:woo:look:at:all:these:pseudoclasses {
+    a: b; }
+  foo bar:baz bang bop biddle woo look at all these elems {
+    a: b; }
+CSS
+foo {
+  bar:baz:bang:bop:biddle:woo:look:at:all:these:pseudoclasses {a: b};
+  bar:baz bang bop biddle woo look at all these elems {a: b};
+  bar:baz bang bop biddle woo look at all these elems; }
+SCSS
+  end
+
+  def test_newlines_in_selectors
+    assert_equal <<CSS, render(<<SCSS)
+foo
+bar {
+  a: b; }
+CSS
+foo
+bar {a: b}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+foo baz,
+foo bang,
+bar baz,
+bar bang {
+  a: b; }
+CSS
+foo,
+bar {
+  baz,
+  bang {a: b}}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+foo
+bar baz
+bang {
+  a: b; }
+foo
+bar bip bop {
+  c: d; }
+CSS
+foo
+bar {
+  baz
+  bang {a: b}
+
+  bip bop {c: d}}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+foo bang, foo bip
+bop, bar
+baz bang, bar
+baz bip
+bop {
+  a: b; }
+CSS
+foo, bar
+baz {
+  bang, bip
+  bop {a: b}}
+SCSS
+  end
+
+  def test_trailing_comma_in_selector
+    assert_equal <<CSS, render(<<SCSS)
+#foo #bar,
+#baz #boom {
+  a: b; }
+
+#bip #bop {
+  c: d; }
+CSS
+#foo #bar,,
+,#baz #boom, {a: b}
+
+#bip #bop, ,, {c: d}
+SCSS
+  end
+
+  def test_parent_selectors
+    assert_equal <<CSS, render(<<SCSS)
+foo:hover {
+  a: b; }
+bar foo.baz {
+  c: d; }
+CSS
+foo {
+  &:hover {a: b}
+  bar &.baz {c: d}}
+SCSS
+  end
+
+  def test_parent_selector_with_subject
+    silence_warnings {assert_equal <<CSS, render(<<SCSS)}
+bar foo.baz! .bip {
+  a: b; }
+
+bar foo bar.baz! .bip {
+  c: d; }
+CSS
+foo {
+  bar &.baz! .bip {a: b}}
+
+foo bar {
+  bar &.baz! .bip {c: d}}
+SCSS
+  end
+
+  def test_parent_selector_with_suffix
+    assert_equal <<CSS, render(<<SCSS)
+.foo-bar {
+  a: b; }
+.foo_bar {
+  c: d; }
+.foobar {
+  e: f; }
+.foo123 {
+  e: f; }
+
+:hover-suffix {
+  g: h; }
+CSS
+.foo {
+  &-bar {a: b}
+  &_bar {c: d}
+  &bar {e: f}
+  &123 {e: f}
+}
+
+:hover {
+  &-suffix {g: h}
+}
+SCSS
+  end
+
+  def test_unknown_directive_bubbling
+    assert_equal(<<CSS, render(<<SCSS, :style => :nested))
+@fblthp {
+  .foo .bar {
+    a: b; } }
+CSS
+.foo {
+  @fblthp {
+    .bar {a: b}
+  }
+}
+SCSS
+  end
+
+  def test_keyframe_bubbling
+    assert_equal(<<CSS, render(<<SCSS, :style => :nested))
+@keyframes spin {
+  0% {
+    transform: rotate(0deg); } }
+@-webkit-keyframes spin {
+  0% {
+    transform: rotate(0deg); } }
+CSS
+.foo {
+  @keyframes spin {
+    0% {transform: rotate(0deg)}
+  }
+  @-webkit-keyframes spin {
+    0% {transform: rotate(0deg)}
+  }
+}
+SCSS
+  end
+
+  ## Namespace Properties
+
+  def test_namespace_properties
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bar: baz;
+  bang-bip: 1px;
+  bang-bop: bar; }
+CSS
+foo {
+  bar: baz;
+  bang: {
+    bip: 1px;
+    bop: bar;}}
+SCSS
+  end
+
+  def test_several_namespace_properties
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bar: baz;
+  bang-bip: 1px;
+  bang-bop: bar;
+  buzz-fram: "foo";
+  buzz-frum: moo; }
+CSS
+foo {
+  bar: baz;
+  bang: {
+    bip: 1px;
+    bop: bar;}
+  buzz: {
+    fram: "foo";
+    frum: moo;
+  }
+}
+SCSS
+  end
+
+  def test_nested_namespace_properties
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bar: baz;
+  bang-bip: 1px;
+  bang-bop: bar;
+  bang-blat-baf: bort; }
+CSS
+foo {
+  bar: baz;
+  bang: {
+    bip: 1px;
+    bop: bar;
+    blat:{baf:bort}}}
+SCSS
+  end
+
+  def test_namespace_properties_with_value
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bar: baz;
+    bar-bip: bop;
+    bar-bing: bop; }
+CSS
+foo {
+  bar: baz {
+    bip: bop;
+    bing: bop; }}
+SCSS
+  end
+
+  def test_namespace_properties_with_script_value
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bar: bazbang;
+    bar-bip: bop;
+    bar-bing: bop; }
+CSS
+foo {
+  bar: baz + bang {
+    bip: bop;
+    bing: bop; }}
+SCSS
+  end
+
+  def test_no_namespace_properties_without_space
+    assert_equal <<CSS, render(<<SCSS)
+foo bar:baz {
+  bip: bop; }
+CSS
+foo {
+  bar:baz {
+    bip: bop }}
+SCSS
+  end
+
+  def test_no_namespace_properties_without_space_even_when_its_unambiguous
+    render(<<SCSS)
+foo {
+  bar:baz calc(1 + 2) {
+    bip: bop }}
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "bar:baz calc": expected selector, was "(1 + 2)"', e.message
+    assert_equal 2, e.sass_line
+  end
+
+  def test_namespace_properties_without_space_allowed_for_non_identifier
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bar: 1px;
+    bar-bip: bop; }
+CSS
+foo {
+  bar:1px {
+    bip: bop }}
+SCSS
+  end
+
+  ## Mixins
+
+  def test_basic_mixins
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: b; }
+CSS
+@mixin foo {
+  .foo {a: b}}
+
+@include foo;
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+bar {
+  c: d; }
+  bar .foo {
+    a: b; }
+CSS
+@mixin foo {
+  .foo {a: b}}
+
+bar {
+  @include foo;
+  c: d; }
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+bar {
+  a: b;
+  c: d; }
+CSS
+@mixin foo {a: b}
+
+bar {
+  @include foo;
+  c: d; }
+SCSS
+  end
+
+  def test_mixins_with_empty_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: b; }
+CSS
+@mixin foo() {a: b}
+
+.foo {@include foo();}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: b; }
+CSS
+@mixin foo() {a: b}
+
+.foo {@include foo;}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: b; }
+CSS
+@mixin foo {a: b}
+
+.foo {@include foo();}
+SCSS
+  end
+
+  def test_mixins_with_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: bar; }
+CSS
+@mixin foo($a) {a: $a}
+
+.foo {@include foo(bar)}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: bar;
+  b: 12px; }
+CSS
+@mixin foo($a, $b) {
+  a: $a;
+  b: $b; }
+
+.foo {@include foo(bar, 12px)}
+SCSS
+  end
+
+  def test_keyframes_rules_in_content
+    assert_equal <<CSS, render(<<SCSS)
+@keyframes identifier {
+  0% {
+    top: 0;
+    left: 0; }
+  30% {
+    top: 50px; }
+  68%, 72% {
+    left: 50px; }
+  100% {
+    top: 100px;
+    left: 100%; } }
+CSS
+@mixin keyframes {
+  @keyframes identifier { @content }
+}
+
+@include keyframes {
+  0% {top: 0; left: 0}
+  \#{"30%"} {top: 50px}
+  68%, 72% {left: 50px}
+  100% {top: 100px; left: 100%}
+}
+SCSS
+  end
+
+  ## Functions
+
+  def test_basic_function
+    assert_equal(<<CSS, render(<<SASS))
+bar {
+  a: 3; }
+CSS
+@function foo() {
+  @return 1 + 2;
+}
+
+bar {
+  a: foo();
+}
+SASS
+  end
+
+  def test_function_args
+    assert_equal(<<CSS, render(<<SASS))
+bar {
+  a: 3; }
+CSS
+@function plus($var1, $var2) {
+  @return $var1 + $var2;
+}
+
+bar {
+  a: plus(1, 2);
+}
+SASS
+  end
+
+  def test_disallowed_function_names
+    Sass::Deprecation.allow_double_warnings do
+      assert_warning(<<WARNING) {render(<<SCSS)}
+DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss:
+Naming a function "calc" is disallowed and will be an error in future versions of Sass.
+This name conflicts with an existing CSS function with special parse rules.
+WARNING
+@function calc() {}
+SCSS
+
+      assert_warning(<<WARNING) {render(<<SCSS)}
+DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss:
+Naming a function "-my-calc" is disallowed and will be an error in future versions of Sass.
+This name conflicts with an existing CSS function with special parse rules.
+WARNING
+@function -my-calc() {}
+SCSS
+
+      assert_warning(<<WARNING) {render(<<SCSS)}
+DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss:
+Naming a function "element" is disallowed and will be an error in future versions of Sass.
+This name conflicts with an existing CSS function with special parse rules.
+WARNING
+@function element() {}
+SCSS
+
+      assert_warning(<<WARNING) {render(<<SCSS)}
+DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss:
+Naming a function "-my-element" is disallowed and will be an error in future versions of Sass.
+This name conflicts with an existing CSS function with special parse rules.
+WARNING
+@function -my-element() {}
+SCSS
+
+      assert_warning(<<WARNING) {render(<<SCSS)}
+DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss:
+Naming a function "expression" is disallowed and will be an error in future versions of Sass.
+This name conflicts with an existing CSS function with special parse rules.
+WARNING
+@function expression() {}
+SCSS
+
+      assert_warning(<<WARNING) {render(<<SCSS)}
+DEPRECATION WARNING on line 1 of test_disallowed_function_names_inline.scss:
+Naming a function "url" is disallowed and will be an error in future versions of Sass.
+This name conflicts with an existing CSS function with special parse rules.
+WARNING
+@function url() {}
+SCSS
+    end
+  end
+
+  def test_allowed_function_names
+    assert_no_warning {assert_equal(<<CSS, render(<<SCSS))}
+.a {
+  b: c; }
+CSS
+@function -my-expression() {@return c}
+
+.a {b: -my-expression()}
+SCSS
+
+    assert_no_warning {assert_equal(<<CSS, render(<<SCSS))}
+.a {
+  b: c; }
+CSS
+@function -my-url() {@return c}
+
+.a {b: -my-url()}
+SCSS
+  end
+
+  ## Var Args
+
+  def test_mixin_var_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2, 3, 4; }
+CSS
+@mixin foo($a, $b...) {
+  a: $a;
+  b: $b;
+}
+
+.foo {@include foo(1, 2, 3, 4)}
+SCSS
+  end
+
+  def test_mixin_empty_var_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 0; }
+CSS
+@mixin foo($a, $b...) {
+  a: $a;
+  b: length($b);
+}
+
+.foo {@include foo(1)}
+SCSS
+  end
+
+  def test_mixin_var_args_act_like_list
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 3;
+  b: 3; }
+CSS
+@mixin foo($a, $b...) {
+  a: length($b);
+  b: nth($b, 2);
+}
+
+.foo {@include foo(1, 2, 3, 4)}
+SCSS
+  end
+
+  def test_mixin_splat_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2;
+  c: 3;
+  d: 4; }
+CSS
+@mixin foo($a, $b, $c, $d) {
+  a: $a;
+  b: $b;
+  c: $c;
+  d: $d;
+}
+
+$list: 2, 3, 4;
+.foo {@include foo(1, $list...)}
+SCSS
+  end
+
+  def test_mixin_splat_expression
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2;
+  c: 3;
+  d: 4; }
+CSS
+@mixin foo($a, $b, $c, $d) {
+  a: $a;
+  b: $b;
+  c: $c;
+  d: $d;
+}
+
+.foo {@include foo(1, (2, 3, 4)...)}
+SCSS
+  end
+
+  def test_mixin_splat_args_with_var_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2, 3, 4; }
+CSS
+@mixin foo($a, $b...) {
+  a: $a;
+  b: $b;
+}
+
+$list: 2, 3, 4;
+.foo {@include foo(1, $list...)}
+SCSS
+  end
+
+  def test_mixin_splat_args_with_var_args_and_normal_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2;
+  c: 3, 4; }
+CSS
+@mixin foo($a, $b, $c...) {
+  a: $a;
+  b: $b;
+  c: $c;
+}
+
+$list: 2, 3, 4;
+.foo {@include foo(1, $list...)}
+SCSS
+  end
+
+  def test_mixin_splat_args_with_var_args_preserves_separator
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2 3 4 5; }
+CSS
+@mixin foo($a, $b...) {
+  a: $a;
+  b: $b;
+}
+
+$list: 3 4 5;
+.foo {@include foo(1, 2, $list...)}
+SCSS
+  end
+
+  def test_mixin_var_and_splat_args_pass_through_keywords
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 3;
+  b: 1;
+  c: 2; }
+CSS
+@mixin foo($a...) {
+  @include bar($a...);
+}
+
+@mixin bar($b, $c, $a) {
+  a: $a;
+  b: $b;
+  c: $c;
+}
+
+.foo {@include foo(1, $c: 2, $a: 3)}
+SCSS
+  end
+
+  def test_mixin_var_keyword_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2;
+  c: 3; }
+CSS
+@mixin foo($args...) {
+  a: map-get(keywords($args), a);
+  b: map-get(keywords($args), b);
+  c: map-get(keywords($args), c);
+}
+
+.foo {@include foo($a: 1, $b: 2, $c: 3)}
+SCSS
+  end
+
+  def test_mixin_empty_var_keyword_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  length: 0; }
+CSS
+@mixin foo($args...) {
+  length: length(keywords($args));
+}
+
+.foo {@include foo}
+SCSS
+  end
+
+  def test_mixin_map_splat
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2;
+  c: 3; }
+CSS
+@mixin foo($a, $b, $c) {
+  a: $a;
+  b: $b;
+  c: $c;
+}
+
+.foo {
+  $map: (a: 1, b: 2, c: 3);
+  @include foo($map...);
+}
+SCSS
+  end
+
+  def test_mixin_map_and_list_splat
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: x;
+  b: y;
+  c: z;
+  d: 1;
+  e: 2;
+  f: 3; }
+CSS
+@mixin foo($a, $b, $c, $d, $e, $f) {
+  a: $a;
+  b: $b;
+  c: $c;
+  d: $d;
+  e: $e;
+  f: $f;
+}
+
+.foo {
+  $list: x y z;
+  $map: (d: 1, e: 2, f: 3);
+  @include foo($list..., $map...);
+}
+SCSS
+  end
+
+  def test_mixin_map_splat_takes_precedence_over_pass_through
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2;
+  c: z; }
+CSS
+@mixin foo($args...) {
+  $map: (c: z);
+  @include bar($args..., $map...);
+}
+
+@mixin bar($a, $b, $c) {
+  a: $a;
+  b: $b;
+  c: $c;
+}
+
+.foo {
+  @include foo(1, $b: 2, $c: 3);
+}
+SCSS
+  end
+
+  def test_mixin_list_of_pairs_splat_treated_as_list
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: a 1;
+  b: b 2;
+  c: c 3; }
+CSS
+@mixin foo($a, $b, $c) {
+  a: $a;
+  b: $b;
+  c: $c;
+}
+
+.foo {
+  @include foo((a 1, b 2, c 3)...);
+}
+SCSS
+  end
+
+  def test_mixin_splat_after_keyword_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2;
+  c: 3; }
+CSS
+@mixin foo($a, $b, $c) {
+  a: 1;
+  b: 2;
+  c: 3;
+}
+
+.foo {
+  @include foo(1, $c: 3, 2...);
+}
+SCSS
+  end
+
+  def test_mixin_keyword_args_after_splat
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2;
+  c: 3; }
+CSS
+@mixin foo($a, $b, $c) {
+  a: 1;
+  b: 2;
+  c: 3;
+}
+
+.foo {
+  @include foo(1, 2..., $c: 3);
+}
+SCSS
+  end
+
+  def test_mixin_keyword_splat_after_keyword_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2;
+  c: 3; }
+CSS
+@mixin foo($a, $b, $c) {
+  a: 1;
+  b: 2;
+  c: 3;
+}
+
+.foo {
+  @include foo(1, $b: 2, (c: 3)...);
+}
+SCSS
+  end
+
+  def test_mixin_triple_keyword_splat_merge
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  foo: 1;
+  bar: 2;
+  kwarg: 3;
+  a: 3;
+  b: 2;
+  c: 3; }
+CSS
+@mixin foo($foo, $bar, $kwarg, $a, $b, $c) {
+  foo: $foo;
+  bar: $bar;
+  kwarg: $kwarg;
+  a: $a;
+  b: $b;
+  c: $c;
+}
+
+@mixin bar($args...) {
+  @include foo($args..., $bar: 2, $a: 2, $b: 2, (kwarg: 3, a: 3, c: 3)...);
+}
+
+.foo {
+  @include bar($foo: 1, $a: 1, $b: 1, $c: 1);
+}
+SCSS
+  end
+
+  def test_mixin_map_splat_converts_hyphens_and_underscores_for_real_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: 1;
+  b: 2;
+  c: 3;
+  d: 4; }
+CSS
+@mixin foo($a-1, $b-2, $c_3, $d_4) {
+  a: $a-1;
+  b: $b-2;
+  c: $c_3;
+  d: $d_4;
+}
+
+.foo {
+  $map: (a-1: 1, b_2: 2, c-3: 3, d_4: 4);
+  @include foo($map...);
+}
+SCSS
+  end
+
+  def test_mixin_map_splat_doesnt_convert_hyphens_and_underscores_for_var_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a-1: 1;
+  b_2: 2;
+  c-3: 3;
+  d_4: 4; }
+CSS
+@mixin foo($args...) {
+  @each $key, $value in keywords($args) {
+    \#{$key}: $value;
+  }
+}
+
+.foo {
+  $map: (a-1: 1, b_2: 2, c-3: 3, d_4: 4);
+  @include foo($map...);
+}
+SCSS
+  end
+
+  def test_mixin_conflicting_splat_after_keyword_args
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render(<<SCSS)}
+Mixin foo was passed argument $b both by position and by name.
+MESSAGE
+@mixin foo($a, $b, $c) {
+  a: 1;
+  b: 2;
+  c: 3;
+}
+
+.foo {
+  @include foo(1, $b: 2, 3...);
+}
+SCSS
+  end
+
+  def test_mixin_keyword_splat_must_have_string_keys
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
+Variable keyword argument map must have string keys.
+12 is not a string in (12: 1).
+MESSAGE
+@mixin foo($a) {
+  a: $a;
+}
+
+.foo {@include foo((12: 1)...)}
+SCSS
+  end
+
+  def test_mixin_positional_arg_after_splat
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render(<<SCSS)}
+Only keyword arguments may follow variable arguments (...).
+MESSAGE
+@mixin foo($a, $b, $c) {
+  a: 1;
+  b: 2;
+  c: 3;
+}
+
+.foo {
+  @include foo(1, 2..., 3);
+}
+SCSS
+  end
+
+  def test_mixin_var_args_with_keyword
+    assert_raise_message(Sass::SyntaxError, "Positional arguments must come before keyword arguments.") {render <<SCSS}
+@mixin foo($a, $b...) {
+  a: $a;
+  b: $b;
+}
+
+.foo {@include foo($a: 1, 2, 3, 4)}
+SCSS
+  end
+
+  def test_mixin_keyword_for_var_arg
+    assert_raise_message(Sass::SyntaxError, "Argument $b of mixin foo cannot be used as a named argument.") {render <<SCSS}
+@mixin foo($a, $b...) {
+  a: $a;
+  b: $b;
+}
+
+.foo {@include foo(1, $b: 2 3 4)}
+SCSS
+  end
+
+  def test_mixin_keyword_for_unknown_arg_with_var_args
+    assert_raise_message(Sass::SyntaxError, "Mixin foo doesn't have an argument named $c.") {render <<SCSS}
+@mixin foo($a, $b...) {
+  a: $a;
+  b: $b;
+}
+
+.foo {@include foo(1, $c: 2 3 4)}
+SCSS
+  end
+
+  def test_mixin_map_splat_before_list_splat
+    assert_raise_message(Sass::SyntaxError, "Variable keyword arguments must be a map (was (2 3)).") {render <<SCSS}
+@mixin foo($a, $b, $c) {
+  a: $a;
+  b: $b;
+  c: $c;
+}
+
+.foo {
+  @include foo((a: 1)..., (2 3)...);
+}
+SCSS
+  end
+
+  def test_mixin_map_splat_with_unknown_keyword
+    assert_raise_message(Sass::SyntaxError, "Mixin foo doesn't have an argument named $c.") {render <<SCSS}
+@mixin foo($a, $b) {
+  a: $a;
+  b: $b;
+}
+
+.foo {
+  @include foo(1, 2, (c: 1)...);
+}
+SCSS
+  end
+
+  def test_mixin_map_splat_with_wrong_type
+    assert_raise_message(Sass::SyntaxError, "Variable keyword arguments must be a map (was 12).") {render <<SCSS}
+@mixin foo($a, $b) {
+  a: $a;
+  b: $b;
+}
+
+.foo {
+  @include foo((1, 2)..., 12...);
+}
+SCSS
+  end
+
+  def test_mixin_splat_too_many_args
+    assert_warning(<<WARNING) {render <<SCSS}
+WARNING: Mixin foo takes 2 arguments but 4 were passed.
+        on line 2 of #{filename_for_test(:scss)}
+This will be an error in future versions of Sass.
+WARNING
+@mixin foo($a, $b) {}
+@include foo((1, 2, 3, 4)...);
+SCSS
+  end
+
+  def test_function_var_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2, 3, 4"; }
+CSS
+@function foo($a, $b...) {
+  @return "a: \#{$a}, b: \#{$b}";
+}
+
+.foo {val: foo(1, 2, 3, 4)}
+SCSS
+  end
+
+  def test_function_empty_var_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 0"; }
+CSS
+@function foo($a, $b...) {
+  @return "a: \#{$a}, b: \#{length($b)}";
+}
+
+.foo {val: foo(1)}
+SCSS
+  end
+
+  def test_function_var_args_act_like_list
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 3, b: 3"; }
+CSS
+@function foo($a, $b...) {
+  @return "a: \#{length($b)}, b: \#{nth($b, 2)}";
+}
+
+.foo {val: foo(1, 2, 3, 4)}
+SCSS
+  end
+
+  def test_function_splat_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2, c: 3, d: 4"; }
+CSS
+@function foo($a, $b, $c, $d) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}, d: \#{$d}";
+}
+
+$list: 2, 3, 4;
+.foo {val: foo(1, $list...)}
+SCSS
+  end
+
+  def test_function_splat_expression
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2, c: 3, d: 4"; }
+CSS
+@function foo($a, $b, $c, $d) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}, d: \#{$d}";
+}
+
+.foo {val: foo(1, (2, 3, 4)...)}
+SCSS
+  end
+
+  def test_function_splat_args_with_var_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2, 3, 4"; }
+CSS
+@function foo($a, $b...) {
+  @return "a: \#{$a}, b: \#{$b}";
+}
+
+$list: 2, 3, 4;
+.foo {val: foo(1, $list...)}
+SCSS
+  end
+
+  def test_function_splat_args_with_var_args_and_normal_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2, c: 3, 4"; }
+CSS
+@function foo($a, $b, $c...) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+$list: 2, 3, 4;
+.foo {val: foo(1, $list...)}
+SCSS
+  end
+
+  def test_function_splat_args_with_var_args_preserves_separator
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2 3 4 5"; }
+CSS
+@function foo($a, $b...) {
+  @return "a: \#{$a}, b: \#{$b}";
+}
+
+$list: 3 4 5;
+.foo {val: foo(1, 2, $list...)}
+SCSS
+  end
+
+  def test_function_var_and_splat_args_pass_through_keywords
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 3, b: 1, c: 2"; }
+CSS
+@function foo($a...) {
+  @return bar($a...);
+}
+
+@function bar($b, $c, $a) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+.foo {val: foo(1, $c: 2, $a: 3)}
+SCSS
+  end
+
+  def test_function_var_keyword_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2, c: 3"; }
+CSS
+@function foo($args...) {
+  @return "a: \#{map-get(keywords($args), a)}, " +
+    "b: \#{map-get(keywords($args), b)}, " +
+    "c: \#{map-get(keywords($args), c)}";
+}
+
+.foo {val: foo($a: 1, $b: 2, $c: 3)}
+SCSS
+  end
+
+  def test_function_empty_var_keyword_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  length: 0; }
+CSS
+@function foo($args...) {
+  @return length(keywords($args));
+}
+
+.foo {length: foo()}
+SCSS
+  end
+
+  def test_function_map_splat
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2, c: 3"; }
+CSS
+@function foo($a, $b, $c) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+.foo {
+  $map: (a: 1, b: 2, c: 3);
+  val: foo($map...);
+}
+SCSS
+  end
+
+  def test_function_map_and_list_splat
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: x, b: y, c: z, d: 1, e: 2, f: 3"; }
+CSS
+@function foo($a, $b, $c, $d, $e, $f) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}, d: \#{$d}, e: \#{$e}, f: \#{$f}";
+}
+
+.foo {
+  $list: x y z;
+  $map: (d: 1, e: 2, f: 3);
+  val: foo($list..., $map...);
+}
+SCSS
+  end
+
+  def test_function_map_splat_takes_precedence_over_pass_through
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2, c: z"; }
+CSS
+@function foo($args...) {
+  $map: (c: z);
+  @return bar($args..., $map...);
+}
+
+@function bar($a, $b, $c) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+.foo {
+  val: foo(1, $b: 2, $c: 3);
+}
+SCSS
+  end
+
+  def test_ruby_function_map_splat_takes_precedence_over_pass_through
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: 1 2 3 z; }
+CSS
+@function foo($args...) {
+  $map: (val: z);
+  @return append($args..., $map...);
+}
+
+.foo {
+  val: foo(1 2 3, $val: 4)
+}
+SCSS
+  end
+
+  def test_function_list_of_pairs_splat_treated_as_list
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: a 1, b: b 2, c: c 3"; }
+CSS
+@function foo($a, $b, $c) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+.foo {
+  val: foo((a 1, b 2, c 3)...);
+}
+SCSS
+  end
+
+  def test_function_splat_after_keyword_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2, c: 3"; }
+CSS
+@function foo($a, $b, $c) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+.foo {
+  val: foo(1, $c: 3, 2...);
+}
+SCSS
+  end
+
+  def test_function_keyword_args_after_splat
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2, c: 3"; }
+CSS
+@function foo($a, $b, $c) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+.foo {
+  val: foo(1, 2..., $c: 3);
+}
+SCSS
+  end
+
+  def test_function_keyword_splat_after_keyword_args
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "a: 1, b: 2, c: 3"; }
+CSS
+@function foo($a, $b, $c) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+.foo {
+  val: foo(1, $b: 2, (c: 3)...);
+}
+SCSS
+  end
+
+  def test_function_triple_keyword_splat_merge
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: "foo: 1, bar: 2, kwarg: 3, a: 3, b: 2, c: 3"; }
+CSS
+@function foo($foo, $bar, $kwarg, $a, $b, $c) {
+  @return "foo: \#{$foo}, bar: \#{$bar}, kwarg: \#{$kwarg}, a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+@function bar($args...) {
+  @return foo($args..., $bar: 2, $a: 2, $b: 2, (kwarg: 3, a: 3, c: 3)...);
+}
+
+.foo {
+  val: bar($foo: 1, $a: 1, $b: 1, $c: 1);
+}
+SCSS
+  end
+
+  def test_function_conflicting_splat_after_keyword_args
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render(<<SCSS)}
+Function foo was passed argument $b both by position and by name.
+MESSAGE
+@function foo($a, $b, $c) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+.foo {
+  val: foo(1, $b: 2, 3...);
+}
+SCSS
+  end
+
+  def test_function_positional_arg_after_splat
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render(<<SCSS)}
+Only keyword arguments may follow variable arguments (...).
+MESSAGE
+@function foo($a, $b, $c) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+.foo {
+  val: foo(1, 2..., 3);
+}
+SCSS
+  end
+
+  def test_function_var_args_with_keyword
+    assert_raise_message(Sass::SyntaxError, "Positional arguments must come before keyword arguments.") {render <<SCSS}
+@function foo($a, $b...) {
+  @return "a: \#{$a}, b: \#{$b}";
+}
+
+.foo {val: foo($a: 1, 2, 3, 4)}
+SCSS
+  end
+
+  def test_function_keyword_for_var_arg
+    assert_raise_message(Sass::SyntaxError, "Argument $b of function foo cannot be used as a named argument.") {render <<SCSS}
+@function foo($a, $b...) {
+  @return "a: \#{$a}, b: \#{$b}";
+}
+
+.foo {val: foo(1, $b: 2 3 4)}
+SCSS
+  end
+
+  def test_function_keyword_for_unknown_arg_with_var_args
+    assert_raise_message(Sass::SyntaxError, "Function foo doesn't have an argument named $c.") {render <<SCSS}
+@function foo($a, $b...) {
+  @return "a: \#{$a}, b: \#{length($b)}";
+}
+
+.foo {val: foo(1, $c: 2 3 4)}
+SCSS
+  end
+
+  def test_function_var_args_passed_to_native
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  val: #102035; }
+CSS
+@function foo($args...) {
+  @return adjust-color($args...);
+}
+
+.foo {val: foo(#102030, $blue: 5)}
+SCSS
+  end
+
+  def test_function_map_splat_before_list_splat
+    assert_raise_message(Sass::SyntaxError, "Variable keyword arguments must be a map (was (2 3)).") {render <<SCSS}
+@function foo($a, $b, $c) {
+  @return "a: \#{$a}, b: \#{$b}, c: \#{$c}";
+}
+
+.foo {
+  val: foo((a: 1)..., (2 3)...);
+}
+SCSS
+  end
+
+  def test_function_map_splat_with_unknown_keyword
+    assert_raise_message(Sass::SyntaxError, "Function foo doesn't have an argument named $c.") {render <<SCSS}
+@function foo($a, $b) {
+  @return "a: \#{$a}, b: \#{$b}";
+}
+
+.foo {
+  val: foo(1, 2, (c: 1)...);
+}
+SCSS
+  end
+
+  def test_function_map_splat_with_wrong_type
+    assert_raise_message(Sass::SyntaxError, "Variable keyword arguments must be a map (was 12).") {render <<SCSS}
+@function foo($a, $b) {
+  @return "a: \#{$a}, b: \#{$b}";
+}
+
+.foo {
+  val: foo((1, 2)..., 12...);
+}
+SCSS
+  end
+
+  def test_function_keyword_splat_must_have_string_keys
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
+Variable keyword argument map must have string keys.
+12 is not a string in (12: 1).
+MESSAGE
+@function foo($a) {
+  @return $a;
+}
+
+.foo {val: foo((12: 1)...)}
+SCSS
+  end
+
+  def test_function_splat_too_many_args
+    assert_warning(<<WARNING) {render <<SCSS}
+WARNING: Function foo takes 2 arguments but 4 were passed.
+        on line 2 of #{filename_for_test(:scss)}
+This will be an error in future versions of Sass.
+WARNING
+@function foo($a, $b) {@return null}
+$var: foo((1, 2, 3, 4)...);
+SCSS
+  end
+
+  ## Interpolation
+
+  def test_basic_selector_interpolation
+    assert_equal <<CSS, render(<<SCSS)
+foo ab baz {
+  a: b; }
+CSS
+foo \#{'a' + 'b'} baz {a: b}
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+foo.bar baz {
+  a: b; }
+CSS
+foo\#{".bar"} baz {a: b}
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+foo.bar baz {
+  a: b; }
+CSS
+\#{"foo"}.bar baz {a: b}
+SCSS
+  end
+
+  def test_selector_only_interpolation
+    assert_equal <<CSS, render(<<SCSS)
+foo bar {
+  a: b; }
+CSS
+\#{"foo" + " bar"} {a: b}
+SCSS
+  end
+
+  def test_selector_interpolation_before_element_name
+    assert_equal <<CSS, render(<<SCSS)
+foo barbaz {
+  a: b; }
+CSS
+\#{"foo" + " bar"}baz {a: b}
+SCSS
+  end
+
+  def test_selector_interpolation_in_string
+    assert_equal <<CSS, render(<<SCSS)
+foo[val="bar foo bar baz"] {
+  a: b; }
+CSS
+foo[val="bar \#{"foo" + " bar"} baz"] {a: b}
+SCSS
+  end
+
+  def test_selector_interpolation_in_pseudoclass
+    assert_equal <<CSS, render(<<SCSS)
+foo:nth-child(5n) {
+  a: b; }
+CSS
+foo:nth-child(\#{5 + "n"}) {a: b}
+SCSS
+  end
+
+  def test_selector_interpolation_at_class_begininng
+    assert_equal <<CSS, render(<<SCSS)
+.zzz {
+  a: b; }
+CSS
+$zzz: zzz;
+.\#{$zzz} { a: b; }
+SCSS
+  end
+
+  def test_selector_interpolation_at_id_begininng
+    assert_equal <<CSS, render(<<SCSS)
+#zzz {
+  a: b; }
+CSS
+$zzz: zzz;
+#\#{$zzz} { a: b; }
+SCSS
+  end
+
+  def test_selector_interpolation_at_pseudo_begininng
+    assert_equal <<CSS, render(<<SCSS)
+:zzz::zzz {
+  a: b; }
+CSS
+$zzz: zzz;
+:\#{$zzz}::\#{$zzz} { a: b; }
+SCSS
+  end
+
+  def test_selector_interpolation_at_attr_beginning
+    assert_equal <<CSS, render(<<SCSS)
+[zzz=foo] {
+  a: b; }
+CSS
+$zzz: zzz;
+[\#{$zzz}=foo] { a: b; }
+SCSS
+  end
+
+  def test_selector_interpolation_at_attr_end
+    assert_equal <<CSS, render(<<SCSS)
+[foo=zzz] {
+  a: b; }
+CSS
+$zzz: zzz;
+[foo=\#{$zzz}] { a: b; }
+SCSS
+  end
+
+  def test_selector_interpolation_at_dashes
+    assert_equal <<CSS, render(<<SCSS)
+div {
+  -foo-a-b-foo: foo; }
+CSS
+$a : a;
+$b : b;
+div { -foo-\#{$a}-\#{$b}-foo: foo }
+SCSS
+  end
+
+  def test_selector_interpolation_in_reference_combinator
+    silence_warnings {assert_equal <<CSS, render(<<SCSS)}
+.foo /a/ .bar /b|c/ .baz {
+  a: b; }
+CSS
+$a: a;
+$b: b;
+$c: c;
+.foo /\#{$a}/ .bar /\#{$b}|\#{$c}/ .baz {a: b}
+SCSS
+  end
+
+  def test_parent_selector_with_parent_and_subject
+    silence_warnings {assert_equal <<CSS, render(<<SCSS)}
+bar foo.baz! .bip {
+  c: d; }
+CSS
+$subject: "!";
+foo {
+  bar &.baz\#{$subject} .bip {c: d}}
+SCSS
+  end
+
+  def test_basic_prop_name_interpolation
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  barbazbang: blip; }
+CSS
+foo {bar\#{"baz" + "bang"}: blip}
+SCSS
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bar3: blip; }
+CSS
+foo {bar\#{1 + 2}: blip}
+SCSS
+  end
+
+  def test_prop_name_only_interpolation
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bazbang: blip; }
+CSS
+foo {\#{"baz" + "bang"}: blip}
+SCSS
+  end
+
+  def test_directive_interpolation
+    assert_equal <<CSS, render(<<SCSS)
+@foo bar12 qux {
+  a: b; }
+CSS
+$baz: 12;
+@foo bar\#{$baz} qux {a: b}
+SCSS
+  end
+
+  def test_media_interpolation
+    assert_equal <<CSS, render(<<SCSS)
+@media bar12 {
+  a: b; }
+CSS
+$baz: 12;
+@media bar\#{$baz} {a: b}
+SCSS
+  end
+
+  def test_script_in_media
+    assert_equal <<CSS, render(<<SCSS)
+@media screen and (-webkit-min-device-pixel-ratio: 20), only print {
+  a: b; }
+CSS
+$media1: screen;
+$media2: print;
+$var: -webkit-min-device-pixel-ratio;
+$val: 20;
+@media \#{$media1} and ($var: $val), only \#{$media2} {a: b}
+SCSS
+
+    assert_equal <<CSS, render(<<SCSS)
+@media screen and (-webkit-min-device-pixel-ratio: 13) {
+  a: b; }
+CSS
+$vals: 1 2 3;
+@media screen and (-webkit-min-device-pixel-ratio: 5 + 6 + nth($vals, 2)) {a: b}
+SCSS
+  end
+
+  def test_media_interpolation_with_reparse
+    assert_equal <<CSS, render(<<SCSS)
+@media screen and (max-width: 300px) {
+  a: b; }
+@media screen and (max-width: 300px) {
+  a: b; }
+@media screen and (max-width: 300px) {
+  a: b; }
+@media screen and (max-width: 300px), print and (max-width: 300px) {
+  a: b; }
+CSS
+$constraint: "(max-width: 300px)";
+$fragment: "nd \#{$constraint}";
+$comma: "een, pri";
+@media screen and \#{$constraint} {a: b}
+@media screen {
+  @media \#{$constraint} {a: b}
+}
+@media screen a\#{$fragment} {a: b}
+@media scr\#{$comma}nt {
+  @media \#{$constraint} {a: b}
+}
+SCSS
+  end
+
+  def test_moz_document_interpolation
+    assert_equal <<CSS, render(<<SCSS)
+@-moz-document url(http://sass-lang.com/),
+               url-prefix(http://sass-lang.com/docs),
+               domain(sass-lang.com),
+               domain("sass-lang.com") {
+  .foo {
+    a: b; } }
+CSS
+$domain: "sass-lang.com";
+@-moz-document url(http://\#{$domain}/),
+               url-prefix(http://\#{$domain}/docs),
+               domain(\#{$domain}),
+               \#{domain($domain)} {
+  .foo {a: b}
+}
+SCSS
+  end
+
+  def test_supports_with_expressions
+    assert_equal <<CSS, render(<<SCSS)
+@supports ((feature1: val) and (feature2: val)) or (not (feature23: val4)) {
+  foo {
+    a: b; } }
+CSS
+$query: "(feature1: val)";
+$feature: feature2;
+$val: val;
+@supports (\#{$query} and ($feature: $val)) or (not ($feature + 3: $val + 4)) {
+  foo {a: b}
+}
+SCSS
+  end
+
+  def test_supports_bubbling
+    assert_equal <<CSS, render(<<SCSS)
+@supports (foo: bar) {
+  a {
+    b: c; }
+    @supports (baz: bang) {
+      a {
+        d: e; } } }
+CSS
+a {
+  @supports (foo: bar) {
+    b: c;
+    @supports (baz: bang) {
+      d: e;
+    }
+  }
+}
+SCSS
+  end
+
+  def test_random_directive_interpolation
+    assert_equal <<CSS, render(<<SCSS)
+@foo url(http://sass-lang.com/),
+     domain("sass-lang.com"),
+     "foobarbaz",
+     foobarbaz {
+  .foo {
+    a: b; } }
+CSS
+$domain: "sass-lang.com";
+@foo url(http://\#{$domain}/),
+     \#{domain($domain)},
+     "foo\#{'ba' + 'r'}baz",
+     foo\#{'ba' + 'r'}baz {
+  .foo {a: b}
+}
+SCSS
+  end
+
+  def test_color_interpolation_warning_in_selector
+    assert_warning(<<WARNING) {assert_equal <<CSS, render(<<SCSS)}
+WARNING on line 1, column 4 of #{filename_for_test(:scss)}:
+You probably don't mean to use the color value `blue' in interpolation here.
+It may end up represented as #0000ff, which will likely produce invalid CSS.
+Always quote color names when using them as strings (for example, "blue").
+If you really want to use the color value here, use `"" + blue'.
+WARNING
+fooblue {
+  a: b; }
+CSS
+foo\#{blue} {a: b}
+SCSS
+  end
+
+  def test_color_interpolation_warning_in_directive
+    assert_warning(<<WARNING) {assert_equal <<CSS, render(<<SCSS)}
+WARNING on line 1, column 12 of #{filename_for_test(:scss)}:
+You probably don't mean to use the color value `blue' in interpolation here.
+It may end up represented as #0000ff, which will likely produce invalid CSS.
+Always quote color names when using them as strings (for example, "blue").
+If you really want to use the color value here, use `"" + blue'.
+WARNING
+@fblthp fooblue {
+  a: b; }
+CSS
+@fblthp foo\#{blue} {a: b}
+SCSS
+  end
+
+  def test_color_interpolation_warning_in_property_name
+    assert_warning(<<WARNING) {assert_equal <<CSS, render(<<SCSS)}
+WARNING on line 1, column 8 of #{filename_for_test(:scss)}:
+You probably don't mean to use the color value `blue' in interpolation here.
+It may end up represented as #0000ff, which will likely produce invalid CSS.
+Always quote color names when using them as strings (for example, "blue").
+If you really want to use the color value here, use `"" + blue'.
+WARNING
+foo {
+  a-blue: b; }
+CSS
+foo {a-\#{blue}: b}
+SCSS
+  end
+
+  def test_no_color_interpolation_warning_in_property_value
+    assert_no_warning {assert_equal <<CSS, render(<<SCSS)}
+foo {
+  a: b-blue; }
+CSS
+foo {a: b-\#{blue}}
+SCSS
+  end
+
+  def test_no_color_interpolation_warning_for_nameless_color
+    assert_no_warning {assert_equal <<CSS, render(<<SCSS)}
+foo-#abcdef {
+  a: b; }
+CSS
+foo-\#{#abcdef} {a: b}
+SCSS
+  end
+
+  def test_nested_mixin_def
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: b; }
+CSS
+foo {
+  @mixin bar {a: b}
+  @include bar; }
+SCSS
+  end
+
+  def test_nested_mixin_shadow
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  c: d; }
+
+baz {
+  a: b; }
+CSS
+@mixin bar {a: b}
+
+foo {
+  @mixin bar {c: d}
+  @include bar;
+}
+
+baz {@include bar}
+SCSS
+  end
+
+  def test_nested_function_def
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: 1; }
+
+bar {
+  b: foo(); }
+CSS
+foo {
+  @function foo() {@return 1}
+  a: foo(); }
+
+bar {b: foo()}
+SCSS
+  end
+
+  def test_nested_function_shadow
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: 2; }
+
+baz {
+  b: 1; }
+CSS
+@function foo() {@return 1}
+
+foo {
+  @function foo() {@return 2}
+  a: foo();
+}
+
+baz {b: foo()}
+SCSS
+  end
+
+  ## @at-root
+
+  def test_simple_at_root
+    assert_equal <<CSS, render(<<SCSS)
+.bar {
+  a: b; }
+CSS
+.foo {
+  @at-root {
+    .bar {a: b}
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with_selector
+    assert_equal <<CSS, render(<<SCSS)
+.bar {
+  a: b; }
+CSS
+.foo {
+  @at-root .bar {a: b}
+}
+SCSS
+  end
+
+  def test_at_root_in_mixin
+    assert_equal <<CSS, render(<<SCSS)
+.bar {
+  a: b; }
+CSS
+@mixin bar {
+  @at-root .bar {a: b}
+}
+
+.foo {
+  @include bar;
+}
+SCSS
+  end
+
+  def test_at_root_in_media
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  .bar {
+    a: b; } }
+CSS
+@media screen {
+  .foo {
+    @at-root .bar {a: b}
+  }
+}
+SCSS
+  end
+
+  def test_at_root_in_bubbled_media
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  .bar {
+    a: b; } }
+CSS
+.foo {
+  @media screen {
+    @at-root .bar {a: b}
+  }
+}
+SCSS
+  end
+
+  def test_at_root_in_unknown_directive
+    assert_equal <<CSS, render(<<SCSS)
+@fblthp {
+  .bar {
+    a: b; } }
+CSS
+@fblthp {
+  .foo {
+    @at-root .bar {a: b}
+  }
+}
+SCSS
+  end
+
+  def test_comments_in_at_root
+    assert_equal <<CSS, render(<<SCSS)
+/* foo */
+.bar {
+  a: b; }
+
+/* baz */
+CSS
+.foo {
+  @at-root {
+    /* foo */
+    .bar {a: b}
+    /* baz */
+  }
+}
+SCSS
+  end
+
+  def test_comments_in_at_root_in_media
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  /* foo */
+  .bar {
+    a: b; }
+
+  /* baz */ }
+CSS
+@media screen {
+  .foo {
+    @at-root {
+      /* foo */
+      .bar {a: b}
+      /* baz */
+    }
+  }
+}
+SCSS
+  end
+
+  def test_comments_in_at_root_in_unknown_directive
+    assert_equal <<CSS, render(<<SCSS)
+@fblthp {
+  /* foo */
+  .bar {
+    a: b; }
+
+  /* baz */ }
+CSS
+@fblthp {
+  .foo {
+    @at-root {
+      /* foo */
+      .bar {a: b}
+      /* baz */
+    }
+  }
+}
+SCSS
+  end
+
+  def test_media_directive_in_at_root
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  .bar {
+    a: b; } }
+CSS
+.foo {
+  @at-root {
+    @media screen {.bar {a: b}}
+  }
+}
+SCSS
+  end
+
+  def test_bubbled_media_directive_in_at_root
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  .bar .baz {
+    a: b; } }
+CSS
+.foo {
+  @at-root {
+    .bar {
+      @media screen {.baz {a: b}}
+    }
+  }
+}
+SCSS
+  end
+
+  def test_unknown_directive_in_at_root
+    assert_equal <<CSS, render(<<SCSS)
+@fblthp {
+  .bar {
+    a: b; } }
+CSS
+.foo {
+  @at-root {
+    @fblthp {.bar {a: b}}
+  }
+}
+SCSS
+  end
+
+  def test_at_root_in_at_root
+    assert_equal <<CSS, render(<<SCSS)
+.bar {
+  a: b; }
+CSS
+.foo {
+  @at-root {
+    @at-root .bar {a: b}
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with_parent_ref
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: b; }
+CSS
+.foo {
+  @at-root & {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  def test_multi_level_at_root_with_parent_ref
+    assert_equal <<CSS, render(<<SCSS)
+.foo .bar {
+  a: b; }
+CSS
+.foo {
+  @at-root & {
+    .bar {
+      @at-root & {
+        a: b;
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_multi_level_at_root_with_inner_parent_ref
+    assert_equal <<CSS, render(<<SCSS)
+.bar {
+  a: b; }
+CSS
+.foo {
+  @at-root .bar {
+    @at-root & {
+      a: b;
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_beneath_comma_selector
+    assert_equal(<<CSS, render(<<SCSS))
+.baz {
+  a: b; }
+CSS
+.foo, .bar {
+  @at-root .baz {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with_parent_ref_and_class
+    assert_equal(<<CSS, render(<<SCSS))
+.foo.bar {
+  a: b; }
+CSS
+.foo {
+  @at-root &.bar {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  def test_at_root_beneath_comma_selector_with_parent_ref
+    assert_equal(<<CSS, render(<<SCSS))
+.foo.baz, .bar.baz {
+  a: b; }
+CSS
+.foo, .bar {
+  @at-root &.baz {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  ## @at-root (...)
+
+  def test_at_root_without_media
+    assert_equal <<CSS, render(<<SCSS)
+.foo .bar {
+  a: b; }
+CSS
+.foo {
+  @media screen {
+    @at-root (without: media) {
+      .bar {
+        a: b;
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_without_supports
+    assert_equal <<CSS, render(<<SCSS)
+.foo .bar {
+  a: b; }
+CSS
+.foo {
+  @supports (foo: bar) {
+    @at-root (without: supports) {
+      .bar {
+        a: b;
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_without_rule
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  .bar {
+    a: b; } }
+CSS
+.foo {
+  @media screen {
+    @at-root (without: rule) {
+      .bar {
+        a: b;
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_without_unknown_directive
+    assert_equal <<CSS, render(<<SCSS)
+@fblthp {}
+.foo .bar {
+  a: b; }
+CSS
+.foo {
+  @fblthp {
+    @at-root (without: fblthp) {
+      .bar {
+        a: b;
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_without_multiple
+    assert_equal <<CSS, render(<<SCSS)
+@supports (foo: bar) {
+  .bar {
+    a: b; } }
+CSS
+.foo {
+  @media screen {
+    @supports (foo: bar) {
+      @at-root (without: media rule) {
+        .bar {
+          a: b;
+        }
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_without_all
+    assert_equal <<CSS, render(<<SCSS)
+@supports (foo: bar) {
+  @fblthp {} }
+.bar {
+  a: b; }
+CSS
+.foo {
+  @supports (foo: bar) {
+    @fblthp {
+      @at-root (without: all) {
+        .bar {
+          a: b;
+        }
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with_media
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  @fblthp {}
+  .bar {
+    a: b; } }
+CSS
+.foo {
+  @media screen {
+    @fblthp {
+      @supports (foo: bar) {
+        @at-root (with: media) {
+          .bar {
+            a: b;
+          }
+        }
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with_rule
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  @fblthp {} }
+.foo .bar {
+  a: b; }
+CSS
+.foo {
+  @media screen {
+    @fblthp {
+      @supports (foo: bar) {
+        @at-root (with: rule) {
+          .bar {
+            a: b;
+          }
+        }
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with_supports
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  @fblthp {} }
+@supports (foo: bar) {
+  .bar {
+    a: b; } }
+CSS
+.foo {
+  @media screen {
+    @fblthp {
+      @supports (foo: bar) {
+        @at-root (with: supports) {
+          .bar {
+            a: b;
+          }
+        }
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with_unknown_directive
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  @fblthp {} }
+@fblthp {
+  .bar {
+    a: b; } }
+CSS
+.foo {
+  @media screen {
+    @fblthp {
+      @supports (foo: bar) {
+        @at-root (with: fblthp) {
+          .bar {
+            a: b;
+          }
+        }
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with_multiple
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  @fblthp {}
+  .foo .bar {
+    a: b; } }
+CSS
+.foo {
+  @media screen {
+    @fblthp {
+      @supports (foo: bar) {
+        @at-root (with: media rule) {
+          .bar {
+            a: b;
+          }
+        }
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with_all
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  @fblthp {
+    @supports (foo: bar) {
+      .foo .bar {
+        a: b; } } } }
+CSS
+.foo {
+  @media screen {
+    @fblthp {
+      @supports (foo: bar) {
+        @at-root (with: all) {
+          .bar {
+            a: b;
+          }
+        }
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_dynamic_values
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  .bar {
+    a: b; } }
+CSS
+$key: with;
+$value: media;
+.foo {
+  @media screen {
+    @at-root ($key: $value) {
+      .bar {
+        a: b;
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_interpolated_query
+    assert_equal <<CSS, render(<<SCSS)
+@media screen {
+  .bar {
+    a: b; } }
+CSS
+.foo {
+  @media screen {
+    @at-root (\#{"with: media"}) {
+      .bar {
+        a: b;
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_plus_extend
+    assert_equal <<CSS, render(<<SCSS)
+.foo .bar {
+  a: b; }
+CSS
+%base {
+  a: b;
+}
+
+.foo {
+  @media screen {
+    @at-root (without: media) {
+      .bar {
+        @extend %base;
+      }
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_without_keyframes_in_keyframe_rule
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: b; }
+CSS
+@keyframes identifier {
+  0% {
+    @at-root (without: keyframes) {
+      .foo {a: b}
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_without_rule_in_keyframe_rule
+    assert_equal <<CSS, render(<<SCSS)
+@keyframes identifier {
+  0% {
+    a: b; } }
+CSS
+@keyframes identifier {
+  0% {
+    @at-root (without: rule) {a: b}
+  }
+}
+SCSS
+  end
+
+  ## Selector Script
+
+  def test_selector_script
+    assert_equal(<<CSS, render(<<SCSS))
+.foo .bar {
+  content: ".foo .bar"; }
+CSS
+.foo .bar {
+  content: "\#{&}";
+}
+SCSS
+  end
+
+  def test_nested_selector_script
+    assert_equal(<<CSS, render(<<SCSS))
+.foo .bar {
+  content: ".foo .bar"; }
+CSS
+.foo {
+  .bar {
+    content: "\#{&}";
+  }
+}
+SCSS
+  end
+
+  def test_nested_selector_script_with_outer_comma_selector
+    assert_equal(<<CSS, render(<<SCSS))
+.foo .baz, .bar .baz {
+  content: ".foo .baz, .bar .baz"; }
+CSS
+.foo, .bar {
+  .baz {
+    content: "\#{&}";
+  }
+}
+SCSS
+  end
+
+  def test_nested_selector_script_with_inner_comma_selector
+    assert_equal(<<CSS, render(<<SCSS))
+.foo .bar, .foo .baz {
+  content: ".foo .bar, .foo .baz"; }
+CSS
+.foo {
+  .bar, .baz {
+    content: "\#{&}";
+  }
+}
+SCSS
+  end
+
+  def test_selector_script_through_mixin
+    assert_equal(<<CSS, render(<<SCSS))
+.foo {
+  content: ".foo"; }
+CSS
+@mixin mixin {
+  content: "\#{&}";
+}
+
+.foo {
+  @include mixin;
+}
+SCSS
+  end
+
+  def test_selector_script_through_content
+    assert_equal(<<CSS, render(<<SCSS))
+.foo {
+  content: ".foo"; }
+CSS
+@mixin mixin {
+  @content;
+}
+
+.foo {
+  @include mixin {
+    content: "\#{&}";
+  }
+}
+SCSS
+  end
+
+  def test_selector_script_through_function
+    assert_equal(<<CSS, render(<<SCSS))
+.foo {
+  content: ".foo"; }
+CSS
+@function fn() {
+  @return "\#{&}";
+}
+
+.foo {
+  content: fn();
+}
+SCSS
+  end
+
+  def test_selector_script_through_media
+    assert_equal(<<CSS, render(<<SCSS))
+.foo {
+  content: "outer"; }
+  @media screen {
+    .foo .bar {
+      content: ".foo .bar"; } }
+CSS
+.foo {
+  content: "outer";
+  @media screen {
+    .bar {
+      content: "\#{&}";
+    }
+  }
+}
+SCSS
+  end
+
+  def test_selector_script_save_and_reuse
+    assert_equal(<<CSS, render(<<SCSS))
+.bar {
+  content: ".foo"; }
+CSS
+$var: null;
+.foo {
+  $var: & !global;
+}
+
+.bar {
+  content: "\#{$var}";
+}
+SCSS
+  end
+
+  def test_selector_script_with_at_root
+    assert_equal(<<CSS, render(<<SCSS))
+.foo-bar {
+  a: b; }
+CSS
+.foo {
+  @at-root \#{&}-bar {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  def test_multi_level_at_root_with_inner_selector_script
+    assert_equal <<CSS, render(<<SCSS)
+.bar {
+  a: b; }
+CSS
+.foo {
+  @at-root .bar {
+    @at-root \#{&} {
+      a: b;
+    }
+  }
+}
+SCSS
+  end
+
+  def test_at_root_with_at_root_through_mixin
+    assert_equal(<<CSS, render(<<SCSS))
+.bar-baz {
+  a: b; }
+CSS
+@mixin foo {
+  .bar {
+    @at-root \#{&}-baz {
+      a: b;
+    }
+  }
+}
+
+@include foo;
+SCSS
+  end
+
+  # See https://github.com/sass/sass/issues/1294
+  def test_extend_top_leveled_by_at_root
+    render(<<SCSS)
+.span-10 {
+  @at-root (without: all) {
+    @extend %column;
+  }
+}
+SCSS
+
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal "Extend directives may only be used within rules.", e.message
+    assert_equal 3, e.sass_line
+  end
+
+  def test_at_root_doesnt_always_break_blocks
+    assert_equal <<CSS, render(<<SCSS)
+.foo {
+  a: b; }
+
+@media screen {
+  .foo {
+    c: d; }
+  .bar {
+    e: f; } }
+CSS
+%base {
+  a: b;
+}
+
+@media screen {
+  .foo {
+    c: d;
+    @at-root (without: media) {
+      @extend %base;
+    }
+  }
+
+  .bar {e: f}
+}
+SCSS
+  end
+
+  ## Errors
+
+  def test_keyframes_rule_outside_of_keyframes
+    render <<SCSS
+0% {
+  top: 0; }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "": expected selector, was "0%"', e.message
+    assert_equal 1, e.sass_line
+  end
+
+  def test_selector_rule_in_keyframes
+    render <<SCSS
+@keyframes identifier {
+  .foo {
+    top: 0; } }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "": expected keyframes selector (e.g. 10%), was ".foo"', e.message
+    assert_equal 2, e.sass_line
+  end
+
+  def test_nested_mixin_def_is_scoped
+    render <<SCSS
+foo {
+  @mixin bar {a: b}}
+bar {@include bar}
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal "Undefined mixin 'bar'.", e.message
+    assert_equal 3, e.sass_line
+  end
+
+  def test_rules_beneath_properties
+    render <<SCSS
+foo {
+  bar: {
+    baz {
+      bang: bop }}}
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Illegal nesting: Only properties may be nested beneath properties.', e.message
+    assert_equal 3, e.sass_line
+  end
+
+  def test_uses_property_exception_with_star_hack
+    render <<SCSS
+foo {
+  *bar:baz <fail>; }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "  *bar:baz <fail>": expected expression (e.g. 1px, bold), was "; }"', e.message
+    assert_equal 2, e.sass_line
+  end
+
+  def test_uses_property_exception_with_colon_hack
+    render <<SCSS
+foo {
+  :bar:baz <fail>; }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "  :bar:baz <fail>": expected expression (e.g. 1px, bold), was "; }"', e.message
+    assert_equal 2, e.sass_line
+  end
+
+  def test_uses_rule_exception_with_dot_hack
+    render <<SCSS
+foo {
+  .bar:baz <fail>; }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "  .bar:baz <fail>": expected expression (e.g. 1px, bold), was "; }"', e.message
+    assert_equal 2, e.sass_line
+  end
+
+  def test_uses_property_exception_with_space_after_name
+    render <<SCSS
+foo {
+  bar: baz <fail>; }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "  bar: baz <fail>": expected expression (e.g. 1px, bold), was "; }"', e.message
+    assert_equal 2, e.sass_line
+  end
+
+  def test_uses_property_exception_with_non_identifier_after_name
+    render <<SCSS
+foo {
+  bar:1px <fail>; }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "  bar:1px <fail>": expected expression (e.g. 1px, bold), was "; }"', e.message
+    assert_equal 2, e.sass_line
+  end
+
+  def test_uses_property_exception_when_followed_by_open_bracket
+    render <<SCSS
+foo {
+  bar:{baz: .fail} }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "  bar:{baz: ": expected expression (e.g. 1px, bold), was ".fail} }"', e.message
+    assert_equal 2, e.sass_line
+  end
+
+  def test_script_error
+    render <<SCSS
+foo {
+  bar: "baz" * * }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "  bar: "baz" * ": expected expression (e.g. 1px, bold), was "* }"', e.message
+    assert_equal 2, e.sass_line
+  end
+
+  def test_multiline_script_syntax_error
+    render <<SCSS
+foo {
+  bar:
+    "baz" * * }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "    "baz" * ": expected expression (e.g. 1px, bold), was "* }"', e.message
+    assert_equal 3, e.sass_line
+  end
+
+  def test_multiline_script_runtime_error
+    render <<SCSS
+foo {
+  bar: "baz" +
+    "bar" +
+    $bang }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal "Undefined variable: \"$bang\".", e.message
+    assert_equal 4, e.sass_line
+  end
+
+  def test_post_multiline_script_runtime_error
+    render <<SCSS
+foo {
+  bar: "baz" +
+    "bar" +
+    "baz";
+  bip: $bop; }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal "Undefined variable: \"$bop\".", e.message
+    assert_equal 5, e.sass_line
+  end
+
+  def test_multiline_property_runtime_error
+    render <<SCSS
+foo {
+  bar: baz
+    bar
+    \#{$bang} }
+SCSS
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal "Undefined variable: \"$bang\".", e.message
+    assert_equal 4, e.sass_line
+  end
+
+  def test_post_resolution_selector_error
+    render "\n\nfoo \#{\") bar\"} {a: b}"
+    assert(false, "Expected syntax error")
+  rescue Sass::SyntaxError => e
+    assert_equal 'Invalid CSS after "foo ": expected selector, was ") bar"', e.message
+    assert_equal 3, e.sass_line
+  end
+
+  def test_parent_in_mid_selector_error
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
+Invalid CSS after ".foo": expected "{", was "&.bar"
+
+"&.bar" may only be used at the beginning of a compound selector.
+MESSAGE
+flim {
+  .foo&.bar {a: b}
+}
+SCSS
+  end
+
+  def test_parent_after_selector_error
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
+Invalid CSS after ".foo.bar": expected "{", was "&"
+
+"&" may only be used at the beginning of a compound selector.
+MESSAGE
+flim {
+  .foo.bar& {a: b}
+}
+SCSS
+  end
+
+  def test_double_parent_selector_error
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
+Invalid CSS after "&": expected "{", was "&"
+
+"&" may only be used at the beginning of a compound selector.
+MESSAGE
+flim {
+  && {a: b}
+}
+SCSS
+  end
+
+  def test_no_lonely_else
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render <<SCSS}
+Invalid CSS: @else must come after @if
+MESSAGE
+@else {foo: bar}
+SCSS
+  end
+
+  def test_failed_parent_selector_with_suffix
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render(<<SCSS)}
+Invalid parent selector for "&-bar": "*"
+MESSAGE
+* {
+  &-bar {a: b}
+}
+SCSS
+
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render(<<SCSS)}
+Invalid parent selector for "&-bar": "[foo=bar]"
+MESSAGE
+[foo=bar] {
+  &-bar {a: b}
+}
+SCSS
+
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render(<<SCSS)}
+Invalid parent selector for "&-bar": "::nth-child(2n+1)"
+MESSAGE
+::nth-child(2n+1) {
+  &-bar {a: b}
+}
+SCSS
+
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render(<<SCSS)}
+Invalid parent selector for "&-bar": ":not(.foo)"
+MESSAGE
+:not(.foo) {
+  &-bar {a: b}
+}
+SCSS
+
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render(<<SCSS)}
+Invalid parent selector for "&-bar": ".foo +"
+MESSAGE
+.foo + {
+  &-bar {a: b}
+}
+SCSS
+  end
+
+  def test_empty_media_query_error
+    assert_raise_message(Sass::SyntaxError, <<MESSAGE.rstrip) {render(<<SCSS)}
+Invalid CSS after "": expected media query list, was ""
+MESSAGE
+@media \#{""} {
+  foo {a: b}
+}
+SCSS
+  end
+
+  def test_newline_in_property_value
+    assert_equal(<<CSS, render(<<SCSS))
+.foo {
+  bar: "bazbang"; }
+CSS
+.foo {
+  $var: "baz\\
+bang";
+  bar: $var;
+}
+SCSS
+  end
+
+  def test_raw_newline_warning
+    assert_warning(<<MESSAGE.rstrip) {assert_equal(<<CSS, render(<<SCSS))}
+DEPRECATION WARNING on line 2, column 9 of #{filename_for_test :scss}:
+Unescaped multiline strings are deprecated and will be removed in a future version of Sass.
+To include a newline in a string, use "\\a" or "\\a " as in CSS.
+MESSAGE
+.foo {
+  bar: "baz\\a bang"; }
+CSS
+.foo {
+  $var: "baz
+bang";
+  bar: $var;
+}
+SCSS
+  end
+
+  # Regression
+
+  # Regression test for #2031.
+  def test_no_interpolation_warning_in_nested_selector
+    assert_no_warning {assert_equal(<<CSS, render(<<SCSS))}
+z a:b(n+1) {
+  x: y; }
+CSS
+z {
+  a:b(n+\#{1}) {
+    x: y;
+  }
+}
+SCSS
+  end
+
+  # Ensures that the fix for #2031 doesn't hide legitimate warnings.
+  def test_interpolation_warning_in_selector_like_property
+    assert_warning(<<WARNING) {assert_equal(<<CSS, render(<<SCSS))}
+DEPRECATION WARNING on line 2 of #{filename_for_test :scss}:
+\#{} interpolation near operators will be simplified in a future version of Sass.
+To preserve the current behavior, use quotes:
+
+  unquote("n+1")
+
+You can use the sass-convert command to automatically fix most cases.
+WARNING
+z {
+  a: b(n+1); }
+CSS
+z {
+  a:b(n+\#{1});
+}
+SCSS
+  end
+
+  def test_escape_in_selector
+    assert_equal(<<CSS, render(".\\!foo {a: b}"))
+.\\!foo {
+  a: b; }
+CSS
+  end
+
+  def test_for_directive_with_float_bounds
+    assert_equal(<<CSS, render(<<SCSS))
+.a {
+  b: 0;
+  b: 1;
+  b: 2;
+  b: 3;
+  b: 4;
+  b: 5; }
+CSS
+.a {
+  @for $i from 0.0 through 5.0 {b: $i}
+}
+SCSS
+
+    assert_raise_message(Sass::SyntaxError, "0.5 is not an integer.") {render(<<SCSS)}
+.a {
+  @for $i from 0.5 through 5.0 {b: $i}
+}
+SCSS
+
+    assert_raise_message(Sass::SyntaxError, "5.5 is not an integer.") {render(<<SCSS)}
+.a {
+  @for $i from 0.0 through 5.5 {b: $i}
+}
+SCSS
+  end
+
+  def test_parent_selector_in_function_pseudo_selector
+    assert_equal <<CSS, render(<<SCSS)
+.bar:not(.foo) {
+  a: b; }
+
+.qux:nth-child(2n of .baz .bang) {
+  c: d; }
+CSS
+.foo {
+  .bar:not(&) {a: b}
+}
+
+.baz .bang {
+  .qux:nth-child(2n of &) {c: d}
+}
+SCSS
+  end
+
+  def test_parent_selector_in_and_out_of_function_pseudo_selector
+    # Regression test for https://github.com/sass/sass/issues/1464#issuecomment-70352288
+    assert_equal(<<CSS, render(<<SCSS))
+.a:not(.a-b) {
+  x: y; }
+CSS
+.a {
+  &:not(&-b) {
+    x: y;
+  }
+}
+SCSS
+
+    assert_equal(<<CSS, render(<<SCSS))
+.a:nth-child(2n of .a-b) {
+  x: y; }
+CSS
+.a {
+  &:nth-child(2n of &-b) {
+    x: y;
+  }
+}
+SCSS
+  end
+
+  def test_attribute_selector_in_selector_pseudoclass
+    # Even though this is plain CSS, it only failed when given to the SCSS
+    # parser.
+    assert_equal(<<CSS, render(<<SCSS))
+[href^='http://'] {
+  color: red; }
+CSS
+[href^='http://'] {
+  color: red;
+}
+SCSS
+  end
+
+  def test_top_level_unknown_directive_in_at_root
+    assert_equal(<<CSS, render(<<SCSS))
+@fblthp {
+  a: b; }
+CSS
+@at-root {
+  @fblthp {a: b}
+}
+SCSS
+  end
+
+  def test_parent_ref_with_newline
+    assert_equal(<<CSS, render(<<SCSS))
+a.c
+, b.c {
+  x: y; }
+CSS
+a
+, b {&.c {x: y}}
+SCSS
+  end
+
+  def test_parent_ref_in_nested_at_root
+    assert_equal(<<CSS, render(<<SCSS))
+#test {
+  border: 0; }
+  #test:hover {
+    display: none; }
+CSS
+a {
+  @at-root #test {
+    border: 0;
+    &:hover{
+      display: none;
+    }
+  }
+}
+SCSS
+  end
+
+  def test_loud_comment_in_compressed_mode
+    assert_equal(<<CSS, render(<<SCSS))
+/*! foo */
+CSS
+/*! foo */
+SCSS
+  end
+
+  def test_parsing_decimals_followed_by_comments_doesnt_take_forever
+    assert_equal(<<CSS, render(<<SCSS))
+.foo {
+  padding: 4.2105263158% 4.2105263158% 5.6315789474%; }
+CSS
+.foo {
+  padding: 4.21052631578947% 4.21052631578947% 5.631578947368421% /**/
+}
+SCSS
+  end
+
+  def test_parsing_many_numbers_doesnt_take_forever
+    values = ["80% 90%"] * 1000
+    assert_equal(<<CSS, render(<<SCSS))
+.foo {
+  padding: #{values.join(', ')}; }
+CSS
+.foo {
+  padding: #{values.join(', ')};
+}
+SCSS
+  end
+
+  def test_import_comments_in_imports
+    assert_equal(<<CSS, render(<<SCSS))
+@import url(foo.css);
+@import url(bar.css);
+@import url(baz.css);
+CSS
+@import "foo.css", // this is a comment
+        "bar.css", /* this is another comment */
+        "baz.css"; // this is a third comment
+SCSS
+  end
+
+  def test_reference_combinator_with_parent_ref
+    silence_warnings {assert_equal <<CSS, render(<<SCSS)}
+a /foo/ b {
+  c: d; }
+CSS
+a {& /foo/ b {c: d}}
+SCSS
+  end
+
+  def test_reference_combinator_warning
+    assert_warning(<<WARNING) {assert_equal <<CSS, render(<<SCSS)}
+DEPRECATION WARNING on line 1, column 8 of test_reference_combinator_warning_inline.scss:
+The reference combinator /foo/ is deprecated and will be removed in a future release.
+WARNING
+a /foo/ b {
+  c: d; }
+CSS
+a {& /foo/ b {c: d}}
+SCSS
+  end
+
+  def test_newline_selector_rendered_multiple_times
+    assert_equal <<CSS, render(<<SCSS)
+form input,
+form select {
+  color: white; }
+
+form input,
+form select {
+  color: white; }
+CSS
+@for $i from 1 through 2 {
+  form {
+    input,
+    select {
+      color: white;
+    }
+  }
+}
+SCSS
+  end
+
+  def test_prop_name_interpolation_after_hyphen
+    assert_equal <<CSS, render(<<SCSS)
+a {
+  -foo-bar: b; }
+CSS
+a { -\#{"foo"}-bar: b; }
+SCSS
+  end
+
+  def test_star_plus_and_parent
+    assert_equal <<CSS, render(<<SCSS)
+* + html foo {
+  a: b; }
+CSS
+foo {*+html & {a: b}}
+SCSS
+  end
+
+  def test_weird_added_space
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  bar: -moz-bip; }
+CSS
+$value : bip;
+
+foo {
+  bar: -moz-\#{$value};
+}
+SCSS
+  end
+
+  def test_interpolation_with_bracket_on_next_line
+    assert_equal <<CSS, render(<<SCSS)
+a.foo b {
+  color: red; }
+CSS
+a.\#{"foo"} b
+{color: red}
+SCSS
+  end
+
+  def test_extra_comma_in_mixin_arglist
+    assert_equal <<CSS, render(<<SCSS)
+.bar {
+  baz: bar; }
+CSS
+@mixin foo($a1,) {
+  baz: $a1;
+}
+
+.bar {
+  @include foo(bar, );
+}
+SCSS
+  end
+
+
+  def test_extra_comma_between_parameters_in_mixin_arglist
+    assert_raise_message(Sass::SyntaxError, "Invalid CSS after \"...nclude foo(bar,\": expected \")\", was \", baz );\"") {render <<SCSS}
+@mixin foo($a1, $a2) {
+  baz: $a1;
+  bef: $a2;
+}
+
+.bar {
+  @include foo(bar,, baz );
+}
+SCSS
+  end
+
+
+  def test_extra_comma_in_mixin_arglist_ending_needs_have_parentheses_after
+    assert_raise_message(Sass::SyntaxError, "Invalid CSS after \"    bri,\": expected \")\", was \"};\"") {render <<SCSS}
+@mixin foo($a1, $a2) {
+  baz: $a1;
+  bal: $a2;
+}
+
+.bar {
+  @include foo(
+    bar,
+    bri,
+  };
+}
+SCSS
+  end
+
+
+
+  def test_interpolation
+    assert_equal <<CSS, render(<<SCSS)
+ul li#foo a span.label {
+  foo: bar; }
+CSS
+$bar : "#foo";
+ul li\#{$bar} a span.label { foo: bar; }
+SCSS
+  end
+
+  def test_mixin_with_keyword_args
+    assert_equal <<CSS, render(<<SCSS)
+.mixed {
+  required: foo;
+  arg1: default-val1;
+  arg2: non-default-val2; }
+CSS
+@mixin a-mixin($required, $arg1: default-val1, $arg2: default-val2) {
+  required: $required;
+  arg1: $arg1;
+  arg2: $arg2;
+}
+.mixed { @include a-mixin(foo, $arg2: non-default-val2); }
+SCSS
+  end
+
+  def test_keyword_arg_scope
+    assert_equal <<CSS, render(<<SCSS)
+.mixed {
+  arg1: default;
+  arg2: non-default; }
+CSS
+$arg1: default;
+$arg2: default;
+@mixin a-mixin($arg1: $arg1, $arg2: $arg2) {
+  arg1: $arg1;
+  arg2: $arg2;
+}
+.mixed { @include a-mixin($arg2: non-default); }
+SCSS
+  end
+
+  def test_passing_required_args_as_a_keyword_arg
+    assert_equal <<CSS, render(<<SCSS)
+.mixed {
+  required: foo;
+  arg1: default-val1;
+  arg2: default-val2; }
+CSS
+@mixin a-mixin($required, $arg1: default-val1, $arg2: default-val2) {
+  required: $required;
+  arg1: $arg1;
+  arg2: $arg2; }
+.mixed { @include a-mixin($required: foo); }
+SCSS
+  end
+
+  def test_passing_all_as_keyword_args_in_opposite_order
+    assert_equal <<CSS, render(<<SCSS)
+.mixed {
+  required: foo;
+  arg1: non-default-val1;
+  arg2: non-default-val2; }
+CSS
+@mixin a-mixin($required, $arg1: default-val1, $arg2: default-val2) {
+  required: $required;
+  arg1: $arg1;
+  arg2: $arg2; }
+.mixed { @include a-mixin($arg2: non-default-val2, $arg1: non-default-val1, $required: foo); }
+SCSS
+  end
+
+  def test_keyword_args_in_functions
+    assert_equal <<CSS, render(<<SCSS)
+.keyed {
+  color: rgba(170, 119, 204, 0.4); }
+CSS
+.keyed { color: rgba($color: #a7c, $alpha: 0.4) }
+SCSS
+  end
+
+  def test_unknown_keyword_arg_raises_error
+    assert_raise_message(Sass::SyntaxError, "Mixin a doesn't have an argument named $c.") {render <<SCSS}
+@mixin a($b: 1) { a: $b; }
+div { @include a(1, $c: 3); }
+SCSS
+  end
+
+
+  def test_newlines_removed_from_selectors_when_compressed
+    assert_equal <<CSS, render(<<SCSS, :style => :compressed)
+z a,z b{display:block}
+CSS
+a
+, b {
+  z & {
+    display: block;
+  }
+}
+SCSS
+  end
+
+  def test_if_error_line
+    assert_raise_line(2) {render(<<SCSS)}
+@if true {foo: bar}
+}
+SCSS
+  end
+
+  def test_multiline_var
+    assert_equal <<CSS, render(<<SCSS)
+foo {
+  a: 3;
+  b: false;
+  c: a b c; }
+CSS
+foo {
+  $var1: 1 +
+    2;
+  $var2: true and
+    false;
+  $var3: a b
+    c;
+  a: $var1;
+  b: $var2;
+  c: $var3; }
+SCSS
+  end
+
+  def test_mixin_content
+    assert_equal <<CSS, render(<<SASS)
+.parent {
+  background-color: red;
+  border-color: red; }
+  .parent .child {
+    background-color: yellow;
+    color: blue;
+    border-color: yellow; }
+CSS
+$color: blue;
+@mixin context($class, $color: red) {
+  .\#{$class} {
+    background-color: $color;
+    @content;
+    border-color: $color;
+  }
+}
+@include context(parent) {
+  @include context(child, $color: yellow) {
+    color: $color;
+  }
+}
+SASS
+  end
+
+  def test_empty_content
+    assert_equal <<CSS, render(<<SCSS)
+a {
+  b: c; }
+CSS
+@mixin foo { @content }
+a { b: c; @include foo {} }
+SCSS
+  end
+
+  def test_options_passed_to_script
+    assert_equal <<CSS, render(<<SCSS, :style => :compressed)
+foo{color:#000}
+CSS
+foo {color: darken(black, 10%)}
+SCSS
+  end
+
+  # ref: https://github.com/nex3/sass/issues/104
+  def test_no_buffer_overflow
+    template = render <<SCSS
+.aaa {
+  background-color: white;
+}
+.aaa .aaa .aaa {
+  background-color: black;
+}
+.bbb {
+  @extend .aaa;
+}
+.xxx {
+  @extend .bbb;
+}
+.yyy {
+  @extend .bbb;
+}
+.zzz {
+  @extend .bbb;
+}
+SCSS
+    Sass::SCSS::Parser.new(template, "test.scss", nil).parse
+  end
+
+  def test_extend_in_media_in_rule
+    assert_equal(<<CSS, render(<<SCSS))
+@media screen {
+  .foo {
+    a: b; } }
+CSS
+.foo {
+  @media screen {
+    @extend %bar;
+  }
+}
+
+@media screen {
+  %bar {
+    a: b;
+  }
+}
+SCSS
+  end
+
+  def test_import_with_supports_clause_interp
+    assert_equal(<<CSS, render(<<'SASS', :style => :compressed))
+@import url("fallback-layout.css") supports(not (display: flex))
+CSS
+$display-type: flex;
+@import url("fallback-layout.css") supports(not (display: #{$display-type}));
+SASS
+  end
+
+  def test_import_with_supports_clause
+    assert_equal(<<CSS, render(<<SASS, :style => :compressed))
+@import url("fallback-layout.css") supports(not (display: flex));.foo{bar:baz}
+CSS
+@import url("fallback-layout.css") supports(not (display: flex));
+.foo { bar: baz; }
+SASS
+  end
+
+  def test_crlf
+    # Attempt to reproduce https://github.com/sass/sass/issues/1985
+    assert_equal(<<CSS, render(<<SCSS))
+p {
+  margin: 0; }
+CSS
+p {\r\n   margin: 0;\r\n}
+SCSS
+  end
+
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/test_helper.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/test_helper.rb
new file mode 100644
index 0000000..11e177d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/scss/test_helper.rb
@@ -0,0 +1,37 @@
+require File.dirname(__FILE__) + '/../../test_helper'
+require 'sass/engine'
+
+module ScssTestHelper
+  def assert_parses(scss)
+    assert_equal scss.rstrip, render(scss).rstrip
+  end
+
+  def assert_not_parses(expected, scss)
+    raise "Template must include <err> where an error is expected" unless scss.include?("<err>")
+
+    after, was = scss.split("<err>")
+    line = after.count("\n") + 1
+
+    after.gsub!(/\s*\n\s*$/, '')
+    after.gsub!(/.*\n/, '')
+    after = "..." + after[-15..-1] if after.size > 18
+
+    was.gsub!(/^\s*\n\s*/, '')
+    was.gsub!(/\n.*/, '')
+    was = was[0...15] + "..." if was.size > 18
+
+    to_render = scss.sub("<err>", "")
+    render(to_render)
+    assert(false, "Expected syntax error for:\n#{to_render}\n")
+  rescue Sass::SyntaxError => err
+    assert_equal("Invalid CSS after \"#{after}\": expected #{expected}, was \"#{was}\"",
+      err.message)
+    assert_equal line, err.sass_line
+  end
+
+  def render(scss, options = {})
+    options[:syntax] ||= :scss
+    munge_filename options
+    Sass::Engine.new(scss, options).render
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/source_map_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/source_map_test.rb
new file mode 100755
index 0000000..812bfa2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/source_map_test.rb
@@ -0,0 +1,1052 @@
+# -*- coding: utf-8 -*-
+require File.dirname(__FILE__) + '/../test_helper'
+require File.dirname(__FILE__) + '/test_helper'
+
+class SourcemapTest < MiniTest::Test
+  def test_to_json_requires_args
+    _, sourcemap = render_with_sourcemap('')
+    assert_raises(ArgumentError) {sourcemap.to_json({})}
+    assert_raises(ArgumentError) {sourcemap.to_json({:css_path => 'foo'})}
+    assert_raises(ArgumentError) {sourcemap.to_json({:sourcemap_path => 'foo'})}
+  end
+
+  def test_simple_mapping_scss
+    assert_parses_with_sourcemap <<SCSS, <<CSS, <<JSON
+a {
+  foo: bar;
+/* SOME COMMENT */
+  font-size: 12px;
+}
+SCSS
+a {
+  foo: bar;
+  /* SOME COMMENT */
+  font-size: 12px; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+{
+"version": 3,
+"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
+"sources": ["test_simple_mapping_scss_inline.scss"],
+"names": [],
+"file": "test.css"
+}
+JSON
+  end
+
+  def test_simple_mapping_sass
+    silence_warnings {assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, :syntax => :sass}
+a
+  foo: bar
+  /* SOME COMMENT */
+  :font-size 12px
+SASS
+a {
+  foo: bar;
+  /* SOME COMMENT */
+  font-size: 12px; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+{
+"version": 3,
+"mappings": "AAAA,CAAC;EACC,GAAG,EAAE,GAAG;;EAEP,SAAS,EAAC,IAAI",
+"sources": ["test_simple_mapping_sass_inline.sass"],
+"names": [],
+"file": "test.css"
+}
+JSON
+  end
+
+  def test_simple_mapping_with_file_uris
+    uri = Sass::Util.file_uri_from_path(File.absolute_path(filename_for_test(:scss)))
+    assert_parses_with_sourcemap <<SCSS, <<CSS, <<JSON, :sourcemap => :file
+a {
+  foo: bar;
+/* SOME COMMENT */
+  font-size: 12px;
+}
+SCSS
+a {
+  foo: bar;
+  /* SOME COMMENT */
+  font-size: 12px; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+{
+"version": 3,
+"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
+"sources": ["#{uri}"],
+"names": [],
+"file": "test.css"
+}
+JSON
+  end
+
+  def test_mapping_with_directory_scss
+    options = {:filename => "scss/style.scss", :output => "css/style.css"}
+    assert_parses_with_sourcemap <<SCSS, <<CSS, <<JSON, options
+a {
+  foo: bar;
+/* SOME COMMENT */
+  font-size: 12px;
+}
+SCSS
+a {
+  foo: bar;
+  /* SOME COMMENT */
+  font-size: 12px; }
+
+/*# sourceMappingURL=style.css.map */
+CSS
+{
+"version": 3,
+"mappings": "AAAA,CAAE;EACA,GAAG,EAAE,GAAG;EACV,kBAAkB;EAChB,SAAS,EAAE,IAAI",
+"sources": ["../scss/style.scss"],
+"names": [],
+"file": "style.css"
+}
+JSON
+  end
+
+  def test_mapping_with_directory_sass
+    options = {:filename => "sass/style.sass", :output => "css/style.css", :syntax => :sass}
+    silence_warnings {assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, options}
+a
+  foo: bar
+  /* SOME COMMENT */
+  :font-size 12px
+SASS
+a {
+  foo: bar;
+  /* SOME COMMENT */
+  font-size: 12px; }
+
+/*# sourceMappingURL=style.css.map */
+CSS
+{
+"version": 3,
+"mappings": "AAAA,CAAC;EACC,GAAG,EAAE,GAAG;;EAEP,SAAS,EAAC,IAAI",
+"sources": ["../sass/style.sass"],
+"names": [],
+"file": "style.css"
+}
+JSON
+  end
+
+  def test_simple_charset_mapping_scss
+    assert_parses_with_sourcemap <<SCSS, <<CSS, <<JSON
+a {
+  fóó: bár;
+}
+SCSS
+@charset "UTF-8";
+a {
+  fóó: bár; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+{
+"version": 3,
+"mappings": ";AAAA,CAAE;EACA,GAAG,EAAE,GAAG",
+"sources": ["test_simple_charset_mapping_scss_inline.scss"],
+"names": [],
+"file": "test.css"
+}
+JSON
+  end
+
+  def test_simple_charset_mapping_sass
+    assert_parses_with_sourcemap <<SASS, <<CSS, <<JSON, :syntax => :sass
+a
+  fóó: bár
+SASS
+@charset "UTF-8";
+a {
+  fóó: bár; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+{
+"version": 3,
+"mappings": ";AAAA,CAAC;EACC,GAAG,EAAE,GAAG",
+"sources": ["test_simple_charset_mapping_sass_inline.sass"],
+"names": [],
+"file": "test.css"
+}
+JSON
+  end
+
+  def test_different_charset_than_encoding_scss
+    assert_parses_with_sourcemap(<<SCSS.force_encoding("IBM866"), <<CSS, <<JSON)
+@charset "IBM866";
+f\x86\x86 {
+  \x86: b;
+}
+SCSS
+@charset "UTF-8";
+fЖЖ {
+  Ж: b; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+{
+"version": 3,
+"mappings": ";AACA,GAAI;EACF,CAAC,EAAE,CAAC",
+"sources": ["test_different_charset_than_encoding_scss_inline.scss"],
+"names": [],
+"file": "test.css"
+}
+JSON
+  end
+
+  def test_different_charset_than_encoding_sass
+    assert_parses_with_sourcemap(<<SASS.force_encoding("IBM866"), <<CSS, <<JSON, :syntax => :sass)
+@charset "IBM866"
+f\x86\x86
+  \x86: b
+SASS
+@charset "UTF-8";
+fЖЖ {
+  Ж: b; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+{
+"version": 3,
+"mappings": ";AACA,GAAG;EACD,CAAC,EAAE,CAAC",
+"sources": ["test_different_charset_than_encoding_sass_inline.sass"],
+"names": [],
+"file": "test.css"
+}
+JSON
+  end
+
+  def test_import_sourcemap_scss
+    assert_parses_with_mapping <<'SCSS', <<'CSS'
+@import {{1}}url(foo){{/1}},{{2}}url(moo)   {{/2}},       {{3}}url(bar) {{/3}};
+@import {{4}}url(baz) screen print{{/4}};
+SCSS
+{{1}}@import url(foo){{/1}};
+{{2}}@import url(moo){{/2}};
+{{3}}@import url(bar){{/3}};
+{{4}}@import url(baz) screen print{{/4}};
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_import_sourcemap_sass
+    assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass
+@import {{1}}foo.css{{/1}},{{2}}moo.css{{/2}},      {{3}}bar.css{{/3}}
+@import {{4}}url(baz.css){{/4}}
+@import {{5}}url(qux.css) screen print{{/5}}
+SASS
+{{1}}@import url(foo.css){{/1}};
+{{2}}@import url(moo.css){{/2}};
+{{3}}@import url(bar.css){{/3}};
+{{4}}@import url(baz.css){{/4}};
+{{5}}@import url(qux.css) screen print{{/5}};
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_media_sourcemap_scss
+    assert_parses_with_mapping <<'SCSS', <<'CSS'
+{{1}}@media screen, tv  {{/1}}{
+  {{2}}body {{/2}}{
+    {{3}}max-width{{/3}}: {{4}}1070px{{/4}};
+  }
+}
+SCSS
+{{1}}@media screen, tv{{/1}} {
+  {{2}}body{{/2}} {
+    {{3}}max-width{{/3}}: {{4}}1070px{{/4}}; } }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_media_sourcemap_sass
+    assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass
+{{1}}@media screen, tv{{/1}}
+  {{2}}body{{/2}}
+    {{3}}max-width{{/3}}: {{4}}1070px{{/4}}
+SASS
+{{1}}@media screen, tv{{/1}} {
+  {{2}}body{{/2}} {
+    {{3}}max-width{{/3}}: {{4}}1070px{{/4}}; } }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_interpolation_and_vars_sourcemap_scss
+    assert_parses_with_mapping <<'SCSS', <<'CSS'
+$te: "te";
+$teal: {{5}}teal{{/5}};
+{{1}}p {{/1}}{
+  {{2}}con#{$te}nt{{/2}}: {{3}}"I a#{$te} #{5 + 10} pies!"{{/3}};
+  {{4}}color{{/4}}: $teal;
+}
+
+$name: foo;
+$attr: border;
+{{6}}p.#{$name} {{/6}}{
+  {{7}}#{$attr}-color{{/7}}: {{8}}blue{{/8}};
+  $font-size: 12px;
+  $line-height: 30px;
+  {{9}}font{{/9}}: {{10}}#{$font-size}/#{$line-height}{{/10}};
+}
+SCSS
+{{1}}p{{/1}} {
+  {{2}}content{{/2}}: {{3}}"I ate 15 pies!"{{/3}};
+  {{4}}color{{/4}}: {{5}}teal{{/5}}; }
+
+{{6}}p.foo{{/6}} {
+  {{7}}border-color{{/7}}: {{8}}blue{{/8}};
+  {{9}}font{{/9}}: {{10}}12px/30px{{/10}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_interpolation_and_vars_sourcemap_sass
+    assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass
+$te: "te"
+$teal: {{5}}teal{{/5}}
+{{1}}p{{/1}}
+  {{2}}con#{$te}nt{{/2}}: {{3}}"I a#{$te} #{5 + 10} pies!"{{/3}}
+  {{4}}color{{/4}}: $teal
+
+$name: foo
+$attr: border
+{{6}}p.#{$name}{{/6}}
+  {{7}}#{$attr}-color{{/7}}: {{8}}blue{{/8}}
+  $font-size: 12px
+  $line-height: 30px
+  {{9}}font{{/9}}: {{10}}#{$font-size}/#{$line-height}{{/10}}
+SASS
+{{1}}p{{/1}} {
+  {{2}}content{{/2}}: {{3}}"I ate 15 pies!"{{/3}};
+  {{4}}color{{/4}}: {{5}}teal{{/5}}; }
+
+{{6}}p.foo{{/6}} {
+  {{7}}border-color{{/7}}: {{8}}blue{{/8}};
+  {{9}}font{{/9}}: {{10}}12px/30px{{/10}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_selectors_properties_sourcemap_scss
+    assert_parses_with_mapping <<'SCSS', <<'CSS'
+$width: 2px;
+$translucent-red: rgba(255, 0, 0, 0.5);
+{{1}}a {{/1}}{
+  {{9}}.special {{/9}}{
+    {{10}}color{{/10}}: {{11}}red{{/11}};
+    {{12}}&:hover {{/12}}{
+      {{13}}foo{{/13}}: {{14}}bar{{/14}};
+      {{15}}cursor{{/15}}: {{16}}e + -resize{{/16}};
+      {{17}}color{{/17}}: {{18}}opacify($translucent-red, 0.3){{/18}};
+    }
+    {{19}}&:after {{/19}}{
+      {{20}}content{{/20}}: {{21}}"I ate #{5 + 10} pies #{$width} thick!"{{/21}};
+    }
+  }
+  {{22}}&:active {{/22}}{
+    {{23}}border{{/23}}: {{24}}$width solid black{{/24}};
+  }
+{{2}}/* SOME COMMENT */{{/2}}
+  {{3}}font{{/3}}: {{4}}2px/3px {{/4}}{
+    {{5}}family{{/5}}: {{6}}fantasy{{/6}};
+    {{7}}size{{/7}}: {{8}}1em + (2em * 3){{/8}};
+  }
+}
+SCSS
+{{1}}a{{/1}} {
+  {{2}}/* SOME COMMENT */{{/2}}
+  {{3}}font{{/3}}: {{4}}2px/3px{{/4}};
+    {{5}}font-family{{/5}}: {{6}}fantasy{{/6}};
+    {{7}}font-size{{/7}}: {{8}}7em{{/8}}; }
+  {{9}}a .special{{/9}} {
+    {{10}}color{{/10}}: {{11}}red{{/11}}; }
+    {{12}}a .special:hover{{/12}} {
+      {{13}}foo{{/13}}: {{14}}bar{{/14}};
+      {{15}}cursor{{/15}}: {{16}}e-resize{{/16}};
+      {{17}}color{{/17}}: {{18}}rgba(255, 0, 0, 0.8){{/18}}; }
+    {{19}}a .special:after{{/19}} {
+      {{20}}content{{/20}}: {{21}}"I ate 15 pies 2px thick!"{{/21}}; }
+  {{22}}a:active{{/22}} {
+    {{23}}border{{/23}}: {{24}}2px solid black{{/24}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_selectors_properties_sourcemap_sass
+    assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass
+$width: 2px
+$translucent-red: rgba(255, 0, 0, 0.5)
+{{1}}a{{/1}}
+  {{9}}.special{{/9}}
+    {{10}}color{{/10}}: {{11}}red{{/11}}
+    {{12}}&:hover{{/12}}
+      {{13}}foo{{/13}}: {{14}}bar{{/14}}
+      {{15}}cursor{{/15}}: {{16}}e + -resize{{/16}}
+      {{17}}color{{/17}}: {{18}}opacify($translucent-red, 0.3){{/18}}
+    {{19}}&:after{{/19}}
+      {{20}}content{{/20}}: {{21}}"I ate #{5 + 10} pies #{$width} thick!"{{/21}}
+  {{22}}&:active{{/22}}
+    {{23}}border{{/23}}: {{24}}$width solid black{{/24}}
+
+  {{2}}/* SOME COMMENT */{{/2}}
+  {{3}}font{{/3}}: {{4}}2px/3px{{/4}}
+    {{5}}family{{/5}}: {{6}}fantasy{{/6}}
+    {{7}}size{{/7}}: {{8}}1em + (2em * 3){{/8}}
+SASS
+{{1}}a{{/1}} {
+  {{2}}/* SOME COMMENT */{{/2}}
+  {{3}}font{{/3}}: {{4}}2px/3px{{/4}};
+    {{5}}font-family{{/5}}: {{6}}fantasy{{/6}};
+    {{7}}font-size{{/7}}: {{8}}7em{{/8}}; }
+  {{9}}a .special{{/9}} {
+    {{10}}color{{/10}}: {{11}}red{{/11}}; }
+    {{12}}a .special:hover{{/12}} {
+      {{13}}foo{{/13}}: {{14}}bar{{/14}};
+      {{15}}cursor{{/15}}: {{16}}e-resize{{/16}};
+      {{17}}color{{/17}}: {{18}}rgba(255, 0, 0, 0.8){{/18}}; }
+    {{19}}a .special:after{{/19}} {
+      {{20}}content{{/20}}: {{21}}"I ate 15 pies 2px thick!"{{/21}}; }
+  {{22}}a:active{{/22}} {
+    {{23}}border{{/23}}: {{24}}2px solid black{{/24}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_extend_sourcemap_scss
+    assert_parses_with_mapping <<'SCSS', <<'CSS'
+{{1}}.error {{/1}}{
+  {{2}}border{{/2}}: {{3}}1px #ff00aa{{/3}};
+  {{4}}background-color{{/4}}: {{5}}#fdd{{/5}};
+}
+{{6}}.seriousError {{/6}}{
+  @extend .error;
+  {{7}}border-width{{/7}}: {{8}}3px{{/8}};
+}
+SCSS
+{{1}}.error, .seriousError{{/1}} {
+  {{2}}border{{/2}}: {{3}}1px #ff00aa{{/3}};
+  {{4}}background-color{{/4}}: {{5}}#fdd{{/5}}; }
+
+{{6}}.seriousError{{/6}} {
+  {{7}}border-width{{/7}}: {{8}}3px{{/8}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_extend_sourcemap_sass
+    assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass
+{{1}}.error{{/1}}
+  {{2}}border{{/2}}: {{3}}1px #f00{{/3}}
+  {{4}}background-color{{/4}}: {{5}}#fdd{{/5}}
+
+{{6}}.seriousError{{/6}}
+  @extend .error
+  {{7}}border-width{{/7}}: {{8}}3px{{/8}}
+SASS
+{{1}}.error, .seriousError{{/1}} {
+  {{2}}border{{/2}}: {{3}}1px #f00{{/3}};
+  {{4}}background-color{{/4}}: {{5}}#fdd{{/5}}; }
+
+{{6}}.seriousError{{/6}} {
+  {{7}}border-width{{/7}}: {{8}}3px{{/8}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_for_sourcemap_scss
+    assert_parses_with_mapping <<'SCSS', <<'CSS'
+@for $i from 1 through 3 {
+  {{1}}{{4}}{{7}}.item-#{$i} {{/1}}{{/4}}{{/7}}{ {{2}}{{5}}{{8}}width{{/2}}{{/5}}{{/8}}: {{3}}{{6}}{{9}}2em * $i{{/3}}{{/6}}{{/9}}; }
+}
+SCSS
+{{1}}.item-1{{/1}} {
+  {{2}}width{{/2}}: {{3}}2em{{/3}}; }
+
+{{4}}.item-2{{/4}} {
+  {{5}}width{{/5}}: {{6}}4em{{/6}}; }
+
+{{7}}.item-3{{/7}} {
+  {{8}}width{{/8}}: {{9}}6em{{/9}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_for_sourcemap_sass
+    assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass
+@for $i from 1 through 3
+  {{1}}{{4}}{{7}}.item-#{$i}{{/1}}{{/4}}{{/7}}
+    {{2}}{{5}}{{8}}width{{/2}}{{/5}}{{/8}}: {{3}}{{6}}{{9}}2em * $i{{/3}}{{/6}}{{/9}}
+SASS
+{{1}}.item-1{{/1}} {
+  {{2}}width{{/2}}: {{3}}2em{{/3}}; }
+
+{{4}}.item-2{{/4}} {
+  {{5}}width{{/5}}: {{6}}4em{{/6}}; }
+
+{{7}}.item-3{{/7}} {
+  {{8}}width{{/8}}: {{9}}6em{{/9}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_while_sourcemap_scss
+    assert_parses_with_mapping <<'SCSS', <<'CSS'
+$i: 6;
+@while $i > 0 {
+  {{1}}{{4}}{{7}}.item-#{$i} {{/1}}{{/4}}{{/7}}{ {{2}}{{5}}{{8}}width{{/2}}{{/5}}{{/8}}: {{3}}{{6}}{{9}}2em * $i{{/3}}{{/6}}{{/9}}; }
+  $i: $i - 2 !global;
+}
+SCSS
+{{1}}.item-6{{/1}} {
+  {{2}}width{{/2}}: {{3}}12em{{/3}}; }
+
+{{4}}.item-4{{/4}} {
+  {{5}}width{{/5}}: {{6}}8em{{/6}}; }
+
+{{7}}.item-2{{/7}} {
+  {{8}}width{{/8}}: {{9}}4em{{/9}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_while_sourcemap_sass
+  assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass
+$i: 6
+@while $i > 0
+  {{1}}{{4}}{{7}}.item-#{$i}{{/1}}{{/4}}{{/7}}
+    {{2}}{{5}}{{8}}width{{/2}}{{/5}}{{/8}}: {{3}}{{6}}{{9}}2em * $i{{/3}}{{/6}}{{/9}}
+    $i: $i - 2 !global
+SASS
+{{1}}.item-6{{/1}} {
+  {{2}}width{{/2}}: {{3}}12em{{/3}}; }
+
+{{4}}.item-4{{/4}} {
+  {{5}}width{{/5}}: {{6}}8em{{/6}}; }
+
+{{7}}.item-2{{/7}} {
+  {{8}}width{{/8}}: {{9}}4em{{/9}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_each_sourcemap_scss
+    assert_parses_with_mapping <<'SCSS', <<'CSS'
+@each $animal in puma, sea-slug, egret, salamander {
+  {{1}}{{4}}{{7}}{{10}}.#{$animal}-icon {{/1}}{{/4}}{{/7}}{{/10}}{
+    {{2}}{{5}}{{8}}{{11}}background-image{{/2}}{{/5}}{{/8}}{{/11}}: {{3}}{{6}}{{9}}{{12}}url('/images/#{$animal}.png'){{/3}}{{/6}}{{/9}}{{/12}};
+  }
+}
+SCSS
+{{1}}.puma-icon{{/1}} {
+  {{2}}background-image{{/2}}: {{3}}url("/images/puma.png"){{/3}}; }
+
+{{4}}.sea-slug-icon{{/4}} {
+  {{5}}background-image{{/5}}: {{6}}url("/images/sea-slug.png"){{/6}}; }
+
+{{7}}.egret-icon{{/7}} {
+  {{8}}background-image{{/8}}: {{9}}url("/images/egret.png"){{/9}}; }
+
+{{10}}.salamander-icon{{/10}} {
+  {{11}}background-image{{/11}}: {{12}}url("/images/salamander.png"){{/12}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_each_sourcemap_sass
+    assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass
+@each $animal in puma, sea-slug, egret, salamander
+  {{1}}{{4}}{{7}}{{10}}.#{$animal}-icon{{/1}}{{/4}}{{/7}}{{/10}}
+    {{2}}{{5}}{{8}}{{11}}background-image{{/2}}{{/5}}{{/8}}{{/11}}: {{3}}{{6}}{{9}}{{12}}url('/images/#{$animal}.png'){{/3}}{{/6}}{{/9}}{{/12}}
+SASS
+{{1}}.puma-icon{{/1}} {
+  {{2}}background-image{{/2}}: {{3}}url("/images/puma.png"){{/3}}; }
+
+{{4}}.sea-slug-icon{{/4}} {
+  {{5}}background-image{{/5}}: {{6}}url("/images/sea-slug.png"){{/6}}; }
+
+{{7}}.egret-icon{{/7}} {
+  {{8}}background-image{{/8}}: {{9}}url("/images/egret.png"){{/9}}; }
+
+{{10}}.salamander-icon{{/10}} {
+  {{11}}background-image{{/11}}: {{12}}url("/images/salamander.png"){{/12}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_mixin_sourcemap_scss
+    assert_parses_with_mapping <<'SCSS', <<'CSS'
+@mixin large-text {
+  font: {
+    {{2}}size{{/2}}: {{3}}20px{{/3}};
+    {{4}}weight{{/4}}: {{5}}bold{{/5}};
+  }
+  {{6}}color{{/6}}: {{7}}#ff0000{{/7}};
+}
+
+{{1}}.page-title {{/1}}{
+  @include large-text;
+  {{8}}padding{{/8}}: {{9}}4px{{/9}};
+}
+
+@mixin dashed-border($color, $width: {{14}}1in{{/14}}) {
+  border: {
+    {{11}}{{18}}color{{/11}}{{/18}}: $color;
+    {{13}}{{20}}width{{/13}}{{/20}}: $width;
+    {{15}}{{22}}style{{/15}}{{/22}}: {{16}}{{23}}dashed{{/16}}{{/23}};
+  }
+}
+
+{{10}}p {{/10}}{ @include dashed-border({{12}}blue{{/12}}); }
+{{17}}h1 {{/17}}{ @include dashed-border({{19}}blue{{/19}}, {{21}}2in{{/21}}); }
+
+@mixin box-shadow($shadows...) {
+  {{25}}-moz-box-shadow{{/25}}: {{26}}$shadows{{/26}};
+  {{27}}-webkit-box-shadow{{/27}}: {{28}}$shadows{{/28}};
+  {{29}}box-shadow{{/29}}: {{30}}$shadows{{/30}};
+}
+
+{{24}}.shadows {{/24}}{
+  @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
+}
+SCSS
+{{1}}.page-title{{/1}} {
+  {{2}}font-size{{/2}}: {{3}}20px{{/3}};
+  {{4}}font-weight{{/4}}: {{5}}bold{{/5}};
+  {{6}}color{{/6}}: {{7}}#ff0000{{/7}};
+  {{8}}padding{{/8}}: {{9}}4px{{/9}}; }
+
+{{10}}p{{/10}} {
+  {{11}}border-color{{/11}}: {{12}}blue{{/12}};
+  {{13}}border-width{{/13}}: {{14}}1in{{/14}};
+  {{15}}border-style{{/15}}: {{16}}dashed{{/16}}; }
+
+{{17}}h1{{/17}} {
+  {{18}}border-color{{/18}}: {{19}}blue{{/19}};
+  {{20}}border-width{{/20}}: {{21}}2in{{/21}};
+  {{22}}border-style{{/22}}: {{23}}dashed{{/23}}; }
+
+{{24}}.shadows{{/24}} {
+  {{25}}-moz-box-shadow{{/25}}: {{26}}0px 4px 5px #666, 2px 6px 10px #999{{/26}};
+  {{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #666, 2px 6px 10px #999{{/28}};
+  {{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #666, 2px 6px 10px #999{{/30}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+def test_mixin_sourcemap_sass
+  silence_warnings {assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass}
+=large-text
+  :font
+    {{2}}size{{/2}}: {{3}}20px{{/3}}
+    {{4}}weight{{/4}}: {{5}}bold{{/5}}
+  {{6}}color{{/6}}: {{7}}#ff0000{{/7}}
+
+{{1}}.page-title{{/1}}
+  +large-text
+  {{8}}padding{{/8}}: {{9}}4px{{/9}}
+
+=dashed-border($color, $width: {{14}}1in{{/14}})
+  border:
+    {{11}}{{18}}color{{/11}}{{/18}}: $color
+    {{13}}{{20}}width{{/13}}{{/20}}: $width
+    {{15}}{{22}}style{{/15}}{{/22}}: {{16}}{{23}}dashed{{/16}}{{/23}}
+
+{{10}}p{{/10}}
+  +dashed-border({{12}}blue{{/12}})
+
+{{17}}h1{{/17}}
+  +dashed-border({{19}}blue{{/19}}, {{21}}2in{{/21}})
+
+=box-shadow($shadows...)
+  {{25}}-moz-box-shadow{{/25}}: {{26}}$shadows{{/26}}
+  {{27}}-webkit-box-shadow{{/27}}: {{28}}$shadows{{/28}}
+  {{29}}box-shadow{{/29}}: {{30}}$shadows{{/30}}
+
+{{24}}.shadows{{/24}}
+  +box-shadow(0px 4px 5px #666, 2px 6px 10px #999)
+SASS
+{{1}}.page-title{{/1}} {
+  {{2}}font-size{{/2}}: {{3}}20px{{/3}};
+  {{4}}font-weight{{/4}}: {{5}}bold{{/5}};
+  {{6}}color{{/6}}: {{7}}#ff0000{{/7}};
+  {{8}}padding{{/8}}: {{9}}4px{{/9}}; }
+
+{{10}}p{{/10}} {
+  {{11}}border-color{{/11}}: {{12}}blue{{/12}};
+  {{13}}border-width{{/13}}: {{14}}1in{{/14}};
+  {{15}}border-style{{/15}}: {{16}}dashed{{/16}}; }
+
+{{17}}h1{{/17}} {
+  {{18}}border-color{{/18}}: {{19}}blue{{/19}};
+  {{20}}border-width{{/20}}: {{21}}2in{{/21}};
+  {{22}}border-style{{/22}}: {{23}}dashed{{/23}}; }
+
+{{24}}.shadows{{/24}} {
+  {{25}}-moz-box-shadow{{/25}}: {{26}}0px 4px 5px #666, 2px 6px 10px #999{{/26}};
+  {{27}}-webkit-box-shadow{{/27}}: {{28}}0px 4px 5px #666, 2px 6px 10px #999{{/28}};
+  {{29}}box-shadow{{/29}}: {{30}}0px 4px 5px #666, 2px 6px 10px #999{{/30}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+end
+
+  def test_function_sourcemap_scss
+    assert_parses_with_mapping <<'SCSS', <<'CSS'
+$grid-width: 20px;
+$gutter-width: 5px;
+
+@function grid-width($n) {
+  @return $n * $grid-width + ($n - 1) * $gutter-width;
+}
+{{1}}sidebar {{/1}}{ {{2}}width{{/2}}: {{3}}grid-width(5){{/3}}; }
+SCSS
+{{1}}sidebar{{/1}} {
+  {{2}}width{{/2}}: {{3}}120px{{/3}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_function_sourcemap_sass
+    assert_parses_with_mapping <<'SASS', <<'CSS', :syntax => :sass
+$grid-width: 20px
+$gutter-width: 5px
+
+@function grid-width($n)
+  @return $n * $grid-width + ($n - 1) * $gutter-width
+
+{{1}}sidebar{{/1}}
+  {{2}}width{{/2}}: {{3}}grid-width(5){{/3}}
+SASS
+{{1}}sidebar{{/1}} {
+  {{2}}width{{/2}}: {{3}}120px{{/3}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  # Regression tests
+
+  def test_properties_sass
+    silence_warnings {assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass}
+{{1}}.foo{{/1}}
+  :{{2}}name{{/2}} {{3}}value{{/3}}
+  {{4}}name{{/4}}: {{5}}value{{/5}}
+  :{{6}}name{{/6}}  {{7}}value{{/7}}
+  {{8}}name{{/8}}:  {{9}}value{{/9}}
+SASS
+{{1}}.foo{{/1}} {
+  {{2}}name{{/2}}: {{3}}value{{/3}};
+  {{4}}name{{/4}}: {{5}}value{{/5}};
+  {{6}}name{{/6}}: {{7}}value{{/7}};
+  {{8}}name{{/8}}: {{9}}value{{/9}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_multiline_script_scss
+    assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
+$var: {{3}}foo +
+    bar{{/3}}; {{1}}x {{/1}}{ {{2}}y{{/2}}: $var }
+SCSS
+{{1}}x{{/1}} {
+  {{2}}y{{/2}}: {{3}}foobar{{/3}}; }
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_multiline_interpolation_source_range
+    engine = Sass::Engine.new(<<-SCSS, :cache => false, :syntax => :scss)
+p {
+  filter: progid:DXImageTransform(
+          '\#{123}');
+}
+SCSS
+
+    interpolated = engine.to_tree.children.
+      first.children.
+      first.value.first.children[1]
+    assert_equal "123", interpolated.to_sass
+    range = interpolated.source_range
+    assert_equal 3, range.start_pos.line
+    assert_equal 14, range.start_pos.offset
+    assert_equal 3, range.end_pos.line
+    assert_equal 17, range.end_pos.offset
+  end
+
+  def test_list_source_range
+    engine = Sass::Engine.new(<<-SCSS, :cache => false, :syntax => :scss)
+@each $a, $b in (1, 2), (2, 4), (3, 6) { }
+SCSS
+    list = engine.to_tree.children.first.list
+    assert_equal 1, list.source_range.start_pos.line
+    assert_equal 1, list.source_range.end_pos.line
+    assert_equal 16, list.source_range.start_pos.offset
+    assert_equal 38, list.source_range.end_pos.offset
+  end
+
+  def test_sources_array_is_uri_escaped
+    map = Sass::Source::Map.new
+    importer = Sass::Importers::Filesystem.new('.')
+    map.add(
+      Sass::Source::Range.new(
+        Sass::Source::Position.new(0, 0),
+        Sass::Source::Position.new(0, 10),
+        'source file.scss',
+        importer),
+      Sass::Source::Range.new(
+        Sass::Source::Position.new(0, 0),
+        Sass::Source::Position.new(0, 10),
+        nil, nil))
+
+    json = map.to_json(:css_path => 'output file.css', :sourcemap_path => 'output file.css.map')
+    assert_equal json, <<JSON.rstrip
+{
+"version": 3,
+"mappings": "DADD,UAAU",
+"sources": ["source%20file.scss"],
+"names": [],
+"file": "output%20file.css"
+}
+JSON
+  end
+
+  def test_scss_comment_source_range
+    assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
+$var: val; {{1}}/* text */{{/1}}
+
+{{2}}/* multiline
+   comment */{{/2}}
+SCSS
+{{1}}/* text */{{/1}}
+{{2}}/* multiline
+   comment */{{/2}}
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_sass_comment_source_range
+    assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
+{{1}}body{{/1}}
+  {{2}}/* text */{{/2}}
+
+{{3}}/* multiline
+   comment */{{/3}}
+SASS
+{{1}}body{{/1}} {
+  {{2}}/* text */{{/2}} }
+
+{{3}}/* multiline
+ * comment */{{/3}}
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_scss_comment_interpolation_source_range
+    assert_parses_with_mapping <<SCSS, <<CSS, :syntax => :scss
+$var: 2; {{1}}/* two \#{$var} and four \#{2 * $var} */{{/1}}
+
+{{2}}/* multiline
+   comment \#{ 2 + 2 } and \#{ 2 +
+   2 } */{{/2}}
+SCSS
+{{1}}/* two 2 and four 4 */{{/1}}
+{{2}}/* multiline
+   comment 4 and 4 */{{/2}}
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  def test_sass_comment_interpolation_source_range
+    assert_parses_with_mapping <<SASS, <<CSS, :syntax => :sass
+$var: 2
+{{1}}/* two \#{$var} and four \#{2 * $var} */{{/1}}
+
+{{2}}/* multiline
+   comment \#{ 2 + 2 } and \#{ 2 +
+   2 } */{{/2}}
+SASS
+{{1}}/* two 2 and four 4 */{{/1}}
+{{2}}/* multiline
+ * comment 4 and 4 */{{/2}}
+
+/*# sourceMappingURL=test.css.map */
+CSS
+  end
+
+  private
+
+  ANNOTATION_REGEX = /\{\{(\/?)([^}]+)\}\}/
+
+  def build_ranges(text, file_name = nil)
+    ranges = Hash.new {|h, k| h[k] = []}
+    start_positions = {}
+    text.split("\n").each_with_index do |line_text, line|
+      line += 1 # lines shoud be 1-based
+      while (match = line_text.match(ANNOTATION_REGEX))
+        closing = !match[1].empty?
+        name = match[2]
+        match_offsets = match.offset(0)
+        offset = match_offsets[0] + 1 # Offsets are 1-based in source maps.
+        assert(!closing || start_positions[name], "Closing annotation #{name} found before opening one.")
+        position = Sass::Source::Position.new(line, offset)
+        if closing
+          ranges[name] << Sass::Source::Range.new(
+            start_positions[name], position, file_name,
+            Sass::Importers::Filesystem.new('.'))
+          start_positions.delete name
+        else
+          assert(!start_positions[name], "Overlapping range annotation #{name} encountered on line #{line}")
+          start_positions[name] = position
+        end
+        line_text.slice!(match_offsets[0], match_offsets[1] - match_offsets[0])
+      end
+    end
+    ranges
+  end
+
+  def build_mapping_from_annotations(source, css, source_file_name)
+    source_ranges = build_ranges(source, source_file_name)
+    target_ranges = build_ranges(css)
+    map = Sass::Source::Map.new
+    source_ranges.map do |(name, sources)|
+        assert(sources.length == 1, "#{sources.length} source ranges encountered for annotation #{name}")
+        assert(target_ranges[name], "No target ranges for annotation #{name}")
+        target_ranges[name].map {|target_range| [sources.first, target_range]}
+      end.
+      flatten(1).
+      sort_by {|(_, target)| [target.start_pos.line, target.start_pos.offset]}.
+      each {|(s2, target)| map.add(s2, target)}
+    map
+  end
+
+  def assert_parses_with_mapping(source, css, options={})
+    options[:syntax] ||= :scss
+    input_filename = filename_for_test(options[:syntax])
+    mapping = build_mapping_from_annotations(source, css, input_filename)
+    source.gsub!(ANNOTATION_REGEX, "")
+    css.gsub!(ANNOTATION_REGEX, "")
+    rendered, sourcemap = render_with_sourcemap(source, options)
+    assert_equal css.rstrip, rendered.rstrip
+    assert_sourcemaps_equal source, css, mapping, sourcemap
+  end
+
+  def assert_positions_equal(expected, actual, lines, message = nil)
+    prefix = message ? message + ": " : ""
+    expected_location = lines[expected.line - 1] + "\n" + ("-" * (expected.offset - 1)) + "^"
+    actual_location = lines[actual.line - 1] + "\n" + ("-" * (actual.offset - 1)) + "^"
+    assert_equal(expected.line, actual.line, prefix +
+      "Expected #{expected.inspect}\n" +
+      expected_location + "\n\n" +
+      "But was #{actual.inspect}\n" +
+      actual_location)
+    assert_equal(expected.offset, actual.offset, prefix +
+      "Expected #{expected.inspect}\n" +
+      expected_location + "\n\n" +
+      "But was #{actual.inspect}\n" +
+      actual_location)
+  end
+
+  def assert_ranges_equal(expected, actual, lines, prefix)
+    assert_positions_equal(expected.start_pos, actual.start_pos, lines, prefix + " start position")
+    assert_positions_equal(expected.end_pos, actual.end_pos, lines, prefix + " end position")
+    if expected.file.nil?
+      assert_nil(actual.file)
+    else
+      assert_equal(expected.file, actual.file)
+    end
+  end
+
+  def assert_sourcemaps_equal(source, css, expected, actual)
+    assert_equal(expected.data.length, actual.data.length, <<MESSAGE)
+Wrong number of mappings. Expected:
+#{dump_sourcemap_as_expectation(source, css, expected).gsub(/^/, '| ')}
+
+Actual:
+#{dump_sourcemap_as_expectation(source, css, actual).gsub(/^/, '| ')}
+MESSAGE
+    source_lines = source.split("\n")
+    css_lines = css.split("\n")
+    expected.data.zip(actual.data) do |expected_mapping, actual_mapping|
+      assert_ranges_equal(expected_mapping.input, actual_mapping.input, source_lines, "Input")
+      assert_ranges_equal(expected_mapping.output, actual_mapping.output, css_lines, "Output")
+    end
+  end
+
+  def assert_parses_with_sourcemap(source, css, sourcemap_json, options={})
+    rendered, sourcemap = render_with_sourcemap(source, options)
+    css_path = options[:output] || "test.css"
+    sourcemap_path = Sass::Util.sourcemap_name(css_path)
+    rendered_json = sourcemap.to_json(:css_path => css_path, :sourcemap_path => sourcemap_path, :type => options[:sourcemap])
+
+    assert_equal css.rstrip, rendered.rstrip
+    assert_equal sourcemap_json.rstrip, rendered_json
+  end
+
+  def render_with_sourcemap(source, options={})
+    options[:syntax] ||= :scss
+    munge_filename options
+    engine = Sass::Engine.new(source, options)
+    engine.options[:cache] = false
+    sourcemap_path = Sass::Util.sourcemap_name(options[:output] || "test.css")
+    engine.render_with_sourcemap File.basename(sourcemap_path)
+  end
+
+  def dump_sourcemap_as_expectation(source, css, sourcemap)
+    mappings_to_annotations(source, sourcemap.data.map {|d| d.input}) + "\n\n" +
+      "=" * 20 + " maps to:\n\n" +
+      mappings_to_annotations(css, sourcemap.data.map {|d| d.output})
+  end
+
+  def mappings_to_annotations(source, ranges)
+    additional_offsets = Hash.new(0)
+    lines = source.split("\n")
+
+    add_annotation = lambda do |pos, str|
+      line_num = pos.line - 1
+      line = lines[line_num]
+      offset = pos.offset + additional_offsets[line_num] - 1
+      line << " " * (offset - line.length) if offset > line.length
+      line.insert(offset, str)
+      additional_offsets[line_num] += str.length
+    end
+
+    ranges.each_with_index do |range, i|
+      add_annotation[range.start_pos, "{{#{i + 1}}}"]
+      add_annotation[range.end_pos, "{{/#{i + 1}}}"]
+    end
+
+    return lines.join("\n")
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/superselector_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/superselector_test.rb
new file mode 100755
index 0000000..bafd2b5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/superselector_test.rb
@@ -0,0 +1,209 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class SuperselectorTest < MiniTest::Test
+  def test_superselector_reflexivity
+    assert_superselector 'h1', 'h1'
+    assert_superselector '.foo', '.foo'
+    assert_superselector '#foo > .bar, baz', '#foo > .bar, baz'
+  end
+
+  def test_smaller_compound_superselector
+    assert_strict_superselector '.foo', '.foo.bar'
+    assert_strict_superselector '.bar', '.foo.bar'
+    assert_strict_superselector 'a', 'a#b'
+    assert_strict_superselector '#b', 'a#b'
+  end
+
+  def test_smaller_complex_superselector
+    assert_strict_superselector '.bar', '.foo .bar'
+    assert_strict_superselector '.bar', '.foo > .bar'
+    assert_strict_superselector '.bar', '.foo + .bar'
+    assert_strict_superselector '.bar', '.foo ~ .bar'
+  end
+
+  def test_selector_list_subset_superselector
+    assert_strict_superselector '.foo, .bar', '.foo'
+    assert_strict_superselector '.foo, .bar, .baz', '.foo, .baz'
+    assert_strict_superselector '.foo, .baz, .qux', '.foo.bar, .baz.bang'
+  end
+
+  def test_leading_combinator_superselector
+    refute_superselector '+ .foo', '.foo'
+    refute_superselector '+ .foo', '.bar + .foo'
+  end
+
+  def test_trailing_combinator_superselector
+    refute_superselector '.foo +', '.foo'
+    refute_superselector '.foo +', '.foo + .bar'
+  end
+
+  def test_matching_combinator_superselector
+    assert_strict_superselector '.foo + .bar', '.foo + .bar.baz'
+    assert_strict_superselector '.foo + .bar', '.foo.baz + .bar'
+    assert_strict_superselector '.foo > .bar', '.foo > .bar.baz'
+    assert_strict_superselector '.foo > .bar', '.foo.baz > .bar'
+    assert_strict_superselector '.foo ~ .bar', '.foo ~ .bar.baz'
+    assert_strict_superselector '.foo ~ .bar', '.foo.baz ~ .bar'
+  end
+
+  def test_following_sibling_is_superselector_of_next_sibling
+    assert_strict_superselector '.foo ~ .bar', '.foo + .bar.baz'
+    assert_strict_superselector '.foo ~ .bar', '.foo.baz + .bar'
+  end
+
+  def test_descendant_is_superselector_of_child
+    assert_strict_superselector '.foo .bar', '.foo > .bar.baz'
+    assert_strict_superselector '.foo .bar', '.foo.baz > .bar'
+    assert_strict_superselector '.foo .baz', '.foo > .bar > .baz'
+  end
+
+  def test_child_isnt_superselector_of_longer_child
+    refute_superselector '.foo > .baz', '.foo > .bar > .baz'
+    refute_superselector '.foo > .baz', '.foo > .bar .baz'
+  end
+
+  def test_following_sibling_isnt_superselector_of_longer_following_sibling
+    refute_superselector '.foo + .baz', '.foo + .bar + .baz'
+    refute_superselector '.foo + .baz', '.foo + .bar .baz'
+  end
+
+  def test_sibling_isnt_superselector_of_longer_sibling
+    # This actually is a superselector, but it's a very narrow edge case and
+    # detecting it is very difficult and may be exponential in the worst case.
+    refute_superselector '.foo ~ .baz', '.foo ~ .bar ~ .baz'
+
+    refute_superselector '.foo ~ .baz', '.foo ~ .bar .baz'
+  end
+
+  def test_matches_is_superselector_of_constituent_selectors
+    %w[matches -moz-any].each do |name|
+      assert_strict_superselector ":#{name}(.foo, .bar)", '.foo.baz'
+      assert_strict_superselector ":#{name}(.foo, .bar)", '.bar.baz'
+      assert_strict_superselector ":#{name}(.foo .bar, .baz)", '.x .foo .bar'
+    end
+  end
+
+  def test_matches_is_superselector_of_subset_matches
+    assert_strict_superselector ':matches(.foo, .bar, .baz)', '#x:matches(.foo.bip, .baz.bang)'
+    assert_strict_superselector ':-moz-any(.foo, .bar, .baz)', '#x:-moz-any(.foo.bip, .baz.bang)'
+  end
+
+  def test_matches_is_not_superselector_of_any
+    refute_superselector ':matches(.foo, .bar)', ':-moz-any(.foo, .bar)'
+    refute_superselector ':-moz-any(.foo, .bar)', ':matches(.foo, .bar)'
+  end
+
+  def test_matches_can_be_subselector
+    %w[matches -moz-any].each do |name|
+      assert_superselector '.foo', ":#{name}(.foo.bar)"
+      assert_superselector '.foo.bar', ":#{name}(.foo.bar.baz)"
+      assert_superselector '.foo', ":#{name}(.foo.bar, .foo.baz)"
+    end
+  end
+
+  def test_any_is_not_superselector_of_different_prefix
+    refute_superselector ':-moz-any(.foo, .bar)', ':-s-any(.foo, .bar)'
+  end
+
+  def test_not_is_superselector_of_less_complex_not
+    assert_strict_superselector ':not(.foo.bar)', ':not(.foo)'
+    assert_strict_superselector ':not(.foo .bar)', ':not(.bar)'
+  end
+
+  def test_not_is_superselector_of_superset
+    assert_strict_superselector ':not(.foo.bip, .baz.bang)', ':not(.foo, .bar, .baz)'
+    assert_strict_superselector ':not(.foo.bip, .baz.bang)', ':not(.foo):not(.bar):not(.baz)'
+  end
+
+  def test_not_is_superselector_of_unique_selectors
+    assert_strict_superselector ':not(h1.foo)', 'a'
+    assert_strict_superselector ':not(.baz #foo)', '#bar'
+  end
+
+  def test_not_is_not_superselector_of_non_unique_selectors
+    refute_superselector ':not(.foo)', '.bar'
+    refute_superselector ':not(:hover)', ':visited'
+  end
+
+  def test_current_is_superselector_with_identical_innards
+    assert_superselector ':current(.foo)', ':current(.foo)'
+  end
+
+  def test_current_is_superselector_with_subselector_innards
+    refute_superselector ':current(.foo)', ':current(.foo.bar)'
+    refute_superselector ':current(.foo.bar)', ':current(.foo)'
+  end
+
+  def test_nth_match_is_superselector_of_subset_nth_match
+    assert_strict_superselector(
+      ':nth-child(2n of .foo, .bar, .baz)', '#x:nth-child(2n of .foo.bip, .baz.bang)')
+    assert_strict_superselector(
+      ':nth-last-child(2n of .foo, .bar, .baz)', '#x:nth-last-child(2n of .foo.bip, .baz.bang)')
+  end
+
+  def test_nth_match_is_not_superselector_of_nth_match_with_different_arg
+    refute_superselector(
+      ':nth-child(2n of .foo, .bar, .baz)', '#x:nth-child(2n + 1 of .foo.bip, .baz.bang)')
+    refute_superselector(
+      ':nth-last-child(2n of .foo, .bar, .baz)', '#x:nth-last-child(2n + 1 of .foo.bip, .baz.bang)')
+  end
+
+  def test_nth_match_is_not_superselector_of_nth_last_match
+    refute_superselector ':nth-child(2n of .foo, .bar)', ':nth-last-child(2n of .foo, .bar)'
+    refute_superselector ':nth-last-child(2n of .foo, .bar)', ':nth-child(2n of .foo, .bar)'
+  end
+
+  def test_nth_match_can_be_subselector
+    %w[nth-child nth-last-child].each do |name|
+      assert_superselector '.foo', ":#{name}(2n of .foo.bar)"
+      assert_superselector '.foo.bar', ":#{name}(2n of .foo.bar.baz)"
+      assert_superselector '.foo', ":#{name}(2n of .foo.bar, .foo.baz)"
+    end
+  end
+
+  def has_is_superselector_of_subset_host
+    assert_strict_superselector ':has(.foo, .bar, .baz)', ':has(.foo.bip, .baz.bang)'
+  end
+
+  def has_isnt_superselector_of_contained_selector
+    assert_strict_superselector ':has(.foo, .bar, .baz)', '.foo'
+  end
+
+  def host_is_superselector_of_subset_host
+    assert_strict_superselector ':host(.foo, .bar, .baz)', ':host(.foo.bip, .baz.bang)'
+  end
+
+  def host_isnt_superselector_of_contained_selector
+    assert_strict_superselector ':host(.foo, .bar, .baz)', '.foo'
+  end
+
+  def host_context_is_superselector_of_subset_host
+    assert_strict_superselector(
+      ':host-context(.foo, .bar, .baz)', ':host-context(.foo.bip, .baz.bang)')
+  end
+
+  def host_context_isnt_superselector_of_contained_selector
+    assert_strict_superselector ':host-context(.foo, .bar, .baz)', '.foo'
+  end
+
+  private
+
+  def assert_superselector(superselector, subselector)
+    assert(parse_selector(superselector).superselector?(parse_selector(subselector)),
+      "Expected #{superselector} to be a superselector of #{subselector}.")
+  end
+
+  def refute_superselector(superselector, subselector)
+    assert(!parse_selector(superselector).superselector?(parse_selector(subselector)),
+      "Expected #{superselector} not to be a superselector of #{subselector}.")
+  end
+
+  def assert_strict_superselector(superselector, subselector)
+    assert_superselector(superselector, subselector)
+    refute_superselector(subselector, superselector)
+  end
+
+  def parse_selector(selector)
+    Sass::SCSS::CssParser.new(selector, filename_for_test, nil).parse_selector
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_cached_import_option_partial.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_cached_import_option_partial.scss
new file mode 100644
index 0000000..e4f9d3c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_cached_import_option_partial.scss
@@ -0,0 +1 @@
+partial {value: whatever()}
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_double_import_loop2.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_double_import_loop2.sass
new file mode 100644
index 0000000..efa4eb5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_double_import_loop2.sass
@@ -0,0 +1 @@
+@import "double_import_loop1"
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_filename_fn_import.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_filename_fn_import.scss
new file mode 100644
index 0000000..4a1eec4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_filename_fn_import.scss
@@ -0,0 +1,11 @@
+@mixin imported-mixin {
+  imported-mixin: filename();
+}
+
+@function imported-function() {
+  @return filename();
+}
+
+filename {
+  imported: filename();
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_imported_charset_ibm866.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_imported_charset_ibm866.sass
new file mode 100644
index 0000000..b679317
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_imported_charset_ibm866.sass
@@ -0,0 +1,4 @@
+@charset "IBM866"
+
+.bar
+  a: é
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_imported_charset_utf8.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_imported_charset_utf8.sass
new file mode 100644
index 0000000..cecdc5b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_imported_charset_utf8.sass
@@ -0,0 +1,4 @@
+@charset "UTF-8"
+
+.bar
+  a: щ
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_imported_content.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_imported_content.sass
new file mode 100644
index 0000000..65c4e33
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_imported_content.sass
@@ -0,0 +1,3 @@
+@mixin foo
+  a
+    @content
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_partial.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_partial.sass
new file mode 100644
index 0000000..a786271
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_partial.sass
@@ -0,0 +1,2 @@
+#foo
+  background-color: #baf
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_same_name_different_partiality.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_same_name_different_partiality.scss
new file mode 100644
index 0000000..a04e83a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/_same_name_different_partiality.scss
@@ -0,0 +1 @@
+.foo {partial: yes}
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/alt.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/alt.sass
new file mode 100644
index 0000000..cbcb648
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/alt.sass
@@ -0,0 +1,16 @@
+h1
+  :float  left
+  :width  274px
+  height: 75px
+  margin: 0
+  background:
+    repeat: no-repeat
+    :image none
+  a:hover, a:visited
+    color: green
+  b:hover
+    color: red
+    :background-color green
+  const
+    nosp: 1 + 2
+    sp : 1 + 2
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/basic.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/basic.sass
new file mode 100644
index 0000000..62c2fa3
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/basic.sass
@@ -0,0 +1,23 @@
+
+
+body
+  font: Arial
+  background: blue
+
+#page
+  width: 700px
+  height: 100
+  #header
+    height: 300px
+    h1
+      font-size: 50px
+      color:     blue
+
+#content.user.show
+  #container.top
+    #column.left
+      width: 100px
+    #column.right
+      width: 600px
+  #container.bottom
+    background: brown
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork1.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork1.sass
new file mode 100644
index 0000000..8b81bcc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork1.sass
@@ -0,0 +1,2 @@
+bork
+  bork: $bork
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork2.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork2.sass
new file mode 100644
index 0000000..462afb5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork2.sass
@@ -0,0 +1,2 @@
+bork
+  :bork: bork;
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork3.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork3.sass
new file mode 100644
index 0000000..9d0fb70
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork3.sass
@@ -0,0 +1,2 @@
+bork
+  bork:
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork4.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork4.sass
new file mode 100644
index 0000000..75610d9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork4.sass
@@ -0,0 +1,2 @@
+
+bork: blah
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork5.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork5.sass
new file mode 100644
index 0000000..5047204
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/bork5.sass
@@ -0,0 +1,3 @@
+bork
+  /* foo */
+  bork: $bork
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/cached_import_option.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/cached_import_option.scss
new file mode 100644
index 0000000..3ade543
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/cached_import_option.scss
@@ -0,0 +1,3 @@
+@import "cached_import_option_partial";
+
+main {value: whatever()}
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/compact.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/compact.sass
new file mode 100644
index 0000000..9dfd8ea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/compact.sass
@@ -0,0 +1,17 @@
+#main
+  width: 15em
+  color: #0000ff
+  p
+    border:
+      style: dotted
+      /* Nested comment
+        More nested stuff
+      width: 2px
+  .cool
+    width: 100px
+
+#left
+  font:
+    size: 2em
+    weight: bold
+  float: left
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/complex.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/complex.sass
new file mode 100644
index 0000000..c9c9785
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/complex.sass
@@ -0,0 +1,305 @@
+body
+  margin: 0
+  font:   0.85em "Lucida Grande", "Trebuchet MS", Verdana, sans-serif
+  color: #fff
+  background: url(/images/global_bg.gif)
+
+#page
+  width:      900px
+  margin:     0 auto
+  background: #440008
+  border-top:
+    width: 5px
+    style: solid
+    color: #ff8500
+
+#header
+  height:  75px
+  padding: 0
+  h1
+    float:  left
+    width:  274px
+    height: 75px
+    margin: 0
+    background:
+      image: url(/images/global_logo.gif)
+      /* Crazy nested comment
+      repeat: no-repeat
+    text-indent: -9999px
+  .status
+    float:   right
+    padding:
+      top: .5em
+      left: .5em
+      right: .5em
+      bottom: 0
+    p
+      float:  left
+      margin:
+        top: 0
+        right: 0.5em
+        bottom: 0
+        left: 0
+    ul
+      float:   left
+      margin:  0
+      padding: 0
+    li
+      list-style-type: none
+      display: inline
+      margin: 0 5px
+    a:link, a:visited
+      color: #ff8500
+      text-decoration: none
+    a:hover
+      text-decoration: underline
+  .search
+    float:  right
+    clear:  right
+    margin: 12px 0 0 0
+    form
+      margin: 0
+    input
+      margin: 0 3px 0 0
+      padding: 2px
+      border: none
+
+#menu 
+  clear: both
+  text-align: right
+  height: 20px
+  border-bottom: 5px solid #006b95
+  background: #00a4e4
+  .contests
+    ul
+      margin: 0 5px 0 0
+      padding: 0
+      li 
+        list-style-type: none
+        margin: 0 5px
+        padding: 5px 5px 0 5px
+        display: inline
+        font-size: 1.1em
+        // This comment is properly indented
+        color: #fff
+        background: #00a4e4
+    a:link, a:visited
+      color: #fff
+      text-decoration: none
+      font-weight: bold
+    a:hover
+      text-decoration: underline
+
+//General content information
+#content
+  clear: both
+  .container
+    clear: both
+    .column
+      float: left
+      .right
+        float: right
+  a:link, a:visited
+    color: #93d700
+    text-decoration: none
+  a:hover
+    text-decoration: underline
+
+// A hard tab:
+	
+
+#content
+  p, div
+    width: 40em
+    li, dt, dd
+      color: #ddffdd
+      background-color: #4792bb
+  .container.video
+    .column.left
+      width: 200px
+      .box
+        margin-top: 10px
+        p 
+          margin: 0 1em auto 1em
+      .box.participants 
+        img
+          float:  left
+          margin: 0 1em auto 1em
+          border: 1px solid #6e000d
+            style: solid
+        h2
+          margin: 0 0 10px 0
+          padding: 0.5em
+          /* The background image is a gif!
+          background: #6e000d url(/images/hdr_participant.gif) 2px 2px no-repeat
+          /* Okay check this out
+            Multiline comments
+            Wow dude
+            I mean seriously, WOW
+          text-indent: -9999px
+          // And also...
+            Multiline comments that don't output!
+            Snazzy, no?
+          border:
+            top:
+              width: 5px
+              style: solid
+              color: #a20013
+            right:
+              width: 1px
+              style: dotted
+    .column.middle
+      width: 500px
+    .column.right
+      width: 200px
+      .box
+        margin-top: 0
+        p
+          margin: 0 1em auto 1em
+    .column
+      p
+        margin-top: 0
+
+#content.contests
+  .container.information 
+    .column.right 
+      .box
+        margin: 1em 0
+      .box.videos
+        .thumbnail img 
+          width:         200px
+          height:        150px
+          margin-bottom: 5px
+        a:link, a:visited
+          color: #93d700
+          text-decoration: none
+        a:hover
+          text-decoration: underline
+      .box.votes 
+        a
+          display: block
+          width:  200px
+          height: 60px
+          margin: 15px 0
+          background: url(/images/btn_votenow.gif) no-repeat
+          text-indent: -9999px
+          outline: none
+          border:  none
+        h2
+          margin:  52px 0 10px 0
+          padding: 0.5em
+          background: #6e000d url(/images/hdr_videostats.gif) 2px 2px no-repeat
+          text-indent: -9999px
+          border-top: 5px solid #a20013
+
+#content.contests 
+  .container.video
+    .box.videos
+      h2
+        margin:  0
+        padding: 0.5em
+        background: #6e000d url(/images/hdr_newestclips.gif) 2px 2px no-repeat
+        text-indent: -9999px
+        border-top: 5px solid #a20013
+      table
+        width: 100
+        td 
+          padding: 1em
+          width: 25
+          vertical-align: top
+          p
+            margin: 0 0 5px 0
+          a:link, a:visited    
+            color: #93d700
+            text-decoration: none
+          a:hover
+            text-decoration: underline
+      .thumbnail
+        float: left
+        img
+          width:  80px
+          height: 60px
+          margin: 0 10px 0 0
+          border: 1px solid #6e000d
+
+#content 
+  .container.comments 
+    .column
+      margin-top: 15px
+    .column.left
+      width: 600px
+      .box 
+        ol
+          margin:  0
+          padding: 0
+        li
+          list-style-type: none
+          padding: 10px
+          margin: 0 0 1em 0
+          background: #6e000d
+          border-top: 5px solid #a20013
+          div
+            margin-bottom: 1em
+          ul
+            text-align: right
+            li
+              display: inline
+              border: none
+              padding: 0
+    .column.right
+      width:        290px
+      padding-left: 10px
+      h2
+        margin: 0
+        padding: 0.5em
+        background: #6e000d url(/images/hdr_addcomment.gif) 2px 2px no-repeat
+        text-indent: -9999px
+        border-top: 5px solid #a20013
+      .box
+        textarea
+          width:  290px
+          height: 100px
+          border: none
+
+#footer
+  margin-top: 10px
+  padding:    1.2em 1.5em
+  background: #ff8500
+  ul
+    margin: 0
+    padding: 0
+    list-style-type: none
+    li
+      display: inline
+      margin:  0 0.5em
+      color:   #440008
+  ul.links
+    float: left
+    a:link, a:visited
+      color: #440008
+      text-decoration: none
+    a:hover
+      text-decoration: underline
+  ul.copyright
+    float: right
+
+
+.clear 
+  clear: both
+
+.centered 
+  text-align: center
+
+img
+  border: none
+
+button.short 
+  width:   60px
+  height:  22px
+  padding: 0 0 2px 0
+  color:   #fff
+  border:  none
+  background: url(/images/btn_short.gif) no-repeat
+
+table
+  border-collapse: collapse
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/compressed.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/compressed.sass
new file mode 100644
index 0000000..7889d0b
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/compressed.sass
@@ -0,0 +1,15 @@
+#main
+  width: 15em
+  color: #0000ff
+  p
+    border:
+      style: dotted
+      width: 2px
+  .cool
+    width: 100px
+
+#left
+  font:
+    size: 2em
+    weight: bold
+  float: left
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/double_import_loop1.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/double_import_loop1.sass
new file mode 100644
index 0000000..5477384
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/double_import_loop1.sass
@@ -0,0 +1 @@
+@import "double_import_loop2"
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/expanded.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/expanded.sass
new file mode 100644
index 0000000..9dfd8ea
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/expanded.sass
@@ -0,0 +1,17 @@
+#main
+  width: 15em
+  color: #0000ff
+  p
+    border:
+      style: dotted
+      /* Nested comment
+        More nested stuff
+      width: 2px
+  .cool
+    width: 100px
+
+#left
+  font:
+    size: 2em
+    weight: bold
+  float: left
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/filename_fn.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/filename_fn.scss
new file mode 100644
index 0000000..e43d508
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/filename_fn.scss
@@ -0,0 +1,18 @@
+@import "filename_fn_import";
+
+@mixin local-mixin {
+  local-mixin: filename();
+}
+
+@function local-function() {
+  @return filename();
+}
+
+filename {
+  local: filename();
+  @include local-mixin;
+  local-function: local-function();
+
+  @include imported-mixin;
+  imported-function: imported-function();
+}
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/if.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/if.sass
new file mode 100644
index 0000000..787bff0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/if.sass
@@ -0,0 +1,11 @@
+a
+  @if true
+    branch: if
+  @else
+    branch: else
+
+b
+  @if false
+    branch: if
+  @else
+    branch: else
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import.sass
new file mode 100644
index 0000000..6b42da0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import.sass
@@ -0,0 +1,12 @@
+$preconst: hello
+
+=premixin
+  pre-mixin: here
+
+@import importee.sass, scss_importee, "basic.sass", basic.css, ../results/complex.css
+@import partial.sass
+
+nonimported
+  myconst: $preconst
+  otherconst: $postconst
+  +postmixin
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import_charset.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import_charset.sass
new file mode 100644
index 0000000..b85447c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import_charset.sass
@@ -0,0 +1,9 @@
+.foo
+  a: b
+
+@import "foo.css"
+
+// Even though the imported file is in IBM866,
+// since the root file is in UTF-8/ASCII
+// the output will end up being UTF-8.
+@import "imported_charset_ibm866"
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import_charset_ibm866.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import_charset_ibm866.sass
new file mode 100644
index 0000000..164e702
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import_charset_ibm866.sass
@@ -0,0 +1,11 @@
+@charset "IBM866"
+
+.foo
+  a: b
+
+@import "foo.css"
+
+// Even though the imported file is in UTF-8,
+// since the root file is in IBM866
+// the output will end up being IBM866.
+@import "imported_charset_utf8"
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import_content.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import_content.sass
new file mode 100644
index 0000000..2ef8ad9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/import_content.sass
@@ -0,0 +1,4 @@
+@import imported_content
+
+@include foo
+  b: c
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/importee.less b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/importee.less
new file mode 100644
index 0000000..ac03a0e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/importee.less
@@ -0,0 +1,2 @@
+.foo    {a: b}
+.bar () {c: d}
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/importee.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/importee.sass
new file mode 100644
index 0000000..c6a0e20
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/importee.sass
@@ -0,0 +1,19 @@
+$postconst: goodbye
+
+=postmixin
+  post-mixin: here
+
+imported
+  otherconst: $preconst
+  myconst: $postconst
+  +premixin
+
+@import basic
+
+midrule
+  inthe: middle
+
+=crazymixin
+  foo: bar
+  baz
+    blat: bang
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/line_numbers.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/line_numbers.sass
new file mode 100644
index 0000000..2afc103
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/line_numbers.sass
@@ -0,0 +1,13 @@
+foo
+  bar: baz
+
+=premixin
+  squggle
+    blat: bang
+
+$preconst: 12
+
+@import importee
+
+umph
+  +crazymixin
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/mixin_bork.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/mixin_bork.sass
new file mode 100644
index 0000000..844acb9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/mixin_bork.sass
@@ -0,0 +1,5 @@
+=outer-mixin
+  +error-mixin
+
+foo
+  +outer-mixin
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/mixins.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/mixins.sass
new file mode 100644
index 0000000..2bb5597
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/mixins.sass
@@ -0,0 +1,76 @@
+$yellow: #fc0
+
+=bordered
+  border:
+    top:
+      width: 2px
+      color: $yellow
+    left:
+      width: 1px
+      color: #000
+  -moz-border-radius: 10px
+
+=header-font
+  color: #f00
+  font:
+    size: 20px
+
+=compound
+  +header-font
+  +bordered
+
+=complex
+  +header-font
+  text:
+    decoration: none
+  &:after
+    content: "."
+    display: block
+    height: 0
+    clear: both
+    visibility: hidden
+  * html &
+    height: 1px
+    +header-font
+=deep
+  a:hover
+    text-decoration: underline
+    +compound
+
+
+#main
+  width: 15em
+  color: #0000ff
+  p
+    +bordered
+    border:
+      style: dotted
+      width: 2px
+  .cool
+    width: 100px
+
+#left
+  +bordered
+  font:
+    size: 2em
+    weight: bold
+  float: left
+
+#right
+  +bordered
+  +header-font
+  float: right
+
+.bordered
+  +bordered
+
+.complex
+  +complex
+
+.more-complex
+  +complex
+  +deep
+  display: inline
+  -webkit-nonsense:
+    top-right: 1px
+    bottom-left: 1px
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/multiline.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/multiline.sass
new file mode 100644
index 0000000..8a7daf6
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/multiline.sass
@@ -0,0 +1,20 @@
+#main,
+#header
+  height: 50px
+  div
+    width: 100px
+    a,
+    em
+      span
+        color: pink
+
+#one,
+#two,
+#three
+  div.nested,
+  span.nested,
+  p.nested
+    font:
+      weight: bold
+    border-color: red
+    display: block
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested.sass
new file mode 100644
index 0000000..0dd8750
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested.sass
@@ -0,0 +1,25 @@
+#main
+  width: 15em
+  color: #0000ff
+  p
+    border:
+      style: dotted
+      /* Nested comment
+        More nested stuff
+      width: 2px
+  .cool
+    width: 100px
+
+#left
+  font:
+    size: 2em
+    weight: bold
+  float: left
+
+#right
+  .header
+    border-style: solid
+  .body
+    border-style: dotted
+  .footer
+    border-style: dashed
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork1.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork1.sass
new file mode 100644
index 0000000..638496e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork1.sass
@@ -0,0 +1,2 @@
+
+@import bork1
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork2.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork2.sass
new file mode 100644
index 0000000..28b0bc8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork2.sass
@@ -0,0 +1,2 @@
+
+@import bork2
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork3.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork3.sass
new file mode 100644
index 0000000..eeccd66
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork3.sass
@@ -0,0 +1,2 @@
+
+@import bork3
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork4.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork4.sass
new file mode 100644
index 0000000..173c947
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_bork4.sass
@@ -0,0 +1,2 @@
+
+@import bork4
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_import.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_import.sass
new file mode 100644
index 0000000..24b48e5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_import.sass
@@ -0,0 +1,2 @@
+.foo
+  @import basic
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_mixin_bork.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_mixin_bork.sass
new file mode 100644
index 0000000..f79fdc7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/nested_mixin_bork.sass
@@ -0,0 +1,6 @@
+
+
+=error-mixin
+  width: 1px * 1em
+
+@import mixin_bork
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/options.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/options.sass
new file mode 100644
index 0000000..7e9d3c4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/options.sass
@@ -0,0 +1,2 @@
+foo
+  style: option("style")
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/parent_ref.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/parent_ref.sass
new file mode 100644
index 0000000..7c88290
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/parent_ref.sass
@@ -0,0 +1,25 @@
+a
+  color: #000
+  &:hover
+    color: #f00
+
+p, div
+  width: 100em
+  & foo
+    width: 10em
+  &:hover, bar
+    height: 20em
+
+#cool
+  border:
+    style: solid
+    width: 2em
+  .ie7 &, .ie6 &
+    content: string("Totally not cool.")
+  .firefox &
+    content: string("Quite cool.")
+
+.wow, .snazzy
+  font-family: fantasy
+  &:hover, &:visited
+    font-weight: bold
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/same_name_different_ext.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/same_name_different_ext.sass
new file mode 100644
index 0000000..c00a8b5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/same_name_different_ext.sass
@@ -0,0 +1,2 @@
+.foo
+  ext: sass
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/same_name_different_ext.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/same_name_different_ext.scss
new file mode 100644
index 0000000..38090ce
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/same_name_different_ext.scss
@@ -0,0 +1 @@
+.foo {ext: scss}
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/same_name_different_partiality.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/same_name_different_partiality.scss
new file mode 100644
index 0000000..8ba7d06
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/same_name_different_partiality.scss
@@ -0,0 +1 @@
+.foo {partial: no}
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/script.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/script.sass
new file mode 100644
index 0000000..e743bdc
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/script.sass
@@ -0,0 +1,101 @@
+$width: 10em + 20
+$color: #00ff98
+$main_text: #ffa
+$num: 10
+$dec: 10.2
+$dec_0: 99.0
+$neg: -10
+$esc: 10\+12
+$str: Hello\!
+$qstr: "Quo\"ted\"!"
+$hstr: Hyph-en\!
+$space: #{5 + 4} hi there
+$percent: 11%
+$complex: 1px/1em
+
+#main
+  content: $str
+  qstr: $qstr
+  hstr: $hstr
+  width: $width
+  background-color: #000
+  color: $main_text
+  short-color: #123
+  named-color: olive
+  con: "foo" bar ($space "boom")
+  con2: "noquo" quo
+  #sidebar
+    background-color: $color
+    num:
+      normal: $num
+      dec: $dec
+      dec0: $dec_0
+      neg: $neg
+    esc: $esc
+    many: 1 + 2 + 3
+    order: 1 + 2 * 3
+    complex: ((1 + 2) + 15)+#3a8b9f + (hi+(1 +1+ 2)*   4)
+
+#plus
+  num:
+    num: 5+2
+    num-un: 10em + 15em
+    num-un2: 10 + 13em
+    num-neg: 10 + -.13
+    str: 100 * 1px
+    col: 13 + #aaa
+    perc: $percent + 20%
+  str:
+    str: "hi" + "\ there"
+    str2: "hi" + " there"
+    col: "14em solid " + #123
+    num: "times: " + 13
+  col:
+    num: #f02 + 123.5
+    col: #12A + #405162
+
+#minus
+  num:
+    num: 912 - 12
+  col:
+    num: #fffffa - 5.2
+    col: #abcdef - #fedcba
+  unary:
+    num: -1
+    const: -$neg
+    paren: -(5 + 6)
+    two: --12
+    many: --------12
+    crazy: -----(5 + ---$neg)
+
+#times
+  num:
+    num: 2 * 3.5
+    col: 2 * #3a4b5c
+  col:
+    num: #12468a * 0.5
+    col: #121212 * #020304
+    
+#div
+  num:
+    num: (10 / 3.0)
+    num2: (10 / 3)
+  col:
+    num: #12468a / 2
+    col: #abcdef / #0f0f0f
+  comp:  $complex * 1em
+
+#mod
+  num:
+    num: 17 % 3
+  col:
+    col: #5f6e7d % #10200a
+    num: #aaabac % 3
+
+#const
+  escaped:
+    quote: \$foo \!bar
+  default: $str !important
+
+#regression
+  a: (3 + 2) - 1
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/scss_import.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/scss_import.scss
new file mode 100644
index 0000000..b9c5c79
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/scss_import.scss
@@ -0,0 +1,12 @@
+$preconst: hello;
+
+@mixin premixin {pre-mixin: here}
+
+@import "importee.sass", "scss_importee", "basic.sass", "basic.css", "../results/complex.css";
+@import "part\
+ial.sass";
+
+nonimported {
+  myconst: $preconst;
+  otherconst: $postconst;
+  @include postmixin; }
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/scss_importee.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/scss_importee.scss
new file mode 100644
index 0000000..df49e68
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/scss_importee.scss
@@ -0,0 +1 @@
+scss {imported: yes}
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/single_import_loop.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/single_import_loop.sass
new file mode 100644
index 0000000..db50397
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/single_import_loop.sass
@@ -0,0 +1 @@
+@import "single_import_loop"
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/import_up1.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/import_up1.scss
new file mode 100644
index 0000000..90559f5
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/import_up1.scss
@@ -0,0 +1 @@
+@import "../subdir/import_up2.scss";
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/import_up2.scss b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/import_up2.scss
new file mode 100644
index 0000000..22f5a59
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/import_up2.scss
@@ -0,0 +1 @@
+@import "../subdir/import_up3.scss";
\ No newline at end of file
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/nested_subdir/_nested_partial.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/nested_subdir/_nested_partial.sass
new file mode 100644
index 0000000..f50ca55
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/nested_subdir/_nested_partial.sass
@@ -0,0 +1,2 @@
+#nested
+  relative: true
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/nested_subdir/nested_subdir.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/nested_subdir/nested_subdir.sass
new file mode 100644
index 0000000..9fe885f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/nested_subdir/nested_subdir.sass
@@ -0,0 +1,3 @@
+#pi
+  width: 314px
+    
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/subdir.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/subdir.sass
new file mode 100644
index 0000000..2e3c54c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/subdir/subdir.sass
@@ -0,0 +1,6 @@
+@import nested_subdir/nested_partial.sass
+
+#subdir
+  font:
+    size: 20px
+    weight: bold
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/units.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/units.sass
new file mode 100644
index 0000000..b501e49
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/units.sass
@@ -0,0 +1,11 @@
+b
+  foo: 0.5 * 10px
+  bar: 10zzz * 12px / 5zzz
+  baz: percentage(12.0px / 18px)
+  many-units: 10.0zzz / 3yyy * 12px / 5zzz * 3yyy / 3px * 4em
+  mm: 5mm + 1cm
+  pc: 1pc + 12pt
+  pt: 72pt - 2in
+  inches: 1in + 2.54cm
+  more-inches: 1in + ((72pt * 2in) + (36pt * 1in)) / 2.54cm
+  mixed: (1 + (1em * 6px / 3in)) * 4in / 2em
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/warn.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/warn.sass
new file mode 100644
index 0000000..514c44a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/warn.sass
@@ -0,0 +1,3 @@
+@warn "In the main file"
+@import warn_imported.sass
++emits-a-warning
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/warn_imported.sass b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/warn_imported.sass
new file mode 100644
index 0000000..493bd8a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/templates/warn_imported.sass
@@ -0,0 +1,4 @@
+@warn "Imported"
+
+=emits-a-warning
+  @warn "In an imported mixin"
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/test_helper.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/test_helper.rb
new file mode 100644
index 0000000..eaa433f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/test_helper.rb
@@ -0,0 +1,8 @@
+test_dir = File.dirname(__FILE__)
+$:.unshift test_dir unless $:.include?(test_dir)
+
+class MiniTest::Test
+  def absolutize(file)
+    File.expand_path("#{File.dirname(__FILE__)}/#{file}")
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util/multibyte_string_scanner_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util/multibyte_string_scanner_test.rb
new file mode 100755
index 0000000..4f3381f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util/multibyte_string_scanner_test.rb
@@ -0,0 +1,152 @@
+# -*- coding: utf-8 -*-
+require File.dirname(__FILE__) + '/../../test_helper'
+
+class MultibyteStringScannerTest < MiniTest::Test
+  def setup
+    @scanner = Sass::Util::MultibyteStringScanner.new("cölorfül")
+  end
+
+  def test_initial
+    assert_scanner_state 0, 0, nil, nil
+  end
+
+  def test_check
+    assert_equal 'cö', @scanner.check(/../)
+    assert_scanner_state 0, 0, 2, 3
+    assert_equal 0, @scanner.pos
+    assert_equal 0, @scanner.pos
+    assert_equal 2, @scanner.matched_size
+    assert_equal 3, @scanner.byte_matched_size
+  end
+
+  def test_check_until
+    assert_equal 'cölorfü', @scanner.check_until(/f./)
+    assert_scanner_state 0, 0, 2, 3
+  end
+
+  def test_getch
+    assert_equal 'c', @scanner.getch
+    assert_equal 'ö', @scanner.getch
+    assert_scanner_state 2, 3, 1, 2
+  end
+
+  def test_match?
+    assert_equal 2, @scanner.match?(/../)
+    assert_scanner_state 0, 0, 2, 3
+  end
+
+  def test_peek
+    assert_equal 'cö', @scanner.peek(2)
+    assert_scanner_state 0, 0, nil, nil
+  end
+
+  def test_rest_size
+    assert_equal 'cö', @scanner.scan(/../)
+    assert_equal 6, @scanner.rest_size
+  end
+
+  def test_scan
+    assert_equal 'cö', @scanner.scan(/../)
+    assert_scanner_state 2, 3, 2, 3
+  end
+
+  def test_scan_until
+    assert_equal 'cölorfü', @scanner.scan_until(/f./)
+    assert_scanner_state 7, 9, 2, 3
+  end
+
+  def test_skip
+    assert_equal 2, @scanner.skip(/../)
+    assert_scanner_state 2, 3, 2, 3
+  end
+
+  def test_skip_until
+    assert_equal 7, @scanner.skip_until(/f./)
+    assert_scanner_state 7, 9, 2, 3
+  end
+
+  def test_set_pos
+    @scanner.pos = 7
+    assert_scanner_state 7, 9, nil, nil
+    @scanner.pos = 6
+    assert_scanner_state 6, 7, nil, nil
+    @scanner.pos = 1
+    assert_scanner_state 1, 1, nil, nil
+  end
+
+  def test_reset
+    @scanner.scan(/../)
+    @scanner.reset
+    assert_scanner_state 0, 0, nil, nil
+  end
+
+  def test_scan_full
+    assert_equal 'cö', @scanner.scan_full(/../, true, true)
+    assert_scanner_state 2, 3, 2, 3
+
+    @scanner.reset
+    assert_equal 'cö', @scanner.scan_full(/../, false, true)
+    assert_scanner_state 0, 0, 2, 3
+
+    @scanner.reset
+    assert_nil @scanner.scan_full(/../, true, false)
+    assert_scanner_state 2, 3, 2, 3
+
+    @scanner.reset
+    assert_nil @scanner.scan_full(/../, false, false)
+    assert_scanner_state 0, 0, 2, 3
+  end
+
+  def test_search_full
+    assert_equal 'cölorfü', @scanner.search_full(/f./, true, true)
+    assert_scanner_state 7, 9, 2, 3
+
+    @scanner.reset
+    assert_equal 'cölorfü', @scanner.search_full(/f./, false, true)
+    assert_scanner_state 0, 0, 2, 3
+
+    @scanner.reset
+    assert_nil @scanner.search_full(/f./, true, false)
+    assert_scanner_state 7, 9, 2, 3
+
+    @scanner.reset
+    assert_nil @scanner.search_full(/f./, false, false)
+    assert_scanner_state 0, 0, 2, 3
+  end
+
+  def test_set_string
+    @scanner.scan(/../)
+    @scanner.string = 'föóbâr'
+    assert_scanner_state 0, 0, nil, nil
+  end
+
+  def test_terminate
+    @scanner.scan(/../)
+    @scanner.terminate
+    assert_scanner_state 8, 10, nil, nil
+  end
+
+  def test_unscan
+    @scanner.scan(/../)
+    @scanner.scan_until(/f./)
+    @scanner.unscan
+    assert_scanner_state 2, 3, nil, nil
+  end
+
+  private
+
+  def assert_scanner_state(pos, byte_pos, matched_size, byte_matched_size)
+    assert_equal pos, @scanner.pos, 'pos'
+    assert_equal byte_pos, @scanner.byte_pos, 'byte_pos'
+    if matched_size.nil?
+      assert_nil @scanner.matched_size, 'matched_size'
+    else
+      assert_equal matched_size, @scanner.matched_size, 'matched_size'
+    end
+    if byte_matched_size.nil?
+      assert_nil @scanner.byte_matched_size, 'byte_matched_size'
+    else
+      assert_equal byte_matched_size, @scanner.byte_matched_size, 'byte_matched_size'
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util/normalized_map_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util/normalized_map_test.rb
new file mode 100755
index 0000000..b82f517
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util/normalized_map_test.rb
@@ -0,0 +1,50 @@
+require File.dirname(__FILE__) + '/../../test_helper'
+require 'sass/util/normalized_map'
+
+class NormalizedMapTest < MiniTest::Test
+  extend PublicApiLinter
+
+  lint_api Hash, Sass::Util::NormalizedMap
+
+  def lint_instance
+    Sass::Util::NormalizedMap.new
+  end
+
+  def test_normalized_map_errors_unless_explicitly_implemented
+    assert Sass.tests_running
+    assert_raise_message(ArgumentError, "The method invert must be implemented explicitly") do
+      Sass::Util::NormalizedMap.new.invert
+    end
+  end
+
+  def test_normalized_map_does_not_error_when_released
+    Sass.tests_running = false
+    assert_equal({}, Sass::Util::NormalizedMap.new.invert)
+  ensure
+    Sass.tests_running = true
+  end
+
+  def test_basic_lifecycle
+    m = Sass::Util::NormalizedMap.new
+    m["a-b"] = 1
+    assert_equal ["a_b"], m.keys
+    assert_equal 1, m["a_b"]
+    assert_equal 1, m["a-b"]
+    assert m.has_key?("a_b")
+    assert m.has_key?("a-b")
+    assert_equal({"a-b" => 1}, m.as_stored)
+    assert_equal 1, m.delete("a-b")
+    assert !m.has_key?("a-b")
+    m["a_b"] = 2
+    assert_equal({"a_b" => 2}, m.as_stored)
+  end
+
+  def test_dup
+    m = Sass::Util::NormalizedMap.new
+    m["a-b"] = 1
+    m2 = m.dup
+    m.delete("a-b")
+    assert !m.has_key?("a-b")
+    assert m2.has_key?("a-b")
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util/subset_map_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util/subset_map_test.rb
new file mode 100755
index 0000000..5a98203
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util/subset_map_test.rb
@@ -0,0 +1,90 @@
+require File.dirname(__FILE__) + '/../../test_helper'
+
+class SubsetMapTest < MiniTest::Test
+  def setup
+    @ssm = Sass::Util::SubsetMap.new
+    @ssm[Set[1, 2]] = "Foo"
+    @ssm[Set["fizz", "fazz"]] = "Bar"
+
+    @ssm[Set[:foo, :bar]] = "Baz"
+    @ssm[Set[:foo, :bar, :baz]] = "Bang"
+
+    @ssm[Set[:bip, :bop, :blip]] = "Qux"
+    @ssm[Set[:bip, :bop]] = "Thram"
+  end
+
+  def test_equal_keys
+    assert_equal [["Foo", Set[1, 2]]], @ssm.get(Set[1, 2])
+    assert_equal [["Bar", Set["fizz", "fazz"]]], @ssm.get(Set["fizz", "fazz"])
+  end
+
+  def test_subset_keys
+    assert_equal [["Foo", Set[1, 2]]], @ssm.get(Set[1, 2, "fuzz"])
+    assert_equal [["Bar", Set["fizz", "fazz"]]], @ssm.get(Set["fizz", "fazz", 3])
+  end
+
+  def test_superset_keys
+    assert_equal [], @ssm.get(Set[1])
+    assert_equal [], @ssm.get(Set[2])
+    assert_equal [], @ssm.get(Set["fizz"])
+    assert_equal [], @ssm.get(Set["fazz"])
+  end
+
+  def test_disjoint_keys
+    assert_equal [], @ssm.get(Set[3, 4])
+    assert_equal [], @ssm.get(Set["fuzz", "frizz"])
+    assert_equal [], @ssm.get(Set["gran", 15])
+  end
+
+  def test_semi_disjoint_keys
+    assert_equal [], @ssm.get(Set[2, 3])
+    assert_equal [], @ssm.get(Set["fizz", "fuzz"])
+    assert_equal [], @ssm.get(Set[1, "fazz"])
+  end
+
+  def test_empty_key_set
+    assert_raises(ArgumentError) {@ssm[Set[]] = "Fail"}
+  end
+
+  def test_empty_key_get
+    assert_equal [], @ssm.get(Set[])
+  end
+
+  def test_multiple_subsets
+    assert_equal [["Foo", Set[1, 2]], ["Bar", Set["fizz", "fazz"]]], @ssm.get(Set[1, 2, "fizz", "fazz"])
+    assert_equal [["Foo", Set[1, 2]], ["Bar", Set["fizz", "fazz"]]], @ssm.get(Set[1, 2, 3, "fizz", "fazz", "fuzz"])
+
+    assert_equal [["Baz", Set[:foo, :bar]]], @ssm.get(Set[:foo, :bar])
+    assert_equal [["Baz", Set[:foo, :bar]], ["Bang", Set[:foo, :bar, :baz]]], @ssm.get(Set[:foo, :bar, :baz])
+  end
+
+  def test_bracket_bracket
+    assert_equal ["Foo"], @ssm[Set[1, 2, "fuzz"]]
+    assert_equal ["Baz", "Bang"], @ssm[Set[:foo, :bar, :baz]]
+  end
+
+  def test_order_preserved
+    @ssm[Set[10, 11, 12]] = 1
+    @ssm[Set[10, 11]] = 2
+    @ssm[Set[11]] = 3
+    @ssm[Set[11, 12]] = 4
+    @ssm[Set[9, 10, 11, 12, 13]] = 5
+    @ssm[Set[10, 13]] = 6
+
+    assert_equal(
+      [[1, Set[10, 11, 12]], [2, Set[10, 11]], [3, Set[11]], [4, Set[11, 12]],
+        [5, Set[9, 10, 11, 12, 13]], [6, Set[10, 13]]],
+      @ssm.get(Set[9, 10, 11, 12, 13]))
+  end
+
+  def test_multiple_equal_values
+    @ssm[Set[11, 12]] = 1
+    @ssm[Set[12, 13]] = 2
+    @ssm[Set[13, 14]] = 1
+    @ssm[Set[14, 15]] = 1
+
+    assert_equal(
+      [[1, Set[11, 12]], [2, Set[12, 13]], [1, Set[13, 14]], [1, Set[14, 15]]],
+      @ssm.get(Set[11, 12, 13, 14, 15]))
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util_test.rb
new file mode 100755
index 0000000..6454d4c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/util_test.rb
@@ -0,0 +1,403 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'pathname'
+require 'tmpdir'
+
+class UtilTest < MiniTest::Test
+  include Sass::Util
+
+  def test_scope
+    assert(File.exist?(scope("Rakefile")))
+  end
+
+  def test_map_keys
+    assert_equal({
+        "foo" => 1,
+        "bar" => 2,
+        "baz" => 3
+      }, map_keys({:foo => 1, :bar => 2, :baz => 3}) {|k| k.to_s})
+  end
+
+  def test_map_vals
+    assert_equal({
+        :foo => "1",
+        :bar => "2",
+        :baz => "3"
+      }, map_vals({:foo => 1, :bar => 2, :baz => 3}) {|k| k.to_s})
+  end
+
+  def test_map_hash
+    assert_equal({
+        "foo" => "1",
+        "bar" => "2",
+        "baz" => "3"
+      }, map_hash({:foo => 1, :bar => 2, :baz => 3}) {|k, v| [k.to_s, v.to_s]})
+  end
+
+  def test_map_hash_with_normalized_map
+    map = NormalizedMap.new("foo-bar" => 1, "baz_bang" => 2)
+    result = map_hash(map) {|k, v| [k, v.to_s]}
+    assert_equal("1", result["foo-bar"])
+    assert_equal("1", result["foo_bar"])
+    assert_equal("2", result["baz-bang"])
+    assert_equal("2", result["baz_bang"])
+  end
+
+  def test_powerset
+    assert_equal([[].to_set].to_set,
+      powerset([]))
+    assert_equal([[].to_set, [1].to_set].to_set,
+      powerset([1]))
+    assert_equal([[].to_set, [1].to_set, [2].to_set, [1, 2].to_set].to_set,
+      powerset([1, 2]))
+    assert_equal([[].to_set, [1].to_set, [2].to_set, [3].to_set,
+        [1, 2].to_set, [2, 3].to_set, [1, 3].to_set, [1, 2, 3].to_set].to_set,
+      powerset([1, 2, 3]))
+  end
+
+  def test_restrict
+    assert_equal(0.5, restrict(0.5, 0..1))
+    assert_equal(1, restrict(2, 0..1))
+    assert_equal(1.3, restrict(2, 0..1.3))
+    assert_equal(0, restrict(-1, 0..1))
+  end
+
+  def test_merge_adjacent_strings
+    assert_equal(["foo bar baz", :bang, "biz bop", 12],
+      merge_adjacent_strings(["foo ", "bar ", "baz", :bang, "biz", " bop", 12]))
+    str = "foo"
+    assert_equal(["foo foo foo", :bang, "foo foo", 12],
+      merge_adjacent_strings([str, " ", str, " ", str, :bang, str, " ", str, 12]))
+  end
+
+  def test_replace_subseq
+    assert_equal([1, 2, :a, :b, 5],
+      replace_subseq([1, 2, 3, 4, 5], [3, 4], [:a, :b]))
+    assert_equal([1, 2, 3, 4, 5],
+      replace_subseq([1, 2, 3, 4, 5], [3, 4, 6], [:a, :b]))
+    assert_equal([1, 2, 3, 4, 5],
+      replace_subseq([1, 2, 3, 4, 5], [4, 5, 6], [:a, :b]))
+  end
+
+  def test_intersperse
+    assert_equal(["foo", " ", "bar", " ", "baz"],
+      intersperse(%w[foo bar baz], " "))
+    assert_equal([], intersperse([], " "))
+  end
+
+  def test_substitute
+    assert_equal(["foo", "bar", "baz", 3, 4],
+      substitute([1, 2, 3, 4], [1, 2], ["foo", "bar", "baz"]))
+    assert_equal([1, "foo", "bar", "baz", 4],
+      substitute([1, 2, 3, 4], [2, 3], ["foo", "bar", "baz"]))
+    assert_equal([1, 2, "foo", "bar", "baz"],
+      substitute([1, 2, 3, 4], [3, 4], ["foo", "bar", "baz"]))
+
+    assert_equal([1, "foo", "bar", "baz", 2, 3, 4],
+      substitute([1, 2, 2, 2, 3, 4], [2, 2], ["foo", "bar", "baz"]))
+  end
+
+  def test_strip_string_array
+    assert_equal(["foo ", " bar ", " baz"],
+      strip_string_array([" foo ", " bar ", " baz "]))
+    assert_equal([:foo, " bar ", " baz"],
+      strip_string_array([:foo, " bar ", " baz "]))
+    assert_equal(["foo ", " bar ", :baz],
+      strip_string_array([" foo ", " bar ", :baz]))
+  end
+
+  def test_paths
+    assert_equal([[1, 3, 5], [2, 3, 5], [1, 4, 5], [2, 4, 5]],
+      paths([[1, 2], [3, 4], [5]]))
+    assert_equal([[]], paths([]))
+    assert_equal([[1, 2, 3]], paths([[1], [2], [3]]))
+  end
+
+  def test_lcs
+    assert_equal([1, 2, 3], lcs([1, 2, 3], [1, 2, 3]))
+    assert_equal([], lcs([], [1, 2, 3]))
+    assert_equal([], lcs([1, 2, 3], []))
+    assert_equal([1, 2, 3], lcs([5, 1, 4, 2, 3, 17], [0, 0, 1, 2, 6, 3]))
+
+    assert_equal([1], lcs([1, 2, 3, 4], [4, 3, 2, 1]))
+    assert_equal([1, 2], lcs([1, 2, 3, 4], [3, 4, 1, 2]))
+  end
+
+  def test_lcs_with_block
+    assert_equal(["1", "2", "3"],
+      lcs([1, 4, 2, 5, 3], [1, 2, 3]) {|a, b| a == b && a.to_s})
+    assert_equal([-4, 2, 8],
+      lcs([-5, 3, 2, 8], [-4, 1, 8]) {|a, b| (a - b).abs <= 1 && [a, b].max})
+  end
+
+  def test_subsequence
+    assert(subsequence?([1, 2, 3], [1, 2, 3]))
+    assert(subsequence?([1, 2, 3], [1, :a, 2, :b, 3]))
+    assert(subsequence?([1, 2, 3], [:a, 1, :b, :c, 2, :d, 3, :e, :f]))
+
+    assert(!subsequence?([1, 2, 3], [1, 2]))
+    assert(!subsequence?([1, 2, 3], [1, 3, 2]))
+    assert(!subsequence?([1, 2, 3], [3, 2, 1]))
+  end
+
+  def test_silence_warnings
+    old_stderr, $stderr = $stderr, StringIO.new
+    warn "Out"
+    assert_equal("Out\n", $stderr.string)
+    silence_warnings {warn "In"}
+    assert_equal("Out\n", $stderr.string)
+  ensure
+    $stderr = old_stderr
+  end
+
+  def test_sass_warn
+    assert_warning("Foo!") {sass_warn "Foo!"}
+  end
+
+  def test_silence_sass_warnings
+    old_stderr, $stderr = $stderr, StringIO.new
+    silence_sass_warnings {warn "Out"}
+    assert_equal("Out\n", $stderr.string)
+    silence_sass_warnings {sass_warn "In"}
+    assert_equal("Out\n", $stderr.string)
+  ensure
+    $stderr = old_stderr
+  end
+
+  def test_extract
+    arr = [1, 2, 3, 4, 5]
+    assert_equal([1, 3, 5], extract!(arr) {|e| e % 2 == 1})
+    assert_equal([2, 4], arr)
+  end
+
+  def test_flatten_vertically
+    assert_equal([1, 2, 3], flatten_vertically([1, 2, 3]))
+    assert_equal([1, 3, 5, 2, 4, 6], flatten_vertically([[1, 2], [3, 4], [5, 6]]))
+    assert_equal([1, 2, 4, 3, 5, 6], flatten_vertically([1, [2, 3], [4, 5, 6]]))
+    assert_equal([1, 4, 6, 2, 5, 3], flatten_vertically([[1, 2, 3], [4, 5], 6]))
+  end
+
+  def test_extract_and_inject_values
+    test = lambda {|arr| assert_equal(arr, with_extracted_values(arr) {|str| str})}
+
+    test[['foo bar']]
+    test[['foo {12} bar']]
+    test[['foo {{12} bar']]
+    test[['foo {{1', 12, '2} bar']]
+    test[['foo 1', 2, '{3', 4, 5, 6, '{7}', 8]]
+    test[['foo 1', [2, 3, 4], ' bar']]
+    test[['foo ', 1, "\n bar\n", [2, 3, 4], "\n baz"]]
+  end
+
+  def nested_caller_info_fn
+    caller_info
+  end
+
+  def double_nested_caller_info_fn
+    nested_caller_info_fn
+  end
+
+  def test_caller_info
+    assert_equal(["/tmp/foo.rb", 12, "fizzle"], caller_info("/tmp/foo.rb:12: in `fizzle'"))
+    assert_equal(["/tmp/foo.rb", 12, nil], caller_info("/tmp/foo.rb:12"))
+    assert_equal(["C:/tmp/foo.rb", 12, nil], caller_info("C:/tmp/foo.rb:12"))
+    assert_equal(["(sass)", 12, "blah"], caller_info("(sass):12: in `blah'"))
+    assert_equal(["", 12, "boop"], caller_info(":12: in `boop'"))
+    assert_equal(["/tmp/foo.rb", -12, "fizzle"], caller_info("/tmp/foo.rb:-12: in `fizzle'"))
+    assert_equal(["/tmp/foo.rb", 12, "fizzle"], caller_info("/tmp/foo.rb:12: in `fizzle {}'"))
+    assert_equal(["C:/tmp/foo.rb", 12, "fizzle"], caller_info("C:/tmp/foo.rb:12: in `fizzle {}'"))
+
+    info = nested_caller_info_fn
+    assert_equal(__FILE__, info[0])
+    assert_equal("test_caller_info", info[2])
+
+    info = proc {nested_caller_info_fn}.call
+    assert_equal(__FILE__, info[0])
+    assert_match(/^(block in )?test_caller_info$/, info[2])
+
+    info = double_nested_caller_info_fn
+    assert_equal(__FILE__, info[0])
+    assert_equal("double_nested_caller_info_fn", info[2])
+
+    info = proc {double_nested_caller_info_fn}.call
+    assert_equal(__FILE__, info[0])
+    assert_equal("double_nested_caller_info_fn", info[2])
+  end
+
+  def test_version_gt
+    assert_version_gt("2.0.0", "1.0.0")
+    assert_version_gt("1.1.0", "1.0.0")
+    assert_version_gt("1.0.1", "1.0.0")
+    assert_version_gt("1.0.0", "1.0.0.rc")
+    assert_version_gt("1.0.0.1", "1.0.0.rc")
+    assert_version_gt("1.0.0.rc", "0.9.9")
+    assert_version_gt("1.0.0.beta", "1.0.0.alpha")
+
+    assert_version_eq("1.0.0", "1.0.0")
+    assert_version_eq("1.0.0", "1.0.0.0")
+  end
+
+  def assert_version_gt(v1, v2)
+    #assert(version_gt(v1, v2), "Expected #{v1} > #{v2}")
+    assert(!version_gt(v2, v1), "Expected #{v2} < #{v1}")
+  end
+
+  def assert_version_eq(v1, v2)
+    assert(!version_gt(v1, v2), "Expected #{v1} = #{v2}")
+    assert(!version_gt(v2, v1), "Expected #{v2} = #{v1}")
+  end
+
+  class FooBar
+    def foo
+      Sass::Util.abstract(self)
+    end
+    def old_method
+      Sass::Util.deprecated(self)
+    end
+    def old_method_with_custom_message
+      Sass::Util.deprecated(self, "Call FooBar#new_method instead.")
+    end
+    def self.another_old_method
+      Sass::Util.deprecated(self)
+    end
+  end
+
+  def test_abstract
+    assert_raise_message(NotImplementedError,
+      "UtilTest::FooBar must implement #foo") {FooBar.new.foo}
+  end
+
+  def test_deprecated
+    assert_warning("DEPRECATION WARNING: UtilTest::FooBar#old_method will be removed in a future version of Sass.") { FooBar.new.old_method }
+    assert_warning(<<WARNING) { FooBar.new.old_method_with_custom_message }
+DEPRECATION WARNING: UtilTest::FooBar#old_method_with_custom_message will be removed in a future version of Sass.
+Call FooBar#new_method instead.
+WARNING
+    assert_warning("DEPRECATION WARNING: UtilTest::FooBar.another_old_method will be removed in a future version of Sass.") { FooBar.another_old_method }
+  end
+
+  def test_json_escape_string
+    assert_json_string "", ""
+    alphanum = (("0".."9").to_a).concat(("a".."z").to_a).concat(("A".."Z").to_a).join
+    assert_json_string alphanum, alphanum
+    assert_json_string "'\"\\'", "'\\\"\\\\'"
+    assert_json_string "\b\f\n\r\t", "\\b\\f\\n\\r\\t"
+  end
+
+  def assert_json_string(source, target)
+    assert_equal target, json_escape_string(source)
+  end
+
+  def test_json_value_of
+    assert_json_value 0, "0"
+    assert_json_value(-42, "-42")
+    assert_json_value 42, "42"
+    assert_json_value true, "true"
+    assert_json_value false, "false"
+    assert_json_value "", "\"\""
+    assert_json_value "\"\"", "\"\\\"\\\"\""
+    assert_json_value "Multi\nLine\rString", "\"Multi\\nLine\\rString\""
+    assert_json_value [1, "some\nstr,ing", false, nil], "[1,\"some\\nstr,ing\",false,null]"
+  end
+
+  def assert_json_value(source, target)
+    assert_equal target, json_value_of(source)
+  end
+
+  def test_vlq
+    assert_equal "A", encode_vlq(0)
+    assert_equal "e", encode_vlq(15)
+    assert_equal "gB", encode_vlq(16)
+    assert_equal "wH", encode_vlq(120)
+  end
+
+  def assert_vlq_encodes(int, vlq)
+    vlq_from_decimal_array = decimal_array.map {|d| encode_vlq(d)}.join
+    decimal_array_from_vlq = decode_vlq(vlq)
+    assert_equal vlq, vlq_from_decimal_array
+    assert_equal decimal_array, decimal_array_from_vlq
+  end
+
+  def test_round_respects_precision
+    original_precision = Sass::Script::Value::Number.precision
+    assert_equal 0, Sass::Util.round(0.4999999999)
+    # 10 9s doesn't work because 0.49999999999 - 0.5 is very slightly greater
+    # than -0.1e11 due to float nonsense.
+    assert_equal 1, Sass::Util.round(0.499999999999)
+    Sass::Script::Value::Number.precision = 6
+    assert_equal 0, Sass::Util.round(0.499999)
+    assert_equal 1, Sass::Util.round(0.49999999)
+  ensure
+    Sass::Script::Value::Number.precision = original_precision
+  end
+
+  def test_atomic_writes
+    # when using normal writes, this test fails about 90% of the time.
+    filename = File.join(Dir.tmpdir, "test_atomic")
+    5.times do
+      writes_to_perform = %w(1 2 3 4 5 6 7 8 9).map {|i| "#{i}\n" * 100_000}
+      threads = writes_to_perform.map do |to_write|
+        Thread.new do
+          # To see this test fail with a normal write,
+          # change to the standard file open mechanism:
+          # open(filename, "w") do |f|
+          atomic_create_and_write_file(filename) do |f|
+            f.write(to_write)
+          end
+        end
+      end
+      loop do
+        contents = File.exist?(filename) ? File.read(filename) : nil
+        next if contents.nil? || contents.size == 0
+        unless writes_to_perform.include?(contents)
+          if contents.size != writes_to_perform.first.size
+            fail "Incomplete write detected: was #{contents.size} characters, " +
+                 "should have been #{writes_to_perform.first.size}"
+          else
+            fail "Corrupted read/write detected"
+          end
+        end
+        break if threads.all? {|t| !t.alive?}
+      end
+      threads.each {|t| t.join}
+    end
+  ensure
+    Sass::Util.retry_on_windows {File.delete filename if File.exist?(filename)}
+  end
+
+  def test_atomic_write_permissions
+    atomic_filename = File.join(Dir.tmpdir, "test_atomic_perms.atomic")
+    normal_filename = File.join(Dir.tmpdir, "test_atomic_perms.normal")
+    atomic_create_and_write_file(atomic_filename) {|f| f.write("whatever\n") }
+    open(normal_filename, "wb") {|f| f.write("whatever\n") }
+    assert_equal File.stat(normal_filename).mode.to_s(8), File.stat(atomic_filename).mode.to_s(8)
+  ensure
+    File.unlink(atomic_filename) rescue nil
+    File.unlink(normal_filename) rescue nil
+  end
+
+  def test_atomic_writes_respect_umask
+    atomic_filename = File.join(Dir.tmpdir, "test_atomic_perms.atomic")
+    atomic_create_and_write_file(atomic_filename) do |f|
+      f.write("whatever\n")
+    end
+    assert_equal 0, File.stat(atomic_filename).mode & File.umask
+  ensure
+    File.unlink(atomic_filename)
+  end
+
+  class FakeError < RuntimeError; end
+
+  def test_atomic_writes_handles_exceptions
+    filename = File.join(Dir.tmpdir, "test_atomic_exception")
+    FileUtils.rm_f(filename)
+    tmp_filename = nil
+    assert_raises FakeError do
+      atomic_create_and_write_file(filename) do |f|
+        tmp_filename = f.path
+        raise FakeError.new "Borken"
+      end
+    end
+    assert !File.exist?(filename)
+    assert !File.exist?(tmp_filename)
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/value_helpers_test.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/value_helpers_test.rb
new file mode 100755
index 0000000..c8c07fb
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/sass/value_helpers_test.rb
@@ -0,0 +1,178 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class ValueHelpersTest < MiniTest::Test
+  include Sass::Script
+  include Sass::Script::Value::Helpers
+
+  def test_bool
+    assert_same Value::Bool::TRUE, bool(true)
+    assert_same Value::Bool::FALSE, bool(false)
+    assert_same Value::Bool::FALSE, bool(nil)
+    assert_same Value::Bool::TRUE, bool(Object.new)
+  end
+
+  def test_hex_color_with_three_digits
+    color = hex_color("F07")
+    assert_equal 255, color.red
+    assert_equal 0, color.green
+    assert_equal 119, color.blue
+    assert_equal 1, color.alpha
+  end
+
+  def test_hex_color_without_hash
+    color_without_hash = hex_color("FF007F")
+    assert_equal 255, color_without_hash.red
+    assert_equal 0, color_without_hash.green
+    assert_equal 127, color_without_hash.blue
+    assert_equal 1, color_without_hash.alpha
+  end
+
+  def test_hex_color_with_hash
+    color_with_hash = hex_color("#FF007F")
+    assert_equal 255, color_with_hash.red
+    assert_equal 0, color_with_hash.green
+    assert_equal 127, color_with_hash.blue
+    assert_equal 1, color_with_hash.alpha
+  end
+
+  def test_malformed_hex_color
+    assert_raises ArgumentError do
+      hex_color("green")
+    end
+    assert_raises ArgumentError do
+      hex_color("#abcd")
+    end
+  end
+
+
+  def test_hex_color_with_alpha
+    color_with_alpha = hex_color("FF007F", 0.5)
+    assert_equal 0.5, color_with_alpha.alpha
+  end
+
+  def test_hex_color_alpha_clamps_0_to_1
+    assert_equal 1, hex_color("FF007F", 50).alpha
+  end
+
+  def test_hsl_color_without_alpha
+    no_alpha = hsl_color(1, 0.5, 1)
+    assert_equal 1, no_alpha.hue
+    assert_equal 0.5, no_alpha.saturation
+    assert_equal 1, no_alpha.lightness
+    assert_equal 1, no_alpha.alpha
+  end
+
+  def test_hsl_color_with_alpha
+    has_alpha = hsl_color(1, 0.5, 1, 0.5)
+    assert_equal 1, has_alpha.hue
+    assert_equal 0.5, has_alpha.saturation
+    assert_equal 1, has_alpha.lightness
+    assert_equal 0.5, has_alpha.alpha
+  end
+
+  def test_rgb_color_without_alpha
+    no_alpha = rgb_color(255, 0, 0)
+    assert_equal 255, no_alpha.red
+    assert_equal 0, no_alpha.green
+    assert_equal 0, no_alpha.blue
+    assert_equal 1, no_alpha.alpha
+  end
+
+  def test_rgb_color_with_alpha
+    has_alpha = rgb_color(255, 255, 255, 0.5)
+    assert_equal 255, has_alpha.red
+    assert_equal 255, has_alpha.green
+    assert_equal 255, has_alpha.blue
+    assert_equal 0.5, has_alpha.alpha
+  end
+
+  def test_number
+    n = number(1)
+    assert_equal 1, n.value
+    assert_equal "1", n.to_sass
+  end
+
+  def test_number_with_single_unit
+    n = number(1, "px")
+    assert_equal 1, n.value
+    assert_equal "1px", n.to_sass
+  end
+
+  def test_number_with_singal_numerator_and_denominator
+    ratio = number(1, "px/em")
+    assert_equal "1px/em", ratio.to_sass
+  end
+
+  def test_number_with_many_numerator_and_denominator_units
+    complex = number(1, "px*in/em*%")
+    assert_equal "1in*px/%*em", complex.to_sass
+  end
+
+  def test_number_with_many_numerator_and_denominator_units_with_spaces
+    complex = number(1, "px * in / em * %")
+    assert_equal "1in*px/%*em", complex.to_sass
+  end
+
+  def test_number_with_malformed_units
+    assert_raises ArgumentError do
+      number(1, "px/em/%")
+    end
+    assert_raises ArgumentError do
+      number(1, "/")
+    end
+    assert_raises ArgumentError do
+      number(1, "px/")
+    end
+  end
+
+  def test_space_list
+    l = list(number(1, "px"), hex_color("#f71"), :space)
+    l.options = {}
+    assert_kind_of Sass::Script::Value::List, l
+    assert_equal "1px #f71", l.to_sass
+  end
+
+  def test_comma_list
+    l = list(number(1, "px"), hex_color("#f71"), :comma)
+    l.options = {}
+    assert_kind_of Sass::Script::Value::List, l
+    assert_equal "1px, #f71", l.to_sass
+  end
+
+  def test_missing_list_type
+    assert_raises ArgumentError do
+      list(number(1, "px"), hex_color("#f71"))
+    end
+  end
+
+  def test_null
+    assert_kind_of Sass::Script::Value::Null, null
+  end
+
+  def test_quoted_string
+    s = quoted_string("sassy string")
+    s.options = {}
+    assert_kind_of Sass::Script::Value::String, s
+    assert_equal "sassy string", s.value
+    assert_equal :string, s.type
+    assert_equal '"sassy string"', s.to_sass
+  end
+
+  def test_identifier
+    s = identifier("a-sass-ident")
+    s.options = {}
+    assert_kind_of Sass::Script::Value::String, s
+    assert_equal "a-sass-ident", s.value
+    assert_equal :identifier, s.type
+    assert_equal "a-sass-ident", s.to_sass
+  end
+
+  def test_unquoted_string
+    s = unquoted_string("a-sass-ident")
+    s.options = {}
+    assert_kind_of Sass::Script::Value::String, s
+    assert_equal "a-sass-ident", s.value
+    assert_equal :identifier, s.type
+    assert_equal "a-sass-ident", s.to_sass
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/test_helper.rb b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/test_helper.rb
new file mode 100644
index 0000000..0342203
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-3.5.1/test/test_helper.rb
@@ -0,0 +1,149 @@
+lib_dir = File.dirname(__FILE__) + '/../lib'
+
+require 'minitest/autorun'
+require 'fileutils'
+$:.unshift lib_dir unless $:.include?(lib_dir)
+require 'sass'
+require 'mathn' if ENV['MATHN'] == 'true'
+
+Sass::RAILS_LOADED = true unless defined?(Sass::RAILS_LOADED)
+
+Sass.tests_running = true
+
+if defined?(Encoding)
+  $-w, w = false, $-w
+  Encoding.default_external = 'UTF-8'
+  $-w = w
+end
+
+module Sass::Script::Functions
+  def option(name)
+    Sass::Script::Value::String.new(@options[name.value.to_sym].to_s)
+  end
+end
+
+class MiniTest::Test
+  def munge_filename(opts = {})
+    opts[:filename] ||= filename_for_test(opts[:syntax] || :sass)
+    opts[:sourcemap_filename] ||= sourcemap_filename_for_test
+    opts
+  end
+
+  def test_name
+    caller.
+      map {|c| Sass::Util.caller_info(c)[2]}.
+      compact.
+      map {|c| c.sub(/^(block|rescue) in /, '')}.
+      find {|c| c =~ /^test_/}
+  end
+
+  def filename_for_test(syntax = :sass)
+    "#{test_name}_inline.#{syntax}"
+  end
+
+  def sourcemap_filename_for_test(syntax = :sass)
+    "#{test_name}_inline.css.map"
+  end
+
+  def clean_up_sassc
+    path = File.dirname(__FILE__) + "/../.sass-cache"
+    Sass::Util.retry_on_windows {FileUtils.rm_r(path) if File.exist?(path)}
+  end
+
+  def assert_warning(message)
+    the_real_stderr, $stderr = $stderr, StringIO.new
+    result = yield
+
+    if message.is_a?(Regexp)
+      assert_match message, $stderr.string.strip
+    else
+      assert_equal message.strip, $stderr.string.strip
+    end
+    result
+  ensure
+    $stderr = the_real_stderr
+  end
+
+  def assert_no_warning
+    the_real_stderr, $stderr = $stderr, StringIO.new
+    result = yield
+    assert_equal '', $stderr.string
+    result
+  ensure
+    $stderr = the_real_stderr
+  end
+
+  def silence_warnings(&block)
+    Sass::Util.silence_warnings(&block)
+  end
+
+  def assert_raise_message(klass, message)
+    yield
+  rescue Exception => e
+    assert_instance_of(klass, e)
+    assert_equal(message, e.message)
+  else
+    flunk "Expected exception #{klass}, none raised"
+  end
+
+  def assert_raise_line(line)
+    yield
+  rescue Sass::SyntaxError => e
+    assert_equal(line, e.sass_line)
+  else
+    flunk "Expected exception on line #{line}, none raised"
+  end
+
+  def assert_sass_to_sass(sass, options: {})
+    assert_equal(sass.rstrip, to_sass(sass, options).rstrip,
+      "Expected Sass to transform to itself")
+  end
+
+  def assert_scss_to_sass(sass, scss, options: {})
+    assert_equal(sass.rstrip, to_sass(scss, options.merge(:syntax => :scss)).rstrip,
+      "Expected SCSS to transform to Sass")
+  end
+
+  def assert_scss_to_scss(scss, source: scss, options: {})
+    assert_equal(scss.rstrip, to_scss(source, options.merge(:syntax => :scss)).rstrip,
+      "Expected SCSS to transform to #{scss == source ? 'itself' : 'SCSS'}")
+  end
+
+  def assert_sass_to_scss(scss, sass, options: {})
+    assert_equal(scss.rstrip, to_scss(sass, options).rstrip,
+      "Expected Sass to transform to SCSS")
+  end
+
+  def assert_converts(sass, scss, options: {})
+    assert_sass_to_sass(sass, options: options)
+    assert_scss_to_sass(sass, scss, options: options)
+    assert_scss_to_scss(scss, options: options)
+    assert_sass_to_scss(scss, sass, options: options)
+  end
+
+  def to_sass(scss, options = {})
+    Sass::Util.silence_sass_warnings do
+      Sass::Engine.new(scss, options).to_tree.to_sass(options)
+    end
+  end
+
+  def to_scss(sass, options = {})
+    Sass::Util.silence_sass_warnings do
+      Sass::Engine.new(sass, options).to_tree.to_scss(options)
+    end
+  end
+end
+
+module PublicApiLinter
+  def lint_api(api_class, duck_type_class)
+    define_method :test_lint_instance do
+      assert lint_instance.is_a?(duck_type_class)
+    end
+    api_class.instance_methods.each do |meth|
+      define_method :"test_has_#{meth}" do
+        assert lint_instance.respond_to?(meth),
+          "#{duck_type_class.name} does not implement #{meth}"
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/CHANGELOG.md b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/CHANGELOG.md
new file mode 100644
index 0000000..232adbd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/CHANGELOG.md
@@ -0,0 +1 @@
+# Moved to [GitHub releases](https://github.com/guard/listen/releases) page.
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/CONTRIBUTING.md b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/CONTRIBUTING.md
new file mode 100644
index 0000000..5a5d6de
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/CONTRIBUTING.md
@@ -0,0 +1,38 @@
+Contribute to Listen
+===================
+
+File an issue
+-------------
+
+If you haven't already, first see [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) for known issues, solutions and workarounds.
+
+You can report bugs and feature requests to [GitHub Issues](https://github.com/guard/listen/issues).
+
+**Please don't ask question in the issue tracker**, instead ask them in our
+[Google group](http://groups.google.com/group/guard-dev) or on `#guard` (irc.freenode.net).
+
+Try to figure out where the issue belongs to: Is it an issue with Listen itself or with Guard?
+
+
+**It's most likely that your bug gets resolved faster if you provide as much information as possible!**
+
+The MOST useful information is debugging output from Listen (`LISTEN_GEM_DEBUGGING=1`) - see [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting) for details.
+
+
+Development
+-----------
+
+* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames).
+* Source hosted at [GitHub](https://github.com/guard/listen).
+
+Pull requests are very welcome! Please try to follow these simple rules if applicable:
+
+* Please create a topic branch for every separate change you make.
+* Make sure your patches are well tested. All specs run with `rake spec` must pass.
+* Update the [Yard](http://yardoc.org/) documentation.
+* Update the [README](https://github.com/guard/listen/blob/master/README.md).
+* Update the [CHANGELOG](https://github.com/guard/listen/blob/master/CHANGELOG.md) for noteworthy changes.
+* Please **do not change** the version number.
+
+For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on
+`#guard` (irc.freenode.net).
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/LICENSE.txt b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/LICENSE.txt
new file mode 100644
index 0000000..b5f71c8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/LICENSE.txt
@@ -0,0 +1,22 @@
+Copyright (c) 2013 Thibaud Guillaume-Gentil
+
+MIT License
+
+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/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/README.md b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/README.md
new file mode 100644
index 0000000..05f0b89
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/README.md
@@ -0,0 +1,297 @@
+# This is a Fork
+
+This is a fork of the official version `3.0.x` branch. Sass need to support older
+versions of ruby than Guard wants to support on an ongoing basis, so we are releasing
+updates as needed for critical fixes and will support ruby 2.0 and
+greater for as long as Sass users need it. Our blog has more information about
+ths [Ruby version policy for Sass](http://blog.sass-lang.com/posts/560719).
+
+# Listen
+
+The Listen gem listens to file modifications and notifies you about the changes.
+
+## Features
+
+* OS-optimized adapters on MRI for Mac OS X 10.6+, Linux, \*BSD and Windows, [more info](#listen-adapters) below.
+* Detects file modification, addition and removal.
+* You can watch multiple directories.
+* Regexp-patterns for ignoring paths for more accuracy and speed
+* Increased change detection accuracy on OS X HFS and VFAT volumes.
+* Tested on MRI Ruby environments (2.0+ only) via [Travis CI](https://travis-ci.org/guard/listen),
+
+## Issues / limitations
+
+* Limited support for symlinked directories ([#279](https://github.com/guard/listen/issues/279)):
+  * Symlinks are always followed ([#25](https://github.com/guard/listen/issues/25)).
+  * Symlinked directories pointing within a watched directory are not supported ([#273](https://github.com/guard/listen/pull/273)- see [Duplicate directory errors](https://github.com/guard/listen/wiki/Duplicate-directory-errors)).
+* No directory/adapter-specific configuration options.
+* Support for plugins planned for future.
+* TCP functionality was removed in Listen [3.0.0](https://github.com/guard/listen/releases/tag/v3.0.0) ([#319](https://github.com/guard/listen/issues/319), [#218](https://github.com/guard/listen/issues/218)). There are plans to extract this feature to separate gems ([#258](https://github.com/guard/listen/issues/258)), until this is finished, you can use by locking the `listen` gem to version `'~> 2.10'`.
+* Some filesystems won't work without polling (VM/Vagrant Shared folders, NFS, Samba, sshfs, etc.).
+* Specs suite on JRuby and Rubinius aren't reliable on Travis CI, but should work.
+* Windows and \*BSD adapter aren't continuously and automatically tested.
+* OSX adapter has some performance limitations ([#342](https://github.com/guard/listen/issues/342)).
+* Ruby 1.9.3 is no longer maintained (and may not work with Listen) - it's best to upgrade to Ruby 2.2.2.
+
+Pull requests or help is very welcome for these.
+
+## Install
+
+The simplest way to install Listen is to use [Bundler](http://bundler.io).
+
+```ruby
+gem 'listen', '~> 3.0' # NOTE: for TCP functionality, use '~> 2.10' for now
+```
+
+## Usage
+
+Call `Listen.to` with either a single directory or multiple directories, then define the "changes" callback in a block.
+
+``` ruby
+listener = Listen.to('dir/to/listen', 'dir/to/listen2') do |modified, added, removed|
+  puts "modified absolute path: #{modified}"
+  puts "added absolute path: #{added}"
+  puts "removed absolute path: #{removed}"
+end
+listener.start # not blocking
+sleep
+```
+
+### Pause / unpause / stop
+
+Listeners can also be easily paused/unpaused:
+
+``` ruby
+listener = Listen.to('dir/path/to/listen') { |modified, added, removed| puts 'handle changes here...' }
+
+listener.start
+listener.paused? # => false
+listener.processing? # => true
+
+listener.pause   # stops processing changes (but keeps on collecting them)
+listener.paused? # => true
+listener.processing? # => false
+
+listener.unpause # resumes processing changes ("start" would do the same)
+listener.stop    # stop both listening to changes and processing them
+```
+
+  Note: While paused, Listen keeps on collecting changes in the background - to clear them, call "stop"
+
+  Note: You should keep track of all started listeners and stop them properly on finish.
+
+### Ignore / ignore!
+
+Listen ignores some directories and extensions by default (See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer), you can add ignoring patterns with the `ignore` option/method or overwrite default with `ignore!` option/method.
+
+``` ruby
+listener = Listen.to('dir/path/to/listen', ignore: /\.txt/) { |modified, added, removed| # ... }
+listener.start
+listener.ignore! /\.pkg/ # overwrite all patterns and only ignore pkg extension.
+listener.ignore /\.rb/   # ignore rb extension in addition of pkg.
+sleep
+```
+
+Note: `:ignore` regexp patterns are evaluated against relative paths.
+
+Note: Ignoring paths does not improve performance, except when Polling ([#274](https://github.com/guard/listen/issues/274))
+
+### Only
+
+Listen catches all files (less the ignored ones) by default. If you want to only listen to a specific type of file (i.e., just `.rb` extension), you should use the `only` option/method.
+
+``` ruby
+listener = Listen.to('dir/path/to/listen', only: /\.rb$/) { |modified, added, removed| # ... }
+listener.start
+listener.only /_spec\.rb$/ # overwrite all existing only patterns.
+sleep
+```
+
+Note: `:only` regexp patterns are evaluated only against relative **file** paths.
+
+
+## Changes callback
+
+Changes to the listened-to directories gets reported back to the user in a callback.
+The registered callback gets invoked, when there are changes, with **three** parameters:
+`modified`, `added` and `removed` paths, in that particular order.
+Paths are always returned in their absolute form.
+
+Example:
+
+```ruby
+listener = Listen.to('path/to/app') do |modified, added, removed|
+  # This block will be called when there are changes.
+end
+listener.start
+sleep
+```
+
+or ...
+
+```ruby
+# Create a callback
+callback = Proc.new do |modified, added, removed|
+  # This proc will be called when there are changes.
+end
+listener = Listen.to('dir', &callback)
+listener.start
+sleep
+```
+
+## Options
+
+All the following options can be set through the `Listen.to` after the directory path(s) params.
+
+```ruby
+ignore: [%r{/foo/bar}, /\.pid$/, /\.coffee$/]   # Ignore a list of paths
+                                                # default: See DEFAULT_IGNORED_DIRECTORIES and DEFAULT_IGNORED_EXTENSIONS in Listen::Silencer
+
+ignore!: %r{/foo/bar}                           # Same as ignore options, but overwrite default ignored paths.
+
+only: %r{.rb$}                                  # Only listen to specific files
+                                                # default: none
+
+latency: 0.5                                    # Set the delay (**in seconds**) between checking for changes
+                                                # default: 0.25 sec (1.0 sec for polling)
+
+wait_for_delay: 4                               # Set the delay (**in seconds**) between calls to the callback when changes exist
+                                                # default: 0.10 sec
+
+force_polling: true                             # Force the use of the polling adapter
+                                                # default: none
+
+relative: false                                 # Whether changes should be relative to current dir or not
+                                                # default: false
+
+polling_fallback_message: 'custom message'      # Set a custom polling fallback message (or disable it with false)
+                                                # default: "Listen will be polling for changes. Learn more at https://github.com/guard/listen#listen-adapters."
+```
+
+## Debugging
+
+Setting the environment variable `LISTEN_GEM_DEBUGGING=1` sets up the INFO level logger, while `LISTEN_GEM_DEBUGGING=2` sets up the DEBUG level logger. 
+
+You can also set `Listen.logger` to a custom logger.
+
+
+## Listen adapters
+
+The Listen gem has a set of adapters to notify it when there are changes.
+
+There are 4 OS-specific adapters to support Darwin, Linux, \*BSD and Windows.
+These adapters are fast as they use some system-calls to implement the notifying function.
+
+There is also a polling adapter - although it's much slower than other adapters,
+it works on every platform/system and scenario (including network filesystems such as VM shared folders).
+
+The Darwin and Linux adapters are dependencies of the Listen gem so they work out of the box. For other adapters a specific gem will have to be added to your Gemfile, please read below.
+
+The Listen gem will choose the best adapter automatically, if present. If you
+want to force the use of the polling adapter, use the `:force_polling` option
+while initializing the listener.
+
+### On Windows
+
+If you are on Windows, it's recommended to use the [`wdm`](https://github.com/Maher4Ever/wdm) adapter instead of polling.
+
+Please add the following to your Gemfile:
+
+```ruby
+gem 'wdm', '>= 0.1.0' if Gem.win_platform?
+```
+
+### On \*BSD
+
+If you are on \*BSD you can try to use the [`rb-kqueue`](https://github.com/mat813/rb-kqueue) adapter instead of polling.
+
+Please add the following to your Gemfile:
+
+```ruby
+require 'rbconfig'
+if RbConfig::CONFIG['target_os'] =~ /bsd|dragonfly/i
+  gem 'rb-kqueue', '>= 0.2'
+end
+
+```
+
+### Getting the [polling fallback message](#options)?
+
+Please visit the [installation section of the Listen WIKI](https://github.com/guard/listen/wiki#installation) for more information and options for potential fixes.
+
+### Issues and troubleshooting
+
+*NOTE: without providing the output after setting the `LISTEN_GEM_DEBUGGING=1` environment variable, it can be almost impossible to guess why listen is not working as expected.*
+
+See [TROUBLESHOOTING](https://github.com/guard/listen/wiki/Troubleshooting)
+
+## Performance
+
+If Listen seems slow or unresponsive, make sure you're not using the Polling adapter (you should see a warning upon startup if you are).
+
+Also, if the directories you're watching contain many files, make sure you're:
+
+* not using Polling (ideally)
+* using `:ignore` and `:only` options to avoid tracking directories you don't care about (important with Polling and on MacOS)
+* running Listen with the `:latency` and `:wait_for_delay` options not too small or too big (depends on needs)
+* not watching directories with log files, database files or other frequently changing files
+* not using a version of Listen prior to 2.7.7
+* not getting silent crashes within Listen (see LISTEN_GEM_DEBUGGING=2)
+* not running multiple instances of Listen in the background
+* using a file system with atime modification disabled (ideally)
+* not using a filesystem with inaccurate file modification times (ideally), e.g. HFS, VFAT
+* not buffering to a slow terminal (e.g. transparency + fancy font + slow gfx card + lots of output)
+* ideally not running a slow encryption stack, e.g. btrfs + ecryptfs
+
+When in doubt, LISTEN_GEM_DEBUGGING=2 can help discover the actual events and time they happened.
+
+See also [Tips and Techniques](https://github.com/guard/listen/wiki/Tips-and-Techniques).
+
+## Development
+
+* Documentation hosted at [RubyDoc](http://rubydoc.info/github/guard/listen/master/frames).
+* Source hosted at [GitHub](https://github.com/guard/listen).
+
+Pull requests are very welcome! Please try to follow these simple rules if applicable:
+
+* Please create a topic branch for every separate change you make.
+* Make sure your patches are well tested. All specs must pass on [Travis CI](https://travis-ci.org/guard/listen).
+* Update the [Yard](http://yardoc.org/) documentation.
+* Update the [README](https://github.com/guard/listen/blob/master/README.md).
+* Please **do not change** the version number.
+
+For questions please join us in our [Google group](http://groups.google.com/group/guard-dev) or on
+`#guard` (irc.freenode.net).
+
+## Acknowledgments
+
+* [Michael Kessler (netzpirat)][] for having written the [initial specs](https://github.com/guard/listen/commit/1e457b13b1bb8a25d2240428ce5ed488bafbed1f).
+* [Travis Tilley (ttilley)][] for this awesome work on [fssm][] & [rb-fsevent][].
+* [Nathan Weizenbaum (nex3)][] for [rb-inotify][], a thorough inotify wrapper.
+* [Mathieu Arnold (mat813)][] for [rb-kqueue][], a simple kqueue wrapper.
+* [Maher Sallam][] for [wdm][], windows support wouldn't exist without him.
+* [Yehuda Katz (wycats)][] for [vigilo][], that has been a great source of inspiration.
+
+## Author
+
+[Thibaud Guillaume-Gentil](https://github.com/thibaudgg) ([@thibaudgg](https://twitter.com/thibaudgg))
+
+## Contributors
+
+[https://github.com/guard/listen/graphs/contributors](https://github.com/guard/listen/graphs/contributors)
+
+[Thibaud Guillaume-Gentil (thibaudgg)]: https://github.com/thibaudgg
+[Maher Sallam]: https://github.com/Maher4Ever
+[Michael Kessler (netzpirat)]: https://github.com/netzpirat
+[Travis Tilley (ttilley)]: https://github.com/ttilley
+[fssm]: https://github.com/ttilley/fssm
+[rb-fsevent]: https://github.com/thibaudgg/rb-fsevent
+[Mathieu Arnold (mat813)]: https://github.com/mat813
+[Nathan Weizenbaum (nex3)]: https://github.com/nex3
+[rb-inotify]: https://github.com/nex3/rb-inotify
+[stereobooster]: https://github.com/stereobooster
+[rb-fchange]: https://github.com/stereobooster/rb-fchange
+[rb-kqueue]: https://github.com/mat813/rb-kqueue
+[Yehuda Katz (wycats)]: https://github.com/wycats
+[vigilo]: https://github.com/wycats/vigilo
+[wdm]: https://github.com/Maher4Ever/wdm
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen.rb
new file mode 100644
index 0000000..dac914f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen.rb
@@ -0,0 +1,55 @@
+require 'logger'
+require 'sass-listen/logger'
+require 'sass-listen/listener'
+
+require 'sass-listen/internals/thread_pool'
+
+# Always set up logging by default first time file is required
+#
+# NOTE: If you need to clear the logger completely, do so *after*
+# requiring this file. If you need to set a custom logger,
+# require the listen/logger file and set the logger before requiring
+# this file.
+SassListen.setup_default_logger_if_unset
+
+# Won't print anything by default because of level - unless you've set
+# LISTEN_GEM_DEBUGGING or provided your own logger with a high enough level
+SassListen::Logger.info "SassListen loglevel set to: #{SassListen.logger.level}"
+SassListen::Logger.info "SassListen version: #{SassListen::VERSION}"
+
+module SassListen
+  class << self
+    # Listens to file system modifications on a either single directory or
+    # multiple directories.
+    #
+    # @param (see SassListen::Listener#new)
+    #
+    # @yield [modified, added, removed] the changed files
+    # @yieldparam [Array<String>] modified the list of modified files
+    # @yieldparam [Array<String>] added the list of added files
+    # @yieldparam [Array<String>] removed the list of removed files
+    #
+    # @return [SassListen::Listener] the listener
+    #
+    def to(*args, &block)
+      @listeners ||= []
+      Listener.new(*args, &block).tap do |listener|
+        @listeners << listener
+      end
+    end
+
+    # This is used by the `listen` binary to handle Ctrl-C
+    #
+    def stop
+      Internals::ThreadPool.stop
+      @listeners ||= []
+
+      # TODO: should use a mutex for this
+      @listeners.each do |listener|
+        # call stop to halt the main loop
+        listener.stop
+      end
+      @listeners = nil
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter.rb
new file mode 100644
index 0000000..1f94971
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter.rb
@@ -0,0 +1,43 @@
+require 'sass-listen/adapter/base'
+require 'sass-listen/adapter/bsd'
+require 'sass-listen/adapter/darwin'
+require 'sass-listen/adapter/linux'
+require 'sass-listen/adapter/polling'
+require 'sass-listen/adapter/windows'
+
+module SassListen
+  module Adapter
+    OPTIMIZED_ADAPTERS = [Darwin, Linux, BSD, Windows]
+    POLLING_FALLBACK_MESSAGE = 'SassListen will be polling for changes.'\
+      'Learn more at https://github.com/guard/listen#listen-adapters.'
+
+    def self.select(options = {})
+      _log :debug, 'Adapter: considering polling ...'
+      return Polling if options[:force_polling]
+      _log :debug, 'Adapter: considering optimized backend...'
+      return _usable_adapter_class if _usable_adapter_class
+      _log :debug, 'Adapter: falling back to polling...'
+      _warn_polling_fallback(options)
+      Polling
+    rescue
+      _log :warn, format('Adapter: failed: %s:%s', $ERROR_POSITION.inspect,
+                         $ERROR_POSITION * "\n")
+      raise
+    end
+
+    private
+
+    def self._usable_adapter_class
+      OPTIMIZED_ADAPTERS.detect(&:usable?)
+    end
+
+    def self._warn_polling_fallback(options)
+      msg = options.fetch(:polling_fallback_message, POLLING_FALLBACK_MESSAGE)
+      Kernel.warn "[SassListen warning]:\n  #{msg}" if msg
+    end
+
+    def self._log(type, message)
+      SassListen::Logger.send(type, message)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/base.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/base.rb
new file mode 100644
index 0000000..94a9071
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/base.rb
@@ -0,0 +1,137 @@
+require 'sass-listen/options'
+require 'sass-listen/record'
+require 'sass-listen/change'
+
+module SassListen
+  module Adapter
+    class Base
+      attr_reader :options
+
+      # TODO: only used by tests
+      DEFAULTS = {}
+
+      attr_reader :config
+
+      def initialize(config)
+        @started = false
+        @config = config
+
+        @configured = nil
+
+        fail 'No directories to watch!' if config.directories.empty?
+
+        defaults = self.class.const_get('DEFAULTS')
+        @options = SassListen::Options.new(config.adapter_options, defaults)
+      rescue
+        _log_exception 'adapter config failed: %s:%s called from: %s', caller
+        raise
+      end
+
+      # TODO: it's a separate method as a temporary workaround for tests
+      def configure
+        if @configured
+          _log(:warn, 'Adapter already configured!')
+          return
+        end
+
+        @configured = true
+
+        @callbacks ||= {}
+        config.directories.each do |dir|
+          callback = @callbacks[dir] || lambda do |event|
+            _process_event(dir, event)
+          end
+          @callbacks[dir] = callback
+          _configure(dir, &callback)
+        end
+
+        @snapshots ||= {}
+        # TODO: separate config per directory (some day maybe)
+        change_config = Change::Config.new(config.queue, config.silencer)
+        config.directories.each do |dir|
+          record = Record.new(dir)
+          snapshot = Change.new(change_config, record)
+          @snapshots[dir] = snapshot
+        end
+      end
+
+      def started?
+        @started
+      end
+
+      def start
+        configure
+
+        if started?
+          _log(:warn, 'Adapter already started!')
+          return
+        end
+
+        @started = true
+
+        calling_stack = caller.dup
+        SassListen::Internals::ThreadPool.add do
+          begin
+            @snapshots.values.each do |snapshot|
+              _timed('Record.build()') { snapshot.record.build }
+            end
+            _run
+          rescue
+            msg = 'run() in thread failed: %s:\n'\
+              ' %s\n\ncalled from:\n %s'
+            _log_exception(msg, calling_stack)
+            raise # for unit tests mostly
+          end
+        end
+      end
+
+      def stop
+        _stop
+      end
+
+      def self.usable?
+        const_get('OS_REGEXP') =~ RbConfig::CONFIG['target_os']
+      end
+
+      private
+
+      def _stop
+      end
+
+      def _timed(title)
+        start = Time.now.to_f
+        yield
+        diff = Time.now.to_f - start
+        SassListen::Logger.info format('%s: %.05f seconds', title, diff)
+      rescue
+        SassListen::Logger.warn "#{title} crashed: #{$ERROR_INFO.inspect}"
+        raise
+      end
+
+      # TODO: allow backend adapters to pass specific invalidation objects
+      # e.g. Darwin -> DirRescan, INotify -> MoveScan, etc.
+      def _queue_change(type, dir, rel_path, options)
+        @snapshots[dir].invalidate(type, rel_path, options)
+      end
+
+      def _log(*args, &block)
+        self.class.send(:_log, *args, &block)
+      end
+
+      def _log_exception(msg, caller_stack)
+        formatted = format(
+          msg,
+          $ERROR_INFO,
+          $ERROR_POSITION * "\n",
+          caller_stack * "\n"
+        )
+
+        _log(:error, formatted)
+      end
+
+      def self._log(*args, &block)
+        SassListen::Logger.send(*args, &block)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/bsd.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/bsd.rb
new file mode 100644
index 0000000..90e5f58
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/bsd.rb
@@ -0,0 +1,106 @@
+# Listener implementation for BSD's `kqueue`.
+# @see http://www.freebsd.org/cgi/man.cgi?query=kqueue
+# @see https://github.com/mat813/rb-kqueue/blob/master/lib/rb-kqueue/queue.rb
+#
+module SassListen
+  module Adapter
+    class BSD < Base
+      OS_REGEXP = /bsd|dragonfly/i
+
+      DEFAULTS = {
+        events: [
+          :delete,
+          :write,
+          :extend,
+          :attrib,
+          :rename
+          # :link, :revoke
+        ]
+      }
+
+      BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '')
+        Please add the following to your Gemfile to avoid polling for changes:
+          require 'rbconfig'
+          if RbConfig::CONFIG['target_os'] =~ /#{OS_REGEXP}/
+            gem 'rb-kqueue', '>= 0.2'
+          end
+      EOS
+
+      def self.usable?
+        return false unless super
+        require 'rb-kqueue'
+        require 'find'
+        true
+      rescue LoadError
+        Kernel.warn BUNDLER_DECLARE_GEM
+        false
+      end
+
+      private
+
+      def _configure(directory, &_callback)
+        @worker ||= KQueue::Queue.new
+        @callback = _callback
+        # use Record to make a snapshot of dir, so we
+        # can detect new files
+        _find(directory.to_s) { |path| _watch_file(path, @worker) }
+      end
+
+      def _run
+        @worker.run
+      end
+
+      def _process_event(dir, event)
+        full_path = _event_path(event)
+        if full_path.directory?
+          # Force dir content tracking to kick in, or we won't have
+          # names of added files
+          _queue_change(:dir, dir, '.', recursive: true)
+        elsif full_path.exist?
+          path = full_path.relative_path_from(dir)
+          _queue_change(:file, dir, path.to_s, change: _change(event.flags))
+        end
+
+        # If it is a directory, and it has a write flag, it means a
+        # file has been added so find out which and deal with it.
+        # No need to check for removed files, kqueue will forget them
+        # when the vfs does.
+        _watch_for_new_file(event) if full_path.directory?
+      end
+
+      def _change(event_flags)
+        { modified: [:attrib, :extend],
+          added:    [:write],
+          removed:  [:rename, :delete]
+        }.each do |change, flags|
+          return change unless (flags & event_flags).empty?
+        end
+        nil
+      end
+
+      def _event_path(event)
+        Pathname.new(event.watcher.path)
+      end
+
+      def _watch_for_new_file(event)
+        queue = event.watcher.queue
+        _find(_event_path(event).to_s) do |file_path|
+          unless queue.watchers.detect { |_, v| v.path == file_path.to_s }
+            _watch_file(file_path, queue)
+          end
+        end
+      end
+
+      def _watch_file(path, queue)
+        queue.watch_file(path, *options.events, &@callback)
+      rescue Errno::ENOENT => e
+        _log :warn, "kqueue: watch file failed: #{e.message}"
+      end
+
+      # Quick rubocop workaround
+      def _find(*paths, &block)
+        Find.send(:find, *paths, &block)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/config.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/config.rb
new file mode 100644
index 0000000..e1c807a
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/config.rb
@@ -0,0 +1,26 @@
+require 'pathname'
+
+module SassListen
+  module Adapter
+    class Config
+      attr_reader :directories
+      attr_reader :silencer
+      attr_reader :queue
+      attr_reader :adapter_options
+
+      def initialize(directories, queue, silencer, adapter_options)
+        # Default to current directory if no directories are supplied
+        directories = [Dir.pwd] if directories.to_a.empty?
+        
+        # TODO: fix (flatten, array, compact?)
+        @directories = directories.map do |directory|
+          Pathname.new(directory.to_s).realpath
+        end
+
+        @silencer = silencer
+        @queue = queue
+        @adapter_options = adapter_options
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/darwin.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/darwin.rb
new file mode 100644
index 0000000..d543726
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/darwin.rb
@@ -0,0 +1,88 @@
+require 'thread'
+require 'sass-listen/internals/thread_pool'
+
+module SassListen
+  module Adapter
+    # Adapter implementation for Mac OS X `FSEvents`.
+    #
+    class Darwin < Base
+      OS_REGEXP = /darwin(?<major_version>1\d+)/i
+
+      # The default delay between checking for changes.
+      DEFAULTS = { latency: 0.1 }
+
+      INCOMPATIBLE_GEM_VERSION = <<-EOS.gsub(/^ {8}/, '')
+        rb-fsevent > 0.9.4 no longer supports OS X 10.6 through 10.8.
+
+        Please add the following to your Gemfile to avoid polling for changes:
+          require 'rbconfig'
+          if RbConfig::CONFIG['target_os'] =~ /darwin(1[0-3])/i
+            gem 'rb-fsevent', '<= 0.9.4'
+          end
+      EOS
+
+      def self.usable?
+        require 'rb-fsevent'
+        darwin_version = RbConfig::CONFIG['target_os'][OS_REGEXP, :major_version] or return false
+        return true if darwin_version.to_i >= 13 # darwin13 is OS X 10.9
+        return true if Gem::Version.new(FSEvent::VERSION) <= Gem::Version.new('0.9.4')
+        Kernel.warn INCOMPATIBLE_GEM_VERSION
+        false
+      end
+
+      private
+
+      # NOTE: each directory gets a DIFFERENT callback!
+      def _configure(dir, &callback)
+        opts = { latency: options.latency }
+
+        @workers ||= ::Queue.new
+        @workers << FSEvent.new.tap do |worker|
+          _log :debug, "fsevent: watching: #{dir.to_s.inspect}"
+          worker.watch(dir.to_s, opts, &callback)
+        end
+      end
+
+      def _run
+        first = @workers.pop
+
+        # NOTE: _run is called within a thread, so run every other
+        # worker in it's own thread
+        _run_workers_in_background(_to_array(@workers))
+        _run_worker(first)
+      end
+
+      def _process_event(dir, event)
+        _log :debug, "fsevent: processing event: #{event.inspect}"
+        event.each do |path|
+          new_path = Pathname.new(path.sub(/\/$/, ''))
+          _log :debug, "fsevent: #{new_path}"
+          # TODO: does this preserve symlinks?
+          rel_path = new_path.relative_path_from(dir).to_s
+          _queue_change(:dir, dir, rel_path, recursive: true)
+        end
+      end
+
+      def _run_worker(worker)
+        _log :debug, "fsevent: running worker: #{worker.inspect}"
+        worker.run
+      rescue
+        _log_exception 'fsevent: running worker failed: %s:%s called from: %s', caller
+      end
+
+      def _run_workers_in_background(workers)
+        workers.each do |worker|
+          # NOTE: while passing local variables to the block below is not
+          # thread safe, using 'worker' from the enumerator above is ok
+          SassListen::Internals::ThreadPool.add { _run_worker(worker) }
+        end
+      end
+
+      def _to_array(queue)
+        workers = []
+        workers << queue.pop until queue.empty?
+        workers
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/linux.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/linux.rb
new file mode 100644
index 0000000..08d0d80
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/linux.rb
@@ -0,0 +1,108 @@
+module SassListen
+  module Adapter
+    # @see https://github.com/nex3/rb-inotify
+    class Linux < Base
+      OS_REGEXP = /linux/i
+
+      DEFAULTS = {
+        events: [
+          :recursive,
+          :attrib,
+          :create,
+          :delete,
+          :move,
+          :close_write
+        ],
+        wait_for_delay: 0.1
+      }
+
+      private
+
+      WIKI_URL = 'https://github.com/guard/listen'\
+        '/wiki/Increasing-the-amount-of-inotify-watchers'
+
+      INOTIFY_LIMIT_MESSAGE = <<-EOS.gsub(/^\s*/, '')
+        FATAL: SassListen error: unable to monitor directories for changes.
+        Visit #{WIKI_URL} for info on how to fix this.
+      EOS
+
+      def _configure(directory, &callback)
+        require 'rb-inotify'
+        @worker ||= ::INotify::Notifier.new
+        @worker.watch(directory.to_s, *options.events, &callback)
+      rescue Errno::ENOSPC
+        abort(INOTIFY_LIMIT_MESSAGE)
+      end
+
+      def _run
+        Thread.current[:listen_blocking_read_thread] = true
+        @worker.run
+        Thread.current[:listen_blocking_read_thread] = false
+      end
+
+      def _process_event(dir, event)
+        # NOTE: avoid using event.absolute_name since new API
+        # will need to have a custom recursion implemented
+        # to properly match events to configured directories
+        path = Pathname.new(event.watcher.path) + event.name
+        rel_path = path.relative_path_from(dir).to_s
+
+        _log(:debug) { "inotify: #{rel_path} (#{event.flags.inspect})" }
+
+        if /1|true/ =~ ENV['LISTEN_GEM_SIMULATE_FSEVENT']
+          if (event.flags & [:moved_to, :moved_from]) || _dir_event?(event)
+            rel_path = path.dirname.relative_path_from(dir).to_s
+            _queue_change(:dir, dir, rel_path, {})
+          else
+            _queue_change(:dir, dir, rel_path, {})
+          end
+          return
+        end
+
+        return if _skip_event?(event)
+
+        cookie_params = event.cookie.zero? ? {} : { cookie: event.cookie }
+
+        # Note: don't pass options to force rescanning the directory, so we can
+        # detect moving/deleting a whole tree
+        if _dir_event?(event)
+          _queue_change(:dir, dir, rel_path, cookie_params)
+          return
+        end
+
+        params = cookie_params.merge(change: _change(event.flags))
+
+        _queue_change(:file, dir, rel_path, params)
+      end
+
+      def _skip_event?(event)
+        # Event on root directory
+        return true if event.name == ''
+        # INotify reports changes to files inside directories as events
+        # on the directories themselves too.
+        #
+        # @see http://linux.die.net/man/7/inotify
+        _dir_event?(event) && (event.flags & [:close, :modify]).any?
+      end
+
+      def _change(event_flags)
+        { modified:   [:attrib, :close_write],
+          moved_to:   [:moved_to],
+          moved_from: [:moved_from],
+          added:      [:create],
+          removed:    [:delete] }.each do |change, flags|
+          return change unless (flags & event_flags).empty?
+        end
+        nil
+      end
+
+      def _dir_event?(event)
+        event.flags.include?(:isdir)
+      end
+
+      def _stop
+        @worker && @worker.close
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/polling.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/polling.rb
new file mode 100644
index 0000000..cd6d3c9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/polling.rb
@@ -0,0 +1,37 @@
+module SassListen
+  module Adapter
+    # Polling Adapter that works cross-platform and
+    # has no dependencies. This is the adapter that
+    # uses the most CPU processing power and has higher
+    # file IO than the other implementations.
+    #
+    class Polling < Base
+      OS_REGEXP = // # match every OS
+
+      DEFAULTS = { latency: 1.0, wait_for_delay: 0.05 }
+
+      private
+
+      def _configure(_, &callback)
+        @polling_callbacks ||= []
+        @polling_callbacks << callback
+      end
+
+      def _run
+        loop do
+          start = Time.now.to_f
+          @polling_callbacks.each do |callback|
+            callback.call(nil)
+            nap_time = options.latency - (Time.now.to_f - start)
+            # TODO: warn if nap_time is negative (polling too slow)
+            sleep(nap_time) if nap_time > 0
+          end
+        end
+      end
+
+      def _process_event(dir, _)
+        _queue_change(:dir, dir, '.', recursive: true)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/windows.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/windows.rb
new file mode 100644
index 0000000..7214e19
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/windows.rb
@@ -0,0 +1,99 @@
+module SassListen
+  module Adapter
+    # Adapter implementation for Windows `wdm`.
+    #
+    class Windows < Base
+      OS_REGEXP = /mswin|mingw|cygwin/i
+
+      BUNDLER_DECLARE_GEM = <<-EOS.gsub(/^ {6}/, '')
+        Please add the following to your Gemfile to avoid polling for changes:
+          gem 'wdm', '>= 0.1.0' if Gem.win_platform?
+      EOS
+
+      def self.usable?
+        return false unless super
+        require 'wdm'
+        true
+      rescue LoadError
+        _log :debug, format('wdm - load failed: %s:%s', $ERROR_INFO,
+                            $ERROR_POSITION * "\n")
+
+        Kernel.warn BUNDLER_DECLARE_GEM
+        false
+      end
+
+      private
+
+      def _configure(dir, &callback)
+        require 'wdm'
+        _log :debug, 'wdm - starting...'
+        @worker ||= WDM::Monitor.new
+        @worker.watch_recursively(dir.to_s, :files) do |change|
+          callback.call([:file, change])
+        end
+
+        @worker.watch_recursively(dir.to_s, :directories) do |change|
+          callback.call([:dir, change])
+        end
+
+        events = [:attributes, :last_write]
+        @worker.watch_recursively(dir.to_s, *events) do |change|
+          callback.call([:attr, change])
+        end
+      end
+
+      def _run
+        @worker.run!
+      end
+
+      def _process_event(dir, event)
+        _log :debug, "wdm - callback: #{event.inspect}"
+
+        type, change = event
+
+        full_path = Pathname(change.path)
+
+        rel_path = full_path.relative_path_from(dir).to_s
+
+        options = { change: _change(change.type) }
+
+        case type
+        when :file
+          _queue_change(:file, dir, rel_path, options)
+        when :attr
+          unless full_path.directory?
+            _queue_change(:file, dir, rel_path, options)
+          end
+        when :dir
+          if change.type == :removed
+            # TODO: check if watched dir?
+            _queue_change(:dir, dir, Pathname(rel_path).dirname.to_s, {})
+          elsif change.type == :added
+            _queue_change(:dir, dir, rel_path, {})
+          else
+            # do nothing - changed directory means either:
+            #   - removed subdirs (handled above)
+            #   - added subdirs (handled above)
+            #   - removed files (handled by _file_callback)
+            #   - added files (handled by _file_callback)
+            # so what's left?
+          end
+        end
+      rescue
+        details = event.inspect
+        _log :error, format('wdm - callback (%): %s:%s', details, $ERROR_INFO,
+                            $ERROR_POSITION * "\n")
+        raise
+      end
+
+      def _change(type)
+        { modified: [:modified, :attrib], # TODO: is attrib really passed?
+          added:    [:added, :renamed_new_file],
+          removed:  [:removed, :renamed_old_file] }.each do |change, types|
+          return change if types.include?(type)
+        end
+        nil
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/backend.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/backend.rb
new file mode 100644
index 0000000..08dd764
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/backend.rb
@@ -0,0 +1,43 @@
+require 'sass-listen/adapter'
+require 'sass-listen/adapter/base'
+require 'sass-listen/adapter/config'
+
+require 'forwardable'
+
+# This class just aggregates configuration object to avoid Listener specs
+# from exploding with huge test setup blocks
+module SassListen
+  class Backend
+    def initialize(directories, queue, silencer, config)
+      adapter_select_opts = config.adapter_select_options
+
+      adapter_class = Adapter.select(adapter_select_opts)
+
+      # Use default from adapter if possible
+      @min_delay_between_events = config.min_delay_between_events
+      @min_delay_between_events ||= adapter_class::DEFAULTS[:wait_for_delay]
+      @min_delay_between_events ||= 0.1
+
+      adapter_opts = config.adapter_instance_options(adapter_class)
+
+      aconfig = Adapter::Config.new(directories, queue, silencer, adapter_opts)
+      @adapter = adapter_class.new(aconfig)
+    end
+
+    def start
+      adapter.start
+    end
+
+    def stop
+      adapter.stop
+    end
+
+    def min_delay_between_events
+      @min_delay_between_events
+    end
+
+    private
+
+    attr_reader :adapter
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/change.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/change.rb
new file mode 100644
index 0000000..6b1f07c
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/change.rb
@@ -0,0 +1,78 @@
+require 'sass-listen/file'
+require 'sass-listen/directory'
+
+module SassListen
+  # TODO: rename to Snapshot
+  class Change
+    # TODO: test this class for coverage
+    class Config
+      def initialize(queue, silencer)
+        @queue = queue
+        @silencer = silencer
+      end
+
+      def silenced?(path, type)
+        @silencer.silenced?(Pathname(path), type)
+      end
+
+      def queue(*args)
+        @queue << args
+      end
+    end
+
+    attr_reader :record
+
+    def initialize(config, record)
+      @config = config
+      @record = record
+    end
+
+    # Invalidate some part of the snapshot/record (dir, file, subtree, etc.)
+    def invalidate(type, rel_path, options)
+      watched_dir = Pathname.new(record.root)
+
+      change = options[:change]
+      cookie = options[:cookie]
+
+      if !cookie && config.silenced?(rel_path, type)
+        SassListen::Logger.debug {  "(silenced): #{rel_path.inspect}" }
+        return
+      end
+
+      path = watched_dir + rel_path
+
+      SassListen::Logger.debug do
+        log_details = options[:silence] && 'recording' || change || 'unknown'
+        "#{log_details}: #{type}:#{path} (#{options.inspect})"
+      end
+
+      if change
+        options = cookie ? { cookie: cookie } : {}
+        config.queue(type, change, watched_dir, rel_path, options)
+      else
+        if type == :dir
+          # NOTE: POSSIBLE RECURSION
+          # TODO: fix - use a queue instead
+          Directory.scan(self, rel_path, options)
+        else
+          change = File.change(record, rel_path)
+          return if !change || options[:silence]
+          config.queue(:file, change, watched_dir, rel_path)
+        end
+      end
+    rescue RuntimeError => ex
+      msg = format(
+        '%s#%s crashed %s:%s',
+        self.class,
+        __method__,
+        exinspect,
+        ex.backtrace * "\n")
+      SassListen::Logger.error(msg)
+      raise
+    end
+
+    private
+
+    attr_reader :config
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/cli.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/cli.rb
new file mode 100644
index 0000000..c56193d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/cli.rb
@@ -0,0 +1,65 @@
+require 'thor'
+require 'sass-listen'
+require 'logger'
+
+module SassListen
+  class CLI < Thor
+    default_task :start
+
+    desc 'start', 'Starts SassListen'
+
+    class_option :verbose,
+                 type:    :boolean,
+                 default: false,
+                 aliases: '-v',
+                 banner:  'Verbose'
+
+    class_option :directory,
+                 type:    :array,
+                 default: '.',
+                 aliases: '-d',
+                 banner:  'The directory to listen to'
+
+    class_option :relative,
+                 type:    :boolean,
+                 default: false,
+                 aliases: '-r',
+                 banner:  'Convert paths relative to current directory'
+
+    def start
+      SassListen::Forwarder.new(options).start
+    end
+  end
+
+  class Forwarder
+    attr_reader :logger
+    def initialize(options)
+      @options = options
+      @logger = ::Logger.new(STDOUT)
+      @logger.level = ::Logger::INFO
+      @logger.formatter = proc { |_, _, _, msg| "#{msg}\n" }
+    end
+
+    def start
+      logger.info 'Starting listen...'
+      directory = @options[:directory]
+      relative = @options[:relative]
+      callback = proc do |modified, added, removed|
+        if @options[:verbose]
+          logger.info "+ #{added}" unless added.empty?
+          logger.info "- #{removed}" unless removed.empty?
+          logger.info "> #{modified}" unless modified.empty?
+        end
+      end
+
+      listener = SassListen.to(
+        directory,
+        relative: relative,
+        &callback)
+
+      listener.start
+
+      sleep 0.5 while listener.processing?
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/directory.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/directory.rb
new file mode 100644
index 0000000..b3ab704
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/directory.rb
@@ -0,0 +1,87 @@
+require 'set'
+
+module SassListen
+  # TODO: refactor (turn it into a normal object, cache the stat, etc)
+  class Directory
+    def self.scan(snapshot, rel_path, options)
+      record = snapshot.record
+      dir = Pathname.new(record.root)
+      previous = record.dir_entries(rel_path)
+
+      record.add_dir(rel_path)
+
+      # TODO: use children(with_directory: false)
+      path = dir + rel_path
+      current = Set.new(_children(path))
+
+      SassListen::Logger.debug do
+        format('%s: %s(%s): %s -> %s',
+               (options[:silence] ? 'Recording' : 'Scanning'),
+               rel_path, options.inspect, previous.inspect, current.inspect)
+      end
+
+      begin
+        current.each do |full_path|
+          type = ::File.lstat(full_path.to_s).directory? ? :dir : :file
+          item_rel_path = full_path.relative_path_from(dir).to_s
+          _change(snapshot, type, item_rel_path, options)
+        end
+      rescue Errno::ENOENT
+        # The directory changed meanwhile, so rescan it
+        current = Set.new(_children(path))
+        retry
+      end
+
+      # TODO: this is not tested properly
+      previous = previous.reject { |entry, _| current.include? path + entry }
+
+      _async_changes(snapshot, Pathname.new(rel_path), previous, options)
+
+    rescue Errno::ENOENT, Errno::EHOSTDOWN
+      record.unset_path(rel_path)
+      _async_changes(snapshot, Pathname.new(rel_path), previous, options)
+
+    rescue Errno::ENOTDIR
+      # TODO: path not tested
+      record.unset_path(rel_path)
+      _async_changes(snapshot, path, previous, options)
+      _change(snapshot, :file, rel_path, options)
+    rescue
+      SassListen::Logger.warn do
+        format('scan DIED: %s:%s', $ERROR_INFO, $ERROR_POSITION * "\n")
+      end
+      raise
+    end
+
+    def self._async_changes(snapshot, path, previous, options)
+      fail "Not a Pathname: #{path.inspect}" unless path.respond_to?(:children)
+      previous.each do |entry, data|
+        # TODO: this is a hack with insufficient testing
+        type = data.key?(:mtime) ? :file : :dir
+        rel_path_s = (path + entry).to_s
+        _change(snapshot, type, rel_path_s, options)
+      end
+    end
+
+    def self._change(snapshot, type, path, options)
+      return snapshot.invalidate(type, path, options) if type == :dir
+
+      # Minor param cleanup for tests
+      # TODO: use a dedicated Event class
+      opts = options.dup
+      opts.delete(:recursive)
+      snapshot.invalidate(type, path, opts)
+    end
+
+    def self._children(path)
+      return path.children unless RUBY_ENGINE == 'jruby'
+
+      # JRuby inconsistency workaround, see:
+      # https://github.com/jruby/jruby/issues/3840
+      exists = path.exist?
+      directory = path.directory?
+      return path.children unless (exists && !directory)
+      raise Errno::ENOTDIR, path.to_s
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/config.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/config.rb
new file mode 100644
index 0000000..9709ebe
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/config.rb
@@ -0,0 +1,59 @@
+module SassListen
+  module Event
+    class Config
+      def initialize(
+        listener,
+        event_queue,
+        queue_optimizer,
+        wait_for_delay,
+        &block)
+
+        @listener = listener
+        @event_queue = event_queue
+        @queue_optimizer = queue_optimizer
+        @min_delay_between_events = wait_for_delay
+        @block = block
+      end
+
+      def sleep(*args)
+        Kernel.sleep(*args)
+      end
+
+      def call(*args)
+        @block.call(*args) if @block
+      end
+
+      def timestamp
+        Time.now.to_f
+      end
+
+      def event_queue
+        @event_queue
+      end
+
+      def callable?
+        @block
+      end
+
+      def optimize_changes(changes)
+        @queue_optimizer.smoosh_changes(changes)
+      end
+
+      def min_delay_between_events
+        @min_delay_between_events
+      end
+
+      def stopped?
+        listener.state == :stopped
+      end
+
+      def paused?
+        listener.state == :paused
+      end
+
+      private
+
+      attr_reader :listener
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/loop.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/loop.rb
new file mode 100644
index 0000000..c2caec2
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/loop.rb
@@ -0,0 +1,117 @@
+require 'thread'
+
+require 'timeout'
+require 'sass-listen/event/processor'
+
+module SassListen
+  module Event
+    class Loop
+      class Error < RuntimeError
+        class NotStarted < Error
+        end
+      end
+
+      def initialize(config)
+        @config = config
+        @wait_thread = nil
+        @state = :paused
+        @reasons = ::Queue.new
+      end
+
+      def wakeup_on_event
+        return if stopped?
+        return unless processing?
+        return unless wait_thread.alive?
+        _wakeup(:event)
+      end
+
+      def paused?
+        wait_thread && state == :paused
+      end
+
+      def processing?
+        return false if stopped?
+        return false if paused?
+        state == :processing
+      end
+
+      def setup
+        # TODO: use a Fiber instead?
+        q = ::Queue.new
+        @wait_thread = Internals::ThreadPool.add do
+          _wait_for_changes(q, config)
+        end
+
+        SassListen::Logger.debug('Waiting for processing to start...')
+        Timeout.timeout(5) { q.pop }
+      end
+
+      def resume
+        fail Error::NotStarted if stopped?
+        return unless wait_thread
+        _wakeup(:resume)
+      end
+
+      def pause
+        # TODO: works?
+        # fail NotImplementedError
+      end
+
+      def teardown
+        return unless wait_thread
+        if wait_thread.alive?
+          _wakeup(:teardown)
+          wait_thread.join
+        end
+        @wait_thread = nil
+      end
+
+      def stopped?
+        !wait_thread
+      end
+
+      private
+
+      attr_reader :config
+      attr_reader :wait_thread
+
+      attr_accessor :state
+
+      def _wait_for_changes(ready_queue, config)
+        processor = Event::Processor.new(config, @reasons)
+
+        _wait_until_resumed(ready_queue)
+        processor.loop_for(config.min_delay_between_events)
+      rescue StandardError => ex
+        _nice_error(ex)
+      end
+
+      def _sleep(*args)
+        Kernel.sleep(*args)
+      end
+
+      def _wait_until_resumed(ready_queue)
+        self.state = :paused
+        ready_queue << :ready
+        sleep
+        self.state = :processing
+      end
+
+      def _nice_error(ex)
+        indent = "\n -- "
+        msg = format(
+          'exception while processing events: %s Backtrace:%s%s',
+          ex,
+          indent,
+          ex.backtrace * indent
+        )
+        SassListen::Logger.error(msg)
+      end
+
+      def _wakeup(reason)
+        @reasons << reason
+        wait_thread.wakeup
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/processor.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/processor.rb
new file mode 100644
index 0000000..4002880
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/processor.rb
@@ -0,0 +1,122 @@
+module SassListen
+  module Event
+    class Processor
+      def initialize(config, reasons)
+        @config = config
+        @reasons = reasons
+        _reset_no_unprocessed_events
+      end
+
+      # TODO: implement this properly instead of checking the state at arbitrary
+      # points in time
+      def loop_for(latency)
+        @latency = latency
+
+        loop do
+          _wait_until_events
+          _wait_until_events_calm_down
+          _wait_until_no_longer_paused
+          _process_changes
+        end
+      rescue Stopped
+        SassListen::Logger.debug('Processing stopped')
+      end
+
+      private
+
+      class Stopped < RuntimeError
+      end
+
+      def _wait_until_events_calm_down
+        loop do
+          now = _timestamp
+
+          # Assure there's at least latency between callbacks to allow
+          # for accumulating changes
+          diff = _deadline - now
+          break if diff <= 0
+
+          # give events a bit of time to accumulate so they can be
+          # compressed/optimized
+          _sleep(:waiting_until_latency, diff)
+        end
+      end
+
+      def _wait_until_no_longer_paused
+        # TODO: may not be a good idea?
+        _sleep(:waiting_for_unpause) while config.paused?
+      end
+
+      def _check_stopped
+        return unless config.stopped?
+
+        _flush_wakeup_reasons
+        raise Stopped
+      end
+
+      def _sleep(_local_reason, *args)
+        _check_stopped
+        sleep_duration = config.sleep(*args)
+        _check_stopped
+
+        _flush_wakeup_reasons do |reason|
+          next unless reason == :event
+          _remember_time_of_first_unprocessed_event unless config.paused?
+        end
+
+        sleep_duration
+      end
+
+      def _remember_time_of_first_unprocessed_event
+        @first_unprocessed_event_time ||= _timestamp
+      end
+
+      def _reset_no_unprocessed_events
+        @first_unprocessed_event_time = nil
+      end
+
+      def _deadline
+        @first_unprocessed_event_time + @latency
+      end
+
+      def _wait_until_events
+        # TODO: long sleep may not be a good idea?
+        _sleep(:waiting_for_events) while config.event_queue.empty?
+        @first_unprocessed_event_time ||= _timestamp
+      end
+
+      def _flush_wakeup_reasons
+        reasons = @reasons
+        until reasons.empty?
+          reason = reasons.pop
+          yield reason if block_given?
+        end
+      end
+
+      def _timestamp
+        config.timestamp
+      end
+
+      # for easier testing without sleep loop
+      def _process_changes
+        _reset_no_unprocessed_events
+
+        changes = []
+        changes << config.event_queue.pop until config.event_queue.empty?
+
+        callable = config.callable?
+        return unless callable
+
+        hash = config.optimize_changes(changes)
+        result = [hash[:modified], hash[:added], hash[:removed]]
+        return if result.all?(&:empty?)
+
+        block_start = _timestamp
+        config.call(*result)
+        SassListen::Logger.debug "Callback took #{_timestamp - block_start} sec"
+      end
+
+      attr_reader :config
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/queue.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/queue.rb
new file mode 100644
index 0000000..3d76367
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/event/queue.rb
@@ -0,0 +1,58 @@
+require 'thread'
+
+require 'forwardable'
+
+module SassListen
+  module Event
+    class Queue
+      class Config
+        def initialize(relative)
+          @relative = relative
+        end
+
+        def relative?
+          @relative
+        end
+      end
+
+      def initialize(config, &block)
+        @event_queue = ::Queue.new
+        @block = block
+        @config = config
+      end
+
+      def <<(args)
+        type, change, dir, path, options = *args
+        fail "Invalid type: #{type.inspect}" unless [:dir, :file].include? type
+        fail "Invalid change: #{change.inspect}" unless change.is_a?(Symbol)
+        fail "Invalid path: #{path.inspect}" unless path.is_a?(String)
+
+        dir = _safe_relative_from_cwd(dir)
+        event_queue.public_send(:<<, [type, change, dir, path, options])
+
+        block.call(args) if block
+      end
+
+      def empty?
+        event_queue.empty?
+      end
+
+      def pop
+        event_queue.pop
+      end
+
+      private
+
+      attr_reader :event_queue
+      attr_reader :block
+      attr_reader :config
+
+      def _safe_relative_from_cwd(dir)
+        return dir unless config.relative?
+        dir.relative_path_from(Pathname.pwd)
+      rescue ArgumentError
+        dir
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/file.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/file.rb
new file mode 100644
index 0000000..9a60bd7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/file.rb
@@ -0,0 +1,80 @@
+require 'digest/md5'
+
+module SassListen
+  class File
+    def self.change(record, rel_path)
+      path = Pathname.new(record.root) + rel_path
+      lstat = path.lstat
+
+      data = { mtime: lstat.mtime.to_f, mode: lstat.mode }
+
+      record_data = record.file_data(rel_path)
+
+      if record_data.empty?
+        record.update_file(rel_path, data)
+        return :added
+      end
+
+      if data[:mode] != record_data[:mode]
+        record.update_file(rel_path, data)
+        return :modified
+      end
+
+      if data[:mtime] != record_data[:mtime]
+        record.update_file(rel_path, data)
+        return :modified
+      end
+
+      return if /1|true/ =~ ENV['LISTEN_GEM_DISABLE_HASHING']
+      return unless self.inaccurate_mac_time?(lstat)
+
+      # Check if change happened within 1 second (maybe it's even
+      # too much, e.g. 0.3-0.5 could be sufficient).
+      #
+      # With rb-fsevent, there's a (configurable) latency between
+      # when file was changed and when the event was triggered.
+      #
+      # If a file is saved at ???14.998, by the time the event is
+      # actually received by SassListen, the time could already be e.g.
+      # ???15.7.
+      #
+      # And since Darwin adapter uses directory scanning, the file
+      # mtime may be the same (e.g. file was changed at ???14.001,
+      # then at ???14.998, but the fstat time would be ???14.0 in
+      # both cases).
+      #
+      # If change happend at ???14.999997, the mtime is 14.0, so for
+      # an mtime=???14.0 we assume it could even be almost ???15.0
+      #
+      # So if Time.now.to_f is ???15.999998 and stat reports mtime
+      # at ???14.0, then event was due to that file'd change when:
+      #
+      # ???15.999997 - ???14.999998 < 1.0s
+      #
+      # So the "2" is "1 + 1" (1s to cover rb-fsevent latency +
+      # 1s maximum difference between real mtime and that recorded
+      # in the file system)
+      #
+      return if data[:mtime].to_i + 2 <= Time.now.to_f
+
+      md5 = Digest::MD5.file(path).digest
+      record.update_file(rel_path, data.merge(md5: md5))
+      :modified if record_data[:md5] && md5 != record_data[:md5]
+    rescue SystemCallError
+      record.unset_path(rel_path)
+      :removed
+    rescue
+      SassListen::Logger.debug "lstat failed for: #{rel_path} (#{$ERROR_INFO})"
+      raise
+    end
+
+    def self.inaccurate_mac_time?(stat)
+      # 'mac' means Modified/Accessed/Created
+
+      # Since precision depends on mounted FS (e.g. you can have a FAT partiion
+      # mounted on Linux), check for fields with a remainder to detect this
+
+      [stat.mtime, stat.ctime, stat.atime].map(&:usec).all?(&:zero?)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/fsm.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/fsm.rb
new file mode 100644
index 0000000..e253b76
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/fsm.rb
@@ -0,0 +1,131 @@
+# Code copied from https://github.com/celluloid/celluloid-fsm
+module SassListen
+  module FSM
+    DEFAULT_STATE = :default # Default state name unless one is explicitly set
+
+    # Included hook to extend class methods
+    def self.included(klass)
+      klass.send :extend, ClassMethods
+    end
+
+    module ClassMethods
+      # Obtain or set the default state
+      # Passing a state name sets the default state
+      def default_state(new_default = nil)
+        if new_default
+          @default_state = new_default.to_sym
+        else
+          defined?(@default_state) ? @default_state : DEFAULT_STATE
+        end
+      end
+
+      # Obtain the valid states for this FSM
+      def states
+        @states ||= {}
+      end
+
+      # Declare an FSM state and optionally provide a callback block to fire
+      # Options:
+      # * to: a state or array of states this state can transition to
+      def state(*args, &block)
+        if args.last.is_a? Hash
+          # Stringify keys :/
+          options = args.pop.each_with_object({}) { |(k, v), h| h[k.to_s] = v }
+        else
+          options = {}
+        end
+
+        args.each do |name|
+          name = name.to_sym
+          default_state name if options['default']
+          states[name] = State.new(name, options['to'], &block)
+        end
+      end
+    end
+
+    # Be kind and call super if you must redefine initialize
+    def initialize
+      @state = self.class.default_state
+    end
+
+    # Obtain the current state of the FSM
+    attr_reader :state
+
+    def transition(state_name)
+      new_state = validate_and_sanitize_new_state(state_name)
+      return unless new_state
+      transition_with_callbacks!(new_state)
+    end
+
+    # Immediate state transition with no checks, or callbacks. "Dangerous!"
+    def transition!(state_name)
+      @state = state_name
+    end
+
+    protected
+
+    def validate_and_sanitize_new_state(state_name)
+      state_name = state_name.to_sym
+
+      return if current_state_name == state_name
+
+      if current_state && !current_state.valid_transition?(state_name)
+        valid = current_state.transitions.map(&:to_s).join(', ')
+        msg = "#{self.class} can't change state from '#{@state}'"\
+          " to '#{state_name}', only to: #{valid}"
+        fail ArgumentError, msg
+      end
+
+      new_state = states[state_name]
+
+      unless new_state
+        return if state_name == default_state
+        fail ArgumentError, "invalid state for #{self.class}: #{state_name}"
+      end
+
+      new_state
+    end
+
+    def transition_with_callbacks!(state_name)
+      transition! state_name.name
+      state_name.call(self)
+    end
+
+    def states
+      self.class.states
+    end
+
+    def default_state
+      self.class.default_state
+    end
+
+    def current_state
+      states[@state]
+    end
+
+    def current_state_name
+      current_state && current_state.name || ''
+    end
+
+    class State
+      attr_reader :name, :transitions
+
+      def initialize(name, transitions = nil, &block)
+        @name, @block = name, block
+        @transitions = nil
+        @transitions = Array(transitions).map(&:to_sym) if transitions
+      end
+
+      def call(obj)
+        obj.instance_eval(&@block) if @block
+      end
+
+      def valid_transition?(new_state)
+        # All transitions are allowed unless expressly
+        return true unless @transitions
+
+        @transitions.include? new_state.to_sym
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/internals/thread_pool.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/internals/thread_pool.rb
new file mode 100644
index 0000000..102b214
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/internals/thread_pool.rb
@@ -0,0 +1,29 @@
+module SassListen
+  # @private api
+  module Internals
+    module ThreadPool
+      def self.add(&block)
+        Thread.new { block.call }.tap do |th|
+          (@threads ||= Queue.new) << th
+        end
+      end
+
+      def self.stop
+        return unless @threads ||= nil
+        return if @threads.empty? # return to avoid using possibly stubbed Queue
+
+        killed = Queue.new
+        # You can't kill a read on a descriptor in JRuby, so let's just
+        # ignore running threads (listen rb-inotify waiting for disk activity
+        # before closing)  pray threads die faster than they are created...
+        limit = RUBY_ENGINE == 'jruby' ? [1] : []
+
+        killed << @threads.pop.kill until @threads.empty?
+        until killed.empty?
+          th = killed.pop
+          th.join(*limit) unless th[:listen_blocking_read_thread]
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/listener.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/listener.rb
new file mode 100644
index 0000000..6c5e2a7
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/listener.rb
@@ -0,0 +1,132 @@
+require 'English'
+
+require 'sass-listen/version'
+
+require 'sass-listen/backend'
+
+require 'sass-listen/silencer'
+require 'sass-listen/silencer/controller'
+
+require 'sass-listen/queue_optimizer'
+
+require 'sass-listen/fsm'
+
+require 'sass-listen/event/loop'
+require 'sass-listen/event/queue'
+require 'sass-listen/event/config'
+
+require 'sass-listen/listener/config'
+
+module SassListen
+  class Listener
+    include SassListen::FSM
+
+    # Initializes the directories listener.
+    #
+    # @param [String] directory the directories to listen to
+    # @param [Hash] options the listen options (see SassListen::Listener::Options)
+    #
+    # @yield [modified, added, removed] the changed files
+    # @yieldparam [Array<String>] modified the list of modified files
+    # @yieldparam [Array<String>] added the list of added files
+    # @yieldparam [Array<String>] removed the list of removed files
+    #
+    def initialize(*dirs, &block)
+      options = dirs.last.is_a?(Hash) ? dirs.pop : {}
+
+      @config = Config.new(options)
+
+      eq_config = Event::Queue::Config.new(@config.relative?)
+      queue = Event::Queue.new(eq_config) { @processor.wakeup_on_event }
+
+      silencer = Silencer.new
+      rules = @config.silencer_rules
+      @silencer_controller = Silencer::Controller.new(silencer, rules)
+
+      @backend = Backend.new(dirs, queue, silencer, @config)
+
+      optimizer_config = QueueOptimizer::Config.new(@backend, silencer)
+
+      pconfig = Event::Config.new(
+        self,
+        queue,
+        QueueOptimizer.new(optimizer_config),
+        @backend.min_delay_between_events,
+        &block)
+
+      @processor = Event::Loop.new(pconfig)
+
+      super() # FSM
+    end
+
+    default_state :initializing
+
+    state :initializing, to: [:backend_started, :stopped]
+
+    state :backend_started, to: [:frontend_ready, :stopped] do
+      backend.start
+    end
+
+    state :frontend_ready, to: [:processing_events, :stopped] do
+      processor.setup
+    end
+
+    state :processing_events, to: [:paused, :stopped] do
+      processor.resume
+    end
+
+    state :paused, to: [:processing_events, :stopped] do
+      processor.pause
+    end
+
+    state :stopped, to: [:backend_started] do
+      backend.stop # should be before processor.teardown to halt events ASAP
+      processor.teardown
+    end
+
+    # Starts processing events and starts adapters
+    # or resumes invoking callbacks if paused
+    def start
+      transition :backend_started if state == :initializing
+      transition :frontend_ready if state == :backend_started
+      transition :processing_events if state == :frontend_ready
+      transition :processing_events if state == :paused
+    end
+
+    # Stops both listening for events and processing them
+    def stop
+      transition :stopped
+    end
+
+    # Stops invoking callbacks (messages pile up)
+    def pause
+      transition :paused
+    end
+
+    # processing means callbacks are called
+    def processing?
+      state == :processing_events
+    end
+
+    def paused?
+      state == :paused
+    end
+
+    def ignore(regexps)
+      @silencer_controller.append_ignores(regexps)
+    end
+
+    def ignore!(regexps)
+      @silencer_controller.replace_with_bang_ignores(regexps)
+    end
+
+    def only(regexps)
+      @silencer_controller.replace_with_only(regexps)
+    end
+
+    private
+
+    attr_reader :processor
+    attr_reader :backend
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/listener/config.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/listener/config.rb
new file mode 100644
index 0000000..a3ace4e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/listener/config.rb
@@ -0,0 +1,45 @@
+module SassListen
+  class Listener
+    class Config
+      DEFAULTS = {
+        # Listener options
+        debug: false, # TODO: is this broken?
+        wait_for_delay: nil, # NOTE: should be provided by adapter if possible
+        relative: false,
+
+        # Backend selecting options
+        force_polling: false,
+        polling_fallback_message: nil
+      }
+
+      def initialize(opts)
+        @options = DEFAULTS.merge(opts)
+        @relative = @options[:relative]
+        @min_delay_between_events = @options[:wait_for_delay]
+        @silencer_rules = @options # silencer will extract what it needs
+      end
+
+      def relative?
+        @relative
+      end
+
+      def min_delay_between_events
+        @min_delay_between_events
+      end
+
+      def silencer_rules
+        @silencer_rules
+      end
+
+      def adapter_instance_options(klass)
+        valid_keys = klass.const_get('DEFAULTS').keys
+        Hash[@options.select { |key, _| valid_keys.include?(key) }]
+      end
+
+      def adapter_select_options
+        valid_keys = %w(force_polling polling_fallback_message).map(&:to_sym)
+        Hash[@options.select { |key, _| valid_keys.include?(key) }]
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/logger.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/logger.rb
new file mode 100644
index 0000000..5abe8bd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/logger.rb
@@ -0,0 +1,32 @@
+module SassListen
+  def self.logger
+    @logger ||= nil
+  end
+
+  def self.logger=(logger)
+    @logger = logger
+  end
+
+  def self.setup_default_logger_if_unset
+    self.logger ||= ::Logger.new(STDERR).tap do |logger|
+      debugging = ENV['LISTEN_GEM_DEBUGGING']
+      logger.level =
+        case debugging.to_s
+        when /2/
+          ::Logger::DEBUG
+        when /true|yes|1/i
+          ::Logger::INFO
+        else
+          ::Logger::ERROR
+        end
+    end
+  end
+
+  class Logger
+    [:fatal, :error, :warn, :info, :debug].each do |meth|
+      define_singleton_method(meth) do |*args, &block|
+        SassListen.logger.public_send(meth, *args, &block) if SassListen.logger
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/options.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/options.rb
new file mode 100644
index 0000000..82a3326
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/options.rb
@@ -0,0 +1,23 @@
+module SassListen
+  class Options
+    def initialize(opts, defaults)
+      @options = {}
+      given_options = opts.dup
+      defaults.keys.each do |key|
+        @options[key] = given_options.delete(key) || defaults[key]
+      end
+
+      return if given_options.empty?
+
+      msg = "Unknown options: #{given_options.inspect}"
+      SassListen::Logger.warn msg
+      fail msg
+    end
+
+    def method_missing(name, *_)
+      return @options[name] if @options.key?(name)
+      msg = "Bad option: #{name.inspect} (valid:#{@options.keys.inspect})"
+      fail NameError, msg
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/queue_optimizer.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/queue_optimizer.rb
new file mode 100644
index 0000000..650c443
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/queue_optimizer.rb
@@ -0,0 +1,132 @@
+module SassListen
+  class QueueOptimizer
+    class Config
+      def initialize(adapter_class, silencer)
+        @adapter_class = adapter_class
+        @silencer = silencer
+      end
+
+      def exist?(path)
+        Pathname(path).exist?
+      end
+
+      def silenced?(path, type)
+        @silencer.silenced?(path, type)
+      end
+
+      def debug(*args, &block)
+        SassListen.logger.debug(*args, &block)
+      end
+    end
+
+    def smoosh_changes(changes)
+      # TODO: adapter could be nil at this point (shutdown)
+      cookies = changes.group_by do |_, _, _, _, options|
+        (options || {})[:cookie]
+      end
+      _squash_changes(_reinterpret_related_changes(cookies))
+    end
+
+    def initialize(config)
+      @config = config
+    end
+
+    private
+
+    attr_reader :config
+
+    # groups changes into the expected structure expected by
+    # clients
+    def _squash_changes(changes)
+      # We combine here for backward compatibility
+      # Newer clients should receive dir and path separately
+      changes = changes.map { |change, dir, path| [change, dir + path] }
+
+      actions = changes.group_by(&:last).map do |path, action_list|
+        [_logical_action_for(path, action_list.map(&:first)), path.to_s]
+      end
+
+      config.debug("listen: raw changes: #{actions.inspect}")
+
+      { modified: [], added: [], removed: [] }.tap do |squashed|
+        actions.each do |type, path|
+          squashed[type] << path unless type.nil?
+        end
+        config.debug("listen: final changes: #{squashed.inspect}")
+      end
+    end
+
+    def _logical_action_for(path, actions)
+      actions << :added if actions.delete(:moved_to)
+      actions << :removed if actions.delete(:moved_from)
+
+      modified = actions.detect { |x| x == :modified }
+      _calculate_add_remove_difference(actions, path, modified)
+    end
+
+    def _calculate_add_remove_difference(actions, path, default_if_exists)
+      added = actions.count { |x| x == :added }
+      removed = actions.count { |x| x == :removed }
+      diff = added - removed
+
+      # TODO: avoid checking if path exists and instead assume the events are
+      # in order (if last is :removed, it doesn't exist, etc.)
+      if config.exist?(path)
+        if diff > 0
+          :added
+        elsif diff.zero? && added > 0
+          :modified
+        else
+          default_if_exists
+        end
+      else
+        diff < 0 ? :removed : nil
+      end
+    end
+
+    # remove extraneous rb-inotify events, keeping them only if it's a possible
+    # editor rename() call (e.g. Kate and Sublime)
+    def _reinterpret_related_changes(cookies)
+      table = { moved_to: :added, moved_from: :removed }
+      cookies.map do |_, changes|
+        data = _detect_possible_editor_save(changes)
+        if data
+          to_dir, to_file = data
+          [[:modified, to_dir, to_file]]
+        else
+          not_silenced = changes.reject do |type, _, _, path, _|
+            config.silenced?(Pathname(path), type)
+          end
+          not_silenced.map do |_, change, dir, path, _|
+            [table.fetch(change, change), dir, path]
+          end
+        end
+      end.flatten(1)
+    end
+
+    def _detect_possible_editor_save(changes)
+      return unless changes.size == 2
+
+      from_type = from_change = from = nil
+      to_type = to_change = to_dir = to = nil
+
+      changes.each do |data|
+        case data[1]
+        when :moved_from
+          from_type, from_change, _, from, _ = data
+        when :moved_to
+          to_type, to_change, to_dir, to, _ = data
+        else
+          return nil
+        end
+      end
+
+      return unless from && to
+
+      # Expect an ignored moved_from and non-ignored moved_to
+      # to qualify as an "editor modify"
+      return unless config.silenced?(Pathname(from), from_type)
+      config.silenced?(Pathname(to), to_type) ? nil : [to_dir, to]
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/record.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/record.rb
new file mode 100644
index 0000000..e887511
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/record.rb
@@ -0,0 +1,120 @@
+require 'thread'
+require 'sass-listen/record/entry'
+require 'sass-listen/record/symlink_detector'
+
+module SassListen
+  class Record
+    # TODO: one Record object per watched directory?
+    # TODO: deprecate
+
+    attr_reader :root
+    def initialize(directory)
+      @tree = _auto_hash
+      @root = directory.to_s
+    end
+
+    def add_dir(rel_path)
+      return if [nil, '', '.'].include? rel_path
+      @tree[rel_path] ||= {}
+    end
+
+    def update_file(rel_path, data)
+      dirname, basename = Pathname(rel_path).split.map(&:to_s)
+      _fast_update_file(dirname, basename, data)
+    end
+
+    def unset_path(rel_path)
+      dirname, basename = Pathname(rel_path).split.map(&:to_s)
+      _fast_unset_path(dirname, basename)
+    end
+
+    def file_data(rel_path)
+      dirname, basename = Pathname(rel_path).split.map(&:to_s)
+      if [nil, '', '.'].include? dirname
+        tree[basename] ||= {}
+        tree[basename].dup
+      else
+        tree[dirname] ||= {}
+        tree[dirname][basename] ||= {}
+        tree[dirname][basename].dup
+      end
+    end
+
+    def dir_entries(rel_path)
+      subtree =
+        if [nil, '', '.'].include? rel_path.to_s
+          tree
+        else
+          tree[rel_path.to_s] ||= _auto_hash
+          tree[rel_path.to_s]
+        end
+
+      result = {}
+      subtree.each do |key, values|
+        # only get data for file entries
+        result[key] = values.key?(:mtime) ? values : {}
+      end
+      result
+    end
+
+    def build
+      @tree = _auto_hash
+      # TODO: test with a file name given
+      # TODO: test other permissions
+      # TODO: test with mixed encoding
+      symlink_detector = SymlinkDetector.new
+      remaining = ::Queue.new
+      remaining << Entry.new(root, nil, nil)
+      _fast_build_dir(remaining, symlink_detector) until remaining.empty?
+    end
+
+    private
+
+    def _auto_hash
+      Hash.new { |h, k| h[k] = Hash.new }
+    end
+
+    def tree
+      @tree
+    end
+
+    def _fast_update_file(dirname, basename, data)
+      if [nil, '', '.'].include? dirname
+        tree[basename] = (tree[basename] || {}).merge(data)
+      else
+        tree[dirname] ||= {}
+        tree[dirname][basename] = (tree[dirname][basename] || {}).merge(data)
+      end
+    end
+
+    def _fast_unset_path(dirname, basename)
+      # this may need to be reworked to properly remove
+      # entries from a tree, without adding non-existing dirs to the record
+      if [nil, '', '.'].include? dirname
+        return unless tree.key?(basename)
+        tree.delete(basename)
+      else
+        return unless tree.key?(dirname)
+        tree[dirname].delete(basename)
+      end
+    end
+
+    def _fast_build_dir(remaining, symlink_detector)
+      entry = remaining.pop
+      children = entry.children # NOTE: children() implicitly tests if dir
+      symlink_detector.verify_unwatched!(entry)
+      children.each { |child| remaining << child }
+      add_dir(entry.record_dir_key)
+    rescue Errno::ENOTDIR
+      _fast_try_file(entry)
+    rescue SystemCallError, SymlinkDetector::Error
+      _fast_unset_path(entry.relative, entry.name)
+    end
+
+    def _fast_try_file(entry)
+      _fast_update_file(entry.relative, entry.name, entry.meta)
+    rescue SystemCallError
+      _fast_unset_path(entry.relative, entry.name)
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/record/entry.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/record/entry.rb
new file mode 100644
index 0000000..18a1c41
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/record/entry.rb
@@ -0,0 +1,62 @@
+module SassListen
+  # @private api
+  class Record
+    # Represents a directory entry (dir or file)
+    class Entry
+      # file: "/home/me/watched_dir", "app/models", "foo.rb"
+      # dir, "/home/me/watched_dir", "."
+      def initialize(root, relative, name = nil)
+        @root, @relative, @name = root, relative, name
+      end
+
+      attr_reader :root, :relative, :name
+
+      def children
+        child_relative = _join
+        (_entries(sys_path) - %w(. ..)).map do |name|
+          Entry.new(@root, child_relative, name)
+        end
+      end
+
+      def meta
+        lstat = ::File.lstat(sys_path)
+        { mtime: lstat.mtime.to_f, mode: lstat.mode }
+      end
+
+      # record hash is e.g.
+      # if @record["/home/me/watched_dir"]["project/app/models"]["foo.rb"]
+      # if @record["/home/me/watched_dir"]["project/app"]["models"]
+      # record_dir_key is "project/app/models"
+      def record_dir_key
+        ::File.join(*[@relative, @name].compact)
+      end
+
+      def sys_path
+        # Use full path in case someone uses chdir
+        ::File.join(*[@root, @relative, @name].compact)
+      end
+
+      def real_path
+        @real_path ||= ::File.realpath(sys_path)
+      end
+
+      private
+
+      def _join
+        args = [@relative, @name].compact
+        args.empty? ? nil : ::File.join(*args)
+      end
+
+      def _entries(dir)
+        return Dir.entries(dir) unless RUBY_ENGINE == 'jruby'
+
+        # JRuby inconsistency workaround, see:
+        # https://github.com/jruby/jruby/issues/3840
+        exists = ::File.exist?(dir)
+        directory = ::File.directory?(dir)
+        return Dir.entries(dir) unless (exists && !directory)
+        raise Errno::ENOTDIR, dir
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/record/symlink_detector.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/record/symlink_detector.rb
new file mode 100644
index 0000000..0aced23
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/record/symlink_detector.rb
@@ -0,0 +1,39 @@
+require 'set'
+
+module SassListen
+  # @private api
+  class Record
+    class SymlinkDetector
+      WIKI = 'https://github.com/guard/listen/wiki/Duplicate-directory-errors'
+
+      SYMLINK_LOOP_ERROR = <<-EOS
+        ** ERROR: directory is already being watched! **
+
+        Directory: %s
+
+        is already being watched through: %s
+
+        MORE INFO: #{WIKI}
+      EOS
+
+      class Error < RuntimeError
+      end
+
+      def initialize
+        @real_dirs = Set.new
+      end
+
+      def verify_unwatched!(entry)
+        real_path = entry.real_path
+        @real_dirs.add?(real_path) || _fail(entry.sys_path, real_path)
+      end
+
+      private
+
+      def _fail(symlinked, real_path)
+        STDERR.puts format(SYMLINK_LOOP_ERROR, symlinked, real_path)
+        fail Error, 'Failed due to looped symlinks'
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer.rb
new file mode 100644
index 0000000..7e735fa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer.rb
@@ -0,0 +1,97 @@
+module SassListen
+  class Silencer
+    # The default list of directories that get ignored.
+    DEFAULT_IGNORED_DIRECTORIES = %r{^(?:
+      \.git
+      | \.svn
+      | \.hg
+      | \.rbx
+      | \.bundle
+      | bundle
+      | vendor/bundle
+      | log
+      | tmp
+      |vendor/ruby
+    )(/|$)}x
+
+    # The default list of files that get ignored.
+    DEFAULT_IGNORED_EXTENSIONS  = /(?:
+      # Kate's tmp\/swp files
+      \..*\d+\.new
+      | \.kate-swp
+
+      # Gedit tmp files
+      | \.goutputstream-.{6}
+
+      # Intellij files
+      | ___jb_bak___
+      | ___jb_old___
+
+      # Vim swap files and write test
+      | \.sw[px]
+      | \.swpx
+      | ^4913
+
+      # Sed temporary files - but without actual words, like 'sedatives'
+      | (?:^
+         sed
+
+         (?:
+          [a-zA-Z0-9]{0}[A-Z]{1}[a-zA-Z0-9]{5} |
+          [a-zA-Z0-9]{1}[A-Z]{1}[a-zA-Z0-9]{4} |
+          [a-zA-Z0-9]{2}[A-Z]{1}[a-zA-Z0-9]{3} |
+          [a-zA-Z0-9]{3}[A-Z]{1}[a-zA-Z0-9]{2} |
+          [a-zA-Z0-9]{4}[A-Z]{1}[a-zA-Z0-9]{1} |
+          [a-zA-Z0-9]{5}[A-Z]{1}[a-zA-Z0-9]{0}
+         )
+        )
+
+      # other files
+      | \.DS_Store
+      | \.tmp
+      | ~
+    )$/x
+
+    attr_accessor :only_patterns, :ignore_patterns
+
+    def initialize
+      configure({})
+    end
+
+    def configure(options)
+      @only_patterns = options[:only] ? Array(options[:only]) : nil
+      @ignore_patterns = _init_ignores(options[:ignore], options[:ignore!])
+    end
+
+    # Note: relative_path is temporarily expected to be a relative Pathname to
+    # make refactoring easier (ideally, it would take a string)
+
+    # TODO: switch type and path places - and verify
+    def silenced?(relative_path, type)
+      path = relative_path.to_s
+
+      if only_patterns && type == :file
+        return true unless only_patterns.any? { |pattern| path =~ pattern }
+      end
+
+      ignore_patterns.any? { |pattern| path =~ pattern }
+    end
+
+    private
+
+    attr_reader :options
+
+    def _init_ignores(ignores, overrides)
+      patterns = []
+      unless overrides
+        patterns << DEFAULT_IGNORED_DIRECTORIES
+        patterns << DEFAULT_IGNORED_EXTENSIONS
+      end
+
+      patterns << ignores
+      patterns << overrides
+
+      patterns.compact.flatten
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer/controller.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer/controller.rb
new file mode 100644
index 0000000..d262ec8
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer/controller.rb
@@ -0,0 +1,48 @@
+module SassListen
+  class Silencer
+    class Controller
+      def initialize(silencer, default_options)
+        @silencer = silencer
+
+        opts = default_options
+
+        @prev_silencer_options = {}
+        rules = [:only, :ignore, :ignore!].map do |option|
+          [option, opts[option]] if opts.key? option
+        end
+
+        _reconfigure_silencer(Hash[rules.compact])
+      end
+
+      def append_ignores(*regexps)
+        prev_ignores = Array(@prev_silencer_options[:ignore])
+        _reconfigure_silencer(ignore: [prev_ignores + regexps])
+      end
+
+      def replace_with_bang_ignores(regexps)
+        _reconfigure_silencer(ignore!: regexps)
+      end
+
+      def replace_with_only(regexps)
+        _reconfigure_silencer(only: regexps)
+      end
+
+      private
+
+      def _reconfigure_silencer(extra_options)
+        opts = extra_options.dup
+        opts = opts.map do |key, value|
+          [key, Array(value).flatten.compact]
+        end
+        opts = Hash[opts]
+
+        if opts.key?(:ignore) && opts[:ignore].empty?
+          opts.delete(:ignore)
+        end
+
+        @prev_silencer_options = opts
+        @silencer.configure(@prev_silencer_options.dup.freeze)
+      end
+    end
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/version.rb b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/version.rb
new file mode 100644
index 0000000..05fa5d0
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/gems/sass-listen-4.0.0/lib/sass-listen/version.rb
@@ -0,0 +1,3 @@
+module SassListen
+  VERSION = '4.0.0'
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/addressable-2.5.2.gemspec b/vendor/bundle/ruby/2.4.0/specifications/addressable-2.5.2.gemspec
new file mode 100644
index 0000000..abedc1d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/addressable-2.5.2.gemspec
@@ -0,0 +1,39 @@
+# -*- encoding: utf-8 -*-
+# stub: addressable 2.5.2 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "addressable".freeze
+  s.version = "2.5.2"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Bob Aman".freeze]
+  s.date = "2017-08-25"
+  s.description = "Addressable is a replacement for the URI implementation that is part of\nRuby's standard library. It more closely conforms to the relevant RFCs and\nadds support for IRIs and URI templates.\n".freeze
+  s.email = "bob@sporkmonger.com".freeze
+  s.extra_rdoc_files = ["README.md".freeze]
+  s.files = ["README.md".freeze]
+  s.homepage = "https://github.com/sporkmonger/addressable".freeze
+  s.licenses = ["Apache-2.0".freeze]
+  s.rdoc_options = ["--main".freeze, "README.md".freeze]
+  s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze)
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "URI Implementation".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<public_suffix>.freeze, ["< 4.0", ">= 2.0.2"])
+      s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
+    else
+      s.add_dependency(%q<public_suffix>.freeze, ["< 4.0", ">= 2.0.2"])
+      s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
+    end
+  else
+    s.add_dependency(%q<public_suffix>.freeze, ["< 4.0", ">= 2.0.2"])
+    s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/colorator-1.1.0.gemspec b/vendor/bundle/ruby/2.4.0/specifications/colorator-1.1.0.gemspec
new file mode 100644
index 0000000..fb85176
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/colorator-1.1.0.gemspec
@@ -0,0 +1,34 @@
+# -*- encoding: utf-8 -*-
+# stub: colorator 1.1.0 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "colorator".freeze
+  s.version = "1.1.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Parker Moore".freeze, "Brandon Mathis".freeze]
+  s.date = "2016-06-29"
+  s.email = ["parkrmoore@gmail.com".freeze, "brandon@imathis.com".freeze]
+  s.extra_rdoc_files = ["README.markdown".freeze, "LICENSE".freeze]
+  s.files = ["LICENSE".freeze, "README.markdown".freeze]
+  s.homepage = "https://github.com/octopress/colorator".freeze
+  s.licenses = ["MIT".freeze]
+  s.rdoc_options = ["--charset=UTF-8".freeze]
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "Colorize your text in the terminal.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<rspec>.freeze, ["~> 3.1"])
+    else
+      s.add_dependency(%q<rspec>.freeze, ["~> 3.1"])
+    end
+  else
+    s.add_dependency(%q<rspec>.freeze, ["~> 3.1"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/ffi-1.9.18.gemspec b/vendor/bundle/ruby/2.4.0/specifications/ffi-1.9.18.gemspec
new file mode 100644
index 0000000..c0b84cd
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/ffi-1.9.18.gemspec
@@ -0,0 +1,49 @@
+# -*- encoding: utf-8 -*-
+# stub: ffi 1.9.18 ruby lib
+# stub: ext/ffi_c/extconf.rb
+
+Gem::Specification.new do |s|
+  s.name = "ffi".freeze
+  s.version = "1.9.18"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Wayne Meissner".freeze]
+  s.date = "2017-03-03"
+  s.description = "Ruby FFI library".freeze
+  s.email = "wmeissner@gmail.com".freeze
+  s.extensions = ["ext/ffi_c/extconf.rb".freeze]
+  s.files = ["ext/ffi_c/extconf.rb".freeze]
+  s.homepage = "http://wiki.github.com/ffi/ffi".freeze
+  s.licenses = ["BSD-3-Clause".freeze]
+  s.rdoc_options = ["--exclude=ext/ffi_c/.*\\.o$".freeze, "--exclude=ffi_c\\.(bundle|so)$".freeze]
+  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze)
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "Ruby FFI".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<rake>.freeze, ["~> 10.1"])
+      s.add_development_dependency(%q<rake-compiler>.freeze, ["~> 1.0"])
+      s.add_development_dependency(%q<rake-compiler-dock>.freeze, ["~> 0.6.0"])
+      s.add_development_dependency(%q<rspec>.freeze, ["~> 2.14.1"])
+      s.add_development_dependency(%q<rubygems-tasks>.freeze, ["~> 0.2.4"])
+    else
+      s.add_dependency(%q<rake>.freeze, ["~> 10.1"])
+      s.add_dependency(%q<rake-compiler>.freeze, ["~> 1.0"])
+      s.add_dependency(%q<rake-compiler-dock>.freeze, ["~> 0.6.0"])
+      s.add_dependency(%q<rspec>.freeze, ["~> 2.14.1"])
+      s.add_dependency(%q<rubygems-tasks>.freeze, ["~> 0.2.4"])
+    end
+  else
+    s.add_dependency(%q<rake>.freeze, ["~> 10.1"])
+    s.add_dependency(%q<rake-compiler>.freeze, ["~> 1.0"])
+    s.add_dependency(%q<rake-compiler-dock>.freeze, ["~> 0.6.0"])
+    s.add_dependency(%q<rspec>.freeze, ["~> 2.14.1"])
+    s.add_dependency(%q<rubygems-tasks>.freeze, ["~> 0.2.4"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/forwardable-extended-2.6.0.gemspec b/vendor/bundle/ruby/2.4.0/specifications/forwardable-extended-2.6.0.gemspec
new file mode 100644
index 0000000..bbef0de
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/forwardable-extended-2.6.0.gemspec
@@ -0,0 +1,20 @@
+# -*- encoding: utf-8 -*-
+# stub: forwardable-extended 2.6.0 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "forwardable-extended".freeze
+  s.version = "2.6.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Jordon Bedwell".freeze]
+  s.date = "2016-04-06"
+  s.description = "Forwardable with hash, and instance variable extensions.".freeze
+  s.email = ["jordon@envygeeks.io".freeze]
+  s.homepage = "http://github.com/envygeeks/forwardable-extended".freeze
+  s.licenses = ["MIT".freeze]
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "Forwardable with hash, and instance variable extensions.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/jekyll-3.5.2.gemspec b/vendor/bundle/ruby/2.4.0/specifications/jekyll-3.5.2.gemspec
new file mode 100644
index 0000000..fa1800e
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/jekyll-3.5.2.gemspec
@@ -0,0 +1,65 @@
+# -*- encoding: utf-8 -*-
+# stub: jekyll 3.5.2 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "jekyll".freeze
+  s.version = "3.5.2"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Tom Preston-Werner".freeze]
+  s.bindir = "exe".freeze
+  s.date = "2017-08-12"
+  s.description = "Jekyll is a simple, blog aware, static site generator.".freeze
+  s.email = "tom@mojombo.com".freeze
+  s.executables = ["jekyll".freeze]
+  s.extra_rdoc_files = ["README.markdown".freeze, "LICENSE".freeze]
+  s.files = ["LICENSE".freeze, "README.markdown".freeze, "exe/jekyll".freeze]
+  s.homepage = "https://github.com/jekyll/jekyll".freeze
+  s.licenses = ["MIT".freeze]
+  s.rdoc_options = ["--charset=UTF-8".freeze]
+  s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze)
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "A simple, blog aware, static site generator.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 2
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<addressable>.freeze, ["~> 2.4"])
+      s.add_runtime_dependency(%q<colorator>.freeze, ["~> 1.0"])
+      s.add_runtime_dependency(%q<jekyll-sass-converter>.freeze, ["~> 1.0"])
+      s.add_runtime_dependency(%q<jekyll-watch>.freeze, ["~> 1.1"])
+      s.add_runtime_dependency(%q<kramdown>.freeze, ["~> 1.3"])
+      s.add_runtime_dependency(%q<liquid>.freeze, ["~> 4.0"])
+      s.add_runtime_dependency(%q<mercenary>.freeze, ["~> 0.3.3"])
+      s.add_runtime_dependency(%q<pathutil>.freeze, ["~> 0.9"])
+      s.add_runtime_dependency(%q<rouge>.freeze, ["~> 1.7"])
+      s.add_runtime_dependency(%q<safe_yaml>.freeze, ["~> 1.0"])
+    else
+      s.add_dependency(%q<addressable>.freeze, ["~> 2.4"])
+      s.add_dependency(%q<colorator>.freeze, ["~> 1.0"])
+      s.add_dependency(%q<jekyll-sass-converter>.freeze, ["~> 1.0"])
+      s.add_dependency(%q<jekyll-watch>.freeze, ["~> 1.1"])
+      s.add_dependency(%q<kramdown>.freeze, ["~> 1.3"])
+      s.add_dependency(%q<liquid>.freeze, ["~> 4.0"])
+      s.add_dependency(%q<mercenary>.freeze, ["~> 0.3.3"])
+      s.add_dependency(%q<pathutil>.freeze, ["~> 0.9"])
+      s.add_dependency(%q<rouge>.freeze, ["~> 1.7"])
+      s.add_dependency(%q<safe_yaml>.freeze, ["~> 1.0"])
+    end
+  else
+    s.add_dependency(%q<addressable>.freeze, ["~> 2.4"])
+    s.add_dependency(%q<colorator>.freeze, ["~> 1.0"])
+    s.add_dependency(%q<jekyll-sass-converter>.freeze, ["~> 1.0"])
+    s.add_dependency(%q<jekyll-watch>.freeze, ["~> 1.1"])
+    s.add_dependency(%q<kramdown>.freeze, ["~> 1.3"])
+    s.add_dependency(%q<liquid>.freeze, ["~> 4.0"])
+    s.add_dependency(%q<mercenary>.freeze, ["~> 0.3.3"])
+    s.add_dependency(%q<pathutil>.freeze, ["~> 0.9"])
+    s.add_dependency(%q<rouge>.freeze, ["~> 1.7"])
+    s.add_dependency(%q<safe_yaml>.freeze, ["~> 1.0"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/jekyll-feed-0.9.2.gemspec b/vendor/bundle/ruby/2.4.0/specifications/jekyll-feed-0.9.2.gemspec
new file mode 100644
index 0000000..d6afab4
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/jekyll-feed-0.9.2.gemspec
@@ -0,0 +1,49 @@
+# -*- encoding: utf-8 -*-
+# stub: jekyll-feed 0.9.2 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "jekyll-feed".freeze
+  s.version = "0.9.2"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Ben Balter".freeze]
+  s.date = "2017-03-28"
+  s.email = ["ben.balter@github.com".freeze]
+  s.homepage = "https://github.com/jekyll/jekyll-feed".freeze
+  s.licenses = ["MIT".freeze]
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "A Jekyll plugin to generate an Atom feed of your Jekyll posts".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.3"])
+      s.add_development_dependency(%q<bundler>.freeze, ["~> 1.6"])
+      s.add_development_dependency(%q<rake>.freeze, ["~> 10.0"])
+      s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"])
+      s.add_development_dependency(%q<typhoeus>.freeze, ["~> 0.7"])
+      s.add_development_dependency(%q<nokogiri>.freeze, ["~> 1.6"])
+      s.add_development_dependency(%q<rubocop>.freeze, [">= 0"])
+    else
+      s.add_dependency(%q<jekyll>.freeze, ["~> 3.3"])
+      s.add_dependency(%q<bundler>.freeze, ["~> 1.6"])
+      s.add_dependency(%q<rake>.freeze, ["~> 10.0"])
+      s.add_dependency(%q<rspec>.freeze, ["~> 3.0"])
+      s.add_dependency(%q<typhoeus>.freeze, ["~> 0.7"])
+      s.add_dependency(%q<nokogiri>.freeze, ["~> 1.6"])
+      s.add_dependency(%q<rubocop>.freeze, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<jekyll>.freeze, ["~> 3.3"])
+    s.add_dependency(%q<bundler>.freeze, ["~> 1.6"])
+    s.add_dependency(%q<rake>.freeze, ["~> 10.0"])
+    s.add_dependency(%q<rspec>.freeze, ["~> 3.0"])
+    s.add_dependency(%q<typhoeus>.freeze, ["~> 0.7"])
+    s.add_dependency(%q<nokogiri>.freeze, ["~> 1.6"])
+    s.add_dependency(%q<rubocop>.freeze, [">= 0"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/jekyll-sass-converter-1.5.0.gemspec b/vendor/bundle/ruby/2.4.0/specifications/jekyll-sass-converter-1.5.0.gemspec
new file mode 100644
index 0000000..eedaf84
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/jekyll-sass-converter-1.5.0.gemspec
@@ -0,0 +1,43 @@
+# -*- encoding: utf-8 -*-
+# stub: jekyll-sass-converter 1.5.0 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "jekyll-sass-converter".freeze
+  s.version = "1.5.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Parker Moore".freeze]
+  s.date = "2016-11-14"
+  s.email = ["parkrmoore@gmail.com".freeze]
+  s.homepage = "https://github.com/jekyll/jekyll-sass-converter".freeze
+  s.licenses = ["MIT".freeze]
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "A basic Sass converter for Jekyll.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<sass>.freeze, ["~> 3.4"])
+      s.add_development_dependency(%q<bundler>.freeze, ["~> 1.5"])
+      s.add_development_dependency(%q<rake>.freeze, [">= 0"])
+      s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
+      s.add_development_dependency(%q<jekyll>.freeze, [">= 2.0"])
+    else
+      s.add_dependency(%q<sass>.freeze, ["~> 3.4"])
+      s.add_dependency(%q<bundler>.freeze, ["~> 1.5"])
+      s.add_dependency(%q<rake>.freeze, [">= 0"])
+      s.add_dependency(%q<rspec>.freeze, [">= 0"])
+      s.add_dependency(%q<jekyll>.freeze, [">= 2.0"])
+    end
+  else
+    s.add_dependency(%q<sass>.freeze, ["~> 3.4"])
+    s.add_dependency(%q<bundler>.freeze, ["~> 1.5"])
+    s.add_dependency(%q<rake>.freeze, [">= 0"])
+    s.add_dependency(%q<rspec>.freeze, [">= 0"])
+    s.add_dependency(%q<jekyll>.freeze, [">= 2.0"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/jekyll-watch-1.5.0.gemspec b/vendor/bundle/ruby/2.4.0/specifications/jekyll-watch-1.5.0.gemspec
new file mode 100644
index 0000000..71a40e9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/jekyll-watch-1.5.0.gemspec
@@ -0,0 +1,46 @@
+# -*- encoding: utf-8 -*-
+# stub: jekyll-watch 1.5.0 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "jekyll-watch".freeze
+  s.version = "1.5.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Parker Moore".freeze]
+  s.date = "2016-07-20"
+  s.email = ["parkrmoore@gmail.com".freeze]
+  s.homepage = "https://github.com/jekyll/jekyll-watch".freeze
+  s.licenses = ["MIT".freeze]
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "Rebuild your Jekyll site when a file changes with the `--watch` switch.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<listen>.freeze, ["< 3.1", "~> 3.0"])
+      s.add_development_dependency(%q<bundler>.freeze, ["~> 1.6"])
+      s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.35.1"])
+      s.add_development_dependency(%q<rake>.freeze, [">= 0"])
+      s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"])
+      s.add_development_dependency(%q<jekyll>.freeze, [">= 2.0"])
+    else
+      s.add_dependency(%q<listen>.freeze, ["< 3.1", "~> 3.0"])
+      s.add_dependency(%q<bundler>.freeze, ["~> 1.6"])
+      s.add_dependency(%q<rubocop>.freeze, ["~> 0.35.1"])
+      s.add_dependency(%q<rake>.freeze, [">= 0"])
+      s.add_dependency(%q<rspec>.freeze, ["~> 3.0"])
+      s.add_dependency(%q<jekyll>.freeze, [">= 2.0"])
+    end
+  else
+    s.add_dependency(%q<listen>.freeze, ["< 3.1", "~> 3.0"])
+    s.add_dependency(%q<bundler>.freeze, ["~> 1.6"])
+    s.add_dependency(%q<rubocop>.freeze, ["~> 0.35.1"])
+    s.add_dependency(%q<rake>.freeze, [">= 0"])
+    s.add_dependency(%q<rspec>.freeze, ["~> 3.0"])
+    s.add_dependency(%q<jekyll>.freeze, [">= 2.0"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/kramdown-1.14.0.gemspec b/vendor/bundle/ruby/2.4.0/specifications/kramdown-1.14.0.gemspec
new file mode 100644
index 0000000..2b5f115
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/kramdown-1.14.0.gemspec
@@ -0,0 +1,56 @@
+# -*- encoding: utf-8 -*-
+# stub: kramdown 1.14.0 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "kramdown".freeze
+  s.version = "1.14.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Thomas Leitner".freeze]
+  s.date = "2017-06-26"
+  s.description = "kramdown is yet-another-markdown-parser but fast, pure Ruby,\nusing a strict syntax definition and supporting several common extensions.\n".freeze
+  s.email = "t_leitner@gmx.at".freeze
+  s.executables = ["kramdown".freeze]
+  s.files = ["bin/kramdown".freeze]
+  s.homepage = "http://kramdown.gettalong.org".freeze
+  s.licenses = ["MIT".freeze]
+  s.rdoc_options = ["--main".freeze, "lib/kramdown/document.rb".freeze]
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "kramdown is a fast, pure-Ruby Markdown-superset converter.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<minitest>.freeze, ["~> 5.0"])
+      s.add_development_dependency(%q<coderay>.freeze, ["~> 1.0.0"])
+      s.add_development_dependency(%q<rouge>.freeze, ["~> 1.8"])
+      s.add_development_dependency(%q<stringex>.freeze, ["~> 1.5.1"])
+      s.add_development_dependency(%q<prawn>.freeze, ["~> 2.0"])
+      s.add_development_dependency(%q<prawn-table>.freeze, ["~> 0.2.2"])
+      s.add_development_dependency(%q<ritex>.freeze, ["~> 1.0"])
+      s.add_development_dependency(%q<itextomml>.freeze, ["~> 1.5"])
+    else
+      s.add_dependency(%q<minitest>.freeze, ["~> 5.0"])
+      s.add_dependency(%q<coderay>.freeze, ["~> 1.0.0"])
+      s.add_dependency(%q<rouge>.freeze, ["~> 1.8"])
+      s.add_dependency(%q<stringex>.freeze, ["~> 1.5.1"])
+      s.add_dependency(%q<prawn>.freeze, ["~> 2.0"])
+      s.add_dependency(%q<prawn-table>.freeze, ["~> 0.2.2"])
+      s.add_dependency(%q<ritex>.freeze, ["~> 1.0"])
+      s.add_dependency(%q<itextomml>.freeze, ["~> 1.5"])
+    end
+  else
+    s.add_dependency(%q<minitest>.freeze, ["~> 5.0"])
+    s.add_dependency(%q<coderay>.freeze, ["~> 1.0.0"])
+    s.add_dependency(%q<rouge>.freeze, ["~> 1.8"])
+    s.add_dependency(%q<stringex>.freeze, ["~> 1.5.1"])
+    s.add_dependency(%q<prawn>.freeze, ["~> 2.0"])
+    s.add_dependency(%q<prawn-table>.freeze, ["~> 0.2.2"])
+    s.add_dependency(%q<ritex>.freeze, ["~> 1.0"])
+    s.add_dependency(%q<itextomml>.freeze, ["~> 1.5"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/liquid-4.0.0.gemspec b/vendor/bundle/ruby/2.4.0/specifications/liquid-4.0.0.gemspec
new file mode 100644
index 0000000..d2bbefa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/liquid-4.0.0.gemspec
@@ -0,0 +1,37 @@
+# -*- encoding: utf-8 -*-
+# stub: liquid 4.0.0 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "liquid".freeze
+  s.version = "4.0.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 1.3.7".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Tobias L\u00FCtke".freeze]
+  s.date = "2016-12-14"
+  s.email = ["tobi@leetsoft.com".freeze]
+  s.extra_rdoc_files = ["History.md".freeze, "README.md".freeze]
+  s.files = ["History.md".freeze, "README.md".freeze]
+  s.homepage = "http://www.liquidmarkup.org".freeze
+  s.licenses = ["MIT".freeze]
+  s.required_ruby_version = Gem::Requirement.new(">= 2.1.0".freeze)
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "A secure, non-evaling end user template engine with aesthetic markup.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<rake>.freeze, ["~> 11.3"])
+      s.add_development_dependency(%q<minitest>.freeze, [">= 0"])
+    else
+      s.add_dependency(%q<rake>.freeze, ["~> 11.3"])
+      s.add_dependency(%q<minitest>.freeze, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<rake>.freeze, ["~> 11.3"])
+    s.add_dependency(%q<minitest>.freeze, [">= 0"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/listen-3.0.8.gemspec b/vendor/bundle/ruby/2.4.0/specifications/listen-3.0.8.gemspec
new file mode 100644
index 0000000..27b00fa
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/listen-3.0.8.gemspec
@@ -0,0 +1,41 @@
+# -*- encoding: utf-8 -*-
+# stub: listen 3.0.8 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "listen".freeze
+  s.version = "3.0.8"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Thibaud Guillaume-Gentil".freeze]
+  s.date = "2016-05-18"
+  s.description = "The Listen gem listens to file modifications and notifies you about the changes. Works everywhere!".freeze
+  s.email = "thibaud@thibaud.gg".freeze
+  s.executables = ["listen".freeze]
+  s.files = ["bin/listen".freeze]
+  s.homepage = "https://github.com/guard/listen".freeze
+  s.licenses = ["MIT".freeze]
+  s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze)
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "Listen to file modifications".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<rb-fsevent>.freeze, [">= 0.9.4", "~> 0.9"])
+      s.add_runtime_dependency(%q<rb-inotify>.freeze, [">= 0.9.7", "~> 0.9"])
+      s.add_development_dependency(%q<bundler>.freeze, [">= 1.3.5"])
+    else
+      s.add_dependency(%q<rb-fsevent>.freeze, [">= 0.9.4", "~> 0.9"])
+      s.add_dependency(%q<rb-inotify>.freeze, [">= 0.9.7", "~> 0.9"])
+      s.add_dependency(%q<bundler>.freeze, [">= 1.3.5"])
+    end
+  else
+    s.add_dependency(%q<rb-fsevent>.freeze, [">= 0.9.4", "~> 0.9"])
+    s.add_dependency(%q<rb-inotify>.freeze, [">= 0.9.7", "~> 0.9"])
+    s.add_dependency(%q<bundler>.freeze, [">= 1.3.5"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/mercenary-0.3.6.gemspec b/vendor/bundle/ruby/2.4.0/specifications/mercenary-0.3.6.gemspec
new file mode 100644
index 0000000..69a4f76
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/mercenary-0.3.6.gemspec
@@ -0,0 +1,38 @@
+# -*- encoding: utf-8 -*-
+# stub: mercenary 0.3.6 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "mercenary".freeze
+  s.version = "0.3.6"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Tom Preston-Werner".freeze, "Parker Moore".freeze]
+  s.date = "2016-04-08"
+  s.description = "Lightweight and flexible library for writing command-line apps in Ruby.".freeze
+  s.email = ["tom@mojombo.com".freeze, "parkrmoore@gmail.com".freeze]
+  s.homepage = "https://github.com/jekyll/mercenary".freeze
+  s.licenses = ["MIT".freeze]
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "Lightweight and flexible library for writing command-line apps in Ruby.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<bundler>.freeze, ["~> 1.3"])
+      s.add_development_dependency(%q<rake>.freeze, [">= 0"])
+      s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"])
+    else
+      s.add_dependency(%q<bundler>.freeze, ["~> 1.3"])
+      s.add_dependency(%q<rake>.freeze, [">= 0"])
+      s.add_dependency(%q<rspec>.freeze, ["~> 3.0"])
+    end
+  else
+    s.add_dependency(%q<bundler>.freeze, ["~> 1.3"])
+    s.add_dependency(%q<rake>.freeze, [">= 0"])
+    s.add_dependency(%q<rspec>.freeze, ["~> 3.0"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/minima-2.1.1.gemspec b/vendor/bundle/ruby/2.4.0/specifications/minima-2.1.1.gemspec
new file mode 100644
index 0000000..f022219
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/minima-2.1.1.gemspec
@@ -0,0 +1,36 @@
+# -*- encoding: utf-8 -*-
+# stub: minima 2.1.1 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "minima".freeze
+  s.version = "2.1.1"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.metadata = { "plugin_type" => "theme" } if s.respond_to? :metadata=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Joel Glovier".freeze]
+  s.bindir = "exe".freeze
+  s.date = "2017-04-13"
+  s.email = ["jglovier@github.com".freeze]
+  s.homepage = "https://github.com/jekyll/minima".freeze
+  s.licenses = ["MIT".freeze]
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "A beautiful, minimal theme for Jekyll.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<jekyll>.freeze, ["~> 3.3"])
+      s.add_development_dependency(%q<bundler>.freeze, ["~> 1.12"])
+    else
+      s.add_dependency(%q<jekyll>.freeze, ["~> 3.3"])
+      s.add_dependency(%q<bundler>.freeze, ["~> 1.12"])
+    end
+  else
+    s.add_dependency(%q<jekyll>.freeze, ["~> 3.3"])
+    s.add_dependency(%q<bundler>.freeze, ["~> 1.12"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/pathutil-0.14.0.gemspec b/vendor/bundle/ruby/2.4.0/specifications/pathutil-0.14.0.gemspec
new file mode 100644
index 0000000..407492f
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/pathutil-0.14.0.gemspec
@@ -0,0 +1,32 @@
+# -*- encoding: utf-8 -*-
+# stub: pathutil 0.14.0 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "pathutil".freeze
+  s.version = "0.14.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Jordon Bedwell".freeze]
+  s.date = "2016-05-19"
+  s.description = "Like Pathname but a little less insane.".freeze
+  s.email = ["jordon@envygeeks.io".freeze]
+  s.homepage = "http://github.com/envygeeks/pathutils".freeze
+  s.licenses = ["MIT".freeze]
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "Almost like Pathname but just a little less insane.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<forwardable-extended>.freeze, ["~> 2.6"])
+    else
+      s.add_dependency(%q<forwardable-extended>.freeze, ["~> 2.6"])
+    end
+  else
+    s.add_dependency(%q<forwardable-extended>.freeze, ["~> 2.6"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/public_suffix-3.0.0.gemspec b/vendor/bundle/ruby/2.4.0/specifications/public_suffix-3.0.0.gemspec
new file mode 100644
index 0000000..04f44b9
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/public_suffix-3.0.0.gemspec
@@ -0,0 +1,41 @@
+# -*- encoding: utf-8 -*-
+# stub: public_suffix 3.0.0 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "public_suffix".freeze
+  s.version = "3.0.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Simone Carletti".freeze]
+  s.date = "2017-08-04"
+  s.description = "PublicSuffix can parse and decompose a domain name into top level domain, domain and subdomains.".freeze
+  s.email = ["weppos@weppos.net".freeze]
+  s.extra_rdoc_files = ["LICENSE.txt".freeze]
+  s.files = ["LICENSE.txt".freeze]
+  s.homepage = "https://simonecarletti.com/code/publicsuffix-ruby".freeze
+  s.licenses = ["MIT".freeze]
+  s.required_ruby_version = Gem::Requirement.new(">= 2.1".freeze)
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "Domain name parser based on the Public Suffix List.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<rake>.freeze, [">= 0"])
+      s.add_development_dependency(%q<mocha>.freeze, [">= 0"])
+      s.add_development_dependency(%q<yard>.freeze, [">= 0"])
+    else
+      s.add_dependency(%q<rake>.freeze, [">= 0"])
+      s.add_dependency(%q<mocha>.freeze, [">= 0"])
+      s.add_dependency(%q<yard>.freeze, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<rake>.freeze, [">= 0"])
+    s.add_dependency(%q<mocha>.freeze, [">= 0"])
+    s.add_dependency(%q<yard>.freeze, [">= 0"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/rb-fsevent-0.10.2.gemspec b/vendor/bundle/ruby/2.4.0/specifications/rb-fsevent-0.10.2.gemspec
new file mode 100644
index 0000000..a9acf15
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/rb-fsevent-0.10.2.gemspec
@@ -0,0 +1,42 @@
+# -*- encoding: utf-8 -*-
+# stub: rb-fsevent 0.10.2 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "rb-fsevent".freeze
+  s.version = "0.10.2"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.metadata = { "source_code_uri" => "https://github.com/thibaudgg/rb-fsevent" } if s.respond_to? :metadata=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Thibaud Guillaume-Gentil".freeze, "Travis Tilley".freeze]
+  s.date = "2017-07-01"
+  s.description = "FSEvents API with Signals catching (without RubyCocoa)".freeze
+  s.email = ["thibaud@thibaud.gg".freeze, "ttilley@gmail.com".freeze]
+  s.homepage = "http://rubygems.org/gems/rb-fsevent".freeze
+  s.licenses = ["MIT".freeze]
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "Very simple & usable FSEvents API".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
+      s.add_development_dependency(%q<rspec>.freeze, ["~> 3.6"])
+      s.add_development_dependency(%q<guard-rspec>.freeze, ["~> 4.2"])
+      s.add_development_dependency(%q<rake>.freeze, ["~> 12.0"])
+    else
+      s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
+      s.add_dependency(%q<rspec>.freeze, ["~> 3.6"])
+      s.add_dependency(%q<guard-rspec>.freeze, ["~> 4.2"])
+      s.add_dependency(%q<rake>.freeze, ["~> 12.0"])
+    end
+  else
+    s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
+    s.add_dependency(%q<rspec>.freeze, ["~> 3.6"])
+    s.add_dependency(%q<guard-rspec>.freeze, ["~> 4.2"])
+    s.add_dependency(%q<rake>.freeze, ["~> 12.0"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/rb-inotify-0.9.10.gemspec b/vendor/bundle/ruby/2.4.0/specifications/rb-inotify-0.9.10.gemspec
new file mode 100644
index 0000000..2a9495d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/rb-inotify-0.9.10.gemspec
@@ -0,0 +1,40 @@
+# -*- encoding: utf-8 -*-
+# stub: rb-inotify 0.9.10 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "rb-inotify".freeze
+  s.version = "0.9.10"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Natalie Weizenbaum".freeze, "Samuel Williams".freeze]
+  s.date = "2017-06-17"
+  s.email = ["nex342@gmail.com".freeze, "samuel.williams@oriontransfer.co.nz".freeze]
+  s.homepage = "https://github.com/guard/rb-inotify".freeze
+  s.licenses = ["MIT".freeze]
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "A Ruby wrapper for Linux inotify, using FFI".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<ffi>.freeze, ["< 2", ">= 0.5.0"])
+      s.add_development_dependency(%q<rspec>.freeze, ["~> 3.4"])
+      s.add_development_dependency(%q<bundler>.freeze, ["~> 1.3"])
+      s.add_development_dependency(%q<rake>.freeze, ["< 13", ">= 10.5.0"])
+    else
+      s.add_dependency(%q<ffi>.freeze, ["< 2", ">= 0.5.0"])
+      s.add_dependency(%q<rspec>.freeze, ["~> 3.4"])
+      s.add_dependency(%q<bundler>.freeze, ["~> 1.3"])
+      s.add_dependency(%q<rake>.freeze, ["< 13", ">= 10.5.0"])
+    end
+  else
+    s.add_dependency(%q<ffi>.freeze, ["< 2", ">= 0.5.0"])
+    s.add_dependency(%q<rspec>.freeze, ["~> 3.4"])
+    s.add_dependency(%q<bundler>.freeze, ["~> 1.3"])
+    s.add_dependency(%q<rake>.freeze, ["< 13", ">= 10.5.0"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/rouge-1.11.1.gemspec b/vendor/bundle/ruby/2.4.0/specifications/rouge-1.11.1.gemspec
new file mode 100644
index 0000000..fccf69d
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/rouge-1.11.1.gemspec
@@ -0,0 +1,23 @@
+# -*- encoding: utf-8 -*-
+# stub: rouge 1.11.1 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "rouge".freeze
+  s.version = "1.11.1"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Jeanine Adkisson".freeze]
+  s.date = "2016-06-14"
+  s.description = "Rouge aims to a be a simple, easy-to-extend drop-in replacement for pygments.".freeze
+  s.email = ["jneen@jneen.net".freeze]
+  s.executables = ["rougify".freeze]
+  s.files = ["bin/rougify".freeze]
+  s.homepage = "http://rouge.jneen.net/".freeze
+  s.licenses = ["MIT, 2-clause BSD".freeze]
+  s.rubyforge_project = "rouge".freeze
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "A pure-ruby colorizer based on pygments".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/safe_yaml-1.0.4.gemspec b/vendor/bundle/ruby/2.4.0/specifications/safe_yaml-1.0.4.gemspec
new file mode 100644
index 0000000..3526daf
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/safe_yaml-1.0.4.gemspec
@@ -0,0 +1,23 @@
+# -*- encoding: utf-8 -*-
+# stub: safe_yaml 1.0.4 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "safe_yaml".freeze
+  s.version = "1.0.4"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Dan Tao".freeze]
+  s.date = "2014-09-28"
+  s.description = "Parse YAML safely".freeze
+  s.email = "daniel.tao@gmail.com".freeze
+  s.executables = ["safe_yaml".freeze]
+  s.files = ["bin/safe_yaml".freeze]
+  s.homepage = "https://github.com/dtao/safe_yaml".freeze
+  s.licenses = ["MIT".freeze]
+  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7".freeze)
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "SameYAML provides an alternative implementation of YAML.load suitable for accepting user input in Ruby applications.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/sass-3.5.1.gemspec b/vendor/bundle/ruby/2.4.0/specifications/sass-3.5.1.gemspec
new file mode 100644
index 0000000..4cb6e33
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/sass-3.5.1.gemspec
@@ -0,0 +1,45 @@
+# -*- encoding: utf-8 -*-
+# stub: sass 3.5.1 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "sass".freeze
+  s.version = "3.5.1"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Natalie Weizenbaum".freeze, "Chris Eppstein".freeze, "Hampton Catlin".freeze]
+  s.date = "2017-07-13"
+  s.description = "      Sass makes CSS fun again. Sass is an extension of CSS, adding\n      nested rules, variables, mixins, selector inheritance, and more.\n      It's translated to well-formatted, standard CSS using the\n      command line tool or a web-framework plugin.\n".freeze
+  s.email = "sass-lang@googlegroups.com".freeze
+  s.executables = ["sass".freeze, "sass-convert".freeze, "scss".freeze]
+  s.files = ["bin/sass".freeze, "bin/sass-convert".freeze, "bin/scss".freeze]
+  s.homepage = "http://sass-lang.com/".freeze
+  s.licenses = ["MIT".freeze]
+  s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze)
+  s.rubyforge_project = "sass".freeze
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "A powerful but elegant CSS compiler that makes CSS fun again.".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<sass-listen>.freeze, ["~> 4.0.0"])
+      s.add_development_dependency(%q<yard>.freeze, ["~> 0.8.7.6"])
+      s.add_development_dependency(%q<redcarpet>.freeze, ["~> 2.3.0"])
+      s.add_development_dependency(%q<minitest>.freeze, [">= 5"])
+    else
+      s.add_dependency(%q<sass-listen>.freeze, ["~> 4.0.0"])
+      s.add_dependency(%q<yard>.freeze, ["~> 0.8.7.6"])
+      s.add_dependency(%q<redcarpet>.freeze, ["~> 2.3.0"])
+      s.add_dependency(%q<minitest>.freeze, [">= 5"])
+    end
+  else
+    s.add_dependency(%q<sass-listen>.freeze, ["~> 4.0.0"])
+    s.add_dependency(%q<yard>.freeze, ["~> 0.8.7.6"])
+    s.add_dependency(%q<redcarpet>.freeze, ["~> 2.3.0"])
+    s.add_dependency(%q<minitest>.freeze, [">= 5"])
+  end
+end
diff --git a/vendor/bundle/ruby/2.4.0/specifications/sass-listen-4.0.0.gemspec b/vendor/bundle/ruby/2.4.0/specifications/sass-listen-4.0.0.gemspec
new file mode 100644
index 0000000..6d51371
--- /dev/null
+++ b/vendor/bundle/ruby/2.4.0/specifications/sass-listen-4.0.0.gemspec
@@ -0,0 +1,39 @@
+# -*- encoding: utf-8 -*-
+# stub: sass-listen 4.0.0 ruby lib
+
+Gem::Specification.new do |s|
+  s.name = "sass-listen".freeze
+  s.version = "4.0.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
+  s.require_paths = ["lib".freeze]
+  s.authors = ["Thibaud Guillaume-Gentil".freeze]
+  s.date = "2017-07-13"
+  s.description = "This fork of guard/listen provides a stable API for users of the ruby Sass CLI".freeze
+  s.email = "thibaud@thibaud.gg".freeze
+  s.homepage = "https://github.com/sass/listen".freeze
+  s.licenses = ["MIT".freeze]
+  s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze)
+  s.rubygems_version = "2.6.11".freeze
+  s.summary = "Fork of guard/listen".freeze
+
+  s.installed_by_version = "2.6.11" if s.respond_to? :installed_by_version
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<rb-fsevent>.freeze, [">= 0.9.4", "~> 0.9"])
+      s.add_runtime_dependency(%q<rb-inotify>.freeze, [">= 0.9.7", "~> 0.9"])
+      s.add_development_dependency(%q<bundler>.freeze, [">= 1.3.5"])
+    else
+      s.add_dependency(%q<rb-fsevent>.freeze, [">= 0.9.4", "~> 0.9"])
+      s.add_dependency(%q<rb-inotify>.freeze, [">= 0.9.7", "~> 0.9"])
+      s.add_dependency(%q<bundler>.freeze, [">= 1.3.5"])
+    end
+  else
+    s.add_dependency(%q<rb-fsevent>.freeze, [">= 0.9.4", "~> 0.9"])
+    s.add_dependency(%q<rb-inotify>.freeze, [">= 0.9.7", "~> 0.9"])
+    s.add_dependency(%q<bundler>.freeze, [">= 1.3.5"])
+  end
+end